Ci8qCiAqIGFyY2gvYXJtL2luY2x1ZGUvYXNtL2FyY2gtdHhsL2NwdV9zZGlvLmgKICoKICogQ29weXJpZ2h0IChDKSAyMDE1IEFtbG9naWMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSwgVVNBLgoqLwoKI2lmbmRlZiBfX0NQVV9TRElPX0hfXwojZGVmaW5lIF9fQ1BVX1NESU9fSF9fCgojZGVmaW5lIFNEX0VNTUNfQkFTRV9BIDB4RkZFMDMwMDAKI2RlZmluZSBTRF9FTU1DX0JBU0VfQiAweEZGRTA1MDAwCiNkZWZpbmUgU0RfRU1NQ19CQVNFX0MgMHhGRkUwNzAwMAoKI2RlZmluZSBTRElPX1BPUlRfQSAwCiNkZWZpbmUgU0RJT19QT1JUX0IgMQojZGVmaW5lIFNESU9fUE9SVF9DIDIKCgojaWYgMAojZGVmaW5lCVNEX0VNTUNfUlhEX0VSUk9SCQkJCTEKI2RlZmluZQlTRF9FTU1DX1RYRF9FUlJPUgkJCQkxPDwxCiNkZWZpbmUJU0RfRU1NQ19ERVNDX0VSUk9SCQkJCTE8PDIKI2RlZmluZQlTRF9FTU1DX1JFU1BfQ1JDX0VSUk9SCQkJMTw8MwojZGVmaW5lCVNEX0VNTUNfUkVTUF9USU1FT1VUX0VSUk9SCQkxPDw0CiNkZWZpbmUJU0RfRU1NQ19ERVNDX1RJTUVPVVRfRVJST1IJCTE8PDUKI2VuZGlmCgpzdHJ1Y3Qgc2RfZW1tY19nbG9iYWxfcmVncyB7CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY2xvY2s7ICAgICAvLyAweDAwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnZGVsYXk7ICAgICAvLyAweDA0Cgl2b2xhdGlsZSB1aW50MzJfdCBnZGVsYXkxOyAgICAvLzB4MDgKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdhZGp1c3Q7ICAgIC8vIDB4MGMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjYWxvdXQ7ICAgIC8vIDB4MTAKICAgIHZvbGF0aWxlIHVpbnQzMl90IHJlc2VydmVkXzE0WzExXTsgICAvLyAweDE0fjB4M2MKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdzdGFydDsgICAgIC8vIDB4NDAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjZmc7ICAgICAgIC8vIDB4NDQKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdzdGF0dXM7ICAgIC8vIDB4NDgKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdpcnFfZW47ICAgIC8vIDB4NGMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfY2ZnOyAgIC8vIDB4NTAKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfYXJnOyAgIC8vIDB4NTQKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfZGF0OyAgIC8vIDB4NTgKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdjbWRfcnNwMDsgICAvLyAweDVjCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX3JzcDE7ICAvLyAweDYwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX3JzcDI7ICAvLyAweDY0CiAgICB2b2xhdGlsZSB1aW50MzJfdCBnY21kX3JzcDM7ICAvLyAweDY4CiAgICB2b2xhdGlsZSB1aW50MzJfdCByZXNlcnZlZF82YzsgICAgICAgLy8gMHg2YwogICAgdm9sYXRpbGUgdWludDMyX3QgZ2N1cnJfY2ZnOyAgLy8gMHg3MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2N1cnJfYXJnOyAgLy8gMHg3NAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2N1cnJfZGF0OyAgLy8gMHg3OAogICAgdm9sYXRpbGUgdWludDMyX3QgZ2N1cnJfcnNwOyAgLy8gMHg3YwogICAgdm9sYXRpbGUgdWludDMyX3QgZ25leHRfY2ZnOyAgLy8gMHg4MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ25leHRfYXJnOyAgLy8gMHg4NAogICAgdm9sYXRpbGUgdWludDMyX3QgZ25leHRfZGF0OyAgLy8gMHg4OAogICAgdm9sYXRpbGUgdWludDMyX3QgZ25leHRfcnNwOyAgLy8gMHg4YwogICAgdm9sYXRpbGUgdWludDMyX3QgZ3J4ZDsgICAgICAgLy8gMHg5MAogICAgdm9sYXRpbGUgdWludDMyX3QgZ3R4ZDsgICAgICAgLy8gMHg5NAogICAgdm9sYXRpbGUgdWludDMyX3QgcmVzZXJ2ZWRfOThbOTBdOyAgIC8vIDB4OTh+MHgxZmMKICAgIHZvbGF0aWxlIHVpbnQzMl90IGdkZXNjWzEyOF07IC8vIDB4MjAwCiAgICB2b2xhdGlsZSB1aW50MzJfdCBncGluZ1sxMjhdOyAvLyAweDQwMAogICAgdm9sYXRpbGUgdWludDMyX3QgZ3BvbmdbMTI4XTsgLy8gMHg4MDAKfTsKCnVuaW9uIHNkX2VtbWNfc2V0dXAgewogICAgdWludDMyX3QgZDMyOwogICAgc3RydWN0IHsKICAgICAgICB1bnNpZ25lZCBidzozOwogICAgICAgIHVuc2lnbmVkIGZhc3Q6MTsKICAgICAgICB1bnNpZ25lZCBwYXI6MzsKICAgICAgICB1bnNpZ25lZCBoY3M6MTsKICAgICAgICB1bnNpZ25lZCBzZDoxOwogICAgICAgIHVuc2lnbmVkIHNkaGM6MTsKICAgICAgICB1bnNpZ25lZCB0eXBlOjY7CiAgICAgICAgdW5zaWduZWQgcmNhOjE2OwogICAgfSBiOwp9OwoKc3RydWN0IHNkX2VtbWNfZGVzY19pbmZvewogICAgdWludDMyX3QgY21kX2luZm87CiAgICB1aW50MzJfdCBjbWRfYXJnOwogICAgdWludDMyX3QgZGF0YV9hZGRyOwogICAgdWludDMyX3QgcmVzcF9hZGRyOwp9OwoKc3RydWN0IGNtZF9jZmd7CiAgICB1aW50MzJfdCBsZW5ndGg6OTsKICAgIHVpbnQzMl90IGJsb2NrX21vZGU6MTsKICAgIHVpbnQzMl90IHIxYjoxOwogICAgdWludDMyX3QgZW5kX29mX2NoYWluOjE7CiAgICB1aW50MzJfdCB0aW1lb3V0OjQ7CiAgICB1aW50MzJfdCBub19yZXNwOjE7CiAgICB1aW50MzJfdCBub19jbWQ6MTsKICAgIHVpbnQzMl90IGRhdGFfaW86MTsKICAgIHVpbnQzMl90IGRhdGFfd3I6MTsKICAgIHVpbnQzMl90IHJlc3Bfbm9jcmM6MTsKICAgIHVpbnQzMl90IHJlc3BfMTI4OjE7CiAgICB1aW50MzJfdCByZXNwX251bToxOwogICAgdWludDMyX3QgZGF0YV9udW06MTsKICAgIHVpbnQzMl90IGNtZF9pbmRleDo2OwogICAgdWludDMyX3QgZXJyb3I6MTsKICAgIHVpbnQzMl90IG93bmVyOjE7Cn07CgpzdHJ1Y3Qgc2RfZW1tY19zdGF0dXN7Cgl1aW50MzJfdCByeGRfZXJyOjg7ICAgICAgLypbNzowXSAgICAgUlggZGF0YSBDUkMgZXJyb3IgcGVyIHdpcmUsIGZvciBtdWx0aXBsZSBibG9jayByZWFkLCB0aGUgQ1JDIGVycm9ycyBhcmUgT1JlZCB0b2dldGhlci4qLwoJdWludDMyX3QgdHhkX2VycjoxOyAgICAgIC8qWzhdICAgICAgIFRYIGRhdGEgQ1JDIGVycm9yLCBmb3IgbXVsdGlwbGUgYmxvY2sgd3JpdGUsIGFueSBvbmUgb2YgYmxvY2tzIENSQyBlcnJvci4gKi8KCXVpbnQzMl90IGRlc2NfZXJyOjE7ICAgICAvKls5XSAgICAgICBTRC9lTU1DIGNvbnRyb2xsZXIgZG9lc26hr3Qgb3duIGRlc2NyaXB0b3IuIFRoZSBvd25lciBiaXQgaXMgobAwobEsIHNldCBjZmdfaWdub3JlX293bmVyIHRvIGlnbm9yZSB0aGlzIGVycm9yLiovCgl1aW50MzJfdCByZXNwX2VycjoxOyAgICAgLypbMTBdICAgICAgUmVzcG9uc2UgQ1JDIGVycm9yLiovCgl1aW50MzJfdCByZXNwX3RpbWVvdXQ6MTsgLypbMTFdICAgICAgTm8gcmVzcG9uc2UgcmVjZWl2ZWQgYmVmb3JlIHRpbWUgbGltaXQuIFRoZSB0aW1lb3V0IGxpbWl0IGlzIHNldCBieSBjZmdfcmVzcF90aW1lb3V0LiovCgl1aW50MzJfdCBkZXNjX3RpbWVvdXQ6MTsgLypbMTJdICAgICAgRGVzY3JpcHRvciBleGVjdXRpb24gdGltZSBvdmVyIHRpbWUgbGltaXQuIFRoZSB0aW1lb3V0IGxpbWl0IGlzIHNldCBieSBkZXNjcmlwdG9yIGl0c2VsZi4qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgICBDb25zaWRlciB0aGUgbXVsdGlwbGUgYmxvY2sgcmVhZC93cml0ZSwgc2V0IHRoZSBwcm9wZXIgdGltZW91dCBsaW1pdHMuKi8KCXVpbnQzMl90IGVuZF9vZl9jaGFpbjoxOyAvKlsxM10gICAgICBFbmQgb2YgQ2hhaW4gSVJRLCBOb3JtYWwgSVJRLiAqLwoJdWludDMyX3QgZGVzY19pcnE6MTsgICAgIC8qWzE0XSAgICAgIFRoaXMgZGVzY3JpcHRvciByZXF1ZXN0cyBhbiBJUlEsIE5vcm1hbCBJUlEsIHRoZSBkZXNjcmlwdG9yIGNoYWluIGV4ZWN1dGlvbiBrZWVwcyBnb2luZyBvbi4qLwoJdWludDMyX3QgaXJxX3NkaW86MTsgICAgIC8qWzE1XSAgICAgIFNESU8gZGV2aWNlIHVzZXMgREFUWzFdIHRvIHJlcXVlc3QgSVJRLiAqLwoJdWludDMyX3QgZGF0X2k6ODsgICAgICAgIC8qWzIzOjE2XSAgIElucHV0IGRhdGEgc2lnbmFscy4gKi8KCXVpbnQzMl90IGNtZF9pOjE7ICAgICAgICAvKlsyNF0gICAgICBucHV0IHJlc3BvbnNlIHNpZ25hbC4gKi8KCXVpbnQzMl90IGRzOjE7ICAgICAgICAgICAvKlsyNV0gICAgICBJbnB1dCBkYXRhIHN0cm9iZS4gKi8KCXVpbnQzMl90IGJ1c19mc206NDsgICAgICAvKlsyOToyNl0gICBCVVMgZnNtICovCiAgICB1aW50MzJfdCBkZXNjX3dyX3JkeToxOyAgLypbMzBdICAgICAgRGVzY3JpcHRvciB3cml0ZSBiYWNrIHByb2Nlc3MgaXMgZG9uZSBhbmQgaXQgaXMgcmVhZHkgZm9yIENQVSB0byByZWFkLiovCgl1aW50MzJfdCBjb3JlX3JkeToxOwkgLypbMzFdICAgICAgIGRlc2NfYnVzeSBvciBzZF9lbW1jX2lycSBvciBidXNfZnNtIGlzIG5vdCBpZGxlLiovCn07Ly9fX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSk7CgoKc3RydWN0IHNkX2VtbWNfY2xvY2t7CiAgICB1aW50MzJfdCBkaXY6NjsgICAgICAgICAgLypbNTowXSAgICAgQ2xvY2sgZGl2aWRlci4gRnJlcXVlbmN5ID0gY2xvY2sgc291cmNlL2NmZ19kaXYsIE1heGltdW0gZGl2aWRlciA2My4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQ2xvY2sgb2ZmOiBjZmdfZGl2PT0wLCB0aGUgY2xvY2sgaXMgZGlzYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qRGl2aWRlciBieXBhc3M6IGNmZ19kaXY9PTEsIGNsb2NrIHNvdXJjZSBpcyB1c2VkIGFzIGNvcmUgY2xvY2sgd2l0aG91dCBkaXZpZGVyLiAqLwogICAgdWludDMyX3Qgc3JjOjI7ICAgICAgICAgIC8qWzc6Nl0gICAgIENsb2NrIHNvdXJjZSwgMDogQ3J5c3RhbCAyNE1IeiwgMTogRml4IFBMTCwgODUwTUh6Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDI6IE1QTEwsIDw2MzdNSHosIHVzZWQgZm9yIDQwME1IeiBleGFjdGx5LiAzOiBkaWZmZXJlbnQgUExMICovCiAgICB1aW50MzJfdCBjb3JlX3BoYXNlOjI7ICAgLypbOTo4XSAgICAgQ29yZSBjbG9jayBwaGFzZS4gMDogMCBwaGFzZSwgMTogOTAgcGhhc2UsIDI6IDE4MCBwaGFzZSwgMzogMjcwIHBoYXNlLiovCiAgICB1aW50MzJfdCB0eF9waGFzZToyOyAgICAgLypbMTE6MTBdICAgVFggY2xvY2sgcGhhc2UuIDA6IDAgcGhhc2UsIDE6IDkwIHBoYXNlLCAyOiAxODAgcGhhc2UsIDM6IDI3MCBwaGFzZS4qLwogICAgdWludDMyX3QgcnhfcGhhc2U6MjsgICAgIC8qWzEzOjEyXSAgIFJYIGNsb2NrIHBoYXNlLiAwOiAwIHBoYXNlLCAxOiA5MCBwaGFzZSwgMjogMTgwIHBoYXNlLCAzOiAyNzAgcGhhc2UuKi8KICAgIHVpbnQzMl90IHJlc2VydmVkMTQ6MjsKICAgIHVpbnQzMl90IHR4X2RlbGF5OjY7ICAgICAvKlsyMToxNl0gICBUWCBjbG9jayBkZWxheSBsaW5lLiAwOiBubyBkZWxheSwgbjogZGVsYXkgbioyMDBwcy4gTWF4aW11bSBkZWxheSAzbnMuKi8KICAgIHVpbnQzMl90IHJ4X2RlbGF5OjY7ICAgICAvKlsyNzoyMl0gICBSWCBjbG9jayBkZWxheSBsaW5lLiAwOiBubyBkZWxheSwgbjogZGVsYXkgbioyMDBwcy4gTWF4aW11bSBkZWxheSAzbnMuKi8KICAgIHVpbnQzMl90IGFsd2F5c19vbjoxOyAgICAvKlsyOF0gICAgICAxOiBLZWVwIGNsb2NrIGFsd2F5cyBvbi4gMDogQ2xvY2sgb24vb2ZmIGNvbnRyb2xsZWQgYnkgYWN0aXZpdGllcy4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qQW55IEFQQjMgYWNjZXNzIG9yIGRlc2NyaXB0b3IgZXhlY3V0aW9uIHdpbGwga2VlcCBjbG9jayBvbi4qLwogICAgdWludDMyX3QgaXJxX3NkaW9fc2xlZXA6MTsgLypbMjldICAgIDE6IGVuYWJsZSBJUlEgc2RpbyB3aGVuIGluIHNsZWVwIG1vZGUuICovCgl1aW50MzJfdCBpcnFfc2Rpb19zbGVlcF9kczoxOy8qWzMwXSAxOmVuYWJsZSBkcyBhcyBpcnEqLwogICAgdWludDMyX3QgcmVzZXJ2ZWQyNjoxOwp9OwoKc3RydWN0IHNkX2VtbWNfZGVsYXl7CiAgICB1aW50MzJfdCBkYXQwOjY7ICAgICAgICAgLypbMzowXSAgICAgICBEYXRhIDAgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDE6NjsgICAgICAgICAvKls3OjRdICAgICAgIERhdGEgMSBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0Mjo2OyAgICAgICAgIC8qWzExOjhdICAgICAgRGF0YSAyIGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQzOjY7ICAgICAgICAgLypbMTU6MTJdICAgICBEYXRhIDMgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRhdDQ6NjsgICAgICAgICAvKlsxOToxNl0gICAgIERhdGEgNCBkZWxheSBsaW5lLiAqLwoJdWludDMyX3Qgc3BhcmU6MjsKfTsKCnN0cnVjdCBzZF9lbW1jX2RlbGF5MXsKICAgIHVpbnQzMl90IGRhdDU6NjsgICAgICAgICAvKlsyMzoyMF0gICAgIERhdGEgNSBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgZGF0Njo2OyAgICAgICAgIC8qWzI3OjI0XSAgICAgRGF0YSA2IGRlbGF5IGxpbmUuICovCiAgICB1aW50MzJfdCBkYXQ3OjY7ICAgICAgICAgLypbMzE6MjhdICAgICBEYXRhIDcgZGVsYXkgbGluZS4gKi8KCXVpbnQzMl90IGRhdDg6NjsgICAgICAgICAvKlszMToyOF0gICAgIERhdGEgNyBkZWxheSBsaW5lLiAqLwoJdWludDMyX3QgZGF0OTo2OyAgICAgICAgIC8qWzMxOjI4XSAgICAgRGF0YSA3IGRlbGF5IGxpbmUuICovCgl1aW50MzJfdCBzcGFyZToyOwp9OwoKc3RydWN0IHNkX2VtbWNfYWRqdXN0ewogICAgdWludDMyX3QgY21kX2RlbGF5OjQ7ICAgICAgICAgICAvKlszOjBdICAgICAgIENvbW1hbmQgZGVsYXkgbGluZS4gKi8KICAgIHVpbnQzMl90IGRzX2RlbGF5OjQ7ICAgICAgICAgICAgLypbNzo0XSAgICAgICBEUyBkZWxheSBsaW5lLiAqLwogICAgdWludDMyX3QgY2FsaV9zZWw6NDsgICAgICAgICAgICAvKlsxMTo4XSAgICAgIFNlbGVjdCBvbmUgc2lnbmFsIHRvIGJlIHRlc3RlZC4qLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypTaWduYWxzIGFyZSBsYWJlbGVkIGZyb20gMCB0byA5IHRoZSBzYW1lIGFzIGRlbGF5IGxpbmVzLiAqLwogICAgdWludDMyX3QgY2FsaV9lbmFibGU6MTsgICAgICAgICAvKlsxMl0gICAgICAgIEVuYWJsZSBjYWxpYnJhdGlvbi4gKi8KICAgIHVpbnQzMl90IGFkal9lbmFibGU6MTsgICAgICAgICAgLypbMTNdICAgICAgIEFkanVzdCBpbnRlcmZhY2UgdGltaW5nIGJ5IHJlc2FtcGxpbmcgdGhlIGlucHV0IHNpZ25hbHMuICovCiAgICB1aW50MzJfdCBjYWxpX3Jpc2U6MTsgICAgICAgICAgIC8qWzE0XSAgICAgICAxOiB0ZXN0IHRoZSByaXNpbmcgZWRnZS4gMDogdGVzdCB0aGUgZmFsbGluZyBlZGdlLiAqLwogICAgdWludDMyX3QgZHNfZW5hYmxlOjE7CQkJLypbMTVdCQlTYW1wbGluZyB0aGUgREFUIGJhc2VkIG9uIERTIGluIEhTNDAwIG1vZGUqLwogICAgdWludDMyX3QgYWRqX2RlbGF5OjY7ICAgICAgICAgICAvKlsyMToxNl0gICAgICAgUmVzYW1wbGUgdGhlIGlucHV0IHNpZ25hbHMgd2hlbiBjbG9jayBpbmRleD09YWRqX2RlbGF5LiAqLwogICAgdWludDMyX3QgYWRqX2F1dG86MTsJCQkvKlsyMl0JCQlVc2UgY2FsaV9kdXQgZmlyc3QgZmFsbGluZyBlZGdlIHRvIGFkanVzdCB0aGUgdGltaW5nICovCgkJCQkJCQkJCQkvKnNldCBjYWxpX2VuYWJsZSB0byAxIHRvIHVzZSB0aGlzIGZ1bmN0aW9uKi8KCXVpbnQzMl90IHJlc2VydmVkMjM6OTsKfTsKCgpzdHJ1Y3Qgc2RfZW1tY19jYWxvdXR7CiAgICB1aW50MzJfdCBjYWxpX2lkeDo2OyAgICAgICAgIC8qWzU6MF0gICAgICAgQ2FsaWJyYXRpb24gcmVhZGluZy4gVGhlIGV2ZW50IGhhcHBlbnMgYXQgdGhpcyBpbmRleC4gKi8KICAgIHVpbnQzMl90IHJlc2VydmVkNjoxOwogICAgdWludDMyX3QgY2FsaV92bGQ6MTsgICAgICAgICAvKls3XSAgICAgICAgIFRoZSByZWFkaW5nIGlzIHZhbGlkLiAqLwogICAgdWludDMyX3QgY2FsaV9zZXR1cDo4OyAgICAgICAvKlsxNTo4XSAgICAgIENvcGllZCBmcm9tIEJBU0UrMHg4IFsxNTo4XSBpbmNsdWRlIGNhbGlfc2VsLCBjYWxpX2VuYWJsZSwgYWRqX2VuYWJsZSwgY2FsaV9yaXNlLiAqLwogICAgdWludDMyX3QgcmVzZXJ2ZWQxNjoxNjsKfTsKCgpzdHJ1Y3Qgc2RfZW1tY19zdGFydHsKCXVpbnQzMl90IGluaXQ6MTsgICAgICAgICAvKlswXSAgIDE6IFJlYWQgZGVzY3JpcHRvciBmcm9tIGludGVybmFsIFNSQU0sIGxpbWl0ZWQgdG8gMzIgZGVzY3JpcHRvcnMuICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgMDogUmVhZCBkZXNjcmlwdG9yIGZyb20gZXh0ZXJuYWwgRERSICovCgl1aW50MzJfdCBidXN5OjE7ICAgICAgICAgLypbMV0gICAxOiBTdGFydCBjb21tYW5kIGNoYWluIGV4ZWN1dGlvbiBwcm9jZXNzLiAwOiBTdG9wICovCgl1aW50MzJfdCBhZGRyOjMwOyAgICAgICAgLypbMzE6Ml0gRGVzY3JpcHRvciBhZGRyZXNzLCB0aGUgbGFzdCAyIGJpdHMgYXJlIDAsIDQgYnl0ZXMgYWxpZ25lZC4gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBXaGVuIGludGVybmFsIFNSQU0gaXMgdXNlZCwgdGhlIHZhbGlkIGFkZHJlc3MgcmFuZ2UgaXMgZnJvbSAweDIwMH4weDNmZiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFdoZW4gZXh0ZXJuYWwgRERSIGlzIHVzZWQsIHRoZSB2YWxpZCBhZGRyZXNzIGlzIGFueXdoZXJlIGluIEREUiwgdGhlIGxlbmd0aCBvZiBjaGFpbiBpcyB1bmxpbWl0ZWQuKi8KfTsvL19fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKTsKCgpzdHJ1Y3Qgc2RfZW1tY19jb25maWd7Cgl1aW50MzJfdCBidXNfd2lkdGg6MjsgICAgLypbMTowXSAgICAgMDogMSBiaXQsIDE6IDQgYml0cywgMjogOCBiaXRzLCAzOiAyIGJpdHMgKG5vdCBzdXBwb3J0ZWQpKi8KCXVpbnQzMl90IGRkcjoxOyAgICAgICAgICAvKlsyXSAgICAgICAxOiBERFIgbW9kZSwgMDogU0RSIG1vZGUgKi8KCXVpbnQzMl90IGRjX3VndDoxOyAgICAgICAvKlszXSAgICAgICAxOiBERFIgYWNjZXNzIHVyZ2VudCwgMDogRERSIGFjY2VzcyBub3JtYWwuICovCgl1aW50MzJfdCBibF9sZW46NDsgICAgICAgLypbNzo0XSAgICAgQmxvY2sgbGVuZ3RoIDJeY2ZnX2JsX2xlbiwgYmVjYXVzZSBpbnRlcm5hbCBidWZmZXIgc2l6ZSBpcyBsaW1pdGVkIHRvIDUxMiBieXRlcywgdGhlIGNmZ19ibF9sZW4gPD05LiAqLwoJdWludDMyX3QgcmVzcF90aW1lb3V0OjQ7IC8qWzExOjhdICAgIFdhaXQgcmVzcG9uc2UgdGlsbCAyXmNmZ19yZXNwX3RpbWVvdXQgY29yZSBjbG9jayBjeWNsZXMuIE1heGltdW0gMzI3NjggY29yZSBjeWNsZXMuICovCgl1aW50MzJfdCByY19jYzo0OyAgICAgICAgLypbMTU6MTJdICAgV2FpdCByZXNwb25zZS1jb21tYW5kLCBjb21tYW5kLWNvbW1hbmQgZ2FwIGJlZm9yZSBuZXh0IGNvbW1hbmQsIDJeY2ZnX3JjX2NjIGNvcmUgY2xvY2sgY3ljbGVzLiAqLwoJdWludDMyX3Qgb3V0X2ZhbGw6MTsgICAgIC8qWzE2XSAgICAgIEREUiBtb2RlIG9ubHkuIFRoZSBjb21tYW5kIGFuZCBUWEQgc3RhcnQgZnJvbSByaXNpbmcgZWRnZS4gU2V0IDEgdG8gc3RhcnQgZnJvbSBmYWxsaW5nIGVkZ2UuICovCgl1aW50MzJfdCBibGtfZ2FwX2lwOjE7ICAgLypbMTddICAgICAgMTogRW5hYmxlIFNESU8gZGF0YSBibG9jayBnYXAgaW50ZXJydXB0IHBlcmlvZC4gMDogRGlzYWJsZWQuKi8KCXVpbnQzMl90IHNwYXJlOjE7ICAgICAgICAvKlsxOF0gICAgICBTcGFyZSwgID8/PyBuZWVkIGNoZWNrKi8KCXVpbnQzMl90IGlnbm9yZV9vd25lcjoxOyAvKlsxOV0gICAgICBVc2UgdGhpcyBkZXNjcmlwdG9yIGV2ZW4gaWYgaXRzIG93bmVyIGJpdCBpcyChsDChsS4qLwoJdWludDMyX3QgY2hrX2RzOjE7ICAgICAgIC8qWzIwXSAgICAgIENoZWNrIGRhdGEgc3Ryb2JlIGluIEhTNDAwLiovCgl1aW50MzJfdCBjbWRfbG93OjE7ICAgICAgLypbMjFdICAgICAgSG9sZCBDTUQgYXMgb3V0cHV0IExvdywgZU1NQyBib290IG1vZGUuKi8KCXVpbnQzMl90IHN0b3BfY2xrOjE7ICAgICAvKlsyMl0gICAgICAxOiBzdG9wIGNsb2NrLiAwOiBub3JtYWwgY2xvY2suKi8KCSAgICAgICAgICAgICAgICAgICAgICAgIC8qSW4gbm9ybWFsIG1vZGUsIHRoZSBjbG9jayBpcyBhdXRvbWF0aWNhbGx5IG9uL29mZiBkdXJpbmcgcmVhZGluZyBtb2RlIHRvIGJhY2sgb2ZmIHJlYWRpbmcgaW4gY2FzZSBvZiovCgkgICAgICAgICAgICAgICAgICAgICAgICAvKkREUiBzbG93IHJlc3BvbnNlLCBzdG9wIGNsb2NrIGlzIHVzZWQgaW4gdm9sdGFnZSBzd2l0Y2guKi8KCXVpbnQzMl90IGF1dG9fY2xrOjE7ICAgICAvKlsyM10gICAgICAxOiB3aGVuIEJVUyBpcyBpZGxlIGFuZCBubyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSwgdHVybiBvZmYgY2xvY2ssIHRvIHNhdmUgcG93ZXIuKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgICAgMDogY29yZSBjbG9jayBpcyBhbHdheXMgb24uKi8KICAgIHVpbnQzMl90IHR4ZF9hZGRfZXJyOjE7CS8qWzI0XSAgIAlUWEQgYWRkIGVycm9yIHRlc3QqLwoJCQkJCQkJLypUZXN0IGZlYXR1cmUsIHNob3VsZCBub3QgYmUgdXNlZCBpbiBub3JtYWwgY29uZGl0aW9uLiovCgkJCQkJCQkvKkl0IHdpbGwgaW52ZXJ0ZWQgdGhlIGZpcnN0IENSQyBiaXRzIG9mIHRoZSAzcmQgYmxvY2suKi8KCQkJCQkJCS8qQmxvY2sgaW5kZXggc3RhcnRzIGZyb20gMCwgMSwgMiwgoa0qLwogICAgdWludDMyX3QgdHhkX3JldHJ5OjE7CS8qWzI1XSAgIAlXaGVuIFRYRCBDUkMgZXJyb3IsIGhvc3Qgc2VuZHMgdGhlIGJsb2NrIGFnYWluLiovCgkJCQkJCQkvKlRoZSB0b3RhbCBudW1iZXIgb2YgcmV0cmllcyBvZiBvbmUgZGVzY3JpcHRvciBpcyBsaW1pdGVkIHRvIDE1LCAqLwoJCQkJCQkJLyphZnRlciAxNSByZXRyaWVzLCB0aGUgVFhEX2VyciBpcyBzZXQgdG8gaGlnaC4qLwogICAgdWludDMyX3QgcmV2ZDo4OwkgICAgICAgIC8qWzMxOjI2XSAgIHJldmVkKi8KfTsvL19fYXR0cmlidXRlX18oKF9fbWF5X2FsaWFzX18pKTsKCgpzdHJ1Y3Qgc2RfZW1tY19pcnFfZW57Cgl1aW50MzJfdCByeGRfZXJyOjg7ICAgICAgLypbNzowXSAgICAgUlggZGF0YSBDUkMgZXJyb3IgcGVyIHdpcmUuKi8KCXVpbnQzMl90IHR4ZF9lcnI6MTsgICAgICAvKls4XSAgICAgICBUWCBkYXRhIENSQyBlcnJvci4gKi8KCXVpbnQzMl90IGRlc2NfZXJyOjE7ICAgICAvKls5XSAgICAgICBTRC9lTU1DIGNvbnRyb2xsZXIgZG9lc26hr3Qgb3duIGRlc2NyaXB0b3IuICovCgl1aW50MzJfdCByZXNwX2VycjoxOyAgICAgLypbMTBdICAgICAgUmVzcG9uc2UgQ1JDIGVycm9yLiovCgl1aW50MzJfdCByZXNwX3RpbWVvdXQ6MTsgLypbMTFdICAgICAgTm8gcmVzcG9uc2UgcmVjZWl2ZWQgYmVmb3JlIHRpbWUgbGltaXQuICovCgl1aW50MzJfdCBkZXNjX3RpbWVvdXQ6MTsgLypbMTJdICAgICAgRGVzY3JpcHRvciBleGVjdXRpb24gdGltZSBvdmVyIHRpbWUgbGltaXQuICovCgl1aW50MzJfdCBlbmRfb2ZfY2hhaW46MTsgLypbMTNdICAgICAgRW5kIG9mIENoYWluIElSUS4gKi8KCXVpbnQzMl90IGRlc2NfaXJxOjE7ICAgICAvKlsxNF0gICAgICBUaGlzIGRlc2NyaXB0b3IgcmVxdWVzdHMgYW4gSVJRLiAqLwoJdWludDMyX3QgaXJxX3NkaW86MTsgICAgIC8qWzE1XSAgICAgIEVuYWJsZSBzZGlvIGludGVycnVwdC4gKi8KICAgIHVpbnQzMl90IHJldmQ6MTY7CSAgICAvKlszMToxNl0gICByZXZlZCovCn07CgpzdHJ1Y3Qgc2RfZW1tY19kYXRhX2luZm97Cgl1aW50MzJfdCBjbnQ6MTA7ICAgICAgICAgLypbOTowXSAgICAgUnhkIHdvcmRzIHJlY2VpdmVkIGZyb20gQlVTLiBUeGQgd29yZHMgcmVjZWl2ZWQgZnJvbSBERFIuKi8KCXVpbnQzMl90IGJsazo5OyAgICAgICAgICAvKlsyNDoxNl0gICBSeGQgQmxvY2tzIHJlY2VpdmVkIGZyb20gQlVTLiBUeGQgYmxvY2tzIHJlY2VpdmVkIGZyb20gRERSLiovCgl1aW50MzJfdCByZXZkOjMwOyAgICAgICAgLypbMzE6MTddICAgUmV2ZWQuICovCn07CgoKc3RydWN0IHNkX2VtbWNfY2FyZF9pbmZvewoJdWludDMyX3QgdHhkX2NudDoxMDsgICAgIC8qWzk6MF0gICAgIFR4ZCBCVVMgY3ljbGUgY291bnRlci4gKi8KCXVpbnQzMl90IHR4ZF9ibGs6OTsgICAgICAvKlsyNDoxNl0gICBUeGQgQlVTIGJsb2NrIGNvdW50ZXIuKi8KCXVpbnQzMl90IHJldmQ6MzA7ICAgICAgICAvKlszMToxN10gICBSZXZlZC4gKi8KfTsKCiNlbmRpZgo=