LyoKICogIE5vdGVwYWQgKEtvcmVhbiByZXNvdXJjZXMpCiAqCiAqICBDb3B5cmlnaHQgMTk5Nyw5OCBNYXJjZWwgQmF1ciA8bWJhdXJAZzI2LmV0aHouY2g+CiAqICBQcm9vZnJlYWQgMTk5OCBieSBEYXZpZCBMZWUgTGFtYmVydCA8bGFtYmVyNDVAZWdyLm1zdS5lZHU+CiAqICBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogIENvcHlyaWdodCAyMDA3IEJhbmcgSnVuLVlvdW5nIDxqdW55b3VuZ0Btb2d1YS5jb20+CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX0RFRkFVTFQKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICLGxMDPKCZGKSIgewogIE1FTlVJVEVNICK79bfOILi4temx4igmTilcdEN0cmwrTiIsICAgQ01EX05FVwogIE1FTlVJVEVNICK/rbHiKCZPKS4uLlx0Q3RybCtPIiwgICAgICAgQ01EX09QRU4KICBNRU5VSVRFTSAiwPrA5SgmUylcdEN0cmwrUyIsICAgICAgICAgIENNRF9TQVZFCiAgTUVOVUlURU0gIrTZuKUgwMy4p8C4t84gwPrA5SgmQSkuLi4iLCBDTURfU0FWRV9BUwogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICLAzrziKCZQKS4uLlx0Q3RybCtQIiwgICAgICAgQ01EX1BSSU5UCiAgTUVOVUlURU0gIsbkwMzB9iC8s8GkKCZUKS4uLiIsICAgICAgICBDTURfUEFHRV9TRVRVUAogIE1FTlVJVEVNICLHwbiwxc0gvLPBpCgmUikuLi4iLCAgICAgICAgQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAis6Gzu7HiKCZYKSIsICAgICAgICAgICAgICAgIENNRF9FWElUCiB9ClBPUFVQICLG7cH9KCZFKSIgewogIE1FTlVJVEVNICK9x8fgIMPrvNIoJlUpXHRDdHJsK1oiLCAgICAgQ01EX1VORE8KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiwN+287O7seIoJlQpXHRDdHJsK1giLCAgICAgIENNRF9DVVQKICBNRU5VSVRFTSAiurm75ygmQylcdEN0cmwrQyIsICAgICAgICAgIENNRF9DT1BZCiAgTUVOVUlURU0gIrrZv6mz1rHiKCZQKVx0Q3RybCtWIiwgICAgICBDTURfUEFTVEUKICBNRU5VSVRFTSAiu+jBpigmRClcdERlbCIsICAgICAgICAgICAgIENNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiuPC1ziC8scXDKCZBKVx0Q3RybCtBIiwgICAgIENNRF9TRUxFQ1RfQUxMCiAgTUVOVUlURU0gIr3DsKMvs6/CpSgmVClcdEY1IiwgICAgICAgICBDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIsDatb8gwdkgudmy3igmVykiLCAgICAgICAgICBDTURfV1JBUAogIE1FTlVJVEVNICKx27LDKCZGKS4uLiIsICAgICAgICAgICAgICAgQ01EX0ZPTlQKIH0KUE9QVVAgIsOjseIoJlMpIiB7CiAgTUVOVUlURU0gIsOjseIoJlMpLi4uXHRDdHJsK0YiLCAgICAgICBDTURfU0VBUkNICiAgTUVOVUlURU0gIrTZwL0gw6Ox4igmTilcdEYzIiwgICAgICAgICBDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIrW1v/K4uygmSCkiIHsKICBNRU5VSVRFTSAix9e48SgmQykiLCAgICAgICAgICAgICAgICAgIENNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIsOjseIoJlMpLi4uIiwgICAgICAgICAgICAgICBDTURfSEVMUF9TRUFSQ0gKICBNRU5VSVRFTSAitbW/8ri7ILvnv+u5/SgmSCkiLCAgICAgICAgIENNRF9IRUxQX09OX0hFTFAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBQT1BVUCAiwaS6uCgmTykiIHsKICAgTUVOVUlURU0gIrbzwMy8vr26KCZMKS4uLiIsICAgICAgICAgIENNRF9MSUNFTlNFCiAgIE1FTlVJVEVNICK5q7q4wfUoJk4pLi4uIiwgICAgICAgICAgICBDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIldpbmUgwaS6uCgmQSkuLi4iLCAgICAgICAgIENNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIsbkwMzB9iC8s8GkIgp7CkxURVhUICAgICK407iusdsoJkgpOiIsICAweDE0MCwgICAxMCwgMDcsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0hFQURFUlZBTFVFLCAgIDYwLCAwNSwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICK52bTasdsoJkYpOiIsICAweDE0MiwgICAxMCwgMjQsIDQwLCAxNQpFRElUVEVYVCBJRENfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgIDYwLCAyMiwxMTAsIDEyLCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpHUk9VUEJPWCAiv6m56SgmTSk6IiwgICAgICAweDE0NCwgICAgIDEwLCA0MywxNjAsIDQ1CkxURVhUICAgICK/3sLKKCZMKToiLCAgICAgICAgMHgxNDUsICAgMjAsIDU1LCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIElEQ19QQUdFU0VUVVBfTEVGVFZBTFVFLCAgICAgNTAsIDU1LCAzNSwgMTEsIFdTX0NISUxEIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiwKcoJlQpOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCBJRENfUEFHRVNFVFVQX1RPUFZBTFVFLCAgICAgIDUwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIr/AuKXCyigmUik6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9SSUdIVFZBTFVFLCAgIDEzMCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICK+xrehKCZCKToiLCAgICAgIDB4MTRFLDEwMCwgNzMsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgSURDX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwgIDEzMCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCgpERUZQVVNIQlVUVE9OICLIrsDOIiwgICAgICAgSURPSywgICAgICAgICAgICAgICAgICAgMTgwLCAgMywgNDAsIDE1LCBXU19UQUJTVE9QClBVU0hCVVRUT04gICAgIsPrvNIiLCAgICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAitbW/8ri7KCZIKSIsIElESEVMUCwgICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsICAgIiZmIgpTVFJJTkdfUEFHRVNFVFVQX0ZPT1RFUlZBTFVFLCAgICImcCDG5MDMwfYiCgpTVFJJTkdfTk9URVBBRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiuN648MDlIgpTVFJJTkdfRVJST1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiv8C3+SIKU1RSSU5HX1dBUk5JTkcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIrDmsO0iClNUUklOR19JTkZPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLBpLq4IgoKU1RSSU5HX1VOVElUTEVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIsGmuPEgvvjAvSIKClNUUklOR19BTExfRklMRVMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICK48LXnIMbEwM8gKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwgICAgICAgICAgICAgICAgICAgICAgICAgICLF2L26xq4gua68rSAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIMbEwM/AzCCzyrmrIMS/vK0guN648MDlwLi3zrTCIL+tILz2IL74vcC0z7TZLlxuIFwKtNm4pSDG7cH9seK4piC757/rx8+9yr3Dv8AuIgpTVFJJTkdfTk9URVhULCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiwNS3wsfRILO7v+vAzCC++L3AtM+02S5cClxus7u/68C7IMDUt8LH0SDIxCDA573DtbXHz73KvcO/wCIKU1RSSU5HX0RPRVNOT1RFWElTVCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG7GxMDPwMwgvvi9wLTPtNkuXG5cbiBcCsbEwM/AuyC79bfOILi4teW9w7DavcC0z7HuPyIKU1RSSU5HX05PVFNBVkVELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG7GxMDPILO7v+vAzCC6r7Dmtce++r3AtM+02S5cblxuIFwKuq+w5iCzu7/rwLsgwPrA5cfPvcOw2r3AtM+x7j8iClNUUklOR19OT1RGT1VORCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyC5rsDav63AuyDDo8C7ILz2IL74vcC0z7TZLiIKU1RSSU5HX09VVF9PRl9NRU1PUlksICAgICAgICAgICAgICAgICAgICAgICAgICAgIsDMIMDbvvfAuyC/z7fhx8+0wiC1pSDHyr/kx9EguN648LiusKEgus7Bt8fVtM+02S5cClxuu+e/6yCwobTJx9EguN648LiuwMcgvufAuyDIrrq4x8+x4iDAp8fYIMfPs6ogwMy788DHIMDAv+sgx8G3zrHXt6XAuyC03b7GIMHWvcq9w7/ALlxuIgoKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19LT1JFQU4sIFNVQkxBTkdfREVGQVVMVAp7CklEU19MSUNFTlNFX0NBUFRJT04sICAgICAgICAgICAgIrbzwMy8vr26IgpJRFNfTElDRU5TRSwKIlRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgXAptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIFwKTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIFwKdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXG5cClRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBcCmJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIFwKTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgXApMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLlxuXApZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIFwKTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBcCkZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EiCgpJRFNfV0FSUkFOVFlfQ0FQVElPTiwgIrmrurjB9SIKSURTX1dBUlJBTlRZLAoiVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIFwKYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBcCkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIgp9Cg==