IyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjYuMiBGQVRBTF9FUlJPUikKc2V0KENNQUtFX01PRFVMRV9QQVRIICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2U7JHtDTUFLRV9NT0RVTEVfUEFUSH0iKQppbmNsdWRlKFV0aWxpdGllcykKCnByb2plY3QoIENVUkwgQyApCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICJMSUJDVVJMX1ZFUlNJT05fTUFKT1JbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fTUogJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIgogIExJQkNVUkxfVkVSU0lPTl9NSiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnN0cmluZyAoUkVHRVggTUFUQ0gKICAiTElCQ1VSTF9WRVJTSU9OX01JTk9SWyBcdF0rKFswLTldKykiCiAgTElCQ1VSTF9WRVJTSU9OX01JICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIE1BVENIICIoWzAtOV0rKSIgTElCQ1VSTF9WRVJTSU9OX01JICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc3RyaW5nIChSRUdFWCBNQVRDSAogICJMSUJDVVJMX1ZFUlNJT05fUEFUQ0hbIFx0XSsoWzAtOV0rKSIKICBMSUJDVVJMX1ZFUlNJT05fUFQgJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggTUFUQ0ggIihbMC05XSspIiBMSUJDVVJMX1ZFUlNJT05fUFQgJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQpzZXQgKENVUkxfTUFKT1JfVkVSU0lPTiAke0xJQkNVUkxfVkVSU0lPTl9NSn0pCnNldCAoQ1VSTF9NSU5PUl9WRVJTSU9OICR7TElCQ1VSTF9WRVJTSU9OX01JfSkKc2V0IChDVVJMX1BBVENIX1ZFUlNJT04gJHtMSUJDVVJMX1ZFUlNJT05fUFR9KQoKaW5jbHVkZV9yZWd1bGFyX2V4cHJlc3Npb24oIl4uKiQiKSAgICAjIFN1a2VuZGVyOiBJcyBpdCBuZWNlc3Nhcnk/CgojIFNldHVwIHBhY2thZ2UgbWV0YS1kYXRhCiMgU0VUKFBBQ0tBR0UgImN1cmwiKQpzZXQoQ1VSTF9WRVJTSU9OICR7Q1VSTF9NQUpPUl9WRVJTSU9OfS4ke0NVUkxfTUlOT1JfVkVSU0lPTn0uJHtDVVJMX1BBVENIX1ZFUlNJT059KQptZXNzYWdlKFNUQVRVUyAiY3VybCB2ZXJzaW9uPVske0NVUkxfVkVSU0lPTn1dIikKIyBTRVQoUEFDS0FHRV9UQVJOQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9OQU1FICJjdXJsIikKIyBTRVQoUEFDS0FHRV9WRVJTSU9OICItIikKIyBTRVQoUEFDS0FHRV9TVFJJTkcgImN1cmwtIikKIyBTRVQoUEFDS0FHRV9CVUdSRVBPUlQgImEgc3VpdGFibGUgY3VybCBtYWlsaW5nIGxpc3QgPT4gaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsLyIpCnNldChPUEVSQVRJTkdfU1lTVEVNICIke0NNQUtFX1NZU1RFTV9OQU1FfSIpCnNldChPUyAiXCIke0NNQUtFX1NZU1RFTV9OQU1FfVwiIikKCmluY2x1ZGVfZGlyZWN0b3JpZXMoJHtQUk9KRUNUX0JJTkFSWV9ESVJ9L2luY2x1ZGUvY3VybCkKaW5jbHVkZV9kaXJlY3RvcmllcyggJHtDVVJMX1NPVVJDRV9ESVJ9L2luY2x1ZGUgKQoKb3B0aW9uKEJVSUxEX0NVUkxfRVhFICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCBleGVjdXRhYmxlLiIgT04pCm9wdGlvbihCVUlMRF9DVVJMX1RFU1RTICJTZXQgdG8gT04gdG8gYnVpbGQgY1VSTCB0ZXN0cy4iIE9OKQpvcHRpb24oQ1VSTF9TVEFUSUNMSUIgIlNldCB0byBPTiB0byBidWlsZCBsaWJjdXJsIHdpdGggc3RhdGljIGxpbmtpbmcuIiBPRkYpCm9wdGlvbihDVVJMX1VTRV9BUkVTICJTZXQgdG8gT04gdG8gZW5hYmxlIGMtYXJlcyBzdXBwb3J0IiBPRkYpCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKENVUkxfVVNFX0FSRVMpCiAgc2V0KFVTRV9BUkVTICR7Q1VSTF9VU0VfQVJFU30pCiAgZmluZF9wYWNrYWdlKENBUkVTIFJFUVVJUkVEKQogIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke0NBUkVTX0xJQlJBUll9ICkKICBzZXQoQ1VSTF9MSUJTICR7Q1VSTF9MSUJTfSAke0NBUkVTX0xJQlJBUll9KQplbmRpZigpCgpvcHRpb24oQlVJTERfREFTSEJPQVJEX1JFUE9SVFMgIlNldCB0byBPTiB0byBhY3RpdmF0ZSByZXBvcnRpbmcgb2YgY1VSTCBidWlsZHMgaGVyZSBodHRwOi8vd3d3LmNkYXNoLm9yZy9DRGFzaFB1YmxpYy9pbmRleC5waHA/cHJvamVjdD1DVVJMIiBPRkYpCmlmKEJVSUxEX0RBU0hCT0FSRF9SRVBPUlRTKQogICNJTkNMVURFKERhcnQpCiAgaW5jbHVkZShDVGVzdCkKZW5kaWYoQlVJTERfREFTSEJPQVJEX1JFUE9SVFMpCgppZihNU1ZDKQogIG9wdGlvbihCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMgIlNldCBPRkYgdG8gYnVpbGQgZWFjaCBjb25maWd1cmF0aW9uIHRvIGEgc2VwYXJhdGUgZGlyZWN0b3J5IiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChCVUlMRF9SRUxFQVNFX0RFQlVHX0RJUlMpCmVuZGlmKCkKCm9wdGlvbihDVVJMX0hJRERFTl9TWU1CT0xTICJTZXQgdG8gT04gdG8gaGlkZSBsaWJjdXJsIGludGVybmFsIHN5bWJvbHMgKD1oaWRlIGFsbCBzeW1ib2xzIHRoYXQgYXJlbid0IG9mZmljaWFsbHkgZXh0ZXJuYWwpLiIgT04pCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ISURERU5fU1lNQk9MUykKCiMgSUYoV0lOMzIpCiMgT1BUSU9OKENVUkxfV0lORE9XU19TU1BJICJVc2Ugd2luZG93cyBsaWJyYXJpZXMgdG8gYWxsb3cgTlRMTSBhdXRoZW50aWNhdGlvbiB3aXRob3V0IG9wZW5zc2wiIE9OKQojIE1BUktfQVNfQURWQU5DRUQoQ1VSTF9XSU5ET1dTX1NTUEkpCiMgRU5ESUYoKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgppZihIVFRQX09OTFkpCiAgc2V0KENVUkxfRElTQUJMRV9GVFAgT04pCiAgc2V0KENVUkxfRElTQUJMRV9MREFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUFMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URUxORVQgT04pCiAgc2V0KENVUkxfRElTQUJMRV9ESUNUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRklMRSBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1RGVFAgT04pCmVuZGlmKCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ09PS0lFUyAidG8gZGlzYWJsZSBjb29raWVzIHN1cHBvcnQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfQ09PS0lFUykKCm9wdGlvbihDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggInRvIGRpc2FibGUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCkKb3B0aW9uKENVUkxfRElTQUJMRV9WRVJCT1NFX1NUUklOR1MgInRvIGRpc2FibGUgdmVyYm9zZSBzdHJpbmdzIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUykKb3B0aW9uKERJU0FCTEVEX1RIUkVBRFNBRkUgIlNldCB0byBleHBsaWNpdGx5IHNwZWNpZnkgd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhyZWFkLXNhZmUgZnVuY3Rpb25zIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoRElTQUJMRURfVEhSRUFEU0FGRSkKb3B0aW9uKEVOQUJMRV9JUFY2ICJEZWZpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIElQdjYgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKEVOQUJMRV9JUFY2KQoKCiMgV2UgbmVlZCBhbnNpIGMtZmxhZ3MsIGVzcGVjaWFsbHkgb24gSFAKc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQU5TSV9DRkxBR1N9ICR7Q01BS0VfQ19GTEFHU30iKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtDTUFLRV9BTlNJX0NGTEFHU30pCgojIERpc2FibGUgd2FybmluZ3Mgb24gQm9ybGFuZCB0byBhdm9pZCBjaGFuZ2luZyAzcmQgcGFydHkgY29kZS4KaWYoQk9STEFORCkKICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtdy0iKQplbmRpZihCT1JMQU5EKQoKIyBJZiB3ZSBhcmUgb24gQUlYLCBkbyB0aGUgX0FMTF9TT1VSQ0UgbWFnaWMKaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCiAgc2V0KF9BTExfU09VUkNFIDEpCmVuZGlmKCR7Q01BS0VfU1lTVEVNX05BTUV9IE1BVENIRVMgQUlYKQoKIyBJbmNsdWRlIGFsbCB0aGUgbmVjZXNzYXJ5IGZpbGVzIGZvciBtYWNyb3MKaW5jbHVkZSAoQ2hlY2tGdW5jdGlvbkV4aXN0cykKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZSkKaW5jbHVkZSAoQ2hlY2tJbmNsdWRlRmlsZXMpCmluY2x1ZGUgKENoZWNrTGlicmFyeUV4aXN0cykKaW5jbHVkZSAoQ2hlY2tTeW1ib2xFeGlzdHMpCmluY2x1ZGUgKENoZWNrVHlwZVNpemUpCgojIE9uIHdpbmRvd3MgcHJlbG9hZCBzZXR0aW5ncwppZihXSU4zMikKICBpbmNsdWRlKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9DTWFrZS9QbGF0Zm9ybXMvV2luZG93c0NhY2hlLmNtYWtlKQplbmRpZihXSU4zMikKCiMgVGhpcyBtYWNybyBjaGVja3MgaWYgdGhlIHN5bWJvbCBleGlzdHMgaW4gdGhlIGxpYnJhcnkgYW5kIGlmIGl0CiMgZG9lcywgaXQgcHJlcGVuZHMgbGlicmFyeSB0byB0aGUgbGlzdC4KbWFjcm8oQ0hFQ0tfTElCUkFSWV9FWElTVFNfQ09OQ0FUIExJQlJBUlkgU1lNQk9MIFZBUklBQkxFKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0xJQlJBUll9OyR7Q1VSTF9MSUJTfSIgJHtTWU1CT0x9ICIke0NNQUtFX0xJQlJBUllfUEFUSH0iCiAgICAke1ZBUklBQkxFfSkKICBpZigke1ZBUklBQkxFfSkKICAgIHNldChDVVJMX0xJQlMgJHtMSUJSQVJZfSAke0NVUkxfTElCU30pCiAgZW5kaWYoJHtWQVJJQUJMRX0pCmVuZG1hY3JvKENIRUNLX0xJQlJBUllfRVhJU1RTX0NPTkNBVCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndzMl8zMiIgZ2V0Y2ggICAgICAgIEhBVkVfTElCV1MyXzMyKQpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIndpbm1tIiAgZ2V0Y2ggICAgICAgIEhBVkVfTElCV0lOTU0pCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCJ3bGRhcDMyIiBjbGRhcF9vcGVuICIiIEhBVkVfV0xEQVAzMikKCmlmKFdJTjMyKQogIHNldChDVVJMX0RFRkFVTFRfRElTQUJMRV9MREFQIE9GRikKICAjIHNvbWUgd2luZG93cyBjb21waWxlcnMgZG8gbm90IGhhdmUgd2xkYXAzMgogIGlmKE5PVCBIQVZFX1dMREFQMzIpCiAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgIG1lc3NhZ2UoU1RBVFVTICJ3bGRhcDMyIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgb3B0aW9uKENVUkxfTERBUF9XSU4gIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9GRikKICBlbHNlKCkKICAgIG9wdGlvbihDVVJMX0xEQVBfV0lOICJVc2UgV2luZG93cyBMREFQIGltcGxlbWVudGF0aW9uIiBPTikKICBlbmRpZigpCiAgbWFya19hc19hZHZhbmNlZChDVVJMX0xEQVBfV0lOKQplbmRpZigpCgoKIyBJRihOT1QgQ1VSTF9TUEVDSUFMX0xJQlopCiMgIENIRUNLX0xJQlJBUllfRVhJU1RTX0NPTkNBVCgieiIgICAgICBpbmZsYXRlRW5kICAgSEFWRV9MSUJaKQojIEVORElGKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKCiMgQ2hlY2sgZm9yIGlkbgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImlkbiIgaWRuYV90b19hc2NpaV9seiBIQVZFX0xJQklETikKCiMgQ2hlY2sgZm9yIExEQVAKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJsZGFwIiBsZGFwX2luaXQgSEFWRV9MSUJMREFQKQojIGlmKE5PVCBIQVZFX0xJQkxEQVApCiMgU0VUKENVUkxfRElTQUJMRV9MREFQIE9OKQojIGVuZGlmKE5PVCBIQVZFX0xJQkxEQVApCgojIENoZWNrIGZvciBzeW1ib2wgZGxvcGVuIChzYW1lIGFzIEhBVkVfTElCREwpCmNoZWNrX2xpYnJhcnlfZXhpc3RzKCIke0NVUkxfTElCU30iIGRsb3BlbiAiIiBIQVZFX0RMT1BFTikKCiMgRm9yIG90aGVyIHRlc3RzIHRvIHVzZSB0aGUgc2FtZSBsaWJyYXJpZXMKc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0NVUkxfTElCU30pCgpvcHRpb24oQ1VSTF9aTElCICJTZXQgdG8gT04gdG8gZW5hYmxlIGJ1aWxkaW5nIGNVUkwgd2l0aCB6bGliIHN1cHBvcnQuIiBPTikKc2V0KEhBVkVfTElCWiBPRkYpCnNldChIQVZFX1pMSUJfSCBPRkYpCnNldChIQVZFX1pMSUIgT0ZGKQppZihDVVJMX1pMSUIpICAjIEFORCBDVVJMX0NPTkZJR19IQVNfQkVFTl9SVU5fQkVGT1JFCiAgZmluZF9wYWNrYWdlKFpMSUIgUVVJRVQpCiAgaWYoWkxJQl9GT1VORCkKICAgIHNldChIQVZFX1pMSUJfSCBPTikKICAgIHNldChIQVZFX1pMSUIgT04pCiAgICBzZXQoSEFWRV9MSUJaIE9OKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7WkxJQl9MSUJSQVJJRVN9KQogIGVuZGlmKCkKZW5kaWYoKQoKb3B0aW9uKENNQUtFX1VTRV9PUEVOU1NMICJVc2UgT3BlblNTTCBjb2RlLiBFeHBlcmltZW50YWwiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQppZihDTUFLRV9VU0VfT1BFTlNTTCkKCiAgc2V0KFVTRV9TU0xFQVkgT0ZGKQogIHNldChVU0VfT1BFTlNTTCBPRkYpCiAgc2V0KEhBVkVfTElCQ1JZUFRPIE9GRikKICBzZXQoSEFWRV9MSUJTU0wgT0ZGKQoKICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICBpZihPUEVOU1NMX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgbGlzdChBUFBFTkQgQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtPUEVOU1NMX0lOQ0xVREVfRElSfSkKICAgIHNldChVU0VfU1NMRUFZIE9OKQogICAgc2V0KFVTRV9PUEVOU1NMIE9OKQogICAgc2V0KEhBVkVfTElCQ1JZUFRPIE9OKQogICAgc2V0KEhBVkVfTElCU1NMIE9OKQogIGVuZGlmKE9QRU5TU0xfRk9VTkQpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQoKIyBJZiB3ZSBoYXZlIGZlYXR1cmVzLmgsIHRoZW4gZG8gdGhlIF9CU0RfU09VUkNFIG1hZ2ljCmNoZWNrX2luY2x1ZGVfZmlsZSgiZmVhdHVyZXMuaCIgICAgICAgSEFWRV9GRUFUVVJFU19IKQoKIyBDaGVjayBpZiBoZWFkZXIgZmlsZSBleGlzdHMgYW5kIGFkZCBpdCB0byB0aGUgbGlzdC4KbWFjcm8oQ0hFQ0tfSU5DTFVERV9GSUxFX0NPTkNBVCBGSUxFIFZBUklBQkxFKQogIGNoZWNrX2luY2x1ZGVfZmlsZXMoIiR7Q1VSTF9JTkNMVURFU307JHtGSUxFfSIgJHtWQVJJQUJMRX0pCiAgaWYoJHtWQVJJQUJMRX0pCiAgICBzZXQoQ1VSTF9JTkNMVURFUyAke0NVUkxfSU5DTFVERVN9ICR7RklMRX0pCiAgICBzZXQoQ1VSTF9URVNUX0RFRklORVMgIiR7Q1VSTF9URVNUX0RFRklORVN9IC1EJHtWQVJJQUJMRX0iKQogIGVuZGlmKCR7VkFSSUFCTEV9KQplbmRtYWNybyhDSEVDS19JTkNMVURFX0ZJTEVfQ09OQ0FUKQoKCiMgQ2hlY2sgZm9yIGhlYWRlciBmaWxlcwppZihOT1QgVU5JWCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3czJ0Y3BpcC5oIiAgICAgSEFWRV9XUzJUQ1BJUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2syLmgiICAgICBIQVZFX1dJTlNPQ0syX0gpCmVuZGlmKE5PVCBVTklYKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmlmKE5PVCBVTklYKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmRvd3MuaCIgICAgICBIQVZFX1dJTkRPV1NfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5zb2NrLmgiICAgICAgSEFWRV9XSU5TT0NLX0gpCmVuZGlmKE5PVCBVTklYKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW50dHlwZXMuaCIgICAgICAgSEFWRV9JTlRUWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvZmlsaW8uaCIgICAgICBIQVZFX1NZU19GSUxJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvaW9jdGwuaCIgICAgICBIQVZFX1NZU19JT0NUTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcGFyYW0uaCIgICAgICBIQVZFX1NZU19QQVJBTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcG9sbC5oIiAgICAgICBIQVZFX1NZU19QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU1lTX1JFU09VUkNFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zZWxlY3QuaCIgICAgIEhBVkVfU1lTX1NFTEVDVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NZU19TT0NLRVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tpby5oIiAgICAgSEFWRV9TWVNfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zdGF0LmgiICAgICAgIEhBVkVfU1lTX1NUQVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3RpbWUuaCIgICAgICAgSEFWRV9TWVNfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdHlwZXMuaCIgICAgICBIQVZFX1NZU19UWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdWlvLmgiICAgICAgICBIQVZFX1NZU19VSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3VuLmgiICAgICAgICAgSEFWRV9TWVNfVU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0aW1lLmgiICAgICAgSEFWRV9TWVNfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYWxsb2NhLmgiICAgICAgICAgSEFWRV9BTExPQ0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS9pbmV0LmgiICAgICAgSEFWRV9BUlBBX0lORVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS90ZnRwLmgiICAgICAgSEFWRV9BUlBBX1RGVFBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXNzZXJ0LmgiICAgICAgICAgSEFWRV9BU1NFUlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiY3J5cHRvLmgiICAgICAgICAgSEFWRV9DUllQVE9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGVzLmgiICAgICAgICAgICAgSEFWRV9ERVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJyLmgiICAgICAgICAgICAgSEFWRV9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJybm8uaCIgICAgICAgICAgSEFWRV9FUlJOT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJmY250bC5oIiAgICAgICAgICBIQVZFX0ZDTlRMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGkuaCIgIEhBVkVfR1NTQVBJX0dTU0FQSV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiIEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbi1mcmVlLmgiICAgICAgIEhBVkVfSUROX0ZSRUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGlic3NoMi5oIiAgICAgICAgSEFWRV9MSUJTU0gyX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxpbWl0cy5oIiAgICAgICAgIEhBVkVfTElNSVRTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImxvY2FsZS5oIiAgICAgICAgIEhBVkVfTE9DQUxFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldC9pZi5oIiAgICAgICAgIEhBVkVfTkVUX0lGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGRiLmgiICAgICAgICAgIEhBVkVfTkVUREJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC9pbi5oIiAgICAgSEFWRV9ORVRJTkVUX0lOX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvdGNwLmgiICAgIEhBVkVfTkVUSU5FVF9UQ1BfSCkKaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIE9QRU5TU0xfRk9VTkQpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9jcnlwdG8uaCIgSEFWRV9PUEVOU1NMX0NSWVBUT19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvZW5naW5lLmgiIEhBVkVfT1BFTlNTTF9FTkdJTkVfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL2Vyci5oIiAgICBIQVZFX09QRU5TU0xfRVJSX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9wZW0uaCIgICAgSEFWRV9PUEVOU1NMX1BFTV9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wvcGtjczEyLmgiIEhBVkVfT1BFTlNTTF9QS0NTMTJfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJvcGVuc3NsL3JzYS5oIiAgICBIQVZFX09QRU5TU0xfUlNBX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9zc2wuaCIgICAgSEFWRV9PUEVOU1NMX1NTTF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm9wZW5zc2wveDUwOS5oIiAgIEhBVkVfT1BFTlNTTF9YNTA5X0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgib3BlbnNzbC9yYW5kLmgiICAgSEFWRV9PUEVOU1NMX1JBTkRfSCkKZW5kaWYoQ01BS0VfVVNFX09QRU5TU0wgQU5EIE9QRU5TU0xfRk9VTkQpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBlbS5oIiAgICAgICAgICAgIEhBVkVfUEVNX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInBvbGwuaCIgICAgICAgICAgIEhBVkVfUE9MTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwd2QuaCIgICAgICAgICAgICBIQVZFX1BXRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJyc2EuaCIgICAgICAgICAgICBIQVZFX1JTQV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZXRqbXAuaCIgICAgICAgICBIQVZFX1NFVEpNUF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzZ3R0eS5oIiAgICAgICAgICBIQVZFX1NHVFRZX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNpZ25hbC5oIiAgICAgICAgIEhBVkVfU0lHTkFMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNzbC5oIiAgICAgICAgICAgIEhBVkVfU1NMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGJvb2wuaCIgICAgICAgIEhBVkVfU1REQk9PTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgICBIQVZFX1NURElOVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpby5oIiAgICAgICAgICBIQVZFX1NURElPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGxpYi5oIiAgICAgICAgIEhBVkVfU1RETElCX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZy5oIiAgICAgICAgIEhBVkVfU1RSSU5HX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cmluZ3MuaCIgICAgICAgIEhBVkVfU1RSSU5HU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdHJvcHRzLmgiICAgICAgICBIQVZFX1NUUk9QVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvLmgiICAgICAgICAgSEFWRV9URVJNSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGVybWlvcy5oIiAgICAgICAgSEFWRV9URVJNSU9TX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRpbWUuaCIgICAgICAgICAgIEhBVkVfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0bGQuaCIgICAgICAgICAgICBIQVZFX1RMRF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1bmlzdGQuaCIgICAgICAgICBIQVZFX1VOSVNURF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ1dGltZS5oIiAgICAgICAgICBIQVZFX1VUSU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIng1MDkuaCIgICAgICAgICAgIEhBVkVfWDUwOV9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicHJvY2Vzcy5oIiAgICAgICAgSEFWRV9QUk9DRVNTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGRlZi5oIiAgICAgICAgIEhBVkVfU1REREVGX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImRsZmNuLmgiICAgICAgICAgIEhBVkVfRExGQ05fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWFsbG9jLmgiICAgICAgICAgSEFWRV9NQUxMT0NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibWVtb3J5LmgiICAgICAgICAgSEFWRV9NRU1PUllfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIm5ldGluZXQvaWZfZXRoZXIuaCIgSEFWRV9ORVRJTkVUX0lGX0VUSEVSX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgSEFWRV9TVERJTlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic29ja2lvLmgiICAgICAgICBIQVZFX1NPQ0tJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdXRzbmFtZS5oIiAgIEhBVkVfU1lTX1VUU05BTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWRuYS5oIiAgICAgICAgICBIQVZFX0lETkFfSCkKCmlmKE5PVCBIQVZFX0xEQVBfSCkKICBtZXNzYWdlKFNUQVRVUyAiTERBUF9IIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQplbmRpZigpCgojIE5vIGxkYXAsIG5vIGxkYXBzLgppZihDVVJMX0RJU0FCTEVfTERBUCkKICBpZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTKQogICAgbWVzc2FnZShTVEFUVVMgIkxEQVAgbmVlZHMgdG8gYmUgZW5hYmxlZCB0byBzdXBwb3J0IExEQVBTIikKICAgIHNldChDVVJMX0RJU0FCTEVfTERBUFMgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCmNoZWNrX3R5cGVfc2l6ZShzaXplX3QgIFNJWkVPRl9TSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZShzc2l6ZV90ICBTSVpFT0ZfU1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciICBTSVpFT0ZfTE9OR19MT05HKQpjaGVja190eXBlX3NpemUoImxvbmciICBTSVpFT0ZfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgIFNJWkVPRl9TSE9SVCkKY2hlY2tfdHlwZV9zaXplKCJpbnQiICBTSVpFT0ZfSU5UKQpjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGRvdWJsZSIgIFNJWkVPRl9MT05HX0RPVUJMRSkKY2hlY2tfdHlwZV9zaXplKCJ0aW1lX3QiICBTSVpFT0ZfVElNRV9UKQppZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKICBpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgbG9uZykKICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogIGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgX19pbnQ2NCkKICBlbmRpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKZW5kaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCgojIERpZmZlcmVudCBzaXplb2ZzLCBldGMuCgojICAgIGRlZmluZSBDVVJMX1NJWkVPRl9MT05HICAgICAgICA0CiMgICAgZGVmaW5lIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgIGxvbmcgbG9uZwojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICAibGxkIgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9DVVJMX09GRl9UVSAibGx1IgojICAgIGRlZmluZSBDVVJMX0ZPUk1BVF9PRkZfVCAgICAgICAiJWxsZCIKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAgOAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UICBMTAojICAgIGRlZmluZSBDVVJMX1NVRkZJWF9DVVJMX09GRl9UVSBVTEwKCnNldChDVVJMX1NJWkVPRl9MT05HICR7U0laRU9GX0xPTkd9KQoKaWYoU0laRU9GX0xPTkcgRVFVQUwgOCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCBsb25nKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUwpCmVuZGlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCgppZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgImxvbmcgbG9uZyIpCiAgc2V0KENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgOCkKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAibGxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGxkIikKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCBMTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMKQplbmRpZihTSVpFT0ZfTE9OR19MT05HIEVRVUFMIDgpCgppZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCAke3NzaXplX3R9KQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UICR7U0laRU9GX1NTSVpFX1R9KQogICMgVE9ETzogbmVlZCBhZGp1c3RtZW50IGhlcmUuCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxkIikKICBzZXQoQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImx1IikKICBzZXQoQ1VSTF9GT1JNQVRfT0ZGX1QgIiVsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTCkKICBzZXQoQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgTFUpCmVuZGlmKE5PVCBDVVJMX1RZUEVPRl9DVVJMX09GRl9UKQoKaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQogIHNldChIQVZFX0xPTkdMT05HIDEpCiAgc2V0KEhBVkVfTEwgMSkKZW5kaWYoSEFWRV9TSVpFT0ZfTE9OR19MT05HKQoKZmluZF9maWxlKFJBTkRPTV9GSUxFIHVyYW5kb20gL2RldikKbWFya19hc19hZHZhbmNlZChSQU5ET01fRklMRSkKCiMgQ2hlY2sgZm9yIHNvbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQKY2hlY2tfc3ltYm9sX2V4aXN0cyhiYXNlbmFtZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0JBU0VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHNvY2tldCAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU09DS0VUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBvbGwgICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUE9MTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZWxlY3QgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFTEVDVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJkdXAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkRVUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJzdHIgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlNUUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJ0b2tfciAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPS19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmZ0aW1lICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSRlRJTUUpCmNoZWNrX3N5bWJvbF9leGlzdHModW5hbWUgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9VTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjYXNlY21wICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNBU0VDTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyaWNtcCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJJQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmNtcGkgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJuY21waSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGFsYXJtICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQUxBUk0pCmlmKE5PVCBIQVZFX1NUUk5DTVBJKQogIHNldChIQVZFX1NUUkNNUEkpCmVuZGlmKE5PVCBIQVZFX1NUUk5DTVBJKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGhvc3RieWFkZHIgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyX3IgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUSE9TVEJZQUREUl9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHRpbWVvZmRheSAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUVElNRU9GREFZKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfYWRkciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9BRERSKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYSAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BKQpjaGVja19zeW1ib2xfZXhpc3RzKGluZXRfbnRvYV9yICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSU5FVF9OVE9BX1IpCmNoZWNrX3N5bWJvbF9leGlzdHModGNzZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ1NFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHModGNnZXRhdHRyICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UQ0dFVEFUVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMocGVycm9yICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoY2xvc2Vzb2NrZXQgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9DTE9TRVNPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXR2YnVmICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFZCVUYpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnc2V0am1wICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdTRVRKTVApCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0cGFzc19yICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQQVNTX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybGNhdCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJMQ0FUKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHB3dWlkICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUFdVSUQpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0ZXVpZCAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRFVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKHV0aW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVVRJTUUpCmlmKENNQUtFX1VTRV9PUEVOU1NMKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9zdGF0dXMgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX1NUQVRVUykKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc2NyZWVuICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TQ1JFRU4pCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX2VnZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfRUdEKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEgIiR7Q1VSTF9JTkNMVURFU30iCiAgICBIQVZFX0NSWVBUT19DTEVBTlVQX0FMTF9FWF9EQVRBKQogIGlmKEhBVkVfTElCQ1JZUFRPIEFORCBIQVZFX0xJQlNTTCkKICAgIHNldChVU0VfT1BFTlNTTCAxKQogICAgc2V0KFVTRV9TU0xFQVkgMSkKICBlbmRpZihIQVZFX0xJQkNSWVBUTyBBTkQgSEFWRV9MSUJTU0wpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQpjaGVja19zeW1ib2xfZXhpc3RzKGdtdGltZV9yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR01USU1FX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMobG9jYWx0aW1lX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9MT0NBTFRJTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZSAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnbmFsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfRlVOQykKY2hlY2tfc3ltYm9sX2V4aXN0cyhTSUdBTFJNICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9NQUNSTykKaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCiAgc2V0KEhBVkVfU0lHTkFMIDEpCmVuZGlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQpjaGVja19zeW1ib2xfZXhpc3RzKHVuYW1lICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRvbGwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPTEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoX3N0cnRvaTY0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfX1NUUlRPSTY0KQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmVycm9yX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkVSUk9SX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnaW50ZXJydXB0ICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHSU5URVJSVVBUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBlcnJvciAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhmb3JrICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GT1JLKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVhZGRyaW5mbyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVBRERSSU5GTykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlaWZhZGRycyAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFSUZBRERSUykKY2hlY2tfc3ltYm9sX2V4aXN0cyhwaXBlICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QSVBFKQpjaGVja19zeW1ib2xfZXhpc3RzKGZ0cnVuY2F0ZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZUUlVOQ0FURSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwcm90b2J5bmFtZSAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQUk9UT0JZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuX2ZyZWUgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROX0ZSRUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuYV9zdHJlcnJvciAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROQV9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0bGRfc3RyZXJyb3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UTERfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0bG9jYWxlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUTE9DQUxFKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmY250bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GQ05UTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpb2N0bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JT0NUTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRzb2Nrb3B0ICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRTT0NLT1BUKQoKIyBzeW1ib2wgZXhpc3RzIGluIHdpbjMyLCBidXQgZnVuY3Rpb24gZG9lcyBub3QuCmNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpbmV0X3B0b24gSEFWRV9JTkVUX1BUT04pCgojIHNpZ2FjdGlvbiBhbmQgc2lnc2V0am1wIGFyZSBzcGVjaWFsLiBVc2Ugc3BlY2lhbCBtZWNoYW5pc20gZm9yCiMgZGV0ZWN0aW5nIHRob3NlLCBidXQgb25seSBpZiBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZC4KaWYoSEFWRV9TSUdOQUxfSCkKICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2FjdGlvbiAic2lnbmFsLmgiIEhBVkVfU0lHQUNUSU9OKQplbmRpZihIQVZFX1NJR05BTF9IKQoKaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQogIGlmKEhBVkVfU0VUSk1QX0gpCiAgICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ3NldGptcCAic2V0am1wLmgiIEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICAgIHNldChIQVZFX1NJR1NFVEpNUCAxKQogICAgZW5kaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgZW5kaWYoSEFWRV9TRVRKTVBfSCkKZW5kaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQoKIyBJZiB0aGVyZSBpcyBubyBzdHJpY21wKCksIGRvIG5vdCBhbGxvdyBMREFQIHRvIHBhcnNlIFVSTHMKaWYoTk9UIEhBVkVfU1RSSUNNUCkKICBzZXQoSEFWRV9MREFQX1VSTF9QQVJTRSAxKQplbmRpZihOT1QgSEFWRV9TVFJJQ01QKQoKIyBGb3Igb3RoZXIgY3VybCBzcGVjaWZpYyB0ZXN0cywgdXNlIHRoaXMgbWFjcm8uCm1hY3JvKENVUkxfSU5URVJOQUxfVEVTVCBDVVJMX1RFU1QpCiAgaWYoIiR7Q1VSTF9URVNUfSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfSQiKQogICAgc2V0KE1BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TCiAgICAgICItRCR7Q1VSTF9URVNUfSAke0NVUkxfVEVTVF9ERUZJTkVTfSAke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCiAgICBpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCiAgICAgIHNldChDVVJMX1RFU1RfQUREX0xJQlJBUklFUwogICAgICAgICItRExJTktfTElCUkFSSUVTOlNUUklORz0ke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQogICAgZW5kaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQoKICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0iKQogICAgdHJ5X2NvbXBpbGUoJHtDVVJMX1RFU1R9CiAgICAgICR7Q01BS0VfQklOQVJZX0RJUn0KICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlL0N1cmxUZXN0cy5jCiAgICAgIENNQUtFX0ZMQUdTIC1EQ09NUElMRV9ERUZJTklUSU9OUzpTVFJJTkc9JHtNQUNST19DSEVDS19GVU5DVElPTl9ERUZJTklUSU9OU30KICAgICAgIiR7Q1VSTF9URVNUX0FERF9MSUJSQVJJRVN9IgogICAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUKQogICAgaWYoJHtDVVJMX1RFU1R9KQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0gLSBTdWNjZXNzIikKICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZU91dHB1dC5sb2cKICAgICAgICAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IHBhc3NlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgogICAgICAgICIke09VVFBVVH1cbiIpCiAgICBlbHNlKCR7Q1VSTF9URVNUfSkKICAgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSAtIEZhaWxlZCIpCiAgICAgIHNldCgke0NVUkxfVEVTVH0gIiIgQ0FDSEUgSU5URVJOQUwgIkN1cmwgdGVzdCAke0ZVTkNUSU9OfSIpCiAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2cKICAgICAgICAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgogICAgICAgICIke09VVFBVVH1cbiIpCiAgICBlbmRpZigke0NVUkxfVEVTVH0pCiAgZW5kaWYoIiR7Q1VSTF9URVNUfSIgTUFUQ0hFUyAiXiR7Q1VSTF9URVNUfSQiKQplbmRtYWNybyhDVVJMX0lOVEVSTkFMX1RFU1QpCgptYWNybyhDVVJMX0lOVEVSTkFMX1RFU1RfUlVOIENVUkxfVEVTVCkKICBpZigiJHtDVVJMX1RFU1R9X0NPTVBJTEUiIE1BVENIRVMgIl4ke0NVUkxfVEVTVH1fQ09NUElMRSQiKQogICAgc2V0KE1BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TCiAgICAgICItRCR7Q1VSTF9URVNUfSAke0NNQUtFX1JFUVVJUkVEX0ZMQUdTfSIpCiAgICBpZihDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMpCiAgICAgIHNldChDVVJMX1RFU1RfQUREX0xJQlJBUklFUwogICAgICAgICItRExJTktfTElCUkFSSUVTOlNUUklORz0ke0NNQUtFX1JFUVVJUkVEX0xJQlJBUklFU30iKQogICAgZW5kaWYoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTKQoKICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIEN1cmwgVGVzdCAke0NVUkxfVEVTVH0iKQogICAgdHJ5X3J1bigke0NVUkxfVEVTVH0gJHtDVVJMX1RFU1R9X0NPTVBJTEUKICAgICAgJHtDTUFLRV9CSU5BUllfRElSfQogICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvQ3VybFRlc3RzLmMKICAgICAgQ01BS0VfRkxBR1MgLURDT01QSUxFX0RFRklOSVRJT05TOlNUUklORz0ke01BQ1JPX0NIRUNLX0ZVTkNUSU9OX0RFRklOSVRJT05TfQogICAgICAiJHtDVVJMX1RFU1RfQUREX0xJQlJBUklFU30iCiAgICAgIE9VVFBVVF9WQVJJQUJMRSBPVVRQVVQpCiAgICBpZigke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAxIENBQ0hFIElOVEVSTkFMICJDdXJsIHRlc3QgJHtGVU5DVElPTn0iKQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gU3VjY2VzcyIpCiAgICBlbHNlKCR7Q1VSTF9URVNUfV9DT01QSUxFIEFORCBOT1QgJHtDVVJMX1RFU1R9KQogICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBDdXJsIFRlc3QgJHtDVVJMX1RFU1R9IC0gRmFpbGVkIikKICAgICAgc2V0KCR7Q1VSTF9URVNUfSAiIiBDQUNIRSBJTlRFUk5BTCAiQ3VybCB0ZXN0ICR7RlVOQ1RJT059IikKICAgICAgZmlsZShBUFBFTkQgIiR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VFcnJvci5sb2ciCiAgICAgICAgIlBlcmZvcm1pbmcgQ3VybCBUZXN0ICR7Q1VSTF9URVNUfSBmYWlsZWQgd2l0aCB0aGUgZm9sbG93aW5nIG91dHB1dDpcbiIKICAgICAgICAiJHtPVVRQVVR9IikKICAgICAgaWYoJHtDVVJMX1RFU1R9X0NPTVBJTEUpCiAgICAgICAgZmlsZShBUFBFTkQKICAgICAgICAgICIke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlRXJyb3IubG9nIgogICAgICAgICAgIlRoZXJlIHdhcyBhIHByb2JsZW0gcnVubmluZyB0aGlzIHRlc3RcbiIpCiAgICAgIGVuZGlmKCR7Q1VSTF9URVNUfV9DT01QSUxFKQogICAgICBmaWxlKEFQUEVORCAiJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZyIKICAgICAgICAiXG5cbiIpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fQ09NUElMRSBBTkQgTk9UICR7Q1VSTF9URVNUfSkKICBlbmRpZigiJHtDVVJMX1RFU1R9X0NPTVBJTEUiIE1BVENIRVMgIl4ke0NVUkxfVEVTVH1fQ09NUElMRSQiKQplbmRtYWNybyhDVVJMX0lOVEVSTkFMX1RFU1RfUlVOKQoKIyBEbyBjdXJsIHNwZWNpZmljIHRlc3RzCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0ZDTlRMX09fTk9OQkxPQ0sKICAgIEhBVkVfSU9DVExTT0NLRVQKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUwKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUxfRklPTkJJTwogICAgSEFWRV9JT0NUTFNPQ0tFVF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIKICAgIEhBVkVfU0VUU09DS09QVF9TT19OT05CTE9DSwogICAgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRAogICAgVElNRV9XSVRIX1NZU19USU1FCiAgICBIQVZFX09fTk9OQkxPQ0sKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9SRUVOVFJBTlQKICAgIEhBVkVfU09DS0xFTl9UCiAgICBIQVZFX0lOX0FERFJfVAogICAgSEFWRV9CT09MX1QKICAgIFNURENfSEVBREVSUwogICAgUkVUU0lHVFlQRV9URVNUCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0wKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUQUREUklORk8KICAgIEhBVkVfRklMRV9PRkZTRVRfQklUUwogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdCgke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQppZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCiAgc2V0KF9GSUxFX09GRlNFVF9CSVRTIDY0KQplbmRpZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dMSUJDX1NUUkVSUk9SX1IKICAgIEhBVkVfUE9TSVhfU1RSRVJST1JfUgogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdF9ydW4oJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCiMgQ2hlY2sgZm9yIHJlZW50cmFudApmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBpZihOT1QgJHtDVVJMX1RFU1R9KQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGlmKE5PVCAke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKaWYoTkVFRF9SRUVOVFJBTlQpCiAgZm9yZWFjaChDVVJMX1RFU1QKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYpCiAgICBzZXQoJHtDVVJMX1RFU1R9IDApCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGZvcmVhY2goQ1VSTF9URVNUKQplbmRpZihORUVEX1JFRU5UUkFOVCkKCmlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgc2V0KEhBVkVfSU5FVF9OVE9BX1JfREVDTCAxKQogIHNldChORUVEX1JFRU5UUkFOVCAxKQplbmRpZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQoKIyBTb21lIG90aGVyIG1pbm9yIHRlc3RzCgppZihOT1QgSEFWRV9JTl9BRERSX1QpCiAgc2V0KGluX2FkZHJfdCAidW5zaWduZWQgbG9uZyIpCmVuZGlmKE5PVCBIQVZFX0lOX0FERFJfVCkKCiMgRml4IGxpYnogLyB6bGliLmgKCmlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKICBpZihOT1QgSEFWRV9MSUJaKQogICAgc2V0KEhBVkVfWkxJQl9IIDApCiAgZW5kaWYoTk9UIEhBVkVfTElCWikKCiAgaWYoTk9UIEhBVkVfWkxJQl9IKQogICAgc2V0KEhBVkVfTElCWiAwKQogIGVuZGlmKE5PVCBIQVZFX1pMSUJfSCkKZW5kaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQoKaWYoX0ZJTEVfT0ZGU0VUX0JJVFMpCiAgc2V0KF9GSUxFX09GRlNFVF9CSVRTIDY0KQplbmRpZihfRklMRV9PRkZTRVRfQklUUykKc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICItRF9GSUxFX09GRlNFVF9CSVRTPTY0IikKc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9jdXJsL2N1cmwuaCIpCmNoZWNrX3R5cGVfc2l6ZSgiY3VybF9vZmZfdCIgU0laRU9GX0NVUkxfT0ZGX1QpCnNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTKQpzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCgoKIyBDaGVjayBmb3Igbm9uYmxvY2tpbmcKc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcgMSkKaWYoSEFWRV9GSU9OQklPIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICAgIEhBVkVfT19OT05CTE9DSykKICBzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORykKZW5kaWYoSEFWRV9GSU9OQklPIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogIEhBVkVfT19OT05CTE9DSykKCmlmKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSB2b2lkKQplbHNlKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSBpbnQpCmVuZGlmKFJFVFNJR1RZUEVfVEVTVCkKCmlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKICBpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVduby1sb25nLWRvdWJsZSBIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogICAgIyBUaGUgTWFjIHZlcnNpb24gb2YgR0NDIHdhcm5zIGFib3V0IHVzZSBvZiBsb25nIGRvdWJsZS4gIERpc2FibGUgaXQuCiAgICBnZXRfc291cmNlX2ZpbGVfcHJvcGVydHkoTVBSSU5URl9DT01QSUxFX0ZMQUdTIG1wcmludGYuYyBDT01QSUxFX0ZMQUdTKQogICAgaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICIke01QUklOVEZfQ09NUElMRV9GTEFHU30gLVduby1sb25nLWRvdWJsZSIpCiAgICBlbHNlKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiLVduby1sb25nLWRvdWJsZSIpCiAgICBlbmRpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMobXByaW50Zi5jIFBST1BFUlRJRVMKICAgICAgQ09NUElMRV9GTEFHUyAke01QUklOVEZfQ09NUElMRV9GTEFHU30pCiAgZW5kaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQplbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCgppZihIQVZFX1NPQ0tMRU5fVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgInNvY2tsZW5fdCIpCiAgaWYoV0lOMzIpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAid2luc29jazIuaDt3czJ0Y3BpcC5oIikKICBlbHNlaWYoSEFWRV9TWVNfU09DS0VUX0gpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAic3lzL3NvY2tldC5oIikKICBlbmRpZigpCiAgY2hlY2tfdHlwZV9zaXplKCJzb2NrbGVuX3QiIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTKQogIGlmKE5PVCBIQVZFX0NVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogICAgbWVzc2FnZShGQVRBTF9FUlJPUgogICAgICJDaGVjayBmb3Igc2l6ZW9mIHNvY2tsZW5fdCBmYWlsZWQsIHNlZSBDTWFrZUZpbGVzL0NNYWtlcnJvci5sb2ciKQogIGVuZGlmKCkKZWxzZSgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludCkKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgJHtTSVpFT0ZfSU5UfSkKZW5kaWYoKQoKIyBUT0RPIHRlc3Qgd2hpY2ggb2YgdGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIHRoZSB0eXBlZGVmcyB1c2VkIGluIGN1cmxidWlsZC5oCmlmKFdJTjMyKQogIHNldChDVVJMX1BVTExfV1MyVENQSVBfSCAke0hBVkVfV1MyVENQSVBfSH0pCmVsc2UoKQogIHNldChDVVJMX1BVTExfU1lTX1RZUEVTX0ggJHtIQVZFX1NZU19UWVBFU19IfSkKICBzZXQoQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAke0hBVkVfU1lTX1NPQ0tFVF9IfSkKICBzZXQoQ1VSTF9QVUxMX1NZU19QT0xMX0ggJHtIQVZFX1NZU19QT0xMX0h9KQplbmRpZigpCnNldChDVVJMX1BVTExfU1RESU5UX0ggJHtIQVZFX1NURElOVF9IfSkKc2V0KENVUkxfUFVMTF9JTlRUWVBFU19IICR7SEFWRV9JTlRUWVBFU19IfSkKCmluY2x1ZGUoQ01ha2UvT3RoZXJUZXN0cy5jbWFrZSkKCmFkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0gpCgojIEZvciB3aW5kb3dzLCBkbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHVzZSBkZWZhdWx0IHRhcmdldCAoVmlzdGEpLgppZihXSU4zMikKICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNTAxKQplbmRpZihXSU4zMikKCmlmKE1TVkMpCiAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKZW5kaWYoTVNWQykKCiMgU2V0cyB1cCB0aGUgZGVwZW5kZW5jaWVzICh6bGliLCBPcGVuU1NMLCBldGMuKSBvZiBhIGNVUkwgc3VicHJvamVjdCBhY2NvcmRpbmcgdG8gb3B0aW9ucy4KIyBUT0RPIFRoaXMgaXMgZmFyIHRvIGJlIGNvbXBsZXRlIQpmdW5jdGlvbihTRVRVUF9DVVJMX0RFUEVOREVOQ0lFUyBUQVJHRVRfTkFNRSkKICBpZihDVVJMX1pMSUIgQU5EIFpMSUJfRk9VTkQpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7WkxJQl9JTkNMVURFX0RJUn0pCiAgICAjQUREX0RFRklOSVRJT05TKCAtREhBVkVfWkxJQl9IIC1ESEFWRV9aTElCIC1ESEFWRV9MSUJaICkKICBlbmRpZigpCgogIGlmKENNQUtFX1VTRV9PUEVOU1NMIEFORCBPUEVOU1NMX0ZPVU5EKQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogIGVuZGlmKCkKICBpZihDTUFLRV9VU0VfT1BFTlNTTCBBTkQgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSkKICAgICNBRERfREVGSU5JVElPTlMoIC1EVVNFX1NTTEVBWSApCiAgZW5kaWYoKQoKICB0YXJnZXRfbGlua19saWJyYXJpZXMoJHtUQVJHRVRfTkFNRX0gJHtDVVJMX0xJQlN9KQplbmRmdW5jdGlvbigpCgojIFVnbHkgKGJ1dCBmdW5jdGlvbmFsKSB3YXkgdG8gaW5jbHVkZSAiTWFrZWZpbGUuaW5jIiBieSB0cmFuc2Zvcm1pbmcgaXQgKD0gcmVnZW5lcmF0ZSBpdCkuCmZ1bmN0aW9uKFRSQU5TRk9STV9NQUtFRklMRV9JTkMgSU5QVVRfRklMRSBPVVRQVVRfRklMRSkKICBmaWxlKFJFQUQgJHtJTlBVVF9GSUxFfSBNQUtFRklMRV9JTkNfVEVYVCkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3Bfc3JjZGlyKSIgICAiXCR7Q1VSTF9TT1VSQ0VfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCiAgc3RyaW5nKFJFUExBQ0UgIiQodG9wX2J1aWxkZGlyKSIgIlwke0NVUkxfQklOQVJZX0RJUn0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFxcXFxuIiAipyGnIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiKFthLXpBLVpfXVthLXpBLVowLTlfXSopW1x0IF0qPVtcdCBdKihbXlxuXSopIiAiU0VUKFxcMSBcXDIpIiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAipyGnIiAiXG4iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiXFwkXFwoKFthLXpBLVpfXVthLXpBLVowLTlfXSopXFwpIiAiXCR7XFwxfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pICAgICMgUmVwbGFjZSAkKCkgd2l0aCAke30KICBzdHJpbmcoUkVHRVggUkVQTEFDRSAiQChbYS16QS1aX11bYS16QS1aMC05X10qKUAiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlIEBAIHdpdGggJHt9LCBldmVuIGlmIHRoYXQgbWF5IG5vdCBiZSByZWFkIGJ5IENNYWtlIHNjcmlwdHMuCiAgZmlsZShXUklURSAke09VVFBVVF9GSUxFfSAke01BS0VGSUxFX0lOQ19URVhUfSkKCmVuZGZ1bmN0aW9uKCkKCmFkZF9zdWJkaXJlY3RvcnkobGliKQppZihCVUlMRF9DVVJMX0VYRSkKICBhZGRfc3ViZGlyZWN0b3J5KHNyYykKZW5kaWYoKQppZihCVUlMRF9DVVJMX1RFU1RTKQogIGFkZF9zdWJkaXJlY3RvcnkodGVzdHMpCmVuZGlmKCkKCiMgVGhpcyBuZWVkcyB0byBiZSBydW4gdmVyeSBsYXN0IHNvIG90aGVyIHBhcnRzIG9mIHRoZSBzY3JpcHRzIGNhbiB0YWtlIGFkdmFudGFnZSBvZiB0aGlzLgppZihOT1QgQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSkKICBzZXQoQ1VSTF9DT05GSUdfSEFTX0JFRU5fUlVOX0JFRk9SRSAxIENBQ0hFIElOVEVSTkFMICJGbGFnIHRvIHRyYWNrIHdoZXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBydW5uaW5nIENNYWtlIG9yIGlmIENNYWtlIGhhcyBiZWVuIGNvbmZpZ3VyZWQgYmVmb3JlIikKZW5kaWYoKQoKIyBJbnN0YWxsYXRpb24uCiMgRmlyc3QsIGluc3RhbGwgZ2VuZXJhdGVkIGN1cmxidWlsZC5oCmluc3RhbGwoRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9pbmNsdWRlL2N1cmwvY3VybGJ1aWxkLmgiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlL2N1cmwgKQojIE5leHQsIGluc3RhbGwgb3RoZXIgaGVhZGVycyBleGNsdWRpbmcgY3VybGJ1aWxkLmgKaW5zdGFsbChESVJFQ1RPUlkgIiR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwiCiAgICBERVNUSU5BVElPTiBpbmNsdWRlCiAgICBGSUxFU19NQVRDSElORyBQQVRURVJOICIqLmgiCiAgICBQQVRURVJOICJjdXJsYnVpbGQuaCIgRVhDTFVERSkKCgojIFdvcmthcm91bmQgZm9yIE1TVlMxMCB0byBhdm9pZCB0aGUgRGlhbG9nIEhlbGwKIyBGSVhNRTogVGhpcyBjb3VsZCBiZSByZW1vdmVkIHdpdGggZnV0dXJlIHZlcnNpb24gb2YgQ01ha2UuCmlmKE1TVkNfVkVSU0lPTiBFUVVBTCAxNjAwKQogIHNldChDVVJMX1NMTl9GSUxFTkFNRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L0NVUkwuc2xuIikKICBpZihFWElTVFMgIiR7Q1VSTF9TTE5fRklMRU5BTUV9IikKICAgIGZpbGUoQVBQRU5EICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIgIlxuIyBUaGlzIHNob3VsZCBiZSByZWdlbmVyYXRlZCFcbiIpCiAgZW5kaWYoKQplbmRpZigpCg==