IyAtKi0gY29kaW5nOiBrb2k4LXIgLSotCgppbXBvcnQgdW5pdHRlc3QKZnJvbSB0ZXN0LnN1cHBvcnQgaW1wb3J0IFRFU1RGTiwgdW5saW5rLCB1bmxvYWQsIHJtdHJlZSwgc2NyaXB0X2hlbHBlciwgY2FwdHVyZWRfc3Rkb3V0CmltcG9ydCBpbXBvcnRsaWIKaW1wb3J0IG9zCmltcG9ydCBzeXMKaW1wb3J0IHN1YnByb2Nlc3MKaW1wb3J0IHRlbXBmaWxlCgpjbGFzcyBNaXNjU291cmNlRW5jb2RpbmdUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICBkZWYgdGVzdF9wZXAyNjMoc2VsZik6CiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIvDJ1M/OIi5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgIGInXHhkMFx4OWZceGQwXHhiOFx4ZDFceDgyXHhkMFx4YmVceGQwXHhiZCcKICAgICAgICApCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIlzwIi5lbmNvZGUoInV0Zi04IiksCiAgICAgICAgICAgIGInXFxceGQwXHg5ZicKICAgICAgICApCgogICAgZGVmIHRlc3RfY29tcGlsZXN0cmluZyhzZWxmKToKICAgICAgICAjIHNlZSAjMTg4MgogICAgICAgIGMgPSBjb21waWxlKGIiXG4jIGNvZGluZzogdXRmLThcbnUgPSAnXHhjM1x4YjMnXG4iLCAiZHVtbXkiLCAiZXhlYyIpCiAgICAgICAgZCA9IHt9CiAgICAgICAgZXhlYyhjLCBkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsndSddLCAnXHhmMycpCgogICAgZGVmIHRlc3RfaXNzdWUyMzAxKHNlbGYpOgogICAgICAgIHRyeToKICAgICAgICAgICAgY29tcGlsZShiIiMgY29kaW5nOiBjcDkzMlxucHJpbnQgJ1x4OTRceDRlJyIsICJkdW1teSIsICJleGVjIikKICAgICAgICBleGNlcHQgU3ludGF4RXJyb3IgYXMgdjoKICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnRleHQsICJwcmludCAnXHU1ZTc0J1xuIikKICAgICAgICBlbHNlOgogICAgICAgICAgICBzZWxmLmZhaWwoKQoKICAgIGRlZiB0ZXN0X2lzc3VlNDYyNihzZWxmKToKICAgICAgICBjID0gY29tcGlsZSgiIyBjb2Rpbmc9bGF0aW4tMVxuXHUwMGM2ID0gJ1x1MDBjNiciLCAiZHVtbXkiLCAiZXhlYyIpCiAgICAgICAgZCA9IHt9CiAgICAgICAgZXhlYyhjLCBkKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsnXHhjNiddLCAnXHhjNicpCgogICAgZGVmIHRlc3RfaXNzdWUzMjk3KHNlbGYpOgogICAgICAgIGMgPSBjb21waWxlKCJhLCBiID0gJ1xVMDAwMTAxMEYnLCAnXFxVMDAwMTAxMEYnIiwgImR1bW15IiwgImV4ZWMiKQogICAgICAgIGQgPSB7fQogICAgICAgIGV4ZWMoYywgZCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgZFsnYiddKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGRbJ2EnXSksIGxlbihkWydiJ10pKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNjaWkoZFsnYSddKSwgYXNjaWkoZFsnYiddKSkKCiAgICBkZWYgdGVzdF9pc3N1ZTc4MjAoc2VsZik6CiAgICAgICAgIyBFbnN1cmUgdGhhdCBjaGVja19ib20oKSByZXN0b3JlcyBhbGwgYnl0ZXMgaW4gdGhlIHJpZ2h0IG9yZGVyIGlmCiAgICAgICAgIyBjaGVja19ib20oKSBmYWlscyBpbiBweWRlYnVnIG1vZGU6IGEgYnVmZmVyIHN0YXJ0cyB3aXRoIHRoZSBmaXJzdAogICAgICAgICMgYnl0ZSBvZiBhIHZhbGlkIEJPTSwgYnV0IG5leHQgYnl0ZXMgYXJlIGRpZmZlcmVudAoKICAgICAgICAjIG9uZSBieXRlIGluIGNvbW1vbiB3aXRoIHRoZSBVVEYtMTYtTEUgQk9NCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsIGInXHhmZlx4MjAnKQoKICAgICAgICAjIHR3byBieXRlcyBpbiBjb21tb24gd2l0aCB0aGUgVVRGLTggQk9NCiAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGV2YWwsIGInXHhlZlx4YmJceDIwJykKCiAgICBkZWYgdGVzdF8yMDczMShzZWxmKToKICAgICAgICBzdWIgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShfX2ZpbGVfXyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kaW5nMjA3MzEucHknKV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCiAgICAgICAgZXJyID0gc3ViLmNvbW11bmljYXRlKClbMV0KICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN1Yi5yZXR1cm5jb2RlLCAwKQogICAgICAgIHNlbGYuYXNzZXJ0Tm90SW4oYidTeW50YXhFcnJvcicsIGVycikKCiAgICBkZWYgdGVzdF9lcnJvcl9tZXNzYWdlKHNlbGYpOgogICAgICAgIGNvbXBpbGUoYicjIC0qLSBjb2Rpbmc6IGlzby04ODU5LTE1IC0qLVxuJywgJ2R1bW15JywgJ2V4ZWMnKQogICAgICAgIGNvbXBpbGUoYidceGVmXHhiYlx4YmZcbicsICdkdW1teScsICdleGVjJykKICAgICAgICBjb21waWxlKGInXHhlZlx4YmJceGJmIyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbicsICdkdW1teScsICdleGVjJykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdmYWtlJyk6CiAgICAgICAgICAgIGNvbXBpbGUoYicjIC0qLSBjb2Rpbmc6IGZha2UgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5bnRheEVycm9yLCAnaXNvLTg4NTktMTUnKToKICAgICAgICAgICAgY29tcGlsZShiJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLAogICAgICAgICAgICAgICAgICAgICdkdW1teScsICdleGVjJykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdCT00nKToKICAgICAgICAgICAgY29tcGlsZShiJ1x4ZWZceGJiXHhiZiMgLSotIGNvZGluZzogaXNvLTg4NTktMTUgLSotXG4nLAogICAgICAgICAgICAgICAgICAgICdkdW1teScsICdleGVjJykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXgoU3ludGF4RXJyb3IsICdmYWtlJyk6CiAgICAgICAgICAgIGNvbXBpbGUoYidceGVmXHhiYlx4YmYjIC0qLSBjb2Rpbmc6IGZha2UgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCiAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KFN5bnRheEVycm9yLCAnQk9NJyk6CiAgICAgICAgICAgIGNvbXBpbGUoYidceGVmXHhiYlx4YmYjIC0qLSBjb2Rpbmc6IGZha2UgLSotXG4nLCAnZHVtbXknLCAnZXhlYycpCgogICAgZGVmIHRlc3RfYmFkX2NvZGluZyhzZWxmKToKICAgICAgICBtb2R1bGVfbmFtZSA9ICdiYWRfY29kaW5nJwogICAgICAgIHNlbGYudmVyaWZ5X2JhZF9tb2R1bGUobW9kdWxlX25hbWUpCgogICAgZGVmIHRlc3RfYmFkX2NvZGluZzIoc2VsZik6CiAgICAgICAgbW9kdWxlX25hbWUgPSAnYmFkX2NvZGluZzInCiAgICAgICAgc2VsZi52ZXJpZnlfYmFkX21vZHVsZShtb2R1bGVfbmFtZSkKCiAgICBkZWYgdmVyaWZ5X2JhZF9tb2R1bGUoc2VsZiwgbW9kdWxlX25hbWUpOgogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBfX2ltcG9ydF9fLCAndGVzdC4nICsgbW9kdWxlX25hbWUpCgogICAgICAgIHBhdGggPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCiAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4ocGF0aCwgbW9kdWxlX25hbWUgKyAnLnB5JykKICAgICAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJyYiIpIGFzIGZwOgogICAgICAgICAgICBieXRlcyA9IGZwLnJlYWQoKQogICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlLCBieXRlcywgZmlsZW5hbWUsICdleGVjJykKCiAgICBkZWYgdGVzdF9leGVjX3ZhbGlkX2NvZGluZyhzZWxmKToKICAgICAgICBkID0ge30KICAgICAgICBleGVjKGInIyBjb2Rpbmc6IGNwOTQ5XG5hID0gIlx4YWFceGE3IlxuJywgZCkKICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2EnXSwgJ1x1MzA0NycpCgogICAgZGVmIHRlc3RfZmlsZV9wYXJzZShzZWxmKToKICAgICAgICAjIGlzc3VlMTEzNDogYWxsIGVuY29kaW5ncyBvdXRzaWRlIGxhdGluLTEgYW5kIHV0Zi04IGZhaWwgb24KICAgICAgICAjIG11bHRpbGluZSBzdHJpbmdzIGFuZCBsb25nIGxpbmVzICg+NTEyIGNvbHVtbnMpCiAgICAgICAgdW5sb2FkKFRFU1RGTikKICAgICAgICBmaWxlbmFtZSA9IFRFU1RGTiArICIucHkiCiAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3IiwgZW5jb2Rpbmc9ImNwMTI1MiIpCiAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggZjoKICAgICAgICAgICAgICAgIGYud3JpdGUoIiMgLSotIGNvZGluZzogY3AxMjUyIC0qLVxuIikKICAgICAgICAgICAgICAgIGYud3JpdGUoIicnJ0Egc2hvcnQgc3RyaW5nXG4iKQogICAgICAgICAgICAgICAgZi53cml0ZSgiJycnXG4iKQogICAgICAgICAgICAgICAgZi53cml0ZSgiJ0EgdmVyeSBsb25nIHN0cmluZyAlcydcbiIgJSAoIlgiICogMTAwMCkpCgogICAgICAgICAgICBpbXBvcnRsaWIuaW52YWxpZGF0ZV9jYWNoZXMoKQogICAgICAgICAgICBfX2ltcG9ydF9fKFRFU1RGTikKICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICBkZWwgc3lzLnBhdGhbMF0KICAgICAgICAgICAgdW5saW5rKGZpbGVuYW1lKQogICAgICAgICAgICB1bmxpbmsoZmlsZW5hbWUgKyAiYyIpCiAgICAgICAgICAgIHVubGluayhmaWxlbmFtZSArICJvIikKICAgICAgICAgICAgdW5sb2FkKFRFU1RGTikKICAgICAgICAgICAgcm10cmVlKCdfX3B5Y2FjaGVfXycpCgogICAgZGVmIHRlc3RfZXJyb3JfZnJvbV9zdHJpbmcoc2VsZik6CiAgICAgICAgIyBTZWUgaHR0cDovL2J1Z3MucHl0aG9uLm9yZy9pc3N1ZTYyODkKICAgICAgICBpbnB1dCA9ICIjIGNvZGluZzogYXNjaWlcblxOe1NOT1dNQU59Ii5lbmNvZGUoJ3V0Zi04JykKICAgICAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yKSBhcyBjOgogICAgICAgICAgICBjb21waWxlKGlucHV0LCAiPHN0cmluZz4iLCAiZXhlYyIpCiAgICAgICAgZXhwZWN0ZWQgPSAiJ2FzY2lpJyBjb2RlYyBjYW4ndCBkZWNvZGUgYnl0ZSAweGUyIGluIHBvc2l0aW9uIDE2OiAiIFwKICAgICAgICAgICAgICAgICAgICJvcmRpbmFsIG5vdCBpbiByYW5nZSgxMjgpIgogICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjLmV4Y2VwdGlvbi5hcmdzWzBdLnN0YXJ0c3dpdGgoZXhwZWN0ZWQpLAogICAgICAgICAgICAgICAgICAgICAgICBtc2c9Yy5leGNlcHRpb24uYXJnc1swXSkKCgpjbGFzcyBBYnN0cmFjdFNvdXJjZUVuY29kaW5nVGVzdDoKCiAgICBkZWYgdGVzdF9kZWZhdWx0X2NvZGluZyhzZWxmKToKICAgICAgICBzcmMgPSAoYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4ZTQnIikKCiAgICBkZWYgdGVzdF9maXJzdF9jb2RpbmdfbGluZShzZWxmKToKICAgICAgICBzcmMgPSAoYicjY29kaW5nOmlzbzg4NTktMTVcbicKICAgICAgICAgICAgICAgYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4YzNcdTIwYWMnIikKCiAgICBkZWYgdGVzdF9zZWNvbmRfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgc3JjID0gKGInI1xuJwogICAgICAgICAgICAgICBiJyNjb2Rpbmc6aXNvODg1OS0xNVxuJwogICAgICAgICAgICAgICBiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhjM1x1MjBhYyciKQoKICAgIGRlZiB0ZXN0X3RoaXJkX2NvZGluZ19saW5lKHNlbGYpOgogICAgICAgICMgT25seSBmaXJzdCB0d28gbGluZXMgYXJlIHRlc3RlZCBmb3IgYSBtYWdpYyBjb21tZW50LgogICAgICAgIHNyYyA9IChiJyNcbicKICAgICAgICAgICAgICAgYicjXG4nCiAgICAgICAgICAgICAgIGInI2NvZGluZzppc284ODU5LTE1XG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGU0JyIpCgogICAgZGVmIHRlc3RfZG91YmxlX2NvZGluZ19saW5lKHNlbGYpOgogICAgICAgICMgSWYgdGhlIGZpcnN0IGxpbmUgbWF0Y2hlcyB0aGUgc2Vjb25kIGxpbmUgaXMgaWdub3JlZC4KICAgICAgICBzcmMgPSAoYicjY29kaW5nOmlzbzg4NTktMTVcbicKICAgICAgICAgICAgICAgYicjY29kaW5nOmxhdGluMVxuJwogICAgICAgICAgICAgICBiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhjM1x1MjBhYyciKQoKICAgIGRlZiB0ZXN0X2RvdWJsZV9jb2Rpbmdfc2FtZV9saW5lKHNlbGYpOgogICAgICAgIHNyYyA9IChiJyNjb2Rpbmc6aXNvODg1OS0xNSBjb2Rpbmc6bGF0aW4xXG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGMzXHUyMGFjJyIpCgogICAgZGVmIHRlc3RfZmlyc3Rfbm9uX3V0ZjhfY29kaW5nX2xpbmUoc2VsZik6CiAgICAgICAgc3JjID0gKGInI2NvZGluZzppc28tODg1OS0xNSBceGE0XG4nCiAgICAgICAgICAgICAgIGIncHJpbnQoYXNjaWkoIlx4YzNceGE0IikpXG4nKQogICAgICAgIHNlbGYuY2hlY2tfc2NyaXB0X291dHB1dChzcmMsIGJyIidceGMzXHUyMGFjJyIpCgogICAgZGVmIHRlc3Rfc2Vjb25kX25vbl91dGY4X2NvZGluZ19saW5lKHNlbGYpOgogICAgICAgIHNyYyA9IChiJ1xuJwogICAgICAgICAgICAgICBiJyNjb2Rpbmc6aXNvLTg4NTktMTUgXHhhNFxuJwogICAgICAgICAgICAgICBiJ3ByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhjM1x1MjBhYyciKQoKICAgIGRlZiB0ZXN0X3V0ZjhfYm9tKHNlbGYpOgogICAgICAgIHNyYyA9IChiJ1x4ZWZceGJiXHhiZnByaW50KGFzY2lpKCJceGMzXHhhNCIpKVxuJykKICAgICAgICBzZWxmLmNoZWNrX3NjcmlwdF9vdXRwdXQoc3JjLCBiciInXHhlNCciKQoKICAgIGRlZiB0ZXN0X3V0ZjhfYm9tX2FuZF91dGY4X2NvZGluZ19saW5lKHNlbGYpOgogICAgICAgIHNyYyA9IChiJ1x4ZWZceGJiXHhiZiNjb2Rpbmc6dXRmLThcbicKICAgICAgICAgICAgICAgYidwcmludChhc2NpaSgiXHhjM1x4YTQiKSlcbicpCiAgICAgICAgc2VsZi5jaGVja19zY3JpcHRfb3V0cHV0KHNyYywgYnIiJ1x4ZTQnIikKCgpjbGFzcyBCeXRlc1NvdXJjZUVuY29kaW5nVGVzdChBYnN0cmFjdFNvdXJjZUVuY29kaW5nVGVzdCwgdW5pdHRlc3QuVGVzdENhc2UpOgoKICAgIGRlZiBjaGVja19zY3JpcHRfb3V0cHV0KHNlbGYsIHNyYywgZXhwZWN0ZWQpOgogICAgICAgIHdpdGggY2FwdHVyZWRfc3Rkb3V0KCkgYXMgc3Rkb3V0OgogICAgICAgICAgICBleGVjKHNyYykKICAgICAgICBvdXQgPSBzdGRvdXQuZ2V0dmFsdWUoKS5lbmNvZGUoJ2xhdGluMScpCiAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvdXQucnN0cmlwKCksIGV4cGVjdGVkKQoKCmNsYXNzIEZpbGVTb3VyY2VFbmNvZGluZ1Rlc3QoQWJzdHJhY3RTb3VyY2VFbmNvZGluZ1Rlc3QsIHVuaXR0ZXN0LlRlc3RDYXNlKToKCiAgICBkZWYgY2hlY2tfc2NyaXB0X291dHB1dChzZWxmLCBzcmMsIGV4cGVjdGVkKToKICAgICAgICB3aXRoIHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpIGFzIHRtcGQ6CiAgICAgICAgICAgIGZuID0gb3MucGF0aC5qb2luKHRtcGQsICd0ZXN0LnB5JykKICAgICAgICAgICAgd2l0aCBvcGVuKGZuLCAnd2InKSBhcyBmcDoKICAgICAgICAgICAgICAgIGZwLndyaXRlKHNyYykKICAgICAgICAgICAgcmVzID0gc2NyaXB0X2hlbHBlci5hc3NlcnRfcHl0aG9uX29rKGZuKQogICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLm91dC5yc3RyaXAoKSwgZXhwZWN0ZWQpCgoKaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgIHVuaXR0ZXN0Lm1haW4oKQo=