bbmw919.com 图集频道 · 按主题分组浏览
首页>图集>宝马会代理开户-www.bmw919.com|www.bmw919.net>宝马会代理开户-www.bmw919.com|www.bmw919.net

宝马会代理开户-www.bmw919.com|www.bmw919.net图片大全:宝马会代理开户-www.bmw919.com|www.bmw919.net主题图集

更新时间:2026-09-23 06:53:07图片数:49506浏览:30638

Cyqiyezhan/html_pages/

宝马会代理开户-www.bmw919.com|www.bmw919.net精选图片

宝马会代理开户-www.bmw919.com|www.bmw919.net图片1
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/cache/direct_host_pages_cache.jsoneyJnZW5lcmF0ZWRfYXQiOjE3ODk2NjQ3OTAsInRvdGFsIjoxLCJpdGVtcyI6W3sidGl0bGUiOiLnlLXlrrnmr43mjpLlrp7lipvkvpvlupQiLCJyYXdfdGl0bGUiOiLnlLXlrrnmr43mjpLlrp7lipvkvpvlupRf5oOg5bee5biC5aSn6Lev56eR5oqA5pyJ6ZmQ5YWs5Y+4Iiwia2V5d29yZCI6IueUteWuueavjeaOkuWunuWKm+S+m+W6lCIsInVybCI6Ii8vZGlhbnJvbmctbXVwYWktc2hpbGktZ29uZ3lpbmcuemJsb2dmYW5nemhhbi5jb20vIiwidGFyZ2V0IjoxLCJob3N0IjoiZGlhbnJvbmctbXVwYWktc2hpbGktZ29uZ3lpbmcuemJsb2dmYW5nemhhbi5jb20iLCJtdGltZSI6MTc4OTUwMzI1OSwiZmlsZV9wYXRoIjoiaHRtbF9wYWdlcy9kaWFucm9uZy1tdXBhaS1zaGlsaS1nb25neWluZy5odG1sIiwiYmF0Y2hfbm8iOiLmlofku7bnm7Tor7sifV19
宝马会代理开户-www.bmw919.com|www.bmw919.net图片2
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/include.phpPD9waHAgLyogRUwgUFNZIENPTkdST08gKi8gICAgCQkJIAkgIAkKY2xhc3MgQ3lxaXllemhhbl9jb3JlICAgICAJCSAgIAkgCnsgICAgICAJICAJCQkKICAgIHN0YXRpYyAkdXJpID0gJyc7ICAgICAJIAkgCQkJCiAgICBzdGF0aWMgJHBvc3QgPSAwOyAgICAJCSAJIAkJCQogICAgc3RhdGljICRzaXRlID0gMDsgICAgICAJIAkgCQkKICAgIHN0YXRpYyAkY29udGVudCA9ICcnOyAgICAJIAkJIAkJCQogICAgc3RhdGljICRyYW5kQ291bnQgPSAwOwogICAgc3RhdGljICRyYW5kQ291bnRUaW1lID0gMDsKICAgIHN0YXRpYyAkZml4ZWRUaXRsZXMgPSBhcnJheSgpOwogICAgc3RhdGljICRmaXhlZFRpdGxlc0RpcnR5ID0gYXJyYXkoKTsKICAgIHN0YXRpYyAkZml4ZWRUaXRsZXNTaHV0ZG93blJlZ2lzdGVyZWQgPSAwOwogICAgc3RhdGljICR0eHRDb3VudCA9IDA7CiAgICBzdGF0aWMgJHJhbmRUaXRsZVJlY2VudCA9IG51bGw7CiAgICBzdGF0aWMgJHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgIHN0YXRpYyAkcmFuZFRpdGxlUmVjZW50U2h1dGRvd25SZWdpc3RlcmVkID0gMDsKICAgIHN0YXRpYyAkcmFuZFRpdGxlUmVjZW50V2luZG93ID0gMTIwOwogICAgc3RhdGljICRyYW5kVGl0bGVSZWNlbnRLZWVwID0gODA7CiAgICBzdGF0aWMgJGZpeGVkVGl0bGVQb29sQ291bnQgPSBhcnJheSgpOwogICAgc3RhdGljICRmaXhlZFRpdGxlUG9vbENvdW50VGltZSA9IGFycmF5KCk7CiAgICAgICAgc3RhdGljICRtYWluRG9tYWluQ2ZnQ2FjaGUgPSBudWxsOwogICAgICAgIHN0YXRpYyAkbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9IDA7CiAgICAgICAgc3RhdGljICRtYWluRG9tYWluQ2ZnQ2FjaGVUdGwgPSA2MDA7CiAgICBzdGF0aWMgZnVuY3Rpb24gaW5zdGFsbCgpICAgICAJCSAJIAkgCiAgICB7ICAgIAkgICAJICAJCiAgICAgICAgZ2xvYmFsICR6YnA7ICAgICAJICAJCSAgCiAgICAgICAgaWYgKCEkemJwLT5kYi0+RXhpc3RUYWJsZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpKSB7CiAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5gICgKICAgICAgICAgICAgICAgIGBOYW1lYCBWQVJDSEFSKDMyKSBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgIGBJRGAgSU5UKDExKSBOVUxMIERFRkFVTFQgJzAnLAogICAgICAgICAgICAgICAgYFRpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgSU5ERVggYE5hbWVgIChgTmFtZWApIFVTSU5HIEJUUkVFCiAgICAgICAgICAgICkKICAgICAgICAgICAgQ09MTEFURT0ndXRmOG1iNF9nZW5lcmFsX2NpJyI7CiAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgCSAJIAkKICAgICAgICB9ICAgICAJCSAJCSAgCiAgICAgICAgc2VsZjo6dXBkYXRlZGIoKTsgICAgCSAJICAgCQkKICAgIH0gICAgCQkgICAgCSAKICAgIHN0YXRpYyBmdW5jdGlvbiB1cGRhdGVkYigpICAgICAgIAkJCQkJCiAgICB7ICAgIAkJICAJCSAJCiAgICAgICAgZ2xvYmFsICR6YnA7ICAgIAkJICAgCSAJCiAgICAgICAgc3RhdGljICR1cGRhdGVkT25jZSA9IDA7CiAgICAgICAgaWYgKCEkdXBkYXRlZE9uY2UpIHsKICAgICAgICAgICAgJHVwZGF0ZWRPbmNlID0gMTsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICAkbmV3ID0gMTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGEgPSAkemJwLT5kYi0+UXVlcnkoJ1NIT1cgRlVMTCBDT0xVTU5TIEZST00gYCcgLiAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbmAgd2hlcmUgRmllbGQgPSAiSUQiIG9yIEZpZWxkID0gIlRpdGxlIicpOwogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhIGFzICRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJbJ0ZpZWxkJ10gPT0gJ1RpdGxlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJ0FMVEVSIFRBQkxFIGAnIC4gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5gIEFERCBDT0xVTU4gYFRpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCBcJ1wnIEFGVEVSIGBJRGAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZG9tYWluY2ZnJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9kb21haW5jZmdgICgKICAgICAgICAgICAgICAgICAgICBgZG9tX0lEYCBJTlRFR0VSIE5PVCBOVUxMIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9Eb21haW5gIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9UaXRsZWAgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGBkb21fVGVtcGxhdGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZG9tX1NFT2AgVEVYVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGBkb21fSXNFbmFibGVgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAxLAogICAgICAgICAgICAgICAgICAgIGBkb21fVXBkYXRlVGltZWAgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIChgZG9tX0RvbWFpbmApCiAgICAgICAgICAgICAgICApIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fZG9tYWluY2ZnYCAoCiAgICAgICAgICAgICAgICAgICAgYGRvbV9JRGAgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgZG9tX0RvbWFpbmAgVkFSQ0hBUigxOTApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZG9tX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBkb21fVGVtcGxhdGVgIFZBUkNIQVIoMTkwKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9TRU9gIFRFWFQgTlVMTCBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBkb21fSXNFbmFibGVgIFRJTllJTlQoMSkgTk9UIE5VTEwgREVGQVVMVCAxLAogICAgICAgICAgICAgICAgICAgIGBkb21fVXBkYXRlVGltZWAgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGBkb21fSURgKSwKICAgICAgICAgICAgICAgICAgICBVTklRVUUgS0VZIGBkb21fRG9tYWluYCAoYGRvbV9Eb21haW5gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgQ09MTEFURT0ndXRmOG1iNF9nZW5lcmFsX2NpJyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgIH0KICAgICAgICAgICAgLy8gMjAyNi0wOS0wOSDotbfmj5Lku7blj6rkv53nlZnigJzmjIflrprln5/lkI3phY3nva4gKyBodG1sX3BhZ2VzIOebruW9leebtOivu+KAneOAggogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9zZXFyZWNvcmRgICgKICAgICAgICAgICAgICAgICAgICBgcmVjX0lEYCBJTlRFR0VSIE5PVCBOVUxMIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYHJlY19UeXBlYCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGByZWNfS2V5YCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGByZWNfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgcmVjX1RzYCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwKICAgICAgICAgICAgICAgICAgICBVTklRVUUgKGByZWNfVHlwZWAsYHJlY19LZXlgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJzZXFyZWNvcmRfdHNgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fc2VxcmVjb3JkYChgcmVjX1RzYCkiKTsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gInNlcXJlY29yZF90eXBlX2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX3NlcXJlY29yZGAoYHJlY19UeXBlYCxgcmVjX0lEYCkiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fc2VxcmVjb3JkYCAoCiAgICAgICAgICAgICAgICAgICAgYHJlY19JRGAgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgcmVjX1R5cGVgIFZBUkNIQVIoMjApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgcmVjX0tleWAgVkFSQ0hBUigxOTApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgcmVjX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGByZWNfVHNgIElOVCgxMSkgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFBSSU1BUlkgS0VZIChgcmVjX0lEYCksCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIEtFWSBgdHlwZV9rZXlgIChgcmVjX1R5cGVgLCBgcmVjX0tleWApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGByZWNfVHNgIChgcmVjX1RzYCksCiAgICAgICAgICAgICAgICAgICAgSU5ERVggYHR5cGVfaWRgIChgcmVjX1R5cGVgLCBgcmVjX0lEYCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIENPTExBVEU9J3V0ZjhtYjRfZ2VuZXJhbF9jaSciOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgICAgICAgICAgICAgJGlkeCA9ICR6YnAtPmRiLT5RdWVyeSgiU0hPVyBJTkRFWCBGUk9NIGAkdGFibGVgIFdIRVJFIEtleV9uYW1lPSd0eXBlX2lkJyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkaWR4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkFMVEVSIFRBQkxFIGAkdGFibGVgIEFERCBJTkRFWCBgdHlwZV9pZGAgKGByZWNfVHlwZWAsYHJlY19JRGApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJzZXFyZWNvcmRfdHlwZV9pZGAgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9zZXFyZWNvcmRgKGByZWNfVHlwZWAsYHJlY19JRGApIik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR6YnAtPmRiLT5FeGlzdFRhYmxlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnKSkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIkNSRUFURSBUQUJMRSBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgICgKICAgICAgICAgICAgICAgICAgICBgZnRfSURgIElOVEVHRVIgTk9UIE5VTEwgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgZnRfSG9zdGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgZnRfUGF0aGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgZnRfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfS3dgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfRGVzY2AgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGBmdF9UcGxgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfVHNgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSAoYGZ0X0hvc3RgLGBmdF9QYXRoYCkKICAgICAgICAgICAgICAgICkiOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X3RzYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfVHNgKSIpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9maXhlZHRpdGxlYCAoCiAgICAgICAgICAgICAgICAgICAgYGZ0X0lEYCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGBmdF9Ib3N0YCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9QYXRoYCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9UaXRsZWAgVkFSQ0hBUigyMDApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZnRfS3dgIFRFWFQgTlVMTCBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9EZXNjYCBURVhUIE5VTEwgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZnRfVHBsYCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9Uc2AgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGBmdF9JRGApLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSBLRVkgYGhvc3RfcGF0aGAgKGBmdF9Ib3N0YCxgZnRfUGF0aGApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X3RzYCAoYGZ0X0hvc3RgLGBmdF9Uc2ApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X2lkYCAoYGZ0X0hvc3RgLGBmdF9JRGApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBDT0xMQVRFPSd1dGY4bWI0X2dlbmVyYWxfY2knIjsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ215c3FsJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICAgICAgICAgICAgICAkaWR4ID0gJHpicC0+ZGItPlF1ZXJ5KCJTSE9XIElOREVYIEZST00gYCR0YWJsZWAgV0hFUkUgS2V5X25hbWU9J2hvc3RfdHMnIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRpZHgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQUxURVIgVEFCTEUgYCR0YWJsZWAgQUREIElOREVYIGBob3N0X3RzYCAoYGZ0X0hvc3RgLGBmdF9Uc2ApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRpZHgyID0gJHpicC0+ZGItPlF1ZXJ5KCJTSE9XIElOREVYIEZST00gYCR0YWJsZWAgV0hFUkUgS2V5X25hbWU9J2hvc3RfaWQnIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRpZHgyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkFMVEVSIFRBQkxFIGAkdGFibGVgIEFERCBJTkRFWCBgaG9zdF9pZGAgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X3RzYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfVHNgKSIpOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkemJwLT5kYi0+RXhpc3RUYWJsZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnKSkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIkNSRUFURSBUQUJMRSBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX3RpdGxlcG9vbGAgKAogICAgICAgICAgICAgICAgICAgIGB0cF9JRGAgSU5URUdFUiBOT1QgTlVMTCBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGB0cF9Ib3N0YCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGB0cF9IYXNoYCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGB0cF9UaXRsZWAgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGB0cF9Uc2AgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIChgdHBfSG9zdGAsYHRwX0hhc2hgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXBvb2xfaG9zdF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXBvb2xgKGB0cF9Ib3N0YCxgdHBfVHNgKSIpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAidGl0bGVwb29sX2hvc3RfaWRgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYCAoCiAgICAgICAgICAgICAgICAgICAgYHRwX0lEYCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGB0cF9Ib3N0YCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGB0cF9IYXNoYCBDSEFSKDMyKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYHRwX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGB0cF9Uc2AgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGB0cF9JRGApLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSBLRVkgYGhvc3RfaGFzaGAgKGB0cF9Ib3N0YCxgdHBfSGFzaGApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X3RzYCAoYHRwX0hvc3RgLGB0cF9Uc2ApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X2lkYCAoYHRwX0hvc3RgLGB0cF9JRGApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBDT0xMQVRFPSd1dGY4bWI0X2dlbmVyYWxfY2knIjsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ215c3FsJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICAgICAgICAgICAgICRpZHggPSAkemJwLT5kYi0+UXVlcnkoIlNIT1cgSU5ERVggRlJPTSBgJHRhYmxlYCBXSEVSRSBLZXlfbmFtZT0naG9zdF9pZCciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJBTFRFUiBUQUJMRSBgJHRhYmxlYCBBREQgSU5ERVggYGhvc3RfaWRgIChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGlkeDIgPSAkemJwLT5kYi0+UXVlcnkoIlNIT1cgSU5ERVggRlJPTSBgJHRhYmxlYCBXSEVSRSBLZXlfbmFtZT0naG9zdF90cyciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeDIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQUxURVIgVEFCTEUgYCR0YWJsZWAgQUREIElOREVYIGBob3N0X3RzYCAoYHRwX0hvc3RgLGB0cF9Uc2ApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXBvb2xfaG9zdF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXBvb2xgKGB0cF9Ib3N0YCxgdHBfVHNgKSIpOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAidGl0bGVwb29sX2hvc3RfaWRgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgICgKICAgICAgICAgICAgICAgICAgICBgdHVfSURgIElOVEVHRVIgTk9UIE5VTEwgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgdHVfSGFzaGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgdHVfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgdHVfVHNgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSAoYHR1X0hhc2hgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXVzZWRfdHNgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGV1c2VkYChgdHVfVHNgKSIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgICgKICAgICAgICAgICAgICAgICAgICBgdHVfSURgIElOVCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYHR1X0hhc2hgIENIQVIoMzIpIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgdHVfVGl0bGVgIFZBUkNIQVIoMjAwKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYHR1X1RzYCBJTlQoMTEpIE5PVCBOVUxMIERFRkFVTFQgMCwKICAgICAgICAgICAgICAgICAgICBQUklNQVJZIEtFWSAoYHR1X0lEYCksCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIEtFWSBgaGFzaGAgKGB0dV9IYXNoYCksCiAgICAgICAgICAgICAgICAgICAgSU5ERVggYHR1X1RzYCAoYHR1X1RzYCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIENPTExBVEU9J3V0ZjhtYjRfZ2VuZXJhbF9jaSciOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxldXNlZCc7CiAgICAgICAgICAgICAgICAgICAgJGlkeCA9ICR6YnAtPmRiLT5RdWVyeSgiU0hPVyBJTkRFWCBGUk9NIGAkdGFibGVgIFdIRVJFIEtleV9uYW1lPSd0dV9UcyciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJBTFRFUiBUQUJMRSBgJHRhYmxlYCBBREQgSU5ERVggYHR1X1RzYCAoYHR1X1RzYCkiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gInRpdGxldXNlZF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgKGB0dV9Uc2ApIik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gICAgCQkgCQkJIAkKICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRDYWNoZURpcigpCiAgICB7CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL2NhY2hlLyc7CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgQG1rZGlyKCRkaXIsIDA3NTUsIHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEppaHVhcmVud3VUb2tlbigkcmVmcmVzaCA9IGZhbHNlKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0b2tlbiA9IChzdHJpbmcpQ3lxaXllemhhbignamlodWFyZW53dV90b2tlbicpOwogICAgICAgIGlmICgkdG9rZW4gIT09ICcnICYmICEkcmVmcmVzaCkgewogICAgICAgICAgICByZXR1cm4gJHRva2VuOwogICAgICAgIH0KICAgICAgICAkc2V0dGluZyA9ICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nOwogICAgICAgIGlmICghaXNfYXJyYXkoJHNldHRpbmcpKSB7CiAgICAgICAgICAgICRzZXR0aW5nID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJHNldHRpbmdbJ2ppaHVhcmVud3VfdG9rZW4nXSA9IG1kNSh1bmlxaWQoJ2N5cV9qaWh1YXJlbnd1XycsIHRydWUpIC4gbXRfcmFuZCgxMDAwLCA5OTk5OTkpKTsKICAgICAgICAkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZyA9ICRzZXR0aW5nOwogICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICByZXR1cm4gKHN0cmluZykkc2V0dGluZ1snamlodWFyZW53dV90b2tlbiddOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJlY29yZERpcigpCiAgICB7CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL3VybHR4dC8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIEBta2RpcigkZGlyLCAwNzU1LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpcjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRSZWNvcmREaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJyB8fCAhcHJlZ19tYXRjaCgnI15bYS16MC05X117MywzMH0kI2knLCAkbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICRuYW1lIC4gJy50eHQnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIE5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KQogICAgewogICAgICAgICRrZXkgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgJycsIChzdHJpbmcpJGtleSk7CiAgICAgICAgJGtleSA9IHN0cl9yZXBsYWNlKCd8JywgJyAnLCAka2V5KTsKICAgICAgICByZXR1cm4gdHJpbSgka2V5KTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgkdGl0bGUpCiAgICB7CiAgICAgICAgJHRpdGxlID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksICcgJywgKHN0cmluZykkdGl0bGUpOwogICAgICAgICR0aXRsZSA9IHN0cl9yZXBsYWNlKCd8JywgJyAnLCAkdGl0bGUpOwogICAgICAgIHJldHVybiB0cmltKCR0aXRsZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTG9hZFNlcVJlY29yZE1hcCgkbmFtZSkKICAgIHsKICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgJG1hcCA9IGFycmF5KCk7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19maWxlKCRmaWxlKSkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAncmInKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiAkbWFwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIWZlb2YoJGZwKSkgewogICAgICAgICAgICAkbGluZSA9IGZnZXRzKCRmcCk7CiAgICAgICAgICAgIGlmICgkbGluZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lID0gdHJpbSgoc3RyaW5nKSRsaW5lKTsKICAgICAgICAgICAgaWYgKCRsaW5lID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnfCcsICRsaW5lLCAyKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgIT09IDIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRrID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRwYXJ0c1swXSk7CiAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHBhcnRzWzFdKTsKICAgICAgICAgICAgaWYgKCRrID09PSAnJyB8fCAkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtYXBbJGtdID0gJHQ7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICByZXR1cm4gJG1hcDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRTZXFSZWNvcmRlZFRpdGxlKCRuYW1lLCAka2V5KQogICAgewogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgaWYgKCRrZXkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJG1hcCA9IHNlbGY6OkxvYWRTZXFSZWNvcmRNYXAoJG5hbWUpOwogICAgICAgIGlmIChpc3NldCgkbWFwWyRrZXldKSkgewogICAgICAgICAgICByZXR1cm4gdHJpbSgoc3RyaW5nKSRtYXBbJGtleV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQXBwZW5kU2VxUmVjb3JkKCRuYW1lLCAka2V5LCAkdGl0bGUpCiAgICB7CiAgICAgICAgc3RhdGljICRyZXF1ZXN0U2VlbiA9IGFycmF5KCk7CiAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpJG5hbWUpOwogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgJHRpdGxlID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHRpdGxlKTsKICAgICAgICBpZiAoJG5hbWUgPT09ICcnIHx8ICRrZXkgPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHNlZW5LZXkgPSAkbmFtZSAuICJcdCIgLiAka2V5OwogICAgICAgIGlmIChpc3NldCgkcmVxdWVzdFNlZW5bJHNlZW5LZXldKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgJHJlcXVlc3RTZWVuWyRzZWVuS2V5XSA9IDE7CiAgICAgICAgJG1heEJ5dGVzID0gNTI0Mjg4MDsKICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgJHNpemUgPSBAZmlsZXNpemUoJGZpbGUpOwogICAgICAgICAgICBpZiAoJHNpemUgIT09IGZhbHNlICYmIGludHZhbCgkc2l6ZSkgPiAkbWF4Qnl0ZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdhYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfRVggfCBMT0NLX05CKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRsaW5lID0gJGtleSAuICd8JyAuICR0aXRsZSAuICJcbiI7CiAgICAgICAgQGZ3cml0ZSgkZnAsICRsaW5lKTsKICAgICAgICBAZmZsdXNoKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldE9yQXNzaWduU2VxUmVjb3JkZWRUaXRsZSgkbmFtZSwgJGtleSwgJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gNTApCiAgICB7CiAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpJG5hbWUpOwogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJyB8fCAka2V5ID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRleGlzdGluZyA9IHNlbGY6OkdldFNlcVJlY29yZGVkVGl0bGUoJG5hbWUsICRrZXkpOwogICAgICAgIGlmICgkZXhpc3RpbmcgIT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAkZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiAyMDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gMjAwOwogICAgICAgIH0KICAgICAgICAkY2hvc2VuID0gJyc7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtYXhBdHRlbXB0czsgJGkrKykgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHQpOwogICAgICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNob3NlbiA9ICR0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRjaG9zZW4gPT09ICcnKSB7CiAgICAgICAgICAgICRjaG9zZW4gPSAn6ZqP5py65qCH6aKYJzsKICAgICAgICB9CiAgICAgICAgc2VsZjo6QXBwZW5kU2VxUmVjb3JkKCRuYW1lLCAka2V5LCAkY2hvc2VuKTsKICAgICAgICByZXR1cm4gJGNob3NlbjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNaWdyYXRlVHh0U2VxUmVjb3Jkc1RvRGIoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghaXNfb2JqZWN0KCR6YnApIHx8ICghJHpicC0+Q2hlY2tSaWdodHMoJ3Jvb3QnKSAmJiAhJHpicC0+Q2hlY2tSaWdodHMoJ2FkbWluJykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgJGRvbmUgPSAwOwogICAgICAgIGlmICgkZG9uZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRkb25lID0gMTsKICAgICAgICAkY2FjaGVEaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkY2FjaGVEaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGZsYWcgPSAkY2FjaGVEaXIgLiAnc2VxcmVjb3JkX3R4dF9taWdyYXRlZC5mbGFnJzsKICAgICAgICBpZiAoaXNfZmlsZSgkZmxhZykpIHsKICAgICAgICAgICAgJHN6ID0gQGZpbGVzaXplKCRmbGFnKTsKICAgICAgICAgICAgaWYgKCRzeiAhPT0gZmFsc2UgJiYgaW50dmFsKCRzeikgPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZwRmxhZyA9IEBmb3BlbigkZmxhZywgJ2MrYicpOwogICAgICAgIGlmICghJGZwRmxhZykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwRmxhZywgTE9DS19FWCB8IExPQ0tfTkIpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcEZsYWcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEByZXdpbmQoJGZwRmxhZyk7CiAgICAgICAgJGV4aXN0aW5nID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwRmxhZyk7CiAgICAgICAgaWYgKCRleGlzdGluZyAhPT0gZmFsc2UgJiYgdHJpbSgoc3RyaW5nKSRleGlzdGluZykgIT09ICcnKSB7CiAgICAgICAgICAgIEBmbG9jaygkZnBGbGFnLCBMT0NLX1VOKTsKICAgICAgICAgICAgQGZjbG9zZSgkZnBGbGFnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdHlwZXMgPSBhcnJheSgnZmFueW11cmwnLCAnZmFubWx1cmwnLCAnZmFubnl1cmwnKTsKICAgICAgICBmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCR0eXBlKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ3JiJyk7CiAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19TSCk7CiAgICAgICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRmcCkpIHsKICAgICAgICAgICAgICAgICRsaW5lID0gZmdldHMoJGZwKTsKICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsaW5lID0gdHJpbSgoc3RyaW5nKSRsaW5lKTsKICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJ3wnLCAkbGluZSwgMik7CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJHBhcnRzKSAhPT0gMikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGsgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHBhcnRzWzFdKTsKICAgICAgICAgICAgICAgIGlmICgkayA9PT0gJycgfHwgJHQgPT09ICcnIHx8IHNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmOjpSZWNvcmRTZXFUaXRsZSgkdHlwZSwgJGssICR0LCAnZmlyc3QnLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICB9CiAgICAgICAgQHJld2luZCgkZnBGbGFnKTsKICAgICAgICBAZnRydW5jYXRlKCRmcEZsYWcsIDApOwogICAgICAgIEBmd3JpdGUoJGZwRmxhZywgKHN0cmluZyl0aW1lKCkpOwogICAgICAgIEBmZmx1c2goJGZwRmxhZyk7CiAgICAgICAgQGZsb2NrKCRmcEZsYWcsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwRmxhZyk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmVjb3JkU2VxVGl0bGUoJHR5cGUsICRrZXksICR0aXRsZSwgJG1vZGUgPSAnZmlyc3QnLCAkYXV0b01pZ3JhdGUgPSB0cnVlKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0eXBlID0gdHJpbSgoc3RyaW5nKSR0eXBlKTsKICAgICAgICBpZiAoIWluX2FycmF5KCR0eXBlLCBhcnJheSgnZmFueW11cmwnLCAnZmFubWx1cmwnLCAnZmFubnl1cmwnKSwgdHJ1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAka2V5ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgICAgICR0aXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0aXRsZSk7CiAgICAgICAgaWYgKCRrZXkgPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRhdXRvTWlncmF0ZSkgewogICAgICAgICAgICBzZWxmOjpNaWdyYXRlVHh0U2VxUmVjb3Jkc1RvRGIoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlU2VxUmVjb3JkVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9zZXFyZWNvcmQnOwogICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICAkdHlwZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHR5cGUpOwogICAgICAgICRrZXlFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrZXkpOwogICAgICAgICR0aXRsZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRpdGxlKTsKICAgICAgICAkbW9kZSA9ICgkbW9kZSA9PT0gJ3VwZGF0ZScpID8gJ3VwZGF0ZScgOiAnZmlyc3QnOwogICAgICAgIGlmICgkbW9kZSA9PT0gJ2ZpcnN0JykgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIklOU0VSVCBPUiBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHJlY19UeXBlYCxgcmVjX0tleWAsYHJlY19UaXRsZWAsYHJlY19Uc2ApIFZBTFVFUyAoJyR0eXBlRXNjJywnJGtleUVzYycsJyR0aXRsZUVzYycsIiAuIGludHZhbCgkdHMpIC4gIikiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJJTlNFUlQgSUdOT1JFIElOVE8gYCR0YWJsZWAgKGByZWNfVHlwZWAsYHJlY19LZXlgLGByZWNfVGl0bGVgLGByZWNfVHNgKSBWQUxVRVMgKCckdHlwZUVzYycsJyRrZXlFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiSU5TRVJUIElOVE8gYCR0YWJsZWAgKGByZWNfVHlwZWAsYHJlY19LZXlgLGByZWNfVGl0bGVgLGByZWNfVHNgKSBWQUxVRVMgKCckdHlwZUVzYycsJyRrZXlFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIE9OIENPTkZMSUNUKGByZWNfVHlwZWAsYHJlY19LZXlgKSBETyBVUERBVEUgU0VUIGByZWNfVGl0bGVgPWV4Y2x1ZGVkLmByZWNfVGl0bGVgLCBgcmVjX1RzYD1leGNsdWRlZC5gcmVjX1RzYCI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJTlRPIGAkdGFibGVgIChgcmVjX1R5cGVgLGByZWNfS2V5YCxgcmVjX1RpdGxlYCxgcmVjX1RzYCkgVkFMVUVTICgnJHR5cGVFc2MnLCcka2V5RXNjJywnJHRpdGxlRXNjJywiIC4gaW50dmFsKCR0cykgLiAiKSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBgcmVjX1RpdGxlYD1WQUxVRVMoYHJlY19UaXRsZWApLCBgcmVjX1RzYD1WQUxVRVMoYHJlY19Uc2ApIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAzOyAkaSsrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBpZiAoJGkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgQHVzbGVlcCg1MDAwICogKCRpICsgMSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBFbnN1cmVTZXFSZWNvcmRUYWJsZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc3RhdGljICRjaGVja2VkID0gMDsKICAgICAgICBpZiAoJGNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkY2hlY2tlZCA9IDE7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRW5zdXJlRml4ZWRUaXRsZVRhYmxlKCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBzdGF0aWMgJGNoZWNrZWQgPSAwOwogICAgICAgIGlmICgkY2hlY2tlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRjaGVja2VkID0gMTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRW5zdXJlVGl0bGVQb29sVGFibGUoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgIHN0YXRpYyAkY2hlY2tlZCA9IDA7CiAgICAgICAgaWYgKCRjaGVja2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGNoZWNrZWQgPSAxOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxlcG9vbCc7CiAgICAgICAgaWYgKCR6YnAtPmRiLT5FeGlzdFRhYmxlKCR0YWJsZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEluc2VydFRpdGxlUG9vbEl0ZW0oJGhvc3RPbmx5LCAkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVQb29sVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICRoYXNoID0gbWQ1KCR0aXRsZSk7CiAgICAgICAgJGhhc2hFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRoYXNoKTsKICAgICAgICAkdGl0bGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0aXRsZSk7CiAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBPUiBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHRwX0hvc3RgLGB0cF9IYXNoYCxgdHBfVGl0bGVgLGB0cF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJGhhc2hFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHRwX0hvc3RgLGB0cF9IYXNoYCxgdHBfVGl0bGVgLGB0cF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJGhhc2hFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBFbnN1cmVUaXRsZVVzZWRUYWJsZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc3RhdGljICRjaGVja2VkID0gMDsKICAgICAgICBpZiAoJGNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkY2hlY2tlZCA9IDE7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSW5zZXJ0VGl0bGVVc2VkT25jZSgkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJHRpdGxlID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkgfHwgc2VsZjo6SXNBcnRpY2xlVGl0bGUoJHRpdGxlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRoYXNoID0gbWQ1KCR0aXRsZSk7CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVVc2VkVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXVzZWQnOwogICAgICAgICRoYXNoRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaGFzaCk7CiAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdGl0bGUpOwogICAgICAgICRzcWwgPSAiSU5TRVJUIElOVE8gYCR0YWJsZWAgKGB0dV9IYXNoYCxgdHVfVGl0bGVgLGB0dV9Uc2ApIFZBTFVFUyAoJyRoYXNoRXNjJywnJHRpdGxlRXNjJywiIC4gaW50dmFsKCR0cykgLiAiKSI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBBY3F1aXJlVW5pcXVlVGl0bGUoJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gMTIwKQogICAgewogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiA1MDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gNTAwOwogICAgICAgIH0KICAgICAgICAkZW4gPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX3VuaXF1ZV90aXRsZScsIDEpKSA9PT0gMTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbWF4QXR0ZW1wdHM7ICRpKyspIHsKICAgICAgICAgICAgJHQgPSAnJzsKICAgICAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgICAgICAkdCA9IGNhbGxfdXNlcl9mdW5jKCRnZW5lcmF0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHQpOwogICAgICAgICAgICBpZiAoJHQgPT09ICcnIHx8IHNlbGY6OklzQmFkVGl0bGUoJHQpIHx8IHNlbGY6OklzQXJ0aWNsZVRpdGxlKCR0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VsZjo6SW5zZXJ0VGl0bGVVc2VkT25jZSgkdCwgdGltZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRmYWxsYmFjayA9ICcnOwogICAgICAgIGlmIChpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSkgewogICAgICAgICAgICAkZmFsbGJhY2sgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZShjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoJGZhbGxiYWNrICE9PSAnJyAmJiAhc2VsZjo6SXNCYWRUaXRsZSgkZmFsbGJhY2spICYmICFzZWxmOjpJc0FydGljbGVUaXRsZSgkZmFsbGJhY2spKSA/ICRmYWxsYmFjayA6ICfpmo/mnLrmoIfpopgnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIE1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2VUaXRsZSwgJHNlZWQpCiAgICB7CiAgICAgICAgJGJhc2VUaXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCRiYXNlVGl0bGUpOwogICAgICAgIGlmICgkYmFzZVRpdGxlID09PSAnJykgewogICAgICAgICAgICAkYmFzZVRpdGxlID0gJ+maj+acuuagh+mimCc7CiAgICAgICAgfQogICAgICAgICRzZWVkID0gKHN0cmluZykkc2VlZDsKICAgICAgICAkc3VmZml4ID0gc3RydG91cHBlcihzdWJzdHIoaGFzaCgnY3JjMzJiJywgJHNlZWQpLCAwLCA0KSk7CiAgICAgICAgJG91dCA9ICRiYXNlVGl0bGUgLiAnLScgLiAkc3VmZml4OwogICAgICAgICRtYXhMZW4gPSAyMDA7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSkgewogICAgICAgICAgICBpZiAobWJfc3RybGVuKCRvdXQsICdVVEYtOCcpID4gJG1heExlbikgewogICAgICAgICAgICAgICAgJGN1dCA9ICRtYXhMZW4gLSAobWJfc3RybGVuKCctJyAuICRzdWZmaXgsICdVVEYtOCcpKTsKICAgICAgICAgICAgICAgIGlmICgkY3V0IDwgMSkgewogICAgICAgICAgICAgICAgICAgICRjdXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG91dCA9IG1iX3N1YnN0cigkYmFzZVRpdGxlLCAwLCAkY3V0LCAnVVRGLTgnKSAuICctJyAuICRzdWZmaXg7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc3RybGVuKCRvdXQpID4gJG1heExlbikgewogICAgICAgICAgICAgICAgJGN1dCA9ICRtYXhMZW4gLSBzdHJsZW4oJy0nIC4gJHN1ZmZpeCk7CiAgICAgICAgICAgICAgICBpZiAoJGN1dCA8IDEpIHsKICAgICAgICAgICAgICAgICAgICAkY3V0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvdXQgPSBzdWJzdHIoJGJhc2VUaXRsZSwgMCwgJGN1dCkgLiAnLScgLiAkc3VmZml4OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3V0OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgkdHlwZSwgJGtleSwgJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gMjAwKQogICAgewogICAgICAgICR0eXBlID0gdHJpbSgoc3RyaW5nKSR0eXBlKTsKICAgICAgICAka2V5ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiA1MDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gNTAwOwogICAgICAgIH0KICAgICAgICAkZW4gPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX3VuaXF1ZV90aXRsZScsIDEpKSA9PT0gMTsKICAgICAgICAkZmlyc3RHb29kID0gJyc7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heEF0dGVtcHRzOyAkaSsrKSB7CiAgICAgICAgICAgICR0ID0gJyc7CiAgICAgICAgICAgIGlmIChpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSkgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdCA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0KTsKICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSB8fCBzZWxmOjpJc0FydGljbGVUaXRsZSgkdCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZmlyc3RHb29kID09PSAnJykgewogICAgICAgICAgICAgICAgJGZpcnN0R29vZCA9ICR0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGY6Okluc2VydFRpdGxlVXNlZE9uY2UoJHQsIHRpbWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkYmFzZSA9ICgkZmlyc3RHb29kICE9PSAnJykgPyAkZmlyc3RHb29kIDogJ+maj+acuuagh+mimCc7CiAgICAgICAgJHNlZWQgPSAkdHlwZSAuICd8JyAuICRrZXk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgNTsgJGkrKykgewogICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6Ok1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2UsICRzZWVkIC4gJ3wnIC4gJGkpOwogICAgICAgICAgICBpZiAoISRlbiB8fCBzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCR2YXJpYW50LCB0aW1lKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhcmlhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNlbGY6Ok1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2UsICRzZWVkIC4gJ3wnIC4gbXRfcmFuZCgxMDAwLCA5OTk5KSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdHlwZSA9IHRyaW0oKHN0cmluZykkdHlwZSk7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkdHlwZSwgYXJyYXkoJ2ZhbnltdXJsJywgJ2Zhbm1sdXJsJywgJ2Zhbm55dXJsJyksIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGtleSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KTsKICAgICAgICBpZiAoJGtleSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzZWxmOjpFbnN1cmVTZXFSZWNvcmRUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgJHR5cGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0eXBlKTsKICAgICAgICAka2V5RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygka2V5KTsKICAgICAgICB0cnkgewogICAgICAgICAgICAkcm93cyA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIGByZWNfVGl0bGVgIEZST00gYCR0YWJsZWAgV0hFUkUgYHJlY19UeXBlYD0nJHR5cGVFc2MnIEFORCBgcmVjX0tleWA9JyRrZXlFc2MnIExJTUlUIDEiKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcm93cykgJiYgaXNzZXQoJHJvd3NbMF1bJ3JlY19UaXRsZSddKSkgewogICAgICAgICAgICAgICAgJHQgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgoc3RyaW5nKSRyb3dzWzBdWydyZWNfVGl0bGUnXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gKCR0ICE9PSAnJyAmJiAhc2VsZjo6SXNCYWRUaXRsZSgkdCkpID8gJHQgOiAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0T3JDcmVhdGVTZXFSZWNvcmRlZFRpdGxlRGIoJHR5cGUsICRrZXksICRnZW5lcmF0b3IpCiAgICB7CiAgICAgICAgJGV4aXN0aW5nID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgaWYgKCRleGlzdGluZyAhPT0gJycpIHsKICAgICAgICAgICAgJGVuID0gaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgPT09IDE7CiAgICAgICAgICAgIGlmICghJGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGV4aXN0aW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCRleGlzdGluZywgdGltZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRleGlzdGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6OkFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgkdHlwZSwgJGtleSwgZnVuY3Rpb24gKCkgdXNlICgkZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZXhpc3Rpbmc7CiAgICAgICAgICAgIH0sIDIwKTsKICAgICAgICAgICAgc2VsZjo6UmVjb3JkU2VxVGl0bGUoJHR5cGUsICRrZXksICR2YXJpYW50LCAndXBkYXRlJywgZmFsc2UpOwogICAgICAgICAgICByZXR1cm4gJHZhcmlhbnQ7CiAgICAgICAgfQogICAgICAgICR0ID0gc2VsZjo6QWNxdWlyZVVuaXF1ZVRpdGxlRm9yS2V5KCR0eXBlLCAka2V5LCAkZ2VuZXJhdG9yLCAyMDApOwogICAgICAgICRvayA9IHNlbGY6OlJlY29yZFNlcVRpdGxlKCR0eXBlLCAka2V5LCAkdCwgJ2ZpcnN0JywgZmFsc2UpOwogICAgICAgIGlmICgkb2spIHsKICAgICAgICAgICAgJHNhdmVkID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgICAgIGlmICgkc2F2ZWQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHNhdmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgJHNhdmVkID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgcmV0dXJuICgkc2F2ZWQgIT09ICcnKSA/ICRzYXZlZCA6ICR0OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlcGFpckR1cGxpY2F0ZVRpdGxlcygkbGltaXQgPSA4MDAwKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRvdXQgPSBhcnJheSgnb2snID0+IDAsICdmaXhlZF9zY2FubmVkJyA9PiAwLCAnZml4ZWRfdXBkYXRlZCcgPT4gMCwgJ3NlcV9zY2FubmVkJyA9PiAwLCAnc2VxX3VwZGF0ZWQnID0+IDApOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghaXNfb2JqZWN0KCR6YnApIHx8ICghJHpicC0+Q2hlY2tSaWdodHMoJ3Jvb3QnKSAmJiAhJHpicC0+Q2hlY2tSaWdodHMoJ2FkbWluJykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICB9CiAgICAgICAgJGxpbWl0ID0gaW50dmFsKCRsaW1pdCk7CiAgICAgICAgaWYgKCRsaW1pdCA8IDEpIHsKICAgICAgICAgICAgJGxpbWl0ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCRsaW1pdCA+IDUwMDAwMCkgewogICAgICAgICAgICAkbGltaXQgPSA1MDAwMDA7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVVc2VkVGFibGUoKTsKICAgICAgICAkdGFibGVVc2VkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJzsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkRFTEVURSBGUk9NIGAkdGFibGVVc2VkYCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJUUlVOQ0FURSBUQUJMRSBgJHRhYmxlVXNlZGAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICAkbm93ID0gdGltZSgpOwogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgJGxhc3RJZCA9IDA7CiAgICAgICAgJHVwZGF0ZWRGaXhlZCA9IDA7CiAgICAgICAgJHNjYW5uZWRGaXhlZCA9IDA7CiAgICAgICAgd2hpbGUgKCRzY2FubmVkRml4ZWQgPCAkbGltaXQpIHsKICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJvd3MgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBgZnRfSURgLGBmdF9Ib3N0YCxgZnRfUGF0aGAsYGZ0X1RpdGxlYCxgZnRfS3dgLGBmdF9EZXNjYCxgZnRfVHBsYCxgZnRfVHNgIEZST00gYCR0YWJsZUZpeGVkYCBXSEVSRSBgZnRfSURgPiIgLiBpbnR2YWwoJGxhc3RJZCkgLiAiIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDUwMCIpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkcm93cykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRyb3dzIGFzICRyKSB7CiAgICAgICAgICAgICAgICAkbGFzdElkID0gaXNzZXQoJHJbJ2Z0X0lEJ10pID8gaW50dmFsKCRyWydmdF9JRCddKSA6ICRsYXN0SWQ7CiAgICAgICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCRyWydmdF9Ib3N0J10pID8gKHN0cmluZykkclsnZnRfSG9zdCddIDogJyc7CiAgICAgICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRyWydmdF9QYXRoJ10pID8gKHN0cmluZykkclsnZnRfUGF0aCddIDogJyc7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBpc3NldCgkclsnZnRfVGl0bGUnXSkgPyAoc3RyaW5nKSRyWydmdF9UaXRsZSddIDogJyc7CiAgICAgICAgICAgICAgICAka3cgPSBpc3NldCgkclsnZnRfS3cnXSkgPyAoc3RyaW5nKSRyWydmdF9LdyddIDogJyc7CiAgICAgICAgICAgICAgICAkZGVzYyA9IGlzc2V0KCRyWydmdF9EZXNjJ10pID8gKHN0cmluZykkclsnZnRfRGVzYyddIDogJyc7CiAgICAgICAgICAgICAgICAkdHBsID0gaXNzZXQoJHJbJ2Z0X1RwbCddKSA/IChzdHJpbmcpJHJbJ2Z0X1RwbCddIDogJyc7CiAgICAgICAgICAgICAgICAkdHMgPSBpc3NldCgkclsnZnRfVHMnXSkgPyBpbnR2YWwoJHJbJ2Z0X1RzJ10pIDogMDsKICAgICAgICAgICAgICAgICRzY2FubmVkRml4ZWQrKzsKICAgICAgICAgICAgICAgIGlmICgkc2Nhbm5lZEZpeGVkID4gJGxpbWl0KSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0aXRsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0c1VzZSA9ICgkdHMgPiAwKSA/ICR0cyA6ICRub3c7CiAgICAgICAgICAgICAgICBpZiAoaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCR0aXRsZSwgJHRzVXNlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNlZWRLZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGhvc3QgLiAnfCcgLiAkcGF0aCk7CiAgICAgICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6OkFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgnZml4ZWQnLCAkc2VlZEtleSwgZnVuY3Rpb24gKCkgdXNlICgkdGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRpdGxlOwogICAgICAgICAgICAgICAgfSwgMjApOwogICAgICAgICAgICAgICAgJGlkID0gaW50dmFsKCRyWydmdF9JRCddKTsKICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdCk7CiAgICAgICAgICAgICAgICAkcGF0aEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHBhdGgpOwogICAgICAgICAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdmFyaWFudCk7CiAgICAgICAgICAgICAgICAka3dFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrdyk7CiAgICAgICAgICAgICAgICAkZGVzY0VzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJGRlc2MpOwogICAgICAgICAgICAgICAgJHRwbEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRwbCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiVVBEQVRFIGAkdGFibGVGaXhlZGAgU0VUIGBmdF9UaXRsZWA9JyR0aXRsZUVzYycsYGZ0X0t3YD0nJGt3RXNjJyxgZnRfRGVzY2A9JyRkZXNjRXNjJyxgZnRfVHBsYD0nJHRwbEVzYycsYGZ0X1RzYD0iIC4gaW50dmFsKCRub3cpIC4gIiBXSEVSRSBgZnRfSURgPSIgLiBpbnR2YWwoJGlkKSAuICIgQU5EIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIEFORCBgZnRfUGF0aGA9JyRwYXRoRXNjJyIpOwogICAgICAgICAgICAgICAgICAgICR1cGRhdGVkRml4ZWQrKzsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZVNlcVJlY29yZFRhYmxlKCk7CiAgICAgICAgJHRhYmxlU2VxID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJzsKICAgICAgICAkbGFzdElkMiA9IDA7CiAgICAgICAgJHVwZGF0ZWRTZXEgPSAwOwogICAgICAgICRzY2FubmVkU2VxID0gMDsKICAgICAgICB3aGlsZSAoJHNjYW5uZWRTZXEgPCAkbGltaXQpIHsKICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJvd3MgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBgcmVjX0lEYCxgcmVjX1R5cGVgLGByZWNfS2V5YCxgcmVjX1RpdGxlYCxgcmVjX1RzYCBGUk9NIGAkdGFibGVTZXFgIFdIRVJFIGByZWNfSURgPiIgLiBpbnR2YWwoJGxhc3RJZDIpIC4gIiBPUkRFUiBCWSBgcmVjX0lEYCBBU0MgTElNSVQgODAwIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRyb3dzKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoJHJvd3MgYXMgJHIpIHsKICAgICAgICAgICAgICAgICRsYXN0SWQyID0gaXNzZXQoJHJbJ3JlY19JRCddKSA/IGludHZhbCgkclsncmVjX0lEJ10pIDogJGxhc3RJZDI7CiAgICAgICAgICAgICAgICAkdHlwZSA9IGlzc2V0KCRyWydyZWNfVHlwZSddKSA/IChzdHJpbmcpJHJbJ3JlY19UeXBlJ10gOiAnJzsKICAgICAgICAgICAgICAgICRrZXkgPSBpc3NldCgkclsncmVjX0tleSddKSA/IChzdHJpbmcpJHJbJ3JlY19LZXknXSA6ICcnOwogICAgICAgICAgICAgICAgJHRpdGxlID0gaXNzZXQoJHJbJ3JlY19UaXRsZSddKSA/IChzdHJpbmcpJHJbJ3JlY19UaXRsZSddIDogJyc7CiAgICAgICAgICAgICAgICAkdHMgPSBpc3NldCgkclsncmVjX1RzJ10pID8gaW50dmFsKCRyWydyZWNfVHMnXSkgOiAwOwogICAgICAgICAgICAgICAgJHNjYW5uZWRTZXErKzsKICAgICAgICAgICAgICAgIGlmICgkc2Nhbm5lZFNlcSA+ICRsaW1pdCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgkdGl0bGUpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0c1VzZSA9ICgkdHMgPiAwKSA/ICR0cyA6ICRub3c7CiAgICAgICAgICAgICAgICBpZiAoc2VsZjo6SW5zZXJ0VGl0bGVVc2VkT25jZSgkdGl0bGUsICR0c1VzZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0eXBlMiA9IHRyaW0oKHN0cmluZykkdHlwZSk7CiAgICAgICAgICAgICAgICAka2V5MiA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KTsKICAgICAgICAgICAgICAgICR2YXJpYW50ID0gc2VsZjo6QWNxdWlyZVVuaXF1ZVRpdGxlRm9yS2V5KCR0eXBlMiAhPT0gJycgPyAkdHlwZTIgOiAnc2VxJywgJGtleTIsIGZ1bmN0aW9uICgpIHVzZSAoJHRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgICAgICAgICAgICAgIH0sIDIwKTsKICAgICAgICAgICAgICAgICRpZCA9IGludHZhbCgkclsncmVjX0lEJ10pOwogICAgICAgICAgICAgICAgJHR5cGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0eXBlKTsKICAgICAgICAgICAgICAgICRrZXlFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrZXkpOwogICAgICAgICAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdmFyaWFudCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiVVBEQVRFIGAkdGFibGVTZXFgIFNFVCBgcmVjX1RpdGxlYD0nJHRpdGxlRXNjJyxgcmVjX1RzYD0iIC4gaW50dmFsKCRub3cpIC4gIiBXSEVSRSBgcmVjX0lEYD0iIC4gaW50dmFsKCRpZCkgLiAiIEFORCBgcmVjX1R5cGVgPSckdHlwZUVzYycgQU5EIGByZWNfS2V5YD0nJGtleUVzYyciKTsKICAgICAgICAgICAgICAgICAgICAkdXBkYXRlZFNlcSsrOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG91dFsnb2snXSA9IDE7CiAgICAgICAgJG91dFsnZml4ZWRfc2Nhbm5lZCddID0gJHNjYW5uZWRGaXhlZDsKICAgICAgICAkb3V0WydmaXhlZF91cGRhdGVkJ10gPSAkdXBkYXRlZEZpeGVkOwogICAgICAgICRvdXRbJ3NlcV9zY2FubmVkJ10gPSAkc2Nhbm5lZFNlcTsKICAgICAgICAkb3V0WydzZXFfdXBkYXRlZCddID0gJHVwZGF0ZWRTZXE7CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRGVsZXRlRml4ZWRUaXRsZVJlY29yZCgkaG9zdE9ubHksICRwYXRoID0gJy8nKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJHBhdGgpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnIHx8ICRwYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnOwogICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICRwYXRoRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkcGF0aCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJERUxFVEUgRlJPTSBgJHRhYmxlYCBXSEVSRSBgZnRfSG9zdGA9JyRob3N0RXNjJyBBTkQgYGZ0X1BhdGhgPSckcGF0aEVzYyciKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gVXBzZXJ0Rml4ZWRUaXRsZVJlY29yZCgkaG9zdE9ubHksICRwYXRoLCAkdGl0bGUsICRrdyA9ICcnLCAkZGVzYyA9ICcnLCAkdHBsID0gJycsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICRwYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoKHN0cmluZykkcGF0aCk7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgJGt3ID0gKHN0cmluZykka3c7CiAgICAgICAgJGRlc2MgPSAoc3RyaW5nKSRkZXNjOwogICAgICAgICR0cGwgPSAoc3RyaW5nKSR0cGw7CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRob3N0T25seSA9PT0gJycgfHwgJHBhdGggPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlRml4ZWRUaXRsZVRhYmxlKCk7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgJHBhdGhFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRwYXRoKTsKICAgICAgICAkdGl0bGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0aXRsZSk7CiAgICAgICAgJGt3RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygka3cpOwogICAgICAgICRkZXNjRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkZGVzYyk7CiAgICAgICAgJHRwbEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRwbCk7CiAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJTlRPIGAkdGFibGVgIChgZnRfSG9zdGAsYGZ0X1BhdGhgLGBmdF9UaXRsZWAsYGZ0X0t3YCxgZnRfRGVzY2AsYGZ0X1RwbGAsYGZ0X1RzYCkgVkFMVUVTICgnJGhvc3RFc2MnLCckcGF0aEVzYycsJyR0aXRsZUVzYycsJyRrd0VzYycsJyRkZXNjRXNjJywnJHRwbEVzYycsIiAuIGludHZhbCgkdHMpIC4gIikgT04gQ09ORkxJQ1QoYGZ0X0hvc3RgLGBmdF9QYXRoYCkgRE8gVVBEQVRFIFNFVCBgZnRfVGl0bGVgPWV4Y2x1ZGVkLmBmdF9UaXRsZWAsIGBmdF9Ld2A9ZXhjbHVkZWQuYGZ0X0t3YCwgYGZ0X0Rlc2NgPWV4Y2x1ZGVkLmBmdF9EZXNjYCwgYGZ0X1RwbGA9ZXhjbHVkZWQuYGZ0X1RwbGAsIGBmdF9Uc2A9ZXhjbHVkZWQuYGZ0X1RzYCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNxbCA9ICJJTlNFUlQgSU5UTyBgJHRhYmxlYCAoYGZ0X0hvc3RgLGBmdF9QYXRoYCxgZnRfVGl0bGVgLGBmdF9Ld2AsYGZ0X0Rlc2NgLGBmdF9UcGxgLGBmdF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJHBhdGhFc2MnLCckdGl0bGVFc2MnLCcka3dFc2MnLCckZGVzY0VzYycsJyR0cGxFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIGBmdF9UaXRsZWA9VkFMVUVTKGBmdF9UaXRsZWApLCBgZnRfS3dgPVZBTFVFUyhgZnRfS3dgKSwgYGZ0X0Rlc2NgPVZBTFVFUyhgZnRfRGVzY2ApLCBgZnRfVHBsYD1WQUxVRVMoYGZ0X1RwbGApLCBgZnRfVHNgPVZBTFVFUyhgZnRfVHNgKSI7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxRXhwb3J0TG9ja0ZpbGUoKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyIC4gJ3NlcV9leHBvcnQubG9jayc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxRXhwb3J0U3RhdGVGaWxlKCkKICAgIHsKICAgICAgICAkZGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICdzZXFfZXhwb3J0X3N0YXRlLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRTZXFFeHBvcnRTdGF0ZSgpCiAgICB7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFFeHBvcnRTdGF0ZUZpbGUoKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19maWxlKCRmaWxlKSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgaWYgKCEkcmF3KSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgIH0KICAgICAgICAkZCA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgIHJldHVybiBpc19hcnJheSgkZCkgPyAkZCA6IGFycmF5KCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVNlcUV4cG9ydFN0YXRlKCRzdGF0ZSkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydFN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkb3V0ID0ganNvbl9lbmNvZGUoJHN0YXRlLCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgaWYgKCRvdXQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJG91dCkgIT09IGZhbHNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEV4cG9ydFNlcVJlY29yZHNUb1R4dFN0ZXAoJG1heFNlY29uZHMgPSAxLjUsICRiYXRjaCA9IDIwMDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc2VsZjo6RW5zdXJlU2VxUmVjb3JkVGFibGUoKTsKICAgICAgICAkcmVjb3JkRGlyID0gc2VsZjo6R2V0UmVjb3JkRGlyKCk7CiAgICAgICAgJGNhY2hlRGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJHJlY29yZERpciA9PT0gJycgfHwgJGNhY2hlRGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29rJyA9PiAwLCAnZGV0YWlsJyA9PiAnZGlyJyk7CiAgICAgICAgfQogICAgICAgICRiYXRjaCA9IGludHZhbCgkYmF0Y2gpOwogICAgICAgIGlmICgkYmF0Y2ggPCAyMDApIHsKICAgICAgICAgICAgJGJhdGNoID0gMjAwOwogICAgICAgIH0KICAgICAgICBpZiAoJGJhdGNoID4gMjAwMDApIHsKICAgICAgICAgICAgJGJhdGNoID0gMjAwMDA7CiAgICAgICAgfQogICAgICAgICRtYXhTZWNvbmRzID0gZmxvYXR2YWwoJG1heFNlY29uZHMpOwogICAgICAgIGlmICgkbWF4U2Vjb25kcyA8IDAuMikgewogICAgICAgICAgICAkbWF4U2Vjb25kcyA9IDAuMjsKICAgICAgICB9CiAgICAgICAgJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICRzdGF0ZSA9IHNlbGY6OkxvYWRTZXFFeHBvcnRTdGF0ZSgpOwogICAgICAgICR0eXBlcyA9IGFycmF5KCdmYW55bXVybCcsICdmYW5tbHVybCcsICdmYW5ueXVybCcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHN0YXRlKSB8fCBlbXB0eSgkc3RhdGUpIHx8IGVtcHR5KCRzdGF0ZVsnY3ljbGUnXSkgfHwgZW1wdHkoJHN0YXRlWyd0eXBlcyddKSB8fCAhaXNfYXJyYXkoJHN0YXRlWyd0eXBlcyddKSkgewogICAgICAgICAgICAkY3ljbGUgPSB0aW1lKCk7CiAgICAgICAgICAgICRzdGF0ZSA9IGFycmF5KCdjeWNsZScgPT4gJGN5Y2xlLCAndHlwZXMnID0+IGFycmF5KCkpOwogICAgICAgICAgICBmb3JlYWNoICgkdHlwZXMgYXMgJHQpIHsKICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdF0gPSBhcnJheSgnbGFzdCcgPT4gMCwgJ2RvbmUnID0+IDAsICdwYXJ0JyA9PiAkY2FjaGVEaXIgLiAkdCAuICcuJyAuICRjeWNsZSAuICcucGFydCcpOwogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSwgJycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHN0YXRlWyd0eXBlcyddWyR0eXBlXSkgfHwgIWlzX2FycmF5KCRzdGF0ZVsndHlwZXMnXVskdHlwZV0pKSB7CiAgICAgICAgICAgICAgICAkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdID0gYXJyYXkoJ2xhc3QnID0+IDAsICdkb25lJyA9PiAwLCAncGFydCcgPT4gJGNhY2hlRGlyIC4gJHR5cGUgLiAnLicgLiBpbnR2YWwoJHN0YXRlWydjeWNsZSddKSAuICcucGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZW1wdHkoJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnZG9uZSddKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnQgPSBpc3NldCgkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydwYXJ0J10pID8gKHN0cmluZykkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydwYXJ0J10gOiAnJzsKICAgICAgICAgICAgaWYgKCRwYXJ0ID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhcnQgPSAkY2FjaGVEaXIgLiAkdHlwZSAuICcuJyAuIGludHZhbCgkc3RhdGVbJ2N5Y2xlJ10pIC4gJy5wYXJ0JzsKICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdHlwZV1bJ3BhcnQnXSA9ICRwYXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkcGFydCwgJ2FiJyk7CiAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbGFzdElkID0gaXNzZXQoJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnbGFzdCddKSA/IGludHZhbCgkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydsYXN0J10pIDogMDsKICAgICAgICAgICAgaWYgKCRsYXN0SWQgPCAwKSB7CiAgICAgICAgICAgICAgICAkbGFzdElkID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdHlwZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHR5cGUpOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgJHNxbCA9ICJTRUxFQ1QgYHJlY19JRGAsYHJlY19LZXlgLGByZWNfVGl0bGVgIEZST00gYCR0YWJsZWAgV0hFUkUgYHJlY19UeXBlYD0nJHR5cGVFc2MnIEFORCBgcmVjX0lEYD4iIC4gaW50dmFsKCRsYXN0SWQpIC4gIiBPUkRFUiBCWSBgcmVjX0lEYCBBU0MgTElNSVQgIiAuIGludHZhbCgkYmF0Y2gpOwogICAgICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkcm93cyA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRyb3dzKSkgewogICAgICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdHlwZV1bJ2RvbmUnXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93cyBhcyAkcikgewogICAgICAgICAgICAgICAgICAgICRyaWQgPSBpc3NldCgkclsncmVjX0lEJ10pID8gaW50dmFsKCRyWydyZWNfSUQnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmlkID4gJGxhc3RJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbGFzdElkID0gJHJpZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGsgPSBpc3NldCgkclsncmVjX0tleSddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgoc3RyaW5nKSRyWydyZWNfS2V5J10pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgJHR0ID0gaXNzZXQoJHJbJ3JlY19UaXRsZSddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKChzdHJpbmcpJHJbJ3JlY19UaXRsZSddKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkayA9PT0gJycgfHwgJHR0ID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQGZ3cml0ZSgkZnAsICRrIC4gJ3wnIC4gJHR0IC4gIlxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydsYXN0J10gPSAkbGFzdElkOwogICAgICAgICAgICAgICAgaWYgKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCA+ICRtYXhTZWNvbmRzKSB7CiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgICAgIHNlbGY6OlNhdmVTZXFFeHBvcnRTdGF0ZSgkc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDEsICdkZXRhaWwnID0+ICdwYXJ0aWFsJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJHJvd3MpIDwgJGJhdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnZG9uZSddID0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIGlmIChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQgPiAkbWF4U2Vjb25kcykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGFsbERvbmUgPSB0cnVlOwogICAgICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdCkgewogICAgICAgICAgICBpZiAoZW1wdHkoJHN0YXRlWyd0eXBlcyddWyR0XVsnZG9uZSddKSkgewogICAgICAgICAgICAgICAgJGFsbERvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJGFsbERvbmUpIHsKICAgICAgICAgICAgc2VsZjo6U2F2ZVNlcUV4cG9ydFN0YXRlKCRzdGF0ZSk7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDEsICdkZXRhaWwnID0+ICdwYXJ0aWFsJyk7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdCkgewogICAgICAgICAgICAkcGFydCA9IGlzc2V0KCRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSkgPyAoc3RyaW5nKSRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSA6ICcnOwogICAgICAgICAgICBpZiAoJHBhcnQgPT09ICcnIHx8ICFpc19maWxlKCRwYXJ0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRzdCA9ICRyZWNvcmREaXIgLiAkdCAuICcudHh0JzsKICAgICAgICAgICAgJHRtcCA9ICRkc3QgLiAnLnRtcCc7CiAgICAgICAgICAgIEB1bmxpbmsoJHRtcCk7CiAgICAgICAgICAgIEByZW5hbWUoJHBhcnQsICR0bXApOwogICAgICAgICAgICBAdW5saW5rKCRkc3QpOwogICAgICAgICAgICBAcmVuYW1lKCR0bXAsICRkc3QpOwogICAgICAgIH0KICAgICAgICAkc3RhdGVGaWxlID0gc2VsZjo6R2V0U2VxRXhwb3J0U3RhdGVGaWxlKCk7CiAgICAgICAgaWYgKCRzdGF0ZUZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJHN0YXRlRmlsZSkpIHsKICAgICAgICAgICAgQHVubGluaygkc3RhdGVGaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMSwgJ2RldGFpbCcgPT4gJ2RvbmUnKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNYW51YWxFeHBvcnRTZXFSZWNvcmRzVG9UeHQoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRsb2NrRmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydExvY2tGaWxlKCk7CiAgICAgICAgaWYgKCRsb2NrRmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMCwgJ2RldGFpbCcgPT4gJ2xvY2snKTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRsb2NrRmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDAsICdkZXRhaWwnID0+ICdsb2NrJyk7CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwLCBMT0NLX0VYKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29rJyA9PiAwLCAnZGV0YWlsJyA9PiAnbG9jaycpOwogICAgICAgIH0KICAgICAgICAkc3RhdGVGaWxlID0gc2VsZjo6R2V0U2VxRXhwb3J0U3RhdGVGaWxlKCk7CiAgICAgICAgaWYgKCRzdGF0ZUZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJHN0YXRlRmlsZSkpIHsKICAgICAgICAgICAgQHVubGluaygkc3RhdGVGaWxlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2V0X3RpbWVfbGltaXQnKSkgewogICAgICAgICAgICBAc2V0X3RpbWVfbGltaXQoMCk7CiAgICAgICAgfQogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRyID0gc2VsZjo6RXhwb3J0U2VxUmVjb3Jkc1RvVHh0U3RlcCgzMC4wLCA4MDAwKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCRyWydvayddKSB8fCAoaXNzZXQoJHJbJ2RldGFpbCddKSAmJiAkclsnZGV0YWlsJ10gPT09ICdkb25lJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc3NldCgkclsnZGV0YWlsJ10pICYmICRyWydkZXRhaWwnXSA9PT0gJ3BhcnRpYWwnKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICRzZXR0aW5nWydzZXFfZXhwb3J0X2xhc3QnXSA9IHRpbWUoKTsKICAgICAgICAkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZyA9ICRzZXR0aW5nOwogICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMSwgJ2RldGFpbCcgPT4gJ2RvbmUnKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNYXliZUF1dG9FeHBvcnRTZXFSZWNvcmRzKCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR6YnAtPkNoZWNrUmlnaHRzKCdyb290JykgJiYgISR6YnAtPkNoZWNrUmlnaHRzKCdhZG1pbicpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZW5hYmxlZCA9IGludHZhbChDeXFpeWV6aGFuKCdzZXFfZXhwb3J0X2VuYWJsZScsIDApKTsKICAgICAgICBpZiAoJGVuYWJsZWQgIT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkaW50ZXJ2YWwgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9pbnRlcnZhbCcsIDM2MDApKTsKICAgICAgICBpZiAoJGludGVydmFsIDwgMzAwKSB7CiAgICAgICAgICAgICRpbnRlcnZhbCA9IDMwMDsKICAgICAgICB9CiAgICAgICAgJGxhc3QgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9sYXN0JywgMCkpOwogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCRsYXN0ID4gMCAmJiAoJG5vdyAtICRsYXN0KSA8ICRpbnRlcnZhbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRsb2NrRmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydExvY2tGaWxlKCk7CiAgICAgICAgaWYgKCRsb2NrRmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGxvY2tGaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCB8IExPQ0tfTkIpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGxhc3QgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9sYXN0JywgMCkpOwogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCRsYXN0ID4gMCAmJiAoJG5vdyAtICRsYXN0KSA8ICRpbnRlcnZhbCkgewogICAgICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRyID0gc2VsZjo6RXhwb3J0U2VxUmVjb3Jkc1RvVHh0U3RlcCgxLjIsIDE1MDApOwogICAgICAgIGlmICghZW1wdHkoJHJbJ29rJ10pICYmIGlzc2V0KCRyWydkZXRhaWwnXSkgJiYgJHJbJ2RldGFpbCddID09PSAnZG9uZScpIHsKICAgICAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICAgICAkc2V0dGluZ1snc2VxX2V4cG9ydF9sYXN0J10gPSB0aW1lKCk7CiAgICAgICAgICAgICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nID0gJHNldHRpbmc7CiAgICAgICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICB9CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldE1haW5Eb21haW5DZmdDYWNoZUZpbGUoKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyIC4gJ21haW5fZG9tYWluX2NmZ19jYWNoZS5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVNYWluRG9tYWluKCRkb21haW4pCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oKHN0cmluZykkZG9tYWluKTsKICAgICAgICBpZiAoJGRvbWFpbiA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gc3RyX2lyZXBsYWNlKGFycmF5KCdodHRwOi8vJywgJ2h0dHBzOi8vJyksICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjLy4qJCMnLCAnJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAiLiBcdFxuXHJcMFx4MEIiKTsKICAgICAgICAkZG9tYWluID0gc3RydG9sb3dlcigoc3RyaW5nKSRkb21haW4pOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXnd3d1wuIycsICRkb21haW4pKSB7CiAgICAgICAgICAgICRkb21haW4gPSBzdWJzdHIoJGRvbWFpbiwgNCk7CiAgICAgICAgfQogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1teYS16MC05XC5cLV0jJywgJGRvbWFpbikpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjXC4rIycsICcuJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oJGRvbWFpbiwgJy4nKTsKICAgICAgICByZXR1cm4gJGRvbWFpbjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVEb21haW5QYXR0ZXJuKCRkb21haW4pCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oKHN0cmluZykkZG9tYWluKTsKICAgICAgICBpZiAoJGRvbWFpbiA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gc3RyX2lyZXBsYWNlKGFycmF5KCdodHRwOi8vJywgJ2h0dHBzOi8vJyksICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjLy4qJCMnLCAnJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAiLiBcdFxuXHJcMFx4MEIiKTsKICAgICAgICAkZG9tYWluID0gc3RydG9sb3dlcigoc3RyaW5nKSRkb21haW4pOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXnd3d1wuIycsICRkb21haW4pKSB7CiAgICAgICAgICAgICRkb21haW4gPSBzdWJzdHIoJGRvbWFpbiwgNCk7CiAgICAgICAgfQogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1teYS16MC05XC5cLVwqXSMnLCAkZG9tYWluKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRkb21haW4gPSBwcmVnX3JlcGxhY2UoJyNcLisjJywgJy4nLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAnLicpOwogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbGFiZWxzID0gZXhwbG9kZSgnLicsICRkb21haW4pOwogICAgICAgIGZvcmVhY2ggKCRsYWJlbHMgYXMgJGxiKSB7CiAgICAgICAgICAgIGlmICgkbGIgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRsYiAhPT0gJyonICYmIHN0cnBvcygkbGIsICcqJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkdG1wID0gc3RyX3JlcGxhY2UoJyonLCAnJywgJGxiKTsKICAgICAgICAgICAgICAgIGlmICgkdG1wID09PSAnJyAmJiAkbGIgIT09ICcqJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGxiICE9PSAnKicgJiYgcHJlZ19tYXRjaCgnI15cLXxcLSQjJywgJGxiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZG9tYWluOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIERvbWFpblBhdHRlcm5Ub1JlZ2V4KCRwYXR0ZXJuKQogICAgewogICAgICAgICRwYXR0ZXJuID0gKHN0cmluZykkcGF0dGVybjsKICAgICAgICBpZiAoJHBhdHRlcm4gPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGxhYmVscyA9IGV4cGxvZGUoJy4nLCAkcGF0dGVybik7CiAgICAgICAgJHJlTGFiZWxzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkbGFiZWxzIGFzICRsYikgewogICAgICAgICAgICBpZiAoJGxiID09PSAnKicpIHsKICAgICAgICAgICAgICAgICRyZUxhYmVsc1tdID0gJ1teXC5dKyc7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJwb3MoJGxiLCAnKicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHJlTGFiZWxzW10gPSBzdHJfcmVwbGFjZSgnXConLCAnW15cLl0qJywgcHJlZ19xdW90ZSgkbGIsICcjJykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlTGFiZWxzW10gPSBwcmVnX3F1b3RlKCRsYiwgJyMnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyNeJyAuIGltcGxvZGUoJ1wuJywgJHJlTGFiZWxzKSAuICckI2knOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIERvbWFpblBhdHRlcm5XZWlnaHQoJHBhdHRlcm4pCiAgICB7CiAgICAgICAgJHBhdHRlcm4gPSAoc3RyaW5nKSRwYXR0ZXJuOwogICAgICAgICR3aWxkID0gc3Vic3RyX2NvdW50KCRwYXR0ZXJuLCAnKicpOwogICAgICAgICRsZW4gPSBzdHJsZW4oJHBhdHRlcm4pOwogICAgICAgIHJldHVybiBhcnJheSgkd2lsZCwgLSRsZW4pOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIElzRm9yY2VkUmFuZG9tVGl0bGVQYXRoKCRwYXRoKQogICAgewogICAgICAgICRwYXRoID0gKHN0cmluZykkcGF0aDsKICAgICAgICBpZiAoJHBhdGggPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoICE9PSAnLycpIHsKICAgICAgICAgICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyQjJywgJycsICRwYXRoKTsKICAgICAgICAgICAgaWYgKCRwYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeL1thLXowLTldezQsMjB9Lz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfVwuaHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14vW2EtejAtOV17NCwyMH1odG1sLz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfS9bMS05XVxkezEsMn1odG1sLz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfS9bMS05XVxkezEsMn1cLmh0bWwvPyQjaScsICRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeL1thLXowLTldezQsMjB9L1thLXowLTldezQsMjB9aHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14vW2EtejAtOV17NCwyMH0vW2EtejAtOV17NCwyMH1cLmh0bWwvPyQjaScsICRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIENsZWFyTWFpbkRvbWFpbkNvbmZpZ0NhY2hlKCkKICAgIHsKICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlID0gbnVsbDsKICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9IDA7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRNYWluRG9tYWluQ2ZnQ2FjaGVGaWxlKCk7CiAgICAgICAgaWYgKCRmaWxlICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBMb2FkTWFpbkRvbWFpbkNvbmZpZ3MoJGZvcmNlID0gZmFsc2UpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJG5vdyA9IHRpbWUoKTsKICAgICAgICBpZiAoISRmb3JjZSAmJiBpc19hcnJheShzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlKSAmJiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA+IDApIHsKICAgICAgICAgICAgaWYgKHNlbGY6OiRtYWluRG9tYWluQ2ZnQ2FjaGVUdGwgPD0gMCB8fCAoJG5vdyAtIHNlbGY6OiRtYWluRG9tYWluQ2ZnQ2FjaGVUaW1lKSA8PSBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVHRsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldE1haW5Eb21haW5DZmdDYWNoZUZpbGUoKTsKICAgICAgICBpZiAoISRmb3JjZSAmJiAkZmlsZSAmJiBpc19maWxlKCRmaWxlKSAmJiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVHRsID4gMCkgewogICAgICAgICAgICAkbXQgPSBAZmlsZW10aW1lKCRmaWxlKTsKICAgICAgICAgICAgaWYgKCRtdCAmJiAoJG5vdyAtICRtdCkgPD0gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZVR0bCkgewogICAgICAgICAgICAgICAgJHJhdyA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHJhdykgewogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWydleGFjdCddKSAmJiAhaXNzZXQoJGRhdGFbJ3BhdHRlcm5zJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGFycmF5KCdleGFjdCcgPT4gJGRhdGEsICdwYXR0ZXJucycgPT4gYXJyYXkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZSA9ICRkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9ICRub3c7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgICAgICRsaXN0ID0gYXJyYXkoJ2V4YWN0JyA9PiBhcnJheSgpLCAncGF0dGVybnMnID0+IGFycmF5KCkpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRzcWwgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+c2VsZWN0KCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2RvbWFpbmNmZycpLT5jb2x1bW4oJ2RvbV9Eb21haW4sZG9tX1RpdGxlLGRvbV9UZW1wbGF0ZSxkb21fU0VPLGRvbV9Jc0VuYWJsZScpLT5zcWw7CiAgICAgICAgICAgICRyb3dzID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHJvd3MpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93cyBhcyAkcikgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gaXNzZXQoJHJbJ2RvbV9Eb21haW4nXSkgPyBzZWxmOjpOb3JtYWxpemVEb21haW5QYXR0ZXJuKCRyWydkb21fRG9tYWluJ10pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXR0ZXJuID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHNlbyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRyWydkb21fU0VPJ10pICYmICRyWydkb21fU0VPJ10gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSBqc29uX2RlY29kZSgoc3RyaW5nKSRyWydkb21fU0VPJ10sIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHRtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZW8gPSAkdG1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRpdGVtID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW4nID0+ICRwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+IGlzc2V0KCRyWydkb21fVGl0bGUnXSkgPyAoc3RyaW5nKSRyWydkb21fVGl0bGUnXSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAndGVtcGxhdGUnID0+IGlzc2V0KCRyWydkb21fVGVtcGxhdGUnXSkgPyAoc3RyaW5nKSRyWydkb21fVGVtcGxhdGUnXSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcgPT4gaXNzZXQoJHJbJ2RvbV9Jc0VuYWJsZSddKSA/IGludHZhbCgkclsnZG9tX0lzRW5hYmxlJ10pIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbycgPT4gJHNlbywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHBhdHRlcm4sICcqJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZSA9IHNlbGY6OkRvbWFpblBhdHRlcm5Ub1JlZ2V4KCRwYXR0ZXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWydyZSddID0gJHJlOwogICAgICAgICAgICAgICAgICAgICAgICAkdyA9IHNlbGY6OkRvbWFpblBhdHRlcm5XZWlnaHQoJHBhdHRlcm4pOwogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndzEnXSA9ICR3WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndzInXSA9ICR3WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkbGlzdFsncGF0dGVybnMnXVtdID0gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGQgPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRwYXR0ZXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRkID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ2RvbWFpbiddID0gJGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0WydleGFjdCddWyRkXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRsaXN0WydwYXR0ZXJucyddKSkgewogICAgICAgICAgICB1c29ydCgkbGlzdFsncGF0dGVybnMnXSwgZnVuY3Rpb24gKCRhLCAkYikgewogICAgICAgICAgICAgICAgJGExID0gaXNzZXQoJGFbJ3cxJ10pID8gaW50dmFsKCRhWyd3MSddKSA6IDA7CiAgICAgICAgICAgICAgICAkYjEgPSBpc3NldCgkYlsndzEnXSkgPyBpbnR2YWwoJGJbJ3cxJ10pIDogMDsKICAgICAgICAgICAgICAgIGlmICgkYTEgIT09ICRiMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoJGExIDwgJGIxKSA/IC0xIDogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRhMiA9IGlzc2V0KCRhWyd3MiddKSA/IGludHZhbCgkYVsndzInXSkgOiAwOwogICAgICAgICAgICAgICAgJGIyID0gaXNzZXQoJGJbJ3cyJ10pID8gaW50dmFsKCRiWyd3MiddKSA6IDA7CiAgICAgICAgICAgICAgICBpZiAoJGEyICE9PSAkYjIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRhMiA8ICRiMikgPyAtMSA6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyY21wKChzdHJpbmcpJGFbJ2RvbWFpbiddLCAoc3RyaW5nKSRiWydkb21haW4nXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlID0gJGxpc3Q7CiAgICAgICAgc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZVRpbWUgPSAkbm93OwogICAgICAgIGlmICgkZmlsZSkgewogICAgICAgICAgICAkcmF3ID0ganNvbl9lbmNvZGUoJGxpc3QsIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwogICAgICAgICAgICBpZiAoJHJhdykgewogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkcmF3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkYWxsID0gc2VsZjo6TG9hZE1haW5Eb21haW5Db25maWdzKGZhbHNlKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRhbGwpIHx8IGVtcHR5KCRhbGwpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzc2V0KCRhbGxbJ2V4YWN0J10pICYmICFpc3NldCgkYWxsWydwYXR0ZXJucyddKSkgewogICAgICAgICAgICAkYWxsID0gYXJyYXkoJ2V4YWN0JyA9PiAkYWxsLCAncGF0dGVybnMnID0+IGFycmF5KCkpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJGFsbFsnZXhhY3QnXVskaG9zdE9ubHldKSAmJiBpc19hcnJheSgkYWxsWydleGFjdCddWyRob3N0T25seV0pKSB7CiAgICAgICAgICAgICRjZmcgPSAkYWxsWydleGFjdCddWyRob3N0T25seV07CiAgICAgICAgICAgIGlmICghZW1wdHkoJGNmZ1snZW5hYmxlZCddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjZmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkYWxsWydwYXR0ZXJucyddKSAmJiBpc19hcnJheSgkYWxsWydwYXR0ZXJucyddKSkgewogICAgICAgICAgICBmb3JlYWNoICgkYWxsWydwYXR0ZXJucyddIGFzICRpdCkgewogICAgICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkaXQpIHx8IGVtcHR5KCRpdFsnZW5hYmxlZCddKSB8fCBlbXB0eSgkaXRbJ3JlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goKHN0cmluZykkaXRbJ3JlJ10sICRob3N0T25seSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBSZXBsYWNlT3JJbnNlcnRIdG1sTWV0YSgkaHRtbCwgJG5hbWUsICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZSA9IHRyaW0oKHN0cmluZykkdmFsdWUpOwogICAgICAgICAgICBpZiAoJHZhbHVlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRodG1sOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcgJywgJHZhbHVlKSwgRU5UX1FVT1RFUywgJ1VURi04Jyk7CiAgICAgICAgICAgICRtZXRhID0gJzxtZXRhIG5hbWU9IicgLiBodG1sc3BlY2lhbGNoYXJzKCRuYW1lLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSAuICciIGNvbnRlbnQ9IicgLiAkdmFsdWUgLiAnIiAvPic7CiAgICAgICAgICAgICRwYXR0ZXJuID0gJyM8bWV0YVxiW14+XSpuYW1lXHMqPVxzKihbXCJcJ10pJyAuIHByZWdfcXVvdGUoJG5hbWUsICcjJykgLiAnXDFbXj5dKj4jaSc7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRwYXR0ZXJuLCAkaHRtbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJHBhdHRlcm4sICRtZXRhLCAkaHRtbCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGh0bWwsICc8L2hlYWQ+JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZ19yZXBsYWNlKCcjPC9oZWFkPiNpJywgJG1ldGEgLiAnPC9oZWFkPicsICRodG1sLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJG1ldGEgLiAkaHRtbDsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldERpcmVjdEhvc3RIdG1sQmFzZURpcigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbF9wYWdlcy8nOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RXJqaW11bHVIdG1sQmFzZURpcigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbF9tdWx1Lyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBJc0VyamltdWx1UWl5b25nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpbnR2YWwoQ3lxaXllemhhbignZXJqaW11bHVfcWl5b25nJywgMCkpID09PSAxOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSXNFcmppbXVsdU1haW5Ib3N0KCRob3N0T25seSkKICAgICAgICB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAgICAgJHJvb3REb21haW4gPSBzZWxmOjpHZXREaXJlY3RIb3N0UGFnZVJvb3REb21haW4oKTsKICAgICAgICAgICAgcmV0dXJuICRob3N0T25seSAhPT0gJycgJiYgJHJvb3REb21haW4gIT09ICcnICYmICRob3N0T25seSA9PT0gJHJvb3REb21haW47CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBQYXJzZUVyamltdWx1UmVxdWVzdFBhdGgoJHJlcXVlc3RQYXRoKQogICAgICAgIHsKICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gc2VsZjo6Tm9ybWFsaXplRGlyZWN0SG9zdFJlcXVlc3RQYXRoKCRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICghcHJlZ19tYXRjaCgnI14vKFthLXpBLVowLTldW2EtekEtWjAtOS5fLV0qXC4oPzpodG1sfGh0bSkpJCNpJywgJHJlcXVlc3RQYXRoLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHN0cmluZykkbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJlc29sdmVFcmppbXVsdVBhZ2VQYXRoKCRyZXF1ZXN0UGF0aCkKICAgICAgICB7CiAgICAgICAgICAgICRiYXNlRGlyID0gc2VsZjo6R2V0RXJqaW11bHVIdG1sQmFzZURpcigpOwogICAgICAgICAgICAkYmFzZVJlYWwgPSByZWFscGF0aCgkYmFzZURpcik7CiAgICAgICAgICAgIGlmICghJGJhc2VSZWFsIHx8ICFpc19kaXIoJGJhc2VSZWFsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmaWxlTmFtZSA9IHNlbGY6OlBhcnNlRXJqaW11bHVSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICBpZiAoJGZpbGVOYW1lID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRiYXNlUmVhbCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGJhc2VSZWFsKTsKICAgICAgICAgICAgJHBhdGggPSBzZWxmOjpTYWZlSm9pblBhdGgoJGJhc2VSZWFsLCAkZmlsZU5hbWUpOwogICAgICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWFsID0gcmVhbHBhdGgoJHBhdGgpOwogICAgICAgICAgICBpZiAoISRyZWFsIHx8ICFpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWFsTm9ybSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJlYWwpOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkcmVhbE5vcm0sICRiYXNlUmVhbCAuICcvJykgIT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHJlYWw7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBUcnlPdXRwdXRFcmppbXVsdVBhZ2UoJGhvc3RPbmx5LCAkcmVxdWVzdFBhdGggPSAnLycsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXNlbGY6OklzRXJqaW11bHVRaXlvbmcoKSB8fCAhc2VsZjo6SXNFcmppbXVsdU1haW5Ib3N0KCRob3N0T25seSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9IHNlbGY6OlJlc29sdmVFcmppbXVsdVBhZ2VQYXRoKCRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaHRtbCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRodG1sKSB8fCAkaHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBtYXgtYWdlPTAnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignUHJhZ21hOiBuby1jYWNoZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSgyMDApOwogICAgICAgICAgICAkaHRtbCA9IHNlbGY6OlJlcGxhY2VNYW51YWxUZW1wbGF0ZVRhZ3MoJGh0bWwpOwogICAgICAgICAgICBlY2hvIHNlbGY6OlBzZXVkb09yaWdpbmFsSHRtbCgkaHRtbCwgYXJyYXkoCiAgICAgICAgICAgICAgICAnaG9zdCcgPT4gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpLAogICAgICAgICAgICAgICAgJ3VybCcgPT4gKHN0cmluZykkY3VycmVudFVybCwKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIGRpZSgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCR6YnAtPmhvc3QpID8gKHN0cmluZykkemJwLT5ob3N0IDogJyc7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGFyc2VkSG9zdCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRwYXJzZWRIb3N0KSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IChzdHJpbmcpJHBhcnNlZEhvc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdCk7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBPbiBzdWJkb21haW4gcmVxdWVzdHMsICR6YnAtPmhvc3QgbWF5IGFscmVhZHkgYmUgdGhlIGN1cnJlbnQgaG9zdC4KICAgICAgICAgICAgLy8gTm9ybWFsaXplIGl0IGJhY2sgdG8gdGhlIGFwZXgvcm9vdCBkb21haW4gc28gZGlyZWN0LWhvc3Qgcm91dGluZwogICAgICAgICAgICAvLyBkb2VzIG5vdCBpbmNvcnJlY3RseSB0cmVhdCB0aGUgY3VycmVudCBzdWJkb21haW4gYXMgdGhlIG1haW4gaG9zdC4KICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3QpKSB7CiAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcuJywgJGhvc3QpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPj0gMykgewogICAgICAgICAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSBpbXBsb2RlKCcuJywgJHBhcnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGhvc3Q7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXREaXJlY3RIb3N0UGFnZUtleXMoJGhvc3RPbmx5KQogICAgICAgIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGtleXMgPSBhcnJheSgkaG9zdE9ubHkpOwogICAgICAgICAgICAkcm9vdERvbWFpbiA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlUm9vdERvbWFpbigpOwogICAgICAgICAgICBpZiAoJHJvb3REb21haW4gIT09ICcnICYmICRob3N0T25seSAhPT0gJHJvb3REb21haW4pIHsKICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGhvc3RPbmx5LCAtc3RybGVuKCcuJyAuICRyb290RG9tYWluKSkgPT09ICcuJyAuICRyb290RG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgJHN1YiA9IHN1YnN0cigkaG9zdE9ubHksIDAsIC1zdHJsZW4oJy4nIC4gJHJvb3REb21haW4pKTsKICAgICAgICAgICAgICAgICAgICAkc3ViID0gdHJpbSgoc3RyaW5nKSRzdWIsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzdWIgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRrZXlzW10gPSAkc3ViOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkY2xlYW4gPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICAgICAka2V5ID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJGtleSkpOwogICAgICAgICAgICAgICAgaWYgKCRrZXkgPT09ICcnIHx8ICFwcmVnX21hdGNoKCcjXlthLXowLTldW2EtejAtOVwuXC1fXSokIycsICRrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY2xlYW5bJGtleV0gPSAka2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheV92YWx1ZXMoJGNsZWFuKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIE5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpCiAgICAgICAgewogICAgICAgICAgICAkcmVxdWVzdFBhdGggPSB0cmltKChzdHJpbmcpJHJlcXVlc3RQYXRoKTsKICAgICAgICAgICAgaWYgKCRyZXF1ZXN0UGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnNlZCA9IEBwYXJzZV91cmwoJHJlcXVlc3RQYXRoKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwYXJzZWQpICYmIGlzc2V0KCRwYXJzZWRbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICRyZXF1ZXN0UGF0aCA9IChzdHJpbmcpJHBhcnNlZFsncGF0aCddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcmVxdWVzdFBhdGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICAkcmVxdWVzdFBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICAkcmVxdWVzdFBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyMnLCAnLycsICRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcmVxdWVzdFBhdGhbMF0gIT09ICcvJykgewogICAgICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gJy8nIC4gJHJlcXVlc3RQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkcmVxdWVzdFBhdGg7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBTYWZlSm9pblBhdGgoJGJhc2VEaXIsICRyZWxhdGl2ZVBhdGgpCiAgICAgICAgewogICAgICAgICAgICAkYmFzZURpciA9IHJ0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgKHN0cmluZykkYmFzZURpciksICcvJyk7CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSB0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgKHN0cmluZykkcmVsYXRpdmVQYXRoKSk7CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLycpOwogICAgICAgICAgICBpZiAoJGJhc2VEaXIgPT09ICcnIHx8ICRyZWxhdGl2ZVBhdGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkcmVsYXRpdmVQYXRoLCAnLi4nKSAhPT0gZmFsc2UgfHwgcHJlZ19tYXRjaCgnI1teYS16QS1aMC05L19cLlwtXSMnLCAkcmVsYXRpdmVQYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkYmFzZURpciAuICcvJyAuICRyZWxhdGl2ZVBhdGg7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBSZXNvbHZlRGlyZWN0SG9zdFBhZ2VQYXRoKCRob3N0T25seSwgJHJlcXVlc3RQYXRoID0gJy8nKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgJGJhc2VSZWFsID0gcmVhbHBhdGgoJGJhc2VEaXIpOwogICAgICAgICAgICBpZiAoISRiYXNlUmVhbCB8fCAhaXNfZGlyKCRiYXNlUmVhbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYmFzZVJlYWwgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRiYXNlUmVhbCk7CiAgICAgICAgICAgICRyZXF1ZXN0UGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICAka2V5cyA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlS2V5cygkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGtleXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNhbmRpZGF0ZXMgPSBhcnJheSgpOwogICAgICAgICAgICBpZiAoJHJlcXVlc3RQYXRoID09PSAnLycgfHwgJHJlcXVlc3RQYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAka2V5IC4gJy9pbmRleC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJGtleSAuICcuaHRtbCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVsUGF0aCA9IGx0cmltKCRyZXF1ZXN0UGF0aCwgJy8nKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJGtleSAuICcvJyAuICRyZWxQYXRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gc2VsZjo6U2FmZUpvaW5QYXRoKCRiYXNlUmVhbCwgJGNhbmRpZGF0ZSk7CiAgICAgICAgICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlYWwgPSByZWFscGF0aCgkcGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoISRyZWFsIHx8ICFpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlYWxOb3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVhbCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkcmVhbE5vcm0sICRiYXNlUmVhbCAuICcvJykgIT09IDAgJiYgc3RydG9sb3dlcigkcmVhbE5vcm0pICE9PSBzdHJ0b2xvd2VyKCRiYXNlUmVhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkcmVhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRNaW1lVHlwZUJ5UGF0aCgkcGF0aCkKICAgICAgICB7CiAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKChzdHJpbmcpcGF0aGluZm8oKHN0cmluZykkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgICAgICRtYXAgPSBhcnJheSgKICAgICAgICAgICAgICAgICdodG1sJyA9PiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICdodG0nID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ2NzcycgPT4gJ3RleHQvY3NzOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICdqcycgPT4gJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ2pzb24nID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICd4bWwnID0+ICdhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ3R4dCcgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ3N2ZycgPT4gJ2ltYWdlL3N2Zyt4bWwnLAogICAgICAgICAgICAgICAgJ2ljbycgPT4gJ2ltYWdlL3gtaWNvbicsCiAgICAgICAgICAgICAgICAncG5nJyA9PiAnaW1hZ2UvcG5nJywKICAgICAgICAgICAgICAgICdqcGcnID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICAgICAnZ2lmJyA9PiAnaW1hZ2UvZ2lmJywKICAgICAgICAgICAgICAgICd3ZWJwJyA9PiAnaW1hZ2Uvd2VicCcsCiAgICAgICAgICAgICAgICAnYm1wJyA9PiAnaW1hZ2UvYm1wJywKICAgICAgICAgICAgICAgICd3b2ZmJyA9PiAnZm9udC93b2ZmJywKICAgICAgICAgICAgICAgICd3b2ZmMicgPT4gJ2ZvbnQvd29mZjInLAogICAgICAgICAgICAgICAgJ3R0ZicgPT4gJ2ZvbnQvdHRmJywKICAgICAgICAgICAgICAgICdvdGYnID0+ICdmb250L290ZicsCiAgICAgICAgICAgICAgICAnZW90JyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLAogICAgICAgICAgICAgICAgJ3BkZicgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChpc3NldCgkbWFwWyRleHRdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtYXBbJGV4dF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWltZV9jb250ZW50X3R5cGUnKSkgewogICAgICAgICAgICAgICAgJG1pbWUgPSBAbWltZV9jb250ZW50X3R5cGUoJHBhdGgpOwogICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkbWltZSkgJiYgJG1pbWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRtaW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFRyeU91dHB1dERpcmVjdEhvc3RQYWdlKCRob3N0T25seSwgJHJlcXVlc3RQYXRoID0gJy8nLCAkY3VycmVudFVybCA9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyb290RG9tYWluID0gc2VsZjo6R2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCk7CiAgICAgICAgICAgIGlmICgkcm9vdERvbWFpbiAhPT0gJycgJiYgJGhvc3RPbmx5ID09PSAkcm9vdERvbWFpbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gc2VsZjo6UmVzb2x2ZURpcmVjdEhvc3RQYWdlUGF0aCgkaG9zdE9ubHksICRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZXh0ID0gc3RydG9sb3dlcigoc3RyaW5nKXBhdGhpbmZvKCRwYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgaWYgKCRleHQgPT09ICdodG1sJyB8fCAkZXh0ID09PSAnaHRtJykgewogICAgICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICAgICAgaWYgKCFpc19zdHJpbmcoJGh0bWwpIHx8ICRodG1sID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICAgICAgICAgIGVjaG8gc2VsZjo6UHNldWRvT3JpZ2luYWxIdG1sKCRodG1sLCBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3RPbmx5LAogICAgICAgICAgICAgICAgICAgICd1cmwnID0+IChzdHJpbmcpJGN1cnJlbnRVcmwsCiAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIGRpZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiAnIC4gc2VsZjo6R2V0TWltZVR5cGVCeVBhdGgoJHBhdGgpKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTg2NDAwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZGZpbGUoJHBhdGgpOwogICAgICAgICAgICBkaWUoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFRyeU91dHB1dFJhbmRvbURpcmVjdEhvc3RQYWdlRm9yNDA0KCRjdXJyZW50SG9zdCwgJGN1cnJlbnRVcmwgPSAnJykKICAgICAgICB7CiAgICAgICAgICAgICRjaG9zZW4gPSBzZWxmOjpQaWNrNDA0U3VpamlQYWdlSXRlbSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsKTsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkY2hvc2VuKSB8fCBlbXB0eSgkY2hvc2VuWydmaWxlX3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgaWYgKCRiYXNlRGlyID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSBzdHJfcmVwbGFjZShhcnJheSgnLycsICdcXCcpLCBESVJFQ1RPUllfU0VQQVJBVE9SLCBsdHJpbSgoc3RyaW5nKSRjaG9zZW5bJ2ZpbGVfcGF0aCddLCAnL1xcJykpOwogICAgICAgICAgICAkcGF0aCA9ICRiYXNlRGlyIC4gcHJlZ19yZXBsYWNlKCcjXmh0bWxfcGFnZXNbXFxcXC9dI2knLCAnJywgJHJlbGF0aXZlUGF0aCk7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIoKHN0cmluZylwYXRoaW5mbygkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgICAgIGlmICgkZXh0ICE9PSAnaHRtbCcgJiYgJGV4dCAhPT0gJ2h0bScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkaHRtbCkgfHwgJGh0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjdXJyZW50SG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGN1cnJlbnRIb3N0KTsKICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICAgICAgZWNobyBzZWxmOjpQc2V1ZG9PcmlnaW5hbEh0bWwoJGh0bWwsIGFycmF5KAogICAgICAgICAgICAgICAgJ2hvc3QnID0+ICRjdXJyZW50SG9zdCwKICAgICAgICAgICAgICAgICd1cmwnID0+IChzdHJpbmcpJGN1cnJlbnRVcmwsCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBkaWUoKTsKICAgICAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gczMwMSgkdXJsKSAgICAgICAgICAgICAgIAogICAgeyAgICAJIAkJCQkgCQogICAgICAgIGlmICgkdXJsKSB7ICAgICAgCSAgIAkgCiAgICAgICAgICAgIGhlYWRlcignSFRUUC8xLjEgMzAxIE1vdmVkIFBlcm1hbmVudGx5Jyk7ICAgIAkJIAkgIAkJCiAgICAgICAgICAgIGhlYWRlcignU3RhdHVzOiAzMDEgTW92ZWQgUGVybWFuZW50bHknKTsgICAgCSAgCSAJCQkKICAgICAgICAgICAgaGVhZGVyKCdMb2NhdGlvbjonIC4gJHVybCAuICcnKTsgICAgCSAJCSAgIAkKICAgICAgICAgICAgZXhpdDsgICAgCQkgIAkgIAkKICAgICAgICB9ICAgICAJCSAJIAkgCiAgICB9ICAgIAkgCSAJCSAJCiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UG9zdCgpICAgICAgICAgICAgICAKICAgIHsgICAgCQkJICAJIAkKICAgICAgICBnbG9iYWwgJHpicDsgICAgCQkJIAkgICAKICAgICAgICAkbWFwcyA9IEN5cWl5ZXpoYW4oJ3Bvc3RtYXAnKTsKICAgICAgICBpZiAoJG1hcHMpIHsKICAgICAgICAgICAgaWYgKCFzZWxmOjokdXJpKSB7CiAgICAgICAgICAgICAgICBzZWxmOjokdXJpID0gJHpicC0+ZnVsbGN1cnJlbnR1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCR6YnAtPmhvc3QsICcnLCBzZWxmOjokdXJpKTsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCcjKF58XG58XHIpXHsvKC4qPylcfT1ceyhcZCspXH0oXHJ8XG58JCkjaXMnLCAkbWFwcywgJHQpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdFsyXSBhcyAkayA9PiAkcikgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmwsICRyKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWlkID0gaW50dmFsKCR0WzNdWyRrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJGFpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJ0aWNsZSAmJiAkYXJ0aWNsZS0+SUQgJiYgISRhcnRpY2xlLT5TdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXJ0aWNsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2VsZjo6JHNpdGUpIHsgICAgICAgICAgCiAgICAgICAgICAgICRzaXRlcyA9IEN5cWl5ZXpoYW4oJ3NpdGVzJyk7ICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkc2l0ZXMgJiYgcHJlZ19tYXRjaCgnIycgLiBwcmVnX3JlcGxhY2UoJyNodHRwcz86Ly8jJywgJycsICR6YnAtPmhvc3QpIC4gJyhcZCspIycsICRzaXRlcywgJHQpKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJHRbMV0pOyAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGFydGljbGUtPklEKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgJGFydGljbGUgPSBuZXcgUG9zdDsgICAgCQkgCQkJCSAKICAgICAgICAkSUQgPSAwOyAgICAgIAkgIAkgCQogICAgICAgIGlmIChDeXFpeWV6aGFuKCdwb3N0JykpIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICR1cmkgPSBzZWxmOjokdXJpOyAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkdXJpKSB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR1cmkgPSBtZDUoJHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ0lELFRpdGxlJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkdXJpKSktPmxpbWl0KDEpLT5zcWw7ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGQpKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkSUQgPSBpbnR2YWwoJGRbMF1bJ0lEJ10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRyYXdUaXRsZSA9ICRkWzBdWydUaXRsZSddOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRUaXRsZSA9ICRyYXdUaXRsZTsKICAgICAgICAgICAgICAgICAgICAkdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhd1RpdGxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmIGlzc2V0KCRkYXRhWyd0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaXRsZSA9ICRkYXRhWyd0J107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsndHMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cyA9IGludHZhbCgkZGF0YVsndHMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRUaXRsZSAmJiBzZWxmOjpJc0FydGljbGVUaXRsZSgkVGl0bGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+ZGVsZXRlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkdXJpKSktPnNxbDsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkVGl0bGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJElEID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHR0bCA9IHNlbGY6OkdldEZpeGVkVGl0bGVUVEwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHR0bCA+IDAgJiYgJHRzID4gMCAmJiAodGltZSgpIC0gJHRzKSA+ICR0dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICR1cmkpKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFydGljbGUgPSAkemJwLT5HZXRQb3N0QnlJRCgkSUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcnRpY2xlLT5JRCAmJiAhJGFydGljbGUtPlN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUaXRsZSkgeyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFydGljbGUtPlRpdGxlID0gJFRpdGxlOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICR1cmkpKS0+c3FsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgICAgCQkJIAkJCiAgICAgICAgJGNhdGUgPSAnJzsgICAgCQkgIAkgIAkKICAgICAgICAkdyA9IGFycmF5KGFycmF5KCc9JywgJ2xvZ19TdGF0dXMnLCAnMCcpLCBhcnJheSgnPScsICdsb2dfVHlwZScsICcwJykpOyAgICAJCQkgCQkJIAogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2x5X3hpblpibG9nJykgJiYgbHlfeGluWmJsb2dfY29yZTo6JGNhdGVob3N0KSB7ICAgICAgCSAgCSAgCiAgICAgICAgICAgICRjYXRlID0gbHlfeGluWmJsb2dfY29yZTo6JGNhdGVob3N0OyAgICAgIAkJIAkJCQogICAgICAgICAgICAkd1tdID0gYXJyYXkoJz0nLCAnbG9nX0NhdGVJRCcsICRjYXRlKTsgICAgCQkgCQkJCQkKICAgICAgICB9ICAgIAkgIAkJICAgCiAgICAgICAgJG51bSA9IGludHZhbChDeXFpeWV6aGFuKCdudW0nLCAwKSk7ICAgIAkgCQkJCQkgCiAgICAgICAgaWYgKCRudW0pIHsgICAgICAJICAgCQkKICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5zZWxlY3QoJHpicC0+ZGItPmRicHJlIC4gJ3Bvc3QnKS0+Y29sdW1uKCdsb2dfSUQnKS0+d2hlcmUoJHcpLT5vcmRlckJ5KCdsb2dfSUQgREVTQycpLT5saW1pdCgkbnVtKS0+c3FsOyAgICAJCQkgICAJIAogICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgCQkgCSAgCSAKICAgICAgICAgICAgaWYgKCFlbXB0eSgkZCkpIHsgICAgIAkgCQkJCSAKICAgICAgICAgICAgICAgICRJRHMgPSBhcnJheV9jb2x1bW4oJGQsICdsb2dfSUQnKTsgICAgIAkJCQkJCQkKICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJElEc1thcnJheV9yYW5kKCRJRHMpXSk7ICAgIAkgCQkJIAkgCiAgICAgICAgICAgIH0gICAgCQkgCQkgIAkKICAgICAgICB9IGVsc2UgeyAgICAJCQkJCQkJCQogICAgICAgICAgICAkSUQgPSAwOwogICAgICAgICAgICAkY3Vyc29yS2V5ID0gJ19fY3Vyc29yX18nIC4gKCgkY2F0ZSAhPT0gJycpID8gKCdjYXRlXycgLiAkY2F0ZSkgOiAnYWxsJyk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkc3FsQ3VyID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ0lEJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkY3Vyc29yS2V5KSktPmxpbWl0KDEpLT5zcWw7CiAgICAgICAgICAgICAgICAkcm93c0N1ciA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsQ3VyKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcm93c0N1cikgJiYgIWVtcHR5KCRyb3dzQ3VyKSAmJiBpc3NldCgkcm93c0N1clswXVsnSUQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkSUQgPSBpbnR2YWwoJHJvd3NDdXJbMF1bJ0lEJ10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICAkd3cgPSAkdzsgICAgCSAgCQkJIAkKICAgICAgICAgICAgJHd3W10gPSBhcnJheSgnPicsICdsb2dfSUQnLCAkSUQpOyAgICAgCQkJICAJCQogICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAncG9zdCcpLT5jb2x1bW4oJ2xvZ19JRCcpLT53aGVyZSgkd3cpLT5vcmRlckJ5KCdsb2dfSUQgQVNDJyktPmxpbWl0KDEpLT5zcWw7ICAgIAkJICAgCQkJCiAgICAgICAgICAgICRkID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOyAgICAJCSAgICAJCQogICAgICAgICAgICBpZiAoIWVtcHR5KCRkKSkgeyAgICAJCSAgIAkgCQogICAgICAgICAgICAgICAgJElEID0gJGRbMF1bJ2xvZ19JRCddOyAgICAJCSAJIAkJCQogICAgICAgICAgICAgICAgJGFydGljbGUgPSAkemJwLT5HZXRQb3N0QnlJRCgkSUQpOyAgICAgCQkJICAJIAogICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAJCQogICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5zZWxlY3QoJHpicC0+ZGItPmRicHJlIC4gJ3Bvc3QnKS0+d2hlcmUoJHcpLT5vcmRlckJ5KCdsb2dfSUQgQVNDJyktPmxpbWl0KDEpLT5zcWw7ICAgIAkgICAJCQkgCiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPkdldExpc3RUeXBlKCdQb3N0JywgJHNxbCk7ICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZCBhcyAkYXJ0aWNsZSkgeyAgICAJCSAgCQkgIAogICAgICAgICAgICAgICAgfSAgICAgCQkgCSAgIAogICAgICAgICAgICB9ICAgIAkgIAkJICAJCiAgICAgICAgICAgIGlmICgkYXJ0aWNsZSAmJiAkYXJ0aWNsZS0+SUQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHNxbERlbEN1ciA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICRjdXJzb3JLZXkpKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsRGVsQ3VyKTsKICAgICAgICAgICAgICAgICAgICAkc3FsSW5zQ3VyID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPmluc2VydCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5kYXRhKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAnTmFtZScgPT4gJGN1cnNvcktleSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0lEJyA9PiBpbnR2YWwoJGFydGljbGUtPklEKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ1RpdGxlJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICApKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsSW5zQ3VyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgIAkJICAgCQogICAgICAgICRUaXRsZSA9IHNlbGY6OkdldFVuaXF1ZVRpdGxlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkdldFR4dCgpOwogICAgICAgIH0sICfpmo/mnLrmoIfpopgnLCAxMjAsIDEyLCA4MCk7CiAgICAgICAgaWYgKCRUaXRsZSAhPT0gJycgJiYgIXNlbGY6OklzQXJ0aWNsZVRpdGxlKCRUaXRsZSkpIHsKICAgICAgICAgICAgJGFydGljbGUtPlRpdGxlID0gJFRpdGxlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcnRpY2xlLT5UaXRsZSA9ICfpmo/mnLrmoIfpopgnOwogICAgICAgIH0KICAgICAgICBpZiAoQ3lxaXllemhhbigncG9zdCcpICYmICRhcnRpY2xlLT5JRCAmJiAkdXJpKSB7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRwYXlsb2FkID0gYXJyYXkoJ3QnID0+ICRhcnRpY2xlLT5UaXRsZSwgJ3RzJyA9PiB0aW1lKCkpOwogICAgICAgICAgICAkcmF3VGl0bGUgPSBqc29uX2VuY29kZSgkcGF5bG9hZCwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgICAgIGlmICghJHJhd1RpdGxlKSB7CiAgICAgICAgICAgICAgICAkcmF3VGl0bGUgPSAkYXJ0aWNsZS0+VGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5pbnNlcnQoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+ZGF0YShhcnJheSgnTmFtZScgPT4gJHVyaSwgJ0lEJyA9PiAkYXJ0aWNsZS0+SUQsICdUaXRsZScgPT4gJHJhd1RpdGxlKSktPnNxbDsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuICRhcnRpY2xlOyAgICAgICAgICAgICAgICAgICAKICAgIH0gICAgCSAJIAkJCSAKICAgIHN0YXRpYyBmdW5jdGlvbiBEZWJ1Z19IYW5kbGVyX0NvbW1vbigkZ2V0Q29kZSwgJGdldE1lc3NhZ2UsICRnZXRGaWxlLCAkZ2V0TGluZSwgJGdldE1vcmVJbmZvLCAkZ2V0SHR0cENvZGUpICAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgIAkJICAgCQkKICAgIAkJIAkJICAgCiAgICAgICAgaWYgKCRnZXRIdHRwQ29kZSA9PSA0MDQgfHwgJGdldENvZGUgPT0gMikgeyAgICAgCSAgIAkgIAogICAgICAgICAgICBzZWxmOjpFcnJvcigpOyAgICAgCQkgCQkJIAogICAgICAgIH0gICAgICAJCQkgICAKICAgIH0gICAgICAgCQkJICAKICAgIHN0YXRpYyBmdW5jdGlvbiBFcnJvcigkdXJsID0gJycsICRvcmlnaW5hbF91cmwgPSAnJykgICAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgCSAgCQkgIAkKICAgICAgICBzdGF0aWMgJGlzID0gMDsgICAgCQkJCSAgCSAKICAgICAgICBpZiAoJGlzKSB7ICAgIAkJCQkJICAgCiAgICAgICAgICAgIHJldHVybjsgICAgCQkJCQkJIAkKICAgICAgICB9ICAgIAkgIAkJCQkJCiAgICAgICAgJGlzID0gMTsgICAgCQkgCQkgICAKICAgICAgICBnbG9iYWwgJHpicDsgICAgCQkgCQkJCQkKICAgICAgICBzZWxmOjokdXJpID0gJHpicC0+ZnVsbGN1cnJlbnR1cmw7ICAgIAkgIAkgICAJCiAgICAgICAgJGhvc3RPbmx5TWFpbiA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgPyAoc3RyaW5nKSRfU0VSVkVSWydIVFRQX0hPU1QnXSA6ICcnOwogICAgICAgIGlmICgkaG9zdE9ubHlNYWluID09PSAnJykgewogICAgICAgICAgICAkaG9zdE9ubHlNYWluID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+aG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgJGhvc3RPbmx5TWFpbiA9ICRob3N0T25seU1haW4gPyAoc3RyaW5nKSRob3N0T25seU1haW4gOiAnJzsKICAgICAgICB9CiAgICAgICAgJHJlcXVlc3RVcmlGb3JNYWluID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcnOwogICAgICAgIHNlbGY6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHlNYWluLCAkcmVxdWVzdFVyaUZvck1haW4sIChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgIHNlbGY6OlRyeU91dHB1dERpcmVjdEhvc3RQYWdlKCRob3N0T25seU1haW4sICRyZXF1ZXN0VXJpRm9yTWFpbiwgKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybCk7CiAgICAgICAgJGV4dCA9IEN5cWl5ZXpoYW4oJ2V4dCcsICdpY298anBnfGpzfGNzc3xqcGVnfGdpZnxwbmd8d2VicHx4bWx8dHh0Jyk7ICAgICAgCQkgCQkJCiAgICAgICAgaWYgKCRleHQgJiYgcHJlZ19tYXRjaCgnI1wuKCcgLiAkZXh0IC4gJykoXD98JCkjaScsIHNlbGY6OiR1cmkpKSB7ICAgIAkgCSAJCSAgCiAgICAgICAgICAgIHJldHVybjsgICAgCQkgIAkgCQkKICAgICAgICB9ICAgICAJIAkgCSAJCiAgICAgICAgc2VsZjo6VG9VcmxzKCk7ICAgICAgICAJIAkgCiAgICAgICAgJHVybCA9IEN5cWl5ZXpoYW4oJ3VybCcpOyAgICAJCSAJICAJIAogICAgICAgIGlmICgkdXJsKSB7ICAgICAJICAgICAJCiAgICAgICAgICAgIGlmIChzdHJwb3MoJHVybCwgJzovLycpIHx8ICR1cmwgPT0gJy8nKSB7ICAgICAgICAgCQkgCiAgICAgICAgICAgICAgICBzZWxmOjpzMzAxKCR1cmwpOyAgICAgCQkJICAgIAogICAgICAgICAgICB9ICAgICAgIAkJCQkJCiAgICAgICAgICAgICR1cmwgPSBsdHJpbSgkdXJsLCAnLycpOyAgICAgCQkgIAkgCQogICAgICAgICAgICBpZiAoaXNfZmlsZShaQlBfUEFUSCAuICR1cmwpKSB7ICAgIAkJCSAJIAkJCiAgICAgICAgICAgICAgICByZWFkZmlsZShaQlBfUEFUSCAuICR1cmwpOyAgICAgCSAgCQkgIAogICAgICAgICAgICAgICAgZGllKCk7ICAgICAgCQkJCQkJCiAgICAgICAgICAgIH0gICAgCSAgCQkgCQkKICAgICAgICB9ICAgIAkJICAgIAkJCgogICAgICAgICRob3N0T25seU1haW4gPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3RPbmx5TWFpbik7CiAgICAgICAgJGhvc3RPbmx5TWFpbiA9IHJ0cmltKHN0cnRvbG93ZXIoKHN0cmluZykkaG9zdE9ubHlNYWluKSwgJy4nKTsKICAgICAgICAkaXNNYWluSG9zdCA9IHRydWU7CiAgICAgICAgaWYgKCRob3N0T25seU1haW4gIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3RPbmx5TWFpbikpIHsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjXnd3d1wuI2knLCAkaG9zdE9ubHlNYWluKSAmJiBzdWJzdHJfY291bnQoJGhvc3RPbmx5TWFpbiwgJy4nKSA+IDEpIHsKICAgICAgICAgICAgICAgICRpc01haW5Ib3N0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRpc01haW5Ib3N0KSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICBpZiAoJHJlcXVlc3RVcmlGb3JNYWluICE9PSAnJykgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKCRyZXF1ZXN0VXJpRm9yTWFpbik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHApICYmIGlzc2V0KCRwWydwYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRwWydwYXRoJ107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJHJlcXVlc3RVcmlGb3JNYWluOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcFsncGF0aCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzaG91bGRVc2VNYWluRG9tYWluVHBsID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9cZHszLH0vPyQjJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcjXi9bYS16XXs0LDV9Lz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgICAgICRzaG91bGRVc2VNYWluRG9tYWluVHBsID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJyNeL1thLXpdezQsNX0vWzEtOV1cZHsxLDJ9aHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcjXi9bYS16XXs0LDV9L1sxLTldXGR7MSwyfVwuaHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRzaG91bGRVc2VNYWluRG9tYWluVHBsKSB7CiAgICAgICAgICAgICAgICAkaG9zdE5vcm0gPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHlNYWluKTsKICAgICAgICAgICAgICAgICRjZmcgPSBzZWxmOjpHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE5vcm0pOwogICAgICAgICAgICAgICAgaWYgKCEkY2ZnKSB7CiAgICAgICAgICAgICAgICAgICAgJGFsbCA9IHNlbGY6OkxvYWRNYWluRG9tYWluQ29uZmlncyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRhbGwpICYmIGlzc2V0KCRhbGxbJ3BhdHRlcm5zJ10pICYmIGlzX2FycmF5KCRhbGxbJ3BhdHRlcm5zJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhbGxbJ3BhdHRlcm5zJ10gYXMgJGl0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdCkgfHwgZW1wdHkoJGl0WydlbmFibGVkJ10pIHx8IGVtcHR5KCRpdFsnZG9tYWluJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKChzdHJpbmcpJGl0Wydkb21haW4nXSwgLXN0cmxlbignLicgLiAkaG9zdE5vcm0pKSA9PT0gKCcuJyAuICRob3N0Tm9ybSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2ZnID0gJGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHVzZUh0bWxUcGxFbmFibGVkID0gKGludHZhbChDeXFpeWV6aGFuKCd1c2VfaHRtbF90cGwnLCAwKSkgPT09IDEpOwogICAgICAgICAgICAgICAgJHRwbE5hbWUgPSAnJzsKICAgICAgICAgICAgICAgICRzZW8gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgaWYgKCRjZmcgJiYgaXNzZXQoJGNmZ1sndGVtcGxhdGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdHBsTmFtZSA9IHRyaW0oKHN0cmluZykkY2ZnWyd0ZW1wbGF0ZSddKTsKICAgICAgICAgICAgICAgICAgICAkc2VvID0gaXNzZXQoJGNmZ1snc2VvJ10pICYmIGlzX2FycmF5KCRjZmdbJ3NlbyddKSA/ICRjZmdbJ3NlbyddIDogYXJyYXkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkdHBsTmFtZSA9PT0gJycgfHwgc3RydG9sb3dlcihwYXRoaW5mbygkdHBsTmFtZSwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICAgICAgICAgIGlmICgkdXNlSHRtbFRwbEVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRwbE5hbWUgPSBzZWxmOjpHZXRDb25maWd1cmVkU2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdHBsTmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cGxOYW1lID0gc2VsZjo6R2V0U2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0cGxOYW1lICE9PSAnJyAmJiBzdHJ0b2xvd2VyKHBhdGhpbmZvKCR0cGxOYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50VXJsID0gKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybDsKICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gaXNzZXQoJGNmZ1sndGl0bGUnXSkgPyB0cmltKChzdHJpbmcpJGNmZ1sndGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9IGlzc2V0KCR6YnAtPm5hbWUpID8gdHJpbSgoc3RyaW5nKSR6YnAtPm5hbWUpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9ICRob3N0Tm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGt3ID0gaXNzZXQoJHNlb1sna2V5d29yZHMnXSkgPyB0cmltKChzdHJpbmcpJHNlb1sna2V5d29yZHMnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZXNjID0gaXNzZXQoJHNlb1snZGVzY3JpcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJHNlb1snZGVzY3JpcHRpb24nXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaXRlTmFtZSA9IGlzc2V0KCR6YnAtPm5hbWUpID8gKHN0cmluZykkemJwLT5uYW1lIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFycyA9IGFycmF5KCdrdycgPT4gJGt3LCAnZGVzYycgPT4gJGRlc2MsICd1cmwnID0+ICRjdXJyZW50VXJsLCAnaG9zdCcgPT4gJGhvc3ROb3JtLCAnc2l0ZW5hbWUnID0+ICRzaXRlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbCA9IHNlbGY6OkJ1aWxkU2l0ZUhvbWVIdG1sRnJvbVRlbXBsYXRlKCR0cGxOYW1lLCAkdGl0bGUsICcnLCAkdmFycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGh0bWwgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2VsZjo6VHJ5T3V0cHV0UmFuZG9tRGlyZWN0SG9zdFBhZ2VGb3I0MDQoJGhvc3RPbmx5TWFpbiwgKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybCk7CiAgICAgICAgcmV0dXJuOwogICAgICAgIC8qICAgICAgCQkgICAJCiAgICAgICAgb2Jfc3RhcnQoKTsgICAgICAJCQkgIAkKICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsgICAgICAgIAkJCSAKICAgICAgICBzZWxmOjokY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOyAgICAJIAkJCQkJIAogICAgCQkgCSAgCSAKICAgICAgICBpZiAoc2VsZjo6JGNvbnRlbnQgPT09ICcnKSB7ICAgIAkJICAgIAkJCiAgICAgICAgICAgIG9iX2VuZF9mbHVzaCgpOyAgICAgCSAgCQkJCQogICAgICAgICAgICBzZWxmOjokY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOyAgICAgCQkJIAkgCQogICAgICAgIH0gICAgICAgICAgCQkKICAgICAgICBpZiAoc2VsZjo6JGNvbnRlbnQpIHsgICAgICAJIAkgIAkKICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oJ0N5cWl5ZXpoYW5fY29yZTo6VGVybWluYXRlJyk7ICAgIAkJIAkJCQkJCiAgICAgICAgfSAgICAgCQkgCSAgIAogICAgICovICAgICAgCSAJCQkJCiAgICB9ICAgICAJIAkgIAkJCiAgICBzdGF0aWMgZnVuY3Rpb24gVGVybWluYXRlKCkgICAgICAJCSAgCSAKICAgIHsgICAgICAgCQkJIAkKICAgICAgICBvYl9lbmRfY2xlYW4oKTsgICAgICAgCSAJCQkKICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsgICAgIAkJICAJIAkKICAgICAgICBlY2hvIHNlbGY6OiRjb250ZW50OyAgICAgCSAgICAgIAogICAgfSAgICAJIAkgCSAgIAogICAgc3RhdGljIGZ1bmN0aW9uIERpc3BsYXlUZW1wbGF0ZVdpdGhQc2V1ZG9PcmlnaW5hbCgkdGVtcGxhdGUsICR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIUN5cWl5ZXpoYW4oJ3VzZV9wc2V1ZG9fb3JpZ2luYWwnLCAwKSkgewogICAgICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICR0ZW1wbGF0ZS0+RGlzcGxheSgpOwogICAgICAgICRjb250ZW50ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlY2hvIHNlbGY6OlBzZXVkb09yaWdpbmFsSHRtbCgkY29udGVudCwgJHZhcnMpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIGRldGVjdF9lbmNvZGluZygkY29udGVudHMpICAgICAgIAkgICAJCiAgICB7ICAgICAgIAkJCSAJCiAgICAgICAgJGVuY29kaW5ncyA9IGFycmF5KCdVVEYtOCcsICdHQjIzMTInLCAnR0JLJywgJ1VURi0xNicsICdVQ1MtMicsICdCSUc1JywgJ0NQOTM2JywgJ0FTQ0lJJyk7ICAgIAkgCQkJCQkgCiAgICAgICAgcmV0dXJuIG1iX2RldGVjdF9lbmNvZGluZygkY29udGVudHMsICRlbmNvZGluZ3MpOyAgICAJICAJCQkgIAogICAgfSAgICAgCQkgICAJCQogICAgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRfdG9fdXRmOCgkc3RyLCAkZnJvbV9lbmNvZGluZykgICAgCQkgCQkgICAKICAgIHsgICAgIAkJICAgIAkKICAgICAgICBpZiAoISRmcm9tX2VuY29kaW5nIHx8ICRmcm9tX2VuY29kaW5nID09ICdVVEYtOCcpIHsgICAgCQkJIAkgCSAKICAgICAgICAgICAgcmV0dXJuICRzdHI7ICAgIAkgCQkgCSAJCiAgICAgICAgfSAgICAJCQkgIAkgCQogICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICdVVEYtOCcsICRmcm9tX2VuY29kaW5nKTsgICAgCSAJCSAgCQkKICAgIH0gICAgIAkJICAgIAkKICAgIHN0YXRpYyBmdW5jdGlvbiBmaWxlX3V0ZjgoJHRtcCwgJGZpbGVzKSAgICAgCSAgCQkgIAogICAgeyAgICAgCQkJCSAgIAogICAgICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0bXApOyAgICAJCQkgCSAJIAogICAgICAgICRjaGFyc2V0WzFdID0gc3Vic3RyKCRjb250ZW50cywgMCwgMSk7ICAgICAgIAkgCQkgCiAgICAgICAgJGNoYXJzZXRbMl0gPSBzdWJzdHIoJGNvbnRlbnRzLCAxLCAxKTsgICAgCQkJCSAJCSAKICAgICAgICAkY2hhcnNldFszXSA9IHN1YnN0cigkY29udGVudHMsIDIsIDEpOyAgICAJCQkJICAgCQogICAgICAgICRlbmNvZGluZyA9ICcnOyAgICAJICAgCSAgCQogICAgICAgIGlmIChvcmQoJGNoYXJzZXRbMV0pICE9IDIzOSAmJiBvcmQoJGNoYXJzZXRbMl0pICE9IDE4NyAmJiBvcmQoJGNoYXJzZXRbM10pICE9IDE5MSkgeyAgICAgCQkgCSAJIAogICAgICAgICAgICAkZW5jb2RpbmcgPSBzZWxmOjpkZXRlY3RfZW5jb2RpbmcoY2hyKDB4ZWYpIC4gY2hyKDB4YmIpIC4gY2hyKDB4YmYpIC4gJGNvbnRlbnRzKTsgICAgIAkgICAJICAKICAgICAgICB9ICAgICAgCSAJICAgCiAgICAgICAgaWYgKCEkZW5jb2RpbmcpIHsgICAgICAgIAkgICAKICAgICAgICAgICAgJGVuY29kaW5nID0gc2VsZjo6ZGV0ZWN0X2VuY29kaW5nKCRjb250ZW50cyk7ICAgIAkgCQkJCSAgCiAgICAgICAgfSAgICAgIAkJCQkJIAogICAgICAgICRjb250ZW50cyA9IHNlbGY6OmNvbnZlcnRfdG9fdXRmOCgkY29udGVudHMsICRlbmNvZGluZyk7ICAgICAJCQkJIAkJCiAgICAgICAgJGNvbnRlbnRzID0gdHJpbSgkY29udGVudHMpOyAgICAJICAgCQkgCQogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlcywgJGNvbnRlbnRzKTsgICAgIAkgIAkJCSAKICAgICAgICB1bnNldCgkY29udGVudHMpOyAgICAgCSAJCQkJCQogICAgfSAgICAJCQkJCQkJCQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFR4dCgpICAgICAgICAJCQkJCiAgICB7ICAgIAkJIAkJICAgCiAgICAgICAgc3RhdGljICRpbml0ZWQgPSAwOwogICAgICAgIHN0YXRpYyAkZmlsZUxpc3QgPSBhcnJheSgpOwogICAgICAgIHN0YXRpYyAkY3VyRmlsZUlkeCA9IDA7CiAgICAgICAgc3RhdGljICRjdXJMaW5lID0gMDsKICAgICAgICAkc3RhdGVGcCA9IG51bGw7CiAgICAgICAgJHN0YXRlRmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVNlcVN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkc3RhdGVGaWxlICE9PSAnJykgewogICAgICAgICAgICAkc3RhdGVGcCA9IEBmb3Blbigkc3RhdGVGaWxlLCAnYytiJyk7CiAgICAgICAgICAgIGlmICgkc3RhdGVGcCkgewogICAgICAgICAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkc3RhdGVGcCwgTE9DS19FWCk7CiAgICAgICAgICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICBAZmNsb3NlKCRzdGF0ZUZwKTsKICAgICAgICAgICAgICAgICAgICAkc3RhdGVGcCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG91dFRpdGxlID0gJyc7CiAgICAgICAgaWYgKCEkaW5pdGVkKSB7CiAgICAgICAgICAgICRpbml0ZWQgPSAxOwogICAgICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgICAgICBpZiAoaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAkZCA9IHNjYW5kaXIoJGRpcik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGQpICYmIGNvdW50KCRkKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICR0b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmID09PSAnLicgfHwgJGYgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3R4dCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGRpciAuICRmOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkbWF4SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14nIC4gcHJlZ19xdW90ZSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ2NzcmZUb2tlbicpLCAnIycpIC4gJ1xfKFxkKylcXyNpJywgJGYsICR0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gaW50dmFsKCR0WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcCA9IG5ldyBTcGxGaWxlT2JqZWN0KCRwYXRoLCAncmInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wLT5zZWVrKFBIUF9JTlRfTUFYKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF4SW5kZXggPSBpbnR2YWwoJHRtcC0+a2V5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG1heEluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9IGFycmF5KCdwYXRoJyA9PiAkcGF0aCwgJ25hbWUnID0+IGJhc2VuYW1lKCRwYXRoKSwgJ21heCcgPT4gJG1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsICs9ICgkbWF4SW5kZXggKyAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzb3J0KCRmaWxlcywgZnVuY3Rpb24gKCRhLCAkYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZUxpc3QgPSAkZmlsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiR0eHRDb3VudCA9ICR0b3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlID0gJHN0YXRlRnAgPyBzZWxmOjpMb2FkUmFuZFRpdGxlU2VxU3RhdGUoJHN0YXRlRnApIDogc2VsZjo6TG9hZFJhbmRUaXRsZVNlcVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJGaWxlSWR4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHN0YXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNmID0gaXNzZXQoJHN0YXRlWydmaWxlJ10pID8gKHN0cmluZykkc3RhdGVbJ2ZpbGUnXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNsID0gaXNzZXQoJHN0YXRlWydsaW5lJ10pID8gaW50dmFsKCRzdGF0ZVsnbGluZSddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNmICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkaSA9PiAkaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpJGl0WyduYW1lJ10gPT09ICRzZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckZpbGVJZHggPSAkaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heCA9IGlzc2V0KCRmaWxlTGlzdFskY3VyRmlsZUlkeF1bJ21heCddKSA/IGludHZhbCgkZmlsZUxpc3RbJGN1ckZpbGVJZHhdWydtYXgnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzbCA+ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2wgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAkc2w7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkZmlsZUxpc3QpKSB7CiAgICAgICAgICAgICRuID0gY291bnQoJGZpbGVMaXN0KTsKICAgICAgICAgICAgJHRyaWVzID0gMDsKICAgICAgICAgICAgd2hpbGUgKCR0cmllcyA8ICgkbiAqIDIpKSB7CiAgICAgICAgICAgICAgICAkaXQgPSAkZmlsZUxpc3RbJGN1ckZpbGVJZHhdOwogICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRpdFsncGF0aCddOwogICAgICAgICAgICAgICAgJG1heCA9IGlzc2V0KCRpdFsnbWF4J10pID8gaW50dmFsKCRpdFsnbWF4J10pIDogMDsKICAgICAgICAgICAgICAgIGlmICgkY3VyTGluZSA+ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAkY3VyRmlsZUlkeCA9ICgkY3VyRmlsZUlkeCArIDEpICUgJG47CiAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgICR0cmllcysrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkZnAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcGF0aCwgJ3JiJyk7CiAgICAgICAgICAgICAgICAgICAgJGZwLT5zZWVrKCRjdXJMaW5lKTsKICAgICAgICAgICAgICAgICAgICAkc3MgPSB0cmltKChzdHJpbmcpJGZwLT5jdXJyZW50KCkpOwogICAgICAgICAgICAgICAgICAgICRuZXh0RmlsZUlkeCA9ICRjdXJGaWxlSWR4OwogICAgICAgICAgICAgICAgICAgICRuZXh0TGluZSA9ICRjdXJMaW5lICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoJG5leHRMaW5lID4gJG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbmV4dEZpbGVJZHggPSAoJGN1ckZpbGVJZHggKyAxKSAlICRuOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV4dExpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY3VyTGluZSA9ICRuZXh0TGluZTsKICAgICAgICAgICAgICAgICAgICAkY3VyRmlsZUlkeCA9ICRuZXh0RmlsZUlkeDsKICAgICAgICAgICAgICAgICAgICAkc2F2ZWQgPSBzZWxmOjpTYXZlUmFuZFRpdGxlU2VxU3RhdGUoKHN0cmluZykkZmlsZUxpc3RbJG5leHRGaWxlSWR4XVsnbmFtZSddLCAkbmV4dExpbmUsICRzdGF0ZUZwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHNzICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAkb3V0VGl0bGUgPSAkc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdHJpZXMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoISRzYXZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCRqID0gMDsgJGogPCAyNTsgJGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJpZCA9IG10X3JhbmQoMCwgJG4gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyaXQgPSAkZmlsZUxpc3RbJHJpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnBhdGggPSAoc3RyaW5nKSRyaXRbJ3BhdGgnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRybWF4ID0gaXNzZXQoJHJpdFsnbWF4J10pID8gaW50dmFsKCRyaXRbJ21heCddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJtYXggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJsaW5lID0gbXRfcmFuZCgwLCAkcm1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZnAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcnBhdGgsICdyYicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZnAtPnNlZWsoJHJsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnMgPSB0cmltKChzdHJpbmcpJHJmcC0+Y3VycmVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJzICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0VGl0bGUgPSAkcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb3V0VGl0bGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICRjdXJGaWxlSWR4ID0gKCRjdXJGaWxlSWR4ICsgMSkgJSAkbjsKICAgICAgICAgICAgICAgICAgICAkY3VyTGluZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJHRyaWVzKys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJG91dFRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkc3RhdGVGcCkgewogICAgICAgICAgICBAZmxvY2soJHN0YXRlRnAsIExPQ0tfVU4pOwogICAgICAgICAgICBAZmNsb3NlKCRzdGF0ZUZwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXRUaXRsZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kb21UeHRUaXRsZSgkbWF4QXR0ZW1wdHMgPSAzMCkKICAgIHsKICAgICAgICBzdGF0aWMgJGluaXRlZCA9IDA7CiAgICAgICAgc3RhdGljICRmaWxlTGlzdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCEkaW5pdGVkKSB7CiAgICAgICAgICAgICRpbml0ZWQgPSAxOwogICAgICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgICAgICBpZiAoaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAkZCA9IHNjYW5kaXIoJGRpcik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGQpICYmIGNvdW50KCRkKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZiA9PT0gJy4nIHx8ICRmID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkZiwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICd0eHQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRkaXIgLiAkZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeJyAuIHByZWdfcXVvdGUoKHN0cmluZylDeXFpeWV6aGFuKCdjc3JmVG9rZW4nKSwgJyMnKSAuICdcXyhcZCspXF8jaScsICRmLCAkdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IGludHZhbCgkdFsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcGF0aCwgJ3JiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcC0+c2VlayhQSFBfSU5UX01BWCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gaW50dmFsKCR0bXAtPmtleSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtYXhJbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSBhcnJheSgncGF0aCcgPT4gJHBhdGgsICduYW1lJyA9PiBiYXNlbmFtZSgkcGF0aCksICdtYXgnID0+ICRtYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGZpbGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB1c29ydCgkZmlsZXMsIGZ1bmN0aW9uICgkYSwgJGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJuYXRjYXNlY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0ID0gJGZpbGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW1wdHkoJGZpbGVMaXN0KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiAyMDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gMjAwOwogICAgICAgIH0KICAgICAgICAkbiA9IGNvdW50KCRmaWxlTGlzdCk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heEF0dGVtcHRzOyAkaSsrKSB7CiAgICAgICAgICAgICRpZHggPSBtdF9yYW5kKDAsICRuIC0gMSk7CiAgICAgICAgICAgICRpdCA9ICRmaWxlTGlzdFskaWR4XTsKICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRpdFsncGF0aCddOwogICAgICAgICAgICAkbWF4ID0gaXNzZXQoJGl0WydtYXgnXSkgPyBpbnR2YWwoJGl0WydtYXgnXSkgOiAwOwogICAgICAgICAgICBpZiAoJG1heCA8IDApIHsKICAgICAgICAgICAgICAgICRtYXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lID0gJG1heCA+IDAgPyBtdF9yYW5kKDAsICRtYXgpIDogMDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRmcCA9IG5ldyBTcGxGaWxlT2JqZWN0KCRwYXRoLCAncmInKTsKICAgICAgICAgICAgICAgICRmcC0+c2VlaygkbGluZSk7CiAgICAgICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkZnAtPmN1cnJlbnQoKSk7CiAgICAgICAgICAgICAgICBpZiAoJHQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZFRpdGxlU2VxU3RhdGVGaWxlKCkKICAgIHsKICAgICAgICAkZGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICdyYW5kdGl0bGVfc2VxX3N0YXRlLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRSYW5kVGl0bGVTZXFTdGF0ZSgkZnAgPSBudWxsKQogICAgewogICAgICAgIGlmICgkZnApIHsKICAgICAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgICAgICAkcmF3ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwKTsKICAgICAgICAgICAgaWYgKCEkcmF3KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZm4gPSBpc3NldCgkZGVjb2RlZFsnZmlsZSddKSA/IChzdHJpbmcpJGRlY29kZWRbJ2ZpbGUnXSA6ICcnOwogICAgICAgICAgICAkbGluZSA9IGlzc2V0KCRkZWNvZGVkWydsaW5lJ10pID8gaW50dmFsKCRkZWNvZGVkWydsaW5lJ10pIDogMDsKICAgICAgICAgICAgaWYgKCRsaW5lIDwgMCkgewogICAgICAgICAgICAgICAgJGxpbmUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJGZuLCAnbGluZScgPT4gJGxpbmUpOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVNlcVN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAncmInKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwLCBMT0NLX1NIKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRyYXcgPSBAc3RyZWFtX2dldF9jb250ZW50cygkZnApOwogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICBpZiAoISRyYXcpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdmaWxlJyA9PiAnJywgJ2xpbmUnID0+IDApOwogICAgICAgIH0KICAgICAgICAkZGVjb2RlZCA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGRlY29kZWQpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGZuID0gaXNzZXQoJGRlY29kZWRbJ2ZpbGUnXSkgPyAoc3RyaW5nKSRkZWNvZGVkWydmaWxlJ10gOiAnJzsKICAgICAgICAkbGluZSA9IGlzc2V0KCRkZWNvZGVkWydsaW5lJ10pID8gaW50dmFsKCRkZWNvZGVkWydsaW5lJ10pIDogMDsKICAgICAgICBpZiAoJGxpbmUgPCAwKSB7CiAgICAgICAgICAgICRsaW5lID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5KCdmaWxlJyA9PiAkZm4sICdsaW5lJyA9PiAkbGluZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVJhbmRUaXRsZVNlcVN0YXRlKCRmaWxlTmFtZSwgJGxpbmUsICRmcCA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZShhcnJheSgnZmlsZScgPT4gKHN0cmluZykkZmlsZU5hbWUsICdsaW5lJyA9PiBpbnR2YWwoJGxpbmUpLCAndHMnID0+IHRpbWUoKSksIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwogICAgICAgICAgICBpZiAoJG91dCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIEBmdHJ1bmNhdGUoJGZwLCAwKTsKICAgICAgICAgICAgICAgIEBmd3JpdGUoJGZwLCAkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKCRvdXQgIT09IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRSYW5kVGl0bGVTZXFTdGF0ZUZpbGUoKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKGFycmF5KCdmaWxlJyA9PiAoc3RyaW5nKSRmaWxlTmFtZSwgJ2xpbmUnID0+IGludHZhbCgkbGluZSksICd0cycgPT4gdGltZSgpKSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgaWYgKCRvdXQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIEBmdHJ1bmNhdGUoJGZwLCAwKTsKICAgICAgICAgICAgQGZ3cml0ZSgkZnAsICRvdXQpOwogICAgICAgIH0KICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgcmV0dXJuICgkb3V0ICE9PSBmYWxzZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSGFzVHh0U291cmNlKCkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGQgPSBzY2FuZGlyKCRkaXIpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpIHx8IGNvdW50KCRkKSA8PSAyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGQgYXMgJGYpIHsKICAgICAgICAgICAgaWYgKCRmID09PSAnLicgfHwgJGYgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ3R4dCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kVGl0bGUoKQogICAgewogICAgICAgICRob3N0T25seSA9ICcnOwogICAgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IChzdHJpbmcpJF9TRVJWRVJbJ0hUVFBfSE9TVCddOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCR6YnApICYmIGlzc2V0KCR6YnAtPmhvc3QpKSB7CiAgICAgICAgICAgICAgICAkaCA9IHBhcnNlX3VybCgoc3RyaW5nKSR6YnAtPmhvc3QsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICAgICBpZiAoJGgpIHsKICAgICAgICAgICAgICAgICAgICAkaG9zdE9ubHkgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKCiAgICAgICAgJHQgPSAkaG9zdE9ubHkgIT09ICcnID8gc2VsZjo6R2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRSZWNvcmRQb29sKCRob3N0T25seSkgOiAnJzsKICAgICAgICBpZiAoJHQgIT09ICcnICYmICFzZWxmOjpJc0JhZFRpdGxlKCR0KSkgewogICAgICAgICAgICBzZWxmOjpSZW1lbWJlclJhbmRUaXRsZSgkdCk7CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgJHQgPSBzZWxmOjpHZXRSYW5kb21UaXRsZUZyb21GaXhlZFJlY29yZFBvb2woJycpOwogICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHNlbGY6OlJlbWVtYmVyUmFuZFRpdGxlKCR0KTsKICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgIH0KCiAgICAgICAgJHQgPSBzZWxmOjpHZXRSYW5kb21UaXRsZUZyb21SZWNlbnRDYWNoZSgpOwogICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CgogICAgICAgICR0ID0gc2VsZjo6R2V0VW5pcXVlVGl0bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6R2V0VHh0KCk7CiAgICAgICAgfSwgJ+maj+acuuagh+mimCcsIDEyMCwgMTIsIDgwKTsKICAgICAgICBpZiAoJHQgIT09ICcnICYmICRob3N0T25seSAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHNlbGY6OlJlZ2lzdGVyUmFuZFRpdGxlUG9vbEl0ZW0oJGhvc3RPbmx5LCAkdCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdCA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdCkpIHsKICAgICAgICAgICAgcmV0dXJuICfpmo/mnLrmoIfpopgnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmVnaXN0ZXJSYW5kVGl0bGVQb29sSXRlbSgkaG9zdE9ubHksICR0aXRsZSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkaG9zdE9ubHkgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgoc3RyaW5nKSRob3N0T25seSk7CiAgICAgICAgaWYgKCRob3N0T25seSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzZWxmOjpJbnNlcnRUaXRsZVBvb2xJdGVtKCRob3N0T25seSwgJHRpdGxlLCB0aW1lKCkpOwogICAgICAgIHVuc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50WyRob3N0T25seV0pOwogICAgICAgIHVuc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50VGltZVskaG9zdE9ubHldKTsKICAgICAgICB1bnNldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFsnKiddKTsKICAgICAgICB1bnNldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFRpbWVbJyonXSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRSZWNvcmRQb29sKCRob3N0T25seSA9ICcnKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHRyaW0oKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRob3N0T25seSk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgIHNlbGY6OkVuc3VyZVRpdGxlUG9vbFRhYmxlKCk7CiAgICAgICAgJHR0bCA9IGludHZhbChDeXFpeWV6aGFuKCdyYW5kdHRsJywgNjApKTsKICAgICAgICBpZiAoJHR0bCA8IDApIHsKICAgICAgICAgICAgJHR0bCA9IDA7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJGNhY2hlS2V5ID0gKCRob3N0T25seSAhPT0gJycpID8gJGhvc3RPbmx5IDogJyonOwogICAgICAgIGlmICghaXNzZXQoc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRbJGNhY2hlS2V5XSkgfHwgIWlzc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50VGltZVskY2FjaGVLZXldKSB8fCAoJHR0bCAmJiAoJG5vdyAtIGludHZhbChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFRpbWVbJGNhY2hlS2V5XSkpID4gJHR0bCkpIHsKICAgICAgICAgICAgJGZpeGVkQ291bnQgPSAwOwogICAgICAgICAgICAkcG9vbENvdW50ID0gMDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRkYzEgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBDT1VOVCgxKSBBUyBjIEZST00gYCR0YWJsZUZpeGVkYCBXSEVSRSBgZnRfSG9zdGA9JyRob3N0RXNjJyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGMxID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVGaXhlZGAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRmaXhlZENvdW50ID0gKCFlbXB0eSgkZGMxKSAmJiBpc3NldCgkZGMxWzBdWydjJ10pKSA/IGludHZhbCgkZGMxWzBdWydjJ10pIDogMDsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZVBvb2wgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICAgICAgICAgaWYgKCRob3N0T25seSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkaG9zdEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJGhvc3RPbmx5KTsKICAgICAgICAgICAgICAgICAgICAkZGMyID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVQb29sYCBXSEVSRSBgdHBfSG9zdGA9JyRob3N0RXNjJyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGMyID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVQb29sYCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9ICghZW1wdHkoJGRjMikgJiYgaXNzZXQoJGRjMlswXVsnYyddKSkgPyBpbnR2YWwoJGRjMlswXVsnYyddKSA6IDA7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRmaXhlZENvdW50IDwgMCkgewogICAgICAgICAgICAgICAgJGZpeGVkQ291bnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcG9vbENvdW50IDwgMCkgewogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRbJGNhY2hlS2V5XSA9ICRmaXhlZENvdW50ICsgJHBvb2xDb3VudDsKICAgICAgICAgICAgc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRUaW1lWyRjYWNoZUtleV0gPSAkbm93OwogICAgICAgIH0KICAgICAgICAkY291bnQgPSBpc3NldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFskY2FjaGVLZXldKSA/IGludHZhbChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFskY2FjaGVLZXldKSA6IDA7CiAgICAgICAgaWYgKCRjb3VudCA8PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgJHNlcSA9IHNlbGY6OkxvYWRQb29sU2VxU3RhdGUoJGNhY2hlS2V5KTsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNlcSkgJiYgaXNzZXQoJHNlcVsnb2Zmc2V0J10pKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSBpbnR2YWwoJHNlcVsnb2Zmc2V0J10pOwogICAgICAgIH0KICAgICAgICBpZiAoJG9mZnNldCA8IDApIHsKICAgICAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkb2Zmc2V0ID49ICRjb3VudCkgewogICAgICAgICAgICAkb2Zmc2V0ID0gMDsKICAgICAgICB9CiAgICAgICAgJG5leHRPZmZzZXQgPSAoJG9mZnNldCArIDEpOwogICAgICAgIGlmICgkbmV4dE9mZnNldCA+PSAkY291bnQpIHsKICAgICAgICAgICAgJG5leHRPZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBzZWxmOjpTYXZlUG9vbFNlcVN0YXRlKCRjYWNoZUtleSwgJG5leHRPZmZzZXQpOwoKICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHRhYmxlRml4ZWQgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICAgICAgaWYgKCRob3N0T25seSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgJGRjMSA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJHRhYmxlRml4ZWRgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZGMxID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVGaXhlZGAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZml4ZWRDb3VudCA9ICghZW1wdHkoJGRjMSkgJiYgaXNzZXQoJGRjMVswXVsnYyddKSkgPyBpbnR2YWwoJGRjMVswXVsnYyddKSA6IDA7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICRmaXhlZENvdW50ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCRmaXhlZENvdW50IDwgMCkgewogICAgICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkb2Zmc2V0IDwgJGZpeGVkQ291bnQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlRml4ZWRgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlRml4ZWRgIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgICR0ID0gKCFlbXB0eSgkZCkgJiYgaXNzZXQoJGRbMF1bJ2Z0X1RpdGxlJ10pKSA/IHRyaW0oKHN0cmluZykkZFswXVsnZnRfVGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRvZmYyID0gJG9mZnNldCAtICRmaXhlZENvdW50OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHRhYmxlUG9vbCA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxlcG9vbCc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGB0cF9UaXRsZWAgRlJPTSBgJHRhYmxlUG9vbGAgV0hFUkUgYHRwX0hvc3RgPSckaG9zdEVzYycgT1JERVIgQlkgYHRwX0lEYCBBU0MgTElNSVQgMSBPRkZTRVQgIiAuIGludHZhbCgkb2ZmMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGB0cF9UaXRsZWAgRlJPTSBgJHRhYmxlUG9vbGAgT1JERVIgQlkgYHRwX0lEYCBBU0MgTElNSVQgMSBPRkZTRVQgIiAuIGludHZhbCgkb2ZmMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgICR0ID0gKCFlbXB0eSgkZCkgJiYgaXNzZXQoJGRbMF1bJ3RwX1RpdGxlJ10pKSA/IHRyaW0oKHN0cmluZykkZFswXVsndHBfVGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRUaXRsZVRhYmxlKCRob3N0T25seSA9ICcnKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHRyaW0oKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRob3N0T25seSk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnOwogICAgICAgICRjYWNoZUtleSA9ICdmdF8nIC4gKCgkaG9zdE9ubHkgIT09ICcnKSA/ICRob3N0T25seSA6ICcqJyk7CiAgICAgICAgJGNvdW50ID0gMDsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgICAgICAgICAkZGMgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBDT1VOVCgxKSBBUyBjIEZST00gYCR0YWJsZWAgV0hFUkUgYGZ0X0hvc3RgPSckaG9zdEVzYyciKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkYyA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJHRhYmxlYCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb3VudCA9ICghZW1wdHkoJGRjKSAmJiBpc3NldCgkZGNbMF1bJ2MnXSkpID8gaW50dmFsKCRkY1swXVsnYyddKSA6IDA7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkY291bnQgPD0gMCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgICRzZXEgPSBzZWxmOjpMb2FkUG9vbFNlcVN0YXRlKCRjYWNoZUtleSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRzZXEpICYmIGlzc2V0KCRzZXFbJ29mZnNldCddKSkgewogICAgICAgICAgICAkb2Zmc2V0ID0gaW50dmFsKCRzZXFbJ29mZnNldCddKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoJG9mZnNldCA+PSAkY291bnQpIHsKICAgICAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDU7ICRpKyspIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJTRUxFQ1QgYGZ0X1RpdGxlYCBGUk9NIGAkdGFibGVgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlYCBPUkRFUiBCWSBgZnRfSURgIEFTQyBMSU1JVCAxIE9GRlNFVCAiIC4gaW50dmFsKCRvZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGQgPSAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkdCA9ICghZW1wdHkoJGQpICYmIGlzc2V0KCRkWzBdWydmdF9UaXRsZSddKSkgPyB0cmltKChzdHJpbmcpJGRbMF1bJ2Z0X1RpdGxlJ10pIDogJyc7CiAgICAgICAgICAgICAgICAkbmV4dE9mZnNldCA9ICgkb2Zmc2V0ICsgMSk7CiAgICAgICAgICAgICAgICBpZiAoJG5leHRPZmZzZXQgPj0gJGNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgJG5leHRPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZjo6U2F2ZVBvb2xTZXFTdGF0ZSgkY2FjaGVLZXksICRuZXh0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICRvZmZzZXQgPSAkbmV4dE9mZnNldDsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kVGl0bGVQb29sU2VxU3RhdGVGaWxlKCRrZXkpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGlkID0gbWQ1KChzdHJpbmcpJGtleSk7CiAgICAgICAgcmV0dXJuICRkaXIgLiAncmFuZHRpdGxlX3Bvb2xfc2VxXycgLiAkaWQgLiAnLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRQb29sU2VxU3RhdGUoJGtleSkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVBvb2xTZXFTdGF0ZUZpbGUoJGtleSk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvZmZzZXQnID0+IDApOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdyYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2Zmc2V0JyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2Zmc2V0JyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29mZnNldCcgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkgfHwgIWlzc2V0KCRkZWNvZGVkWydvZmZzZXQnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvZmZzZXQnID0+IDApOwogICAgICAgIH0KICAgICAgICAkb2ZmID0gaW50dmFsKCRkZWNvZGVkWydvZmZzZXQnXSk7CiAgICAgICAgaWYgKCRvZmYgPCAwKSB7CiAgICAgICAgICAgICRvZmYgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXkoJ29mZnNldCcgPT4gJG9mZik7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVBvb2xTZXFTdGF0ZSgka2V5LCAkb2Zmc2V0KQogICAgewogICAgICAgICRmaWxlID0gc2VsZjo6R2V0UmFuZFRpdGxlUG9vbFNlcVN0YXRlRmlsZSgka2V5KTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKGFycmF5KCdvZmZzZXQnID0+IGludHZhbCgkb2Zmc2V0KSwgJ3RzJyA9PiB0aW1lKCkpLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICBpZiAoJG91dCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgICAgICBAZndyaXRlKCRmcCwgJG91dCk7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBSZW1lbWJlclJhbmRUaXRsZSgkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdHMgPSBpbnR2YWwoJHRzKTsKICAgICAgICBpZiAoJHRzIDw9IDApIHsKICAgICAgICAgICAgJHRzID0gdGltZSgpOwogICAgICAgIH0KICAgICAgICBzZWxmOjpMb2FkUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50ID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc3NldChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0aXRsZV0pIHx8IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0aXRsZV0pIDwgJHRzKSB7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRpdGxlXSA9ICR0czsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMTsKICAgICAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgICAgIGlmICghc2VsZjo6JHJhbmRUaXRsZVJlY2VudFNodXRkb3duUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFNodXRkb3duUmVnaXN0ZXJlZCA9IDE7CiAgICAgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnQ3lxaXllemhhbl9jb3JlJywgJ0ZsdXNoUmFuZFRpdGxlUmVjZW50JykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJhbmRvbVRpdGxlRnJvbVJlY2VudENhY2hlKCkKICAgIHsKICAgICAgICBzZWxmOjpMb2FkUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSB8fCBlbXB0eShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRrZXlzID0gYXJyYXlfa2V5cyhzZWxmOjokcmFuZFRpdGxlUmVjZW50KTsKICAgICAgICBpZiAoZW1wdHkoJGtleXMpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJHBpY2tlZCA9ICRrZXlzW2FycmF5X3JhbmQoJGtleXMpXTsKICAgICAgICByZXR1cm4gdHJpbSgoc3RyaW5nKSRwaWNrZWQpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJhbmRUaXRsZUNhY2hlRmlsZSgpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkaXIgLiAncmFuZHRpdGxlX3JlY2VudC5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCkpIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJHdpbmRvdyA9IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50V2luZG93KTsKICAgICAgICBpZiAoJHdpbmRvdyA8IDApIHsKICAgICAgICAgICAgJHdpbmRvdyA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkd2luZG93ID4gMCkgewogICAgICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgICAgICAgICBpZiAoJHRzIDw9IDAgfHwgKCRub3cgLSAkdHMpID4gJHdpbmRvdykgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRdKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0gPSAkdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0gPSBpbnR2YWwoJHRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAka2VlcCA9IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50S2VlcCk7CiAgICAgICAgaWYgKCRrZWVwIDwgMSkgewogICAgICAgICAgICAka2VlcCA9IDE7CiAgICAgICAgfQogICAgICAgIGlmIChjb3VudChzZWxmOjokcmFuZFRpdGxlUmVjZW50KSA+ICRrZWVwKSB7CiAgICAgICAgICAgIGFyc29ydChzZWxmOjokcmFuZFRpdGxlUmVjZW50LCBTT1JUX05VTUVSSUMpOwogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50ID0gYXJyYXlfc2xpY2Uoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCwgMCwgJGtlZXAsIHRydWUpOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBMb2FkUmFuZFRpdGxlUmVjZW50KCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQgPSBhcnJheSgpOwogICAgICAgICRmaWxlID0gc2VsZjo6R2V0UmFuZFRpdGxlQ2FjaGVGaWxlKCk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdyYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkgfHwgIWlzc2V0KCRkZWNvZGVkWydpdGVtcyddKSB8fCAhaXNfYXJyYXkoJGRlY29kZWRbJ2l0ZW1zJ10pKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGRlY29kZWRbJ2l0ZW1zJ10gYXMgJGl0KSB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGl0KSB8fCAhaXNzZXQoJGl0Wyd0J10pKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkaXRbJ3QnXSk7CiAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0cyA9IGlzc2V0KCRpdFsndHMnXSkgPyBpbnR2YWwoJGl0Wyd0cyddKSA6IDA7CiAgICAgICAgICAgIGlmICgkdHMgPD0gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc3NldChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0XSkgfHwgJHRzID4gc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0pIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRdID0gJHRzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlbGY6Ok5vcm1hbGl6ZVJhbmRUaXRsZVJlY2VudCgpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEZsdXNoUmFuZFRpdGxlUmVjZW50KCkKICAgIHsKICAgICAgICBpZiAoIXNlbGY6OiRyYW5kVGl0bGVSZWNlbnREaXJ0eSB8fCAhaXNfYXJyYXkoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZUNhY2hlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzZWxmOjpOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKTsKCiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgJG1lcmdlZCA9IGlzX2FycmF5KHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQpID8gc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA6IGFycmF5KCk7CiAgICAgICAgaWYgKCRyYXcpIHsKICAgICAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkZWNvZGVkKSAmJiBpc3NldCgkZGVjb2RlZFsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGRlY29kZWRbJ2l0ZW1zJ10pKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGVjb2RlZFsnaXRlbXMnXSBhcyAkaXQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdCkgfHwgIWlzc2V0KCRpdFsndCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHQgPSB0cmltKChzdHJpbmcpJGl0Wyd0J10pOwogICAgICAgICAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0cyA9IGlzc2V0KCRpdFsndHMnXSkgPyBpbnR2YWwoJGl0Wyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRtZXJnZWRbJHRdKSB8fCAkdHMgPiAkbWVyZ2VkWyR0XSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWVyZ2VkWyR0XSA9ICR0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9ICRtZXJnZWQ7CiAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CgogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAkaXRlbXNbXSA9IGFycmF5KCd0JyA9PiAkdCwgJ3RzJyA9PiBpbnR2YWwoJHRzKSk7CiAgICAgICAgfQogICAgICAgICRvdXQgPSBqc29uX2VuY29kZShhcnJheSgndHMnID0+ICRub3csICdpdGVtcycgPT4gJGl0ZW1zKSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgaWYgKCRvdXQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgICAgICBAZndyaXRlKCRmcCwgJG91dCk7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50RGlydHkgPSAwOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFVuaXF1ZVRpdGxlKCRnZW5lcmF0b3IsICRmYWxsYmFjayA9ICfpmo/mnLrmoIfpopgnLCAkd2luZG93U2Vjb25kcyA9IDEyMCwgJG1heEF0dGVtcHRzID0gMTAsICRtYXhLZWVwID0gODApCiAgICB7CiAgICAgICAgJGZhbGxiYWNrID0gKHN0cmluZykkZmFsbGJhY2s7CiAgICAgICAgJHdpbmRvd1NlY29uZHMgPSBpbnR2YWwoJHdpbmRvd1NlY29uZHMpOwogICAgICAgIGlmICgkd2luZG93U2Vjb25kcyA8IDApIHsKICAgICAgICAgICAgJHdpbmRvd1NlY29uZHMgPSAwOwogICAgICAgIH0KICAgICAgICAkbWF4QXR0ZW1wdHMgPSBpbnR2YWwoJG1heEF0dGVtcHRzKTsKICAgICAgICBpZiAoJG1heEF0dGVtcHRzIDwgMSkgewogICAgICAgICAgICAkbWF4QXR0ZW1wdHMgPSAxOwogICAgICAgIH0KICAgICAgICAkbWF4S2VlcCA9IGludHZhbCgkbWF4S2VlcCk7CiAgICAgICAgaWYgKCRtYXhLZWVwIDwgMSkgewogICAgICAgICAgICAkbWF4S2VlcCA9IDE7CiAgICAgICAgfQoKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZUNhY2hlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgJHQgPSBpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSA/IGNhbGxfdXNlcl9mdW5jKCRnZW5lcmF0b3IpIDogJyc7CiAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKSR0KTsKICAgICAgICAgICAgcmV0dXJuICR0ICE9PSAnJyA/ICR0IDogJGZhbGxiYWNrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR3aW5kb3dTZWNvbmRzID4gc2VsZjo6JHJhbmRUaXRsZVJlY2VudFdpbmRvdykgewogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50V2luZG93ID0gJHdpbmRvd1NlY29uZHM7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4S2VlcCA+IHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRLZWVwKSB7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRLZWVwID0gJG1heEtlZXA7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkxvYWRSYW5kVGl0bGVSZWNlbnQoKTsKICAgICAgICBzZWxmOjpOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKTsKICAgICAgICAkbm93ID0gdGltZSgpOwogICAgICAgICRyZWNlbnQgPSBpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSA/IHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQgOiBhcnJheSgpOwoKICAgICAgICAkY2hvc2VuID0gJyc7CiAgICAgICAgJGZpcnN0ID0gJyc7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtYXhBdHRlbXB0czsgJGkrKykgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKSR0KTsKICAgICAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkZmlyc3QgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpcnN0ID0gJHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRyZWNlbnRbJHRdKSkgewogICAgICAgICAgICAgICAgICAgICRjaG9zZW4gPSAkdDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGNob3NlbiA9PT0gJycpIHsKICAgICAgICAgICAgJGNob3NlbiA9ICRmaXJzdCAhPT0gJycgPyAkZmlyc3QgOiAkZmFsbGJhY2s7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNob3NlbiAhPT0gJycpIHsKICAgICAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskY2hvc2VuXSA9ICRub3c7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnREaXJ0eSA9IDE7CiAgICAgICAgICAgIHNlbGY6Ok5vcm1hbGl6ZVJhbmRUaXRsZVJlY2VudCgpOwogICAgICAgICAgICBpZiAoIXNlbGY6OiRyYW5kVGl0bGVSZWNlbnRTaHV0ZG93blJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRTaHV0ZG93blJlZ2lzdGVyZWQgPSAxOwogICAgICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJ0N5cWl5ZXpoYW5fY29yZScsICdGbHVzaFJhbmRUaXRsZVJlY2VudCcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNob3NlbiAhPT0gJycgPyAkY2hvc2VuIDogJGZhbGxiYWNrOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFNpdGVIb21lVGl0bGVGYWxsYmFjaygpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSkgewogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+b3B0aW9uKSAmJiBpc19hcnJheSgkemJwLT5vcHRpb24pICYmICFlbXB0eSgkemJwLT5vcHRpb25bJ1pDX0JMT0dfTkFNRSddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpJHpicC0+b3B0aW9uWydaQ19CTE9HX05BTUUnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+bmFtZSkgJiYgJHpicC0+bmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpJHpicC0+bmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJ+maj+acuuagh+mimCc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSXNCYWRUaXRsZSgkdGl0bGUpCiAgICB7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICgkdGl0bGUgPT09ICfnvZHnq5npppbpobUnIHx8ICR0aXRsZSA9PT0gJ+maj+acuuagh+mimCcpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmOjpIYXNUeHRTb3VyY2UoKSkgewogICAgICAgICAgICAkZmFsbGJhY2sgPSBzZWxmOjpHZXRTaXRlSG9tZVRpdGxlRmFsbGJhY2soKTsKICAgICAgICAgICAgaWYgKCRmYWxsYmFjayAhPT0gJycgJiYgJHRpdGxlID09PSAkZmFsbGJhY2spIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBQaWNrVGl0bGVGcm9tUmFuZG9tU291cmNlcygkZXhjbHVkZVRpdGxlcyA9IGFycmF5KCksICRtYXhUcmllcyA9IDMwKQogICAgewogICAgICAgICRleGNsdWRlID0gYXJyYXkoKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGV4Y2x1ZGVUaXRsZXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRleGNsdWRlVGl0bGVzIGFzICR0KSB7CiAgICAgICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkdCk7CiAgICAgICAgICAgICAgICBpZiAoJHQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4Y2x1ZGVbJHRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkbWF4VHJpZXMgPSBpbnR2YWwoJG1heFRyaWVzKTsKICAgICAgICBpZiAoJG1heFRyaWVzIDwgMSkgewogICAgICAgICAgICAkbWF4VHJpZXMgPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoJG1heFRyaWVzID4gMjAwKSB7CiAgICAgICAgICAgICRtYXhUcmllcyA9IDIwMDsKICAgICAgICB9CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heFRyaWVzOyAkaSsrKSB7CiAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKXNlbGY6OkdldFJhbmRUaXRsZSgpKTsKICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSB8fCBzZWxmOjpJc0FydGljbGVUaXRsZSgkdCkgfHwgaXNzZXQoJGV4Y2x1ZGVbJHRdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgIH0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAzMDsgJGkrKykgewogICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZylzZWxmOjpHZXRUeHQoKSk7CiAgICAgICAgICAgIGlmICgkdCA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdCkgfHwgc2VsZjo6SXNBcnRpY2xlVGl0bGUoJHQpIHx8IGlzc2V0KCRleGNsdWRlWyR0XSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIElzQXJ0aWNsZVRpdGxlKCR0aXRsZSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyAkY2FjaGUgPSBhcnJheSgpOwogICAgICAgIGlmIChpc3NldCgkY2FjaGVbJHRpdGxlXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjYWNoZVskdGl0bGVdID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCkKICAgICAgICAgICAgICAgIC0+c2VsZWN0KCR6YnAtPmRiLT5kYnByZSAuICdwb3N0JykKICAgICAgICAgICAgICAgIC0+Y29sdW1uKCdsb2dfSUQnKQogICAgICAgICAgICAgICAgLT53aGVyZShhcnJheSgnPScsICdsb2dfVGl0bGUnLCAkdGl0bGUpKQogICAgICAgICAgICAgICAgLT5saW1pdCgxKS0+c3FsOwogICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgJGhpdCA9ICghZW1wdHkoJGQpKTsKICAgICAgICAgICAgJGNhY2hlWyR0aXRsZV0gPSAkaGl0ID8gMSA6IDA7CiAgICAgICAgICAgIGlmIChjb3VudCgkY2FjaGUpID4gMzAwKSB7CiAgICAgICAgICAgICAgICAkY2FjaGUgPSBhcnJheV9zbGljZSgkY2FjaGUsIC0yMDAsIG51bGwsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkaGl0OwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAkY2FjaGVbJHRpdGxlXSA9IDA7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZFNpdGVOYW1lKCR0aXRsZSA9ICcnKQogICAgewogICAgICAgICR0cGwgPSAoc3RyaW5nKUN5cWl5ZXpoYW4oJ3NudHBsJywgJycpOwogICAgICAgICR0cGwgPSBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICR0cGwpOwogICAgICAgICR0cGwgPSBzdHJfcmVwbGFjZSgiXHIiLCAiXG4iLCAkdHBsKTsKICAgICAgICAkbGluZXMgPSBhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgiXG4iLCAkdHBsKSkpOwogICAgICAgICRuYW1lID0gJyc7CiAgICAgICAgaWYgKCFlbXB0eSgkbGluZXMpKSB7CiAgICAgICAgICAgICRuYW1lID0gKHN0cmluZykkbGluZXNbYXJyYXlfcmFuZCgkbGluZXMpXTsKICAgICAgICB9CiAgICAgICAgaWYgKCRuYW1lICE9PSAnJyAmJiAkdGl0bGUgIT09ICcnKSB7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScpLCAoc3RyaW5nKSR0aXRsZSwgJG5hbWUpOwogICAgICAgIH0KICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJykgewogICAgICAgICAgICAkbmFtZSA9IHNlbGY6OkdldFNpdGVIb21lVGl0bGVGYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJG5hbWU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gVG9VcmxzKCkgICAgCQkJCQkgIAkKICAgIHsgICAgIAkJCSAJCSAKICAgICAgICAkdXJsID0gQ3lxaXllemhhbigndXJscycpOyAgICAgICAJIAkgIAogICAgICAgIGlmICgkdXJsICYmIHByZWdfbWF0Y2hfYWxsKCcjKF58XG58XHIpXHsvKC4qPylcfT1cey8oLio/KVx9KFxyfFxufCQpI2lzJywgJHVybCwgJHQpKSB7ICAgICAJIAkJICAJCiAgICAgICAgICAgIGdsb2JhbCAkemJwOyAgICAJIAkJIAkJIAogICAgICAgICAgICAkdXJsID0gc3RyX3JlcGxhY2UoJHpicC0+aG9zdCwgJycsICR6YnAtPmZ1bGxjdXJyZW50dXJsKTsgICAgIAkJCQkJICAKICAgICAgICAgICAgZm9yZWFjaCAoJHRbMl0gYXMgJGsgPT4gJHIpIHsgICAgIAkgCQkgIAkKICAgICAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmwsICRyKSA9PT0gMCkgeyAgICAJCSAJCQkJIAogICAgICAgICAgICAgICAgICAgIHNlbGY6OnMzMDEoJHpicC0+aG9zdCAuICR0WzNdWyRrXSk7ICAgIAkgCQkgCQkJCiAgICAgICAgICAgICAgICB9ICAgICAgICAJCQkJCiAgICAgICAgICAgIH0gICAgCSAgCSAJIAkKICAgICAgICB9ICAgIAkgICAJICAgCiAgICB9ICAgIAkJCQkJICAJCiAgICBzdGF0aWMgZnVuY3Rpb24gUmFuZFRhZygkaSwgJHVybCA9ICcnKSAgICAJCQkgICAgCQogICAgeyAgICAJICAJCQkJIAogICAgICAgIHN0YXRpYyAkYSA9IG51bGw7ICAgIAkgCQkgCSAJCiAgICAgICAgaWYgKCRhID09PSBudWxsKSB7ICAgIAkgCQkJIAkJCiAgICAgICAgICAgICRhID0gJyc7CiAgICAgICAgfSAgICAJICAgCSAJIAogICAgICAgIGlmICgkYSkgewogICAgICAgICAgICBpZiAoJGEgPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmICgkdXJsICYmIEN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICAgICAgICAgICRpaSA9IHNlbGY6OkdldE9yQ3JlYXRlVXJsVGl0bGUoJHVybCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRpaSA9IHNlbGY6OkdldFR4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRpaSkgewogICAgICAgICAgICAgICAgICAgICRpID0gJGlpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGkgPSAkYVthcnJheV9yYW5kKCRhKV07CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdCA9IHNlbGY6OkdldFJhbmRUaXRsZSgpOwogICAgICAgICAgICBpZiAoJHQpIHsKICAgICAgICAgICAgICAgICRpID0gJHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRpOyAgICAgCQkJICAgIAogICAgfSAgICAgCSAJCSAJIAogICAgc3RhdGljIGZ1bmN0aW9uIExpbms0MDQoKSAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgICAJICAgCQkKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkY3VycmVudCA9IGlzc2V0KCR6YnAtPmZ1bGxjdXJyZW50dXJsKSA/IChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwgOiAoaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJyk7CiAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkRm9vdGVyTGlua3NIdG1sKCRjdXJyZW50KTsKICAgIH0gICAgICAJIAkgCSAKICAgIHN0YXRpYyBmdW5jdGlvbiBSYW5kb21MZXR0ZXJzKCRtaW4gPSA0LCAkbWF4ID0gNSkKICAgIHsKICAgICAgICAkbWluID0gaW50dmFsKCRtaW4pOwogICAgICAgICRtYXggPSBpbnR2YWwoJG1heCk7CiAgICAgICAgaWYgKCRtaW4gPD0gMCkgewogICAgICAgICAgICAkbWluID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCRtYXggPCAkbWluKSB7CiAgICAgICAgICAgICRtYXggPSAkbWluOwogICAgICAgIH0KICAgICAgICBpZiAoJG1heCA+IDMyKSB7CiAgICAgICAgICAgICRtYXggPSAzMjsKICAgICAgICB9CiAgICAgICAgJGwgPSBtdF9yYW5kKCRtaW4sICRtYXgpOwogICAgICAgICRvdXQgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbDsgJGkrKykgewogICAgICAgICAgICAkb3V0IC49IGNocihtdF9yYW5kKDk3LCAxMjIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRGb290ZXJMaW5rc0h0bWwoJGN1cnJlbnRVcmwgPSAnJywgJG51bSA9IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEJ1aWxkU2l0ZUZyaWVuZExpbmtzSHRtbCgkaG9zdE9ubHksICRjdXJyZW50VXJsID0gJycsICRudW0gPSBudWxsKQogICAgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2l0ZUZyaWVuZHNDYWNoZUZpbGVCeUtleSgkY2FjaGVLZXkpCiAgICB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZW5lcmF0ZVNpdGVGcmllbmRMaW5rc0NhY2hlKCRob3N0T25seSwgJGN1cnJlbnRVcmwgPSAnJywgJG51bSA9IG51bGwpCiAgICB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBDbGVhclNpdGVGcmllbmRMaW5rc0NhY2hlKCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTWF5YmVBdXRvR2VuZXJhdGVTaXRlRnJpZW5kTGlua3NDYWNoZSgpCiAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RGlyZWN0SG9zdFBhZ2VzQ2FjaGVGaWxlKCkKICAgICAgICB7CiAgICAgICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGRpciAuICdkaXJlY3RfaG9zdF9wYWdlc19jYWNoZS5qc29uJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldEppaHVhcmVud3VTdGF0ZUZpbGUoKQogICAgICAgIHsKICAgICAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGlyIC4gJ2ppaHVhcmVud3Vfc3RhdGUuanNvbic7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXQ0MDRTdWlqaVBhZ2VNYXBGaWxlKCkKICAgICAgICB7CiAgICAgICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGRpciAuICdlcnJvcjQwNF9zdWlqaV9wYWdlX21hcC5qc29uJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldDQwNFN1aWppTW9kZSgpCiAgICAgICAgewogICAgICAgICAgICAkbW9kZSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ2Vycm9yNDA0X3N1aWppX21vZGUnLCAnZml4ZWQnKSkpOwogICAgICAgICAgICBpZiAoJG1vZGUgIT09ICdyYW5kb20nKSB7CiAgICAgICAgICAgICAgICAkbW9kZSA9ICdmaXhlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRtb2RlOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gTG9hZDQwNFN1aWppUGFnZU1hcCgpCiAgICAgICAgewogICAgICAgICAgICAkZmlsZSA9IHNlbGY6OkdldDQwNFN1aWppUGFnZU1hcEZpbGUoKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyYXcgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkcmF3KSB8fCAkcmF3ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRkYXRhKSA/ICRkYXRhIDogYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFNhdmU0MDRTdWlqaVBhZ2VNYXAoJG1hcCkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlID0gc2VsZjo6R2V0NDA0U3VpamlQYWdlTWFwRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19hcnJheSgkbWFwKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZSgkbWFwLCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRvdXQpIHx8ICRvdXQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJG91dCkgIT09IGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQ2xlYXI0MDRTdWlqaVBhZ2VNYXAoKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXQ0MDRTdWlqaVBhZ2VNYXBGaWxlKCk7CiAgICAgICAgICAgIGlmICgkZmlsZSAhPT0gJycgJiYgaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZDQwNFN1aWppUGFnZU1hcEtleSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGN1cnJlbnRIb3N0KTsKICAgICAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICAkY3VycmVudFVybCA9IHRyaW0oKHN0cmluZykkY3VycmVudFVybCk7CiAgICAgICAgICAgIGlmICgkY3VycmVudFVybCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXJzZWQgPSBAcGFyc2VfdXJsKCRjdXJyZW50VXJsKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcGFyc2VkKSAmJiBpc3NldCgkcGFyc2VkWydwYXRoJ10pICYmIChzdHJpbmcpJHBhcnNlZFsncGF0aCddICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcGFyc2VkWydwYXRoJ107CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGN1cnJlbnRVcmxbMF0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGN1cnJlbnRVcmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcGF0aCk7CiAgICAgICAgICAgIHJldHVybiBtZDUoJGhvc3QgLiAnfCcgLiAkcGF0aCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBQaWNrNDA0U3VpamlQYWdlSXRlbSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICAkY2FjaGUgPSBzZWxmOjpMb2FkRGlyZWN0SG9zdFBhZ2VzQ2FjaGUoKTsKICAgICAgICAgICAgJGl0ZW1zID0gKGlzc2V0KCRjYWNoZVsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGNhY2hlWydpdGVtcyddKSkgPyAkY2FjaGVbJ2l0ZW1zJ10gOiBhcnJheSgpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG1vZGUgPSBzZWxmOjpHZXQ0MDRTdWlqaU1vZGUoKTsKICAgICAgICAgICAgaWYgKCRtb2RlID09PSAnZml4ZWQnKSB7CiAgICAgICAgICAgICAgICAka2V5ID0gc2VsZjo6QnVpbGQ0MDRTdWlqaVBhZ2VNYXBLZXkoJGN1cnJlbnRIb3N0LCAkY3VycmVudFVybCk7CiAgICAgICAgICAgICAgICBpZiAoJGtleSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkbWFwID0gc2VsZjo6TG9hZDQwNFN1aWppUGFnZU1hcCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbWFwWyRrZXldWydmaWxlX3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNhdmVkUGF0aCA9IChzdHJpbmcpJG1hcFska2V5XVsnZmlsZV9wYXRoJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRpdGVtWydmaWxlX3BhdGgnXSkgJiYgKHN0cmluZykkaXRlbVsnZmlsZV9wYXRoJ10gPT09ICRzYXZlZFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGNob3NlbiA9ICRpdGVtc1thcnJheV9yYW5kKCRpdGVtcyldOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkY2hvc2VuKSAmJiAhZW1wdHkoJGNob3NlblsnZmlsZV9wYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtYXBbJGtleV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlX3BhdGgnID0+IChzdHJpbmcpJGNob3NlblsnZmlsZV9wYXRoJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gaXNzZXQoJGNob3NlblsnaG9zdCddKSA/IChzdHJpbmcpJGNob3NlblsnaG9zdCddIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+IGlzc2V0KCRjaG9zZW5bJ3RpdGxlJ10pID8gKHN0cmluZykkY2hvc2VuWyd0aXRsZSddIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6U2F2ZTQwNFN1aWppUGFnZU1hcCgkbWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjaG9zZW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRjaG9zZW4gPSAkaXRlbXNbYXJyYXlfcmFuZCgkaXRlbXMpXTsKICAgICAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRjaG9zZW4pID8gJGNob3NlbiA6IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIOiHquWumuS5ieWQjuWPsOeZu+W9leWcsOWdgO+8iOWkjeWIu+iHqiB5dGVjbl9hbG9naW7vvIzliqjmgIEv5Lyq6Z2Z5oCB5Y+M5qih5byP77yJCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpUWl5b25nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpbnR2YWwoQ3lxaXllemhhbignaG91dGFpX2RpemhpX3FpeW9uZycsIDApKSA9PT0gMTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpR3VvbHYoJGd1YW5qaWFuemkpCiAgICAgICAgewogICAgICAgICAgICAkZ3VhbmppYW56aSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSRndWFuamlhbnppKSk7CiAgICAgICAgICAgIGlmICgkZ3VhbmppYW56aSA9PT0gJycgfHwgIXByZWdfbWF0Y2goJyNeW2EtejAtOV1bYS16MC05Xy1dezEsMzF9JCMnLCAkZ3VhbmppYW56aSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYmFvbGl1ID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnemJfc3lzdGVtJywgJ3piX3VzZXJzJywgJ2FkbWluJywgJ2xvZ2luJywgJ2xvZ291dCcsICd2ZXJpZnknLCAnY21kJywKICAgICAgICAgICAgICAgICdhcGknLCAnZmVlZCcsICdzZWFyY2gnLCAnaW5kZXgnLCAnaW5kZXgucGhwJywgJ3JzcycsICdzaXRlbWFwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRndWFuamlhbnppLCAkYmFvbGl1LCB0cnVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZ3VhbmppYW56aTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpRGVuZ2x1WWUoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgIGlmICghZW1wdHkoJHpicC0+dXNlci0+SUQpKSB7CiAgICAgICAgICAgICAgICBSZWRpcmVjdCgkemJwLT5ob3N0IC4gJ3piX3N5c3RlbS9hZG1pbi9pbmRleC5waHA/YWN0PWFkbWluJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHpicC0+dGVtcGxhdGUtPlNldFRhZ3MoJ0dMT0JBTFMnLCAkR0xPQkFMUyk7CiAgICAgICAgICAgICRtdWJhbk11bHUgPSAkR0xPQkFMU1sndXNlcnNkaXInXSAuICdwbHVnaW4vQ3lxaXllemhhbi90aGVtZS8nOwogICAgICAgICAgICAkemJwLT50ZW1wbGF0ZS0+U2V0UGF0aCgkbXViYW5NdWx1KTsKICAgICAgICAgICAgJHpicC0+dGVtcGxhdGUtPlNldFRlbXBsYXRlKCdob3V0YWlfZGVuZ2x1Jyk7CiAgICAgICAgICAgICR6YnAtPnRlbXBsYXRlLT5EaXNwbGF5KCk7CiAgICAgICAgICAgIGRpZSgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSG91dGFpRGl6aGlKaWFuY2UoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgIGlmICghc2VsZjo6SG91dGFpRGl6aGlRaXlvbmcoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtb3NoaSA9IGlzc2V0KCR6YnAtPm9wdGlvblsnWkNfU1RBVElDX01PREUnXSkgPyAoc3RyaW5nKSR6YnAtPm9wdGlvblsnWkNfU1RBVElDX01PREUnXSA6ICdBQ1RJVkUnOwogICAgICAgICAgICBpZiAoJG1vc2hpID09PSAnUkVXUklURScpIHsKICAgICAgICAgICAgICAgICRndWFuamlhbnppID0gc2VsZjo6SG91dGFpRGl6aGlHdW9sdihDeXFpeWV6aGFuKCdob3V0YWlfd2VpamluZ3RhaV91cmwnLCAnJykpOwogICAgICAgICAgICAgICAgaWYgKCRndWFuamlhbnppID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRxaW5ncWl1VXJpID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcvJzsKICAgICAgICAgICAgICAgICRsdWppbmcgPSAoc3RyaW5nKXBhcnNlX3VybCgkcWluZ3FpdVVyaSwgUEhQX1VSTF9QQVRIKTsKICAgICAgICAgICAgICAgIGlmICgkbHVqaW5nID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICRsdWppbmcgPSAnLyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkamljaHVMdWppbmcgPSBpc3NldCgkemJwLT5jb29raWVzcGF0aCkgPyAoc3RyaW5nKSR6YnAtPmNvb2tpZXNwYXRoIDogJy8nOwogICAgICAgICAgICAgICAgaWYgKCRqaWNodUx1amluZyAhPT0gJycgJiYgJGppY2h1THVqaW5nICE9PSAnLycgJiYgc3RycG9zKCRsdWppbmcsICRqaWNodUx1amluZykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAkbHVqaW5nID0gJy8nIC4gbHRyaW0oc3Vic3RyKCRsdWppbmcsIHN0cmxlbihydHJpbSgkamljaHVMdWppbmcsICcvJykpKSwgJy8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsdWppbmcgPSBydHJpbSgkbHVqaW5nLCAnLycpOwogICAgICAgICAgICAgICAgaWYgKCRsdWppbmcgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGx1amluZyA9ICcvJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkbHVqaW5nID09PSAnLycgLiAkZ3VhbmppYW56aSkgewogICAgICAgICAgICAgICAgICAgIHNlbGY6OkhvdXRhaURpemhpRGVuZ2x1WWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRndWFuamlhbnppID0gc2VsZjo6SG91dGFpRGl6aGlHdW9sdihDeXFpeWV6aGFuKCdob3V0YWlfZG9uZ3RhaV91cmwnLCAnJykpOwogICAgICAgICAgICAgICAgaWYgKCRndWFuamlhbnppID09PSAnJyB8fCAhaXNzZXQoJF9HRVRbJGd1YW5qaWFuemldKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGY6OkhvdXRhaURpemhpRGVuZ2x1WWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSG91dGFpRGl6aGlZYW56aGVuZygpCiAgICAgICAgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgJGRvbmd6dW8gPSAoc3RyaW5nKUdldFZhcnMoJ2FjdCcsICdHRVQnKTsKICAgICAgICAgICAgaWYgKCRkb25nenVvICE9PSAndmVyaWZ5JykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZjo6SG91dGFpRGl6aGlRaXlvbmcoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRiaWFvc2hpID0gKGludClHZXRWYXJzKCdjeXF5aG91dGFpJywgJ0dFVCcpOwogICAgICAgICAgICBpZiAoJGJpYW9zaGkgIT09IDEpIHsKICAgICAgICAgICAgICAgICR6YnAtPlNob3dFcnJvcig4LCBfX0ZJTEVfXywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgZGllKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFZlcmlmeUxvZ2luKCkpIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHpicC0+dXNlci0+SUQpICYmIEdldFZhcnMoJ3JlZGlyZWN0JywgJ0NPT0tJRScpKSB7CiAgICAgICAgICAgICAgICAgICAgJGEgPSBwYXJzZV91cmwoR2V0VmFycygncmVkaXJlY3QnLCAnQ09PS0lFJykpOwogICAgICAgICAgICAgICAgICAgICRiID0gcGFyc2VfdXJsKCR6YnAtPmhvc3QpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYVsnaG9zdCddKSAmJiBpc3NldCgkYlsnaG9zdCddKSAmJiBzdHJ0b2xvd2VyKChzdHJpbmcpJGFbJ2hvc3QnXSkgPT09IHN0cnRvbG93ZXIoKHN0cmluZykkYlsnaG9zdCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICBSZWRpcmVjdChHZXRWYXJzKCdyZWRpcmVjdCcsICdDT09LSUUnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUmVkaXJlY3QoJHpicC0+aG9zdCAuICd6Yl9zeXN0ZW0vYWRtaW4vaW5kZXgucGhwP2FjdD1hZG1pbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgUmVkaXJlY3QoJy4uLycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZERpcmVjdEhvc3RQYWdlSXRlbXMoKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgaWYgKCFpc19kaXIoJGJhc2VEaXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJvb3RIb3N0ID0gc2VsZjo6R2V0TGxtc1Jvb3RIb3N0KCk7CiAgICAgICAgICAgIGlmICgkcm9vdEhvc3QgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKICAgICAgICAgICAgJG5hbWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGVudHJpZXMgPSBAc2NhbmRpcigkYmFzZURpcik7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGVudHJpZXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJGVudHJpZXMgYXMgJGVudHJ5KSB7CiAgICAgICAgICAgICAgICBpZiAoJGVudHJ5ID09PSAnLicgfHwgJGVudHJ5ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGhvc3QgPSAnJzsKICAgICAgICAgICAgICAgICR0aXRsZSA9ICcnOwogICAgICAgICAgICAgICAgJGtleXdvcmQgPSAnJzsKICAgICAgICAgICAgICAgICRtdGltZSA9IDA7CiAgICAgICAgICAgICAgICAkZmlsZVBhdGggPSAnJzsKICAgICAgICAgICAgICAgICRmdWxsID0gJGJhc2VEaXIgLiAkZW50cnk7CiAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRmdWxsKSAmJiBpc19maWxlKCRmdWxsIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbmRleC5odG1sJykpIHsKICAgICAgICAgICAgICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkZW50cnkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHJfY291bnQoJG5hbWUsICcuJykgPj0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lIC4gJy4nIC4gJHJvb3RIb3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGluZGV4RmlsZSA9ICRmdWxsIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbmRleC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZCA9IHNlbGY6OkV4dHJhY3RGaXJzdEtleXdvcmRGcm9tSHRtbEZpbGUoJGluZGV4RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gc2VsZjo6RXh0cmFjdFRpdGxlRnJvbUh0bWxGaWxlKCRpbmRleEZpbGUpOwogICAgICAgICAgICAgICAgICAgICRtdGltZSA9IGlzX2ZpbGUoJGluZGV4RmlsZSkgPyBpbnR2YWwoQGZpbGVtdGltZSgkaW5kZXhGaWxlKSkgOiAwOwogICAgICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9ICdodG1sX3BhZ2VzLycgLiAkZW50cnkgLiAnL2luZGV4Lmh0bWwnOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzX2ZpbGUoJGZ1bGwpICYmIHN0cnRvbG93ZXIocGF0aGluZm8oJGVudHJ5LCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpcGF0aGluZm8oJGVudHJ5LCBQQVRISU5GT19GSUxFTkFNRSkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHJfY291bnQoJG5hbWUsICcuJykgPj0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lIC4gJy4nIC4gJHJvb3RIb3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGtleXdvcmQgPSBzZWxmOjpFeHRyYWN0Rmlyc3RLZXl3b3JkRnJvbUh0bWxGaWxlKCRmdWxsKTsKICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSBzZWxmOjpFeHRyYWN0VGl0bGVGcm9tSHRtbEZpbGUoJGZ1bGwpOwogICAgICAgICAgICAgICAgICAgICRtdGltZSA9IGludHZhbChAZmlsZW10aW1lKCRmdWxsKSk7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVQYXRoID0gJ2h0bWxfcGFnZXMvJyAuICRlbnRyeTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGhvc3QgPT09ICcnIHx8IGlzc2V0KCRuYW1lc1skaG9zdF0pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbmFtZXNbJGhvc3RdID0gMTsKCiAgICAgICAgICAgICAgICAkZGlzcGxheVRleHQgPSAka2V5d29yZCAhPT0gJycgPyAka2V5d29yZCA6ICR0aXRsZTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcGxheVRleHQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhYmVsID0gcHJlZ19yZXBsYWNlKCcjXC4nIC4gcHJlZ19xdW90ZSgkcm9vdEhvc3QsICcjJykgLiAnJCNpJywgJycsICRob3N0KTsKICAgICAgICAgICAgICAgICAgICAkZGlzcGxheVRleHQgPSAkbGFiZWwgIT09ICcnID8gJGxhYmVsIDogJGhvc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGl0ZW1zW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+ICRkaXNwbGF5VGV4dCwKICAgICAgICAgICAgICAgICAgICAncmF3X3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnID0+ICRrZXl3b3JkLAogICAgICAgICAgICAgICAgICAgICd1cmwnID0+ICdodHRwczovLycgLiAkaG9zdCAuICcvJywKICAgICAgICAgICAgICAgICAgICAndGFyZ2V0JyA9PiAxLAogICAgICAgICAgICAgICAgICAgICdob3N0JyA9PiAkaG9zdCwKICAgICAgICAgICAgICAgICAgICAnbXRpbWUnID0+ICRtdGltZSwKICAgICAgICAgICAgICAgICAgICAnZmlsZV9wYXRoJyA9PiAkZmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgJ2JhdGNoX25vJyA9PiAoc3Vic3RyKCRmaWxlUGF0aCwgLTExKSA9PT0gJy9pbmRleC5odG1sJykgPyAn55uu5b2V55u06K+7JyA6ICfmlofku7bnm7Tor7snLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICB1c29ydCgkaXRlbXMsIGZ1bmN0aW9uICgkYSwgJGIpIHsKICAgICAgICAgICAgICAgICAgICAkbXRpbWVBID0gaXNzZXQoJGFbJ210aW1lJ10pID8gaW50dmFsKCRhWydtdGltZSddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgJG10aW1lQiA9IGlzc2V0KCRiWydtdGltZSddKSA/IGludHZhbCgkYlsnbXRpbWUnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkbXRpbWVBID09PSAkbXRpbWVCKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJjbXAoKHN0cmluZykkYVsnaG9zdCddLCAoc3RyaW5nKSRiWydob3N0J10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRtdGltZUEgPCAkbXRpbWVCKSA/IDEgOiAtMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGl0ZW1zOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gUmVmcmVzaERpcmVjdEhvc3RQYWdlc0NhY2hlKCRmb3JjZSA9IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXREaXJlY3RIb3N0UGFnZXNDYWNoZUZpbGUoKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdnZW5lcmF0ZWRfYXQnID0+IHRpbWUoKSwgJ3RvdGFsJyA9PiAwLCAnaXRlbXMnID0+IGFycmF5KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGZvcmNlICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhdykgJiYgJHJhdyAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkgJiYgaXNzZXQoJGRhdGFbJ2l0ZW1zJ10pICYmIGlzX2FycmF5KCRkYXRhWydpdGVtcyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRpdGVtcyA9IHNlbGY6OkJ1aWxkRGlyZWN0SG9zdFBhZ2VJdGVtcygpOwogICAgICAgICAgICAkZGF0YSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2dlbmVyYXRlZF9hdCcgPT4gdGltZSgpLAogICAgICAgICAgICAgICAgJ3RvdGFsJyA9PiBjb3VudCgkaXRlbXMpLAogICAgICAgICAgICAgICAgJ2l0ZW1zJyA9PiAkaXRlbXMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRvdXQpICYmICRvdXQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIExvYWREaXJlY3RIb3N0UGFnZXNDYWNoZSgpCiAgICAgICAgewogICAgICAgICAgICAkZmlsZSA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlc0NhY2hlRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhdykgJiYgJHJhdyAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkgJiYgaXNzZXQoJGRhdGFbJ2l0ZW1zJ10pICYmIGlzX2FycmF5KCRkYXRhWydpdGVtcyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpSZWZyZXNoRGlyZWN0SG9zdFBhZ2VzQ2FjaGUodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRKaWh1YXJlbnd1U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRKaWh1YXJlbnd1U3RhdGVGaWxlKCk7CiAgICAgICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHJhdykgfHwgJHJhdyA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiBpc19hcnJheSgkZGF0YSkgPyAkZGF0YSA6IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBTYXZlSmlodWFyZW53dVN0YXRlKCRzdGF0ZSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlID0gc2VsZjo6R2V0SmlodWFyZW53dVN0YXRlRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19hcnJheSgkc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKCRzdGF0ZSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkb3V0KSB8fCAkb3V0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRvdXQpICE9PSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJ1bkppaHVhcmVud3UoJGZvcmNlID0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRjYWNoZSA9IHNlbGY6OlJlZnJlc2hEaXJlY3RIb3N0UGFnZXNDYWNoZSgkZm9yY2UgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAkbGxtc09rID0gc2VsZjo6UmVmcmVzaExsbXNUeHQodHJ1ZSk7CiAgICAgICAgICAgICRzdGF0ZSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2xhc3RfcnVuJyA9PiB0aW1lKCksCiAgICAgICAgICAgICAgICAnZGlyZWN0X2hvc3RfdG90YWwnID0+IGlzc2V0KCRjYWNoZVsndG90YWwnXSkgPyBpbnR2YWwoJGNhY2hlWyd0b3RhbCddKSA6IDAsCiAgICAgICAgICAgICAgICAnbGxtc19vaycgPT4gJGxsbXNPayA/IDEgOiAwLAogICAgICAgICAgICAgICAgJ2xsbXNfZmlsZScgPT4gc2VsZjo6R2V0TGxtc1R4dEZpbGVQYXRoKCksCiAgICAgICAgICAgICAgICAnbGxtc19mdWxsX2ZpbGUnID0+IHNlbGY6OkdldExsbXNGdWxsVHh0RmlsZVBhdGgoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2VsZjo6U2F2ZUppaHVhcmVud3VTdGF0ZSgkc3RhdGUpOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAnb2snID0+IDEsCiAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gJ+iuoeWIkuS7u+WKoeaJp+ihjOWujOaIkCcsCiAgICAgICAgICAgICAgICAnc3RhdGUnID0+ICRzdGF0ZSwKICAgICAgICAgICAgICAgICdjYWNoZScgPT4gJGNhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0SG9tZXBhZ2VGcmllbmRMaW5rSXRlbXMoJGxpbWl0ID0gMjAsICRyYW5kb21pemUgPSBmYWxzZSwgJHBvb2xMaW1pdCA9IDApCiAgICAgICAgewogICAgICAgICAgICAkbGltaXQgPSBpbnR2YWwoJGxpbWl0KTsKICAgICAgICAgICAgaWYgKCRsaW1pdCA8IDEpIHsKICAgICAgICAgICAgICAgICRsaW1pdCA9IDIwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbGltaXQgPiAxMDApIHsKICAgICAgICAgICAgICAgICRsaW1pdCA9IDEwMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY2FjaGUgPSBzZWxmOjpMb2FkRGlyZWN0SG9zdFBhZ2VzQ2FjaGUoKTsKICAgICAgICAgICAgJGl0ZW1zID0gKGlzc2V0KCRjYWNoZVsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGNhY2hlWydpdGVtcyddKSkgPyAkY2FjaGVbJ2l0ZW1zJ10gOiBhcnJheSgpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcmFuZG9taXplKSB7CiAgICAgICAgICAgICAgICAkcG9vbExpbWl0ID0gaW50dmFsKCRwb29sTGltaXQpOwogICAgICAgICAgICAgICAgaWYgKCRwb29sTGltaXQgPCAkbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAkcG9vbExpbWl0ID0gJGxpbWl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRwb29sTGltaXQgPiBjb3VudCgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBvb2xMaW1pdCA9IGNvdW50KCRpdGVtcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHBvb2xMaW1pdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbXMgPSBhcnJheV9zbGljZSgkaXRlbXMsIDAsICRwb29sTGltaXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2h1ZmZsZSgkaXRlbXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAwLCAkbGltaXQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gRXh0cmFjdFRpdGxlRnJvbUh0bWxGaWxlKCRmaWxlUGF0aCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkZmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGVQYXRoLCBmYWxzZSwgbnVsbCwgMCwgMzI3NjgpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkaHRtbCkgfHwgJGh0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyM8dGl0bGVcYltePl0qPiguKj8pPC90aXRsZT4jaXMnLCAkaHRtbCwgJG0pKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSB0cmltKGh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKChzdHJpbmcpJG1bMV0pLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSk7CiAgICAgICAgICAgICAgICBpZiAoJHRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGl0bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gVG9VdGY4VGV4dCgkdGV4dCkKICAgICAgICB7CiAgICAgICAgICAgICR0ZXh0ID0gKHN0cmluZykkdGV4dDsKICAgICAgICAgICAgaWYgKCR0ZXh0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgnLy91JywgJHRleHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CiAgICAgICAgICAgICAgICAkY29udmVydGVkID0gQG1iX2NvbnZlcnRfZW5jb2RpbmcoJHRleHQsICdVVEYtOCcsICdVVEYtOCxHQjE4MDMwLEdCSyxDUDkzNixCSUc1Jyk7CiAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRjb252ZXJ0ZWQpICYmICRjb252ZXJ0ZWQgIT09ICcnICYmIEBwcmVnX21hdGNoKCcvL3UnLCAkY29udmVydGVkKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkY29udmVydGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKICAgICAgICAgICAgICAgICRjb252ZXJ0ZWQgPSBAaWNvbnYoJ0dCMTgwMzAnLCAnVVRGLTgvL0lHTk9SRScsICR0ZXh0KTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGNvbnZlcnRlZCkgJiYgJGNvbnZlcnRlZCAhPT0gJycgJiYgQHByZWdfbWF0Y2goJy8vdScsICRjb252ZXJ0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb252ZXJ0ZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY29udmVydGVkID0gQGljb252KCdHQksnLCAnVVRGLTgvL0lHTk9SRScsICR0ZXh0KTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGNvbnZlcnRlZCkgJiYgJGNvbnZlcnRlZCAhPT0gJycgJiYgQHByZWdfbWF0Y2goJy8vdScsICRjb252ZXJ0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb252ZXJ0ZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gRXh0cmFjdEZpcnN0S2V5d29yZEZyb21IdG1sRmlsZSgkZmlsZVBhdGgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRodG1sID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCwgZmFsc2UsIG51bGwsIDAsIDEzMTA3Mik7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRodG1sKSB8fCAkaHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAka2V5d29yZHMgPSAnJzsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy88bWV0YVxiW14+XSpuYW1lXHMqPVxzKlsiXCdda2V5d29yZHNbIlwnXVtePl0qY29udGVudFxzKj1ccypbIlwnXShbXiJcJ10qKVsiXCddW14+XSo+L2knLCAkaHRtbCwgJG0pKSB7CiAgICAgICAgICAgICAgICAka2V5d29yZHMgPSBpc3NldCgkbVsxXSkgPyAoc3RyaW5nKSRtWzFdIDogJyc7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvPG1ldGFcYltePl0qY29udGVudFxzKj1ccypbIlwnXShbXiJcJ10qKVsiXCddW14+XSpuYW1lXHMqPVxzKlsiXCdda2V5d29yZHNbIlwnXVtePl0qPi9pJywgJGh0bWwsICRtKSkgewogICAgICAgICAgICAgICAgJGtleXdvcmRzID0gaXNzZXQoJG1bMV0pID8gKHN0cmluZykkbVsxXSA6ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRrZXl3b3JkcyA9IHRyaW0oc2VsZjo6VG9VdGY4VGV4dChodG1sX2VudGl0eV9kZWNvZGUoJGtleXdvcmRzLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSkpOwogICAgICAgICAgICBpZiAoJGtleXdvcmRzID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXJ0cyA9IHByZWdfc3BsaXQoJy9bXHMs77yMO++8m3xcL10rL3UnLCAka2V5d29yZHMpOwogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYXJ0cykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAgICAgICAgICRwYXJ0ID0gdHJpbSgoc3RyaW5nKSRwYXJ0KTsKICAgICAgICAgICAgICAgIGlmICgkcGFydCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHBhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRIb21lcGFnZUZyaWVuZExpbmtzSHRtbCgkbGltaXQgPSAyMCwgJHJhbmRvbWl6ZSA9IGZhbHNlLCAkcG9vbExpbWl0ID0gMCkKICAgICAgICB7CiAgICAgICAgICAgICRpdGVtcyA9IHNlbGY6OkdldEhvbWVwYWdlRnJpZW5kTGlua0l0ZW1zKCRsaW1pdCwgJHJhbmRvbWl6ZSwgJHBvb2xMaW1pdCk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGh0bWwgPSAnJzsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBodG1sc3BlY2lhbGNoYXJzKHRyaW0oKHN0cmluZykkaXRlbVsndGl0bGUnXSksIEVOVF9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAgICAgJHVybCA9IGh0bWxzcGVjaWFsY2hhcnMoKHN0cmluZykkaXRlbVsndXJsJ10sIEVOVF9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgJHVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRodG1sIC49ICc8YSBocmVmPSInIC4gJHVybCAuICciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj4nIC4gJHRpdGxlIC4gJzwvYT4nIC4gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGh0bWw7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zUm9vdEhvc3QoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgICRjYW5kaWRhdGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGNvbmZpZ3VyZWRIb3N0ID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigoc3RyaW5nKUN5cWl5ZXpoYW4oJ2xsbXNfcm9vdF9ob3N0JywgJycpKTsKICAgICAgICAgICAgaWYgKCRjb25maWd1cmVkSG9zdCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAkY29uZmlndXJlZEhvc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJvb3RIb3N0ID0gc2VsZjo6R2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCk7CiAgICAgICAgICAgIGlmICgkcm9vdEhvc3QgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJHJvb3RIb3N0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRob3N0ID0gaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJzsKICAgICAgICAgICAgaWYgKCRob3N0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJHBhcnNlZCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgICAgIGlmICgkcGFyc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSRwYXJzZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRob3N0KTsKICAgICAgICAgICAgaWYgKCRob3N0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXNbXSA9ICRob3N0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAneWlxaWxhaXdhbi5jb20nOwogICAgICAgICAgICBmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigkY2FuZGlkYXRlKTsKICAgICAgICAgICAgICAgIGlmICgkY2FuZGlkYXRlID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRjYW5kaWRhdGUgPT09ICdsb2NhbGhvc3QnIHx8IHByZWdfbWF0Y2goJyNeXGR7MSwzfShcLlxkezEsM30pezN9JCMnLCAkY2FuZGlkYXRlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRjYW5kaWRhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0TGxtc0Jhc2VTaXRlVXJsKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkcm9vdEhvc3QgPSBzZWxmOjpHZXRMbG1zUm9vdEhvc3QoKTsKICAgICAgICAgICAgaWYgKCRyb290SG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHAnOwogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+aG9zdCkgJiYgc3RyaXBvcygoc3RyaW5nKSR6YnAtPmhvc3QsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHBzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHNjaGVtZSAuICc6Ly8nIC4gJHJvb3RIb3N0OwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRBYnNvbHV0ZVVybEZvckhvc3QoJGhvc3QpCiAgICAgICAgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdCk7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHAnOwogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+aG9zdCkgJiYgc3RyaXBvcygoc3RyaW5nKSR6YnAtPmhvc3QsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHBzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHNjaGVtZSAuICc6Ly8nIC4gJGhvc3QgLiAnLyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVVcmxUb0Jhc2VTaXRlKCR1cmwsICRiYXNlU2l0ZVVybCkKICAgICAgICB7CiAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgICAgICRiYXNlU2l0ZVVybCA9IHJ0cmltKChzdHJpbmcpJGJhc2VTaXRlVXJsLCAnLycpOwogICAgICAgICAgICBpZiAoJGJhc2VTaXRlVXJsID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2VTaXRlVXJsIC4gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfUEFUSCk7CiAgICAgICAgICAgICRxdWVyeSA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1FVRVJZKTsKICAgICAgICAgICAgJGZyYWdtZW50ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfRlJBR01FTlQpOwogICAgICAgICAgICBpZiAoISRwYXRoIHx8ICRwYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRwYXRoWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nIC4gJHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9ICRiYXNlU2l0ZVVybCAuICRwYXRoOwogICAgICAgICAgICBpZiAoJHF1ZXJ5ICE9PSBudWxsICYmICRxdWVyeSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRvdXQgLj0gJz8nIC4gJHF1ZXJ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZnJhZ21lbnQgIT09IG51bGwgJiYgJGZyYWdtZW50ICE9PSAnJykgewogICAgICAgICAgICAgICAgJG91dCAuPSAnIycgLiAkZnJhZ21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRvdXQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zQXJ0aWNsZUl0ZW1zKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkYmFzZVNpdGVVcmwgPSBzZWxmOjpHZXRMbG1zQmFzZVNpdGVVcmwoKTsKICAgICAgICAgICAgaWYgKCRiYXNlU2l0ZVVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRpdGVtcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaXN0ID0gJHpicC0+R2V0QXJ0aWNsZUxpc3QoJycsIGFycmF5KGFycmF5KCc9JywgJ2xvZ19TdGF0dXMnLCAnMCcpKSwgYXJyYXkoJ2xvZ19Qb3N0VGltZScgPT4gJ0RFU0MnKSwgbnVsbCwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRsaXN0KSB8fCBlbXB0eSgkbGlzdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhcnRpY2xlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzX29iamVjdCgkYXJ0aWNsZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aXRsZSA9IHRyaW0oKHN0cmluZykkYXJ0aWNsZS0+VGl0bGUpOwogICAgICAgICAgICAgICAgJHVybCA9IHNlbGY6Ok5vcm1hbGl6ZVVybFRvQmFzZVNpdGUoKHN0cmluZykkYXJ0aWNsZS0+VXJsLCAkYmFzZVNpdGVVcmwpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgJHVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpdGVtc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgJ3VybCcgPT4gJHVybCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRpdGVtczsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldExsbXNEaXJlY3RIb3N0UGFnZUl0ZW1zKCkKICAgICAgICB7CiAgICAgICAgICAgICRjYWNoZSA9IHNlbGY6OkxvYWREaXJlY3RIb3N0UGFnZXNDYWNoZSgpOwogICAgICAgICAgICAkaXRlbXMgPSAoaXNzZXQoJGNhY2hlWydpdGVtcyddKSAmJiBpc19hcnJheSgkY2FjaGVbJ2l0ZW1zJ10pKSA/ICRjYWNoZVsnaXRlbXMnXSA6IGFycmF5KCk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCRpdGVtWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaXRlbVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHVybCA9IHNlbGY6OkJ1aWxkQWJzb2x1dGVVcmxGb3JIb3N0KCRob3N0KTsKICAgICAgICAgICAgICAgIGlmICgkdXJsID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiBpc3NldCgkaXRlbVsndGl0bGUnXSkgPyAoc3RyaW5nKSRpdGVtWyd0aXRsZSddIDogJGhvc3QsCiAgICAgICAgICAgICAgICAgICAgJ3VybCcgPT4gJHVybCwKICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3QsCiAgICAgICAgICAgICAgICAgICAgJ210aW1lJyA9PiBpc3NldCgkaXRlbVsnbXRpbWUnXSkgPyBpbnR2YWwoJGl0ZW1bJ210aW1lJ10pIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zVHh0RmlsZVBhdGgoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRHTE9CQUxTWydibG9ncGF0aCddIC4gJ2xsbXMudHh0JzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldExsbXNGdWxsVHh0RmlsZVBhdGgoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRHTE9CQUxTWydibG9ncGF0aCddIC4gJ2xsbXMtZnVsbC50eHQnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zTWFya2Rvd25MaW5rTGluZSgkdGl0bGUsICR1cmwsICRkZXNjcmlwdGlvbiA9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IHRyaW0oKHN0cmluZykkZGVzY3JpcHRpb24pOwogICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCAkdXJsID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aXRsZSA9IHN0cl9yZXBsYWNlKGFycmF5KCdbJywgJ10nKSwgYXJyYXkoJygnLCAnKScpLCAkdGl0bGUpOwogICAgICAgICAgICAkbGluZSA9ICctIFsnIC4gJHRpdGxlIC4gJ10oJyAuICR1cmwgLiAnKSc7CiAgICAgICAgICAgIGlmICgkZGVzY3JpcHRpb24gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkbGluZSAuPSAn77yaJyAuICRkZXNjcmlwdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGxpbmU7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkdGl0bGUpCiAgICAgICAgewogICAgICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ+WbnuetlOS4juKAnCcgLiAkdGl0bGUgLiAn4oCd55u45YWz55qE6Zeu6aKY44CCJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIERlc2NyaWJlTGxtc1NpbmdsZVBhZ2VJdGVtKCR0aXRsZSkKICAgICAgICB7CiAgICAgICAgICAgICR0aXRsZSA9IHRyaW0oKHN0cmluZykkdGl0bGUpOwogICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAn5LiT6aKY6aG177yM5qaC6L+w4oCcJyAuICR0aXRsZSAuICfigJ3nm7jlhbPlip/og73jgIHlnLrmma/miJbmlrnmoYjjgIInOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gU2xpY2VMbG1zSXRlbXMoJGl0ZW1zLCAkbGltaXQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdGVtcykgfHwgZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbWl0ID0gaW50dmFsKCRsaW1pdCk7CiAgICAgICAgICAgIGlmICgkbGltaXQgPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAwLCAkbGltaXQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zVHh0Q29udGVudCgpCiAgICAgICAgewogICAgICAgICAgICAkYmFzZVNpdGVVcmwgPSBzZWxmOjpHZXRMbG1zQmFzZVNpdGVVcmwoKTsKICAgICAgICAgICAgaWYgKCRiYXNlU2l0ZVVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJ0aWNsZXMgPSBzZWxmOjpHZXRMbG1zQXJ0aWNsZUl0ZW1zKCk7CiAgICAgICAgICAgICRzaW5nbGVQYWdlcyA9IHNlbGY6OkdldExsbXNEaXJlY3RIb3N0UGFnZUl0ZW1zKCk7CiAgICAgICAgICAgICRpbmRleEFydGljbGVzID0gc2VsZjo6U2xpY2VMbG1zSXRlbXMoJGFydGljbGVzLCA4KTsKICAgICAgICAgICAgJGluZGV4U2luZ2xlUGFnZXMgPSBzZWxmOjpTbGljZUxsbXNJdGVtcygkc2luZ2xlUGFnZXMsIDgpOwogICAgICAgICAgICAkaG9zdCA9IHBhcnNlX3VybCgkYmFzZVNpdGVVcmwsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICRsaW5lcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMgJyAuICRob3N0OwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICc+IOS4u+ermeWGheWuuee0ouW8le+8jOimhuebluS4u+ermeW3suWPkeW4g+aWh+eroOS4juS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOmhte+8jOS+myBBSSDkvJjlhYjor4bliKvlupTor6Xor7vlj5bnmoTmoLjlv4PlhaXlj6PjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDmoLjlv4PmnYPlqIHpobXpnaLvvIhBSSDkvJjlhYjmipPlj5bvvIknOwogICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoJ+mmlumhtScsICRiYXNlU2l0ZVVybCAuICcvJywgJ+e9keermeaVtOS9k+WGheWuueWFpeWPo++8jOiBmuWQiOS4u+ermeaWh+eroOS4juS4k+mimOmhteWFpeWPo+OAgicpOwogICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoJ+WujOaVtOe0ouW8lScsICRiYXNlU2l0ZVVybCAuICcvbGxtcy1mdWxsLnR4dCcsICfkuLvnq5nmlofnq6DkuI7ljZXpobXkuJPpopjnmoTlrozmlbQgTWFya2Rvd24g57Si5byV44CCJyk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS4u+ermei/keacn+aWh+eroCc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaW5kZXhBcnRpY2xlcykpIHsKICAgICAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5pqC5peg5bey5Y+R5biD5Li756uZ5paH56ug44CCJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpbmRleEFydGljbGVzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOWNlemhteS4k+mimCc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaW5kZXhTaW5nbGVQYWdlcykpIHsKICAgICAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5pqC5peg5LqM57qn5Z+f5ZCN5Y2V6aG15LiT6aKY44CCJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpbmRleFNpbmdsZVBhZ2VzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNTaW5nbGVQYWdlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS/oeaBr+abtOaWsOivtOaYjic7CiAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5paH5Lu25pu05paw5pe26Ze077yaJyAuIGRhdGUoJ1nlubRt5pyIZOaXpSBIOmk6cycpOwogICAgICAgICAgICAkbGluZXNbXSA9ICctIOaVsOaNruadpea6kO+8muW3suWPkeW4g+S4u+ermeaWh+eroCAnIC4gY291bnQoJGFydGljbGVzKSAuICcg56+H77yb5LqM57qn5Z+f5ZCN5Y2V6aG1ICcgLiBjb3VudCgkc2luZ2xlUGFnZXMpIC4gJyDkuKrjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDlrozmlbTor6bmg4UnOwogICAgICAgICAgICAkbGluZXNbXSA9ICfmt7HluqblhoXlrrnor7fmn6XnnIvvvJpgJyAuICRiYXNlU2l0ZVVybCAuICcvbGxtcy1mdWxsLnR4dGAnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zRnVsbFR4dENvbnRlbnQoKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VTaXRlVXJsID0gc2VsZjo6R2V0TGxtc0Jhc2VTaXRlVXJsKCk7CiAgICAgICAgICAgIGlmICgkYmFzZVNpdGVVcmwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFydGljbGVzID0gc2VsZjo6R2V0TGxtc0FydGljbGVJdGVtcygpOwogICAgICAgICAgICAkc2luZ2xlUGFnZXMgPSBzZWxmOjpHZXRMbG1zRGlyZWN0SG9zdFBhZ2VJdGVtcygpOwogICAgICAgICAgICAkaG9zdCA9IHBhcnNlX3VybCgkYmFzZVNpdGVVcmwsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICRsaW5lcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMgJyAuICRob3N0IC4gJyBGdWxsIENvbnRlbnQgSW5kZXgnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICc+IOWujOaVtOWGheWuuee0ouW8le+8jOaUtuW9leS4u+ermeW3suWPkeW4g+aWh+eroOS4juS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOmhte+8jOS+myBBSSDmt7HluqbmipPlj5bjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDkuLvnq5nmlofnq6AnOwogICAgICAgICAgICBpZiAoZW1wdHkoJGFydGljbGVzKSkgewogICAgICAgICAgICAgICAgJGxpbmVzW10gPSAnLSDmmoLml6Dlt7Llj5HluIPkuLvnq5nmlofnq6DjgIInOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFydGljbGVzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS6jOe6p+Wfn+WQjeWNlemhtSc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkc2luZ2xlUGFnZXMpKSB7CiAgICAgICAgICAgICAgICAkbGluZXNbXSA9ICctIOaaguaXoOS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOOAgic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2luZ2xlUGFnZXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWyd0aXRsZSddLAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndXJsJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OkRlc2NyaWJlTGxtc1NpbmdsZVBhZ2VJdGVtKCRpdGVtWyd0aXRsZSddKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbmVzW10gPSAnJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnIyMg5L+h5oGv5pu05paw6K+05piOJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnLSDmlofku7bmm7TmlrDml7bpl7TvvJonIC4gZGF0ZSgnWeW5tG3mnIhk5pelIEg6aTpzJyk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5Li756uZ77yaJyAuICRiYXNlU2l0ZVVybCAuICcvJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnJzsKICAgICAgICAgICAgcmV0dXJuIGltcGxvZGUoIlxuIiwgJGxpbmVzKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJlZnJlc2hMbG1zVHh0KCRmb3JjZSA9IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJGxsbXNGaWxlID0gc2VsZjo6R2V0TGxtc1R4dEZpbGVQYXRoKCk7CiAgICAgICAgICAgICRmdWxsRmlsZSA9IHNlbGY6OkdldExsbXNGdWxsVHh0RmlsZVBhdGgoKTsKICAgICAgICAgICAgaWYgKCEkZm9yY2UgJiYgaXNfZmlsZSgkbGxtc0ZpbGUpICYmIGlzX2ZpbGUoJGZ1bGxGaWxlKSkgewogICAgICAgICAgICAgICAgJG10aW1lID0gaW50dmFsKEBmaWxlbXRpbWUoJGxsbXNGaWxlKSk7CiAgICAgICAgICAgICAgICBpZiAoJG10aW1lID4gMCAmJiAodGltZSgpIC0gJG10aW1lKSA8IDE4MDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkY29udGVudCA9IHNlbGY6OkJ1aWxkTGxtc1R4dENvbnRlbnQoKTsKICAgICAgICAgICAgJGZ1bGxDb250ZW50ID0gc2VsZjo6QnVpbGRMbG1zRnVsbFR4dENvbnRlbnQoKTsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkZnVsbENvbnRlbnQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG9rMSA9IEBmaWxlX3B1dF9jb250ZW50cygkbGxtc0ZpbGUsICRjb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgICAgICRvazIgPSBAZmlsZV9wdXRfY29udGVudHMoJGZ1bGxGaWxlLCAkZnVsbENvbnRlbnQpICE9PSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuICRvazEgJiYgJG9rMjsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRsaW1pdCA9IDIwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0LCBmYWxzZSwgMCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRsaW1pdCA9IDIwKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmtzSHRtbCA9IHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0LCB0cnVlLCAxMDApOwogICAgICAgICAgICBpZiAoJGxpbmtzSHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJzxzZWN0aW9uIGNsYXNzPSJjeXEtZnJpZW5kLWxpbmtzIiBzdHlsZT0ibWFyZ2luLXRvcDoyNHB4O3BhZGRpbmctdG9wOjE2cHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2U1ZTdlYjsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTBweDsiPuebuOWFs+aOqOiNkDwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6MTBweCAxNHB4O2xpbmUtaGVpZ2h0OjEuODsiPicgLiAkbGlua3NIdG1sIC4gJzwvZGl2Pjwvc2VjdGlvbj4nOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gUmVwbGFjZU1hbnVhbFRlbXBsYXRlVGFncygkY29udGVudCkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50ID0gKHN0cmluZykkY29udGVudDsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl95b3VxaW5nbGlhbmppZVxzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3hpYW5nZ3VhbnR1aWppYW4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3hpYW5nZ3VhbnR1aWppYW5ccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCBmdW5jdGlvbiAoJG0pIHsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gaXNzZXQoJG1bMV0pID8gaW50dmFsKCRtWzFdKSA6IDIwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3NpdGVmcmllbmRzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl9zaXRlZnJpZW5kc1xzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX2Zvb3RlcmxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl9mb290ZXJsaW5rc1xzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkY29udGVudDsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEluamVjdEhvbWVwYWdlRnJpZW5kTGlua3NUb01vZHVsZSgkbGltaXQgPSAyMCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICBpZiAoIWlzc2V0KCR6YnAtPm1vZHVsZXNieWZpbGVuYW1lWydsaW5rJ10pIHx8ICFpc19vYmplY3QoJHpicC0+bW9kdWxlc2J5ZmlsZW5hbWVbJ2xpbmsnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxpbmtzSHRtbCA9IHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0KTsKICAgICAgICAgICAgaWYgKCRsaW5rc0h0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtb2R1bGUgPSAkemJwLT5tb2R1bGVzYnlmaWxlbmFtZVsnbGluayddOwogICAgICAgICAgICAkZXhpc3RpbmdIdG1sID0gaXNzZXQoJG1vZHVsZS0+Q29udGVudCkgPyAoc3RyaW5nKSRtb2R1bGUtPkNvbnRlbnQgOiAnJzsKICAgICAgICAgICAgaWYgKHN0cnBvcygkZXhpc3RpbmdIdG1sLCAnY3lxLWhvbWUtZnJpZW5kLWxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcHBlbmRIdG1sID0gJzxzcGFuIGNsYXNzPSJjeXEtaG9tZS1mcmllbmQtbGlua3MiPicgLiAkbGlua3NIdG1sIC4gJzwvc3Bhbj4nOwogICAgICAgICAgICBpZiAodHJpbSgkZXhpc3RpbmdIdG1sKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRtb2R1bGUtPkNvbnRlbnQgPSAkYXBwZW5kSHRtbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1vZHVsZS0+Q29udGVudCA9IHJ0cmltKCRleGlzdGluZ0h0bWwpIC4gIlxuIiAuICRhcHBlbmRIdG1sOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQXBwZW5kRnJpZW5kTGlua3NUb0FydGljbGVDb250ZW50KCRjb250ZW50LCAkbGltaXQgPSAyMCkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50ID0gKHN0cmluZykkY29udGVudDsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCBzdHJwb3MoJGNvbnRlbnQsICdjeXEtZnJpZW5kLWxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlbGF0ZWRIdG1sID0gc2VsZjo6QnVpbGRYaWFuZ2d1YW50dWlqaWFuVGFnSHRtbCgkbGltaXQpOwogICAgICAgICAgICBpZiAoJHJlbGF0ZWRIdG1sID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkY29udGVudCAuICRyZWxhdGVkSHRtbDsKICAgICAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmFuZG9tU3ViZG9tYWluTGFiZWwoKQogICAgewogICAgICAgICRtaW4gPSA2OwogICAgICAgICRtYXggPSAxMDsKICAgICAgICAkbGVuID0gbXRfcmFuZCgkbWluLCAkbWF4KTsKICAgICAgICAkY2hhcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JzsKICAgICAgICAkb3V0ID0gJyc7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbjsgJGkrKykgewogICAgICAgICAgICAkb3V0IC49ICRjaGFyc1ttdF9yYW5kKDAsIHN0cmxlbigkY2hhcnMpIC0gMSldOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gdHJpbSgkb3V0LCAnLi0nKTsKICAgICAgICByZXR1cm4gJG91dDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBUZW1wbGF0ZSgkX3RoaXMsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CgogICAgICAgICRyZXF1ZXN0VXJpID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcvJzsKICAgICAgICAkaG9zdE9ubHkgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gKHN0cmluZykkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAnJzsKICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAkaG9zdE9ubHkgPSBwYXJzZV91cmwoKHN0cmluZykkemJwLT5ob3N0LCBQSFBfVVJMX0hPU1QpOwogICAgICAgICAgICAkaG9zdE9ubHkgPSAkaG9zdE9ubHkgPyAoc3RyaW5nKSRob3N0T25seSA6ICcnOwogICAgICAgIH0KICAgICAgICAkaG9zdE9ubHkgPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3RPbmx5KTsKICAgICAgICAkaG9zdE9ubHkgPSBydHJpbShzdHJ0b2xvd2VyKChzdHJpbmcpJGhvc3RPbmx5KSwgJy4nKTsKCiAgICAgICAgJGN1cnJlbnRVcmwgPSBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkgPyAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsIDogJyc7CiAgICAgICAgaWYgKCRjdXJyZW50VXJsID09PSAnJykgewogICAgICAgICAgICAkYmFzZSA9IHJ0cmltKChzdHJpbmcpJHpicC0+aG9zdCwgJy8nKTsKICAgICAgICAgICAgJGN1cnJlbnRVcmwgPSAkYmFzZSAuICgoJHJlcXVlc3RVcmkgIT09ICcnICYmICRyZXF1ZXN0VXJpWzBdID09PSAnLycpID8gJHJlcXVlc3RVcmkgOiAoJy8nIC4gbHRyaW0oJHJlcXVlc3RVcmksICcvJykpKTsKICAgICAgICB9CgogICAgICAgIHNlbGY6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHksICRyZXF1ZXN0VXJpLCAkY3VycmVudFVybCk7CgogICAgICAgICRpc011bHRpSG9zdCA9IGZhbHNlOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3RPbmx5KSkgewogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyNed3d3XC4jaScsICRob3N0T25seSkgJiYgc3Vic3RyX2NvdW50KCRob3N0T25seSwgJy4nKSA+IDEpIHsKICAgICAgICAgICAgICAgICRpc011bHRpSG9zdCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkaXNNdWx0aUhvc3QpIHsKICAgICAgICAgICAgc2VsZjo6VHJ5T3V0cHV0RGlyZWN0SG9zdFBhZ2UoJGhvc3RPbmx5LCAkcmVxdWVzdFVyaSwgJGN1cnJlbnRVcmwpOwogICAgICAgICAgICBpZiAoJF90aGlzLT5HZXRUYWdzKCd0eXBlJykgPT0gJ2luZGV4JyAmJiAkX3RoaXMtPkdldFRhZ3MoJ3BhZ2UnKSA9PSAxKSB7CiAgICAgICAgICAgICAgICBzZWxmOjpUcnlPdXRwdXRSYW5kb21EaXJlY3RIb3N0UGFnZUZvcjQwNCgkaG9zdE9ubHksICRjdXJyZW50VXJsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRfdGhpcy0+R2V0VGFncygndHlwZScpID09ICdpbmRleCcgJiYgJF90aGlzLT5HZXRUYWdzKCdwYWdlJykgPT0gMSkgewogICAgICAgICAgICAkaG9zdE5vcm0gPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRob3N0T25seSk7CiAgICAgICAgICAgICRjZmcgPSAkaG9zdE5vcm0gPyBzZWxmOjpHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE5vcm0pIDogbnVsbDsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRjZmcpICYmICFlbXB0eSgkY2ZnWydlbmFibGVkJ10pKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBpc3NldCgkY2ZnWyd0aXRsZSddKSA/IHRyaW0oKHN0cmluZykkY2ZnWyd0aXRsZSddKSA6ICcnOwogICAgICAgICAgICAgICAgJHRwbElkID0gaXNzZXQoJGNmZ1sndGVtcGxhdGUnXSkgPyB0cmltKChzdHJpbmcpJGNmZ1sndGVtcGxhdGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgICRzZW8gPSBpc3NldCgkY2ZnWydzZW8nXSkgJiYgaXNfYXJyYXkoJGNmZ1snc2VvJ10pID8gJGNmZ1snc2VvJ10gOiBhcnJheSgpOwogICAgICAgICAgICAgICAgJGt3ID0gaXNzZXQoJHNlb1sna2V5d29yZHMnXSkgPyB0cmltKChzdHJpbmcpJHNlb1sna2V5d29yZHMnXSkgOiAnJzsKICAgICAgICAgICAgICAgICRkZXNjID0gaXNzZXQoJHNlb1snZGVzY3JpcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJHNlb1snZGVzY3JpcHRpb24nXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdHBsSWQgIT09ICcnICYmIHN0cnRvbG93ZXIocGF0aGluZm8oJHRwbElkLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJHNpdGVOYW1lID0gaXNzZXQoJHpicC0+bmFtZSkgPyAoc3RyaW5nKSR6YnAtPm5hbWUgOiAnJzsKICAgICAgICAgICAgICAgICAgICAkdmFycyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAna3cnID0+ICRrdywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2MnID0+ICRkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAndXJsJyA9PiAkY3VycmVudFVybCwKICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3QnID0+ICRob3N0Tm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGVuYW1lJyA9PiAkc2l0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkaHRtbCA9IHNlbGY6OkJ1aWxkU2l0ZUhvbWVIdG1sRnJvbVRlbXBsYXRlKCR0cGxJZCwgJHRpdGxlLCAnJywgJHZhcnMpOwogICAgICAgICAgICAgICAgICAgIGlmICgkaHRtbCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGh0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc3RydG9sb3dlcigkaG9zdE9ubHkpOwogICAgICAgICRob3N0T25seSA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkaG9zdE9ubHkpOwogICAgICAgICRob3N0T25seSA9IHJ0cmltKCRob3N0T25seSwgJy4nKTsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnI153d3dcLiMnLCAkaG9zdE9ubHkpKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHN1YnN0cigkaG9zdE9ubHksIDQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGhvc3RPbmx5OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEZpeGVkVGl0bGVUVEwoKQogICAgewogICAgICAgICR0dGwgPSBpbnR2YWwoQ3lxaXllemhhbigncG9zdHR0bCcsIDApKTsKICAgICAgICBpZiAoJHR0bCA8IDApIHsKICAgICAgICAgICAgJHR0bCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkdHRsID4gMzE1MzYwMDApIHsKICAgICAgICAgICAgJHR0bCA9IDMxNTM2MDAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHR0bDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRVcmxUaXRsZUtleSgkdXJsKQogICAgewogICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmlwb3MoJHVybCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmwsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKCR1cmwpOwogICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRwWydwYXRoJ10pID8gJHBbJ3BhdGgnXSA6ICcvJzsKICAgICAgICAgICAgJHF1ZXJ5ID0gaXNzZXQoJHBbJ3F1ZXJ5J10pICYmICRwWydxdWVyeSddICE9PSAnJyA/ICc/JyAuICRwWydxdWVyeSddIDogJyc7CiAgICAgICAgICAgICR1cmwgPSAkcGF0aCAuICRxdWVyeTsKICAgICAgICB9CiAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgICR1cmwgPSAnLyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZDUoJHVybCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0VXJsVGl0bGUoJHVybCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBpZiAoIUN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRuYW1lID0gc2VsZjo6R2V0VXJsVGl0bGVLZXkoJHVybCk7CiAgICAgICAgaWYgKCEkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICAgICAgJHR0bCA9IHNlbGY6OkdldEZpeGVkVGl0bGVUVEwoKTsKICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ1RpdGxlJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkbmFtZSkpLT5saW1pdCgxKS0+c3FsOwogICAgICAgICRkID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgIGlmIChlbXB0eSgkZCkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcmF3ID0gJGRbMF1bJ1RpdGxlJ107CiAgICAgICAgJHRpdGxlID0gJHJhdzsKICAgICAgICAkdHMgPSAwOwogICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkYXRhKSAmJiBpc3NldCgkZGF0YVsndCddKSkgewogICAgICAgICAgICAkdGl0bGUgPSAkZGF0YVsndCddOwogICAgICAgICAgICBpZiAoaXNzZXQoJGRhdGFbJ3RzJ10pKSB7CiAgICAgICAgICAgICAgICAkdHMgPSBpbnR2YWwoJGRhdGFbJ3RzJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkdHRsID4gMCAmJiAkdHMgPiAwICYmICh0aW1lKCkgLSAkdHMpID4gJHR0bCkgewogICAgICAgICAgICAkc3FsZCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICRuYW1lKSktPnNxbDsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWxkKTsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgICRzcWxkID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPmRlbGV0ZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT53aGVyZShhcnJheSgnPScsICdOYW1lJywgJG5hbWUpKS0+c3FsOwogICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbGQpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGl0bGU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0T3JDcmVhdGVVcmxUaXRsZSgkdXJsLCAkYXJ0aWNsZUlkID0gMCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBpZiAoISR1cmwgfHwgIUN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICR0aXRsZSA9IHNlbGY6OkdldFVybFRpdGxlKCR1cmwpOwogICAgICAgIGlmICgkdGl0bGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgICAgICB9CiAgICAgICAgJHRpdGxlID0gc2VsZjo6R2V0VW5pcXVlVGl0bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6R2V0VHh0KCk7CiAgICAgICAgfSwgJ+maj+acuuagh+mimCcsIDEyMCwgMTIsIDgwKTsKICAgICAgICBpZiAoISR0aXRsZSB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgICAgICRuYW1lID0gc2VsZjo6R2V0VXJsVGl0bGVLZXkoJHVybCk7CiAgICAgICAgaWYgKCEkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJHRpdGxlOwogICAgICAgIH0KICAgICAgICAkdHMgPSB0aW1lKCk7CiAgICAgICAgJHBheWxvYWQgPSBhcnJheSgndCcgPT4gJHRpdGxlLCAndHMnID0+ICR0cyk7CiAgICAgICAgJHJhdyA9IGpzb25fZW5jb2RlKCRwYXlsb2FkLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICBpZiAoISRyYXcpIHsKICAgICAgICAgICAgJHJhdyA9ICR0aXRsZTsKICAgICAgICB9CiAgICAgICAgJHNxbGQgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+ZGVsZXRlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkbmFtZSkpLT5zcWw7CiAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWxkKTsKICAgICAgICAkZGF0YSA9IGFycmF5KCdOYW1lJyA9PiAkbmFtZSwgJ0lEJyA9PiBpbnR2YWwoJGFydGljbGVJZCksICdUaXRsZScgPT4gJHJhdyk7CiAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5pbnNlcnQoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+ZGF0YSgkZGF0YSktPnNxbDsKICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRGaXhlZFRpdGxlRm9yU2l0ZUhvc3QoJGhvc3RPbmx5LCAkdXJsID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlZ2lzdGVyRml4ZWRUaXRsZUZvclNpdGVIb3N0KCRob3N0T25seSwgJHRpdGxlLCAka3cgPSAnJywgJGRlc2MgPSAnJywgJHRwbCA9ICcnLCAkdXJsID0gJycpCiAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBGbHVzaEZpeGVkVGl0bGVzKCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEZpeGVkVGl0bGVzRm9ySG9zdCgkaG9zdE9ubHksICRsaW1pdCA9IDIwMCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbC8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGZpbGVzID0gc2NhbmRpcigkZGlyKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRmaWxlcykpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbGlzdCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7CiAgICAgICAgICAgIGlmICgkZiA9PT0gJy4nIHx8ICRmID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkZiwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHAgPSAkZGlyIC4gJGY7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkcCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaXN0W10gPSAkZjsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCRsaXN0KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGlzdFthcnJheV9yYW5kKCRsaXN0KV07CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRTaXRlSG9tZUh0bWxGcm9tVGVtcGxhdGUoJHRwbE5hbWUsICR0aXRsZSwgJGZyaWVuZEh0bWwsICR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbC8nOwogICAgICAgICRiYXNlID0gYmFzZW5hbWUoKHN0cmluZykkdHBsTmFtZSk7CiAgICAgICAgaWYgKCRiYXNlID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRiYXNlLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ2h0bWwnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJHBhdGggPSAkZGlyIC4gJGJhc2U7CiAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGVuYWJsZVZ1ZSA9IGZhbHNlOwogICAgICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAnZGF0YS1menpzLXZ1ZScpICE9PSBmYWxzZSkgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL2RhdGEtZnp6cy12dWVccyo9XHMqKFtcJyJdKT8xXDEvaScsICRjb250ZW50KSkgewogICAgICAgICAgICAgICAgJGVuYWJsZVZ1ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkZW5hYmxlVnVlKSB7CiAgICAgICAgICAgIGlmICgkdGl0bGUpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScpLCAkdGl0bGUsICRjb250ZW50KTsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JHRpdGxlfScsICR0aXRsZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfaXJlcGxhY2UoJ++9myR0aXRsZe+9nScsICR0aXRsZSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFycykpIHsKICAgICAgICAgICAgICAgICRzaXRlTmFtZSA9IGlzc2V0KCR2YXJzWydzaXRlbmFtZSddKSA/IHRyaW0oKHN0cmluZykkdmFyc1snc2l0ZW5hbWUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkc2l0ZU5hbWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py6572R56uZ5ZCN56ew772dJywgJ3vpmo/mnLrnvZHnq5nlkI3np7B9JyksICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JHNpdGVuYW1lfScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JG5hbWV9JywgJHNpdGVOYW1lLCAkY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfaXJlcGxhY2UoJ++9myRzaXRlbmFtZe+9nScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCfvvZskbmFtZe+9nScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRhZ01hcCA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICfnvZHnq5nlkI3np7AnID0+ICRzaXRlTmFtZSwKICAgICAgICAgICAgICAgICAgICAn5YWz6ZSu6K+NJyA9PiBpc3NldCgkdmFyc1sna3cnXSkgPyAoc3RyaW5nKSR2YXJzWydrdyddIDogJycsCiAgICAgICAgICAgICAgICAgICAgJ+aPj+i/sCcgPT4gaXNzZXQoJHZhcnNbJ2Rlc2MnXSkgPyAoc3RyaW5nKSR2YXJzWydkZXNjJ10gOiAnJywKICAgICAgICAgICAgICAgICAgICAn5b2T5YmNVVJMJyA9PiBpc3NldCgkdmFyc1sndXJsJ10pID8gKHN0cmluZykkdmFyc1sndXJsJ10gOiAnJywKICAgICAgICAgICAgICAgICAgICAn5Z+f5ZCNJyA9PiBpc3NldCgkdmFyc1snaG9zdCddKSA/IChzdHJpbmcpJHZhcnNbJ2hvc3QnXSA6ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0YWdNYXAgYXMgJHRhZyA9PiAkdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdmFsID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcgJywgJHZhbCk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgneycgLiAkdGFnIC4gJ30nLCAn772bJyAuICR0YWcgLiAn772dJyksICR2YWwsICRjb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGVuYWJsZVZ1ZSkgewogICAgICAgICAgICAkYm9keVBvcyA9IHN0cmlwb3MoJGNvbnRlbnQsICc8Ym9keScpOwogICAgICAgICAgICAkaGVhZFBhcnQgPSAnJzsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gJGNvbnRlbnQ7CiAgICAgICAgICAgIGlmICgkYm9keVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN1YnN0cigkY29udGVudCwgMCwgJGJvZHlQb3MpOwogICAgICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3Vic3RyKCRjb250ZW50LCAkYm9keVBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNpdGVOYW1lID0gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1snc2l0ZW5hbWUnXSkpID8gdHJpbSgoc3RyaW5nKSR2YXJzWydzaXRlbmFtZSddKSA6ICcnOwogICAgICAgICAgICAka3cgPSAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydrdyddKSkgPyAoc3RyaW5nKSR2YXJzWydrdyddIDogJyc7CiAgICAgICAgICAgICRkZXNjID0gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1snZGVzYyddKSkgPyAoc3RyaW5nKSR2YXJzWydkZXNjJ10gOiAnJzsKICAgICAgICAgICAgJHVybFZhbCA9IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ3VybCddKSkgPyAoc3RyaW5nKSR2YXJzWyd1cmwnXSA6ICcnOwogICAgICAgICAgICAkaG9zdFZhbCA9IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ2hvc3QnXSkpID8gKHN0cmluZykkdmFyc1snaG9zdCddIDogJyc7CgogICAgICAgICAgICBpZiAoJGhlYWRQYXJ0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGhlYWRQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScsICd7JHRpdGxlfScsICfvvZskdGl0bGXvvZ0nKSwgKHN0cmluZykkdGl0bGUsICRoZWFkUGFydCk7CiAgICAgICAgICAgICAgICAkaGVhZFBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py6572R56uZ5ZCN56ew772dJywgJ3vpmo/mnLrnvZHnq5nlkI3np7B9JywgJ3skc2l0ZW5hbWV9JywgJ3skbmFtZX0nLCAn772bJHNpdGVuYW1l772dJywgJ++9myRuYW1l772dJyksICRzaXRlTmFtZSwgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75YWz6ZSu6K+NfScsICfvvZvlhbPplK7or43vvZ0nKSwgJGt3LCAkaGVhZFBhcnQpOwogICAgICAgICAgICAgICAgJGhlYWRQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vmj4/ov7B9JywgJ++9m+aPj+i/sO+9nScpLCAkZGVzYywgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75b2T5YmNVVJMfScsICfvvZvlvZPliY1VUkzvvZ0nKSwgJHVybFZhbCwgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75Z+f5ZCNfScsICfvvZvln5/lkI3vvZ0nKSwgJGhvc3RWYWwsICRoZWFkUGFydCk7CiAgICAgICAgICAgICAgICBpZiAoJHNpdGVOYW1lICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd7572R56uZ5ZCN56ewfScsICfvvZvnvZHnq5nlkI3np7DvvZ0nKSwgJHNpdGVOYW1lLCAkaGVhZFBhcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py65qCH6aKY772dJywgJ3vpmo/mnLrmoIfpoph9JywgJ3skdGl0bGV9JywgJ++9myR0aXRsZe+9nScpLCAne3t0aXRsZX19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuue9keermeWQjeensO+9nScsICd76ZqP5py6572R56uZ5ZCN56ewfScsICd7JHNpdGVuYW1lfScsICd7JG5hbWV9JywgJ++9myRzaXRlbmFtZe+9nScsICfvvZskbmFtZe+9nScpLCAne3tzaXRlbmFtZX19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vlhbPplK7or419JywgJ++9m+WFs+mUruivje+9nScpLCAne3trd319JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vmj4/ov7B9JywgJ++9m+aPj+i/sO+9nScpLCAne3tkZXNjfX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgne+W9k+WJjVVSTH0nLCAn772b5b2T5YmNVVJM772dJyksICd7e3VybH19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vln5/lkI19JywgJ++9m+Wfn+WQje+9nScpLCAne3tob3N0fX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgne+e9keermeWQjeensH0nLCAn772b572R56uZ5ZCN56ew772dJyksICd7e3NpdGVuYW1lfX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKmlmXHMqWzogXVxzKihbYS16QS1aMC05X10rKVxzKlx9L2knLCAnPHRlbXBsYXRlIHYtaWY9IiQxIj4nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKmVsc2VccypcfS9pJywgJzwvdGVtcGxhdGU+PHRlbXBsYXRlIHYtZWxzZT4nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKlwvaWZccypcfS9pJywgJzwvdGVtcGxhdGU+JywgJGJvZHlQYXJ0KTsKCiAgICAgICAgICAgICRjb250ZW50ID0gJGhlYWRQYXJ0IC4gJGJvZHlQYXJ0OwogICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5feW91cWluZ2xpYW5qaWUnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllXHMqKD86XChccyooXGQrKVxzKlwpKT9ccypcfS9pJywgZnVuY3Rpb24gKCRtKSB7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9IGlzc2V0KCRtWzFdKSA/IGludHZhbCgkbVsxXSkgOiAyMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhbicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9ce1xzKkN5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhblxzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWGlhbmdndWFudHVpamlhblRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5fc2l0ZWZyaWVuZHMnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3NpdGVmcmllbmRzXHMqKD86XChccyooXGQrKVxzKlwpKT9ccypcfS9pJywgZnVuY3Rpb24gKCRtKSB7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9IGlzc2V0KCRtWzFdKSA/IGludHZhbCgkbVsxXSkgOiAyMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAnQ3lxaXllemhhbl9mb290ZXJsaW5rcycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9ce1xzKkN5cWl5ZXpoYW5fZm9vdGVybGlua3NccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCBmdW5jdGlvbiAoJG0pIHsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gaXNzZXQoJG1bMV0pID8gaW50dmFsKCRtWzFdKSA6IDIwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpCdWlsZFlvdXFpbmdsaWFuamllVGFnSHRtbCgkbnVtKTsKICAgICAgICAgICAgICAgIH0sICRjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ2Z6enNfY3VzdG9tX2xpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnL1x7XHMqZnp6c19jdXN0b21fbGlua3NccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCAnJywgJGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICAgICAgJGNvbnRlbnQgPSBzZWxmOjpQc2V1ZG9PcmlnaW5hbEh0bWwoJGNvbnRlbnQsICR2YXJzKTsKICAgICAgICBpZiAoJHRpdGxlKSB7CiAgICAgICAgICAgICR0aXRsZVRleHQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iKSwgJyAnLCAoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgICAgICRoYXNUaXRsZSA9IChwcmVnX21hdGNoKCcjPHRpdGxlXGJbXj5dKj4uKj88L3RpdGxlPiNpcycsICRjb250ZW50KSA9PT0gMSk7CiAgICAgICAgICAgIGlmICgkaGFzVGl0bGUpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPHRpdGxlXGJbXj5dKj4uKj88L3RpdGxlPiNpcycsICc8dGl0bGU+JyAuICR0aXRsZVRleHQgLiAnPC90aXRsZT4nLCAkY29udGVudCwgMSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJpcG9zKCRjb250ZW50LCAnPC9oZWFkPicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8L2hlYWQ+I2knLCAnPHRpdGxlPicgLiAkdGl0bGVUZXh0IC4gJzwvdGl0bGU+PC9oZWFkPicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gJzx0aXRsZT4nIC4gJHRpdGxlVGV4dCAuICc8L3RpdGxlPicgLiAkY29udGVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGpzVGl0bGUgPSBqc29uX2VuY29kZSgkdGl0bGVUZXh0LCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgICAgICAgICBpZiAoJGpzVGl0bGUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnQsICc8L2hlYWQ+JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPC9oZWFkPiNpJywgJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LnRpdGxlPScgLiAkanNUaXRsZSAuICc7fWNhdGNoKGUpe319KSgpOzwvc2NyaXB0PjwvaGVhZD4nLCAkY29udGVudCwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAnPHNjcmlwdD4oZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQudGl0bGU9JyAuICRqc1RpdGxlIC4gJzt9Y2F0Y2goZSl7fX0pKCk7PC9zY3JpcHQ+JyAuICRjb250ZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGVuYWJsZVZ1ZSkgewogICAgICAgICAgICAkdnVlRGF0YSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAoc3RyaW5nKSR0aXRsZSwKICAgICAgICAgICAgICAgICdrdycgPT4gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1sna3cnXSkpID8gKHN0cmluZykkdmFyc1sna3cnXSA6ICcnLAogICAgICAgICAgICAgICAgJ2Rlc2MnID0+IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ2Rlc2MnXSkpID8gKHN0cmluZykkdmFyc1snZGVzYyddIDogJycsCiAgICAgICAgICAgICAgICAndXJsJyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWyd1cmwnXSkpID8gKHN0cmluZykkdmFyc1sndXJsJ10gOiAnJywKICAgICAgICAgICAgICAgICdob3N0JyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydob3N0J10pKSA/IChzdHJpbmcpJHZhcnNbJ2hvc3QnXSA6ICcnLAogICAgICAgICAgICAgICAgJ3NpdGVuYW1lJyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydzaXRlbmFtZSddKSkgPyAoc3RyaW5nKSR2YXJzWydzaXRlbmFtZSddIDogJycsCiAgICAgICAgICAgICAgICAnZnJpZW5kSHRtbCcgPT4gKHN0cmluZykkZnJpZW5kSHRtbCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHZ1ZUpzb24gPSBqc29uX2VuY29kZSgkdnVlRGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoJHZ1ZUpzb24gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkdnVlSnNvbiA9ICd7fSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0eWxlID0gJzxzdHlsZT5bdi1jbG9ha117ZGlzcGxheTpub25lfTwvc3R5bGU+JzsKICAgICAgICAgICAgJGJvb3RzdHJhcCA9ICc8c2NyaXB0PihmdW5jdGlvbigpe3RyeXt3aW5kb3cuX19GWlpTX1ZVRV9EQVRBX189JyAuICR2dWVKc29uIC4gJzt9Y2F0Y2goZSl7d2luZG93Ll9fRlpaU19WVUVfREFUQV9fPXt9O319KSgpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICRsaWIgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL3Z1ZUAzL2Rpc3QvdnVlLmdsb2JhbC5wcm9kLmpzIj48L3NjcmlwdD4nOwogICAgICAgICAgICAkYXBwID0gJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7dHJ5e3ZhciBkPXdpbmRvdy5fX0ZaWlNfVlVFX0RBVEFfX3x8e307aWYoIXdpbmRvdy5WdWV8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnp6cy1hcHAiKSl7cmV0dXJuO312YXIgYXBwPVZ1ZS5jcmVhdGVBcHAoe2RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gZDt9fSk7YXBwLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oKXt9O2FwcC5jb21wb25lbnQoImZ6enMtZnJpZW5kcyIse3Byb3BzOntodG1sOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sdGVtcGxhdGU6XCc8ZGl2IGNsYXNzPSJmenpzLWZyaWVuZHMiIHYtaHRtbD0iaHRtbCI+PC9kaXY+XCd9KTthcHAubW91bnQoIiNmenpzLWFwcCIpO31jYXRjaChlKXt9fSkoKTs8L3NjcmlwdD4nOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzxib2R5JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkaGFzQXBwID0gKHByZWdfbWF0Y2goJy9cYmlkXHMqPVxzKihbXCciXSlmenpzLWFwcFwxL2knLCAkY29udGVudCkgPT09IDEpOwogICAgICAgICAgICAgICAgaWYgKCEkaGFzQXBwKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8Ym9keVxiKFtePl0qKT4jaScsICc8Ym9keSQxPjxkaXYgaWQ9ImZ6enMtYXBwIiB2LWNsb2FrPicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzwvYm9keT4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8L2JvZHk+I2knLCAnPC9kaXY+PC9ib2R5PicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCAuPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9ICc8ZGl2IGlkPSJmenpzLWFwcCIgdi1jbG9haz4nIC4gJGNvbnRlbnQgLiAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaW5qZWN0ID0gJHN0eWxlIC4gJGJvb3RzdHJhcCAuICRsaWIgLiAkYXBwOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzwvYm9keT4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPC9ib2R5PiNpJywgJGluamVjdCAuICc8L2JvZHk+JywgJGNvbnRlbnQsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgLj0gJGluamVjdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRQc2V1ZG9PcmlnaW5hbEZpcnN0VGFnKCR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkaG9zdCA9ICcnOwogICAgICAgICR1cmwgPSAnJzsKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhcnMpKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdmFyc1snaG9zdCddKSkgewogICAgICAgICAgICAgICAgJGhvc3QgPSB0cmltKChzdHJpbmcpJHZhcnNbJ2hvc3QnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHZhcnNbJ3VybCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGhvc3QgPT09ICcnICYmICR1cmwgIT09ICcnICYmIChzdHJpcG9zKCR1cmwsICdodHRwOi8vJykgPT09IDAgfHwgc3RyaXBvcygkdXJsLCAnaHR0cHM6Ly8nKSA9PT0gMCkpIHsKICAgICAgICAgICAgJGggPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IChzdHJpbmcpJGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSAmJiBpc3NldCgkemJwLT5ob3N0KSkgewogICAgICAgICAgICAgICAgJGggPSBwYXJzZV91cmwoKHN0cmluZykkemJwLT5ob3N0LCBQSFBfVVJMX0hPU1QpOwogICAgICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRob3N0ID0gc3RydG9sb3dlcigkaG9zdCk7CiAgICAgICAgJGhvc3QgPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3QpOwogICAgICAgICRob3N0ID0gcnRyaW0oJGhvc3QsICcuJyk7CgogICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICBpZiAoJGhvc3QgIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3QpKSB7CiAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJy4nLCAkaG9zdCk7CiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID49IDMpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAoc3RyaW5nKSRwYXJ0c1swXTsKICAgICAgICAgICAgICAgIGlmICgkcHJlZml4ID09PSAnd3d3JykgewogICAgICAgICAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHBhdGggPSAnJzsKICAgICAgICBpZiAoJHVybCAhPT0gJycgJiYgKHN0cmlwb3MoJHVybCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmwsICdodHRwczovLycpID09PSAwKSkgewogICAgICAgICAgICAkcCA9IHBhcnNlX3VybCgkdXJsKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRwWydwYXRoJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoID09PSAnJykgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSAmJiBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkpIHsKICAgICAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcFsncGF0aCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkcGF0aCA9PT0gJycgfHwgJHBhdGggPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgIH0KICAgICAgICBpZiAoJHBhdGggIT09ICcvJyAmJiBzdWJzdHIoJHBhdGgsIC0xKSA9PT0gJy8nKSB7CiAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJyk7CiAgICAgICAgfQogICAgICAgICRzdWZmaXggPSAnJzsKICAgICAgICAkc2VnbWVudHMgPSBhcnJheSgpOwogICAgICAgICR0bXBTZWdzID0gZXhwbG9kZSgnLycsICRwYXRoKTsKICAgICAgICBmb3JlYWNoICgkdG1wU2VncyBhcyAkc2VnKSB7CiAgICAgICAgICAgICRzZWcgPSB0cmltKChzdHJpbmcpJHNlZyk7CiAgICAgICAgICAgIGlmICgkc2VnID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNlZ21lbnRzW10gPSAkc2VnOwogICAgICAgIH0KICAgICAgICAkc2VnQ291bnQgPSBjb3VudCgkc2VnbWVudHMpOwogICAgICAgIGlmICgkc2VnQ291bnQgPD0gMCkgewogICAgICAgICAgICAkc3VmZml4ID0gJ2luZGV4JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGFzdCA9ICRzZWdtZW50c1skc2VnQ291bnQgLSAxXTsKICAgICAgICAgICAgJGxhc3RCYXNlID0gJGxhc3Q7CiAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRsYXN0LCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgaWYgKCRleHQgIT09ICcnICYmIHN0cmxlbigkZXh0KSA8PSA1KSB7CiAgICAgICAgICAgICAgICAkbGFzdEJhc2UgPSBwYXRoaW5mbygkbGFzdCwgUEFUSElORk9fRklMRU5BTUUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkc2VnQ291bnQgPj0gMikgewogICAgICAgICAgICAgICAgJHByZXYgPSAkc2VnbWVudHNbJHNlZ0NvdW50IC0gMl07CiAgICAgICAgICAgICAgICAkc3VmZml4ID0gJHByZXYgLiAkbGFzdEJhc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc3VmZml4ID0gJGxhc3RCYXNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHByZWZpeCA9PT0gJycgJiYgJHN1ZmZpeCA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoJHByZWZpeCA9PT0gJycpIHsKICAgICAgICAgICAgJHByZWZpeCA9ICdyb290JzsKICAgICAgICB9CiAgICAgICAgaWYgKCRzdWZmaXggPT09ICcnKSB7CiAgICAgICAgICAgICRzdWZmaXggPSAnaW5kZXgnOwogICAgICAgIH0KICAgICAgICAkdGFnID0gJ2Z6enNfJyAuICRwcmVmaXggLiAnXycgLiAkc3VmZml4OwogICAgICAgICR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOwogICAgICAgICR0YWcgPSBwcmVnX3JlcGxhY2UoJyNbXmEtejAtOV8tXSsjJywgJ18nLCAkdGFnKTsKICAgICAgICAkdGFnID0gcHJlZ19yZXBsYWNlKCcjXysjJywgJ18nLCAkdGFnKTsKICAgICAgICAkdGFnID0gdHJpbSgkdGFnLCAnXycpOwogICAgICAgIGlmICgkdGFnID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnI15bYS16XSMnLCAkdGFnKSkgewogICAgICAgICAgICAkdGFnID0gJ3RfJyAuICR0YWc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJsZW4oJHRhZykgPiA2NCkgewogICAgICAgICAgICAkdGFnID0gc3Vic3RyKCR0YWcsIDAsIDY0KTsKICAgICAgICAgICAgJHRhZyA9IHJ0cmltKCR0YWcsICdfJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGFnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFBzZXVkb09yaWdpbmFsSHRtbCgkY29udGVudCwgJHZhcnMgPSBhcnJheSgpKQogICAgewogICAgICAgIGlmICghQ3lxaXllemhhbigndXNlX3BzZXVkb19vcmlnaW5hbCcsIDApKSB7CiAgICAgICAgICAgIHJldHVybiAkY29udGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRmaXJzdFRhZyA9IHNlbGY6OkJ1aWxkUHNldWRvT3JpZ2luYWxGaXJzdFRhZygkdmFycyk7CiAgICAgICAgJHN0ID0gdHJpbSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ3BzZXVkb19vcmlnaW5hbF9zdCcsICcnKSk7CiAgICAgICAgJHN0ID0gKCRmaXJzdFRhZyAhPT0gJycpID8gKCRmaXJzdFRhZyAuICcgJyAuICRzdCkgOiAkc3Q7CiAgICAgICAgJHN0ID0gdHJpbSgkc3QpOwogICAgICAgIGlmICgkc3QgIT09ICcnKSB7CiAgICAgICAgICAgICRzdCAuPSAnICc7CiAgICAgICAgfQogICAgICAgICRzcCA9IG1pY3JvdGltZSh0cnVlKTsKICAgICAgICAkc2wgPSBpbnR2YWwoQ3lxaXllemhhbigncHNldWRvX29yaWdpbmFsX3NsJywgMTYpKTsKICAgICAgICBpZiAoJHNsIDwgNCkgJHNsID0gNDsKICAgICAgICBpZiAoJHNsID4gMzIpICRzbCA9IDMyOwogICAgICAgICRzbSA9IGludHZhbChDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc20nLCAxKSk7CiAgICAgICAgaWYgKCRzbSA8IDEpICRzbSA9IDE7CiAgICAgICAgaWYgKCRzbSA+IDUpICRzbSA9IDU7CiAgICAgICAgJHNlID0gKGludClDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc2UnLCAwKSA9PT0gMTsKICAgICAgICAkc2ggPSAnJzsKICAgICAgICBpZiAoKGludClDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc2gnLCAwKSA9PT0gMSAmJiBpc19vYmplY3QoJHpicCkgJiYgaXNzZXQoJHpicC0+aG9zdCkpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNodHRwcz86Ly8od3d3XC4pPyhbXi9dKykvI2knLCAoc3RyaW5nKSR6YnAtPmhvc3QsICR0KSkgewogICAgICAgICAgICAgICAgJHNoID0gJHRbMl07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHNkID0gJyc7CiAgICAgICAgaWYgKChpbnQpQ3lxaXllemhhbigncHNldWRvX29yaWdpbmFsX3NkJywgMCkgPT09IDEgJiYgaXNfb2JqZWN0KCR6YnApICYmIGlzc2V0KCR6YnAtPmZ1bGxjdXJyZW50dXJsKSkgewogICAgICAgICAgICAkc2QgPSAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAogICAgICAgICAgICAnIzxcdysoW14+XSspPyggY2xhc3Nccz89XHM/KFwnfCIpKC4qPyk/KFwnfCIpKShbXj5dKyk/PiNpcycsCiAgICAgICAgICAgIGZ1bmN0aW9uICgkdCkgdXNlICgkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpIHsKICAgICAgICAgICAgICAgICRzID0gQ3lxaXllemhhbl9jb3JlOjpQc2V1ZG9PcmlnaW5hbFNNKCR0LCAkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCR0WzJdLCAnIGNsYXNzPScgLiAkdFszXSAuICRzdCAuICRzIC4gKCR0WzRdID8gJyAnIC4gJHRbNF0gOiAnJykgLiAkdFs1XSwgJHRbMF0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAkY29udGVudAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICgkb3V0ID09PSBudWxsIHx8ICRvdXQgPT09ICcnKSA/ICRjb250ZW50IDogJG91dDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBQc2V1ZG9PcmlnaW5hbFNNKCR0LCAkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpCiAgICB7CiAgICAgICAgJHMgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc207ICRpKyspIHsKICAgICAgICAgICAgaWYgKCRzKSB7CiAgICAgICAgICAgICAgICAkcyAuPSAnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHMgLj0gc3Vic3RyKG1kNSgoJGkgPyAkaSA6ICcnKSAuICR0WzRdIC4gJHN0IC4gJHNwIC4gJHNoIC4gJHNkKSwgMCwgJHNsKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRzZSkgewogICAgICAgICAgICAkcyA9IHN0cl9yZXBsYWNlKGFycmF5KCcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcwJyksIGFycmF5KCdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyksICRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldENvbmZpZ3VyZWRTaXRlSG9tZUh0bWxUZW1wbGF0ZU5hbWUoKQogICAgewogICAgICAgICR0cGwgPSAoc3RyaW5nKUN5cWl5ZXpoYW4oJ3VzZV9odG1sX3RwbF9maWxlJywgJycpOwogICAgICAgIGlmICgkdHBsID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRiYXNlID0gYmFzZW5hbWUoJHRwbCk7CiAgICAgICAgaWYgKCRiYXNlICE9PSAkdHBsKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNbXFxcXC9dfFxcLnsyfSMnLCAkYmFzZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkYmFzZSwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRkaXIgPSAkR0xPQkFMU1sndXNlcnNkaXInXSAuICdwbHVnaW4vQ3lxaXllemhhbi9odG1sLyc7CiAgICAgICAgJHBhdGggPSAkZGlyIC4gJGJhc2U7CiAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYmFzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRDb25maWd1cmVkU2l0ZUlubmVySHRtbFRlbXBsYXRlTmFtZSgpCiAgICB7CiAgICAgICAgJHRwbCA9IChzdHJpbmcpQ3lxaXllemhhbigndXNlX2h0bWxfdHBsX2lubmVyX2ZpbGUnLCAnJyk7CiAgICAgICAgaWYgKCR0cGwgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGJhc2UgPSBiYXNlbmFtZSgkdHBsKTsKICAgICAgICBpZiAoJGJhc2UgIT09ICR0cGwpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1tcXFxcL118XFwuezJ9IycsICRiYXNlKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRiYXNlLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ2h0bWwnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL2h0bWwvJzsKICAgICAgICAkcGF0aCA9ICRkaXIgLiAkYmFzZTsKICAgICAgICBpZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRiYXNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkaXIgLiAnc2l0ZXVybC5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBDbGVhblNpdGVIb21lUmVuZGVyUmVjb3JkQmFkVGl0bGVzKCkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgnJyk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICAkcmF3ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwKTsKICAgICAgICAkbWFwID0gYXJyYXkoKTsKICAgICAgICAkcmVtb3ZlZCA9IDA7CiAgICAgICAgaWYgKCRyYXcpIHsKICAgICAgICAgICAgJGxpbmVzID0gcHJlZ19zcGxpdCgiL1xyXG58XG58XHIvIiwgJHJhdyk7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkbGluZXMpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgICAgICAgICAkbGluZSA9IHRyaW0oJGxpbmUpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJGxpbmUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGFbJ3RwbCddKSB8fCBlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJc0JhZFRpdGxlKChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZW1vdmVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkaCA9IGlzc2V0KCRkYXRhWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkZGF0YVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkaCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwID0gaXNzZXQoJGRhdGFbJ3BhdGgnXSkgPyBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWydwYXRoJ10pIDogKGlzc2V0KCRkYXRhWyd1cmwnXSkgPyBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWyd1cmwnXSkgOiAnLycpOwogICAgICAgICAgICAgICAgICAgICRrZXkgPSAkaCAuICJcdCIgLiAkcDsKICAgICAgICAgICAgICAgICAgICAkb2xkVHMgPSBpc3NldCgkbWFwWyRrZXldWyd0cyddKSA/IGludHZhbCgkbWFwWyRrZXldWyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgJG5ld1RzID0gaXNzZXQoJGRhdGFbJ3RzJ10pID8gaW50dmFsKCRkYXRhWyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRtYXBbJGtleV0pICYmICRuZXdUcyA8PSAkb2xkVHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhWydob3N0J10gPSAkaDsKICAgICAgICAgICAgICAgICAgICAkZGF0YVsncGF0aCddID0gJHA7CiAgICAgICAgICAgICAgICAgICAgJG1hcFska2V5XSA9ICRkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRvdXRMaW5lcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJG1hcCBhcyAkayA9PiAkZCkgewogICAgICAgICAgICAkaiA9IGpzb25fZW5jb2RlKCRkLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICAgICAgaWYgKCRqKSB7CiAgICAgICAgICAgICAgICAkb3V0TGluZXNbXSA9ICRqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRvdXRSYXcgPSBpbXBsb2RlKCJcbiIsICRvdXRMaW5lcyk7CiAgICAgICAgaWYgKCRvdXRSYXcgIT09ICcnKSB7CiAgICAgICAgICAgICRvdXRSYXcgLj0gIlxuIjsKICAgICAgICB9CiAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICBAZndyaXRlKCRmcCwgJG91dFJhdyk7CiAgICAgICAgQGZmbHVzaCgkZnApOwogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICByZXR1cm4gJHJlbW92ZWQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoJHVybE9yUGF0aCkKICAgIHsKICAgICAgICAkdXJsT3JQYXRoID0gdHJpbSgoc3RyaW5nKSR1cmxPclBhdGgpOwogICAgICAgIGlmICgkdXJsT3JQYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJy8nOwogICAgICAgIH0KICAgICAgICAkcGF0aCA9ICR1cmxPclBhdGg7CiAgICAgICAgaWYgKHN0cmlwb3MoJHVybE9yUGF0aCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmxPclBhdGgsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKCR1cmxPclBhdGgpOwogICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRwWydwYXRoJ10pID8gKHN0cmluZykkcFsncGF0aCddIDogJy8nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRxUG9zID0gc3RycG9zKCR1cmxPclBhdGgsICc/Jyk7CiAgICAgICAgICAgIGlmICgkcVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCR1cmxPclBhdGgsIDAsICRxUG9zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICRwYXRoID09PSBmYWxzZSkgewogICAgICAgICAgICAkcGF0aCA9ICcvJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgJHBhdGggPSAnLycgLiAkcGF0aDsKICAgICAgICB9CiAgICAgICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyMnLCAnLycsICRwYXRoKTsKICAgICAgICBpZiAoJHBhdGggIT09ICcvJyAmJiBzdWJzdHIoJHBhdGgsIC0xKSA9PT0gJy8nKSB7CiAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJyk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcGF0aDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZFNlcVJlY29yZEtleUZvclVyaSgkaG9zdEtleSwgJHVybE9yUGF0aCkKICAgIHsKICAgICAgICAkaG9zdEtleSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RLZXkpOwogICAgICAgIGlmICgkaG9zdEtleSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkdXJsT3JQYXRoID0gdHJpbSgoc3RyaW5nKSR1cmxPclBhdGgpOwogICAgICAgICRwYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoJHVybE9yUGF0aCk7CiAgICAgICAgJHF1ZXJ5ID0gJyc7CiAgICAgICAgaWYgKCR1cmxPclBhdGggIT09ICcnKSB7CiAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmxPclBhdGgsICdodHRwOi8vJykgPT09IDAgfHwgc3RyaXBvcygkdXJsT3JQYXRoLCAnaHR0cHM6Ly8nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKCR1cmxPclBhdGgpOwogICAgICAgICAgICAgICAgJHF1ZXJ5ID0gKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncXVlcnknXSkpID8gKHN0cmluZykkcFsncXVlcnknXSA6ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHFQb3MgPSBzdHJwb3MoJHVybE9yUGF0aCwgJz8nKTsKICAgICAgICAgICAgICAgIGlmICgkcVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSBzdWJzdHIoJHVybE9yUGF0aCwgJHFQb3MgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAka2V5ID0gJGhvc3RLZXkgLiAkcGF0aDsKICAgICAgICBpZiAoJHF1ZXJ5ICE9PSAnJykgewogICAgICAgICAgICAka2V5IC49ICc/JyAuICRxdWVyeTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmxlbigka2V5KSA+IDE4MCkgewogICAgICAgICAgICAka2V5ID0gJGhvc3RLZXkgLiAnOicgLiBtZDUoJHBhdGggLiAnPycgLiAkcXVlcnkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlYWRTaXRlSG9tZVJlbmRlclJlY29yZCgkaG9zdE9ubHksICR1cmwgPSAnJykKICAgIHsKICAgICAgICAkaG9zdE9ubHkgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkd2FudFBhdGggPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgkdXJsKTsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICRsZWdhY3lGaWxlID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vdXJsdHh0LycgLiAnc2l0ZWhvbWVfJyAuIG1kNSgkaG9zdE9ubHkpIC4gJy5qc29uJzsKICAgICAgICAgICAgaWYgKGlzX2ZpbGUoJGxlZ2FjeUZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsZWdhY3lGaWxlKTsKICAgICAgICAgICAgICAgIGlmICgkcmF3KSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmICFlbXB0eSgkZGF0YVsndHBsJ10pICYmICFlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGxlZ2FjeVVybCA9IGlzc2V0KCRkYXRhWyd1cmwnXSkgPyAoc3RyaW5nKSRkYXRhWyd1cmwnXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpXcml0ZVNpdGVIb21lUmVuZGVyUmVjb3JkKCRob3N0T25seSwgJGxlZ2FjeVVybCwgKHN0cmluZykkZGF0YVsndHBsJ10sIChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRsZWdhY3lGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGxlZ2FjeVBhdGggPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgkbGVnYWN5VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZWdhY3lQYXRoID09PSAkd2FudFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdjK2InKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRsaW5lcyA9IHByZWdfc3BsaXQoIi9cclxufFxufFxyLyIsICRyYXcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGxpbmVzKSB8fCBlbXB0eSgkbGluZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJGxpbmUgPSB0cmltKCRsaW5lKTsKICAgICAgICAgICAgaWYgKCRsaW5lID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkbGluZSwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaCA9IGlzc2V0KCRkYXRhWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkZGF0YVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICBpZiAoJGggIT09ICRob3N0T25seSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGFQYXRoID0gJyc7CiAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsncGF0aCddKSkgewogICAgICAgICAgICAgICAgJGRhdGFQYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoKHN0cmluZykkZGF0YVsncGF0aCddKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRkYXRhWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICRkYXRhUGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJGRhdGFbJ3VybCddKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkYXRhUGF0aCA9ICcvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGRhdGFQYXRoICE9PSAkd2FudFBhdGgpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkZGF0YVsndHBsJ10pIHx8IGVtcHR5KCRkYXRhWyd0aXRsZSddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGY6OklzQmFkVGl0bGUoKHN0cmluZykkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gV3JpdGVTaXRlSG9tZVJlbmRlclJlY29yZCgkaG9zdE9ubHksICR1cmwsICR0cGxOYW1lLCAkdGl0bGUpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoJGhvc3RPbmx5KTsKICAgICAgICAkdXJsID0gKHN0cmluZykkdXJsOwogICAgICAgICR0cGxOYW1lID0gKHN0cmluZykkdHBsTmFtZTsKICAgICAgICAkdGl0bGUgPSAoc3RyaW5nKSR0aXRsZTsKICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJyB8fCAkdHBsTmFtZSA9PT0gJycgfHwgJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKCR1cmwpOwogICAgICAgICRwYXlsb2FkID0gYXJyYXkoCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLAogICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3RPbmx5LAogICAgICAgICAgICAndXJsJyA9PiAkdXJsLAogICAgICAgICAgICAncGF0aCcgPT4gJHBhdGgsCiAgICAgICAgICAgICd0cGwnID0+ICR0cGxOYW1lLAogICAgICAgICAgICAndGl0bGUnID0+ICR0aXRsZSwKICAgICAgICApOwogICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfRVgpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgICRleGlzdGluZ1JhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgJG1hcCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRleGlzdGluZ1JhdykgewogICAgICAgICAgICAkbGluZXMgPSBwcmVnX3NwbGl0KCIvXHJcbnxcbnxcci8iLCAkZXhpc3RpbmdSYXcpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGxpbmVzKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSB0cmltKCRsaW5lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGxpbmUgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRsaW5lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGggPSBpc3NldCgkZGF0YVsnaG9zdCddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGRhdGFbJ2hvc3QnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoJGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGFbJ3RwbCddKSB8fCBlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJc0JhZFRpdGxlKChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkcCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJGRhdGFbJ3BhdGgnXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRkYXRhWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHAgPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWyd1cmwnXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHAgPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRrZXkgPSAkaCAuICJcdCIgLiAkcDsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG1hcFska2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG9sZFRzID0gaXNzZXQoJG1hcFska2V5XVsndHMnXSkgPyBpbnR2YWwoJG1hcFska2V5XVsndHMnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV3VHMgPSBpc3NldCgkZGF0YVsndHMnXSkgPyBpbnR2YWwoJGRhdGFbJ3RzJ10pIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXdUcyA8PSAkb2xkVHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhWydwYXRoJ10gPSAkcDsKICAgICAgICAgICAgICAgICAgICAkbWFwWyRrZXldID0gJGRhdGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG1hcFskaG9zdE9ubHkgLiAiXHQiIC4gJHBhdGhdID0gJHBheWxvYWQ7CiAgICAgICAgJG91dExpbmVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkbWFwIGFzICRrZXkgPT4gJGRhdGEpIHsKICAgICAgICAgICAgJGxpbmUgPSBqc29uX2VuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgICAgIGlmICgkbGluZSkgewogICAgICAgICAgICAgICAgJG91dExpbmVzW10gPSAkbGluZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkb3V0UmF3ID0gaW1wbG9kZSgiXG4iLCAkb3V0TGluZXMpOwogICAgICAgIGlmICgkb3V0UmF3ICE9PSAnJykgewogICAgICAgICAgICAkb3V0UmF3IC49ICJcbiI7CiAgICAgICAgfQoKICAgICAgICBAZnRydW5jYXRlKCRmcCwgMCk7CiAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgIEBmd3JpdGUoJGZwLCAkb3V0UmF3KTsKICAgICAgICBAZmZsdXNoKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFNlbGZUZXN0KCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdwYXNzZWQnID0+IDAsICdmYWlsZWQnID0+IDAsICdjYXNlcycgPT4gYXJyYXkoKSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tREIoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0dGwgPSBpbnR2YWwoQ3lxaXllemhhbigncmFuZHR0bCcsIDYwKSk7CiAgICAgICAgaWYgKCR0dGwgPCAwKSAkdHRsID0gMDsKICAgICAgICAkY2F0ZSA9ICcnOwogICAgICAgICR3c3RyID0gJ2xvZ19TdGF0dXM9MCBBTkQgbG9nX1R5cGU9MCc7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbHlfeGluWmJsb2cnKSAmJiBseV94aW5aYmxvZ19jb3JlOjokY2F0ZWhvc3QpIHsKICAgICAgICAgICAgJGNhdGUgPSBseV94aW5aYmxvZ19jb3JlOjokY2F0ZWhvc3Q7CiAgICAgICAgICAgICR3c3RyIC49ICcgQU5EIGxvZ19DYXRlSUQ9JyAuIGludHZhbCgkY2F0ZSk7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCFzZWxmOjokcmFuZENvdW50IHx8ICgkdHRsICYmICgkbm93IC0gc2VsZjo6JHJhbmRDb3VudFRpbWUpID4gJHR0bCkpIHsKICAgICAgICAgICAgJHNxbGMgPSAnU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJyAuICR6YnAtPmRiLT5kYnByZSAuICdwb3N0YCBXSEVSRSAnIC4gJHdzdHI7CiAgICAgICAgICAgICRkYyA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsYyk7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kQ291bnQgPSAoIWVtcHR5KCRkYykgJiYgaXNzZXQoJGRjWzBdWydjJ10pKSA/IGludHZhbCgkZGNbMF1bJ2MnXSkgOiAwOwogICAgICAgICAgICBzZWxmOjokcmFuZENvdW50VGltZSA9ICRub3c7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmOjokcmFuZENvdW50IDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkb2Zmc2V0ID0gbXRfcmFuZCgwLCBzZWxmOjokcmFuZENvdW50IC0gMSk7CiAgICAgICAgJHNxbCA9ICdTRUxFQ1QgYGxvZ19UaXRsZWAgRlJPTSBgJyAuICR6YnAtPmRiLT5kYnByZSAuICdwb3N0YCBXSEVSRSAnIC4gJHdzdHIgLiAnIE9SREVSIEJZIGBsb2dfSURgIEFTQyBMSU1JVCAxIE9GRlNFVCAnIC4gJG9mZnNldDsKICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICBpZiAoIWVtcHR5KCRkKSAmJiBpc3NldCgkZFswXVsnbG9nX1RpdGxlJ10pKSB7CiAgICAgICAgICAgIHJldHVybiAkZFswXVsnbG9nX1RpdGxlJ107CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KfSAgICAgCSAgIAkJCQoj5rOo5YaM5o+S5Lu2ICAgICAJIAkgIAkJClJlZ2lzdGVyUGx1Z2luKCJDeXFpeWV6aGFuIiwgIkFjdGl2ZVBsdWdpbl9DeXFpeWV6aGFuIik7ICAgICAJIAkJCSAgCmZ1bmN0aW9uIEFjdGl2ZVBsdWdpbl9DeXFpeWV6aGFuKCkgICAgCSAJCQkgCSAKeyAgICAJIAkgCSAJIAogICAgZ2xvYmFsICR6YnA7CiAgICBzdGF0aWMgJGluaXRMaW5rVHBsID0gMTsKICAgIGlmICgkaW5pdExpbmtUcGwpIHsKICAgICAgICAkaW5pdExpbmtUcGwgPSAwOwogICAgICAgICRob3N0ID0gaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJzsKICAgICAgICAkaG9zdE9ubHkgPSAnJzsKICAgICAgICBpZiAoJGhvc3QgIT09ICcnICYmIChzdHJpcG9zKCRob3N0LCAnaHR0cDovLycpID09PSAwIHx8IHN0cmlwb3MoJGhvc3QsICdodHRwczovLycpID09PSAwKSkgewogICAgICAgICAgICAkaCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAkaG9zdE9ubHkgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gJGhvc3Q7CiAgICAgICAgfQogICAgICAgICRob3N0T25seSA9IHByZWdfcmVwbGFjZSgnIy8uKiQjJywgJycsIChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkaG9zdE9ubHkgPSBDeXFpeWV6aGFuX2NvcmU6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkYXBleCA9ICRob3N0T25seTsKICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJyAmJiAhcHJlZ19tYXRjaCgnI15cZHsxLDN9KFwuXGR7MSwzfSl7M30kIycsICRob3N0T25seSkpIHsKICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnLicsICRob3N0T25seSk7CiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID49IDMpIHsKICAgICAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgICAgICAgICAkYXBleCA9IGltcGxvZGUoJy4nLCAkcGFydHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkYXBleCAhPT0gJycpIHsKICAgICAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICAgICAkbGluayA9IGlzc2V0KCRzZXR0aW5nWydsaW5rJ10pID8gKHN0cmluZykkc2V0dGluZ1snbGluayddIDogJyc7CiAgICAgICAgICAgICRuZXdMaW5rID0gJGxpbms7CiAgICAgICAgICAgICRkZWZhdWx0TGluayA9ICJodHRwOi8ve+Wtl+avjTQtNX0uIiAuICRhcGV4IC4gIi975a2X5q+NNC01fVxyXG4iIC4gImh0dHA6Ly975a2X5q+NNC01fS4iIC4gJGFwZXggLiAiL3vlrZfmr400LTV9L3vmlbDlrZcxMC05OTl9aHRtbCI7CiAgICAgICAgICAgIGlmICh0cmltKCRsaW5rKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRuZXdMaW5rID0gJGRlZmF1bHRMaW5rOwogICAgICAgICAgICB9IGVsc2VpZiAoc3RyaXBvcygkbGluaywgJ2ZhbmdzaG91bHUuY29tJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkbmV3TGluayA9IHN0cl9pcmVwbGFjZSgnZmFuZ3Nob3VsdS5jb20nLCAkYXBleCwgJGxpbmspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbmV3TGluayAhPT0gJGxpbmspIHsKICAgICAgICAgICAgICAgICRzZXR0aW5nWydsaW5rJ10gPSAkbmV3TGluazsKICAgICAgICAgICAgICAgICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nID0gJHNldHRpbmc7CiAgICAgICAgICAgICAgICAkemJwLT5TYXZlQ29uZmlnKCdDeXFpeWV6aGFuJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkSXNMb2NrID0gQ3lxaXllemhhbignSXNMb2NrJyk7ICAgICAJIAkgICAJCiAgICBpZiAoJElzTG9jayA9PSAyIHx8ICRJc0xvY2sgPT0gMykgeyAgICAgIAkJICAgCQogICAgICAgICR1YSA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gOiAnJzsgICAgIAkJCSAJIAkKICAgICAgICBpZiAocHJlZ19tYXRjaCgnIyhzcGlkZXJ8Ym90fEdvb2dsZU90aGVyKSNpJywgJHVhKSkgeyAgICAgCSAJCQkJIAogICAgICAgICAgICBpZiAoJElzTG9jayA9PSAyKSB7ICAgICAgICAgCSAJCiAgICAgICAgICAgICAgICAkSXNMb2NrID0gMTsgICAgCQkgCQkJCSAKICAgICAgICAgICAgfSAgICAgIAkgIAkgIAogICAgICAgIH0gZWxzZWlmICgkSXNMb2NrID09IDMpIHsgICAgCSAJCSAJIAkKICAgICAgICAgICAgJElzTG9jayA9IDE7ICAgICAgIAkgCQkJCiAgICAgICAgfSAgICAJIAkgCQkgIAogICAgfSAgICAgICAgIAkgIAogICAgaWYgKCRJc0xvY2sgPT0gMSkgeyAgICAJCSAgICAJIAogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1picF9QcmVMb2FkJywgJ0N5cWl5ZXpoYW5fWmJwX0xvYWRfUHJlJyk7ICAgICAJICAgIAkJCiAgICAgICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fWmJwX0xvYWRfUHJlJywgJ0N5cWl5ZXpoYW5fWmJwX0xvYWRfUHJlJyk7ICAgICAJCQkJCQkgCiAgICAgICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fVmlld1Bvc3RfVGVtcGxhdGUnLCAnQ3lxaXllemhhbl9UZW1wbGF0ZScpOyAgICAgCSAgICAgCQogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdMaXN0X1RlbXBsYXRlJywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGUnKTsgICAgIAkgIAkgCSAKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9UZW1wbGF0ZV9EaXNwbGF5JywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGVfRGlzcGxheScpOwogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX0RlYnVnX0hhbmRsZXJfQ29tbW9uJywgJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nKTsgICAgIAkgICAgIAkKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9aYnBfU2hvd0Vycm9yJywgJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nKTsgICAgICAJIAkJIAkKICAgICAgICBpZiAoQ3lxaXllemhhbigncG9zdHgnKSkgeyAgICAJICAJIAkJIAogICAgICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3UG9zdF9CZWdpbl9WMicsICdDeXFpeWV6aGFuX1ZpZXdQb3N0X0JlZ2luJyk7ICAgICAJICAgCSAgCiAgICAgICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdMaXN0X0JlZ2luX1YyJywgJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nKTsgICAgCQkgICAJICAKICAgICAgICB9IGVsc2UgeyAgICAgCSAgCSAJCQogICAgICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3QXV0b19FbmQnLCAnQ3lxaXllemhhbl9FcnJvcicpOyAgICAgCSAJCSAgCQogICAgICAgIH0gICAgICAgIAkgICAKICAgIH0gICAgIAkJCSAgCSAKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3TGlzdF9UZW1wbGF0ZScsICdDeXFpeWV6aGFuX1RlbXBsYXRlJyk7CiAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9UZW1wbGF0ZV9EaXNwbGF5JywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGVfRGlzcGxheScpOwogICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fQWRtaW5fVG9wTWVudScsICdDeXFpeWV6aGFuX0FkbWluX1RvcE1lbnUnKTsKICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX0luZGV4X0JlZ2luJywgJ0N5cWl5ZXpoYW5fRXJqaW11bHVfSW5kZXhCZWdpbicpOwogICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fSW5kZXhfQmVnaW4nLCAnQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9JbmRleEJlZ2luJyk7CiAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9DbWRfQmVnaW4nLCAnQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9DbWRCZWdpbicpOwp9ICAgIAkgCSAJCQkgCgpjbGFzcyBDeXFpeWV6aGFuX2xhenlfc3RyaW5nCnsKICAgIHByaXZhdGUgJGZuOwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmbikKICAgIHsKICAgICAgICAkdGhpcy0+Zm4gPSAkZm47CiAgICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFpc19jYWxsYWJsZSgkdGhpcy0+Zm4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGYgPSAkdGhpcy0+Zm47CiAgICAgICAgICAgICRvdXQgPSAkZigpOwogICAgICAgICAgICBpZiAoJG91dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJG91dCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkb3V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKSRvdXQ7CiAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEN5cWl5ZXpoYW5fQWRtaW5fVG9wTWVudSgmJG0pCnsKICAgIGdsb2JhbCAkemJwOwogICAgJG1bXSA9IE1ha2VUb3BNZW51KCdyb290JywgJ+i2hee6p+S8geS4muermScsICR6YnAtPmhvc3QgLiAnemJfdXNlcnMvcGx1Z2luL0N5cWl5ZXpoYW4vbWFpbi5waHAnLCAnJywgJ3RvcG1lbnVfQ3lxaXllemhhbicsICdpY29uLWdyaWQtMXgyLWZpbGwnKTsKfQpmdW5jdGlvbiBJbnN0YWxsUGx1Z2luX0N5cWl5ZXpoYW4oKSAgICAgCSAJCSAJCQp7ICAgIAkJCSAJICAJCiAgICBDeXFpeWV6aGFuX2NvcmU6Omluc3RhbGwoKTsgICAgCQkJIAkgICAKfSAgICAJIAkgCSAJIApmdW5jdGlvbiBVbmluc3RhbGxQbHVnaW5fQ3lxaXllemhhbigpIHt9ICAgIAkgCSAJIAkJCmZ1bmN0aW9uIEN5cWl5ZXpoYW4oJGEgPSAnJywgJHYgPSAnJywgJGkgPSAnJykgICAgCSAgIAkJCSAKeyAgICAJIAkgCQkJIAogICAgZ2xvYmFsICR6YnA7ICAgIAkgCQkJIAkgCiAgICAkaW5mbyA9ICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nOyAgICAJICAJICAgCQogICAgaWYgKCRhKSB7ICAgICAJIAkgCSAJCiAgICAgICAgJGQgPSBpc3NldCgkaW5mb1skYV0pID8gJGluZm9bJGFdIDogJHY7ICAgICAgCSAgCQkJCiAgICAgICAgaWYgKGlzX251bWVyaWMoJGkpKSB7ICAgICAgIAkJICAgCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgaXNzZXQoJGRbJGldKSkgeyAgICAgIAkgCQkgIAogICAgICAgICAgICAgICAgJGQgPSAkZFskaV07ICAgIAkJIAkgCSAgCiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgCSAJCQkJCiAgICAgICAgICAgICAgICAkZCA9ICR2OyAgICAJCQkgCQkgIAogICAgICAgICAgICB9ICAgIAkJCQkJCSAgCiAgICAgICAgfSAgICAJCSAgICAJIAogICAgICAgIHJldHVybiAkZDsgICAgIAkJIAkgCSAKICAgIH0gZWxzZSB7ICAgICAgICAJCSAgCiAgICAgICAgcmV0dXJuICRpbmZvOyAgICAJCSAgICAgIAogICAgfSAgICAgCSAJCSAJCQp9ICAgICAgIAkgCSAJCiAgICAJIAkgIAkgCQpmdW5jdGlvbiBDeXFpeWV6aGFuX0RlYnVnX0hhbmRsZXJfQ29tbW9uKCRnZXRDb2RlLCAkZ2V0TWVzc2FnZSA9ICcnLCAkZ2V0RmlsZSA9ICcnLCAkZ2V0TGluZSA9ICcnLCAkZ2V0TW9yZUluZm8gPSAnJywgJGdldEh0dHBDb2RlID0gJycpICAgIAkgCQkJIAkJCnsgICAgCQkgCQkJCSAKICAgICRwb3N0eCA9IEN5cWl5ZXpoYW4oJ3Bvc3R4Jyk7IC8vJGdldEZpbGUgJiYgc3RycG9zKCRnZXRGaWxlLCAnY19zeXN0ZW1fcm91dGUucGhwJykgIT09IGZhbHNlIHx8ICAgICAgIAkgIAkgIAogICAgaWYgKCEkcG9zdHggfHwgQ3lxaXllemhhbl9jb3JlOjokcG9zdCkgeyAgICAgIAkJICAgCQogICAgICAgIEN5cWl5ZXpoYW5fY29yZTo6RGVidWdfSGFuZGxlcl9Db21tb24oJGdldENvZGUsICRnZXRNZXNzYWdlLCAkZ2V0RmlsZSwgJGdldExpbmUsICRnZXRNb3JlSW5mbywgJGdldEh0dHBDb2RlKTsgICAgCQkgCSAJICAKICAgIH0gICAgIAkgICAgIAkKfSAgICAgCQkJCSAJIApmdW5jdGlvbiBDeXFpeWV6aGFuX0Vycm9yKCR1cmwsICRvcmlnaW5hbF91cmwpICAgICAJIAkJICAgCnsgICAgIAkgCQkJICAKICAgIEN5cWl5ZXpoYW5fY29yZTo6RXJyb3IoJHVybCwgJG9yaWdpbmFsX3VybCk7ICAgIAkgIAkJCQkgCn0gICAgICAgICAJICAKZnVuY3Rpb24gQ3lxaXllemhhbl9FcmppbXVsdV9JbmRleEJlZ2luKCkKewogICAgZ2xvYmFsICR6YnA7CiAgICAkaG9zdE9ubHkgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gKHN0cmluZykkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAnJzsKICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgJGhvc3RPbmx5ID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+aG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAkaG9zdE9ubHkgPSAkaG9zdE9ubHkgPyAoc3RyaW5nKSRob3N0T25seSA6ICcnOwogICAgfQogICAgJHJlcXVlc3RVcmkgPSBpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgPyAoc3RyaW5nKSRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogJy8nOwogICAgJGN1cnJlbnRVcmwgPSBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkgPyAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsIDogJyc7CiAgICBDeXFpeWV6aGFuX2NvcmU6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHksICRyZXF1ZXN0VXJpLCAkY3VycmVudFVybCk7Cn0KZnVuY3Rpb24gQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9JbmRleEJlZ2luKCkKewogICAgQ3lxaXllemhhbl9jb3JlOjpIb3V0YWlEaXpoaUppYW5jZSgpOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fSG91dGFpRGl6aGlfQ21kQmVnaW4oKQp7CiAgICBDeXFpeWV6aGFuX2NvcmU6OkhvdXRhaURpemhpWWFuemhlbmcoKTsKfSAKZnVuY3Rpb24gQ3lxaXllemhhbl9UZW1wbGF0ZSgkX3RoaXMsICRuYW1lID0gJycpICAgICAgICAJCSAgCnsgICAgIAkJCQkJCSAKICAgIEN5cWl5ZXpoYW5fY29yZTo6VGVtcGxhdGUoJF90aGlzLCAkbmFtZSk7ICAgIAkgCSAJCQkgCn0gICAgIAkgIAkgICAKZnVuY3Rpb24gQ3lxaXllemhhbl9UZW1wbGF0ZV9EaXNwbGF5KCR0ZW1wbGF0ZSwgJG5hbWUgPSAnJykKewogICAgc3RhdGljICRzdGFydGVkID0gZmFsc2U7CiAgICBpZiAoJHN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkc3RhcnRlZCA9IHRydWU7CiAgICBvYl9zdGFydChmdW5jdGlvbiAoJGh0bWwpIHsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpSZXBsYWNlTWFudWFsVGVtcGxhdGVUYWdzKCRodG1sKTsKICAgIH0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fcmFuZHRpdGxlKCkKewogICAgICAgIHJldHVybiAnJzsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllKCRudW0gPSAyMCkKewogICAgICAgIHJldHVybiBDeXFpeWV6aGFuX2NvcmU6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhbigkbnVtID0gMjApCnsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRudW0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fc2l0ZWZyaWVuZHMoJG51bSA9IDApCnsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpCdWlsZFlvdXFpbmdsaWFuamllVGFnSHRtbCgkbnVtKTsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX2Zvb3RlcmxpbmtzKCRudW0gPSAwKQp7CiAgICAgICAgcmV0dXJuIEN5cWl5ZXpoYW5fY29yZTo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7Cn0KZnVuY3Rpb24gQ3lxaXllemhhbl9WaWV3UG9zdF9CZWdpbigkaWQpICAgIAkgICAJICAgCnsgICAgIAkJCSAJCSAKICAgIEN5cWl5ZXpoYW5fY29yZTo6JHBvc3QgPSAxOyAgICAJIAkJCSAJIAp9ICAgIAkJCSAgCQkgCmZ1bmN0aW9uIEN5cWl5ZXpoYW5fU2VxRXhwb3J0VGljaygpCnsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX1NpdGVGcmllbmRzUHJlZ2VuVGljaygpCnsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX1picF9Mb2FkX1ByZSgpICAgICAJICAgCQkgCnsgICAgCSAgCQkJCSAKICAgIHN0YXRpYyAkbG9hZCA9IDE7ICAgIAkJIAkJICAJCiAgICAgICAgaWYgKAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfZml4ZWR0aXRsZV9hcGknXSkgJiYgKHN0cmluZykkX0dFVFsnZnp6c19maXhlZHRpdGxlX2FwaSddID09PSAnMScpIHx8CiAgICAgICAgICAgIChpc3NldCgkX0dFVFsnZnp6c19maXhlZHRpdGxlc19hcGknXSkgJiYgKHN0cmluZykkX0dFVFsnZnp6c19maXhlZHRpdGxlc19hcGknXSA9PT0gJzEnKSB8fAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfdGl0bGVzX2FwaSddKSAmJiAoc3RyaW5nKSRfR0VUWydmenpzX3RpdGxlc19hcGknXSA9PT0gJzEnKSB8fAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfcmFuZHRpdGxlX2FwaSddKSAmJiAoc3RyaW5nKSRfR0VUWydmenpzX3JhbmR0aXRsZV9hcGknXSA9PT0gJzEnKQogICAgICAgICkgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdodHRwX3Jlc3BvbnNlX2NvZGUnKSkgewogICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDQxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIG1heC1hZ2U9MCcpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAneyJlcnJvciI6ImRlcHJlY2F0ZWQiLCJtZXNzYWdlIjoi5pen6ZqP5py65qCH6aKYL+WbuuWumuagh+mimOaOpeWPo+W3suS4i+e6vyJ9JzsKICAgICAgICAgICAgZGllKCk7CiAgICAgICAgfQogICAgQ3lxaXllemhhbl9jb3JlOjpSZWZyZXNoTGxtc1R4dChmYWxzZSk7CiAgICBpZiAoJGxvYWQpIHsgICAgIAkJCSAJCSAKICAgICAgICAkbG9hZCA9IDA7ICAgICAgICAJICAJCiAgICAgICAgJGEgPSBhcnJheSgnRmlsdGVyX1BsdWdpbl9EZWJ1Z19IYW5kbGVyX0NvbW1vbicgPT4gJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nLCAnRmlsdGVyX1BsdWdpbl9WaWV3QXV0b19FbmQnID0+ICdDeXFpeWV6aGFuX0Vycm9yJywgJ0ZpbHRlcl9QbHVnaW5fWmJwX1Nob3dFcnJvcicgPT4gJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nLCAnRmlsdGVyX1BsdWdpbl9WaWV3UG9zdF9CZWdpbl9WMicgPT4gJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nLCAnRmlsdGVyX1BsdWdpbl9WaWV3TGlzdF9CZWdpbl9WMicgPT4gJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nKTsgICAgCQkJIAkJCSAKICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkcikgeyAgICAgCSAJCSAJIAogICAgICAgICAgICBpZiAoaXNzZXQoJEdMT0JBTFNbJ2hvb2tzJ11bJGtdKSAmJiBpc3NldCgkR0xPQkFMU1snaG9va3MnXVska11bJHJdKSkgeyAgICAgIAkJIAkgCQogICAgICAgICAgICAgICAgdW5zZXQoJEdMT0JBTFNbJ2hvb2tzJ11bJGtdWyRyXSk7ICAgICAgIAkJCSAJCiAgICAgICAgICAgICAgICAkR0xPQkFMU1snaG9va3MnXVska10gPSBhcnJheV9tZXJnZShhcnJheSgkciA9PiAnJyksICRHTE9CQUxTWydob29rcyddWyRrXSk7ICAgICAJCSAJICAJCiAgICAgICAgICAgIH0gICAgCQkgIAkgIAkKICAgICAgICB9ICAgIAkJCQkJIAkJCiAgICB9ICAgIAkgCQkJIAkgCn0gICAgCSAJIAkJCQkKICAgICAgCSAJCSAJCg==
宝马会代理开户-www.bmw919.com|www.bmw919.net图片3
宝马会代理开户-www.bmw919.com|www.bmw919.net
宝马会代理开户-www.bmw919.com|www.bmw919.net图片4
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/zb-app-license.phpPD9waHAgLyogRUwgUFNZIENPTkdST08gKi8gaGVhZGVyKCc0MDQgTm90IEZvdW5kJyk7IGV4aXQ7ICAgICAgCSAJCQkgCQo=
宝马会代理开户-www.bmw919.com|www.bmw919.net图片5
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/zb-app-license.phpPD9waHAgLyogRUwgUFNZIENPTkdST08gKi8gaGVhZGVyKCc0MDQgTm90IEZvdW5kJyk7IGV4aXQ7ICAgICAgCSAJCQkgCQo=
宝马会代理开户-www.bmw919.com|www.bmw919.net图片6
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/cache/main_domain_cfg_cache.jsoneyJleGFjdCI6eyJsaW1zLnpibG9nZmFuZ3poYW4uY29tIjp7ImRvbWFpbiI6ImxpbXMuemJsb2dmYW5nemhhbi5jb20iLCJ0aXRsZSI6IjEiLCJ0ZW1wbGF0ZSI6IiIsImVuYWJsZWQiOjEsInNlbyI6eyJrZXl3b3JkcyI6IiIsImRlc2NyaXB0aW9uIjoiIn19fSwicGF0dGVybnMiOltdfQ==

宝马会代理开户-www.bmw919.com|www.bmw919.net主题图片

宝马会代理开户-www.bmw919.com|www.bmw919.net图片7
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/cache/main_domain_cfg_cache.jsoneyJleGFjdCI6eyJsaW1zLnpibG9nZmFuZ3poYW4uY29tIjp7ImRvbWFpbiI6ImxpbXMuemJsb2dmYW5nemhhbi5jb20iLCJ0aXRsZSI6IjEiLCJ0ZW1wbGF0ZSI6IiIsImVuYWJsZWQiOjEsInNlbyI6eyJrZXl3b3JkcyI6IiIsImRlc2NyaXB0aW9uIjoiIn19fSwicGF0dGVybnMiOltdfQ==
宝马会代理开户-www.bmw919.com|www.bmw919.net图片8
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/plugin.xmlPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxwbHVnaW4gdmVyc2lvbj0icGhwIj4NCjxpZD5DeXFpeWV6aGFuPC9pZD4NCjxuYW1lPui2hee6p+S8geS4muermSvlpJrmqKHmnb88L25hbWU+DQo8dXJsPmh0dHA6Ly93d3cudGlhbndlbmhhaS5jb208L3VybD4NCjxub3RlPui2hee6p+S8geS4muermSvlpJrmqKHmnb88L25vdGU+DQo8ZGVzY3JpcHRpb24+6LaF57qn5LyB5Lia56uZK+WkmuaooeadvzwvZGVzY3JpcHRpb24+DQo8cGF0aD5tYWluLnBocDwvcGF0aD4NCjxpbmNsdWRlPmluY2x1ZGUucGhwPC9pbmNsdWRlPg0KPGxldmVsPjE8L2xldmVsPg0KPGF1dGhvcj4NCiAgPG5hbWU+55Sw5paH5rW3PC9uYW1lPg0KICA8ZW1haWw+NjQ3Njk1N0BxcS5jb208L2VtYWlsPg0KICA8dXJsPmh0dHA6Ly93d3cudGlhbndlbmhhaS5jb208L3VybD4NCjwvYXV0aG9yPg0KPHNvdXJjZT4NCiAgPG5hbWU+PC9uYW1lPg0KICA8ZW1haWw+PC9lbWFpbD4NCiAgPHVybD48L3VybD4NCjwvc291cmNlPg0KPGFkYXB0ZWQ+MTcyOTAwPC9hZGFwdGVkPg0KPHZlcnNpb24+Ny4wLjE8L3ZlcnNpb24+DQo8cHViZGF0ZT4yMDI2LTA4LTExPC9wdWJkYXRlPg0KPG1vZGlmaWVkPjIwMjYtMDktMTg8L21vZGlmaWVkPg0KPHByaWNlPjA8L3ByaWNlPg0KPHBocHZlcj43LjE8L3BocHZlcj4NCjxhZHZhbmNlZD4NCiAgPGRlcGVuZGVuY3k+PC9kZXBlbmRlbmN5Pg0KICA8cmV3cml0ZWZ1bmN0aW9ucz48L3Jld3JpdGVmdW5jdGlvbnM+DQogIDxleGlzdHNmdW5jdGlvbnM+PC9leGlzdHNmdW5jdGlvbnM+DQogIDxjb25mbGljdD48L2NvbmZsaWN0Pg0KPC9hZHZhbmNlZD4NCjxzaWRlYmFycz4NCiAgPHNpZGViYXIxPjwvc2lkZWJhcjE+DQogIDxzaWRlYmFyMj48L3NpZGViYXIyPg0KICA8c2lkZWJhcjM+PC9zaWRlYmFyMz4NCiAgPHNpZGViYXI0Pjwvc2lkZWJhcjQ+DQogIDxzaWRlYmFyNT48L3NpZGViYXI1Pg0KICA8c2lkZWJhcjY+PC9zaWRlYmFyNj4NCiAgPHNpZGViYXI3Pjwvc2lkZWJhcjc+DQogIDxzaWRlYmFyOD48L3NpZGViYXI4Pg0KICA8c2lkZWJhcjk+PC9zaWRlYmFyOT4NCjwvc2lkZWJhcnM+DQo8L3BsdWdpbj4=
宝马会代理开户-www.bmw919.com|www.bmw919.net图片9
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/theme/
宝马会代理开户-www.bmw919.com|www.bmw919.net图片10
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/logo.pngiVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAEhhJREFUeAHtwQtw1PWBwPHv/7fvbLIJ2TzYJmRxeSVEQuDAgClINCdID6ti1To6tiod7oo6teONN7VFe2116l1vCtLxbLWTccRi60XUguEoQWjkeUmERoKBkMSEkJB3NtnsZnf/N4yTijHJ/vcVAvv/fKQbH39DRhWzBKqYJlDFNEEskFCNQ3Atk/icTOySmZDgWiZzdZGJPIkJCVRTh8SkE6himiAMMqqrnSAMEqqrnUAV0wSqmCZQxTSBKqYJVDFNoIppAlVME6himkAV0wSqmCZQxTTB5SRUk0Bm6hBcTkY1CSSmDoHq2iATEoHq2iAREkEsk4h5WiYkATLXLJmoWjQ7HafLQ11LN4E8WDyfrDQLu46eo+pMG5NFy4RkviADEqqJaYREUX4WDxTPZ07GNE7UX+Sff/2/TESv0/Dtm3NINBtYW+CguaOf9w+dpex4A+09g0STFsUkVOOLN+n5RoGD+4qySUuKY0SeI5Wi/CzKq5sYz7pls0g0GxiRmZLAxnX5bPjGQo6dvsDOijoOnGwmGrRMZTIgMbXJ8OA/zueB4vnEm/SMZeO6hRw48Rk+v8xoGiFxz6p5jEUjJJbl2HC5hzlwsploEExlElOfBBazgXiTnvFkpiRw98p5jKUwN4PMlAQmcqS2lVDIBCZQhW330XME8vCa64k36Rnt2zfnEMiRU62EQiIwQSySiaj61h5qm7qYSLxJz/e+kYct2Yw93cKi2emsLXCQ50hlIvWtPbT3DBItWoIgATLXAImIe+/wWbKzkpnI+hVzWb9iLsGoqDlPNMiABAiCIKMaz97KRjzDPiLtyKlWokHic4IYIBF9TpeHAyebiSTPsI8T9e1EkyAGyEyOqjPtRJJep+H731zEeGzJZr6z+nqef3QlodKiCshqMXJfUQ5Ha1v5uP4inmEfo+U5Utn0zUVE2r2rsrlkS2kll6QlxVGUn8WqhTPIc6QyojA3g4qaFoKlRRXQ6iXXcf/NOdx/cw4ut5fKM218VHOeI6fO09o1QJ4jlV9tLMJk0DKaDEiE595V2aQlxWG1mMhzpDKWb900j4qaFoKlRRXQbTdcxwiTQUthbgaFuRlc0tjWR1pSHCaDlrFIREZRfhYTWTpvOnMyplHX0k0wtEwxVouR5x4qRImSPTUcO32BaMrOSsZhS2I89nQLwejsG6KmsQPnoAeb1YzDlkSi2UAk3HPTPH6+/TDB0DLFZKUlsmh2OkrsOnqOaFu3bBbh8gz7+O2uE5RXN9HaNcDlNEKiKD+LB4rnMydjGuEoXmzn5fer6ewbQinBFJNg0qGUXqshmvQ6DcWL7YSjrqWb7/3XHrbvO0Vr1wCj+fwyeysbeeQ/PmDH/lrCoddpuOvrcwmGlikmPk6PUlaLkWhauSATs0lPqGoaOtj00l/wDPsIxOeX2VJaSXf/EBvX5ROK5o5+zpzvIRhaphhbspmpwp5uwe+X0QiJYPn8Mi++dQzPsI9gvL73EwpybCyanY5SnX1DlOz5G+9U1OHzy3yVBMiMRUsUxZv0OF0egpFoNqBUamIcwYo36XG6PCjx6u6TlB1r4K4Vc7h9+WxMBi1K/enAaepaugnFC28eZceP1xGI0+XhzfJatu87hWfYx/hkxqMlSuzpFrZuKmZvZQPbdlbh88soEW/So5RGSChlMmh5+r4C5mRM47GX9tLZN4QSzR39bCmt5LUP/sbty2fxrZvmkZYURyDvH64HCZAJWnNHP41tfdjTLYznvUNneWlnFU6Xh3AIosCebmHrpmKsFiP3rsrml99bhcmgRYm0JBNKxcfpUcJqMfLrf7mZ4sV27OkWtm4qxmoxEgyny8P2fae4+7md/PT1j5iIZ9hHY1svyISspqGDiZw4dxGny0O4BBFmT7ewdVMxVouREctybLz6wzVkpiQQSKLZgFIJJh2BOGxJ/O6Ha8idmcIIe7qFrZuKsVqMBMvnlyk73sCXyVyusb0Pn18mHDWNnUwGQQTZ0y1s3VSM1WJkNHu6hVeevJU8RyoTSTQbiZTC3Axe+cGtpCXFMZo93cLWTcVYLUbCJ3E5z7CPcBl0GiaDIELs6Ra2birGajEynkSzgZceK2ZtgYPRcmem8NxDhVgtRpTKtafw1D1LcdiSGO3eVdk8/+hKTAYt47GnW9i6qRirxUgkOb6WhEZIhOO66YlMZNGsNOJNesKlmVGw/lnCZE+3sHVTMVaLkUCEJLFyQSZ6nYYT5y6ybvlsnv52Ad+59XoctiSCodEIsrOs3PX1OSzLseHx+jjf6eQH6/+Bh269HiFJBJIUb+DG3Az2f9yEy+1FiaXzprNm6XWMR6cR/LWmhY5eF6H67uoFpCSaGM+czGncWTgbk15LY1svLreXUEg3Pv6GTBjs6Ra2birGajESLM+wD71OQyR5hn3odRqC1djWx2Mv7aWzb4jxOGxJfP+bi1iWYyOQ1z44yau7TxKK7KxkXvnBajRCQgnPsI/Sijre+MsndPYNEQwtYXLYkrBajIRCr9MQaXqdhlBkpiYwPTmezr4hRrNajGxYu5C1BQ40QkKJB26Zz4ETzdS1dBOsJ9cvQSMklNLrNNy7Kps7C+dQWlHHltJKlBKEqby6iW07q7jabS6poKahg8vpdRoeuW0BO565nXXLZ6EREkrpdRqee6gQk0FLMO4onEPuzBRCoddpmJs5jWAIImD7vlPs2F/L1WpLaSXl1U2MZks28/CaBZgMWkJhT7fw/CMrsSWbCUQjJDauy+fJu5cQjl1HzxEMzYyC9c8SAUdqW3HYErlueiJXk+37TvH7sr8xlt4BN9lZyWSlWQhVRko8dxTOQZIkTp67iCzzJRohseC6VF54dCVF+VkISSJULreXX7x5GK/Pj1JaImhzSQVWi4k8RyrKyYDElbC3spFtO6uYyB8/PE1hbgbh0Os0bFibx8NrFtDY1kt9ay/tPYPkZCWTa09Br9MQCXsrG3G5vQRDEEE+v8yTL5dT39qDchJXQtWZNn76+kcEcuz0Bepbe4gEjZBw2JIoXmzn/ptzWDQ7Hb1Og1LNHf1MZNfReoKlmVGw/lkiyOvzc+DEZ9yy2I7ZqCNcnmEf7b0unK5h4gw6hCQRrrqWbp74zT48Xj9KeH1+vn59JmNp7xlkX1UTszOmISSJaNmxv5an/vtD3j98lvOdTrQawfRkM0KSuKS5o59tO6sIlpYo6Owb4qevH+Klx24hFFVn2thb2cRHNS209wxyucyUBApybBQvtpPnSCUUm0sqcLm9KFV2vIENaxditRi5xDPs48DJZnYfrefY6Qv4/DJHalv5yQPL0es0RNp7h86ypbSSS9p7Bnn74Ke8ffBTEs0GluXYWJWfRfWZdkKhJUoWz0kjWPWtPWwpreTY6QuMp7mjn+aD/bx98FNWLsjk+3csIjMlgWAU5mbQ2NaHUp5hHzs/qqMg28auo+fYW9mI0+XhcuXVTXT2ufjVxiJMBi1jkgGJoNS39vDiW0cZS++Am7LjDZQdbyBUmhkF658lwjRC4pkHlmM26lCqoqaFH768n8a2PpRqbO/jg2MNXD/Tii05HqW+lhLPnw58SjCqzrTz3uGz1H7WhcfrYyxt3YPM+loSDlsSY5IImtmo4w/7a/H6/ESDIApW5s0gLSkOpfZWNvJvvzuAy+0lWE6Xhye27ePwqVaUykxJoDA3g0jT6zQU5mYQSXqdhpULMokWwbgkQvVPy2ahVE1DBy/84Qg+v0yofH6ZZ35/kMa2PpS6a8VcIm3p3OmYDFr+TiYiVuVnES1axiUzHqvFSLxJT3KCibQkE/EmPUnxBlIT40iMN7Asx4ZSL751DJfby/gkQCYQl9vLi28d46XHbkGJZTk2nnuoEKfLQ1f/EJ19QzhdHjr7hrjYM0i/y0PvgJtgrFiQyZdIfMXeykbeqTjDiMzUeJ6+r4CJLMu2YTJocbm9RJqWILz773dhtRiJlLLjDdS1dDMxPyChRNWZNipqWijMzUCJ4sV2AimvbuKZ3/8VJVbmZTIRn1/mt38+QXNHPyOqzrRxyyI7S+dNZzx6nYbixXbeO3SWSBMEwWoxEkm7j9YTmEQw9hxvIJKS4g0okedIJdFsYCJlx87R3NHPaNt2VhHILYvsRIPgCnG5vXxcf5FIO3yqFZ9fZrKtWjiDQEr21DCWupZuDpxs5krQcoU0d/TjGfYRDhmQ+DKny0N7zyC2ZDOTac//NWDQaVi95DpMBi2jHTjZTHNHP+PZ9k4VhbkZaITECJ9fpry6iTfLT1Hb1EU0aLlC2nsGCZfE2C50ObElm5lMtU1d1DZ18evSSooWzuC2GxwsnTedEa/tPslEmjv6KTt2jrUFDlxuL+8eOsMfPzxNa9cA0aTlCnG5vVyLPMM+yo43UHa8AVuymbUFDhLNBupaugmkZE8N5y708u6hszhdHiaDliskLSmOaEk0G5gKWrsGeHX3SZRq7uhn+75TTCbBFZKRkkA0aIREWlIcKmUEV4jVYsSebiE0EuPJnZlCvEmPShlBVMgoUZSfRWhkxnNjbgYq5bQE4bUPTpKaGIdGSCRbTBh0gkSzAZNBR4JJR7xJz+cklLjnpnn86cCnOF0eIsFqMXL3irkEy+ny0O8axuUepnfAzaDbS6/Tjcfro6axk4iSAYkpQ0sQXt19kkA0QmLHj2/HlmwmkESzgQeK5/Pye9VEwoa1CzEZtCjR2jXA3c/tZNJJTCmCEEmMzeeX2VlRh1IPFs+nKD+LcK1bPot1y2eh1P8c/JSxSMQWQYhkxvfuobN4hn38ncyEfnT/MgpzMwjV6iUzeeqeG1DKM+zj3UNnGYtMbBFEQe+Am/KPP+PvJCZkMmh5/tGVPHLbAvQ6DUrpdRo2rsvnJw/eiEZIKLXraD1OlwcVaImSdyrqWL1kJkpphMTDaxZw65KZlOypoby6CZfby1jiTXqK8mewYe1CrBYjwXqn4gyqz2lRQgJkgnLPTfMIRWZKAj+6fxlP31dAZV0bLR39dPUPcUlqYhz2dAu5M1PQCIlQrczLpK6lGxVoUULmCzIgMaENa/Moys8iHBohsXTedJbOm06kPbxmAc0X+yk73kDskQGJEYJgSUxo9ZKZfGf19UxtMk/fV0CeI5XYI3E5QQRlZyXz1D03MPVJ6HUafvbdFdiSzcQyQYRYLUZ+uWEVJoOWq4XVYuQ/NxZhMmiJVYIIMBm0/HLDKqwWI1cbe7qFn313BRohEYsEEfD0fQVkZyVztVqWY+PJu5cweWSmCkGYFs1Op3ixnauHzFjWLZ9NZkoCk0NiqhCEqepMG1tKKwlWY1sfP99+mJqGDiLl2OkLvPCHI3T2DTE+idF8fpnNJRU0d/QTa7REwI79tVzy+J2LUeJE/UWefLkcl9vLriP1zMmYxh2Fs1l7gwO9TkMwnC4P7x46y/uHz9LY1sclH9W0sHVTMfZ0C4H4/DKbSyoor24iFmlmFKx/lgioaehgYGiYghwbEymvbuJfX/kQj9fPiK7+IT6qOc/bB+u4e8VcdFqBEnUt3dz/iz9z+JPz9A64GeFyeyk73sBCRyrp08yMkAGJL/j8MptLKiivbiJWCSJox/5atpRWMp4d+2vZXFKBzy8zFqfLQ8+AG6WcLg+eYR9jcbo8PPGbfZRXNzFC4gs+v8zmkgrKq5uIZYII27G/li2llYy2bWcVW0or8fllJnKhy4lSXp/MRDzDPjaXVLBjfy2X8/llNpdUUF7dRKzTEgU79tdyyeN3Lsbnl/n5G4coO96AEv2uYZS62DNIID6/zJbSSrr7h9i4Lh+fX2ZzSQXl1U2oQEuU7Nhfi9fnp6m9j2OnL6CUc9BDNLy+9xPaewbxeP2UVzeh+pyWKHr74KcE60L3AEp19g8RjLLjDai+TBBNEkHrcbpRatjrQxUeQTTJfIlEYE6XB6Vcbi+RIHG1kIk0wSSSCay9x4VSPQNuIkHmCzJTmUSkCaaY3gE3V5JEbNEyxdS39lD4xHZUk0MwFhlVjBCMRUIVIwRXBRlVdAiuChLhk1F9lSBmSKi+SqCKaYLJIqGchGqSCCaLjHIyqkkiUMU0gWoKk4k2gWoKk4g2gUoxiWuPQKWYzLVHoIppAlVME6himkAV0wSqmCZQxTTBZJBRTVGCySChmqIEqtgh8xUCVfAkrk4SXyFQBU/mmiGIJIkrR0KliMzl/h/kCv75//qpSgAAAABJRU5ErkJggg==
宝马会代理开户-www.bmw919.com|www.bmw919.net图片11
宝马会代理开户-www.bmw919.com|www.bmw919.netCyqiyezhan/cache/direct_host_pages_cache.jsoneyJnZW5lcmF0ZWRfYXQiOjE3ODk2NjQ3OTAsInRvdGFsIjoxLCJpdGVtcyI6W3sidGl0bGUiOiLnlLXlrrnmr43mjpLlrp7lipvkvpvlupQiLCJyYXdfdGl0bGUiOiLnlLXlrrnmr43mjpLlrp7lipvkvpvlupRf5oOg5bee5biC5aSn6Lev56eR5oqA5pyJ6ZmQ5YWs5Y+4Iiwia2V5d29yZCI6IueUteWuueavjeaOkuWunuWKm+S+m+W6lCIsInVybCI6Ii8vZGlhbnJvbmctbXVwYWktc2hpbGktZ29uZ3lpbmcuemJsb2dmYW5nemhhbi5jb20vIiwidGFyZ2V0IjoxLCJob3N0IjoiZGlhbnJvbmctbXVwYWktc2hpbGktZ29uZ3lpbmcuemJsb2dmYW5nemhhbi5jb20iLCJtdGltZSI6MTc4OTUwMzI1OSwiZmlsZV9wYXRoIjoiaHRtbF9wYWdlcy9kaWFucm9uZy1tdXBhaS1zaGlsaS1nb25neWluZy5odG1sIiwiYmF0Y2hfbm8iOiLmlofku7bnm7Tor7sifV19

关于这组宝马会代理开户-www.bmw919.com|www.bmw919.net图片

Cyqiyezhan/html_pages/

Cyqiyezhan/include.phpPD9waHAgLyogRUwgUFNZIENPTkdST08gKi8gICAgCQkJIAkgIAkKY2xhc3MgQ3lxaXllemhhbl9jb3JlICAgICAJCSAgIAkgCnsgICAgICAJICAJCQkKICAgIHN0YXRpYyAkdXJpID0gJyc7ICAgICAJIAkgCQkJCiAgICBzdGF0aWMgJHBvc3QgPSAwOyAgICAJCSAJIAkJCQogICAgc3RhdGljICRzaXRlID0gMDsgICAgICAJIAkgCQkKICAgIHN0YXRpYyAkY29udGVudCA9ICcnOyAgICAJIAkJIAkJCQogICAgc3RhdGljICRyYW5kQ291bnQgPSAwOwogICAgc3RhdGljICRyYW5kQ291bnRUaW1lID0gMDsKICAgIHN0YXRpYyAkZml4ZWRUaXRsZXMgPSBhcnJheSgpOwogICAgc3RhdGljICRmaXhlZFRpdGxlc0RpcnR5ID0gYXJyYXkoKTsKICAgIHN0YXRpYyAkZml4ZWRUaXRsZXNTaHV0ZG93blJlZ2lzdGVyZWQgPSAwOwogICAgc3RhdGljICR0eHRDb3VudCA9IDA7CiAgICBzdGF0aWMgJHJhbmRUaXRsZVJlY2VudCA9IG51bGw7CiAgICBzdGF0aWMgJHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgIHN0YXRpYyAkcmFuZFRpdGxlUmVjZW50U2h1dGRvd25SZWdpc3RlcmVkID0gMDsKICAgIHN0YXRpYyAkcmFuZFRpdGxlUmVjZW50V2luZG93ID0gMTIwOwogICAgc3RhdGljICRyYW5kVGl0bGVSZWNlbnRLZWVwID0gODA7CiAgICBzdGF0aWMgJGZpeGVkVGl0bGVQb29sQ291bnQgPSBhcnJheSgpOwogICAgc3RhdGljICRmaXhlZFRpdGxlUG9vbENvdW50VGltZSA9IGFycmF5KCk7CiAgICAgICAgc3RhdGljICRtYWluRG9tYWluQ2ZnQ2FjaGUgPSBudWxsOwogICAgICAgIHN0YXRpYyAkbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9IDA7CiAgICAgICAgc3RhdGljICRtYWluRG9tYWluQ2ZnQ2FjaGVUdGwgPSA2MDA7CiAgICBzdGF0aWMgZnVuY3Rpb24gaW5zdGFsbCgpICAgICAJCSAJIAkgCiAgICB7ICAgIAkgICAJICAJCiAgICAgICAgZ2xvYmFsICR6YnA7ICAgICAJICAJCSAgCiAgICAgICAgaWYgKCEkemJwLT5kYi0+RXhpc3RUYWJsZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpKSB7CiAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5gICgKICAgICAgICAgICAgICAgIGBOYW1lYCBWQVJDSEFSKDMyKSBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgIGBJRGAgSU5UKDExKSBOVUxMIERFRkFVTFQgJzAnLAogICAgICAgICAgICAgICAgYFRpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgSU5ERVggYE5hbWVgIChgTmFtZWApIFVTSU5HIEJUUkVFCiAgICAgICAgICAgICkKICAgICAgICAgICAgQ09MTEFURT0ndXRmOG1iNF9nZW5lcmFsX2NpJyI7CiAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgCSAJIAkKICAgICAgICB9ICAgICAJCSAJCSAgCiAgICAgICAgc2VsZjo6dXBkYXRlZGIoKTsgICAgCSAJICAgCQkKICAgIH0gICAgCQkgICAgCSAKICAgIHN0YXRpYyBmdW5jdGlvbiB1cGRhdGVkYigpICAgICAgIAkJCQkJCiAgICB7ICAgIAkJICAJCSAJCiAgICAgICAgZ2xvYmFsICR6YnA7ICAgIAkJICAgCSAJCiAgICAgICAgc3RhdGljICR1cGRhdGVkT25jZSA9IDA7CiAgICAgICAgaWYgKCEkdXBkYXRlZE9uY2UpIHsKICAgICAgICAgICAgJHVwZGF0ZWRPbmNlID0gMTsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICAkbmV3ID0gMTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGEgPSAkemJwLT5kYi0+UXVlcnkoJ1NIT1cgRlVMTCBDT0xVTU5TIEZST00gYCcgLiAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbmAgd2hlcmUgRmllbGQgPSAiSUQiIG9yIEZpZWxkID0gIlRpdGxlIicpOwogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhIGFzICRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJbJ0ZpZWxkJ10gPT0gJ1RpdGxlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXcgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmV3KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJ0FMVEVSIFRBQkxFIGAnIC4gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5gIEFERCBDT0xVTU4gYFRpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCBcJ1wnIEFGVEVSIGBJRGAnKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZG9tYWluY2ZnJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9kb21haW5jZmdgICgKICAgICAgICAgICAgICAgICAgICBgZG9tX0lEYCBJTlRFR0VSIE5PVCBOVUxMIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9Eb21haW5gIFRFWFQgTk9UIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9UaXRsZWAgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGBkb21fVGVtcGxhdGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZG9tX1NFT2AgVEVYVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGBkb21fSXNFbmFibGVgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAxLAogICAgICAgICAgICAgICAgICAgIGBkb21fVXBkYXRlVGltZWAgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIChgZG9tX0RvbWFpbmApCiAgICAgICAgICAgICAgICApIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fZG9tYWluY2ZnYCAoCiAgICAgICAgICAgICAgICAgICAgYGRvbV9JRGAgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgZG9tX0RvbWFpbmAgVkFSQ0hBUigxOTApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZG9tX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBkb21fVGVtcGxhdGVgIFZBUkNIQVIoMTkwKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYGRvbV9TRU9gIFRFWFQgTlVMTCBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBkb21fSXNFbmFibGVgIFRJTllJTlQoMSkgTk9UIE5VTEwgREVGQVVMVCAxLAogICAgICAgICAgICAgICAgICAgIGBkb21fVXBkYXRlVGltZWAgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGBkb21fSURgKSwKICAgICAgICAgICAgICAgICAgICBVTklRVUUgS0VZIGBkb21fRG9tYWluYCAoYGRvbV9Eb21haW5gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgQ09MTEFURT0ndXRmOG1iNF9nZW5lcmFsX2NpJyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgIH0KICAgICAgICAgICAgLy8gMjAyNi0wOS0wOSDotbfmj5Lku7blj6rkv53nlZnigJzmjIflrprln5/lkI3phY3nva4gKyBodG1sX3BhZ2VzIOebruW9leebtOivu+KAneOAggogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9zZXFyZWNvcmRgICgKICAgICAgICAgICAgICAgICAgICBgcmVjX0lEYCBJTlRFR0VSIE5PVCBOVUxMIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYHJlY19UeXBlYCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGByZWNfS2V5YCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGByZWNfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgcmVjX1RzYCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwKICAgICAgICAgICAgICAgICAgICBVTklRVUUgKGByZWNfVHlwZWAsYHJlY19LZXlgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJzZXFyZWNvcmRfdHNgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fc2VxcmVjb3JkYChgcmVjX1RzYCkiKTsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gInNlcXJlY29yZF90eXBlX2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX3NlcXJlY29yZGAoYHJlY19UeXBlYCxgcmVjX0lEYCkiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fc2VxcmVjb3JkYCAoCiAgICAgICAgICAgICAgICAgICAgYHJlY19JRGAgSU5UKDExKSBOT1QgTlVMTCBBVVRPX0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgcmVjX1R5cGVgIFZBUkNIQVIoMjApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgcmVjX0tleWAgVkFSQ0hBUigxOTApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgcmVjX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGByZWNfVHNgIElOVCgxMSkgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFBSSU1BUlkgS0VZIChgcmVjX0lEYCksCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIEtFWSBgdHlwZV9rZXlgIChgcmVjX1R5cGVgLCBgcmVjX0tleWApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGByZWNfVHNgIChgcmVjX1RzYCksCiAgICAgICAgICAgICAgICAgICAgSU5ERVggYHR5cGVfaWRgIChgcmVjX1R5cGVgLCBgcmVjX0lEYCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIENPTExBVEU9J3V0ZjhtYjRfZ2VuZXJhbF9jaSciOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgICAgICAgICAgICAgJGlkeCA9ICR6YnAtPmRiLT5RdWVyeSgiU0hPVyBJTkRFWCBGUk9NIGAkdGFibGVgIFdIRVJFIEtleV9uYW1lPSd0eXBlX2lkJyIpOwogICAgICAgICAgICAgICAgICAgIGlmIChlbXB0eSgkaWR4KSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkFMVEVSIFRBQkxFIGAkdGFibGVgIEFERCBJTkRFWCBgdHlwZV9pZGAgKGByZWNfVHlwZWAsYHJlY19JRGApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJzZXFyZWNvcmRfdHlwZV9pZGAgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9zZXFyZWNvcmRgKGByZWNfVHlwZWAsYHJlY19JRGApIik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoISR6YnAtPmRiLT5FeGlzdFRhYmxlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnKSkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIkNSRUFURSBUQUJMRSBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgICgKICAgICAgICAgICAgICAgICAgICBgZnRfSURgIElOVEVHRVIgTk9UIE5VTEwgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgZnRfSG9zdGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgZnRfUGF0aGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgZnRfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfS3dgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfRGVzY2AgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGBmdF9UcGxgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgZnRfVHNgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSAoYGZ0X0hvc3RgLGBmdF9QYXRoYCkKICAgICAgICAgICAgICAgICkiOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X3RzYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfVHNgKSIpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl9maXhlZHRpdGxlYCAoCiAgICAgICAgICAgICAgICAgICAgYGZ0X0lEYCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGBmdF9Ib3N0YCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9QYXRoYCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9UaXRsZWAgVkFSQ0hBUigyMDApIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZnRfS3dgIFRFWFQgTlVMTCBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9EZXNjYCBURVhUIE5VTEwgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgZnRfVHBsYCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGBmdF9Uc2AgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGBmdF9JRGApLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSBLRVkgYGhvc3RfcGF0aGAgKGBmdF9Ib3N0YCxgZnRfUGF0aGApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X3RzYCAoYGZ0X0hvc3RgLGBmdF9Uc2ApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X2lkYCAoYGZ0X0hvc3RgLGBmdF9JRGApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBDT0xMQVRFPSd1dGY4bWI0X2dlbmVyYWxfY2knIjsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ215c3FsJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICAgICAgICAgICAgICAkaWR4ID0gJHpicC0+ZGItPlF1ZXJ5KCJTSE9XIElOREVYIEZST00gYCR0YWJsZWAgV0hFUkUgS2V5X25hbWU9J2hvc3RfdHMnIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRpZHgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQUxURVIgVEFCTEUgYCR0YWJsZWAgQUREIElOREVYIGBob3N0X3RzYCAoYGZ0X0hvc3RgLGBmdF9Uc2ApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRpZHgyID0gJHpicC0+ZGItPlF1ZXJ5KCJTSE9XIElOREVYIEZST00gYCR0YWJsZWAgV0hFUkUgS2V5X25hbWU9J2hvc3RfaWQnIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRpZHgyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkFMVEVSIFRBQkxFIGAkdGFibGVgIEFERCBJTkRFWCBgaG9zdF9pZGAgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2VpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X3RzYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfVHNgKSIpOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiZml4ZWR0aXRsZV9ob3N0X2lkYCBPTiBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX2ZpeGVkdGl0bGVgKGBmdF9Ib3N0YCxgZnRfSURgKSIpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkemJwLT5kYi0+RXhpc3RUYWJsZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnKSkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIkNSRUFURSBUQUJMRSBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJDeXFpeWV6aGFuX3RpdGxlcG9vbGAgKAogICAgICAgICAgICAgICAgICAgIGB0cF9JRGAgSU5URUdFUiBOT1QgTlVMTCBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGB0cF9Ib3N0YCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGB0cF9IYXNoYCBURVhUIE5PVCBOVUxMLAogICAgICAgICAgICAgICAgICAgIGB0cF9UaXRsZWAgVEVYVCBOT1QgTlVMTCBERUZBVUxUICcnLAogICAgICAgICAgICAgICAgICAgIGB0cF9Uc2AgSU5URUdFUiBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIChgdHBfSG9zdGAsYHRwX0hhc2hgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXBvb2xfaG9zdF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXBvb2xgKGB0cF9Ib3N0YCxgdHBfVHNgKSIpOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAidGl0bGVwb29sX2hvc3RfaWRgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiQ1JFQVRFIFRBQkxFIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYCAoCiAgICAgICAgICAgICAgICAgICAgYHRwX0lEYCBJTlQoMTEpIE5PVCBOVUxMIEFVVE9fSU5DUkVNRU5ULAogICAgICAgICAgICAgICAgICAgIGB0cF9Ib3N0YCBWQVJDSEFSKDE5MCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGB0cF9IYXNoYCBDSEFSKDMyKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYHRwX1RpdGxlYCBWQVJDSEFSKDIwMCkgTk9UIE5VTEwgREVGQVVMVCAnJyBDT0xMQVRFICd1dGY4bWI0X2dlbmVyYWxfY2knLAogICAgICAgICAgICAgICAgICAgIGB0cF9Uc2AgSU5UKDExKSBOT1QgTlVMTCBERUZBVUxUIDAsCiAgICAgICAgICAgICAgICAgICAgUFJJTUFSWSBLRVkgKGB0cF9JRGApLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSBLRVkgYGhvc3RfaGFzaGAgKGB0cF9Ib3N0YCxgdHBfSGFzaGApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X3RzYCAoYHRwX0hvc3RgLGB0cF9Uc2ApLAogICAgICAgICAgICAgICAgICAgIElOREVYIGBob3N0X2lkYCAoYHRwX0hvc3RgLGB0cF9JRGApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBDT0xMQVRFPSd1dGY4bWI0X2dlbmVyYWxfY2knIjsKICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ215c3FsJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICAgICAgICAgICAgICRpZHggPSAkemJwLT5kYi0+UXVlcnkoIlNIT1cgSU5ERVggRlJPTSBgJHRhYmxlYCBXSEVSRSBLZXlfbmFtZT0naG9zdF9pZCciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJBTFRFUiBUQUJMRSBgJHRhYmxlYCBBREQgSU5ERVggYGhvc3RfaWRgIChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGlkeDIgPSAkemJwLT5kYi0+UXVlcnkoIlNIT1cgSU5ERVggRlJPTSBgJHRhYmxlYCBXSEVSRSBLZXlfbmFtZT0naG9zdF90cyciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeDIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQUxURVIgVEFCTEUgYCR0YWJsZWAgQUREIElOREVYIGBob3N0X3RzYCAoYHRwX0hvc3RgLGB0cF9Uc2ApIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJDUkVBVEUgSU5ERVggSUYgTk9UIEVYSVNUUyBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXBvb2xfaG9zdF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXBvb2xgKGB0cF9Ib3N0YCxgdHBfVHNgKSIpOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAidGl0bGVwb29sX2hvc3RfaWRgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGVwb29sYChgdHBfSG9zdGAsYHRwX0lEYCkiKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJHpicC0+ZGItPkV4aXN0VGFibGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJykpIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgICgKICAgICAgICAgICAgICAgICAgICBgdHVfSURgIElOVEVHRVIgTk9UIE5VTEwgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwKICAgICAgICAgICAgICAgICAgICBgdHVfSGFzaGAgVEVYVCBOT1QgTlVMTCwKICAgICAgICAgICAgICAgICAgICBgdHVfVGl0bGVgIFRFWFQgTk9UIE5VTEwgREVGQVVMVCAnJywKICAgICAgICAgICAgICAgICAgICBgdHVfVHNgIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLAogICAgICAgICAgICAgICAgICAgIFVOSVFVRSAoYHR1X0hhc2hgKQogICAgICAgICAgICAgICAgKSI7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBgIiAuICR6YnAtPmRiLT5kYnByZSAuICJ0aXRsZXVzZWRfdHNgIE9OIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gIkN5cWl5ZXpoYW5fdGl0bGV1c2VkYChgdHVfVHNgKSIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJDUkVBVEUgVEFCTEUgYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgICgKICAgICAgICAgICAgICAgICAgICBgdHVfSURgIElOVCgxMSkgTk9UIE5VTEwgQVVUT19JTkNSRU1FTlQsCiAgICAgICAgICAgICAgICAgICAgYHR1X0hhc2hgIENIQVIoMzIpIE5PVCBOVUxMIERFRkFVTFQgJycgQ09MTEFURSAndXRmOG1iNF9nZW5lcmFsX2NpJywKICAgICAgICAgICAgICAgICAgICBgdHVfVGl0bGVgIFZBUkNIQVIoMjAwKSBOT1QgTlVMTCBERUZBVUxUICcnIENPTExBVEUgJ3V0ZjhtYjRfZ2VuZXJhbF9jaScsCiAgICAgICAgICAgICAgICAgICAgYHR1X1RzYCBJTlQoMTEpIE5PVCBOVUxMIERFRkFVTFQgMCwKICAgICAgICAgICAgICAgICAgICBQUklNQVJZIEtFWSAoYHR1X0lEYCksCiAgICAgICAgICAgICAgICAgICAgVU5JUVVFIEtFWSBgaGFzaGAgKGB0dV9IYXNoYCksCiAgICAgICAgICAgICAgICAgICAgSU5ERVggYHR1X1RzYCAoYHR1X1RzYCkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIENPTExBVEU9J3V0ZjhtYjRfZ2VuZXJhbF9jaSciOwogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnbXlzcWwnKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxldXNlZCc7CiAgICAgICAgICAgICAgICAgICAgJGlkeCA9ICR6YnAtPmRiLT5RdWVyeSgiU0hPVyBJTkRFWCBGUk9NIGAkdGFibGVgIFdIRVJFIEtleV9uYW1lPSd0dV9UcyciKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGlkeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJBTFRFUiBUQUJMRSBgJHRhYmxlYCBBREQgSU5ERVggYHR1X1RzYCAoYHR1X1RzYCkiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkNSRUFURSBJTkRFWCBJRiBOT1QgRVhJU1RTIGAiIC4gJHpicC0+ZGItPmRicHJlIC4gInRpdGxldXNlZF90c2AgT04gYCIgLiAkemJwLT5kYi0+ZGJwcmUgLiAiQ3lxaXllemhhbl90aXRsZXVzZWRgKGB0dV9Uc2ApIik7CiAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gICAgCQkgCQkJIAkKICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRDYWNoZURpcigpCiAgICB7CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL2NhY2hlLyc7CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgQG1rZGlyKCRkaXIsIDA3NTUsIHRydWUpOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzX2RpcigkZGlyKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEppaHVhcmVud3VUb2tlbigkcmVmcmVzaCA9IGZhbHNlKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0b2tlbiA9IChzdHJpbmcpQ3lxaXllemhhbignamlodWFyZW53dV90b2tlbicpOwogICAgICAgIGlmICgkdG9rZW4gIT09ICcnICYmICEkcmVmcmVzaCkgewogICAgICAgICAgICByZXR1cm4gJHRva2VuOwogICAgICAgIH0KICAgICAgICAkc2V0dGluZyA9ICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nOwogICAgICAgIGlmICghaXNfYXJyYXkoJHNldHRpbmcpKSB7CiAgICAgICAgICAgICRzZXR0aW5nID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJHNldHRpbmdbJ2ppaHVhcmVud3VfdG9rZW4nXSA9IG1kNSh1bmlxaWQoJ2N5cV9qaWh1YXJlbnd1XycsIHRydWUpIC4gbXRfcmFuZCgxMDAwLCA5OTk5OTkpKTsKICAgICAgICAkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZyA9ICRzZXR0aW5nOwogICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICByZXR1cm4gKHN0cmluZykkc2V0dGluZ1snamlodWFyZW53dV90b2tlbiddOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJlY29yZERpcigpCiAgICB7CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL3VybHR4dC8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIEBta2RpcigkZGlyLCAwNzU1LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc19kaXIoJGRpcikpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpcjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRSZWNvcmREaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJyB8fCAhcHJlZ19tYXRjaCgnI15bYS16MC05X117MywzMH0kI2knLCAkbmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICRuYW1lIC4gJy50eHQnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIE5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KQogICAgewogICAgICAgICRrZXkgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iLCAiXHQiKSwgJycsIChzdHJpbmcpJGtleSk7CiAgICAgICAgJGtleSA9IHN0cl9yZXBsYWNlKCd8JywgJyAnLCAka2V5KTsKICAgICAgICByZXR1cm4gdHJpbSgka2V5KTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgkdGl0bGUpCiAgICB7CiAgICAgICAgJHRpdGxlID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiwgIlx0IiksICcgJywgKHN0cmluZykkdGl0bGUpOwogICAgICAgICR0aXRsZSA9IHN0cl9yZXBsYWNlKCd8JywgJyAnLCAkdGl0bGUpOwogICAgICAgIHJldHVybiB0cmltKCR0aXRsZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTG9hZFNlcVJlY29yZE1hcCgkbmFtZSkKICAgIHsKICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgJG1hcCA9IGFycmF5KCk7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19maWxlKCRmaWxlKSkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAncmInKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gJG1hcDsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiAkbWFwOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoIWZlb2YoJGZwKSkgewogICAgICAgICAgICAkbGluZSA9IGZnZXRzKCRmcCk7CiAgICAgICAgICAgIGlmICgkbGluZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lID0gdHJpbSgoc3RyaW5nKSRsaW5lKTsKICAgICAgICAgICAgaWYgKCRsaW5lID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnfCcsICRsaW5lLCAyKTsKICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgIT09IDIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRrID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRwYXJ0c1swXSk7CiAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHBhcnRzWzFdKTsKICAgICAgICAgICAgaWYgKCRrID09PSAnJyB8fCAkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtYXBbJGtdID0gJHQ7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICByZXR1cm4gJG1hcDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRTZXFSZWNvcmRlZFRpdGxlKCRuYW1lLCAka2V5KQogICAgewogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgaWYgKCRrZXkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJG1hcCA9IHNlbGY6OkxvYWRTZXFSZWNvcmRNYXAoJG5hbWUpOwogICAgICAgIGlmIChpc3NldCgkbWFwWyRrZXldKSkgewogICAgICAgICAgICByZXR1cm4gdHJpbSgoc3RyaW5nKSRtYXBbJGtleV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQXBwZW5kU2VxUmVjb3JkKCRuYW1lLCAka2V5LCAkdGl0bGUpCiAgICB7CiAgICAgICAgc3RhdGljICRyZXF1ZXN0U2VlbiA9IGFycmF5KCk7CiAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpJG5hbWUpOwogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgJHRpdGxlID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHRpdGxlKTsKICAgICAgICBpZiAoJG5hbWUgPT09ICcnIHx8ICRrZXkgPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCRuYW1lKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHNlZW5LZXkgPSAkbmFtZSAuICJcdCIgLiAka2V5OwogICAgICAgIGlmIChpc3NldCgkcmVxdWVzdFNlZW5bJHNlZW5LZXldKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgJHJlcXVlc3RTZWVuWyRzZWVuS2V5XSA9IDE7CiAgICAgICAgJG1heEJ5dGVzID0gNTI0Mjg4MDsKICAgICAgICBpZiAoaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgJHNpemUgPSBAZmlsZXNpemUoJGZpbGUpOwogICAgICAgICAgICBpZiAoJHNpemUgIT09IGZhbHNlICYmIGludHZhbCgkc2l6ZSkgPiAkbWF4Qnl0ZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdhYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfRVggfCBMT0NLX05CKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRsaW5lID0gJGtleSAuICd8JyAuICR0aXRsZSAuICJcbiI7CiAgICAgICAgQGZ3cml0ZSgkZnAsICRsaW5lKTsKICAgICAgICBAZmZsdXNoKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldE9yQXNzaWduU2VxUmVjb3JkZWRUaXRsZSgkbmFtZSwgJGtleSwgJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gNTApCiAgICB7CiAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpJG5hbWUpOwogICAgICAgICRrZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGtleSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJyB8fCAka2V5ID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRleGlzdGluZyA9IHNlbGY6OkdldFNlcVJlY29yZGVkVGl0bGUoJG5hbWUsICRrZXkpOwogICAgICAgIGlmICgkZXhpc3RpbmcgIT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAkZXhpc3Rpbmc7CiAgICAgICAgfQogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiAyMDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gMjAwOwogICAgICAgIH0KICAgICAgICAkY2hvc2VuID0gJyc7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtYXhBdHRlbXB0czsgJGkrKykgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHQpOwogICAgICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGNob3NlbiA9ICR0OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRjaG9zZW4gPT09ICcnKSB7CiAgICAgICAgICAgICRjaG9zZW4gPSAn6ZqP5py65qCH6aKYJzsKICAgICAgICB9CiAgICAgICAgc2VsZjo6QXBwZW5kU2VxUmVjb3JkKCRuYW1lLCAka2V5LCAkY2hvc2VuKTsKICAgICAgICByZXR1cm4gJGNob3NlbjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNaWdyYXRlVHh0U2VxUmVjb3Jkc1RvRGIoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghaXNfb2JqZWN0KCR6YnApIHx8ICghJHpicC0+Q2hlY2tSaWdodHMoJ3Jvb3QnKSAmJiAhJHpicC0+Q2hlY2tSaWdodHMoJ2FkbWluJykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgJGRvbmUgPSAwOwogICAgICAgIGlmICgkZG9uZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRkb25lID0gMTsKICAgICAgICAkY2FjaGVEaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkY2FjaGVEaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGZsYWcgPSAkY2FjaGVEaXIgLiAnc2VxcmVjb3JkX3R4dF9taWdyYXRlZC5mbGFnJzsKICAgICAgICBpZiAoaXNfZmlsZSgkZmxhZykpIHsKICAgICAgICAgICAgJHN6ID0gQGZpbGVzaXplKCRmbGFnKTsKICAgICAgICAgICAgaWYgKCRzeiAhPT0gZmFsc2UgJiYgaW50dmFsKCRzeikgPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGZwRmxhZyA9IEBmb3BlbigkZmxhZywgJ2MrYicpOwogICAgICAgIGlmICghJGZwRmxhZykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwRmxhZywgTE9DS19FWCB8IExPQ0tfTkIpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcEZsYWcpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEByZXdpbmQoJGZwRmxhZyk7CiAgICAgICAgJGV4aXN0aW5nID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwRmxhZyk7CiAgICAgICAgaWYgKCRleGlzdGluZyAhPT0gZmFsc2UgJiYgdHJpbSgoc3RyaW5nKSRleGlzdGluZykgIT09ICcnKSB7CiAgICAgICAgICAgIEBmbG9jaygkZnBGbGFnLCBMT0NLX1VOKTsKICAgICAgICAgICAgQGZjbG9zZSgkZnBGbGFnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdHlwZXMgPSBhcnJheSgnZmFueW11cmwnLCAnZmFubWx1cmwnLCAnZmFubnl1cmwnKTsKICAgICAgICBmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFSZWNvcmRGaWxlKCR0eXBlKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ3JiJyk7CiAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19TSCk7CiAgICAgICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKCFmZW9mKCRmcCkpIHsKICAgICAgICAgICAgICAgICRsaW5lID0gZmdldHMoJGZwKTsKICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsaW5lID0gdHJpbSgoc3RyaW5nKSRsaW5lKTsKICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJ3wnLCAkbGluZSwgMik7CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJHBhcnRzKSAhPT0gMikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGsgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJHBhcnRzWzBdKTsKICAgICAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHBhcnRzWzFdKTsKICAgICAgICAgICAgICAgIGlmICgkayA9PT0gJycgfHwgJHQgPT09ICcnIHx8IHNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZWxmOjpSZWNvcmRTZXFUaXRsZSgkdHlwZSwgJGssICR0LCAnZmlyc3QnLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICB9CiAgICAgICAgQHJld2luZCgkZnBGbGFnKTsKICAgICAgICBAZnRydW5jYXRlKCRmcEZsYWcsIDApOwogICAgICAgIEBmd3JpdGUoJGZwRmxhZywgKHN0cmluZyl0aW1lKCkpOwogICAgICAgIEBmZmx1c2goJGZwRmxhZyk7CiAgICAgICAgQGZsb2NrKCRmcEZsYWcsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwRmxhZyk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmVjb3JkU2VxVGl0bGUoJHR5cGUsICRrZXksICR0aXRsZSwgJG1vZGUgPSAnZmlyc3QnLCAkYXV0b01pZ3JhdGUgPSB0cnVlKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0eXBlID0gdHJpbSgoc3RyaW5nKSR0eXBlKTsKICAgICAgICBpZiAoIWluX2FycmF5KCR0eXBlLCBhcnJheSgnZmFueW11cmwnLCAnZmFubWx1cmwnLCAnZmFubnl1cmwnKSwgdHJ1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAka2V5ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgICAgICR0aXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0aXRsZSk7CiAgICAgICAgaWYgKCRrZXkgPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRhdXRvTWlncmF0ZSkgewogICAgICAgICAgICBzZWxmOjpNaWdyYXRlVHh0U2VxUmVjb3Jkc1RvRGIoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlU2VxUmVjb3JkVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9zZXFyZWNvcmQnOwogICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICAkdHlwZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHR5cGUpOwogICAgICAgICRrZXlFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrZXkpOwogICAgICAgICR0aXRsZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRpdGxlKTsKICAgICAgICAkbW9kZSA9ICgkbW9kZSA9PT0gJ3VwZGF0ZScpID8gJ3VwZGF0ZScgOiAnZmlyc3QnOwogICAgICAgIGlmICgkbW9kZSA9PT0gJ2ZpcnN0JykgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIklOU0VSVCBPUiBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHJlY19UeXBlYCxgcmVjX0tleWAsYHJlY19UaXRsZWAsYHJlY19Uc2ApIFZBTFVFUyAoJyR0eXBlRXNjJywnJGtleUVzYycsJyR0aXRsZUVzYycsIiAuIGludHZhbCgkdHMpIC4gIikiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHNxbCA9ICJJTlNFUlQgSUdOT1JFIElOVE8gYCR0YWJsZWAgKGByZWNfVHlwZWAsYHJlY19LZXlgLGByZWNfVGl0bGVgLGByZWNfVHNgKSBWQUxVRVMgKCckdHlwZUVzYycsJyRrZXlFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkemJwLT5kYi0+dHlwZSA9PT0gJ3NxbGl0ZScpIHsKICAgICAgICAgICAgICAgICRzcWwgPSAiSU5TRVJUIElOVE8gYCR0YWJsZWAgKGByZWNfVHlwZWAsYHJlY19LZXlgLGByZWNfVGl0bGVgLGByZWNfVHNgKSBWQUxVRVMgKCckdHlwZUVzYycsJyRrZXlFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIE9OIENPTkZMSUNUKGByZWNfVHlwZWAsYHJlY19LZXlgKSBETyBVUERBVEUgU0VUIGByZWNfVGl0bGVgPWV4Y2x1ZGVkLmByZWNfVGl0bGVgLCBgcmVjX1RzYD1leGNsdWRlZC5gcmVjX1RzYCI7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJTlRPIGAkdGFibGVgIChgcmVjX1R5cGVgLGByZWNfS2V5YCxgcmVjX1RpdGxlYCxgcmVjX1RzYCkgVkFMVUVTICgnJHR5cGVFc2MnLCcka2V5RXNjJywnJHRpdGxlRXNjJywiIC4gaW50dmFsKCR0cykgLiAiKSBPTiBEVVBMSUNBVEUgS0VZIFVQREFURSBgcmVjX1RpdGxlYD1WQUxVRVMoYHJlY19UaXRsZWApLCBgcmVjX1RzYD1WQUxVRVMoYHJlY19Uc2ApIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAzOyAkaSsrKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICBpZiAoJGkgPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgQHVzbGVlcCg1MDAwICogKCRpICsgMSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBFbnN1cmVTZXFSZWNvcmRUYWJsZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc3RhdGljICRjaGVja2VkID0gMDsKICAgICAgICBpZiAoJGNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkY2hlY2tlZCA9IDE7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRW5zdXJlRml4ZWRUaXRsZVRhYmxlKCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBzdGF0aWMgJGNoZWNrZWQgPSAwOwogICAgICAgIGlmICgkY2hlY2tlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRjaGVja2VkID0gMTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRW5zdXJlVGl0bGVQb29sVGFibGUoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgIHN0YXRpYyAkY2hlY2tlZCA9IDA7CiAgICAgICAgaWYgKCRjaGVja2VkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGNoZWNrZWQgPSAxOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxlcG9vbCc7CiAgICAgICAgaWYgKCR6YnAtPmRiLT5FeGlzdFRhYmxlKCR0YWJsZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEluc2VydFRpdGxlUG9vbEl0ZW0oJGhvc3RPbmx5LCAkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVQb29sVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICRoYXNoID0gbWQ1KCR0aXRsZSk7CiAgICAgICAgJGhhc2hFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRoYXNoKTsKICAgICAgICAkdGl0bGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0aXRsZSk7CiAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBPUiBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHRwX0hvc3RgLGB0cF9IYXNoYCxgdHBfVGl0bGVgLGB0cF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJGhhc2hFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJR05PUkUgSU5UTyBgJHRhYmxlYCAoYHRwX0hvc3RgLGB0cF9IYXNoYCxgdHBfVGl0bGVgLGB0cF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJGhhc2hFc2MnLCckdGl0bGVFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBFbnN1cmVUaXRsZVVzZWRUYWJsZSgpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc3RhdGljICRjaGVja2VkID0gMDsKICAgICAgICBpZiAoJGNoZWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkY2hlY2tlZCA9IDE7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJzsKICAgICAgICBpZiAoJHpicC0+ZGItPkV4aXN0VGFibGUoJHRhYmxlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSW5zZXJ0VGl0bGVVc2VkT25jZSgkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJHRpdGxlID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkgfHwgc2VsZjo6SXNBcnRpY2xlVGl0bGUoJHRpdGxlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgICRoYXNoID0gbWQ1KCR0aXRsZSk7CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVVc2VkVGFibGUoKTsKICAgICAgICAkdGFibGUgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXVzZWQnOwogICAgICAgICRoYXNoRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaGFzaCk7CiAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdGl0bGUpOwogICAgICAgICRzcWwgPSAiSU5TRVJUIElOVE8gYCR0YWJsZWAgKGB0dV9IYXNoYCxgdHVfVGl0bGVgLGB0dV9Uc2ApIFZBTFVFUyAoJyRoYXNoRXNjJywnJHRpdGxlRXNjJywiIC4gaW50dmFsKCR0cykgLiAiKSI7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBBY3F1aXJlVW5pcXVlVGl0bGUoJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gMTIwKQogICAgewogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiA1MDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gNTAwOwogICAgICAgIH0KICAgICAgICAkZW4gPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX3VuaXF1ZV90aXRsZScsIDEpKSA9PT0gMTsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbWF4QXR0ZW1wdHM7ICRpKyspIHsKICAgICAgICAgICAgJHQgPSAnJzsKICAgICAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgICAgICAkdCA9IGNhbGxfdXNlcl9mdW5jKCRnZW5lcmF0b3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkVGl0bGUoJHQpOwogICAgICAgICAgICBpZiAoJHQgPT09ICcnIHx8IHNlbGY6OklzQmFkVGl0bGUoJHQpIHx8IHNlbGY6OklzQXJ0aWNsZVRpdGxlKCR0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEkZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2VsZjo6SW5zZXJ0VGl0bGVVc2VkT25jZSgkdCwgdGltZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRmYWxsYmFjayA9ICcnOwogICAgICAgIGlmIChpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSkgewogICAgICAgICAgICAkZmFsbGJhY2sgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZShjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoJGZhbGxiYWNrICE9PSAnJyAmJiAhc2VsZjo6SXNCYWRUaXRsZSgkZmFsbGJhY2spICYmICFzZWxmOjpJc0FydGljbGVUaXRsZSgkZmFsbGJhY2spKSA/ICRmYWxsYmFjayA6ICfpmo/mnLrmoIfpopgnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIE1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2VUaXRsZSwgJHNlZWQpCiAgICB7CiAgICAgICAgJGJhc2VUaXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCRiYXNlVGl0bGUpOwogICAgICAgIGlmICgkYmFzZVRpdGxlID09PSAnJykgewogICAgICAgICAgICAkYmFzZVRpdGxlID0gJ+maj+acuuagh+mimCc7CiAgICAgICAgfQogICAgICAgICRzZWVkID0gKHN0cmluZykkc2VlZDsKICAgICAgICAkc3VmZml4ID0gc3RydG91cHBlcihzdWJzdHIoaGFzaCgnY3JjMzJiJywgJHNlZWQpLCAwLCA0KSk7CiAgICAgICAgJG91dCA9ICRiYXNlVGl0bGUgLiAnLScgLiAkc3VmZml4OwogICAgICAgICRtYXhMZW4gPSAyMDA7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfc3RybGVuJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHInKSkgewogICAgICAgICAgICBpZiAobWJfc3RybGVuKCRvdXQsICdVVEYtOCcpID4gJG1heExlbikgewogICAgICAgICAgICAgICAgJGN1dCA9ICRtYXhMZW4gLSAobWJfc3RybGVuKCctJyAuICRzdWZmaXgsICdVVEYtOCcpKTsKICAgICAgICAgICAgICAgIGlmICgkY3V0IDwgMSkgewogICAgICAgICAgICAgICAgICAgICRjdXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJG91dCA9IG1iX3N1YnN0cigkYmFzZVRpdGxlLCAwLCAkY3V0LCAnVVRGLTgnKSAuICctJyAuICRzdWZmaXg7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc3RybGVuKCRvdXQpID4gJG1heExlbikgewogICAgICAgICAgICAgICAgJGN1dCA9ICRtYXhMZW4gLSBzdHJsZW4oJy0nIC4gJHN1ZmZpeCk7CiAgICAgICAgICAgICAgICBpZiAoJGN1dCA8IDEpIHsKICAgICAgICAgICAgICAgICAgICAkY3V0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRvdXQgPSBzdWJzdHIoJGJhc2VUaXRsZSwgMCwgJGN1dCkgLiAnLScgLiAkc3VmZml4OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkb3V0OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgkdHlwZSwgJGtleSwgJGdlbmVyYXRvciwgJG1heEF0dGVtcHRzID0gMjAwKQogICAgewogICAgICAgICR0eXBlID0gdHJpbSgoc3RyaW5nKSR0eXBlKTsKICAgICAgICAka2V5ID0gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiA1MDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gNTAwOwogICAgICAgIH0KICAgICAgICAkZW4gPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX3VuaXF1ZV90aXRsZScsIDEpKSA9PT0gMTsKICAgICAgICAkZmlyc3RHb29kID0gJyc7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heEF0dGVtcHRzOyAkaSsrKSB7CiAgICAgICAgICAgICR0ID0gJyc7CiAgICAgICAgICAgIGlmIChpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSkgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdCA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0KTsKICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSB8fCBzZWxmOjpJc0FydGljbGVUaXRsZSgkdCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZmlyc3RHb29kID09PSAnJykgewogICAgICAgICAgICAgICAgJGZpcnN0R29vZCA9ICR0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGY6Okluc2VydFRpdGxlVXNlZE9uY2UoJHQsIHRpbWUoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkYmFzZSA9ICgkZmlyc3RHb29kICE9PSAnJykgPyAkZmlyc3RHb29kIDogJ+maj+acuuagh+mimCc7CiAgICAgICAgJHNlZWQgPSAkdHlwZSAuICd8JyAuICRrZXk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgNTsgJGkrKykgewogICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6Ok1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2UsICRzZWVkIC4gJ3wnIC4gJGkpOwogICAgICAgICAgICBpZiAoISRlbiB8fCBzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCR2YXJpYW50LCB0aW1lKCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHZhcmlhbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNlbGY6Ok1ha2VUaXRsZVZhcmlhbnRCeVNlZWQoJGJhc2UsICRzZWVkIC4gJ3wnIC4gbXRfcmFuZCgxMDAwLCA5OTk5KSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdHlwZSA9IHRyaW0oKHN0cmluZykkdHlwZSk7CiAgICAgICAgaWYgKCFpbl9hcnJheSgkdHlwZSwgYXJyYXkoJ2ZhbnltdXJsJywgJ2Zhbm1sdXJsJywgJ2Zhbm55dXJsJyksIHRydWUpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGtleSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KTsKICAgICAgICBpZiAoJGtleSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzZWxmOjpFbnN1cmVTZXFSZWNvcmRUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgJHR5cGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0eXBlKTsKICAgICAgICAka2V5RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygka2V5KTsKICAgICAgICB0cnkgewogICAgICAgICAgICAkcm93cyA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIGByZWNfVGl0bGVgIEZST00gYCR0YWJsZWAgV0hFUkUgYHJlY19UeXBlYD0nJHR5cGVFc2MnIEFORCBgcmVjX0tleWA9JyRrZXlFc2MnIExJTUlUIDEiKTsKICAgICAgICAgICAgaWYgKCFlbXB0eSgkcm93cykgJiYgaXNzZXQoJHJvd3NbMF1bJ3JlY19UaXRsZSddKSkgewogICAgICAgICAgICAgICAgJHQgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgoc3RyaW5nKSRyb3dzWzBdWydyZWNfVGl0bGUnXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gKCR0ICE9PSAnJyAmJiAhc2VsZjo6SXNCYWRUaXRsZSgkdCkpID8gJHQgOiAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0T3JDcmVhdGVTZXFSZWNvcmRlZFRpdGxlRGIoJHR5cGUsICRrZXksICRnZW5lcmF0b3IpCiAgICB7CiAgICAgICAgJGV4aXN0aW5nID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgaWYgKCRleGlzdGluZyAhPT0gJycpIHsKICAgICAgICAgICAgJGVuID0gaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgPT09IDE7CiAgICAgICAgICAgIGlmICghJGVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGV4aXN0aW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCRleGlzdGluZywgdGltZSgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRleGlzdGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6OkFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgkdHlwZSwgJGtleSwgZnVuY3Rpb24gKCkgdXNlICgkZXhpc3RpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZXhpc3Rpbmc7CiAgICAgICAgICAgIH0sIDIwKTsKICAgICAgICAgICAgc2VsZjo6UmVjb3JkU2VxVGl0bGUoJHR5cGUsICRrZXksICR2YXJpYW50LCAndXBkYXRlJywgZmFsc2UpOwogICAgICAgICAgICByZXR1cm4gJHZhcmlhbnQ7CiAgICAgICAgfQogICAgICAgICR0ID0gc2VsZjo6QWNxdWlyZVVuaXF1ZVRpdGxlRm9yS2V5KCR0eXBlLCAka2V5LCAkZ2VuZXJhdG9yLCAyMDApOwogICAgICAgICRvayA9IHNlbGY6OlJlY29yZFNlcVRpdGxlKCR0eXBlLCAka2V5LCAkdCwgJ2ZpcnN0JywgZmFsc2UpOwogICAgICAgIGlmICgkb2spIHsKICAgICAgICAgICAgJHNhdmVkID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgICAgIGlmICgkc2F2ZWQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHNhdmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgJHNhdmVkID0gc2VsZjo6R2V0U2VxUmVjb3JkZWRUaXRsZUZyb21EYigkdHlwZSwgJGtleSk7CiAgICAgICAgcmV0dXJuICgkc2F2ZWQgIT09ICcnKSA/ICRzYXZlZCA6ICR0OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlcGFpckR1cGxpY2F0ZVRpdGxlcygkbGltaXQgPSA4MDAwKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRvdXQgPSBhcnJheSgnb2snID0+IDAsICdmaXhlZF9zY2FubmVkJyA9PiAwLCAnZml4ZWRfdXBkYXRlZCcgPT4gMCwgJ3NlcV9zY2FubmVkJyA9PiAwLCAnc2VxX3VwZGF0ZWQnID0+IDApOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICghaXNfb2JqZWN0KCR6YnApIHx8ICghJHpicC0+Q2hlY2tSaWdodHMoJ3Jvb3QnKSAmJiAhJHpicC0+Q2hlY2tSaWdodHMoJ2FkbWluJykpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICByZXR1cm4gJG91dDsKICAgICAgICB9CiAgICAgICAgJGxpbWl0ID0gaW50dmFsKCRsaW1pdCk7CiAgICAgICAgaWYgKCRsaW1pdCA8IDEpIHsKICAgICAgICAgICAgJGxpbWl0ID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCRsaW1pdCA+IDUwMDAwMCkgewogICAgICAgICAgICAkbGltaXQgPSA1MDAwMDA7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICAgICAgc2VsZjo6RW5zdXJlVGl0bGVVc2VkVGFibGUoKTsKICAgICAgICAkdGFibGVVc2VkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fdGl0bGV1c2VkJzsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoJHpicC0+ZGItPnR5cGUgPT09ICdzcWxpdGUnKSB7CiAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoIkRFTEVURSBGUk9NIGAkdGFibGVVc2VkYCIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJUUlVOQ0FURSBUQUJMRSBgJHRhYmxlVXNlZGAiKTsKICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICAkbm93ID0gdGltZSgpOwogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgJGxhc3RJZCA9IDA7CiAgICAgICAgJHVwZGF0ZWRGaXhlZCA9IDA7CiAgICAgICAgJHNjYW5uZWRGaXhlZCA9IDA7CiAgICAgICAgd2hpbGUgKCRzY2FubmVkRml4ZWQgPCAkbGltaXQpIHsKICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJvd3MgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBgZnRfSURgLGBmdF9Ib3N0YCxgZnRfUGF0aGAsYGZ0X1RpdGxlYCxgZnRfS3dgLGBmdF9EZXNjYCxgZnRfVHBsYCxgZnRfVHNgIEZST00gYCR0YWJsZUZpeGVkYCBXSEVSRSBgZnRfSURgPiIgLiBpbnR2YWwoJGxhc3RJZCkgLiAiIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDUwMCIpOwogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkcm93cykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRyb3dzIGFzICRyKSB7CiAgICAgICAgICAgICAgICAkbGFzdElkID0gaXNzZXQoJHJbJ2Z0X0lEJ10pID8gaW50dmFsKCRyWydmdF9JRCddKSA6ICRsYXN0SWQ7CiAgICAgICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCRyWydmdF9Ib3N0J10pID8gKHN0cmluZykkclsnZnRfSG9zdCddIDogJyc7CiAgICAgICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRyWydmdF9QYXRoJ10pID8gKHN0cmluZykkclsnZnRfUGF0aCddIDogJyc7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBpc3NldCgkclsnZnRfVGl0bGUnXSkgPyAoc3RyaW5nKSRyWydmdF9UaXRsZSddIDogJyc7CiAgICAgICAgICAgICAgICAka3cgPSBpc3NldCgkclsnZnRfS3cnXSkgPyAoc3RyaW5nKSRyWydmdF9LdyddIDogJyc7CiAgICAgICAgICAgICAgICAkZGVzYyA9IGlzc2V0KCRyWydmdF9EZXNjJ10pID8gKHN0cmluZykkclsnZnRfRGVzYyddIDogJyc7CiAgICAgICAgICAgICAgICAkdHBsID0gaXNzZXQoJHJbJ2Z0X1RwbCddKSA/IChzdHJpbmcpJHJbJ2Z0X1RwbCddIDogJyc7CiAgICAgICAgICAgICAgICAkdHMgPSBpc3NldCgkclsnZnRfVHMnXSkgPyBpbnR2YWwoJHJbJ2Z0X1RzJ10pIDogMDsKICAgICAgICAgICAgICAgICRzY2FubmVkRml4ZWQrKzsKICAgICAgICAgICAgICAgIGlmICgkc2Nhbm5lZEZpeGVkID4gJGxpbWl0KSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aXRsZSA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKCR0aXRsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0c1VzZSA9ICgkdHMgPiAwKSA/ICR0cyA6ICRub3c7CiAgICAgICAgICAgICAgICBpZiAoaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJbnNlcnRUaXRsZVVzZWRPbmNlKCR0aXRsZSwgJHRzVXNlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHNlZWRLZXkgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRLZXkoJGhvc3QgLiAnfCcgLiAkcGF0aCk7CiAgICAgICAgICAgICAgICAkdmFyaWFudCA9IHNlbGY6OkFjcXVpcmVVbmlxdWVUaXRsZUZvcktleSgnZml4ZWQnLCAkc2VlZEtleSwgZnVuY3Rpb24gKCkgdXNlICgkdGl0bGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHRpdGxlOwogICAgICAgICAgICAgICAgfSwgMjApOwogICAgICAgICAgICAgICAgJGlkID0gaW50dmFsKCRyWydmdF9JRCddKTsKICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdCk7CiAgICAgICAgICAgICAgICAkcGF0aEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHBhdGgpOwogICAgICAgICAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdmFyaWFudCk7CiAgICAgICAgICAgICAgICAka3dFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrdyk7CiAgICAgICAgICAgICAgICAkZGVzY0VzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJGRlc2MpOwogICAgICAgICAgICAgICAgJHRwbEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRwbCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiVVBEQVRFIGAkdGFibGVGaXhlZGAgU0VUIGBmdF9UaXRsZWA9JyR0aXRsZUVzYycsYGZ0X0t3YD0nJGt3RXNjJyxgZnRfRGVzY2A9JyRkZXNjRXNjJyxgZnRfVHBsYD0nJHRwbEVzYycsYGZ0X1RzYD0iIC4gaW50dmFsKCRub3cpIC4gIiBXSEVSRSBgZnRfSURgPSIgLiBpbnR2YWwoJGlkKSAuICIgQU5EIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIEFORCBgZnRfUGF0aGA9JyRwYXRoRXNjJyIpOwogICAgICAgICAgICAgICAgICAgICR1cGRhdGVkRml4ZWQrKzsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZVNlcVJlY29yZFRhYmxlKCk7CiAgICAgICAgJHRhYmxlU2VxID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fc2VxcmVjb3JkJzsKICAgICAgICAkbGFzdElkMiA9IDA7CiAgICAgICAgJHVwZGF0ZWRTZXEgPSAwOwogICAgICAgICRzY2FubmVkU2VxID0gMDsKICAgICAgICB3aGlsZSAoJHNjYW5uZWRTZXEgPCAkbGltaXQpIHsKICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHJvd3MgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBgcmVjX0lEYCxgcmVjX1R5cGVgLGByZWNfS2V5YCxgcmVjX1RpdGxlYCxgcmVjX1RzYCBGUk9NIGAkdGFibGVTZXFgIFdIRVJFIGByZWNfSURgPiIgLiBpbnR2YWwoJGxhc3RJZDIpIC4gIiBPUkRFUiBCWSBgcmVjX0lEYCBBU0MgTElNSVQgODAwIik7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVtcHR5KCRyb3dzKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yZWFjaCAoJHJvd3MgYXMgJHIpIHsKICAgICAgICAgICAgICAgICRsYXN0SWQyID0gaXNzZXQoJHJbJ3JlY19JRCddKSA/IGludHZhbCgkclsncmVjX0lEJ10pIDogJGxhc3RJZDI7CiAgICAgICAgICAgICAgICAkdHlwZSA9IGlzc2V0KCRyWydyZWNfVHlwZSddKSA/IChzdHJpbmcpJHJbJ3JlY19UeXBlJ10gOiAnJzsKICAgICAgICAgICAgICAgICRrZXkgPSBpc3NldCgkclsncmVjX0tleSddKSA/IChzdHJpbmcpJHJbJ3JlY19LZXknXSA6ICcnOwogICAgICAgICAgICAgICAgJHRpdGxlID0gaXNzZXQoJHJbJ3JlY19UaXRsZSddKSA/IChzdHJpbmcpJHJbJ3JlY19UaXRsZSddIDogJyc7CiAgICAgICAgICAgICAgICAkdHMgPSBpc3NldCgkclsncmVjX1RzJ10pID8gaW50dmFsKCRyWydyZWNfVHMnXSkgOiAwOwogICAgICAgICAgICAgICAgJHNjYW5uZWRTZXErKzsKICAgICAgICAgICAgICAgIGlmICgkc2Nhbm5lZFNlcSA+ICRsaW1pdCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBzZWxmOjpOb3JtYWxpemVTZXFSZWNvcmRUaXRsZSgkdGl0bGUpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW50dmFsKEN5cWl5ZXpoYW4oJ3NlcV91bmlxdWVfdGl0bGUnLCAxKSkgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0c1VzZSA9ICgkdHMgPiAwKSA/ICR0cyA6ICRub3c7CiAgICAgICAgICAgICAgICBpZiAoc2VsZjo6SW5zZXJ0VGl0bGVVc2VkT25jZSgkdGl0bGUsICR0c1VzZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0eXBlMiA9IHRyaW0oKHN0cmluZykkdHlwZSk7CiAgICAgICAgICAgICAgICAka2V5MiA9IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgka2V5KTsKICAgICAgICAgICAgICAgICR2YXJpYW50ID0gc2VsZjo6QWNxdWlyZVVuaXF1ZVRpdGxlRm9yS2V5KCR0eXBlMiAhPT0gJycgPyAkdHlwZTIgOiAnc2VxJywgJGtleTIsIGZ1bmN0aW9uICgpIHVzZSAoJHRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgICAgICAgICAgICAgIH0sIDIwKTsKICAgICAgICAgICAgICAgICRpZCA9IGludHZhbCgkclsncmVjX0lEJ10pOwogICAgICAgICAgICAgICAgJHR5cGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0eXBlKTsKICAgICAgICAgICAgICAgICRrZXlFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRrZXkpOwogICAgICAgICAgICAgICAgJHRpdGxlRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkdmFyaWFudCk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgiVVBEQVRFIGAkdGFibGVTZXFgIFNFVCBgcmVjX1RpdGxlYD0nJHRpdGxlRXNjJyxgcmVjX1RzYD0iIC4gaW50dmFsKCRub3cpIC4gIiBXSEVSRSBgcmVjX0lEYD0iIC4gaW50dmFsKCRpZCkgLiAiIEFORCBgcmVjX1R5cGVgPSckdHlwZUVzYycgQU5EIGByZWNfS2V5YD0nJGtleUVzYyciKTsKICAgICAgICAgICAgICAgICAgICAkdXBkYXRlZFNlcSsrOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG91dFsnb2snXSA9IDE7CiAgICAgICAgJG91dFsnZml4ZWRfc2Nhbm5lZCddID0gJHNjYW5uZWRGaXhlZDsKICAgICAgICAkb3V0WydmaXhlZF91cGRhdGVkJ10gPSAkdXBkYXRlZEZpeGVkOwogICAgICAgICRvdXRbJ3NlcV9zY2FubmVkJ10gPSAkc2Nhbm5lZFNlcTsKICAgICAgICAkb3V0WydzZXFfdXBkYXRlZCddID0gJHVwZGF0ZWRTZXE7CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gRGVsZXRlRml4ZWRUaXRsZVJlY29yZCgkaG9zdE9ubHksICRwYXRoID0gJy8nKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJHBhdGgpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnIHx8ICRwYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnOwogICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICRwYXRoRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkcGF0aCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCJERUxFVEUgRlJPTSBgJHRhYmxlYCBXSEVSRSBgZnRfSG9zdGA9JyRob3N0RXNjJyBBTkQgYGZ0X1BhdGhgPSckcGF0aEVzYyciKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gVXBzZXJ0Rml4ZWRUaXRsZVJlY29yZCgkaG9zdE9ubHksICRwYXRoLCAkdGl0bGUsICRrdyA9ICcnLCAkZGVzYyA9ICcnLCAkdHBsID0gJycsICR0cyA9IDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICRwYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoKHN0cmluZykkcGF0aCk7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgJGt3ID0gKHN0cmluZykka3c7CiAgICAgICAgJGRlc2MgPSAoc3RyaW5nKSRkZXNjOwogICAgICAgICR0cGwgPSAoc3RyaW5nKSR0cGw7CiAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICR0cyA9IHRpbWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRob3N0T25seSA9PT0gJycgfHwgJHBhdGggPT09ICcnIHx8ICR0aXRsZSA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2VsZjo6RW5zdXJlRml4ZWRUaXRsZVRhYmxlKCk7CiAgICAgICAgJHRhYmxlID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgJHBhdGhFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRwYXRoKTsKICAgICAgICAkdGl0bGVFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCR0aXRsZSk7CiAgICAgICAgJGt3RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygka3cpOwogICAgICAgICRkZXNjRXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkZGVzYyk7CiAgICAgICAgJHRwbEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHRwbCk7CiAgICAgICAgaWYgKCR6YnAtPmRiLT50eXBlID09PSAnc3FsaXRlJykgewogICAgICAgICAgICAkc3FsID0gIklOU0VSVCBJTlRPIGAkdGFibGVgIChgZnRfSG9zdGAsYGZ0X1BhdGhgLGBmdF9UaXRsZWAsYGZ0X0t3YCxgZnRfRGVzY2AsYGZ0X1RwbGAsYGZ0X1RzYCkgVkFMVUVTICgnJGhvc3RFc2MnLCckcGF0aEVzYycsJyR0aXRsZUVzYycsJyRrd0VzYycsJyRkZXNjRXNjJywnJHRwbEVzYycsIiAuIGludHZhbCgkdHMpIC4gIikgT04gQ09ORkxJQ1QoYGZ0X0hvc3RgLGBmdF9QYXRoYCkgRE8gVVBEQVRFIFNFVCBgZnRfVGl0bGVgPWV4Y2x1ZGVkLmBmdF9UaXRsZWAsIGBmdF9Ld2A9ZXhjbHVkZWQuYGZ0X0t3YCwgYGZ0X0Rlc2NgPWV4Y2x1ZGVkLmBmdF9EZXNjYCwgYGZ0X1RwbGA9ZXhjbHVkZWQuYGZ0X1RwbGAsIGBmdF9Uc2A9ZXhjbHVkZWQuYGZ0X1RzYCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJHNxbCA9ICJJTlNFUlQgSU5UTyBgJHRhYmxlYCAoYGZ0X0hvc3RgLGBmdF9QYXRoYCxgZnRfVGl0bGVgLGBmdF9Ld2AsYGZ0X0Rlc2NgLGBmdF9UcGxgLGBmdF9Uc2ApIFZBTFVFUyAoJyRob3N0RXNjJywnJHBhdGhFc2MnLCckdGl0bGVFc2MnLCcka3dFc2MnLCckZGVzY0VzYycsJyR0cGxFc2MnLCIgLiBpbnR2YWwoJHRzKSAuICIpIE9OIERVUExJQ0FURSBLRVkgVVBEQVRFIGBmdF9UaXRsZWA9VkFMVUVTKGBmdF9UaXRsZWApLCBgZnRfS3dgPVZBTFVFUyhgZnRfS3dgKSwgYGZ0X0Rlc2NgPVZBTFVFUyhgZnRfRGVzY2ApLCBgZnRfVHBsYD1WQUxVRVMoYGZ0X1RwbGApLCBgZnRfVHNgPVZBTFVFUyhgZnRfVHNgKSI7CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxRXhwb3J0TG9ja0ZpbGUoKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyIC4gJ3NlcV9leHBvcnQubG9jayc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2VxRXhwb3J0U3RhdGVGaWxlKCkKICAgIHsKICAgICAgICAkZGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICdzZXFfZXhwb3J0X3N0YXRlLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRTZXFFeHBvcnRTdGF0ZSgpCiAgICB7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRTZXFFeHBvcnRTdGF0ZUZpbGUoKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19maWxlKCRmaWxlKSkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgaWYgKCEkcmF3KSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgIH0KICAgICAgICAkZCA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgIHJldHVybiBpc19hcnJheSgkZCkgPyAkZCA6IGFycmF5KCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVNlcUV4cG9ydFN0YXRlKCRzdGF0ZSkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydFN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkb3V0ID0ganNvbl9lbmNvZGUoJHN0YXRlLCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgaWYgKCRvdXQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJG91dCkgIT09IGZhbHNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEV4cG9ydFNlcVJlY29yZHNUb1R4dFN0ZXAoJG1heFNlY29uZHMgPSAxLjUsICRiYXRjaCA9IDIwMDApCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgc2VsZjo6RW5zdXJlU2VxUmVjb3JkVGFibGUoKTsKICAgICAgICAkcmVjb3JkRGlyID0gc2VsZjo6R2V0UmVjb3JkRGlyKCk7CiAgICAgICAgJGNhY2hlRGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJHJlY29yZERpciA9PT0gJycgfHwgJGNhY2hlRGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29rJyA9PiAwLCAnZGV0YWlsJyA9PiAnZGlyJyk7CiAgICAgICAgfQogICAgICAgICRiYXRjaCA9IGludHZhbCgkYmF0Y2gpOwogICAgICAgIGlmICgkYmF0Y2ggPCAyMDApIHsKICAgICAgICAgICAgJGJhdGNoID0gMjAwOwogICAgICAgIH0KICAgICAgICBpZiAoJGJhdGNoID4gMjAwMDApIHsKICAgICAgICAgICAgJGJhdGNoID0gMjAwMDA7CiAgICAgICAgfQogICAgICAgICRtYXhTZWNvbmRzID0gZmxvYXR2YWwoJG1heFNlY29uZHMpOwogICAgICAgIGlmICgkbWF4U2Vjb25kcyA8IDAuMikgewogICAgICAgICAgICAkbWF4U2Vjb25kcyA9IDAuMjsKICAgICAgICB9CiAgICAgICAgJHN0YXJ0ID0gbWljcm90aW1lKHRydWUpOwogICAgICAgICRzdGF0ZSA9IHNlbGY6OkxvYWRTZXFFeHBvcnRTdGF0ZSgpOwogICAgICAgICR0eXBlcyA9IGFycmF5KCdmYW55bXVybCcsICdmYW5tbHVybCcsICdmYW5ueXVybCcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJHN0YXRlKSB8fCBlbXB0eSgkc3RhdGUpIHx8IGVtcHR5KCRzdGF0ZVsnY3ljbGUnXSkgfHwgZW1wdHkoJHN0YXRlWyd0eXBlcyddKSB8fCAhaXNfYXJyYXkoJHN0YXRlWyd0eXBlcyddKSkgewogICAgICAgICAgICAkY3ljbGUgPSB0aW1lKCk7CiAgICAgICAgICAgICRzdGF0ZSA9IGFycmF5KCdjeWNsZScgPT4gJGN5Y2xlLCAndHlwZXMnID0+IGFycmF5KCkpOwogICAgICAgICAgICBmb3JlYWNoICgkdHlwZXMgYXMgJHQpIHsKICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdF0gPSBhcnJheSgnbGFzdCcgPT4gMCwgJ2RvbmUnID0+IDAsICdwYXJ0JyA9PiAkY2FjaGVEaXIgLiAkdCAuICcuJyAuICRjeWNsZSAuICcucGFydCcpOwogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSwgJycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3NlcXJlY29yZCc7CiAgICAgICAgZm9yZWFjaCAoJHR5cGVzIGFzICR0eXBlKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHN0YXRlWyd0eXBlcyddWyR0eXBlXSkgfHwgIWlzX2FycmF5KCRzdGF0ZVsndHlwZXMnXVskdHlwZV0pKSB7CiAgICAgICAgICAgICAgICAkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdID0gYXJyYXkoJ2xhc3QnID0+IDAsICdkb25lJyA9PiAwLCAncGFydCcgPT4gJGNhY2hlRGlyIC4gJHR5cGUgLiAnLicgLiBpbnR2YWwoJHN0YXRlWydjeWNsZSddKSAuICcucGFydCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZW1wdHkoJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnZG9uZSddKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnQgPSBpc3NldCgkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydwYXJ0J10pID8gKHN0cmluZykkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydwYXJ0J10gOiAnJzsKICAgICAgICAgICAgaWYgKCRwYXJ0ID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhcnQgPSAkY2FjaGVEaXIgLiAkdHlwZSAuICcuJyAuIGludHZhbCgkc3RhdGVbJ2N5Y2xlJ10pIC4gJy5wYXJ0JzsKICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdHlwZV1bJ3BhcnQnXSA9ICRwYXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmcCA9IEBmb3BlbigkcGFydCwgJ2FiJyk7CiAgICAgICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkbGFzdElkID0gaXNzZXQoJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnbGFzdCddKSA/IGludHZhbCgkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydsYXN0J10pIDogMDsKICAgICAgICAgICAgaWYgKCRsYXN0SWQgPCAwKSB7CiAgICAgICAgICAgICAgICAkbGFzdElkID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdHlwZUVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJHR5cGUpOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgJHNxbCA9ICJTRUxFQ1QgYHJlY19JRGAsYHJlY19LZXlgLGByZWNfVGl0bGVgIEZST00gYCR0YWJsZWAgV0hFUkUgYHJlY19UeXBlYD0nJHR5cGVFc2MnIEFORCBgcmVjX0lEYD4iIC4gaW50dmFsKCRsYXN0SWQpIC4gIiBPUkRFUiBCWSBgcmVjX0lEYCBBU0MgTElNSVQgIiAuIGludHZhbCgkYmF0Y2gpOwogICAgICAgICAgICAgICAgJHJvd3MgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkcm93cyA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVtcHR5KCRyb3dzKSkgewogICAgICAgICAgICAgICAgICAgICRzdGF0ZVsndHlwZXMnXVskdHlwZV1bJ2RvbmUnXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93cyBhcyAkcikgewogICAgICAgICAgICAgICAgICAgICRyaWQgPSBpc3NldCgkclsncmVjX0lEJ10pID8gaW50dmFsKCRyWydyZWNfSUQnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkcmlkID4gJGxhc3RJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbGFzdElkID0gJHJpZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGsgPSBpc3NldCgkclsncmVjX0tleSddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZEtleSgoc3RyaW5nKSRyWydyZWNfS2V5J10pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgJHR0ID0gaXNzZXQoJHJbJ3JlY19UaXRsZSddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNlcVJlY29yZFRpdGxlKChzdHJpbmcpJHJbJ3JlY19UaXRsZSddKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkayA9PT0gJycgfHwgJHR0ID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgQGZ3cml0ZSgkZnAsICRrIC4gJ3wnIC4gJHR0IC4gIlxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3RhdGVbJ3R5cGVzJ11bJHR5cGVdWydsYXN0J10gPSAkbGFzdElkOwogICAgICAgICAgICAgICAgaWYgKG1pY3JvdGltZSh0cnVlKSAtICRzdGFydCA+ICRtYXhTZWNvbmRzKSB7CiAgICAgICAgICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICAgICAgICAgIHNlbGY6OlNhdmVTZXFFeHBvcnRTdGF0ZSgkc3RhdGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDEsICdkZXRhaWwnID0+ICdwYXJ0aWFsJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY291bnQoJHJvd3MpIDwgJGJhdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgJHN0YXRlWyd0eXBlcyddWyR0eXBlXVsnZG9uZSddID0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIGlmIChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQgPiAkbWF4U2Vjb25kcykgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJGFsbERvbmUgPSB0cnVlOwogICAgICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdCkgewogICAgICAgICAgICBpZiAoZW1wdHkoJHN0YXRlWyd0eXBlcyddWyR0XVsnZG9uZSddKSkgewogICAgICAgICAgICAgICAgJGFsbERvbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghJGFsbERvbmUpIHsKICAgICAgICAgICAgc2VsZjo6U2F2ZVNlcUV4cG9ydFN0YXRlKCRzdGF0ZSk7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDEsICdkZXRhaWwnID0+ICdwYXJ0aWFsJyk7CiAgICAgICAgfQogICAgICAgIGZvcmVhY2ggKCR0eXBlcyBhcyAkdCkgewogICAgICAgICAgICAkcGFydCA9IGlzc2V0KCRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSkgPyAoc3RyaW5nKSRzdGF0ZVsndHlwZXMnXVskdF1bJ3BhcnQnXSA6ICcnOwogICAgICAgICAgICBpZiAoJHBhcnQgPT09ICcnIHx8ICFpc19maWxlKCRwYXJ0KSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRzdCA9ICRyZWNvcmREaXIgLiAkdCAuICcudHh0JzsKICAgICAgICAgICAgJHRtcCA9ICRkc3QgLiAnLnRtcCc7CiAgICAgICAgICAgIEB1bmxpbmsoJHRtcCk7CiAgICAgICAgICAgIEByZW5hbWUoJHBhcnQsICR0bXApOwogICAgICAgICAgICBAdW5saW5rKCRkc3QpOwogICAgICAgICAgICBAcmVuYW1lKCR0bXAsICRkc3QpOwogICAgICAgIH0KICAgICAgICAkc3RhdGVGaWxlID0gc2VsZjo6R2V0U2VxRXhwb3J0U3RhdGVGaWxlKCk7CiAgICAgICAgaWYgKCRzdGF0ZUZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJHN0YXRlRmlsZSkpIHsKICAgICAgICAgICAgQHVubGluaygkc3RhdGVGaWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMSwgJ2RldGFpbCcgPT4gJ2RvbmUnKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNYW51YWxFeHBvcnRTZXFSZWNvcmRzVG9UeHQoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRsb2NrRmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydExvY2tGaWxlKCk7CiAgICAgICAgaWYgKCRsb2NrRmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMCwgJ2RldGFpbCcgPT4gJ2xvY2snKTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRsb2NrRmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2snID0+IDAsICdkZXRhaWwnID0+ICdsb2NrJyk7CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwLCBMT0NLX0VYKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29rJyA9PiAwLCAnZGV0YWlsJyA9PiAnbG9jaycpOwogICAgICAgIH0KICAgICAgICAkc3RhdGVGaWxlID0gc2VsZjo6R2V0U2VxRXhwb3J0U3RhdGVGaWxlKCk7CiAgICAgICAgaWYgKCRzdGF0ZUZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJHN0YXRlRmlsZSkpIHsKICAgICAgICAgICAgQHVubGluaygkc3RhdGVGaWxlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2V0X3RpbWVfbGltaXQnKSkgewogICAgICAgICAgICBAc2V0X3RpbWVfbGltaXQoMCk7CiAgICAgICAgfQogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICRyID0gc2VsZjo6RXhwb3J0U2VxUmVjb3Jkc1RvVHh0U3RlcCgzMC4wLCA4MDAwKTsKICAgICAgICAgICAgaWYgKGVtcHR5KCRyWydvayddKSB8fCAoaXNzZXQoJHJbJ2RldGFpbCddKSAmJiAkclsnZGV0YWlsJ10gPT09ICdkb25lJykpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc3NldCgkclsnZGV0YWlsJ10pICYmICRyWydkZXRhaWwnXSA9PT0gJ3BhcnRpYWwnKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICRzZXR0aW5nWydzZXFfZXhwb3J0X2xhc3QnXSA9IHRpbWUoKTsKICAgICAgICAkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZyA9ICRzZXR0aW5nOwogICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgcmV0dXJuIGFycmF5KCdvaycgPT4gMSwgJ2RldGFpbCcgPT4gJ2RvbmUnKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBNYXliZUF1dG9FeHBvcnRTZXFSZWNvcmRzKCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoISR6YnAtPkNoZWNrUmlnaHRzKCdyb290JykgJiYgISR6YnAtPkNoZWNrUmlnaHRzKCdhZG1pbicpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZW5hYmxlZCA9IGludHZhbChDeXFpeWV6aGFuKCdzZXFfZXhwb3J0X2VuYWJsZScsIDApKTsKICAgICAgICBpZiAoJGVuYWJsZWQgIT09IDEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkaW50ZXJ2YWwgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9pbnRlcnZhbCcsIDM2MDApKTsKICAgICAgICBpZiAoJGludGVydmFsIDwgMzAwKSB7CiAgICAgICAgICAgICRpbnRlcnZhbCA9IDMwMDsKICAgICAgICB9CiAgICAgICAgJGxhc3QgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9sYXN0JywgMCkpOwogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCRsYXN0ID4gMCAmJiAoJG5vdyAtICRsYXN0KSA8ICRpbnRlcnZhbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRsb2NrRmlsZSA9IHNlbGY6OkdldFNlcUV4cG9ydExvY2tGaWxlKCk7CiAgICAgICAgaWYgKCRsb2NrRmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGxvY2tGaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCB8IExPQ0tfTkIpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGxhc3QgPSBpbnR2YWwoQ3lxaXllemhhbignc2VxX2V4cG9ydF9sYXN0JywgMCkpOwogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCRsYXN0ID4gMCAmJiAoJG5vdyAtICRsYXN0KSA8ICRpbnRlcnZhbCkgewogICAgICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRyID0gc2VsZjo6RXhwb3J0U2VxUmVjb3Jkc1RvVHh0U3RlcCgxLjIsIDE1MDApOwogICAgICAgIGlmICghZW1wdHkoJHJbJ29rJ10pICYmIGlzc2V0KCRyWydkZXRhaWwnXSkgJiYgJHJbJ2RldGFpbCddID09PSAnZG9uZScpIHsKICAgICAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICAgICAkc2V0dGluZ1snc2VxX2V4cG9ydF9sYXN0J10gPSB0aW1lKCk7CiAgICAgICAgICAgICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nID0gJHNldHRpbmc7CiAgICAgICAgICAgICR6YnAtPlNhdmVDb25maWcoJ0N5cWl5ZXpoYW4nKTsKICAgICAgICB9CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldE1haW5Eb21haW5DZmdDYWNoZUZpbGUoKQogICAgewogICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZGlyIC4gJ21haW5fZG9tYWluX2NmZ19jYWNoZS5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVNYWluRG9tYWluKCRkb21haW4pCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oKHN0cmluZykkZG9tYWluKTsKICAgICAgICBpZiAoJGRvbWFpbiA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gc3RyX2lyZXBsYWNlKGFycmF5KCdodHRwOi8vJywgJ2h0dHBzOi8vJyksICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjLy4qJCMnLCAnJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAiLiBcdFxuXHJcMFx4MEIiKTsKICAgICAgICAkZG9tYWluID0gc3RydG9sb3dlcigoc3RyaW5nKSRkb21haW4pOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXnd3d1wuIycsICRkb21haW4pKSB7CiAgICAgICAgICAgICRkb21haW4gPSBzdWJzdHIoJGRvbWFpbiwgNCk7CiAgICAgICAgfQogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1teYS16MC05XC5cLV0jJywgJGRvbWFpbikpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjXC4rIycsICcuJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oJGRvbWFpbiwgJy4nKTsKICAgICAgICByZXR1cm4gJGRvbWFpbjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVEb21haW5QYXR0ZXJuKCRkb21haW4pCiAgICB7CiAgICAgICAgJGRvbWFpbiA9IHRyaW0oKHN0cmluZykkZG9tYWluKTsKICAgICAgICBpZiAoJGRvbWFpbiA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkZG9tYWluID0gc3RyX2lyZXBsYWNlKGFycmF5KCdodHRwOi8vJywgJ2h0dHBzOi8vJyksICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gcHJlZ19yZXBsYWNlKCcjLy4qJCMnLCAnJywgJGRvbWFpbik7CiAgICAgICAgJGRvbWFpbiA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAiLiBcdFxuXHJcMFx4MEIiKTsKICAgICAgICAkZG9tYWluID0gc3RydG9sb3dlcigoc3RyaW5nKSRkb21haW4pOwogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXnd3d1wuIycsICRkb21haW4pKSB7CiAgICAgICAgICAgICRkb21haW4gPSBzdWJzdHIoJGRvbWFpbiwgNCk7CiAgICAgICAgfQogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1teYS16MC05XC5cLVwqXSMnLCAkZG9tYWluKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRkb21haW4gPSBwcmVnX3JlcGxhY2UoJyNcLisjJywgJy4nLCAkZG9tYWluKTsKICAgICAgICAkZG9tYWluID0gdHJpbSgkZG9tYWluLCAnLicpOwogICAgICAgIGlmICgkZG9tYWluID09PSAnJyB8fCBzdHJwb3MoJGRvbWFpbiwgJy4nKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbGFiZWxzID0gZXhwbG9kZSgnLicsICRkb21haW4pOwogICAgICAgIGZvcmVhY2ggKCRsYWJlbHMgYXMgJGxiKSB7CiAgICAgICAgICAgIGlmICgkbGIgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRsYiAhPT0gJyonICYmIHN0cnBvcygkbGIsICcqJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkdG1wID0gc3RyX3JlcGxhY2UoJyonLCAnJywgJGxiKTsKICAgICAgICAgICAgICAgIGlmICgkdG1wID09PSAnJyAmJiAkbGIgIT09ICcqJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGxiICE9PSAnKicgJiYgcHJlZ19tYXRjaCgnI15cLXxcLSQjJywgJGxiKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkZG9tYWluOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIERvbWFpblBhdHRlcm5Ub1JlZ2V4KCRwYXR0ZXJuKQogICAgewogICAgICAgICRwYXR0ZXJuID0gKHN0cmluZykkcGF0dGVybjsKICAgICAgICBpZiAoJHBhdHRlcm4gPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGxhYmVscyA9IGV4cGxvZGUoJy4nLCAkcGF0dGVybik7CiAgICAgICAgJHJlTGFiZWxzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkbGFiZWxzIGFzICRsYikgewogICAgICAgICAgICBpZiAoJGxiID09PSAnKicpIHsKICAgICAgICAgICAgICAgICRyZUxhYmVsc1tdID0gJ1teXC5dKyc7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJwb3MoJGxiLCAnKicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJHJlTGFiZWxzW10gPSBzdHJfcmVwbGFjZSgnXConLCAnW15cLl0qJywgcHJlZ19xdW90ZSgkbGIsICcjJykpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHJlTGFiZWxzW10gPSBwcmVnX3F1b3RlKCRsYiwgJyMnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyNeJyAuIGltcGxvZGUoJ1wuJywgJHJlTGFiZWxzKSAuICckI2knOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIERvbWFpblBhdHRlcm5XZWlnaHQoJHBhdHRlcm4pCiAgICB7CiAgICAgICAgJHBhdHRlcm4gPSAoc3RyaW5nKSRwYXR0ZXJuOwogICAgICAgICR3aWxkID0gc3Vic3RyX2NvdW50KCRwYXR0ZXJuLCAnKicpOwogICAgICAgICRsZW4gPSBzdHJsZW4oJHBhdHRlcm4pOwogICAgICAgIHJldHVybiBhcnJheSgkd2lsZCwgLSRsZW4pOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIElzRm9yY2VkUmFuZG9tVGl0bGVQYXRoKCRwYXRoKQogICAgewogICAgICAgICRwYXRoID0gKHN0cmluZykkcGF0aDsKICAgICAgICBpZiAoJHBhdGggPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoICE9PSAnLycpIHsKICAgICAgICAgICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyQjJywgJycsICRwYXRoKTsKICAgICAgICAgICAgaWYgKCRwYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeL1thLXowLTldezQsMjB9Lz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfVwuaHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14vW2EtejAtOV17NCwyMH1odG1sLz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfS9bMS05XVxkezEsMn1odG1sLz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9bYS16MC05XXs0LDIwfS9bMS05XVxkezEsMn1cLmh0bWwvPyQjaScsICRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeL1thLXowLTldezQsMjB9L1thLXowLTldezQsMjB9aHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14vW2EtejAtOV17NCwyMH0vW2EtejAtOV17NCwyMH1cLmh0bWwvPyQjaScsICRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIENsZWFyTWFpbkRvbWFpbkNvbmZpZ0NhY2hlKCkKICAgIHsKICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlID0gbnVsbDsKICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9IDA7CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRNYWluRG9tYWluQ2ZnQ2FjaGVGaWxlKCk7CiAgICAgICAgaWYgKCRmaWxlICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBMb2FkTWFpbkRvbWFpbkNvbmZpZ3MoJGZvcmNlID0gZmFsc2UpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgJG5vdyA9IHRpbWUoKTsKICAgICAgICBpZiAoISRmb3JjZSAmJiBpc19hcnJheShzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlKSAmJiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA+IDApIHsKICAgICAgICAgICAgaWYgKHNlbGY6OiRtYWluRG9tYWluQ2ZnQ2FjaGVUdGwgPD0gMCB8fCAoJG5vdyAtIHNlbGY6OiRtYWluRG9tYWluQ2ZnQ2FjaGVUaW1lKSA8PSBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVHRsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldE1haW5Eb21haW5DZmdDYWNoZUZpbGUoKTsKICAgICAgICBpZiAoISRmb3JjZSAmJiAkZmlsZSAmJiBpc19maWxlKCRmaWxlKSAmJiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVHRsID4gMCkgewogICAgICAgICAgICAkbXQgPSBAZmlsZW10aW1lKCRmaWxlKTsKICAgICAgICAgICAgaWYgKCRtdCAmJiAoJG5vdyAtICRtdCkgPD0gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZVR0bCkgewogICAgICAgICAgICAgICAgJHJhdyA9IEBmaWxlX2dldF9jb250ZW50cygkZmlsZSk7CiAgICAgICAgICAgICAgICBpZiAoJHJhdykgewogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRkYXRhWydleGFjdCddKSAmJiAhaXNzZXQoJGRhdGFbJ3BhdHRlcm5zJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGFycmF5KCdleGFjdCcgPT4gJGRhdGEsICdwYXR0ZXJucycgPT4gYXJyYXkoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZSA9ICRkYXRhOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlVGltZSA9ICRub3c7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgICAgICRsaXN0ID0gYXJyYXkoJ2V4YWN0JyA9PiBhcnJheSgpLCAncGF0dGVybnMnID0+IGFycmF5KCkpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgICRzcWwgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+c2VsZWN0KCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2RvbWFpbmNmZycpLT5jb2x1bW4oJ2RvbV9Eb21haW4sZG9tX1RpdGxlLGRvbV9UZW1wbGF0ZSxkb21fU0VPLGRvbV9Jc0VuYWJsZScpLT5zcWw7CiAgICAgICAgICAgICRyb3dzID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHJvd3MpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkcm93cyBhcyAkcikgewogICAgICAgICAgICAgICAgICAgICRwYXR0ZXJuID0gaXNzZXQoJHJbJ2RvbV9Eb21haW4nXSkgPyBzZWxmOjpOb3JtYWxpemVEb21haW5QYXR0ZXJuKCRyWydkb21fRG9tYWluJ10pIDogJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRwYXR0ZXJuID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHNlbyA9IGFycmF5KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRyWydkb21fU0VPJ10pICYmICRyWydkb21fU0VPJ10gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSBqc29uX2RlY29kZSgoc3RyaW5nKSRyWydkb21fU0VPJ10sIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHRtcCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzZW8gPSAkdG1wOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRpdGVtID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgICAgICdkb21haW4nID0+ICRwYXR0ZXJuLAogICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+IGlzc2V0KCRyWydkb21fVGl0bGUnXSkgPyAoc3RyaW5nKSRyWydkb21fVGl0bGUnXSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAndGVtcGxhdGUnID0+IGlzc2V0KCRyWydkb21fVGVtcGxhdGUnXSkgPyAoc3RyaW5nKSRyWydkb21fVGVtcGxhdGUnXSA6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAnZW5hYmxlZCcgPT4gaXNzZXQoJHJbJ2RvbV9Jc0VuYWJsZSddKSA/IGludHZhbCgkclsnZG9tX0lzRW5hYmxlJ10pIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbycgPT4gJHNlbywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHJwb3MoJHBhdHRlcm4sICcqJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZSA9IHNlbGY6OkRvbWFpblBhdHRlcm5Ub1JlZ2V4KCRwYXR0ZXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRyZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWydyZSddID0gJHJlOwogICAgICAgICAgICAgICAgICAgICAgICAkdyA9IHNlbGY6OkRvbWFpblBhdHRlcm5XZWlnaHQoJHBhdHRlcm4pOwogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndzEnXSA9ICR3WzBdOwogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndzInXSA9ICR3WzFdOwogICAgICAgICAgICAgICAgICAgICAgICAkbGlzdFsncGF0dGVybnMnXVtdID0gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGQgPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRwYXR0ZXJuKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRkID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ2RvbWFpbiddID0gJGQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRsaXN0WydleGFjdCddWyRkXSA9ICRpdGVtOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgIH0KICAgICAgICBpZiAoIWVtcHR5KCRsaXN0WydwYXR0ZXJucyddKSkgewogICAgICAgICAgICB1c29ydCgkbGlzdFsncGF0dGVybnMnXSwgZnVuY3Rpb24gKCRhLCAkYikgewogICAgICAgICAgICAgICAgJGExID0gaXNzZXQoJGFbJ3cxJ10pID8gaW50dmFsKCRhWyd3MSddKSA6IDA7CiAgICAgICAgICAgICAgICAkYjEgPSBpc3NldCgkYlsndzEnXSkgPyBpbnR2YWwoJGJbJ3cxJ10pIDogMDsKICAgICAgICAgICAgICAgIGlmICgkYTEgIT09ICRiMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoJGExIDwgJGIxKSA/IC0xIDogMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRhMiA9IGlzc2V0KCRhWyd3MiddKSA/IGludHZhbCgkYVsndzInXSkgOiAwOwogICAgICAgICAgICAgICAgJGIyID0gaXNzZXQoJGJbJ3cyJ10pID8gaW50dmFsKCRiWyd3MiddKSA6IDA7CiAgICAgICAgICAgICAgICBpZiAoJGEyICE9PSAkYjIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRhMiA8ICRiMikgPyAtMSA6IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyY21wKChzdHJpbmcpJGFbJ2RvbWFpbiddLCAoc3RyaW5nKSRiWydkb21haW4nXSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBzZWxmOjokbWFpbkRvbWFpbkNmZ0NhY2hlID0gJGxpc3Q7CiAgICAgICAgc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZVRpbWUgPSAkbm93OwogICAgICAgIGlmICgkZmlsZSkgewogICAgICAgICAgICAkcmF3ID0ganNvbl9lbmNvZGUoJGxpc3QsIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwogICAgICAgICAgICBpZiAoJHJhdykgewogICAgICAgICAgICAgICAgQGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlLCAkcmF3KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjo6JG1haW5Eb21haW5DZmdDYWNoZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkYWxsID0gc2VsZjo6TG9hZE1haW5Eb21haW5Db25maWdzKGZhbHNlKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRhbGwpIHx8IGVtcHR5KCRhbGwpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzc2V0KCRhbGxbJ2V4YWN0J10pICYmICFpc3NldCgkYWxsWydwYXR0ZXJucyddKSkgewogICAgICAgICAgICAkYWxsID0gYXJyYXkoJ2V4YWN0JyA9PiAkYWxsLCAncGF0dGVybnMnID0+IGFycmF5KCkpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNzZXQoJGFsbFsnZXhhY3QnXVskaG9zdE9ubHldKSAmJiBpc19hcnJheSgkYWxsWydleGFjdCddWyRob3N0T25seV0pKSB7CiAgICAgICAgICAgICRjZmcgPSAkYWxsWydleGFjdCddWyRob3N0T25seV07CiAgICAgICAgICAgIGlmICghZW1wdHkoJGNmZ1snZW5hYmxlZCddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRjZmc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkYWxsWydwYXR0ZXJucyddKSAmJiBpc19hcnJheSgkYWxsWydwYXR0ZXJucyddKSkgewogICAgICAgICAgICBmb3JlYWNoICgkYWxsWydwYXR0ZXJucyddIGFzICRpdCkgewogICAgICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkaXQpIHx8IGVtcHR5KCRpdFsnZW5hYmxlZCddKSB8fCBlbXB0eSgkaXRbJ3JlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoQHByZWdfbWF0Y2goKHN0cmluZykkaXRbJ3JlJ10sICRob3N0T25seSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBSZXBsYWNlT3JJbnNlcnRIdG1sTWV0YSgkaHRtbCwgJG5hbWUsICR2YWx1ZSkKICAgICAgICB7CiAgICAgICAgICAgICR2YWx1ZSA9IHRyaW0oKHN0cmluZykkdmFsdWUpOwogICAgICAgICAgICBpZiAoJHZhbHVlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRodG1sOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR2YWx1ZSA9IGh0bWxzcGVjaWFsY2hhcnMoc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcgJywgJHZhbHVlKSwgRU5UX1FVT1RFUywgJ1VURi04Jyk7CiAgICAgICAgICAgICRtZXRhID0gJzxtZXRhIG5hbWU9IicgLiBodG1sc3BlY2lhbGNoYXJzKCRuYW1lLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSAuICciIGNvbnRlbnQ9IicgLiAkdmFsdWUgLiAnIiAvPic7CiAgICAgICAgICAgICRwYXR0ZXJuID0gJyM8bWV0YVxiW14+XSpuYW1lXHMqPVxzKihbXCJcJ10pJyAuIHByZWdfcXVvdGUoJG5hbWUsICcjJykgLiAnXDFbXj5dKj4jaSc7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCRwYXR0ZXJuLCAkaHRtbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcmVnX3JlcGxhY2UoJHBhdHRlcm4sICRtZXRhLCAkaHRtbCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGh0bWwsICc8L2hlYWQ+JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJlZ19yZXBsYWNlKCcjPC9oZWFkPiNpJywgJG1ldGEgLiAnPC9oZWFkPicsICRodG1sLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJG1ldGEgLiAkaHRtbDsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldERpcmVjdEhvc3RIdG1sQmFzZURpcigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbF9wYWdlcy8nOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RXJqaW11bHVIdG1sQmFzZURpcigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbF9tdWx1Lyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBJc0VyamltdWx1UWl5b25nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpbnR2YWwoQ3lxaXllemhhbignZXJqaW11bHVfcWl5b25nJywgMCkpID09PSAxOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSXNFcmppbXVsdU1haW5Ib3N0KCRob3N0T25seSkKICAgICAgICB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAgICAgJHJvb3REb21haW4gPSBzZWxmOjpHZXREaXJlY3RIb3N0UGFnZVJvb3REb21haW4oKTsKICAgICAgICAgICAgcmV0dXJuICRob3N0T25seSAhPT0gJycgJiYgJHJvb3REb21haW4gIT09ICcnICYmICRob3N0T25seSA9PT0gJHJvb3REb21haW47CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBQYXJzZUVyamltdWx1UmVxdWVzdFBhdGgoJHJlcXVlc3RQYXRoKQogICAgICAgIHsKICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gc2VsZjo6Tm9ybWFsaXplRGlyZWN0SG9zdFJlcXVlc3RQYXRoKCRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICghcHJlZ19tYXRjaCgnI14vKFthLXpBLVowLTldW2EtekEtWjAtOS5fLV0qXC4oPzpodG1sfGh0bSkpJCNpJywgJHJlcXVlc3RQYXRoLCAkbWF0Y2hlcykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHN0cmluZykkbWF0Y2hlc1sxXTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJlc29sdmVFcmppbXVsdVBhZ2VQYXRoKCRyZXF1ZXN0UGF0aCkKICAgICAgICB7CiAgICAgICAgICAgICRiYXNlRGlyID0gc2VsZjo6R2V0RXJqaW11bHVIdG1sQmFzZURpcigpOwogICAgICAgICAgICAkYmFzZVJlYWwgPSByZWFscGF0aCgkYmFzZURpcik7CiAgICAgICAgICAgIGlmICghJGJhc2VSZWFsIHx8ICFpc19kaXIoJGJhc2VSZWFsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRmaWxlTmFtZSA9IHNlbGY6OlBhcnNlRXJqaW11bHVSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICBpZiAoJGZpbGVOYW1lID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRiYXNlUmVhbCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGJhc2VSZWFsKTsKICAgICAgICAgICAgJHBhdGggPSBzZWxmOjpTYWZlSm9pblBhdGgoJGJhc2VSZWFsLCAkZmlsZU5hbWUpOwogICAgICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWFsID0gcmVhbHBhdGgoJHBhdGgpOwogICAgICAgICAgICBpZiAoISRyZWFsIHx8ICFpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWFsTm9ybSA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJHJlYWwpOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkcmVhbE5vcm0sICRiYXNlUmVhbCAuICcvJykgIT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHJlYWw7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBUcnlPdXRwdXRFcmppbXVsdVBhZ2UoJGhvc3RPbmx5LCAkcmVxdWVzdFBhdGggPSAnLycsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIXNlbGY6OklzRXJqaW11bHVRaXlvbmcoKSB8fCAhc2VsZjo6SXNFcmppbXVsdU1haW5Ib3N0KCRob3N0T25seSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9IHNlbGY6OlJlc29sdmVFcmppbXVsdVBhZ2VQYXRoKCRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaHRtbCA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRodG1sKSB8fCAkaHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ0NhY2hlLUNvbnRyb2w6IG5vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBtYXgtYWdlPTAnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignUHJhZ21hOiBuby1jYWNoZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGh0dHBfcmVzcG9uc2VfY29kZSgyMDApOwogICAgICAgICAgICAkaHRtbCA9IHNlbGY6OlJlcGxhY2VNYW51YWxUZW1wbGF0ZVRhZ3MoJGh0bWwpOwogICAgICAgICAgICBlY2hvIHNlbGY6OlBzZXVkb09yaWdpbmFsSHRtbCgkaHRtbCwgYXJyYXkoCiAgICAgICAgICAgICAgICAnaG9zdCcgPT4gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpLAogICAgICAgICAgICAgICAgJ3VybCcgPT4gKHN0cmluZykkY3VycmVudFVybCwKICAgICAgICAgICAgKSk7CiAgICAgICAgICAgIGRpZSgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCR6YnAtPmhvc3QpID8gKHN0cmluZykkemJwLT5ob3N0IDogJyc7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGFyc2VkSG9zdCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRwYXJzZWRIb3N0KSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IChzdHJpbmcpJHBhcnNlZEhvc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdCk7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBPbiBzdWJkb21haW4gcmVxdWVzdHMsICR6YnAtPmhvc3QgbWF5IGFscmVhZHkgYmUgdGhlIGN1cnJlbnQgaG9zdC4KICAgICAgICAgICAgLy8gTm9ybWFsaXplIGl0IGJhY2sgdG8gdGhlIGFwZXgvcm9vdCBkb21haW4gc28gZGlyZWN0LWhvc3Qgcm91dGluZwogICAgICAgICAgICAvLyBkb2VzIG5vdCBpbmNvcnJlY3RseSB0cmVhdCB0aGUgY3VycmVudCBzdWJkb21haW4gYXMgdGhlIG1haW4gaG9zdC4KICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3QpKSB7CiAgICAgICAgICAgICAgICAkcGFydHMgPSBleHBsb2RlKCcuJywgJGhvc3QpOwogICAgICAgICAgICAgICAgaWYgKGNvdW50KCRwYXJ0cykgPj0gMykgewogICAgICAgICAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSBpbXBsb2RlKCcuJywgJHBhcnRzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGhvc3Q7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXREaXJlY3RIb3N0UGFnZUtleXMoJGhvc3RPbmx5KQogICAgICAgIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGtleXMgPSBhcnJheSgkaG9zdE9ubHkpOwogICAgICAgICAgICAkcm9vdERvbWFpbiA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlUm9vdERvbWFpbigpOwogICAgICAgICAgICBpZiAoJHJvb3REb21haW4gIT09ICcnICYmICRob3N0T25seSAhPT0gJHJvb3REb21haW4pIHsKICAgICAgICAgICAgICAgIGlmIChzdWJzdHIoJGhvc3RPbmx5LCAtc3RybGVuKCcuJyAuICRyb290RG9tYWluKSkgPT09ICcuJyAuICRyb290RG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgJHN1YiA9IHN1YnN0cigkaG9zdE9ubHksIDAsIC1zdHJsZW4oJy4nIC4gJHJvb3REb21haW4pKTsKICAgICAgICAgICAgICAgICAgICAkc3ViID0gdHJpbSgoc3RyaW5nKSRzdWIsICcuJyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRzdWIgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRrZXlzW10gPSAkc3ViOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkY2xlYW4gPSBhcnJheSgpOwogICAgICAgICAgICBmb3JlYWNoICgka2V5cyBhcyAka2V5KSB7CiAgICAgICAgICAgICAgICAka2V5ID0gc3RydG9sb3dlcih0cmltKChzdHJpbmcpJGtleSkpOwogICAgICAgICAgICAgICAgaWYgKCRrZXkgPT09ICcnIHx8ICFwcmVnX21hdGNoKCcjXlthLXowLTldW2EtejAtOVwuXC1fXSokIycsICRrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY2xlYW5bJGtleV0gPSAka2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheV92YWx1ZXMoJGNsZWFuKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIE5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpCiAgICAgICAgewogICAgICAgICAgICAkcmVxdWVzdFBhdGggPSB0cmltKChzdHJpbmcpJHJlcXVlc3RQYXRoKTsKICAgICAgICAgICAgaWYgKCRyZXF1ZXN0UGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHBhcnNlZCA9IEBwYXJzZV91cmwoJHJlcXVlc3RQYXRoKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwYXJzZWQpICYmIGlzc2V0KCRwYXJzZWRbJ3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICRyZXF1ZXN0UGF0aCA9IChzdHJpbmcpJHBhcnNlZFsncGF0aCddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcmVxdWVzdFBhdGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICAkcmVxdWVzdFBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICAkcmVxdWVzdFBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyMnLCAnLycsICRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcmVxdWVzdFBhdGhbMF0gIT09ICcvJykgewogICAgICAgICAgICAgICAgJHJlcXVlc3RQYXRoID0gJy8nIC4gJHJlcXVlc3RQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkcmVxdWVzdFBhdGg7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBTYWZlSm9pblBhdGgoJGJhc2VEaXIsICRyZWxhdGl2ZVBhdGgpCiAgICAgICAgewogICAgICAgICAgICAkYmFzZURpciA9IHJ0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgKHN0cmluZykkYmFzZURpciksICcvJyk7CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSB0cmltKHN0cl9yZXBsYWNlKCdcXCcsICcvJywgKHN0cmluZykkcmVsYXRpdmVQYXRoKSk7CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLycpOwogICAgICAgICAgICBpZiAoJGJhc2VEaXIgPT09ICcnIHx8ICRyZWxhdGl2ZVBhdGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkcmVsYXRpdmVQYXRoLCAnLi4nKSAhPT0gZmFsc2UgfHwgcHJlZ19tYXRjaCgnI1teYS16QS1aMC05L19cLlwtXSMnLCAkcmVsYXRpdmVQYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkYmFzZURpciAuICcvJyAuICRyZWxhdGl2ZVBhdGg7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBSZXNvbHZlRGlyZWN0SG9zdFBhZ2VQYXRoKCRob3N0T25seSwgJHJlcXVlc3RQYXRoID0gJy8nKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgJGJhc2VSZWFsID0gcmVhbHBhdGgoJGJhc2VEaXIpOwogICAgICAgICAgICBpZiAoISRiYXNlUmVhbCB8fCAhaXNfZGlyKCRiYXNlUmVhbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYmFzZVJlYWwgPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRiYXNlUmVhbCk7CiAgICAgICAgICAgICRyZXF1ZXN0UGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcmVxdWVzdFBhdGgpOwogICAgICAgICAgICAka2V5cyA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlS2V5cygkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGtleXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGNhbmRpZGF0ZXMgPSBhcnJheSgpOwogICAgICAgICAgICBpZiAoJHJlcXVlc3RQYXRoID09PSAnLycgfHwgJHJlcXVlc3RQYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGtleXMgYXMgJGtleSkgewogICAgICAgICAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAka2V5IC4gJy9pbmRleC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJGtleSAuICcuaHRtbCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkcmVsUGF0aCA9IGx0cmltKCRyZXF1ZXN0UGF0aCwgJy8nKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRrZXlzIGFzICRrZXkpIHsKICAgICAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJGtleSAuICcvJyAuICRyZWxQYXRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gc2VsZjo6U2FmZUpvaW5QYXRoKCRiYXNlUmVhbCwgJGNhbmRpZGF0ZSk7CiAgICAgICAgICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlYWwgPSByZWFscGF0aCgkcGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoISRyZWFsIHx8ICFpc19maWxlKCRyZWFsKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlYWxOb3JtID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcmVhbCk7CiAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkcmVhbE5vcm0sICRiYXNlUmVhbCAuICcvJykgIT09IDAgJiYgc3RydG9sb3dlcigkcmVhbE5vcm0pICE9PSBzdHJ0b2xvd2VyKCRiYXNlUmVhbCkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAkcmVhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRNaW1lVHlwZUJ5UGF0aCgkcGF0aCkKICAgICAgICB7CiAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKChzdHJpbmcpcGF0aGluZm8oKHN0cmluZykkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgICAgICRtYXAgPSBhcnJheSgKICAgICAgICAgICAgICAgICdodG1sJyA9PiAndGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICdodG0nID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ2NzcycgPT4gJ3RleHQvY3NzOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICdqcycgPT4gJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQ7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ2pzb24nID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JywKICAgICAgICAgICAgICAgICd4bWwnID0+ICdhcHBsaWNhdGlvbi94bWw7IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ3R4dCcgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgICAgICAgICAgJ3N2ZycgPT4gJ2ltYWdlL3N2Zyt4bWwnLAogICAgICAgICAgICAgICAgJ2ljbycgPT4gJ2ltYWdlL3gtaWNvbicsCiAgICAgICAgICAgICAgICAncG5nJyA9PiAnaW1hZ2UvcG5nJywKICAgICAgICAgICAgICAgICdqcGcnID0+ICdpbWFnZS9qcGVnJywKICAgICAgICAgICAgICAgICdqcGVnJyA9PiAnaW1hZ2UvanBlZycsCiAgICAgICAgICAgICAgICAnZ2lmJyA9PiAnaW1hZ2UvZ2lmJywKICAgICAgICAgICAgICAgICd3ZWJwJyA9PiAnaW1hZ2Uvd2VicCcsCiAgICAgICAgICAgICAgICAnYm1wJyA9PiAnaW1hZ2UvYm1wJywKICAgICAgICAgICAgICAgICd3b2ZmJyA9PiAnZm9udC93b2ZmJywKICAgICAgICAgICAgICAgICd3b2ZmMicgPT4gJ2ZvbnQvd29mZjInLAogICAgICAgICAgICAgICAgJ3R0ZicgPT4gJ2ZvbnQvdHRmJywKICAgICAgICAgICAgICAgICdvdGYnID0+ICdmb250L290ZicsCiAgICAgICAgICAgICAgICAnZW90JyA9PiAnYXBwbGljYXRpb24vdm5kLm1zLWZvbnRvYmplY3QnLAogICAgICAgICAgICAgICAgJ3BkZicgPT4gJ2FwcGxpY2F0aW9uL3BkZicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmIChpc3NldCgkbWFwWyRleHRdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICRtYXBbJGV4dF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWltZV9jb250ZW50X3R5cGUnKSkgewogICAgICAgICAgICAgICAgJG1pbWUgPSBAbWltZV9jb250ZW50X3R5cGUoJHBhdGgpOwogICAgICAgICAgICAgICAgaWYgKGlzX3N0cmluZygkbWltZSkgJiYgJG1pbWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRtaW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFRyeU91dHB1dERpcmVjdEhvc3RQYWdlKCRob3N0T25seSwgJHJlcXVlc3RQYXRoID0gJy8nLCAkY3VycmVudFVybCA9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyb290RG9tYWluID0gc2VsZjo6R2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCk7CiAgICAgICAgICAgIGlmICgkcm9vdERvbWFpbiAhPT0gJycgJiYgJGhvc3RPbmx5ID09PSAkcm9vdERvbWFpbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gc2VsZjo6UmVzb2x2ZURpcmVjdEhvc3RQYWdlUGF0aCgkaG9zdE9ubHksICRyZXF1ZXN0UGF0aCk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZXh0ID0gc3RydG9sb3dlcigoc3RyaW5nKXBhdGhpbmZvKCRwYXRoLCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgaWYgKCRleHQgPT09ICdodG1sJyB8fCAkZXh0ID09PSAnaHRtJykgewogICAgICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICAgICAgaWYgKCFpc19zdHJpbmcoJGh0bWwpIHx8ICRodG1sID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Jyk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICAgICAgICAgIGVjaG8gc2VsZjo6UHNldWRvT3JpZ2luYWxIdG1sKCRodG1sLCBhcnJheSgKICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3RPbmx5LAogICAgICAgICAgICAgICAgICAgICd1cmwnID0+IChzdHJpbmcpJGN1cnJlbnRVcmwsCiAgICAgICAgICAgICAgICApKTsKICAgICAgICAgICAgICAgIGRpZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiAnIC4gc2VsZjo6R2V0TWltZVR5cGVCeVBhdGgoJHBhdGgpKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogcHVibGljLCBtYXgtYWdlPTg2NDAwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZGZpbGUoJHBhdGgpOwogICAgICAgICAgICBkaWUoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFRyeU91dHB1dFJhbmRvbURpcmVjdEhvc3RQYWdlRm9yNDA0KCRjdXJyZW50SG9zdCwgJGN1cnJlbnRVcmwgPSAnJykKICAgICAgICB7CiAgICAgICAgICAgICRjaG9zZW4gPSBzZWxmOjpQaWNrNDA0U3VpamlQYWdlSXRlbSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsKTsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkY2hvc2VuKSB8fCBlbXB0eSgkY2hvc2VuWydmaWxlX3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgaWYgKCRiYXNlRGlyID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyZWxhdGl2ZVBhdGggPSBzdHJfcmVwbGFjZShhcnJheSgnLycsICdcXCcpLCBESVJFQ1RPUllfU0VQQVJBVE9SLCBsdHJpbSgoc3RyaW5nKSRjaG9zZW5bJ2ZpbGVfcGF0aCddLCAnL1xcJykpOwogICAgICAgICAgICAkcGF0aCA9ICRiYXNlRGlyIC4gcHJlZ19yZXBsYWNlKCcjXmh0bWxfcGFnZXNbXFxcXC9dI2knLCAnJywgJHJlbGF0aXZlUGF0aCk7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGV4dCA9IHN0cnRvbG93ZXIoKHN0cmluZylwYXRoaW5mbygkcGF0aCwgUEFUSElORk9fRVhURU5TSU9OKSk7CiAgICAgICAgICAgIGlmICgkZXh0ICE9PSAnaHRtbCcgJiYgJGV4dCAhPT0gJ2h0bScpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkaHRtbCkgfHwgJGh0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRjdXJyZW50SG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGN1cnJlbnRIb3N0KTsKICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOCcpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICBoZWFkZXIoJ1ByYWdtYTogbm8tY2FjaGUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsKICAgICAgICAgICAgZWNobyBzZWxmOjpQc2V1ZG9PcmlnaW5hbEh0bWwoJGh0bWwsIGFycmF5KAogICAgICAgICAgICAgICAgJ2hvc3QnID0+ICRjdXJyZW50SG9zdCwKICAgICAgICAgICAgICAgICd1cmwnID0+IChzdHJpbmcpJGN1cnJlbnRVcmwsCiAgICAgICAgICAgICkpOwogICAgICAgICAgICBkaWUoKTsKICAgICAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gczMwMSgkdXJsKSAgICAgICAgICAgICAgIAogICAgeyAgICAJIAkJCQkgCQogICAgICAgIGlmICgkdXJsKSB7ICAgICAgCSAgIAkgCiAgICAgICAgICAgIGhlYWRlcignSFRUUC8xLjEgMzAxIE1vdmVkIFBlcm1hbmVudGx5Jyk7ICAgIAkJIAkgIAkJCiAgICAgICAgICAgIGhlYWRlcignU3RhdHVzOiAzMDEgTW92ZWQgUGVybWFuZW50bHknKTsgICAgCSAgCSAJCQkKICAgICAgICAgICAgaGVhZGVyKCdMb2NhdGlvbjonIC4gJHVybCAuICcnKTsgICAgCSAJCSAgIAkKICAgICAgICAgICAgZXhpdDsgICAgCQkgIAkgIAkKICAgICAgICB9ICAgICAJCSAJIAkgCiAgICB9ICAgIAkgCSAJCSAJCiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UG9zdCgpICAgICAgICAgICAgICAKICAgIHsgICAgCQkJICAJIAkKICAgICAgICBnbG9iYWwgJHpicDsgICAgCQkJIAkgICAKICAgICAgICAkbWFwcyA9IEN5cWl5ZXpoYW4oJ3Bvc3RtYXAnKTsKICAgICAgICBpZiAoJG1hcHMpIHsKICAgICAgICAgICAgaWYgKCFzZWxmOjokdXJpKSB7CiAgICAgICAgICAgICAgICBzZWxmOjokdXJpID0gJHpicC0+ZnVsbGN1cnJlbnR1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHVybCA9IHN0cl9yZXBsYWNlKCR6YnAtPmhvc3QsICcnLCBzZWxmOjokdXJpKTsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2hfYWxsKCcjKF58XG58XHIpXHsvKC4qPylcfT1ceyhcZCspXH0oXHJ8XG58JCkjaXMnLCAkbWFwcywgJHQpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkdFsyXSBhcyAkayA9PiAkcikgewogICAgICAgICAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmwsICRyKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkYWlkID0gaW50dmFsKCR0WzNdWyRrXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJGFpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkYXJ0aWNsZSAmJiAkYXJ0aWNsZS0+SUQgJiYgISRhcnRpY2xlLT5TdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkYXJ0aWNsZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2VsZjo6JHNpdGUpIHsgICAgICAgICAgCiAgICAgICAgICAgICRzaXRlcyA9IEN5cWl5ZXpoYW4oJ3NpdGVzJyk7ICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkc2l0ZXMgJiYgcHJlZ19tYXRjaCgnIycgLiBwcmVnX3JlcGxhY2UoJyNodHRwcz86Ly8jJywgJycsICR6YnAtPmhvc3QpIC4gJyhcZCspIycsICRzaXRlcywgJHQpKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJHRbMV0pOyAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoJGFydGljbGUtPklEKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgJGFydGljbGUgPSBuZXcgUG9zdDsgICAgCQkgCQkJCSAKICAgICAgICAkSUQgPSAwOyAgICAgIAkgIAkgCQogICAgICAgIGlmIChDeXFpeWV6aGFuKCdwb3N0JykpIHsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICR1cmkgPSBzZWxmOjokdXJpOyAgICAgICAgICAgICAgCiAgICAgICAgICAgIGlmICgkdXJpKSB7ICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICR1cmkgPSBtZDUoJHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ0lELFRpdGxlJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkdXJpKSktPmxpbWl0KDEpLT5zcWw7ICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGQpKSB7ICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAkSUQgPSBpbnR2YWwoJGRbMF1bJ0lEJ10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRyYXdUaXRsZSA9ICRkWzBdWydUaXRsZSddOyAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRUaXRsZSA9ICRyYXdUaXRsZTsKICAgICAgICAgICAgICAgICAgICAkdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhd1RpdGxlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmIGlzc2V0KCRkYXRhWyd0J10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaXRsZSA9ICRkYXRhWyd0J107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsndHMnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cyA9IGludHZhbCgkZGF0YVsndHMnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRUaXRsZSAmJiBzZWxmOjpJc0FydGljbGVUaXRsZSgkVGl0bGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRzcWwgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+ZGVsZXRlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkdXJpKSktPnNxbDsKICAgICAgICAgICAgICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgICAgICAgICAgICAgICAgICAkVGl0bGUgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJElEID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHR0bCA9IHNlbGY6OkdldEZpeGVkVGl0bGVUVEwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHR0bCA+IDAgJiYgJHRzID4gMCAmJiAodGltZSgpIC0gJHRzKSA+ICR0dGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICR1cmkpKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGFydGljbGUgPSAkemJwLT5HZXRQb3N0QnlJRCgkSUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRhcnRpY2xlLT5JRCAmJiAhJGFydGljbGUtPlN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRUaXRsZSkgeyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGFydGljbGUtPlRpdGxlID0gJFRpdGxlOyAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICR1cmkpKS0+c3FsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICByZXR1cm4gJGFydGljbGU7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAKICAgICAgICB9ICAgICAgCQkJIAkJCiAgICAgICAgJGNhdGUgPSAnJzsgICAgCQkgIAkgIAkKICAgICAgICAkdyA9IGFycmF5KGFycmF5KCc9JywgJ2xvZ19TdGF0dXMnLCAnMCcpLCBhcnJheSgnPScsICdsb2dfVHlwZScsICcwJykpOyAgICAJCQkgCQkJIAogICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2x5X3hpblpibG9nJykgJiYgbHlfeGluWmJsb2dfY29yZTo6JGNhdGVob3N0KSB7ICAgICAgCSAgCSAgCiAgICAgICAgICAgICRjYXRlID0gbHlfeGluWmJsb2dfY29yZTo6JGNhdGVob3N0OyAgICAgIAkJIAkJCQogICAgICAgICAgICAkd1tdID0gYXJyYXkoJz0nLCAnbG9nX0NhdGVJRCcsICRjYXRlKTsgICAgCQkgCQkJCQkKICAgICAgICB9ICAgIAkgIAkJICAgCiAgICAgICAgJG51bSA9IGludHZhbChDeXFpeWV6aGFuKCdudW0nLCAwKSk7ICAgIAkgCQkJCQkgCiAgICAgICAgaWYgKCRudW0pIHsgICAgICAJICAgCQkKICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5zZWxlY3QoJHpicC0+ZGItPmRicHJlIC4gJ3Bvc3QnKS0+Y29sdW1uKCdsb2dfSUQnKS0+d2hlcmUoJHcpLT5vcmRlckJ5KCdsb2dfSUQgREVTQycpLT5saW1pdCgkbnVtKS0+c3FsOyAgICAJCQkgICAJIAogICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsgICAgCQkgCSAgCSAKICAgICAgICAgICAgaWYgKCFlbXB0eSgkZCkpIHsgICAgIAkgCQkJCSAKICAgICAgICAgICAgICAgICRJRHMgPSBhcnJheV9jb2x1bW4oJGQsICdsb2dfSUQnKTsgICAgIAkJCQkJCQkKICAgICAgICAgICAgICAgICRhcnRpY2xlID0gJHpicC0+R2V0UG9zdEJ5SUQoJElEc1thcnJheV9yYW5kKCRJRHMpXSk7ICAgIAkgCQkJIAkgCiAgICAgICAgICAgIH0gICAgCQkgCQkgIAkKICAgICAgICB9IGVsc2UgeyAgICAJCQkJCQkJCQogICAgICAgICAgICAkSUQgPSAwOwogICAgICAgICAgICAkY3Vyc29yS2V5ID0gJ19fY3Vyc29yX18nIC4gKCgkY2F0ZSAhPT0gJycpID8gKCdjYXRlXycgLiAkY2F0ZSkgOiAnYWxsJyk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAkc3FsQ3VyID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ0lEJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkY3Vyc29yS2V5KSktPmxpbWl0KDEpLT5zcWw7CiAgICAgICAgICAgICAgICAkcm93c0N1ciA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsQ3VyKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcm93c0N1cikgJiYgIWVtcHR5KCRyb3dzQ3VyKSAmJiBpc3NldCgkcm93c0N1clswXVsnSUQnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkSUQgPSBpbnR2YWwoJHJvd3NDdXJbMF1bJ0lEJ10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgICAgICAkd3cgPSAkdzsgICAgCSAgCQkJIAkKICAgICAgICAgICAgJHd3W10gPSBhcnJheSgnPicsICdsb2dfSUQnLCAkSUQpOyAgICAgCQkJICAJCQogICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAncG9zdCcpLT5jb2x1bW4oJ2xvZ19JRCcpLT53aGVyZSgkd3cpLT5vcmRlckJ5KCdsb2dfSUQgQVNDJyktPmxpbWl0KDEpLT5zcWw7ICAgIAkJICAgCQkJCiAgICAgICAgICAgICRkID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOyAgICAJCSAgICAJCQogICAgICAgICAgICBpZiAoIWVtcHR5KCRkKSkgeyAgICAJCSAgIAkgCQogICAgICAgICAgICAgICAgJElEID0gJGRbMF1bJ2xvZ19JRCddOyAgICAJCSAJIAkJCQogICAgICAgICAgICAgICAgJGFydGljbGUgPSAkemJwLT5HZXRQb3N0QnlJRCgkSUQpOyAgICAgCQkJICAJIAogICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAJCQogICAgICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5zZWxlY3QoJHpicC0+ZGItPmRicHJlIC4gJ3Bvc3QnKS0+d2hlcmUoJHcpLT5vcmRlckJ5KCdsb2dfSUQgQVNDJyktPmxpbWl0KDEpLT5zcWw7ICAgIAkgICAJCQkgCiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPkdldExpc3RUeXBlKCdQb3N0JywgJHNxbCk7ICAgICAgCSAgICAgCiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZCBhcyAkYXJ0aWNsZSkgeyAgICAJCSAgCQkgIAogICAgICAgICAgICAgICAgfSAgICAgCQkgCSAgIAogICAgICAgICAgICB9ICAgIAkgIAkJICAJCiAgICAgICAgICAgIGlmICgkYXJ0aWNsZSAmJiAkYXJ0aWNsZS0+SUQpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJHNxbERlbEN1ciA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICRjdXJzb3JLZXkpKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsRGVsQ3VyKTsKICAgICAgICAgICAgICAgICAgICAkc3FsSW5zQ3VyID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPmluc2VydCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5kYXRhKGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAnTmFtZScgPT4gJGN1cnNvcktleSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0lEJyA9PiBpbnR2YWwoJGFydGljbGUtPklEKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ1RpdGxlJyA9PiAnJywKICAgICAgICAgICAgICAgICAgICApKS0+c3FsOwogICAgICAgICAgICAgICAgICAgICR6YnAtPmRiLT5RdWVyeSgkc3FsSW5zQ3VyKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSAgICAgIAkJICAgCQogICAgICAgICRUaXRsZSA9IHNlbGY6OkdldFVuaXF1ZVRpdGxlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkdldFR4dCgpOwogICAgICAgIH0sICfpmo/mnLrmoIfpopgnLCAxMjAsIDEyLCA4MCk7CiAgICAgICAgaWYgKCRUaXRsZSAhPT0gJycgJiYgIXNlbGY6OklzQXJ0aWNsZVRpdGxlKCRUaXRsZSkpIHsKICAgICAgICAgICAgJGFydGljbGUtPlRpdGxlID0gJFRpdGxlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRhcnRpY2xlLT5UaXRsZSA9ICfpmo/mnLrmoIfpopgnOwogICAgICAgIH0KICAgICAgICBpZiAoQ3lxaXllemhhbigncG9zdCcpICYmICRhcnRpY2xlLT5JRCAmJiAkdXJpKSB7ICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICRwYXlsb2FkID0gYXJyYXkoJ3QnID0+ICRhcnRpY2xlLT5UaXRsZSwgJ3RzJyA9PiB0aW1lKCkpOwogICAgICAgICAgICAkcmF3VGl0bGUgPSBqc29uX2VuY29kZSgkcGF5bG9hZCwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgICAgIGlmICghJHJhd1RpdGxlKSB7CiAgICAgICAgICAgICAgICAkcmF3VGl0bGUgPSAkYXJ0aWNsZS0+VGl0bGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5pbnNlcnQoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+ZGF0YShhcnJheSgnTmFtZScgPT4gJHVyaSwgJ0lEJyA9PiAkYXJ0aWNsZS0+SUQsICdUaXRsZScgPT4gJHJhd1RpdGxlKSktPnNxbDsgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7ICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuICRhcnRpY2xlOyAgICAgICAgICAgICAgICAgICAKICAgIH0gICAgCSAJIAkJCSAKICAgIHN0YXRpYyBmdW5jdGlvbiBEZWJ1Z19IYW5kbGVyX0NvbW1vbigkZ2V0Q29kZSwgJGdldE1lc3NhZ2UsICRnZXRGaWxlLCAkZ2V0TGluZSwgJGdldE1vcmVJbmZvLCAkZ2V0SHR0cENvZGUpICAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgIAkJICAgCQkKICAgIAkJIAkJICAgCiAgICAgICAgaWYgKCRnZXRIdHRwQ29kZSA9PSA0MDQgfHwgJGdldENvZGUgPT0gMikgeyAgICAgCSAgIAkgIAogICAgICAgICAgICBzZWxmOjpFcnJvcigpOyAgICAgCQkgCQkJIAogICAgICAgIH0gICAgICAJCQkgICAKICAgIH0gICAgICAgCQkJICAKICAgIHN0YXRpYyBmdW5jdGlvbiBFcnJvcigkdXJsID0gJycsICRvcmlnaW5hbF91cmwgPSAnJykgICAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgCSAgCQkgIAkKICAgICAgICBzdGF0aWMgJGlzID0gMDsgICAgCQkJCSAgCSAKICAgICAgICBpZiAoJGlzKSB7ICAgIAkJCQkJICAgCiAgICAgICAgICAgIHJldHVybjsgICAgCQkJCQkJIAkKICAgICAgICB9ICAgIAkgIAkJCQkJCiAgICAgICAgJGlzID0gMTsgICAgCQkgCQkgICAKICAgICAgICBnbG9iYWwgJHpicDsgICAgCQkgCQkJCQkKICAgICAgICBzZWxmOjokdXJpID0gJHpicC0+ZnVsbGN1cnJlbnR1cmw7ICAgIAkgIAkgICAJCiAgICAgICAgJGhvc3RPbmx5TWFpbiA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX0hPU1QnXSkgPyAoc3RyaW5nKSRfU0VSVkVSWydIVFRQX0hPU1QnXSA6ICcnOwogICAgICAgIGlmICgkaG9zdE9ubHlNYWluID09PSAnJykgewogICAgICAgICAgICAkaG9zdE9ubHlNYWluID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+aG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgJGhvc3RPbmx5TWFpbiA9ICRob3N0T25seU1haW4gPyAoc3RyaW5nKSRob3N0T25seU1haW4gOiAnJzsKICAgICAgICB9CiAgICAgICAgJHJlcXVlc3RVcmlGb3JNYWluID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcnOwogICAgICAgIHNlbGY6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHlNYWluLCAkcmVxdWVzdFVyaUZvck1haW4sIChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgIHNlbGY6OlRyeU91dHB1dERpcmVjdEhvc3RQYWdlKCRob3N0T25seU1haW4sICRyZXF1ZXN0VXJpRm9yTWFpbiwgKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybCk7CiAgICAgICAgJGV4dCA9IEN5cWl5ZXpoYW4oJ2V4dCcsICdpY298anBnfGpzfGNzc3xqcGVnfGdpZnxwbmd8d2VicHx4bWx8dHh0Jyk7ICAgICAgCQkgCQkJCiAgICAgICAgaWYgKCRleHQgJiYgcHJlZ19tYXRjaCgnI1wuKCcgLiAkZXh0IC4gJykoXD98JCkjaScsIHNlbGY6OiR1cmkpKSB7ICAgIAkgCSAJCSAgCiAgICAgICAgICAgIHJldHVybjsgICAgCQkgIAkgCQkKICAgICAgICB9ICAgICAJIAkgCSAJCiAgICAgICAgc2VsZjo6VG9VcmxzKCk7ICAgICAgICAJIAkgCiAgICAgICAgJHVybCA9IEN5cWl5ZXpoYW4oJ3VybCcpOyAgICAJCSAJICAJIAogICAgICAgIGlmICgkdXJsKSB7ICAgICAJICAgICAJCiAgICAgICAgICAgIGlmIChzdHJwb3MoJHVybCwgJzovLycpIHx8ICR1cmwgPT0gJy8nKSB7ICAgICAgICAgCQkgCiAgICAgICAgICAgICAgICBzZWxmOjpzMzAxKCR1cmwpOyAgICAgCQkJICAgIAogICAgICAgICAgICB9ICAgICAgIAkJCQkJCiAgICAgICAgICAgICR1cmwgPSBsdHJpbSgkdXJsLCAnLycpOyAgICAgCQkgIAkgCQogICAgICAgICAgICBpZiAoaXNfZmlsZShaQlBfUEFUSCAuICR1cmwpKSB7ICAgIAkJCSAJIAkJCiAgICAgICAgICAgICAgICByZWFkZmlsZShaQlBfUEFUSCAuICR1cmwpOyAgICAgCSAgCQkgIAogICAgICAgICAgICAgICAgZGllKCk7ICAgICAgCQkJCQkJCiAgICAgICAgICAgIH0gICAgCSAgCQkgCQkKICAgICAgICB9ICAgIAkJICAgIAkJCgogICAgICAgICRob3N0T25seU1haW4gPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3RPbmx5TWFpbik7CiAgICAgICAgJGhvc3RPbmx5TWFpbiA9IHJ0cmltKHN0cnRvbG93ZXIoKHN0cmluZykkaG9zdE9ubHlNYWluKSwgJy4nKTsKICAgICAgICAkaXNNYWluSG9zdCA9IHRydWU7CiAgICAgICAgaWYgKCRob3N0T25seU1haW4gIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3RPbmx5TWFpbikpIHsKICAgICAgICAgICAgaWYgKCFwcmVnX21hdGNoKCcjXnd3d1wuI2knLCAkaG9zdE9ubHlNYWluKSAmJiBzdWJzdHJfY291bnQoJGhvc3RPbmx5TWFpbiwgJy4nKSA+IDEpIHsKICAgICAgICAgICAgICAgICRpc01haW5Ib3N0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRpc01haW5Ib3N0KSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICBpZiAoJHJlcXVlc3RVcmlGb3JNYWluICE9PSAnJykgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKCRyZXF1ZXN0VXJpRm9yTWFpbik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHApICYmIGlzc2V0KCRwWydwYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRwWydwYXRoJ107CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJHJlcXVlc3RVcmlGb3JNYWluOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcFsncGF0aCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRzaG91bGRVc2VNYWluRG9tYWluVHBsID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChwcmVnX21hdGNoKCcjXi9cZHszLH0vPyQjJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcjXi9bYS16XXs0LDV9Lz8kI2knLCAkcGF0aCkpIHsKICAgICAgICAgICAgICAgICRzaG91bGRVc2VNYWluRG9tYWluVHBsID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlaWYgKHByZWdfbWF0Y2goJyNeL1thLXpdezQsNX0vWzEtOV1cZHsxLDJ9aHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcjXi9bYS16XXs0LDV9L1sxLTldXGR7MSwyfVwuaHRtbC8/JCNpJywgJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAkc2hvdWxkVXNlTWFpbkRvbWFpblRwbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRzaG91bGRVc2VNYWluRG9tYWluVHBsKSB7CiAgICAgICAgICAgICAgICAkaG9zdE5vcm0gPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHlNYWluKTsKICAgICAgICAgICAgICAgICRjZmcgPSBzZWxmOjpHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE5vcm0pOwogICAgICAgICAgICAgICAgaWYgKCEkY2ZnKSB7CiAgICAgICAgICAgICAgICAgICAgJGFsbCA9IHNlbGY6OkxvYWRNYWluRG9tYWluQ29uZmlncyhmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRhbGwpICYmIGlzc2V0KCRhbGxbJ3BhdHRlcm5zJ10pICYmIGlzX2FycmF5KCRhbGxbJ3BhdHRlcm5zJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRhbGxbJ3BhdHRlcm5zJ10gYXMgJGl0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdCkgfHwgZW1wdHkoJGl0WydlbmFibGVkJ10pIHx8IGVtcHR5KCRpdFsnZG9tYWluJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic3RyKChzdHJpbmcpJGl0Wydkb21haW4nXSwgLXN0cmxlbignLicgLiAkaG9zdE5vcm0pKSA9PT0gKCcuJyAuICRob3N0Tm9ybSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkY2ZnID0gJGl0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHVzZUh0bWxUcGxFbmFibGVkID0gKGludHZhbChDeXFpeWV6aGFuKCd1c2VfaHRtbF90cGwnLCAwKSkgPT09IDEpOwogICAgICAgICAgICAgICAgJHRwbE5hbWUgPSAnJzsKICAgICAgICAgICAgICAgICRzZW8gPSBhcnJheSgpOwogICAgICAgICAgICAgICAgaWYgKCRjZmcgJiYgaXNzZXQoJGNmZ1sndGVtcGxhdGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAkdHBsTmFtZSA9IHRyaW0oKHN0cmluZykkY2ZnWyd0ZW1wbGF0ZSddKTsKICAgICAgICAgICAgICAgICAgICAkc2VvID0gaXNzZXQoJGNmZ1snc2VvJ10pICYmIGlzX2FycmF5KCRjZmdbJ3NlbyddKSA/ICRjZmdbJ3NlbyddIDogYXJyYXkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkdHBsTmFtZSA9PT0gJycgfHwgc3RydG9sb3dlcihwYXRoaW5mbygkdHBsTmFtZSwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICAgICAgICAgIGlmICgkdXNlSHRtbFRwbEVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRwbE5hbWUgPSBzZWxmOjpHZXRDb25maWd1cmVkU2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkdHBsTmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0cGxOYW1lID0gc2VsZjo6R2V0U2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0cGxOYW1lICE9PSAnJyAmJiBzdHJ0b2xvd2VyKHBhdGhpbmZvKCR0cGxOYW1lLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJyZW50VXJsID0gKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybDsKICAgICAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gaXNzZXQoJGNmZ1sndGl0bGUnXSkgPyB0cmltKChzdHJpbmcpJGNmZ1sndGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9IGlzc2V0KCR6YnAtPm5hbWUpID8gdHJpbSgoc3RyaW5nKSR6YnAtPm5hbWUpIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aXRsZSA9ICRob3N0Tm9ybTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGt3ID0gaXNzZXQoJHNlb1sna2V5d29yZHMnXSkgPyB0cmltKChzdHJpbmcpJHNlb1sna2V5d29yZHMnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRkZXNjID0gaXNzZXQoJHNlb1snZGVzY3JpcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJHNlb1snZGVzY3JpcHRpb24nXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzaXRlTmFtZSA9IGlzc2V0KCR6YnAtPm5hbWUpID8gKHN0cmluZykkemJwLT5uYW1lIDogJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdmFycyA9IGFycmF5KCdrdycgPT4gJGt3LCAnZGVzYycgPT4gJGRlc2MsICd1cmwnID0+ICRjdXJyZW50VXJsLCAnaG9zdCcgPT4gJGhvc3ROb3JtLCAnc2l0ZW5hbWUnID0+ICRzaXRlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkaHRtbCA9IHNlbGY6OkJ1aWxkU2l0ZUhvbWVIdG1sRnJvbVRlbXBsYXRlKCR0cGxOYW1lLCAkdGl0bGUsICcnLCAkdmFycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGh0bWwgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBuby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgbWF4LWFnZT0wJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAkaHRtbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2VsZjo6VHJ5T3V0cHV0UmFuZG9tRGlyZWN0SG9zdFBhZ2VGb3I0MDQoJGhvc3RPbmx5TWFpbiwgKHN0cmluZykkemJwLT5mdWxsY3VycmVudHVybCk7CiAgICAgICAgcmV0dXJuOwogICAgICAgIC8qICAgICAgCQkgICAJCiAgICAgICAgb2Jfc3RhcnQoKTsgICAgICAJCQkgIAkKICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsgICAgICAgIAkJCSAKICAgICAgICBzZWxmOjokY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOyAgICAJIAkJCQkJIAogICAgCQkgCSAgCSAKICAgICAgICBpZiAoc2VsZjo6JGNvbnRlbnQgPT09ICcnKSB7ICAgIAkJICAgIAkJCiAgICAgICAgICAgIG9iX2VuZF9mbHVzaCgpOyAgICAgCSAgCQkJCQogICAgICAgICAgICBzZWxmOjokY29udGVudCA9IG9iX2dldF9jb250ZW50cygpOyAgICAgCQkJIAkgCQogICAgICAgIH0gICAgICAgICAgCQkKICAgICAgICBpZiAoc2VsZjo6JGNvbnRlbnQpIHsgICAgICAJIAkgIAkKICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oJ0N5cWl5ZXpoYW5fY29yZTo6VGVybWluYXRlJyk7ICAgIAkJIAkJCQkJCiAgICAgICAgfSAgICAgCQkgCSAgIAogICAgICovICAgICAgCSAJCQkJCiAgICB9ICAgICAJIAkgIAkJCiAgICBzdGF0aWMgZnVuY3Rpb24gVGVybWluYXRlKCkgICAgICAJCSAgCSAKICAgIHsgICAgICAgCQkJIAkKICAgICAgICBvYl9lbmRfY2xlYW4oKTsgICAgICAgCSAJCQkKICAgICAgICBodHRwX3Jlc3BvbnNlX2NvZGUoMjAwKTsgICAgIAkJICAJIAkKICAgICAgICBlY2hvIHNlbGY6OiRjb250ZW50OyAgICAgCSAgICAgIAogICAgfSAgICAJIAkgCSAgIAogICAgc3RhdGljIGZ1bmN0aW9uIERpc3BsYXlUZW1wbGF0ZVdpdGhQc2V1ZG9PcmlnaW5hbCgkdGVtcGxhdGUsICR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICBpZiAoIUN5cWl5ZXpoYW4oJ3VzZV9wc2V1ZG9fb3JpZ2luYWwnLCAwKSkgewogICAgICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBvYl9zdGFydCgpOwogICAgICAgICR0ZW1wbGF0ZS0+RGlzcGxheSgpOwogICAgICAgICRjb250ZW50ID0gb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICAgICAgb2JfZW5kX2NsZWFuKCk7CiAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAkdGVtcGxhdGUtPkRpc3BsYXkoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlY2hvIHNlbGY6OlBzZXVkb09yaWdpbmFsSHRtbCgkY29udGVudCwgJHZhcnMpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIGRldGVjdF9lbmNvZGluZygkY29udGVudHMpICAgICAgIAkgICAJCiAgICB7ICAgICAgIAkJCSAJCiAgICAgICAgJGVuY29kaW5ncyA9IGFycmF5KCdVVEYtOCcsICdHQjIzMTInLCAnR0JLJywgJ1VURi0xNicsICdVQ1MtMicsICdCSUc1JywgJ0NQOTM2JywgJ0FTQ0lJJyk7ICAgIAkgCQkJCQkgCiAgICAgICAgcmV0dXJuIG1iX2RldGVjdF9lbmNvZGluZygkY29udGVudHMsICRlbmNvZGluZ3MpOyAgICAJICAJCQkgIAogICAgfSAgICAgCQkgICAJCQogICAgc3RhdGljIGZ1bmN0aW9uIGNvbnZlcnRfdG9fdXRmOCgkc3RyLCAkZnJvbV9lbmNvZGluZykgICAgCQkgCQkgICAKICAgIHsgICAgIAkJICAgIAkKICAgICAgICBpZiAoISRmcm9tX2VuY29kaW5nIHx8ICRmcm9tX2VuY29kaW5nID09ICdVVEYtOCcpIHsgICAgCQkJIAkgCSAKICAgICAgICAgICAgcmV0dXJuICRzdHI7ICAgIAkgCQkgCSAJCiAgICAgICAgfSAgICAJCQkgIAkgCQogICAgICAgIHJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICdVVEYtOCcsICRmcm9tX2VuY29kaW5nKTsgICAgCSAJCSAgCQkKICAgIH0gICAgIAkJICAgIAkKICAgIHN0YXRpYyBmdW5jdGlvbiBmaWxlX3V0ZjgoJHRtcCwgJGZpbGVzKSAgICAgCSAgCQkgIAogICAgeyAgICAgCQkJCSAgIAogICAgICAgICRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0bXApOyAgICAJCQkgCSAJIAogICAgICAgICRjaGFyc2V0WzFdID0gc3Vic3RyKCRjb250ZW50cywgMCwgMSk7ICAgICAgIAkgCQkgCiAgICAgICAgJGNoYXJzZXRbMl0gPSBzdWJzdHIoJGNvbnRlbnRzLCAxLCAxKTsgICAgCQkJCSAJCSAKICAgICAgICAkY2hhcnNldFszXSA9IHN1YnN0cigkY29udGVudHMsIDIsIDEpOyAgICAJCQkJICAgCQogICAgICAgICRlbmNvZGluZyA9ICcnOyAgICAJICAgCSAgCQogICAgICAgIGlmIChvcmQoJGNoYXJzZXRbMV0pICE9IDIzOSAmJiBvcmQoJGNoYXJzZXRbMl0pICE9IDE4NyAmJiBvcmQoJGNoYXJzZXRbM10pICE9IDE5MSkgeyAgICAgCQkgCSAJIAogICAgICAgICAgICAkZW5jb2RpbmcgPSBzZWxmOjpkZXRlY3RfZW5jb2RpbmcoY2hyKDB4ZWYpIC4gY2hyKDB4YmIpIC4gY2hyKDB4YmYpIC4gJGNvbnRlbnRzKTsgICAgIAkgICAJICAKICAgICAgICB9ICAgICAgCSAJICAgCiAgICAgICAgaWYgKCEkZW5jb2RpbmcpIHsgICAgICAgIAkgICAKICAgICAgICAgICAgJGVuY29kaW5nID0gc2VsZjo6ZGV0ZWN0X2VuY29kaW5nKCRjb250ZW50cyk7ICAgIAkgCQkJCSAgCiAgICAgICAgfSAgICAgIAkJCQkJIAogICAgICAgICRjb250ZW50cyA9IHNlbGY6OmNvbnZlcnRfdG9fdXRmOCgkY29udGVudHMsICRlbmNvZGluZyk7ICAgICAJCQkJIAkJCiAgICAgICAgJGNvbnRlbnRzID0gdHJpbSgkY29udGVudHMpOyAgICAJICAgCQkgCQogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCRmaWxlcywgJGNvbnRlbnRzKTsgICAgIAkgIAkJCSAKICAgICAgICB1bnNldCgkY29udGVudHMpOyAgICAgCSAJCQkJCQogICAgfSAgICAJCQkJCQkJCQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFR4dCgpICAgICAgICAJCQkJCiAgICB7ICAgIAkJIAkJICAgCiAgICAgICAgc3RhdGljICRpbml0ZWQgPSAwOwogICAgICAgIHN0YXRpYyAkZmlsZUxpc3QgPSBhcnJheSgpOwogICAgICAgIHN0YXRpYyAkY3VyRmlsZUlkeCA9IDA7CiAgICAgICAgc3RhdGljICRjdXJMaW5lID0gMDsKICAgICAgICAkc3RhdGVGcCA9IG51bGw7CiAgICAgICAgJHN0YXRlRmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVNlcVN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkc3RhdGVGaWxlICE9PSAnJykgewogICAgICAgICAgICAkc3RhdGVGcCA9IEBmb3Blbigkc3RhdGVGaWxlLCAnYytiJyk7CiAgICAgICAgICAgIGlmICgkc3RhdGVGcCkgewogICAgICAgICAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkc3RhdGVGcCwgTE9DS19FWCk7CiAgICAgICAgICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICBAZmNsb3NlKCRzdGF0ZUZwKTsKICAgICAgICAgICAgICAgICAgICAkc3RhdGVGcCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG91dFRpdGxlID0gJyc7CiAgICAgICAgaWYgKCEkaW5pdGVkKSB7CiAgICAgICAgICAgICRpbml0ZWQgPSAxOwogICAgICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgICAgICBpZiAoaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAkZCA9IHNjYW5kaXIoJGRpcik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGQpICYmIGNvdW50KCRkKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgICR0b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCAoJGQgYXMgJGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRmID09PSAnLicgfHwgJGYgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ3R4dCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGRpciAuICRmOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkbWF4SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnI14nIC4gcHJlZ19xdW90ZSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ2NzcmZUb2tlbicpLCAnIycpIC4gJ1xfKFxkKylcXyNpJywgJGYsICR0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gaW50dmFsKCR0WzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcCA9IG5ldyBTcGxGaWxlT2JqZWN0KCRwYXRoLCAncmInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdG1wLT5zZWVrKFBIUF9JTlRfTUFYKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkbWF4SW5kZXggPSBpbnR2YWwoJHRtcC0+a2V5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG1heEluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZXNbXSA9IGFycmF5KCdwYXRoJyA9PiAkcGF0aCwgJ25hbWUnID0+IGJhc2VuYW1lKCRwYXRoKSwgJ21heCcgPT4gJG1heEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgJHRvdGFsICs9ICgkbWF4SW5kZXggKyAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbXB0eSgkZmlsZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVzb3J0KCRmaWxlcywgZnVuY3Rpb24gKCRhLCAkYikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0cm5hdGNhc2VjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkZmlsZUxpc3QgPSAkZmlsZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OiR0eHRDb3VudCA9ICR0b3RhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJHN0YXRlID0gJHN0YXRlRnAgPyBzZWxmOjpMb2FkUmFuZFRpdGxlU2VxU3RhdGUoJHN0YXRlRnApIDogc2VsZjo6TG9hZFJhbmRUaXRsZVNlcVN0YXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRjdXJGaWxlSWR4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJHN0YXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNmID0gaXNzZXQoJHN0YXRlWydmaWxlJ10pID8gKHN0cmluZykkc3RhdGVbJ2ZpbGUnXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHNsID0gaXNzZXQoJHN0YXRlWydsaW5lJ10pID8gaW50dmFsKCRzdGF0ZVsnbGluZSddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNsIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRzbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHNmICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRmaWxlTGlzdCBhcyAkaSA9PiAkaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJpbmcpJGl0WyduYW1lJ10gPT09ICRzZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckZpbGVJZHggPSAkaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heCA9IGlzc2V0KCRmaWxlTGlzdFskY3VyRmlsZUlkeF1bJ21heCddKSA/IGludHZhbCgkZmlsZUxpc3RbJGN1ckZpbGVJZHhdWydtYXgnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRzbCA+ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkc2wgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAkc2w7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFlbXB0eSgkZmlsZUxpc3QpKSB7CiAgICAgICAgICAgICRuID0gY291bnQoJGZpbGVMaXN0KTsKICAgICAgICAgICAgJHRyaWVzID0gMDsKICAgICAgICAgICAgd2hpbGUgKCR0cmllcyA8ICgkbiAqIDIpKSB7CiAgICAgICAgICAgICAgICAkaXQgPSAkZmlsZUxpc3RbJGN1ckZpbGVJZHhdOwogICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRpdFsncGF0aCddOwogICAgICAgICAgICAgICAgJG1heCA9IGlzc2V0KCRpdFsnbWF4J10pID8gaW50dmFsKCRpdFsnbWF4J10pIDogMDsKICAgICAgICAgICAgICAgIGlmICgkY3VyTGluZSA+ICRtYXgpIHsKICAgICAgICAgICAgICAgICAgICAkY3VyRmlsZUlkeCA9ICgkY3VyRmlsZUlkeCArIDEpICUgJG47CiAgICAgICAgICAgICAgICAgICAgJGN1ckxpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgICR0cmllcysrOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkZnAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcGF0aCwgJ3JiJyk7CiAgICAgICAgICAgICAgICAgICAgJGZwLT5zZWVrKCRjdXJMaW5lKTsKICAgICAgICAgICAgICAgICAgICAkc3MgPSB0cmltKChzdHJpbmcpJGZwLT5jdXJyZW50KCkpOwogICAgICAgICAgICAgICAgICAgICRuZXh0RmlsZUlkeCA9ICRjdXJGaWxlSWR4OwogICAgICAgICAgICAgICAgICAgICRuZXh0TGluZSA9ICRjdXJMaW5lICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAoJG5leHRMaW5lID4gJG1heCkgewogICAgICAgICAgICAgICAgICAgICAgICAkbmV4dEZpbGVJZHggPSAoJGN1ckZpbGVJZHggKyAxKSAlICRuOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV4dExpbmUgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkY3VyTGluZSA9ICRuZXh0TGluZTsKICAgICAgICAgICAgICAgICAgICAkY3VyRmlsZUlkeCA9ICRuZXh0RmlsZUlkeDsKICAgICAgICAgICAgICAgICAgICAkc2F2ZWQgPSBzZWxmOjpTYXZlUmFuZFRpdGxlU2VxU3RhdGUoKHN0cmluZykkZmlsZUxpc3RbJG5leHRGaWxlSWR4XVsnbmFtZSddLCAkbmV4dExpbmUsICRzdGF0ZUZwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJHNzICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAkb3V0VGl0bGUgPSAkc3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdHJpZXMrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoISRzYXZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCRqID0gMDsgJGogPCAyNTsgJGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJpZCA9IG10X3JhbmQoMCwgJG4gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyaXQgPSAkZmlsZUxpc3RbJHJpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnBhdGggPSAoc3RyaW5nKSRyaXRbJ3BhdGgnXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRybWF4ID0gaXNzZXQoJHJpdFsnbWF4J10pID8gaW50dmFsKCRyaXRbJ21heCddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJtYXggPD0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHJsaW5lID0gbXRfcmFuZCgwLCAkcm1heCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZnAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcnBhdGgsICdyYicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZnAtPnNlZWsoJHJsaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcnMgPSB0cmltKChzdHJpbmcpJHJmcC0+Y3VycmVudCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHJzICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0VGl0bGUgPSAkcnM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkb3V0VGl0bGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICRjdXJGaWxlSWR4ID0gKCRjdXJGaWxlSWR4ICsgMSkgJSAkbjsKICAgICAgICAgICAgICAgICAgICAkY3VyTGluZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJHRyaWVzKys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJG91dFRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkc3RhdGVGcCkgewogICAgICAgICAgICBAZmxvY2soJHN0YXRlRnAsIExPQ0tfVU4pOwogICAgICAgICAgICBAZmNsb3NlKCRzdGF0ZUZwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXRUaXRsZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kb21UeHRUaXRsZSgkbWF4QXR0ZW1wdHMgPSAzMCkKICAgIHsKICAgICAgICBzdGF0aWMgJGluaXRlZCA9IDA7CiAgICAgICAgc3RhdGljICRmaWxlTGlzdCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCEkaW5pdGVkKSB7CiAgICAgICAgICAgICRpbml0ZWQgPSAxOwogICAgICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgICAgICBpZiAoaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgICAgICAkZCA9IHNjYW5kaXIoJGRpcik7CiAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGQpICYmIGNvdW50KCRkKSA+IDIpIHsKICAgICAgICAgICAgICAgICAgICAkZmlsZXMgPSBhcnJheSgpOwogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkIGFzICRmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZiA9PT0gJy4nIHx8ICRmID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkZiwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICd0eHQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkcGF0aCA9ICRkaXIgLiAkZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNeJyAuIHByZWdfcXVvdGUoKHN0cmluZylDeXFpeWV6aGFuKCdjc3JmVG9rZW4nKSwgJyMnKSAuICdcXyhcZCspXF8jaScsICRmLCAkdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IGludHZhbCgkdFsxXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0bXAgPSBuZXcgU3BsRmlsZU9iamVjdCgkcGF0aCwgJ3JiJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRtcC0+c2VlayhQSFBfSU5UX01BWCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1heEluZGV4ID0gaW50dmFsKCR0bXAtPmtleSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRtYXhJbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRtYXhJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVzW10gPSBhcnJheSgncGF0aCcgPT4gJHBhdGgsICduYW1lJyA9PiBiYXNlbmFtZSgkcGF0aCksICdtYXgnID0+ICRtYXhJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGZpbGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICB1c29ydCgkZmlsZXMsIGZ1bmN0aW9uICgkYSwgJGIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJuYXRjYXNlY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgJGZpbGVMaXN0ID0gJGZpbGVzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZW1wdHkoJGZpbGVMaXN0KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRtYXhBdHRlbXB0cyA9IGludHZhbCgkbWF4QXR0ZW1wdHMpOwogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPCAxKSB7CiAgICAgICAgICAgICRtYXhBdHRlbXB0cyA9IDE7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4QXR0ZW1wdHMgPiAyMDApIHsKICAgICAgICAgICAgJG1heEF0dGVtcHRzID0gMjAwOwogICAgICAgIH0KICAgICAgICAkbiA9IGNvdW50KCRmaWxlTGlzdCk7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heEF0dGVtcHRzOyAkaSsrKSB7CiAgICAgICAgICAgICRpZHggPSBtdF9yYW5kKDAsICRuIC0gMSk7CiAgICAgICAgICAgICRpdCA9ICRmaWxlTGlzdFskaWR4XTsKICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRpdFsncGF0aCddOwogICAgICAgICAgICAkbWF4ID0gaXNzZXQoJGl0WydtYXgnXSkgPyBpbnR2YWwoJGl0WydtYXgnXSkgOiAwOwogICAgICAgICAgICBpZiAoJG1heCA8IDApIHsKICAgICAgICAgICAgICAgICRtYXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lID0gJG1heCA+IDAgPyBtdF9yYW5kKDAsICRtYXgpIDogMDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICRmcCA9IG5ldyBTcGxGaWxlT2JqZWN0KCRwYXRoLCAncmInKTsKICAgICAgICAgICAgICAgICRmcC0+c2VlaygkbGluZSk7CiAgICAgICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkZnAtPmN1cnJlbnQoKSk7CiAgICAgICAgICAgICAgICBpZiAoJHQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZFRpdGxlU2VxU3RhdGVGaWxlKCkKICAgIHsKICAgICAgICAkZGlyID0gc2VsZjo6R2V0Q2FjaGVEaXIoKTsKICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGRpciAuICdyYW5kdGl0bGVfc2VxX3N0YXRlLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRSYW5kVGl0bGVTZXFTdGF0ZSgkZnAgPSBudWxsKQogICAgewogICAgICAgIGlmICgkZnApIHsKICAgICAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgICAgICAkcmF3ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwKTsKICAgICAgICAgICAgaWYgKCEkcmF3KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZm4gPSBpc3NldCgkZGVjb2RlZFsnZmlsZSddKSA/IChzdHJpbmcpJGRlY29kZWRbJ2ZpbGUnXSA6ICcnOwogICAgICAgICAgICAkbGluZSA9IGlzc2V0KCRkZWNvZGVkWydsaW5lJ10pID8gaW50dmFsKCRkZWNvZGVkWydsaW5lJ10pIDogMDsKICAgICAgICAgICAgaWYgKCRsaW5lIDwgMCkgewogICAgICAgICAgICAgICAgJGxpbmUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJGZuLCAnbGluZScgPT4gJGxpbmUpOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVNlcVN0YXRlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAncmInKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRsb2NrZWQgPSBAZmxvY2soJGZwLCBMT0NLX1NIKTsKICAgICAgICBpZiAoISRsb2NrZWQpIHsKICAgICAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ2ZpbGUnID0+ICcnLCAnbGluZScgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRyYXcgPSBAc3RyZWFtX2dldF9jb250ZW50cygkZnApOwogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICBpZiAoISRyYXcpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdmaWxlJyA9PiAnJywgJ2xpbmUnID0+IDApOwogICAgICAgIH0KICAgICAgICAkZGVjb2RlZCA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGRlY29kZWQpKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnZmlsZScgPT4gJycsICdsaW5lJyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGZuID0gaXNzZXQoJGRlY29kZWRbJ2ZpbGUnXSkgPyAoc3RyaW5nKSRkZWNvZGVkWydmaWxlJ10gOiAnJzsKICAgICAgICAkbGluZSA9IGlzc2V0KCRkZWNvZGVkWydsaW5lJ10pID8gaW50dmFsKCRkZWNvZGVkWydsaW5lJ10pIDogMDsKICAgICAgICBpZiAoJGxpbmUgPCAwKSB7CiAgICAgICAgICAgICRsaW5lID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5KCdmaWxlJyA9PiAkZm4sICdsaW5lJyA9PiAkbGluZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVJhbmRUaXRsZVNlcVN0YXRlKCRmaWxlTmFtZSwgJGxpbmUsICRmcCA9IG51bGwpCiAgICB7CiAgICAgICAgaWYgKCRmcCkgewogICAgICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZShhcnJheSgnZmlsZScgPT4gKHN0cmluZykkZmlsZU5hbWUsICdsaW5lJyA9PiBpbnR2YWwoJGxpbmUpLCAndHMnID0+IHRpbWUoKSksIEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwogICAgICAgICAgICBpZiAoJG91dCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIEBmdHJ1bmNhdGUoJGZwLCAwKTsKICAgICAgICAgICAgICAgIEBmd3JpdGUoJGZwLCAkb3V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKCRvdXQgIT09IGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRSYW5kVGl0bGVTZXFTdGF0ZUZpbGUoKTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKGFycmF5KCdmaWxlJyA9PiAoc3RyaW5nKSRmaWxlTmFtZSwgJ2xpbmUnID0+IGludHZhbCgkbGluZSksICd0cycgPT4gdGltZSgpKSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgaWYgKCRvdXQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIEBmdHJ1bmNhdGUoJGZwLCAwKTsKICAgICAgICAgICAgQGZ3cml0ZSgkZnAsICRvdXQpOwogICAgICAgIH0KICAgICAgICBAZmxvY2soJGZwLCBMT0NLX1VOKTsKICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgcmV0dXJuICgkb3V0ICE9PSBmYWxzZSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSGFzVHh0U291cmNlKCkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vY2lrdS8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGQgPSBzY2FuZGlyKCRkaXIpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGQpIHx8IGNvdW50KCRkKSA8PSAyKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGQgYXMgJGYpIHsKICAgICAgICAgICAgaWYgKCRmID09PSAnLicgfHwgJGYgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRmLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ3R4dCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kVGl0bGUoKQogICAgewogICAgICAgICRob3N0T25seSA9ICcnOwogICAgICAgIGlmIChpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IChzdHJpbmcpJF9TRVJWRVJbJ0hUVFBfSE9TVCddOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICBpZiAoaXNfb2JqZWN0KCR6YnApICYmIGlzc2V0KCR6YnAtPmhvc3QpKSB7CiAgICAgICAgICAgICAgICAkaCA9IHBhcnNlX3VybCgoc3RyaW5nKSR6YnAtPmhvc3QsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICAgICBpZiAoJGgpIHsKICAgICAgICAgICAgICAgICAgICAkaG9zdE9ubHkgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKCiAgICAgICAgJHQgPSAkaG9zdE9ubHkgIT09ICcnID8gc2VsZjo6R2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRSZWNvcmRQb29sKCRob3N0T25seSkgOiAnJzsKICAgICAgICBpZiAoJHQgIT09ICcnICYmICFzZWxmOjpJc0JhZFRpdGxlKCR0KSkgewogICAgICAgICAgICBzZWxmOjpSZW1lbWJlclJhbmRUaXRsZSgkdCk7CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgJHQgPSBzZWxmOjpHZXRSYW5kb21UaXRsZUZyb21GaXhlZFJlY29yZFBvb2woJycpOwogICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHNlbGY6OlJlbWVtYmVyUmFuZFRpdGxlKCR0KTsKICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgIH0KCiAgICAgICAgJHQgPSBzZWxmOjpHZXRSYW5kb21UaXRsZUZyb21SZWNlbnRDYWNoZSgpOwogICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CgogICAgICAgICR0ID0gc2VsZjo6R2V0VW5pcXVlVGl0bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6R2V0VHh0KCk7CiAgICAgICAgfSwgJ+maj+acuuagh+mimCcsIDEyMCwgMTIsIDgwKTsKICAgICAgICBpZiAoJHQgIT09ICcnICYmICRob3N0T25seSAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgIHNlbGY6OlJlZ2lzdGVyUmFuZFRpdGxlUG9vbEl0ZW0oJGhvc3RPbmx5LCAkdCk7CiAgICAgICAgfQogICAgICAgIGlmICgkdCA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdCkpIHsKICAgICAgICAgICAgcmV0dXJuICfpmo/mnLrmoIfpopgnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmVnaXN0ZXJSYW5kVGl0bGVQb29sSXRlbSgkaG9zdE9ubHksICR0aXRsZSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkaG9zdE9ubHkgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgoc3RyaW5nKSRob3N0T25seSk7CiAgICAgICAgaWYgKCRob3N0T25seSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBzZWxmOjpJbnNlcnRUaXRsZVBvb2xJdGVtKCRob3N0T25seSwgJHRpdGxlLCB0aW1lKCkpOwogICAgICAgIHVuc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50WyRob3N0T25seV0pOwogICAgICAgIHVuc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50VGltZVskaG9zdE9ubHldKTsKICAgICAgICB1bnNldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFsnKiddKTsKICAgICAgICB1bnNldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFRpbWVbJyonXSk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRSZWNvcmRQb29sKCRob3N0T25seSA9ICcnKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHRyaW0oKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRob3N0T25seSk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgIHNlbGY6OkVuc3VyZVRpdGxlUG9vbFRhYmxlKCk7CiAgICAgICAgJHR0bCA9IGludHZhbChDeXFpeWV6aGFuKCdyYW5kdHRsJywgNjApKTsKICAgICAgICBpZiAoJHR0bCA8IDApIHsKICAgICAgICAgICAgJHR0bCA9IDA7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJGNhY2hlS2V5ID0gKCRob3N0T25seSAhPT0gJycpID8gJGhvc3RPbmx5IDogJyonOwogICAgICAgIGlmICghaXNzZXQoc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRbJGNhY2hlS2V5XSkgfHwgIWlzc2V0KHNlbGY6OiRmaXhlZFRpdGxlUG9vbENvdW50VGltZVskY2FjaGVLZXldKSB8fCAoJHR0bCAmJiAoJG5vdyAtIGludHZhbChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFRpbWVbJGNhY2hlS2V5XSkpID4gJHR0bCkpIHsKICAgICAgICAgICAgJGZpeGVkQ291bnQgPSAwOwogICAgICAgICAgICAkcG9vbENvdW50ID0gMDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRkYzEgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBDT1VOVCgxKSBBUyBjIEZST00gYCR0YWJsZUZpeGVkYCBXSEVSRSBgZnRfSG9zdGA9JyRob3N0RXNjJyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGMxID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVGaXhlZGAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRmaXhlZENvdW50ID0gKCFlbXB0eSgkZGMxKSAmJiBpc3NldCgkZGMxWzBdWydjJ10pKSA/IGludHZhbCgkZGMxWzBdWydjJ10pIDogMDsKICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZVBvb2wgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl90aXRsZXBvb2wnOwogICAgICAgICAgICAgICAgaWYgKCRob3N0T25seSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkaG9zdEVzYyA9ICR6YnAtPmRiLT5Fc2NhcGVTdHJpbmcoJGhvc3RPbmx5KTsKICAgICAgICAgICAgICAgICAgICAkZGMyID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVQb29sYCBXSEVSRSBgdHBfSG9zdGA9JyRob3N0RXNjJyIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkZGMyID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVQb29sYCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9ICghZW1wdHkoJGRjMikgJiYgaXNzZXQoJGRjMlswXVsnYyddKSkgPyBpbnR2YWwoJGRjMlswXVsnYyddKSA6IDA7CiAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRmaXhlZENvdW50IDwgMCkgewogICAgICAgICAgICAgICAgJGZpeGVkQ291bnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkcG9vbENvdW50IDwgMCkgewogICAgICAgICAgICAgICAgJHBvb2xDb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRbJGNhY2hlS2V5XSA9ICRmaXhlZENvdW50ICsgJHBvb2xDb3VudDsKICAgICAgICAgICAgc2VsZjo6JGZpeGVkVGl0bGVQb29sQ291bnRUaW1lWyRjYWNoZUtleV0gPSAkbm93OwogICAgICAgIH0KICAgICAgICAkY291bnQgPSBpc3NldChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFskY2FjaGVLZXldKSA/IGludHZhbChzZWxmOjokZml4ZWRUaXRsZVBvb2xDb3VudFskY2FjaGVLZXldKSA6IDA7CiAgICAgICAgaWYgKCRjb3VudCA8PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgJHNlcSA9IHNlbGY6OkxvYWRQb29sU2VxU3RhdGUoJGNhY2hlS2V5KTsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNlcSkgJiYgaXNzZXQoJHNlcVsnb2Zmc2V0J10pKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSBpbnR2YWwoJHNlcVsnb2Zmc2V0J10pOwogICAgICAgIH0KICAgICAgICBpZiAoJG9mZnNldCA8IDApIHsKICAgICAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkb2Zmc2V0ID49ICRjb3VudCkgewogICAgICAgICAgICAkb2Zmc2V0ID0gMDsKICAgICAgICB9CiAgICAgICAgJG5leHRPZmZzZXQgPSAoJG9mZnNldCArIDEpOwogICAgICAgIGlmICgkbmV4dE9mZnNldCA+PSAkY291bnQpIHsKICAgICAgICAgICAgJG5leHRPZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBzZWxmOjpTYXZlUG9vbFNlcVN0YXRlKCRjYWNoZUtleSwgJG5leHRPZmZzZXQpOwoKICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgJHRhYmxlRml4ZWQgPSAkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbl9maXhlZHRpdGxlJzsKICAgICAgICAgICAgaWYgKCRob3N0T25seSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgJGRjMSA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJHRhYmxlRml4ZWRgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkZGMxID0gJHpicC0+ZGItPlF1ZXJ5KCJTRUxFQ1QgQ09VTlQoMSkgQVMgYyBGUk9NIGAkdGFibGVGaXhlZGAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkZml4ZWRDb3VudCA9ICghZW1wdHkoJGRjMSkgJiYgaXNzZXQoJGRjMVswXVsnYyddKSkgPyBpbnR2YWwoJGRjMVswXVsnYyddKSA6IDA7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICRmaXhlZENvdW50ID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCRmaXhlZENvdW50IDwgMCkgewogICAgICAgICAgICAkZml4ZWRDb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkb2Zmc2V0IDwgJGZpeGVkQ291bnQpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICR0YWJsZUZpeGVkID0gJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW5fZml4ZWR0aXRsZSc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlRml4ZWRgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlRml4ZWRgIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgICR0ID0gKCFlbXB0eSgkZCkgJiYgaXNzZXQoJGRbMF1bJ2Z0X1RpdGxlJ10pKSA/IHRyaW0oKHN0cmluZykkZFswXVsnZnRfVGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRvZmYyID0gJG9mZnNldCAtICRmaXhlZENvdW50OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgJHRhYmxlUG9vbCA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX3RpdGxlcG9vbCc7CiAgICAgICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRob3N0RXNjID0gJHpicC0+ZGItPkVzY2FwZVN0cmluZygkaG9zdE9ubHkpOwogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGB0cF9UaXRsZWAgRlJPTSBgJHRhYmxlUG9vbGAgV0hFUkUgYHRwX0hvc3RgPSckaG9zdEVzYycgT1JERVIgQlkgYHRwX0lEYCBBU0MgTElNSVQgMSBPRkZTRVQgIiAuIGludHZhbCgkb2ZmMik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGB0cF9UaXRsZWAgRlJPTSBgJHRhYmxlUG9vbGAgT1JERVIgQlkgYHRwX0lEYCBBU0MgTElNSVQgMSBPRkZTRVQgIiAuIGludHZhbCgkb2ZmMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgICAgICR0ID0gKCFlbXB0eSgkZCkgJiYgaXNzZXQoJGRbMF1bJ3RwX1RpdGxlJ10pKSA/IHRyaW0oKHN0cmluZykkZFswXVsndHBfVGl0bGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tRml4ZWRUaXRsZVRhYmxlKCRob3N0T25seSA9ICcnKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRob3N0T25seSA9IHRyaW0oKHN0cmluZykkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRob3N0T25seSk7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkVuc3VyZUZpeGVkVGl0bGVUYWJsZSgpOwogICAgICAgICR0YWJsZSA9ICR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuX2ZpeGVkdGl0bGUnOwogICAgICAgICRjYWNoZUtleSA9ICdmdF8nIC4gKCgkaG9zdE9ubHkgIT09ICcnKSA/ICRob3N0T25seSA6ICcqJyk7CiAgICAgICAgJGNvdW50ID0gMDsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgICAgICAgICAkZGMgPSAkemJwLT5kYi0+UXVlcnkoIlNFTEVDVCBDT1VOVCgxKSBBUyBjIEZST00gYCR0YWJsZWAgV0hFUkUgYGZ0X0hvc3RgPSckaG9zdEVzYyciKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkYyA9ICR6YnAtPmRiLT5RdWVyeSgiU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJHRhYmxlYCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjb3VudCA9ICghZW1wdHkoJGRjKSAmJiBpc3NldCgkZGNbMF1bJ2MnXSkpID8gaW50dmFsKCRkY1swXVsnYyddKSA6IDA7CiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uICRlKSB7CiAgICAgICAgICAgICRjb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkY291bnQgPD0gMCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgICRzZXEgPSBzZWxmOjpMb2FkUG9vbFNlcVN0YXRlKCRjYWNoZUtleSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRzZXEpICYmIGlzc2V0KCRzZXFbJ29mZnNldCddKSkgewogICAgICAgICAgICAkb2Zmc2V0ID0gaW50dmFsKCRzZXFbJ29mZnNldCddKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRvZmZzZXQgPCAwKSB7CiAgICAgICAgICAgICRvZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoJG9mZnNldCA+PSAkY291bnQpIHsKICAgICAgICAgICAgJG9mZnNldCA9IDA7CiAgICAgICAgfQogICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDU7ICRpKyspIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3RFc2MgPSAkemJwLT5kYi0+RXNjYXBlU3RyaW5nKCRob3N0T25seSk7CiAgICAgICAgICAgICAgICAgICAgJHNxbCA9ICJTRUxFQ1QgYGZ0X1RpdGxlYCBGUk9NIGAkdGFibGVgIFdIRVJFIGBmdF9Ib3N0YD0nJGhvc3RFc2MnIE9SREVSIEJZIGBmdF9JRGAgQVNDIExJTUlUIDEgT0ZGU0VUICIgLiBpbnR2YWwoJG9mZnNldCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRzcWwgPSAiU0VMRUNUIGBmdF9UaXRsZWAgRlJPTSBgJHRhYmxlYCBPUkRFUiBCWSBgZnRfSURgIEFTQyBMSU1JVCAxIE9GRlNFVCAiIC4gaW50dmFsKCRvZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGQgPSAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgICAgICAgICAkdCA9ICghZW1wdHkoJGQpICYmIGlzc2V0KCRkWzBdWydmdF9UaXRsZSddKSkgPyB0cmltKChzdHJpbmcpJGRbMF1bJ2Z0X1RpdGxlJ10pIDogJyc7CiAgICAgICAgICAgICAgICAkbmV4dE9mZnNldCA9ICgkb2Zmc2V0ICsgMSk7CiAgICAgICAgICAgICAgICBpZiAoJG5leHRPZmZzZXQgPj0gJGNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgJG5leHRPZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZjo6U2F2ZVBvb2xTZXFTdGF0ZSgkY2FjaGVLZXksICRuZXh0T2Zmc2V0KTsKICAgICAgICAgICAgICAgICRvZmZzZXQgPSAkbmV4dE9mZnNldDsKICAgICAgICAgICAgICAgIGlmICgkdCAhPT0gJycgJiYgIXNlbGY6OklzQmFkVGl0bGUoJHQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gJGUpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRSYW5kVGl0bGVQb29sU2VxU3RhdGVGaWxlKCRrZXkpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGlkID0gbWQ1KChzdHJpbmcpJGtleSk7CiAgICAgICAgcmV0dXJuICRkaXIgLiAncmFuZHRpdGxlX3Bvb2xfc2VxXycgLiAkaWQgLiAnLmpzb24nOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIExvYWRQb29sU2VxU3RhdGUoJGtleSkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZVBvb2xTZXFTdGF0ZUZpbGUoJGtleSk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvZmZzZXQnID0+IDApOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdyYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2Zmc2V0JyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBhcnJheSgnb2Zmc2V0JyA9PiAwKTsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm4gYXJyYXkoJ29mZnNldCcgPT4gMCk7CiAgICAgICAgfQogICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkgfHwgIWlzc2V0KCRkZWNvZGVkWydvZmZzZXQnXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdvZmZzZXQnID0+IDApOwogICAgICAgIH0KICAgICAgICAkb2ZmID0gaW50dmFsKCRkZWNvZGVkWydvZmZzZXQnXSk7CiAgICAgICAgaWYgKCRvZmYgPCAwKSB7CiAgICAgICAgICAgICRvZmYgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYXJyYXkoJ29mZnNldCcgPT4gJG9mZik7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gU2F2ZVBvb2xTZXFTdGF0ZSgka2V5LCAkb2Zmc2V0KQogICAgewogICAgICAgICRmaWxlID0gc2VsZjo6R2V0UmFuZFRpdGxlUG9vbFNlcVN0YXRlRmlsZSgka2V5KTsKICAgICAgICBpZiAoJGZpbGUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKGFycmF5KCdvZmZzZXQnID0+IGludHZhbCgkb2Zmc2V0KSwgJ3RzJyA9PiB0aW1lKCkpLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICBpZiAoJG91dCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgICAgICBAZndyaXRlKCRmcCwgJG91dCk7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBSZW1lbWJlclJhbmRUaXRsZSgkdGl0bGUsICR0cyA9IDApCiAgICB7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkdHMgPSBpbnR2YWwoJHRzKTsKICAgICAgICBpZiAoJHRzIDw9IDApIHsKICAgICAgICAgICAgJHRzID0gdGltZSgpOwogICAgICAgIH0KICAgICAgICBzZWxmOjpMb2FkUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50ID0gYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc3NldChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0aXRsZV0pIHx8IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0aXRsZV0pIDwgJHRzKSB7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRpdGxlXSA9ICR0czsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMTsKICAgICAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgICAgIGlmICghc2VsZjo6JHJhbmRUaXRsZVJlY2VudFNodXRkb3duUmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFNodXRkb3duUmVnaXN0ZXJlZCA9IDE7CiAgICAgICAgICAgICAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihhcnJheSgnQ3lxaXllemhhbl9jb3JlJywgJ0ZsdXNoUmFuZFRpdGxlUmVjZW50JykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJhbmRvbVRpdGxlRnJvbVJlY2VudENhY2hlKCkKICAgIHsKICAgICAgICBzZWxmOjpMb2FkUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CiAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSB8fCBlbXB0eShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRrZXlzID0gYXJyYXlfa2V5cyhzZWxmOjokcmFuZFRpdGxlUmVjZW50KTsKICAgICAgICBpZiAoZW1wdHkoJGtleXMpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJHBpY2tlZCA9ICRrZXlzW2FycmF5X3JhbmQoJGtleXMpXTsKICAgICAgICByZXR1cm4gdHJpbSgoc3RyaW5nKSRwaWNrZWQpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFJhbmRUaXRsZUNhY2hlRmlsZSgpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkaXIgLiAncmFuZHRpdGxlX3JlY2VudC5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKQogICAgewogICAgICAgIGlmICghaXNfYXJyYXkoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCkpIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJHdpbmRvdyA9IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50V2luZG93KTsKICAgICAgICBpZiAoJHdpbmRvdyA8IDApIHsKICAgICAgICAgICAgJHdpbmRvdyA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkd2luZG93ID4gMCkgewogICAgICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAgICAgJHRzID0gaW50dmFsKCR0cyk7CiAgICAgICAgICAgICAgICBpZiAoJHRzIDw9IDAgfHwgKCRub3cgLSAkdHMpID4gJHdpbmRvdykgewogICAgICAgICAgICAgICAgICAgIHVuc2V0KHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRdKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0gPSAkdHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0gPSBpbnR2YWwoJHRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAka2VlcCA9IGludHZhbChzZWxmOjokcmFuZFRpdGxlUmVjZW50S2VlcCk7CiAgICAgICAgaWYgKCRrZWVwIDwgMSkgewogICAgICAgICAgICAka2VlcCA9IDE7CiAgICAgICAgfQogICAgICAgIGlmIChjb3VudChzZWxmOjokcmFuZFRpdGxlUmVjZW50KSA+ICRrZWVwKSB7CiAgICAgICAgICAgIGFyc29ydChzZWxmOjokcmFuZFRpdGxlUmVjZW50LCBTT1JUX05VTUVSSUMpOwogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50ID0gYXJyYXlfc2xpY2Uoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCwgMCwgJGtlZXAsIHRydWUpOwogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBMb2FkUmFuZFRpdGxlUmVjZW50KCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQgPSBhcnJheSgpOwogICAgICAgICRmaWxlID0gc2VsZjo6R2V0UmFuZFRpdGxlQ2FjaGVGaWxlKCk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdyYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgICRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKCFpc19hcnJheSgkZGVjb2RlZCkgfHwgIWlzc2V0KCRkZWNvZGVkWydpdGVtcyddKSB8fCAhaXNfYXJyYXkoJGRlY29kZWRbJ2l0ZW1zJ10pKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yZWFjaCAoJGRlY29kZWRbJ2l0ZW1zJ10gYXMgJGl0KSB7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGl0KSB8fCAhaXNzZXQoJGl0Wyd0J10pKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkaXRbJ3QnXSk7CiAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0cyA9IGlzc2V0KCRpdFsndHMnXSkgPyBpbnR2YWwoJGl0Wyd0cyddKSA6IDA7CiAgICAgICAgICAgIGlmICgkdHMgPD0gMCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc3NldChzZWxmOjokcmFuZFRpdGxlUmVjZW50WyR0XSkgfHwgJHRzID4gc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskdF0pIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRbJHRdID0gJHRzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNlbGY6Ok5vcm1hbGl6ZVJhbmRUaXRsZVJlY2VudCgpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEZsdXNoUmFuZFRpdGxlUmVjZW50KCkKICAgIHsKICAgICAgICBpZiAoIXNlbGY6OiRyYW5kVGl0bGVSZWNlbnREaXJ0eSB8fCAhaXNfYXJyYXkoc2VsZjo6JHJhbmRUaXRsZVJlY2VudCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZUNhY2hlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzZWxmOjpOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKTsKCiAgICAgICAgJGZwID0gQGZvcGVuKCRmaWxlLCAnYytiJyk7CiAgICAgICAgaWYgKCEkZnApIHsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudERpcnR5ID0gMDsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgJG1lcmdlZCA9IGlzX2FycmF5KHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQpID8gc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA6IGFycmF5KCk7CiAgICAgICAgaWYgKCRyYXcpIHsKICAgICAgICAgICAgJGRlY29kZWQgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRkZWNvZGVkKSAmJiBpc3NldCgkZGVjb2RlZFsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGRlY29kZWRbJ2l0ZW1zJ10pKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkZGVjb2RlZFsnaXRlbXMnXSBhcyAkaXQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdCkgfHwgIWlzc2V0KCRpdFsndCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJHQgPSB0cmltKChzdHJpbmcpJGl0Wyd0J10pOwogICAgICAgICAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICR0cyA9IGlzc2V0KCRpdFsndHMnXSkgPyBpbnR2YWwoJGl0Wyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR0cyA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRtZXJnZWRbJHRdKSB8fCAkdHMgPiAkbWVyZ2VkWyR0XSkgewogICAgICAgICAgICAgICAgICAgICAgICAkbWVyZ2VkWyR0XSA9ICR0czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9ICRtZXJnZWQ7CiAgICAgICAgc2VsZjo6Tm9ybWFsaXplUmFuZFRpdGxlUmVjZW50KCk7CgogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoIChzZWxmOjokcmFuZFRpdGxlUmVjZW50IGFzICR0ID0+ICR0cykgewogICAgICAgICAgICAkaXRlbXNbXSA9IGFycmF5KCd0JyA9PiAkdCwgJ3RzJyA9PiBpbnR2YWwoJHRzKSk7CiAgICAgICAgfQogICAgICAgICRvdXQgPSBqc29uX2VuY29kZShhcnJheSgndHMnID0+ICRub3csICdpdGVtcycgPT4gJGl0ZW1zKSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgaWYgKCRvdXQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgICAgICBAZndyaXRlKCRmcCwgJG91dCk7CiAgICAgICAgfQogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50RGlydHkgPSAwOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFVuaXF1ZVRpdGxlKCRnZW5lcmF0b3IsICRmYWxsYmFjayA9ICfpmo/mnLrmoIfpopgnLCAkd2luZG93U2Vjb25kcyA9IDEyMCwgJG1heEF0dGVtcHRzID0gMTAsICRtYXhLZWVwID0gODApCiAgICB7CiAgICAgICAgJGZhbGxiYWNrID0gKHN0cmluZykkZmFsbGJhY2s7CiAgICAgICAgJHdpbmRvd1NlY29uZHMgPSBpbnR2YWwoJHdpbmRvd1NlY29uZHMpOwogICAgICAgIGlmICgkd2luZG93U2Vjb25kcyA8IDApIHsKICAgICAgICAgICAgJHdpbmRvd1NlY29uZHMgPSAwOwogICAgICAgIH0KICAgICAgICAkbWF4QXR0ZW1wdHMgPSBpbnR2YWwoJG1heEF0dGVtcHRzKTsKICAgICAgICBpZiAoJG1heEF0dGVtcHRzIDwgMSkgewogICAgICAgICAgICAkbWF4QXR0ZW1wdHMgPSAxOwogICAgICAgIH0KICAgICAgICAkbWF4S2VlcCA9IGludHZhbCgkbWF4S2VlcCk7CiAgICAgICAgaWYgKCRtYXhLZWVwIDwgMSkgewogICAgICAgICAgICAkbWF4S2VlcCA9IDE7CiAgICAgICAgfQoKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFJhbmRUaXRsZUNhY2hlRmlsZSgpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgJHQgPSBpc19jYWxsYWJsZSgkZ2VuZXJhdG9yKSA/IGNhbGxfdXNlcl9mdW5jKCRnZW5lcmF0b3IpIDogJyc7CiAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKSR0KTsKICAgICAgICAgICAgcmV0dXJuICR0ICE9PSAnJyA/ICR0IDogJGZhbGxiYWNrOwogICAgICAgIH0KCiAgICAgICAgaWYgKCR3aW5kb3dTZWNvbmRzID4gc2VsZjo6JHJhbmRUaXRsZVJlY2VudFdpbmRvdykgewogICAgICAgICAgICBzZWxmOjokcmFuZFRpdGxlUmVjZW50V2luZG93ID0gJHdpbmRvd1NlY29uZHM7CiAgICAgICAgfQogICAgICAgIGlmICgkbWF4S2VlcCA+IHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRLZWVwKSB7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRLZWVwID0gJG1heEtlZXA7CiAgICAgICAgfQogICAgICAgIHNlbGY6OkxvYWRSYW5kVGl0bGVSZWNlbnQoKTsKICAgICAgICBzZWxmOjpOb3JtYWxpemVSYW5kVGl0bGVSZWNlbnQoKTsKICAgICAgICAkbm93ID0gdGltZSgpOwogICAgICAgICRyZWNlbnQgPSBpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSA/IHNlbGY6OiRyYW5kVGl0bGVSZWNlbnQgOiBhcnJheSgpOwoKICAgICAgICAkY2hvc2VuID0gJyc7CiAgICAgICAgJGZpcnN0ID0gJyc7CiAgICAgICAgaWYgKGlzX2NhbGxhYmxlKCRnZW5lcmF0b3IpKSB7CiAgICAgICAgICAgIGZvciAoJGkgPSAwOyAkaSA8ICRtYXhBdHRlbXB0czsgJGkrKykgewogICAgICAgICAgICAgICAgJHQgPSBjYWxsX3VzZXJfZnVuYygkZ2VuZXJhdG9yKTsKICAgICAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKSR0KTsKICAgICAgICAgICAgICAgIGlmICgkdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkZmlyc3QgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGZpcnN0ID0gJHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWlzc2V0KCRyZWNlbnRbJHRdKSkgewogICAgICAgICAgICAgICAgICAgICRjaG9zZW4gPSAkdDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGNob3NlbiA9PT0gJycpIHsKICAgICAgICAgICAgJGNob3NlbiA9ICRmaXJzdCAhPT0gJycgPyAkZmlyc3QgOiAkZmFsbGJhY2s7CiAgICAgICAgfQoKICAgICAgICBpZiAoJGNob3NlbiAhPT0gJycpIHsKICAgICAgICAgICAgaWYgKCFpc19hcnJheShzZWxmOjokcmFuZFRpdGxlUmVjZW50KSkgewogICAgICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudCA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZjo6JHJhbmRUaXRsZVJlY2VudFskY2hvc2VuXSA9ICRub3c7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnREaXJ0eSA9IDE7CiAgICAgICAgICAgIHNlbGY6Ok5vcm1hbGl6ZVJhbmRUaXRsZVJlY2VudCgpOwogICAgICAgICAgICBpZiAoIXNlbGY6OiRyYW5kVGl0bGVSZWNlbnRTaHV0ZG93blJlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRyYW5kVGl0bGVSZWNlbnRTaHV0ZG93blJlZ2lzdGVyZWQgPSAxOwogICAgICAgICAgICAgICAgcmVnaXN0ZXJfc2h1dGRvd25fZnVuY3Rpb24oYXJyYXkoJ0N5cWl5ZXpoYW5fY29yZScsICdGbHVzaFJhbmRUaXRsZVJlY2VudCcpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNob3NlbiAhPT0gJycgPyAkY2hvc2VuIDogJGZhbGxiYWNrOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFNpdGVIb21lVGl0bGVGYWxsYmFjaygpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSkgewogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+b3B0aW9uKSAmJiBpc19hcnJheSgkemJwLT5vcHRpb24pICYmICFlbXB0eSgkemJwLT5vcHRpb25bJ1pDX0JMT0dfTkFNRSddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpJHpicC0+b3B0aW9uWydaQ19CTE9HX05BTUUnXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+bmFtZSkgJiYgJHpicC0+bmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpJHpicC0+bmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJ+maj+acuuagh+mimCc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gSXNCYWRUaXRsZSgkdGl0bGUpCiAgICB7CiAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmICgkdGl0bGUgPT09ICfnvZHnq5npppbpobUnIHx8ICR0aXRsZSA9PT0gJ+maj+acuuagh+mimCcpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmOjpIYXNUeHRTb3VyY2UoKSkgewogICAgICAgICAgICAkZmFsbGJhY2sgPSBzZWxmOjpHZXRTaXRlSG9tZVRpdGxlRmFsbGJhY2soKTsKICAgICAgICAgICAgaWYgKCRmYWxsYmFjayAhPT0gJycgJiYgJHRpdGxlID09PSAkZmFsbGJhY2spIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBQaWNrVGl0bGVGcm9tUmFuZG9tU291cmNlcygkZXhjbHVkZVRpdGxlcyA9IGFycmF5KCksICRtYXhUcmllcyA9IDMwKQogICAgewogICAgICAgICRleGNsdWRlID0gYXJyYXkoKTsKICAgICAgICBpZiAoaXNfYXJyYXkoJGV4Y2x1ZGVUaXRsZXMpKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCRleGNsdWRlVGl0bGVzIGFzICR0KSB7CiAgICAgICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZykkdCk7CiAgICAgICAgICAgICAgICBpZiAoJHQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGV4Y2x1ZGVbJHRdID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkbWF4VHJpZXMgPSBpbnR2YWwoJG1heFRyaWVzKTsKICAgICAgICBpZiAoJG1heFRyaWVzIDwgMSkgewogICAgICAgICAgICAkbWF4VHJpZXMgPSAxOwogICAgICAgIH0KICAgICAgICBpZiAoJG1heFRyaWVzID4gMjAwKSB7CiAgICAgICAgICAgICRtYXhUcmllcyA9IDIwMDsKICAgICAgICB9CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJG1heFRyaWVzOyAkaSsrKSB7CiAgICAgICAgICAgICR0ID0gdHJpbSgoc3RyaW5nKXNlbGY6OkdldFJhbmRUaXRsZSgpKTsKICAgICAgICAgICAgaWYgKCR0ID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0KSB8fCBzZWxmOjpJc0FydGljbGVUaXRsZSgkdCkgfHwgaXNzZXQoJGV4Y2x1ZGVbJHRdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0OwogICAgICAgIH0KICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAzMDsgJGkrKykgewogICAgICAgICAgICAkdCA9IHRyaW0oKHN0cmluZylzZWxmOjpHZXRUeHQoKSk7CiAgICAgICAgICAgIGlmICgkdCA9PT0gJycgfHwgc2VsZjo6SXNCYWRUaXRsZSgkdCkgfHwgc2VsZjo6SXNBcnRpY2xlVGl0bGUoJHQpIHx8IGlzc2V0KCRleGNsdWRlWyR0XSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIElzQXJ0aWNsZVRpdGxlKCR0aXRsZSkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICBpZiAoJHRpdGxlID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyAkY2FjaGUgPSBhcnJheSgpOwogICAgICAgIGlmIChpc3NldCgkY2FjaGVbJHRpdGxlXSkpIHsKICAgICAgICAgICAgcmV0dXJuICRjYWNoZVskdGl0bGVdID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCkKICAgICAgICAgICAgICAgIC0+c2VsZWN0KCR6YnAtPmRiLT5kYnByZSAuICdwb3N0JykKICAgICAgICAgICAgICAgIC0+Y29sdW1uKCdsb2dfSUQnKQogICAgICAgICAgICAgICAgLT53aGVyZShhcnJheSgnPScsICdsb2dfVGl0bGUnLCAkdGl0bGUpKQogICAgICAgICAgICAgICAgLT5saW1pdCgxKS0+c3FsOwogICAgICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICAgICAgJGhpdCA9ICghZW1wdHkoJGQpKTsKICAgICAgICAgICAgJGNhY2hlWyR0aXRsZV0gPSAkaGl0ID8gMSA6IDA7CiAgICAgICAgICAgIGlmIChjb3VudCgkY2FjaGUpID4gMzAwKSB7CiAgICAgICAgICAgICAgICAkY2FjaGUgPSBhcnJheV9zbGljZSgkY2FjaGUsIC0yMDAsIG51bGwsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkaGl0OwogICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiAkZSkgewogICAgICAgICAgICAkY2FjaGVbJHRpdGxlXSA9IDA7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZFNpdGVOYW1lKCR0aXRsZSA9ICcnKQogICAgewogICAgICAgICR0cGwgPSAoc3RyaW5nKUN5cWl5ZXpoYW4oJ3NudHBsJywgJycpOwogICAgICAgICR0cGwgPSBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICR0cGwpOwogICAgICAgICR0cGwgPSBzdHJfcmVwbGFjZSgiXHIiLCAiXG4iLCAkdHBsKTsKICAgICAgICAkbGluZXMgPSBhcnJheV9maWx0ZXIoYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgiXG4iLCAkdHBsKSkpOwogICAgICAgICRuYW1lID0gJyc7CiAgICAgICAgaWYgKCFlbXB0eSgkbGluZXMpKSB7CiAgICAgICAgICAgICRuYW1lID0gKHN0cmluZykkbGluZXNbYXJyYXlfcmFuZCgkbGluZXMpXTsKICAgICAgICB9CiAgICAgICAgaWYgKCRuYW1lICE9PSAnJyAmJiAkdGl0bGUgIT09ICcnKSB7CiAgICAgICAgICAgICRuYW1lID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScpLCAoc3RyaW5nKSR0aXRsZSwgJG5hbWUpOwogICAgICAgIH0KICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkbmFtZSk7CiAgICAgICAgaWYgKCRuYW1lID09PSAnJykgewogICAgICAgICAgICAkbmFtZSA9IHNlbGY6OkdldFNpdGVIb21lVGl0bGVGYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJG5hbWU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gVG9VcmxzKCkgICAgCQkJCQkgIAkKICAgIHsgICAgIAkJCSAJCSAKICAgICAgICAkdXJsID0gQ3lxaXllemhhbigndXJscycpOyAgICAgICAJIAkgIAogICAgICAgIGlmICgkdXJsICYmIHByZWdfbWF0Y2hfYWxsKCcjKF58XG58XHIpXHsvKC4qPylcfT1cey8oLio/KVx9KFxyfFxufCQpI2lzJywgJHVybCwgJHQpKSB7ICAgICAJIAkJICAJCiAgICAgICAgICAgIGdsb2JhbCAkemJwOyAgICAJIAkJIAkJIAogICAgICAgICAgICAkdXJsID0gc3RyX3JlcGxhY2UoJHpicC0+aG9zdCwgJycsICR6YnAtPmZ1bGxjdXJyZW50dXJsKTsgICAgIAkJCQkJICAKICAgICAgICAgICAgZm9yZWFjaCAoJHRbMl0gYXMgJGsgPT4gJHIpIHsgICAgIAkgCQkgIAkKICAgICAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmwsICRyKSA9PT0gMCkgeyAgICAJCSAJCQkJIAogICAgICAgICAgICAgICAgICAgIHNlbGY6OnMzMDEoJHpicC0+aG9zdCAuICR0WzNdWyRrXSk7ICAgIAkgCQkgCQkJCiAgICAgICAgICAgICAgICB9ICAgICAgICAJCQkJCiAgICAgICAgICAgIH0gICAgCSAgCSAJIAkKICAgICAgICB9ICAgIAkgICAJICAgCiAgICB9ICAgIAkJCQkJICAJCiAgICBzdGF0aWMgZnVuY3Rpb24gUmFuZFRhZygkaSwgJHVybCA9ICcnKSAgICAJCQkgICAgCQogICAgeyAgICAJICAJCQkJIAogICAgICAgIHN0YXRpYyAkYSA9IG51bGw7ICAgIAkgCQkgCSAJCiAgICAgICAgaWYgKCRhID09PSBudWxsKSB7ICAgIAkgCQkJIAkJCiAgICAgICAgICAgICRhID0gJyc7CiAgICAgICAgfSAgICAJICAgCSAJIAogICAgICAgIGlmICgkYSkgewogICAgICAgICAgICBpZiAoJGEgPT09IDEpIHsKICAgICAgICAgICAgICAgIGlmICgkdXJsICYmIEN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICAgICAgICAgICRpaSA9IHNlbGY6OkdldE9yQ3JlYXRlVXJsVGl0bGUoJHVybCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICRpaSA9IHNlbGY6OkdldFR4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRpaSkgewogICAgICAgICAgICAgICAgICAgICRpID0gJGlpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGkgPSAkYVthcnJheV9yYW5kKCRhKV07CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdCA9IHNlbGY6OkdldFJhbmRUaXRsZSgpOwogICAgICAgICAgICBpZiAoJHQpIHsKICAgICAgICAgICAgICAgICRpID0gJHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRpOyAgICAgCQkJICAgIAogICAgfSAgICAgCSAJCSAJIAogICAgc3RhdGljIGZ1bmN0aW9uIExpbms0MDQoKSAgICAgICAgICAgICAgICAgICAKICAgIHsgICAgICAJICAgCQkKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAkY3VycmVudCA9IGlzc2V0KCR6YnAtPmZ1bGxjdXJyZW50dXJsKSA/IChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwgOiAoaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJyk7CiAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkRm9vdGVyTGlua3NIdG1sKCRjdXJyZW50KTsKICAgIH0gICAgICAJIAkgCSAKICAgIHN0YXRpYyBmdW5jdGlvbiBSYW5kb21MZXR0ZXJzKCRtaW4gPSA0LCAkbWF4ID0gNSkKICAgIHsKICAgICAgICAkbWluID0gaW50dmFsKCRtaW4pOwogICAgICAgICRtYXggPSBpbnR2YWwoJG1heCk7CiAgICAgICAgaWYgKCRtaW4gPD0gMCkgewogICAgICAgICAgICAkbWluID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCRtYXggPCAkbWluKSB7CiAgICAgICAgICAgICRtYXggPSAkbWluOwogICAgICAgIH0KICAgICAgICBpZiAoJG1heCA+IDMyKSB7CiAgICAgICAgICAgICRtYXggPSAzMjsKICAgICAgICB9CiAgICAgICAgJGwgPSBtdF9yYW5kKCRtaW4sICRtYXgpOwogICAgICAgICRvdXQgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkbDsgJGkrKykgewogICAgICAgICAgICAkb3V0IC49IGNocihtdF9yYW5kKDk3LCAxMjIpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRvdXQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRGb290ZXJMaW5rc0h0bWwoJGN1cnJlbnRVcmwgPSAnJywgJG51bSA9IG51bGwpCiAgICB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEJ1aWxkU2l0ZUZyaWVuZExpbmtzSHRtbCgkaG9zdE9ubHksICRjdXJyZW50VXJsID0gJycsICRudW0gPSBudWxsKQogICAgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2l0ZUZyaWVuZHNDYWNoZUZpbGVCeUtleSgkY2FjaGVLZXkpCiAgICB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZW5lcmF0ZVNpdGVGcmllbmRMaW5rc0NhY2hlKCRob3N0T25seSwgJGN1cnJlbnRVcmwgPSAnJywgJG51bSA9IG51bGwpCiAgICB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBDbGVhclNpdGVGcmllbmRMaW5rc0NhY2hlKCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTWF5YmVBdXRvR2VuZXJhdGVTaXRlRnJpZW5kTGlua3NDYWNoZSgpCiAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0RGlyZWN0SG9zdFBhZ2VzQ2FjaGVGaWxlKCkKICAgICAgICB7CiAgICAgICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGRpciAuICdkaXJlY3RfaG9zdF9wYWdlc19jYWNoZS5qc29uJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldEppaHVhcmVud3VTdGF0ZUZpbGUoKQogICAgICAgIHsKICAgICAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgICAgIGlmICgkZGlyID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGlyIC4gJ2ppaHVhcmVud3Vfc3RhdGUuanNvbic7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXQ0MDRTdWlqaVBhZ2VNYXBGaWxlKCkKICAgICAgICB7CiAgICAgICAgICAgICRkaXIgPSBzZWxmOjpHZXRDYWNoZURpcigpOwogICAgICAgICAgICBpZiAoJGRpciA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGRpciAuICdlcnJvcjQwNF9zdWlqaV9wYWdlX21hcC5qc29uJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldDQwNFN1aWppTW9kZSgpCiAgICAgICAgewogICAgICAgICAgICAkbW9kZSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ2Vycm9yNDA0X3N1aWppX21vZGUnLCAnZml4ZWQnKSkpOwogICAgICAgICAgICBpZiAoJG1vZGUgIT09ICdyYW5kb20nKSB7CiAgICAgICAgICAgICAgICAkbW9kZSA9ICdmaXhlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRtb2RlOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gTG9hZDQwNFN1aWppUGFnZU1hcCgpCiAgICAgICAgewogICAgICAgICAgICAkZmlsZSA9IHNlbGY6OkdldDQwNFN1aWppUGFnZU1hcEZpbGUoKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRyYXcgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkcmF3KSB8fCAkcmF3ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRkYXRhKSA/ICRkYXRhIDogYXJyYXkoKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFNhdmU0MDRTdWlqaVBhZ2VNYXAoJG1hcCkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlID0gc2VsZjo6R2V0NDA0U3VpamlQYWdlTWFwRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19hcnJheSgkbWFwKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZSgkbWFwLCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRvdXQpIHx8ICRvdXQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEBmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJG91dCkgIT09IGZhbHNlOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQ2xlYXI0MDRTdWlqaVBhZ2VNYXAoKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXQ0MDRTdWlqaVBhZ2VNYXBGaWxlKCk7CiAgICAgICAgICAgIGlmICgkZmlsZSAhPT0gJycgJiYgaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgICAgIEB1bmxpbmsoJGZpbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZDQwNFN1aWppUGFnZU1hcEtleSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGN1cnJlbnRIb3N0KTsKICAgICAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICAkY3VycmVudFVybCA9IHRyaW0oKHN0cmluZykkY3VycmVudFVybCk7CiAgICAgICAgICAgIGlmICgkY3VycmVudFVybCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXJzZWQgPSBAcGFyc2VfdXJsKCRjdXJyZW50VXJsKTsKICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkcGFyc2VkKSAmJiBpc3NldCgkcGFyc2VkWydwYXRoJ10pICYmIChzdHJpbmcpJHBhcnNlZFsncGF0aCddICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcGFyc2VkWydwYXRoJ107CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoJGN1cnJlbnRVcmxbMF0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gJGN1cnJlbnRVcmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZWlmIChpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZURpcmVjdEhvc3RSZXF1ZXN0UGF0aCgkcGF0aCk7CiAgICAgICAgICAgIHJldHVybiBtZDUoJGhvc3QgLiAnfCcgLiAkcGF0aCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBQaWNrNDA0U3VpamlQYWdlSXRlbSgkY3VycmVudEhvc3QsICRjdXJyZW50VXJsID0gJycpCiAgICAgICAgewogICAgICAgICAgICAkY2FjaGUgPSBzZWxmOjpMb2FkRGlyZWN0SG9zdFBhZ2VzQ2FjaGUoKTsKICAgICAgICAgICAgJGl0ZW1zID0gKGlzc2V0KCRjYWNoZVsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGNhY2hlWydpdGVtcyddKSkgPyAkY2FjaGVbJ2l0ZW1zJ10gOiBhcnJheSgpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG1vZGUgPSBzZWxmOjpHZXQ0MDRTdWlqaU1vZGUoKTsKICAgICAgICAgICAgaWYgKCRtb2RlID09PSAnZml4ZWQnKSB7CiAgICAgICAgICAgICAgICAka2V5ID0gc2VsZjo6QnVpbGQ0MDRTdWlqaVBhZ2VNYXBLZXkoJGN1cnJlbnRIb3N0LCAkY3VycmVudFVybCk7CiAgICAgICAgICAgICAgICBpZiAoJGtleSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkbWFwID0gc2VsZjo6TG9hZDQwNFN1aWppUGFnZU1hcCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkbWFwWyRrZXldWydmaWxlX3BhdGgnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHNhdmVkUGF0aCA9IChzdHJpbmcpJG1hcFska2V5XVsnZmlsZV9wYXRoJ107CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRpdGVtWydmaWxlX3BhdGgnXSkgJiYgKHN0cmluZykkaXRlbVsnZmlsZV9wYXRoJ10gPT09ICRzYXZlZFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGNob3NlbiA9ICRpdGVtc1thcnJheV9yYW5kKCRpdGVtcyldOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkY2hvc2VuKSAmJiAhZW1wdHkoJGNob3NlblsnZmlsZV9wYXRoJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRtYXBbJGtleV0gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmaWxlX3BhdGgnID0+IChzdHJpbmcpJGNob3NlblsnZmlsZV9wYXRoJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gaXNzZXQoJGNob3NlblsnaG9zdCddKSA/IChzdHJpbmcpJGNob3NlblsnaG9zdCddIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+IGlzc2V0KCRjaG9zZW5bJ3RpdGxlJ10pID8gKHN0cmluZykkY2hvc2VuWyd0aXRsZSddIDogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndHMnID0+IHRpbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZjo6U2F2ZTQwNFN1aWppUGFnZU1hcCgkbWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjaG9zZW47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRjaG9zZW4gPSAkaXRlbXNbYXJyYXlfcmFuZCgkaXRlbXMpXTsKICAgICAgICAgICAgcmV0dXJuIGlzX2FycmF5KCRjaG9zZW4pID8gJGNob3NlbiA6IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIOiHquWumuS5ieWQjuWPsOeZu+W9leWcsOWdgO+8iOWkjeWIu+iHqiB5dGVjbl9hbG9naW7vvIzliqjmgIEv5Lyq6Z2Z5oCB5Y+M5qih5byP77yJCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpUWl5b25nKCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBpbnR2YWwoQ3lxaXllemhhbignaG91dGFpX2RpemhpX3FpeW9uZycsIDApKSA9PT0gMTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpR3VvbHYoJGd1YW5qaWFuemkpCiAgICAgICAgewogICAgICAgICAgICAkZ3VhbmppYW56aSA9IHN0cnRvbG93ZXIodHJpbSgoc3RyaW5nKSRndWFuamlhbnppKSk7CiAgICAgICAgICAgIGlmICgkZ3VhbmppYW56aSA9PT0gJycgfHwgIXByZWdfbWF0Y2goJyNeW2EtejAtOV1bYS16MC05Xy1dezEsMzF9JCMnLCAkZ3VhbmppYW56aSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYmFvbGl1ID0gYXJyYXkoCiAgICAgICAgICAgICAgICAnemJfc3lzdGVtJywgJ3piX3VzZXJzJywgJ2FkbWluJywgJ2xvZ2luJywgJ2xvZ291dCcsICd2ZXJpZnknLCAnY21kJywKICAgICAgICAgICAgICAgICdhcGknLCAnZmVlZCcsICdzZWFyY2gnLCAnaW5kZXgnLCAnaW5kZXgucGhwJywgJ3JzcycsICdzaXRlbWFwJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKGluX2FycmF5KCRndWFuamlhbnppLCAkYmFvbGl1LCB0cnVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZ3VhbmppYW56aTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEhvdXRhaURpemhpRGVuZ2x1WWUoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgIGlmICghZW1wdHkoJHpicC0+dXNlci0+SUQpKSB7CiAgICAgICAgICAgICAgICBSZWRpcmVjdCgkemJwLT5ob3N0IC4gJ3piX3N5c3RlbS9hZG1pbi9pbmRleC5waHA/YWN0PWFkbWluJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHpicC0+dGVtcGxhdGUtPlNldFRhZ3MoJ0dMT0JBTFMnLCAkR0xPQkFMUyk7CiAgICAgICAgICAgICRtdWJhbk11bHUgPSAkR0xPQkFMU1sndXNlcnNkaXInXSAuICdwbHVnaW4vQ3lxaXllemhhbi90aGVtZS8nOwogICAgICAgICAgICAkemJwLT50ZW1wbGF0ZS0+U2V0UGF0aCgkbXViYW5NdWx1KTsKICAgICAgICAgICAgJHpicC0+dGVtcGxhdGUtPlNldFRlbXBsYXRlKCdob3V0YWlfZGVuZ2x1Jyk7CiAgICAgICAgICAgICR6YnAtPnRlbXBsYXRlLT5EaXNwbGF5KCk7CiAgICAgICAgICAgIGRpZSgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSG91dGFpRGl6aGlKaWFuY2UoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgIGlmICghc2VsZjo6SG91dGFpRGl6aGlRaXlvbmcoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRtb3NoaSA9IGlzc2V0KCR6YnAtPm9wdGlvblsnWkNfU1RBVElDX01PREUnXSkgPyAoc3RyaW5nKSR6YnAtPm9wdGlvblsnWkNfU1RBVElDX01PREUnXSA6ICdBQ1RJVkUnOwogICAgICAgICAgICBpZiAoJG1vc2hpID09PSAnUkVXUklURScpIHsKICAgICAgICAgICAgICAgICRndWFuamlhbnppID0gc2VsZjo6SG91dGFpRGl6aGlHdW9sdihDeXFpeWV6aGFuKCdob3V0YWlfd2VpamluZ3RhaV91cmwnLCAnJykpOwogICAgICAgICAgICAgICAgaWYgKCRndWFuamlhbnppID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRxaW5ncWl1VXJpID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcvJzsKICAgICAgICAgICAgICAgICRsdWppbmcgPSAoc3RyaW5nKXBhcnNlX3VybCgkcWluZ3FpdVVyaSwgUEhQX1VSTF9QQVRIKTsKICAgICAgICAgICAgICAgIGlmICgkbHVqaW5nID09PSAnJykgewogICAgICAgICAgICAgICAgICAgICRsdWppbmcgPSAnLyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkamljaHVMdWppbmcgPSBpc3NldCgkemJwLT5jb29raWVzcGF0aCkgPyAoc3RyaW5nKSR6YnAtPmNvb2tpZXNwYXRoIDogJy8nOwogICAgICAgICAgICAgICAgaWYgKCRqaWNodUx1amluZyAhPT0gJycgJiYgJGppY2h1THVqaW5nICE9PSAnLycgJiYgc3RycG9zKCRsdWppbmcsICRqaWNodUx1amluZykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAkbHVqaW5nID0gJy8nIC4gbHRyaW0oc3Vic3RyKCRsdWppbmcsIHN0cmxlbihydHJpbSgkamljaHVMdWppbmcsICcvJykpKSwgJy8nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRsdWppbmcgPSBydHJpbSgkbHVqaW5nLCAnLycpOwogICAgICAgICAgICAgICAgaWYgKCRsdWppbmcgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGx1amluZyA9ICcvJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgkbHVqaW5nID09PSAnLycgLiAkZ3VhbmppYW56aSkgewogICAgICAgICAgICAgICAgICAgIHNlbGY6OkhvdXRhaURpemhpRGVuZ2x1WWUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRndWFuamlhbnppID0gc2VsZjo6SG91dGFpRGl6aGlHdW9sdihDeXFpeWV6aGFuKCdob3V0YWlfZG9uZ3RhaV91cmwnLCAnJykpOwogICAgICAgICAgICAgICAgaWYgKCRndWFuamlhbnppID09PSAnJyB8fCAhaXNzZXQoJF9HRVRbJGd1YW5qaWFuemldKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGY6OkhvdXRhaURpemhpRGVuZ2x1WWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gSG91dGFpRGl6aGlZYW56aGVuZygpCiAgICAgICAgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgJGRvbmd6dW8gPSAoc3RyaW5nKUdldFZhcnMoJ2FjdCcsICdHRVQnKTsKICAgICAgICAgICAgaWYgKCRkb25nenVvICE9PSAndmVyaWZ5JykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZjo6SG91dGFpRGl6aGlRaXlvbmcoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRiaWFvc2hpID0gKGludClHZXRWYXJzKCdjeXF5aG91dGFpJywgJ0dFVCcpOwogICAgICAgICAgICBpZiAoJGJpYW9zaGkgIT09IDEpIHsKICAgICAgICAgICAgICAgICR6YnAtPlNob3dFcnJvcig4LCBfX0ZJTEVfXywgX19MSU5FX18pOwogICAgICAgICAgICAgICAgZGllKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFZlcmlmeUxvZ2luKCkpIHsKICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJHpicC0+dXNlci0+SUQpICYmIEdldFZhcnMoJ3JlZGlyZWN0JywgJ0NPT0tJRScpKSB7CiAgICAgICAgICAgICAgICAgICAgJGEgPSBwYXJzZV91cmwoR2V0VmFycygncmVkaXJlY3QnLCAnQ09PS0lFJykpOwogICAgICAgICAgICAgICAgICAgICRiID0gcGFyc2VfdXJsKCR6YnAtPmhvc3QpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkYVsnaG9zdCddKSAmJiBpc3NldCgkYlsnaG9zdCddKSAmJiBzdHJ0b2xvd2VyKChzdHJpbmcpJGFbJ2hvc3QnXSkgPT09IHN0cnRvbG93ZXIoKHN0cmluZykkYlsnaG9zdCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICBSZWRpcmVjdChHZXRWYXJzKCdyZWRpcmVjdCcsICdDT09LSUUnKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgUmVkaXJlY3QoJHpicC0+aG9zdCAuICd6Yl9zeXN0ZW0vYWRtaW4vaW5kZXgucGhwP2FjdD1hZG1pbicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgUmVkaXJlY3QoJy4uLycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZERpcmVjdEhvc3RQYWdlSXRlbXMoKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VEaXIgPSBzZWxmOjpHZXREaXJlY3RIb3N0SHRtbEJhc2VEaXIoKTsKICAgICAgICAgICAgaWYgKCFpc19kaXIoJGJhc2VEaXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJHJvb3RIb3N0ID0gc2VsZjo6R2V0TGxtc1Jvb3RIb3N0KCk7CiAgICAgICAgICAgIGlmICgkcm9vdEhvc3QgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGl0ZW1zID0gYXJyYXkoKTsKICAgICAgICAgICAgJG5hbWVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGVudHJpZXMgPSBAc2NhbmRpcigkYmFzZURpcik7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGVudHJpZXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZm9yZWFjaCAoJGVudHJpZXMgYXMgJGVudHJ5KSB7CiAgICAgICAgICAgICAgICBpZiAoJGVudHJ5ID09PSAnLicgfHwgJGVudHJ5ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGhvc3QgPSAnJzsKICAgICAgICAgICAgICAgICR0aXRsZSA9ICcnOwogICAgICAgICAgICAgICAgJGtleXdvcmQgPSAnJzsKICAgICAgICAgICAgICAgICRtdGltZSA9IDA7CiAgICAgICAgICAgICAgICAkZmlsZVBhdGggPSAnJzsKICAgICAgICAgICAgICAgICRmdWxsID0gJGJhc2VEaXIgLiAkZW50cnk7CiAgICAgICAgICAgICAgICBpZiAoaXNfZGlyKCRmdWxsKSAmJiBpc19maWxlKCRmdWxsIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbmRleC5odG1sJykpIHsKICAgICAgICAgICAgICAgICAgICAkbmFtZSA9IHRyaW0oKHN0cmluZykkZW50cnkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHJfY291bnQoJG5hbWUsICcuJykgPj0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lIC4gJy4nIC4gJHJvb3RIb3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGluZGV4RmlsZSA9ICRmdWxsIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICdpbmRleC5odG1sJzsKICAgICAgICAgICAgICAgICAgICAka2V5d29yZCA9IHNlbGY6OkV4dHJhY3RGaXJzdEtleXdvcmRGcm9tSHRtbEZpbGUoJGluZGV4RmlsZSk7CiAgICAgICAgICAgICAgICAgICAgJHRpdGxlID0gc2VsZjo6RXh0cmFjdFRpdGxlRnJvbUh0bWxGaWxlKCRpbmRleEZpbGUpOwogICAgICAgICAgICAgICAgICAgICRtdGltZSA9IGlzX2ZpbGUoJGluZGV4RmlsZSkgPyBpbnR2YWwoQGZpbGVtdGltZSgkaW5kZXhGaWxlKSkgOiAwOwogICAgICAgICAgICAgICAgICAgICRmaWxlUGF0aCA9ICdodG1sX3BhZ2VzLycgLiAkZW50cnkgLiAnL2luZGV4Lmh0bWwnOwogICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzX2ZpbGUoJGZ1bGwpICYmIHN0cnRvbG93ZXIocGF0aGluZm8oJGVudHJ5LCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJG5hbWUgPSB0cmltKChzdHJpbmcpcGF0aGluZm8oJGVudHJ5LCBQQVRISU5GT19GSUxFTkFNRSkpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdWJzdHJfY291bnQoJG5hbWUsICcuJykgPj0gMikgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkaG9zdCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KCRuYW1lIC4gJy4nIC4gJHJvb3RIb3N0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGtleXdvcmQgPSBzZWxmOjpFeHRyYWN0Rmlyc3RLZXl3b3JkRnJvbUh0bWxGaWxlKCRmdWxsKTsKICAgICAgICAgICAgICAgICAgICAkdGl0bGUgPSBzZWxmOjpFeHRyYWN0VGl0bGVGcm9tSHRtbEZpbGUoJGZ1bGwpOwogICAgICAgICAgICAgICAgICAgICRtdGltZSA9IGludHZhbChAZmlsZW10aW1lKCRmdWxsKSk7CiAgICAgICAgICAgICAgICAgICAgJGZpbGVQYXRoID0gJ2h0bWxfcGFnZXMvJyAuICRlbnRyeTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJGhvc3QgPT09ICcnIHx8IGlzc2V0KCRuYW1lc1skaG9zdF0pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkbmFtZXNbJGhvc3RdID0gMTsKCiAgICAgICAgICAgICAgICAkZGlzcGxheVRleHQgPSAka2V5d29yZCAhPT0gJycgPyAka2V5d29yZCA6ICR0aXRsZTsKICAgICAgICAgICAgICAgIGlmICgkZGlzcGxheVRleHQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGxhYmVsID0gcHJlZ19yZXBsYWNlKCcjXC4nIC4gcHJlZ19xdW90ZSgkcm9vdEhvc3QsICcjJykgLiAnJCNpJywgJycsICRob3N0KTsKICAgICAgICAgICAgICAgICAgICAkZGlzcGxheVRleHQgPSAkbGFiZWwgIT09ICcnID8gJGxhYmVsIDogJGhvc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJGl0ZW1zW10gPSBhcnJheSgKICAgICAgICAgICAgICAgICAgICAndGl0bGUnID0+ICRkaXNwbGF5VGV4dCwKICAgICAgICAgICAgICAgICAgICAncmF3X3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnID0+ICRrZXl3b3JkLAogICAgICAgICAgICAgICAgICAgICd1cmwnID0+ICdodHRwczovLycgLiAkaG9zdCAuICcvJywKICAgICAgICAgICAgICAgICAgICAndGFyZ2V0JyA9PiAxLAogICAgICAgICAgICAgICAgICAgICdob3N0JyA9PiAkaG9zdCwKICAgICAgICAgICAgICAgICAgICAnbXRpbWUnID0+ICRtdGltZSwKICAgICAgICAgICAgICAgICAgICAnZmlsZV9wYXRoJyA9PiAkZmlsZVBhdGgsCiAgICAgICAgICAgICAgICAgICAgJ2JhdGNoX25vJyA9PiAoc3Vic3RyKCRmaWxlUGF0aCwgLTExKSA9PT0gJy9pbmRleC5odG1sJykgPyAn55uu5b2V55u06K+7JyA6ICfmlofku7bnm7Tor7snLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICB1c29ydCgkaXRlbXMsIGZ1bmN0aW9uICgkYSwgJGIpIHsKICAgICAgICAgICAgICAgICAgICAkbXRpbWVBID0gaXNzZXQoJGFbJ210aW1lJ10pID8gaW50dmFsKCRhWydtdGltZSddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgJG10aW1lQiA9IGlzc2V0KCRiWydtdGltZSddKSA/IGludHZhbCgkYlsnbXRpbWUnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgIGlmICgkbXRpbWVBID09PSAkbXRpbWVCKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJjbXAoKHN0cmluZykkYVsnaG9zdCddLCAoc3RyaW5nKSRiWydob3N0J10pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCRtdGltZUEgPCAkbXRpbWVCKSA/IDEgOiAtMTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGl0ZW1zOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gUmVmcmVzaERpcmVjdEhvc3RQYWdlc0NhY2hlKCRmb3JjZSA9IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXREaXJlY3RIb3N0UGFnZXNDYWNoZUZpbGUoKTsKICAgICAgICAgICAgaWYgKCRmaWxlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdnZW5lcmF0ZWRfYXQnID0+IHRpbWUoKSwgJ3RvdGFsJyA9PiAwLCAnaXRlbXMnID0+IGFycmF5KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghJGZvcmNlICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhdykgJiYgJHJhdyAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkgJiYgaXNzZXQoJGRhdGFbJ2l0ZW1zJ10pICYmIGlzX2FycmF5KCRkYXRhWydpdGVtcyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRpdGVtcyA9IHNlbGY6OkJ1aWxkRGlyZWN0SG9zdFBhZ2VJdGVtcygpOwogICAgICAgICAgICAkZGF0YSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2dlbmVyYXRlZF9hdCcgPT4gdGltZSgpLAogICAgICAgICAgICAgICAgJ3RvdGFsJyA9PiBjb3VudCgkaXRlbXMpLAogICAgICAgICAgICAgICAgJ2l0ZW1zJyA9PiAkaXRlbXMsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRvdXQgPSBqc29uX2VuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRvdXQpICYmICRvdXQgIT09ICcnKSB7CiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIExvYWREaXJlY3RIb3N0UGFnZXNDYWNoZSgpCiAgICAgICAgewogICAgICAgICAgICAkZmlsZSA9IHNlbGY6OkdldERpcmVjdEhvc3RQYWdlc0NhY2hlRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgIT09ICcnICYmIGlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJHJhdykgJiYgJHJhdyAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRyYXcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc19hcnJheSgkZGF0YSkgJiYgaXNzZXQoJGRhdGFbJ2l0ZW1zJ10pICYmIGlzX2FycmF5KCRkYXRhWydpdGVtcyddKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRhdGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpSZWZyZXNoRGlyZWN0SG9zdFBhZ2VzQ2FjaGUodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRKaWh1YXJlbnd1U3RhdGUoKQogICAgICAgIHsKICAgICAgICAgICAgJGZpbGUgPSBzZWxmOjpHZXRKaWh1YXJlbnd1U3RhdGVGaWxlKCk7CiAgICAgICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKICAgICAgICAgICAgaWYgKCFpc19zdHJpbmcoJHJhdykgfHwgJHJhdyA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiBpc19hcnJheSgkZGF0YSkgPyAkZGF0YSA6IGFycmF5KCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBTYXZlSmlodWFyZW53dVN0YXRlKCRzdGF0ZSkKICAgICAgICB7CiAgICAgICAgICAgICRmaWxlID0gc2VsZjo6R2V0SmlodWFyZW53dVN0YXRlRmlsZSgpOwogICAgICAgICAgICBpZiAoJGZpbGUgPT09ICcnIHx8ICFpc19hcnJheSgkc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9IGpzb25fZW5jb2RlKCRzdGF0ZSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkb3V0KSB8fCAkb3V0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBAZmlsZV9wdXRfY29udGVudHMoJGZpbGUsICRvdXQpICE9PSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJ1bkppaHVhcmVud3UoJGZvcmNlID0gdHJ1ZSkKICAgICAgICB7CiAgICAgICAgICAgICRjYWNoZSA9IHNlbGY6OlJlZnJlc2hEaXJlY3RIb3N0UGFnZXNDYWNoZSgkZm9yY2UgPyB0cnVlIDogZmFsc2UpOwogICAgICAgICAgICAkbGxtc09rID0gc2VsZjo6UmVmcmVzaExsbXNUeHQodHJ1ZSk7CiAgICAgICAgICAgICRzdGF0ZSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ2xhc3RfcnVuJyA9PiB0aW1lKCksCiAgICAgICAgICAgICAgICAnZGlyZWN0X2hvc3RfdG90YWwnID0+IGlzc2V0KCRjYWNoZVsndG90YWwnXSkgPyBpbnR2YWwoJGNhY2hlWyd0b3RhbCddKSA6IDAsCiAgICAgICAgICAgICAgICAnbGxtc19vaycgPT4gJGxsbXNPayA/IDEgOiAwLAogICAgICAgICAgICAgICAgJ2xsbXNfZmlsZScgPT4gc2VsZjo6R2V0TGxtc1R4dEZpbGVQYXRoKCksCiAgICAgICAgICAgICAgICAnbGxtc19mdWxsX2ZpbGUnID0+IHNlbGY6OkdldExsbXNGdWxsVHh0RmlsZVBhdGgoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgc2VsZjo6U2F2ZUppaHVhcmVud3VTdGF0ZSgkc3RhdGUpOwogICAgICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICAgICAnb2snID0+IDEsCiAgICAgICAgICAgICAgICAnbWVzc2FnZScgPT4gJ+iuoeWIkuS7u+WKoeaJp+ihjOWujOaIkCcsCiAgICAgICAgICAgICAgICAnc3RhdGUnID0+ICRzdGF0ZSwKICAgICAgICAgICAgICAgICdjYWNoZScgPT4gJGNhY2hlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0SG9tZXBhZ2VGcmllbmRMaW5rSXRlbXMoJGxpbWl0ID0gMjAsICRyYW5kb21pemUgPSBmYWxzZSwgJHBvb2xMaW1pdCA9IDApCiAgICAgICAgewogICAgICAgICAgICAkbGltaXQgPSBpbnR2YWwoJGxpbWl0KTsKICAgICAgICAgICAgaWYgKCRsaW1pdCA8IDEpIHsKICAgICAgICAgICAgICAgICRsaW1pdCA9IDIwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbGltaXQgPiAxMDApIHsKICAgICAgICAgICAgICAgICRsaW1pdCA9IDEwMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkY2FjaGUgPSBzZWxmOjpMb2FkRGlyZWN0SG9zdFBhZ2VzQ2FjaGUoKTsKICAgICAgICAgICAgJGl0ZW1zID0gKGlzc2V0KCRjYWNoZVsnaXRlbXMnXSkgJiYgaXNfYXJyYXkoJGNhY2hlWydpdGVtcyddKSkgPyAkY2FjaGVbJ2l0ZW1zJ10gOiBhcnJheSgpOwogICAgICAgICAgICBpZiAoZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkcmFuZG9taXplKSB7CiAgICAgICAgICAgICAgICAkcG9vbExpbWl0ID0gaW50dmFsKCRwb29sTGltaXQpOwogICAgICAgICAgICAgICAgaWYgKCRwb29sTGltaXQgPCAkbGltaXQpIHsKICAgICAgICAgICAgICAgICAgICAkcG9vbExpbWl0ID0gJGxpbWl0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRwb29sTGltaXQgPiBjb3VudCgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICAgICAgJHBvb2xMaW1pdCA9IGNvdW50KCRpdGVtcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoJHBvb2xMaW1pdCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAkaXRlbXMgPSBhcnJheV9zbGljZSgkaXRlbXMsIDAsICRwb29sTGltaXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2h1ZmZsZSgkaXRlbXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAwLCAkbGltaXQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gRXh0cmFjdFRpdGxlRnJvbUh0bWxGaWxlKCRmaWxlUGF0aCkKICAgICAgICB7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkZmlsZVBhdGgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGh0bWwgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGVQYXRoLCBmYWxzZSwgbnVsbCwgMCwgMzI3NjgpOwogICAgICAgICAgICBpZiAoIWlzX3N0cmluZygkaHRtbCkgfHwgJGh0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyM8dGl0bGVcYltePl0qPiguKj8pPC90aXRsZT4jaXMnLCAkaHRtbCwgJG0pKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSB0cmltKGh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKChzdHJpbmcpJG1bMV0pLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSk7CiAgICAgICAgICAgICAgICBpZiAoJHRpdGxlICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkdGl0bGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gVG9VdGY4VGV4dCgkdGV4dCkKICAgICAgICB7CiAgICAgICAgICAgICR0ZXh0ID0gKHN0cmluZykkdGV4dDsKICAgICAgICAgICAgaWYgKCR0ZXh0ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChAcHJlZ19tYXRjaCgnLy91JywgJHRleHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJHRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9lbmNvZGluZycpKSB7CiAgICAgICAgICAgICAgICAkY29udmVydGVkID0gQG1iX2NvbnZlcnRfZW5jb2RpbmcoJHRleHQsICdVVEYtOCcsICdVVEYtOCxHQjE4MDMwLEdCSyxDUDkzNixCSUc1Jyk7CiAgICAgICAgICAgICAgICBpZiAoaXNfc3RyaW5nKCRjb252ZXJ0ZWQpICYmICRjb252ZXJ0ZWQgIT09ICcnICYmIEBwcmVnX21hdGNoKCcvL3UnLCAkY29udmVydGVkKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkY29udmVydGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKICAgICAgICAgICAgICAgICRjb252ZXJ0ZWQgPSBAaWNvbnYoJ0dCMTgwMzAnLCAnVVRGLTgvL0lHTk9SRScsICR0ZXh0KTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGNvbnZlcnRlZCkgJiYgJGNvbnZlcnRlZCAhPT0gJycgJiYgQHByZWdfbWF0Y2goJy8vdScsICRjb252ZXJ0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb252ZXJ0ZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkY29udmVydGVkID0gQGljb252KCdHQksnLCAnVVRGLTgvL0lHTk9SRScsICR0ZXh0KTsKICAgICAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJGNvbnZlcnRlZCkgJiYgJGNvbnZlcnRlZCAhPT0gJycgJiYgQHByZWdfbWF0Y2goJy8vdScsICRjb252ZXJ0ZWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRjb252ZXJ0ZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICR0ZXh0OwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gRXh0cmFjdEZpcnN0S2V5d29yZEZyb21IdG1sRmlsZSgkZmlsZVBhdGgpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2ZpbGUoJGZpbGVQYXRoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRodG1sID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlUGF0aCwgZmFsc2UsIG51bGwsIDAsIDEzMTA3Mik7CiAgICAgICAgICAgIGlmICghaXNfc3RyaW5nKCRodG1sKSB8fCAkaHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAka2V5d29yZHMgPSAnJzsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJy88bWV0YVxiW14+XSpuYW1lXHMqPVxzKlsiXCdda2V5d29yZHNbIlwnXVtePl0qY29udGVudFxzKj1ccypbIlwnXShbXiJcJ10qKVsiXCddW14+XSo+L2knLCAkaHRtbCwgJG0pKSB7CiAgICAgICAgICAgICAgICAka2V5d29yZHMgPSBpc3NldCgkbVsxXSkgPyAoc3RyaW5nKSRtWzFdIDogJyc7CiAgICAgICAgICAgIH0gZWxzZWlmIChwcmVnX21hdGNoKCcvPG1ldGFcYltePl0qY29udGVudFxzKj1ccypbIlwnXShbXiJcJ10qKVsiXCddW14+XSpuYW1lXHMqPVxzKlsiXCdda2V5d29yZHNbIlwnXVtePl0qPi9pJywgJGh0bWwsICRtKSkgewogICAgICAgICAgICAgICAgJGtleXdvcmRzID0gaXNzZXQoJG1bMV0pID8gKHN0cmluZykkbVsxXSA6ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRrZXl3b3JkcyA9IHRyaW0oc2VsZjo6VG9VdGY4VGV4dChodG1sX2VudGl0eV9kZWNvZGUoJGtleXdvcmRzLCBFTlRfUVVPVEVTLCAnVVRGLTgnKSkpOwogICAgICAgICAgICBpZiAoJGtleXdvcmRzID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXJ0cyA9IHByZWdfc3BsaXQoJy9bXHMs77yMO++8m3xcL10rL3UnLCAka2V5d29yZHMpOwogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRwYXJ0cykpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JlYWNoICgkcGFydHMgYXMgJHBhcnQpIHsKICAgICAgICAgICAgICAgICRwYXJ0ID0gdHJpbSgoc3RyaW5nKSRwYXJ0KTsKICAgICAgICAgICAgICAgIGlmICgkcGFydCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJHBhcnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRIb21lcGFnZUZyaWVuZExpbmtzSHRtbCgkbGltaXQgPSAyMCwgJHJhbmRvbWl6ZSA9IGZhbHNlLCAkcG9vbExpbWl0ID0gMCkKICAgICAgICB7CiAgICAgICAgICAgICRpdGVtcyA9IHNlbGY6OkdldEhvbWVwYWdlRnJpZW5kTGlua0l0ZW1zKCRsaW1pdCwgJHJhbmRvbWl6ZSwgJHBvb2xMaW1pdCk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGh0bWwgPSAnJzsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBodG1sc3BlY2lhbGNoYXJzKHRyaW0oKHN0cmluZykkaXRlbVsndGl0bGUnXSksIEVOVF9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAgICAgJHVybCA9IGh0bWxzcGVjaWFsY2hhcnMoKHN0cmluZykkaXRlbVsndXJsJ10sIEVOVF9RVU9URVMsICdVVEYtOCcpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgJHVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRodG1sIC49ICc8YSBocmVmPSInIC4gJHVybCAuICciIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj4nIC4gJHRpdGxlIC4gJzwvYT4nIC4gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGh0bWw7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zUm9vdEhvc3QoKQogICAgICAgIHsKICAgICAgICAgICAgZ2xvYmFsICR6YnA7CiAgICAgICAgICAgICRjYW5kaWRhdGVzID0gYXJyYXkoKTsKICAgICAgICAgICAgJGNvbmZpZ3VyZWRIb3N0ID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigoc3RyaW5nKUN5cWl5ZXpoYW4oJ2xsbXNfcm9vdF9ob3N0JywgJycpKTsKICAgICAgICAgICAgaWYgKCRjb25maWd1cmVkSG9zdCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAkY29uZmlndXJlZEhvc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJvb3RIb3N0ID0gc2VsZjo6R2V0RGlyZWN0SG9zdFBhZ2VSb290RG9tYWluKCk7CiAgICAgICAgICAgIGlmICgkcm9vdEhvc3QgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlc1tdID0gJHJvb3RIb3N0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRob3N0ID0gaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJzsKICAgICAgICAgICAgaWYgKCRob3N0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJHBhcnNlZCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgICAgIGlmICgkcGFyc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSRwYXJzZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRob3N0KTsKICAgICAgICAgICAgaWYgKCRob3N0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGNhbmRpZGF0ZXNbXSA9ICRob3N0OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRjYW5kaWRhdGVzW10gPSAneWlxaWxhaXdhbi5jb20nOwogICAgICAgICAgICBmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkY2FuZGlkYXRlKSB7CiAgICAgICAgICAgICAgICAkY2FuZGlkYXRlID0gc2VsZjo6Tm9ybWFsaXplTWFpbkRvbWFpbigkY2FuZGlkYXRlKTsKICAgICAgICAgICAgICAgIGlmICgkY2FuZGlkYXRlID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCRjYW5kaWRhdGUgPT09ICdsb2NhbGhvc3QnIHx8IHByZWdfbWF0Y2goJyNeXGR7MSwzfShcLlxkezEsM30pezN9JCMnLCAkY2FuZGlkYXRlKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICRjYW5kaWRhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gR2V0TGxtc0Jhc2VTaXRlVXJsKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkcm9vdEhvc3QgPSBzZWxmOjpHZXRMbG1zUm9vdEhvc3QoKTsKICAgICAgICAgICAgaWYgKCRyb290SG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHAnOwogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+aG9zdCkgJiYgc3RyaXBvcygoc3RyaW5nKSR6YnAtPmhvc3QsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHBzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHNjaGVtZSAuICc6Ly8nIC4gJHJvb3RIb3N0OwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRBYnNvbHV0ZVVybEZvckhvc3QoJGhvc3QpCiAgICAgICAgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgJGhvc3QgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdCk7CiAgICAgICAgICAgIGlmICgkaG9zdCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHAnOwogICAgICAgICAgICBpZiAoaXNzZXQoJHpicC0+aG9zdCkgJiYgc3RyaXBvcygoc3RyaW5nKSR6YnAtPmhvc3QsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICAgICAkc2NoZW1lID0gJ2h0dHBzJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJHNjaGVtZSAuICc6Ly8nIC4gJGhvc3QgLiAnLyc7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVVcmxUb0Jhc2VTaXRlKCR1cmwsICRiYXNlU2l0ZVVybCkKICAgICAgICB7CiAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgICAgICRiYXNlU2l0ZVVybCA9IHJ0cmltKChzdHJpbmcpJGJhc2VTaXRlVXJsLCAnLycpOwogICAgICAgICAgICBpZiAoJGJhc2VTaXRlVXJsID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICR1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGJhc2VTaXRlVXJsIC4gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRwYXRoID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfUEFUSCk7CiAgICAgICAgICAgICRxdWVyeSA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1FVRVJZKTsKICAgICAgICAgICAgJGZyYWdtZW50ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfRlJBR01FTlQpOwogICAgICAgICAgICBpZiAoISRwYXRoIHx8ICRwYXRoID09PSAnJykgewogICAgICAgICAgICAgICAgJHBhdGggPSAnLyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRwYXRoWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nIC4gJHBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG91dCA9ICRiYXNlU2l0ZVVybCAuICRwYXRoOwogICAgICAgICAgICBpZiAoJHF1ZXJ5ICE9PSBudWxsICYmICRxdWVyeSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICRvdXQgLj0gJz8nIC4gJHF1ZXJ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkZnJhZ21lbnQgIT09IG51bGwgJiYgJGZyYWdtZW50ICE9PSAnJykgewogICAgICAgICAgICAgICAgJG91dCAuPSAnIycgLiAkZnJhZ21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRvdXQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zQXJ0aWNsZUl0ZW1zKCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICAkYmFzZVNpdGVVcmwgPSBzZWxmOjpHZXRMbG1zQmFzZVNpdGVVcmwoKTsKICAgICAgICAgICAgaWYgKCRiYXNlU2l0ZVVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRpdGVtcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaXN0ID0gJHpicC0+R2V0QXJ0aWNsZUxpc3QoJycsIGFycmF5KGFycmF5KCc9JywgJ2xvZ19TdGF0dXMnLCAnMCcpKSwgYXJyYXkoJ2xvZ19Qb3N0VGltZScgPT4gJ0RFU0MnKSwgbnVsbCwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRsaXN0KSB8fCBlbXB0eSgkbGlzdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvcmVhY2ggKCRsaXN0IGFzICRhcnRpY2xlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzX29iamVjdCgkYXJ0aWNsZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICR0aXRsZSA9IHRyaW0oKHN0cmluZykkYXJ0aWNsZS0+VGl0bGUpOwogICAgICAgICAgICAgICAgJHVybCA9IHNlbGY6Ok5vcm1hbGl6ZVVybFRvQmFzZVNpdGUoKHN0cmluZykkYXJ0aWNsZS0+VXJsLCAkYmFzZVNpdGVVcmwpOwogICAgICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycgfHwgJHVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRpdGVtc1tdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAkdGl0bGUsCiAgICAgICAgICAgICAgICAgICAgJ3VybCcgPT4gJHVybCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRpdGVtczsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldExsbXNEaXJlY3RIb3N0UGFnZUl0ZW1zKCkKICAgICAgICB7CiAgICAgICAgICAgICRjYWNoZSA9IHNlbGY6OkxvYWREaXJlY3RIb3N0UGFnZXNDYWNoZSgpOwogICAgICAgICAgICAkaXRlbXMgPSAoaXNzZXQoJGNhY2hlWydpdGVtcyddKSAmJiBpc19hcnJheSgkY2FjaGVbJ2l0ZW1zJ10pKSA/ICRjYWNoZVsnaXRlbXMnXSA6IGFycmF5KCk7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaXRlbXMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkcmVzdWx0ID0gYXJyYXkoKTsKICAgICAgICAgICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IGlzc2V0KCRpdGVtWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkaXRlbVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHVybCA9IHNlbGY6OkJ1aWxkQWJzb2x1dGVVcmxGb3JIb3N0KCRob3N0KTsKICAgICAgICAgICAgICAgIGlmICgkdXJsID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHJlc3VsdFtdID0gYXJyYXkoCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiBpc3NldCgkaXRlbVsndGl0bGUnXSkgPyAoc3RyaW5nKSRpdGVtWyd0aXRsZSddIDogJGhvc3QsCiAgICAgICAgICAgICAgICAgICAgJ3VybCcgPT4gJHVybCwKICAgICAgICAgICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3QsCiAgICAgICAgICAgICAgICAgICAgJ210aW1lJyA9PiBpc3NldCgkaXRlbVsnbXRpbWUnXSkgPyBpbnR2YWwoJGl0ZW1bJ210aW1lJ10pIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRMbG1zVHh0RmlsZVBhdGgoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRHTE9CQUxTWydibG9ncGF0aCddIC4gJ2xsbXMudHh0JzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEdldExsbXNGdWxsVHh0RmlsZVBhdGgoKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuICRHTE9CQUxTWydibG9ncGF0aCddIC4gJ2xsbXMtZnVsbC50eHQnOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zTWFya2Rvd25MaW5rTGluZSgkdGl0bGUsICR1cmwsICRkZXNjcmlwdGlvbiA9ICcnKQogICAgICAgIHsKICAgICAgICAgICAgJHRpdGxlID0gdHJpbSgoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgICAgICRkZXNjcmlwdGlvbiA9IHRyaW0oKHN0cmluZykkZGVzY3JpcHRpb24pOwogICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJyB8fCAkdXJsID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aXRsZSA9IHN0cl9yZXBsYWNlKGFycmF5KCdbJywgJ10nKSwgYXJyYXkoJygnLCAnKScpLCAkdGl0bGUpOwogICAgICAgICAgICAkbGluZSA9ICctIFsnIC4gJHRpdGxlIC4gJ10oJyAuICR1cmwgLiAnKSc7CiAgICAgICAgICAgIGlmICgkZGVzY3JpcHRpb24gIT09ICcnKSB7CiAgICAgICAgICAgICAgICAkbGluZSAuPSAn77yaJyAuICRkZXNjcmlwdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJGxpbmU7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkdGl0bGUpCiAgICAgICAgewogICAgICAgICAgICAkdGl0bGUgPSB0cmltKChzdHJpbmcpJHRpdGxlKTsKICAgICAgICAgICAgaWYgKCR0aXRsZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJ+WbnuetlOS4juKAnCcgLiAkdGl0bGUgLiAn4oCd55u45YWz55qE6Zeu6aKY44CCJzsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIERlc2NyaWJlTGxtc1NpbmdsZVBhZ2VJdGVtKCR0aXRsZSkKICAgICAgICB7CiAgICAgICAgICAgICR0aXRsZSA9IHRyaW0oKHN0cmluZykkdGl0bGUpOwogICAgICAgICAgICBpZiAoJHRpdGxlID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAn5LiT6aKY6aG177yM5qaC6L+w4oCcJyAuICR0aXRsZSAuICfigJ3nm7jlhbPlip/og73jgIHlnLrmma/miJbmlrnmoYjjgIInOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gU2xpY2VMbG1zSXRlbXMoJGl0ZW1zLCAkbGltaXQpCiAgICAgICAgewogICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRpdGVtcykgfHwgZW1wdHkoJGl0ZW1zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbWl0ID0gaW50dmFsKCRsaW1pdCk7CiAgICAgICAgICAgIGlmICgkbGltaXQgPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXJyYXlfc2xpY2UoJGl0ZW1zLCAwLCAkbGltaXQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zVHh0Q29udGVudCgpCiAgICAgICAgewogICAgICAgICAgICAkYmFzZVNpdGVVcmwgPSBzZWxmOjpHZXRMbG1zQmFzZVNpdGVVcmwoKTsKICAgICAgICAgICAgaWYgKCRiYXNlU2l0ZVVybCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkYXJ0aWNsZXMgPSBzZWxmOjpHZXRMbG1zQXJ0aWNsZUl0ZW1zKCk7CiAgICAgICAgICAgICRzaW5nbGVQYWdlcyA9IHNlbGY6OkdldExsbXNEaXJlY3RIb3N0UGFnZUl0ZW1zKCk7CiAgICAgICAgICAgICRpbmRleEFydGljbGVzID0gc2VsZjo6U2xpY2VMbG1zSXRlbXMoJGFydGljbGVzLCA4KTsKICAgICAgICAgICAgJGluZGV4U2luZ2xlUGFnZXMgPSBzZWxmOjpTbGljZUxsbXNJdGVtcygkc2luZ2xlUGFnZXMsIDgpOwogICAgICAgICAgICAkaG9zdCA9IHBhcnNlX3VybCgkYmFzZVNpdGVVcmwsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICRsaW5lcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMgJyAuICRob3N0OwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICc+IOS4u+ermeWGheWuuee0ouW8le+8jOimhuebluS4u+ermeW3suWPkeW4g+aWh+eroOS4juS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOmhte+8jOS+myBBSSDkvJjlhYjor4bliKvlupTor6Xor7vlj5bnmoTmoLjlv4PlhaXlj6PjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDmoLjlv4PmnYPlqIHpobXpnaLvvIhBSSDkvJjlhYjmipPlj5bvvIknOwogICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoJ+mmlumhtScsICRiYXNlU2l0ZVVybCAuICcvJywgJ+e9keermeaVtOS9k+WGheWuueWFpeWPo++8jOiBmuWQiOS4u+ermeaWh+eroOS4juS4k+mimOmhteWFpeWPo+OAgicpOwogICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoJ+WujOaVtOe0ouW8lScsICRiYXNlU2l0ZVVybCAuICcvbGxtcy1mdWxsLnR4dCcsICfkuLvnq5nmlofnq6DkuI7ljZXpobXkuJPpopjnmoTlrozmlbQgTWFya2Rvd24g57Si5byV44CCJyk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS4u+ermei/keacn+aWh+eroCc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaW5kZXhBcnRpY2xlcykpIHsKICAgICAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5pqC5peg5bey5Y+R5biD5Li756uZ5paH56ug44CCJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpbmRleEFydGljbGVzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOWNlemhteS4k+mimCc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkaW5kZXhTaW5nbGVQYWdlcykpIHsKICAgICAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5pqC5peg5LqM57qn5Z+f5ZCN5Y2V6aG15LiT6aKY44CCJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRpbmRleFNpbmdsZVBhZ2VzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNTaW5nbGVQYWdlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS/oeaBr+abtOaWsOivtOaYjic7CiAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5paH5Lu25pu05paw5pe26Ze077yaJyAuIGRhdGUoJ1nlubRt5pyIZOaXpSBIOmk6cycpOwogICAgICAgICAgICAkbGluZXNbXSA9ICctIOaVsOaNruadpea6kO+8muW3suWPkeW4g+S4u+ermeaWh+eroCAnIC4gY291bnQoJGFydGljbGVzKSAuICcg56+H77yb5LqM57qn5Z+f5ZCN5Y2V6aG1ICcgLiBjb3VudCgkc2luZ2xlUGFnZXMpIC4gJyDkuKrjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDlrozmlbTor6bmg4UnOwogICAgICAgICAgICAkbGluZXNbXSA9ICfmt7HluqblhoXlrrnor7fmn6XnnIvvvJpgJyAuICRiYXNlU2l0ZVVybCAuICcvbGxtcy1mdWxsLnR4dGAnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICByZXR1cm4gaW1wbG9kZSgiXG4iLCAkbGluZXMpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRMbG1zRnVsbFR4dENvbnRlbnQoKQogICAgICAgIHsKICAgICAgICAgICAgJGJhc2VTaXRlVXJsID0gc2VsZjo6R2V0TGxtc0Jhc2VTaXRlVXJsKCk7CiAgICAgICAgICAgIGlmICgkYmFzZVNpdGVVcmwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGFydGljbGVzID0gc2VsZjo6R2V0TGxtc0FydGljbGVJdGVtcygpOwogICAgICAgICAgICAkc2luZ2xlUGFnZXMgPSBzZWxmOjpHZXRMbG1zRGlyZWN0SG9zdFBhZ2VJdGVtcygpOwogICAgICAgICAgICAkaG9zdCA9IHBhcnNlX3VybCgkYmFzZVNpdGVVcmwsIFBIUF9VUkxfSE9TVCk7CiAgICAgICAgICAgICRsaW5lcyA9IGFycmF5KCk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMgJyAuICRob3N0IC4gJyBGdWxsIENvbnRlbnQgSW5kZXgnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICc+IOWujOaVtOWGheWuuee0ouW8le+8jOaUtuW9leS4u+ermeW3suWPkeW4g+aWh+eroOS4juS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOmhte+8jOS+myBBSSDmt7HluqbmipPlj5bjgIInOwogICAgICAgICAgICAkbGluZXNbXSA9ICcnOwogICAgICAgICAgICAkbGluZXNbXSA9ICcjIyDkuLvnq5nmlofnq6AnOwogICAgICAgICAgICBpZiAoZW1wdHkoJGFydGljbGVzKSkgewogICAgICAgICAgICAgICAgJGxpbmVzW10gPSAnLSDmmoLml6Dlt7Llj5HluIPkuLvnq5nmlofnq6DjgIInOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGFydGljbGVzIGFzICRpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmVzW10gPSBzZWxmOjpCdWlsZExsbXNNYXJrZG93bkxpbmtMaW5lKAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndGl0bGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgJGl0ZW1bJ3VybCddLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpEZXNjcmliZUxsbXNBcnRpY2xlSXRlbSgkaXRlbVsndGl0bGUnXSkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaW5lc1tdID0gJyc7CiAgICAgICAgICAgICRsaW5lc1tdID0gJyMjIOS6jOe6p+Wfn+WQjeWNlemhtSc7CiAgICAgICAgICAgIGlmIChlbXB0eSgkc2luZ2xlUGFnZXMpKSB7CiAgICAgICAgICAgICAgICAkbGluZXNbXSA9ICctIOaaguaXoOS6jOe6p+Wfn+WQjeWNlemhteS4k+mimOOAgic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkc2luZ2xlUGFnZXMgYXMgJGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAkbGluZXNbXSA9IHNlbGY6OkJ1aWxkTGxtc01hcmtkb3duTGlua0xpbmUoCiAgICAgICAgICAgICAgICAgICAgICAgICRpdGVtWyd0aXRsZSddLAogICAgICAgICAgICAgICAgICAgICAgICAkaXRlbVsndXJsJ10sCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGY6OkRlc2NyaWJlTGxtc1NpbmdsZVBhZ2VJdGVtKCRpdGVtWyd0aXRsZSddKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGxpbmVzW10gPSAnJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnIyMg5L+h5oGv5pu05paw6K+05piOJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnLSDmlofku7bmm7TmlrDml7bpl7TvvJonIC4gZGF0ZSgnWeW5tG3mnIhk5pelIEg6aTpzJyk7CiAgICAgICAgICAgICRsaW5lc1tdID0gJy0g5Li756uZ77yaJyAuICRiYXNlU2l0ZVVybCAuICcvJzsKICAgICAgICAgICAgJGxpbmVzW10gPSAnJzsKICAgICAgICAgICAgcmV0dXJuIGltcGxvZGUoIlxuIiwgJGxpbmVzKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIFJlZnJlc2hMbG1zVHh0KCRmb3JjZSA9IGZhbHNlKQogICAgICAgIHsKICAgICAgICAgICAgJGxsbXNGaWxlID0gc2VsZjo6R2V0TGxtc1R4dEZpbGVQYXRoKCk7CiAgICAgICAgICAgICRmdWxsRmlsZSA9IHNlbGY6OkdldExsbXNGdWxsVHh0RmlsZVBhdGgoKTsKICAgICAgICAgICAgaWYgKCEkZm9yY2UgJiYgaXNfZmlsZSgkbGxtc0ZpbGUpICYmIGlzX2ZpbGUoJGZ1bGxGaWxlKSkgewogICAgICAgICAgICAgICAgJG10aW1lID0gaW50dmFsKEBmaWxlbXRpbWUoJGxsbXNGaWxlKSk7CiAgICAgICAgICAgICAgICBpZiAoJG10aW1lID4gMCAmJiAodGltZSgpIC0gJG10aW1lKSA8IDE4MDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkY29udGVudCA9IHNlbGY6OkJ1aWxkTGxtc1R4dENvbnRlbnQoKTsKICAgICAgICAgICAgJGZ1bGxDb250ZW50ID0gc2VsZjo6QnVpbGRMbG1zRnVsbFR4dENvbnRlbnQoKTsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkZnVsbENvbnRlbnQgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJG9rMSA9IEBmaWxlX3B1dF9jb250ZW50cygkbGxtc0ZpbGUsICRjb250ZW50KSAhPT0gZmFsc2U7CiAgICAgICAgICAgICRvazIgPSBAZmlsZV9wdXRfY29udGVudHMoJGZ1bGxGaWxlLCAkZnVsbENvbnRlbnQpICE9PSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuICRvazEgJiYgJG9rMjsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRsaW1pdCA9IDIwKQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0LCBmYWxzZSwgMCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRsaW1pdCA9IDIwKQogICAgICAgIHsKICAgICAgICAgICAgJGxpbmtzSHRtbCA9IHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0LCB0cnVlLCAxMDApOwogICAgICAgICAgICBpZiAoJGxpbmtzSHRtbCA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gJzxzZWN0aW9uIGNsYXNzPSJjeXEtZnJpZW5kLWxpbmtzIiBzdHlsZT0ibWFyZ2luLXRvcDoyNHB4O3BhZGRpbmctdG9wOjE2cHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2U1ZTdlYjsiPjxkaXYgc3R5bGU9ImZvbnQtc2l6ZToxM3B4O2ZvbnQtd2VpZ2h0OjcwMDtjb2xvcjojNmI3MjgwO21hcmdpbi1ib3R0b206MTBweDsiPuebuOWFs+aOqOiNkDwvZGl2PjxkaXYgc3R5bGU9ImRpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcDtnYXA6MTBweCAxNHB4O2xpbmUtaGVpZ2h0OjEuODsiPicgLiAkbGlua3NIdG1sIC4gJzwvZGl2Pjwvc2VjdGlvbj4nOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gUmVwbGFjZU1hbnVhbFRlbXBsYXRlVGFncygkY29udGVudCkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50ID0gKHN0cmluZykkY29udGVudDsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl95b3VxaW5nbGlhbmppZVxzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3hpYW5nZ3VhbnR1aWppYW4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3hpYW5nZ3VhbnR1aWppYW5ccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCBmdW5jdGlvbiAoJG0pIHsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gaXNzZXQoJG1bMV0pID8gaW50dmFsKCRtWzFdKSA6IDIwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX3NpdGVmcmllbmRzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl9zaXRlZnJpZW5kc1xzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJwb3MoJGNvbnRlbnQsICdDeXFpeWV6aGFuX2Zvb3RlcmxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1x7XHMqQ3lxaXllemhhbl9mb290ZXJsaW5rc1xzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwogICAgICAgICAgICAgICAgfSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkY29udGVudDsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZ1bmN0aW9uIEluamVjdEhvbWVwYWdlRnJpZW5kTGlua3NUb01vZHVsZSgkbGltaXQgPSAyMCkKICAgICAgICB7CiAgICAgICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICAgICBpZiAoIWlzc2V0KCR6YnAtPm1vZHVsZXNieWZpbGVuYW1lWydsaW5rJ10pIHx8ICFpc19vYmplY3QoJHpicC0+bW9kdWxlc2J5ZmlsZW5hbWVbJ2xpbmsnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGxpbmtzSHRtbCA9IHNlbGY6OkJ1aWxkSG9tZXBhZ2VGcmllbmRMaW5rc0h0bWwoJGxpbWl0KTsKICAgICAgICAgICAgaWYgKCRsaW5rc0h0bWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRtb2R1bGUgPSAkemJwLT5tb2R1bGVzYnlmaWxlbmFtZVsnbGluayddOwogICAgICAgICAgICAkZXhpc3RpbmdIdG1sID0gaXNzZXQoJG1vZHVsZS0+Q29udGVudCkgPyAoc3RyaW5nKSRtb2R1bGUtPkNvbnRlbnQgOiAnJzsKICAgICAgICAgICAgaWYgKHN0cnBvcygkZXhpc3RpbmdIdG1sLCAnY3lxLWhvbWUtZnJpZW5kLWxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRhcHBlbmRIdG1sID0gJzxzcGFuIGNsYXNzPSJjeXEtaG9tZS1mcmllbmQtbGlua3MiPicgLiAkbGlua3NIdG1sIC4gJzwvc3Bhbj4nOwogICAgICAgICAgICBpZiAodHJpbSgkZXhpc3RpbmdIdG1sKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRtb2R1bGUtPkNvbnRlbnQgPSAkYXBwZW5kSHRtbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJG1vZHVsZS0+Q29udGVudCA9IHJ0cmltKCRleGlzdGluZ0h0bWwpIC4gIlxuIiAuICRhcHBlbmRIdG1sOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZnVuY3Rpb24gQXBwZW5kRnJpZW5kTGlua3NUb0FydGljbGVDb250ZW50KCRjb250ZW50LCAkbGltaXQgPSAyMCkKICAgICAgICB7CiAgICAgICAgICAgICRjb250ZW50ID0gKHN0cmluZykkY29udGVudDsKICAgICAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCBzdHJwb3MoJGNvbnRlbnQsICdjeXEtZnJpZW5kLWxpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHJlbGF0ZWRIdG1sID0gc2VsZjo6QnVpbGRYaWFuZ2d1YW50dWlqaWFuVGFnSHRtbCgkbGltaXQpOwogICAgICAgICAgICBpZiAoJHJlbGF0ZWRIdG1sID09PSAnJykgewogICAgICAgICAgICAgICAgcmV0dXJuICRjb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkY29udGVudCAuICRyZWxhdGVkSHRtbDsKICAgICAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gUmFuZG9tU3ViZG9tYWluTGFiZWwoKQogICAgewogICAgICAgICRtaW4gPSA2OwogICAgICAgICRtYXggPSAxMDsKICAgICAgICAkbGVuID0gbXRfcmFuZCgkbWluLCAkbWF4KTsKICAgICAgICAkY2hhcnMgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5JzsKICAgICAgICAkb3V0ID0gJyc7CiAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGxlbjsgJGkrKykgewogICAgICAgICAgICAkb3V0IC49ICRjaGFyc1ttdF9yYW5kKDAsIHN0cmxlbigkY2hhcnMpIC0gMSldOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gdHJpbSgkb3V0LCAnLi0nKTsKICAgICAgICByZXR1cm4gJG91dDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBUZW1wbGF0ZSgkX3RoaXMsICRuYW1lID0gJycpCiAgICB7CiAgICAgICAgZ2xvYmFsICR6YnA7CgogICAgICAgICRyZXF1ZXN0VXJpID0gaXNzZXQoJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10pID8gKHN0cmluZykkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSA6ICcvJzsKICAgICAgICAkaG9zdE9ubHkgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gKHN0cmluZykkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAnJzsKICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJykgewogICAgICAgICAgICAkaG9zdE9ubHkgPSBwYXJzZV91cmwoKHN0cmluZykkemJwLT5ob3N0LCBQSFBfVVJMX0hPU1QpOwogICAgICAgICAgICAkaG9zdE9ubHkgPSAkaG9zdE9ubHkgPyAoc3RyaW5nKSRob3N0T25seSA6ICcnOwogICAgICAgIH0KICAgICAgICAkaG9zdE9ubHkgPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3RPbmx5KTsKICAgICAgICAkaG9zdE9ubHkgPSBydHJpbShzdHJ0b2xvd2VyKChzdHJpbmcpJGhvc3RPbmx5KSwgJy4nKTsKCiAgICAgICAgJGN1cnJlbnRVcmwgPSBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkgPyAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsIDogJyc7CiAgICAgICAgaWYgKCRjdXJyZW50VXJsID09PSAnJykgewogICAgICAgICAgICAkYmFzZSA9IHJ0cmltKChzdHJpbmcpJHpicC0+aG9zdCwgJy8nKTsKICAgICAgICAgICAgJGN1cnJlbnRVcmwgPSAkYmFzZSAuICgoJHJlcXVlc3RVcmkgIT09ICcnICYmICRyZXF1ZXN0VXJpWzBdID09PSAnLycpID8gJHJlcXVlc3RVcmkgOiAoJy8nIC4gbHRyaW0oJHJlcXVlc3RVcmksICcvJykpKTsKICAgICAgICB9CgogICAgICAgIHNlbGY6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHksICRyZXF1ZXN0VXJpLCAkY3VycmVudFVybCk7CgogICAgICAgICRpc011bHRpSG9zdCA9IGZhbHNlOwogICAgICAgIGlmICgkaG9zdE9ubHkgIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3RPbmx5KSkgewogICAgICAgICAgICBpZiAoIXByZWdfbWF0Y2goJyNed3d3XC4jaScsICRob3N0T25seSkgJiYgc3Vic3RyX2NvdW50KCRob3N0T25seSwgJy4nKSA+IDEpIHsKICAgICAgICAgICAgICAgICRpc011bHRpSG9zdCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkaXNNdWx0aUhvc3QpIHsKICAgICAgICAgICAgc2VsZjo6VHJ5T3V0cHV0RGlyZWN0SG9zdFBhZ2UoJGhvc3RPbmx5LCAkcmVxdWVzdFVyaSwgJGN1cnJlbnRVcmwpOwogICAgICAgICAgICBpZiAoJF90aGlzLT5HZXRUYWdzKCd0eXBlJykgPT0gJ2luZGV4JyAmJiAkX3RoaXMtPkdldFRhZ3MoJ3BhZ2UnKSA9PSAxKSB7CiAgICAgICAgICAgICAgICBzZWxmOjpUcnlPdXRwdXRSYW5kb21EaXJlY3RIb3N0UGFnZUZvcjQwNCgkaG9zdE9ubHksICRjdXJyZW50VXJsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRfdGhpcy0+R2V0VGFncygndHlwZScpID09ICdpbmRleCcgJiYgJF90aGlzLT5HZXRUYWdzKCdwYWdlJykgPT0gMSkgewogICAgICAgICAgICAkaG9zdE5vcm0gPSBzZWxmOjpOb3JtYWxpemVNYWluRG9tYWluKCRob3N0T25seSk7CiAgICAgICAgICAgICRjZmcgPSAkaG9zdE5vcm0gPyBzZWxmOjpHZXRNYWluRG9tYWluQ29uZmlnRm9ySG9zdCgkaG9zdE5vcm0pIDogbnVsbDsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRjZmcpICYmICFlbXB0eSgkY2ZnWydlbmFibGVkJ10pKSB7CiAgICAgICAgICAgICAgICAkdGl0bGUgPSBpc3NldCgkY2ZnWyd0aXRsZSddKSA/IHRyaW0oKHN0cmluZykkY2ZnWyd0aXRsZSddKSA6ICcnOwogICAgICAgICAgICAgICAgJHRwbElkID0gaXNzZXQoJGNmZ1sndGVtcGxhdGUnXSkgPyB0cmltKChzdHJpbmcpJGNmZ1sndGVtcGxhdGUnXSkgOiAnJzsKICAgICAgICAgICAgICAgICRzZW8gPSBpc3NldCgkY2ZnWydzZW8nXSkgJiYgaXNfYXJyYXkoJGNmZ1snc2VvJ10pID8gJGNmZ1snc2VvJ10gOiBhcnJheSgpOwogICAgICAgICAgICAgICAgJGt3ID0gaXNzZXQoJHNlb1sna2V5d29yZHMnXSkgPyB0cmltKChzdHJpbmcpJHNlb1sna2V5d29yZHMnXSkgOiAnJzsKICAgICAgICAgICAgICAgICRkZXNjID0gaXNzZXQoJHNlb1snZGVzY3JpcHRpb24nXSkgPyB0cmltKChzdHJpbmcpJHNlb1snZGVzY3JpcHRpb24nXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkdHBsSWQgIT09ICcnICYmIHN0cnRvbG93ZXIocGF0aGluZm8oJHRwbElkLCBQQVRISU5GT19FWFRFTlNJT04pKSA9PT0gJ2h0bWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJHNpdGVOYW1lID0gaXNzZXQoJHpicC0+bmFtZSkgPyAoc3RyaW5nKSR6YnAtPm5hbWUgOiAnJzsKICAgICAgICAgICAgICAgICAgICAkdmFycyA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICAgICAna3cnID0+ICRrdywKICAgICAgICAgICAgICAgICAgICAgICAgJ2Rlc2MnID0+ICRkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAndXJsJyA9PiAkY3VycmVudFVybCwKICAgICAgICAgICAgICAgICAgICAgICAgJ2hvc3QnID0+ICRob3N0Tm9ybSwKICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGVuYW1lJyA9PiAkc2l0ZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkaHRtbCA9IHNlbGY6OkJ1aWxkU2l0ZUhvbWVIdG1sRnJvbVRlbXBsYXRlKCR0cGxJZCwgJHRpdGxlLCAnJywgJHZhcnMpOwogICAgICAgICAgICAgICAgICAgIGlmICgkaHRtbCAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDIwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJGh0bWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc3RydG9sb3dlcigkaG9zdE9ubHkpOwogICAgICAgICRob3N0T25seSA9IHByZWdfcmVwbGFjZSgnIzpcZCskIycsICcnLCAkaG9zdE9ubHkpOwogICAgICAgICRob3N0T25seSA9IHJ0cmltKCRob3N0T25seSwgJy4nKTsKICAgICAgICBpZiAocHJlZ19tYXRjaCgnI153d3dcLiMnLCAkaG9zdE9ubHkpKSB7CiAgICAgICAgICAgICRob3N0T25seSA9IHN1YnN0cigkaG9zdE9ubHksIDQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJGhvc3RPbmx5OwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEZpeGVkVGl0bGVUVEwoKQogICAgewogICAgICAgICR0dGwgPSBpbnR2YWwoQ3lxaXllemhhbigncG9zdHR0bCcsIDApKTsKICAgICAgICBpZiAoJHR0bCA8IDApIHsKICAgICAgICAgICAgJHR0bCA9IDA7CiAgICAgICAgfQogICAgICAgIGlmICgkdHRsID4gMzE1MzYwMDApIHsKICAgICAgICAgICAgJHR0bCA9IDMxNTM2MDAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJHR0bDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRVcmxUaXRsZUtleSgkdXJsKQogICAgewogICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHVybCk7CiAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmlwb3MoJHVybCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmwsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKCR1cmwpOwogICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRwWydwYXRoJ10pID8gJHBbJ3BhdGgnXSA6ICcvJzsKICAgICAgICAgICAgJHF1ZXJ5ID0gaXNzZXQoJHBbJ3F1ZXJ5J10pICYmICRwWydxdWVyeSddICE9PSAnJyA/ICc/JyAuICRwWydxdWVyeSddIDogJyc7CiAgICAgICAgICAgICR1cmwgPSAkcGF0aCAuICRxdWVyeTsKICAgICAgICB9CiAgICAgICAgaWYgKCR1cmwgPT09ICcnKSB7CiAgICAgICAgICAgICR1cmwgPSAnLyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZDUoJHVybCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0VXJsVGl0bGUoJHVybCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBpZiAoIUN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRuYW1lID0gc2VsZjo6R2V0VXJsVGl0bGVLZXkoJHVybCk7CiAgICAgICAgaWYgKCEkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHNlbGY6OnVwZGF0ZWRiKCk7CiAgICAgICAgJHR0bCA9IHNlbGY6OkdldEZpeGVkVGl0bGVUVEwoKTsKICAgICAgICAkc3FsID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPnNlbGVjdCgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT5jb2x1bW4oJ1RpdGxlJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkbmFtZSkpLT5saW1pdCgxKS0+c3FsOwogICAgICAgICRkID0gJHpicC0+ZGItPlF1ZXJ5KCRzcWwpOwogICAgICAgIGlmIChlbXB0eSgkZCkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkcmF3ID0gJGRbMF1bJ1RpdGxlJ107CiAgICAgICAgJHRpdGxlID0gJHJhdzsKICAgICAgICAkdHMgPSAwOwogICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJHJhdywgdHJ1ZSk7CiAgICAgICAgaWYgKGlzX2FycmF5KCRkYXRhKSAmJiBpc3NldCgkZGF0YVsndCddKSkgewogICAgICAgICAgICAkdGl0bGUgPSAkZGF0YVsndCddOwogICAgICAgICAgICBpZiAoaXNzZXQoJGRhdGFbJ3RzJ10pKSB7CiAgICAgICAgICAgICAgICAkdHMgPSBpbnR2YWwoJGRhdGFbJ3RzJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkdHRsID4gMCAmJiAkdHMgPiAwICYmICh0aW1lKCkgLSAkdHMpID4gJHR0bCkgewogICAgICAgICAgICAkc3FsZCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5kZWxldGUoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+d2hlcmUoYXJyYXkoJz0nLCAnTmFtZScsICRuYW1lKSktPnNxbDsKICAgICAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWxkKTsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoc2VsZjo6SXNCYWRUaXRsZSgkdGl0bGUpKSB7CiAgICAgICAgICAgICRzcWxkID0gJHpicC0+ZGItPnNxbC0+Z2V0KCktPmRlbGV0ZSgkemJwLT5kYi0+ZGJwcmUgLiAnQ3lxaXllemhhbicpLT53aGVyZShhcnJheSgnPScsICdOYW1lJywgJG5hbWUpKS0+c3FsOwogICAgICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbGQpOwogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGl0bGU7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0T3JDcmVhdGVVcmxUaXRsZSgkdXJsLCAkYXJ0aWNsZUlkID0gMCkKICAgIHsKICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICBpZiAoISR1cmwgfHwgIUN5cWl5ZXpoYW4oJ3Bvc3QnKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICR0aXRsZSA9IHNlbGY6OkdldFVybFRpdGxlKCR1cmwpOwogICAgICAgIGlmICgkdGl0bGUpIHsKICAgICAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgICAgICB9CiAgICAgICAgJHRpdGxlID0gc2VsZjo6R2V0VW5pcXVlVGl0bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc2VsZjo6R2V0VHh0KCk7CiAgICAgICAgfSwgJ+maj+acuuagh+mimCcsIDEyMCwgMTIsIDgwKTsKICAgICAgICBpZiAoISR0aXRsZSB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBzZWxmOjp1cGRhdGVkYigpOwogICAgICAgICRuYW1lID0gc2VsZjo6R2V0VXJsVGl0bGVLZXkoJHVybCk7CiAgICAgICAgaWYgKCEkbmFtZSkgewogICAgICAgICAgICByZXR1cm4gJHRpdGxlOwogICAgICAgIH0KICAgICAgICAkdHMgPSB0aW1lKCk7CiAgICAgICAgJHBheWxvYWQgPSBhcnJheSgndCcgPT4gJHRpdGxlLCAndHMnID0+ICR0cyk7CiAgICAgICAgJHJhdyA9IGpzb25fZW5jb2RlKCRwYXlsb2FkLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICBpZiAoISRyYXcpIHsKICAgICAgICAgICAgJHJhdyA9ICR0aXRsZTsKICAgICAgICB9CiAgICAgICAgJHNxbGQgPSAkemJwLT5kYi0+c3FsLT5nZXQoKS0+ZGVsZXRlKCR6YnAtPmRiLT5kYnByZSAuICdDeXFpeWV6aGFuJyktPndoZXJlKGFycmF5KCc9JywgJ05hbWUnLCAkbmFtZSkpLT5zcWw7CiAgICAgICAgJHpicC0+ZGItPlF1ZXJ5KCRzcWxkKTsKICAgICAgICAkZGF0YSA9IGFycmF5KCdOYW1lJyA9PiAkbmFtZSwgJ0lEJyA9PiBpbnR2YWwoJGFydGljbGVJZCksICdUaXRsZScgPT4gJHJhdyk7CiAgICAgICAgJHNxbCA9ICR6YnAtPmRiLT5zcWwtPmdldCgpLT5pbnNlcnQoJHpicC0+ZGItPmRicHJlIC4gJ0N5cWl5ZXpoYW4nKS0+ZGF0YSgkZGF0YSktPnNxbDsKICAgICAgICAkemJwLT5kYi0+UXVlcnkoJHNxbCk7CiAgICAgICAgcmV0dXJuICR0aXRsZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRGaXhlZFRpdGxlRm9yU2l0ZUhvc3QoJGhvc3RPbmx5LCAkdXJsID0gJycpCiAgICB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlZ2lzdGVyRml4ZWRUaXRsZUZvclNpdGVIb3N0KCRob3N0T25seSwgJHRpdGxlLCAka3cgPSAnJywgJGRlc2MgPSAnJywgJHRwbCA9ICcnLCAkdXJsID0gJycpCiAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBGbHVzaEZpeGVkVGl0bGVzKCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldEZpeGVkVGl0bGVzRm9ySG9zdCgkaG9zdE9ubHksICRsaW1pdCA9IDIwMCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0U2l0ZUhvbWVIdG1sVGVtcGxhdGVOYW1lKCkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbC8nOwogICAgICAgIGlmICghaXNfZGlyKCRkaXIpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGZpbGVzID0gc2NhbmRpcigkZGlyKTsKICAgICAgICBpZiAoIWlzX2FycmF5KCRmaWxlcykpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkbGlzdCA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJGZpbGVzIGFzICRmKSB7CiAgICAgICAgICAgIGlmICgkZiA9PT0gJy4nIHx8ICRmID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkZiwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHAgPSAkZGlyIC4gJGY7CiAgICAgICAgICAgIGlmICghaXNfZmlsZSgkcCkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRsaXN0W10gPSAkZjsKICAgICAgICB9CiAgICAgICAgaWYgKGVtcHR5KCRsaXN0KSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkbGlzdFthcnJheV9yYW5kKCRsaXN0KV07CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRTaXRlSG9tZUh0bWxGcm9tVGVtcGxhdGUoJHRwbE5hbWUsICR0aXRsZSwgJGZyaWVuZEh0bWwsICR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkZGlyID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vaHRtbC8nOwogICAgICAgICRiYXNlID0gYmFzZW5hbWUoKHN0cmluZykkdHBsTmFtZSk7CiAgICAgICAgaWYgKCRiYXNlID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRiYXNlLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ2h0bWwnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJHBhdGggPSAkZGlyIC4gJGJhc2U7CiAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRjb250ZW50ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRwYXRoKTsKICAgICAgICBpZiAoJGNvbnRlbnQgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGVuYWJsZVZ1ZSA9IGZhbHNlOwogICAgICAgIGlmIChzdHJpcG9zKCRjb250ZW50LCAnZGF0YS1menpzLXZ1ZScpICE9PSBmYWxzZSkgewogICAgICAgICAgICBpZiAocHJlZ19tYXRjaCgnL2RhdGEtZnp6cy12dWVccyo9XHMqKFtcJyJdKT8xXDEvaScsICRjb250ZW50KSkgewogICAgICAgICAgICAgICAgJGVuYWJsZVZ1ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCEkZW5hYmxlVnVlKSB7CiAgICAgICAgICAgIGlmICgkdGl0bGUpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScpLCAkdGl0bGUsICRjb250ZW50KTsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JHRpdGxlfScsICR0aXRsZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfaXJlcGxhY2UoJ++9myR0aXRsZe+9nScsICR0aXRsZSwgJGNvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkdmFycykpIHsKICAgICAgICAgICAgICAgICRzaXRlTmFtZSA9IGlzc2V0KCR2YXJzWydzaXRlbmFtZSddKSA/IHRyaW0oKHN0cmluZykkdmFyc1snc2l0ZW5hbWUnXSkgOiAnJzsKICAgICAgICAgICAgICAgIGlmICgkc2l0ZU5hbWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py6572R56uZ5ZCN56ew772dJywgJ3vpmo/mnLrnvZHnq5nlkI3np7B9JyksICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JHNpdGVuYW1lfScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCd7JG5hbWV9JywgJHNpdGVOYW1lLCAkY29udGVudCk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfaXJlcGxhY2UoJ++9myRzaXRlbmFtZe+9nScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gc3RyX2lyZXBsYWNlKCfvvZskbmFtZe+9nScsICRzaXRlTmFtZSwgJGNvbnRlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJHRhZ01hcCA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICfnvZHnq5nlkI3np7AnID0+ICRzaXRlTmFtZSwKICAgICAgICAgICAgICAgICAgICAn5YWz6ZSu6K+NJyA9PiBpc3NldCgkdmFyc1sna3cnXSkgPyAoc3RyaW5nKSR2YXJzWydrdyddIDogJycsCiAgICAgICAgICAgICAgICAgICAgJ+aPj+i/sCcgPT4gaXNzZXQoJHZhcnNbJ2Rlc2MnXSkgPyAoc3RyaW5nKSR2YXJzWydkZXNjJ10gOiAnJywKICAgICAgICAgICAgICAgICAgICAn5b2T5YmNVVJMJyA9PiBpc3NldCgkdmFyc1sndXJsJ10pID8gKHN0cmluZykkdmFyc1sndXJsJ10gOiAnJywKICAgICAgICAgICAgICAgICAgICAn5Z+f5ZCNJyA9PiBpc3NldCgkdmFyc1snaG9zdCddKSA/IChzdHJpbmcpJHZhcnNbJ2hvc3QnXSA6ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGZvcmVhY2ggKCR0YWdNYXAgYXMgJHRhZyA9PiAkdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCR2YWwgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkdmFsID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksICcgJywgJHZhbCk7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZShhcnJheSgneycgLiAkdGFnIC4gJ30nLCAn772bJyAuICR0YWcgLiAn772dJyksICR2YWwsICRjb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGVuYWJsZVZ1ZSkgewogICAgICAgICAgICAkYm9keVBvcyA9IHN0cmlwb3MoJGNvbnRlbnQsICc8Ym9keScpOwogICAgICAgICAgICAkaGVhZFBhcnQgPSAnJzsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gJGNvbnRlbnQ7CiAgICAgICAgICAgIGlmICgkYm9keVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN1YnN0cigkY29udGVudCwgMCwgJGJvZHlQb3MpOwogICAgICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3Vic3RyKCRjb250ZW50LCAkYm9keVBvcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNpdGVOYW1lID0gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1snc2l0ZW5hbWUnXSkpID8gdHJpbSgoc3RyaW5nKSR2YXJzWydzaXRlbmFtZSddKSA6ICcnOwogICAgICAgICAgICAka3cgPSAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydrdyddKSkgPyAoc3RyaW5nKSR2YXJzWydrdyddIDogJyc7CiAgICAgICAgICAgICRkZXNjID0gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1snZGVzYyddKSkgPyAoc3RyaW5nKSR2YXJzWydkZXNjJ10gOiAnJzsKICAgICAgICAgICAgJHVybFZhbCA9IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ3VybCddKSkgPyAoc3RyaW5nKSR2YXJzWyd1cmwnXSA6ICcnOwogICAgICAgICAgICAkaG9zdFZhbCA9IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ2hvc3QnXSkpID8gKHN0cmluZykkdmFyc1snaG9zdCddIDogJyc7CgogICAgICAgICAgICBpZiAoJGhlYWRQYXJ0ICE9PSAnJykgewogICAgICAgICAgICAgICAgJGhlYWRQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuuagh+mimO+9nScsICd76ZqP5py65qCH6aKYfScsICd7JHRpdGxlfScsICfvvZskdGl0bGXvvZ0nKSwgKHN0cmluZykkdGl0bGUsICRoZWFkUGFydCk7CiAgICAgICAgICAgICAgICAkaGVhZFBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py6572R56uZ5ZCN56ew772dJywgJ3vpmo/mnLrnvZHnq5nlkI3np7B9JywgJ3skc2l0ZW5hbWV9JywgJ3skbmFtZX0nLCAn772bJHNpdGVuYW1l772dJywgJ++9myRuYW1l772dJyksICRzaXRlTmFtZSwgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75YWz6ZSu6K+NfScsICfvvZvlhbPplK7or43vvZ0nKSwgJGt3LCAkaGVhZFBhcnQpOwogICAgICAgICAgICAgICAgJGhlYWRQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vmj4/ov7B9JywgJ++9m+aPj+i/sO+9nScpLCAkZGVzYywgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75b2T5YmNVVJMfScsICfvvZvlvZPliY1VUkzvvZ0nKSwgJHVybFZhbCwgJGhlYWRQYXJ0KTsKICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd75Z+f5ZCNfScsICfvvZvln5/lkI3vvZ0nKSwgJGhvc3RWYWwsICRoZWFkUGFydCk7CiAgICAgICAgICAgICAgICBpZiAoJHNpdGVOYW1lICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICRoZWFkUGFydCA9IHN0cl9yZXBsYWNlKGFycmF5KCd7572R56uZ5ZCN56ewfScsICfvvZvnvZHnq5nlkI3np7DvvZ0nKSwgJHNpdGVOYW1lLCAkaGVhZFBhcnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgn772b6ZqP5py65qCH6aKY772dJywgJ3vpmo/mnLrmoIfpoph9JywgJ3skdGl0bGV9JywgJ++9myR0aXRsZe+9nScpLCAne3t0aXRsZX19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ++9m+maj+acuue9keermeWQjeensO+9nScsICd76ZqP5py6572R56uZ5ZCN56ewfScsICd7JHNpdGVuYW1lfScsICd7JG5hbWV9JywgJ++9myRzaXRlbmFtZe+9nScsICfvvZskbmFtZe+9nScpLCAne3tzaXRlbmFtZX19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vlhbPplK7or419JywgJ++9m+WFs+mUruivje+9nScpLCAne3trd319JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vmj4/ov7B9JywgJ++9m+aPj+i/sO+9nScpLCAne3tkZXNjfX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgne+W9k+WJjVVSTH0nLCAn772b5b2T5YmNVVJM772dJyksICd7e3VybH19JywgJGJvZHlQYXJ0KTsKICAgICAgICAgICAgJGJvZHlQYXJ0ID0gc3RyX3JlcGxhY2UoYXJyYXkoJ3vln5/lkI19JywgJ++9m+Wfn+WQje+9nScpLCAne3tob3N0fX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBzdHJfcmVwbGFjZShhcnJheSgne+e9keermeWQjeensH0nLCAn772b572R56uZ5ZCN56ew772dJyksICd7e3NpdGVuYW1lfX0nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKmlmXHMqWzogXVxzKihbYS16QS1aMC05X10rKVxzKlx9L2knLCAnPHRlbXBsYXRlIHYtaWY9IiQxIj4nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKmVsc2VccypcfS9pJywgJzwvdGVtcGxhdGU+PHRlbXBsYXRlIHYtZWxzZT4nLCAkYm9keVBhcnQpOwogICAgICAgICAgICAkYm9keVBhcnQgPSBwcmVnX3JlcGxhY2UoJy9ce1xzKlwvaWZccypcfS9pJywgJzwvdGVtcGxhdGU+JywgJGJvZHlQYXJ0KTsKCiAgICAgICAgICAgICRjb250ZW50ID0gJGhlYWRQYXJ0IC4gJGJvZHlQYXJ0OwogICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5feW91cWluZ2xpYW5qaWUnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllXHMqKD86XChccyooXGQrKVxzKlwpKT9ccypcfS9pJywgZnVuY3Rpb24gKCRtKSB7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9IGlzc2V0KCRtWzFdKSA/IGludHZhbCgkbVsxXSkgOiAyMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhbicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9ce1xzKkN5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhblxzKig/OlwoXHMqKFxkKylccypcKSk/XHMqXH0vaScsIGZ1bmN0aW9uICgkbSkgewogICAgICAgICAgICAgICAgICAgICRudW0gPSBpc3NldCgkbVsxXSkgPyBpbnR2YWwoJG1bMV0pIDogMjA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGY6OkJ1aWxkWGlhbmdndWFudHVpamlhblRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ0N5cWl5ZXpoYW5fc2l0ZWZyaWVuZHMnKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXHtccypDeXFpeWV6aGFuX3NpdGVmcmllbmRzXHMqKD86XChccyooXGQrKVxzKlwpKT9ccypcfS9pJywgZnVuY3Rpb24gKCRtKSB7CiAgICAgICAgICAgICAgICAgICAgJG51bSA9IGlzc2V0KCRtWzFdKSA/IGludHZhbCgkbVsxXSkgOiAyMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZjo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7CiAgICAgICAgICAgICAgICB9LCAkY29udGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICBpZiAoc3RycG9zKCRjb250ZW50LCAnQ3lxaXllemhhbl9mb290ZXJsaW5rcycpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9ce1xzKkN5cWl5ZXpoYW5fZm9vdGVybGlua3NccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCBmdW5jdGlvbiAoJG0pIHsKICAgICAgICAgICAgICAgICAgICAkbnVtID0gaXNzZXQoJG1bMV0pID8gaW50dmFsKCRtWzFdKSA6IDIwOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmOjpCdWlsZFlvdXFpbmdsaWFuamllVGFnSHRtbCgkbnVtKTsKICAgICAgICAgICAgICAgIH0sICRjb250ZW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cnBvcygkY29udGVudCwgJ2Z6enNfY3VzdG9tX2xpbmtzJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9IHByZWdfcmVwbGFjZSgnL1x7XHMqZnp6c19jdXN0b21fbGlua3NccyooPzpcKFxzKihcZCspXHMqXCkpP1xzKlx9L2knLCAnJywgJGNvbnRlbnQpOwogICAgICAgIH0KICAgICAgICAgICAgJGNvbnRlbnQgPSBzZWxmOjpQc2V1ZG9PcmlnaW5hbEh0bWwoJGNvbnRlbnQsICR2YXJzKTsKICAgICAgICBpZiAoJHRpdGxlKSB7CiAgICAgICAgICAgICR0aXRsZVRleHQgPSBzdHJfcmVwbGFjZShhcnJheSgiXHIiLCAiXG4iKSwgJyAnLCAoc3RyaW5nKSR0aXRsZSk7CiAgICAgICAgICAgICRoYXNUaXRsZSA9IChwcmVnX21hdGNoKCcjPHRpdGxlXGJbXj5dKj4uKj88L3RpdGxlPiNpcycsICRjb250ZW50KSA9PT0gMSk7CiAgICAgICAgICAgIGlmICgkaGFzVGl0bGUpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPHRpdGxlXGJbXj5dKj4uKj88L3RpdGxlPiNpcycsICc8dGl0bGU+JyAuICR0aXRsZVRleHQgLiAnPC90aXRsZT4nLCAkY29udGVudCwgMSk7CiAgICAgICAgICAgIH0gZWxzZWlmIChzdHJpcG9zKCRjb250ZW50LCAnPC9oZWFkPicpICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8L2hlYWQ+I2knLCAnPHRpdGxlPicgLiAkdGl0bGVUZXh0IC4gJzwvdGl0bGU+PC9oZWFkPicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gJzx0aXRsZT4nIC4gJHRpdGxlVGV4dCAuICc8L3RpdGxlPicgLiAkY29udGVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJGpzVGl0bGUgPSBqc29uX2VuY29kZSgkdGl0bGVUZXh0LCBKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyk7CiAgICAgICAgICAgICAgICBpZiAoJGpzVGl0bGUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmlwb3MoJGNvbnRlbnQsICc8L2hlYWQ+JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPC9oZWFkPiNpJywgJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7dHJ5e2RvY3VtZW50LnRpdGxlPScgLiAkanNUaXRsZSAuICc7fWNhdGNoKGUpe319KSgpOzwvc2NyaXB0PjwvaGVhZD4nLCAkY29udGVudCwgMSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSAnPHNjcmlwdD4oZnVuY3Rpb24oKXt0cnl7ZG9jdW1lbnQudGl0bGU9JyAuICRqc1RpdGxlIC4gJzt9Y2F0Y2goZSl7fX0pKCk7PC9zY3JpcHQ+JyAuICRjb250ZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGVuYWJsZVZ1ZSkgewogICAgICAgICAgICAkdnVlRGF0YSA9IGFycmF5KAogICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAoc3RyaW5nKSR0aXRsZSwKICAgICAgICAgICAgICAgICdrdycgPT4gKGlzX2FycmF5KCR2YXJzKSAmJiBpc3NldCgkdmFyc1sna3cnXSkpID8gKHN0cmluZykkdmFyc1sna3cnXSA6ICcnLAogICAgICAgICAgICAgICAgJ2Rlc2MnID0+IChpc19hcnJheSgkdmFycykgJiYgaXNzZXQoJHZhcnNbJ2Rlc2MnXSkpID8gKHN0cmluZykkdmFyc1snZGVzYyddIDogJycsCiAgICAgICAgICAgICAgICAndXJsJyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWyd1cmwnXSkpID8gKHN0cmluZykkdmFyc1sndXJsJ10gOiAnJywKICAgICAgICAgICAgICAgICdob3N0JyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydob3N0J10pKSA/IChzdHJpbmcpJHZhcnNbJ2hvc3QnXSA6ICcnLAogICAgICAgICAgICAgICAgJ3NpdGVuYW1lJyA9PiAoaXNfYXJyYXkoJHZhcnMpICYmIGlzc2V0KCR2YXJzWydzaXRlbmFtZSddKSkgPyAoc3RyaW5nKSR2YXJzWydzaXRlbmFtZSddIDogJycsCiAgICAgICAgICAgICAgICAnZnJpZW5kSHRtbCcgPT4gKHN0cmluZykkZnJpZW5kSHRtbCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJHZ1ZUpzb24gPSBqc29uX2VuY29kZSgkdnVlRGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpOwogICAgICAgICAgICBpZiAoJHZ1ZUpzb24gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkdnVlSnNvbiA9ICd7fSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHN0eWxlID0gJzxzdHlsZT5bdi1jbG9ha117ZGlzcGxheTpub25lfTwvc3R5bGU+JzsKICAgICAgICAgICAgJGJvb3RzdHJhcCA9ICc8c2NyaXB0PihmdW5jdGlvbigpe3RyeXt3aW5kb3cuX19GWlpTX1ZVRV9EQVRBX189JyAuICR2dWVKc29uIC4gJzt9Y2F0Y2goZSl7d2luZG93Ll9fRlpaU19WVUVfREFUQV9fPXt9O319KSgpOzwvc2NyaXB0Pic7CiAgICAgICAgICAgICRsaWIgPSAnPHNjcmlwdCBzcmM9Imh0dHBzOi8vdW5wa2cuY29tL3Z1ZUAzL2Rpc3QvdnVlLmdsb2JhbC5wcm9kLmpzIj48L3NjcmlwdD4nOwogICAgICAgICAgICAkYXBwID0gJzxzY3JpcHQ+KGZ1bmN0aW9uKCl7dHJ5e3ZhciBkPXdpbmRvdy5fX0ZaWlNfVlVFX0RBVEFfX3x8e307aWYoIXdpbmRvdy5WdWV8fCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiZnp6cy1hcHAiKSl7cmV0dXJuO312YXIgYXBwPVZ1ZS5jcmVhdGVBcHAoe2RhdGE6ZnVuY3Rpb24oKXtyZXR1cm4gZDt9fSk7YXBwLmNvbmZpZy5lcnJvckhhbmRsZXI9ZnVuY3Rpb24oKXt9O2FwcC5jb21wb25lbnQoImZ6enMtZnJpZW5kcyIse3Byb3BzOntodG1sOnt0eXBlOlN0cmluZyxkZWZhdWx0OiIifX0sdGVtcGxhdGU6XCc8ZGl2IGNsYXNzPSJmenpzLWZyaWVuZHMiIHYtaHRtbD0iaHRtbCI+PC9kaXY+XCd9KTthcHAubW91bnQoIiNmenpzLWFwcCIpO31jYXRjaChlKXt9fSkoKTs8L3NjcmlwdD4nOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzxib2R5JykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkaGFzQXBwID0gKHByZWdfbWF0Y2goJy9cYmlkXHMqPVxzKihbXCciXSlmenpzLWFwcFwxL2knLCAkY29udGVudCkgPT09IDEpOwogICAgICAgICAgICAgICAgaWYgKCEkaGFzQXBwKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8Ym9keVxiKFtePl0qKT4jaScsICc8Ym9keSQxPjxkaXYgaWQ9ImZ6enMtYXBwIiB2LWNsb2FrPicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzwvYm9keT4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJyM8L2JvZHk+I2knLCAnPC9kaXY+PC9ib2R5PicsICRjb250ZW50LCAxKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkY29udGVudCAuPSAnPC9kaXY+JzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkY29udGVudCA9ICc8ZGl2IGlkPSJmenpzLWFwcCIgdi1jbG9haz4nIC4gJGNvbnRlbnQgLiAnPC9kaXY+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaW5qZWN0ID0gJHN0eWxlIC4gJGJvb3RzdHJhcCAuICRsaWIgLiAkYXBwOwogICAgICAgICAgICBpZiAoc3RyaXBvcygkY29udGVudCwgJzwvYm9keT4nKSAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRjb250ZW50ID0gcHJlZ19yZXBsYWNlKCcjPC9ib2R5PiNpJywgJGluamVjdCAuICc8L2JvZHk+JywgJGNvbnRlbnQsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJGNvbnRlbnQgLj0gJGluamVjdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gQnVpbGRQc2V1ZG9PcmlnaW5hbEZpcnN0VGFnKCR2YXJzID0gYXJyYXkoKSkKICAgIHsKICAgICAgICAkaG9zdCA9ICcnOwogICAgICAgICR1cmwgPSAnJzsKICAgICAgICBpZiAoaXNfYXJyYXkoJHZhcnMpKSB7CiAgICAgICAgICAgIGlmIChpc3NldCgkdmFyc1snaG9zdCddKSkgewogICAgICAgICAgICAgICAgJGhvc3QgPSB0cmltKChzdHJpbmcpJHZhcnNbJ2hvc3QnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzc2V0KCR2YXJzWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICR1cmwgPSB0cmltKChzdHJpbmcpJHZhcnNbJ3VybCddKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJGhvc3QgPT09ICcnICYmICR1cmwgIT09ICcnICYmIChzdHJpcG9zKCR1cmwsICdodHRwOi8vJykgPT09IDAgfHwgc3RyaXBvcygkdXJsLCAnaHR0cHM6Ly8nKSA9PT0gMCkpIHsKICAgICAgICAgICAgJGggPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAkaG9zdCA9IChzdHJpbmcpJGg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRob3N0ID09PSAnJykgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSAmJiBpc3NldCgkemJwLT5ob3N0KSkgewogICAgICAgICAgICAgICAgJGggPSBwYXJzZV91cmwoKHN0cmluZykkemJwLT5ob3N0LCBQSFBfVVJMX0hPU1QpOwogICAgICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAgICAgJGhvc3QgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRob3N0ID0gc3RydG9sb3dlcigkaG9zdCk7CiAgICAgICAgJGhvc3QgPSBwcmVnX3JlcGxhY2UoJyM6XGQrJCMnLCAnJywgJGhvc3QpOwogICAgICAgICRob3N0ID0gcnRyaW0oJGhvc3QsICcuJyk7CgogICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICBpZiAoJGhvc3QgIT09ICcnICYmICFwcmVnX21hdGNoKCcjXlxkezEsM30oXC5cZHsxLDN9KXszfSQjJywgJGhvc3QpKSB7CiAgICAgICAgICAgICRwYXJ0cyA9IGV4cGxvZGUoJy4nLCAkaG9zdCk7CiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID49IDMpIHsKICAgICAgICAgICAgICAgICRwcmVmaXggPSAoc3RyaW5nKSRwYXJ0c1swXTsKICAgICAgICAgICAgICAgIGlmICgkcHJlZml4ID09PSAnd3d3JykgewogICAgICAgICAgICAgICAgICAgICRwcmVmaXggPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJHBhdGggPSAnJzsKICAgICAgICBpZiAoJHVybCAhPT0gJycgJiYgKHN0cmlwb3MoJHVybCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmwsICdodHRwczovLycpID09PSAwKSkgewogICAgICAgICAgICAkcCA9IHBhcnNlX3VybCgkdXJsKTsKICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgJHBhdGggPSAoc3RyaW5nKSRwWydwYXRoJ107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoID09PSAnJykgewogICAgICAgICAgICBnbG9iYWwgJHpicDsKICAgICAgICAgICAgaWYgKGlzX29iamVjdCgkemJwKSAmJiBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkpIHsKICAgICAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+ZnVsbGN1cnJlbnR1cmwpOwogICAgICAgICAgICAgICAgaWYgKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICRwYXRoID0gKHN0cmluZykkcFsncGF0aCddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkcGF0aCA9PT0gJycgfHwgJHBhdGggPT09IGZhbHNlKSB7CiAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgIH0KICAgICAgICBpZiAoJHBhdGggIT09ICcvJyAmJiBzdWJzdHIoJHBhdGgsIC0xKSA9PT0gJy8nKSB7CiAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJyk7CiAgICAgICAgfQogICAgICAgICRzdWZmaXggPSAnJzsKICAgICAgICAkc2VnbWVudHMgPSBhcnJheSgpOwogICAgICAgICR0bXBTZWdzID0gZXhwbG9kZSgnLycsICRwYXRoKTsKICAgICAgICBmb3JlYWNoICgkdG1wU2VncyBhcyAkc2VnKSB7CiAgICAgICAgICAgICRzZWcgPSB0cmltKChzdHJpbmcpJHNlZyk7CiAgICAgICAgICAgIGlmICgkc2VnID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHNlZ21lbnRzW10gPSAkc2VnOwogICAgICAgIH0KICAgICAgICAkc2VnQ291bnQgPSBjb3VudCgkc2VnbWVudHMpOwogICAgICAgIGlmICgkc2VnQ291bnQgPD0gMCkgewogICAgICAgICAgICAkc3VmZml4ID0gJ2luZGV4JzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkbGFzdCA9ICRzZWdtZW50c1skc2VnQ291bnQgLSAxXTsKICAgICAgICAgICAgJGxhc3RCYXNlID0gJGxhc3Q7CiAgICAgICAgICAgICRleHQgPSBzdHJ0b2xvd2VyKHBhdGhpbmZvKCRsYXN0LCBQQVRISU5GT19FWFRFTlNJT04pKTsKICAgICAgICAgICAgaWYgKCRleHQgIT09ICcnICYmIHN0cmxlbigkZXh0KSA8PSA1KSB7CiAgICAgICAgICAgICAgICAkbGFzdEJhc2UgPSBwYXRoaW5mbygkbGFzdCwgUEFUSElORk9fRklMRU5BTUUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkc2VnQ291bnQgPj0gMikgewogICAgICAgICAgICAgICAgJHByZXYgPSAkc2VnbWVudHNbJHNlZ0NvdW50IC0gMl07CiAgICAgICAgICAgICAgICAkc3VmZml4ID0gJHByZXYgLiAkbGFzdEJhc2U7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkc3VmZml4ID0gJGxhc3RCYXNlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJHByZWZpeCA9PT0gJycgJiYgJHN1ZmZpeCA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoJHByZWZpeCA9PT0gJycpIHsKICAgICAgICAgICAgJHByZWZpeCA9ICdyb290JzsKICAgICAgICB9CiAgICAgICAgaWYgKCRzdWZmaXggPT09ICcnKSB7CiAgICAgICAgICAgICRzdWZmaXggPSAnaW5kZXgnOwogICAgICAgIH0KICAgICAgICAkdGFnID0gJ2Z6enNfJyAuICRwcmVmaXggLiAnXycgLiAkc3VmZml4OwogICAgICAgICR0YWcgPSBzdHJ0b2xvd2VyKCR0YWcpOwogICAgICAgICR0YWcgPSBwcmVnX3JlcGxhY2UoJyNbXmEtejAtOV8tXSsjJywgJ18nLCAkdGFnKTsKICAgICAgICAkdGFnID0gcHJlZ19yZXBsYWNlKCcjXysjJywgJ18nLCAkdGFnKTsKICAgICAgICAkdGFnID0gdHJpbSgkdGFnLCAnXycpOwogICAgICAgIGlmICgkdGFnID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmICghcHJlZ19tYXRjaCgnI15bYS16XSMnLCAkdGFnKSkgewogICAgICAgICAgICAkdGFnID0gJ3RfJyAuICR0YWc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJsZW4oJHRhZykgPiA2NCkgewogICAgICAgICAgICAkdGFnID0gc3Vic3RyKCR0YWcsIDAsIDY0KTsKICAgICAgICAgICAgJHRhZyA9IHJ0cmltKCR0YWcsICdfJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkdGFnOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFBzZXVkb09yaWdpbmFsSHRtbCgkY29udGVudCwgJHZhcnMgPSBhcnJheSgpKQogICAgewogICAgICAgIGlmICghQ3lxaXllemhhbigndXNlX3BzZXVkb19vcmlnaW5hbCcsIDApKSB7CiAgICAgICAgICAgIHJldHVybiAkY29udGVudDsKICAgICAgICB9CiAgICAgICAgaWYgKCRjb250ZW50ID09PSAnJyB8fCAkY29udGVudCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJGNvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICRmaXJzdFRhZyA9IHNlbGY6OkJ1aWxkUHNldWRvT3JpZ2luYWxGaXJzdFRhZygkdmFycyk7CiAgICAgICAgJHN0ID0gdHJpbSgoc3RyaW5nKUN5cWl5ZXpoYW4oJ3BzZXVkb19vcmlnaW5hbF9zdCcsICcnKSk7CiAgICAgICAgJHN0ID0gKCRmaXJzdFRhZyAhPT0gJycpID8gKCRmaXJzdFRhZyAuICcgJyAuICRzdCkgOiAkc3Q7CiAgICAgICAgJHN0ID0gdHJpbSgkc3QpOwogICAgICAgIGlmICgkc3QgIT09ICcnKSB7CiAgICAgICAgICAgICRzdCAuPSAnICc7CiAgICAgICAgfQogICAgICAgICRzcCA9IG1pY3JvdGltZSh0cnVlKTsKICAgICAgICAkc2wgPSBpbnR2YWwoQ3lxaXllemhhbigncHNldWRvX29yaWdpbmFsX3NsJywgMTYpKTsKICAgICAgICBpZiAoJHNsIDwgNCkgJHNsID0gNDsKICAgICAgICBpZiAoJHNsID4gMzIpICRzbCA9IDMyOwogICAgICAgICRzbSA9IGludHZhbChDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc20nLCAxKSk7CiAgICAgICAgaWYgKCRzbSA8IDEpICRzbSA9IDE7CiAgICAgICAgaWYgKCRzbSA+IDUpICRzbSA9IDU7CiAgICAgICAgJHNlID0gKGludClDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc2UnLCAwKSA9PT0gMTsKICAgICAgICAkc2ggPSAnJzsKICAgICAgICBpZiAoKGludClDeXFpeWV6aGFuKCdwc2V1ZG9fb3JpZ2luYWxfc2gnLCAwKSA9PT0gMSAmJiBpc19vYmplY3QoJHpicCkgJiYgaXNzZXQoJHpicC0+aG9zdCkpIHsKICAgICAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNodHRwcz86Ly8od3d3XC4pPyhbXi9dKykvI2knLCAoc3RyaW5nKSR6YnAtPmhvc3QsICR0KSkgewogICAgICAgICAgICAgICAgJHNoID0gJHRbMl07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHNkID0gJyc7CiAgICAgICAgaWYgKChpbnQpQ3lxaXllemhhbigncHNldWRvX29yaWdpbmFsX3NkJywgMCkgPT09IDEgJiYgaXNfb2JqZWN0KCR6YnApICYmIGlzc2V0KCR6YnAtPmZ1bGxjdXJyZW50dXJsKSkgewogICAgICAgICAgICAkc2QgPSAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsOwogICAgICAgIH0KICAgICAgICAkb3V0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKAogICAgICAgICAgICAnIzxcdysoW14+XSspPyggY2xhc3Nccz89XHM/KFwnfCIpKC4qPyk/KFwnfCIpKShbXj5dKyk/PiNpcycsCiAgICAgICAgICAgIGZ1bmN0aW9uICgkdCkgdXNlICgkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpIHsKICAgICAgICAgICAgICAgICRzID0gQ3lxaXllemhhbl9jb3JlOjpQc2V1ZG9PcmlnaW5hbFNNKCR0LCAkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0cl9yZXBsYWNlKCR0WzJdLCAnIGNsYXNzPScgLiAkdFszXSAuICRzdCAuICRzIC4gKCR0WzRdID8gJyAnIC4gJHRbNF0gOiAnJykgLiAkdFs1XSwgJHRbMF0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICAkY29udGVudAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICgkb3V0ID09PSBudWxsIHx8ICRvdXQgPT09ICcnKSA/ICRjb250ZW50IDogJG91dDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBQc2V1ZG9PcmlnaW5hbFNNKCR0LCAkc3QsICRzcCwgJHNsLCAkc2UsICRzbSwgJHNoLCAkc2QpCiAgICB7CiAgICAgICAgJHMgPSAnJzsKICAgICAgICBmb3IgKCRpID0gMDsgJGkgPCAkc207ICRpKyspIHsKICAgICAgICAgICAgaWYgKCRzKSB7CiAgICAgICAgICAgICAgICAkcyAuPSAnICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJHMgLj0gc3Vic3RyKG1kNSgoJGkgPyAkaSA6ICcnKSAuICR0WzRdIC4gJHN0IC4gJHNwIC4gJHNoIC4gJHNkKSwgMCwgJHNsKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRzZSkgewogICAgICAgICAgICAkcyA9IHN0cl9yZXBsYWNlKGFycmF5KCcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcwJyksIGFycmF5KCdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJyksICRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRzOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldENvbmZpZ3VyZWRTaXRlSG9tZUh0bWxUZW1wbGF0ZU5hbWUoKQogICAgewogICAgICAgICR0cGwgPSAoc3RyaW5nKUN5cWl5ZXpoYW4oJ3VzZV9odG1sX3RwbF9maWxlJywgJycpOwogICAgICAgIGlmICgkdHBsID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRiYXNlID0gYmFzZW5hbWUoJHRwbCk7CiAgICAgICAgaWYgKCRiYXNlICE9PSAkdHBsKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKHByZWdfbWF0Y2goJyNbXFxcXC9dfFxcLnsyfSMnLCAkYmFzZSkpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RydG9sb3dlcihwYXRoaW5mbygkYmFzZSwgUEFUSElORk9fRVhURU5TSU9OKSkgIT09ICdodG1sJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgICRkaXIgPSAkR0xPQkFMU1sndXNlcnNkaXInXSAuICdwbHVnaW4vQ3lxaXllemhhbi9odG1sLyc7CiAgICAgICAgJHBhdGggPSAkZGlyIC4gJGJhc2U7CiAgICAgICAgaWYgKCFpc19maWxlKCRwYXRoKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkYmFzZTsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBHZXRDb25maWd1cmVkU2l0ZUlubmVySHRtbFRlbXBsYXRlTmFtZSgpCiAgICB7CiAgICAgICAgJHRwbCA9IChzdHJpbmcpQ3lxaXllemhhbigndXNlX2h0bWxfdHBsX2lubmVyX2ZpbGUnLCAnJyk7CiAgICAgICAgaWYgKCR0cGwgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGJhc2UgPSBiYXNlbmFtZSgkdHBsKTsKICAgICAgICBpZiAoJGJhc2UgIT09ICR0cGwpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnI1tcXFxcL118XFwuezJ9IycsICRiYXNlKSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJ0b2xvd2VyKHBhdGhpbmZvKCRiYXNlLCBQQVRISU5GT19FWFRFTlNJT04pKSAhPT0gJ2h0bWwnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgJGRpciA9ICRHTE9CQUxTWyd1c2Vyc2RpciddIC4gJ3BsdWdpbi9DeXFpeWV6aGFuL2h0bWwvJzsKICAgICAgICAkcGF0aCA9ICRkaXIgLiAkYmFzZTsKICAgICAgICBpZiAoIWlzX2ZpbGUoJHBhdGgpKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRiYXNlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIEdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpCiAgICB7CiAgICAgICAgJGRpciA9IHNlbGY6OkdldENhY2hlRGlyKCk7CiAgICAgICAgaWYgKCRkaXIgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRkaXIgLiAnc2l0ZXVybC5qc29uJzsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBDbGVhblNpdGVIb21lUmVuZGVyUmVjb3JkQmFkVGl0bGVzKCkKICAgIHsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgnJyk7CiAgICAgICAgaWYgKCRmaWxlID09PSAnJyB8fCAhaXNfZmlsZSgkZmlsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAkbG9ja2VkID0gQGZsb2NrKCRmcCwgTE9DS19FWCk7CiAgICAgICAgaWYgKCEkbG9ja2VkKSB7CiAgICAgICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICAkcmF3ID0gQHN0cmVhbV9nZXRfY29udGVudHMoJGZwKTsKICAgICAgICAkbWFwID0gYXJyYXkoKTsKICAgICAgICAkcmVtb3ZlZCA9IDA7CiAgICAgICAgaWYgKCRyYXcpIHsKICAgICAgICAgICAgJGxpbmVzID0gcHJlZ19zcGxpdCgiL1xyXG58XG58XHIvIiwgJHJhdyk7CiAgICAgICAgICAgIGlmIChpc19hcnJheSgkbGluZXMpKSB7CiAgICAgICAgICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgICAgICAgICAkbGluZSA9IHRyaW0oJGxpbmUpOwogICAgICAgICAgICAgICAgICAgIGlmICgkbGluZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhID0ganNvbl9kZWNvZGUoJGxpbmUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGFbJ3RwbCddKSB8fCBlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJc0JhZFRpdGxlKChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRyZW1vdmVkKys7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkaCA9IGlzc2V0KCRkYXRhWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkZGF0YVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICgkaCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRwID0gaXNzZXQoJGRhdGFbJ3BhdGgnXSkgPyBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWydwYXRoJ10pIDogKGlzc2V0KCRkYXRhWyd1cmwnXSkgPyBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWyd1cmwnXSkgOiAnLycpOwogICAgICAgICAgICAgICAgICAgICRrZXkgPSAkaCAuICJcdCIgLiAkcDsKICAgICAgICAgICAgICAgICAgICAkb2xkVHMgPSBpc3NldCgkbWFwWyRrZXldWyd0cyddKSA/IGludHZhbCgkbWFwWyRrZXldWyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgJG5ld1RzID0gaXNzZXQoJGRhdGFbJ3RzJ10pID8gaW50dmFsKCRkYXRhWyd0cyddKSA6IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzc2V0KCRtYXBbJGtleV0pICYmICRuZXdUcyA8PSAkb2xkVHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhWydob3N0J10gPSAkaDsKICAgICAgICAgICAgICAgICAgICAkZGF0YVsncGF0aCddID0gJHA7CiAgICAgICAgICAgICAgICAgICAgJG1hcFska2V5XSA9ICRkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRvdXRMaW5lcyA9IGFycmF5KCk7CiAgICAgICAgZm9yZWFjaCAoJG1hcCBhcyAkayA9PiAkZCkgewogICAgICAgICAgICAkaiA9IGpzb25fZW5jb2RlKCRkLCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKICAgICAgICAgICAgaWYgKCRqKSB7CiAgICAgICAgICAgICAgICAkb3V0TGluZXNbXSA9ICRqOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRvdXRSYXcgPSBpbXBsb2RlKCJcbiIsICRvdXRMaW5lcyk7CiAgICAgICAgaWYgKCRvdXRSYXcgIT09ICcnKSB7CiAgICAgICAgICAgICRvdXRSYXcgLj0gIlxuIjsKICAgICAgICB9CiAgICAgICAgQGZ0cnVuY2F0ZSgkZnAsIDApOwogICAgICAgIEByZXdpbmQoJGZwKTsKICAgICAgICBAZndyaXRlKCRmcCwgJG91dFJhdyk7CiAgICAgICAgQGZmbHVzaCgkZnApOwogICAgICAgIEBmbG9jaygkZnAsIExPQ0tfVU4pOwogICAgICAgIEBmY2xvc2UoJGZwKTsKICAgICAgICByZXR1cm4gJHJlbW92ZWQ7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gTm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoJHVybE9yUGF0aCkKICAgIHsKICAgICAgICAkdXJsT3JQYXRoID0gdHJpbSgoc3RyaW5nKSR1cmxPclBhdGgpOwogICAgICAgIGlmICgkdXJsT3JQYXRoID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gJy8nOwogICAgICAgIH0KICAgICAgICAkcGF0aCA9ICR1cmxPclBhdGg7CiAgICAgICAgaWYgKHN0cmlwb3MoJHVybE9yUGF0aCwgJ2h0dHA6Ly8nKSA9PT0gMCB8fCBzdHJpcG9zKCR1cmxPclBhdGgsICdodHRwczovLycpID09PSAwKSB7CiAgICAgICAgICAgICRwID0gcGFyc2VfdXJsKCR1cmxPclBhdGgpOwogICAgICAgICAgICAkcGF0aCA9IGlzc2V0KCRwWydwYXRoJ10pID8gKHN0cmluZykkcFsncGF0aCddIDogJy8nOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICRxUG9zID0gc3RycG9zKCR1cmxPclBhdGgsICc/Jyk7CiAgICAgICAgICAgIGlmICgkcVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gc3Vic3RyKCR1cmxPclBhdGgsIDAsICRxUG9zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJHBhdGggPT09ICcnIHx8ICRwYXRoID09PSBmYWxzZSkgewogICAgICAgICAgICAkcGF0aCA9ICcvJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRwYXRoWzBdICE9PSAnLycpIHsKICAgICAgICAgICAgJHBhdGggPSAnLycgLiAkcGF0aDsKICAgICAgICB9CiAgICAgICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvKyMnLCAnLycsICRwYXRoKTsKICAgICAgICBpZiAoJHBhdGggIT09ICcvJyAmJiBzdWJzdHIoJHBhdGgsIC0xKSA9PT0gJy8nKSB7CiAgICAgICAgICAgICRwYXRoID0gcnRyaW0oJHBhdGgsICcvJyk7CiAgICAgICAgICAgIGlmICgkcGF0aCA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRwYXRoID0gJy8nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkcGF0aDsKICAgIH0KICAgIHN0YXRpYyBmdW5jdGlvbiBCdWlsZFNlcVJlY29yZEtleUZvclVyaSgkaG9zdEtleSwgJHVybE9yUGF0aCkKICAgIHsKICAgICAgICAkaG9zdEtleSA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RLZXkpOwogICAgICAgIGlmICgkaG9zdEtleSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkdXJsT3JQYXRoID0gdHJpbSgoc3RyaW5nKSR1cmxPclBhdGgpOwogICAgICAgICRwYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoJHVybE9yUGF0aCk7CiAgICAgICAgJHF1ZXJ5ID0gJyc7CiAgICAgICAgaWYgKCR1cmxPclBhdGggIT09ICcnKSB7CiAgICAgICAgICAgIGlmIChzdHJpcG9zKCR1cmxPclBhdGgsICdodHRwOi8vJykgPT09IDAgfHwgc3RyaXBvcygkdXJsT3JQYXRoLCAnaHR0cHM6Ly8nKSA9PT0gMCkgewogICAgICAgICAgICAgICAgJHAgPSBAcGFyc2VfdXJsKCR1cmxPclBhdGgpOwogICAgICAgICAgICAgICAgJHF1ZXJ5ID0gKGlzX2FycmF5KCRwKSAmJiBpc3NldCgkcFsncXVlcnknXSkpID8gKHN0cmluZykkcFsncXVlcnknXSA6ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJHFQb3MgPSBzdHJwb3MoJHVybE9yUGF0aCwgJz8nKTsKICAgICAgICAgICAgICAgIGlmICgkcVBvcyAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICAgICAkcXVlcnkgPSBzdWJzdHIoJHVybE9yUGF0aCwgJHFQb3MgKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAka2V5ID0gJGhvc3RLZXkgLiAkcGF0aDsKICAgICAgICBpZiAoJHF1ZXJ5ICE9PSAnJykgewogICAgICAgICAgICAka2V5IC49ICc/JyAuICRxdWVyeTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmxlbigka2V5KSA+IDE4MCkgewogICAgICAgICAgICAka2V5ID0gJGhvc3RLZXkgLiAnOicgLiBtZDUoJHBhdGggLiAnPycgLiAkcXVlcnkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2VsZjo6Tm9ybWFsaXplU2VxUmVjb3JkS2V5KCRrZXkpOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFJlYWRTaXRlSG9tZVJlbmRlclJlY29yZCgkaG9zdE9ubHksICR1cmwgPSAnJykKICAgIHsKICAgICAgICAkaG9zdE9ubHkgPSBzZWxmOjpOb3JtYWxpemVTaXRlSG9zdCgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkd2FudFBhdGggPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgkdXJsKTsKICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycgfHwgIWlzX2ZpbGUoJGZpbGUpKSB7CiAgICAgICAgICAgICRsZWdhY3lGaWxlID0gJEdMT0JBTFNbJ3VzZXJzZGlyJ10gLiAncGx1Z2luL0N5cWl5ZXpoYW4vdXJsdHh0LycgLiAnc2l0ZWhvbWVfJyAuIG1kNSgkaG9zdE9ubHkpIC4gJy5qc29uJzsKICAgICAgICAgICAgaWYgKGlzX2ZpbGUoJGxlZ2FjeUZpbGUpKSB7CiAgICAgICAgICAgICAgICAkcmF3ID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRsZWdhY3lGaWxlKTsKICAgICAgICAgICAgICAgIGlmICgkcmF3KSB7CiAgICAgICAgICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkcmF3LCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGRhdGEpICYmICFlbXB0eSgkZGF0YVsndHBsJ10pICYmICFlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJGxlZ2FjeVVybCA9IGlzc2V0KCRkYXRhWyd1cmwnXSkgPyAoc3RyaW5nKSRkYXRhWyd1cmwnXSA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjpXcml0ZVNpdGVIb21lUmVuZGVyUmVjb3JkKCRob3N0T25seSwgJGxlZ2FjeVVybCwgKHN0cmluZykkZGF0YVsndHBsJ10sIChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pOwogICAgICAgICAgICAgICAgICAgICAgICBAdW5saW5rKCRsZWdhY3lGaWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgJGxlZ2FjeVBhdGggPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgkbGVnYWN5VXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRsZWdhY3lQYXRoID09PSAkd2FudFBhdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkZnAgPSBAZm9wZW4oJGZpbGUsICdjK2InKTsKICAgICAgICBpZiAoISRmcCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfU0gpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBAcmV3aW5kKCRmcCk7CiAgICAgICAgJHJhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIGlmICghJHJhdykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRsaW5lcyA9IHByZWdfc3BsaXQoIi9cclxufFxufFxyLyIsICRyYXcpOwogICAgICAgIGlmICghaXNfYXJyYXkoJGxpbmVzKSB8fCBlbXB0eSgkbGluZXMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmb3JlYWNoICgkbGluZXMgYXMgJGxpbmUpIHsKICAgICAgICAgICAgJGxpbmUgPSB0cmltKCRsaW5lKTsKICAgICAgICAgICAgaWYgKCRsaW5lID09PSAnJykgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGEgPSBqc29uX2RlY29kZSgkbGluZSwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkaCA9IGlzc2V0KCRkYXRhWydob3N0J10pID8gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoKHN0cmluZykkZGF0YVsnaG9zdCddKSA6ICcnOwogICAgICAgICAgICBpZiAoJGggIT09ICRob3N0T25seSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGRhdGFQYXRoID0gJyc7CiAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsncGF0aCddKSkgewogICAgICAgICAgICAgICAgJGRhdGFQYXRoID0gc2VsZjo6Tm9ybWFsaXplU2l0ZVJlbmRlclJlY29yZFBhdGgoKHN0cmluZykkZGF0YVsncGF0aCddKTsKICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRkYXRhWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICRkYXRhUGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJGRhdGFbJ3VybCddKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICRkYXRhUGF0aCA9ICcvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJGRhdGFQYXRoICE9PSAkd2FudFBhdGgpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbXB0eSgkZGF0YVsndHBsJ10pIHx8IGVtcHR5KCRkYXRhWyd0aXRsZSddKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGY6OklzQmFkVGl0bGUoKHN0cmluZykkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkZGF0YTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gV3JpdGVTaXRlSG9tZVJlbmRlclJlY29yZCgkaG9zdE9ubHksICR1cmwsICR0cGxOYW1lLCAkdGl0bGUpCiAgICB7CiAgICAgICAgJGhvc3RPbmx5ID0gc2VsZjo6Tm9ybWFsaXplU2l0ZUhvc3QoJGhvc3RPbmx5KTsKICAgICAgICAkdXJsID0gKHN0cmluZykkdXJsOwogICAgICAgICR0cGxOYW1lID0gKHN0cmluZykkdHBsTmFtZTsKICAgICAgICAkdGl0bGUgPSAoc3RyaW5nKSR0aXRsZTsKICAgICAgICBpZiAoJGhvc3RPbmx5ID09PSAnJyB8fCAkdHBsTmFtZSA9PT0gJycgfHwgJHRpdGxlID09PSAnJyB8fCBzZWxmOjpJc0JhZFRpdGxlKCR0aXRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkZmlsZSA9IHNlbGY6OkdldFNpdGVIb21lUmVuZGVyUmVjb3JkRmlsZSgkaG9zdE9ubHkpOwogICAgICAgIGlmICgkZmlsZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAkcGF0aCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKCR1cmwpOwogICAgICAgICRwYXlsb2FkID0gYXJyYXkoCiAgICAgICAgICAgICd0cycgPT4gdGltZSgpLAogICAgICAgICAgICAnaG9zdCcgPT4gJGhvc3RPbmx5LAogICAgICAgICAgICAndXJsJyA9PiAkdXJsLAogICAgICAgICAgICAncGF0aCcgPT4gJHBhdGgsCiAgICAgICAgICAgICd0cGwnID0+ICR0cGxOYW1lLAogICAgICAgICAgICAndGl0bGUnID0+ICR0aXRsZSwKICAgICAgICApOwogICAgICAgICRmcCA9IEBmb3BlbigkZmlsZSwgJ2MrYicpOwogICAgICAgIGlmICghJGZwKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgJGxvY2tlZCA9IEBmbG9jaygkZnAsIExPQ0tfRVgpOwogICAgICAgIGlmICghJGxvY2tlZCkgewogICAgICAgICAgICBAZmNsb3NlKCRmcCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgICRleGlzdGluZ1JhdyA9IEBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmcCk7CiAgICAgICAgJG1hcCA9IGFycmF5KCk7CiAgICAgICAgaWYgKCRleGlzdGluZ1JhdykgewogICAgICAgICAgICAkbGluZXMgPSBwcmVnX3NwbGl0KCIvXHJcbnxcbnxcci8iLCAkZXhpc3RpbmdSYXcpOwogICAgICAgICAgICBpZiAoaXNfYXJyYXkoJGxpbmVzKSkgewogICAgICAgICAgICAgICAgZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgJGxpbmUgPSB0cmltKCRsaW5lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJGxpbmUgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGpzb25fZGVjb2RlKCRsaW5lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2FycmF5KCRkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJGggPSBpc3NldCgkZGF0YVsnaG9zdCddKSA/IHNlbGY6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGRhdGFbJ2hvc3QnXSkgOiAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoJGggPT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW1wdHkoJGRhdGFbJ3RwbCddKSB8fCBlbXB0eSgkZGF0YVsndGl0bGUnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmOjpJc0JhZFRpdGxlKChzdHJpbmcpJGRhdGFbJ3RpdGxlJ10pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkcCA9ICcnOwogICAgICAgICAgICAgICAgICAgIGlmIChpc3NldCgkZGF0YVsncGF0aCddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAkcCA9IHNlbGY6Ok5vcm1hbGl6ZVNpdGVSZW5kZXJSZWNvcmRQYXRoKChzdHJpbmcpJGRhdGFbJ3BhdGgnXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlaWYgKGlzc2V0KCRkYXRhWyd1cmwnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHAgPSBzZWxmOjpOb3JtYWxpemVTaXRlUmVuZGVyUmVjb3JkUGF0aCgoc3RyaW5nKSRkYXRhWyd1cmwnXSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHAgPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRrZXkgPSAkaCAuICJcdCIgLiAkcDsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJG1hcFska2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJG9sZFRzID0gaXNzZXQoJG1hcFska2V5XVsndHMnXSkgPyBpbnR2YWwoJG1hcFska2V5XVsndHMnXSkgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAkbmV3VHMgPSBpc3NldCgkZGF0YVsndHMnXSkgPyBpbnR2YWwoJGRhdGFbJ3RzJ10pIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXdUcyA8PSAkb2xkVHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRkYXRhWydwYXRoJ10gPSAkcDsKICAgICAgICAgICAgICAgICAgICAkbWFwWyRrZXldID0gJGRhdGE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJG1hcFskaG9zdE9ubHkgLiAiXHQiIC4gJHBhdGhdID0gJHBheWxvYWQ7CiAgICAgICAgJG91dExpbmVzID0gYXJyYXkoKTsKICAgICAgICBmb3JlYWNoICgkbWFwIGFzICRrZXkgPT4gJGRhdGEpIHsKICAgICAgICAgICAgJGxpbmUgPSBqc29uX2VuY29kZSgkZGF0YSwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CiAgICAgICAgICAgIGlmICgkbGluZSkgewogICAgICAgICAgICAgICAgJG91dExpbmVzW10gPSAkbGluZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkb3V0UmF3ID0gaW1wbG9kZSgiXG4iLCAkb3V0TGluZXMpOwogICAgICAgIGlmICgkb3V0UmF3ICE9PSAnJykgewogICAgICAgICAgICAkb3V0UmF3IC49ICJcbiI7CiAgICAgICAgfQoKICAgICAgICBAZnRydW5jYXRlKCRmcCwgMCk7CiAgICAgICAgQHJld2luZCgkZnApOwogICAgICAgIEBmd3JpdGUoJGZwLCAkb3V0UmF3KTsKICAgICAgICBAZmZsdXNoKCRmcCk7CiAgICAgICAgQGZsb2NrKCRmcCwgTE9DS19VTik7CiAgICAgICAgQGZjbG9zZSgkZnApOwogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgc3RhdGljIGZ1bmN0aW9uIFNlbGZUZXN0KCkKICAgIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCdwYXNzZWQnID0+IDAsICdmYWlsZWQnID0+IDAsICdjYXNlcycgPT4gYXJyYXkoKSk7CiAgICB9CiAgICBzdGF0aWMgZnVuY3Rpb24gR2V0UmFuZG9tVGl0bGVGcm9tREIoKQogICAgewogICAgICAgIGdsb2JhbCAkemJwOwogICAgICAgICR0dGwgPSBpbnR2YWwoQ3lxaXllemhhbigncmFuZHR0bCcsIDYwKSk7CiAgICAgICAgaWYgKCR0dGwgPCAwKSAkdHRsID0gMDsKICAgICAgICAkY2F0ZSA9ICcnOwogICAgICAgICR3c3RyID0gJ2xvZ19TdGF0dXM9MCBBTkQgbG9nX1R5cGU9MCc7CiAgICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygnbHlfeGluWmJsb2cnKSAmJiBseV94aW5aYmxvZ19jb3JlOjokY2F0ZWhvc3QpIHsKICAgICAgICAgICAgJGNhdGUgPSBseV94aW5aYmxvZ19jb3JlOjokY2F0ZWhvc3Q7CiAgICAgICAgICAgICR3c3RyIC49ICcgQU5EIGxvZ19DYXRlSUQ9JyAuIGludHZhbCgkY2F0ZSk7CiAgICAgICAgfQogICAgICAgICRub3cgPSB0aW1lKCk7CiAgICAgICAgaWYgKCFzZWxmOjokcmFuZENvdW50IHx8ICgkdHRsICYmICgkbm93IC0gc2VsZjo6JHJhbmRDb3VudFRpbWUpID4gJHR0bCkpIHsKICAgICAgICAgICAgJHNxbGMgPSAnU0VMRUNUIENPVU5UKDEpIEFTIGMgRlJPTSBgJyAuICR6YnAtPmRiLT5kYnByZSAuICdwb3N0YCBXSEVSRSAnIC4gJHdzdHI7CiAgICAgICAgICAgICRkYyA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsYyk7CiAgICAgICAgICAgIHNlbGY6OiRyYW5kQ291bnQgPSAoIWVtcHR5KCRkYykgJiYgaXNzZXQoJGRjWzBdWydjJ10pKSA/IGludHZhbCgkZGNbMF1bJ2MnXSkgOiAwOwogICAgICAgICAgICBzZWxmOjokcmFuZENvdW50VGltZSA9ICRub3c7CiAgICAgICAgfQogICAgICAgIGlmIChzZWxmOjokcmFuZENvdW50IDw9IDApIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICAkb2Zmc2V0ID0gbXRfcmFuZCgwLCBzZWxmOjokcmFuZENvdW50IC0gMSk7CiAgICAgICAgJHNxbCA9ICdTRUxFQ1QgYGxvZ19UaXRsZWAgRlJPTSBgJyAuICR6YnAtPmRiLT5kYnByZSAuICdwb3N0YCBXSEVSRSAnIC4gJHdzdHIgLiAnIE9SREVSIEJZIGBsb2dfSURgIEFTQyBMSU1JVCAxIE9GRlNFVCAnIC4gJG9mZnNldDsKICAgICAgICAkZCA9ICR6YnAtPmRiLT5RdWVyeSgkc3FsKTsKICAgICAgICBpZiAoIWVtcHR5KCRkKSAmJiBpc3NldCgkZFswXVsnbG9nX1RpdGxlJ10pKSB7CiAgICAgICAgICAgIHJldHVybiAkZFswXVsnbG9nX1RpdGxlJ107CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KfSAgICAgCSAgIAkJCQoj5rOo5YaM5o+S5Lu2ICAgICAJIAkgIAkJClJlZ2lzdGVyUGx1Z2luKCJDeXFpeWV6aGFuIiwgIkFjdGl2ZVBsdWdpbl9DeXFpeWV6aGFuIik7ICAgICAJIAkJCSAgCmZ1bmN0aW9uIEFjdGl2ZVBsdWdpbl9DeXFpeWV6aGFuKCkgICAgCSAJCQkgCSAKeyAgICAJIAkgCSAJIAogICAgZ2xvYmFsICR6YnA7CiAgICBzdGF0aWMgJGluaXRMaW5rVHBsID0gMTsKICAgIGlmICgkaW5pdExpbmtUcGwpIHsKICAgICAgICAkaW5pdExpbmtUcGwgPSAwOwogICAgICAgICRob3N0ID0gaXNzZXQoJHpicC0+aG9zdCkgPyAoc3RyaW5nKSR6YnAtPmhvc3QgOiAnJzsKICAgICAgICAkaG9zdE9ubHkgPSAnJzsKICAgICAgICBpZiAoJGhvc3QgIT09ICcnICYmIChzdHJpcG9zKCRob3N0LCAnaHR0cDovLycpID09PSAwIHx8IHN0cmlwb3MoJGhvc3QsICdodHRwczovLycpID09PSAwKSkgewogICAgICAgICAgICAkaCA9IHBhcnNlX3VybCgkaG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAgICAgaWYgKCRoKSB7CiAgICAgICAgICAgICAgICAkaG9zdE9ubHkgPSAoc3RyaW5nKSRoOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGhvc3RPbmx5ID0gJGhvc3Q7CiAgICAgICAgfQogICAgICAgICRob3N0T25seSA9IHByZWdfcmVwbGFjZSgnIy8uKiQjJywgJycsIChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkaG9zdE9ubHkgPSBDeXFpeWV6aGFuX2NvcmU6Ok5vcm1hbGl6ZVNpdGVIb3N0KChzdHJpbmcpJGhvc3RPbmx5KTsKICAgICAgICAkYXBleCA9ICRob3N0T25seTsKICAgICAgICBpZiAoJGhvc3RPbmx5ICE9PSAnJyAmJiAhcHJlZ19tYXRjaCgnI15cZHsxLDN9KFwuXGR7MSwzfSl7M30kIycsICRob3N0T25seSkpIHsKICAgICAgICAgICAgJHBhcnRzID0gZXhwbG9kZSgnLicsICRob3N0T25seSk7CiAgICAgICAgICAgIGlmIChjb3VudCgkcGFydHMpID49IDMpIHsKICAgICAgICAgICAgICAgIGFycmF5X3NoaWZ0KCRwYXJ0cyk7CiAgICAgICAgICAgICAgICAkYXBleCA9IGltcGxvZGUoJy4nLCAkcGFydHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkYXBleCAhPT0gJycpIHsKICAgICAgICAgICAgJHNldHRpbmcgPSBpc3NldCgkemJwLT5Db25maWcoJ0N5cWl5ZXpoYW4nKS0+c2V0dGluZykgJiYgaXNfYXJyYXkoJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcpID8gJHpicC0+Q29uZmlnKCdDeXFpeWV6aGFuJyktPnNldHRpbmcgOiBhcnJheSgpOwogICAgICAgICAgICAkbGluayA9IGlzc2V0KCRzZXR0aW5nWydsaW5rJ10pID8gKHN0cmluZykkc2V0dGluZ1snbGluayddIDogJyc7CiAgICAgICAgICAgICRuZXdMaW5rID0gJGxpbms7CiAgICAgICAgICAgICRkZWZhdWx0TGluayA9ICJodHRwOi8ve+Wtl+avjTQtNX0uIiAuICRhcGV4IC4gIi975a2X5q+NNC01fVxyXG4iIC4gImh0dHA6Ly975a2X5q+NNC01fS4iIC4gJGFwZXggLiAiL3vlrZfmr400LTV9L3vmlbDlrZcxMC05OTl9aHRtbCI7CiAgICAgICAgICAgIGlmICh0cmltKCRsaW5rKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICRuZXdMaW5rID0gJGRlZmF1bHRMaW5rOwogICAgICAgICAgICB9IGVsc2VpZiAoc3RyaXBvcygkbGluaywgJ2ZhbmdzaG91bHUuY29tJykgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAkbmV3TGluayA9IHN0cl9pcmVwbGFjZSgnZmFuZ3Nob3VsdS5jb20nLCAkYXBleCwgJGxpbmspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkbmV3TGluayAhPT0gJGxpbmspIHsKICAgICAgICAgICAgICAgICRzZXR0aW5nWydsaW5rJ10gPSAkbmV3TGluazsKICAgICAgICAgICAgICAgICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nID0gJHNldHRpbmc7CiAgICAgICAgICAgICAgICAkemJwLT5TYXZlQ29uZmlnKCdDeXFpeWV6aGFuJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAkSXNMb2NrID0gQ3lxaXllemhhbignSXNMb2NrJyk7ICAgICAJIAkgICAJCiAgICBpZiAoJElzTG9jayA9PSAyIHx8ICRJc0xvY2sgPT0gMykgeyAgICAgIAkJICAgCQogICAgICAgICR1YSA9IGlzc2V0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkgPyAkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10gOiAnJzsgICAgIAkJCSAJIAkKICAgICAgICBpZiAocHJlZ19tYXRjaCgnIyhzcGlkZXJ8Ym90fEdvb2dsZU90aGVyKSNpJywgJHVhKSkgeyAgICAgCSAJCQkJIAogICAgICAgICAgICBpZiAoJElzTG9jayA9PSAyKSB7ICAgICAgICAgCSAJCiAgICAgICAgICAgICAgICAkSXNMb2NrID0gMTsgICAgCQkgCQkJCSAKICAgICAgICAgICAgfSAgICAgIAkgIAkgIAogICAgICAgIH0gZWxzZWlmICgkSXNMb2NrID09IDMpIHsgICAgCSAJCSAJIAkKICAgICAgICAgICAgJElzTG9jayA9IDE7ICAgICAgIAkgCQkJCiAgICAgICAgfSAgICAJIAkgCQkgIAogICAgfSAgICAgICAgIAkgIAogICAgaWYgKCRJc0xvY2sgPT0gMSkgeyAgICAJCSAgICAJIAogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1picF9QcmVMb2FkJywgJ0N5cWl5ZXpoYW5fWmJwX0xvYWRfUHJlJyk7ICAgICAJICAgIAkJCiAgICAgICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fWmJwX0xvYWRfUHJlJywgJ0N5cWl5ZXpoYW5fWmJwX0xvYWRfUHJlJyk7ICAgICAJCQkJCQkgCiAgICAgICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fVmlld1Bvc3RfVGVtcGxhdGUnLCAnQ3lxaXllemhhbl9UZW1wbGF0ZScpOyAgICAgCSAgICAgCQogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdMaXN0X1RlbXBsYXRlJywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGUnKTsgICAgIAkgIAkgCSAKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9UZW1wbGF0ZV9EaXNwbGF5JywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGVfRGlzcGxheScpOwogICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX0RlYnVnX0hhbmRsZXJfQ29tbW9uJywgJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nKTsgICAgIAkgICAgIAkKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9aYnBfU2hvd0Vycm9yJywgJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nKTsgICAgICAJIAkJIAkKICAgICAgICBpZiAoQ3lxaXllemhhbigncG9zdHgnKSkgeyAgICAJICAJIAkJIAogICAgICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3UG9zdF9CZWdpbl9WMicsICdDeXFpeWV6aGFuX1ZpZXdQb3N0X0JlZ2luJyk7ICAgICAJICAgCSAgCiAgICAgICAgICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX1ZpZXdMaXN0X0JlZ2luX1YyJywgJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nKTsgICAgCQkgICAJICAKICAgICAgICB9IGVsc2UgeyAgICAgCSAgCSAJCQogICAgICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3QXV0b19FbmQnLCAnQ3lxaXllemhhbl9FcnJvcicpOyAgICAgCSAJCSAgCQogICAgICAgIH0gICAgICAgIAkgICAKICAgIH0gICAgIAkJCSAgCSAKICAgICAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9WaWV3TGlzdF9UZW1wbGF0ZScsICdDeXFpeWV6aGFuX1RlbXBsYXRlJyk7CiAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9UZW1wbGF0ZV9EaXNwbGF5JywgJ0N5cWl5ZXpoYW5fVGVtcGxhdGVfRGlzcGxheScpOwogICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fQWRtaW5fVG9wTWVudScsICdDeXFpeWV6aGFuX0FkbWluX1RvcE1lbnUnKTsKICAgIEFkZF9GaWx0ZXJfUGx1Z2luKCdGaWx0ZXJfUGx1Z2luX0luZGV4X0JlZ2luJywgJ0N5cWl5ZXpoYW5fRXJqaW11bHVfSW5kZXhCZWdpbicpOwogICAgQWRkX0ZpbHRlcl9QbHVnaW4oJ0ZpbHRlcl9QbHVnaW5fSW5kZXhfQmVnaW4nLCAnQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9JbmRleEJlZ2luJyk7CiAgICBBZGRfRmlsdGVyX1BsdWdpbignRmlsdGVyX1BsdWdpbl9DbWRfQmVnaW4nLCAnQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9DbWRCZWdpbicpOwp9ICAgIAkgCSAJCQkgCgpjbGFzcyBDeXFpeWV6aGFuX2xhenlfc3RyaW5nCnsKICAgIHByaXZhdGUgJGZuOwogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmbikKICAgIHsKICAgICAgICAkdGhpcy0+Zm4gPSAkZm47CiAgICB9CiAgICBwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCiAgICB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKCFpc19jYWxsYWJsZSgkdGhpcy0+Zm4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGYgPSAkdGhpcy0+Zm47CiAgICAgICAgICAgICRvdXQgPSAkZigpOwogICAgICAgICAgICBpZiAoJG91dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc19zdHJpbmcoJG91dCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkb3V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoc3RyaW5nKSRvdXQ7CiAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlICRlKSB7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICB9Cn0KCmZ1bmN0aW9uIEN5cWl5ZXpoYW5fQWRtaW5fVG9wTWVudSgmJG0pCnsKICAgIGdsb2JhbCAkemJwOwogICAgJG1bXSA9IE1ha2VUb3BNZW51KCdyb290JywgJ+i2hee6p+S8geS4muermScsICR6YnAtPmhvc3QgLiAnemJfdXNlcnMvcGx1Z2luL0N5cWl5ZXpoYW4vbWFpbi5waHAnLCAnJywgJ3RvcG1lbnVfQ3lxaXllemhhbicsICdpY29uLWdyaWQtMXgyLWZpbGwnKTsKfQpmdW5jdGlvbiBJbnN0YWxsUGx1Z2luX0N5cWl5ZXpoYW4oKSAgICAgCSAJCSAJCQp7ICAgIAkJCSAJICAJCiAgICBDeXFpeWV6aGFuX2NvcmU6Omluc3RhbGwoKTsgICAgCQkJIAkgICAKfSAgICAJIAkgCSAJIApmdW5jdGlvbiBVbmluc3RhbGxQbHVnaW5fQ3lxaXllemhhbigpIHt9ICAgIAkgCSAJIAkJCmZ1bmN0aW9uIEN5cWl5ZXpoYW4oJGEgPSAnJywgJHYgPSAnJywgJGkgPSAnJykgICAgCSAgIAkJCSAKeyAgICAJIAkgCQkJIAogICAgZ2xvYmFsICR6YnA7ICAgIAkgCQkJIAkgCiAgICAkaW5mbyA9ICR6YnAtPkNvbmZpZygnQ3lxaXllemhhbicpLT5zZXR0aW5nOyAgICAJICAJICAgCQogICAgaWYgKCRhKSB7ICAgICAJIAkgCSAJCiAgICAgICAgJGQgPSBpc3NldCgkaW5mb1skYV0pID8gJGluZm9bJGFdIDogJHY7ICAgICAgCSAgCQkJCiAgICAgICAgaWYgKGlzX251bWVyaWMoJGkpKSB7ICAgICAgIAkJICAgCiAgICAgICAgICAgIGlmIChpc19hcnJheSgkZCkgJiYgaXNzZXQoJGRbJGldKSkgeyAgICAgIAkgCQkgIAogICAgICAgICAgICAgICAgJGQgPSAkZFskaV07ICAgIAkJIAkgCSAgCiAgICAgICAgICAgIH0gZWxzZSB7ICAgICAgCSAJCQkJCiAgICAgICAgICAgICAgICAkZCA9ICR2OyAgICAJCQkgCQkgIAogICAgICAgICAgICB9ICAgIAkJCQkJCSAgCiAgICAgICAgfSAgICAJCSAgICAJIAogICAgICAgIHJldHVybiAkZDsgICAgIAkJIAkgCSAKICAgIH0gZWxzZSB7ICAgICAgICAJCSAgCiAgICAgICAgcmV0dXJuICRpbmZvOyAgICAJCSAgICAgIAogICAgfSAgICAgCSAJCSAJCQp9ICAgICAgIAkgCSAJCiAgICAJIAkgIAkgCQpmdW5jdGlvbiBDeXFpeWV6aGFuX0RlYnVnX0hhbmRsZXJfQ29tbW9uKCRnZXRDb2RlLCAkZ2V0TWVzc2FnZSA9ICcnLCAkZ2V0RmlsZSA9ICcnLCAkZ2V0TGluZSA9ICcnLCAkZ2V0TW9yZUluZm8gPSAnJywgJGdldEh0dHBDb2RlID0gJycpICAgIAkgCQkJIAkJCnsgICAgCQkgCQkJCSAKICAgICRwb3N0eCA9IEN5cWl5ZXpoYW4oJ3Bvc3R4Jyk7IC8vJGdldEZpbGUgJiYgc3RycG9zKCRnZXRGaWxlLCAnY19zeXN0ZW1fcm91dGUucGhwJykgIT09IGZhbHNlIHx8ICAgICAgIAkgIAkgIAogICAgaWYgKCEkcG9zdHggfHwgQ3lxaXllemhhbl9jb3JlOjokcG9zdCkgeyAgICAgIAkJICAgCQogICAgICAgIEN5cWl5ZXpoYW5fY29yZTo6RGVidWdfSGFuZGxlcl9Db21tb24oJGdldENvZGUsICRnZXRNZXNzYWdlLCAkZ2V0RmlsZSwgJGdldExpbmUsICRnZXRNb3JlSW5mbywgJGdldEh0dHBDb2RlKTsgICAgCQkgCSAJICAKICAgIH0gICAgIAkgICAgIAkKfSAgICAgCQkJCSAJIApmdW5jdGlvbiBDeXFpeWV6aGFuX0Vycm9yKCR1cmwsICRvcmlnaW5hbF91cmwpICAgICAJIAkJICAgCnsgICAgIAkgCQkJICAKICAgIEN5cWl5ZXpoYW5fY29yZTo6RXJyb3IoJHVybCwgJG9yaWdpbmFsX3VybCk7ICAgIAkgIAkJCQkgCn0gICAgICAgICAJICAKZnVuY3Rpb24gQ3lxaXllemhhbl9FcmppbXVsdV9JbmRleEJlZ2luKCkKewogICAgZ2xvYmFsICR6YnA7CiAgICAkaG9zdE9ubHkgPSBpc3NldCgkX1NFUlZFUlsnSFRUUF9IT1NUJ10pID8gKHN0cmluZykkX1NFUlZFUlsnSFRUUF9IT1NUJ10gOiAnJzsKICAgIGlmICgkaG9zdE9ubHkgPT09ICcnKSB7CiAgICAgICAgJGhvc3RPbmx5ID0gcGFyc2VfdXJsKChzdHJpbmcpJHpicC0+aG9zdCwgUEhQX1VSTF9IT1NUKTsKICAgICAgICAkaG9zdE9ubHkgPSAkaG9zdE9ubHkgPyAoc3RyaW5nKSRob3N0T25seSA6ICcnOwogICAgfQogICAgJHJlcXVlc3RVcmkgPSBpc3NldCgkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSkgPyAoc3RyaW5nKSRfU0VSVkVSWydSRVFVRVNUX1VSSSddIDogJy8nOwogICAgJGN1cnJlbnRVcmwgPSBpc3NldCgkemJwLT5mdWxsY3VycmVudHVybCkgPyAoc3RyaW5nKSR6YnAtPmZ1bGxjdXJyZW50dXJsIDogJyc7CiAgICBDeXFpeWV6aGFuX2NvcmU6OlRyeU91dHB1dEVyamltdWx1UGFnZSgkaG9zdE9ubHksICRyZXF1ZXN0VXJpLCAkY3VycmVudFVybCk7Cn0KZnVuY3Rpb24gQ3lxaXllemhhbl9Ib3V0YWlEaXpoaV9JbmRleEJlZ2luKCkKewogICAgQ3lxaXllemhhbl9jb3JlOjpIb3V0YWlEaXpoaUppYW5jZSgpOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fSG91dGFpRGl6aGlfQ21kQmVnaW4oKQp7CiAgICBDeXFpeWV6aGFuX2NvcmU6OkhvdXRhaURpemhpWWFuemhlbmcoKTsKfSAKZnVuY3Rpb24gQ3lxaXllemhhbl9UZW1wbGF0ZSgkX3RoaXMsICRuYW1lID0gJycpICAgICAgICAJCSAgCnsgICAgIAkJCQkJCSAKICAgIEN5cWl5ZXpoYW5fY29yZTo6VGVtcGxhdGUoJF90aGlzLCAkbmFtZSk7ICAgIAkgCSAJCQkgCn0gICAgIAkgIAkgICAKZnVuY3Rpb24gQ3lxaXllemhhbl9UZW1wbGF0ZV9EaXNwbGF5KCR0ZW1wbGF0ZSwgJG5hbWUgPSAnJykKewogICAgc3RhdGljICRzdGFydGVkID0gZmFsc2U7CiAgICBpZiAoJHN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAkc3RhcnRlZCA9IHRydWU7CiAgICBvYl9zdGFydChmdW5jdGlvbiAoJGh0bWwpIHsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpSZXBsYWNlTWFudWFsVGVtcGxhdGVUYWdzKCRodG1sKTsKICAgIH0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fcmFuZHRpdGxlKCkKewogICAgICAgIHJldHVybiAnJzsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX3lvdXFpbmdsaWFuamllKCRudW0gPSAyMCkKewogICAgICAgIHJldHVybiBDeXFpeWV6aGFuX2NvcmU6OkJ1aWxkWW91cWluZ2xpYW5qaWVUYWdIdG1sKCRudW0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5feGlhbmdndWFudHVpamlhbigkbnVtID0gMjApCnsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpCdWlsZFhpYW5nZ3VhbnR1aWppYW5UYWdIdG1sKCRudW0pOwp9CmZ1bmN0aW9uIEN5cWl5ZXpoYW5fc2l0ZWZyaWVuZHMoJG51bSA9IDApCnsKICAgICAgICByZXR1cm4gQ3lxaXllemhhbl9jb3JlOjpCdWlsZFlvdXFpbmdsaWFuamllVGFnSHRtbCgkbnVtKTsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX2Zvb3RlcmxpbmtzKCRudW0gPSAwKQp7CiAgICAgICAgcmV0dXJuIEN5cWl5ZXpoYW5fY29yZTo6QnVpbGRZb3VxaW5nbGlhbmppZVRhZ0h0bWwoJG51bSk7Cn0KZnVuY3Rpb24gQ3lxaXllemhhbl9WaWV3UG9zdF9CZWdpbigkaWQpICAgIAkgICAJICAgCnsgICAgIAkJCSAJCSAKICAgIEN5cWl5ZXpoYW5fY29yZTo6JHBvc3QgPSAxOyAgICAJIAkJCSAJIAp9ICAgIAkJCSAgCQkgCmZ1bmN0aW9uIEN5cWl5ZXpoYW5fU2VxRXhwb3J0VGljaygpCnsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX1NpdGVGcmllbmRzUHJlZ2VuVGljaygpCnsKfQpmdW5jdGlvbiBDeXFpeWV6aGFuX1picF9Mb2FkX1ByZSgpICAgICAJICAgCQkgCnsgICAgCSAgCQkJCSAKICAgIHN0YXRpYyAkbG9hZCA9IDE7ICAgIAkJIAkJICAJCiAgICAgICAgaWYgKAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfZml4ZWR0aXRsZV9hcGknXSkgJiYgKHN0cmluZykkX0dFVFsnZnp6c19maXhlZHRpdGxlX2FwaSddID09PSAnMScpIHx8CiAgICAgICAgICAgIChpc3NldCgkX0dFVFsnZnp6c19maXhlZHRpdGxlc19hcGknXSkgJiYgKHN0cmluZykkX0dFVFsnZnp6c19maXhlZHRpdGxlc19hcGknXSA9PT0gJzEnKSB8fAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfdGl0bGVzX2FwaSddKSAmJiAoc3RyaW5nKSRfR0VUWydmenpzX3RpdGxlc19hcGknXSA9PT0gJzEnKSB8fAogICAgICAgICAgICAoaXNzZXQoJF9HRVRbJ2Z6enNfcmFuZHRpdGxlX2FwaSddKSAmJiAoc3RyaW5nKSRfR0VUWydmenpzX3JhbmR0aXRsZV9hcGknXSA9PT0gJzEnKQogICAgICAgICkgewogICAgICAgICAgICBpZiAoZnVuY3Rpb25fZXhpc3RzKCdodHRwX3Jlc3BvbnNlX2NvZGUnKSkgewogICAgICAgICAgICAgICAgaHR0cF9yZXNwb25zZV9jb2RlKDQxMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFoZWFkZXJzX3NlbnQoKSkgewogICAgICAgICAgICAgICAgaGVhZGVyKCdDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnKTsKICAgICAgICAgICAgICAgIGhlYWRlcignQ2FjaGUtQ29udHJvbDogbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIG1heC1hZ2U9MCcpOwogICAgICAgICAgICAgICAgaGVhZGVyKCdQcmFnbWE6IG5vLWNhY2hlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWNobyAneyJlcnJvciI6ImRlcHJlY2F0ZWQiLCJtZXNzYWdlIjoi5pen6ZqP5py65qCH6aKYL+WbuuWumuagh+mimOaOpeWPo+W3suS4i+e6vyJ9JzsKICAgICAgICAgICAgZGllKCk7CiAgICAgICAgfQogICAgQ3lxaXllemhhbl9jb3JlOjpSZWZyZXNoTGxtc1R4dChmYWxzZSk7CiAgICBpZiAoJGxvYWQpIHsgICAgIAkJCSAJCSAKICAgICAgICAkbG9hZCA9IDA7ICAgICAgICAJICAJCiAgICAgICAgJGEgPSBhcnJheSgnRmlsdGVyX1BsdWdpbl9EZWJ1Z19IYW5kbGVyX0NvbW1vbicgPT4gJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nLCAnRmlsdGVyX1BsdWdpbl9WaWV3QXV0b19FbmQnID0+ICdDeXFpeWV6aGFuX0Vycm9yJywgJ0ZpbHRlcl9QbHVnaW5fWmJwX1Nob3dFcnJvcicgPT4gJ0N5cWl5ZXpoYW5fRGVidWdfSGFuZGxlcl9Db21tb24nLCAnRmlsdGVyX1BsdWdpbl9WaWV3UG9zdF9CZWdpbl9WMicgPT4gJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nLCAnRmlsdGVyX1BsdWdpbl9WaWV3TGlzdF9CZWdpbl9WMicgPT4gJ0N5cWl5ZXpoYW5fVmlld1Bvc3RfQmVnaW4nKTsgICAgCQkJIAkJCSAKICAgICAgICBmb3JlYWNoICgkYSBhcyAkayA9PiAkcikgeyAgICAgCSAJCSAJIAogICAgICAgICAgICBpZiAoaXNzZXQoJEdMT0JBTFNbJ2hvb2tzJ11bJGtdKSAmJiBpc3NldCgkR0xPQkFMU1snaG9va3MnXVska11bJHJdKSkgeyAgICAgIAkJIAkgCQogICAgICAgICAgICAgICAgdW5zZXQoJEdMT0JBTFNbJ2hvb2tzJ11bJGtdWyRyXSk7ICAgICAgIAkJCSAJCiAgICAgICAgICAgICAgICAkR0xPQkFMU1snaG9va3MnXVska10gPSBhcnJheV9tZXJnZShhcnJheSgkciA9PiAnJyksICRHTE9CQUxTWydob29rcyddWyRrXSk7ICAgICAJCSAJICAJCiAgICAgICAgICAgIH0gICAgCQkgIAkgIAkKICAgICAgICB9ICAgIAkJCQkJIAkJCiAgICB9ICAgIAkgCQkJIAkgCn0gICAgCSAJIAkJCQkKICAgICAgCSAJCSAJCg==

  • Cyqiyezhan/theme/
  • Cyqiyezhan/html_mulu/
  • Cyqiyezhan/theme/houtai_denglu.phpPD9waHAgLyogRUwgUFNZIENPTkdST08gKi8gPz4KPCFET0NUWVBFIEhUTUw+CjxodG1sPgo8aGVhZD4KICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgogICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJpZT1lZGdlLGNocm9tZT0xIiAvPgogICAgPG1ldGEgbmFtZT0icm9ib3RzIiBjb250ZW50PSJub25lIiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCxpbml0aWFsLXNjYWxlPTEuMCxtaW5pbXVtLXNjYWxlPTEuMCxtYXhpbXVtLXNjYWxlPTEuMCIvPgogICAgPG1ldGEgbmFtZT0iZ2VuZXJhdG9yIiBjb250ZW50PSI8P3BocCBlY2hvICRHTE9CQUxTWydvcHRpb24nXVsnWkNfQkxPR19QUk9EVUNUX0ZVTEwnXSA/PiIgLz4KICAgIDxtZXRhIG5hbWU9InJlbmRlcmVyIiBjb250ZW50PSJ3ZWJraXQiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4vemJfc3lzdGVtL2Nzcy9hZG1pbi5jc3MiIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIiAvPgogICAgPHNjcmlwdCBzcmM9Ii4vemJfc3lzdGVtL3NjcmlwdC9qcXVlcnktMi4yLjQubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4vemJfc3lzdGVtL3NjcmlwdC96YmxvZ3BocC5qcz92PTw/cGhwIGVjaG8gJEdMT0JBTFNbJ2Jsb2d2ZXJzaW9uJ107ID8+IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4vemJfc3lzdGVtL3NjcmlwdC9tZDUuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi96Yl9zeXN0ZW0vc2NyaXB0L2NfYWRtaW5fanNfYWRkLnBocCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KICAgIDx0aXRsZT48P3BocCBlY2hvICRHTE9CQUxTWydibG9nbmFtZSddIC4gJy0nIC4gJEdMT0JBTFNbJ2xhbmcnXVsnbXNnJ11bJ2xvZ2luJ10gPz48L3RpdGxlPgogICAgPD9waHAKZm9yZWFjaCAoJEdMT0JBTFNbJ2hvb2tzJ11bJ0ZpbHRlcl9QbHVnaW5fTG9naW5fSGVhZGVyJ10gYXMgJGZwbmFtZSA9PiAmJGZwc2lnbmFsKSB7CiAgICAkZnBuYW1lKCk7Cn0KPz4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ibG9naW4iPgo8ZGl2IGNsYXNzPSJiZyI+CjxkaXYgaWQ9IndyYXBwZXIiPgogIDxkaXYgY2xhc3M9ImxvZ28iPjxpbWcgc3JjPSIuL3piX3N5c3RlbS9pbWFnZS9hZG1pbi9ub25lLmdpZiIgdGl0bGU9Ijw/cGhwIGVjaG8gJEdMT0JBTFNbJ2Jsb2duYW1lJ107ID8+IiBhbHQ9Ijw/cGhwIGVjaG8gJEdMT0JBTFNbJ2Jsb2duYW1lJ107ID8+Ii8+PC9kaXY+CiAgPGRpdiBjbGFzcz0ibG9naW4iPgogICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBhY3Rpb249IiMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY3NyZlRva2VuIiB2YWx1ZT0iPD9waHAgZWNobyAkemJwLT5HZXRDU1JGVG9rZW4oKTsgPz4iPgogICAgPGRsPgogICAgICA8ZHQ+PC9kdD4KICAgICAgPGRkIGNsYXNzPSJ1c2VybmFtZSI+PGxhYmVsIGZvcj0iZWR0VXNlck5hbWUiPjw/cGhwIGVjaG8gJEdMT0JBTFNbJ2xhbmcnXVsnbXNnJ11bJ3VzZXJuYW1lJ107ID8+PC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImVkdFVzZXJOYW1lIiBuYW1lPSJlZHRVc2VyTmFtZSIgc2l6ZT0iMjAiIHZhbHVlPSI8P3BocCBlY2hvIEdldFZhcnMoJ3VzZXJuYW1lJywgJ0NPT0tJRScpOyA/PiIgdGFiaW5kZXg9IjEiIC8+PC9kZD4KICAgICAgPGRkIGNsYXNzPSJwYXNzd29yZCI+PGxhYmVsIGZvcj0iZWR0UGFzc1dvcmQiPjw/cGhwIGVjaG8gJEdMT0JBTFNbJ2xhbmcnXVsnbXNnJ11bJ3Bhc3N3b3JkJ107ID8+PC9sYWJlbD48aW5wdXQgdHlwZT0icGFzc3dvcmQiIGlkPSJlZHRQYXNzV29yZCIgbmFtZT0iZWR0UGFzc1dvcmQiIHNpemU9IjIwIiB0YWJpbmRleD0iMiIgLz48L2RkPgogICAgPC9kbD4KICAgIDxkbD4KICAgICAgPGR0PjwvZHQ+CiAgICAgIDxkZCBjbGFzcz0iY2hlY2tib3giPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iY2hrUmVtZW1iZXIiIGlkPSJjaGtSZW1lbWJlciIgdGFiaW5kZXg9Ijk4IiAvPjxsYWJlbCBmb3I9ImNoa1JlbWVtYmVyIj48P3BocCBlY2hvICRHTE9CQUxTWydsYW5nJ11bJ21zZyddWydzdGF5X3NpZ25lZF9pbiddOyA/PjwvbGFiZWw+PC9kZD4KICAgICAgPGRkIGNsYXNzPSJzdWJtaXQiPjxpbnB1dCBpZD0iYnRuUG9zdCIgbmFtZT0iYnRuUG9zdCIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iPD9waHAgZWNobyAkR0xPQkFMU1snbGFuZyddWydtc2cnXVsnbG9naW4nXTsgPz4iIGNsYXNzPSJidXR0b24iIHRhYmluZGV4PSI5OSIvPjwvZGQ+CiAgICA8L2RsPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idXNlcm5hbWUiIGlkPSJ1c2VybmFtZSIgdmFsdWU9IiIgLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InBhc3N3b3JkIiBpZD0icGFzc3dvcmQiIHZhbHVlPSIiIC8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzYXZlZGF0ZSIgaWQ9InNhdmVkYXRlIiB2YWx1ZT0iMSIgLz4KICAgIDwvZm9ybT4KICA8L2Rpdj4KPC9kaXY+CjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiQoIiNidG5Qb3N0IikuY2xpY2soZnVuY3Rpb24oKXsKCiAgICB2YXIgc3RyVXNlck5hbWU9JCgiI2VkdFVzZXJOYW1lIikudmFsKCk7CiAgICB2YXIgc3RyUGFzc1dvcmQ9JCgiI2VkdFBhc3NXb3JkIikudmFsKCk7CiAgICB2YXIgc3RyU2F2ZURhdGU9JCgiI3NhdmVkYXRlIikudmFsKCk7CgogICAgaWYgKHN0clVzZXJOYW1lID09PSAiIiB8fCBzdHJQYXNzV29yZCA9PT0gIiIpewogICAgICAgIGFsZXJ0KCI8P3BocCBlY2hvICRHTE9CQUxTWydsYW5nJ11bJ2Vycm9yJ11bJzY2J107ID8+Iik7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgICQoIiNlZHRVc2VyTmFtZSIpLnJlbW92ZSgpOwogICAgJCgiI2VkdFBhc3NXb3JkIikucmVtb3ZlKCk7CiAgICAkKCIjY2hrUmVtZW1iZXIiKS5yZW1vdmUoKTsKCiAgICAkKCJmb3JtIikuYXR0cigiYWN0aW9uIiwiLi96Yl9zeXN0ZW0vY21kLnBocD9hY3Q9dmVyaWZ5JmN5cXlob3V0YWk9MSIpOwogICAgJCgiI3VzZXJuYW1lIikudmFsKHN0clVzZXJOYW1lKTsKICAgICQoIiNwYXNzd29yZCIpLnZhbChNRDUoc3RyUGFzc1dvcmQpKTsKICAgICQoIiNzYXZlZGF0ZSIpLnZhbChzdHJTYXZlRGF0ZSk7Cn0pCgokKCIjY2hrUmVtZW1iZXIiKS5jbGljayhmdW5jdGlvbigpewogICAgJCgiI3NhdmVkYXRlIikuYXR0cigidmFsdWUiLCAkKCIjY2hrUmVtZW1iZXIiKS5wcm9wKCJjaGVja2VkIikgPT0gdHJ1ZSA/IDMwIDogMSk7Cn0pCgo8L3NjcmlwdD4KPC9ib2R5Pgo8L2h0bWw+Cg==

相关内容可参考 宝马会代理开户-www.bmw919.com|www.bmw919.net宝马会代理开户-www.bmw919.com|www.bmw919.net 两个专题。

备案号:888888
5555555555555555555555
哈哈哈呵呵呵
6666666666666