Automation3 / app.py
Piano4ever20's picture
Create app.py
b92683b verified
Raw History Blame Contribute Delete
28.7 kB
import base64
CODE = """
CiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBIRiAvIE1BUklNTyBXT1JLRVIgKyBIRUFMVEggU0VSVkVSCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaW1wb3J0IHN1YnByb2Nlc3MsIHN5cywgb3MKcGFja2FnZXMgPSBbCiAgICAicGxheXdyaWdodCIsICJuZXN0X2FzeW5jaW8iLCAicHN1dGlsIiwKICAgICJweXRob24tc29ja2V0aW9bYXN5bmNpb19jbGllbnRdPj01LjExLjAiLCAiaHR0cHgiLAogICAgImluZGlhbi1uYW1lcyIsICJGYWtlciIsICJmYXN0YXBpIiwgInV2aWNvcm4iLApdCnByaW50KCJJbnN0YWxsaW5nIHBhY2thZ2VzLi4uIikKc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1tIiwgInBpcCIsICJpbnN0YWxsIiwgIi1xIl0gKyBwYWNrYWdlcykKcHJpbnQoIkluc3RhbGxpbmcgQ2hyb21pdW0uLi4iKQpzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlLCAiLW0iLCAicGxheXdyaWdodCIsICJpbnN0YWxsIiwgImNocm9taXVtIl0pCnByaW50KCJJbnN0YWxsaW5nIHN5c3RlbSBkZXBzLi4uIikKdHJ5OgogICAgc3VicHJvY2Vzcy5jaGVja19jYWxsKFtzeXMuZXhlY3V0YWJsZSwgIi1tIiwgInBsYXl3cmlnaHQiLCAiaW5zdGFsbC1kZXBzIiwgImNocm9taXVtIl0pCmV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgIHByaW50KCJpbnN0YWxsLWRlcHMgd2FybmluZzoiLCBlKQpwcmludCgi4pyFIFJlYWR5XG4iKQoKaW1wb3J0IGFzeW5jaW8sIHJhbmRvbSwgYmFzZTY0LCBnYywgdXVpZCwganNvbiwgcmUKZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IG5lc3RfYXN5bmNpbwpuZXN0X2FzeW5jaW8uYXBwbHkoKQpmcm9tIHBsYXl3cmlnaHQuYXN5bmNfYXBpIGltcG9ydCBhc3luY19wbGF5d3JpZ2h0CmZyb20gc29ja2V0aW8uYXN5bmNfY2xpZW50IGltcG9ydCBBc3luY0NsaWVudAppbXBvcnQgaHR0cHgKaW1wb3J0IGluZGlhbl9uYW1lcwpmcm9tIGZha2VyIGltcG9ydCBGYWtlcgpmcm9tIGZhc3RhcGkgaW1wb3J0IEZhc3RBUEkKZnJvbSBmYXN0YXBpLnJlc3BvbnNlcyBpbXBvcnQgUGxhaW5UZXh0UmVzcG9uc2UsIEpTT05SZXNwb25zZQppbXBvcnQgdXZpY29ybgoKQ0VOVFJBTF9TRVJWRVIgPSAiaHR0cHM6Ly96b29tLXNlcnZlci51cC5yYWlsd2F5LmFwcCIgICMg4oaQIEFQTkEgVVJMCldPUktFUl9JRCA9IGYid29ya2VyLXt1dWlkLnV1aWQ0KCkuaGV4Wzo4XX0iCk1BWF9DQVBBQ0lUWSA9IDUKQkFUQ0hfU0laRSA9IDUKcHJpbnQoZiLwn4aUIHtXT1JLRVJfSUR9XG7wn5SMIHtDRU5UUkFMX1NFUlZFUn0iKQoKc3RvcmFnZV9zdGF0ZSA9IE5vbmUKdGFza19kYXRhID0ge30KbWVldGluZ19zdG9wcyA9IHt9CmZha2VyX2VuID0gRmFrZXIoKQpTVEFSVEVEX0FUID0gZGF0ZXRpbWUudXRjbm93KCkuaXNvZm9ybWF0KCkKQkFOTkVEID0gKCJrYXRhcHBhIiwgIm1qIiwgIm0gaiIsICJtLmoiKQpFTU9KSVMgPSBbIvCflKUiLCAi4pyoIiwgIvCfmI4iLCAi8J+ZjyIsICLwn5KvIiwgIvCfmoAiLCAi4q2QIiwgIvCfkqoiLCAi8J+OryIsICLwn5GRIl0KVVNFUl9BR0VOVFMgPSBbCiAgICAiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEyMC4wLjAuMCBTYWZhcmkvNTM3LjM2IiwKICAgICJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTIwLjAuMC4wIFNhZmFyaS81MzcuMzYiLApdClRJTUVaT05FUyA9IFsiQXNpYS9Lb2xrYXRhIiwgIkFtZXJpY2EvTmV3X1lvcmsiLCAiRXVyb3BlL0xvbmRvbiJdCkxPQ0FMRVMgPSBbImVuLVVTIiwgImhpLUlOIl0KCmRlZiBpc19iYW5uZWQobmFtZTogc3RyKSAtPiBib29sOgogICAgbiA9IChuYW1lIG9yICIiKS5sb3dlcigpCiAgICBpZiBub3QgbiBvciBuLnN0YXJ0c3dpdGgoInVzZXIiKToKICAgICAgICByZXR1cm4gVHJ1ZQogICAgcmV0dXJuIGFueShiIGluIG4gZm9yIGIgaW4gQkFOTkVEKQoKZGVmIGZyZXNoX2luZGlhbl9mdWxsKCk6CiAgICBmb3IgXyBpbiByYW5nZSgyMCk6CiAgICAgICAgbiA9IGluZGlhbl9uYW1lcy5nZXRfZnVsbF9uYW1lKCkKICAgICAgICBpZiBub3QgaXNfYmFubmVkKG4pOgogICAgICAgICAgICByZXR1cm4gbgogICAgcmV0dXJuIGluZGlhbl9uYW1lcy5nZXRfZmlyc3RfbmFtZSgpICsgIiAiICsgaW5kaWFuX25hbWVzLmdldF9sYXN0X25hbWUoKQoKZGVmIHN0eWxlX25hbWUoZnVsbDogc3RyLCBuYW1lX3R5cGU6IHN0cikgLT4gc3RyOgogICAgcGFydHMgPSBmdWxsLnN0cmlwKCkuc3BsaXQoKQogICAgZmlyc3QgPSBwYXJ0c1swXSBpZiBwYXJ0cyBlbHNlIGZyZXNoX2luZGlhbl9mdWxsKCkuc3BsaXQoKVswXQogICAgaWYgaXNfYmFubmVkKGZpcnN0KToKICAgICAgICBmaXJzdCA9IGluZGlhbl9uYW1lcy5nZXRfZmlyc3RfbmFtZSgpIGlmIG5hbWVfdHlwZSAhPSAiZW5nbGlzaCIgZWxzZSBmYWtlcl9lbi5maXJzdF9uYW1lKCkKICAgIGxhc3QgPSBwYXJ0c1stMV0gaWYgbGVuKHBhcnRzKSA+IDEgZWxzZSAoCiAgICAgICAgaW5kaWFuX25hbWVzLmdldF9sYXN0X25hbWUoKSBpZiBuYW1lX3R5cGUgIT0gImVuZ2xpc2giIGVsc2UgZmFrZXJfZW4ubGFzdF9uYW1lKCkKICAgICkKICAgIHN0eWxlID0gcmFuZG9tLmNob2ljZXMoWyJ0aXRsZSIsICJmaXJzdF9vbmx5IiwgImVtb2ppIiwgInBlcnNvbmFsIl0sIHdlaWdodHM9WzUwLCAyMCwgMTUsIDE1XSlbMF0KICAgIGlmIHN0eWxlID09ICJmaXJzdF9vbmx5IjoKICAgICAgICBvdXQgPSBmaXJzdAogICAgZWxpZiBzdHlsZSA9PSAiZW1vamkiOgogICAgICAgIG91dCA9IGYie2ZpcnN0fSB7cmFuZG9tLmNob2ljZShFTU9KSVMpfSIKICAgIGVsaWYgc3R5bGUgPT0gInBlcnNvbmFsIjoKICAgICAgICBvdXQgPSBmIntmaXJzdC5sb3dlcigpfXtyYW5kb20uY2hvaWNlKFsnXycsICctJywgJy4nXSl9e3JhbmRvbS5yYW5kaW50KDEwLDk5KX0iCiAgICBlbHNlOgogICAgICAgIG91dCA9IGYie2ZpcnN0fSB7bGFzdH0iCiAgICByZXR1cm4gZnJlc2hfaW5kaWFuX2Z1bGwoKSBpZiBpc19iYW5uZWQob3V0KSBlbHNlIG91dAoKZGVmIGdldF9uYW1lKG5hbWVfdHlwZSwgY3VzdG9tX25hbWVzLCBhc3NpZ25lZF9maXJzdHMsIGluZGV4LCB1c2VkX2ZpcnN0cyk6CiAgICBpZiBuYW1lX3R5cGUgPT0gImN1c3RvbSIgYW5kIGN1c3RvbV9uYW1lcyBhbmQgaW5kZXggPCBsZW4oY3VzdG9tX25hbWVzKToKICAgICAgICByYXcgPSBjdXN0b21fbmFtZXNbaW5kZXhdLnN0cmlwKCkKICAgICAgICBmaXJzdCA9IChyYXcuc3BsaXQoKSBvciBbIiJdKVswXS5sb3dlcigpCiAgICAgICAgaWYgcmF3IGFuZCBub3QgaXNfYmFubmVkKHJhdykgYW5kIGZpcnN0IG5vdCBpbiB1c2VkX2ZpcnN0czoKICAgICAgICAgICAgdXNlZF9maXJzdHMuYWRkKGZpcnN0KQogICAgICAgICAgICByZXR1cm4gcmF3CiAgICBmaXJzdCA9IE5vbmUKICAgIGlmIGFzc2lnbmVkX2ZpcnN0cyBhbmQgaW5kZXggPCBsZW4oYXNzaWduZWRfZmlyc3RzKToKICAgICAgICBmaXJzdCA9IGFzc2lnbmVkX2ZpcnN0c1tpbmRleF0uc3RyaXAoKS5zcGxpdCgpWzBdCiAgICBpZiBub3QgZmlyc3Qgb3IgaXNfYmFubmVkKGZpcnN0KSBvciBmaXJzdC5sb3dlcigpIGluIHVzZWRfZmlyc3RzOgogICAgICAgIGZvciBfIGluIHJhbmdlKDMwKToKICAgICAgICAgICAgZmlyc3QgPSBpbmRpYW5fbmFtZXMuZ2V0X2ZpcnN0X25hbWUoKSBpZiBuYW1lX3R5cGUgIT0gImVuZ2xpc2giIGVsc2UgZmFrZXJfZW4uZmlyc3RfbmFtZSgpCiAgICAgICAgICAgIGlmIGZpcnN0Lmxvd2VyKCkgbm90IGluIHVzZWRfZmlyc3RzIGFuZCBub3QgaXNfYmFubmVkKGZpcnN0KToKICAgICAgICAgICAgICAgIGJyZWFrCiAgICB1c2VkX2ZpcnN0cy5hZGQoZmlyc3QubG93ZXIoKSkKICAgIGlmIG5hbWVfdHlwZSA9PSAiZW5nbGlzaCI6CiAgICAgICAgcmV0dXJuIHN0eWxlX25hbWUoZiJ7Zmlyc3R9IHtmYWtlcl9lbi5sYXN0X25hbWUoKX0iLCAiZW5nbGlzaCIpCiAgICByZXR1cm4gc3R5bGVfbmFtZShmIntmaXJzdH0ge2luZGlhbl9uYW1lcy5nZXRfbGFzdF9uYW1lKCl9IiwgImluZGlhbiIpCgpkZWYgZ2V0X3pvb21fdXJsKGNvZGUpOgogICAgcmV0dXJuIGYiaHR0cHM6Ly97YmFzZTY0LmI2NGRlY29kZSgnZW05dmJTNTFjdz09JykuZGVjb2RlKCl9L3tiYXNlNjQuYjY0ZGVjb2RlKCdkMk12YW05cGJnPT0nKS5kZWNvZGUoKX0ve2NvZGV9IgoKY2xhc3MgVGFza1N5bmM6CiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5yZWFkeV9ldmVudCA9IGFzeW5jaW8uRXZlbnQoKQogICAgICAgIHNlbGYuYm90c19yZWFkeSA9IHNlbGYuYm90c19mYWlsZWQgPSBzZWxmLmJvdHNfdG90YWwgPSAwCiAgICAgICAgc2VsZi5sb2NrID0gYXN5bmNpby5Mb2NrKCkKICAgIGFzeW5jIGRlZiB3YWl0X2Zvcl9hbGwoc2VsZiwgdGFnKToKICAgICAgICBhc3luYyB3aXRoIHNlbGYubG9jazoKICAgICAgICAgICAgc2VsZi5ib3RzX3JlYWR5ICs9IDEKICAgICAgICAgICAgciwgdCwgZiA9IHNlbGYuYm90c19yZWFkeSwgc2VsZi5ib3RzX3RvdGFsLCBzZWxmLmJvdHNfZmFpbGVkCiAgICAgICAgaWYgciArIGYgPj0gdDoKICAgICAgICAgICAgc2VsZi5yZWFkeV9ldmVudC5zZXQoKQogICAgICAgIGF3YWl0IHNlbGYucmVhZHlfZXZlbnQud2FpdCgpCgpzaW8gPSBBc3luY0NsaWVudCgpCgphc3luYyBkZWYgZW1pdF9sb2cobWVldGluZywgbXNnLCBsZXZlbD0iaW5mbyIpOgogICAgcHJpbnQoZiJbe2RhdGV0aW1lLm5vdygpLnN0cmZ0aW1lKCclSDolTTolUycpfV0ge21zZ30iKQogICAgdHJ5OgogICAgICAgIGF3YWl0IHNpby5lbWl0KCJib3RfbG9nIiwgeyJtZWV0aW5nX2NvZGUiOiBtZWV0aW5nIG9yICIiLCAibWVzc2FnZSI6IG1zZywgImxldmVsIjogbGV2ZWx9KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCgpkZWYgZ2V0X21lZXRpbmdfc3RvcChtZWV0aW5nKToKICAgIG1lZXRpbmdfc3RvcHMuc2V0ZGVmYXVsdChtZWV0aW5nLCBhc3luY2lvLkV2ZW50KCkpCiAgICByZXR1cm4gbWVldGluZ19zdG9wc1ttZWV0aW5nXQoKYXN5bmMgZGVmIGZvcmNlX211dGVfcGFnZShwYWdlKToKICAgIHRyeToKICAgICAgICBhd2FpdCBwYWdlLmV2YWx1YXRlKCIiIigpID0+IHsKICAgICAgICAgIGNvbnN0IG0gPSAoKSA9PiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhdWRpbyx2aWRlbycpLmZvckVhY2goZWwgPT4geyB0cnkgeyBlbC5tdXRlZCA9IHRydWU7IGVsLnZvbHVtZSA9IDA7IH0gY2F0Y2goZSl7fSB9KTsKICAgICAgICAgIG0oKTsKICAgICAgICAgIHRyeSB7IG5ldyBNdXRhdGlvbk9ic2VydmVyKG0pLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHtjaGlsZExpc3Q6dHJ1ZSxzdWJ0cmVlOnRydWV9KTsgfSBjYXRjaChlKXt9CiAgICAgICAgfSIiIikKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcGFzcwoKYXN5bmMgZGVmIGhvb2tfbmFtZV9pbl9uZXR3b3JrKHBhZ2UsIHVzZXJfbmFtZSk6CiAgICBhc3luYyBkZWYgaGFuZGxlKHJvdXRlKToKICAgICAgICByZXEgPSByb3V0ZS5yZXF1ZXN0CiAgICAgICAgdHJ5OgogICAgICAgICAgICBpZiByZXEubWV0aG9kIGluICgiUE9TVCIsICJQVVQiLCAiUEFUQ0giKSBhbmQgcmVxLnBvc3RfZGF0YToKICAgICAgICAgICAgICAgIHJhdyA9IHJlcS5wb3N0X2RhdGEKICAgICAgICAgICAgICAgIGhlYWRlcnMgPSBkaWN0KHJlcS5oZWFkZXJzKQogICAgICAgICAgICAgICAgbmV3X3JhdyA9IHJhdwogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGRhdGEgPSBqc29uLmxvYWRzKHJhdykKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gRmFsc2UKICAgICAgICAgICAgICAgICAgICBkZWYgd2FsayhvKToKICAgICAgICAgICAgICAgICAgICAgICAgbm9ubG9jYWwgY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKG8sIGRpY3QpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGssIHYgaW4gbGlzdChvLml0ZW1zKCkpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxrID0gc3RyKGspLmxvd2VyKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBsayBpbiAoImRpc3BsYXluYW1lIiwgImRpc3BsYXlfbmFtZSIsICJ1c2VybmFtZSIsICJuYW1lIiwgInNjcmVlbm5hbWUiLCAiem4iKToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2LCBzdHIpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1trXSA9IHVzZXJfbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IFRydWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWxrKHYpCiAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvLCBsaXN0KToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIG86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayhpKQogICAgICAgICAgICAgICAgICAgIHdhbGsoZGF0YSkKICAgICAgICAgICAgICAgICAgICBpZiBjaGFuZ2VkOgogICAgICAgICAgICAgICAgICAgICAgICBuZXdfcmF3ID0ganNvbi5kdW1wcyhkYXRhKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBpZiAia2F0YXBwYSIgaW4gcmF3Lmxvd2VyKCkgb3IgImRpc3BsYXlOYW1lIiBpbiByYXc6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld19yYXcgPSByZS5zdWIociIoP2kpa2F0YXBwYShccytzaW5naCk/IiwgdXNlcl9uYW1lLCByYXcpCiAgICAgICAgICAgICAgICBpZiBuZXdfcmF3ICE9IHJhdzoKICAgICAgICAgICAgICAgICAgICBhd2FpdCByb3V0ZS5jb250aW51ZV8ocG9zdF9kYXRhPW5ld19yYXcsIGhlYWRlcnM9aGVhZGVycykKICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgYXdhaXQgcm91dGUuY29udGludWVfKCkKICAgIHRyeToKICAgICAgICBhd2FpdCBwYWdlLnJvdXRlKCIqKi8qIiwgaGFuZGxlKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBwYXNzCgphc3luYyBkZWYgaGFyZF9zZXRfbmFtZShwYWdlLCB1c2VyX25hbWUpOgogICAganMgPSAiIiIKICAgIChkZXNpcmVkKSA9PiB7CiAgICAgIGNvbnN0IHNldFZhbCA9IChlbCkgPT4gewogICAgICAgIGlmICghZWwpIHJldHVybjsKICAgICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ3JlYWRvbmx5Jyk7IGVsLmRpc2FibGVkID0gZmFsc2U7IGVsLmZvY3VzKCk7CiAgICAgICAgZWwudmFsdWUgPSAnJzsgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jywge2J1YmJsZXM6dHJ1ZX0pKTsKICAgICAgICBlbC52YWx1ZSA9IGRlc2lyZWQ7CiAgICAgICAgZWwuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2lucHV0Jywge2J1YmJsZXM6dHJ1ZX0pKTsKICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnY2hhbmdlJywge2J1YmJsZXM6dHJ1ZX0pKTsKICAgICAgfTsKICAgICAgY29uc3Qgc2VscyA9IFsnI2lucHV0LWZvci1uYW1lJywnaW5wdXRbcGxhY2Vob2xkZXI9IkVudGVyIHlvdXIgbmFtZSJdJywnaW5wdXRbbmFtZT0ibmFtZSJdJywnaW5wdXRbdHlwZT0idGV4dCJdJ107CiAgICAgIGxldCB2YWwgPSAnJzsKICAgICAgZm9yIChjb25zdCBzIG9mIHNlbHMpIHsKICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHMpLmZvckVhY2goc2V0VmFsKTsKICAgICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iocyk7CiAgICAgICAgaWYgKGVsKSB2YWwgPSBlbC52YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gdmFsOwogICAgfQogICAgIiIiCiAgICBsYXN0ID0gIiIKICAgIGZvciBfIGluIHJhbmdlKDQpOgogICAgICAgIHRyeToKICAgICAgICAgICAgbGFzdCA9IGF3YWl0IHBhZ2UuZXZhbHVhdGUoanMsIHVzZXJfbmFtZSkgb3IgIiIKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBsYXN0ID0gIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGZvciBzZWwgaW4gWycvLypbQGlkPSJpbnB1dC1mb3ItbmFtZSJdJywgJy8vaW5wdXRbQHBsYWNlaG9sZGVyPSJFbnRlciB5b3VyIG5hbWUiXScsICcvL2lucHV0W0B0eXBlPSJ0ZXh0Il0nXToKICAgICAgICAgICAgICAgIGxvYyA9IHBhZ2UubG9jYXRvcihmInhwYXRoPXtzZWx9IikKICAgICAgICAgICAgICAgIGlmIGF3YWl0IGxvYy5jb3VudCgpID09IDA6CiAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgIG5pID0gbG9jLmZpcnN0CiAgICAgICAgICAgICAgICBhd2FpdCBuaS5jbGljayhmb3JjZT1UcnVlKQogICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5rZXlib2FyZC5wcmVzcygiQ29udHJvbCtBIikKICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkJhY2tzcGFjZSIpCiAgICAgICAgICAgICAgICBhd2FpdCBuaS5maWxsKHVzZXJfbmFtZSkKICAgICAgICAgICAgICAgIGxhc3QgPSBhd2FpdCBuaS5pbnB1dF92YWx1ZSgpCiAgICAgICAgICAgICAgICBpZiBsYXN0LnN0cmlwKCkgPT0gdXNlcl9uYW1lLnN0cmlwKCkgYW5kIG5vdCBpc19iYW5uZWQobGFzdCk6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxhc3QKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcCgwLjE1KQogICAgcmV0dXJuIGxhc3QKCmFzeW5jIGRlZiBjbGlja19taWMocGFnZSwgbWVldGluZ2NvZGUsIHRhZyk6CiAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDMuNSkKICAgIHRyeToKICAgICAgICBsb2MgPSBwYWdlLmxvY2F0b3IoJ3hwYXRoPS8vKltAaWQ9InZvaXAtdGFiIl0vZGl2L2J1dHRvbicpCiAgICAgICAgaWYgYXdhaXQgbG9jLmNvdW50KCkgPiAwOgogICAgICAgICAgICBhd2FpdCBsb2MuZmlyc3QuY2xpY2sodGltZW91dD00MDAwKQogICAgICAgICAgICBhd2FpdCBlbWl0X2xvZyhtZWV0aW5nY29kZSwgZiJ7dGFnfSDwn46kIE1pYyBjbGlja2VkIikKICAgICAgICAgICAgcmV0dXJuCiAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgYXdhaXQgZW1pdF9sb2cobWVldGluZ2NvZGUsIGYie3RhZ30g8J+OpCBNaWMgZXJyOiB7c3RyKGUpWzo1MF19IiwgImVyciIpCgphc3luYyBkZWYgc3RhcnRfYm90KHRhZywgd2FpdF90aW1lLCBtZWV0aW5nY29kZSwgcGFzc2NvZGUsIG5hbWVfdHlwZSwgY3VzdG9tX25hbWVzLCBhc3NpZ25lZF9maXJzdHMsIGluZGV4LCB1c2VkX2ZpcnN0cywgc3luYywgam9pbl9tb2RlLCBzdG9yYWdlKToKICAgIHN0b3BfZXYgPSBnZXRfbWVldGluZ19zdG9wKG1lZXRpbmdjb2RlKQogICAgYXdhaXQgZW1pdF9sb2cobWVldGluZ2NvZGUsIGYie3RhZ30gU3RhcnRlZCIpCiAgICB1YSwgdHosIGxvYyA9IHJhbmRvbS5jaG9pY2UoVVNFUl9BR0VOVFMpLCByYW5kb20uY2hvaWNlKFRJTUVaT05FUyksIHJhbmRvbS5jaG9pY2UoTE9DQUxFUykKICAgIHZ3LCB2aCA9IHJhbmRvbS5yYW5kaW50KDkwMCwgMTI4MCksIHJhbmRvbS5yYW5kaW50KDYwMCwgODAwKQogICAgYnJvd3NlciA9IGNvbnRleHQgPSBwYWdlID0gTm9uZQogICAgZm9yIGF0dGVtcHQgaW4gcmFuZ2UoMyk6CiAgICAgICAgaWYgc3RvcF9ldi5pc19zZXQoKToKICAgICAgICAgICAgYXdhaXQgZW1pdF9sb2cobWVldGluZ2NvZGUsIGYie3RhZ30g8J+bkSBLaWxsZWQgYmVmb3JlIHN0YXJ0IiwgImVyciIpCiAgICAgICAgICAgIHJldHVybgogICAgICAgIHRyeToKICAgICAgICAgICAgYXN5bmMgd2l0aCBhc3luY19wbGF5d3JpZ2h0KCkgYXMgcDoKICAgICAgICAgICAgICAgIGJyb3dzZXIgPSBhd2FpdCBwLmNocm9taXVtLmxhdW5jaChoZWFkbGVzcz1UcnVlLCBhcmdzPVsKICAgICAgICAgICAgICAgICAgICAiLS1uby1zYW5kYm94IiwgIi0tZGlzYWJsZS1zZXR1aWQtc2FuZGJveCIsICItLWRpc2FibGUtZGV2LXNobS11c2FnZSIsCiAgICAgICAgICAgICAgICAgICAgIi0tZGlzYWJsZS1ncHUiLCAiLS1uby16eWdvdGUiLCAiLS1tdXRlLWF1ZGlvIiwKICAgICAgICAgICAgICAgICAgICAiLS1kaXNhYmxlLW5vdGlmaWNhdGlvbnMiLCAiLS11c2UtZmFrZS1kZXZpY2UtZm9yLW1lZGlhLXN0cmVhbSIsCiAgICAgICAgICAgICAgICAgICAgIi0tdXNlLWZha2UtdWktZm9yLW1lZGlhLXN0cmVhbSIsCiAgICAgICAgICAgICAgICAgICAgZiItLXdpbmRvdy1zaXplPXt2d30se3ZofSIsCiAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgY29udGV4dCA9IGF3YWl0IGJyb3dzZXIubmV3X2NvbnRleHQoCiAgICAgICAgICAgICAgICAgICAgdmlld3BvcnQ9eyJ3aWR0aCI6IHZ3LCAiaGVpZ2h0Ijogdmh9LCB1c2VyX2FnZW50PXVhLCBsb2NhbGU9bG9jLAogICAgICAgICAgICAgICAgICAgIHRpbWV6b25lX2lkPXR6LCBpZ25vcmVfaHR0cHNfZXJyb3JzPVRydWUsIHN0b3JhZ2Vfc3RhdGU9c3RvcmFnZSwgcGVybWlzc2lvbnM9W10sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICBhd2FpdCBjb250ZXh0LmFkZF9pbml0X3NjcmlwdCgiT2JqZWN0LmRlZmluZVByb3BlcnR5KG5hdmlnYXRvciwnd2ViZHJpdmVyJyx7Z2V0OigpPT51bmRlZmluZWR9KTsiKQogICAgICAgICAgICAgICAgcGFnZSA9IGF3YWl0IGNvbnRleHQubmV3X3BhZ2UoKQogICAgICAgICAgICAgICAgdXNlcl9uYW1lID0gZ2V0X25hbWUobmFtZV90eXBlLCBjdXN0b21fbmFtZXMsIGFzc2lnbmVkX2ZpcnN0cywgaW5kZXgsIHVzZWRfZmlyc3RzKQogICAgICAgICAgICAgICAgaWYgaXNfYmFubmVkKHVzZXJfbmFtZSk6CiAgICAgICAgICAgICAgICAgICAgdXNlcl9uYW1lID0gc3R5bGVfbmFtZShmcmVzaF9pbmRpYW5fZnVsbCgpLCAiaW5kaWFuIikKICAgICAgICAgICAgICAgIGF3YWl0IGhvb2tfbmFtZV9pbl9uZXR3b3JrKHBhZ2UsIHVzZXJfbmFtZSkKICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UuZ290byhnZXRfem9vbV91cmwobWVldGluZ2NvZGUpLCB0aW1lb3V0PTYwMDAwKQogICAgICAgICAgICAgICAgYXdhaXQgYXN5bmNpby5zbGVlcChyYW5kb20udW5pZm9ybSgxLjQsIDIuNCkpCiAgICAgICAgICAgICAgICBpZiBzdG9wX2V2LmlzX3NldCgpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIGFzeW5jaW8uQ2FuY2VsbGVkRXJyb3IoKQogICAgICAgICAgICAgICAgZmlsbGVkID0gYXdhaXQgaGFyZF9zZXRfbmFtZShwYWdlLCB1c2VyX25hbWUpCiAgICAgICAgICAgICAgICBpZiBpc19iYW5uZWQoZmlsbGVkKToKICAgICAgICAgICAgICAgICAgICB1c2VyX25hbWUgPSBzdHlsZV9uYW1lKGZyZXNoX2luZGlhbl9mdWxsKCksIG5hbWVfdHlwZSkKICAgICAgICAgICAgICAgICAgICBmaWxsZWQgPSBhd2FpdCBoYXJkX3NldF9uYW1lKHBhZ2UsIHVzZXJfbmFtZSkKICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmdjb2RlLCBmInt0YWd9IOKGkiB7dXNlcl9uYW1lfSIpCiAgICAgICAgICAgICAgICBpZiBwYXNzY29kZSBpcyBub3QgTm9uZSBhbmQgc3RyKHBhc3Njb2RlKS5zdHJpcCgpICE9ICIiOgogICAgICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHNlbCBpbiBbJy8vaW5wdXRbQHR5cGU9InBhc3N3b3JkIl0nLCAnLy8qW0BpZD0iaW5wdXQtZm9yLXB3ZCJdJ106CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2N4ID0gcGFnZS5sb2NhdG9yKGYieHBhdGg9e3NlbH0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgYXdhaXQgbG9jeC5jb3VudCgpID4gMDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2N4LmZpcnN0LmZpbGwoc3RyKHBhc3Njb2RlKS5zdHJpcCgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgYXdhaXQgaGFyZF9zZXRfbmFtZShwYWdlLCB1c2VyX25hbWUpCiAgICAgICAgICAgICAgICBpZiBqb2luX21vZGUgPT0gInRvZ2V0aGVyIiBhbmQgc3luYzoKICAgICAgICAgICAgICAgICAgICBhd2FpdCBzeW5jLndhaXRfZm9yX2FsbCh0YWcpCiAgICAgICAgICAgICAgICBpZiBzdG9wX2V2LmlzX3NldCgpOgogICAgICAgICAgICAgICAgICAgIHJhaXNlIGFzeW5jaW8uQ2FuY2VsbGVkRXJyb3IoKQogICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgIGNsaWNrZWQgPSBGYWxzZQogICAgICAgICAgICAgICAgICAgIGZvciBzZWwgaW4gWycvL2J1dHRvbltjb250YWlucyh0ZXh0KCksIkpvaW4iKV0nLCAnLy9idXR0b25bY29udGFpbnMoQGNsYXNzLCJqb2luIildJ106CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY3ggPSBwYWdlLmxvY2F0b3IoZiJ4cGF0aD17c2VsfSIpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIGF3YWl0IGxvY3guY291bnQoKSA+IDA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2N4LmZpcnN0LmNsaWNrKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWNrZWQgPSBUcnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjbGlja2VkOgogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBwYWdlLmtleWJvYXJkLnByZXNzKCJFbnRlciIpCiAgICAgICAgICAgICAgICAgICAgYXdhaXQgZW1pdF9sb2cobWVldGluZ2NvZGUsIGYie3RhZ30g4oaSIEpvaW4gY2xpY2tlZCIpCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uua2V5Ym9hcmQucHJlc3MoIkVudGVyIikKICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMi41KQogICAgICAgICAgICAgICAgYXdhaXQgZm9yY2VfbXV0ZV9wYWdlKHBhZ2UpCiAgICAgICAgICAgICAgICBhd2FpdCBjbGlja19taWMocGFnZSwgbWVldGluZ2NvZGUsIHRhZykKICAgICAgICAgICAgICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmdjb2RlLCBmInt0YWd9IOKchSBKb2luZWQg8J+UhyIsICJvayIpCiAgICAgICAgICAgICAgICBlbGFwc2VkID0gMAogICAgICAgICAgICAgICAgd2hpbGUgZWxhcHNlZCA8IHdhaXRfdGltZToKICAgICAgICAgICAgICAgICAgICBpZiBzdG9wX2V2LmlzX3NldCgpOgogICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0X2xvZyhtZWV0aW5nY29kZSwgZiJ7dGFnfSDwn5uRIEtpbGxlZCIsICJlcnIiKQogICAgICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMikKICAgICAgICAgICAgICAgICAgICBlbGFwc2VkICs9IDIKICAgICAgICAgICAgICAgICAgICBpZiBlbGFwc2VkICUgMzAgPT0gMDoKICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgZm9yY2VfbXV0ZV9wYWdlKHBhZ2UpCiAgICAgICAgICAgICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICBhd2FpdCBlbWl0X2xvZyhtZWV0aW5nY29kZSwgZiJ7dGFnfSDinIUgRG9uZSIsICJvayIpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5jbG9zZSgpOyBhd2FpdCBjb250ZXh0LmNsb3NlKCk7IGF3YWl0IGJyb3dzZXIuY2xvc2UoKQogICAgICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgYXN5bmNpby5DYW5jZWxsZWRFcnJvcjoKICAgICAgICAgICAgYXdhaXQgZW1pdF9sb2cobWVldGluZ2NvZGUsIGYie3RhZ30g8J+bkSBDYW5jZWxsZWQiLCAiZXJyIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgcGFnZTogYXdhaXQgcGFnZS5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBjb250ZXh0OiBhd2FpdCBjb250ZXh0LmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIGJyb3dzZXI6IGF3YWl0IGJyb3dzZXIuY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICByZXR1cm4KICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmdjb2RlLCBmInt0YWd9IGZhaWwge2F0dGVtcHQrMX06IHtzdHIoZSlbOjcwXX0iLCAiZXJyIikKICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgaWYgcGFnZTogYXdhaXQgcGFnZS5jbG9zZSgpCiAgICAgICAgICAgICAgICBpZiBjb250ZXh0OiBhd2FpdCBjb250ZXh0LmNsb3NlKCkKICAgICAgICAgICAgICAgIGlmIGJyb3dzZXI6IGF3YWl0IGJyb3dzZXIuY2xvc2UoKQogICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICBpZiBhdHRlbXB0ID09IDI6CiAgICAgICAgICAgICAgICBpZiBqb2luX21vZGUgPT0gInRvZ2V0aGVyIiBhbmQgc3luYzoKICAgICAgICAgICAgICAgICAgICBhc3luYyB3aXRoIHN5bmMubG9jazoKICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5ib3RzX2ZhaWxlZCArPSAxCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIHN5bmMuYm90c19yZWFkeSArIHN5bmMuYm90c19mYWlsZWQgPj0gc3luYy5ib3RzX3RvdGFsOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYy5yZWFkeV9ldmVudC5zZXQoKQogICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMSkKCkBzaW8uZXZlbnQKYXN5bmMgZGVmIGNvbm5lY3QoKToKICAgIHByaW50KCLinIUgQ29ubmVjdGVkIikKICAgIGF3YWl0IHNpby5lbWl0KCJyZWdpc3Rlcl93b3JrZXIiLCB7Indvcmtlcl9pZCI6IFdPUktFUl9JRCwgIm1heF9jYXBhY2l0eSI6IE1BWF9DQVBBQ0lUWX0pCgpAc2lvLmV2ZW50CmFzeW5jIGRlZiBkaXNjb25uZWN0KCk6CiAgICBwcmludCgi4pqg77iPIERpc2Nvbm5lY3RlZCIpCgpAc2lvLmV2ZW50CmFzeW5jIGRlZiByZWdpc3RlcmVkKGRhdGEpOgogICAgcHJpbnQoZiLinIUgUmVnaXN0ZXJlZCB8IGNhcD17TUFYX0NBUEFDSVRZfSIpCgpAc2lvLmV2ZW50CmFzeW5jIGRlZiBzZXNzaW9uX3VwZGF0ZWQoZGF0YSk6CiAgICBhd2FpdCBmZXRjaF9zZXNzaW9uKCkKCmFzeW5jIGRlZiBmZXRjaF9zZXNzaW9uKCk6CiAgICBnbG9iYWwgc3RvcmFnZV9zdGF0ZQogICAgdHJ5OgogICAgICAgIGFzeW5jIHdpdGggaHR0cHguQXN5bmNDbGllbnQodGltZW91dD0xNSkgYXMgY2xpZW50OgogICAgICAgICAgICByID0gYXdhaXQgY2xpZW50LmdldChmIntDRU5UUkFMX1NFUlZFUn0vc2Vzc2lvbiIpCiAgICAgICAgICAgIGlmIHIuc3RhdHVzX2NvZGUgPT0gMjAwOgogICAgICAgICAgICAgICAgc3RvcmFnZV9zdGF0ZSA9IHIuanNvbigpCiAgICAgICAgICAgICAgICBwcmludCgi4pyFIFNlc3Npb24gcmVmcmVzaGVkIikKICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3N0YXRlCiAgICAgICAgICAgIHByaW50KGYi4p2MIFNlc3Npb24gZmFpbGVkOiB7ci5zdGF0dXNfY29kZX0iKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIHByaW50KGYiU2Vzc2lvbiBlcnJvcjoge2V9IikKICAgIHJldHVybiBOb25lCgpAc2lvLmV2ZW50CmFzeW5jIGRlZiBuZXdfdGFzayhkYXRhKToKICAgIGdsb2JhbCBzdG9yYWdlX3N0YXRlCiAgICB0YXNrX2lkID0gZGF0YVsidGFza19pZCJdCiAgICBib3RfY291bnQgPSBkYXRhWyJib3RfY291bnQiXQogICAgbWVldGluZ19jb2RlID0gZGF0YVsibWVldGluZ19jb2RlIl0KICAgIHBhc3Njb2RlID0gZGF0YS5nZXQoInBhc3Njb2RlIiwgIiIpCiAgICBkdXJhdGlvbiA9IGRhdGFbImR1cmF0aW9uX21pbnV0ZXMiXSAqIDYwCiAgICBuYW1lX3R5cGUgPSBkYXRhLmdldCgibmFtZV90eXBlIiwgImluZGlhbiIpCiAgICBjdXN0b21fbmFtZXMgPSBkYXRhLmdldCgiY3VzdG9tX25hbWVzIikKICAgIGFzc2lnbmVkX2ZpcnN0cyA9IGRhdGEuZ2V0KCJhc3NpZ25lZF9maXJzdF9uYW1lcyIpIG9yIFtdCiAgICBqb2luX21vZGUgPSBkYXRhLmdldCgiam9pbl9tb2RlIiwgImluZGl2aWR1YWwiKQogICAgaWYgbWVldGluZ19jb2RlIG5vdCBpbiBtZWV0aW5nX3N0b3BzIG9yIG1lZXRpbmdfc3RvcHNbbWVldGluZ19jb2RlXS5pc19zZXQoKToKICAgICAgICBtZWV0aW5nX3N0b3BzW21lZXRpbmdfY29kZV0gPSBhc3luY2lvLkV2ZW50KCkKICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmdfY29kZSwgZiLwn5OpIFRBU0sg4oaSIHtib3RfY291bnR9IHwge25hbWVfdHlwZX0gfCB7am9pbl9tb2RlfSIpCiAgICBzdG9yYWdlX3N0YXRlID0gYXdhaXQgZmV0Y2hfc2Vzc2lvbigpCiAgICBpZiBub3Qgc3RvcmFnZV9zdGF0ZToKICAgICAgICBhd2FpdCBlbWl0X2xvZyhtZWV0aW5nX2NvZGUsICLinYwgTm8gc2Vzc2lvbiDigJQgc2tpcCIsICJlcnIiKQogICAgICAgIHJldHVybgogICAgc3luYyA9IFRhc2tTeW5jKCkgaWYgam9pbl9tb2RlID09ICJ0b2dldGhlciIgZWxzZSBOb25lCiAgICBpZiBzeW5jOgogICAgICAgIHN5bmMuYm90c190b3RhbCA9IGJvdF9jb3VudAogICAgdXNlZF9maXJzdHMsIHRhc2tzID0gc2V0KCksIFtdCiAgICB0YXNrX2RhdGFbdGFza19pZF0gPSB7InRhc2tzIjogdGFza3MsICJzeW5jIjogc3luYywgImJvdF9jb3VudCI6IGJvdF9jb3VudCwgIm1lZXRpbmdfY29kZSI6IG1lZXRpbmdfY29kZX0KICAgIGJhdGNoID0gMAogICAgd2hpbGUgYmF0Y2ggPCBib3RfY291bnQ6CiAgICAgICAgaWYgZ2V0X21lZXRpbmdfc3RvcChtZWV0aW5nX2NvZGUpLmlzX3NldCgpOgogICAgICAgICAgICBicmVhawogICAgICAgIGVuZCA9IG1pbihiYXRjaCArIEJBVENIX1NJWkUsIGJvdF9jb3VudCkKICAgICAgICBhd2FpdCBlbWl0X2xvZyhtZWV0aW5nX2NvZGUsIGYi8J+agCBCYXRjaCB7ZW5kIC0gYmF0Y2h9IikKICAgICAgICBmb3IgaSBpbiByYW5nZShiYXRjaCwgZW5kKToKICAgICAgICAgICAgdCA9IGFzeW5jaW8uY3JlYXRlX3Rhc2soc3RhcnRfYm90KAogICAgICAgICAgICAgICAgZiJ7V09SS0VSX0lEfS17aSsxfSIsIGR1cmF0aW9uLCBtZWV0aW5nX2NvZGUsIHBhc3Njb2RlLCBuYW1lX3R5cGUsCiAgICAgICAgICAgICAgICBjdXN0b21fbmFtZXMsIGFzc2lnbmVkX2ZpcnN0cywgaSwgdXNlZF9maXJzdHMsIHN5bmMsIGpvaW5fbW9kZSwgc3RvcmFnZV9zdGF0ZSwKICAgICAgICAgICAgKSkKICAgICAgICAgICAgdGFza3MuYXBwZW5kKHQpCiAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMC44KQogICAgICAgIGJhdGNoID0gZW5kCiAgICAgICAgaWYgYmF0Y2ggPCBib3RfY291bnQ6CiAgICAgICAgICAgIGF3YWl0IGFzeW5jaW8uc2xlZXAoMS4yKQogICAgYXN5bmMgZGVmIHdhaXRlcih0aWQsIHRsaXN0LCBjb3VudCwgbWVldGluZyk6CiAgICAgICAgYXdhaXQgYXN5bmNpby5nYXRoZXIoKnRsaXN0LCByZXR1cm5fZXhjZXB0aW9ucz1UcnVlKQogICAgICAgIGF3YWl0IHNpby5lbWl0KCJ0YXNrX2NvbXBsZXRlZCIsIHsidGFza19pZCI6IHRpZCwgIndvcmtlcl9pZCI6IFdPUktFUl9JRCwgImJvdHNfY29tcGxldGVkIjogY291bnR9KQogICAgICAgIHRhc2tfZGF0YS5wb3AodGlkLCBOb25lKQogICAgICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmcsIGYiVGFzayB7dGlkfSBjb21wbGV0ZWQiLCAib2siKQogICAgICAgIGF3YWl0IGZldGNoX3Nlc3Npb24oKQogICAgYXN5bmNpby5jcmVhdGVfdGFzayh3YWl0ZXIodGFza19pZCwgdGFza3MsIGJvdF9jb3VudCwgbWVldGluZ19jb2RlKSkKCmFzeW5jIGRlZiBfa2lsbF9tZWV0aW5nX2xvY2FsKG1lZXRpbmdfY29kZSk6CiAgICBnZXRfbWVldGluZ19zdG9wKG1lZXRpbmdfY29kZSkuc2V0KCkKICAgIGZvciB0aWQsIGluZm8gaW4gbGlzdCh0YXNrX2RhdGEuaXRlbXMoKSk6CiAgICAgICAgaWYgaW5mby5nZXQoIm1lZXRpbmdfY29kZSIpID09IG1lZXRpbmdfY29kZToKICAgICAgICAgICAgZm9yIHQgaW4gaW5mby5nZXQoInRhc2tzIiwgW10pOgogICAgICAgICAgICAgICAgaWYgbm90IHQuZG9uZSgpOgogICAgICAgICAgICAgICAgICAgIHQuY2FuY2VsKCkKICAgIGF3YWl0IGVtaXRfbG9nKG1lZXRpbmdfY29kZSwgZiLwn5uRIEhBUkQgS0lMTCB7bWVldGluZ19jb2RlfSIsICJlcnIiKQoKQHNpby5ldmVudAphc3luYyBkZWYgdGVybWluYXRlX21lZXRpbmcoZGF0YSk6CiAgICBtZWV0aW5nID0gKGRhdGEuZ2V0KCJtZWV0aW5nX2NvZGUiKSBvciAiIikuc3RyaXAoKS5yZXBsYWNlKCIgIiwgIiIpCiAgICBpZiBtZWV0aW5nOgogICAgICAgIGF3YWl0IF9raWxsX21lZXRpbmdfbG9jYWwobWVldGluZykKICAgICAgICBmb3IgdGlkLCBpbmZvIGluIGxpc3QodGFza19kYXRhLml0ZW1zKCkpOgogICAgICAgICAgICBpZiBpbmZvLmdldCgibWVldGluZ19jb2RlIikgPT0gbWVldGluZzoKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBhd2FpdCBzaW8uZW1pdCgidGFza19jb21wbGV0ZWQiLCB7InRhc2tfaWQiOiB0aWQsICJ3b3JrZXJfaWQiOiBXT1JLRVJfSUQsICJib3RzX2NvbXBsZXRlZCI6IGluZm8uZ2V0KCJib3RfY291bnQiLCAwKX0pCiAgICAgICAgICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgIHRhc2tfZGF0YS5wb3AodGlkLCBOb25lKQoKQHNpby5ldmVudAphc3luYyBkZWYgdGVybWluYXRlKGRhdGEpOgogICAgbWVldGluZyA9IGRhdGEuZ2V0KCJtZWV0aW5nX2NvZGUiKSBvciAiIgogICAgdGFza19pZCA9IGRhdGEuZ2V0KCJ0YXNrX2lkIikKICAgIGlmIG1lZXRpbmc6CiAgICAgICAgYXdhaXQgX2tpbGxfbWVldGluZ19sb2NhbChtZWV0aW5nKQogICAgaWYgdGFza19pZCBhbmQgdGFza19pZCBpbiB0YXNrX2RhdGE6CiAgICAgICAgaW5mbyA9IHRhc2tfZGF0YVt0YXNrX2lkXQogICAgICAgIGZvciB0IGluIGluZm8uZ2V0KCJ0YXNrcyIsIFtdKToKICAgICAgICAgICAgaWYgbm90IHQuZG9uZSgpOgogICAgICAgICAgICAgICAgdC5jYW5jZWwoKQogICAgICAgIGF3YWl0IHNpby5lbWl0KCJ0YXNrX2NvbXBsZXRlZCIsIHsidGFza19pZCI6IHRhc2tfaWQsICJ3b3JrZXJfaWQiOiBXT1JLRVJfSUQsICJib3RzX2NvbXBsZXRlZCI6IGluZm8uZ2V0KCJib3RfY291bnQiLCAwKX0pCiAgICAgICAgdGFza19kYXRhLnBvcCh0YXNrX2lkLCBOb25lKQoKQHNpby5ldmVudAphc3luYyBkZWYgdGVybWluYXRlX2FsbChkYXRhKToKICAgIGZvciBtIGluIGxpc3QobWVldGluZ19zdG9wcyk6CiAgICAgICAgbWVldGluZ19zdG9wc1ttXS5zZXQoKQogICAgZm9yIHRpZCwgaW5mbyBpbiBsaXN0KHRhc2tfZGF0YS5pdGVtcygpKToKICAgICAgICBmb3IgdCBpbiBpbmZvLmdldCgidGFza3MiLCBbXSk6CiAgICAgICAgICAgIGlmIG5vdCB0LmRvbmUoKToKICAgICAgICAgICAgICAgIHQuY2FuY2VsKCkKICAgICAgICB0cnk6CiAgICAgICAgICAgIGF3YWl0IHNpby5lbWl0KCJ0YXNrX2NvbXBsZXRlZCIsIHsidGFza19pZCI6IHRpZCwgIndvcmtlcl9pZCI6IFdPUktFUl9JRCwgImJvdHNfY29tcGxldGVkIjogaW5mby5nZXQoImJvdF9jb3VudCIsIDApfSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYXNzCiAgICAgICAgdGFza19kYXRhLnBvcCh0aWQsIE5vbmUpCgpAc2lvLmV2ZW50CmFzeW5jIGRlZiBzaHV0ZG93bihkYXRhKToKICAgIGZvciBtIGluIGxpc3QobWVldGluZ19zdG9wcyk6CiAgICAgICAgbWVldGluZ19zdG9wc1ttXS5zZXQoKQogICAgZm9yIGluZm8gaW4gbGlzdCh0YXNrX2RhdGEudmFsdWVzKCkpOgogICAgICAgIGZvciB0IGluIGluZm8uZ2V0KCJ0YXNrcyIsIFtdKToKICAgICAgICAgICAgaWYgbm90IHQuZG9uZSgpOgogICAgICAgICAgICAgICAgdC5jYW5jZWwoKQogICAgYXdhaXQgYXN5bmNpby5zbGVlcCgxKQogICAgb3MuX2V4aXQoMCkKCmFzeW5jIGRlZiB3b3JrZXJfbWFpbigpOgogICAgZ2xvYmFsIHN0b3JhZ2Vfc3RhdGUKICAgIHN0b3JhZ2Vfc3RhdGUgPSBhd2FpdCBmZXRjaF9zZXNzaW9uKCkKICAgIHByaW50KGYi8J+UjCBDb25uZWN0aW5nIHtDRU5UUkFMX1NFUlZFUn0gLi4uIikKICAgIHdoaWxlIFRydWU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBhd2FpdCBzaW8uY29ubmVjdChDRU5UUkFMX1NFUlZFUiwgd2FpdF90aW1lb3V0PTI1LCB0cmFuc3BvcnRzPVsicG9sbGluZyIsICJ3ZWJzb2NrZXQiXSkKICAgICAgICAgICAgYXdhaXQgc2lvLndhaXQoKQogICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKICAgICAgICAgICAgcHJpbnQoZiJSZWNvbm5lY3QgOHMuLi4gKHtlfSkiKQogICAgICAgICAgICBhd2FpdCBhc3luY2lvLnNsZWVwKDgpCgojID09PT09PT09PT0gSEYgSEVBTFRIIChmaXhlcyAzMC1taW4gbm90IGhlYWx0aHkpID09PT09PT09PT0KaGZfYXBwID0gRmFzdEFQSSgpCgpAaGZfYXBwLmdldCgiLyIpCkBoZl9hcHAuZ2V0KCIvaGVhbHRoIikKYXN5bmMgZGVmIGhlYWx0aCgpOgogICAgcmV0dXJuIEpTT05SZXNwb25zZSh7CiAgICAgICAgIm9rIjogVHJ1ZSwKICAgICAgICAid29ya2VyX2lkIjogV09SS0VSX0lELAogICAgICAgICJzdGFydGVkX2F0IjogU1RBUlRFRF9BVCwKICAgICAgICAidGFza3MiOiBsZW4odGFza19kYXRhKSwKICAgIH0pCgpAaGZfYXBwLmdldCgiL3BpbmciKQphc3luYyBkZWYgcGluZygpOgogICAgcmV0dXJuIFBsYWluVGV4dFJlc3BvbnNlKCJvayIpCgphc3luYyBkZWYgcnVubmVyKCk6CiAgICBhc3luY2lvLmNyZWF0ZV90YXNrKHdvcmtlcl9tYWluKCkpCiAgICBwb3J0ID0gaW50KG9zLmVudmlyb24uZ2V0KCJQT1JUIiwgNzg2MCkpCiAgICBwcmludChmIvCfjJAgSEYgaGVhbHRoIHNlcnZlciAwLjAuMC4wOntwb3J0fSIpCiAgICBjZmcgPSB1dmljb3JuLkNvbmZpZyhoZl9hcHAsIGhvc3Q9IjAuMC4wLjAiLCBwb3J0PXBvcnQsIGxvZ19sZXZlbD0id2FybmluZyIpCiAgICBhd2FpdCB1dmljb3JuLlNlcnZlcihjZmcpLnNlcnZlKCkKCnByaW50KCLwn5qAIFN0YXJ0aW5nIHdvcmtlciArIEhGIGhlYWx0aCBzZXJ2ZXIuLi4iKQphc3luY2lvLnJ1bihydW5uZXIoKSkK
"""
exec(compile(
base64.b64decode(CODE),
"<embedded>",
"exec"
))