NFT Smart Contract

in #steem-engine4 years ago (edited)

{
"id": "ssc-mainnet1",
"json": {
"contractName": "contract",
"contractAction": "update",
"contractPayload": {
"name": "nft",
"params": "",
"code": "Y29uc3QgQ09OVFJBQ1RfTkFNRT0ibmZ0IixVVElMSVRZX1RPS0VOX1NZTUJPTD0iRU5HIixNQVhfTlVNX0FVVEhPUklaRURfSVNTVUVSUz0xMCxNQVhfTlVNX0xPQ0tFRF9UT0tFTl9UWVBFUz0xMCxNQVhfU1lNQk9MX0xFTkdUSD0xMCxNQVhfREFUQV9QUk9QRVJUWV9MRU5HVEg9MTAwLE1BWF9OVU1fTkZUU19JU1NVQUJMRT0xMCxNQVhfTlVNX05GVFNfRURJVEFCTEU9NTAsTUFYX05VTV9ORlRTX09QRVJBQkxFPTUwO2FjdGlvbnMuY3JlYXRlU1NDPShhc3luYygpPT57aWYoITE9PT1hd2FpdCBhcGkuZGIudGFibGVFeGlzdHMoIm5mdHMiKSl7YXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKCJuZnRzIixbInN5bWJvbCJdKSxhd2FpdCBhcGkuZGIuY3JlYXRlVGFibGUoInBhcmFtcyIpLGF3YWl0IGFwaS5kYi5jcmVhdGVUYWJsZSgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLFsic3ltYm9sIiwiY29tcGxldGVUaW1lc3RhbXAiXSk7Y29uc3QgZT17bmZ0Q3JlYXRpb25GZWU6IjEwMCIsbmZ0SXNzdWFuY2VGZWU6e0VORzoiMC4wMDEiLFBBTDoiMC4wMDEifSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZToiMTAwIixlbmFibGVEZWxlZ2F0aW9uRmVlOiIxMDAwIn07YXdhaXQgYXBpLmRiLmluc2VydCgicGFyYW1zIixlKX19KSxhY3Rpb25zLnVwZGF0ZVBhcmFtcz0oYXN5bmMgZT0+e2lmKGFwaS5zZW5kZXIhPT1hcGkub3duZXIpcmV0dXJuO2NvbnN0e25mdENyZWF0aW9uRmVlOnQsbmZ0SXNzdWFuY2VGZWU6YSxkYXRhUHJvcGVydHlDcmVhdGlvbkZlZTppLGVuYWJsZURlbGVnYXRpb25GZWU6c309ZSxuPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KTt0JiYic3RyaW5nIj09dHlwZW9mIHQmJiFhcGkuQmlnTnVtYmVyKHQpLmlzTmFOKCkmJmFwaS5CaWdOdW1iZXIodCkuZ3RlKDApJiYobi5uZnRDcmVhdGlvbkZlZT10KSxhJiYib2JqZWN0Ij09dHlwZW9mIGEmJihuLm5mdElzc3VhbmNlRmVlPWEpLGkmJiJzdHJpbmciPT10eXBlb2YgaSYmIWFwaS5CaWdOdW1iZXIoaSkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihpKS5ndGUoMCkmJihuLmRhdGFQcm9wZXJ0eUNyZWF0aW9uRmVlPWkpLHMmJiJzdHJpbmciPT10eXBlb2YgcyYmIWFwaS5CaWdOdW1iZXIocykuaXNOYU4oKSYmYXBpLkJpZ051bWJlcihzKS5ndGUoMCkmJihuLmVuYWJsZURlbGVnYXRpb25GZWU9cyksYXdhaXQgYXBpLmRiLnVwZGF0ZSgicGFyYW1zIixuKX0pO2NvbnN0IGlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkPShlLHQsYSxpLHMsbik9PiEodm9pZCAwIT09ZS5lcnJvcnN8fCFlLmV2ZW50c3x8dm9pZCAwPT09ZS5ldmVudHMuZmluZChlPT4idG9rZW5zIj09PWUuY29udHJhY3QmJmUuZXZlbnQ9PT1uJiZlLmRhdGEuZnJvbT09PXQmJmUuZGF0YS50bz09PWEmJmUuZGF0YS5xdWFudGl0eT09PXMmJmUuZGF0YS5zeW1ib2w9PT1pKSksY2FsY3VsYXRlQmFsYW5jZT0oZSx0LGEsaSk9Pmk/YXBpLkJpZ051bWJlcihlKS5wbHVzKHQpLnRvRml4ZWQoYSk6YXBpLkJpZ051bWJlcihlKS5taW51cyh0KS50b0ZpeGVkKGEpLGNvdW50RGVjaW1hbHM9ZT0+YXBpLkJpZ051bWJlcihlKS5kcCgpLGNvbnRhaW5zRHVwbGljYXRlcz1lPT5uZXcgU2V0KGUpLnNpemUhPT1lLmxlbmd0aCxpc1ZhbGlkU3RlZW1BY2NvdW50TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9MTYsaXNWYWxpZENvbnRyYWN0TGVuZ3RoPWU9PmUubGVuZ3RoPj0zJiZlLmxlbmd0aDw9NTAsaXNWYWxpZEFjY291bnRzQXJyYXk9ZT0+e2xldCB0PSEwO3JldHVybiBlLmZvckVhY2goZT0+eyJzdHJpbmciPT10eXBlb2YgZSYmaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZENvbnRyYWN0c0FycmF5PWU9PntsZXQgdD0hMDtyZXR1cm4gZS5mb3JFYWNoKGU9Pnsic3RyaW5nIj09dHlwZW9mIGUmJmlzVmFsaWRDb250cmFjdExlbmd0aChlKXx8KHQ9ITEpfSksdH0saXNWYWxpZERhdGFQcm9wZXJ0aWVzPShlLHQsYSxpKT0+e2NvbnN0IHM9T2JqZWN0LmtleXMoaSkubGVuZ3RoLG49T2JqZWN0LmtleXMoYS5wcm9wZXJ0aWVzKS5sZW5ndGg7aWYoIWFwaS5hc3NlcnQoczw9biwiY2Fubm90IHNldCBtb3JlIGRhdGEgcHJvcGVydGllcyB0aGFuIE5GVCBoYXMiKSlyZXR1cm4hMTtmb3IoY29uc3RbcyxuXW9mIE9iamVjdC5lbnRyaWVzKGkpKXtsZXQgcj0hMTtpZihhcGkuYXNzZXJ0KHMmJiJzdHJpbmciPT10eXBlb2YgcyYmYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTI1LCJpbnZhbGlkIGRhdGEgcHJvcGVydHkgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHMgaW4gYS5wcm9wZXJ0aWVzLCJkYXRhIHByb3BlcnR5IG11c3QgZXhpc3QiKSl7Y29uc3Qgbz1hLnByb3BlcnRpZXNbc107YXBpLmFzc2VydChudWxsIT1uJiYodHlwZW9mIG49PT1vLnR5cGV8fCJudW1iZXIiPT09by50eXBlJiYic3RyaW5nIj09dHlwZW9mIG4mJiFhcGkuQmlnTnVtYmVyKG4pLmlzTmFOKCkpLGBkYXRhIHByb3BlcnR5IHR5cGUgbWlzbWF0Y2g6IGV4cGVjdGVkICR7by50eXBlfSBidXQgZ290ICR7dHlwZW9mIG59IGZvciBwcm9wZXJ0eSAke3N9YCkmJmFwaS5hc3NlcnQoInN0cmluZyIhPXR5cGVvZiBufHxuLmxlbmd0aDw9MTAwLCJzdHJpbmcgcHJvcGVydHkgbWF4IGxlbmd0aCBpcyAxMDAgY2hhcmFjdGVycyIpJiZhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzLmluY2x1ZGVzKGUpfHwidXNlciI9PT10JiZvLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHMuaW5jbHVkZXMoZSksIm5vdCBhbGxvd2VkIHRvIHNldCBkYXRhIHByb3BlcnRpZXMiKSYmKHI9ITAsIm51bWJlciI9PT1vLnR5cGUmJiJzdHJpbmciPT10eXBlb2YgbiYmKGlbc109YXBpLkJpZ051bWJlcihuKS50b051bWJlcigpKSl9aWYoIXIpcmV0dXJuITF9cmV0dXJuITB9LGlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5PShlLHQsYSxpKT0+e3RyeXtmb3IobGV0IHM9MDtzPGkubGVuZ3RoO3MrPTEpe2xldCBuPSExO2NvbnN0e2lkOnIscHJvcGVydGllczpvfT1pW3NdO2lmKGFwaS5hc3NlcnQociYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZvJiYib2JqZWN0Ij09dHlwZW9mIG8sImludmFsaWQgZGF0YSBwcm9wZXJ0aWVzIikmJmlzVmFsaWREYXRhUHJvcGVydGllcyhlLHQsYSxvKSYmKG49ITApLCFuKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH0saXNWYWxpZE5mdElkQXJyYXk9ZT0+e3RyeXtsZXQgdD0wO2ZvcihsZXQgYT0wO2E8ZS5sZW5ndGg7YSs9MSl7bGV0IGk9ITE7Y29uc3R7c3ltYm9sOnMsaWRzOm59PWVbYV07aWYoYXBpLmFzc2VydChzJiYic3RyaW5nIj09dHlwZW9mIHMmJmFwaS52YWxpZGF0b3IuaXNBbHBoYShzKSYmYXBpLnZhbGlkYXRvci5pc1VwcGVyY2FzZShzKSYmcy5sZW5ndGg+MCYmcy5sZW5ndGg8PTEwJiZuJiYib2JqZWN0Ij09dHlwZW9mIG4mJkFycmF5LmlzQXJyYXkobiksImludmFsaWQgbmZ0IGxpc3QiKSYmKHQrPW4ubGVuZ3RoLGFwaS5hc3NlcnQodDw9NTAsImNhbm5vdCBvcGVyYXRlIG9uIG1vcmUgdGhhbiA1MCBORlQgaW5zdGFuY2VzIGF0IG9uY2UiKSkpe2ZvcihsZXQgZT0wO2U8bi5sZW5ndGg7ZSs9MSl7Y29uc3QgdD1uW2VdO2lmKCFhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmIWFwaS5CaWdOdW1iZXIodCkuaXNOYU4oKSYmYXBpLkJpZ051bWJlcih0KS5ndCgwKSwiaW52YWxpZCBuZnQgbGlzdCIpKXJldHVybiExfWk9ITB9aWYoIWkpcmV0dXJuITF9fWNhdGNoKGUpe3JldHVybiExfXJldHVybiEwfSxpc1ZhbGlkVG9rZW5CYXNrZXQ9YXN5bmMoZSx0LGEsaSxzKT0+e3RyeXtpZihPYmplY3Qua2V5cyhlKS5sZW5ndGg+MTApcmV0dXJuITE7Zm9yKGNvbnN0W24scl1vZiBPYmplY3QuZW50cmllcyhlKSl7bGV0IGU9ITE7aWYoInN0cmluZyI9PXR5cGVvZiBuJiZhcGkudmFsaWRhdG9yLmlzQWxwaGEobikmJmFwaS52YWxpZGF0b3IuaXNVcHBlcmNhc2UobikmJm4ubGVuZ3RoPjAmJm4ubGVuZ3RoPD0xMCl7Y29uc3Qgbz1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsInRva2VucyIse3N5bWJvbDpufSk7aWYobyYmciYmInN0cmluZyI9PXR5cGVvZiByJiYhYXBpLkJpZ051bWJlcihyKS5pc05hTigpJiZhcGkuQmlnTnVtYmVyKHIpLmd0KDApJiZjb3VudERlY2ltYWxzKHIpPD1vLnByZWNpc2lvbil7Y29uc3QgcD1uPT09aT9jYWxjdWxhdGVCYWxhbmNlKHIscyxvLnByZWNpc2lvbiwhMCk6cixjPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIix0LHthY2NvdW50OmEsc3ltYm9sOm59KTtjJiZhcGkuQmlnTnVtYmVyKGMuYmFsYW5jZSkuZ3RlKHApJiYoZT0hMCl9fWlmKCFlKXJldHVybiExfX1jYXRjaChlKXtyZXR1cm4hMX1yZXR1cm4hMH07YWN0aW9ucy51cGRhdGVVcmw9KGFzeW5jIGU9Pntjb25zdHt1cmw6dCxzeW1ib2w6YX09ZTtpZihhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmInN0cmluZyI9PXR5cGVvZiB0LCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0yNTUsImludmFsaWQgdXJsOiBtYXggbGVuZ3RoIG9mIDI1NSIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikpdHJ5e2NvbnN0IGE9SlNPTi5wYXJzZShlLm1ldGFkYXRhKTthcGkuYXNzZXJ0KGEmJmEudXJsLCJhbiBlcnJvciBvY2N1cmVkIHdoZW4gdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgdXJsIikmJihhLnVybD10LGUubWV0YWRhdGE9SlNPTi5zdHJpbmdpZnkoYSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVNZXRhZGF0YT0oYXN5bmMgZT0+e2NvbnN0e21ldGFkYXRhOnQsc3ltYm9sOmF9PWU7aWYoYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCwiaW52YWxpZCBwYXJhbXMiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXRyeXtjb25zdCBhPUpTT04uc3RyaW5naWZ5KHQpO2FwaS5hc3NlcnQoYS5sZW5ndGg8PTFlMywiaW52YWxpZCBtZXRhZGF0YTogbWF4IGxlbmd0aCBvZiAxMDAwIikmJihlLm1ldGFkYXRhPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfWNhdGNoKGUpe319fSksYWN0aW9ucy51cGRhdGVOYW1lPShhc3luYyBlPT57Y29uc3R7bmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtlJiZhcGkuYXNzZXJ0KGUuaXNzdWVyPT09YXBpLnNlbmRlciwibXVzdCBiZSB0aGUgaXNzdWVyIikmJihlLm5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy51cGRhdGVPcmdOYW1lPShhc3luYyBlPT57Y29uc3R7b3JnTmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgb3JnIG5hbWU6IGxldHRlcnMsIG51bWJlcnMsIHdoaXRlc3BhY2VzIG9ubHksIG1heCBsZW5ndGggb2YgNTAiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7ZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiYoZS5vcmdOYW1lPXQsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSkpfX0pLGFjdGlvbnMudXBkYXRlUHJvZHVjdE5hbWU9KGFzeW5jIGU9Pntjb25zdHtwcm9kdWN0TmFtZTp0LHN5bWJvbDphfT1lO2lmKGFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQsImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2UmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmKGUucHJvZHVjdE5hbWU9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fSksYWN0aW9ucy5hZGRBdXRob3JpemVkSXNzdWluZ0FjY291bnRzPShhc3luYyBlPT57Y29uc3R7YWNjb3VudHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IGU9aXNWYWxpZEFjY291bnRzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOmF9KTtpZihlKXtjb25zdCBhPVtdO2lmKHQuZm9yRWFjaCh0PT57Y29uc3QgaT10LnRyaW0oKS50b0xvd2VyQ2FzZSgpO2xldCBzPSExO2ZvcihsZXQgdD0wO3Q8ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHNbdF0pe3M9ITA7YnJlYWt9c3x8YS5wdXNoKGkpfSksYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KCFjb250YWluc0R1cGxpY2F0ZXMoYSksImNhbm5vdCBhZGQgdGhlIHNhbWUgYWNjb3VudCB0d2ljZSIpJiZhcGkuYXNzZXJ0KGUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGFjY291bnRzIikpe2NvbnN0IHQ9ZS5hdXRob3JpemVkSXNzdWluZ0FjY291bnRzLmNvbmNhdChhKTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPShhc3luYyBlPT57Y29uc3R7Y29udHJhY3RzOnQsc3ltYm9sOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGEmJiJzdHJpbmciPT10eXBlb2YgYSYmdCYmIm9iamVjdCI9PXR5cGVvZiB0JiZBcnJheS5pc0FycmF5KHQpLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KHQubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBjb250cmFjdHMiKSl7Y29uc3QgZT1pc1ZhbGlkQ29udHJhY3RzQXJyYXkodCk7aWYoYXBpLmFzc2VydChlLCJpbnZhbGlkIGNvbnRyYWN0IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSl7Y29uc3QgYT1bXTtpZih0LmZvckVhY2godD0+e2NvbnN0IGk9dC50cmltKCk7bGV0IHM9ITE7Zm9yKGxldCB0PTA7dDxlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmxlbmd0aDt0Kz0xKWlmKGk9PT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzW3RdKXtzPSEwO2JyZWFrfXN8fGEucHVzaChpKX0pLGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCghY29udGFpbnNEdXBsaWNhdGVzKGEpLCJjYW5ub3QgYWRkIHRoZSBzYW1lIGNvbnRyYWN0IHR3aWNlIikmJmFwaS5hc3NlcnQoZS5hdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0cy5sZW5ndGgrYS5sZW5ndGg8PTEwLCJjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gMTAgYXV0aG9yaXplZCBpc3N1aW5nIGNvbnRyYWN0cyIpKXtjb25zdCB0PWUuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHMuY29uY2F0KGEpO2UuYXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX19KSxhY3Rpb25zLnJlbW92ZUF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9KGFzeW5jIGU9Pntjb25zdHthY2NvdW50czp0LHN5bWJvbDphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfT1lO2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChhJiYic3RyaW5nIj09dHlwZW9mIGEmJnQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCByZW1vdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgaXNzdWluZyBhY2NvdW50cyIpKXtjb25zdCBlPWlzVmFsaWRBY2NvdW50c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBhY2NvdW50IGxpc3QiKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYoZSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtjb25zdCBhPWUuYXV0aG9yaXplZElzc3VpbmdBY2NvdW50cy5maWx0ZXIoZT0+e2ZvcihsZXQgYT0wO2E8dC5sZW5ndGg7YSs9MSl7aWYoZT09PXRbYV0udHJpbSgpLnRvTG93ZXJDYXNlKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKX19fX0pLGFjdGlvbnMucmVtb3ZlQXV0aG9yaXplZElzc3VpbmdDb250cmFjdHM9KGFzeW5jIGU9Pntjb25zdHtjb250cmFjdHM6dCxzeW1ib2w6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYSYmInN0cmluZyI9PXR5cGVvZiBhJiZ0JiYib2JqZWN0Ij09dHlwZW9mIHQmJkFycmF5LmlzQXJyYXkodCksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQodC5sZW5ndGg8PTEwLCJjYW5ub3QgcmVtb3ZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGlzc3VpbmcgY29udHJhY3RzIikpe2NvbnN0IGU9aXNWYWxpZENvbnRyYWN0c0FycmF5KHQpO2lmKGFwaS5hc3NlcnQoZSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6YX0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgYT1lLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmZpbHRlcihlPT57Zm9yKGxldCBhPTA7YTx0Lmxlbmd0aDthKz0xKXtpZihlPT09dFthXS50cmltKCkpcmV0dXJuITF9cmV0dXJuITB9KTtlLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnRyYW5zZmVyT3duZXJzaGlwPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsdG86YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aX09ZTtpZihhcGkuYXNzZXJ0KCEwPT09aSwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEsImludmFsaWQgcGFyYW1zIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSl7Y29uc3QgdD1hLnRyaW0oKS50b0xvd2VyQ2FzZSgpO2FwaS5hc3NlcnQoaXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aCh0KSwiaW52YWxpZCB0byIpJiYoZS5pc3N1ZXI9dCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSl9fX0pLGFjdGlvbnMuZW5hYmxlRGVsZWdhdGlvbj0oYXN5bmMgZT0+e2NvbnN0e3N5bWJvbDp0LHVuZGVsZWdhdGlvbkNvb2xkb3duOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWUscz1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse2VuYWJsZURlbGVnYXRpb25GZWU6bn09cyxyPWF3YWl0IGFwaS5kYi5maW5kT25lSW5UYWJsZSgidG9rZW5zIiwiYmFsYW5jZXMiLHthY2NvdW50OmFwaS5zZW5kZXIsc3ltYm9sOiJFTkcifSksbz0hIWFwaS5CaWdOdW1iZXIobikubHRlKDApfHxyJiZhcGkuQmlnTnVtYmVyKHIuYmFsYW5jZSkuZ3RlKG4pO2lmKGFwaS5hc3NlcnQobywieW91IG11c3QgaGF2ZSBlbm91Z2ggdG9rZW5zIHRvIGNvdmVyIGZlZXMiKSYmYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCwiaW52YWxpZCBzeW1ib2wiKSYmYXBpLmFzc2VydChhJiZOdW1iZXIuaXNJbnRlZ2VyKGEpJiZhPjAmJmE8PTE4MjUwLCJ1bmRlbGVnYXRpb25Db29sZG93biBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxODI1MCIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1lLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWUuZGVsZWdhdGlvbkVuYWJsZWR8fCExPT09ZS5kZWxlZ2F0aW9uRW5hYmxlZCwiZGVsZWdhdGlvbiBhbHJlYWR5IGVuYWJsZWQiKSl7aWYoYXBpLkJpZ051bWJlcihuKS5ndCgwKSl7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDoiRU5HIixxdWFudGl0eTpuLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppfSk7aWYoIWlzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGUsYXBpLnNlbmRlciwibnVsbCIsIkVORyIsbiwidHJhbnNmZXIiKSlyZXR1cm4hMX1yZXR1cm4gZS5kZWxlZ2F0aW9uRW5hYmxlZD0hMCxlLnVuZGVsZWdhdGlvbkNvb2xkb3duPWEsYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksITB9fXJldHVybiExfSksYWN0aW9ucy51cGRhdGVQcm9wZXJ0eURlZmluaXRpb249KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsbmV3TmFtZTppLHR5cGU6cyxpc1JlYWRPbmx5Om4saXNTaWduZWRXaXRoQWN0aXZlS2V5OnJ9PWU7aWYoYXBpLmFzc2VydCghMD09PXIsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmInN0cmluZyI9PXR5cGVvZiBhLCJpbnZhbGlkIHBhcmFtcyIpJiZhcGkuYXNzZXJ0KGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYSkmJmEubGVuZ3RoPjAmJmEubGVuZ3RoPD0yNSwiaW52YWxpZCBuYW1lOiBsZXR0ZXJzICYgbnVtYmVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDI1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8InN0cmluZyI9PXR5cGVvZiBpJiZhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGkpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9MjUsImludmFsaWQgbmV3IG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHwic3RyaW5nIj09dHlwZW9mIHMmJigibnVtYmVyIj09PXN8fCJzdHJpbmciPT09c3x8ImJvb2xlYW4iPT09cyksImludmFsaWQgdHlwZTogbXVzdCBiZSBudW1iZXIsIHN0cmluZywgb3IgYm9vbGVhbiIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PW58fCJib29sZWFuIj09dHlwZW9mIG4sImludmFsaWQgaXNSZWFkT25seTogbXVzdCBiZSB0cnVlIG9yIGZhbHNlIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoMD09PWUuc3VwcGx5LCJjYW5ub3QgY2hhbmdlIGRhdGEgcHJvcGVydHkgZGVmaW5pdGlvbjsgdG9rZW5zIGFscmVhZHkgaXNzdWVkIikmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZih2b2lkIDAhPT1pKXtpZih2b2lkIDAhPT1lLmdyb3VwQnkmJmUuZ3JvdXBCeS5sZW5ndGg+MCYmIWFwaS5hc3NlcnQoIWUuZ3JvdXBCeS5pbmNsdWRlcyhhKSwiY2Fubm90IGNoYW5nZSBkYXRhIHByb3BlcnR5IG5hbWU7IHByb3BlcnR5IGlzIHBhcnQgb2YgZ3JvdXBCeSIpKXJldHVybiExO2lmKCFhcGkuYXNzZXJ0KGkhPT1hLCJuZXcgbmFtZSBtdXN0IGJlIGRpZmZlcmVudCBmcm9tIG9sZCBuYW1lIil8fCFhcGkuYXNzZXJ0KCEoaSBpbiBlLnByb3BlcnRpZXMpLCJ0aGVyZSBpcyBhbHJlYWR5IGEgZGF0YSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuZXcgbmFtZSIpKXJldHVybiExfWxldCByPSExO2NvbnN0IG89ZS5wcm9wZXJ0aWVzW2FdLnR5cGUscD1lLnByb3BlcnRpZXNbYV0uaXNSZWFkT25seTtyZXR1cm4gdm9pZCAwIT09cyYmcyE9PW8mJihlLnByb3BlcnRpZXNbYV0udHlwZT1zLHI9ITApLHZvaWQgMCE9PW4mJm4hPT1wJiYoZS5wcm9wZXJ0aWVzW2FdLmlzUmVhZE9ubHk9bixyPSEwKSx2b2lkIDAhPT1pJiZpIT09YSYmKGUucHJvcGVydGllc1tpXT1lLnByb3BlcnRpZXNbYV0sZGVsZXRlIGUucHJvcGVydGllc1thXSxyPSEwKSxyJiYoYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSksYXBpLmVtaXQoInVwZGF0ZVByb3BlcnR5RGVmaW5pdGlvbiIse3N5bWJvbDp0LG9yaWdpbmFsTmFtZTphLG9yaWdpbmFsVHlwZTpvLG9yaWdpbmFsSXNSZWFkT25seTpwLG5ld05hbWU6aSxuZXdUeXBlOnMsbmV3SXNSZWFkT25seTpufSkpLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuYWRkUHJvcGVydHk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsdHlwZTppLGlzUmVhZE9ubHk6cyxhdXRob3JpemVkRWRpdGluZ0FjY291bnRzOm4sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6cixpc1NpZ25lZFdpdGhBY3RpdmVLZXk6b309ZSxwPWF3YWl0IGFwaS5kYi5maW5kT25lKCJwYXJhbXMiLHt9KSx7ZGF0YVByb3BlcnR5Q3JlYXRpb25GZWU6Y309cDtpZihhcGkuYXNzZXJ0KCEwPT09bywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1zfHwiYm9vbGVhbiI9PXR5cGVvZiBzKSYmKHZvaWQgMD09PW58fG4mJiJvYmplY3QiPT10eXBlb2YgbiYmQXJyYXkuaXNBcnJheShuKSkmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHImJkFycmF5LmlzQXJyYXkocikpJiZpJiYic3RyaW5nIj09dHlwZW9mIGksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTI1LCJpbnZhbGlkIG5hbWU6IGxldHRlcnMgJiBudW1iZXJzIG9ubHksIG1heCBsZW5ndGggb2YgMjUiKSYmYXBpLmFzc2VydCgibnVtYmVyIj09PWl8fCJzdHJpbmciPT09aXx8ImJvb2xlYW4iPT09aSwiaW52YWxpZCB0eXBlOiBtdXN0IGJlIG51bWJlciwgc3RyaW5nLCBvciBib29sZWFuIikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoIShhIGluIGUucHJvcGVydGllcyksImNhbm5vdCBhZGQgdGhlIHNhbWUgcHJvcGVydHkgdHdpY2UiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtpZihPYmplY3Qua2V5cyhlLnByb3BlcnRpZXMpLmxlbmd0aD49Myl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiRU5HIn0pLHQ9ISFhcGkuQmlnTnVtYmVyKGMpLmx0ZSgwKXx8ZSYmYXBpLkJpZ051bWJlcihlLmJhbGFuY2UpLmd0ZShjKTtpZighYXBpLmFzc2VydCh0LCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGNyZWF0aW9uIGZlZXMiKSlyZXR1cm4hMTtpZihhcGkuQmlnTnVtYmVyKGMpLmd0KDApKXtjb25zdCBlPWF3YWl0IGFwaS5leGVjdXRlU21hcnRDb250cmFjdCgidG9rZW5zIiwidHJhbnNmZXIiLHt0bzoibnVsbCIsc3ltYm9sOiJFTkciLHF1YW50aXR5OmMsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KTtpZighaXNUb2tlblRyYW5zZmVyVmVyaWZpZWQoZSxhcGkuc2VuZGVyLCJudWxsIiwiRU5HIixjLCJ0cmFuc2ZlciIpKXJldHVybiExfX1jb25zdCBwPXt0eXBlOmksaXNSZWFkT25seTp2b2lkIDAhPT1zJiZzLGF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM6dm9pZCAwPT09bj9bYXBpLnNlbmRlcl06W10sYXV0aG9yaXplZEVkaXRpbmdDb250cmFjdHM6W119O3JldHVybiBlLnByb3BlcnRpZXNbYV09cCxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwobnx8cikmJmF3YWl0IGFjdGlvbnMuc2V0UHJvcGVydHlQZXJtaXNzaW9ucyh7c3ltYm9sOnQsbmFtZTphLGFjY291bnRzOm4sY29udHJhY3RzOnIsaXNTaWduZWRXaXRoQWN0aXZlS2V5Om99KSwhMH19cmV0dXJuITF9KSxhY3Rpb25zLnNldFByb3BlcnR5UGVybWlzc2lvbnM9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxuYW1lOmEsYWNjb3VudHM6aSxjb250cmFjdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bn09ZTtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJih2b2lkIDA9PT1pfHxpJiYib2JqZWN0Ij09dHlwZW9mIGkmJkFycmF5LmlzQXJyYXkoaSkpJiYodm9pZCAwPT09c3x8cyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChhcGkudmFsaWRhdG9yLmlzQWxwaGFudW1lcmljKGEpJiZhLmxlbmd0aD4wJiZhLmxlbmd0aDw9MjUsImludmFsaWQgbmFtZTogbGV0dGVycyAmIG51bWJlcnMgb25seSwgbWF4IGxlbmd0aCBvZiAyNSIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGkubGVuZ3RoPD0xMCwiY2Fubm90IGhhdmUgbW9yZSB0aGFuIDEwIGF1dGhvcml6ZWQgYWNjb3VudHMiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1zfHxzLmxlbmd0aDw9MTAsImNhbm5vdCBoYXZlIG1vcmUgdGhhbiAxMCBhdXRob3JpemVkIGNvbnRyYWN0cyIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWl8fGlzVmFsaWRBY2NvdW50c0FycmF5KGkpLCJpbnZhbGlkIGFjY291bnQgbGlzdCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PXN8fGlzVmFsaWRDb250cmFjdHNBcnJheShzKSwiaW52YWxpZCBjb250cmFjdCBsaXN0Iikpe2NvbnN0IGU9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pO2lmKGUmJmFwaS5hc3NlcnQoYSBpbiBlLnByb3BlcnRpZXMsInByb3BlcnR5IG11c3QgZXhpc3QiKSYmYXBpLmFzc2VydChlLmlzc3Vlcj09PWFwaS5zZW5kZXIsIm11c3QgYmUgdGhlIGlzc3VlciIpKXtsZXQgdD1bXSxuPVtdO2lmKGkmJih0PWkubWFwKGU9PmUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSxzJiYobj1zLm1hcChlPT5lLnRyaW0oKSkpLGFwaS5hc3NlcnQodm9pZCAwPT09aXx8IWNvbnRhaW5zRHVwbGljYXRlcyh0KSwiY2Fubm90IGFkZCB0aGUgc2FtZSBhY2NvdW50IHR3aWNlIikmJmFwaS5hc3NlcnQodm9pZCAwPT09c3x8IWNvbnRhaW5zRHVwbGljYXRlcyhuKSwiY2Fubm90IGFkZCB0aGUgc2FtZSBjb250cmFjdCB0d2ljZSIpKXtsZXQgcj0hMTtpJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQWNjb3VudHM9dCxyPSEwKSxzJiYoZS5wcm9wZXJ0aWVzW2FdLmF1dGhvcml6ZWRFZGl0aW5nQ29udHJhY3RzPW4scj0hMCksciYmYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsZSl9fX19KSxhY3Rpb25zLnNldEdyb3VwQnk9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxwcm9wZXJ0aWVzOmEsaXNTaWduZWRXaXRoQWN0aXZlS2V5Oml9PWU7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihlKXtjb25zdCB0PU9iamVjdC5rZXlzKGUucHJvcGVydGllcykubGVuZ3RoO2lmKGFwaS5hc3NlcnQoZS5pc3N1ZXI9PT1hcGkuc2VuZGVyLCJtdXN0IGJlIHRoZSBpc3N1ZXIiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1lLmdyb3VwQnl8fDA9PT1lLmdyb3VwQnkubGVuZ3RoLCJsaXN0IGlzIGFscmVhZHkgc2V0IikmJmFwaS5hc3NlcnQoYS5sZW5ndGg8PXQsImNhbm5vdCBzZXQgbW9yZSBkYXRhIHByb3BlcnRpZXMgdGhhbiBORlQgaGFzIikmJmFwaS5hc3NlcnQoIWNvbnRhaW5zRHVwbGljYXRlcyhhKSwibGlzdCBjYW5ub3QgY29udGFpbiBkdXBsaWNhdGVzIikpe2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3QgaT1hW3RdO2lmKCFhcGkuYXNzZXJ0KGkmJiJzdHJpbmciPT10eXBlb2YgaSYmaSBpbiBlLnByb3BlcnRpZXMsImRhdGEgcHJvcGVydHkgbXVzdCBleGlzdCIpKXJldHVybiExfXJldHVybiBlLmdyb3VwQnk9YSxhd2FpdCBhcGkuZGIudXBkYXRlKCJuZnRzIixlKSwhMH19fXJldHVybiExfSksYWN0aW9ucy5zZXRQcm9wZXJ0aWVzPShhc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsZnJvbVR5cGU6YSxuZnRzOmksY2FsbGluZ0NvbnRyYWN0SW5mbzpzfT1lLG49dm9pZCAwPT09YT8idXNlciI6YTtpZihhcGkuYXNzZXJ0KGkmJiJvYmplY3QiPT10eXBlb2YgaSYmQXJyYXkuaXNBcnJheShpKSYmbiYmInN0cmluZyI9PXR5cGVvZiBuJiZbInVzZXIiLCJjb250cmFjdCJdLmluY2x1ZGVzKG4pJiZ0JiYic3RyaW5nIj09dHlwZW9mIHQmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydChpLmxlbmd0aDw9NTAsImNhbm5vdCBzZXQgcHJvcGVydGllcyBvbiBtb3JlIHRoYW4gNTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpe2NvbnN0IGU9InVzZXIiPT09bj9hcGkuc2VuZGVyOnMubmFtZSxhPWF3YWl0IGFwaS5kYi5maW5kT25lKCJuZnRzIix7c3ltYm9sOnR9KTtpZihhcGkuYXNzZXJ0KG51bGwhPT1hLCJzeW1ib2wgZG9lcyBub3QgZXhpc3QiKSl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllc0FycmF5KGUsbixhLGkpKXJldHVybiExO2NvbnN0IHM9dCsiaW5zdGFuY2VzIjtmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrPTEpe2NvbnN0e2lkOnQscHJvcGVydGllczpufT1pW2VdO2lmKDA9PT1PYmplY3Qua2V5cyhuKS5sZW5ndGgpY29udGludWU7Y29uc3Qgcj1hd2FpdCBhcGkuZGIuZmluZE9uZShzLHtfaWQ6YXBpLkJpZ051bWJlcih0KS50b051bWJlcigpfSk7aWYoYXBpLmFzc2VydChudWxsIT09ciwibmZ0IGluc3RhbmNlIGRvZXMgbm90IGV4aXN0Iikpe2xldCBlPSExO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMobikpe2EucHJvcGVydGllc1t0XS5pc1JlYWRPbmx5P2FwaS5hc3NlcnQoISh0IGluIHIucHJvcGVydGllcyksImNhbm5vdCBlZGl0IHJlYWQtb25seSBwcm9wZXJ0aWVzIikmJihyLnByb3BlcnRpZXNbdF09aSxlPSEwKTooci5wcm9wZXJ0aWVzW3RdPWksZT0hMCl9ZSYmYXdhaXQgYXBpLmRiLnVwZGF0ZShzLHIpfX1yZXR1cm4hMH19cmV0dXJuITF9KSxhY3Rpb25zLmJ1cm49KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LG5mdHM6YSxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6aSxjYWxsaW5nQ29udHJhY3RJbmZvOnN9PWUsbj12b2lkIDA9PT10PyJ1c2VyIjp0O2lmKGFwaS5hc3NlcnQoITA9PT1pLCJ5b3UgbXVzdCB1c2UgYSBjdXN0b21fanNvbiBzaWduZWQgd2l0aCB5b3VyIGFjdGl2ZSBrZXkiKSYmYXBpLmFzc2VydChuJiYic3RyaW5nIj09dHlwZW9mIG4mJlsidXNlciIsImNvbnRyYWN0Il0uaW5jbHVkZXMobikmJihzfHx2b2lkIDA9PT1zJiYidXNlciI9PT1uKSYmYSYmIm9iamVjdCI9PXR5cGVvZiBhJiZBcnJheS5pc0FycmF5KGEpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShhKSl7Y29uc3QgZT0idXNlciI9PT1uP2FwaS5zZW5kZXI6cy5uYW1lO2ZvcihsZXQgdD0wO3Q8YS5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmksaWRzOnN9PWFbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDppfSk7aWYocil7Y29uc3QgdD1pKyJpbnN0YW5jZXMiO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSs9MSl7Y29uc3Qgbz1zW2FdLHA9YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIobykudG9OdW1iZXIoKX0pO2lmKHAmJnAuYWNjb3VudD09PWUmJigidSI9PT1wLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PXAub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZ2b2lkIDA9PT1wLmRlbGVnYXRlZFRvKXtjb25zdCBhPXt9O2xldCBzPSEwO2Zvcihjb25zdFt0LGldb2YgT2JqZWN0LmVudHJpZXMocC5sb2NrZWRUb2tlbnMpKXtjb25zdCByPWF3YWl0IGFwaS50cmFuc2ZlclRva2VucyhlLHQsaSxuKTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChyLCJuZnQiLGUsdCxpLCJ0cmFuc2ZlckZyb21Db250cmFjdCIpfHwoYVt0XT1pLHM9ITEpfWFwaS5hc3NlcnQocyxgdW5hYmxlIHRvIHJlbGVhc2UgbG9ja2VkIHRva2VuczogJHtpfSwgaWQgJHtvfWApO2NvbnN0IGM9cC5vd25lZEJ5LGQ9cC5sb2NrZWRUb2tlbnM7cC5sb2NrZWRUb2tlbnM9YSxzJiYocC5wcmV2aW91c0FjY291bnQ9cC5hY2NvdW50LHAucHJldmlvdXNPd25lZEJ5PXAub3duZWRCeSxwLmFjY291bnQ9Im51bGwiLHAub3duZWRCeT0idSIsci5jaXJjdWxhdGluZ1N1cHBseS09MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LHApLHMmJmFwaS5lbWl0KCJidXJuIix7YWNjb3VudDplLG93bmVkQnk6Yyx1bmxvY2tlZFRva2VuczpkLHN5bWJvbDppLGlkOm99KX19YXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIscil9fX19KSxhY3Rpb25zLnRyYW5zZmVyPShhc3luYyBlPT57Y29uc3R7ZnJvbVR5cGU6dCx0bzphLHRvVHlwZTppLG5mdHM6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6bixjYWxsaW5nQ29udHJhY3RJbmZvOnJ9PWUsbz1bInVzZXIiLCJjb250cmFjdCJdLHA9dm9pZCAwPT09aT8idXNlciI6aSxjPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PW4sInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KGMmJiJzdHJpbmciPT10eXBlb2YgYyYmby5pbmNsdWRlcyhjKSYmYSYmInN0cmluZyI9PXR5cGVvZiBhJiZwJiYic3RyaW5nIj09dHlwZW9mIHAmJm8uaW5jbHVkZXMocCkmJihyfHx2b2lkIDA9PT1yJiYidXNlciI9PT1jKSYmcyYmIm9iamVjdCI9PXR5cGVvZiBzJiZBcnJheS5pc0FycmF5KHMpLCJpbnZhbGlkIHBhcmFtcyIpJiZpc1ZhbGlkTmZ0SWRBcnJheShzKSl7Y29uc3QgZT0idXNlciI9PT1wP2EudHJpbSgpLnRvTG93ZXJDYXNlKCk6YS50cmltKCksdD0idXNlciI9PT1wP2lzVmFsaWRTdGVlbUFjY291bnRMZW5ndGgoZSk6aXNWYWxpZENvbnRyYWN0TGVuZ3RoKGUpLGk9InVzZXIiPT09Yz9hcGkuc2VuZGVyOnIubmFtZTtpZihhcGkuYXNzZXJ0KHQsImludmFsaWQgdG8iKSYmYXBpLmFzc2VydCghKHA9PT1jJiZlPT09aSksImNhbm5vdCB0cmFuc2ZlciB0byBzZWxmIikmJmFwaS5hc3NlcnQoISgidXNlciI9PT1wJiYibnVsbCI9PT1lKSwiY2Fubm90IHRyYW5zZmVyIHRvIG51bGw7IHVzZSBidXJuIGFjdGlvbiBpbnN0ZWFkIikpZm9yKGxldCB0PTA7dDxzLmxlbmd0aDt0Kz0xKXtjb25zdHtzeW1ib2w6YSxpZHM6bn09c1t0XTtpZihhd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSkpe2NvbnN0IHQ9YSsiaW5zdGFuY2VzIjtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoO3MrPTEpe2NvbnN0IHI9bltzXSxvPWF3YWl0IGFwaS5kYi5maW5kT25lKHQse19pZDphcGkuQmlnTnVtYmVyKHIpLnRvTnVtYmVyKCl9KTtpZihvJiZvLmFjY291bnQ9PT1pJiYoInUiPT09by5vd25lZEJ5JiYidXNlciI9PT1jfHwiYyI9PT1vLm93bmVkQnkmJiJjb250cmFjdCI9PT1jKSYmdm9pZCAwPT09by5kZWxlZ2F0ZWRUbyl7Y29uc3Qgcz1vLm93bmVkQnksbj0idXNlciI9PT1wPyJ1IjoiYyI7by5wcmV2aW91c0FjY291bnQ9by5hY2NvdW50LG8ucHJldmlvdXNPd25lZEJ5PW8ub3duZWRCeSxvLmFjY291bnQ9ZSxvLm93bmVkQnk9bixhd2FpdCBhcGkuZGIudXBkYXRlKHQsbyksYXBpLmVtaXQoInRyYW5zZmVyIix7ZnJvbTppLGZyb21UeXBlOnMsdG86ZSx0b1R5cGU6bixzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMuZGVsZWdhdGU9KGFzeW5jIGU9Pntjb25zdHtmcm9tVHlwZTp0LHRvOmEsdG9UeXBlOmksbmZ0czpzLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTpuLGNhbGxpbmdDb250cmFjdEluZm86cn09ZSxvPVsidXNlciIsImNvbnRyYWN0Il0scD12b2lkIDA9PT1pPyJ1c2VyIjppLGM9dm9pZCAwPT09dD8idXNlciI6dDtpZihhcGkuYXNzZXJ0KCEwPT09biwieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQoYyYmInN0cmluZyI9PXR5cGVvZiBjJiZvLmluY2x1ZGVzKGMpJiZhJiYic3RyaW5nIj09dHlwZW9mIGEmJnAmJiJzdHJpbmciPT10eXBlb2YgcCYmby5pbmNsdWRlcyhwKSYmKHJ8fHZvaWQgMD09PXImJiJ1c2VyIj09PWMpJiZzJiYib2JqZWN0Ij09dHlwZW9mIHMmJkFycmF5LmlzQXJyYXkocyksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KHMpKXtjb25zdCBlPSJ1c2VyIj09PXA/YS50cmltKCkudG9Mb3dlckNhc2UoKTphLnRyaW0oKSx0PSJ1c2VyIj09PXA/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSksaT0idXNlciI9PT1jP2FwaS5zZW5kZXI6ci5uYW1lO2lmKGFwaS5hc3NlcnQodCwiaW52YWxpZCB0byIpJiZhcGkuYXNzZXJ0KCEocD09PWMmJmU9PT1pKSwiY2Fubm90IGRlbGVnYXRlIHRvIHNlbGYiKSYmYXBpLmFzc2VydCghKCJ1c2VyIj09PXAmJiJudWxsIj09PWUpLCJjYW5ub3QgZGVsZWdhdGUgdG8gbnVsbCIpKWZvcihsZXQgdD0wO3Q8cy5sZW5ndGg7dCs9MSl7Y29uc3R7c3ltYm9sOmEsaWRzOm59PXNbdF0scj1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDphfSk7aWYociYmYXBpLmFzc2VydCghMD09PXIuZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7YX1gKSl7Y29uc3QgdD1hKyJpbnN0YW5jZXMiO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cys9MSl7Y29uc3Qgcj1uW3NdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUodCx7X2lkOmFwaS5CaWdOdW1iZXIocikudG9OdW1iZXIoKX0pO2lmKG8mJm8uYWNjb3VudD09PWkmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PWN8fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PWMpJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvKXtjb25zdCBzPSJ1c2VyIj09PXA/InUiOiJjIixuPXthY2NvdW50OmUsb3duZWRCeTpzfTtvLmRlbGVnYXRlZFRvPW4sYXdhaXQgYXBpLmRiLnVwZGF0ZSh0LG8pLGFwaS5lbWl0KCJkZWxlZ2F0ZSIse2Zyb206aSxmcm9tVHlwZTpvLm93bmVkQnksdG86ZSx0b1R5cGU6cyxzeW1ib2w6YSxpZDpyfSl9fX19fX0pLGFjdGlvbnMudW5kZWxlZ2F0ZT0oYXN5bmMgZT0+e2NvbnN0e2Zyb21UeXBlOnQsbmZ0czphLGlzU2lnbmVkV2l0aEFjdGl2ZUtleTppLGNhbGxpbmdDb250cmFjdEluZm86c309ZSxuPXZvaWQgMD09PXQ/InVzZXIiOnQ7aWYoYXBpLmFzc2VydCghMD09PWksInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KG4mJiJzdHJpbmciPT10eXBlb2YgbiYmWyJ1c2VyIiwiY29udHJhY3QiXS5pbmNsdWRlcyhuKSYmKHN8fHZvaWQgMD09PXMmJiJ1c2VyIj09PW4pJiZhJiYib2JqZWN0Ij09dHlwZW9mIGEmJkFycmF5LmlzQXJyYXkoYSksImludmFsaWQgcGFyYW1zIikmJmlzVmFsaWROZnRJZEFycmF5KGEpKXtjb25zdCBlPSJ1c2VyIj09PW4/YXBpLnNlbmRlcjpzLm5hbWUsdD1uZXcgRGF0ZShgJHthcGkuc3RlZW1CbG9ja1RpbWVzdGFtcH0uMDAwWmApO2ZvcihsZXQgaT0wO2k8YS5sZW5ndGg7aSs9MSl7Y29uc3R7c3ltYm9sOnMsaWRzOnJ9PWFbaV0sbz1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYobyYmYXBpLmFzc2VydCghMD09PW8uZGVsZWdhdGlvbkVuYWJsZWQsYGRlbGVnYXRpb24gbm90IGVuYWJsZWQgZm9yICR7c31gKSl7Y29uc3QgYT0yNCpvLnVuZGVsZWdhdGlvbkNvb2xkb3duKjM2MDAqMWUzLGk9dC5nZXRUaW1lKCkrYSxwPXMrImluc3RhbmNlcyIsYz17c3ltYm9sOnMsaWRzOltdLGNvbXBsZXRlVGltZXN0YW1wOml9O2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCs9MSl7Y29uc3QgYT1yW3RdLG89YXdhaXQgYXBpLmRiLmZpbmRPbmUocCx7X2lkOmFwaS5CaWdOdW1iZXIoYSkudG9OdW1iZXIoKX0pO28mJm8uYWNjb3VudD09PWUmJigidSI9PT1vLm93bmVkQnkmJiJ1c2VyIj09PW58fCJjIj09PW8ub3duZWRCeSYmImNvbnRyYWN0Ij09PW4pJiZvLmRlbGVnYXRlZFRvJiZ2b2lkIDA9PT1vLmRlbGVnYXRlZFRvLnVuZGVsZWdhdGVBdCYmKG8uZGVsZWdhdGVkVG8udW5kZWxlZ2F0ZUF0PWksYy5pZHMucHVzaChvLl9pZCksYXdhaXQgYXBpLmRiLnVwZGF0ZShwLG8pLGFwaS5lbWl0KCJ1bmRlbGVnYXRlU3RhcnQiLHtmcm9tOm8uZGVsZWdhdGVkVG8uYWNjb3VudCxmcm9tVHlwZTpvLmRlbGVnYXRlZFRvLm93bmVkQnksc3ltYm9sOnMsaWQ6YX0pKX1jLmlkcy5sZW5ndGg+MCYmYXdhaXQgYXBpLmRiLmluc2VydCgicGVuZGluZ1VuZGVsZWdhdGlvbnMiLGMpfX19fSk7Y29uc3QgcHJvY2Vzc1VuZGVsZWdhdGlvbj1hc3luYyBlPT57Y29uc3R7c3ltYm9sOnQsaWRzOmF9PWUsaT10KyJpbnN0YW5jZXMiLHM9YXdhaXQgYXBpLmRiLmZpbmQoaSx7X2lkOnskaW46YX19LDUwLDAsW3tpbmRleDoiX2lkIixkZXNjZW5kaW5nOiExfV0pO2ZvcihsZXQgZT0wO2U8cy5sZW5ndGg7ZSs9MSlkZWxldGUgc1tlXS5kZWxlZ2F0ZWRUbyxhd2FpdCBhcGkuZGIudXBkYXRlKGksc1tlXSx7ZGVsZWdhdGVkVG86IiJ9KTthd2FpdCBhcGkuZGIucmVtb3ZlKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIsZSksYXBpLmVtaXQoInVuZGVsZWdhdGVEb25lIix7c3ltYm9sOnQsaWRzOmF9KX07YWN0aW9ucy5jaGVja1BlbmRpbmdVbmRlbGVnYXRpb25zPShhc3luYygpPT57aWYoYXBpLmFzc2VydCgibnVsbCI9PT1hcGkuc2VuZGVyLCJub3QgYXV0aG9yaXplZCIpKXtjb25zdCBlPW5ldyBEYXRlKGAke2FwaS5zdGVlbUJsb2NrVGltZXN0YW1wfS4wMDBaYCkuZ2V0VGltZSgpO2xldCB0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSksYT10Lmxlbmd0aDtmb3IoO2E+MDspe2ZvcihsZXQgZT0wO2U8YTtlKz0xKXtjb25zdCBhPXRbZV07YXdhaXQgcHJvY2Vzc1VuZGVsZWdhdGlvbihhKX1hPSh0PWF3YWl0IGFwaS5kYi5maW5kKCJwZW5kaW5nVW5kZWxlZ2F0aW9ucyIse2NvbXBsZXRlVGltZXN0YW1wOnskbHRlOmV9fSkpLmxlbmd0aH19fSksYWN0aW9ucy5jcmVhdGU9KGFzeW5jIGU9Pntjb25zdHtuYW1lOnQsb3JnTmFtZTphLHByb2R1Y3ROYW1lOmksc3ltYm9sOnMsdXJsOm4sbWF4U3VwcGx5OnIsYXV0aG9yaXplZElzc3VpbmdBY2NvdW50czpvLGF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzOnAsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9PWUsZD1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdENyZWF0aW9uRmVlOmx9PWQsdT1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsImJhbGFuY2VzIix7YWNjb3VudDphcGkuc2VuZGVyLHN5bWJvbDoiRU5HIn0pLHk9ISFhcGkuQmlnTnVtYmVyKGwpLmx0ZSgwKXx8dSYmYXBpLkJpZ051bWJlcih1LmJhbGFuY2UpLmd0ZShsKTtpZihhcGkuYXNzZXJ0KHksInlvdSBtdXN0IGhhdmUgZW5vdWdoIHRva2VucyB0byBjb3ZlciB0aGUgY3JlYXRpb24gZmVlcyIpJiZhcGkuYXNzZXJ0KCEwPT09YywieW91IG11c3QgdXNlIGEgY3VzdG9tX2pzb24gc2lnbmVkIHdpdGggeW91ciBhY3RpdmUga2V5IikmJmFwaS5hc3NlcnQodCYmInN0cmluZyI9PXR5cGVvZiB0JiZzJiYic3RyaW5nIj09dHlwZW9mIHMmJih2b2lkIDA9PT1ufHxuJiYic3RyaW5nIj09dHlwZW9mIG4pJiYodm9pZCAwPT09YXx8YSYmInN0cmluZyI9PXR5cGVvZiBhKSYmKHZvaWQgMD09PWl8fGkmJiJzdHJpbmciPT10eXBlb2YgaSkmJih2b2lkIDA9PT1vfHxvJiYib2JqZWN0Ij09dHlwZW9mIG8mJkFycmF5LmlzQXJyYXkobykpJiYodm9pZCAwPT09cHx8cCYmIm9iamVjdCI9PXR5cGVvZiBwJiZBcnJheS5pc0FycmF5KHApKSYmKHZvaWQgMD09PXJ8fHImJiJzdHJpbmciPT10eXBlb2YgciYmIWFwaS5CaWdOdW1iZXIocikuaXNOYU4oKSksImludmFsaWQgcGFyYW1zIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhKHMpJiZhcGkudmFsaWRhdG9yLmlzVXBwZXJjYXNlKHMpJiZzLmxlbmd0aD4wJiZzLmxlbmd0aDw9MTAsImludmFsaWQgc3ltYm9sOiB1cHBlcmNhc2UgbGV0dGVycyBvbmx5LCBtYXggbGVuZ3RoIG9mIDEwIikmJmFwaS5hc3NlcnQoYXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdCh0LCIgIikpJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9NTAsImludmFsaWQgbmFtZTogbGV0dGVycywgbnVtYmVycywgd2hpdGVzcGFjZXMgb25seSwgbWF4IGxlbmd0aCBvZiA1MCIpJiZhcGkuYXNzZXJ0KHZvaWQgMD09PWF8fGFwaS52YWxpZGF0b3IuaXNBbHBoYW51bWVyaWMoYXBpLnZhbGlkYXRvci5ibGFja2xpc3QoYSwiICIpKSYmYS5sZW5ndGg+MCYmYS5sZW5ndGg8PTUwLCJpbnZhbGlkIG9yZyBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09aXx8YXBpLnZhbGlkYXRvci5pc0FscGhhbnVtZXJpYyhhcGkudmFsaWRhdG9yLmJsYWNrbGlzdChpLCIgIikpJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9NTAsImludmFsaWQgcHJvZHVjdCBuYW1lOiBsZXR0ZXJzLCBudW1iZXJzLCB3aGl0ZXNwYWNlcyBvbmx5LCBtYXggbGVuZ3RoIG9mIDUwIikmJmFwaS5hc3NlcnQodm9pZCAwPT09bnx8bi5sZW5ndGg8PTI1NSwiaW52YWxpZCB1cmw6IG1heCBsZW5ndGggb2YgMjU1IikmJmFwaS5hc3NlcnQodm9pZCAwPT09cnx8YXBpLkJpZ051bWJlcihyKS5ndCgwKSwibWF4U3VwcGx5IG11c3QgYmUgcG9zaXRpdmUiKSYmYXBpLmFzc2VydCh2b2lkIDA9PT1yfHxhcGkuQmlnTnVtYmVyKHIpLmx0ZShOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksYG1heFN1cHBseSBtdXN0IGJlIGxvd2VyIHRoYW4gJHtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn1gKSl7Y29uc3QgZT1hd2FpdCBhcGkuZGIuZmluZE9uZSgibmZ0cyIse3N5bWJvbDpzfSk7aWYoYXBpLmFzc2VydChudWxsPT09ZSwic3ltYm9sIGFscmVhZHkgZXhpc3RzIikpe2lmKGFwaS5CaWdOdW1iZXIobCkuZ3QoMCkpe2NvbnN0IGU9YXdhaXQgYXBpLmV4ZWN1dGVTbWFydENvbnRyYWN0KCJ0b2tlbnMiLCJ0cmFuc2ZlciIse3RvOiJudWxsIixzeW1ib2w6IkVORyIscXVhbnRpdHk6bCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pO2lmKCFpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLGFwaS5zZW5kZXIsIm51bGwiLCJFTkciLGwsInRyYW5zZmVyIikpcmV0dXJuITF9Y29uc3QgZT12b2lkIDA9PT1yPzA6YXBpLkJpZ051bWJlcihyKS5pbnRlZ2VyVmFsdWUoYXBpLkJpZ051bWJlci5ST1VORF9ET1dOKS50b051bWJlcigpLGQ9dm9pZCAwPT09YT8iIjphLHU9dm9pZCAwPT09aT8iIjppO2xldCB5PXt1cmw6dm9pZCAwPT09bj8iIjpufTt5PUpTT04uc3RyaW5naWZ5KHkpO2NvbnN0IGY9dm9pZCAwPT09bz9bYXBpLnNlbmRlcl06W10sbT17aXNzdWVyOmFwaS5zZW5kZXIsc3ltYm9sOnMsbmFtZTp0LG9yZ05hbWU6ZCxwcm9kdWN0TmFtZTp1LG1ldGFkYXRhOnksbWF4U3VwcGx5OmUsc3VwcGx5OjAsY2lyY3VsYXRpbmdTdXBwbHk6MCxkZWxlZ2F0aW9uRW5hYmxlZDohMSx1bmRlbGVnYXRpb25Db29sZG93bjowLGF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHM6ZixhdXRob3JpemVkSXNzdWluZ0NvbnRyYWN0czpbXSxwcm9wZXJ0aWVzOnt9LGdyb3VwQnk6W119LGc9cysiaW5zdGFuY2VzIjtyZXR1cm4hMT09PWF3YWl0IGFwaS5kYi50YWJsZUV4aXN0cyhnKSYmYXdhaXQgYXBpLmRiLmNyZWF0ZVRhYmxlKGcsWyJhY2NvdW50Iiwib3duZWRCeSJdKSxhd2FpdCBhcGkuZGIuaW5zZXJ0KCJuZnRzIixtKSx2b2lkIDAhPT1vJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMoe2FjY291bnRzOm8sc3ltYm9sOnMsaXNTaWduZWRXaXRoQWN0aXZlS2V5OmN9KSx2b2lkIDAhPT1wJiZhd2FpdCBhY3Rpb25zLmFkZEF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzKHtjb250cmFjdHM6cCxzeW1ib2w6cyxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6Y30pLCEwfX1yZXR1cm4hMX0pLGFjdGlvbnMuaXNzdWU9KGFzeW5jIGU9Pntjb25zdHtzeW1ib2w6dCxmcm9tVHlwZTphLHRvOmksdG9UeXBlOnMsZmVlU3ltYm9sOm4sbG9ja1Rva2VuczpyLHByb3BlcnRpZXM6byxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6cCxjYWxsaW5nQ29udHJhY3RJbmZvOmN9PWUsZD1bInVzZXIiLCJjb250cmFjdCJdLGw9dm9pZCAwPT09cz8idXNlciI6cyx1PXZvaWQgMD09PWE/InVzZXIiOmEseT1hd2FpdCBhcGkuZGIuZmluZE9uZSgicGFyYW1zIix7fSkse25mdElzc3VhbmNlRmVlOmZ9PXk7aWYoYXBpLmFzc2VydCghMD09PXAsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJzdHJpbmciPT10eXBlb2YgdCYmdSYmInN0cmluZyI9PXR5cGVvZiB1JiZkLmluY2x1ZGVzKHUpJiYoY3x8dm9pZCAwPT09YyYmInVzZXIiPT09dSkmJmkmJiJzdHJpbmciPT10eXBlb2YgaSYmbCYmInN0cmluZyI9PXR5cGVvZiBsJiZkLmluY2x1ZGVzKGwpJiZuJiYic3RyaW5nIj09dHlwZW9mIG4mJm4gaW4gZiYmKHZvaWQgMD09PW98fG8mJiJvYmplY3QiPT10eXBlb2YgbykmJih2b2lkIDA9PT1yfHxyJiYib2JqZWN0Ij09dHlwZW9mIHIpLCJpbnZhbGlkIHBhcmFtcyIpKXtjb25zdCBlPSJ1c2VyIj09PWw/aS50cmltKCkudG9Mb3dlckNhc2UoKTppLnRyaW0oKSxhPSJ1c2VyIj09PWw/aXNWYWxpZFN0ZWVtQWNjb3VudExlbmd0aChlKTppc1ZhbGlkQ29udHJhY3RMZW5ndGgoZSkscz0idXNlciI9PT11P2FwaS5zZW5kZXI6Yy5uYW1lLGQ9InVzZXIiPT09dT8iYmFsYW5jZXMiOiJjb250cmFjdHNCYWxhbmNlcyI7aWYoYXBpLmFzc2VydChhLCJpbnZhbGlkIHRvIikpe2NvbnN0IGE9YXdhaXQgYXBpLmRiLmZpbmRPbmUoIm5mdHMiLHtzeW1ib2w6dH0pLGk9YXdhaXQgYXBpLmRiLmZpbmRPbmVJblRhYmxlKCJ0b2tlbnMiLCJ0b2tlbnMiLHtzeW1ib2w6bn0pO2lmKGFwaS5hc3NlcnQobnVsbCE9PWEsInN5bWJvbCBkb2VzIG5vdCBleGlzdCIpJiZhcGkuYXNzZXJ0KG51bGwhPT1pLCJmZWUgc3ltYm9sIGRvZXMgbm90IGV4aXN0Iikpe2NvbnN0IGM9dCsiaW5zdGFuY2VzIjtpZihhcGkuYXNzZXJ0KCJjb250cmFjdCI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQ29udHJhY3RzLmluY2x1ZGVzKHMpfHwidXNlciI9PT11JiZhLmF1dGhvcml6ZWRJc3N1aW5nQWNjb3VudHMuaW5jbHVkZXMocyksIm5vdCBhbGxvd2VkIHRvIGlzc3VlIHRva2VucyIpJiZhcGkuYXNzZXJ0KDA9PT1hLm1heFN1cHBseXx8YS5zdXBwbHk8YS5tYXhTdXBwbHksIm1heCBzdXBwbHkgbGltaXQgcmVhY2hlZCIpKXtjb25zdCB5PU9iamVjdC5rZXlzKGEucHJvcGVydGllcykubGVuZ3RoLG09YXBpLkJpZ051bWJlcihmW25dKS5tdWx0aXBsaWVkQnkoeSksZz1jYWxjdWxhdGVCYWxhbmNlKGZbbl0sbSxpLnByZWNpc2lvbiwhMCksYj1hd2FpdCBhcGkuZGIuZmluZE9uZUluVGFibGUoInRva2VucyIsZCx7YWNjb3VudDpzLHN5bWJvbDpufSksaD0hIWFwaS5CaWdOdW1iZXIoZykubHRlKDApfHxiJiZhcGkuQmlnTnVtYmVyKGIuYmFsYW5jZSkuZ3RlKGcpO2lmKHIpe2NvbnN0IGU9YXdhaXQgaXNWYWxpZFRva2VuQmFza2V0KHIsZCxzLG4sZyk7aWYoIWFwaS5hc3NlcnQoZSwiaW52YWxpZCBiYXNrZXQgb2YgdG9rZW5zIHRvIGxvY2sgKGNhbm5vdCBsb2NrIG1vcmUgdGhhbiAxMCB0b2tlbiB0eXBlczsgaXNzdWluZyBhY2NvdW50IG11c3QgaGF2ZSBlbm91Z2ggYmFsYW5jZSkiKSlyZXR1cm4hMX1sZXQgdj17fTtpZih2b2lkIDAhPT1vKXt0cnl7aWYoIWlzVmFsaWREYXRhUHJvcGVydGllcyhzLHUsYSxvKSlyZXR1cm4hMX1jYXRjaChlKXtyZXR1cm4hMX12PW99aWYoYXBpLmFzc2VydChoLCJ5b3UgbXVzdCBoYXZlIGVub3VnaCB0b2tlbnMgdG8gY292ZXIgdGhlIGlzc3VhbmNlIGZlZXMiKSl7aWYoYXBpLkJpZ051bWJlcihnKS5ndCgwKSlpZigiY29udHJhY3QiPT09dSl7Y29uc3QgZT1hd2FpdCBhcGkudHJhbnNmZXJUb2tlbnNGcm9tQ2FsbGluZ0NvbnRyYWN0KCJudWxsIixuLGcsInVzZXIiKTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXJGcm9tQ29udHJhY3QiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWVsc2V7Y29uc3QgZT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyIix7dG86Im51bGwiLHN5bWJvbDpuLHF1YW50aXR5OmcsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpZighYXBpLmFzc2VydChpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChlLHMsIm51bGwiLG4sZywidHJhbnNmZXIiKSwidW5hYmxlIHRvIHRyYW5zZmVyIGlzc3VhbmNlIGZlZSIpKXJldHVybiExfWNvbnN0IGk9e307aWYocilmb3IoY29uc3RbZSx0XW9mIE9iamVjdC5lbnRyaWVzKHIpKWlmKCJjb250cmFjdCI9PT11KXtjb25zdCBhPWF3YWl0IGFwaS50cmFuc2ZlclRva2Vuc0Zyb21DYWxsaW5nQ29udHJhY3QoIm5mdCIsZSx0LCJjb250cmFjdCIpO2lzVG9rZW5UcmFuc2ZlclZlcmlmaWVkKGEscywibmZ0IixlLHQsInRyYW5zZmVyRnJvbUNvbnRyYWN0IikmJihpW2VdPXQpfWVsc2V7Y29uc3QgYT1hd2FpdCBhcGkuZXhlY3V0ZVNtYXJ0Q29udHJhY3QoInRva2VucyIsInRyYW5zZmVyVG9Db250cmFjdCIse3RvOiJuZnQiLHN5bWJvbDplLHF1YW50aXR5OnQsaXNTaWduZWRXaXRoQWN0aXZlS2V5OnB9KTtpc1Rva2VuVHJhbnNmZXJWZXJpZmllZChhLHMsIm5mdCIsZSx0LCJ0cmFuc2ZlclRvQ29udHJhY3QiKSYmKGlbZV09dCl9Y29uc3Qgbz17YWNjb3VudDplLG93bmVkQnk6InVzZXIiPT09bD8idSI6ImMiLGxvY2tlZFRva2VuczppLHByb3BlcnRpZXM6dn0sZD1hd2FpdCBhcGkuZGIuaW5zZXJ0KGMsbyk7cmV0dXJuIGEuc3VwcGx5Kz0xLCJudWxsIj09PWUmJiJjb250cmFjdCIhPT1sfHwoYS5jaXJjdWxhdGluZ1N1cHBseSs9MSksYXdhaXQgYXBpLmRiLnVwZGF0ZSgibmZ0cyIsYSksYXBpLmVtaXQoImlzc3VlIix7ZnJvbTpzLGZyb21UeXBlOnUsdG86ZSx0b1R5cGU6bCxzeW1ib2w6dCxsb2NrZWRUb2tlbnM6aSxwcm9wZXJ0aWVzOnYsaWQ6ZC5faWR9KSwhMH19fX19cmV0dXJuITF9KSxhY3Rpb25zLmlzc3VlTXVsdGlwbGU9KGFzeW5jIGU9Pntjb25zdHtpbnN0YW5jZXM6dCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9PWU7aWYoYXBpLmFzc2VydCghMD09PWEsInlvdSBtdXN0IHVzZSBhIGN1c3RvbV9qc29uIHNpZ25lZCB3aXRoIHlvdXIgYWN0aXZlIGtleSIpJiZhcGkuYXNzZXJ0KHQmJiJvYmplY3QiPT10eXBlb2YgdCYmQXJyYXkuaXNBcnJheSh0KSwiaW52YWxpZCBwYXJhbXMiKSYmYXBpLmFzc2VydCh0Lmxlbmd0aDw9MTAsImNhbm5vdCBpc3N1ZSBtb3JlIHRoYW4gMTAgTkZUIGluc3RhbmNlcyBhdCBvbmNlIikpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0xKXtjb25zdHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZH09dFtlXTthd2FpdCBhY3Rpb25zLmlzc3VlKHtzeW1ib2w6cyxmcm9tVHlwZTpuLHRvOnIsdG9UeXBlOm8sZmVlU3ltYm9sOnAsbG9ja1Rva2VuczpjLHByb3BlcnRpZXM6ZCxpc1NpZ25lZFdpdGhBY3RpdmVLZXk6YSxjYWxsaW5nQ29udHJhY3RJbmZvOml9KX19KTs="
}
}
}