Ci8qCiAqIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2gtdHhsL2NwdV9zZGlvLmgKICoKICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgoqLwoKI2lmbmRlZiBfX0NQVV9TRElPX0hfXwojZGVmaW5lIF9fQ1BVX1NESU9fSF9fCgojZGVmaW5lIFNEX0VNTUNfQkFTRV9BIDB4RkZFMDMwMDAKI2RlZmluZSBTRF9FTU1DX0JBU0VfQiAweEZGRTA1MDAwCiNkZWZpbmUgU0RfRU1NQ19CQVNFX0MgMHhGRkUwNzAwMAoKI2RlZmluZSBTRElPX1BPUlRfQSAwCiNkZWZpbmUgU0RJT19QT1JUX0IgMQojZGVmaW5lIFNESU9fUE9SVF9DIDIKCiNkZWZpbmUJQ2ZnX2RpdiAJMAojZGVmaW5lIENmZ19zcmMJCTYKI2RlZmluZSBDZmdfY29fcGhhc2UJOAojZGVmaW5lCUNmZ190eF9waGFzZQkxMAojZGVmaW5lCUNmZ19yeF9waGFzZQkxMgojZGVmaW5lCUNmZ19zcmFtX3BkCQkxNAojZGVmaW5lCUNmZ190eF9kZWxheQkxNgojZGVmaW5lCUNmZ19yeF9kZWxheQkyMgojZGVmaW5lCUNmZ19hbHdheXNfb24JMjgKI2RlZmluZQlDZmdfaXJxX3NkaW9fc2xlZXAgICAyOQojZGVmaW5lIENmZ19pcnFfc2Rpb19zbGVlcF9kcwkJMzAKCiNkZWZpbmUJU0RfRU1NQ19SWERfRVJST1IJCQkJMQojZGVmaW5lCVNEX0VNTUNfVFhEX0VSUk9SCQkJCTE8PDEKI2RlZmluZQlTRF9FTU1DX0RFU0NfRVJST1IJCQkJMTw8MgojZGVmaW5lCVNEX0VNTUNfUkVTUF9DUkNfRVJST1IJCQkxPDwzCiNkZWZpbmUJU0RfRU1NQ19SRVNQX1RJTUVPVVRfRVJST1IJCTE8PDQKI2RlZmluZQlTRF9FTU1DX0RFU0NfVElNRU9VVF9FUlJPUgkJMTw8NQoKc3RydWN0IHNkX2VtbWNfZ2xvYmFsX3JlZ3MgewogICAgdm9sYXRpbGUgdWludDMyX3QgZ2Nsb2NrOyAgICAgLy8gMHgwMAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2RlbGF5OyAgICAgLy8gMHgwNAoJdm9sYXRpbGUgdWludDMyX3QgZ2RlbGF5MTsgICAgLy8weDA4CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnYWRqdXN0OyAgICAvLyAweDBjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY2Fsb3V0OyAgICAvLyAweDEwCiAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZF8xNFsxMV07ICAgLy8gMHgxNH4weDNjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnc3RhcnQ7ICAgICAvLyAweDQwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY2ZnOyAgICAgICAvLyAweDQ0CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnc3RhdHVzOyAgICAvLyAweDQ4CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnaXJxX2VuOyAgICAvLyAweDRjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX2NmZzsgICAvLyAweDUwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX2FyZzsgICAvLyAweDU0CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX2RhdDsgICAvLyAweDU4CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX3JzcDA7ICAgLy8gMHg1YwogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9yc3AxOyAgLy8gMHg2MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9yc3AyOyAgLy8gMHg2NAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2NtZF9yc3AzOyAgLy8gMHg2OAogICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWRfNmM7ICAgICAgIC8vIDB4NmMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjdXJyX2NmZzsgIC8vIDB4NzAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjdXJyX2FyZzsgIC8vIDB4NzQKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjdXJyX2RhdDsgIC8vIDB4NzgKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjdXJyX3JzcDsgIC8vIDB4N2MKICAgIHZvbGF0aWxlIHVpbnQzMl90IGduZXh0X2NmZzsgIC8vIDB4ODAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGduZXh0X2FyZzsgIC8vIDB4ODQKICAgIHZvbGF0aWxlIHVpbnQzMl90IGduZXh0X2RhdDsgIC8vIDB4ODgKICAgIHZvbGF0aWxlIHVpbnQzMl90IGduZXh0X3JzcDsgIC8vIDB4OGMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdyeGQ7ICAgICAgIC8vIDB4OTAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGd0eGQ7ICAgICAgIC8vIDB4OTQKICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkXzk4WzkwXTsgICAvLyAweDk4fjB4MWZjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnZGVzY1sxMjhdOyAvLyAweDIwMAogICAgdm9sYXRpbGUgdWludDMyX3QgZ3BpbmdbMTI4XTsgLy8gMHg0MDAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdwb25nWzEyOF07IC8vIDB4ODAwCn07Cgp1bmlvbiBzZF9lbW1jX3NldHVwIHsKICAgIHVpbnQzMl90IGQzMjsKICAgIHN0cnVjdCB7CiAgICAgICAgdW5zaWduZWQgYnc6MzsKICAgICAgICB1bnNpZ25lZCBmYXN0OjE7CiAgICAgICAgdW5zaWduZWQgcGFyOjM7CiAgICAgICAgdW5zaWduZWQgaGNzOjE7CiAgICAgICAgdW5zaWduZWQgc2Q6MTsKICAgICAgICB1bnNpZ25lZCBzZGhjOjE7CiAgICAgICAgdW5zaWduZWQgdHlwZTo2OwogICAgICAgIHVuc2lnbmVkIHJjYToxNjsKICAgIH0gYjsKfTsKCnN0cnVjdCBzZF9lbW1jX2Rlc2NfaW5mb3sKICAgIHVpbnQzMl90IGNtZF9pbmZvOwogICAgdWludDMyX3QgY21kX2FyZzsKICAgIHVpbnQzMl90IGRhdGFfYWRkcjsKICAgIHVpbnQzMl90IHJlc3BfYWRkcjsKfTsKCnN0cnVjdCBjbWRfY2ZnewogICAgdWludDMyX3QgbGVuZ3RoOjk7CiAgICB1aW50MzJfdCBibG9ja19tb2RlOjE7CiAgICB1aW50MzJfdCByMWI6MTsKICAgIHVpbnQzMl90IGVuZF9vZl9jaGFpbjoxOwogICAgdWludDMyX3QgdGltZW91dDo0OwogICAgdWludDMyX3Qgbm9fcmVzcDoxOwogICAgdWludDMyX3Qgbm9fY21kOjE7CiAgICB1aW50MzJfdCBkYXRhX2lvOjE7CiAgICB1aW50MzJfdCBkYXRhX3dyOjE7CiAgICB1aW50MzJfdCByZXNwX25vY3JjOjE7CiAgICB1aW50MzJfdCByZXNwXzEyODoxOwogICAgdWludDMyX3QgcmVzcF9udW06MTsKICAgIHVpbnQzMl90IGRhdGFfbnVtOjE7CiAgICB1aW50MzJfdCBjbWRfaW5kZXg6NjsKICAgIHVpbnQzMl90IGVycm9yOjE7CiAgICB1aW50MzJfdCBvd25lcjoxOwp9OwoKc3RydWN0IHNkX2VtbWNfc3RhdHVzewoJdWludDMyX3QgcnhkX2Vycjo4OyAgICAgIC8qWzc6MF0gICAgIFJYIGRhdGEgQ1JDIGVycm9yIHBlciB3aXJlLCBmb3IgbXVsdGlwbGUgYmxvY2sgcmVhZCwgdGhlIENSQyBlcnJvcnMgYXJlIE9SZWQgdG9nZXRoZXIuKi8KCXVpbnQzMl90IHR4ZF9lcnI6MTsgICAgICAvKls4XSAgICAgICBUWCBkYXRhIENSQyBlcnJvciwgZm9yIG11bHRpcGxlIGJsb2NrIHdyaXRlLCBhbnkgb25lIG9mIGJsb2NrcyBDUkMgZXJyb3IuICovCgl1aW50MzJfdCBkZXNjX2VycjoxOyAgICAgLypbOV0gICAgICAgU0QvZU1NQyBjb250cm9sbGVyIGRvZXNuoa90IG93biBkZXNjcmlwdG9yLiBUaGUgb3duZXIgYml0IGlzIKGwMKGxLCBzZXQgY2ZnX2lnbm9yZV9vd25lciB0byBpZ25vcmUgdGhpcyBlcnJvci4qLwoJdWludDMyX3QgcmVzcF9lcnI6MTsgICAgIC8qWzEwXSAgICAgIFJlc3BvbnNlIENSQyBlcnJvci4qLwoJdWludDMyX3QgcmVzcF90aW1lb3V0OjE7IC8qWzExXSAgICAgIE5vIHJlc3BvbnNlIHJlY2VpdmVkIGJlZm9yZSB0aW1lIGxpbWl0LiBUaGUgdGltZW91dCBsaW1pdCBpcyBzZXQgYnkgY2ZnX3Jlc3BfdGltZW91dC4qLwoJdWludDMyX3QgZGVzY190aW1lb3V0OjE7IC8qWzEyXSAgICAgIERlc2NyaXB0b3IgZXhlY3V0aW9uIHRpbWUgb3ZlciB0aW1lIGxpbWl0LiBUaGUgdGltZW91dCBsaW1pdCBpcyBzZXQgYnkgZGVzY3JpcHRvciBpdHNlbGYuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgQ29uc2lkZXIgdGhlIG11bHRpcGxlIGJsb2NrIHJlYWQvd3JpdGUsIHNldCB0aGUgcHJvcGVyIHRpbWVvdXQgbGltaXRzLiovCgl1aW50MzJfdCBlbmRfb2ZfY2hhaW46MTsgLypbMTNdICAgICAgRW5kIG9mIENoYWluIElSUSwgTm9ybWFsIElSUS4gKi8KCXVpbnQzMl90IGRlc2NfaXJxOjE7ICAgICAvKlsxNF0gICAgICBUaGlzIGRlc2NyaXB0b3IgcmVxdWVzdHMgYW4gSVJRLCBOb3JtYWwgSVJRLCB0aGUgZGVzY3JpcHRvciBjaGFpbiBleGVjdXRpb24ga2VlcHMgZ29pbmcgb24uKi8KCXVpbnQzMl90IGlycV9zZGlvOjE7ICAgICAvKlsxNV0gICAgICBTRElPIGRldmljZSB1c2VzIERBVFsxXSB0byByZXF1ZXN0IElSUS4gKi8KCXVpbnQzMl90IGRhdF9pOjg7ICAgICAgICAvKlsyMzoxNl0gICBJbnB1dCBkYXRhIHNpZ25hbHMuICovCgl1aW50MzJfdCBjbWRfaToxOyAgICAgICAgLypbMjRdICAgICAgbnB1dCByZXNwb25zZSBzaWduYWwuICovCgl1aW50MzJfdCBkczoxOyAgICAgICAgICAgLypbMjVdICAgICAgSW5wdXQgZGF0YSBzdHJvYmUuICovCgl1aW50MzJfdCBidXNfZnNtOjQ7ICAgICAgLypbMjk6MjZdICAgQlVTIGZzbSAqLwogICAgdWludDMyX3QgZGVzY193cl9yZHk6MTsgIC8qWzMwXSAgICAgIERlc2NyaXB0b3Igd3JpdGUgYmFjayBwcm9jZXNzIGlzIGRvbmUgYW5kIGl0IGlzIHJlYWR5IGZvciBDUFUgdG8gcmVhZC4qLwoJdWludDMyX3QgY29yZV9yZHk6MTsJIC8qWzMxXSAgICAgICBkZXNjX2J1c3kgb3Igc2RfZW1tY19pcnEgb3IgYnVzX2ZzbSBpcyBub3QgaWRsZS4qLwp9Oy8vX19hdHRyaWJ1dGVfXygoX19tYXlfYWxpYXNfXykpOwoKCnN0cnVjdCBzZF9lbW1jX2Nsb2NrewogICAgdWludDMyX3QgZGl2OjY7ICAgICAgICAgIC8qWzU6MF0gICAgIENsb2NrIGRpdmlkZXIuIEZyZXF1ZW5jeSA9IGNsb2NrIHNvdXJjZS9jZmdfZGl2LCBNYXhpbXVtIGRpdmlkZXIgNjMuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkNsb2NrIG9mZjogY2ZnX2Rpdj09MCwgdGhlIGNsb2NrIGlzIGRpc2FibGVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkRpdmlkZXIgYnlwYXNzOiBjZmdfZGl2PT0xLCBjbG9jayBzb3VyY2UgaXMgdXNlZCBhcyBjb3JlIGNsb2NrIHdpdGhvdXQgZGl2aWRlci4gKi8KICAgIHVpbnQzMl90IHNyYzoyOyAgICAgICAgICAvKls3OjZdICAgICBDbG9jayBzb3VyY2UsIDA6IENyeXN0YWwgMjRNSHosIDE6IEZpeCBQTEwsIDg1ME1IeiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyOiBNUExMLCA8NjM3TUh6LCB1c2VkIGZvciA0MDBNSHogZXhhY3RseS4gMzogZGlmZmVyZW50IFBMTCAqLwogICAgdWludDMyX3QgY29yZV9waGFzZToyOyAgIC8qWzk6OF0gICAgIENvcmUgY2xvY2sgcGhhc2UuIDA6IDAgcGhhc2UsIDE6IDkwIHBoYXNlLCAyOiAxODAgcGhhc2UsIDM6IDI3MCBwaGFzZS4qLwogICAgdWludDMyX3QgdHhfcGhhc2U6MjsgICAgIC8qWzExOjEwXSAgIFRYIGNsb2NrIHBoYXNlLiAwOiAwIHBoYXNlLCAxOiA5MCBwaGFzZSwgMjogMTgwIHBoYXNlLCAzOiAyNzAgcGhhc2UuKi8KICAgIHVpbnQzMl90IHJ4X3BoYXNlOjI7ICAgICAvKlsxMzoxMl0gICBSWCBjbG9jayBwaGFzZS4gMDogMCBwaGFzZSwgMTogOTAgcGhhc2UsIDI6IDE4MCBwaGFzZSwgMzogMjcwIHBoYXNlLiovCiAgICB1aW50MzJfdCByZXNlcnZlZDE0OjI7CiAgICB1aW50MzJfdCB0eF9kZWxheTo2OyAgICAgLypbMjE6MTZdICAgVFggY2xvY2sgZGVsYXkgbGluZS4gMDogbm8gZGVsYXksIG46IGRlbGF5IG4qMjAwcHMuIE1heGltdW0gZGVsYXkgM25zLiovCiAgICB1aW50MzJfdCByeF9kZWxheTo2OyAgICAgLypbMjc6MjJdICAgUlggY2xvY2sgZGVsYXkgbGluZS4gMDogbm8gZGVsYXksIG46IGRlbGF5IG4qMjAwcHMuIE1heGltdW0gZGVsYXkgM25zLiovCiAgICB1aW50MzJfdCBhbHdheXNfb246MTsgICAgLypbMjhdICAgICAgMTogS2VlcCBjbG9jayBhbHdheXMgb24uIDA6IENsb2NrIG9uL29mZiBjb250cm9sbGVkIGJ5IGFjdGl2aXRpZXMuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkFueSBBUEIzIGFjY2VzcyBvciBkZXNjcmlwdG9yIGV4ZWN1dGlvbiB3aWxsIGtlZXAgY2xvY2sgb24uKi8KICAgIHVpbnQzMl90IGlycV9zZGlvX3NsZWVwOjE7IC8qWzI5XSAgICAxOiBlbmFibGUgSVJRIHNkaW8gd2hlbiBpbiBzbGVlcCBtb2RlLiAqLwoJdWludDMyX3QgaXJxX3NkaW9fc2xlZXBfZHM6MTsvKlszMF0gMTplbmFibGUgZHMgYXMgaXJxKi8KICAgIHVpbnQzMl90IHJlc2VydmVkMjY6MTsKfTsKCnN0cnVjdCBzZF9lbW1jX2RlbGF5ewogICAgdWludDMyX3QgZGF0MDo2OyAgICAgICAgIC8qWzM6MF0gICAgICAgRGF0YSAwIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQxOjY7ICAgICAgICAgLypbNzo0XSAgICAgICBEYXRhIDEgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDI6NjsgICAgICAgICAvKlsxMTo4XSAgICAgIERhdGEgMiBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0Mzo2OyAgICAgICAgIC8qWzE1OjEyXSAgICAgRGF0YSAzIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQ0OjY7ICAgICAgICAgLypbMTk6MTZdICAgICBEYXRhIDQgZGVsYXkgbGluZS4gKi8KCXVpbnQzMl90IHNwYXJlOjI7Cn07CgpzdHJ1Y3Qgc2RfZW1tY19kZWxheTF7CiAgICB1aW50MzJfdCBkYXQ1OjY7ICAgICAgICAgLypbMjM6MjBdICAgICBEYXRhIDUgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDY6NjsgICAgICAgICAvKlsyNzoyNF0gICAgIERhdGEgNiBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0Nzo2OyAgICAgICAgIC8qWzMxOjI4XSAgICAgRGF0YSA3IGRlbGF5IGxpbmUuICovCgl1aW50MzJfdCBkYXQ4OjY7ICAgICAgICAgLypbMzE6MjhdICAgICBEYXRhIDcgZGVsYXkgbGluZS4gKi8KCXVpbnQzMl90IGRhdDk6NjsgICAgICAgICAvKlszMToyOF0gICAgIERhdGEgNyBkZWxheSBsaW5lLiAqLwoJdWludDMyX3Qgc3BhcmU6MjsKfTsKCnN0cnVjdCBzZF9lbW1jX2FkanVzdHsKICAgIHVpbnQzMl90IGNtZF9kZWxheTo0OyAgICAgICAgICAgLypbMzowXSAgICAgICBDb21tYW5kIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkc19kZWxheTo0OyAgICAgICAgICAgIC8qWzc6NF0gICAgICAgRFMgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGNhbGlfc2VsOjQ7ICAgICAgICAgICAgLypbMTE6OF0gICAgICBTZWxlY3Qgb25lIHNpZ25hbCB0byBiZSB0ZXN0ZWQuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qU2lnbmFscyBhcmUgbGFiZWxlZCBmcm9tIDAgdG8gOSB0aGUgc2FtZSBhcyBkZWxheSBsaW5lcy4gKi8KICAgIHVpbnQzMl90IGNhbGlfZW5hYmxlOjE7ICAgICAgICAgLypbMTJdICAgICAgICBFbmFibGUgY2FsaWJyYXRpb24uICovCiAgICB1aW50MzJfdCBhZGpfZW5hYmxlOjE7ICAgICAgICAgIC8qWzEzXSAgICAgICBBZGp1c3QgaW50ZXJmYWNlIHRpbWluZyBieSByZXNhbXBsaW5nIHRoZSBpbnB1dCBzaWduYWxzLiAqLwogICAgdWludDMyX3QgY2FsaV9yaXNlOjE7ICAgICAgICAgICAvKlsxNF0gICAgICAgMTogdGVzdCB0aGUgcmlzaW5nIGVkZ2UuIDA6IHRlc3QgdGhlIGZhbGxpbmcgZWRnZS4gKi8KICAgIHVpbnQzMl90IGRzX2VuYWJsZToxOwkJCS8qWzE1XQkJU2FtcGxpbmcgdGhlIERBVCBiYXNlZCBvbiBEUyBpbiBIUzQwMCBtb2RlKi8KICAgIHVpbnQzMl90IGFkal9kZWxheTo2OyAgICAgICAgICAgLypbMjE6MTZdICAgICAgIFJlc2FtcGxlIHRoZSBpbnB1dCBzaWduYWxzIHdoZW4gY2xvY2sgaW5kZXg9PWFkal9kZWxheS4gKi8KICAgIHVpbnQzMl90IGFkal9hdXRvOjE7CQkJLypbMjJdCQkJVXNlIGNhbGlfZHV0IGZpcnN0IGZhbGxpbmcgZWRnZSB0byBhZGp1c3QgdGhlIHRpbWluZyAqLwoJCQkJCQkJCQkJLypzZXQgY2FsaV9lbmFibGUgdG8gMSB0byB1c2UgdGhpcyBmdW5jdGlvbiovCgl1aW50MzJfdCByZXNlcnZlZDIzOjk7Cn07CgoKc3RydWN0IHNkX2VtbWNfY2Fsb3V0ewogICAgdWludDMyX3QgY2FsaV9pZHg6NjsgICAgICAgICAvKls1OjBdICAgICAgIENhbGlicmF0aW9uIHJlYWRpbmcuIFRoZSBldmVudCBoYXBwZW5zIGF0IHRoaXMgaW5kZXguICovCiAgICB1aW50MzJfdCByZXNlcnZlZDY6MTsKICAgIHVpbnQzMl90IGNhbGlfdmxkOjE7ICAgICAgICAgLypbN10gICAgICAgICBUaGUgcmVhZGluZyBpcyB2YWxpZC4gKi8KICAgIHVpbnQzMl90IGNhbGlfc2V0dXA6ODsgICAgICAgLypbMTU6OF0gICAgICBDb3BpZWQgZnJvbSBCQVNFKzB4OCBbMTU6OF0gaW5jbHVkZSBjYWxpX3NlbCwgY2FsaV9lbmFibGUsIGFkal9lbmFibGUsIGNhbGlfcmlzZS4gKi8KICAgIHVpbnQzMl90IHJlc2VydmVkMTY6MTY7Cn07CgoKc3RydWN0IHNkX2VtbWNfc3RhcnR7Cgl1aW50MzJfdCBpbml0OjE7ICAgICAgICAgLypbMF0gICAxOiBSZWFkIGRlc2NyaXB0b3IgZnJvbSBpbnRlcm5hbCBTUkFNLCBsaW1pdGVkIHRvIDMyIGRlc2NyaXB0b3JzLiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIDA6IFJlYWQgZGVzY3JpcHRvciBmcm9tIGV4dGVybmFsIEREUiAqLwoJdWludDMyX3QgYnVzeToxOyAgICAgICAgIC8qWzFdICAgMTogU3RhcnQgY29tbWFuZCBjaGFpbiBleGVjdXRpb24gcHJvY2Vzcy4gMDogU3RvcCAqLwoJdWludDMyX3QgYWRkcjozMDsgICAgICAgIC8qWzMxOjJdIERlc2NyaXB0b3IgYWRkcmVzcywgdGhlIGxhc3QgMiBiaXRzIGFyZSAwLCA0IGJ5dGVzIGFsaWduZWQuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgV2hlbiBpbnRlcm5hbCBTUkFNIGlzIHVzZWQsIHRoZSB2YWxpZCBhZGRyZXNzIHJhbmdlIGlzIGZyb20gMHgyMDB+MHgzZmYgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBXaGVuIGV4dGVybmFsIEREUiBpcyB1c2VkLCB0aGUgdmFsaWQgYWRkcmVzcyBpcyBhbnl3aGVyZSBpbiBERFIsIHRoZSBsZW5ndGggb2YgY2hhaW4gaXMgdW5saW1pdGVkLiovCn07Ly9fX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSk7CgoKc3RydWN0IHNkX2VtbWNfY29uZmlnewoJdWludDMyX3QgYnVzX3dpZHRoOjI7ICAgIC8qWzE6MF0gICAgIDA6IDEgYml0LCAxOiA0IGJpdHMsIDI6IDggYml0cywgMzogMiBiaXRzIChub3Qgc3VwcG9ydGVkKSovCgl1aW50MzJfdCBkZHI6MTsgICAgICAgICAgLypbMl0gICAgICAgMTogRERSIG1vZGUsIDA6IFNEUiBtb2RlICovCgl1aW50MzJfdCBkY191Z3Q6MTsgICAgICAgLypbM10gICAgICAgMTogRERSIGFjY2VzcyB1cmdlbnQsIDA6IEREUiBhY2Nlc3Mgbm9ybWFsLiAqLwoJdWludDMyX3QgYmxfbGVuOjQ7ICAgICAgIC8qWzc6NF0gICAgIEJsb2NrIGxlbmd0aCAyXmNmZ19ibF9sZW4sIGJlY2F1c2UgaW50ZXJuYWwgYnVmZmVyIHNpemUgaXMgbGltaXRlZCB0byA1MTIgYnl0ZXMsIHRoZSBjZmdfYmxfbGVuIDw9OS4gKi8KCXVpbnQzMl90IHJlc3BfdGltZW91dDo0OyAvKlsxMTo4XSAgICBXYWl0IHJlc3BvbnNlIHRpbGwgMl5jZmdfcmVzcF90aW1lb3V0IGNvcmUgY2xvY2sgY3ljbGVzLiBNYXhpbXVtIDMyNzY4IGNvcmUgY3ljbGVzLiAqLwoJdWludDMyX3QgcmNfY2M6NDsgICAgICAgIC8qWzE1OjEyXSAgIFdhaXQgcmVzcG9uc2UtY29tbWFuZCwgY29tbWFuZC1jb21tYW5kIGdhcCBiZWZvcmUgbmV4dCBjb21tYW5kLCAyXmNmZ19yY19jYyBjb3JlIGNsb2NrIGN5Y2xlcy4gKi8KCXVpbnQzMl90IG91dF9mYWxsOjE7ICAgICAvKlsxNl0gICAgICBERFIgbW9kZSBvbmx5LiBUaGUgY29tbWFuZCBhbmQgVFhEIHN0YXJ0IGZyb20gcmlzaW5nIGVkZ2UuIFNldCAxIHRvIHN0YXJ0IGZyb20gZmFsbGluZyBlZGdlLiAqLwoJdWludDMyX3QgYmxrX2dhcF9pcDoxOyAgIC8qWzE3XSAgICAgIDE6IEVuYWJsZSBTRElPIGRhdGEgYmxvY2sgZ2FwIGludGVycnVwdCBwZXJpb2QuIDA6IERpc2FibGVkLiovCgl1aW50MzJfdCBzcGFyZToxOyAgICAgICAgLypbMThdICAgICAgU3BhcmUsICA/Pz8gbmVlZCBjaGVjayovCgl1aW50MzJfdCBpZ25vcmVfb3duZXI6MTsgLypbMTldICAgICAgVXNlIHRoaXMgZGVzY3JpcHRvciBldmVuIGlmIGl0cyBvd25lciBiaXQgaXMgobAwobEuKi8KCXVpbnQzMl90IGNoa19kczoxOyAgICAgICAvKlsyMF0gICAgICBDaGVjayBkYXRhIHN0cm9iZSBpbiBIUzQwMC4qLwoJdWludDMyX3QgY21kX2xvdzoxOyAgICAgIC8qWzIxXSAgICAgIEhvbGQgQ01EIGFzIG91dHB1dCBMb3csIGVNTUMgYm9vdCBtb2RlLiovCgl1aW50MzJfdCBzdG9wX2NsazoxOyAgICAgLypbMjJdICAgICAgMTogc3RvcCBjbG9jay4gMDogbm9ybWFsIGNsb2NrLiovCgkgICAgICAgICAgICAgICAgICAgICAgICAvKkluIG5vcm1hbCBtb2RlLCB0aGUgY2xvY2sgaXMgYXV0b21hdGljYWxseSBvbi9vZmYgZHVyaW5nIHJlYWRpbmcgbW9kZSB0byBiYWNrIG9mZiByZWFkaW5nIGluIGNhc2Ugb2YqLwoJICAgICAgICAgICAgICAgICAgICAgICAgLypERFIgc2xvdyByZXNwb25zZSwgc3RvcCBjbG9jayBpcyB1c2VkIGluIHZvbHRhZ2Ugc3dpdGNoLiovCgl1aW50MzJfdCBhdXRvX2NsazoxOyAgICAgLypbMjNdICAgICAgMTogd2hlbiBCVVMgaXMgaWRsZSBhbmQgbm8gZGVzY3JpcHRvciBpcyBhdmFpbGFibGUsIHR1cm4gb2ZmIGNsb2NrLCB0byBzYXZlIHBvd2VyLiovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAgIDA6IGNvcmUgY2xvY2sgaXMgYWx3YXlzIG9uLiovCiAgICB1aW50MzJfdCB0eGRfYWRkX2VycjoxOwkvKlsyNF0gICAJVFhEIGFkZCBlcnJvciB0ZXN0Ki8KCQkJCQkJCS8qVGVzdCBmZWF0dXJlLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbm9ybWFsIGNvbmRpdGlvbi4qLwoJCQkJCQkJLypJdCB3aWxsIGludmVydGVkIHRoZSBmaXJzdCBDUkMgYml0cyBvZiB0aGUgM3JkIGJsb2NrLiovCgkJCQkJCQkvKkJsb2NrIGluZGV4IHN0YXJ0cyBmcm9tIDAsIDEsIDIsIKGtKi8KICAgIHVpbnQzMl90IHR4ZF9yZXRyeToxOwkvKlsyNV0gICAJV2hlbiBUWEQgQ1JDIGVycm9yLCBob3N0IHNlbmRzIHRoZSBibG9jayBhZ2Fpbi4qLwoJCQkJCQkJLypUaGUgdG90YWwgbnVtYmVyIG9mIHJldHJpZXMgb2Ygb25lIGRlc2NyaXB0b3IgaXMgbGltaXRlZCB0byAxNSwgKi8KCQkJCQkJCS8qYWZ0ZXIgMTUgcmV0cmllcywgdGhlIFRYRF9lcnIgaXMgc2V0IHRvIGhpZ2guKi8KICAgIHVpbnQzMl90IHJldmQ6ODsJICAgICAgICAvKlszMToyNl0gICByZXZlZCovCn07Ly9fX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSk7CgoKc3RydWN0IHNkX2VtbWNfaXJxX2VuewoJdWludDMyX3QgcnhkX2Vycjo4OyAgICAgIC8qWzc6MF0gICAgIFJYIGRhdGEgQ1JDIGVycm9yIHBlciB3aXJlLiovCgl1aW50MzJfdCB0eGRfZXJyOjE7ICAgICAgLypbOF0gICAgICAgVFggZGF0YSBDUkMgZXJyb3IuICovCgl1aW50MzJfdCBkZXNjX2VycjoxOyAgICAgLypbOV0gICAgICAgU0QvZU1NQyBjb250cm9sbGVyIGRvZXNuoa90IG93biBkZXNjcmlwdG9yLiAqLwoJdWludDMyX3QgcmVzcF9lcnI6MTsgICAgIC8qWzEwXSAgICAgIFJlc3BvbnNlIENSQyBlcnJvci4qLwoJdWludDMyX3QgcmVzcF90aW1lb3V0OjE7IC8qWzExXSAgICAgIE5vIHJlc3BvbnNlIHJlY2VpdmVkIGJlZm9yZSB0aW1lIGxpbWl0LiAqLwoJdWludDMyX3QgZGVzY190aW1lb3V0OjE7IC8qWzEyXSAgICAgIERlc2NyaXB0b3IgZXhlY3V0aW9uIHRpbWUgb3ZlciB0aW1lIGxpbWl0LiAqLwoJdWludDMyX3QgZW5kX29mX2NoYWluOjE7IC8qWzEzXSAgICAgIEVuZCBvZiBDaGFpbiBJUlEuICovCgl1aW50MzJfdCBkZXNjX2lycToxOyAgICAgLypbMTRdICAgICAgVGhpcyBkZXNjcmlwdG9yIHJlcXVlc3RzIGFuIElSUS4gKi8KCXVpbnQzMl90IGlycV9zZGlvOjE7ICAgICAvKlsxNV0gICAgICBFbmFibGUgc2RpbyBpbnRlcnJ1cHQuICovCiAgICB1aW50MzJfdCByZXZkOjE2OwkgICAgLypbMzE6MTZdICAgcmV2ZWQqLwp9OwoKc3RydWN0IHNkX2VtbWNfZGF0YV9pbmZvewoJdWludDMyX3QgY250OjEwOyAgICAgICAgIC8qWzk6MF0gICAgIFJ4ZCB3b3JkcyByZWNlaXZlZCBmcm9tIEJVUy4gVHhkIHdvcmRzIHJlY2VpdmVkIGZyb20gRERSLiovCgl1aW50MzJfdCBibGs6OTsgICAgICAgICAgLypbMjQ6MTZdICAgUnhkIEJsb2NrcyByZWNlaXZlZCBmcm9tIEJVUy4gVHhkIGJsb2NrcyByZWNlaXZlZCBmcm9tIEREUi4qLwoJdWludDMyX3QgcmV2ZDozMDsgICAgICAgIC8qWzMxOjE3XSAgIFJldmVkLiAqLwp9OwoKCnN0cnVjdCBzZF9lbW1jX2NhcmRfaW5mb3sKCXVpbnQzMl90IHR4ZF9jbnQ6MTA7ICAgICAvKls5OjBdICAgICBUeGQgQlVTIGN5Y2xlIGNvdW50ZXIuICovCgl1aW50MzJfdCB0eGRfYmxrOjk7ICAgICAgLypbMjQ6MTZdICAgVHhkIEJVUyBibG9jayBjb3VudGVyLiovCgl1aW50MzJfdCByZXZkOjMwOyAgICAgICAgLypbMzE6MTddICAgUmV2ZWQuICovCn07CgojZW5kaWYK