Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@道长仓库Pro@eyJmaXJzdEhlYWRlciI6InNvcnQiLCJsYXN0X2NoYXB0ZXJfcnVsZSI6IiIsInRpdGxlIjoi6YGT6ZW/5LuT5bqTUHJvIiwiYXV0aG9yIjoiQExveURnSWsiLCJ1cmwiOiJoaWtlcjovL2VtcHR5IiwidmVyc2lvbiI6MTM2LCJjb2xfdHlwZSI6Imljb25fMl9yb3VuZCIsImNsYXNzX25hbWUiOiIiLCJ0eXBlIjoidG9vbCIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuICAgIGNvbnN0IHtcbiAgICAgICAgZ2V0QXBpLFxuICAgICAgICBjb2xvcixcbiAgICAgICAgc21hbGwsXG4gICAgICAgIGdldEZpbGUsXG4gICAgICAgIGh0bWxUYWcsXG4gICAgICAgIGFwaSxcbiAgICAgICAgbWRcbiAgICB9ID0gJC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVwiKTtcblxuY29uc3QgbHNnPSQucmVxdWlyZShcImhpa2VyOi8vcGFnZS9sb2NhbFN0b3JhZ2U/cnVsZT3pgZPplb/ku5PlupNQcm9cIik7XG5sZXQgY2xhc3NBID0gZ2V0VmFyKFwiV2FyZWhvdXNlLmNsYXNzXCIsIFwiMFwiKTtcbmxldCBsaXN0VXJsID0gZ2V0QXBpKFwidXNlcnNVcmxcIikgKyBjbGFzc0EsXG4gICAgbXlVcmwgPSBnZXRBcGkoXCJkZXZTZWxmXCIpO1xuICAgIC8vIG15VXJsID0gZ2V0QXBpKFwicnVsZXNBbGxVcmxcIik7XG5wdXRWYXIoXCJXYXJlaG91c2UuZmlsdGVyXCIsIFwiXCIpO1xudmFyIG5vV2FpdD10cnVlOy8v5peg6ZyA6YeN6K+VXG52YXIgdGltZW91dD01MDA7XG52YXIgdG1wX2hlYWRlcnM9e1xuICAgIHRpbWVvdXQ6dGltZW91dFxufTtcbnRyeXtcbnZhciB1c2VyTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChsaXN0VXJsLHRtcF9oZWFkZXJzKSkucmVzdWx0LFxuICAgIG5vd0NvbiA9IDAsXG4gICAgcnVsZUNvdW50ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcInJ1bGVDb3VudFVybFwiKSx0bXBfaGVhZGVycykpLnJlc3VsdDtcbn1jYXRjaChlKXtcbiAgICBub1dhaXQ9ZmFsc2U7XG4gICAgc2V0UmVzdWx0KFt7XG4gICAgICAgIHRpdGxlOifku5PlupPlkIzml7borr/pl67ph4/ov4flpKfmiJbnvZHnu5zlt67vvIznuYHlv5nkuK0uLi5cXG7or7fogJDlv4PnrYnlvoXnqI3lkI7lho3or5UnLFxuICAgICAgICBkZXNjOifngrnlh7vlsJ3or5Xph43mlrDorr/pl64nLFxuICAgICAgICBjb2xfdHlwZTondGV4dF8xJyxcbiAgICAgICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lt7LliLfmlrAnXG4gICAgICAgIH0pXG4gICAgfV0pO1xufVxuaWYobm9XYWl0KXtcbmxldCBkYXRhID0gW107XG5sZXQgY2xhc3NUYWIgPSBbXG4gICAgW1wi5LiK5qyh5rS76LeDXCIsIFwiMFwiXSxcbiAgICBbXCLop4TliJnmlbBcIiwgXCIxXCJdLFxuICAgIFtcIuazqOWGjOaXtumXtFwiLCBcIi0xXCJdXG5dXG5mb3IgKGxldCBpdGVtIG9mIGNsYXNzVGFiKSB7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGl0ZW1bMV0gPT09IGNsYXNzQSA/IFwi4oCc4oCcXCIgKyBpdGVtWzBdICsgXCLigJ3igJ1cIiA6IGl0ZW1bMF0sXG4gICAgICAgIHVybDogJChcIiNub0xvYWRpbmcjXCIpLmxhenlSdWxlKChrZXkpID0+IHtcbiAgICAgICAgICAgIHB1dFZhcihcIldhcmVob3VzZS5jbGFzc1wiLCBrZXkpO1xuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICB9LCBpdGVtWzFdKSxcbiAgICAgICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG4gICAgfSk7XG59XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOiBcIuWFqOmDqOinhOWImVwiLFxuICAgIHVybDogXCJoaWtlcjovL3BhZ2UvQWxsUHVibGljUnVsZT91cmw9aGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXCIsXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6IFwi5Yi35paw5L6d6LWWXCIsXG4gICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChqc29uVXJsKT0+e1xuICAgICAgICBqc29uVXJsID0ganNvblVybCsnMjUwNSc7XG4gICAgICAgIC8vIGxvZyhqc29uVXJsKTtcbiAgICAgICAgbGV0IHRleHQgPSByZXF1ZXN0KGpzb25VcmwpO1xuICAgICAgICBpZighL3ZlcnNpb24vLnRlc3QodGV4dCkpe1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+acjeWKoeWZqOato+W/mSzor7fnqI3lgJnlho3or5UuLi4nXG4gICAgICAgIH1cbiAgICAgICAgZGVsZXRlQ2FjaGUoanNvblVybCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXF1aXJlKGpzb25VcmwpO1xuICAgICAgICAgICAgY29uZmlybSh7dGl0bGU6J+WIt+aWsOaIkOWKn+aPkOekuicsY29udGVudDpcInRvYXN0Oi8v5bey5Yi35pawLOW9k+WJjeeJiOacrOS/oeaBrzpcXG5cIitKU09OLnN0cmluZ2lmeSh2ZXJzaW9uKX0pXG4gICAgICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXG4gICAgICAgIH1jYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ezn+ezle+8jOacrOWcsOe8k+WtmOaPkuS7tuiiq+a4hemZpOS6hu+8jOS9huaYr+acjeWKoeWZqOmAmuiur+Wksei0pSEnXG4gICAgICAgIH1cbiAgICB9LGdldEFwaShcImltcG9ydFVybFwiKSksXG4gICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiXG59KTtcbmRhdGEucHVzaCh7XG4gICAgdGl0bGU6XCLpgJrlhY06XCIrY29sb3IobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpLFwiI2ZmNzAwMFwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCBsc2c9JC5yZXF1aXJlKFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1wiKTtcbiAgICAgICAgaWYobHNnLmdldEl0ZW0oXCLpgJrlhY1cIixcIlg1XCIpPT1cIlg1XCIpe1xuICAgICAgICAgICAgbHNnLnNldEl0ZW0oXCLpgJrlhY1cIixcIldFQlwiKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBsc2cuc2V0SXRlbShcIumAmuWFjVwiLFwiWDVcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xuICAgICAgICByZXR1cm4gXCJ0b2FzdDovL+W3suiuvue9ruS7k+W6k+mAmuWFjeaooeW8j+S4ujpcIitsc2cuZ2V0SXRlbShcIumAmuWFjVwiKTtcbiAgICB9KVxufSk7XG5kYXRhLnB1c2goe1xuICAgIHRpdGxlOmNvbG9yKFwi5LuT5bqT5YWs5ZGKXCIsXCIjZmY3MDAwXCIpLFxuICAgIGNvbF90eXBlOlwic2Nyb2xsX2J1dHRvblwiLFxuICAgIHVybDokKCdoaWtlcjovL2VtcHR5I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5IycpLnJ1bGUoKG1kKT0+e1xuICAgICAgICByZXF1aXJlKG1kKTtcbiAgICAgICAgbGV0IGQgPSBbXTtcbiAgICAgICAgbGV0IOS7k+W6k+WFrOWRij1cIuaaguaXoOWFrOWRilwiO1xuICAgICAgICB0cnl7XG4gICAgICAgICAgICDku5PlupPlhazlkYo9ZmV0Y2goJ2h0dHBzOi8vaGpkaG54LmNvZGluZy5uZXQvcC9oaWtlci9kL2RyL2dpdC9yYXcvbWFzdGVyL2pzL+S7k+W6k+WFrOWRii5tZCcpO1xuICAgICAgICB9Y2F0Y2goZSl7fVxuICAgICAgICBpZijku5PlupPlhazlkYopIHtcbiAgICAgICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IG1hcmtlZC5wYXJzZSjku5PlupPlhazlkYopLFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcbiAgICAgICAgICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0UmVzdWx0KGQpO1xuICAgIH0sbWQpXG59KTtcblxuZGF0YS5wdXNoKHtcbiAgICB0aXRsZTpjb2xvcihcIuWNh+e6p+S7k+W6k1wiLFwiIzE1YWIyMVwiKSxcbiAgICBjb2xfdHlwZTpcInNjcm9sbF9idXR0b25cIixcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xuICAgICAgICBjb25zdCB7Z2V0QXBpfSA9ICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS91dGlsaXlcIik7XG4gICAgICAgIGxldCBydWxlSGVhZCA9ICfmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJDpgZPplb/ku5PlupNQcm/jgJHvv6Vob21lX3J1bGVfdXJs77+lJztcbiAgICAgICAgbGV0IHVybCA9IGdldEFwaSgnaW1wb3J0VXJsJykrXCIxMDk0XCI7XG4gICAgICAgIGxldCBpbXBvcnRVcmwgPSAncnVsZTovLycrYmFzZTY0RW5jb2RlKHJ1bGVIZWFkK3VybCk7XG4gICAgICAgIHJldHVybiBpbXBvcnRVcmxcbiAgICB9KVxufSk7XG5cbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XG4gICAgY2xlYXJWYXIoXCJXYXJlaG91c2UuY2xhc3NcIik7XG59KSk7XG5sZXQge1xuICAgIHVzZXJuYW1lLFxuICAgIHBhc3N3b3JkLFxuICAgIHVzZXJcbn0gPSBnZXRGaWxlKCk7XG5cbmxldCBpc19sb2dpbiA9IGZhbHNlO1xubGV0IGlzX21hbmFnZXIgPSBmYWxzZTtcbmlmICh1c2VybmFtZSAhPT0gdm9pZCAwICYmIHBhc3N3b3JkICE9PSB2b2lkIDApIHtcbiAgICBteVVybCArPSAnP3FxPScgKyB1c2VybmFtZSArICcmcGFzc3dvcmQ9JyArIHBhc3N3b3JkO1xuICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwsdG1wX2hlYWRlcnMpO1xuICAgIGxldCBjb2RlID0ge307XG4gICAgdHJ5e1xuICAgICAgICBjb2RlPUpTT04ucGFyc2UoY29kZV9zdHIpO1xuICAgIH1jYXRjaChlKXt9XG4gICAgaWYgKGNvZGUuc3RhdHVzID09PSAwJiYgY29kZS5yZXN1bHQuYWN0aXZlKSB7XG4gICAgICAgIGlzX2xvZ2luID0gdHJ1ZTtcbiAgICAgICAgaWYoY29kZS5yZXN1bHQuaXNfbWFuYWdlcil7XG4gICAgICAgICAgICBpc19tYW5hZ2VyID0gdHJ1ZTtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJ+ecnycpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51c2VybmFtZScsdXNlcm5hbWUpO1xuICAgICAgICAgICAgcHV0VmFyKCdob3VzZS5wYXNzd29yZCcscGFzc3dvcmQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIHB1dFZhcignaG91c2UuaXNfbWFuYWdlcicsJycpO1xuICAgICAgICAgICAgY2xlYXJWYXIoJ2hvdXNlLnVzZXJuYW1lJyk7XG4gICAgICAgICAgICBjbGVhclZhcignaG91c2UucGFzc3dvcmQnKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmlmIChpc19sb2dpbikge1xuICAgIHRyeXtcbiAgICBub3dDb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFwibm93Q29uVXJsXCIpLHRtcF9oZWFkZXJzKSkucmVzdWx0O1xuICAgIH1jYXRjaChlKXtcbiAgICAgICAgbm93Q29uPSfmnKrnn6UnO1xuICAgIH1cbiAgICBsZXQgZGV2RGF0YSA9IHVzZXJMaXN0LmZpbmQoaXRlbSA9PiBpdGVtLnFxID09PSB1c2VybmFtZSk7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgdGl0bGU6ICc8c3Ryb25nPjxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjcwMDBcIj4nICsgZGV2RGF0YS5uYW1lICsgJzwvc3Bhbj48L3N0cm9uZz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs8c21hbGw+PHU+6KeE5YiZ566h55CGID48L3U+PC9zbWFsbD4nLFxuICAgICAgICBwaWNfdXJsOiBkZXZEYXRhLmF2YXRhcixcbiAgICAgICAgY29sX3R5cGU6IFwiYXZhdGFyXCIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV2TWFuYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgLy91c2VybmFtZTogdXNlcm5hbWUsXG4gICAgICAgICAgICAvL3Bhc3N3b3JkOiBwYXNzd29yZCxcbiAgICAgICAgICAgIGRldjogZGV2RGF0YVxuICAgICAgICB9XG4gICAgfSk7XG4gICAgZGF0YS5wdXNoKHtcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxuICAgICAgICB0aXRsZTogc21hbGwoXCLnjrDmnIkgXCIgKyBjb2xvcih1c2VyTGlzdC5sZW5ndGgsIFwiI2ZmNzAwMFwiKSArIFwiIOWQjeW8gOWPkeiAhe+8jFwiICsgY29sb3IocnVsZUNvdW50WzBdLCBcIiNmZjcwMDBcIikgKyBcIiDmnaHlhazlvIDop4TliJnvvIxcIiArIGNvbG9yKHJ1bGVDb3VudFsxXSwgXCIjZmY3MDAwXCIpICsgXCIg5p2h6ZuG6Iqz6ZiB6KeE5YiZ44CC5Zyo57q/OlwiK2NvbG9yKG5vd0NvbiwgXCIjZmY3MDAwXCIpKSxcbiAgICAgICAgdXJsOiBcInRvYXN0Oi8v5Za15Za15Za1P1wiLFxuICAgIH0pO1xufSBlbHNlIHtcbiAgICBkYXRhLnB1c2goe1xuICAgICAgICB0aXRsZTogc21hbGwoY29sb3IoXCLlvIDlj5HogIXnmbvlvZVcIiwgXCIjMDBCRkZGXCIpKSxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgZGVzYzogc21hbGwoXCLnjrDmnIlcIiArIGNvbG9yKHVzZXJMaXN0Lmxlbmd0aCwgXCIjZmY3MDAwXCIpICsgXCLlkI3lvIDlj5HogIXvvIxcIiArIGNvbG9yKHJ1bGVDb3VudFswXSwgXCIjZmY3MDAwXCIpICsgXCLmnaHlhazlvIDop4TliJnvvIxcIiArIGNvbG9yKDAsIFwiI2ZmNzAwMFwiKSArIFwi5p2h6ZuG6Iqz6ZiB6KeE5YiZ44CCXCIpLFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2RldkxvZ2luXCJcbiAgICB9KTtcbn1cbmlmIChBcnJheS5pc0FycmF5KHVzZXIpICYmIHVzZXIubGVuZ3RoID09PSAyKSB7XG4gICAgbGV0IHVzZXJsb2dpbiA9IHJlcXVlc3QoYXBpLmRpc19sb2dpbiwge1xuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIFwicGFyYW1zXCI6IHtcbiAgICAgICAgICAgICAgICBcInFxXCI6IHVzZXJbMF0sXG4gICAgICAgICAgICAgICAgXCJhdXRoX2NvZGVcIjogdXNlclsxXVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIHRpbWVvdXQ6dGltZW91dFxuICAgIH0pO1xuICAgIHVzZXJsb2dpbiA9IEpTT04ucGFyc2UodXNlcmxvZ2luKS5yZXN1bHQ7XG4gICAgaWYgKHVzZXJsb2dpbi5zdGF0dXMgPT09IDApIHtcbiAgICAgICAgdXNlcmxvZ2luID0gdXNlcmxvZ2luLnJlc3VsdFxuICAgICAgICBkYXRhLnB1c2goe1xuICAgICAgICAgICAgdGl0bGU6IHVzZXJsb2dpbi5uYW1lICsgXCImbmJzcDsmbmJzcDtcIiArIHVzZXJsb2dpbi5xcSArIFwiJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7PHNtYWxsPjx1PuabtOaNoui0puWPtyA+PC91Pjwvc21hbGw+XCIsXG4gICAgICAgICAgICBjb2xfdHlwZTogJ2F2YXRhcicsXG4gICAgICAgICAgICBwaWNfdXJsOiB1c2VybG9naW4uYXZhdGFyX3VybCxcbiAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvVXNlcnJlZ2lzdHJhdGlvblwiXG4gICAgICAgIH0pO1xuICAgICAgICBkYXRhLnNwbGljZSgzLDAse1xuICAgICAgICAgICAgdGl0bGU6IHVzZXJsb2dpbi5oYXNfcmVwbHk/XCLwn4aV5Zue5aSNXCI6XCLwn5SU5Zue5aSNXCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL015UmVwbHk/dXJsPWhpa2VyOi8vZW1wdHkjZnlwYWdlI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICAgICAgY29sX3R5cGU6IFwic2Nyb2xsX2J1dHRvblwiLFxuICAgICAgICAgICAgZXh0cmE6e1xuICAgICAgICAgICAgICAgIGF1dGhfY29kZTp1c2VyWzFdLFxuICAgICAgICAgICAgICAgIHFxOnVzZXJbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiB1c2VybG9naW4uZGV0YWlsLFxuICAgICAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgICAgIGRlc2M6IFwi4oCc4oCc4oCd4oCdPHNtYWxsPjx1PumHjeaWsOiOt+WPlumqjOivgeeggSA+PC91Pjwvc21hbGw+XCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL1VzZXJyZWdpc3RyYXRpb25cIlxuICAgICAgICB9KTtcbiAgICB9XG59IGVsc2Uge1xuICAgIGRhdGEucHVzaCh7XG4gICAgICAgIHRpdGxlOiBcIuivhOiuuueZu+W9lS/ms6jlhoxcIixcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcbiAgICAgICAgZGVzYzogXCJcIixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXCJcbiAgICB9KTtcbn1cbmZvciAodmFyIGl0ZW0gb2YgdXNlckxpc3QpIHtcbiAgICBkYXRhLnB1c2goe1xuICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXCIoXCIgKyBpdGVtLnJ1bGVfbnVtICsgXCIpXCIsXG4gICAgICAgIGRlc2M6IGl0ZW0uaWQgKyAnOicgKyBpdGVtLm5pY2tfbmFtZSxcbiAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvcnVsZXMjbm9IaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgYXZhdGFyVXJsOiBpdGVtLmF2YXRhcixcbiAgICAgICAgICAgIHFxOiBpdGVtLnFxLFxuICAgICAgICAgICAgaWQ6aXRlbS5pZCxcbiAgICAgICAgICAgIGNhbl91cGxvYWQ6aXRlbS5jYW5fdXBsb2FkXG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuZGF0YS5wdXNoKHtcbiAgICBjb2xfdHlwZTogJ2xvbmdfdGV4dCdcbn0pO1xuc2V0UmVzdWx0KGRhdGEpO1xubGV0IGltZyA9IFtcbiAgICBbXG4gICAgICAgIFwiaGlrZXI6Ly9maWxlcy9pY29uL+i1ni5zdmdcIiwgXCJodHRwczovL2JhZnliZWlhZWV0d2JjM3Rob3kyMnk1emQ3YWw2cm5kZXFicmJ3aHN6cWI2b2l0bmY3YTV6dnN6NXBlLmlwZnMuY2YtaXBmcy5jb20vXCJcbiAgICBdLFxuICAgIFtcbiAgICAgICAgXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1wiLCBcImh0dHBzOi8vYmFmeWJlaWVoeHlucGhhYWZlNG11a2Fjczd3ZTRkNmxyYjM1a3BwZGlmZmp2NHZ3bnNxMjJuZnFubDQuaXBmcy5jZi1pcGZzLmNvbS9cIlxuICAgIF0sXG4gICAgW1xuICAgICAgICBcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXCIsIFwiaHR0cHM6Ly9iYWZ5YmVpZmh4aTVyZG54cTV4bHk3cjRxZGJ3aWNvMjM0M3NtZWx4ZHFveXRhbGd1Y3RnYzJvanNkeS5pcGZzLmNmLWlwZnMuY29tL1wiXG4gICAgXVxuXVxuZm9yIChsZXQgaXRlbSBvZiBpbWcpIHtcbiAgICBpZiAoIWZpbGVFeGlzdChpdGVtWzBdKSkge1xuICAgICAgICB3cml0ZUZpbGUoaXRlbVswXSwgcmVxdWVzdChpdGVtWzFdKSk7XG4gICAgfVxufVxufSIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5IyoqIiwiZ3JvdXAiOiLikaDmjqjojZAiLCJzZWFyY2hGaW5kIjoianM6XG52YXIgZCA9IFtdO1xuY29uc3Qge1xuICAgIGFwaSxcbiAgICBnZXRBcGksXG4gICAgbG9jYWxSdWxlVmVyICAgIFxufSA9ICQucmVxdWlyZShcImhpa2VyOi8vcGFnZS91dGlsaXlcIik7XG52YXIgaHRtbCA9IHJlcXVlc3QoZ2V0QXBpKFwic2VhcmNoXCIpICsgXCI/a2V5PVwiICsgTVlfVVJMLnJlcGxhY2UoXCJoaWtlcjovL2VtcHR5I1wiLCBcIlwiKSk7IC8vIOiOt+WPlua6kOeggVxudmFyIHJ1bGVfbGlzdCA9IEpTT04ucGFyc2UoaHRtbCkucmVzdWx0O1xubGV0IGZpbHRlciA9IGdldFZhcihcIldhcmVob3VzZS5maWx0ZXJcIiwgXCJcIik7XG5pZiAoZmlsdGVyICE9PSBcIlwiKSB7XG4gICAgcnVsZV9saXN0ID0gcnVsZV9saXN0LmZpbHRlcihpdGVtID0+IGl0ZW0uYXV0aG9yID09PSBmaWx0ZXIpO1xufVxuaWYgKHJ1bGVfbGlzdC5sZW5ndGggPT09IDApIHtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogJ+WFseaQnOe0ouWIsCcgKyBydWxlX2xpc3QubGVuZ3RoICsgXCLmnaHorrDlvZVcIixcbiAgICAgICAgZGVzYzogJ+ivpuaDheivt+aJvumBk+mVvyxxcSA0MzQ4NTcwMDUnLFxuICAgICAgICB1cmw6IFwiaGlrZXI6Ly9lbXB0eVwiLFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXG4gICAgfSk7XG59XG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcblxuZm9yIChsZXQgaXRlbSBvZiBydWxlX2xpc3QpIHtcbiAgICAvL2xldCBsdmVyPWxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XG4gICAgbGV0IGxhYmVsID0gXCJcIixcbiAgICAgICAgbHZlciA9IC0yO1xuICAgIGlmIChpdGVtLmRhdGFfdHlwZSA9PT0gXCJob21lX3J1bGVfdXJsXCIpIHtcbiAgICAgICAgbHZlciA9IGxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XG4gICAgICAgIGlmIChsdmVyID09PSAtMSkge1xuICAgICAgICAgICAgbGFiZWwgPSBcIvCfhpVcIjtcbiAgICAgICAgfSBlbHNlIGlmIChsdmVyIDwgaXRlbS52ZXIpIHtcbiAgICAgICAgICAgIGxhYmVsID0gXCLwn4aZXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IGxhYmVsK2l0ZW0ubmFtZSxcbiAgICAgICAgZGVzYzogaXRlbS50eXBlLFxuICAgICAgICBjb250ZW50OiBpdGVtLmF1dGhvci8qK1wiXFxu5pys5Zyw54mI5pysOlwiK2x2ZXIrXCJcXHRcXHTkupHnq6/niYjmnKw6XCIraXRlbS52ZXIqLysgJ1xcbuabtOaWsOS6jjonICsgaXRlbS5sYXN0X3VwZGF0ZSxcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1wiLFxuICAgICAgICBleHRyYToge1xuICAgICAgICAgICAgbHZlcjogbHZlcixcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXG4gICAgICAgIH0sXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljX3VybFxuICAgIH0pO1xuXG59XG5cbnNldFJlc3VsdChkKTsiLCJkZXRhaWxfY29sX3R5cGUiOiJ0ZXh0XzEiLCJkZXRhaWxfZmluZF9ydWxlIjoiIiwic2RldGFpbF9jb2xfdHlwZSI6InRleHRfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiIiwicGFnZXMiOiJbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidXRpbGl5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgaG9zdCA9IFxcXCJodHRwOi8vaGlrZXIubm9raWEucHJlc3NcXFwiO1xcbi8vbGV0IGhvc3QgPSBcXFwiaHR0cDovLzE5Mi4xNjguMy45NDo4MDc5XFxcIjtcXG5sZXQgaG9tZSA9IGJhc2U2NERlY29kZShcXFwiYUdsclpYSTZMeTlvYjIxbFxcXCIpO1xcbnZhciBhcGkgPSB7XFxuICAgIGhvc3Q6IGhvc3QrXFxcIi9oaWtlcnVsZVxcXCIsXFxuICAgIHVzZXJzVXJsOiBcXFwiL2Rldi91c2Vycz9vcmRlcj1cXFwiLCAvL+eUqOaIt+WIl+ihqFxcbiAgICBydWxlQ291bnRVcmw6IFxcXCIvZGV2L3J1bGVjb3VudFxcXCIsIC8v6I635Y+W6KeE5YiZ5pWw6YePXFxuICAgIHJ1bGVzVXJsOiBcXFwiL2Rldi9nZXRcXFwiLCAvL+eUqOaIt+WvueW6lOeahOinhOWImeWIl+ihqOS7heS7heiOt+WPluWFrOW8gFxcbiAgICBydWxlc0FsbFVybDogXFxcIi9kZXYvZ2V0YWxsXFxcIiwgLy/lvIDlj5HogIXlr7nlupTnmoTop4TliJnliJfooajlj6/ojrflj5bnp4HmnIlcXG4gICAgZGV2U2VsZjonL2Rldi9nZXRzZWxmJywvL+iOt+WPluW8gOWPkeiAheS/oeaBr1xcbiAgICBtYW5DYW5VcGxvYWQ6Jy9zZXRfY2FuX3VwbG9hZC8nLC8v6LaF566h6K6+572u5byA5Y+R6ICF5piv5ZCm5Y+v5LiK5LygXFxuICAgIG1hblJ1bGVTYWZlOicvc2V0X3J1bGVfc2FmZS8nLC8v6LaF566h6K6+572u6KeE5YiZ5a6J5YWo5oCnXFxuICAgIG1hblJ1bGVHb29kOicvc2V0X3J1bGVfZ29vZC8nLC8v6LaF566h6K6+572u6KeE5YiZ5LyY6LSo5oCnXFxuICAgIGltcG9ydFVybDogXFxcIi9ydWxlbGlzdC5qc29uP2lkPVxcXCIsIC8v6KeE5YiZ6K+m5oOF5Y+v5a+85YWlXFxuICAgIGluZm9TZXRVcmw6IFxcXCIvZGV2L3NldF9pbmZvXFxcIixcXG4gICAgbm93Q29uVXJsOiBcXFwiL3NxbF9pbmZvL2dldF9ub3dfY29uXFxcIixcXG4gICAgaW5mb0dldFVybDogXFxcIi9kZXYvZ2V0X2luZm8/bmFtZT1cXFwiLFxcbiAgICBzZXR0aW5nc0dldFVybDogXFxcIi9kZXYvZ2V0X3NldHRpbmdzP25hbWU9XFxcIixcXG4gICAgZ3VwbG9hZDogXFxcIi9kZXYvZ3VwbG9hZFxcXCIsXFxuICAgIGd0aW1lb3ZlcjogXFxcIi9kZXYvZ3RpbWVvdmVyXFxcIixcXG4gICAgZ2V0YnlpZDogXFxcIi9kZXYvZ2V0YnlpZFxcXCIsXFxuICAgIHJ1bGVMaXN0SnNvbjogXFxcIi9ydWxlbGlzdC5qc29uXFxcIixcXG4gICAgYXV0aDogXFxcIi9kZXYvZ2V0X2F1dGhcXFwiLFxcbiAgICB0aW1lb3ZlcjogXFxcIi9kZXYvdGltZW92ZXJcXFwiLFxcbiAgICBzaGFyZTogXFxcIi9kZXYvc2hhcmVcXFwiLFxcbiAgICBnZW5BdXRoOiBcXFwiL2Rldi9nZW5fYXV0aFxcXCIsXFxuICAgIGRlbGV0ZVVybDogXFxcIi9kZXYvZGVsZXRlXFxcIixcXG4gICAganNvbkxpc3Q6IFxcXCIvZGV2L2pzb25fbGlzdFxcXCIsXFxuICAgIHNlYXJjaDogXFxcIi9kZXYvc2VhcmNoXFxcIixcXG4gICAgbmV3X2RldjogXFxcIi9kZXZfcmVnaXN0L25ld1xcXCIsXFxuICAgIG5ld19nZXRJZDogXFxcIi9kZXZfcmVnaXN0L2dldF9pZFxcXCIsXFxuICAgIG5ld19jb25maXJtOiBcXFwiL2Rldl9yZWdpc3QvY29uZmlybVxcXCIsXFxuICAgIG1vZGlmeV9wd2Q6IFxcXCIvbW9kaWZ5L3Bhc3N3b3JkXFxcIixcXG4gICAgbW9kaWZ5X25hbWU6IFxcXCIvbW9kaWZ5L25hbWVcXFwiLFxcbiAgICBtb2RpZnlfYXZhOiBcXFwiL21vZGlmeS9hdmF0YXJcXFwiLFxcbiAgICB1c2VyOiBcXFwiL2Rldi91c2VyL1xcXCIsXFxuICAgIGdldF9ydWxlX25vdGU6IFxcXCIvbW9kaWZ5L2dldF9ydWxlX25vdGUvXFxcIixcXG4gICAgc2V0X3J1bGVfcGljOiBcXFwiL21vZGlmeS9ydWxlX3BpYy9cXFwiLFxcbiAgICBzZXRfcnVsZV9ub3RlOiBcXFwiL21vZGlmeS9ydWxlX25vdGUvXFxcIlxcbn1cXG4kLmV4cG9ydHMucmFuZ2UgPSBmdW5jdGlvbihtLCBuKSB7XFxuICAgIHJldHVybiBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobSAtIG4gKyAxKSArIG4pO1xcbn1cXG4kLmV4cG9ydHMubWFwQ29sVHlwZSA9IGZ1bmN0aW9uKHRhcmdldCwgdHlwZSwgbikge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xcbiAgICAgICAgdGFyZ2V0LnB1c2goe1xcbiAgICAgICAgICAgIGNvbF90eXBlOiB0eXBlXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG52YXIgZ2V0QXBpID0gZnVuY3Rpb24oaykge1xcbiAgICByZXR1cm4gYXBpLmhvc3QgKyBhcGlba107XFxufTtcXG4kLmV4cG9ydHMuZ2V0QXBpPWdldEFwaTtcXG4kLmV4cG9ydHMubWQ9Z2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMzE4N1xcXCI7XFxuJC5leHBvcnRzLmxvY2FsUnVsZVZlciA9IGZ1bmN0aW9uKGxvY2FsUnVsZUxpc3QsIHJ1bGUpIHtcXG4gICAgbGV0IGxvY2FsUnVsZTtcXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJ1bGVMaXN0Lmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICBsZXQgaXRlbSA9IGxvY2FsUnVsZUxpc3RbaV07XFxuICAgICAgICBsZXQgYXUgPSBpdGVtLmF1dGhvciB8fCBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBzYW1lQXU9YXUubGVuZ3RoID4gMCAmJiBydWxlLmF1dGhvci5pbmNsdWRlcyhhdSk7XFxuICAgICAgICBzYW1lQXU9dHJ1ZTsvL+S4jeWIpOaWreS9nOiAhem7mOiupOS4unRydWVcXG4gICAgICAgIGlmIChpdGVtLnRpdGxlID09PSBydWxlLm5hbWUgJiYgc2FtZUF1KSB7XFxuICAgICAgICAgICAgbG9jYWxSdWxlID0gaXRlbTtcXG4gICAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAobG9jYWxSdWxlID09PSB2b2lkIDApIHtcXG4gICAgICAgIHJldHVybiAtMTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBsb2NhbFJ1bGUudmVyc2lvbjtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMuY29sb3IgPSBmdW5jdGlvbih0ZXh0LCBjb2xvcikge1xcbiAgICB0ZXh0ICs9IFxcXCJcXFwiO1xcbiAgICBpZiAodGV4dC5pbmRleE9mKFxcXCLigJzigJzigJ3igJ1cXFwiKSA9PT0gMCkge1xcbiAgICAgICAgdGV4dC5yZXBsYWNlKFxcXCLigJzigJzigJ3igJ1cXFwiLCBcXFwiXFxcIik7XFxuICAgIH1cXG4gICAgcmV0dXJuIFxcXCLigJzigJzigJ3igJ08Zm9udCBjb2xvcj0nXFxcIiArIGNvbG9yICsgXFxcIic+XFxcIiArIHRleHQgKyBcXFwiPC9mb250PlxcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGh0bWxUYWcodGFnLCB0ZXh0KSB7XFxuICAgIHRleHQgKz0gXFxcIlxcXCI7XFxuICAgIGlmICh0ZXh0LmluZGV4T2YoXFxcIuKAnOKAnOKAneKAnVxcXCIpID09PSAwKSB7XFxuICAgICAgICB0ZXh0LnJlcGxhY2UoXFxcIuKAnOKAnOKAneKAnVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwiPFxcXCIgKyB0YWcgKyBcXFwiPlxcXCIgKyB0ZXh0ICsgXFxcIjwvXFxcIiArIHRhZyArIFxcXCI+XFxcIjtcXG5cXG59XFxuXFxuZnVuY3Rpb24gZ2V0Tm93Rm9ybWF0RGF0ZSgpIHtcXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKCk7XFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjEgPSBcXFwiLVxcXCI7XFxuICAgICAgICAgICAgbGV0IHNlcGVyYXRvcjIgPSBcXFwiOlxcXCI7XFxuICAgICAgICAgICAgbGV0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcXG4gICAgICAgICAgICBsZXQgc3RyRGF0ZSA9IGRhdGUuZ2V0RGF0ZSgpO1xcbiAgICAgICAgICAgIGxldCBzdHJIb3VycyA9IGRhdGUuZ2V0SG91cnMoKTtcXG4gICAgICAgICAgICBsZXQgc3RyTWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpO1xcbiAgICAgICAgICAgIGxldCBzdHJTZWNvbmRzID0gZGF0ZS5nZXRTZWNvbmRzKCkrMTtcXG4gICAgICAgICAgICBpZiAobW9udGggPj0gMSAmJiBtb250aCA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIG1vbnRoID0gXFxcIjBcXFwiICsgbW9udGhcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ckRhdGUgPj0gMCAmJiBzdHJEYXRlIDw9IDkpIHtcXG4gICAgICAgICAgICAgICAgc3RyRGF0ZSA9IFxcXCIwXFxcIiArIHN0ckRhdGVcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgaWYgKHN0ckhvdXJzID49IDAgJiYgc3RySG91cnMgPD0gOSkge1xcbiAgICAgICAgICAgICAgICBzdHJIb3VycyA9IFxcXCIwXFxcIiArIHN0ckhvdXJzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJNaW51dGVzID49IDAgJiYgc3RyTWludXRlcyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0ck1pbnV0ZXMgPSBcXFwiMFxcXCIgKyBzdHJNaW51dGVzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChzdHJTZWNvbmRzID49IDAgJiYgc3RyU2Vjb25kcyA8PSA5KSB7XFxuICAgICAgICAgICAgICAgIHN0clNlY29uZHMgPSBcXFwiMFxcXCIgKyBzdHJTZWNvbmRzXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIC8vbGV0IGN1cnJlbnRkYXRlID0gZGF0ZS5nZXRGdWxsWWVhcigpICsgc2VwZXJhdG9yMSArIG1vbnRoICsgc2VwZXJhdG9yMSArIHN0ckRhdGUgKyBcXFwiIFxcXCIgKyBzdHJIb3VycyArIHNlcGVyYXRvcjIgKyBzdHJNaW51dGVzICsgc2VwZXJhdG9yMiArIHN0clNlY29uZHM7XFxuICAgICAgICAgICAgbGV0IGN1cnJlbnRkYXRlID0gKGRhdGUuZ2V0RnVsbFllYXIoKS0yMDIwKSsnJysgbW9udGggKycnKyBzdHJEYXRlICsnJysgc3RySG91cnMrJycgKyBzdHJNaW51dGVzICsnJysgTWF0aC5jZWlsKHN0clNlY29uZHMvNyk7XFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGN1cnJlbnRkYXRlKVxcbiAgICAgICAgfVxcbiQuZXhwb3J0cy5nZXROb3dGb3JtYXREYXRlID0gZ2V0Tm93Rm9ybWF0RGF0ZTtcXG4kLmV4cG9ydHMuaHRtbFRhZyA9IGh0bWxUYWc7XFxuJC5leHBvcnRzLnNtYWxsID0gZnVuY3Rpb24odGV4dCkge1xcbiAgICByZXR1cm4gaHRtbFRhZyhcXFwic21hbGxcXFwiLCB0ZXh0KTtcXG59XFxuJC5leHBvcnRzLmdldEZpbGUgPSBmdW5jdGlvbigpIHtcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIpIHx8IFxcXCJ7fVxcXCI7XFxuICAgIHRyeSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShGaWxlKTtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgcmV0dXJuIHt9O1xcbiAgICB9XFxufVxcbiQuZXhwb3J0cy5nZXRVc2VyRGF0ZSA9ZnVuY3Rpb24oKXtcXG4gICAgdmFyIEZpbGUgPSByZXF1ZXN0KFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVJBLmpzb25cXFwiKSB8fCBcXFwiW11cXFwiO1xcbiAgICB0cnkge1xcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoRmlsZSk7XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSQS5qc29uXFxcIiwgXFxcIltdXFxcIik7XFxuICAgICAgICByZXR1cm4gW107XFxuICAgIH1cXG59XFxuJC5leHBvcnRzLmV4aXN0RmlsZSA9IGZ1bmN0aW9uKHNwYXRoLCBpcGF0aCwgaGVhZGVycykge1xcbiAgICBsZXQgc2NvZGUgPSByZXF1ZXN0KHNwYXRoKTtcXG4gICAgaWYgKCFzY29kZSkge1xcbiAgICAgICAgd3JpdGVGaWxlKHNwYXRoLCByZXF1ZXN0KGlwYXRoLCBoZWFkZXJzKSk7XFxuICAgIH1cXG59XFxuXFxubGV0IG5ld0FwaSA9IHtcXG4gICAgXFxcImRpc19uZXdcXFwiOiBcXFwiL2hpa2VydWxlL25ld19ydWxlX2Rpc2N1c3MvXFxcIixcXG4gICAgXFxcImRpc192ZXJpZnlcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9nZXRfeXptXFxcIixcXG4gICAgXFxcImRpc19nZXRcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9cXFwiLFxcbiAgICBcXFwiZGlzX3NldFxcXCI6IFxcXCIvaGlrZXJ1bGUvbW9kaWZ5L2Nhbl9kaXNjdXNzL1xcXCIsXFxuICAgIFxcXCJkaXNfbmV3X3VzZXJcXFwiOiBcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9uZXdfdXNlclxcXCIsXFxuICAgIFxcXCJkaXNfbG9naW5cXFwiOlxcXCIvaGlrZXJ1bGUvcnVsZV9kaXNjdXNzL3VzZXJfbG9naW5cXFwiLFxcbiAgICBcXFwiZGlzX2Rldl9kaXNjdXNzXFxcIjpcXFwiL2hpa2VydWxlL21vZGlmeS9kZXZfY2FuX2Rpc2N1c3NcXFwiLFxcbiAgICBcXFwiZGlzX2Rldl9jb250cm9sXFxcIjpcXFwiL2hpa2VydWxlL3J1bGVfZGlzY3Vzcy9yZW1vdmUvXFxcIixcXG4gICAgXFxcImFsbF9ydWxlXFxcIjpcXFwiL2hpa2VydWxlL2dldF9ydWxlc1xcXCIsXFxuICAgIFxcXCJkaXNfZ2V0X3JlcGx5XFxcIjpcXFwiL2hpa2VydWxlL2dldF9yZXBseV9ydWxlX2Rpc2N1c3NcXFwiLFxcbiAgICBcXFwiZGlzX3JlcGx5XFxcIjpcXFwiL2hpa2VydWxlL2Rldl9uZXdfcnVsZV9kaXNjdXNzL1xcXCIsXFxufVxcblxcbmZ1bmN0aW9uIHNldEFwaShvYmplY3QpIHtcXG4gICAgbGV0IHRhcmdldCA9IHt9O1xcbiAgICBmb3IgKGxldCBrZXkgaW4gb2JqZWN0KSB7XFxuICAgICAgICB0YXJnZXRba2V5XT1ob3N0K29iamVjdFtrZXldXFxuICAgIH1cXG4gICAgcmV0dXJuIHRhcmdldDtcXG59XFxuXFxuJC5leHBvcnRzLmFwaSA9IHNldEFwaShuZXdBcGkpO1xcbiQuZXhwb3J0cy5hcGkuaG9zdD1ob3N0O1xcbiQuZXhwb3J0cy5hcGkuaG9tZT1ob21lO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5byA5Y+R6ICF55m75b2VXCIsXCJwYXRoXCI6XCJkZXZMb2dpblwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLlvIDlj5HogIXnmbvlvZVcXFwiKTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgaHRtbFRhZyxcXG4gICAgbWFwQ29sVHlwZSxcXG4gICAgc21hbGwsXFxuZ2V0RmlsZVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG52YXIgZGF0YSA9IFtdO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZVBhc3N3b3JkXFxcIik7XFxufSkpXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfotKblj7cnLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2VVc2VybmFtZScsJycpLFxcbiAgICAgICAgdHlwZTpcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2VVc2VybmFtZVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+WvhueggScsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2VQYXNzd29yZFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIiZuYnNwOyZuYnNwOzxhIGhyZWY9J2hpa2VyOi8vcGFnZS9SZWdpc3Rlcic+5rOo5YaMPC9hPlxcXCIsXFxuICAgIGNvbF90eXBlOlxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcbmxldCB1c2VyID0gZ2V0RmlsZSgpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiXFxcIiwgXFxcIueZu+W9lVxcXCIpLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgodXJsLCBmKT0+IHtcXG4gICAgICAgIGxldCB1c2VybmFtZSA9IGdldFZhcignV2FyZWhvdXNlVXNlcm5hbWUnLCAnJyksXFxuICAgICAgICAgICAgcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZVBhc3N3b3JkJywgJycpO1xcbiAgICAgICAgaWYodXNlcm5hbWUgPT09IFxcXCJcXFwiICYmIHBhc3N3b3JkID09PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+35ZKM5a+G56CB5LiN6IO95Li656m6XFxcIlxcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IG15VXJsID0gdXJsICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZDtcXG4gICAgICAgIGxldCBjb2RlX3N0ciA9IHJlcXVlc3QobXlVcmwpO1xcbiAgICAgICAgbGV0IGNvZGUgPSBKU09OLnBhcnNlKGNvZGVfc3RyKTtcXG4gICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgZi51c2VybmFtZT11c2VybmFtZTtcXG4gICAgICAgICAgICBmLnBhc3N3b3JkPXBhc3N3b3JkXFxuICAgICAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6LSm5Y+35oiW5a+G56CB6ZSZ6K+vXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSwgZ2V0QXBpKFxcXCJydWxlc0FsbFVybFxcXCIpLHVzZXIpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwiaWNvbl8yX3JvdW5kXCIsXCJuYW1lXCI6XCLlvIDlj5HogIXnrqHnkIZcIixcInBhdGhcIjpcImRldk1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLop4TliJnnrqHnkIZcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICdjbGVhclZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLFxcXCJcXFwiKTsnKTtcXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjaygpO1xcbn1cXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgY29sb3IsXFxuICAgIHNtYWxsLFxcbiAgICBnZXRGaWxlLFxcbiAgICBleGlzdEZpbGUsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIGFwaVxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5sZXQge1xcbiAgICBkZXZcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB7XFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG59ID0gZ2V0RmlsZSgpO1xcbi8vZXhpc3RGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXCIsIFxcXCJodHRwczovL2VycC5zY3dpbmJhby5jb20vaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD01MzlcXFwiKTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJydWxlc0FsbFVybFxcXCIpICsgJz9xcT0nICsgdXNlcm5hbWUgKyAnJnBhc3N3b3JkPScgKyBwYXNzd29yZCkpLnJlc3VsdDtcXG5sZXQgTU9CSUxFX1VBID0gJ01vemlsbGEvNS4wIChMaW51eDsgQW5kcm9pZCA1LjA7IFNNLUc5MDBQIEJ1aWxkL0xSWDIxVCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg4LjAuNDMyNC4xNDYgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbmxldCBpbmZvU2V0VXJsID0gZ2V0QXBpKFxcXCJpbmZvU2V0VXJsXFxcIik7XFxubGV0IGluZm9HZXRVcmwgPSBnZXRBcGkoXFxcImluZm9HZXRVcmxcXFwiKSArIHVzZXJuYW1lO1xcbmxldCBzZXR0aW5nc0dldFVybCA9IGdldEFwaShcXFwic2V0dGluZ3NHZXRVcmxcXFwiKSArIHVzZXJuYW1lO1xcbnB1dE15VmFyKFxcXCJkZXZfc2V0X2luZm9cXFwiLCBbdXNlcm5hbWUsIHBhc3N3b3JkLCBpbmZvU2V0VXJsLCBNT0JJTEVfVUEsIGluZm9HZXRVcmxdLmpvaW4oXFxcIiQkXFxcIikpO1xcbmxldCBkYXRhID0gW107XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08YmlnPuS7k+W6k+iuvue9rjwvYmlnPiZuYnNwOyZuYnNwOyZuYnNwOzxzbWFsbD48dT7vvIgg5Liq5Lq66LWE5paZID7vvIk8L3U+PC9zbWFsbD4nLFxcbiAgICBkZXNjOiAn4oCc4oCc4oCd4oCd5oKo5YWx5pyJIDxzcGFuIHN0eWxlPVxcXCJjb2xvcjogI2ZmNzAwMFxcXCI+JyArIHJ1bGVMaXN0Lmxlbmd0aCArICc8L3NwYW4+JyArIFxcXCIg5p2h6KeE5YiZ44CCXFxcXG7ngrnlh7vop4TliJnlj6/ov5vooYzliIbkuqvjgIHliKDpmaTjgIHlr7zlhaXmk43kvZzlj4rmn6XnnIvor6bmg4VcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntpZDpkZXYuaWR9LFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lXFxcIiwgMik7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLmm7TmlLnlhazlkYrinI1cXFwiLCBcXFwiIzM0YjFmZlxcXCIpKSxcXG4gICAgLy8gdXJsOiBcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZWRpdC5odG1sXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2RldkluZm9FZGl0XFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLmm7TlpJrliIbkuqvwn5OyXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIC8vdXJsOiBcXFwieDU6Ly9maWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5byA5Y+R6ICF5YiG5LqrLmh0bWxcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbW9yZVNoYXJlXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IHNtYWxsKGNvbG9yKFxcXCLljYfnuqfkvp3otZbwn5OlXFxcIiwgXFxcIiMzNGIxZmZcXFwiKSksXFxuICAgIHVybDogJChcXFwi5Y2H57qn5Lya6YeN5paw5LuO5LuT5bqT5ouJ5Y+W55u45YWz55qE6Z2Z5oCB6aG16Z2i5Yiw5pys5ZywXFxcXG7noa7orqTljYfnuqflkJc/XFxcIikuY29uZmlybSgoaG9zdCkgPT4ge1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC/lvIDlj5HogIXliIbkuqsuaHRtbFxcXCIsIHJlcXVlc3QoaG9zdCsnL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTM5JykpO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL2R6SG91c2UvaHRtbC9kZXZfaW5mb19lZGl0Lmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwMicpKTtcXG4gICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9kekhvdXNlL2h0bWwvZGV2X2luZm9fZ2V0Lmh0bWxcXFwiLCByZXF1ZXN0KGhvc3QrJy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTQwNCcpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lph43nva7lvIDlj5HogIXliIbkuqss566A5LuL5p+l55yLLOeugOS7i+e8lui+keetiemdmeaAgeaWh+S7tlxcXCI7XFxuICAgIH0sYXBpLmhvc3QpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMydcXG59KTtcXG5sZXQgZGV2U2V0QmFjaztcXG50cnkge1xcbiAgICBkZXZTZXRCYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KHNldHRpbmdzR2V0VXJsKSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkZXZTZXRCYWNrID0ge307XFxufVxcblxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljKSB7XFxuICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2sgPSByZXF1ZXN0KHVybCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBtc2dbMF07XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIG1zZ1sxXSArIFxcXCJcXFxcblxcXCIgKyByZXQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGJhc2ljLnVybCwgYmFzaWMubXNnKVxcbiAgICB9O1xcbiAgICByZXR1cm4gdGVtcDtcXG59XFxuaWYgKGRldlNldEJhY2suc3RhdHVzID09IDApIHtcXG4gICAgbGV0IGRldlNldHRpbmdzID0gZGV2U2V0QmFjay5yZXN1bHQ7XFxuICAgIGxldCBzaGFyZSA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3Muc2hhcmVfcHVibGljKSB7XFxuICAgICAgICBzaGFyZS50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLlhazlvIDkuIrkvKBcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo56eB6JePKVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgc2hhcmUudXJsID0gZ2V0QXBpKFxcXCJndXBsb2FkXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkICsgXFxcIiZmbGFnPTFcXFwiO1xcbiAgICAgICAgc2hhcmUuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTnp4Hol4/ku6XlkI7mj5DkuqTnmoTop4TliJk/XFxcIjtcXG4gICAgICAgIHNoYXJlLm1zZyA9IFtcXFwi5bey56eB6JePXFxcIiwgXFxcIuengeiXj+Wksei0pVxcXCJdO1xcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgc2hhcmUudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi56eB5a+G5LiK5LygXFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijlhazlvIApXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICBzaGFyZS51cmwgPSBnZXRBcGkoXFxcImd1cGxvYWRcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxuICAgICAgICBzaGFyZS5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOWFrOW8gOS7peWQjuaPkOS6pOeahOinhOWImT9cXFwiO1xcbiAgICAgICAgc2hhcmUubXNnID0gW1xcXCLlt7LlhazlvIBcXFwiLCBcXFwi5YWs5byA5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKHNoYXJlKSk7XFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3MudGltZV9vdmVyKSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLnn63ml7bnp5jpkqVcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo5rC45LmFKVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgdGltZU92ZXIudXJsID0gZ2V0QXBpKFxcXCJndGltZW92ZXJcXFwiKSArIFxcXCI/cXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQgKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICB0aW1lT3Zlci5jb25maXJtID0gXFxcIuaYr+WQpuehruiupOS7peWQjueahOengeiXj+inhOWImeWIhuS6q+S4jei/h+acnz9cXFwiO1xcbiAgICAgICAgdGltZU92ZXIubXNnID0gW1xcXCLlt7Lorr7kuLrmsLjkuYVcXFwiLCBcXFwi6K6+5Li65rC45LmF5aSx6LSlXFxcIl07XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLmsLjkuYXnp5jpkqVcXFwiLCBcXFwicmVkXFxcIikgKyBjb2xvcihcXFwiKOi/h+acnylcXFwiLCBcXFwiI2FkZmYyZlxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwiZ3RpbWVvdmVyXFxcIikgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkO1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li66L+H5pyfXFxcIiwgXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcbiAgICBsZXQgZGlzY3VzcyA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIlxcbiAgICB9O1xcbiAgICBpZiAoZGV2U2V0dGluZ3MuY2FuX2Rpc2N1c3MpIHtcXG4gICAgICAgIGRpc2N1c3MudGl0bGUgPSBzbWFsbChjb2xvcihcXFwi5YWB6K646K+E6K66XFxcIiwgXFxcInJlZFxcXCIpICsgY29sb3IoXFxcIijkuI3orrgpXFxcIiwgXFxcIiNhZGZmMmZcXFwiKSk7XFxuICAgICAgICBkaXNjdXNzLnVybCA9IGFwaS5kaXNfZGV2X2Rpc2N1c3MgKyBcXFwiP3FxPVxcXCIgKyB1c2VybmFtZSArIFxcXCImcGFzc3dvcmQ9XFxcIiArIHBhc3N3b3JkKyBcXFwiJmZsYWc9MVxcXCI7XFxuICAgICAgICBkaXNjdXNzLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO5LiK5Lyg55qE6KeE5YiZ5YWB6K646K+E6K66P1xcXCI7XFxuICAgICAgICBkaXNjdXNzLm1zZyA9IFtcXFwi5bey6K6+5Li65LiN6K64XFxcIiwgXFxcIuiuvue9ruWksei0pVxcXCJdO1xcblxcbiAgICB9IGVsc2Uge1xcbiAgICAgICAgZGlzY3Vzcy50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLkuI3orrjor4TorrpcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo5YWB6K64KVxcXCIsIFxcXCIjMDBiZmZmXFxcIikpO1xcbiAgICAgICAgZGlzY3Vzcy51cmwgPSBhcGkuZGlzX2Rldl9kaXNjdXNzICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG4gICAgICAgIGRpc2N1c3MuY29uZmlybSA9IFxcXCLmmK/lkKbnoa7orqTku6XlkI7kuIrkvKDnmoTop4TliJnlhYHorrjor4Torro/XFxcIjtcXG4gICAgICAgIGRpc2N1c3MubXNnID0gW1xcXCLlt7Lorr7kuLrlhYHorrhcXFwiLCBcXFwi6K6+572u5aSx6LSlXFxcIl07XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHNldFNldHRpbmdJdGVtKGRpc2N1c3MpKTtcXG59XFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZVxcXCIsIDIpO1xcbmZvciAobGV0IGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgbGV0IG15X3RfZXhjb2RlMSA9ICcnO1xcbiAgICBsZXQgbXlfdF9leGNvZGUyID0gJyc7XFxuICAgIGlmIChpdGVtLnN0YXRlICE9ICdwdWJsaWMnKSB7XFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJ+OKme+4jyc7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBteV90X2V4Y29kZTEgKz0gJyc7XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBteV90X2V4Y29kZTEgKyBpdGVtLm5hbWUgKyBteV90X2V4Y29kZTIsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvbWFuYWdlUnVsZSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogaXRlbS5pZCxcXG4gICAgICAgICAgICAvL3VzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgICAgICAvL3Bhc3N3b3JkOiBwYXNzd29yZFxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KVxcbn1cXG5pZiAocnVsZUxpc3QubGVuZ3RoID09PSAwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIjxoNSBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPuW/q+adpeS4iuS8oOS9oOeahOesrOS4gOadoeinhOWImeWQp++8gTwvaDU+XFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbiAgICB9KTtcXG59XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeE5YiZ6K+m57uGLWRldlwiLFwicGF0aFwiOlwibWFuYWdlUnVsZVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgZ2V0RmlsZSxcXG4gICAgZXhpc3RGaWxlLFxcbiAgICBtYXBDb2xUeXBlLFxcbiAgICBodG1sVGFnLFxcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWRcXG59ID0gTVlfUEFSQU1TO1xcbmxldCB7XFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG59ID0gZ2V0RmlsZSgpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG59KSk7XFxubGV0IGRhdGFJdGVtID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiZ2V0YnlpZFxcXCIpICsgXFxcIj9pZD1cXFwiICsgaWQpKS5yZXN1bHQ7XFxuc2V0UGFnZVRpdGxlKFxcXCLnvJbovpHjgIxcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgI1cXFwiKTtcXG5sZXQgcmVxQnlHZXQgPSBcXFwiP2lkPVxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCImcXE9XFxcIiArIHVzZXJuYW1lICsgXFxcIiZwYXNzd29yZD1cXFwiICsgcGFzc3dvcmQ7XFxubGV0IHJ1bGVMaXN0SnNvbiA9IGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCI7XFxubGV0IGRhdGEgPSBbXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIueJiOacrFxcXCIpLFxcbiAgICBkZXNjOiBcXFwi4oCc4oCc4oCd4oCd5LqR56uv54mI5pysOlxcXCIgKyBjb2xvcihkYXRhSXRlbS52ZXIsIFxcXCIjNWNmZjJjXFxcIikgKyBcXFwiXFxcXG7kuIrmrKHmj5DkuqTkuo46IFtcXFwiICsgY29sb3IoZGF0YUl0ZW0ubGFzdF91cGRhdGUsIFxcXCIjZmY3MDAwXFxcIikgKyBcXFwiXVxcXCIsXFxuICAgIHVybDogJChcXFwiPOW8gOWPkeiAhT5cXFxcblxcXCIgKyBkYXRhSXRlbS5hdXRob3IgKyBcXFwiXFxcXG485ZCN56ewPlxcXFxuXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwiXFxcXG485LqR56uv54mI5pysPlxcXFxuXFxcIiArIGRhdGFJdGVtLnZlciArIFxcXCJcXFxcbjzmm7TmlrDml7bpl7Q+XFxcXG5bXFxcIiArIGRhdGFJdGVtLmxhc3RfdXBkYXRlICsgXFxcIl1cXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnXFxufSk7XFxubGV0IGRhdGFUeXBlID0ge1xcbiAgICBob21lX3J1bGVfdXJsOiAn6aaW6aG15LqR6KeE5YiZJyxcXG4gICAgcHVibGlzaDogJ+aPkOS6pOS6keS7k+W6k+inhOWImScsXFxuICAgIGpzX3VybDogJ+e9kemhteaPkuS7tuinhOWImScsXFxuICAgIGh0bWw6ICfpnZnmgIHpobXpnaInLFxcbiAgICBjb25maWc6ICfkuLvpobXphY3nva4nXFxufTtcXG5cXG5sZXQgYmFzaWMgPSB7XFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59O1xcbmxldCBkYXRhVHlwZVRpcHMgPSBkYXRhVHlwZVtkYXRhSXRlbS5kYXRhX3R5cGVdIHx8ICfmnKrnn6Xop4TliJk6JyArIGRhdGFJdGVtLmRhdGFfdHlwZTtcXG5cXG5iYXNpYy50aXRsZSA9IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLnsbvlnotcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoXFxcIihpZDpcXFwiICsgZGF0YUl0ZW0uaWQgKyBcXFwiKVxcXCIpO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcbmxldCBhdXRoID0gXFxcIlxcXCI7XFxuaWYgKGRhdGFJdGVtLnN0YXRlID09IFxcXCJwcml2YXRlXFxcIikge1xcbiAgICBsZXQgYXV0aF9iYWNrID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiYXV0aFxcXCIpICsgcmVxQnlHZXQpKTtcXG4gICAgYmFzaWMudGl0bGUgPSBiYXNpYy50aXRsZSArIFxcXCJcXFxcblxcXCIgKyBzbWFsbChjb2xvcihhdXRoX2JhY2sucmVzdWx0LCBcXFwiZ3JleVxcXCIpKTtcXG4gICAgYXV0aCA9ICcmYXV0aD0nICsgYXV0aF9iYWNrLnJlc3VsdDtcXG4gICAgYmFzaWMudXJsID0gYmFzaWMudXJsID09PSBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIgPyBiYXNpYy51cmwgOiBiYXNpYy51cmwgKyBhdXRoO1xcbn1cXG5kYXRhLnB1c2goYmFzaWMpO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi5pON5L2cXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwidG9hc3Q6Ly/kvaDmiY3mmK/mnIDluIXnmoTpgqPkuKrkurrvvIFcXFwiXFxufSk7XFxubGV0IGltcG9ydFVybCwgcnVsZUNvZGUsIHNoYXJlVXJsLCBiYWNrQ29kZSA9IFxcXCJcXFwiO1xcbmlmICghZGF0YUl0ZW0uaXNfanNvbikge1xcbiAgICBiYWNrQ29kZSA9IHJlcXVlc3QocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoKTtcXG59XFxuc3dpdGNoIChkYXRhSXRlbS5kYXRhX3R5cGUpIHtcXG4gICAgY2FzZSBcXFwiaG9tZV9ydWxlX3VybFxcXCI6XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzpppbpobXpopHpgZPop4TliJnjgJBcXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCLjgJHvv6Vob21lX3J1bGVfdXJs77+lXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkICsgYXV0aDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyBhdXRoO1xcbiAgICAgICAgaW1wb3J0VXJsID0gJ3J1bGU6Ly8nICsgYmFzZTY0RW5jb2RlKHJ1bGVDb2RlKTtcXG4gICAgICAgIGJyZWFrXFxuICAgIGNhc2UgXFxcImNvbmZpZ1xcXCI6XFxuICAgICAgICBpbXBvcnRVcmwgPSAkKCkucnVsZShwYXNzd29yZCA9PiB7XFxuICAgICAgICAgICAgZXZhbChmZXRjaChcXFwiaGlrZXI6Ly9hc3NldHMvaG9tZS5qc1xcXCIpKTtcXG4gICAgICAgICAgICBIaWtlckhvbWUubG9hZChcXFwiaW1wb3J0XFxcIiwgcGFzc3dvcmQpO1xcbiAgICAgICAgfSwgYmFja0NvZGUpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbmxldCBteV9jb2xfdHlwZSA9IFxcXCJ0ZXh0XzJcXFwiO1xcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5a+85YWl6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogaW1wb3J0VXJsLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr6KeE5YiZXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNldHRpbmdJdGVtKGJhc2ljLCBwYXR0ZXJuKSB7XFxuICAgIGxldCB0ZW1wID0ge1xcbiAgICAgICAgdGl0bGU6IGJhc2ljLnRpdGxlLFxcbiAgICAgICAgY29sX3R5cGU6IGJhc2ljLmNvbF90eXBlLFxcbiAgICAgICAgdXJsOiAkKGJhc2ljLmNvbmZpcm0pLmNvbmZpcm0oKHVybCwgbXNnLCBwYXR0ZXJuKSA9PiB7XFxuICAgICAgICAgICAgbGV0IGJhY2tBID0gcmVxdWVzdCh1cmwpO1xcbiAgICAgICAgICAgIGxldCByZXQgPSBKU09OLnBhcnNlKGJhY2tBKTtcXG4gICAgICAgICAgICBpZiAocmV0LnN0YXR1cyA9PSAwKSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzBdO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gPyBiYWNrKCkgOiByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgbXNnWzFdICsgXFxcIlxcXFxuXFxcIiArIHJldC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgYmFzaWMudXJsLCBiYXNpYy5tc2csIHBhdHRlcm4pXFxuICAgIH07XFxuICAgIHJldHVybiB0ZW1wO1xcbn1cXG5pZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3ByaXZhdGUnKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuiuvuS4uuWFrOW8gFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJzaGFyZVxcXCIpICsgcmVxQnlHZXQgKyBcXFwiJmZsYWdcXFwiICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey6K6+5Li65YWs5byAXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0sIHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6ZqP5py65a+G6ZKlXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZSxcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcImdlbkF1dGhcXFwiKSArIHJlcUJ5R2V0ICsgXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBiYWNrID0gcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHJldCA9IEpTT04ucGFyc2UoYmFjayk7XFxuICAgICAgICAgICAgaWYgKHJldC5zdGF0dXMgPT0gMCkge1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7LnlJ/miJDpmo/mnLrlr4bnoIFcXFxcblxcXCIgKyByZXQucmVzdWx0XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pmo/mnLrlr4bnoIHnlJ/miJDlpLHotKVcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSlcXG4gICAgfSk7XFxuICAgIGxldCB0aW1lT3ZlciA9IHtcXG4gICAgICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbiAgICB9O1xcbiAgICBpZiAoZGF0YUl0ZW0udGltZV9vdmVyKSB7XFxuICAgICAgICB0aW1lT3Zlci50aXRsZSA9IHNtYWxsKGNvbG9yKFxcXCLnn63ml7blr4bpkqVcXFwiLCBcXFwiZ3JlZW5cXFwiKSArIGNvbG9yKFxcXCIo4oaS5rC45LmFKVxcXCIsIFxcXCJyZWRcXFwiKSk7XFxuICAgICAgICB0aW1lT3Zlci51cmwgPSBnZXRBcGkoXFxcInRpbWVvdmVyXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZz0xXFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLmNvbmZpcm0gPSBcXFwi5piv5ZCm56Gu6K6k5Lul5ZCO55qE56eB6JeP6KeE5YiZ5YiG5Lqr5LiN6L+H5pyfP1xcXCI7XFxuICAgICAgICB0aW1lT3Zlci5tc2cgPSBbXFxcIuW3suiuvuS4uuawuOS5hVxcXCIsIFxcXCLorr7kuLrmsLjkuYXlpLHotKVcXFwiXTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHRpbWVPdmVyLnRpdGxlID0gc21hbGwoY29sb3IoXFxcIuawuOS5heWvhumSpVxcXCIsIFxcXCJyZWRcXFwiKSArIGNvbG9yKFxcXCIo4oaS55+t5pe2KVxcXCIsIFxcXCJncmVlblxcXCIpKTtcXG4gICAgICAgIHRpbWVPdmVyLnVybCA9IGdldEFwaShcXFwidGltZW92ZXJcXFwiKSArIHJlcUJ5R2V0O1xcbiAgICAgICAgdGltZU92ZXIuY29uZmlybSA9IFxcXCLnoa7orqTopoHku6XlkI7liIbkuqvnmoTnp4Hol4/op4TliJnoh6rliqjliLDmnJ8/XFxcIjtcXG4gICAgICAgIHRpbWVPdmVyLm1zZyA9IFtcXFwi5bey6K6+5Li66L+H5pyfXFxcIiwgXFxcIuiuvuS4uui/h+acn+Wksei0pVxcXCJdO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh0aW1lT3ZlcikpO1xcbn0gZWxzZSBpZiAoZGF0YUl0ZW0uc3RhdGUgPT0gJ3B1YmxpYycpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6+5Li656eB5pyJXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcInNoYXJlXFxcIikgKyByZXFCeUdldCArIFxcXCImZmxhZz0xI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcmVxdWVzdChpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lt7Lorr7kuLrnp4HmnIlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaChzZXRTZXR0aW5nSXRlbSh7XFxuICAgIHRpdGxlOiBcXFwi5Yig6Zmk5pWw5o2uXFxcIixcXG4gICAgY29uZmlybTogXFxcIuaYr+WQpuehruiupOWIoOmZpFxcXCIsXFxuICAgIG1zZzogW1xcXCLlt7LliKDpmaRcXFwiLCBcXFwi5Yig6Zmk5aSx6LSlXFxcIl0sXFxuICAgIHVybDogZ2V0QXBpKFxcXCJkZWxldGVVcmxcXFwiKSArIHJlcUJ5R2V0LFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59LCB0cnVlKSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7lm77moIdcXFwiLFxcbiAgICB1cmw6ICQoZGF0YUl0ZW0ucGljX3VybCwgXFxcIui+k+WFpeWbvuagh+WcsOWdgFxcXCIpLmlucHV0KGFwaSA9PiB7XFxuICAgICAgICBpZiAoaW5wdXQgPT09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOWcqOmAl+aIkemTvuaOpeWTqj9cXFwiXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGkgKyBcXFwiJnJ1bGVfcGljPVxcXCIgKyBpbnB1dCk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCk7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv67mlLnmiJDlip9cXFwiO1xcbiAgICB9LCBnZXRBcGkoXFxcInNldF9ydWxlX3BpY1xcXCIpICsgZGF0YUl0ZW0uaWQgKyByZXFCeUdldCksXFxuICAgIGNvbF90eXBlOiBteV9jb2xfdHlwZVxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBkYXRhSXRlbS5jYW5fZGlzY3VzcyA/IFxcXCLnpoHmraLor4TorrpcXFwiIDogXFxcIuW8gOWQr+ivhOiuulxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX3NldCArIGRhdGFJdGVtLmlkICsgcmVxQnlHZXQgKyBcXFwiJnN0YXRlPVxcXCIgKyAoZGF0YUl0ZW0uY2FuX2Rpc2N1c3MgPyBcXFwiXFxcIiA6IDEpKS5sYXp5UnVsZSgoY2FuX2Rpc2N1c3MpID0+IHtcXG4gICAgICAgIHJlcXVlc3QoaW5wdXQpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIGNhbl9kaXNjdXNzID8gXFxcInRvYXN0Oi8v5bey56aB5q2i6K+E6K66XFxcIiA6IFxcXCJ0b2FzdDovL+W3suW8gOWQr+ivhOiuulxcXCI7XFxuICAgIH0sIGRhdGFJdGVtLmNhbl9kaXNjdXNzKSxcXG4gICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxufSk7XFxuTVlfUEFSQU1TLm5hbWUgPSBkYXRhSXRlbS5uYW1lO1xcbk1ZX1BBUkFNUy51c2VybmFtZT11c2VybmFtZTtcXG5NWV9QQVJBTVMucGFzc3dvcmQ9cGFzc3dvcmQ7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLorr7nva7lpIfms6hcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2Uvc2V0X3J1bGVfbm90ZXNcXFwiLFxcbiAgICBleHRyYTogTVlfUEFSQU1TLFxcbiAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG59KTtcXG5pZiAoZGF0YUl0ZW0uaXNfanNvbiAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIiAmJiAhZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogJ+i/m+WFpemikemBkycsXFxuICAgICAgICB1cmw6ICQoIC8qXFxcIiNub0xvYWRpbmcjXFxcIiovICkubGF6eVJ1bGUoKG5hbWUsaG9tZSkgPT4ge1xcbiAgICAgICAgICAgIGxldCBydWxlTGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChob21lKSk7XFxuICAgICAgICAgICAgbGV0IGhhc1J1bGUgPSBydWxlTGlzdC5zb21lKGl0ZW0gPT4gaXRlbS50aXRsZSA9PT0gbmFtZSk7XFxuICAgICAgICAgICAgaWYgKGhhc1J1bGUpIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGhvbWUrXFxcInNAXFxcIiArIG5hbWU7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acquWuieijhVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSwgZGF0YUl0ZW0ubmFtZSxhcGkuaG9tZSksXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uYmFkX251bSxcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/ouKkuc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6K+E6K66XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vZmlsZXMvaWNvbi/or4Torrouc3ZnXFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzNcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvUmVwbHkjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHJ1bGVJZDogZGF0YUl0ZW0uaWQsXFxuICAgICAgICBuYW1lOiBkYXRhSXRlbS5hdXRob3IsXFxuICAgICAgICBwYXNzd29yZDogcGFzc3dvcmQsXFxuICAgICAgICB1c2VybmFtZTogdXNlcm5hbWVcXG4gICAgfVxcbn0pO1xcbmxldCB0b3RhbFN1bSA9IGRhdGFJdGVtLmdvb2RfbnVtICsgZGF0YUl0ZW0uYmFkX251bTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuivhOiuuihcXFwiICsgdG90YWxTdW0gKyBcXFwiKVxcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChodG1sVGFnKFxcXCJ1XFxcIiwgXFxcIuafpeeci+WFqOmDqOivhOiuuijmjqfor4QpID5cXFwiKSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXG4gICAgICAgIG5vX2FjdGl2ZTogdHJ1ZSxcXG4gICAgICAgIHVzZXJuYW1lOiB1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZFxcbiAgICB9XFxufSk7XFxuLy9jb25zdCBsb25nZXN0U3VtPTEyMDtcXG5sZXQgaWNvbiA9IHtcXG4gICAgXFxcImdvb2RcXFwiOiBcXFwi8J+RjVxcXCIsXFxuICAgIFxcXCJiYWRcXFwiOiBcXFwi8J+RjlxcXCIsXFxuICAgIFxcXCJyZXBseVxcXCI6IFxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcIj9saW1pdD01XFxcIikpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9SZXBseVxcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLFxcbiAgICAgICAgICAgICAgICB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDogaXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG59XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcImljb25fMl9yb3VuZFwiLFwibmFtZVwiOlwi6KeE5YiZ5YiX6KGoXCIsXCJwYXRoXCI6XCJydWxlc1wiLFwicnVsZVwiOlwianM6XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCQudG9TdHJpbmcoKCk9PntcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIpO1xcbiAgICBpZihnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJywnJykpe1xcbiAgICAgICAgbG9nKCfmk43kvZzov4fnpoHmraLkuIrkvKA6JytnZXRWYXIoJ1dhcmVob3VzZS5jYW5fdXBsb2FkJykpO1xcbiAgICAgICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5jYW5fdXBsb2FkXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZSh0cnVlKTtcXG4gICAgfVxcbn0pKTtcXG5cXG5pZiAoZ2V0VmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpID09PSBcXFwiMVxcXCIpIHtcXG4gICAgYmFjayhmYWxzZSk7XFxufVxcblxcbmNvbnN0IHtcXG4gICAgZ2V0QXBpLFxcbiAgICBhcGksXFxuICAgIGNvbG9yLFxcbiAgICBzbWFsbCxcXG4gICAgbG9jYWxSdWxlVmVyLFxcbiAgICBodG1sVGFnLFxcbiAgICBtZFxcbn0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG5jb25zdCB7IG1lcmdlU29ydCB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCB7XFxuICAgIGF2YXRhclVybCxcXG4gICAgcXEsXFxuICAgIGlkLFxcbiAgICBjYW5fdXBsb2FkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgZGF0YVR5cGUgPSBnZXRWYXIoXFxcIldhcmVob3VzZS50eXBlXFxcIixcXFwiXFxcIik7XFxubGV0IGJhY2tDb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZXNVcmxcXFwiKSArIFxcXCI/bmFtZT1cXFwiICsgcXErXFxcIiZkYXRhX3R5cGU9XFxcIitkYXRhVHlwZSkpO1xcbmxldCBkZXZOYW1lID0gYmFja0NvZGUuZGV2X25hbWU7XFxucHV0VmFyKFxcXCJXYXJlaG91c2UuZmlsdGVyXFxcIiwgZGV2TmFtZSk7XFxubGV0IHJ1bGVMaXN0ID0gYmFja0NvZGUucmVzdWx0O1xcbmxldCBzdWJVcmwgPSBnZXRBcGkoXFxcImpzb25MaXN0XFxcIikgKyBcXFwiP25hbWU9XFxcIiArIHFxO1xcbmxldCBoYXNTdWIgPSBoYXNIb21lU3ViKHN1YlVybCk7XFxubGV0IGRldkluZm8gPSBcXFwi6L+Z5Liq5Lq65b6I5oeSLOS7gOS5iOmDveayoeWGmeWTpn5cXFwiO1xcbmxldCB0bXBKc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwiaW5mb0dldFVybFxcXCIpICsgcXEpKTtcXG5pZiAodG1wSnNvbi5zdGF0dXMgPT0gMCkge1xcbiAgICBkZXZJbmZvID0gdG1wSnNvbi5yZXN1bHQgfHwgZGV2SW5mbztcXG59XFxubGV0IHN1YkZsYWcgPSBoYXNTdWIgPyAn8J+GlycgOiAn8J+ToSc7XFxubGV0IGRhdGEgPSBbXTtcXG5yZXF1aXJlKG1kKTtcXG5kZXZJbmZvPW1hcmtlZC5wYXJzZShkZXZJbmZvKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBkZXZOYW1lICsgXFxcIlxcXFxuXFxcXG5cXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLngrnlh7vmn6XnnIvlrozmlbTlhazlkYpcXFwiKSksXFxuICAgIGRlc2M6IHNtYWxsKGRldkluZm8pLFxcbiAgICB1cmw6ICdoaWtlcjovL3BhZ2UvaW5mbycsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0ZXh0OiBkZXZJbmZvLFxcbiAgICAgICAgbmFtZTogZGV2TmFtZSxcXG4gICAgICAgIHR5cGU6XFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSxcXG4gICAgcGljX3VybDogYXZhdGFyVXJsLFxcbiAgICBjb2xfdHlwZTogJ21vdmllXzFfdmVydGljYWxfcGljJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7orqLpmIXnrqHnkIY8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOW9k+WJjVxcXCIgKyAoaGFzU3ViID8gXFxcIuW3suiuoumYhVxcXCIgOiBcXFwi5pyq6K6i6ZiFXFxcIikgKyBcXFwiKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxuXFxubGV0IHN1Yl9jb2RlID0gJ+a1t+mYlOinhueVjOWQiOmbhuinhOWImeiuoumYhe+/pWhvbWVfc3Vi77+lJyArIGRldk5hbWUgKyBcXFwi5ZCI6ZuGQEBcXFwiICsgc3ViVXJsO1xcbmxldCBydWxlc0NvZGUgPSAn5rW36ZiU6KeG55WM5ZCI6ZuG6KeE5YiZ77+laG9tZV9ydWxlX3VybO+/pScgKyBzdWJVcmw7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuS4gOmUruiuoumYhTwvc3Bhbj4nLFxcbiAgICBkZXNjOiAn6K6i6ZiF4oCc4oCc4oCd4oCdPHNwYW4gc3R5bGU9XFxcImNvbG9yOiAjNWNmZjJjXFxcIj4nICsgZGV2TmFtZSArICc8L3NwYW4+55qE5omA5pyJ5Y2V6KeE5YiZ77yM5ZCI6ZuG6ZyA5Y2V54us6K6i6ZiFJyxcXG4gICAgdXJsOiBzdWJfY29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpeWFqOmDqDwvc3Bhbj4nLFxcbiAgICB1cmw6IHJ1bGVzQ29kZSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzMnXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZGV2TmFtZSxzdWJVcmwsYXZhdGFyVXJsKT0+e1xcbiAgICAgICAgY29uc3Qge2dlblJ1bGV9PSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2dlbkFwaVxcXCIpO1xcbiAgICAgICAgbG9nKFxcXCLovbvlkIjpm4blm77moIfpk77mjqU6XFxcIithdmF0YXJVcmwpO1xcbiAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoXFxcIui9u+WQiOmbhi5cXFwiK2Rldk5hbWUsc3ViVXJsLGF2YXRhclVybCk7XFxuICAgICAgICAvL2NvcHkoaW1wb3J0X3J1bGUpO1xcbiAgICAgICAgbGV0IHJ1bGVDb2RlPXBhcnNlUGFzdGUoaW1wb3J0X3J1bGUuc3BsaXQoXFxcIlxcXFxuXFxcIilbMF0pO1xcbiAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgcmV0dXJuIGltcG9ydFVybFxcbiAgICB9LGRldk5hbWUsc3ViVXJsLGF2YXRhclVybCksXFxuICAgIGNvbF90eXBlOiAndGV4dF8zJ1xcbn0pO1xcbmxldCBjYW5fdXBsb2FkX2FwaSA9IGdldEFwaShcXFwibWFuQ2FuVXBsb2FkXFxcIikraWQ7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBsZXQgdGlwcyA9IGNhbl91cGxvYWQ/J+iDvSc6J+WQpic7XFxuICAgIC8vIGxvZygndGlwczonK3RpcHMpO1xcbiAgICAvLyBsb2coJ2Nhbl91cGxvYWQ6JytjYW5fdXBsb2FkKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifimqDog73lkKbkuIrkvKA6JysoZ2V0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcpfHx0aXBzKSxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDonaGlrZXI6Ly9lbXB0eSdcXG4gICAgfSk7XFxuICAgIGZ1bmN0aW9uIHNldFVwbG9hZChmbGFnLGNhbl91cGxvYWRfYXBpKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChjYW5fdXBsb2FkX2FwaSwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcIlVzZXItQWdlbnRcXFwiOiBNT0JJTEVfVUF9LFxcbiAgICAgICAgICAgICAgICBib2R5OiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjpcXG4gICAgICAgICAgICAgICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJ1c2VybmFtZVxcXCI6IGdldFZhcignaG91c2UudXNlcm5hbWUnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZ2V0VmFyKCdob3VzZS5wYXNzd29yZCcpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwiY2FuX3VwbG9hZFxcXCI6ICEhZmxhZ1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIGNvZGUgPSBKU09OLnBhcnNlKGNvZGUpLnJlc3VsdDtcXG4gICAgICAgICAgICBpZiAoY29kZS5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGNvZGUuZGV0YWlsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBlLm1lc3NhZ2VcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J/CfmqvnpoHmraLkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+emgeatouivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZChmYWxzZSxjYW5fdXBsb2FkX2FwaSk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHB1dFZhcignV2FyZWhvdXNlLmNhbl91cGxvYWQnLCflkKYnKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0saWQsY2FuX3VwbG9hZF9hcGksc2V0VXBsb2FkKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifinIXlhYHorrjkuIrkvKAnLFxcbiAgICAgICAgY29sX3R5cGU6J3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgdXJsOiQoJ+WFgeiuuOivpeW8gOWPkeiAheS4iuS8oOinhOWImT/kvaDnmoTmk43kvZzlsIbooqvns7vnu5/orrDlvZUnKS5jb25maXJtKChpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldFVwbG9hZCh0cnVlLGNhbl91cGxvYWRfYXBpKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdXYXJlaG91c2UuY2FuX3VwbG9hZCcsJ+aYrycpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxpZCxjYW5fdXBsb2FkX2FwaSxzZXRVcGxvYWQpXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwicmljaF90ZXh0XFxcIlxcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiPGJpZz7op4TliJnliJfooag8L2JpZz4mbmJzcDsmbmJzcDs8c21hbGw+KOWFsVxcXCIgKyBydWxlTGlzdC5sZW5ndGggKyBcXFwi5p2hKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxufSk7XFxubGV0IGRhdGFUeXBlTGlzdCA9IHtcXG4gICAgXFxcIlxcXCI6XFxcIuWFqOmDqFxcXCIsXFxuICAgIFxcXCJob21lX3J1bGVfdXJsXFxcIjogJ+Wwj+eoi+W6jycsXFxuICAgIC8vXFxcInB1Ymxpc2hcXFwiOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAgXFxcImpzX3VybFxcXCI6ICfnvZHpobXmj5Lku7YnLFxcbiAgICBcXFwiaHRtbFxcXCI6ICfpnZnmgIHpobXpnaInLFxcbiAgICBcXFwiY29uZmlnXFxcIjogJ+S4u+mimCdcXG59O1xcbmZvcihsZXQga2V5IGluIGRhdGFUeXBlTGlzdCl7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpkYXRhVHlwZT09PWtleT9cXFwi4oCc4oCcXFxcIitkYXRhVHlwZUxpc3Rba2V5XStcXFwi4oCd4oCdXFxcIjpkYXRhVHlwZUxpc3Rba2V5XSxcXG4gICAgICAgIHVybDokKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChrZXkpPT57XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UudHlwZVxcXCIsa2V5KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0sa2V5KSxcXG4gICAgICAgIGNvbF90eXBlOlxcXCJzY3JvbGxfYnV0dG9uXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHJ1bGVMaXN0Lmxlbmd0aCA+IDIwKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuaQnOe0olxcXCIsXFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcobmFtZSA9PiBcXFwiaGlrZXI6Ly9zZWFyY2g/cz1cXFwiICsgaW5wdXQgKyBcXFwiJnJ1bGU9XFxcIiArIG5hbWUsIE1ZX1JVTEUudGl0bGUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgICAgICBkZXNjOiBcXFwi5pCc57Si5b2T5YmN5byA5Y+R6ICF55qE6KeE5YiZXFxcIlxcbiAgICB9KTtcXG59XFxubGV0IGhvbWVMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5ob21lKSk7XFxubGV0IG1SdWxlTGlzdCA9IFtdO1xcbmZvciAodmFyIGl0ZW0gb2YgcnVsZUxpc3QpIHtcXG4gICAgdmFyIG5hbWUgPSBpdGVtLm5hbWU7XFxuICAgIGlmIChpdGVtLmlzX3RhcCkge1xcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldEFwaShcXFwicnVsZUxpc3RKc29uXFxcIikgKyBcXFwiP2lkPVxcXCIgKyBpdGVtLmlkKSk7XFxuICAgICAgICBpdGVtLmlkID0gbG9jYXRpb24uaWQ7XFxuICAgICAgICBpdGVtLm5hbWUgPSBsb2NhdGlvbi5uYW1lO1xcbiAgICAgICAgaXRlbS5hdXRob3IgPSBsb2NhdGlvbi5hdXRob3I7XFxuICAgICAgICBpdGVtLmRhdGFfdHlwZSA9IGxvY2F0aW9uLmRhdGFfdHlwZTtcXG4gICAgICAgIGl0ZW0udmVyID0gbG9jYXRpb24udmVyXFxuICAgIH1cXG4gICAgaXRlbS52ZXJzaW9uID0gaXRlbS52ZXI7XFxuICAgIGxldCBsYWJlbCA9IFxcXCJcXFwiLFxcbiAgICAgICAgbHZlciA9IC0yO1xcbiAgICBpZiAoaXRlbS5pc19qc29uICYmIGl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIpIHtcXG4gICAgICAgIGx2ZXIgPSBsb2NhbFJ1bGVWZXIoaG9tZUxpc3QsIGl0ZW0pO1xcbiAgICAgICAgaWYgKGx2ZXIgPT09IC0xKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GlVxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKGx2ZXIgPCBpdGVtLnZlcikge1xcbiAgICAgICAgICAgIGxhYmVsID0gXFxcIvCfhplcXFwiO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIG1SdWxlTGlzdC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBsYWJlbCArIG5hbWUsXFxuICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZURldGFpbCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBsdmVyOiBsdmVyLFxcbiAgICAgICAgICAgIGlkOiBpdGVtLmlkXFxuICAgICAgICB9LFxcbiAgICAgICAgcGljX3VybDogaXRlbS5waWMsXFxuICAgIH0pO1xcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG5tUnVsZUxpc3QgPSBtZXJnZVNvcnQobVJ1bGVMaXN0KTtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXFxuZGF0YS5wdXNoLmFwcGx5KGRhdGEsIG1SdWxlTGlzdClcXG5zZXRSZXN1bHQoZGF0YSk7XFxuXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop4TliJnor6bnu4YtdXNlclwiLFwicGF0aFwiOlwicnVsZURldGFpbFwiLFwicnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGdldEFwaSxcXG4gICAgICAgIGNvbG9yLFxcbiAgICAgICAgc21hbGwsXFxuICAgICAgICBodG1sVGFnLFxcbiAgICAgICAgYXBpLFxcbiAgICAgICAgbWRcXG4gICAgfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBsdmVyLFxcbiAgICBpc0FsbFxcbn0gPSBNWV9QQVJBTVM7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKChpc0FsbCkgPT4ge1xcbiAgICBpZighaXNBbGwpe1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICB9XFxufSxpc0FsbCkpO1xcbmxldCBkYXRhSXRlbSA9IEpTT04ucGFyc2UocmVxdWVzdChnZXRBcGkoXFxcImdldGJ5aWRcXFwiKSArIFxcXCI/aWQ9XFxcIiArIGlkKSkucmVzdWx0O1xcbnNldFBhZ2VUaXRsZShcXFwi44CMXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CNXFxcIilcXG5sZXQgcnVsZUxpc3RKc29uID0gZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIjtcXG5sZXQgZGF0YSA9IFtdO1xcbnZhciBoYXNTdWIgPSBmYWxzZTtcXG5cXG5pZiAoZGF0YUl0ZW0uaXNfanNvbl9saXN0KSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQpO1xcbn0gZWxzZSBpZiAoIWRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiBkYXRhSXRlbS5kYXRhX3R5cGUgPT0gJ2hvbWVfcnVsZV91cmwnKSB7XFxuICAgIGhhc1N1YiA9IGhhc0hvbWVTdWIocnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQgKyAnJmRlYnVnPXRydWUnKTtcXG59XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLniYjmnKxcXFwiKSxcXG4gICAgZGVzYzogXFxcIuKAnOKAnOKAneKAneW8gOWPkeiAhe+8mlxcXCIgKyBjb2xvcihkYXRhSXRlbS5hdXRob3IsIFxcXCIjMjI4QkU2XFxcIikgKyBcXFwiXFxcXG7kupHnq6/niYjmnKzvvJpcXFwiICsgY29sb3IoZGF0YUl0ZW0udmVyLCBcXFwiIzVjZmYyY1xcXCIpICsgXFxcIlxcXFx0XFxcXHTmnKzlnLDniYjmnKzvvJpcXFwiICsgY29sb3IobHZlciwgXFxcIiM1Y2ZmMmNcXFwiKSArIFxcXCJcXFxcbuabtOaWsOS6jjogW1xcXCIgKyBjb2xvcihkYXRhSXRlbS5sYXN0X3VwZGF0ZSwgXFxcIiNmZjcwMDBcXFwiKSArIFxcXCJdXFxcIixcXG4gICAgdXJsOiAkKFxcXCI85byA5Y+R6ICFPlxcXFxuXFxcIiArIGRhdGFJdGVtLmF1dGhvciArIFxcXCJcXFxcbjzlkI3np7A+XFxcXG5cXFwiICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJcXFxcbjzkupHnq6/niYjmnKw+XFxcXG5cXFwiICsgZGF0YUl0ZW0udmVyICsgXFxcIlxcXFxuPOacrOWcsOeJiOacrD5cXFxcblxcXCIgKyBsdmVyICsgXFxcIlxcXFxuPOabtOaWsOaXtumXtD5cXFxcbltcXFwiICsgZGF0YUl0ZW0ubGFzdF91cGRhdGUgKyBcXFwiXVxcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMSdcXG59KTtcXG5sZXQgZGF0YVR5cGUgPSB7XFxuICAgIGhvbWVfcnVsZV91cmw6ICfpppbpobXkupHop4TliJknLFxcbiAgICBwdWJsaXNoOiAn5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZJyxcXG4gICAganNfdXJsOiAn572R6aG15o+S5Lu26KeE5YiZJyxcXG4gICAgaHRtbDogJ+mdmeaAgemhtemdoicsXFxuICAgIGNvbmZpZzogJ+S4u+mhtemFjee9ridcXG59O1xcblxcbmxldCBiYXNpYyA9IHtcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn07XFxubGV0IGRhdGFUeXBlVGlwcyA9IGRhdGFUeXBlW2RhdGFJdGVtLmRhdGFfdHlwZV0gfHwgJ+acquefpeinhOWIme+8micgKyBkYXRhSXRlbS5kYXRhX3R5cGU7XFxuXFxubGV0IHNhZmVfdGlwPWRhdGFJdGVtLmlzX3NhZmU/XFxcIuWuieWFqFxcXCI6XFxcIuWNsemZqVxcXCI7XFxubGV0IGdvb2RfdGlwID0gZGF0YUl0ZW0uaXNfZ29vZD9zbWFsbChjb2xvcihcXFwi44CQ5LyY6LSo6KeE5YiZ44CRXFxcIiwnI2ZmNzAwMCcpKTpcXFwiXFxcIjtcXG5sZXQgbm90X3NhZmVfbm90ZT1kYXRhSXRlbS5ub3Rfc2FmZV9ub3RlO1xcbmJhc2ljLnRpdGxlID0gaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuexu+Wei1xcXCIpICsgXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKGlkOlxcXCIgKyBkYXRhSXRlbS5pZCArIFxcXCIpXFxcIikrXFxcIlxcXFx0XFxcXHRcXFxcdFxcXCIgKyBzbWFsbChcXFwiKOmjjumZqeajgOa1izpcXFwiICtzYWZlX3RpcCtcXFwiKVxcXCIpK2dvb2RfdGlwO1xcbmJhc2ljLmRlc2MgPSBcXFwi5pWw5o2u57G75Z6L77yaXFxcIiArIGNvbG9yKGRhdGFUeXBlVGlwcywgXFxcIiNjYjU0ZmZcXFwiKSArIFxcXCJcXFxcbuWIhuS6q+eKtuaAgeS4uu+8mlxcXCIgKyBkYXRhSXRlbS5zdGF0ZTtcXG5pZiAoW1xcXCJodG1sXFxcIiwgXFxcImNvbmZpZ1xcXCIsIFxcXCJqc191cmxcXFwiXS5pbmNsdWRlcyhkYXRhSXRlbS5kYXRhX3R5cGUpKSB7XFxuICAgIGJhc2ljLmRlc2MgKz0gXFxcIlxcXFxu4oCc4oCc4oCd4oCdID0+XFxcIiArIHNtYWxsKFxcXCLngrnmraTpooTop4hcXFwiKTtcXG4gICAgYmFzaWMudXJsID0gcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxufVxcblxcbmRhdGEucHVzaChiYXNpYyk7XFxubGV0IGhhc1N1YnMgPSBcXFwiXFxcIjtcXG5pZiAoaGFzU3ViKSB7XFxuICAgIGhhc1N1YnMgPSBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKFxcXCLlt7LorqLpmIVcXFwiKVxcbn1cXG5cXG5sZXQgbm90ZXMgPSByZXF1ZXN0KGdldEFwaShcXFwiZ2V0X3J1bGVfbm90ZVxcXCIpICsgaWQpO1xcbm5vdGVzID0gSlNPTi5wYXJzZShub3RlcykucmVzdWx0O1xcbnJlcXVpcmUobWQpO1xcbmxldCBub3Rlc0h0bWw9XFxcIlxcXCJcXG50cnl7XFxuICAgIG5vdGVzSHRtbD1tYXJrZWQucGFyc2Uobm90ZXMpO1xcbn1jYXRjaChlKXt9XFxuXFxuaWYgKG5vdGVzICE9PSBmYWxzZSkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGh0bWxUYWcoXFxcImJpZ1xcXCIsIFxcXCLlpIfms6hcXFwiKSArIFxcXCJcXFxcdFxcXFx0XFxcXHRcXFwiICsgc21hbGwoaHRtbFRhZyhcXFwidVxcXCIsIFxcXCLmn6XnnIvlrozmlbTlhazlkYogPlxcXCIpKSxcXG4gICAgICAgIGRlc2M6IG5vdGVzLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0ZXh0OiBub3Rlc0h0bWwsXFxuICAgICAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgICAgICAvLyB0eXBlOiBcXFwibG9uZ190ZXh0XFxcIlxcbiAgICAgICAgICAgIHR5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9XFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogaHRtbFRhZyhcXFwiYmlnXFxcIiwgXFxcIuaTjeS9nFxcXCIpICsgaGFzU3VicyxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJ0b2FzdDovL+S9oOaJjeaYr+acgOW4heeahOmCo+S4quS6uu+8gVxcXCJcXG59KTtcXG5sZXQgaW1wb3J0VXJsLCBydWxlQ29kZSwgc2hhcmVVcmwsIGJhY2tDb2RlID0gXFxcIlxcXCI7XFxuaWYgKCFkYXRhSXRlbS5pc19qc29uKSB7XFxuICAgIGJhY2tDb2RlID0gcmVxdWVzdChydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCk7XFxufVxcbnN3aXRjaCAoZGF0YUl0ZW0uZGF0YV90eXBlKSB7XFxuICAgIGNhc2UgXFxcImhvbWVfcnVsZV91cmxcXFwiOlxcbiAgICAgICAgcnVsZUNvZGUgPSBcXFwi5rW36ZiU6KeG55WM6aaW6aG16aKR6YGT6KeE5YiZ44CQXFxcIiArIGRhdGFJdGVtLm5hbWUgKyBcXFwi44CR77+laG9tZV9ydWxlX3VybO+/pVxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZDtcXG4gICAgICAgIGltcG9ydFVybCA9IFxcXCJydWxlOi8vXFxcIiArIGJhc2U2NEVuY29kZShydWxlQ29kZSlcXG4gICAgICAgIGJyZWFrO1xcbiAgICBjYXNlICdwdWJsaXNoJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8micgKyBkYXRhSXRlbS5uYW1lICsgJ++/pXB1Ymxpc2jvv6UnICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnanNfdXJsJzpcXG4gICAgICAgIHJ1bGVDb2RlID0gJ+a1t+mYlOinhueVjOinhOWImeWIhuS6q++8jOW9k+WJjeWIhuS6q+eahOaYr++8mue9kemhteaPkuS7tu+/pWpzX3VybO+/pScgKyBkYXRhSXRlbS5uYW1lICsgJ0BiYXNlNjQ6Ly8nICsgYmFzZTY0RW5jb2RlKGJhY2tDb2RlKTtcXG4gICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAnaHRtbCc6XFxuICAgICAgICBsZXQgZmlsZV90bXAgPSBkYXRhSXRlbS5uYW1lLnNwbGl0KCcuJyk7XFxuICAgICAgICBsZXQgZmlsZV9wYXRoID0gZmlsZV90bXAubGVuZ3RoID4gMSA/IGZpbGVfdG1wW2ZpbGVfdG1wLmxlbmd0aCAtIDFdICsgXFxcIi9cXFwiICsgZGF0YUl0ZW0ubmFtZSA6IGRhdGFJdGVtLm5hbWU7XFxuICAgICAgICBydWxlQ29kZSA9IFxcXCLmtbfpmJTop4bnlYzmnKzlnLDmlofku7bliIbkuqvvv6VmaWxlX3VybO+/pWhpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9cXFwiICsgZmlsZV9wYXRoICsgXFxcIkBcXFwiICsgcnVsZUxpc3RKc29uICsgZGF0YUl0ZW0uaWQ7XFxuICAgICAgICBpbXBvcnRVcmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUocnVsZUNvZGUpO1xcbiAgICAgICAgYnJlYWtcXG4gICAgY2FzZSBcXFwiY29uZmlnXFxcIjpcXG4gICAgICAgIGltcG9ydFVybCA9ICQoKS5ydWxlKHBhc3N3b3JkID0+IHtcXG4gICAgICAgICAgICBldmFsKGZldGNoKFxcXCJoaWtlcjovL2Fzc2V0cy9ob21lLmpzXFxcIikpO1xcbiAgICAgICAgICAgIEhpa2VySG9tZS5sb2FkKFxcXCJpbXBvcnRcXFwiLCBwYXNzd29yZCk7XFxuICAgICAgICB9LCBiYWNrQ29kZSk7XFxuICAgICAgICBicmVhaztcXG59XFxubGV0IG15X2NvbF90eXBlID0gXFxcInRleHRfMlxcXCI7XFxuaWYgKGltcG9ydFVybCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlr7zlhaXop4TliJlcXFwiLFxcbiAgICAgICAgdXJsOiBkYXRhSXRlbS5pc19zYWZlP2ltcG9ydFVybDondG9hc3Q6Ly/po47pmanop4TliJnnpoHmraLlr7zlhaUhISEnLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pO1xcbn1cXG5pZiAocnVsZUNvZGUpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5YiG5Lqr5Y+j5LukXFxcIixcXG4gICAgICAgIHVybDogXFxcImNvcHk6Ly9cXFwiICsgcnVsZUNvZGUsXFxuICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgfSk7XFxufVxcblxcbmlmIChpbXBvcnRVcmwpIHtcXG4gICAgaWYgKGRhdGFJdGVtLmlzX2pzb25fbGlzdCAmJiAhaGFzU3ViKSB7XFxuICAgICAgICBsZXQgc3ViX3J1bGVfY29kZSA9ICfmtbfpmJTop4bnlYzlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pScgKyBkYXRhSXRlbS5uYW1lICsgXFxcIkBAXFxcIiArIHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkO1xcbiAgICAgICAgbGV0IHN1Yl91cmwgPSAncnVsZTovLycgKyBiYXNlNjRFbmNvZGUoc3ViX3J1bGVfY29kZSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiAn6K6i6ZiF5ZCI6ZuGJyxcXG4gICAgICAgICAgICB1cmw6IHN1Yl91cmwsXFxuICAgICAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ08c3BhbiBzdHlsZT1cXFwiY29sb3I6ICNmZjcwMDBcXFwiPuWvvOWFpei9u+WQiOmbhjwvc3Bhbj4nLFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChkYXRhSXRlbSxzdWJVcmwpPT57XFxuICAgICAgICAgICAgICAgIGNvbnN0IHtnZW5SdWxlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9nZW5BcGlcXFwiKTtcXG4gICAgICAgICAgICAgICAgbGV0IGltcG9ydF9ydWxlPWdlblJ1bGUoZGF0YUl0ZW0ubmFtZStcXFwiLlxcXCIrZGF0YUl0ZW0uYXV0aG9yLHN1YlVybCk7XFxuICAgICAgICAgICAgICAgIC8vY29weShpbXBvcnRfcnVsZSk7XFxuICAgICAgICAgICAgICAgIGxldCBydWxlQ29kZT1wYXJzZVBhc3RlKGltcG9ydF9ydWxlLnNwbGl0KFxcXCJcXFxcblxcXCIpWzBdKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICAgICAgICAgIGltcG9ydFVybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShydWxlQ29kZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBpbXBvcnRVcmxcXG4gICAgICAgICAgICB9LGRhdGFJdGVtLHJ1bGVMaXN0SnNvbiArIGRhdGFJdGVtLmlkKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIjxzbWFsbD7mj5DnpLrvvJrlvIDlj5HogIXljZXni6zliIbkuqvnmoTlkIjpm4bmlofku7blj6rog73ljZXni6zlr7zlhaXjgII8L3NtYWxsPlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfSBlbHNlIGlmICghZGF0YUl0ZW0uaXNfanNvbl9saXN0ICYmICFoYXNTdWIgJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09ICdob21lX3J1bGVfdXJsJykge1xcbiAgICAgICAgbGV0IHN1Yl9ydWxlX2NvZGUgPSAn5rW36ZiU6KeG55WM5Y2V6KeE5YiZ6K6i6ZiF77+laG9tZV9zdWLvv6UnICsgZGF0YUl0ZW0ubmFtZSArIFxcXCJAQFxcXCIgKyBydWxlTGlzdEpzb24gKyBkYXRhSXRlbS5pZCArICcmZGVidWc9dHJ1ZSc7XFxuICAgICAgICBsZXQgc3ViX3VybCA9ICdydWxlOi8vJyArIGJhc2U2NEVuY29kZShzdWJfcnVsZV9jb2RlKTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6ICforqLpmIXop4TliJknLFxcbiAgICAgICAgICAgIHVybDogc3ViX3VybCxcXG4gICAgICAgICAgICBjb2xfdHlwZTogbXlfY29sX3R5cGVcXG4gICAgICAgIH0pXFxuICAgIH1cXG59XFxuaWYgKGRhdGFJdGVtLmlzX2pzb24gJiYgZGF0YUl0ZW0uZGF0YV90eXBlID09PSBcXFwiaG9tZV9ydWxlX3VybFxcXCIgJiYgIWRhdGFJdGVtLmlzX2pzb25fbGlzdCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6ICfov5vlhaXpopHpgZMnLFxcbiAgICAgICAgdXJsOiAkKCAvKlxcXCIjbm9Mb2FkaW5nI1xcXCIqLyApLmxhenlSdWxlKChuYW1lLGhvbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoaG9tZSkpO1xcbiAgICAgICAgICAgIGxldCBoYXNSdWxlID0gcnVsZUxpc3Quc29tZShpdGVtID0+IGl0ZW0udGl0bGUgPT09IG5hbWUpO1xcbiAgICAgICAgICAgIGlmIChoYXNSdWxlKSB7XFxuICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBob21lK1xcXCJzQFxcXCIgKyBuYW1lO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mnKrlronoo4VcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGRhdGFJdGVtLm5hbWUsYXBpLmhvbWUpLFxcbiAgICAgICAgY29sX3R5cGU6IG15X2NvbF90eXBlXFxuICAgIH0pXFxufVxcbmxldCBtYW5fcnVsZV9zYWZlID0gZ2V0QXBpKFxcXCJtYW5SdWxlU2FmZVxcXCIpK2RhdGFJdGVtLmlkO1xcbmxldCBtYW5fcnVsZV9nb29kID0gZ2V0QXBpKFxcXCJtYW5SdWxlR29vZFxcXCIpK2RhdGFJdGVtLmlkO1xcbi8vIGRhdGFJdGVtLmlzX3NhZmU7XFxuaWYoZ2V0VmFyKCdob3VzZS5pc19tYW5hZ2VyJykpe1xcbiAgICBmdW5jdGlvbiBzZXRJc1NhZmUoZmxhZyxtYW5fcnVsZV9zYWZlKSB7XFxuICAgICAgICBmbGFnID0gZmxhZyB8fCAnJztcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IGNvZGUgPSBmZXRjaChtYW5fcnVsZV9zYWZlLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXFwiVXNlci1BZ2VudFxcXCI6IE1PQklMRV9VQX0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInVzZXJuYW1lXFxcIjogZ2V0VmFyKCdob3VzZS51c2VybmFtZScpLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBnZXRWYXIoJ2hvdXNlLnBhc3N3b3JkJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJpc19zYWZlXFxcIjogISFmbGFnXFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgY29kZSA9IEpTT04ucGFyc2UoY29kZSkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChjb2RlLnN0YXR1cyA9PT0gMCkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgY29kZS5kZXRhaWxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuICfmk43kvZzlpLHotKU6JyArIGUubWVzc2FnZVxcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIHNldElzR29vZChmbGFnLG1hbl9ydWxlX2dvb2QpIHtcXG4gICAgICAgIGZsYWcgPSBmbGFnIHx8ICcnO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgY29kZSA9IGZldGNoKG1hbl9ydWxlX2dvb2QsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXCJVc2VyLUFnZW50XFxcIjogTU9CSUxFX1VBfSxcXG4gICAgICAgICAgICAgICAgYm9keToge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgICAgICAgICAge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwidXNlcm5hbWVcXFwiOiBnZXRWYXIoJ2hvdXNlLnVzZXJuYW1lJyksXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGdldFZhcignaG91c2UucGFzc3dvcmQnKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcImlzX2dvb2RcXFwiOiAhIWZsYWdcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBjb2RlID0gSlNPTi5wYXJzZShjb2RlKS5yZXN1bHQ7XFxuICAgICAgICAgICAgaWYgKGNvZGUuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAn5pON5L2c5aSx6LSlOicgKyBjb2RlLmRldGFpbFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ+aTjeS9nOWksei0pTonICsgZS5tZXNzYWdlXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5qr6aOO6ZmpJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrpo47pmak/6aOO6Zmp6KeE5YiZ5peg5rOV6KKr5a+85YWlJykuY29uZmlybSgoaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzU2FmZShmYWxzZSxtYW5fcnVsZV9zYWZlKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J+Kcheato+W4uCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li65q2j5bi4PycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX3NhZmUsc2V0SXNTYWZlKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc1NhZmUodHJ1ZSxtYW5fcnVsZV9zYWZlKTtcXG4gICAgICAgICAgICBpZighL+aTjeS9nOWksei0pS8udGVzdChyZXQpKXtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytyZXRcXG4gICAgICAgIH0sZGF0YUl0ZW0uaWQsbWFuX3J1bGVfc2FmZSxzZXRJc1NhZmUpXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6J+KZpemdnuS8mOi0qCcsXFxuICAgICAgICBjb2xfdHlwZTonc2Nyb2xsX2J1dHRvbicsXFxuICAgICAgICB1cmw6JCgn5qCH6K6w6K+l6KeE5YiZ5Li66Z2e5LyY6LSoPycpLmNvbmZpcm0oKGlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKT0+e1xcbiAgICAgICAgICAgIGxldCByZXQgPSBzZXRJc0dvb2QoZmFsc2UsbWFuX3J1bGVfZ29vZCk7XFxuICAgICAgICAgICAgaWYoIS/mk43kvZzlpLHotKUvLnRlc3QocmV0KSl7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovLycrcmV0XFxuICAgICAgICB9LGRhdGFJdGVtLmlkLG1hbl9ydWxlX2dvb2Qsc2V0SXNHb29kKVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOifwn5KW5LyY6LSoJyxcXG4gICAgICAgIGNvbF90eXBlOidzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIHVybDokKCfmoIforrDor6Xop4TliJnkuLrkvJjotKg/JykuY29uZmlybSgoaWQsbWFuX3J1bGVfZ29vZCxzZXRJc0dvb2QpPT57XFxuICAgICAgICAgICAgbGV0IHJldCA9IHNldElzR29vZCh0cnVlLG1hbl9ydWxlX2dvb2QpO1xcbiAgICAgICAgICAgIGlmKCEv5pON5L2c5aSx6LSlLy50ZXN0KHJldCkpe1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK3JldFxcbiAgICAgICAgfSxkYXRhSXRlbS5pZCxtYW5fcnVsZV9nb29kLHNldElzR29vZClcXG4gICAgfSk7XFxufVxcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogZGF0YUl0ZW0uZ29vZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LWeLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IGRhdGFJdGVtLmJhZF9udW0sXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6LipLnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZSxcXG4gICAgICAgIGRlZmF1bHRUeXBlOlxcXCJiYWRcXFwiXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuivhOiuulxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ZpbGVzL2ljb24v6K+E6K66LnN2Z1xcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF8zXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL01ha2VBY29tbWVudCNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IGRhdGFJdGVtLmlkLFxcbiAgICAgICAgbmFtZTogZGF0YUl0ZW0ubmFtZVxcbiAgICB9XFxufSk7XFxubGV0IHRvdGFsU3VtID0gZGF0YUl0ZW0uZ29vZF9udW0gKyBkYXRhSXRlbS5iYWRfbnVtO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiaWdcXFwiLCBcXFwi6K+E6K66KFxcXCIgKyB0b3RhbFN1bSArIFxcXCIpXFxcIikgKyBcXFwiXFxcXHRcXFxcdFxcXFx0XFxcIiArIHNtYWxsKGh0bWxUYWcoXFxcInVcXFwiLCBcXFwi5p+l55yL5YWo6YOo6K+E6K66ID5cXFwiKSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL0NvbW1lbnRcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eSNmeXBhZ2Ujbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgIGlkOiBkYXRhSXRlbS5pZCxcXG4gICAgICAgIHRvdGFsU3VtOiB0b3RhbFN1bSxcXG4gICAgICAgIG5vX2FjdGl2ZTogZmFsc2VcXG4gICAgfVxcbn0pO1xcbi8vY29uc3QgbG9uZ2VzdFN1bT0xMjA7XFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOlxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5pZiAodG90YWxTdW0gPT09IDApIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwiPGg1IHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+5LiA5p2h6K+E6K665Lmf5rKh5pyJ77yM5b+r5p2l5oqi5rKZ5Y+R5ZCn77yBPC9oNT5cXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJyaWNoX3RleHRcXFwiXFxuICAgIH0pO1xcbn0gZWxzZSB7XFxuICAgIGxldCBjb21tZW50TGlzdCA9IEpTT04ucGFyc2UocmVxdWVzdChhcGkuZGlzX2dldCArIGRhdGFJdGVtLmlkICsgXFxcIj9saW1pdD01XFxcIikpLnJlc3VsdDtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgbGV0IFJlcGx5ID0gaXRlbS5kaXNjdXNzX3R5cGU9PT1cXFwicmVwbHlcXFwiJiZpdGVtLnJlcGx5X3RvX25hbWUhPT1mYWxzZSYmaXRlbS5yZXBseV90b19pZCE9PWZhbHNlP1xcXCLigJjigJjlm57lpI1AXFxcIitpdGVtLnJlcGx5X3RvX25hbWUrXFxcIiAjXFxcIitpdGVtLmRpc2N1c3NfaWQrXFxcIuKAmeKAmVxcXFxuXFxcIjpcXFwiXFxcIjtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0ubmFtZSArIFxcXCImbmJzcDsmbmJzcDs8Zm9udCBjb2xvcj0nZ3JheSc+PHNtYWxsPiNcXFwiICsgaXRlbS5pZCArIFxcXCI8L3NtYWxsPjxmb250PlxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJhdmF0YXJcXFwiLFxcbiAgICAgICAgICAgIC8vdXJsOiBcXFwidG9hc3Q6Ly9cXFwiICsgaXRlbS5xcSxcXG4gICAgICAgICAgICB1cmw6XFxcIm1xcXdwYTovL2ltL2NoYXQ/Y2hhdF90eXBlPXdwYSZ1aW49XFxcIitpdGVtLnFxLFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG59XFxuXFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwicmljaF90ZXh0XCIsXCJuYW1lXCI6XCLmn6XnnItcIixcInBhdGhcIjpcImluZm9cIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5p+l55yL44CMXFxcIitNWV9QQVJBTVMubmFtZStcXFwi44CNXFxcIilcXG5zZXRSZXN1bHQoW3tcXG4gICAgdGl0bGU6IE1ZX1BBUkFNUy50ZXh0LFxcbiAgICBjb2xfdHlwZTpNWV9QQVJBTVMudHlwZVxcbn1dKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW8gOWPkeiAheazqOWGjFwiLFwicGF0aFwiOlwiUmVnaXN0ZXJcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi5byA5Y+R6ICF5rOo5YaMXFxcIik7XFxuY29uc3Qge1xcbiAgICBnZXRBcGksXFxuICAgIGh0bWxUYWcsXFxuICAgIG1hcENvbFR5cGUsXFxuICAgIHNtYWxsXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbnZhciBkYXRhID0gW107XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5QYXNzd29yZFxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLlVzZXJuYW1lXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5Vc2VyQWRkcmVzc1xcXCIpO1xcbn0pKTtcXG5hZGRMaXN0ZW5lcignb25SZWZyZXNoJywgJC50b1N0cmluZygoKT0+e1xcbiAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5XYWl0XFxcIiwgXFxcIlxcXCIpO1xcbn0pKTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogJ+i0puWPtycsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXotKblj7co5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJudW1iZXJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5Vc2VybmFtZVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSwge1xcbiAgICB0aXRsZTogJ+WvhueggScsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXlr4bnoIEo5b+F5aGrKVxcXCIsXFxuICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5QYXNzd29yZCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlBhc3N3b3JkXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5tYXBDb2xUeXBlKGRhdGEsIFxcXCJsaW5lX2JsYW5rXFxcIiwgMSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICfmmLXnp7AnLFxcbiAgICBkZXNjOiBcXFwi6K+36L6T5YWl5pi156ewKOW/heWhqylcXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UuVXNlckFkZHJlc3MnLCAnJyksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIixpbnB1dCknXFxuICAgIH1cXG59LCB7XFxuICAgIHRpdGxlOiAn5o+P6L+wJyxcXG4gICAgZGVzYzogXFxcIuivtOivtOS4uuS7gOS5iOimgeazqOWGjOWQp1xcXFxuKOWPr+S7peWinuWKoOmAmui/h+amgueOhyzpgInloaspXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLkRlc2NyaXB0aW9uJywgJycpLFxcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuRGVzY3JpcHRpb25cXFwiLGlucHV0KSdcXG4gICAgfVxcbn0pXFxuXFxubWFwQ29sVHlwZShkYXRhLCBcXFwibGluZV9ibGFua1xcXCIsIDEpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBodG1sVGFnKFxcXCJiXFxcIiwgXFxcIuazqOWGjFxcXCIpLFxcbiAgICB1cmw6ICQoZ2V0QXBpKFxcXCJuZXdfZGV2XFxcIikrXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGdldElkLCBjb25maXJtKSA9PiB7XFxuICAgICAgICBsZXQgdXNlcm5hbWUgPSBnZXRWYXIoJ1dhcmVob3VzZS5Vc2VybmFtZScsIFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwYXNzd29yZCA9IGdldFZhcignV2FyZWhvdXNlLlBhc3N3b3JkJywgXFxcIlxcXCIpLFxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gZ2V0VmFyKCdXYXJlaG91c2UuRGVzY3JpcHRpb24nLCBcXFwiXFxcIiksXFxuICAgICAgICAgICAgbmFtZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLlVzZXJBZGRyZXNzXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKFt1c2VybmFtZSwgcGFzc3dvcmQsIG5hbWVdLmluY2x1ZGVzKFxcXCJcXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/otKblj7cs5a+G56CB5ZKM5pi156ew5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIHNob3dMb2FkaW5nKFxcXCLmraPlnKjmj5DkuqTnlLPor7fooahcXFwiKTtcXG4gICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0LCB7XFxuICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgIFxcXCJwYXJhbXNcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwicmVhc29uXFxcIjogZGVzY3JpcHRpb24sXFxuICAgICAgICAgICAgICAgICAgICBcXFwibmFtZVxcXCI6IG5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdwb3N0J1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGlkcmVzdWx0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGdldElkICsgXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUpKTtcXG4gICAgICAgIGlmIChpZHJlc3VsdC5zdGF0dXMgIT09IDApIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIGlkcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIFxcbiAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLovpPlhaXpgq7nrrHpqozor4HnoIFcXFxcblxcXCIgKyByZXN1bHQuZGV0YWlsKS5pbnB1dCgoY29uZmlybSwgaWQsIGFjY291bnQpID0+IHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi6K+36ICQ5b+D562J5b6FXFxcIik7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoY29uZmlybSwge1xcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXFxcInJlZ2lzdF9pZFxcXCI6IGlkLFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXFwieXptXFxcIjogaW5wdXRcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlVXNlcm5hbWVcXFwiLCBhY2NvdW50WzBdKTtcXG4gICAgICAgICAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlUGFzc3dvcmRcXFwiLCBhY2NvdW50WzFdKTtcXG4gICAgICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5oiQ5Yqf5o+Q5Lqk5rOo5YaM5rOo5YaMXFxcXG5cXFwiK3Jlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lh7rplJnkuoblkZBcXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGNvbmZpcm0sIGlkcmVzdWx0LnJlc3VsdCwgW3VzZXJuYW1lLCBwYXNzd29yZF0pO1xcbiAgICB9LCBnZXRBcGkoXFxcIm5ld19nZXRJZFxcXCIpLCBnZXRBcGkoXFxcIm5ld19jb25maXJtXFxcIikpLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwidGV4dF8xXCIsXCJuYW1lXCI6XCLkuKrkurrotYTmlplcIixcInBhdGhcIjpcIlBlcnNvbmFsRGF0YVwiLFwicnVsZVwiOlwianM6XFxuc2V0UGFnZVRpdGxlKFxcXCLkuKrkurrotYTmlplcXFwiKTtcXG52YXIgZGF0YT1bXTtcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgZ2V0RmlsZSxcXG4gICAgYXBpXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOlxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcblxcbmxldCB7dXNlcm5hbWUscGFzc3dvcmR9ID0gZ2V0RmlsZSgpO1xcbmxldCBkZXYgPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJ1c2VyXFxcIikrTVlfUEFSQU1TLmlkKSkucmVzdWx0O1xcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlpLTlg49cXFwiLFxcbiAgICBkZXNjOmRldi5hdmF0YXIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9wYWdlL21vZGlmeV9QZXJzb25hbERhdGEjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgZXh0cmE6e1xcbiAgICAgICAgZGV2OmRldixcXG4gICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgcGFzc3dvcmQ6cGFzc3dvcmQsXFxuICAgICAgICBQYXR0ZXJuOjBcXG4gICAgfSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5pi156ewXFxcIixcXG4gICAgZGVzYzpkZXYubmFtZSxcXG4gICAgdXJsOlxcXCJoaWtlcjovL3BhZ2UvbW9kaWZ5X1BlcnNvbmFsRGF0YSNub0hpc3RvcnkjI25vUmVjb3JkSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYTp7XFxuICAgICAgICBkZXY6ZGV2LFxcbiAgICAgICAgdXNlcm5hbWU6dXNlcm5hbWUsXFxuICAgICAgICBwYXNzd29yZDpwYXNzd29yZCxcXG4gICAgICAgIFBhdHRlcm46MVxcbiAgICB9LFxcbiAgICBjb2xfdHlwZTpcXFwidGV4dF8xXFxcIlxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOlxcXCLlr4bnoIFcXFwiLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9tb2RpZnlfUGVyc29uYWxEYXRhI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgIGV4dHJhOntcXG4gICAgICAgIGRldjpkZXYsXFxuICAgICAgICB1c2VybmFtZTp1c2VybmFtZSxcXG4gICAgICAgIHBhc3N3b3JkOnBhc3N3b3JkLFxcbiAgICAgICAgUGF0dGVybjoyXFxuICAgIH0sXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIui0puWPt++8mlxcXCIrdXNlcm5hbWUsXFxuICAgIHVybDpcXFwiY29weTovL1xcXCIrdXNlcm5hbWUsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIlVJRO+8mlxcXCIrZGV2LmlkLFxcbiAgICB1cmw6XFxcImNvcHk6Ly9cXFwiK2Rldi5pZCxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5o+Q5Lqk5LqR5LuT5bqT6KeE5YiZXFxcIixcXG4gICAgdXJsOiQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGhvc3QpPT57XFxuICAgICAgICBsZXQgY29kZT1yZXF1ZXN0KGhvc3QrXFxcIi9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTE0NVxcXCIpO1xcbiAgICAgICAgbGV0IHdvcmQ9XFxcIu+/pXB1Ymxpc2jvv6VcXFwiK2Jhc2U2NEVuY29kZShjb2RlKTtcXG4gICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIrYmFzZTY0RW5jb2RlKHdvcmQpO1xcbiAgICB9LGFwaS5ob3N0KSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5ZCM5q2l5o+Q5Lqk5LqR5LuT5bqT6LSm5Y+35a+G56CBXFxcIixcXG4gICAgdXJsOlxcXCJydWxlOi8vXFxcIitiYXNlNjRFbmNvZGUoXFxcIu+/pXB1Ymxpc2hfYWNjb3VudO+/pVxcXCIrdXNlcm5hbWUrXFxcIkBcXFwiK3Bhc3N3b3JkKSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfMVxcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTpcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTpcXFwi5L2g5LiA5YWx5Y+R5biD5LqG44CMXFxcIitkZXYucnVsZV9udW0rXFxcIuOAjeadoeinhOWImVxcXCIsXFxuICAgIHVybDpcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOlxcXCJ0ZXh0XzFcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6XFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuazqOmUgOeZu+W9lVxcXCIsXFxuICAgIHVybDokKFxcXCLnoa7orqTms6jplIDnmbvlvZU/XFxcIikuY29uZmlybShmID0+IHtcXG4gICAgICAgIGYudXNlcm5hbWU9XFxcIlxcXCI7XFxuICAgICAgICBmLnBhc3N3b3JkPVxcXCJcXFwiO1xcbiAgICAgICAgd3JpdGVGaWxlKCdoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvbicsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmJhY2tcXFwiLFxcXCIxXFxcIik7XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5bey5rOo6ZSAXFxcIjtcXG4gICAgfSx1c2VyKSxcXG4gICAgY29sX3R5cGU6XFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuc2V0UmVzdWx0KGRhdGEpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5pu05pS55Liq5Lq66LWE5paZXCIsXCJwYXRoXCI6XCJtb2RpZnlfUGVyc29uYWxEYXRhXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCB7XFxuICAgIGdldEFwaSxcXG4gICAgY29sb3IsXFxuICAgIHNtYWxsLFxcbiAgICBnZXRGaWxlLFxcbiAgICBodG1sVGFnXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGRldixcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkLFxcbiAgICBQYXR0ZXJuXFxufSA9IE1ZX1BBUkFNUztcXG52YXIgZGF0YSA9IFtdO1xcbmxldCBwYXRoID0gXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZDtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLm0uYXZhdGFyXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC54XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC55XFxcIik7XFxufSkpO1xcbmZ1bmN0aW9uIG1fcGV0TmFtZSgpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDmmLXnp7BcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpfHxkZXYubmFtZSxcXG4gICAgICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ucGV0TmFtZVxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfbmFtZVxcXCIpICsgcGF0aCkubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBuZXdQZXROYW1lID0gZ2V0VmFyKCdXYXJlaG91c2UubS5wZXROYW1lJywgJycpO1xcbiAgICAgICAgICAgIGlmIChuZXdQZXROYW1lID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHloavllYohXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQgKyBcXFwiJm5hbWU9XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChuZXdQZXROYW1lKSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gbV9hdmF0YXIoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgICAgICBkZXNjOiBcXFwi6K+36L6T5YWl5paw55qE5aS05YOP6ZO+5o6lXFxcIixcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpIHx8IGRldi5hdmF0YXIsXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLmF2YXRhclxcXCIsaW5wdXQpJ1xcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgICAgICB1cmw6ICQoZ2V0QXBpKFxcXCJtb2RpZnlfYXZhXFxcIikgKyBwYXRoKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IG5ld0F2YXRhciA9IGdldFZhcignV2FyZWhvdXNlLm0uYXZhdGFyJywgJycpO1xcbiAgICAgICAgICAgIFxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZhdmF0YXJfdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQobmV3QXZhdGFyKSk7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbiAgICB9KTtcXG59XFxuXFxuZnVuY3Rpb24gbV9wd2QoKSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIuWOn+WvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXljp/lr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLnknLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnlcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6XFxcIuaWsOWvhueggVxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgICAgIGRlc2M6IFxcXCLor7fovpPlhaXmlrDlr4bnoIFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICB0eXBlOlxcXCJwYXNzd29yZFxcXCIsXFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyksXFxuICAgICAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5tLlBhc3N3b3JkLnhcXFwiLGlucHV0KSdcXG4gICAgICAgIH1cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTpcXFwi6YeN5aSN5paw5a+G56CBXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiAnaW5wdXQnLFxcbiAgICAgICAgZGVzYzogXFxcIuivt+mHjeWkjeaWsOWvhueggVxcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIHR5cGU6XFxcInBhc3N3b3JkXFxcIixcXG4gICAgICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC5jJywgJycpLFxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5QYXNzd29yZC5jXFxcIixpbnB1dCknXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5L+d5a2YXFxcIixcXG4gICAgICAgIHVybDogJChnZXRBcGkoXFxcIm1vZGlmeV9wd2RcXFwiKStwYXRoKS5sYXp5UnVsZSgocGFzc3dvcmQsdXNlcm5hbWUpID0+IHtcXG4gICAgICAgICAgICBsZXQgb2xkX3Bhc3N3b3JkID0gZ2V0VmFyKCdXYXJlaG91c2UubS5QYXNzd29yZC55JywgJycpO1xcbiAgICAgICAgICAgIGxldCBuZXdfcGFzc3dvcmQgPSBnZXRWYXIoJ1dhcmVob3VzZS5tLlBhc3N3b3JkLngnLCAnJyk7XFxuICAgICAgICAgICAgbGV0IG5ld19wYXNzd29yZF9hZ2FpbiA9IGdldFZhcignV2FyZWhvdXNlLm0uUGFzc3dvcmQuYycsICcnKTtcXG4gICAgICAgICAgICBpZiAob2xkX3Bhc3N3b3JkIT09cGFzc3dvcmQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+WOn+WvhueggemUmeivr1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZD09PVxcXCJcXFwiKXtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+ivt+i+k+WFpeaWsOWvhueggVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmKG5ld19wYXNzd29yZCE9PW5ld19wYXNzd29yZF9hZ2Fpbil7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuKTmrKHlr4bnoIHkuI3lkIxcXFwiXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXF1ZXN0KGlucHV0ICsgXFxcIiZuZXdfcGFzc3dvcmQ9XFxcIiArIG5ld19wYXNzd29yZCtcXFwiJm5ld19wYXNzd29yZF9yZT1cXFwiK25ld19wYXNzd29yZF9hZ2Fpbik7XFxuICAgICAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpO1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lOnVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQ6bmV3X3Bhc3N3b3JkXFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgYmFjaygpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L+u5pS55oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxwYXNzd29yZCx1c2VybmFtZSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnXFxuICAgIH0pO1xcbn1cXG5cXG5zd2l0Y2ggKFBhdHRlcm4pIHtcXG4gICAgY2FzZSAwOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnlpLTlg49cXFwiKTtcXG4gICAgICAgIG1fYXZhdGFyKCk7XFxuICAgICAgICBicmVhaztcXG4gICAgY2FzZSAxOlxcbiAgICAgICAgc2V0UGFnZVRpdGxlKFxcXCLkv67mlLnmmLXnp7BcXFwiKTtcXG4gICAgICAgIG1fcGV0TmFtZSgpO1xcbiAgICAgICAgYnJlYWs7XFxuICAgIGNhc2UgMjpcXG4gICAgICAgIHNldFBhZ2VUaXRsZShcXFwi5L+u5pS55a+G56CBXFxcIik7XFxuICAgICAgICBtX3B3ZCgpO1xcbiAgICAgICAgYnJlYWs7XFxufVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue8lui+keinhOWImeWkh+azqFwiLFwicGF0aFwiOlwic2V0X3J1bGVfbm90ZXNcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBnZXRBcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgaWQsXFxuICAgIHVzZXJuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgbmFtZVxcbn0gPSBNWV9QQVJBTVM7XFxuc2V0UGFnZVRpdGxlKFxcXCLlpIfms6jjgIxcXFwiK25hbWUrXFxcIuOAjVxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJyxcXFwiY2xlYXJWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpXFxcIik7XFxubGV0IG5vdGVzPXJlcXVlc3QoZ2V0QXBpKFxcXCJnZXRfcnVsZV9ub3RlXFxcIikraWQpO1xcbm5vdGVzPUpTT04ucGFyc2Uobm90ZXMpLnJlc3VsdDtcXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi6KeE5YiZ5aSH5rOoLi4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpfHxub3Rlc3x8XFxcIlxcXCIsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0Oi0xLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRWYXIoXFxcIldhcmVob3VzZS5ydWxlLm5vdGVzXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChnZXRBcGkoXFxcInNldF9ydWxlX25vdGVcXFwiKSArIGlkKS5sYXp5UnVsZSgodXNlcm5hbWUsIHBhc3N3b3JkKSA9PiB7XFxuICAgICAgICBsZXQgbm90ZXMgPSBnZXRWYXIoJ1dhcmVob3VzZS5ydWxlLm5vdGVzJywgJycpO1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogcGFzc3dvcmQsXFxuICAgICAgICAgICAgICAgICAgICBcXFwibm90ZVxcXCI6bm90ZXNcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pLFxcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0KS5yZXN1bHQ7XFxuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgIH1cXG4gICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S/ruaUueaIkOWKn1xcXCI7XFxuICAgIH0sIHVzZXJuYW1lLCBwYXNzd29yZClcXG59KTtcXG5zZXRSZXN1bHQoZGF0YSk7XCJ9LHtcImNvbF90eXBlXCI6XCJsaW5lXCIsXCJuYW1lXCI6XCLor4TorrrliJfooahcIixcInBhdGhcIjpcIkNvbW1lbnRcIixcInJ1bGVcIjpcImpzOlxcbnNldFBhZ2VUaXRsZShcXFwi6K+E6K665YiX6KGoXFxcIik7XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGRhdGEgPSBbXTtcXG5sZXQge1xcbiAgICB0b3RhbFN1bSxcXG4gICAgaWQsXFxuICAgIG5vX2FjdGl2ZSxcXG4gICAgdXNlcm5hbWUsXFxuICAgIHBhc3N3b3JkXFxufSA9IE1ZX1BBUkFNUztcXG5sZXQgcGFnZSA9IHBhcnNlSW50KE1ZX1VSTC5zcGxpdChcXFwiI1xcXCIpWzFdKTtcXG5sZXQgZGlzY3Vzc190eXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuaWYgKHBhZ2UgPT09IDEpIHtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG4gICAgfSk7XFxuICAgIGFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfSkpO1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCLlhajpg6hcXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcIlxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfNCdcXG5cXG4gICAgfSk7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIvCfkY3otZ5cXFwiICsgKGRpc2N1c3NfdHlwZSA9PT0gXFxcImdvb2RcXFwiID8gXFxcIuKXiVxcXCIgOiBcXFwi4peLXFxcIiksXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQuZGlzY3Vzc190eXBlXFxcIiwgXFxcImdvb2RcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcblxcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi8J+Rjui4qVxcXCIgKyAoZGlzY3Vzc190eXBlID09PSBcXFwiYmFkXFxcIiA/IFxcXCLil4lcXFwiIDogXFxcIuKXi1xcXCIpLFxcbiAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRWYXIoXFxcIldhcmVob3VzZS5jb21tZW50LmRpc2N1c3NfdHlwZVxcXCIsIFxcXCJiYWRcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcbiAgICB9KTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Zue5aSNXFxcIiArIChkaXNjdXNzX3R5cGUgPT09IFxcXCJyZXBseVxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKSxcXG4gICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKSA9PiB7XFxuICAgICAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5kaXNjdXNzX3R5cGVcXFwiLCBcXFwicmVwbHlcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF80J1xcbiAgICB9KTtcXG59XFxuXFxuXFxubGV0IGljb24gPSB7XFxuICAgIFxcXCJnb29kXFxcIjogXFxcIvCfkY1cXFwiLFxcbiAgICBcXFwiYmFkXFxcIjogXFxcIvCfkY5cXFwiLFxcbiAgICBcXFwicmVwbHlcXFwiOlxcXCLlvIDlj5HogIXwn5ejXFxcIlxcbn1cXG5sZXQgY29udHJvbD0ocGlkLGFjdGl2ZSk9PnZvaWQgMDtcXG5pZihub19hY3RpdmUpe1xcbiAgICBjb250cm9sPWZ1bmN0aW9uKHBpZCxhY3RpdmUpe1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTphY3RpdmU/XFxcIumakOiXj+ivhOiuulxcXCI6XFxcIuWxleekuuivhOiuulxcXCIsXFxuICAgICAgICAgICAgdXJsOiQoYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCtcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0PUpTT04ucGFyc2UocmVxdWVzdChpbnB1dCkpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSlcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwidGV4dF8yXFxcIlxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOlxcXCLliKDpmaTor4TorrpcXFwiLFxcbiAgICAgICAgICAgIHVybDokKFxcXCLnoa7orqTliKDpmaTor6Xor4Torro/XFxcIikuY29uZmlybSgoaW5wdXQpPT57XFxuICAgICAgICAgICAgICAgIGxldCByZXN1bHQ9SlNPTi5wYXJzZShyZXF1ZXN0KGlucHV0KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKVxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIityZXN1bHQuZGV0YWlsO1xcbiAgICAgICAgICAgIH0sYXBpLmRpc19kZXZfY29udHJvbCtwaWQrXFxcIj9xcT1cXFwiICsgdXNlcm5hbWUgKyBcXFwiJnBhc3N3b3JkPVxcXCIgKyBwYXNzd29yZCtcXFwiJmRlbGV0ZT0xXFxcIiksXFxuICAgICAgICAgICAgY29sX3R5cGU6XFxcInRleHRfMlxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTpcXFwibGluZVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbmlmICh0b3RhbFN1bSA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7kuIDmnaHor4TorrrkuZ/msqHmnInvvIzlv6vmnaXmiqLmspnlj5HlkKfvvIE8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgbGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0ICsgaWQgKyBcXFwiP2xpbWl0PTUmcGFnZT1cXFwiICsgcGFnZSArIFxcXCImbm9fYWN0aXZlPVxcXCIgKyBub19hY3RpdmUgKyBcXFwiJmRpc2N1c3NfdHlwZT1cXFwiICsgZGlzY3Vzc190eXBlKSkucmVzdWx0O1xcbiAgICBmb3IgKGxldCBpdGVtIG9mIGNvbW1lbnRMaXN0KSB7XFxuICAgICAgICBsZXQgUmVwbHkgPSBpdGVtLmRpc2N1c3NfdHlwZT09PVxcXCJyZXBseVxcXCImJml0ZW0ucmVwbHlfdG9fbmFtZSE9PWZhbHNlJiZpdGVtLnJlcGx5X3RvX2lkIT09ZmFsc2U/XFxcIuKAmOKAmOWbnuWkjUBcXFwiK2l0ZW0ucmVwbHlfdG9fbmFtZStcXFwiICNcXFwiK2l0ZW0uZGlzY3Vzc19pZCtcXFwi4oCZ4oCZXFxcXG5cXFwiOlxcXCJcXFwiO1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgLy91cmw6IG5vX2FjdGl2ZT9cXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcIjpcXFwidG9hc3Q6Ly9cXFwiICsgaXRlbS5xcSxcXG5cXHRcXHQgICAgICAgdXJsOm5vX2FjdGl2ZT9cXFwiaGlrZXI6Ly9wYWdlL1JlcGx5XFxcIjpcXFwibXFxd3BhOi8vaW0vY2hhdD9jaGF0X3R5cGU9d3BhJnVpbj1cXFwiK2l0ZW0ucXEsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBydWxlSWQ6IGlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgdXNlcm5hbWU6IHVzZXJuYW1lLFxcbiAgICAgICAgICAgICAgICByZXBseUlkOml0ZW0uaWRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtLmRpc2N1c3NfdGV4dCxcXG4gICAgICAgICAgICBkZXNjOiBSZXBseStpdGVtLmNyZWF0ZV9kYXRlICsgXFxcIsK3XFxcIiArIGljb25baXRlbS5kaXNjdXNzX3R5cGVdLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvaW5mb1xcXCIsXFxuICAgICAgICAgICAgZXh0cmE6e1xcbiAgICAgICAgICAgICAgICBuYW1lOml0ZW0ubmFtZSxcXG4gICAgICAgICAgICAgICAgdHlwZTpcXFwibG9uZ190ZXh0XFxcIixcXG4gICAgICAgICAgICAgICAgdGV4dDppdGVtLmRpc2N1c3NfdGV4dFxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGNvbnRyb2woaXRlbS5pZCxpdGVtLmFjdGl2ZSk7XFxuICAgIH1cXG4gICAgaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5cXG5zZXRSZXN1bHQoZGF0YSlcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWPkeihqOivhOiuulwiLFwicGF0aFwiOlwiTWFrZUFjb21tZW50XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZGF0YSA9IFtdO1xcbmNvbnN0IHtcXG4gICAgYXBpLFxcbiAgICBnZXRGaWxlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCB7XFxuICAgIGlkLFxcbiAgICBuYW1lLFxcbiAgICBkZWZhdWx0VHlwZVxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHVzZXI9Z2V0RmlsZSgpLnVzZXJ8fFtcXFwiXFxcIixcXFwiXFxcIl07XFxuXFxuc2V0UGFnZVRpdGxlKFxcXCLor4TorrooXFxcIiArIG5hbWUgKyBcXFwiKVxcXCIpO1xcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC5xcVxcXCIpO1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxufSkpO1xcbmxldCB0eXBlID0gZ2V0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIikgfHwgZGVmYXVsdFR5cGV8fFxcXCJnb29kXFxcIjtcXG5kYXRhLnB1c2goe1xcbiAgICBkZXNjOiBcXFwi6K+E6K66Li4uLi4uXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyksXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0OjcsXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIui0puWPt++8mlxcXCIrKHVzZXJbMF18fFxcXCJcXFwiKSxcXG4gICAgZGVzYzpcXFwi6aqM6K+B56CB77yaXFxcIisodXNlclsxXXx8XFxcIlxcXCIpLFxcbiAgICB1cmw6XFxcImhpa2VyOi8vcGFnZS9Vc2VycmVnaXN0cmF0aW9uXFxcIixcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzEnLFxcbiAgICBcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogICh0eXBlID09PSBcXFwiZ29vZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKStcXFwiIPCfkY1cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIiwgXFxcImdvb2RcXFwiKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0XzInXFxuXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6ICAodHlwZSA9PT0gXFxcImJhZFxcXCIgPyBcXFwi4peJXFxcIiA6IFxcXCLil4tcXFwiKStcXFwiIPCfkY5cXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgcHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50eXBlXFxcIiwgXFxcImJhZFxcXCIpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogJ3RleHRfMidcXG59KTtcXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaPkOS6pFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX25ldyArIGlkKS5sYXp5UnVsZSgoQWNjb3VudCkgPT4ge1xcbiAgICAgICAgbGV0IHRleHQgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnRleHQnLCAnJyk7XFxuICAgICAgICBsZXQgW3FxLGF1dGhfY29kZV0gPSBBY2NvdW50O1xcbiAgICAgICAgbGV0IHR5cGUgPSBnZXRWYXIoJ1dhcmVob3VzZS5jb21tZW50LnR5cGUnKSB8fCAnZ29vZCc7XFxuICAgICAgICBxcT1xcXx8XFxcIlxcXCI7XFxuICAgICAgICBhdXRoX2NvZGU9YXV0aF9jb2RlfHxcXFwiXFxcIjtcXG4gICAgICAgIGlmKHFxPT1cXFwiXFxcInx8YXV0aF9jb2RlPT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZih0ZXh0PT1cXFwiXFxcIil7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S9oOi/mOS7gOS5iOmDveayoeWGmeWVilxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBmdW5jdGlvbiByKHApIHtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChpbnB1dCwge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICAgICAnY29udGVudC10eXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHApLFxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHAgPSB7XFxuICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcImRpc2N1c3NfdGV4dFxcXCI6IHRleHQsXFxuICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxLFxcbiAgICAgICAgICAgICAgICBcXFwiZGlzY3Vzc190eXBlXFxcIjogdHlwZSxcXG4gICAgICAgICAgICAgICAgXFxcImF1dGhfY29kZVxcXCI6IGF1dGhfY29kZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCByZXN1bHQgPSByKHApO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09PTApe1xcbiAgICAgICAgICAgIGJhY2soZmFsc2UpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIrcmVzdWx0LmRldGFpbDtcXG5cXG4gICAgfSx1c2VyKVxcbn0pO1xcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuS8queUqOaIt+azqOWGjFwiLFwicGF0aFwiOlwiVXNlcnJlZ2lzdHJhdGlvblwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBhcGksXFxuICAgIGdldEZpbGUsXFxuICAgIGdldFVzZXJEYXRlXFxufSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeVxcXCIpO1xcbmxldCBkYXRhID0gW107XFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbnNldFBhZ2VUaXRsZShcXFwi55So5oi35YiX6KGo566h55CGXFxcIik7XFxuYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5tLnFxXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UubS55em1cXFwiKTtcXG59KSk7XFxubGV0IHVzZXIgPSBnZXRGaWxlKCk7XFxubGV0IHVzZXJOYW1lID0gdXNlci51c2VyIHx8IFtcXFwiXFxcIl07XFxudXNlck5hbWUgPSB1c2VyTmFtZVswXTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxiaWc+KOa3u+WKoC/pqozor4Ep6LSm5Y+3PC9iaWc+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6I635Y+WXFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaVxcVxcXCIsXFxuICAgIHVybDogJC50b1N0cmluZygoYSwgYikgPT4ge1xcbiAgICAgICAgbGV0IHFxID0gaW5wdXQ7XFxuICAgICAgICBpZiAocXEgPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5L2g6L+Y5LuA5LmI6YO95rKh5aGr5ZWKIVxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi6I635Y+W5LitLi4uXFxcIilcXG4gICAgICAgIHJldHVybiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChxcSwgYSwgYikgPT4ge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBcXFwicXFcXFwiOiBxcVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0MiA9IEpTT04ucGFyc2UocmVxdWVzdChiICsgXFxcIj9xcT1cXFwiICsgcXEpKTtcXG4gICAgICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyByZXN1bHQyLmRldGFpbDtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgICB0aHJvdyBlO1xcbiAgICAgICAgfVxcbiAgICAgICAgfSwgcXEsIGEsIGIpO1xcblxcbiAgICB9LCBhcGkuZGlzX25ld191c2VyLCBhcGkuZGlzX3ZlcmlmeSksXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0eXBlOiBcXFwibnVtYmVyXFxcIixcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKSB8fCB1c2VyTmFtZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UubS5xcVxcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuXFxuZGF0YS5wdXNoKHtcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGRlc2M6IFxcXCLor7fovpPlhaXpqozor4HnoIFcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0VmFyKCdXYXJlaG91c2UubS55em0nLCAnJyksXFxuICAgICAgICBvbkNoYW5nZTogJ3B1dFZhcihcXFwiV2FyZWhvdXNlLm0ueXptXFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogJ3JpY2hfdGV4dCcsXFxuICAgIHRpdGxlOiBcXFwiPHNtYWxsPuaPkOekuu+8mjEu5q+P5aSp5Y+q6IO96I635Y+WNeasoemqjOivgeeggS48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi48cz7pqozor4HnoIHmnInmlYjmnJ/mjIHnu63kuIDlkajlt6blj7M8L3M+KOaaguaXtuS4jeS8mu+8jOW/mOiusOmqjOivgeeggeWPr+mAmui/h1FR5Y+36I635Y+WKTwvc21hbGw+XFxcIlxcbn0pO1xcblxcbmxldCB1c2VyTGlzdCA9IGdldFVzZXJEYXRlKCk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpqozor4Ev55m75b2VXFxcIixcXG4gICAgdXJsOiAkKFxcXCLnoa7lrprkv53lrZjvvIzpqozor4HnoIHloavplJnvvIzml6Dms5Xor4Torrrlk6ZcXFwiKS5jb25maXJtKChmLCBsLCBsb2dpbikgPT4ge1xcbiAgICAgICAgbGV0IHFxID0gZ2V0VmFyKCdXYXJlaG91c2UubS5xcScsICcnKTtcXG4gICAgICAgIGxldCB5em0gPSBnZXRWYXIoJ1dhcmVob3VzZS5tLnl6bScsICcnKTtcXG4gICAgICAgIGlmIChxcSA9PSBcXFwiXFxcIiB8fCB5em0gPT0gXFxcIlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vcXHmiJbpqozor4HnoIHkuLrnqbpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QobG9naW4sIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJxcVxcXCI6IHFxLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcImF1dGhfY29kZVxcXCI6IHl6bVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCdcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmVzdWx0ID0gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG4gICAgICAgIGlmIChyZXN1bHQuc3RhdHVzID09PSAwKSB7XFxuICAgICAgICAgICAgZi51c2VyID0gW3FxLCB5em1dO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9XYXJlaG91c2VVU0VSLmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShmKSk7XFxuICAgICAgICAgICAgbGV0IGluZGV4ID0gbC5maW5kSW5kZXgoaXRlbSA9PiBpdGVtWzBdID09PSBxcSk7XFxuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoaW5kZXgsIDEsIFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChsLmxlbmd0aCA8IDYpIHtcXG4gICAgICAgICAgICAgICAgbC5wdXNoKFtxcSwgeXptXSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgbC5zcGxpY2UoMCwgMSk7XFxuICAgICAgICAgICAgICAgIGwucHVzaChbcXEsIHl6bV0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUkEuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGwpKTtcXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mqjOivgeaIkOWKn1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vXFxcIiArIHJlc3VsdC5kZXRhaWw7XFxuICAgIH0sIHVzZXIsIHVzZXJMaXN0LCBhcGkuZGlzX2xvZ2luKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbmRhdGEucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuKAnOKAnOKAneKAnTxiaWc+6LSm5Y+35YiX6KGoPC9iaWc+XFxcXHRcXFxcdFxcXFx0PHNtYWxsPijkv53nlZk15p2h6K6w5b2VKTwvc21hbGw+XFxcIixcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbn0pO1xcbnVzZXJMaXN0LnJldmVyc2UoKTtcXG5cXG5mb3IgKGxldCBpdGVtIG9mIHVzZXJMaXN0KSB7XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIui0puWPt++8mlxcXCIgKyBpdGVtWzBdICsgKHVzZXJOYW1lID09PSBpdGVtWzBdID8gXFxcIlxcXFx0XFxcXHRcXFxcdOKAnOKAnFvlvZPliY3otKblj7dd4oCd4oCdXFxcIiA6IFxcXCJcXFwiKSxcXG4gICAgICAgIGRlc2M6IFxcXCLpqozor4HnoIHvvJpcXFwiICsgaXRlbVsxXSxcXG4gICAgICAgIHVybDogJChcXFwi5piv5ZCm5YiH5o2i5Li66K+lW1xcXCIgKyBpdGVtWzBdICsgXFxcIl3otKblj7dcXFwiKS5jb25maXJtKChmLCBpdGVtKSA9PiB7XFxuICAgICAgICAgICAgZi51c2VyID0gaXRlbTtcXG4gICAgICAgICAgICB3cml0ZUZpbGUoXFxcImhpa2VyOi8vZmlsZXMvV2FyZWhvdXNlVVNFUi5qc29uXFxcIiwgSlNPTi5zdHJpbmdpZnkoZikpO1xcbiAgICAgICAgICAgIGJhY2soKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0sIHVzZXIsIGl0ZW0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiXFxuICAgIH0pO1xcbn1cXG5kYXRhLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZGF0YS5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgIDlh7rotKblj7dcXFwiLFxcbiAgICB1cmw6ICQoXFxcIuehruiupOmAgOWHuueZu+W9leeKtuaAgVxcXCIpLmNvbmZpcm0oKGYpID0+IHtcXG4gICAgICAgIGYudXNlciA9IFtdO1xcbiAgICAgICAgd3JpdGVGaWxlKFxcXCJoaWtlcjovL2ZpbGVzL1dhcmVob3VzZVVTRVIuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGYpKTtcXG4gICAgICAgIGJhY2soKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgIDlh7rmiJDlip9cXFwiO1xcbiAgICB9LCB1c2VyKSxcXG4gICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJ1xcbn0pO1xcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWIl+ihqOaOkuW6j+eul+azlVwiLFwicGF0aFwiOlwic29ydFwiLFwicnVsZVwiOlwianM6XFxuLyog6KeE5YiZ5YiX6KGo5o6S5bqPIFsgVVDjgIFORVfjgIHml6Dmm7TmlrAgXSDpobrluo8gKi9cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG5mdW5jdGlvbiBtZXJnZVNvcnQoYXJyKSB7XFxuICAgIHZhciBsZW4gPSBhcnIubGVuZ3RoO1xcbiAgICBpZiAobGVuIDwgMikge1xcbiAgICAgICAgcmV0dXJuIGFycjtcXG4gICAgfVxcbiAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW4gLyAyKSxcXG4gICAgICAgIGxlZnQgPSBhcnIuc2xpY2UoMCwgbWlkZGxlKSxcXG4gICAgICAgIHJpZ2h0ID0gYXJyLnNsaWNlKG1pZGRsZSk7XFxuICAgIHJldHVybiBtZXJnZShtZXJnZVNvcnQobGVmdCksIG1lcmdlU29ydChyaWdodCkpO1xcbn1cXG5mdW5jdGlvbiBtZXJnZShsZWZ0LCByaWdodCkge1xcbiAgICB2YXIgcmVzdWx0ID0gW107XFxuICAgIHZhciBpc1RoaXNWZXJzaW9uTGlzdCA9IFtdO1xcblxcbiAgICB3aGlsZSAobGVmdC5sZW5ndGggPiAwICYmIHJpZ2h0Lmxlbmd0aCA+IDApIHtcXG4gICAgICAgIGlmIChsZWZ0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aZXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgfSBlbHNlIGlmIChyaWdodFswXS50aXRsZS5pbmNsdWRlcyhcXFwi8J+GmVxcXCIpKSB7XFxuICAgICAgICAgICAgcmVzdWx0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKGxlZnRbMF0udGl0bGUuaW5jbHVkZXMoXFxcIvCfhpVcXFwiKSkge1xcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxuICAgICAgICB9IGVsc2UgaWYgKHJpZ2h0WzBdLnRpdGxlLmluY2x1ZGVzKFxcXCLwn4aVXFxcIikpIHtcXG4gICAgICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgaXNUaGlzVmVyc2lvbkxpc3QucHVzaChsZWZ0LnNoaWZ0KCkpO1xcbiAgICAgICAgICAgIGlzVGhpc1ZlcnNpb25MaXN0LnB1c2gocmlnaHQuc2hpZnQoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG5cXG4gICAgd2hpbGUgKGlzVGhpc1ZlcnNpb25MaXN0Lmxlbmd0aCkgcmVzdWx0LnB1c2goaXNUaGlzVmVyc2lvbkxpc3Quc2hpZnQoKSk7XFxuXFxuICAgIHdoaWxlIChsZWZ0Lmxlbmd0aClcXG4gICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7XFxuXFxuICAgIHdoaWxlIChyaWdodC5sZW5ndGgpXFxuICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTtcXG5cXG4gICAgcmV0dXJuIHJlc3VsdDtcXG59XFxuJC5leHBvcnRzLm1lcmdlU29ydCA9IG1lcmdlU29ydDtcXG4vKiDlvZLlubbmjpLluo8gRW5kICovXCJ9LHtcImNvbF90eXBlXCI6XCJpY29uXzJfcm91bmRcIixcIm5hbWVcIjpcIuWFqOmDqOWFrOW8gOinhOWImVwiLFwicGF0aFwiOlwiQWxsUHVibGljUnVsZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGNvbnN0IHtcXG4gICAgICAgIGFwaSxcXG4gICAgICAgIGxvY2FsUnVsZVZlcixcXG4gICAgICAgIGdldEFwaVxcbiAgICB9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuY29uc3Qge1xcbiAgICBtZXJnZVNvcnRcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2Uvc29ydFxcXCIpO1xcbmxldCBkYXRhVHlwZSA9IGdldFZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiLCBcXFwiXFxcIik7XFxubGV0IG9yZGVyID0gZ2V0VmFyKFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiLCBcXFwiMFxcXCIpO1xcbmxldCBzb3J0ID0gZ2V0VmFyKFxcXCJXYXJlaG91c2Uuc29ydFxcXCIsIFxcXCIwXFxcIik7XFxubGV0IGdvb2QgPSBnZXRWYXIoXFxcIldhcmVob3VzZS5nb29kXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBwYWdlID0gTVlfVVJMLnNwbGl0KFxcXCIjXFxcIilbMV0gfHwgMTtcXG5sZXQgcnVsZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmFsbF9ydWxlICsgXFxcIj9kYXRhX3R5cGU9XFxcIiArIGRhdGFUeXBlICsgXFxcIiZwYWdlPVxcXCIgKyBwYWdlICsgXFxcIiZsaW1pdD0yMCZvcmRlcj1cXFwiICsgb3JkZXIgKyBcXFwiJnNvcnQ9XFxcIiArIHNvcnQrIFxcXCImaXNfZ29vZD1cXFwiICsgZ29vZCkpLnJlc3VsdDtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnR5cGVcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5vcmRlclxcXCIpO1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLnNvcnRcXFwiKTtcXG4gICAgY2xlYXJWYXIoXFxcIldhcmVob3VzZS5nb29kXFxcIik7XFxuICAgIGNsZWFyVmFyKFxcXCJXYXJlaG91c2UuYmFja1xcXCIpO1xcbn0pKTtcXG5sZXQgZGF0YSA9IFtdO1xcbmlmIChnZXRWYXIoXFxcIldhcmVob3VzZS5iYWNrXFxcIikgPT09IFxcXCIxXFxcIikge1xcbiAgICBiYWNrKCk7XFxufVxcbmZ1bmN0aW9uIHRhYihhcnIsIHR5cGUsIGNvbnRyYXN0KSB7XFxuICAgIGZvciAobGV0IGl0ZW0gb2YgYXJyKSB7XFxuICAgICAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBpdGVtWzFdID09PSBjb250cmFzdCA/IFxcXCLigJzigJxcXFwiICsgaXRlbVswXSArIFxcXCLigJ3igJ1cXFwiIDogaXRlbVswXSxcXG4gICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGtleSwgdHlwZSkgPT4ge1xcbiAgICAgICAgICAgICAgICBwdXRWYXIodHlwZSwga2V5KTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgICAgIH0sIGl0ZW1bMV0sIHR5cGUpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIGRhdGEucHVzaCh7XFxuICAgICAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIlxcbiAgICB9KTtcXG59XFxuaWYgKHBhZ2UgPT09IFxcXCIxXFxcIikge1xcbiAgICB0YWIoW1xcbiAgICAgICAgW1xcXCLlhajpg6hcXFwiLCBcXFwiXFxcIl0sXFxuICAgICAgICBbXFxcIuWwj+eoi+W6j1xcXCIsIFxcXCJob21lX3J1bGVfdXJsXFxcIl0sXFxuICAgICAgICBbXFxcIuaPkOS6pOS6keS7k+W6k+inhOWImVxcXCIsIFxcXCJwdWJsaXNoXFxcIl0sXFxuICAgICAgICBbXFxcIue9kemhteaPkuS7tlxcXCIsIFxcXCJqc191cmxcXFwiXSxcXG4gICAgICAgIFtcXFwi6Z2Z5oCB6aG16Z2iXFxcIiwgXFxcImh0bWxcXFwiXSxcXG4gICAgICAgIFtcXFwi5Li76aKYXFxcIiwgXFxcImNvbmZpZ1xcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2UudHlwZVxcXCIsIGRhdGFUeXBlKTtcXG4gICAgdGFiKFtcXG4gICAgICAgIFtcXFwi5pe26Ze0XFxcIiwgXFxcIjBcXFwiXSxcXG4gICAgICAgIFtcXFwiSURcXFwiLCBcXFwiMVxcXCJdLFxcbiAgICAgICAgW1xcXCLlpb3or4TluqZcXFwiLCBcXFwiMlxcXCJdLFxcbiAgICAgICAgW1xcXCLlt67or4TluqZcXFwiLCBcXFwiM1xcXCJdLFxcbiAgICAgICAgW1xcXCLlm57lpI3mlbBcXFwiLCBcXFwiNFxcXCJdXFxuICAgIF0sIFxcXCJXYXJlaG91c2Uub3JkZXJcXFwiLCBvcmRlcik7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuWAkuW6j1xcXCIsIFxcXCIwXFxcIl0sXFxuICAgICAgICBbXFxcIuato+W6j1xcXCIsIFxcXCIxXFxcIl1cXG4gICAgXSwgXFxcIldhcmVob3VzZS5zb3J0XFxcIiwgc29ydCk7XFxuICAgIHRhYihbXFxuICAgICAgICBbXFxcIuS4jeiuulxcXCIsIFxcXCJcXFwiXSxcXG4gICAgICAgIFtcXFwi5LyY6LSoXFxcIiwgXFxcIjFcXFwiXVxcbiAgICBdLCBcXFwiV2FyZWhvdXNlLmdvb2RcXFwiLCBnb29kKTtcXG4gICAgZGF0YS5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5pCc57SiXFxcIixcXG4gICAgICAgIHVybDogJC50b1N0cmluZyhuYW1lID0+IFxcXCJoaWtlcjovL3NlYXJjaD9zPVxcXCIgKyBpbnB1dCArIFxcXCImcnVsZT1cXFwiICsgbmFtZSwgTVlfUlVMRS50aXRsZSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgICAgIGRlc2M6IFxcXCLmkJzntKLlhajpg6jop4TliJlcXFwiXFxuICAgIH0pO1xcbn1cXG5cXG5sZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKHJlcXVlc3QoYXBpLmhvbWUpKTtcXG5sZXQgbVJ1bGVMaXN0ID0gW107XFxuZm9yICh2YXIgaXRlbSBvZiBydWxlTGlzdCkge1xcbiAgICB2YXIgbmFtZSA9IGl0ZW0ubmFtZTtcXG4gICAgaWYgKGl0ZW0uaXNfdGFwKSB7XFxuICAgICAgICBsZXQgbG9jYXRpb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZ2V0QXBpKFxcXCJydWxlTGlzdEpzb25cXFwiKSArIFxcXCI/aWQ9XFxcIiArIGl0ZW0uaWQpKTtcXG4gICAgICAgIGl0ZW0uaWQgPSBsb2NhdGlvbi5pZDtcXG4gICAgICAgIGl0ZW0ubmFtZSA9IGxvY2F0aW9uLm5hbWU7XFxuICAgICAgICBpdGVtLmF1dGhvciA9IGxvY2F0aW9uLmF1dGhvcjtcXG4gICAgICAgIGl0ZW0uZGF0YV90eXBlID0gbG9jYXRpb24uZGF0YV90eXBlO1xcbiAgICAgICAgaXRlbS52ZXIgPSBsb2NhdGlvbi52ZXJcXG4gICAgfVxcbiAgICBpdGVtLnZlcnNpb24gPSBpdGVtLnZlcjtcXG4gICAgbGV0IGxhYmVsID0gXFxcIlxcXCIsXFxuICAgICAgICBsdmVyID0gLTI7XFxuICAgIGlmIChpdGVtLmlzX2pzb24gJiYgaXRlbS5kYXRhX3R5cGUgPT09IFxcXCJob21lX3J1bGVfdXJsXFxcIikge1xcbiAgICAgICAgbHZlciA9IGxvY2FsUnVsZVZlcihob21lTGlzdCwgaXRlbSk7XFxuICAgICAgICBpZiAobHZlciA9PT0gLTEpIHtcXG4gICAgICAgICAgICBsYWJlbCA9IFxcXCLwn4aVXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAobHZlciA8IGl0ZW0udmVyKSB7XFxuICAgICAgICAgICAgbGFiZWwgPSBcXFwi8J+GmVxcXCI7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbVJ1bGVMaXN0LnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGxhYmVsICsgbmFtZSxcXG4gICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9ydWxlRGV0YWlsI25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5I1xcXCIsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGx2ZXI6IGx2ZXIsXFxuICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsXFxuICAgICAgICAgICAgaXNBbGw6dHJ1ZVxcbiAgICAgICAgfSxcXG4gICAgICAgIHBpY191cmw6IGl0ZW0ucGljLFxcbiAgICB9KVxcbn1cXG4vKiDlvZLlubbmjpLluo8gU3RhcnQgKi9cXG4vL21SdWxlTGlzdCA9IG1lcmdlU29ydChtUnVsZUxpc3QpO1xcbi8qIOW9kuW5tuaOkuW6jyBFbmQgKi9cXG5kYXRhLnB1c2guYXBwbHkoZGF0YSwgbVJ1bGVMaXN0KVxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWbnuWkjVwiLFwicGF0aFwiOlwiUmVwbHlcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkYXRhID0gW107XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgcmVwbHlJZCxcXG4gICAgcnVsZUlkLFxcbiAgICBuYW1lLFxcbiAgICBwYXNzd29yZCxcXG4gICAgdXNlcm5hbWVcXG59ID0gTVlfUEFSQU1TO1xcblxcblxcbnNldFBhZ2VUaXRsZShcXFwi5Zue5aSNKFxcXCIgKyBuYW1lICsgXFxcIilcXFwiKTtcXG5hZGRMaXN0ZW5lcignb25DbG9zZScsICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICBjbGVhclZhcihcXFwiV2FyZWhvdXNlLmNvbW1lbnQudGV4dFxcXCIpO1xcbiAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxufSkpO1xcblxcbmRhdGEucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLlm57lpI0uLi4uLi5cXFwiLFxcbiAgICBjb2xfdHlwZTogJ2lucHV0JyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldFZhcignV2FyZWhvdXNlLmNvbW1lbnQudGV4dCcsICcnKSxcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6NyxcXG4gICAgICAgIG9uQ2hhbmdlOiAncHV0VmFyKFxcXCJXYXJlaG91c2UuY29tbWVudC50ZXh0XFxcIixpbnB1dCknXFxuICAgIH1cXG59KTtcXG5cXG5cXG5kYXRhLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuaPkOS6pFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogJChhcGkuZGlzX3JlcGx5ICsgcnVsZUlkKS5sYXp5UnVsZSgocGFzc3dvcmQsIHVzZXJuYW1lLCBydWxlSWQpID0+IHtcXG4gICAgICAgIGxldCB0ZXh0ID0gZ2V0VmFyKCdXYXJlaG91c2UuY29tbWVudC50ZXh0JywgJycpO1xcbiAgICAgICAgaWYgKHBhc3N3b3JkID09IFxcXCJcXFwiIHx8IHVzZXJuYW1lID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lei0puWPt1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodGV4dCA9PSBcXFwiXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kvaDov5jku4DkuYjpg73msqHlhpnllYpcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlcXVlc3QoaW5wdXQsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX3RleHRcXFwiOiB0ZXh0LFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInFxXFxcIjogdXNlcm5hbWUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFzc3dvcmRcXFwiOiBwYXNzd29yZCxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJkaXNjdXNzX2lkXFxcIjogcnVsZUlkXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSxcXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJ1xcbiAgICAgICAgfSk7XFxuICAgICAgICByZXN1bHQgPSBKU09OLnBhcnNlKHJlc3VsdCkucmVzdWx0O1xcbiAgICAgICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IDApIHtcXG4gICAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgcmVzdWx0LmRldGFpbDtcXG5cXG4gICAgfSwgcGFzc3dvcmQsIHVzZXJuYW1lLCByZXBseUlkKVxcbn0pO1xcblxcbnNldFJlc3VsdChkYXRhKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuaIkeeahOWbnuWkjVwiLFwicGF0aFwiOlwiTXlSZXBseVwiLFwicnVsZVwiOlwianM6XFxuY29uc3Qge1xcbiAgICBhcGlcXG59ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IHtcXG4gICAgYXV0aF9jb2RlLFxcbiAgICBxcVxcbn0gPSBNWV9QQVJBTVM7XFxubGV0IHBhZ2UgPSBwYXJzZUludChNWV9VUkwuc3BsaXQoXFxcIiNcXFwiKVsxXSk7XFxubGV0IGRhdGE9W107XFxubGV0IGNvbW1lbnRMaXN0ID0gSlNPTi5wYXJzZShyZXF1ZXN0KGFwaS5kaXNfZ2V0X3JlcGx5ICsgXFxcIj9saW1pdD01JnBhZ2U9XFxcIiArIHBhZ2UgKyBcXFwiJnFxPVxcXCIgKyBxcSArIFxcXCImYXV0aF9jb2RlPVxcXCIgKyBhdXRoX2NvZGUpKS5yZXN1bHQ7XFxuaWYgKGNvbW1lbnRMaXN0Lmxlbmd0aCA9PT0gMCkge1xcbiAgICBkYXRhLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IFxcXCI8aDUgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz7liKvmi4nkuobkuIDmnaHkuZ/kuI3liankuoY8L2g1PlxcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCJcXG4gICAgfSk7XFxufSBlbHNlIHtcXG4gICAgZm9yIChsZXQgaXRlbSBvZiBjb21tZW50TGlzdCkge1xcbiAgICAgICAgZGF0YS5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogaXRlbS5uYW1lICsgXFxcIiZuYnNwOyZuYnNwOzxmb250IGNvbG9yPSdncmF5Jz48c21hbGw+I1xcXCIgKyBpdGVtLmlkICsgXFxcIjwvc21hbGw+PGZvbnQ+XFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcImF2YXRhclxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVEZXRhaWwjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjXFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsdmVyOiBcXFwi5Zue5aSN6L+b5YWl5LiN5pSv5oyB5p+l55yLXFxcIixcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0ucnVsZV9pZFswXVxcbiAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgcGljX3VybDogaXRlbS5hdmF0YXJfdXJsXFxuICAgICAgICB9KTtcXG4gICAgICAgIGRhdGEucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IGl0ZW0uZGlzY3Vzc190ZXh0LFxcbiAgICAgICAgICAgIGRlc2M6IGl0ZW0uY3JlYXRlX2RhdGUgKyBcXFwiwrdcXFwiK2l0ZW0ucnVsZV9pZFsxXStcXFwiwrdcXFwiK1xcXCLlvIDlj5HogIXwn5ejXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMVxcXCIsXFxuICAgICAgICAgICAgdXJsOiBcXFwiaGlrZXI6Ly9wYWdlL2luZm9cXFwiLFxcbiAgICAgICAgICAgIGV4dHJhOntcXG4gICAgICAgICAgICAgICAgbmFtZTppdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIHR5cGU6XFxcImxvbmdfdGV4dFxcXCIsXFxuICAgICAgICAgICAgICAgIHRleHQ6aXRlbS5kaXNjdXNzX3RleHRcXG4gICAgICAgICAgICB9LFxcbiAgICAgICAgICAgIHBpY191cmw6IGl0ZW0uYXZhdGFyX3VybFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgXFxufVxcbnNldFJlc3VsdChkYXRhKTtcXG5cIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuabtOWkmuWIhuS6q1wiLFwicGF0aFwiOlwibW9yZVNoYXJlXCIsXCJydWxlXCI6XCJqczpcXG4gICAgYWRkTGlzdGVuZXIoJ29uQ2xvc2UnLCAkLnRvU3RyaW5nKCgpPT57XFxuICAgICAgICBjbGVhclZhcihcXFwiaG91c2UudXBsb2FkX2NvZGVcXFwiKTtcXG4gICAgfSkpO1xcbmNvbnN0IHtjb2xvcixzbWFsbCxhcGksIGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxubGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbmxldCBwdXRfdXJsID0gYXBpLmhvc3QrJy9oaWtlcnVsZS9kZXYvcHV0JztcXG5pZighaG91c2VGaWxlKXtcXG4gICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxufVxcbmxldCBob3VzZV9kYXRhID0gaG91c2VGaWxlKCk7XFxuLy8gbG9nKGhvdXNlX2RhdGEudXNlcm5hbWUrJy0nK2hvdXNlX2RhdGEucGFzc3dvcmQpO1xcbnZhciBjYW51cCA9IGhvdXNlX2RhdGEudXNlcm5hbWUubGVuZ3RoID49IDYgJiYgaG91c2VfZGF0YS5wYXNzd29yZC5sZW5ndGggPiAyO1xcbmxvZygn5Y+v5Lul5LiK5LygPycrY2FudXApO1xcbmxldCBkID0gW107XFxubGV0IGZpbGVfdHlwZSA9IFt7bmFtZTon6Z2Z5oCB5paH5Lu2Jyx2YWx1ZTonaHRtbCd9LHtuYW1lOifnvZHpobXmj5Lku7YnLHZhbHVlOidqc191cmwnfSx7bmFtZTon5Li76aG16YWN572uJyx2YWx1ZTonY29uZmlnJ31dOyAvL+S4iuS8oOexu+Wei1xcbmxldCBmaWxlX3JlZGlyZWN0ID0gW3tuYW1lOifmnKzlnLAnLHZhbHVlOidmYWxzZSd9LHtuYW1lOifnm7Tpk74zMDInLHZhbHVlOid0cnVlJ31dOyAvL+aYr+WQpumHjeWumuWQkVxcbmxldCBmaWxlX3VhID0gW3tuYW1lOifnlLXohJEnLHZhbHVlOidwYyd9LHtuYW1lOifmiYvmnLonLHZhbHVlOidtb2JpbGUnfV07XFxubGV0IGZpbGVfdHlwZV90aXRsZSA9IGZpbGVfdHlwZS5tYXAoKGl0ZW0pID0+IHtcXG4gICAgbGV0IG5hbWUgPSBnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxubGV0IGZpbGVfcmVkaXJlY3RfdGl0bGUgPSBmaWxlX3JlZGlyZWN0Lm1hcCgoaXRlbSkgPT4ge1xcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxubGV0IGZpbGVfdWFfdGl0bGUgPSBmaWxlX3VhLm1hcCgoaXRlbSkgPT4ge1xcbiAgICBsZXQgbmFtZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKTtcXG4gICAgaWYoaXRlbS5uYW1lPT09bmFtZSl7XFxuICAgICAgICByZXR1cm4gJ/CfkYknK2l0ZW0ubmFtZTtcXG4gICAgfWVsc2V7XFxuICAgICAgICByZXR1cm4gaXRlbS5uYW1lO1xcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtjb2xfdHlwZTogJ3g1X3dlYnZpZXdfc2luZ2xlJywgZXh0cmE6IHtqczogJ2NvbnNvbGUubG9nKFxcXCLmiJHliqDovb3kuoZcXFwiKSd9fSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfojrflj5YnLFxcbiAgICBkZXNjOiBcXFwi5paH5Lu26Lev5b6ELOaUr+aMgWhpa2VyLGZpbGUsaHR0cCzkuLvpophcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6IFxcXCJwdXRWYXIoJ2hvdXNlLndlYl91cmwnLGlucHV0KVxcXCIsXFxuICAgICAgICB0aXRsZVZpc2libGU6IHRydWUsXFxuICAgICAgICBpZDonZmlsZVBhdGgnLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOmdldFZhcignaG91c2Uud2ViX3VybCcpXFxuICAgIH0sXFxuICAgIHVybDokLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgaWYoaW5wdXQubGVuZ3RoPDIpe1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/pk77mjqXkuI3lj6/ku6XkuLrnqbonXFxuICAgICAgICB9IGVsc2UgaWYoL15oaWtlcjp8XmZpbGU6fF5odHRwOnxeaHR0cHM6fF5cXFxcL3N0b3JhZ2VcXFxcL3xeXFxcXC9zZGNhcmRcXFxcLy8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGlmKC9eXFxcXC9zdG9yYWdlXFxcXC98XlxcXFwvc2RjYXJkXFxcXC8vLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICAgICAgaW5wdXQgPSAnZmlsZTovLycraW5wdXQ7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5q2j5bi46ZO+5o6lOicraW5wdXQpO1xcbiAgICAgICAgICAgIGxldCB1YSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnPydNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvODguMC40MzI0LjE0NiBTYWZhcmkvNTM3LjM2JzonTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDk7IE1JIDYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OS4wLjQzODkuOTAgTW9iaWxlIFNhZmFyaS81MzcuMzYnO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsX2FyciA9IGlucHV0LnNwbGl0KCc7Jyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmwgPSB3ZWJfdXJsX2FyclswXTtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOidodHRwczovL2Jsb2cuY3Nkbi5uZXQnLFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgICAgICdBY2NlcHQnOidhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJyxcXG4gICAgICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6J3poLUNOJyxcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MyYmd2ViX3VybF9hcnJbMl0ubGVuZ3RoPjIpeyAvL+iuvue9rue8lueggVxcbiAgICAgICAgICAgICAgICBoZWFkZXJzWydjb250ZW50LXR5cGUnXSA9ICdjaGFyc2V0PScrd2ViX3VybF9hcnJbMl0udG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHtoZWFkZXJzOmhlYWRlcnMsd2l0aEhlYWRlcnM6ZmFsc2UscmVkaXJlY3Q6ZmFsc2V9O1xcbiAgICAgICAgICAgIGlmKHdlYl91cmxfYXJyLmxlbmd0aD49MiYmd2ViX3VybF9hcnJbMV0ubGVuZ3RoPjIpeyAvLyDorr7nva7or7fmsYLmlrnms5VcXG4gICAgICAgICAgICAgICAgcGFyYW1zWydtZXRob2QnXSA9IHdlYl91cmxfYXJyWzFdLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZygn5byA5aeL6I635Y+W5rqQ56CBJyk7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgLypcXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFzeW5jKHdlYl91cmwscGFyYW1zLGZ1bmN0aW9uIChrZXksY29kZSkge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGNvZGU7XFxuICAgICAgICAgICAgICAgICAgICBpZihiYWNrX2NvZGUubGVuZ3RoPjIwKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOacrOasoeiOt+WPluWIsOepuuaWh+acrO+8jOeWkeS8vOS9oOayoeacieatpOaWh+S7tiEnO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgKi9cXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tfY29kZSA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnKT09PSfnlLXohJEnP2ZldGNoKHdlYl91cmwscGFyYW1zKTpyZXF1ZXN0KHdlYl91cmwscGFyYW1zKTtcXG4gICAgICAgICAgICAgICAgaWYoYmFja19jb2RlLmxlbmd0aD4yMCl7XFxuICAgICAgICAgICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJyxiYWNrX2NvZGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5bey6I635Y+WLOW5tumDqOWIhuaPkuWFpeWIsOaWh+acrOWMuuWfnydcXG4gICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W5Yiw56m65paH5pys77yM55aR5Ly85L2g5rKh5pyJ5q2k5paH5Lu2ISc7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/lj5HnlJ/kuobplJnor686XFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9ZWxzZSBpZigv5Li76aKY77+lfOWFg+e0oO+/pS8udGVzdChpbnB1dCkpe1xcbiAgICAgICAgICAgIGxvZygn5Li76aKY6ZO+5o6lJyk7XFxuICAgICAgICAgICAgbGV0IHdlYl91cmxfYXJyID0gaW5wdXQuc3BsaXQoJ++/pScpO1xcbiAgICAgICAgICAgIGxldCB3ZWJfdXJsID0gd2ViX3VybF9hcnJbd2ViX3VybF9hcnIubGVuZ3RoLTFdO1xcbiAgICAgICAgICAgIGxldCBiYWNrX2NvZGUgPSBwYXJzZVBhc3RlKHdlYl91cmwpO1xcbiAgICAgICAgICAgIGlmKGJhY2tfY29kZS5sZW5ndGg+MjApIHtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS51cGxvYWRfY29kZScsYmFja19jb2RlKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/mupDnoIHlt7Lojrflj5Ys5bm26YOo5YiG5o+S5YWl5Yiw5paH5pys5Yy65Z+fJ1xcbiAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v6ZSZ6K+v77yM5pys5qyh6I635Y+W6L+U5Zue5Li6OlxcXFxuJytiYWNrX2NvZGU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mdnuazlemTvuaOpTpcXFxcbicrZ2V0VmFyKCdob3VzZS53ZWJfdXJsJyk7XFxuICAgICAgICB9XFxuICAgIH0pLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi6YCJ5oup5paH5Lu26Lev5b6EXFxcIixcXG4gICAgdXJsOiQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBmID0gcmVxdWlyZShcXFwiaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvanMvZmlsZVNlbGVjdC5qc1xcXCIpO1xcbiAgICAgICAgcmV0dXJuIGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICAgICAgY2FsbGJhY2s6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImZpbGVQYXRoXFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oXFxcImZpbGVQYXRoXFxcIiwge1xcbiAgICAgICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgICAgICAgICAgICB9KVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcHV0VmFyKCdob3VzZS53ZWJfdXJsJyxQQVRIKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgZmlsZVR5cGU6IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIHBhdHRlcm46IDBcXG4gICAgICAgIH0pO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTon5LiK5Lyg57G75Z6LJyxcXG4gICAgZGVzYzon5LiK5Lyg5paH5Lu255qE57G75Z6LLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsJ+mdmeaAgeaWh+S7ticpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3R5cGVfdGl0bGUsMikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgIHNldEl0ZW0oJ2hvdXNlLmZpbGVfdHlwZScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifmlofku7blrprkvY0nLFxcbiAgICBkZXNjOifmlofku7bmmK/lkKblsZ7kuo7ph43lrprlkJEs5b2T5YmN5Li6OicrY29sb3IoZ2V0SXRlbSgnaG91c2UuZmlsZV9yZWRpcmVjdCcsJ+acrOWcsCcpLCcjZmY3MDAwJyksXFxuICAgIGNvbF90eXBlOid0ZXh0XzEnLFxcbiAgICB1cmw6JChmaWxlX3JlZGlyZWN0X3RpdGxlLDIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICBzZXRJdGVtKCdob3VzZS5maWxlX3JlZGlyZWN0JyxpbnB1dC5yZXBsYWNlKCfwn5GJJywnJykpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g6YCJ5oup5LqGOicraW5wdXQ7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+iuvuWkh1VBJyxcXG4gICAgZGVzYzon5Y+R6LW3572R6aG16K+35rGC5aS05qCH6K+GLOW9k+WJjeS4ujonK2NvbG9yKGdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSwnI2ZmNzAwMCcpLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOiQoZmlsZV91YV90aXRsZSwyKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgc2V0SXRlbSgnaG91c2UuZmlsZV91YScsaW5wdXQucmVwbGFjZSgn8J+RiScsJycpKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+S9oOmAieaLqeS6hjonK2lucHV0O1xcbiAgICB9KVxcbn0pO1xcbmZ1bmN0aW9uIGNvbXBhcmUobmFtZSkge1xcbiAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgcmV0dXJuIGl0ZW0ubmFtZSA9PT0gbmFtZTtcXG4gICAgfVxcbn1cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+XhO+4j+eOr+WigycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKGZpbGVfdHlwZSxjb21wYXJlKT0+e1xcbiAgICAgICAgbG9nKCfmn6XnnIvnjq/looPlj5jph48nKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHVwX2NvZGUgPSBnZXRWYXIoJ2hvdXNlLnVwbG9hZF9jb2RlJywnJyk7XFxuICAgICAgICAgICAgbGV0IGZ0eXBlID0gIGZpbGVfdHlwZS5maWx0ZXIoY29tcGFyZShnZXRJdGVtKCdob3VzZS5maWxlX3R5cGUnLCfpnZnmgIHmlofku7YnKSkpWzBdLnZhbHVlO1xcbiAgICAgICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgICAgIGxldCBjb2RlID0gIXJlZGlyZWN0P3VwX2NvZGU6aW5wdXQ7XFxuICAgICAgICAgICAgbGV0IGVudiA9IHtcXG4gICAgICAgICAgICAgICAgd2ViX3VybDpnZXRWYXIoJ2hvdXNlLndlYl91cmwnLCcnKSxcXG4gICAgICAgICAgICAgICAgZGV2aWNlOmdldEl0ZW0oJ2hvdXNlLmZpbGVfdWEnLCfnlLXohJEnKSxcXG4gICAgICAgICAgICAgICAgZnR5cGU6ZnR5cGV8fFxcXCJcXFwiLFxcbiAgICAgICAgICAgICAgICByZWRpcmVjdDpyZWRpcmVjdCxcXG4gICAgICAgICAgICAgICAgY29kZTpjb2RlLnN1YnN0cmluZygwLDQwKXx8XFxcIlxcXCIsXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZyhlbnYpO1xcbiAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly8nK0pTT04uc3RyaW5naWZ5KGVudik7XFxuICAgICAgICAgICAgLy8gYWxlcnQoSlNPTi5zdHJpbmdpZnkoZW52KSk7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytlLm1lc3NhZ2U7XFxuICAgICAgICAgICAgLy8gYWxlcnQoZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG4gICAgfSxmaWxlX3R5cGUsY29tcGFyZSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+Tg+aVmeeoiycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkueDVSdWxlKCgpPT57XFxuICAgICAgICBsZXQgbXNnID0gJ+asoui/juS9v+eUqOW8gOWPkeiAheabtOWkmuWIhuS6q+W3peWFt1xcXFxuMS7ovpPlhaXnvZHlnYDkuLrmnKzlnLDmlofku7bot6/lvoQsaGlrZXI6Ly/miJbogIVmaWxlOi8v5byA5aS0XFxcXG4yLueCueWHu+e9keWdgOi+k+WFpeagj+WQjumdoueahOaMiemSrlxcXFxuMy7nnIvmlofmnKzpooTop4jljLrmmK/lkKbmraPnoa5cXFxcbjQu54K55Ye75LiK5Lyg5oyJ6ZKu5o+Q5Lqk5Yiw5LuT5bqTJztcXG4gICAgICAgIGFsZXJ0KG1zZyk7XFxuICAgIH0pXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J/Cfl5HvuI/muIXnqbonLFxcbiAgICBjb2xfdHlwZTonZmxleF9idXR0b24nLFxcbiAgICB1cmw6JCgpLmxhenlSdWxlKCgpPT57XFxuICAgICAgICBjbGVhclZhcignaG91c2UudXBsb2FkX2NvZGUnKTtcXG4gICAgICAgIHJlZnJlc2hQYWdlKHRydWUpO1xcbiAgICAgICAgcmV0dXJuICd0b2FzdDovL+W3sua4hemZpOmihOiniOWMuuWfn+WGheWuuSdcXG4gICAgfSlcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTon8J+TsuekuuS+iycsXFxuICAgIGNvbF90eXBlOidmbGV4X2J1dHRvbicsXFxuICAgIHVybDokKCkubGF6eVJ1bGUoKCk9PntcXG4gICAgICAgIGxldCBkZW1vX2NvZGUgPSBnZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgaWYoZGVtb19jb2RlPT0nMCcpe1xcbiAgICAgICAgICAgIHB1dFZhcignaG91c2Uud2ViX3VybCcsJ2hpa2VyOi8vZmlsZXMvcnVsZXMvZHpIb3VzZS9odG1sL+i1hOa6kOe9keS5puetvi5odG1sJyk7XFxuICAgICAgICAgICAgZGVtb19jb2RlID0gcGFyc2VJbnQoZGVtb19jb2RlKSsxO1xcbiAgICAgICAgICAgIHNldEl0ZW0oJ2hvdXNlLmRlbW8nLGRlbW9fY29kZSsnJyk7XFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICBwdXRWYXIoJ2hvdXNlLndlYl91cmwnLCdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv6LWE5rqQ572R5Lmm562+Lmh0bWwnKTtcXG4gICAgICAgICAgICBzZXRJdGVtKCdob3VzZS5kZW1vJywnMCcpO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVmcmVzaFBhZ2UodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5bey6K6+572u56S65L6L5Zyw5Z2AJ1xcbiAgICB9KVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifwn5Ok5LiK5LygJyxcXG4gICAgY29sX3R5cGU6J2ZsZXhfYnV0dG9uJyxcXG4gICAgdXJsOiQoKS5sYXp5UnVsZSgoY2FudXAsaG91c2VfZGF0YSxwdXRfdXJsLGZpbGVfdHlwZSkgPT57XFxuICAgICAgICBmdW5jdGlvbiBjb21wYXJlKG5hbWUpIHtcXG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaXRlbSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5uYW1lID09PSBuYW1lO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGNvbnN0IHtnZXROb3dGb3JtYXREYXRlfT0kLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXlcXFwiKTtcXG4gICAgICAgIGxldCB1cF9jb2RlID0gZ2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpO1xcbiAgICAgICAgaWYodXBfY29kZS5sZW5ndGggPCAyKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5rqQ56CB5Yy65peg5YaF5a6577yM6K+35YWI6K6/6Zeu5LiA5Liq6Z2Z5oCB6aG16Z2iJ1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYoIWNhbnVwKXtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5L2g5LiN5piv5byA5Y+R6ICF77yM5rKh5pyJ5o+Q5Lqk5Yiw5LuT5bqT55qE5p2D5YipISdcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBpbnB1dCA9IGdldFZhcignaG91c2Uud2ViX3VybCcsJycpO1xcbiAgICAgICAgbGV0IHdlYl91cmwgPSBpbnB1dC5zcGxpdCgnOycpWzBdO1xcbiAgICAgICAgbGV0IGZpbGVOYW1lID0gJyc7XFxuICAgICAgICBpZigvXmhpa2VyOnxeZmlsZTp8Xmh0dHA6fF5odHRwczp8XlxcXFwvc3RvcmFnZVxcXFwvfF5cXFxcL3NkY2FyZFxcXFwvLy50ZXN0KHdlYl91cmwpKXtcXG4gICAgICAgICAgICBmaWxlTmFtZSA9IHdlYl91cmwuc3BsaXQoJy8nKVt3ZWJfdXJsLnNwbGl0KCcvJykubGVuZ3RoLTFdO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimO+/pXzlhYPntKDvv6UvLnRlc3QoaW5wdXQpKXtcXG4gICAgICAgICAgICBsZXQgYmthcnIgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKTtcXG4gICAgICAgICAgICBpZihia2Fyci5sZW5ndGg8Myl7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kupHliarotLTmnb/lhoXlrrnmnInor68nXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHN3aXRjaCAoYmthcnJbMV0pIHtcXG4gICAgICAgICAgICAgICAgY2FzZSAnbXlfaG9tZV90aGVtZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdteV9ob21lX3NpbmdsZSc6XFxuICAgICAgICAgICAgICAgICAgICBmaWxlTmFtZSA9IHVwX2NvZGUuc3BsaXQoJ+OAjCcpWzFdLnNwbGl0KCfjgI0nKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgICAgICBjYXNlICdqc191cmwnOlxcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSB1cF9jb2RlLnNwbGl0KCfvv6UnKVsyXS5zcGxpdCgnQCcpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+mUmeivr++8jOe9kemhtemTvuaOpeaXoOWGheWuuSEnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVhID0gZ2V0SXRlbSgnaG91c2UuZmlsZV91YScpPT09J+eUteiEkSc/J01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS84OC4wLjQzMjQuMTQ2IFNhZmFyaS81MzcuMzYnOidNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgOTsgTUkgNikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzg5LjAuNDM4OS45MCBNb2JpbGUgU2FmYXJpLzUzNy4zNic7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHtcXG4gICAgICAgICAgICAnUmVmZXJlcic6J2h0dHBzOi8vYmxvZy5jc2RuLm5ldCcsXFxuICAgICAgICAgICAgXFxcImNvbnRlbnQtdHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi9qc29uXFxcIixcXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6dWEsXFxuICAgICAgICAgICAgJ0FjY2VwdCc6J2FwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnLFxcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOid6aC1DTicsXFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHRvQ29tcGFyZSA9ICcnO1xcbiAgICAgICAgaWYoZmlsZU5hbWUuZW5kc1dpdGgoJy5odG1sJykpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfpnZnmgIHmlofku7YnO1xcbiAgICAgICAgfWVsc2UgaWYoL+S4u+mimC8udGVzdChmaWxlTmFtZSkpe1xcbiAgICAgICAgICAgIHRvQ29tcGFyZSA9ICfkuLvpobXphY3nva4nXFxuICAgICAgICB9XFxuICAgICAgICBsZXQgZnR5cGUgPSAgZmlsZV90eXBlLmZpbHRlcihjb21wYXJlKHRvQ29tcGFyZXx8Z2V0SXRlbSgnaG91c2UuZmlsZV90eXBlJywn6Z2Z5oCB5paH5Lu2JykpKVswXS52YWx1ZTtcXG4gICAgICAgIGxldCByZWRpcmVjdCA9IGdldEl0ZW0oJ2hvdXNlLmZpbGVfcmVkaXJlY3QnLCfmnKzlnLAnKSE9PSfmnKzlnLAnO1xcbiAgICAgICAgaWYocmVkaXJlY3QmJiF3ZWJfdXJsLnN0YXJ0c1dpdGgoJ2h0dHAnKSl7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+ebtOmTvjMwMumHjeWumuWQkee9keWdgOmTvuaOpeW/hemhu2h0dHDlvIDlpLQnO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGNvZGUgPSAhcmVkaXJlY3Q/dXBfY29kZTp3ZWJfdXJsO1xcbiAgICAgICAgbGV0IGRhdGEgPSB7XFxcInBhcmFtc1xcXCI6XFxuICAgICAgICAgICAgICAgIHtcXFwiZGF0YVxcXCI6IHtydWxlX25hbWU6IGZpbGVOYW1lLCBcXFwicnVsZV90eXBlXFxcIjogJ+abtOWkmuWIhuS6qycsIFxcXCJ2ZXJzaW9uXFxcIjpnZXROb3dGb3JtYXREYXRlKCksXFxcInJ1bGVfdmFsdWVcXFwiOiBjb2RlLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZTpmdHlwZSwgaXNfcmVkaXJlY3Q6cmVkaXJlY3QsZGV2aWNlVWE6Z2V0SXRlbSgnaG91c2UuZmlsZV91YScpLFxcbiAgICAgICAgICAgICAgICAgICAgfSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogaG91c2VfZGF0YS51c2VybmFtZSxcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR9XFxuICAgICAgICB9O1xcbiAgICAgICAgbGV0IHVwcGFyYW1zID0ge2hlYWRlcnM6aGVhZGVycyxib2R5OkpTT04uc3RyaW5naWZ5KGRhdGEpLHdpdGhIZWFkZXJzOmZhbHNlLHJlZGlyZWN0OmZhbHNlLG1ldGhvZDonUE9TVCd9O1xcbiAgICAgICAgbGV0IGJhY2ttc2cgPSBnZXRJdGVtKCdob3VzZS5maWxlX3VhJyk9PT0n55S16ISRJz9mZXRjaChwdXRfdXJsLHVwcGFyYW1zKTpyZXF1ZXN0KHB1dF91cmwsdXBwYXJhbXMpO1xcbiAgICAgICAgdHJ5e1xcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSBKU09OLnBhcnNlKGJhY2ttc2cpLnJlc3VsdDtcXG4gICAgICAgICAgICBsZXQgZGV0YWlsID0gcmVzdWx0LmRldGFpbDtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytkZXRhaWw7XFxuICAgICAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBsb2coZS5tZXNzYWdlKTtcXG4gICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5Y+R55Sf5LqG6ZSZ6K+vXFxcXG4nK2UubWVzc2FnZTtcXG4gICAgICAgIH1cXG4gICAgfSxjYW51cCxob3VzZV9kYXRhLHB1dF91cmwsZmlsZV90eXBlKVxcbn0pO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOifplb/mlofmnKzpooTop4jljLrln58nLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOidoaWtlcjovL2VtcHR5JyxcXG4gICAgZXh0cmE6IHt0ZXh0U2l6ZTogMTEsbGluZVZpc2libGU6ZmFsc2V9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6Z2V0VmFyKCdob3VzZS51cGxvYWRfY29kZScsJycpLnN1YnN0cmluZygwLDEwMjQwKSxcXG4gICAgY29sX3R5cGU6J2xvbmdfdGV4dCcsXFxuICAgIGV4dHJhOiB7dGV4dFNpemU6IDExfVxcbn0pO1xcbnNldFBhZ2VUaXRsZShcXFwi5pu05aSa5YiG5LqrXFxcIik7XFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6L275ZCI6ZuG55Sf5oiQ5o6l5Y+jXCIsXCJwYXRoXCI6XCJnZW5BcGlcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIGdlblJ1bGUobmFtZSx1cmwsaWNvbil7XFxuICAgIGljb249aWNvbnx8J2h0dHBzOi8vejMuYXgxeC5jb20vMjAyMS8xMS8xNi9JV0poeGYucG5nJztcXG4gICAgY29uc3Qge2dldE5vd0Zvcm1hdERhdGUsYXBpLGdldEFwaX09JC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIFN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKG9sZCxuZXdfc3RyKXtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KG9sZCkuam9pbihuZXdfc3RyKTtcXG4gICAgfTtcXG4gICAgbGV0IG11YmFuID0gZ2V0QXBpKCdpbXBvcnRVcmwnKStcXFwiMTY5MFxcXCI7XFxuICAgIGxldCBtdWJhbl93b3JkPXtuYW1lOlxcXCJA6L275ZCI6ZuGXFxcIix1cmw6XFxcIkDlnLDlnYBcXFwiLHZlcjpcXFwiQOeJiOacrFxcXCIsaWNvbjpcXFwiQOWbvuagh1xcXCJ9O1xcbiAgICBsZXQgbXViYW5fY29kZSA9IGZldGNoKG11YmFuKTtcXG4gICAgbXViYW5fY29kZT1tdWJhbl9jb2RlLnJlcGxhY2VBbGwobXViYW5fd29yZC5uYW1lLG5hbWUpLnJlcGxhY2VBbGwobXViYW5fd29yZC52ZXIsZ2V0Tm93Rm9ybWF0RGF0ZSgpKS5yZXBsYWNlQWxsKG11YmFuX3dvcmQudXJsLHVybCkucmVwbGFjZUFsbChtdWJhbl93b3JkLmljb24saWNvbik7XFxuICAgIGxldCBpbXBvcnRfY29kZT1cXFwi5rW36ZiU6KeG55WM6KeE5YiZ5YiG5Lqr77yM5b2T5YmN5YiG5Lqr55qE5piv77ya5bCP56iL5bqP77yM5peg5qC55qCR77yM6Iqx5q2j5riF77yM5LiN5pat6I2k6IWl5LiN5oiS5rer77+laG9tZV9ydWxlX3Yy77+lYmFzZTY0Oi8vQFxcXCIrbmFtZStcXFwiQFxcXCIrYmFzZTY0RW5jb2RlKG11YmFuX2NvZGUpO1xcbiAgICB2YXIgcGFzdGVzID0gZ2V0UGFzdGVzKCk7XFxuICAgIHZhciB1cmwgPSBzaGFyZVBhc3RlKGltcG9ydF9jb2RlLHBhc3Rlcy5zbGljZSgtMSlbMF0pO1xcbiAgICBsZXQgaW1wb3J0X3J1bGU9IHVybCtcXFwiXFxcXG5cXFxcbuWwj+eoi+W6j++8mlxcXCIrbmFtZTtcXG4gICAgcmV0dXJuIGltcG9ydF9ydWxlO1xcbn1cXG4kLmV4cG9ydHMuZ2VuUnVsZT1nZW5SdWxlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YWo5bGA6Kej5p6Q5YWN5ZeFXCIsXCJwYXRoXCI6XCJnbG9iYWxQYXJzZVwiLFwicnVsZVwiOlwianM6XFxuICAgIGZ1bmN0aW9uIGdldEhlYWRlcnMocGxheVVybCl7XFxuICAgICAgICBsZXQgaGVhZGVycyA9IHt9O1xcbiAgICAgICAgbGV0IHJlZmVyPXBsYXlVcmwuc3BsaXQoXFxcIi8vXFxcIilbMF0rXFxcIi8vXFxcIitwbGF5VXJsLnNwbGl0KFxcXCIvL1xcXCIpWzFdLnNwbGl0KFxcXCIvXFxcIilbMF07XFxuICAgICAgICBpZigvbGVjbG91ZFxcXFwuY29tfGJpbGl2aWRlb1xcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3LmJpbGliaWxpLmNvbS8nLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL21ndHZcXFxcLmNvbS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgaGVhZGVycyA9IHtcXFwiUmVmZXJlclxcXCI6IHJlZmVyLFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwifVxcbiAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICBoZWFkZXJzID0ge1xcXCJSZWZlcmVyXFxcIjogJ2h0dHBzOi8vd3d3Lml4aWd1YS5jb20vJyxcXFwiVXNlci1BZ2VudFxcXCI6XFxcIk1vemlsbGEvNS4wXFxcIn1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIGhlYWRlcnMgPSB7XFxcIlJlZmVyZXJcXFwiOiByZWZlciwnVXNlci1BZ2VudCc6J0RhcnQvMi4xMyAoZGFydDppbyknfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGhlYWRlcnNcXG4gICAgfVxcbmZ1bmN0aW9uIGlzUGljKHN0cil7XFxuICAgIHJldHVybiAvXFxcXC4oZ2lmfGpwZ3xqcGVnfHBuZ3xHSUZ8SlBHfFBORykkLy50ZXN0KHN0cik7XFxufVxcbmZ1bmN0aW9uIGlzVmlkZW8ocGxheVVybCxyZWNoYW5nZSl7XFxuICAgIC8v5rOo5oSPLnBocOS4jeWPr+S7peiiq+aOkumZpOWQpuWImeiejeWFtOino+aekOS4jeS6hiB8LnBocCRcXG4gICAgLy/lpoLmnpzmmK/mkq3mlL7lnLDlnYDlsLHnm7TmjqXov5Tlm57lnLDlnYDliqDkuIpVQe+8jOS4jeaYr+eahOivneWwsei/lOWbnmZhbHNlXFxuICAgIC8vIGxldCB0MSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICBsZXQgY2FjaGVSZWd4ID0gbmV3IFJlZ0V4cCgnZmlsZTovLy9zdG9yYWdlL2VtdWxhdGVkLyguKj8pXFxcXFxcXFwubTN1OHxoaWtlcjovL2ZpbGVzLyguKj8pXFxcXFxcXFwubTN1OCcpO1xcbiAgICBpZihjYWNoZVJlZ3gudGVzdChwbGF5VXJsKSl7XFxuICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICB9XFxuICAgIGZ1bmN0aW9uIGdldEhvc3QodXJsKXtcXG4gICAgICAgIC8vIGZiYeeahHBhcnNlTGF6eeWkquaFouS6huWNg+S4h+WIq+eUqFxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICByZXR1cm4gdXJsLm1hdGNoKC9eaHR0cChzKT86XFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXS5zbGljZSgwLC0xKTtcXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgLypcXG4gICAgICAgIGlmKHR5cGVvZihsb2cpPT09J3VuZGVmaW5lZCcpe1xcbiAgICAgICAgICAgIHJldHVybiAgZmJhLnBhcnNlTGF6eVJ1bGUoJCQkKCkubGF6eVJ1bGUoKHVybCk9PntcXG4gICAgICAgICAgICAgICAgcmV0dXJuIGdldEhvbWUodXJsKVxcbiAgICAgICAgICAgIH0sdXJsKSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gZ2V0SG9tZSh1cmwpXFxuICAgICAgICB9XFxuICAgICAgICAqL1xcbiAgICB9XFxuICAgIGxldCBwVXJsPXBsYXlVcmwuc3BsaXQoXFxcIjtcXFwiKVswXTsvL+iOt+WPluaKoOaOiea1t+mYlHVh562J5Y+C5pWw55qE572R6aG15pKt5pS+6ZO+5o6lXFxuICAgIGxldCBob3N0ID0gZ2V0SG9zdChwVXJsKTsgLy8g6I635Y+W5Z+f5ZCNXFxuICAgIGlmKCFob3N0KXsvL+WIpOaWreaXoOWfn+WQjeebtOaOpeS4jeaYr+inhumikVxcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG4gICAgZnVuY3Rpb24gcHJpbnQoZGF0YSl7XFxuICAgICAgICBpZih0eXBlb2YobG9nKT09PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICByZXR1cm4gIGZiYS5sb2coZGF0YSlcXG4gICAgICAgIH1lbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gbG9nKGRhdGEpXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgcmVjaGFuZ2U9dHlwZW9mKHJlY2hhbmdlKT09PVxcXCJmdW5jdGlvblxcXCI/cmVjaGFuZ2U6ZnVuY3Rpb24ocGxheVVybCl7cmV0dXJuIHBsYXlVcmx9O1xcbiAgICBsZXQgZXhjZXB0V29yZHMgPSAnLmpzJHwuY3NzJHwudHMkfC5odG1sJHwuaHRtJHwuZ2lmJHwuanBnJHwuanBlZyR8LnBuZyR8LmljbyR8LnN2ZyR8LnR4dCQnLnNwbGl0KCd8JykubWFwKGl0PT4nXFxcXFxcXFwnK2l0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzID0gbmV3IFJlZ0V4cChleGNlcHRXb3Jkcyk7XFxuICAgIGxldCBleGNlcHRXb3JkczEgPSAncmVmZXJlcj18dXJsPScuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIHZhciBleGNlcHRLZXlzMSA9IG5ldyBSZWdFeHAoZXhjZXB0V29yZHMxKTtcXG4gICAgbGV0IHJlcGxhY2VXb3JkcyA9ICdwbGF5bTN1OHxtM3U4XFxcXC50dicuc3BsaXQoJ3wnKS5tYXAoaXQ9Pml0KS5qb2luKCd8Jyk7XFxuICAgIGxldCByZXBsYWNlS2V5cyA9IG5ldyBSZWdFeHAocmVwbGFjZVdvcmRzLCdnJyk7XFxuICAgIGxldCB2aWRlb1dvcmRzID0gXFxcIi92aWRlby90b3N8Lm1wNCR8Lm0zdTgkfC5mbHYkfC5hdmkkfC4zZ3AkfC5tcGVnJHwud212JHwubW92JHxybXZifC5kYXQkfC5tcDMkfC5tNGEkfHFxQkZkb3dubG9hZHxtaW1lPXZpZGVvJTJGfG1pbWVfdHlwZT12aWRlb198dHlwZT1tM3U4fHB0PW0zdThcXFwiLnNwbGl0KCd8JykubWFwKChpdCk9PntcXG4gICAgICAgIC8vdHlwZT1tcDRcXG4gICAgICAgIGlmKGl0LnN0YXJ0c1dpdGgoXFxcIi5cXFwiKSl7XFxuICAgICAgICAgICAgcmV0dXJuICdcXFxcXFxcXCcraXRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHJldHVybiBpdFxcbiAgICAgICAgfVxcbiAgICB9KS5qb2luKFxcXCJ8XFxcIik7XFxuICAgIGxldCB2aWRlb0tleXMgPSBuZXcgUmVnRXhwKHZpZGVvV29yZHMpO1xcbiAgICBsZXQgclVybCA9IHBVcmwucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9memTvuaOpVxcbiAgICBsZXQgcFVybDI9cFVybC5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF07Ly/ojrflj5bkuI3luKblj4LmlbDnmoTnvZHpobXpk77mjqVcXG4gICAgbGV0IHJ1cmwyID0gcFVybDIucmVwbGFjZShob3N0LCcnKTsvL+iOt+WPlumZpOW8gOWfn+WQjeeahOWJqeS9meS4jeW4puWPguaVsOmTvuaOpVxcbiAgICBsZXQgaGFzS2V5ID0gdmlkZW9LZXlzLnRlc3QoclVybCl8fHZpZGVvS2V5cy50ZXN0KHJ1cmwyKTtcXG4gICAgbGV0IHBhclVybCA9IHBVcmwucmVwbGFjZShwVXJsLnNwbGl0KFxcXCI/XFxcIilbMF0sJycpOyAvLyDliIblibLpl67lj7flkI7liankvZnlj4LmlbDnmoTlrozmlbTpk77mjqVcXG4gICAgbGV0IGV4Y0tleSA9IGV4Y2VwdEtleXMxLnRlc3QocGFyVXJsKTtcXG4gICAgaWYoclVybC5zcGxpdCgnPycpLmxlbmd0aD4yKXtcXG4gICAgICAgIGxldCByVXJsMz1yVXJsLnNwbGl0KFxcXCI/XFxcIilbMV07Ly/ojrflj5Y/5YiG5Ymy5ZCO55qE56ys5LiA5q61XFxuICAgICAgICBoYXNLZXkgPSBoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwzKTtcXG4gICAgfVxcbiAgICBpZihoYXNLZXkmJiFleGNLZXkpe1xcbiAgICAgICAgbGV0IHRpcHMgPSAn5qOA5rWL5Yiw55aR5Ly85aSa5aqS5L2T55qE5Zyw5Z2AOic7XFxuICAgICAgICBwcmludChcXFwianPkuK1cXFwiK3RpcHMrcFVybCk7XFxuICAgICAgICBwcmludChcXFwi5YiG5Ymy6Zeu5Y+35ZCOOlxcXCIrcGFyVXJsKTtcXG4gICAgfVxcbiAgICAvLyBsb2coJzE6JysodmlkZW9LZXlzLnRlc3QocFVybCl8fHZpZGVvS2V5cy50ZXN0KHBVcmwyKXx8dmlkZW9LZXlzLnRlc3QocFVybC5yZXBsYWNlKHJlcGxhY2VLZXlzLFxcXCJcXFwiKS5zcGxpdChcXFwiJlxcXCIpWzBdLnNwbGl0KFxcXCI/XFxcIilbMF0pKSk7XFxuICAgIC8vIGxvZygnMjonKyFleGNlcHRLZXlzLnRlc3QocFVybC5zcGxpdChcXFwiP1xcXCIpWzBdLnNwbGl0KCcmJylbMF0pKTtcXG4gICAgLy8gbG9nKCczOicrIWV4Y2VwdEtleXMxLnRlc3QocFVybC5yZXBsYWNlKHBVcmwuc3BsaXQoXFxcIj9cXFwiKVswXSwnJykpKTtcXG4gICAgaWYgKChoYXNLZXl8fHZpZGVvS2V5cy50ZXN0KHJVcmwucmVwbGFjZShyZXBsYWNlS2V5cyxcXFwiXFxcIikuc3BsaXQoXFxcIiZcXFwiKVswXS5zcGxpdChcXFwiP1xcXCIpWzBdKSApJiYgIWV4Y2VwdEtleXMudGVzdChwVXJsMikmJiFleGNlcHRLZXlzMS50ZXN0KHBVcmwyKSkge1xcbiAgICAgICAgaWYoISgvVXNlci1BZ2VudHxSZWZlcmVyQC8udGVzdChwbGF5VXJsKSkpe1xcbiAgICAgICAgICAgIGlmKC9sZWNsb3VkXFxcXC5jb218YmlsaXZpZGVvLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIjt7UmVmZXJlckBodHRwczovL3d3dy5iaWxpYmlsaS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL2l4aWd1YVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpKXtcXG4gICAgICAgICAgICAgICAgcGxheVVybCs9XFxcIiNpc3ZpZGVvPXRydWUjO3tSZWZlcmVyQGh0dHBzOi8vd3d3Lml4aWd1YS5jb20vJiZVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGVsc2UgaWYoL21ndHZcXFxcLmNvbXxieXRlYW1vbmUvLnRlc3QocGxheVVybCkpe1xcbiAgICAgICAgICAgICAgICBwbGF5VXJsKz1cXFwiO3tVc2VyLUFnZW50QE1vemlsbGEvNS4wfVxcXCI7XFxuICAgICAgICAgICAgfWVsc2UgaWYoL3B0d29cXFxcLndrZmlsZVxcXFwuY29tLy50ZXN0KHBsYXlVcmwpJiYvdXJsPS8udGVzdChwbGF5VXJsKSl7XFxuICAgICAgICAgICAgICAgIHBsYXlVcmw9cGxheVVybC5zcGxpdChcXFwidXJsPVxcXCIpWzFdK1xcXCI7e1JlZmVyZXJAaHR0cHM6Ly9mYW50dWFuLnR2fVxcXCJcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgcGxheVVybD1yZWNoYW5nZShwbGF5VXJsKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgLy8g5aSE55CG5aSn5biI5YWE5LmL57G755qEYXBwXFxuICAgICAgICAgICAgLy8gZWxzZXtcXG4gICAgICAgICAgICAvLyAgICAgcGxheVVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgICAgIC8vIH1cXG4gICAgICAgIH1cXG4gICAgICAgIC8vIGxldCB0MiA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xcbiAgICAgICAgLy8gcHJpbnQoJ+WIpOaWrWlzVmlkZW/ogJfml7Y6JysodDItdDEpKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCI7XFxuICAgIH1lbHNle1xcbiAgICAgICAgLy8gbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XFxuICAgICAgICAvLyBwcmludCgn5Yik5pataXNWaWRlb+iAl+aXtjonKyh0Mi10MSkpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xcbiAgICB9XFxufVxcbmZ1bmN0aW9uIGNvbVBhcnNlKHBhclN0cixlaixvbmx5YmFjayxodG1sKXtcXG4gICAgLy/liJfooajvvIzmoIfpopjvvIzlm77niYfvvIzmj4/ov7DvvIzpk77mjqXvvIzlhoXlrrlcXG4gICAgZWogPSBlanx8ZmFsc2U7Ly/mnInkuoznuqdcXG4gICAgb25seWJhY2s9b25seWJhY2t8fGZhbHNlOy8v5Y+q6L+U5Zue5pWw5o2uXFxuICAgIGh0bWwgPSBodG1sfHxnZXRSZXNDb2RlKCk7XFxuICAgIGh0bWwgPSB0eXBlb2YoaHRtbCk9PT0nc3RyaW5nJz9odG1sOmh0bWwuaHRtbDtcXG4gICAgcmV0dXJuICQudG9TdHJpbmcoKHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKT0+e1xcbiAgICAgICAgbGV0IHQ9cGFyU3RyLnNwbGl0KFxcXCI7XFxcIik7XFxuICAgICAgICBsZXQgZD1bXTtcXG4gICAgICAgIC8vIGxldCBsaXN0PXBkZmEoZ2V0UmVzQ29kZSgpLHRbMF0pO1xcbiAgICAgICAgbGV0IGxpc3Q9cGRmYShodG1sLHRbMF0pO1xcbiAgICAgICAgbGV0IGxhenkgPSAkKCcnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgICAgIGNvbnN0IHtsYXp5UGFyc2V9ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgICAgICAgICByZXR1cm4gbGF6eVBhcnNlKGlucHV0KVxcbiAgICAgICAgfSk7XFxuICAgICAgICBmb3IobGV0IGkgaW4gbGlzdCl7XFxuICAgICAgICAgICAgbGV0IF9waWMgPSB0WzJdP3BkKGxpc3RbaV0sdFsyXSk6Jyc7XFxuICAgICAgICAgICAgaWYoaXNQaWMoX3BpYykmJiEvQFJlZmVyZXI9Ly50ZXN0KF9waWMpKXtcXG4gICAgICAgICAgICAgICAgX3BpYys9J0BSZWZlcmVyPSdcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IGl0PXtcXG4gICAgICAgICAgICAgICAgdGl0bGU6cGRmaChsaXN0W2ldLHRbMV0pLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOl9waWMsXFxuICAgICAgICAgICAgICAgIGRlc2M6cGRmaChsaXN0W2ldLHRbM10pLFxcbiAgICAgICAgICAgICAgICB1cmw6ZWo/cGQobGlzdFtpXSx0WzRdKTpwZChsaXN0W2ldLHRbNF0pK2xhenlcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIGlmKHQubGVuZ3RoPjUpey8v5YaF5a6577yM55So5LqO5pCc57SiXFxuICAgICAgICAgICAgICAgIGl0LmNvbnRlbnQ9cGRmaChsaXN0W2ldLHRbNV0pXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGQucHVzaChpdCk7XFxuICAgICAgICB9XFxuICAgICAgICBpZihvbmx5YmFjayl7XFxuICAgICAgICAgICAgcmV0dXJuIGRcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHNldFJlc3VsdChkKVxcbiAgICAgICAgfVxcbiAgICB9LHBhclN0cixlaixvbmx5YmFjayxodG1sLGlzUGljKVxcbn1cXG5cXG5mdW5jdGlvbiBpc0JhZFZpZGVvKHZpZGVvVXJsKSB7Ly/mmK/lnY/nmoTop4bpopFcXG4gICAgbGV0IGRtUGF0aCA9ICdoaWtlcjovL2ZpbGVzL2NhY2hlL2RpYW9tYW8udHh0JzsvL+WQiuavm+aooeW8j+i/h+a7pOaWh+S7tui3r+W+hFxcbiAgICBsZXQgZG1VcmxzO1xcbiAgICB0cnkge1xcbiAgICAgICAgZG1VcmxzID0gcmVxdWVzdChkbVBhdGgpLnRyaW0oKS5zcGxpdCgnXFxcXG4nKS5maWx0ZXIoaXQgPT4gaXQgJiYgIWl0LnN0YXJ0c1dpdGgoJy8vJykpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkbVVybHMgPSBbXTtcXG4gICAgfVxcblxcbiAgICBmdW5jdGlvbiBoYXNEbSh2aWRlb1VybCwgZG1VcmxzKSB7Ly/mkq3mlL7lnLDlnYDmmK/lkKbkuLrlkIrmr5vop4bpopFcXG4gICAgICAgIGlmIChkbVVybHMubGVuZ3RoIDwgMSkge1xcbiAgICAgICAgICAgIHJldHVybiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICAgICAgZnVuY3Rpb24gcHJpbnQoc3RyKXtcXG4gICAgICAgICAgICBpZih0eXBlb2YobG9nKSE9PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICAgICAgbG9nKHN0cik7XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGZiYS5sb2coc3RyKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgICAgICBmb3IgKGxldCBkbVVybCBvZiBkbVVybHMpIHtcXG4gICAgICAgICAgICBpZiAoKG5ldyBSZWdFeHAoZG1VcmwpKS50ZXN0KHZpZGVvVXJsKSkgey8v5pKt5pS+5Zyw5Z2A5YyF5ZCr5ZCK5q+b5qCH5b+X55qE5Zyw5Z2AXFxuICAgICAgICAgICAgICAgIHByaW50KCflkIrmr5vop4bpopEs6Ieq5Yqo6L+H5rukOicrdmlkZW9VcmwpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHByaW50KCfpnZ7lkIrmr5vop4bpopEs5Y+v5pKt5pS+OicrdmlkZW9VcmwpO1xcbiAgICAgICAgcmV0dXJuIGZhbHNlXFxuICAgIH1cXG5cXG4gICAgZnVuY3Rpb24gaXNEbShyZXQpIHtcXG4gICAgICAgIGlmICghcmV0KSB7XFxuICAgICAgICAgICAgcmV0dXJuIHRydWVcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBoYXNEbShyZXQuc3BsaXQoJyMnKVswXS5zcGxpdCgnOycpWzBdLCBkbVVybHMpXFxuICAgIH1cXG4gICAgcmV0dXJuIGlzRG0odmlkZW9VcmwpXFxufVxcblxcbmZ1bmN0aW9uIGxhenlQYXJzZShwbGF5VXJsLG1zLHRtLHJlY2hhbmdlKXtcXG4gICAgLy8gbG9nKCfosIPnlKjku5PlupPlhY3ll4XmjqLkvKDlj4LotoXml7bkuLo6Jyttcyk7XFxuICAgIHRtID0gcGFyc2VJbnQodG0pfHw1MDAwO1xcbiAgICBjb25zdCB7aXNWaWRlbyxnZXRIZWFkZXJzLGlzQmFkVmlkZW99ID0gJC5yZXF1aXJlKCdoaWtlcjovL3BhZ2UvZ2xvYmFsUGFyc2U/cnVsZT3pgZPplb/ku5PlupNQcm8nKTtcXG4gICAgbGV0IHJlYWxVcmwgPSBpc1ZpZGVvKHBsYXlVcmwscmVjaGFuZ2UpO1xcbiAgICAvL2xvZyhyZWFsVXJsKTtcXG4gICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyl7Ly9ib29s5YC85bCx5piv5aSx6LSlXFxuICAgICAgICB0cnl7XFxuICAgICAgICAgICAgbGV0IHJ1cmw9cmVhbFVybC5zcGxpdChcXFwiO1xcXCIpWzBdLnNwbGl0KFxcXCIjXFxcIilbMF07XFxuICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UocmVxdWVzdChydXJsLHt0aW1lb3V0OnRtfSkpLnVybFxcbiAgICAgICAgfWNhdGNoKGUpe1xcbiAgICAgICAgICAgIHJldHVybiByZWFsVXJsXFxuICAgICAgICB9XFxuICAgICAgICAvL3JldHVybiByZWFsVXJsXFxuICAgIH1cXG5cXG4gICAgLy9sb2coXFxcIuiuv+mXrui2heaXtjpcXFwiK3RtKTtcXG4gICAgbG9nKFxcXCLlsJ3or5XpgZPplb/ku5PlupN4NeWFjeWXhTpcXFwiK3BsYXlVcmwpO1xcbiAgICBjbGVhclZhcihcXFwiX3g1anhVcmxcXFwiKTtcXG4gICAgbGV0IGJhZD0kKFxcXCLnvZHnu5zkuI3kvbPmiJbogIXnlpHkvLzlr7nmlrnnvZHnq5nmjILkuobvvIzkvaDopoHmn6XnnIvlhbbnvZHpobXlkJfvvJ9cXFwiKS5jb25maXJtKChwbGF5VXJsKT0+e1xcbiAgICAgICAgbG9nKFxcXCLnvZHnq5nnnIvotbfmnaXmjILkuoY6XFxcIitwbGF5VXJsKTtcXG4gICAgICAgIHJldHVybiBwbGF5VXJsXFxuICAgIH0scGxheVVybCk7XFxuICAgIHRyeXtcXG4gICAgICAgIHZhciBiYWNrPXJlcXVlc3QocGxheVVybCx7aGVhZGVyczogZ2V0SGVhZGVycyhwbGF5VXJsKSx0aW1lb3V0OnRtfSk7XFxuICAgICAgICAvL3ZhciBiYWNrPWZldGNoKHBsYXlVcmwse2hlYWRlcnM6IHsnVXNlci1BZ2VudCc6IFBDX1VBfX0pO1xcbiAgICAgICAgaWYoIWJhY2spe1xcbiAgICAgICAgICAgIGxvZyhcXFwi572R56uZXFxcIitwbGF5VXJsK1xcXCLnoa7lrp7llaXkuZ/msqHov5Tlm55cXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gYmFkXFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrKSl7XFxuICAgICAgICAgICAgLy9sZXQgbGNhY2hlPVxcXCIvc3RvcmFnZS9lbXVsYXRlZC8wL0FuZHJvaWQvZGF0YS9jb20uZXhhbXBsZS5oaWtlcnZpZXcvZmlsZXMvRG9jdW1lbnRzL2NhY2hlL3ZpZGVvLm0zdThcXFwiO1xcbiAgICAgICAgICAgIC8vd3JpdGVGaWxlKGxjYWNoZSxiYWNrKTtcXG4gICAgICAgICAgICAvL3JldHVybiBsY2FjaGUrXFxcIiMjXFxcIitwbGF5VXJsK1xcXCIjaXNWaWRlbz10cnVlI1xcXCJcXG4gICAgICAgICAgICBwbGF5VXJsPWNhY2hlTTN1OChwbGF5VXJsKTtcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybFxcbiAgICAgICAgfWVsc2UgaWYoKCEv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QoYmFjaykpJiYoIS9odHRwfHVybC8udGVzdChiYWNrKSkmJighL21zZ3xjb2RlfGh0bWwvLnRlc3QoYmFjaykpKXtcXG4gICAgICAgICAgICBsb2coYmFjayk7XFxuICAgICAgICAgICAgcmV0dXJuICd0b2FzdDovL+eWkeS8vOWvueaWueaVsOaNruWKoOWvhuS6hu+8jOWFt+S9k+aVsOaNrueci+aXpeW/lydcXG4gICAgICAgIH1cXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gYmFkXFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGJhY2s9SlNPTi5wYXJzZShiYWNrKTtcXG4gICAgICAgIGxldCByZWFsVXJsPWJhY2sudXJsO1xcbiAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT1cXFwidW5kZWZpbmVkXFxcInx8IXJlYWxVcmwpe1xcbiAgICAgICAgICAgIGxvZyhiYWNrKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YGT6ZW/5LuT5bqT6Kej5p6Q5aSx6LSl77yB6L+U5Zue5pKt5pS+5Zyw5Z2A5Li656m6XFxcIlxcbiAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpKT09J3N0cmluZycpe1xcbiAgICAgICAgICAgIHJldHVybiBpc1ZpZGVvKHJlYWxVcmwscmVjaGFuZ2UpO1xcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmwrXFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIC8vZWxzZXtcXG4gICAgICAgIC8vcmVhbFVybCs9XFxcIjt7VXNlci1BZ2VudEBNb3ppbGxhLzUuMH1cXFwiO1xcbiAgICAgICAgLy8gfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhcXFwi5qOA5rWL5Yiw6Kej5p6Q5Y+j6Z2eanNvbumUmeivrzpcXFwiK2UubWVzc2FnZSsnLOW8gOWni3g15YWN5ZeF5o6iJyk7XFxuICAgICAgICAvLyByZXF1aXJlKCdodHRwczovL2hqZGhueC5jb2RpbmcubmV0L3AvaGlrZXIvZC9kci9naXQvcmF3L21hc3Rlci9qcy9sc2cuanMnKTsvL+W8leeUqOacrOWcsOWCqOWtmOaPkuS7tlxcbiAgICAgICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpOy8v5byV55So5a2Q6aG16Z2i5pys5Zyw5YKo5a2Y5o+S5Lu2XFxuICAgICAgICBsZXQgbG9jYWxfbXMgPSBsc2cuZ2V0SXRlbSgndGltZW91dCcpO1xcbiAgICAgICAgbGV0IG1zID0gcGFyc2VJbnQobXMpfHxwYXJzZUludChsb2NhbF9tcyl8fDUwMDA7XFxuICAgICAgICBsZXQgbWF4X2NvdW50PU1hdGguY2VpbChtcy8yNTApO1xcbiAgICAgICAgbG9nKFxcXCLmnKzmrKHll4XmjqLotoXml7Y6XFxcIittcytcXFwi5YWx6K6h5b6F5oqT5YyFOlxcXCIrbWF4X2NvdW50K1xcXCLmrKFcXFwiKTtcXG4gICAgICAgIHNob3dMb2FkaW5nKCfll4XmjqLkuK3vvIzoi6XlpLHotKXlsLHliIfmjaJ3ZWLll4XmjqIuLi4nKTtcXG4gICAgICAgIGxldCBfeDUgPSAkLnRvU3RyaW5nKChpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pPT57XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKGZiYSk9PSd1bmRlZmluZWQnfHwhZmJhKXtcXG4gICAgICAgICAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBpZih0eXBlb2YocmVxdWVzdCk9PSd1bmRlZmluZWQnfHwhcmVxdWVzdCl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZhbChmYmEuZ2V0SW50ZXJuYWxKcygpKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgZmJhLnB1dFZhcihcXFwiX3g1anhVcmxcXFwiLHBsYXlVcmwpO1xcbiAgICAgICAgICAgICAgICBpZih3aW5kb3cuY291bnQgPT0gbnVsbCl7XFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuY291bnQ9MTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBsZXQgdGV4dD0nJztcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHRleHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcXFwiYm9keVxcXCIpLmlubmVyVGV4dDtcXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7ZmJhLmxvZyhlLm1lc3NhZ2UpfVxcbiAgICAgICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09PTEpe1xcbiAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5qOA5rWL5Yiw5pyJ5o6I5p2D77yM5byA5aeL6L+H5o6I5p2DXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICAvL2xvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24uaHJlZj1mYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHdpbmRvdy5jb3VudCsrO1xcbiAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCdjb3VudDonK3dpbmRvdy5jb3VudCsnLG1heF9jb3VudDonK21heF9jb3VudCk7XFxuICAgICAgICAgICAgICAgIGlmKCB3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KXtcXG4gICAgICAgICAgICAgICAgICAgIGZiYS5sb2coXFxcIui2hei/h1xcXCIrbWF4X2NvdW50KjI1MCtcXFwi5q+r56eS5pyq6I635Y+W5Yiw6LWE5rqQ5Zyw5Z2A77yM6Lez5Yiw5rqQ572R6aG1LOS7peS4i+aYr+WKoOi9vei/h+eahOWcsOWdgFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJib2R5XFxcIikuaW5uZXJUZXh0O1xcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2codGV4dCk7XFxuICAgICAgICAgICAgICAgICAgICB9Y2F0Y2ggKGUpIHtmYmEubG9nKGUubWVzc2FnZSl9XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKEpTT04uc3RyaW5naWZ5KF9nZXRVcmxzKCkpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYmEuZ2V0VmFyKFxcXCJfeDVqeFVybFxcXCIpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucGF1c2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgdmFyIHZpZGVvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcInZpZGVvXFxcIiksIGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImF1ZGlvXFxcIiksIHYyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiZW1iZWRcXFwiKSwgdjMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxcXCIjcGxheWVyXFxcIik7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUodmlkZW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwoYXVkaW9zLCBmdW5jdGlvbiAoYXVkaW8pIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBtdXRlTWUoYXVkaW8pO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjIsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhKU09OLnN0cmluZ2lmeSh1cmxzKSk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGkgaW4gdXJscykge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5e3U9ZGVjb2RlVVJJQ29tcG9uZW50KHUpO31jYXRjaChlKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdT11bmVzY2FwZSh1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cXG4gICAgICAgICAgICAgICAgICAgICAgICBpZigvdXJsPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFwidXJs5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2UgaWYoL3VybD1cXFxcLy8udGVzdCh1KSYmL1xcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0ID0gdS5tYXRjaCgvKC4qKVxcXFwvXFxcXC8oLio/KVxcXFwvLylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBob3N0K3Uuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZiYS5sb2coXFxcInVybOWIhuWJsjpcXFwiK3UpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCJ2aWTliIblibI6XFxcIit1KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFwvLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QgPSB1Lm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGhvc3QrdS5zcGxpdChcXFwidmlkPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwidmlk5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFw/KC4qKT1odHRwLy50ZXN0KHUpJiYvXFxcXC5tM3U4Ly50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vfGluZGV4XFxcXC5tM3U4JFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1xcXFwvMVxcXFwubTN1OC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB1PXUucmVwbGFjZSgvJmZyb209Lip8Jm5leHQ9Lip8Jmp1bXA9LiovLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSxyZWNoYW5nZSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxVcmwpPT0nc3RyaW5nJyYmIWlzQmFkVmlkZW8odSkpey8v6L+H5ruk5ZCK5q+b6KeG6aKRXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZnlfYnJpZGdlX2FwcC5zZXRXZWJVYShQQ19VQSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZihmYmEuZ2V0SGVhZGVyVXJsKSE9PSd1bmRlZmluZWQnKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBiYWNrVXJsID0gZmJhLmdldEhlYWRlclVybCh1LnJlcGxhY2UoXFxcIjt7XFxcIixcXFwiI2lzVmlkZW89dHJ1ZSM7e1xcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiYWNrVXJsID0gZmJhLmdldEhlYWRlclVybCh1cmxzW2ldKS5yZXBsYWNlKCc7eycsJyNpZ25vcmVJbWc9dHJ1ZSMjaXNWaWRlbz10cnVlIzt7Jyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdTEgPSBiYWNrVXJsLnNwbGl0KCcjaWdub3JlSW1nJylbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdTIgPSAnI2lnbm9yZUltZycrYmFja1VybC5zcGxpdCgnI2lnbm9yZUltZycpWzFdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoL3VybD1odHRwLy50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSB1MS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1lbHNlIGlmKC91cmw9XFxcXC8vLnRlc3QodTEpJiYvXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvc3QxID0gdTEubWF0Y2goLyguKilcXFxcL1xcXFwvKC4qPylcXFxcLy8pWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gaG9zdDErdTEuc3BsaXQoXFxcInVybD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmJhLmxvZyhcXFwidXJs5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKC92aWQ9aHR0cC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gdTEuc3BsaXQoXFxcInZpZD1cXFwiKS5zbGljZSgtMSlbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZigvdmlkPVxcXFwvLy50ZXN0KHUxKSYmL1xcXFwubTN1OC8udGVzdCh1MSkpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3N0MSA9IHUxLm1hdGNoKC8oLiopXFxcXC9cXFxcLyguKj8pXFxcXC8vKVswXTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGhvc3QxK3UxLnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvXFxcXD8oLiopPWh0dHAvLnRlc3QodTEpJiYvXFxcXC5tM3U4Ly50ZXN0KHUxKSl7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBcXFwiaHR0cFxcXCIrdTEuc3BsaXQoL1xcXFw/KC4qKT1odHRwLykuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja1VybCA9IHUxICsgdTI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYmEubG9nKCfov5Tlm57oh6rliqjliqBjb29raWXpk77mjqU6JytiYWNrVXJsKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZiYS5sb2coJ+i/lOWbnumTvuaOpTonK3UrJ+W5tuiHquWKqOWKoOS6hmNvb2tpZSzlhbfkvZNjb29raWXlnKjop4bpopHmkq3mlL7lpITmn6XnnIsnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYWNrVXJsO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLov5Tlm57ku5PlupN4NeWFjeWXhee7k+aenDpcXFwiK3JlYWxVcmwpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAvLyBmeV9icmlkZ2VfYXBwLmxvZygneDXlpKfojIPlm7TplJnor686JytlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICBhbGVydCgneDXlpKfojIPlm7TplJnor686JytlLm1lc3NhZ2UpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8v5oql6ZSZ57uT5p2feDUnXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSxpc1ZpZGVvLHJlY2hhbmdlLHBsYXlVcmwsbWF4X2NvdW50LFBDX1VBLGlzQmFkVmlkZW8pO1xcbiAgICAgICAgbGV0IHVzZVdlYj1sc2cuZ2V0SXRlbShcXFwi6YCa5YWNXFxcIixcXFwiWDVcXFwiKT09PVxcXCJXRUJcXFwiO1xcbiAgICAgICAgLy9sb2coXFxcIuS7k+W6k+S9v+eUqHdlYumAmuWFjeabv+S7o3g1OlxcXCIrdXNlV2ViKTtcXG4gICAgICAgIGxldCBydWxlSGVhZD11c2VXZWImJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIzMzk/XFxcIndlYlJ1bGU6Ly9cXFwiOlxcXCJ4NVJ1bGU6Ly9cXFwiO1xcbiAgICAgICAgbGV0IHg1VXJsID0gcnVsZUhlYWQrcGxheVVybCsgJ0AnICtfeDU7XFxuICAgICAgICByZXR1cm4geDVVcmxcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiB4NVBhcnNlUHJvKHg1bGlzdCx4NVRpbWVvdXQsaXNWaWRlbyl7XFxuICAgIGxldCBicGF0aCA9ICdmaWxlOi8vL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9ydWxlcy9kekhvdXNlL2h0bWwv5rW36ZiU5ZeF5o6i5ZmoLmh0bWwnO1xcbiAgICBsZXQgYmNvZGUgPSBmZXRjaChicGF0aCk7XFxuICAgIGlmKCFiY29kZXx8IS9meV9icmlkZ2VfYXBwLy50ZXN0KGJjb2RlKSl7XFxuICAgICAgICBsb2coJ+acrOWcsOacquWuieijheWXheaOouWZqO+8jOW8gOWni+WuieijhScpO1xcbiAgICAgICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgICAgIGxldCBodG1sID0gZmV0Y2goYXBpLmhvc3QrJy9ydWxlbGlzdC5qc29uP2lkPTIwNTUnKTtcXG4gICAgICAgIGlmKC/mtbfpmJTop4bnlYwvLnRlc3QoaHRtbCkpe1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShicGF0aCxodG1sKTtcXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShicGF0aCxmZXRjaCgnaHR0cHM6Ly9oamRobnguY29kaW5nLm5ldC9wL2hpa2VyL2QvZHIvZ2l0L3Jhdy9tYXN0ZXIvaHRtbC9nZXRWaWRlby5odG1sJykpXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgeDVUaW1lb3V0ID0gcGFyc2VJbnQoeDVUaW1lb3V0KXx8NTAwMDtcXG4gICAgbGV0IG1heF9jb3VudD0oeDVUaW1lb3V0LzI1MCk7IC8v5qC55o2u6LaF5pe26Ieq5Yqo6K6h566X5LqG5Y+v5omn6KGM55qE5qyh5pWwXFxuICAgIHB1dFZhcigneDVMaXN0JyxKU09OLnN0cmluZ2lmeSh4NWxpc3QpKTtcXG4gICAgbGV0IF94NSA9ICQudG9TdHJpbmcoKGlzVmlkZW8sIG1heF9jb3VudCx4NVRpbWVvdXQsaXNCYWRWaWRlbykgPT4ge1xcbiAgICAgICAgLy/liJ3lp4vljJZmYmHlkoxyZXF1c3RcXG4gICAgICAgIGlmICh0eXBlb2YgKGZiYSkgPT0gJ3VuZGVmaW5lZCcgfHwgIWZiYSkge1xcbiAgICAgICAgICAgIHZhciBmYmEgPSBmeV9icmlkZ2VfYXBwO1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXF1ZXN0KSA9PSAndW5kZWZpbmVkJyB8fCAhcmVxdWVzdCkge1xcbiAgICAgICAgICAgICAgICBldmFsKGZiYS5nZXRJbnRlcm5hbEpzKCkpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSk7XFxuICAgICAgICB9XFxuICAgICAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBpZiAod2luZG93LmNvdW50ID09IG51bGwpIHtcXG4gICAgICAgICAgICAgICAgd2luZG93LmNvdW50ID0gMTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHRleHQ9Jyc7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgdGV4dD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxcXCJib2R5XFxcIikuaW5uZXJUZXh0O1xcbiAgICAgICAgICAgIH1jYXRjaCAoZSkge2ZiYS5sb2coZS5tZXNzYWdlKX1cXG4gICAgICAgICAgICBpZigv6Kem5Y+R5LqG6Ziy55uX6ZO+fOacquaOiOadg3zmjqXlj6PpmLLnm5cvLnRlc3QodGV4dCkmJndpbmRvdy5jb3VudD09MSl7XFxuICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLmo4DmtYvliLDmnInmjojmnYPvvIzlvIDlp4vov4fmjojmnYNcXFwiKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2luZG93LmNvdW50Kys7XFxuICAgICAgICAgICAgLy8gZmJhLmxvZygnY291bnQ6JyArIHdpbmRvdy5jb3VudCArICcsbWF4X2NvdW50OicgKyBtYXhfY291bnQpO1xcbiAgICAgICAgICAgIGlmICh3aW5kb3cuY291bnQgPj0gbWF4X2NvdW50KSB7XFxuICAgICAgICAgICAgICAgIGZiYS5jbGVhclZhcigneDVMaXN0Jyk7XFxuICAgICAgICAgICAgICAgIGZiYS5oaWRlTG9hZGluZygpO1xcbiAgICAgICAgICAgICAgICBsZXQgZm1zZyA9ICfpgZPplb/ku5PlupPpgJrlhY3op6PmnpDlpLHotKUs5Y6f5ZugOui2heaXticreDVUaW1lb3V0Kyfmr6vnp5InO1xcbiAgICAgICAgICAgICAgICBmYmEubG9nKGZtc2cpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvYXN0Oi8vJytmbXNnO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGZiYS5sb2coZS5tZXNzYWdlKTtcXG4gICAgICAgIH1cXG5cXG4gICAgICAgIGZ1bmN0aW9uIG11dGVNZShlbGVtKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgZWxlbS5wYXVzZSgpO1xcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuXFxuICAgICAgICB2YXIgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwidmlkZW9cXFwiKSwgYXVkaW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiYXVkaW9cXFwiKSxcXG4gICAgICAgICAgICB2MiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXFxcImVtYmVkXFxcIiksIHYzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcXFwiI3BsYXllclxcXCIpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodmlkZW9zLCBmdW5jdGlvbiAodmlkZW8pIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHZpZGVvKTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgW10uZm9yRWFjaC5jYWxsKGF1ZGlvcywgZnVuY3Rpb24gKGF1ZGlvKSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZShhdWRpbyk7XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIFtdLmZvckVhY2guY2FsbCh2MiwgZnVuY3Rpb24gKHYpIHtcXG4gICAgICAgICAgICAgICAgbXV0ZU1lKHYpO1xcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBbXS5mb3JFYWNoLmNhbGwodjMsIGZ1bmN0aW9uICh2KSB7XFxuICAgICAgICAgICAgICAgIG11dGVNZSh2KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIH1cXG4gICAgICAgIHZhciB1cmxzID0gX2dldFVybHMoKTtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB1cmxzKSB7XFxuICAgICAgICAgICAgICAgIGxldCB1PXVybHNbaV07XFxuICAgICAgICAgICAgICAgIC8vdT1kZWNvZGVVUklDb21wb25lbnQodSk7XFxuICAgICAgICAgICAgICAgIHRyeXt1PWRlY29kZVVSSUNvbXBvbmVudCh1KTt9Y2F0Y2goZSl7XFxuICAgICAgICAgICAgICAgICAgICB1PXVuZXNjYXBlKHUpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGlmKC91cmw9aHR0cC8udGVzdCh1KSl7XFxuICAgICAgICAgICAgICAgICAgICB1ID0gdS5zcGxpdChcXFwidXJsPVxcXCIpLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgfWVsc2UgaWYoL3ZpZD1odHRwLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIHUgPSB1LnNwbGl0KFxcXCJ2aWQ9XFxcIikuc2xpY2UoLTEpWzBdO1xcbiAgICAgICAgICAgICAgICB9ZWxzZSBpZigvXFxcXD8oLiopPWh0dHAvLnRlc3QodSkpe1xcbiAgICAgICAgICAgICAgICAgICAgdSA9IFxcXCJodHRwXFxcIit1LnNwbGl0KC9cXFxcPyguKik9aHR0cC8pLnNsaWNlKC0xKVswXTtcXG4gICAgICAgICAgICAgICAgICAgIC8vZmJhLmxvZyhcXFwi5YW25LuW5YiG5YmyOlxcXCIrdSk7XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKC9cXFxcLzFcXFxcLm0zdTgkLy50ZXN0KHUpKXtcXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHU9dS5yZXBsYWNlKC8mZnJvbT0uKnwmbmV4dD0uKnwmanVtcD0uKi8sJycpO1xcbiAgICAgICAgICAgICAgICBsZXQgcmVhbFVybCA9IGlzVmlkZW8odSk7XFxuICAgICAgICAgICAgICAgIGlmIChyZWFsVXJsJiYhaXNCYWRWaWRlbyh1KSkgey8v6L+H5ruk5ZCK5q+bXFxuICAgICAgICAgICAgICAgICAgICBmYmEubG9nKFxcXCLku5PlupN4NeWFjeWXhee7k+aenDpcXFwiICsgcmVhbFVybCk7XFxuICAgICAgICAgICAgICAgICAgICBmYmEuY2xlYXJWYXIoJ3g1TGlzdCcpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxVcmxcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBmYmEubG9nKGUubWVzc2FnZSlcXG4gICAgICAgIH1cXG4gICAgfSwgaXNWaWRlbywgbWF4X2NvdW50LHg1VGltZW91dCxpc0JhZFZpZGVvKTtcXG4gICAgY29uc3QgbHNnPSQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL2xvY2FsU3RvcmFnZT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgdXNlV2ViPWxzZy5nZXRJdGVtKFxcXCLpgJrlhY1cXFwiLFxcXCJYNVxcXCIpPT09XFxcIldFQlxcXCI7XFxuICAgIC8vbG9nKFxcXCLku5PlupPkvb/nlKh3ZWLpgJrlhY3mm7/ku6N4NTpcXFwiK3VzZVdlYik7XFxuICAgIGxldCBydWxlSGVhZD11c2VXZWImJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIzMzk/XFxcIndlYlJ1bGU6Ly9cXFwiOlxcXCJ4NVJ1bGU6Ly9cXFwiO1xcbiAgICByZXR1cm4gcnVsZUhlYWQrYnBhdGgrJ0AnICsgX3g1O1xcbn1cXG5cXG5mdW5jdGlvbiBMYXp5UGFyc2VGYXN0KHBsYXlVcmxMaXN0LGdldFRpbWVvdXQseDVUaW1lb3V0KXtcXG4gICAgY29uc3Qge2lzVmlkZW8sZ2V0SGVhZGVycyx4NVBhcnNlUHJvfSA9ICQucmVxdWlyZSgnaGlrZXI6Ly9wYWdlL2dsb2JhbFBhcnNlP3J1bGU96YGT6ZW/5LuT5bqTUHJvJyk7XFxuICAgIC8vIGxvZygn5byA5aeL5omn6KGMJytwbGF5VXJsTGlzdC5sZW5ndGgrJ+S4quWcsOWdgOeahOaJuemHj+WXheaOojonK3BsYXlVcmxMaXN0KTtcXG4gICAgbG9nKCflvIDlp4vmiafooYwnK3BsYXlVcmxMaXN0Lmxlbmd0aCsn5Liq5Zyw5Z2A55qE5om56YeP5ZeF5o6iJyk7XFxuICAgIGxldCBwbGF5VXJscyA9IHBsYXlVcmxMaXN0Lm1hcCgoaXQpPT57XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgIHVybDppdC5zcGxpdChcXFwiO1xcXCIpWzBdLFxcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICAgICAgICAgLy9cXFwiVXNlci1BZ2VudFxcXCI6IFxcXCJEYXJ0LzIuMTMgKGRhcnQ6aW8pXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjpcXFwiTW96aWxsYS81LjBcXFwiXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHRpbWVvdXQ6IGdldFRpbWVvdXRcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBsZXQgYmh0bWwgPSBiYXRjaEZldGNoKHBsYXlVcmxzKTtcXG4gICAgbGV0IHZpZGVvcyA9IFtdO1xcbiAgICBsZXQgeDVsaXN0ID0gW107XFxuICAgIGZvcihsZXQgaSBpbiBiaHRtbCl7XFxuICAgICAgICBsZXQgb3JkZXIgPSBwYXJzZUludChpKSsxO1xcbiAgICAgICAgbGV0IHRuYW1lPW9yZGVyKyflj7fop6PmnpDnvZHlnYA6JztcXG4gICAgICAgIC8vbG9nKHRuYW1lKTtcXG4gICAgICAgIGxldCB0dXJsPXBsYXlVcmxMaXN0W2ldLnNwbGl0KFxcXCI7XFxcIilbMF07XFxuICAgICAgICBsZXQgam5hbWU9cGxheVVybExpc3RbaV0uc3BsaXQoXFxcIjtcXFwiKS5sZW5ndGg+MT9wbGF5VXJsTGlzdFtpXS5zcGxpdChcXFwiO1xcXCIpWzFdOlxcXCJcXFwiO1xcbiAgICAgICAgdG5hbWUrPWpuYW1lO1xcbiAgICAgICAgbGV0IGJhY2tjb2RlID0gYmh0bWxbaV07XFxuICAgICAgICBpZigoIS91cmx8aHR0cC8udGVzdChiYWNrY29kZSkpJiYoIS8jRVhUSU5GLy50ZXN0KGJhY2tjb2RlKSkpe1xcbiAgICAgICAgICAgIGxvZyh0bmFtZSt0dXJsKyfmnInpl67popgs5Y+v6IO95Yqg5a+G5oiW6ICF5oyC5LqGJyk7XFxuICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICB9ZWxzZSBpZigvI0VYVElORi8udGVzdChiYWNrY29kZSkpe1xcbiAgICAgICAgICAgIC8vbGV0IGxjYWNoZT1cXFwiL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmV4YW1wbGUuaGlrZXJ2aWV3L2ZpbGVzL0RvY3VtZW50cy9jYWNoZS92aWRlb19cXFwiK3RuYW1lK1xcXCIubTN1OFxcXCI7XFxuICAgICAgICAgICAgLy93cml0ZUZpbGUobGNhY2hlLGJhY2tjb2RlKTtcXG4gICAgICAgICAgICAvL3ZpZGVvcy5wdXNoKGxjYWNoZSk7XFxuICAgICAgICAgICAgbGV0IHBVcmw9Y2FjaGVNM3U4KHR1cmwpO1xcbiAgICAgICAgICAgIHZpZGVvcy5wdXNoKHBVcmwpO1xcbiAgICAgICAgICAgIGNvbnRpbnVlO1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgdXJsID0gSlNPTi5wYXJzZShiYWNrY29kZSkudXJsO1xcbiAgICAgICAgICAgIGlmKC9eaHR0cC8udGVzdCh1cmwpKXtcXG4gICAgICAgICAgICAgICAgbGV0IHJlYWxWaWRlbyA9IGlzVmlkZW8odXJsKTtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mKHJlYWxWaWRlbyk9PSdzdHJpbmcnKXtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn5bey6Kej5p6Q5Ye66KeG6aKROicrcmVhbFZpZGVvKTtcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsVmlkZW8rPVxcXCLimIVcXFwiK2puYW1lXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB2aWRlb3MucHVzaChyZWFsVmlkZW8pO1xcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn6Kej5p6Q5Ye65LiN55+l6YGT5LuA5LmI5Lic6KW/OicrdXJsKTtcXG4gICAgICAgICAgICAgICAgICAgIHVybCs9XFxcIiNpc1ZpZGVvPXRydWUjXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIGlmKGpuYW1lKXtcXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmwrPVxcXCLimIVcXFwiK2puYW1lXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICB2aWRlb3MucHVzaCh1cmwpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgIGxvZyh0bmFtZSsn5Li6anNvbuaOpeWPo+S4lOaXoOi/lOWbnuinhumikeWcsOWdgOaVsOaNrjonK3BsYXlVcmxMaXN0W2ldKydcXFxcbicrYmFja2NvZGUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyh0bmFtZSsn5Li6eDXmjqXlj6Ms5Yqg5YWleDXll4XmjqLliJfooagnKTtcXG4gICAgICAgICAgICB4NWxpc3QucHVzaChwbGF5VXJsTGlzdFtpXSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgLy8gbG9nKHZpZGVvcyk7XFxuICAgIGlmKHZpZGVvcy5sZW5ndGg+MCl7XFxuICAgICAgICBpZihnZXRWYXIoJ2RwLmNhY2hlVmlkZW8nLCd0cnVlJyk9PT0ndHJ1ZScmJnBhcnNlSW50KGdldEFwcFZlcnNpb24oKSk+PTIyNTUpXFxuICAgICAgICB7XFxuICAgICAgICAgICAgbG9nKFxcXCLlsIrmlaznmoTprZTmlq3nlKjmiLfvvIzop4bpopHnvJPlrZjlt7LlkK/nlKjvvIzor7flsL3mg4Xkuqvlj5fnnIvliafml7blhYlcXFwiKTtcXG4gICAgICAgICAgICBsZXQgdmlkZW9zQ2FjaGU9dmlkZW9zLm1hcCgoaXQpPT57XFxuICAgICAgICAgICAgICAgIGxldCBoZWFkZXJzPXt9O1xcbiAgICAgICAgICAgICAgICBpZihpdC5zcGxpdChcXFwiO1xcXCIpLmxlbmd0aD4xKXtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0gaXQuc3BsaXQoJzsnKVsxXTtcXG4gICAgICAgICAgICAgICAgICAgIGlmKC9ALy50ZXN0KGhlYWQpJiYve3x9Ly50ZXN0KGhlYWQpKXtcXG4vL2hlYWQgPSBoZWFkLnJlcGxhY2UoL3t8fS9nLCcnKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkID0gaGVhZC5zcGxpdChcXFwie1xcXCIpWzFdLnNwbGl0KFxcXCJ9XFxcIilbMF07XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZCA9IGhlYWQuc3BsaXQoJyYmJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpIGluIGhlYWQpe1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQga2V5ID0gaGVhZFtpXS5zcGxpdCgnQCcpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPWhlYWRbaV0uc3BsaXQoJ0AnKVsxXS5yZXBsYWNlKC87Lywn77yb77ybJyk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnNba2V5XSA9IHZhbHVlO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICAgICAgICAgICAgdXJsOml0LnNwbGl0KFxcXCI7XFxcIilbMF0uc3BsaXQoXFxcIuKYhVxcXCIpWzBdLFxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczp7XFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczpoZWFkZXJzXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB2YXIgZGF0YT1iYXRjaENhY2hlTTN1OCh2aWRlb3NDYWNoZSk7XFxuICAgICAgICAgICAgZGF0YT1kYXRhLm1hcCgoaXQsaWQpPT57XFxuICAgICAgICAgICAgICAgIGxldCBleHRyYT1cXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgaWYodmlkZW9zW2lkXS5zcGxpdChcXFwiO1xcXCIpLmxlbmd0aD4xKXtcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhPVxcXCI7XFxcIit2aWRlb3NbaWRdLnNwbGl0KFxcXCI7XFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH1lbHNlIGlmKHZpZGVvc1tpZF0uc3BsaXQoXFxcIuKYhVxcXCIpLmxlbmd0aD4xKXtcXG4gICAgICAgICAgICAgICAgICAgIGV4dHJhPVxcXCLimIVcXFwiK3ZpZGVvc1tpZF0uc3BsaXQoXFxcIuKYhVxcXCIpWzFdO1xcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgICAgIGlmKGl0K1xcXCJcXFwiIT1cXFwibnVsbFxcXCIpe1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0K2V4dHJhXFxuICAgICAgICAgICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZGVvc1tpZF1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIC8vbG9nKGRhdGEpO1xcbiAgICAgICAgICAgIHJldHVybiBkYXRhXFxuICAgICAgICAgICAgLy9yZXR1cm4gdmlkZW9zXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gdmlkZW9zXFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbG9nKCflhbHmnIknK3g1bGlzdC5sZW5ndGgrJ+S4qng15Zyw5Z2A6L+b6KGM6L2u5rWB5ZeF5o6iJyk7XFxuICAgIC8v5rKh5pyJ55qE6K+d5bCx5byA5aeL5L6d5qyheDXll4XmjqJcXG4gICAgc2hvd0xvYWRpbmcoJ+WXheaOouS4re+8jOiLpeWksei0peWwseWIh+aNondlYuWXheaOoi4uLicpO1xcbiAgICByZXR1cm4geDVQYXJzZVBybyh4NWxpc3QseDVUaW1lb3V0LGlzVmlkZW8pO1xcbn1cXG52YXIgbGF6eT0kKCcnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICB0cnl7XFxuICAgICAgICByZWFsVXJsPWlucHV0O1xcbiAgICAgICAgZXZhbChcXFwidmFyIGNvbmZpZ19kcCA9XFxcIiArIGZldGNoKFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL015UGFyc2VTZXQuanNvblxcXCIpKTtcXG4gICAgICAgIGV2YWwoZmV0Y2goY29uZmlnX2RwLmNqKSk7XFxuICAgICAgICBsb2coaW5wdXQrJy0+5q2j5Zyo5pat5o+S6a2U5pS554mI6Kej5p6QLi4uJyk7XFxuICAgICAgICAvLyDliqDlhaXotoXml7borr7nva7vvIzlu7rorq7lnKjpppbpobXorr7nva5cXG4gICAgICAgIHJldHVybiBheXRtUGFyc2UocmVhbFVybClcXG4gICAgfWNhdGNoKGUpe1xcbiAgICAgICAgcmV0dXJuIGlucHV0XFxuICAgIH1cXG59KTtcXG4kLmV4cG9ydHMuaXNQaWM9aXNQaWM7XFxuJC5leHBvcnRzLmlzVmlkZW89aXNWaWRlbztcXG4kLmV4cG9ydHMuaXNCYWRWaWRlbz1pc0JhZFZpZGVvO1xcbiQuZXhwb3J0cy5jb21QYXJzZT1jb21QYXJzZTtcXG4kLmV4cG9ydHMuZ2V0SGVhZGVycz1nZXRIZWFkZXJzO1xcbiQuZXhwb3J0cy5sYXp5UGFyc2U9bGF6eVBhcnNlO1xcbiQuZXhwb3J0cy54NVBhcnNlUHJvPXg1UGFyc2VQcm87XFxuJC5leHBvcnRzLkxhenlQYXJzZUZhc3Q9TGF6eVBhcnNlRmFzdDtcXG4kLmV4cG9ydHMubGF6eT1sYXp5O1wifSx7XCJuYW1lXCI6XCLku7vliqHku5PlupPmjqXlj6NcIixcInBhdGhcIjpcInRhc2tDYWxsXCIsXCJydWxlXCI6XCJqczpcXG5TdHJpbmcucHJvdG90eXBlLnN0cmlwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5yZXBsYWNlKC8oXlxcXFxzKil8KFxcXFxzKiQpL2csIFxcXCJcXFwiKTsgfTtcXG5mdW5jdGlvbiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKSB7IC8vIOmAmueUqOWPkemAgeS7k+W6k3Bvc3TosIPnlKjku7vliqHor7fmsYJcXG4gICAgY29uc3Qge2dldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdCh0YXNrX2FwaSwge1xcbiAgICAgICAgaGVhZGVyczoge1xcbiAgICAgICAgICAgICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbidcXG4gICAgICAgIH0sXFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7XFxuICAgICAgICAgICAgXFxcInBhcmFtc1xcXCI6IHtcXG4gICAgICAgICAgICAgICAgXFxcImRhdGFcXFwiOiB7XFxuICAgICAgICAgICAgICAgICAgICBcXFwidHlwZVxcXCI6IHRhc2subW9kZXx8J3J1bicsXFxuICAgICAgICAgICAgICAgICAgICBcXFwiZnVuY1xcXCI6IHRhc2suZnVuY3x8JycsXFxuICAgICAgICAgICAgICAgICAgICBcXFwicGFyYW1zXFxcIjogdGFzay5wYXJhbXN8fFtdXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhdXRoXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lfHxcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR8fFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgIH0pO1xcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG59XFxuXFxuZnVuY3Rpb24gdGFza191cGxvYWQodGFzayl7IC8vIOmAmueUqOS7u+WKoeWPkeW4g+aWsOWinuWPiuS/ruaUueWKn+iDvVxcbiAgICBjb25zdCB7YXBpLGdldEZpbGV9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5P3J1bGU96YGT6ZW/5LuT5bqTUHJvXFxcIik7XFxuICAgIGxldCBob3VzZUZpbGUgPSBnZXRGaWxlfHxmYWxzZTtcXG4gICAgaWYoIWhvdXNlRmlsZSl7XFxuICAgICAgICBzZXRJdGVtKCdpc19ob3VzZV92aXAnLCAnZmFsc2UnKTtcXG4gICAgfVxcbiAgICBsZXQgYXBpX3VybCA9IGFwaS5ob3N0KycvaGlrZXJ1bGUvdGFzay9hZGQnO1xcbiAgICBsZXQgaG91c2VfZGF0YSA9IGhvdXNlRmlsZSgpO1xcbiAgICBsZXQgcmVzdWx0ID0gcmVxdWVzdChhcGlfdXJsLCB7XFxuICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJ1xcbiAgICAgICAgfSxcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgICBcXFwicGFyYW1zXFxcIjoge1xcbiAgICAgICAgICAgICAgICBcXFwiZGF0YVxcXCI6IHtcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJuYW1lXFxcIjogdGFzay5uYW1lLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcInB5Y29kZVxcXCI6IHRhc2sucHljb2RlLFxcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5vdGVcXFwiOiB0YXNrLm5vdGUsXFxuICAgICAgICAgICAgICAgICAgICBcXFwidGVzdF9jb2RlXFxcIjogdGFzay50ZXN0X2NvZGUsXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIFxcXCJhdXRoXFxcIjoge1xcbiAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBob3VzZV9kYXRhLnVzZXJuYW1lfHxcXFwiXFxcIixcXG4gICAgICAgICAgICAgICAgICAgIFxcXCJwYXNzd29yZFxcXCI6IGhvdXNlX2RhdGEucGFzc3dvcmR8fFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSxcXG4gICAgICAgIG1ldGhvZDogJ1BPU1QnXFxuICAgIH0pO1xcbiAgICByZXR1cm4gSlNPTi5wYXJzZShyZXN1bHQpLnJlc3VsdDtcXG59XFxuXFxuZnVuY3Rpb24gdGFza19jYWxsKGlkLGZ1bmMscGFyYW1zKXtcXG4gICAgY29uc3Qge2FwaX0gPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS91dGlsaXk/cnVsZT3pgZPplb/ku5PlupNQcm9cXFwiKTtcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3J1bi8nK2lkO1xcbiAgICBsZXQgdGFzayA9IHtcXG4gICAgICAgIG1vZGU6J2NhbGwnLFxcbiAgICAgICAgZnVuYzpmdW5jLFxcbiAgICAgICAgcGFyYW1zOnBhcmFtc3x8W11cXG4gICAgfTtcXG4gICAgcmV0dXJuIHRhc2tfcmVxKHRhc2tfYXBpLHRhc2spO1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrX3JlbmFtZShpZCxuZXdfdGFza19uYW1lKXtcXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL3JlbmFtZS8nK2lkO1xcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQrJyZ0YXNrX25hbWU9JytuZXdfdGFza19uYW1lO1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IEpTT04ucGFyc2UoZmV0Y2godGFza19hcGkse30pKTtcXG4gICAgICAgIGlmKHJlc3VsdC5zdGF0dXM9PTApe1xcbiAgICAgICAgICAgIHJldHVybiAgcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXN1bHQrJycrcmVzdWx0LmRldGFpbFxcbiAgICAgICAgfVxcbiAgICB9Y2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLm1lc3NhZ2UpO1xcbiAgICAgICAgcmV0dXJuICcnK2UubWVzc2FnZVxcbiAgICB9XFxufVxcblxcbmZ1bmN0aW9uIHRhc2tfY2hhbmdlX3N0YXRlKGlkKXtcXG4gICAgY29uc3Qge2FwaSxnZXRGaWxlfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgaG91c2VGaWxlID0gZ2V0RmlsZXx8ZmFsc2U7XFxuICAgIGlmKCFob3VzZUZpbGUpe1xcbiAgICAgICAgc2V0SXRlbSgnaXNfaG91c2VfdmlwJywgJ2ZhbHNlJyk7XFxuICAgIH1cXG4gICAgbGV0IGhvdXNlX2RhdGEgPSBob3VzZUZpbGUoKTtcXG4gICAgbGV0IHRhc2tfYXBpID0gYXBpLmhvc3QrJy9oaWtlcnVsZS90YXNrL2NoYW5nZV9zdGF0ZS8nK2lkO1xcbiAgICB0YXNrX2FwaSA9IHRhc2tfYXBpKyc/bmFtZT0nK2hvdXNlX2RhdGEudXNlcm5hbWUrJyZwYXNzd29yZD0nK2hvdXNlX2RhdGEucGFzc3dvcmQ7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gSlNPTi5wYXJzZShmZXRjaCh0YXNrX2FwaSx7fSkpO1xcbiAgICAgICAgaWYocmVzdWx0LnN0YXR1cz09MCl7XFxuICAgICAgICAgICAgcmV0dXJuICByZXN1bHQuZGV0YWlsXFxuICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0LnJlc3VsdCsnJytyZXN1bHQuZGV0YWlsXFxuICAgICAgICB9XFxuICAgIH1jYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUubWVzc2FnZSk7XFxuICAgICAgICByZXR1cm4gJycrZS5tZXNzYWdlXFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gdGFza19ydW4oaWQpe1xcbiAgICBjb25zdCB7YXBpfSA9ICQucmVxdWlyZShcXFwiaGlrZXI6Ly9wYWdlL3V0aWxpeT9ydWxlPemBk+mVv+S7k+W6k1Byb1xcXCIpO1xcbiAgICBsZXQgdGFza19hcGkgPSBhcGkuaG9zdCsnL2hpa2VydWxlL3Rhc2svcnVuLycraWQ7XFxuICAgIGxldCB0YXNrID0ge307XFxuICAgIHJldHVybiB0YXNrX3JlcSh0YXNrX2FwaSx0YXNrKTtcXG59XFxuXFxuJC5leHBvcnRzLnRhc2tDYWxsID0gdGFza19jYWxsO1xcbiQuZXhwb3J0cy50YXNrUnVuID0gdGFza19ydW47XFxuJC5leHBvcnRzLnRhc2tSZXEgPSB0YXNrX3JlcTtcXG4kLmV4cG9ydHMudGFza1VwbG9hZCA9IHRhc2tfdXBsb2FkO1xcbiQuZXhwb3J0cy50YXNrUmVuYW1lID0gdGFza19yZW5hbWU7XFxuJC5leHBvcnRzLnRhc2tDaGFuZ2VTdGF0ZSA9IHRhc2tfY2hhbmdlX3N0YXRlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5YWo5bGA5YKo5a2YXCIsXCJwYXRoXCI6XCJsb2NhbFN0b3JhZ2VcIixcInJ1bGVcIjpcImxldCBsb2NhbFN0b3JhZ2UgPSAoZnVuY3Rpb24oKSB7XFxuICAgIGV2YWxQcml2YXRlSlMoXFxcImp3VUt3TlRpUEdjV1NMQ1hCNVh0QVh3YjZMUWJWeUhEKzBYSjdsMDdjZTA9XFxcIik7XFxuICAgIC8vcGF0aHRvPXVuZGVmaW5lZDtcXG4gICAgZXZhbFByaXZhdGVKUyhcXFwiNEMwWXhSWW5HQ1lrZ0ZSWHRwbC9DejV6TDVoaDRqQ0N6dGIrbmcrV29reW1ROG9VcnpTOWxBOHl4QzVhRmFkblNFbXlIS01icmFmbFJxWENuTlJIRGxrNnVlOHlIVE8xNmxCUHJwd2dzNWpmMFBockF0b1RKSUUwWkhuOW1LYVE0SmQyZXJxYjRJNTViZVdJZXVnS3NEczIxMVN6SU5RNXlKZ1NoMWRWdU56enhSR0pnNDBGbVR1Vm1YVmZOMXhnMldJR0hCRW1rVm5HeG1PUmhQT05BK1E1VndQbWRwNDEvaHplM2VJc1V2aG83VkNCZ0s0cmFKbVBhbElSQkJWbENWZ244RmtXbWZLcVpvK1ZXK29CY0g3aHJjcnNTbENTakJhbmdULzdzeVdIeEtZaGVoVTBrYU1Zam5XRmcxRW0wY21OUnRvbUNzSHoxQjhxMzJPZVFIb2F3ZFd4ektPYU1IT1hEQmpSb2pBOEUvYWgwV1JPeXppcVJTeGwvbThkaEJkMGY5cGhZei81U1UvekpENTJYLzlFQzE2V1ZWZHBTVzMzYWtSSFJzbFBwUmxUV0Y5K0F5Um1SdzBlWk9FczFvOVFNUEFRVWZBeGJZeUZIZ3p0dy9PMmRKUnBIeVRtaUJpYWFxVGNpdng2djl6eXZCejA0d0kxQWFTQ3VpK2RUdVUzbHU1eGRFdDNBanQ2WjNpRFhPVmNFUDBFREY3NDc0UFFVNkpFWnV3ZTk3U2NoNGJpMXdCMVhIWlNmSXRkbFlZb0dlZDNMTHBibURBSVJjaXYwckFvcDhWbVFjVHQySzNMZmgxUkRZWTBZdHZSY0g0OU92cERSSC94YTVGYzhNWTNEckZvQTdxY29GNGVDZ2lWQmZCZ0pSNjgrTHBRSzd0T2tnOGs5ZWMrM05TeEpUaGNsOGQ2eU53eFQ5VGsxN3plSmdkNk1veVlaSXBXUUxsRjZZdmJPZEVXaGptbkE3OHdDMGhXeitYbTZoUU1TcXRGdytiaEZmN2NCR1UzYWF0UEZtZENZMkVkWGZoMElZVzg1d2RPeU1maXdXNy92VlRwOWlFMDBJM0YwOXdHSGtHS2hWYkx1ZUFrWWU3enpKWFI3dGhhRm9yNkg3cUxtSmpiUlFrOWV2TnRCUVhOUjdEaWZpWHVRZjJsdDduT0g4MFNXbTFmREhIemptUHNOSXBzMlRYR1QraXdWVjY5Zy90V2lwVlE2RDhCVHgrY0NRcDQ3bm1USXJZK3FONGtoMkZZaDVMbHdYZGdJeXkxVkl1QzN4MDUzZXdBSUlVbWxZOW5pRXBxWXQrMWZGUFhPQ3RDR3RZYlNkMzd2VlIxRU9qMms1R3UvKzlKV2cycXZ3bDF0d2VsZzFKMHR4YXJJaTRrVGJUcnZybkZMTjkycG9mcFpRVWZvV280Y2U3SFdOZGJ1NEpLRXJhTFFVZmRmR0VQZDFUSXVmdXVSVmEzOWVxOUdaeVNEdUJMNjBNUGRsZHhLdzF6bytmQjVaWStZTWozTEwyZ0d0RGJzOTgrQXNSVjlMSldtVW1zeDkxaG1KdEZVTVdEM3huajhITVpXczBOUGxDRlVyOTQ4NUtxVHBvNWtSekdmRitrL05sMkp6cnY1Y3ZrcXRVbkxnS3BYRU9qL3NlL29Eek9BclFLSTVUTlVidll3Y3djZGpqTVNmaks2OEtyd2hzK242U21XWjRaZGdSSGdBSzVNb0ZpM1htTFY0N1AzdlNSV3U1enlFc01rNHkzdXVDRml1UlBSbHU0UTVwSnZ1T2VtN0g3VUxpSWhDZW12NURna0d0REwxY0dMNEVRaFlSQjZJU3pWdnNiMkVhUDl3UUU2RFZSbk03TytwblN6ZXQ2bHpwM3BGZEduYm94MUxSZkM2MHV0WForQ2pJbTRpRU1tdGJCMk41ekRTaEdiZU0zWFViSlFkQ0JpczhYSXJoaDJiaUI1aEJDVnduM1kzZXR0N0dEUFZ0b2kxR1JqeitKYmdNK1lSOTI4S2JkV1M1dEZhTU0zS2ozWHY2b3RJeHpNQm5EQzl1VzNkK0lYeDZ2TFBKMEpSdWgzeVA3cFRsYTZjM2lSNHA5bldZRHFKK1pTbXBySEZuRE96c0xXbUZqYXBqZS9NcXdNSmQ2VGszbkFXd2ljTU9QdVlwTXlxSUYwNGZsNG1xZ3RzSExTTVdSUk5IUFpqRVRROWdSbWVEWWU2YVJ0bFcwMnFMMm9sREVOcUxRTXRBZG9pck5XUmNQOVZMM1RkOEhhVU82ZlNsR05hYk1ha0pELzAwWENoT1NVT0lQKzdmTTdWMC9sMWJMV1B0RXoxaTdMeWdUVjdwZEdvRG50cVNDRW5KckJ5aEJBekxSZzVRSWM5NDM4SWhLbXlmbjAvM2F3b0QxSXI3ODBleXAvWGNJNnhOY3c2VHYvRVRmSGcwZTdpWUMwVVljSklFNVFVWHYwcytZb0dJRXE1R0l6S3ViOEhOalNUVXBzdm5rVngrZGJlMmpSbjNZYjlXN0pDWjVZUzZGNU15VVZzcGpNRDdOWWMrRFdqVUwyYjJzVnlBZmVZcEM4VWhhaDl0dW1hdmJCdjdhM2E5a2dGYnE1OGxySHh6WTdpSlFWaWd6cTNlMWEyQlNiMFBjVzFhSjhCRDdOa05waEtZYXlUeHlrZ3dpbEVSTDhqcXFCRW5pSFZkQnhESllMYitYdzNhbExtbHR1VEVWNktHdEJudEJYK3l6MzZSUERNeUdJS2UrM2Z6Y3hmbkNEbjIwTW9kVlZrVk5velBxTVhaMEc1TDRhTFRBUWFrWUtVanNWTVFqQWhRa1RsSEJlTy9hTFB4OXN4bCsrajFaNXJMZ0cxMlRONFhKMWVpY3Z3NEFWRTU4TG9yYXEwUWlFMGNTN1BIMXBiclpXcmZ0N0xZR2l5QlNob3I3KzBqaW9VaDFwZFdxMnFNWUxxZU1FZXVDUk9RdDU3bUZyT2p5UEg0OXFwOTdjV09yZ2VnMld5ZldTREdRUGplNStQMHlRb0NwRC9EM1JBTXVXbWI5d2xCdGNxMmo4V0pQdDkxRTNrS2F3dVFJeXZkMnIyVWp4NCtIVE50VktiOWtNTE9PODVJNjViTkdCSCs0aXJTeTVnUVlsRTI2QTJjU0dJY0xLUVJsdkpvTW5hN0wvOXd5cnk0SHpPcnprckF2TGRnc1NObFlqcEhRRVJpT0k4MHNKNWpOQ0NuZncwMTNGK0Erc0FmTG15Uy9CRExOUTFxYVEzcDZoOC9KcUFmaFg1T0dIZ1NpUlZPQ0VqdWFEQi9Nd1pOQ3UzUUw5ZWhob0FqN3VPZjhQa3IzbUlqYmhoOUhpanNqeDE5MSswZTJKUXJGYTAxQVZKS0VWdHVQdEljMmgvMXBQS012eWVueGpUTzJPeFBuamp0Kzg0bklLS2h4REovZ2hQdDdpdjhQbVRKMGxLS3lQUnNzbDhmL1FkSGR4dXBiNmpUc0k2VUttejlZNDZQTUJ1RDZQM3doOHFwMzZPNm9pYk5EaVFkMXNFMTB2Smg5ejFGeXNLSWU4RXFNcG5OZEVtRzJUZkVCeFJwbVFyaEtFcWVlMHA2K2E2c1FvOGNWbFJKa0tRQVlLYXdjYU5FUzVYYzZkUVk1bnFlaXE4c1VpemYxc3BmSGVIZWxEdTFNNkJSWHVDakZhZlhoejhpM2xQV2dZcVZwZngxM2lnVkNSZjQ3VUg2NTJ5TG5zbWVwQ0JXZ3lCVFdBY095RjFReDhZR3Rabm9iMVROKzZ4RXd6cGNXVnk3UU85UDkyc0tBOVNLKy9OSHNxZjEzQ090MEpIQ3RUVjFPbFRRVytKQUt5eGUxSGw3K3M5NXozS0NnRktRUyszQXMxSlY3TmErZytMQ1IySWV2dThkNUQwTDdHd29EcmVVdjQzNzRMUmFGa05zSE9xV2JVOW5oUWpkTVZyN2EvaThPLzRoYnB0YVN6cXFrZ1lGaU5GVS9vbVc1cXdJejdzcDRuc2NJVFJFM2d1YTZiemtsTVo4RUNuMWlxQVd0MGE2Z2VraTVEYUw4cVlhcFRDQ2hqbFdzRXhxRnV4aVdQMzVUVUNkZEVkOEFDYk1HcytnUUZ5RE9vemZCREcxN2RaTzBtQ3dXK1B6Q0wyamJJQ0ROYWk1L2ptMVFyNk1MNTZqelVhSUR6MEdMUFRTYWV4MVVERHdrUTlvN21YV0MwUjdqV256YmtIUldjb21WYldtR3FMMXJqZG9hY3MvUjl1anFVdUJBNkE1VkwvcWtRMXhITDQyRVhvb3ByQzh3cnJmUjY4ek1NRnhPd1U3Q1lISjdiaEcvUTRyTnNYREJjTW8xQWRpcTlMWGJYbS9RSmowdS9qZ1pHc3N6MG5uS0tVRkpjeHp1QU5LOTZ6V3dmMURYYXNVY09vRXVFYXRtMXJtUDV3ckJKbVcvWndUNmFCQmlSMk9TSjB4cjh0UTZPYm1kS2p5YisxZUVYYjE0MzdSMklkaERVZGs1UFJ6dEgyWUZ0MnBtdUw0L0xtSUxGQXZQZGl5TXRESE5qK0toNHNWNE1sWGJXUHJySTk3WUJPRnBGbFgrZ25ld0tLZkZaa0hFN2RpdHkzNGRVUTJHbmU2c0FHeDF6eHlqWnY1S0JNMjZsUkhGNDVYcUZOSjFSUTNoTXltSkhzeVlOc01PNDFCV3JHdjE5UEE0NjhlY3c5SGNSTjB3aGpVVGduczhaVmFDNGhpSnNnWTA3YUFFQkhtOTAvdWhoak8vV21iN3d1VmFkaGw5Um5IZVFqcHg0Z3dDckx6NWk1czVJdDFzQndmRGIwRmUrUENwTGtjK3dJSU5LMlk4NmtQdGhSNmdKd1c3NXp1b041QzBDQWlEd2ZVNzN2YUFaYWh6ZjRWTE5sTTBVMDRPdEhZQmkxM1lnUG9ObUdIUmVsWlZFeTJLdUtWWmdoRDE0dlNsWStKck1CRGRtMnkydGhGVitCcmloTDcrZlE1d2NZbnhHZWxhd0R1b1NSNStiRERrcjZSTDQwTDR4eWZBaHhsck9uMHVBMjhnaEdlV2d1YVdLRXY1bkJycnZldTF1ZVZ5MU12R1VZQlkrSWxFcjhOZEROUmRtRXpYdDM5a0dsZDg2eE9mQUgveEwxVm11Z2FYT0dhUEIycWM3V0RSa1c2azVGNm4zUGtJemRQWHlPTktwMURrT2czb2NTTVpNVHM2R0tqOUMzdk9EWjZaUXB3TkRZTE1UK0NtRUwxOEdSalhOY1psUC9MbmhpQUlzY1lUTDEraUhXRFl2Um12UE13dE9IaENuRVhJVTNGVGJQKzZRUkdBNnF5ZGJubmVxVmhYb3djTG1iTUl6MTZJQzFrd2haajc1L001M3NLWVgyelJnT1NUQWZOU0QvNWxaWVNOVXhKZktURGdpYUZFZ2dyQ3JkKzNDYytjaHpzbEkzekRYRUtUcnZsY1gySW5DOXVIK2ZzeXB5SHcrQXZZMk9tQkdRTUlJYzhmRTN0Tk8wZ0JUVnFYc2RzRTc2WXdIcjI5ZHpRY2t1c3V5SnNCZlNWY2xydnNOQ1oxUFFETDhIM2NSczNIRTluVWt4NWJiSllXc1B4YjgyNWduRXBXVTlaOUt0enZzbGk3L2hlT2xES3BIeEpiMXVDcldxZjhnUm5XbXEzemZTU3JVWEJIU0x1NjJNcmtYVGpXZ2FwVVZ4TUdrcm56UjBFNFBNeTFiRmN5RHBFUWUxNVRheVdCTTFCNmpySUcrMERSUjlPYUNVUHdEN2V4Tm1qWmI5TTgxdXMrQUlSZnl6SlBaR21mSHVUOVNOekZmTnVRZEZaeWlaVnRhWWFvdld1TjJpckkzelFhdEtDRG5RSVhwcjBWaEcwR29wOGMvenJvV0JvTi9hVkttbjhza1NGdkFET2pvWkFpeGc2SzF5OXdGaThwZUNtaW1GWjNaekNWc0c2RVU5U3ZsYnE1K3duN0Q2eStkQVlkYVBtczRnd0NyTHo1aTVzNUl0MXNCd2ZEYno0WDRWeHFJcGNUQzlOYVlLcUE3R0tLK2FUclpXVXd3TjIxUU90cjhlcXhTZ0oxVTllQ09jV1hRZCtwMzZHeTRmWSt0OWMyQ3NWTmJObDFnaHhhOWJJOFU2ZTZGVGQvdnZCYXE5anJLZGl0cTRtTkNhaW9nbWZQSzZNNDhVWUk4alpNQ2RkLzlDOEJxdlVqNGJZVTVieVdBU0VHNkJCR2RLOEtsZmkvYTRMV3QzaXZDNHU5UUJUZmIvdkNtTkppL1FBZmFiY1BHK1VzV21zWU5SSytnOGhNY3N1Qm1oaDQ4TnBoUnZlYlZRcXE2bmNLeGMxbkZIV01XNU02b2YrejhjMUhkZG5pZURQOUdhQnNxK3lzbGpLc2xZcnQ5ODlQWTl4c2Jta3IzWC9vQ2ZpRlU0TmZjT2hlZSsrbmdXMFhwWkFWdDFJMlFuYzFhbHdibm9OcU1NaFhJQjk1aWtMeFNGcUgyMjZacTlzRy90cmRyMlNBVnVybnlXc2ZITmp1SWxCV0tET3JkN1ZyWUZKdlE5eGJWb21LcVFqdWg5ZHpmMm52VnJCemJFRjBDWlk2aXprWS9SUVk1cjlrOTMveTJORzdvMDduTVlqT3RaWVllTlVvaWs3R2JLL0h6UWwxUzdzL0ZDaG50OU02ZkUwVXl1UG10dE85OGhxenhRYnRlTWFsTXRTY2UyV0xjanlYVkdmcHFkQmtZeW00Z1pCeWNjUzZhbnR0NG9MZGx1V1NTSnNIWDFJY1hoUXk2b0orQWhqdzloRll3WExIUExvQ28zakVsaVVBSzQxNzl3dFl0SHNPMGFiTHg0K2htdE01Rno3d1VWYWhCQTlzdXBPVGYvRkQ0c2laTU1vZjVXM3ZtNURlZGhxR0FObGh0M21JNlJtSWh2NDhRVnRuZU1zVXpZQzRORGhaRDRNNVI2cDdHWEJxY3B1M0ZhRUYvMEkwZTNMY2VYMUhOK2lEcUtSUHVHenZwYWMvMXRzR1BJdGVBRHh1OU9Zb2FwMnozRjFDelNnL1V1YThsL0tFenRBS0RjdmJoTlUvWVVjMmxoZ3hnZmRiNGUrUDlUWjdSYVg4MnM2Mjd1MENiRnNmR0UvMWhMcGI1TWMydmsxdURHcmRJY2JXQTZ4aHBZQUhZaEVZVWw5Yzc1WS9SLzBnbDZyOSttNmNJMEJ2Qlk1QWE1TkJSYzZVTXZzTy9QT3c1Q2NyNzlzSnppY2VhVjNZd3JZRWtqcDZLaStPWXJHdTk1NEFBK2RKOVdzdk5HQkZHTXJLQWZROVZVQy9BVGtKZlRsb01sdERlVjVBbzl6a2FheTNkS0FhNS9QeEFHUkRBVWNRTERGN3VWWGJEMXZGZ0UvK1JYaXd6UzVON2NyM2FGQmRSWTdYQW1Gei9mYjAvS1NwUjhDUS9sb2twbU0ybWx0Sjl2R1BnaXFiNW5abDlLdTdkMkdsZ0FkaUVSaFNYMXp2bGo5SC9TQnVqQlBvTzFmcG9PdTVGMzVjZEhhNWtTRnZBRE9qb1pBaXhnNksxeTl3RmxqMEV6NWtzVVczV1U2M0U3ZTRxdERVQ0tXd2pqVTVmMEZkNTdWeVZ6cEM2Q2RDU2NCallTelQ5clpMVnNrcTYxYU9XckREVU5LcUFRMytuWC9CQlczY1FURWNPVmRjMTVuZ1ZYY1NTL2FLMlFGTWRpS1FscW0xNWZFckpkd3F5ZXphN2hmbEtUaUN6VWR1NVZHbEZXOXFDdDhzeUhvb3NBMk56Zm9zSmRUZE44YldIbm9EcjVOMjVldCtwL252ampPelpSYUxZb1kvZnIvazVocXB0T2s9XFxcIik7XFxuICAgIHJldHVybiAkLmV4cG9ydHM7XFxufSkoKTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIue8lui+keWFrOWRilwiLFwicGF0aFwiOlwiZGV2SW5mb0VkaXRcIixcInJ1bGVcIjpcImpzOlxcbmFkZExpc3RlbmVyKCdvbkNsb3NlJywgJC50b1N0cmluZygoKT0+e1xcbiAgICBwdXRNeVZhcihcXFwiZGV2SW5mb1xcXCIsJycpOyAvL+a4hemZpOWOhuWPsuWFrOWRilxcbn0pKTtcXG5zZXRQYWdlVGl0bGUoJ+e8lui+keWFrOWRiicpO1xcbi8vIGxldCB7bm93SngsTXlKaWV4aSxqeHNSb3V0ZX0gPSBNWV9QQVJBTVM7XFxuY29uc3Qge2NvbG9yLHNtYWxsLGFwaSwgZ2V0RmlsZSxnZXRBcGl9ID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL3BhZ2UvdXRpbGl5XFxcIik7XFxuLy8gbGV0IGhvdXNlRmlsZSA9IGdldEZpbGV8fGZhbHNlO1xcbnZhciBkZXZfaW5mb191cmwgPSBnZXRBcGkoJ2luZm9HZXRVcmwnKTtcXG4vLyBsb2coZGV2X2luZm9fdXJsKTtcXG52YXIgZ2V0X2luZm8gPSBmdW5jdGlvbihxcSl7XFxuICAgIHFxID0gcXF8fCc0MzQ4NTcwMDUnO1xcbiAgICBsZXQgZGV2X2luZm9fdXJsID0gZGV2X2luZm9fdXJsK3FxO1xcbiAgICBsZXQgYmFja19jb2RlID0gSlNPTi5wYXJzZShyZXF1ZXN0KGRldl9pbmZvX3VybCkpO1xcbiAgICBsZXQgZGV2X2luZm89YmFja19jb2RlLnJlc3VsdHx8YmFja19jb2RlLmRldGFpbDtcXG4gICAgcmV0dXJuIGRldl9pbmZvO1xcbn07XFxudmFyIGJlZm9yZV9yZWZyZXNoID0gZnVuY3Rpb24oKXtcXG4gICAgbGV0IGRldl9zZXRfaW5mbyA9IGdldE15VmFyKFxcXCJkZXZfc2V0X2luZm9cXFwiKS5zcGxpdCgnJCQnKTtcXG4gICAgbGV0IGRldl9pbmZvX3VybCA9IGRldl9zZXRfaW5mby5zbGljZSgtMSlbMF07XFxuICAgIGxldCBiYWNrX2NvZGUgPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV2X2luZm9fdXJsKSk7XFxuICAgIGxldCBkZXZfaW5mbz1iYWNrX2NvZGUucmVzdWx0fHxiYWNrX2NvZGUuZGV0YWlsO1xcbiAgICBwdXRNeVZhcihcXFwiZGV2SW5mb1xcXCIsZGV2X2luZm8pO1xcbiAgICByZXR1cm4gZGV2X2luZm9cXG59O1xcbmxldCBkID0gW107XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+e8lui+keWFrOWRiicsXFxuICAgIGRlc2M6J+aUr+aMgW1k6K+t5rOVLOeCueWHu+i/m+WFpeWtpuS5oE1k6K+t5rOVXFxcXG7kv53lrZjlhazlkYrmjInpkq7lnKjmlofmnKzmoYbmnIDkuIvpnaInLFxcbiAgICBjb2xfdHlwZTondGV4dF8xJyxcXG4gICAgdXJsOidodHRwczovL3d3dy5ydW5vb2IuY29tL21hcmtkb3duL21kLXR1dG9yaWFsLmh0bWwnXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+i/lOWbnicsXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcbiAgICB1cmw6JCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKT0+e1xcbiAgICAgICAgYmFjayhmYWxzZSk7XFxuICAgICAgICByZXR1cm4gJ2hpa2VyOi8vZW1wdHknXFxuICAgIH0pXFxufSk7XFxuaWYoIWdldE15VmFyKCdkZXZJbmZvJykpe1xcbiAgICBiZWZvcmVfcmVmcmVzaCgpO1xcbn1cXG5sZXQgZW1wdHkgPSAnaGlrZXI6Ly9lbXB0eSc7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6J+mYheiniOafpemYhScsXFxuICAgIGNvbF90eXBlOid0ZXh0XzInLFxcbiAgICAvLyB1cmw6JChnZXRNeVZhcignZGV2SW5mbycpKS5jb25maXJtKClcXG4gICAgdXJsOiQoZW1wdHkpLnJ1bGUoKCk9PntcXG4gICAgICAgIHJlcXVpcmUoXFxcImh0dHBzOi8vZ2l0bGFiLmNvbS9oamRobngvaGlrZXIvLS9yYXcvbWFpbi9qcy9tYXJrZWQubWluLmpzXFxcIik7XFxuICAgICAgIGxldCBkZXZJbmZvPVxcXCJcXFwiO1xcbiAgICAgICB0cnl7XFxuICAgICAgICAgIGRldkluZm89bWFya2VkLnBhcnNlKGdldE15VmFyKCdkZXZJbmZvJykpO1xcbiAgICAgICB9Y2F0Y2goZSl7fVxcbiAgICAgICAgc2V0UmVzdWx0KFtcXG4gICAgICAgICAgICB7XFxuICAgICAgICAgICAgICAgIHRpdGxlOmRldkluZm8sXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOidyaWNoX3RleHQnLFxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIF0pO1xcbiAgICB9KVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGRlc2M6IFxcXCLlv6vmnaXnvJbovpHkvaDnmoTlhazlkYrlkKd+XFxcIixcXG4gICAgY29sX3R5cGU6ICdpbnB1dCcsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBnZXRNeVZhcignZGV2SW5mbycsICcnKXx8XFxcIlxcXCIsXFxuICAgICAgICB0eXBlOiBcXFwidGV4dGFyZWFcXFwiLFxcbiAgICAgICAgaGVpZ2h0Oi0xLFxcbiAgICAgICAgb25DaGFuZ2U6ICdwdXRNeVZhcihcXFwiZGV2SW5mb1xcXCIsaW5wdXQpJ1xcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6XFxcIuS/neWtmOWFrOWRilxcXCIsXFxuICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgIHVybDokKCfnoa7orqTkv53lrZjlhazlkYrlkJfvvJ/lsIbkvJrkuI7pgZPplb/ku5PlupPmnI3liqHlmajpgJrorq8nKS5jb25maXJtKCgpPT57XFxuICAgICAgICBsZXQgZGV2X3NldF9pbmZvID0gZ2V0TXlWYXIoXFxcImRldl9zZXRfaW5mb1xcXCIpLnNwbGl0KCckJCcpO1xcbiAgICAgICAgbGV0IGlucHV0X3RleHQgPSBnZXRNeVZhcignZGV2SW5mbycsICcnKTtcXG4gICAgICAgIGlmKGlucHV0X3RleHQubGVuZ3RoID49IDQpe1xcbiAgICAgICAgICAgIGxldCBpbmZvX3NldF91cmw9IGRldl9zZXRfaW5mb1syXTtcXG4gICAgICAgICAgICBsZXQgc2VuZF9kYXRhID0ge1xcXCJwYXJhbXNcXFwiOlxcbiAgICAgICAgICAgICAgICAgICAge1xcXCJkYXRhXFxcIjoge1xcXCJpbmZvXFxcIjogaW5wdXRfdGV4dH0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcIm5hbWVcXFwiOiBkZXZfc2V0X2luZm9bMF0sXFxuICAgICAgICAgICAgICAgICAgICAgICAgXFxcInBhc3N3b3JkXFxcIjogZGV2X3NldF9pbmZvWzFdfVxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgLy8gbG9nKHNlbmRfZGF0YSk7XFxuICAgICAgICAgICAgbGV0IHBhcjIgPSB7aGVhZGVyczp7J2NvbnRlbnQtdHlwZSc6J2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsJ1VzZXItQWdlbnQnOmRldl9zZXRfaW5mb1szXX0sYm9keTpKU09OLnN0cmluZ2lmeShzZW5kX2RhdGEpLG1ldGhvZDonUE9TVCd9O1xcbiAgICAgICAgICAgIC8vIHBhcjIgPSBKU09OLnN0cmluZ2lmeShwYXIyKTsgLy94NemHjOmdouivt+axguaJjemcgOimgee8lueggVxcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBiYWNrX3JldCA9IHJlcXVlc3QoaW5mb19zZXRfdXJsLCBwYXIyKTtcXG4gICAgICAgICAgICAgICAgYmFja19yZXQgPSBKU09OLnBhcnNlKGJhY2tfcmV0KS5yZXN1bHQ7XFxuICAgICAgICAgICAgICAgIGlmKGJhY2tfcmV0LnN0YXR1cz09PTApe1xcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kv53lrZjmiJDlip9cXFxcbicrYmFja19yZXQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/kv53lrZjlpLHotKVcXFxcbicrYmFja19yZXQuZGV0YWlsO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfWNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAndG9hc3Q6Ly/plJnor69cXFxcbicrZS5tZXNzYWdlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1lbHNle1xcbiAgICAgICAgICAgIGNvbmZpcm0oe3RpdGxlOifpgZPplb/mj5DnpLonLGNvbnRlbnQ6J+iZveeEtuS9oOW+iOaHku+8jOS9huaYr+WFrOWRiuiHs+WwkeWGmTTkuKrlrZflkKfvvIEnfSk7XFxuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL2VtcHR5J1xcbiAgICAgICAgfVxcbiAgICB9KVxcbn0pO1xcblxcbnNldFJlc3VsdChkKTtcIn1dIiwiaWNvbiI6Imh0dHBzOi8vbGFubWVpZ3VvamlhbmcuY29tL3R1Ymlhby9vdGhlci8zMC5zdmciLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment