IyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KIyAgUHJvamVjdCAgICAgICAgICAgICAgICAgICAgIF9fX3wgfCB8IHwgIF8gXHwgfAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF9ffCB8IHwgfCB8XykgfCB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXF9fX3xcX19fL3xffCBcX1xfX19fX3wKIwojIENvcHlyaWdodCAoQykgMTk5OCAtIDIwMTUsIERhbmllbCBTdGVuYmVyZywgPGRhbmllbEBoYXh4LnNlPiwgZXQgYWwuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIGFzIGRlc2NyaWJlZCBpbiB0aGUgZmlsZSBDT1BZSU5HLCB3aGljaAojIHlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhcyBwYXJ0IG9mIHRoaXMgZGlzdHJpYnV0aW9uLiBUaGUgdGVybXMKIyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgaHR0cHM6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbC4KIwojIFlvdSBtYXkgb3B0IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSBhbmQvb3Igc2VsbAojIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcwojIGZ1cm5pc2hlZCB0byBkbyBzbywgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBDT1BZSU5HIGZpbGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZCiMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyBjVVJML2xpYmN1cmwgQ01ha2Ugc2NyaXB0CiMgYnkgVGV0ZXRlc3QgYW5kIFN1a2VuZGVyIChCZW5vaXQgTmVpbCkKCiMgVE9ETzoKIyBUaGUgb3V0cHV0IC5zbyBmaWxlIGxhY2tzIHRoZSBzb25hbWUgbnVtYmVyIHdoaWNoIHdlIGN1cnJlbnRseSBoYXZlIHdpdGhpbiB0aGUgbGliL01ha2VmaWxlLmFtIGZpbGUKIyBBZGQgZnVsbCAoNCBvciA1IGxpYnMpIFNTTCBzdXBwb3J0CiMgQWRkIElOU1RBTEwgdGFyZ2V0IChFWFRSQV9ESVNUIHZhcmlhYmxlcyBpbiBNYWtlZmlsZS5hbSBtYXkgYmUgbW92ZWQgdG8gTWFrZWZpbGUuaW5jIHNvIHRoYXQgQ01ha2UvQ1BhY2sgaXMgYXdhcmUgb2Ygd2hhdCdzIHRvIGluY2x1ZGUpLgojIEFkZCBDVGVzdHMoPykKIyBDaGVjayBvbiBhbGwgcG9zc2libGUgcGxhdGZvcm1zCiMgVGVzdCB3aXRoIGFzIG1hbnkgY29uZmlndXJhdGlvbnMgcG9zc2libGUgKFdpdGggb3Igd2l0aG91dCBhbnkgb3B0aW9uKQojIENyZWF0ZSBzY3JpcHRzIHRoYXQgaGVscCBrZWVwaW5nIHRoZSBDTWFrZSBidWlsZCBzeXN0ZW0gdXAgdG8gZGF0ZSAodG8gcmVkdWNlIG1haW50ZW5hbmNlKS4gQWNjb3JkaW5nIHRvIFRldGV0ZXN0OgojICAtIGxpc3RzIG9mIGhlYWRlcnMgdGhhdCAnY29uZmlndXJlJyBjaGVja3MgZm9yOwojICAtIGN1cmwtc3BlY2lmaWMgdGVzdHMgKHRoZSBvbmVzIHRoYXQgYXJlIGluIG00L2N1cmwtKi5tNCBmaWxlcyk7CiMgIC0gKG1vc3Qgb2J2aW91cyB0aGluZzopIGN1cmwgdmVyc2lvbiBudW1iZXJzLgojIEFkZCBkb2N1bWVudGF0aW9uIHN1YnByb2plY3QKIwojIFRvIGNoZWNrOgojIChGcm9tIERhbmllbCBTdGVuYmVyZykgVGhlIGNtYWtlIGJ1aWxkIHNlbGVjdGVkIHRvIHJ1biBnY2Mgd2l0aCAtZlBJQyBvbiBteSBib3ggd2hpbGUgdGhlIHBsYWluIGNvbmZpZ3VyZSBzY3JpcHQgZGlkIG5vdC4KIyAoRnJvbSBEYW5pZWwgU3RlbmJlcmcpIFRoZSBnY2MgY29tbWFuZCBsaW5lIHVzZSBuZWl0aGVyIC1nIG5vciBhbnkgLU8gb3B0aW9ucy4gQXMgYSBkZXZlbG9wZXIsIEkgYWxzbyB0cmVhc3VyZSBvdXIgY29uZmlndXJlIHNjcmlwdHMncyAtLWVuYWJsZS1kZWJ1ZyBvcHRpb24gdGhhdCBzZXRzIGEgbG9uZyByYW5nZSBvZiAicGlja3kiIGNvbXBpbGVyIG9wdGlvbnMuCmNtYWtlX21pbmltdW1fcmVxdWlyZWQoVkVSU0lPTiAyLjggRkFUQUxfRVJST1IpCnNldChDTUFLRV9NT0RVTEVfUEFUSCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L0NNYWtlOyR7Q01BS0VfTU9EVUxFX1BBVEh9IikKaW5jbHVkZShVdGlsaXRpZXMpCmluY2x1ZGUoTWFjcm9zKQppbmNsdWRlKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKcHJvamVjdCggQ1VSTCBDICkKCm1lc3NhZ2UoV0FSTklORyAidGhlIGN1cmwgY21ha2UgYnVpbGQgc3lzdGVtIGlzIHBvb3JseSBtYWludGFpbmVkLiBCZSBhd2FyZSIpCgpmaWxlIChSRUFEICR7Q1VSTF9TT1VSQ0VfRElSfS9pbmNsdWRlL2N1cmwvY3VybHZlci5oIENVUkxfVkVSU0lPTl9IX0NPTlRFTlRTKQpzdHJpbmcgKFJFR0VYIE1BVENIICIjZGVmaW5lIExJQkNVUkxfVkVSU0lPTiBcIlteXCJdKiIKICBDVVJMX1ZFUlNJT04gJHtDVVJMX1ZFUlNJT05fSF9DT05URU5UU30pCnN0cmluZyAoUkVHRVggUkVQTEFDRSAiW15cIl0rXCIiICIiIENVUkxfVkVSU0lPTiAke0NVUkxfVkVSU0lPTn0pCnN0cmluZyAoUkVHRVggTUFUQ0ggIiNkZWZpbmUgTElCQ1VSTF9WRVJTSU9OX05VTSAweFswLTlhLWZBLUZdKyIKICBDVVJMX1ZFUlNJT05fTlVNICR7Q1VSTF9WRVJTSU9OX0hfQ09OVEVOVFN9KQpzdHJpbmcgKFJFR0VYIFJFUExBQ0UgIlteMF0rMHgiICIiIENVUkxfVkVSU0lPTl9OVU0gJHtDVVJMX1ZFUlNJT05fTlVNfSkKCmluY2x1ZGVfcmVndWxhcl9leHByZXNzaW9uKCJeLiokIikgICAgIyBTdWtlbmRlcjogSXMgaXQgbmVjZXNzYXJ5PwoKIyBTZXR1cCBwYWNrYWdlIG1ldGEtZGF0YQojIFNFVChQQUNLQUdFICJjdXJsIikKbWVzc2FnZShTVEFUVVMgImN1cmwgdmVyc2lvbj1bJHtDVVJMX1ZFUlNJT059XSIpCiMgU0VUKFBBQ0tBR0VfVEFSTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfTkFNRSAiY3VybCIpCiMgU0VUKFBBQ0tBR0VfVkVSU0lPTiAiLSIpCiMgU0VUKFBBQ0tBR0VfU1RSSU5HICJjdXJsLSIpCiMgU0VUKFBBQ0tBR0VfQlVHUkVQT1JUICJhIHN1aXRhYmxlIGN1cmwgbWFpbGluZyBsaXN0ID0+IGh0dHBzOi8vY3VybC5oYXh4LnNlL21haWwvIikKc2V0KE9QRVJBVElOR19TWVNURU0gIiR7Q01BS0VfU1lTVEVNX05BTUV9IikKc2V0KE9TICJcIiR7Q01BS0VfU1lTVEVNX05BTUV9XCIiKQoKaW5jbHVkZV9kaXJlY3Rvcmllcygke1BST0pFQ1RfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsKQppbmNsdWRlX2RpcmVjdG9yaWVzKCAke0NVUkxfU09VUkNFX0RJUn0vaW5jbHVkZSApCgpvcHRpb24oQlVJTERfQ1VSTF9FWEUgIlNldCB0byBPTiB0byBidWlsZCBjVVJMIGV4ZWN1dGFibGUuIiBPTikKb3B0aW9uKENVUkxfU1RBVElDTElCICJTZXQgdG8gT04gdG8gYnVpbGQgbGliY3VybCB3aXRoIHN0YXRpYyBsaW5raW5nLiIgT0ZGKQpvcHRpb24oRU5BQkxFX0FSRVMgIlNldCB0byBPTiB0byBlbmFibGUgYy1hcmVzIHN1cHBvcnQiIE9GRikKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIKICAgICAgICAgICAgICAgICAgICAgICAgICJTZXQgdG8gT04gdG8gZW5hYmxlIHRocmVhZGVkIEROUyBsb29rdXAiCiAgICAgICAgICAgICAgICAgICAgICAgICBPTiAiTk9UIEVOQUJMRV9BUkVTIgogICAgICAgICAgICAgICAgICAgICAgICAgT0ZGKQplbHNlKCkKICBvcHRpb24oRU5BQkxFX1RIUkVBREVEX1JFU09MVkVSICJTZXQgdG8gT04gdG8gZW5hYmxlIFBPU0lYIHRocmVhZGVkIEROUyBsb29rdXAiIE9GRikKZW5kaWYoKQpvcHRpb24oRU5BQkxFX0RFQlVHICJTZXQgdG8gT04gdG8gZW5hYmxlIGN1cmwgZGVidWcgZmVhdHVyZXMiIE9GRikKb3B0aW9uKEVOQUJMRV9DVVJMREVCVUcgIlNldCB0byBPTiB0byBidWlsZCB3aXRoIFRyYWNrTWVtb3J5IGZlYXR1cmUgZW5hYmxlZCIgT0ZGKQoKaWYgKEVOQUJMRV9ERUJVRykKICAjIERFQlVHQlVJTEQgd2lsbCBiZSBkZWZpbmVkIG9ubHkgZm9yIERlYnVnIGJ1aWxkcwogIGlmKE5PVCBDTUFLRV9WRVJTSU9OIFZFUlNJT05fTEVTUyAzLjApCiAgICBzZXRfcHJvcGVydHkoRElSRUNUT1JZIEFQUEVORCBQUk9QRVJUWSBDT01QSUxFX0RFRklOSVRJT05TICQ8JDxDT05GSUc6RGVidWc+OkRFQlVHQlVJTEQ+KQogIGVsc2UoKQogICAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OU19ERUJVRyBERUJVR0JVSUxEKQogIGVuZGlmKCkKICBzZXQoRU5BQkxFX0NVUkxERUJVRyBPTikKZW5kaWYoKQoKaWYgKEVOQUJMRV9DVVJMREVCVUcpCiAgc2V0X3Byb3BlcnR5KERJUkVDVE9SWSBBUFBFTkQgUFJPUEVSVFkgQ09NUElMRV9ERUZJTklUSU9OUyBDVVJMREVCVUcpCmVuZGlmKCkKCiMgaW5pdGlhbGl6ZSBDVVJMX0xJQlMKc2V0KENVUkxfTElCUyAiIikKCmlmKEVOQUJMRV9USFJFQURFRF9SRVNPTFZFUiBBTkQgRU5BQkxFX0FSRVMpCiAgbWVzc2FnZShGQVRBTF9FUlJPUiAiT3B0aW9ucyBFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIgYW5kIEVOQUJMRV9BUkVTIGFyZSBtdXR1YWxseSBleGNsdXNpdmUiKQplbmRpZigpCgppZihFTkFCTEVfQVJFUykKICBzZXQoVVNFX0FSRVMgMSkKICBmaW5kX3BhY2thZ2UoQ0FSRVMgUkVRVUlSRUQpCiAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7Q0FSRVNfTElCUkFSWX0gKQogIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q0FSRVNfTElCUkFSWX0pCmVuZGlmKCkKCmlmKE1TVkMpCiAgb3B0aW9uKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUyAiU2V0IE9GRiB0byBidWlsZCBlYWNoIGNvbmZpZ3VyYXRpb24gdG8gYSBzZXBhcmF0ZSBkaXJlY3RvcnkiIE9GRikKICBtYXJrX2FzX2FkdmFuY2VkKEJVSUxEX1JFTEVBU0VfREVCVUdfRElSUykKZW5kaWYoKQoKaW5jbHVkZShDdXJsU3ltYm9sSGlkaW5nKQoKb3B0aW9uKEhUVFBfT05MWSAiZGlzYWJsZXMgYWxsIHByb3RvY29scyBleGNlcHQgSFRUUCAoVGhpcyBvdmVycmlkZXMgYWxsIENVUkxfRElTQUJMRV8qIG9wdGlvbnMpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoSFRUUF9PTkxZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0ZUUCAiZGlzYWJsZXMgRlRQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKb3B0aW9uKENVUkxfRElTQUJMRV9MREFQICJkaXNhYmxlcyBMREFQIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0xEQVApCm9wdGlvbihDVVJMX0RJU0FCTEVfVEVMTkVUICJkaXNhYmxlcyBUZWxuZXQiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVEVMTkVUKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0RJQ1QgImRpc2FibGVzIERJQ1QiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfRElDVCkKb3B0aW9uKENVUkxfRElTQUJMRV9GSUxFICJkaXNhYmxlcyBGSUxFIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0ZJTEUpCm9wdGlvbihDVVJMX0RJU0FCTEVfVEZUUCAiZGlzYWJsZXMgVEZUUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9URlRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0hUVFAgImRpc2FibGVzIEhUVFAiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfSFRUUCkKCm9wdGlvbihDVVJMX0RJU0FCTEVfTERBUFMgInRvIGRpc2FibGUgTERBUFMiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfTERBUFMpCgpvcHRpb24oQ1VSTF9ESVNBQkxFX1JUU1AgInRvIGRpc2FibGUgUlRTUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9SVFNQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BST1hZICJ0byBkaXNhYmxlIHByb3h5IiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX1BST1hZKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1BPUDMgInRvIGRpc2FibGUgUE9QMyIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9QT1AzKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0lNQVAgInRvIGRpc2FibGUgSU1BUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9JTUFQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1NNVFAgInRvIGRpc2FibGUgU01UUCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9TTVRQKQpvcHRpb24oQ1VSTF9ESVNBQkxFX0dPUEhFUiAidG8gZGlzYWJsZSBHb3BoZXIiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfR09QSEVSKQoKaWYoSFRUUF9PTkxZKQogIHNldChDVVJMX0RJU0FCTEVfRlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVBTIE9OKQogIHNldChDVVJMX0RJU0FCTEVfVEVMTkVUIE9OKQogIHNldChDVVJMX0RJU0FCTEVfRElDVCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0ZJTEUgT04pCiAgc2V0KENVUkxfRElTQUJMRV9URlRQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfUlRTUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX1BPUDMgT04pCiAgc2V0KENVUkxfRElTQUJMRV9JTUFQIE9OKQogIHNldChDVVJMX0RJU0FCTEVfU01UUCBPTikKICBzZXQoQ1VSTF9ESVNBQkxFX0dPUEhFUiBPTikKZW5kaWYoKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DT09LSUVTICJ0byBkaXNhYmxlIGNvb2tpZXMgc3VwcG9ydCIgT0ZGKQptYXJrX2FzX2FkdmFuY2VkKENVUkxfRElTQUJMRV9DT09LSUVTKQoKb3B0aW9uKENVUkxfRElTQUJMRV9DUllQVE9fQVVUSCAidG8gZGlzYWJsZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIKQpvcHRpb24oQ1VSTF9ESVNBQkxFX1ZFUkJPU0VfU1RSSU5HUyAidG8gZGlzYWJsZSB2ZXJib3NlIHN0cmluZ3MiIE9GRikKbWFya19hc19hZHZhbmNlZChDVVJMX0RJU0FCTEVfVkVSQk9TRV9TVFJJTkdTKQpvcHRpb24oRElTQUJMRURfVEhSRUFEU0FGRSAiU2V0IHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB3ZSBkb24ndCB3YW50IHRvIHVzZSB0aHJlYWQtc2FmZSBmdW5jdGlvbnMiIE9GRikKbWFya19hc19hZHZhbmNlZChESVNBQkxFRF9USFJFQURTQUZFKQpvcHRpb24oRU5BQkxFX0lQVjYgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBPTikKbWFya19hc19hZHZhbmNlZChFTkFCTEVfSVBWNikKaWYoRU5BQkxFX0lQVjYgQU5EIE5PVCBXSU4zMikKICBpbmNsdWRlKENoZWNrU3RydWN0SGFzTWVtYmVyKQogIGNoZWNrX3N0cnVjdF9oYXNfbWVtYmVyKCJzdHJ1Y3Qgc29ja2FkZHJfaW42IiBzaW42X2FkZHIgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgY2hlY2tfc3RydWN0X2hhc19tZW1iZXIoInN0cnVjdCBzb2NrYWRkcl9pbjYiIHNpbjZfc2NvcGVfaWQgIm5ldGluZXQvaW4uaCIKICAgICAgICAgICAgICAgICAgICAgICAgICBIQVZFX1NPQ0tBRERSX0lONl9TSU42X1NDT1BFX0lEKQogIGlmKE5PVCBIQVZFX1NPQ0tBRERSX0lONl9TSU42X0FERFIpCiAgICBtZXNzYWdlKFdBUk5JTkcgInN0cnVjdCBzb2NrYWRkcl9pbjYgbm90IGF2YWlsYWJsZSwgZGlzYWJsaW5nIElQdjYgc3VwcG9ydCIpCiAgICAjIEZvcmNlIHRoZSBmZWF0dXJlIG9mZiBhcyB0aGlzIG5hbWUgaXMgdXNlZCBhcyBndWFyZCBtYWNyby4uLgogICAgc2V0KEVOQUJMRV9JUFY2IE9GRgogICAgICAgIENBQ0hFIEJPT0wgIkRlZmluZSBpZiB5b3Ugd2FudCB0byBlbmFibGUgSVB2NiBzdXBwb3J0IiBGT1JDRSkKICBlbmRpZigpCmVuZGlmKCkKCm9wdGlvbihFTkFCTEVfTUFOVUFMICJ0byBwcm92aWRlIHRoZSBidWlsdC1pbiBtYW51YWwiIE9OKQp1bnNldChVU0VfTUFOVUFMIENBQ0hFKSAjIFRPRE86IGNhY2hlIE5ST0ZGL05ST0ZGX01BTk9QVC9VU0VfTUFOVUFMIHZhcnM/CmlmKEVOQUJMRV9NQU5VQUwpCiAgZmluZF9wcm9ncmFtKE5ST0ZGIE5BTUVTIGducm9mZiBucm9mZikKICBpZihOUk9GRikKICAgICMgTmVlZCBhIHdheSB0byB3cml0ZSB0byBzdGRpbiwgdGhpcyB3aWxsIGRvCiAgICBmaWxlKFdSSVRFICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vbnJvZmYtaW5wdXQudHh0IiAidGVzdCIpCiAgICAjIFRlc3RzIGZvciBhIHZhbGlkIG5yb2ZmIG9wdGlvbiB0byBnZW5lcmF0ZSBhIG1hbnBhZ2UKICAgIGZvcmVhY2goX01BTk9QVCAiLW1hbiIgIi1tYW5kb2MiKQogICAgICBleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCAiJHtOUk9GRn0iICR7X01BTk9QVH0KICAgICAgICBPVVRQVVRfVkFSSUFCTEUgTlJPRkZfTUFOT1BUX09VVFBVVAogICAgICAgIElOUFVUX0ZJTEUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiCiAgICAgICAgRVJST1JfUVVJRVQpCiAgICAgICMgU2F2ZSB0aGUgb3B0aW9uIGlmIGl0IHdhcyB2YWxpZAogICAgICBpZihOUk9GRl9NQU5PUFRfT1VUUFVUKQogICAgICAgIG1lc3NhZ2UoIkZvdW5kICpucm9mZiBvcHRpb246IC0tICR7X01BTk9QVH0iKQogICAgICAgIHNldChOUk9GRl9NQU5PUFQgJHtfTUFOT1BUfSkKICAgICAgICBzZXQoVVNFX01BTlVBTCAxKQogICAgICAgIGJyZWFrKCkKICAgICAgZW5kaWYoKQogICAgZW5kZm9yZWFjaCgpCiAgICAjIE5vIG5lZWQgZm9yIHRoZSB0ZW1wb3JhcnkgZmlsZQogICAgZmlsZShSRU1PVkUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9ucm9mZi1pbnB1dC50eHQiKQogICAgaWYoTk9UIFVTRV9NQU5VQUwpCiAgICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIG9wdGlvbiB0byBnZXQgcGxhaW50ZXh0IGZyb20gbWFuIHBhZ2VzIikKICAgIGVuZGlmKCkKICBlbHNlKCkKICAgIG1lc3NhZ2UoV0FSTklORyAiRm91bmQgbm8gKm5yb2ZmIHByb2dyYW0iKQogIGVuZGlmKCkKZW5kaWYoKQoKIyBXZSBuZWVkIGFuc2kgYy1mbGFncywgZXNwZWNpYWxseSBvbiBIUApzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9BTlNJX0NGTEFHU30gJHtDTUFLRV9DX0ZMQUdTfSIpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAke0NNQUtFX0FOU0lfQ0ZMQUdTfSkKCiMgRGlzYWJsZSB3YXJuaW5ncyBvbiBCb3JsYW5kIHRvIGF2b2lkIGNoYW5naW5nIDNyZCBwYXJ0eSBjb2RlLgppZihCT1JMQU5EKQogIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC13LSIpCmVuZGlmKEJPUkxBTkQpCgojIElmIHdlIGFyZSBvbiBBSVgsIGRvIHRoZSBfQUxMX1NPVVJDRSBtYWdpYwppZigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTIEFJWCkKICBzZXQoX0FMTF9TT1VSQ0UgMSkKZW5kaWYoJHtDTUFLRV9TWVNURU1fTkFNRX0gTUFUQ0hFUyBBSVgpCgojIEluY2x1ZGUgYWxsIHRoZSBuZWNlc3NhcnkgZmlsZXMgZm9yIG1hY3JvcwppbmNsdWRlIChDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlKQppbmNsdWRlIChDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZSAoQ2hlY2tMaWJyYXJ5RXhpc3RzKQppbmNsdWRlIChDaGVja1N5bWJvbEV4aXN0cykKaW5jbHVkZSAoQ2hlY2tUeXBlU2l6ZSkKaW5jbHVkZSAoQ2hlY2tDU291cmNlQ29tcGlsZXMpCmluY2x1ZGUgKENNYWtlRGVwZW5kZW50T3B0aW9uKQoKIyBPbiB3aW5kb3dzIHByZWxvYWQgc2V0dGluZ3MKaWYoV0lOMzIpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TICIke0NNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TfSAtRF9XSU5TT0NLQVBJXyIpCiAgaW5jbHVkZSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vQ01ha2UvUGxhdGZvcm1zL1dpbmRvd3NDYWNoZS5jbWFrZSkKZW5kaWYoV0lOMzIpCgppZihFTkFCTEVfVEhSRUFERURfUkVTT0xWRVIpCiAgaWYoV0lOMzIpCiAgICBzZXQoVVNFX1RIUkVBRFNfV0lOMzIgT04pCiAgZWxzZSgpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwdGhyZWFkLmgiIEhBVkVfUFRIUkVBRF9IKQogICAgaWYoSEFWRV9QVEhSRUFEX0gpCiAgICAgIHNldChDTUFLRV9USFJFQURfUFJFRkVSX1BUSFJFQUQgMSkKICAgICAgZmluZF9wYWNrYWdlKFRocmVhZHMpCiAgICAgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQogICAgICAgIHNldChDVVJMX0xJQlMgJHtDVVJMX0xJQlN9ICR7Q01BS0VfVEhSRUFEX0xJQlNfSU5JVH0pCiAgICAgICAgc2V0KFVTRV9USFJFQURTX1BPU0lYIDEpCiAgICAgIGVuZGlmKCkKICAgIGVuZGlmKCkKICBlbmRpZigpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGFsbCBuZWVkZWQgbGlicmFyaWVzCmNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiZGwiICAgICBkbG9wZW4gICAgICAgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJzb2NrZXQiIGNvbm5lY3QgICAgICBIQVZFX0xJQlNPQ0tFVCkKY2hlY2tfbGlicmFyeV9leGlzdHMoImMiIGdldGhvc3RieW5hbWUgIiIgTk9UX05FRURfTElCTlNMKQoKIyBZZWxsb3d0YWIgWmV0YSBuZWVkcyBkaWZmZXJlbnQgbGlicmFyaWVzIHRoYW4gQmVPUyA1LgppZihCRU9TKQogIHNldChOT1RfTkVFRF9MSUJOU0wgMSkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImJpbmQiIGdldGhvc3RieW5hbWUgSEFWRV9MSUJCSU5EKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgiYm5ldGFwaSIgY2xvc2Vzb2NrZXQgSEFWRV9MSUJCTkVUQVBJKQplbmRpZihCRU9TKQoKaWYoTk9UIE5PVF9ORUVEX0xJQk5TTCkKICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoIm5zbCIgICAgZ2V0aG9zdGJ5bmFtZSAgSEFWRV9MSUJOU0wpCmVuZGlmKE5PVCBOT1RfTkVFRF9MSUJOU0wpCgpjaGVja19mdW5jdGlvbl9leGlzdHMoZ2V0aG9zdG5hbWUgSEFWRV9HRVRIT1NUTkFNRSkKCnNldChPUEVOU1NMX0RFRkFVTFQgT04pCmlmKFdJTjMyKQogIHNldChPUEVOU1NMX0RFRkFVTFQgT0ZGKQogIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid3MyXzMyIiBnZXRjaCAgICAgICAgSEFWRV9MSUJXUzJfMzIpCiAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCJ3aW5tbSIgIGdldGNoICAgICAgICBIQVZFX0xJQldJTk1NKQplbmRpZigpCgpvcHRpb24oQ01BS0VfVVNFX09QRU5TU0wgIlVzZSBPcGVuU1NMIGNvZGUuIEV4cGVyaW1lbnRhbCIgJHtPUEVOU1NMX0RFRkFVTFR9KQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9PUEVOU1NMKQoKaWYoV0lOMzIpCiAgQ01BS0VfREVQRU5ERU5UX09QVElPTihDVVJMX1dJTkRPV1NfU1NQSSAiVXNlIHdpbmRvd3MgbGlicmFyaWVzIHRvIGFsbG93IE5UTE0gYXV0aGVudGljYXRpb24gd2l0aG91dCBvcGVuc3NsIiBPTgogICAgIk5PVCBDTUFLRV9VU0VfT1BFTlNTTCIgT0ZGKQogIG1hcmtfYXNfYWR2YW5jZWQoQ1VSTF9XSU5ET1dTX1NTUEkpCmVuZGlmKCkKCnNldChVU0VfT1BFTlNTTCBPRkYpCnNldChIQVZFX0xJQkNSWVBUTyBPRkYpCnNldChIQVZFX0xJQlNTTCBPRkYpCgppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBmaW5kX3BhY2thZ2UoT3BlblNTTCkKICBpZihPUEVOU1NMX0ZPVU5EKQogICAgbGlzdChBUFBFTkQgQ1VSTF9MSUJTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgc2V0KFVTRV9PUEVOU1NMIE9OKQogICAgc2V0KEhBVkVfTElCQ1JZUFRPIE9OKQogICAgc2V0KEhBVkVfTElCU1NMIE9OKQogICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke09QRU5TU0xfSU5DTFVERV9ESVJ9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7T1BFTlNTTF9JTkNMVURFX0RJUn0pCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvY3J5cHRvLmgiIEhBVkVfT1BFTlNTTF9DUllQVE9fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9lbmdpbmUuaCIgSEFWRV9PUEVOU1NMX0VOR0lORV9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL2Vyci5oIiAgICBIQVZFX09QRU5TU0xfRVJSX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvcGVtLmgiICAgIEhBVkVfT1BFTlNTTF9QRU1fSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9wa2NzMTIuaCIgSEFWRV9PUEVOU1NMX1BLQ1MxMl9IKQogICAgY2hlY2tfaW5jbHVkZV9maWxlKCJvcGVuc3NsL3JzYS5oIiAgICBIQVZFX09QRU5TU0xfUlNBX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGUoIm9wZW5zc2wvc3NsLmgiICAgIEhBVkVfT1BFTlNTTF9TU0xfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC94NTA5LmgiICAgSEFWRV9PUEVOU1NMX1g1MDlfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZSgib3BlbnNzbC9yYW5kLmgiICAgSEFWRV9PUEVOU1NMX1JBTkRfSCkKICBlbHNlaWYoV0lOMzIpCiAgICBzZXQoQ1VSTF9XSU5ET1dTX1NTUEkgT04pCiAgZW5kaWYoKQplbmRpZigpCgppZihOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiAgaWYoV0lOMzIpCiAgICBvcHRpb24oVVNFX1dJTjMyX0xEQVAgIlVzZSBXaW5kb3dzIExEQVAgaW1wbGVtZW50YXRpb24iIE9OKQogICAgaWYoVVNFX1dJTjMyX0xEQVApCiAgICAgIGNoZWNrX2xpYnJhcnlfZXhpc3RzX2NvbmNhdCgid2xkYXAzMiIgY2xkYXBfb3BlbiBIQVZFX1dMREFQMzIpCiAgICAgIGlmKE5PVCBIQVZFX1dMREFQMzIpCiAgICAgICAgc2V0KFVTRV9XSU4zMl9MREFQIE9GRikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCiAgb3B0aW9uKENNQUtFX1VTRV9PUEVOTERBUCAiVXNlIE9wZW5MREFQIGNvZGUuIiBPRkYpCiAgbWFya19hc19hZHZhbmNlZChDTUFLRV9VU0VfT1BFTkxEQVApCiAgc2V0KENNQUtFX0xEQVBfTElCICJsZGFwIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxkYXAgbGlicmFyeSIpCiAgc2V0KENNQUtFX0xCRVJfTElCICJsYmVyIiBDQUNIRSBTVFJJTkcgIk5hbWUgb3IgZnVsbCBwYXRoIHRvIGxiZXIgbGlicmFyeSIpCgogIGlmKENNQUtFX1VTRV9PUEVOTERBUCBBTkQgVVNFX1dJTjMyX0xEQVApCiAgICBtZXNzYWdlKEZBVEFMX0VSUk9SICJDYW5ub3QgdXNlIFVTRV9XSU4zMl9MREFQIGFuZCBDTUFLRV9VU0VfT1BFTkxEQVAgYXQgdGhlIHNhbWUgdGltZSIpCiAgZW5kaWYoKQoKICAjIE5vdyB0aGF0IHdlIGtub3csIHdlJ3JlIG5vdCB1c2luZyB3aW5kb3dzIExEQVAuLi4KICBpZihVU0VfV0lOMzJfTERBUCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbmxkYXAuaCIgSEFWRV9XSU5MREFQX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3aW5iZXIuaCIgIEhBVkVfV0lOQkVSX0gpCiAgZWxzZSgpCiAgICAjIENoZWNrIGZvciBMREFQCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfTElCUkFSSUVTICR7T1BFTlNTTF9MSUJSQVJJRVN9KQogICAgY2hlY2tfbGlicmFyeV9leGlzdHNfY29uY2F0KCR7Q01BS0VfTERBUF9MSUJ9IGxkYXBfaW5pdCBIQVZFX0xJQkxEQVApCiAgICBjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoJHtDTUFLRV9MQkVSX0xJQn0gYmVyX2luaXQgSEFWRV9MSUJMQkVSKQoKICAgIHNldChDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUsgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU30pCiAgICBzZXQoQ01BS0VfTERBUF9JTkNMVURFX0RJUiAiIiBDQUNIRSBTVFJJTkcgIlBhdGggdG8gTERBUCBpbmNsdWRlIGRpcmVjdG9yeSIpCiAgICBpZihDTUFLRV9MREFQX0lOQ0xVREVfRElSKQogICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogICAgZW5kaWYoKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcC5oIiAgICAgICAgICAgSEFWRV9MREFQX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsYmVyLmgiICAgICAgICAgICBIQVZFX0xCRVJfSCkKCiAgICBpZihOT1QgSEFWRV9MREFQX0gpCiAgICAgIG1lc3NhZ2UoU1RBVFVTICJMREFQX0ggbm90IGZvdW5kIENVUkxfRElTQUJMRV9MREFQIHNldCBPTiIpCiAgICAgIHNldChDVVJMX0RJU0FCTEVfTERBUCBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9SRVFVSVJFRF9JTkNMVURFU19CQUt9KSAjTERBUCBpbmNsdWRlcyB3b24ndCBiZSB1c2VkCiAgICBlbHNlaWYoTk9UIEhBVkVfTElCTERBUCkKICAgICAgbWVzc2FnZShTVEFUVVMgIkxEQVAgbGlicmFyeSAnJHtDTUFLRV9MREFQX0xJQn0nIG5vdCBmb3VuZCBDVVJMX0RJU0FCTEVfTERBUCBzZXQgT04iKQogICAgICBzZXQoQ1VSTF9ESVNBQkxFX0xEQVAgT04gQ0FDSEUgQk9PTCAiIiBGT1JDRSkKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7Q01BS0VfUkVRVUlSRURfSU5DTFVERVNfQkFLfSkgI0xEQVAgaW5jbHVkZXMgd29uJ3QgYmUgdXNlZAogICAgZWxzZSgpCiAgICAgIGlmKENNQUtFX1VTRV9PUEVOTERBUCkKICAgICAgICBzZXQoVVNFX09QRU5MREFQIE9OKQogICAgICBlbmRpZigpCiAgICAgIGlmKENNQUtFX0xEQVBfSU5DTFVERV9ESVIpCiAgICAgICAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0xEQVBfSU5DTFVERV9ESVJ9KQogICAgICBlbmRpZigpCiAgICAgIHNldChORUVEX0xCRVJfSCBPTikKICAgICAgc2V0KF9IRUFERVJfTElTVCkKICAgICAgaWYoSEFWRV9XSU5ET1dTX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJ3aW5kb3dzLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfU1lTX1RZUEVTX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJzeXMvdHlwZXMuaCIpCiAgICAgIGVuZGlmKCkKICAgICAgbGlzdChBUFBFTkQgX0hFQURFUl9MSVNUICJsZGFwLmgiKQoKICAgICAgc2V0KF9TUkNfU1RSSU5HICIiKQogICAgICBmb3JlYWNoKF9IRUFERVIgJHtfSEVBREVSX0xJU1R9KQogICAgICAgIHNldChfSU5DTFVERV9TVFJJTkcgIiR7X0lOQ0xVREVfU1RSSU5HfSNpbmNsdWRlIDwke19IRUFERVJ9PlxuIikKICAgICAgZW5kZm9yZWFjaCgpCgogICAgICBzZXQoX1NSQ19TVFJJTkcKICAgICAgICAiCiAgICAgICAgJHtfSU5DTFVERV9TVFJJTkd9CiAgICAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiogYXJndikKICAgICAgICB7CiAgICAgICAgICBCZXJWYWx1ZSAqYnZwID0gTlVMTDsKICAgICAgICAgIEJlckVsZW1lbnQgKmJlcCA9IGJlcl9pbml0KGJ2cCk7CiAgICAgICAgICBiZXJfZnJlZShiZXAsIDEpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSIKICAgICAgKQogICAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1ETERBUF9ERVBSRUNBVEVEPTEiKQogICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MREFQX0xJQn0pCiAgICAgIGlmKEhBVkVfTElCTEJFUikKICAgICAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtDTUFLRV9MQkVSX0xJQn0pCiAgICAgIGVuZGlmKCkKICAgICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIiR7X1NSQ19TVFJJTkd9IiBOT1RfTkVFRF9MQkVSX0gpCgogICAgICBpZihOT1RfTkVFRF9MQkVSX0gpCiAgICAgICAgc2V0KE5FRURfTEJFUl9IIE9GRikKICAgICAgZWxzZSgpCiAgICAgICAgc2V0KENVUkxfVEVTVF9ERUZJTkVTICIke0NVUkxfVEVTVF9ERUZJTkVTfSAtRE5FRURfTEJFUl9IIikKICAgICAgZW5kaWYoKQogICAgZW5kaWYoKQogIGVuZGlmKCkKCmVuZGlmKCkKCiMgTm8gbGRhcCwgbm8gbGRhcHMuCmlmKENVUkxfRElTQUJMRV9MREFQKQogIGlmKE5PVCBDVVJMX0RJU0FCTEVfTERBUFMpCiAgICBtZXNzYWdlKFNUQVRVUyAiTERBUCBuZWVkcyB0byBiZSBlbmFibGVkIHRvIHN1cHBvcnQgTERBUFMiKQogICAgc2V0KENVUkxfRElTQUJMRV9MREFQUyBPTiBDQUNIRSBCT09MICIiIEZPUkNFKQogIGVuZGlmKCkKZW5kaWYoKQoKaWYoTk9UIENVUkxfRElTQUJMRV9MREFQUykKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJsZGFwX3NzbC5oIiBIQVZFX0xEQVBfU1NMX0gpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGRhcHNzbC5oIiAgSEFWRV9MREFQU1NMX0gpCmVuZGlmKCkKCiMgQ2hlY2sgZm9yIGlkbgpjaGVja19saWJyYXJ5X2V4aXN0c19jb25jYXQoImlkbiIgaWRuYV90b19hc2NpaV9seiBIQVZFX0xJQklETikKCiMgQ2hlY2sgZm9yIHN5bWJvbCBkbG9wZW4gKHNhbWUgYXMgSEFWRV9MSUJETCkKY2hlY2tfbGlicmFyeV9leGlzdHMoIiR7Q1VSTF9MSUJTfSIgZGxvcGVuICIiIEhBVkVfRExPUEVOKQoKb3B0aW9uKENVUkxfWkxJQiAiU2V0IHRvIE9OIHRvIGVuYWJsZSBidWlsZGluZyBjVVJMIHdpdGggemxpYiBzdXBwb3J0LiIgT04pCnNldChIQVZFX0xJQlogT0ZGKQpzZXQoSEFWRV9aTElCX0ggT0ZGKQpzZXQoSEFWRV9aTElCIE9GRikKaWYoQ1VSTF9aTElCKQogIGZpbmRfcGFja2FnZShaTElCIFFVSUVUKQogIGlmKFpMSUJfRk9VTkQpCiAgICBzZXQoSEFWRV9aTElCX0ggT04pCiAgICBzZXQoSEFWRV9aTElCIE9OKQogICAgc2V0KEhBVkVfTElCWiBPTikKICAgIGxpc3QoQVBQRU5EIENVUkxfTElCUyAke1pMSUJfTElCUkFSSUVTfSkKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtaTElCX0lOQ0xVREVfRElSU30pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAke1pMSUJfSU5DTFVERV9ESVJTfSkKICBlbmRpZigpCmVuZGlmKCkKCiNsaWJTU0gyCm9wdGlvbihDTUFLRV9VU0VfTElCU1NIMiAiVXNlIGxpYlNTSDIiIE9OKQptYXJrX2FzX2FkdmFuY2VkKENNQUtFX1VTRV9MSUJTU0gyKQpzZXQoVVNFX0xJQlNTSDIgT0ZGKQpzZXQoSEFWRV9MSUJTU0gyIE9GRikKc2V0KEhBVkVfTElCU1NIMl9IIE9GRikKCmlmKENNQUtFX1VTRV9MSUJTU0gyKQogIGZpbmRfcGFja2FnZShMaWJTU0gyKQogIGlmKExJQlNTSDJfRk9VTkQpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtMSUJTU0gyX0xJQlJBUll9KQogICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0xJQlNTSDJfTElCUkFSWX0pCiAgICBsaXN0KEFQUEVORCBDTUFLRV9SRVFVSVJFRF9JTkNMVURFUyAiJHtMSUJTU0gyX0lOQ0xVREVfRElSfSIpCiAgICBpbmNsdWRlX2RpcmVjdG9yaWVzKCIke0xJQlNTSDJfSU5DTFVERV9ESVJ9IikKICAgIHNldChIQVZFX0xJQlNTSDIgT04pCiAgICBzZXQoVVNFX0xJQlNTSDIgT04pCgogICAgIyBmaW5kX3BhY2thZ2UgaGFzIGFscmVhZHkgZm91bmQgdGhlIGhlYWRlcnMKICAgIHNldChIQVZFX0xJQlNTSDJfSCBPTikKICAgIHNldChDVVJMX0lOQ0xVREVTICR7Q1VSTF9JTkNMVURFU30gIiR7TElCU1NIMl9JTkNMVURFX0RJUn0vbGlic3NoMi5oIikKICAgIHNldChDVVJMX1RFU1RfREVGSU5FUyAiJHtDVVJMX1RFU1RfREVGSU5FU30gLURIQVZFX0xJQlNTSDJfSCIpCgogICAgIyBub3cgY2hlY2sgZm9yIHNwZWNpZmljIGxpYnNzaDIgc3ltYm9scyBhcyB0aGV5IHdlcmUgYWRkZWQgaW4gZGlmZmVyZW50IHZlcnNpb25zCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAibGlic3NoMi5oIikKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3ZlcnNpb24gICAgICAgICAgIEhBVkVfTElCU1NIMl9WRVJTSU9OKQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfaW5pdCAgICAgICAgICAgICAgSEFWRV9MSUJTU0gyX0lOSVQpCiAgICBjaGVja19mdW5jdGlvbl9leGlzdHMobGlic3NoMl9leGl0ICAgICAgICAgICAgICBIQVZFX0xJQlNTSDJfRVhJVCkKICAgIGNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhsaWJzc2gyX3NjcF9zZW5kNjQgICAgICAgIEhBVkVfTElCU1NIMl9TQ1BfU0VORDY0KQogICAgY2hlY2tfZnVuY3Rpb25fZXhpc3RzKGxpYnNzaDJfc2Vzc2lvbl9oYW5kc2hha2UgSEFWRV9MSUJTU0gyX1NFU1NJT05fSEFORFNIQUtFKQogICAgc2V0KENNQUtFX0VYVFJBX0lOQ0xVREVfRklMRVMgIiIpCgogIGVuZGlmKExJQlNTSDJfRk9VTkQpCmVuZGlmKENNQUtFX1VTRV9MSUJTU0gyKQoKb3B0aW9uKENNQUtFX1VTRV9HU1NBUEkgIlVzZSBHU1NBUEkgaW1wbGVtZW50YXRpb24gKHJpZ2h0IG5vdyBvbmx5IEhlaW1kYWwgaXMgc3VwcG9ydGVkIHdpdGggQ01ha2UgYnVpbGQpIiBPRkYpCm1hcmtfYXNfYWR2YW5jZWQoQ01BS0VfVVNFX0dTU0FQSSkKCmlmKENNQUtFX1VTRV9HU1NBUEkpCiAgZmluZF9wYWNrYWdlKEdTUykKCiAgc2V0KEhBVkVfR1NTQVBJICR7R1NTX0ZPVU5EfSkKICBpZihHU1NfRk9VTkQpCgogICAgbWVzc2FnZShTVEFUVVMgIkZvdW5kICR7R1NTX0ZMQVZPVVJ9IEdTU0FQSSB2ZXJzaW9uOiBcIiR7R1NTX1ZFUlNJT059XCIiKQoKICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7R1NTX0lOQ0xVREVfRElSRUNUT1JJRVN9KQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZ3NzYXBpL2dzc2FwaS5oIiAgSEFWRV9HU1NBUElfR1NTQVBJX0gpCiAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJnc3NhcGkvZ3NzYXBpX2dlbmVyaWMuaCIgSEFWRV9HU1NBUElfR1NTQVBJX0dFTkVSSUNfSCkKICAgIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImdzc2FwaS9nc3NhcGlfa3JiNS5oIiBIQVZFX0dTU0FQSV9HU1NBUElfS1JCNV9IKQoKICAgIGlmKEdTU19GTEFWT1VSIFNUUkVRVUFMICJIZWltZGFsIikKICAgICAgc2V0KEhBVkVfR1NTSEVJTURBTCBPTikKICAgIGVsc2UoKSAjIE1JVAogICAgICBzZXQoSEFWRV9HU1NNSVQgT04pCiAgICAgIHNldChfSU5DTFVERV9MSVNUICIiKQogICAgICBpZihIQVZFX0dTU0FQSV9HU1NBUElfSCkKICAgICAgICBsaXN0KEFQUEVORCBfSU5DTFVERV9MSVNUICJnc3NhcGkvZ3NzYXBpLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9HRU5FUklDX0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9nZW5lcmljLmgiKQogICAgICBlbmRpZigpCiAgICAgIGlmKEhBVkVfR1NTQVBJX0dTU0FQSV9LUkI1X0gpCiAgICAgICAgbGlzdChBUFBFTkQgX0lOQ0xVREVfTElTVCAiZ3NzYXBpL2dzc2FwaV9rcmI1LmgiKQogICAgICBlbmRpZigpCgogICAgICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIF9DT01QSUxFUl9GTEFHU19TVFIgIiR7R1NTX0NPTVBJTEVSX0ZMQUdTfSIpCiAgICAgIHN0cmluZyhSRVBMQUNFICI7IiAiICIgX0xJTktFUl9GTEFHU19TVFIgIiR7R1NTX0xJTktFUl9GTEFHU30iKQoKICAgICAgZm9yZWFjaChfZGlyICR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgICAgIHNldChfTElOS0VSX0ZMQUdTX1NUUiAiJHtfTElOS0VSX0ZMQUdTX1NUUn0gLUxcIiR7X2Rpcn1cIiIpCiAgICAgIGVuZGZvcmVhY2goKQoKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0ZMQUdTICIke19DT01QSUxFUl9GTEFHU19TVFJ9ICR7X0xJTktFUl9GTEFHU19TVFJ9IikKICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke0dTU19MSUJSQVJJRVN9KQogICAgICBjaGVja19zeW1ib2xfZXhpc3RzKCJHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSIgJHtfSU5DTFVERV9MSVNUfSBIQVZFX0dTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFKQogICAgICBpZihOT1QgSEFWRV9HU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSkKICAgICAgICBzZXQoSEFWRV9PTERfR1NTTUlUIE9OKQogICAgICBlbmRpZigpCgogICAgZW5kaWYoKQoKICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtHU1NfSU5DTFVERV9ESVJFQ1RPUklFU30pCiAgICBsaW5rX2RpcmVjdG9yaWVzKCR7R1NTX0xJTktfRElSRUNUT1JJRVN9KQogICAgc2V0KENNQUtFX0NfRkxBR1MgIiR7Q01BS0VfQ19GTEFHU30gJHtHU1NfQ09NUElMRVJfRkxBR1N9IikKICAgIHNldChDTUFLRV9TSEFSRURfTElOS0VSX0ZMQUdTICIke0NNQUtFX1NIQVJFRF9MSU5LRVJfRkxBR1N9ICR7R1NTX0xJTktFUl9GTEFHU30iKQogICAgc2V0KENNQUtFX0VYRV9MSU5LRVJfRkxBR1MgIiR7Q01BS0VfRVhFX0xJTktFUl9GTEFHU30gJHtHU1NfTElOS0VSX0ZMQUdTfSIpCiAgICBsaXN0KEFQUEVORCBDVVJMX0xJQlMgJHtHU1NfTElCUkFSSUVTfSkKCiAgZWxzZSgpCiAgICBtZXNzYWdlKFdBUk5JTkcgIkdTU0FQSSBzdXBwb3J0IGhhcyBiZWVuIHJlcXVlc3RlZCBidXQgbm8gc3VwcG9ydGluZyBsaWJyYXJpZXMgZm91bmQuIFNraXBwaW5nLiIpCiAgZW5kaWYoKQplbmRpZigpCgpvcHRpb24oRU5BQkxFX1VOSVhfU09DS0VUUyAiRGVmaW5lIGlmIHlvdSB3YW50IFVuaXggZG9tYWluIHNvY2tldHMgc3VwcG9ydCIgT04pCmlmKEVOQUJMRV9VTklYX1NPQ0tFVFMpCiAgaW5jbHVkZShDaGVja1N0cnVjdEhhc01lbWJlcikKICBjaGVja19zdHJ1Y3RfaGFzX21lbWJlcigic3RydWN0IHNvY2thZGRyX3VuIiBzdW5fcGF0aCAic3lzL3VuLmgiIFVTRV9VTklYX1NPQ0tFVFMpCmVsc2UoKQogIHVuc2V0KFVTRV9VTklYX1NPQ0tFVFMgQ0FDSEUpCmVuZGlmKCkKCgojIENoZWNrIGZvciBoZWFkZXIgZmlsZXMKaWYoTk9UIFVOSVgpCiAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgid2luZG93cy5oIiAgICAgIEhBVkVfV0lORE9XU19IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2suaCIgICAgICBIQVZFX1dJTlNPQ0tfSCkKICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ3czJ0Y3BpcC5oIiAgICAgSEFWRV9XUzJUQ1BJUF9IKQogIGNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoIndpbnNvY2syLmgiICAgICBIQVZFX1dJTlNPQ0syX0gpCiAgaWYoQ1VSTF9XSU5ET1dTX1NTUEkpCiAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgIiR7Q01BS0VfUkVRVUlSRURfREVGSU5JVElPTlN9IC1EU0VDVVJJVFlfV0lOMzIiKQogICAgY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NwaS5oIiAgICAgICBIQVZFX1NTUElfSCkKICAgIGlmKEhBVkVfU1NQSV9IKQogICAgICBjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzY2hhbm5lbC5oIiBIQVZFX1NDSEFOTkVMX0gpCiAgICAgIHNldChVU0VfV0lORE9XU19TU1BJIE9OKQogICAgICBpZihIQVZFX1NDSEFOTkVMX0gpCiAgICAgICAgc2V0KFVTRV9TQ0hBTk5FTCBPTikKICAgICAgICBzZXQoU1NMX0VOQUJMRUQgT04pCiAgICAgICAgc2V0KENVUkxfTElCUyAke0NVUkxfTElCU30gImNyeXB0MzIiKQogICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgZW5kaWYoKQplbmRpZihOT1QgVU5JWCkKCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaW50dHlwZXMuaCIgICAgICAgSEFWRV9JTlRUWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvZmlsaW8uaCIgICAgICBIQVZFX1NZU19GSUxJT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvaW9jdGwuaCIgICAgICBIQVZFX1NZU19JT0NUTF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcGFyYW0uaCIgICAgICBIQVZFX1NZU19QQVJBTV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvcG9sbC5oIiAgICAgICBIQVZFX1NZU19QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9yZXNvdXJjZS5oIiAgIEhBVkVfU1lTX1JFU09VUkNFX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zZWxlY3QuaCIgICAgIEhBVkVfU1lTX1NFTEVDVF9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvc29ja2V0LmgiICAgICBIQVZFX1NZU19TT0NLRVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3NvY2tpby5oIiAgICAgSEFWRV9TWVNfU09DS0lPX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN5cy9zdGF0LmgiICAgICAgIEhBVkVfU1lTX1NUQVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3RpbWUuaCIgICAgICAgSEFWRV9TWVNfVElNRV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdHlwZXMuaCIgICAgICBIQVZFX1NZU19UWVBFU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzeXMvdWlvLmgiICAgICAgICBIQVZFX1NZU19VSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3VuLmgiICAgICAgICAgSEFWRV9TWVNfVU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0aW1lLmgiICAgICAgSEFWRV9TWVNfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYWxsb2NhLmgiICAgICAgICAgSEFWRV9BTExPQ0FfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS9pbmV0LmgiICAgICAgSEFWRV9BUlBBX0lORVRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXJwYS90ZnRwLmgiICAgICAgSEFWRV9BUlBBX1RGVFBfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiYXNzZXJ0LmgiICAgICAgICAgSEFWRV9BU1NFUlRfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiY3J5cHRvLmgiICAgICAgICAgSEFWRV9DUllQVE9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGVzLmgiICAgICAgICAgICAgSEFWRV9ERVNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJyLmgiICAgICAgICAgICAgSEFWRV9FUlJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZXJybm8uaCIgICAgICAgICAgSEFWRV9FUlJOT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJmY250bC5oIiAgICAgICAgICBIQVZFX0ZDTlRMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbi1mcmVlLmgiICAgICAgIEhBVkVfSUROX0ZSRUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiaWZhZGRycy5oIiAgICAgICAgSEFWRV9JRkFERFJTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlvLmgiICAgICAgICAgICAgIEhBVkVfSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgia3JiLmgiICAgICAgICAgICAgSEFWRV9LUkJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGliZ2VuLmgiICAgICAgICAgSEFWRV9MSUJHRU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibGltaXRzLmgiICAgICAgICAgSEFWRV9MSU1JVFNfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibG9jYWxlLmgiICAgICAgICAgSEFWRV9MT0NBTEVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0L2lmLmgiICAgICAgICAgSEFWRV9ORVRfSUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0ZGIuaCIgICAgICAgICAgSEFWRV9ORVREQl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2luLmgiICAgICBIQVZFX05FVElORVRfSU5fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgibmV0aW5ldC90Y3AuaCIgICAgSEFWRV9ORVRJTkVUX1RDUF9IKQoKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicGVtLmgiICAgICAgICAgICAgSEFWRV9QRU1fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgicG9sbC5oIiAgICAgICAgICAgSEFWRV9QT0xMX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInB3ZC5oIiAgICAgICAgICAgIEhBVkVfUFdEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInJzYS5oIiAgICAgICAgICAgIEhBVkVfUlNBX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNldGptcC5oIiAgICAgICAgIEhBVkVfU0VUSk1QX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNndHR5LmgiICAgICAgICAgIEhBVkVfU0dUVFlfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic2lnbmFsLmgiICAgICAgICAgSEFWRV9TSUdOQUxfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3NsLmgiICAgICAgICAgICAgSEFWRV9TU0xfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkYm9vbC5oIiAgICAgICAgSEFWRV9TVERCT09MX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGludC5oIiAgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0ZGlvLmgiICAgICAgICAgIEhBVkVfU1RESU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkbGliLmgiICAgICAgICAgSEFWRV9TVERMSUJfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5nLmgiICAgICAgICAgSEFWRV9TVFJJTkdfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RyaW5ncy5oIiAgICAgICAgSEFWRV9TVFJJTkdTX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInN0cm9wdHMuaCIgICAgICAgIEhBVkVfU1RST1BUU19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW8uaCIgICAgICAgICBIQVZFX1RFUk1JT19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJ0ZXJtaW9zLmgiICAgICAgICBIQVZFX1RFUk1JT1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgidGltZS5oIiAgICAgICAgICAgSEFWRV9USU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInRsZC5oIiAgICAgICAgICAgIEhBVkVfVExEX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInVuaXN0ZC5oIiAgICAgICAgIEhBVkVfVU5JU1REX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInV0aW1lLmgiICAgICAgICAgIEhBVkVfVVRJTUVfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgieDUwOS5oIiAgICAgICAgICAgSEFWRV9YNTA5X0gpCgpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJwcm9jZXNzLmgiICAgICAgICBIQVZFX1BST0NFU1NfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3RkZGVmLmgiICAgICAgICAgSEFWRV9TVERERUZfSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgiZGxmY24uaCIgICAgICAgICAgSEFWRV9ETEZDTl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtYWxsb2MuaCIgICAgICAgICBIQVZFX01BTExPQ19IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJtZW1vcnkuaCIgICAgICAgICBIQVZFX01FTU9SWV9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJuZXRpbmV0L2lmX2V0aGVyLmgiIEhBVkVfTkVUSU5FVF9JRl9FVEhFUl9IKQpjaGVja19pbmNsdWRlX2ZpbGVfY29uY2F0KCJzdGRpbnQuaCIgICAgICAgIEhBVkVfU1RESU5UX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoInNvY2tpby5oIiAgICAgICAgSEFWRV9TT0NLSU9fSCkKY2hlY2tfaW5jbHVkZV9maWxlX2NvbmNhdCgic3lzL3V0c25hbWUuaCIgICBIQVZFX1NZU19VVFNOQU1FX0gpCmNoZWNrX2luY2x1ZGVfZmlsZV9jb25jYXQoImlkbmEuaCIgICAgICAgICAgSEFWRV9JRE5BX0gpCgoKCmNoZWNrX3R5cGVfc2l6ZShzaXplX3QgIFNJWkVPRl9TSVpFX1QpCmNoZWNrX3R5cGVfc2l6ZShzc2l6ZV90ICBTSVpFT0ZfU1NJWkVfVCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGxvbmciICBTSVpFT0ZfTE9OR19MT05HKQpjaGVja190eXBlX3NpemUoImxvbmciICBTSVpFT0ZfTE9ORykKY2hlY2tfdHlwZV9zaXplKCJzaG9ydCIgIFNJWkVPRl9TSE9SVCkKY2hlY2tfdHlwZV9zaXplKCJpbnQiICBTSVpFT0ZfSU5UKQpjaGVja190eXBlX3NpemUoIl9faW50NjQiICBTSVpFT0ZfX19JTlQ2NCkKY2hlY2tfdHlwZV9zaXplKCJsb25nIGRvdWJsZSIgIFNJWkVPRl9MT05HX0RPVUJMRSkKY2hlY2tfdHlwZV9zaXplKCJ0aW1lX3QiICBTSVpFT0ZfVElNRV9UKQppZihOT1QgSEFWRV9TSVpFT0ZfU1NJWkVfVCkKICBpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgbG9uZykKICBlbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCBTSVpFT0ZfU0laRV9UKQogIGlmKE5PVCBzc2l6ZV90IEFORCBTSVpFT0ZfX19JTlQ2NCBFUVVBTCBTSVpFT0ZfU0laRV9UKQogICAgc2V0KHNzaXplX3QgX19pbnQ2NCkKICBlbmRpZihOT1Qgc3NpemVfdCBBTkQgU0laRU9GX19fSU5UNjQgRVFVQUwgU0laRU9GX1NJWkVfVCkKZW5kaWYoTk9UIEhBVkVfU0laRU9GX1NTSVpFX1QpCiMgb2ZmX3QgaXMgc2l6ZWQgbGF0ZXIsIGFmdGVyIHRoZSBIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMgdGVzdAoKIyBEaWZmZXJlbnQgc2l6ZW9mcywgZXRjLgoKIyAgICBkZWZpbmUgQ1VSTF9TSVpFT0ZfTE9ORyAgICAgICAgNAojICAgIGRlZmluZSBDVVJMX1RZUEVPRl9DVVJMX09GRl9UICBsb25nIGxvbmcKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVCAgImxsZCIKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfQ1VSTF9PRkZfVFUgImxsdSIKIyAgICBkZWZpbmUgQ1VSTF9GT1JNQVRfT0ZGX1QgICAgICAgIiVsbGQiCiMgICAgZGVmaW5lIENVUkxfU0laRU9GX0NVUkxfT0ZGX1QgIDgKIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVCAgTEwKIyAgICBkZWZpbmUgQ1VSTF9TVUZGSVhfQ1VSTF9PRkZfVFUgVUxMCgpzZXQoQ1VSTF9TSVpFT0ZfTE9ORyAke1NJWkVPRl9MT05HfSkKCmlmKFNJWkVPRl9MT05HIEVRVUFMIDgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgbG9uZykKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCA4KQogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMKQplbmRpZihTSVpFT0ZfTE9ORyBFUVVBTCA4KQoKaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQogIHNldChDVVJMX1RZUEVPRl9DVVJMX09GRl9UICJsb25nIGxvbmciKQogIHNldChDVVJMX1NJWkVPRl9DVVJMX09GRl9UIDgpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1QgImxsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsbHUiKQogIHNldChDVVJMX0ZPUk1BVF9PRkZfVCAiJWxsZCIpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1QgTEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIFVMTCkKZW5kaWYoU0laRU9GX0xPTkdfTE9ORyBFUVVBTCA4KQoKaWYoTk9UIENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfT0ZGX1QgJHtzc2l6ZV90fSkKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCAke1NJWkVPRl9TU0laRV9UfSkKICAjIFRPRE86IG5lZWQgYWRqdXN0bWVudCBoZXJlLgogIHNldChDVVJMX0ZPUk1BVF9DVVJMX09GRl9UICJsZCIpCiAgc2V0KENVUkxfRk9STUFUX0NVUkxfT0ZGX1RVICJsdSIpCiAgc2V0KENVUkxfRk9STUFUX09GRl9UICIlbGQiKQogIHNldChDVVJMX1NVRkZJWF9DVVJMX09GRl9UIEwpCiAgc2V0KENVUkxfU1VGRklYX0NVUkxfT0ZGX1RVIExVKQplbmRpZihOT1QgQ1VSTF9UWVBFT0ZfQ1VSTF9PRkZfVCkKCmlmKEhBVkVfU0laRU9GX0xPTkdfTE9ORykKICBzZXQoSEFWRV9MT05HTE9ORyAxKQogIHNldChIQVZFX0xMIDEpCmVuZGlmKEhBVkVfU0laRU9GX0xPTkdfTE9ORykKCmZpbmRfZmlsZShSQU5ET01fRklMRSB1cmFuZG9tIC9kZXYpCm1hcmtfYXNfYWR2YW5jZWQoUkFORE9NX0ZJTEUpCgojIENoZWNrIGZvciBzb21lIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkCmlmKEhBVkVfTElCV1MyXzMyKQogIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgd3MyXzMyKQplbHNlaWYoSEFWRV9MSUJTT0NLRVQpCiAgc2V0KENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyBzb2NrZXQpCmVuZGlmKCkKCmNoZWNrX3N5bWJvbF9leGlzdHMoYmFzZW5hbWUgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9CQVNFTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzb2NrZXQgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NPQ0tFVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhwb2xsICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BPTEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2VsZWN0ICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRUxFQ1QpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyZHVwICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJEVVApCmNoZWNrX3N5bWJvbF9leGlzdHMoc3Ryc3RyICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJTVFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RydG9rX3IgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJUT0tfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJmdGltZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkZUSU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHVuYW1lICAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RyY2FzZWNtcCAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJDQVNFQ01QKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmljbXAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSSUNNUCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzdHJjbXBpICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkNNUEkpCmNoZWNrX3N5bWJvbF9leGlzdHMoc3RybmNtcGkgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TVFJOQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhhbGFybSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0FMQVJNKQppZihOT1QgSEFWRV9TVFJOQ01QSSkKICBzZXQoSEFWRV9TVFJDTVBJKQplbmRpZihOT1QgSEFWRV9TVFJOQ01QSSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRob3N0YnlhZGRyICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWUFERFIpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5YWRkcl9yICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWUFERFJfUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXR0aW1lb2ZkYXkgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFRJTUVPRkRBWSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X2FkZHIgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfQUREUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X250b2EgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfTlRPQSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpbmV0X250b2FfciAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0lORVRfTlRPQV9SKQpjaGVja19zeW1ib2xfZXhpc3RzKHRjc2V0YXR0ciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVENTRVRBVFRSKQpjaGVja19zeW1ib2xfZXhpc3RzKHRjZ2V0YXR0ciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfVENHRVRBVFRSKQpjaGVja19zeW1ib2xfZXhpc3RzKHBlcnJvciAgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUEVSUk9SKQpjaGVja19zeW1ib2xfZXhpc3RzKGNsb3Nlc29ja2V0ICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfQ0xPU0VTT0NLRVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0dmJ1ZiAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRWQlVGKQpjaGVja19zeW1ib2xfZXhpc3RzKHNpZ3NldGptcCAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHU0VUSk1QKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldHBhc3NfciAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VUUEFTU19SKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmxjYXQgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU1RSTENBVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwd3VpZCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVFBXVUlEKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGV1aWQgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR0VURVVJRCkKY2hlY2tfc3ltYm9sX2V4aXN0cyh1dGltZSAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VUSU1FKQppZihDTUFLRV9VU0VfT1BFTlNTTCkKICBjaGVja19zeW1ib2xfZXhpc3RzKFJBTkRfc3RhdHVzICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfUkFORF9TVEFUVVMpCiAgY2hlY2tfc3ltYm9sX2V4aXN0cyhSQU5EX3NjcmVlbiAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1JBTkRfU0NSRUVOKQogIGNoZWNrX3N5bWJvbF9leGlzdHMoUkFORF9lZ2QgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9SQU5EX0VHRCkKICBjaGVja19zeW1ib2xfZXhpc3RzKENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhICIke0NVUkxfSU5DTFVERVN9IgogICAgSEFWRV9DUllQVE9fQ0xFQU5VUF9BTExfRVhfREFUQSkKICBpZihIQVZFX0xJQkNSWVBUTyBBTkQgSEFWRV9MSUJTU0wpCiAgICBzZXQoVVNFX09QRU5TU0wgMSkKICBlbmRpZihIQVZFX0xJQkNSWVBUTyBBTkQgSEFWRV9MSUJTU0wpCmVuZGlmKENNQUtFX1VTRV9PUEVOU1NMKQpjaGVja19zeW1ib2xfZXhpc3RzKGdtdGltZV9yICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfR01USU1FX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMobG9jYWx0aW1lX3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9MT0NBTFRJTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZSAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoZ2V0aG9zdGJ5bmFtZV9yICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEhPU1RCWU5BTUVfUikKCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnbmFsICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TSUdOQUxfRlVOQykKY2hlY2tfc3ltYm9sX2V4aXN0cyhTSUdBTFJNICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NJR05BTF9NQUNSTykKaWYoSEFWRV9TSUdOQUxfRlVOQyBBTkQgSEFWRV9TSUdOQUxfTUFDUk8pCiAgc2V0KEhBVkVfU0lHTkFMIDEpCmVuZGlmKEhBVkVfU0lHTkFMX0ZVTkMgQU5EIEhBVkVfU0lHTkFMX01BQ1JPKQpjaGVja19zeW1ib2xfZXhpc3RzKHVuYW1lICAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1VOQU1FKQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cnRvbGwgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUlRPTEwpCmNoZWNrX3N5bWJvbF9leGlzdHMoX3N0cnRvaTY0ICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfX1NUUlRPSTY0KQpjaGVja19zeW1ib2xfZXhpc3RzKHN0cmVycm9yX3IgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NUUkVSUk9SX1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2lnaW50ZXJydXB0ICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0lHSU5URVJSVVBUKQpjaGVja19zeW1ib2xfZXhpc3RzKHBlcnJvciAgICAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1BFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyhmb3JrICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GT1JLKQpjaGVja19zeW1ib2xfZXhpc3RzKGdldGFkZHJpbmZvICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0dFVEFERFJJTkZPKQpjaGVja19zeW1ib2xfZXhpc3RzKGZyZWVhZGRyaW5mbyAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZSRUVBRERSSU5GTykKY2hlY2tfc3ltYm9sX2V4aXN0cyhmcmVlaWZhZGRycyAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GUkVFSUZBRERSUykKY2hlY2tfc3ltYm9sX2V4aXN0cyhwaXBlICAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9QSVBFKQpjaGVja19zeW1ib2xfZXhpc3RzKGZ0cnVuY2F0ZSAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX0ZUUlVOQ0FURSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRwcm90b2J5bmFtZSAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRQUk9UT0JZTkFNRSkKY2hlY2tfc3ltYm9sX2V4aXN0cyhnZXRybGltaXQgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9HRVRSTElNSVQpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuX2ZyZWUgICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROX0ZSRUUpCmNoZWNrX3N5bWJvbF9leGlzdHMoaWRuYV9zdHJlcnJvciAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfSUROQV9TVFJFUlJPUikKY2hlY2tfc3ltYm9sX2V4aXN0cyh0bGRfc3RyZXJyb3IgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9UTERfU1RSRVJST1IpCmNoZWNrX3N5bWJvbF9leGlzdHMoc2V0bG9jYWxlICAgICAgIiR7Q1VSTF9JTkNMVURFU30iIEhBVkVfU0VUTE9DQUxFKQpjaGVja19zeW1ib2xfZXhpc3RzKHNldHJsaW1pdCAgICAgICIke0NVUkxfSU5DTFVERVN9IiBIQVZFX1NFVFJMSU1JVCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhmY250bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9GQ05UTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhpb2N0bCAgICAgICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9JT0NUTCkKY2hlY2tfc3ltYm9sX2V4aXN0cyhzZXRzb2Nrb3B0ICAgICAiJHtDVVJMX0lOQ0xVREVTfSIgSEFWRV9TRVRTT0NLT1BUKQoKIyBzeW1ib2wgZXhpc3RzIGluIHdpbjMyLCBidXQgZnVuY3Rpb24gZG9lcyBub3QuCmNoZWNrX2Z1bmN0aW9uX2V4aXN0cyhpbmV0X3B0b24gSEFWRV9JTkVUX1BUT04pCgojIHNpZ2FjdGlvbiBhbmQgc2lnc2V0am1wIGFyZSBzcGVjaWFsLiBVc2Ugc3BlY2lhbCBtZWNoYW5pc20gZm9yCiMgZGV0ZWN0aW5nIHRob3NlLCBidXQgb25seSBpZiBwcmV2aW91cyBhdHRlbXB0IGZhaWxlZC4KaWYoSEFWRV9TSUdOQUxfSCkKICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ2FjdGlvbiAic2lnbmFsLmgiIEhBVkVfU0lHQUNUSU9OKQplbmRpZihIQVZFX1NJR05BTF9IKQoKaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQogIGlmKEhBVkVfU0VUSk1QX0gpCiAgICBjaGVja19zeW1ib2xfZXhpc3RzKHNpZ3NldGptcCAic2V0am1wLmgiIEhBVkVfTUFDUk9fU0lHU0VUSk1QKQogICAgaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgICAgIHNldChIQVZFX1NJR1NFVEpNUCAxKQogICAgZW5kaWYoSEFWRV9NQUNST19TSUdTRVRKTVApCiAgZW5kaWYoSEFWRV9TRVRKTVBfSCkKZW5kaWYoTk9UIEhBVkVfU0lHU0VUSk1QKQoKIyBJZiB0aGVyZSBpcyBubyBzdHJpY21wKCksIGRvIG5vdCBhbGxvdyBMREFQIHRvIHBhcnNlIFVSTHMKaWYoTk9UIEhBVkVfU1RSSUNNUCkKICBzZXQoSEFWRV9MREFQX1VSTF9QQVJTRSAxKQplbmRpZihOT1QgSEFWRV9TVFJJQ01QKQoKIyBEbyBjdXJsIHNwZWNpZmljIHRlc3RzCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0ZDTlRMX09fTk9OQkxPQ0sKICAgIEhBVkVfSU9DVExTT0NLRVQKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUwKICAgIEhBVkVfSU9DVExTT0NLRVRfQ0FNRUxfRklPTkJJTwogICAgSEFWRV9JT0NUTFNPQ0tFVF9GSU9OQklPCiAgICBIQVZFX0lPQ1RMX0ZJT05CSU8KICAgIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIKICAgIEhBVkVfU0VUU09DS09QVF9TT19OT05CTE9DSwogICAgSEFWRV9TT0NLQUREUl9JTjZfU0lONl9TQ09QRV9JRAogICAgVElNRV9XSVRIX1NZU19USU1FCiAgICBIQVZFX09fTk9OQkxPQ0sKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzUKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzcKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzVfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzMKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzUKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYKICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzNfUkVFTlRSQU5UCiAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81X1JFRU5UUkFOVAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNl9SRUVOVFJBTlQKICAgIEhBVkVfU09DS0xFTl9UCiAgICBIQVZFX0lOX0FERFJfVAogICAgSEFWRV9CT09MX1QKICAgIFNURENfSEVBREVSUwogICAgUkVUU0lHVFlQRV9URVNUCiAgICBIQVZFX0lORVRfTlRPQV9SX0RFQ0wKICAgIEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQKICAgIEhBVkVfR0VUQUREUklORk8KICAgIEhBVkVfRklMRV9PRkZTRVRfQklUUwogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdCgke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKaWYoSEFWRV9GSUxFX09GRlNFVF9CSVRTKQogIHNldChfRklMRV9PRkZTRVRfQklUUyA2NCkKICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgIi1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQiKQplbmRpZihIQVZFX0ZJTEVfT0ZGU0VUX0JJVFMpCmNoZWNrX3R5cGVfc2l6ZSgib2ZmX3QiICBTSVpFT0ZfT0ZGX1QpCnNldChDTUFLRV9SRVFVSVJFRF9GTEFHUykKCmZvcmVhY2goQ1VSTF9URVNUCiAgICBIQVZFX0dMSUJDX1NUUkVSUk9SX1IKICAgIEhBVkVfUE9TSVhfU1RSRVJST1JfUgogICAgKQogIGN1cmxfaW50ZXJuYWxfdGVzdF9ydW4oJHtDVVJMX1RFU1R9KQplbmRmb3JlYWNoKENVUkxfVEVTVCkKCiMgQ2hlY2sgZm9yIHJlZW50cmFudApmb3JlYWNoKENVUkxfVEVTVAogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNwogICAgSEFWRV9HRVRIT1NUQllBRERSX1JfOAogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNQogICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfNgogICAgSEFWRV9JTkVUX05UT0FfUl9ERUNMX1JFRU5UUkFOVCkKICBpZihOT1QgJHtDVVJMX1RFU1R9KQogICAgaWYoJHtDVVJMX1RFU1R9X1JFRU5UUkFOVCkKICAgICAgc2V0KE5FRURfUkVFTlRSQU5UIDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGlmKE5PVCAke0NVUkxfVEVTVH0pCmVuZGZvcmVhY2goQ1VSTF9URVNUKQoKaWYoTkVFRF9SRUVOVFJBTlQpCiAgZm9yZWFjaChDVVJMX1RFU1QKICAgICAgSEFWRV9HRVRIT1NUQllBRERSX1JfNQogICAgICBIQVZFX0dFVEhPU1RCWUFERFJfUl83CiAgICAgIEhBVkVfR0VUSE9TVEJZQUREUl9SXzgKICAgICAgSEFWRV9HRVRIT1NUQllOQU1FX1JfMwogICAgICBIQVZFX0dFVEhPU1RCWU5BTUVfUl81CiAgICAgIEhBVkVfR0VUSE9TVEJZTkFNRV9SXzYpCiAgICBzZXQoJHtDVVJMX1RFU1R9IDApCiAgICBpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogICAgICBzZXQoJHtDVVJMX1RFU1R9IDEpCiAgICBlbmRpZigke0NVUkxfVEVTVH1fUkVFTlRSQU5UKQogIGVuZGZvcmVhY2goQ1VSTF9URVNUKQplbmRpZihORUVEX1JFRU5UUkFOVCkKCmlmKEhBVkVfSU5FVF9OVE9BX1JfREVDTF9SRUVOVFJBTlQpCiAgc2V0KEhBVkVfSU5FVF9OVE9BX1JfREVDTCAxKQogIHNldChORUVEX1JFRU5UUkFOVCAxKQplbmRpZihIQVZFX0lORVRfTlRPQV9SX0RFQ0xfUkVFTlRSQU5UKQoKIyBTb21lIG90aGVyIG1pbm9yIHRlc3RzCgppZihOT1QgSEFWRV9JTl9BRERSX1QpCiAgc2V0KGluX2FkZHJfdCAidW5zaWduZWQgbG9uZyIpCmVuZGlmKE5PVCBIQVZFX0lOX0FERFJfVCkKCiMgRml4IGxpYnogLyB6bGliLmgKCmlmKE5PVCBDVVJMX1NQRUNJQUxfTElCWikKICBpZihOT1QgSEFWRV9MSUJaKQogICAgc2V0KEhBVkVfWkxJQl9IIDApCiAgZW5kaWYoTk9UIEhBVkVfTElCWikKCiAgaWYoTk9UIEhBVkVfWkxJQl9IKQogICAgc2V0KEhBVkVfTElCWiAwKQogIGVuZGlmKE5PVCBIQVZFX1pMSUJfSCkKZW5kaWYoTk9UIENVUkxfU1BFQ0lBTF9MSUJaKQoKIyBDaGVjayBmb3Igbm9uYmxvY2tpbmcKc2V0KEhBVkVfRElTQUJMRURfTk9OQkxPQ0tJTkcgMSkKaWYoSEFWRV9GSU9OQklPIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUIE9SCiAgICBIQVZFX0lPQ1RMU09DS0VUX0NBU0UgT1IKICAgIEhBVkVfT19OT05CTE9DSykKICBzZXQoSEFWRV9ESVNBQkxFRF9OT05CTE9DS0lORykKZW5kaWYoSEFWRV9GSU9OQklPIE9SCiAgSEFWRV9JT0NUTFNPQ0tFVCBPUgogIEhBVkVfSU9DVExTT0NLRVRfQ0FTRSBPUgogIEhBVkVfT19OT05CTE9DSykKCmlmKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSB2b2lkKQplbHNlKFJFVFNJR1RZUEVfVEVTVCkKICBzZXQoUkVUU0lHVFlQRSBpbnQpCmVuZGlmKFJFVFNJR1RZUEVfVEVTVCkKCmlmKENNQUtFX0NPTVBJTEVSX0lTX0dOVUNDIEFORCBBUFBMRSkKICBpbmNsdWRlKENoZWNrQ0NvbXBpbGVyRmxhZykKICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVduby1sb25nLWRvdWJsZSBIQVZFX0NfRkxBR19Xbm9fbG9uZ19kb3VibGUpCiAgaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQogICAgIyBUaGUgTWFjIHZlcnNpb24gb2YgR0NDIHdhcm5zIGFib3V0IHVzZSBvZiBsb25nIGRvdWJsZS4gIERpc2FibGUgaXQuCiAgICBnZXRfc291cmNlX2ZpbGVfcHJvcGVydHkoTVBSSU5URl9DT01QSUxFX0ZMQUdTIG1wcmludGYuYyBDT01QSUxFX0ZMQUdTKQogICAgaWYoTVBSSU5URl9DT01QSUxFX0ZMQUdTKQogICAgICBzZXQoTVBSSU5URl9DT01QSUxFX0ZMQUdTICIke01QUklOVEZfQ09NUElMRV9GTEFHU30gLVduby1sb25nLWRvdWJsZSIpCiAgICBlbHNlKE1QUklOVEZfQ09NUElMRV9GTEFHUykKICAgICAgc2V0KE1QUklOVEZfQ09NUElMRV9GTEFHUyAiLVduby1sb25nLWRvdWJsZSIpCiAgICBlbmRpZihNUFJJTlRGX0NPTVBJTEVfRkxBR1MpCiAgICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMobXByaW50Zi5jIFBST1BFUlRJRVMKICAgICAgQ09NUElMRV9GTEFHUyAke01QUklOVEZfQ09NUElMRV9GTEFHU30pCiAgZW5kaWYoSEFWRV9DX0ZMQUdfV25vX2xvbmdfZG91YmxlKQplbmRpZihDTUFLRV9DT01QSUxFUl9JU19HTlVDQyBBTkQgQVBQTEUpCgppZihIQVZFX1NPQ0tMRU5fVCkKICBzZXQoQ1VSTF9UWVBFT0ZfQ1VSTF9TT0NLTEVOX1QgInNvY2tsZW5fdCIpCiAgaWYoV0lOMzIpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAid2luc29jazIuaDt3czJ0Y3BpcC5oIikKICBlbHNlaWYoSEFWRV9TWVNfU09DS0VUX0gpCiAgICBzZXQoQ01BS0VfRVhUUkFfSU5DTFVERV9GSUxFUyAic3lzL3NvY2tldC5oIikKICBlbmRpZigpCiAgY2hlY2tfdHlwZV9zaXplKCJzb2NrbGVuX3QiIENVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogIHNldChDTUFLRV9FWFRSQV9JTkNMVURFX0ZJTEVTKQogIGlmKE5PVCBIQVZFX0NVUkxfU0laRU9GX0NVUkxfU09DS0xFTl9UKQogICAgbWVzc2FnZShGQVRBTF9FUlJPUgogICAgICJDaGVjayBmb3Igc2l6ZW9mIHNvY2tsZW5fdCBmYWlsZWQsIHNlZSBDTWFrZUZpbGVzL0NNYWtlcnJvci5sb2ciKQogIGVuZGlmKCkKZWxzZSgpCiAgc2V0KENVUkxfVFlQRU9GX0NVUkxfU09DS0xFTl9UIGludCkKICBzZXQoQ1VSTF9TSVpFT0ZfQ1VSTF9TT0NLTEVOX1QgJHtTSVpFT0ZfSU5UfSkKZW5kaWYoKQoKIyBUT0RPIHRlc3Qgd2hpY2ggb2YgdGhlc2UgaGVhZGVycyBhcmUgcmVxdWlyZWQgZm9yIHRoZSB0eXBlZGVmcyB1c2VkIGluIGN1cmxidWlsZC5oCmlmKFdJTjMyKQogIHNldChDVVJMX1BVTExfV1MyVENQSVBfSCAke0hBVkVfV1MyVENQSVBfSH0pCmVsc2UoKQogIHNldChDVVJMX1BVTExfU1lTX1RZUEVTX0ggJHtIQVZFX1NZU19UWVBFU19IfSkKICBzZXQoQ1VSTF9QVUxMX1NZU19TT0NLRVRfSCAke0hBVkVfU1lTX1NPQ0tFVF9IfSkKICBzZXQoQ1VSTF9QVUxMX1NZU19QT0xMX0ggJHtIQVZFX1NZU19QT0xMX0h9KQplbmRpZigpCnNldChDVVJMX1BVTExfU1RESU5UX0ggJHtIQVZFX1NURElOVF9IfSkKc2V0KENVUkxfUFVMTF9JTlRUWVBFU19IICR7SEFWRV9JTlRUWVBFU19IfSkKCmluY2x1ZGUoQ01ha2UvT3RoZXJUZXN0cy5jbWFrZSkKCmFkZF9kZWZpbml0aW9ucygtREhBVkVfQ09ORklHX0gpCgojIEZvciB3aW5kb3dzLCBkbyBub3QgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHVzZSBkZWZhdWx0IHRhcmdldCAoVmlzdGEpLgppZihXSU4zMikKICBhZGRfZGVmaW5pdGlvbnMoLURfV0lOMzJfV0lOTlQ9MHgwNTAxKQplbmRpZihXSU4zMikKCiMgRm9yIHdpbmRvd3MsIGFsbCBjb21waWxlcnMgdXNlZCBieSBjbWFrZSBzaG91bGQgc3VwcG9ydCBsYXJnZSBmaWxlcwppZihXSU4zMikKICBzZXQoVVNFX1dJTjMyX0xBUkdFX0ZJTEVTIE9OKQplbmRpZihXSU4zMikKCmlmKE1TVkMpCiAgYWRkX2RlZmluaXRpb25zKC1EX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIC1EX0NSVF9OT05TVERDX05PX0RFUFJFQ0FURSkKZW5kaWYoTVNWQykKCiMgVWdseSAoYnV0IGZ1bmN0aW9uYWwpIHdheSB0byBpbmNsdWRlICJNYWtlZmlsZS5pbmMiIGJ5IHRyYW5zZm9ybWluZyBpdCAoPSByZWdlbmVyYXRlIGl0KS4KZnVuY3Rpb24oVFJBTlNGT1JNX01BS0VGSUxFX0lOQyBJTlBVVF9GSUxFIE9VVFBVVF9GSUxFKQogIGZpbGUoUkVBRCAke0lOUFVUX0ZJTEV9IE1BS0VGSUxFX0lOQ19URVhUKQogIHN0cmluZyhSRVBMQUNFICIkKHRvcF9zcmNkaXIpIiAgICJcJHtDVVJMX1NPVVJDRV9ESVJ9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkKICBzdHJpbmcoUkVQTEFDRSAiJCh0b3BfYnVpbGRkaXIpIiAiXCR7Q1VSTF9CSU5BUllfRElSfSIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXFxcXG4iICKnIaciIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICIoW2EtekEtWl9dW2EtekEtWjAtOV9dKilbXHQgXSo9W1x0IF0qKFteXG5dKikiICJTRVQoXFwxIFxcMikiIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KQogIHN0cmluZyhSRVBMQUNFICKnIaciICJcbiIgTUFLRUZJTEVfSU5DX1RFWFQgJHtNQUtFRklMRV9JTkNfVEVYVH0pCgogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJcXCRcXCgoW2EtekEtWl9dW2EtekEtWjAtOV9dKilcXCkiICJcJHtcXDF9IiBNQUtFRklMRV9JTkNfVEVYVCAke01BS0VGSUxFX0lOQ19URVhUfSkgICAgIyBSZXBsYWNlICQoKSB3aXRoICR7fQogIHN0cmluZyhSRUdFWCBSRVBMQUNFICJAKFthLXpBLVpfXVthLXpBLVowLTlfXSopQCIgIlwke1xcMX0iIE1BS0VGSUxFX0lOQ19URVhUICR7TUFLRUZJTEVfSU5DX1RFWFR9KSAgICAjIFJlcGxhY2UgQEAgd2l0aCAke30sIGV2ZW4gaWYgdGhhdCBtYXkgbm90IGJlIHJlYWQgYnkgQ01ha2Ugc2NyaXB0cy4KICBmaWxlKFdSSVRFICR7T1VUUFVUX0ZJTEV9ICR7TUFLRUZJTEVfSU5DX1RFWFR9KQoKZW5kZnVuY3Rpb24oKQoKYWRkX3N1YmRpcmVjdG9yeShsaWIpCmlmKEJVSUxEX0NVUkxfRVhFKQogIGFkZF9zdWJkaXJlY3Rvcnkoc3JjKQplbmRpZigpCgppbmNsdWRlKENUZXN0KQppZihCVUlMRF9URVNUSU5HKQogIGFkZF9zdWJkaXJlY3RvcnkodGVzdHMpCmVuZGlmKCkKCiMgVE9ETyBzdXBwb3J0IEdOVVRMUywgTlNTLCBQT0xBUlNTTCwgQVhUTFMsIENZQVNTTCwgV0lOU1NMLCBEQVJXSU5TU0wKaWYoVVNFX09QRU5TU0wpCiAgc2V0KFNTTF9FTkFCTEVEIDEpCmVuZGlmKCkKCiMgSGVscGVyIHRvIHBvcHVsYXRlIGEgbGlzdCAoX2l0ZW1zKSB3aXRoIGEgbGFiZWwgd2hlbiBjb25kaXRpb25zICh0aGUgcmVtYWluaW5nCiMgYXJncykgYXJlIHNhdGlzZmllZApmdW5jdGlvbihfYWRkX2lmIGxhYmVsKQogICMgVE9ETyBuZWVkIHRvIGRpc2FibGUgcG9saWN5IENNUDAwNTQgKENNYWtlIDMuMSkgdG8gYWxsb3cgdGhpcyBpbmRpcmVjdGlvbgogIGlmKCR7QVJHTn0pCiAgICBzZXQoX2l0ZW1zICR7X2l0ZW1zfSAiJHtsYWJlbH0iIFBBUkVOVF9TQ09QRSkKICBlbmRpZigpCmVuZGZ1bmN0aW9uKCkKCiMgQ2xlYXIgbGlzdCBhbmQgdHJ5IHRvIGRldGVjdCBhdmFpbGFibGUgZmVhdHVyZXMKc2V0KF9pdGVtcykKX2FkZF9pZigiV2luU1NMIiAgICAgICAgU1NMX0VOQUJMRUQgQU5EIFVTRV9XSU5ET1dTX1NTUEkpCl9hZGRfaWYoIk9wZW5TU0wiICAgICAgIFNTTF9FTkFCTEVEIEFORCBVU0VfT1BFTlNTTCkKX2FkZF9pZigiSVB2NiIgICAgICAgICAgRU5BQkxFX0lQVjYpCl9hZGRfaWYoInVuaXgtc29ja2V0cyIgIFVTRV9VTklYX1NPQ0tFVFMpCl9hZGRfaWYoImxpYnoiICAgICAgICAgIEhBVkVfTElCWikKX2FkZF9pZigiQXN5bmNoRE5TIiAgICAgVVNFX0FSRVMgT1IgVVNFX1RIUkVBRFNfUE9TSVggT1IgVVNFX1RIUkVBRFNfV0lOMzIpCl9hZGRfaWYoIklETiIgICAgICAgICAgIEhBVkVfTElCSUROKQpfYWRkX2lmKCJMYXJnZWZpbGUiICAgICAoQ1VSTF9TSVpFT0ZfQ1VSTF9PRkZfVCBHUkVBVEVSIDQpIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFNJWkVPRl9PRkZfVCBHUkVBVEVSIDQpIE9SIFVTRV9XSU4zMl9MQVJHRV9GSUxFUykpCiMgVE9ETyBTU1AxIChXaW5TU0wpIGNoZWNrIGlzIG1pc3NpbmcKX2FkZF9pZigiU1NQSSIgICAgICAgICAgVVNFX1dJTkRPV1NfU1NQSSkKX2FkZF9pZigiR1NTLUFQSSIgICAgICAgSEFWRV9HU1NBUEkpCiMgVE9ETyBTU1AxIG1pc3NpbmcgZm9yIFNQTkVHTwpfYWRkX2lmKCJTUE5FR08iICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0NSWVBUT19BVVRIIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoSEFWRV9HU1NBUEkgT1IgVVNFX1dJTkRPV1NfU1NQSSkpCl9hZGRfaWYoIktlcmJlcm9zIiAgICAgIE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5ECiAgICAgICAgICAgICAgICAgICAgICAgIChIQVZFX0dTU0FQSSBPUiBVU0VfV0lORE9XU19TU1BJKSkKIyBOVExNIHN1cHBvcnQgcmVxdWlyZXMgY3J5cHRvIGZ1bmN0aW9uIGFkYXB0aW9ucyBmcm9tIHZhcmlvdXMgU1NMIGxpYnMKIyBUT0RPIGFsdGVybmF0aXZlIFNTTCBsaWJzIHRlc3RzIGZvciBTU1AxLCBHTlVUTFMsIE5TUywgREFSV0lOU1NMCmlmKE5PVCBDVVJMX0RJU0FCTEVfQ1JZUFRPX0FVVEggQU5EIChVU0VfT1BFTlNTTCBPUgogICBVU0VfV0lORE9XU19TU1BJIE9SIEdOVVRMU19FTkFCTEVEIE9SIE5TU19FTkFCTEVEIE9SIERBUldJTlNTTF9FTkFCTEVEKSkKICBfYWRkX2lmKCJOVExNIiAgICAgICAgMSkKICAjIFRPRE8gbWlzc2luZyBvcHRpb24gKGF1dG9jb25mOiAtLWVuYWJsZS1udGxtLXdiKQogIF9hZGRfaWYoIk5UTE1fV0IiICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIE5UTE1fV0JfRU5BQkxFRCkKZW5kaWYoKQojIFRPRE8gbWlzc2luZyBvcHRpb24gKC0tZW5hYmxlLXRscy1zcnApLCBkZXBlbmRzIG9uIEdOVVRMU19TUlAvT1BFTlNTTF9TUlAKX2FkZF9pZigiVExTLVNSUCIgICAgICAgVVNFX1RMU19TUlApCiMgVE9ETyBvcHRpb24gLS13aXRoLW5naHR0cDIgdGVzdHMgZm9yIG5naHR0cDIgbGliIGFuZCBuZ2h0dHAyL25naHR0cDIuaCBoZWFkZXIKX2FkZF9pZigiSFRUUDIiICAgICAgICAgVVNFX05HSFRUUDIpCnN0cmluZyhSRVBMQUNFICI7IiAiICIgU1VQUE9SVF9GRUFUVVJFUyAiJHtfaXRlbXN9IikKbWVzc2FnZShTVEFUVVMgIkVuYWJsZWQgZmVhdHVyZXM6ICR7U1VQUE9SVF9GRUFUVVJFU30iKQoKIyBDbGVhciBsaXN0IGFuZCB0cnkgdG8gZGV0ZWN0IGF2YWlsYWJsZSBwcm90b2NvbHMKc2V0KF9pdGVtcykKX2FkZF9pZigiSFRUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9IVFRQKQpfYWRkX2lmKCJIVFRQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0hUVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGVFAiICAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZUUCkKX2FkZF9pZigiRlRQUyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9GVFAgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJGSUxFIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0ZJTEUpCl9hZGRfaWYoIlRFTE5FVCIgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfVEVMTkVUKQpfYWRkX2lmKCJMREFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVApCiMgQ1VSTF9ESVNBQkxFX0xEQVAgaW1wbGllcyBDVVJMX0RJU0FCTEVfTERBUFMKIyBUT0RPIGNoZWNrIEhBVkVfTERBUF9TU0wgKGluIGF1dG9jb25mIHRoaXMgaXMgZW5hYmxlZCB3aXRoIC0tZW5hYmxlLWxkYXBzKQpfYWRkX2lmKCJMREFQUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0xEQVBTIEFORAogICAgICAgICAgICAgICAgICAgICAgICAoKFVTRV9PUEVOTERBUCBBTkQgU1NMX0VOQUJMRUQpIE9SCiAgICAgICAgICAgICAgICAgICAgICAgIChOT1QgVVNFX09QRU5MREFQIEFORCBIQVZFX0xEQVBfU1NMKSkpCl9hZGRfaWYoIkRJQ1QiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfRElDVCkKX2FkZF9pZigiVEZUUCIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9URlRQKQpfYWRkX2lmKCJHT1BIRVIiICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0dPUEhFUikKX2FkZF9pZigiUE9QMyIgICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9QT1AzKQpfYWRkX2lmKCJQT1AzUyIgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1BPUDMgQU5EIFNTTF9FTkFCTEVEKQpfYWRkX2lmKCJJTUFQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX0lNQVApCl9hZGRfaWYoIklNQVBTIiAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfSU1BUCBBTkQgU1NMX0VOQUJMRUQpCl9hZGRfaWYoIlNNVFAiICAgICAgICAgIE5PVCBDVVJMX0RJU0FCTEVfU01UUCkKX2FkZF9pZigiU01UUFMiICAgICAgICAgTk9UIENVUkxfRElTQUJMRV9TTVRQIEFORCBTU0xfRU5BQkxFRCkKX2FkZF9pZigiU0NQIiAgICAgICAgICAgVVNFX0xJQlNTSDIpCl9hZGRfaWYoIlNGVFAiICAgICAgICAgIFVTRV9MSUJTU0gyKQpfYWRkX2lmKCJSVFNQIiAgICAgICAgICBOT1QgQ1VSTF9ESVNBQkxFX1JUU1ApCl9hZGRfaWYoIlJUTVAiICAgICAgICAgIFVTRV9MSUJSVE1QKQpsaXN0KFNPUlQgX2l0ZW1zKQpzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIFNVUFBPUlRfUFJPVE9DT0xTICIke19pdGVtc30iKQptZXNzYWdlKFNUQVRVUyAiRW5hYmxlZCBwcm90b2NvbHM6ICR7U1VQUE9SVF9QUk9UT0NPTFN9IikKCiMgY3VybC1jb25maWcgbmVlZHMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGJlIHNldC4Kc2V0KENDICAgICAgICAgICAgICAgICAgICAgICIke0NNQUtFX0NfQ09NUElMRVJ9IikKIyBUT0RPIHByb2JhYmx5IHB1dCBhIC1ELi4uIG9wdGlvbnMgaGVyZT8Kc2V0KENPTkZJR1VSRV9PUFRJT05TICAgICAgICIiKQojIFRPRE8gd2hlbiB0byBzZXQgIi1EQ1VSTF9TVEFUSUNMSUIiIGZvciBDUFBGTEFHX0NVUkxfU1RBVElDTElCPwpzZXQoQ1BQRkxBR19DVVJMX1NUQVRJQ0xJQiAgIiIpCiMgVE9ETyBuZWVkIHRvIHNldCB0aGlzIChzZWUgQ1VSTF9DSEVDS19DQV9CVU5ETEUgaW4gYWNpbmNsdWRlLm00KQpzZXQoQ1VSTF9DQV9CVU5ETEUgICAgICAgICAgIiIpCnNldChDVVJMVkVSU0lPTiAgICAgICAgICAgICAiJHtDVVJMX1ZFUlNJT059IikKc2V0KEVOQUJMRV9TSEFSRUQgICAgICAgICAgICJ5ZXMiKQppZihDVVJMX1NUQVRJQ0xJQikKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJ5ZXMiKQplbHNlKCkKICBzZXQoRU5BQkxFX1NUQVRJQyAgICAgICAgICJubyIpCmVuZGlmKCkKc2V0KGV4ZWNfcHJlZml4ICAgICAgICAgICAgICJcJHtwcmVmaXh9IikKc2V0KGluY2x1ZGVkaXIgICAgICAgICAgICAgICJcJHtwcmVmaXh9L2luY2x1ZGUiKQpzZXQoTERGTEFHUyAgICAgICAgICAgICAgICAgIiR7Q01BS0VfU0hBUkVEX0xJTktFUl9GTEFHU30iKQpzZXQoTElCQ1VSTF9MSUJTICAgICAgICAgICAgIiIpCnNldChsaWJkaXIgICAgICAgICAgICAgICAgICAiJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliIikKZm9yZWFjaChfbGliICR7Q01BS0VfQ19JTVBMSUNJVF9MSU5LX0xJQlJBUklFU30gJHtDVVJMX0xJQlN9KQogIGlmKF9saWIgTUFUQ0hFUyAiLiovLioiKQogICAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9ICR7X2xpYn0iKQogIGVsc2UoKQogICAgc2V0KExJQkNVUkxfTElCUyAgICAgICAgICAiJHtMSUJDVVJMX0xJQlN9IC1sJHtfbGlifSIpCiAgZW5kaWYoKQplbmRmb3JlYWNoKCkKIyAiYSIgKExpbnV4KSBvciAibGliIiAoV2luZG93cykKc3RyaW5nKFJFUExBQ0UgIi4iICIiIGxpYmV4dCAiJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9IikKc2V0KHByZWZpeCAgICAgICAgICAgICAgICAgICIke0NNQUtFX0lOU1RBTExfUFJFRklYfSIpCiMgU2V0IHRoaXMgdG8gInllcyIgdG8gYXBwZW5kIGFsbCBsaWJyYXJpZXMgb24gd2hpY2ggLWxjdXJsIGlzIGRlcGVuZGVudApzZXQoUkVRVUlSRV9MSUJfREVQUyAgICAgICAgIm5vIikKIyBTVVBQT1JUX0ZFQVRVUkVTCiMgU1VQUE9SVF9QUk9UT0NPTFMKc2V0KFZFUlNJT05OVU0gICAgICAgICAgICAgICIke0NVUkxfVkVSU0lPTl9OVU19IikKCiMgRmluYWxseSBnZW5lcmF0ZSBhICJjdXJsLWNvbmZpZyIgbWF0Y2hpbmcgdGhpcyBjb25maWcKY29uZmlndXJlX2ZpbGUoIiR7Q1VSTF9TT1VSQ0VfRElSfS9jdXJsLWNvbmZpZy5pbiIKICAgICAgICAgICAgICAgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9jdXJsLWNvbmZpZyIKICAgICAgICBERVNUSU5BVElPTiBiaW4KICAgICAgICBQRVJNSVNTSU9OUwogICAgICAgICAgT1dORVJfUkVBRCBPV05FUl9XUklURSBPV05FUl9FWEVDVVRFCiAgICAgICAgICBHUk9VUF9SRUFEIEdST1VQX0VYRUNVVEUKICAgICAgICAgIFdPUkxEX1JFQUQgV09STERfRVhFQ1VURSkKCiMgRmluYWxseSBnZW5lcmF0ZSBhIHBrZy1jb25maWcgZmlsZSBtYXRjaGluZyB0aGlzIGNvbmZpZwpjb25maWd1cmVfZmlsZSgiJHtDVVJMX1NPVVJDRV9ESVJ9L2xpYmN1cmwucGMuaW4iCiAgICAgICAgICAgICAgICIke0NVUkxfQklOQVJZX0RJUn0vbGliY3VybC5wYyIgQE9OTFkpCmluc3RhbGwoRklMRVMgIiR7Q1VSTF9CSU5BUllfRElSfS9saWJjdXJsLnBjIgogICAgICAgIERFU1RJTkFUSU9OIGxpYi9wa2djb25maWcpCgojIFRoaXMgbmVlZHMgdG8gYmUgcnVuIHZlcnkgbGFzdCBzbyBvdGhlciBwYXJ0cyBvZiB0aGUgc2NyaXB0cyBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KaWYoTk9UIENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUpCiAgc2V0KENVUkxfQ09ORklHX0hBU19CRUVOX1JVTl9CRUZPUkUgMSBDQUNIRSBJTlRFUk5BTCAiRmxhZyB0byB0cmFjayB3aGV0aGVyIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgcnVubmluZyBDTWFrZSBvciBpZiBDTWFrZSBoYXMgYmVlbiBjb25maWd1cmVkIGJlZm9yZSIpCmVuZGlmKCkKCiMgSW5zdGFsbGF0aW9uLgojIEZpcnN0LCBpbnN0YWxsIGdlbmVyYXRlZCBjdXJsYnVpbGQuaAppbnN0YWxsKEZJTEVTICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vaW5jbHVkZS9jdXJsL2N1cmxidWlsZC5oIgogICAgREVTVElOQVRJT04gaW5jbHVkZS9jdXJsICkKIyBOZXh0LCBpbnN0YWxsIG90aGVyIGhlYWRlcnMgZXhjbHVkaW5nIGN1cmxidWlsZC5oCmluc3RhbGwoRElSRUNUT1JZICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW5jbHVkZS9jdXJsIgogICAgREVTVElOQVRJT04gaW5jbHVkZQogICAgRklMRVNfTUFUQ0hJTkcgUEFUVEVSTiAiKi5oIgogICAgUEFUVEVSTiAiY3VybGJ1aWxkLmgiIEVYQ0xVREUpCgoKIyBXb3JrYXJvdW5kIGZvciBNU1ZTMTAgdG8gYXZvaWQgdGhlIERpYWxvZyBIZWxsCiMgRklYTUU6IFRoaXMgY291bGQgYmUgcmVtb3ZlZCB3aXRoIGZ1dHVyZSB2ZXJzaW9uIG9mIENNYWtlLgppZihNU1ZDX1ZFUlNJT04gRVFVQUwgMTYwMCkKICBzZXQoQ1VSTF9TTE5fRklMRU5BTUUgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9DVVJMLnNsbiIpCiAgaWYoRVhJU1RTICIke0NVUkxfU0xOX0ZJTEVOQU1FfSIpCiAgICBmaWxlKEFQUEVORCAiJHtDVVJMX1NMTl9GSUxFTkFNRX0iICJcbiMgVGhpcyBzaG91bGQgYmUgcmVnZW5lcmF0ZWQhXG4iKQogIGVuZGlmKCkKZW5kaWYoKQo=