xiaomianao666

小程序:资源库

Jul 4th, 2024
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:小程序¥home_rule_v2¥base64://@资源库@eyJmaXJzdEhlYWRlciI6ImNsYXNzIiwibGFzdF9jaGFwdGVyX3J1bGUiOiIiLCJ0aXRsZSI6Iui1hOa6kOW6kyIsImF1dGhvciI6IkBMb3lEZ0lrJnpldGFscGhhIiwidXJsIjoiaGlrZXI6Ly9lbXB0eSMjZnlwYWdlIiwidmVyc2lvbiI6NSwiY29sX3R5cGUiOiJtb3ZpZV8zIiwiY2xhc3NfbmFtZSI6IiIsInR5cGUiOiJ2aWRlbyIsImNsYXNzX3VybCI6IiIsImFyZWFfbmFtZSI6IiIsImFyZWFfdXJsIjoiIiwic29ydF9uYW1lIjoiIiwieWVhcl9uYW1lIjoiIiwic29ydF91cmwiOiIiLCJ5ZWFyX3VybCI6IiIsImZpbmRfcnVsZSI6ImpzOlxuZnVuY3Rpb24gbG9hZChkLCBkcnB5LCBzb3VyY2UpIHtcbiAgICBsZXQgcGFnZSA9IE1ZX1BBR0U7XG4gICAgbGV0IGNhdGVnb3J5cyA9ICQucmVxdWlyZShcImNhdGVnb3J5c1wiKTtcbiAgICBjYXRlZ29yeXMuZ2V0Y2F0ZWdvcnlzKGQsIGRycHksIHBhZ2UpO1xuICAgIGxldCB7XG4gICAgICAgIGNhdGUsXG4gICAgICAgIGhvbWVsaXN0XG4gICAgfSA9IGNhdGVnb3J5cy5nZXRjYXRlbGlzdCgpO1xuICAgIGlmIChnZXRNeVZhcihcImxpbmtzXCIsIFwiXCIpID09IFwiMVwiKSB7XG4gICAgICAgIHNldFByZVJlc3VsdChkKTtcbiAgICAgICAgZC5sZW5ndGggPSAwO1xuICAgIH1cbiAgICBsZXQgZmwgPSBjYXRlZ29yeXMuZ2V0ZmwoKTtcblxuICAgIGxldCBsaXN0ID0gW107XG4gICAgaWYgKGNhdGUgPT0gXCJob21lXCIpIHtcbiAgICAgICAgaWYgKHBhZ2UgPT0gMSkge1xuICAgICAgICAgICAgbGlzdCA9IGhvbWVsaXN0O1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGlzdCA9IEpTT04ucGFyc2UoZHJweS5jYXRlZ29yeShTdHJpbmcoY2F0ZSksIHBhZ2UsIHRydWUsIGZsKSkubGlzdFxuICAgIH1cbiAgICBsZXQgaG9tZUxpc3RDb2wgPSBnZXRJdGVtKFwiaG9tZUxpc3RDb2xcIiwgXCJtb3ZpZV8zX21hcnF1ZWVcIik7XG5cbiAgICBpZiAobGlzdC5sZW5ndGgpIHtcbiAgICAgICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xuICAgICAgICAgICAgbGV0IGlkID0gU3RyaW5nKGl0LnZvZF9pZCk7XG4gICAgICAgICAgICAvL2xvZyhpdClcbiAgICAgICAgICAgIGxldCBuYW1lID0gaXQudm9kX25hbWU7XG4gICAgICAgICAgICB1cmwgPSBcImhpa2VyOi8vcGFnZS9kZXRhaWxlZCNpbW1lcnNpdmVUaGVtZSNcIjtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09IFwic3RyaW5nXCIgJiYgaWQuaW5jbHVkZXMoXCJtc2VhcmNoOlwiKSB8fCBpZCA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB1cmwgPSAkKFwiXCIpLmxhenlSdWxlKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHB1dE15VmFyKFwidGVtc21vZGVcIiwgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJoaWtlcjovL3NlYXJjaD9ydWxlPVwiICsgTVlfUlVMRS50aXRsZSArIFwiJnM9XCIgKyBuYW1lO1xuICAgICAgICAgICAgICAgIH0sIG5hbWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBuYW1lLFxuICAgICAgICAgICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzLFxuICAgICAgICAgICAgICAgIHVybDogdXJsLFxuICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LnZvZF9waWMsXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IGhvbWVMaXN0Q29sLFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgICAgICAgIGltZzogaXQudm9kX3BpYyxcbiAgICAgICAgICAgICAgICAgICAgdm9kSWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBzbmFtZTogc291cmNlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNrZXk6IHNvdXJjZS5rZXksXG4gICAgICAgICAgICAgICAgICAgIGxvbmdDbGljazogW3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBcIuiBmuWQiOaQnOe0olwiLFxuICAgICAgICAgICAgICAgICAgICAgICAganM6IFwicHV0TXlWYXIoJ3RlbXNtb2RlJywgJzEnKTsnaGlrZXI6Ly9zZWFyY2g/cnVsZT0nICsgTVlfUlVMRS50aXRsZSArICcmcz1cIiArIG5hbWUgKyBcIic7XCJcbiAgICAgICAgICAgICAgICAgICAgfV1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gc2V0RHJweVBhdGgoZCkge1xuICAgIGQucHVzaCh7XG4gICAgICAgIHRpdGxlOiBcIue8uuWwkei/kOihjOW6k1xcbuivpeWwj+eoi+W6j+S4jeiDvemAmui/h+S6keWJqui0tOadv+WIhuS6q++8jOWPquiDvemAmui/h+aJk+WMheWIhuS6q1wiLFxuICAgICAgICBkZXNjOiBcIuWwhui/kOihjOW6k+aUvuWFpVwiICsgZ2V0UGF0aChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpLFxuICAgICAgICBjb2xfdHlwZTogXCJ0ZXh0X2NlbnRlcl8xXCIsXG4gICAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCJcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gc2V0SGllZChkLCBuYW1lLCBjb25maWcpIHtcbiAgICBsZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTUwOTlcIik7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IG5hbWUgfHwgXCJcIixcbiAgICAgICAgY29sX3R5cGU6ICdpY29uXzNfcm91bmRfZmlsbCcsXG4gICAgICAgIGltZzogJ2h0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vc3lzdGVtLzEzMC5wbmcnLFxuICAgICAgICB1cmw6ICQoXCIjbm9Mb2FkaW5nI1wiKS5sYXp5UnVsZSgoKSA9PiB7XG4gICAgICAgICAgICAkLnJlcXVpcmUoXCJDaGFuZ2VTb3VyY2VQb3BcIikuc2hvdygpO1xuICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICB9KSxcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgIGNwYXRoOiBjb25maWcucGF0aCxcbiAgICAgICAgICAgIGxvbmdDbGljazogW3tcbiAgICAgICAgICAgICAgICB0aXRsZTogXCLmm7TmjaLphY3nva5cIixcbiAgICAgICAgICAgICAgICBqczogSlNPTi5zdHJpbmdpZnkoXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiKVxuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBcIuWIt+aWsOa6kFwiLFxuICAgICAgICAgICAgICAgIGpzOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXCJydW50aW1lQ29uZmlnXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlID0gcnVudGltZUNvbmZpZy5nZXRDdXJyZW50U291cmNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICB0aXRsZTogXCLlrozlhajliLfmlrDmupBcIixcbiAgICAgICAgICAgICAgICBqczogJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgRHJweU1hbmFnZSA9IEdNLmRlZmluZU1vZHVsZShcIkRycHlNYW5hZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIERycHlNYW5hZ2UuZGVsKHNvdXJjZS5rZXkpO1xuICAgICAgICAgICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XS5jb25jYXQoY29uZmlnLnR5cGUgPT09IFwibG9jYWxEaXJcIiA/IFt7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwi5pys5Zyw566h55CGXCIsXG4gICAgICAgICAgICAgICAganM6IFwiJ2hpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSMnXCJcbiAgICAgICAgICAgIH1dIDogW10pXG4gICAgICAgIH1cbiAgICB9KTtcblxuXG5cbiAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFtcIuS7hemAieS4rVwiLCBcIuiBmuWQiFwiXVtzbW9kZV0sXG4gICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoKSA9PiB7XG4gICAgICAgICAgICBsZXQgc21vZGUgPSBOdW1iZXIoZ2V0SXRlbShcInNtb2RlXCIsIFwiMFwiKSk7XG4gICAgICAgICAgICByZXR1cm4gJChbXCLku4XpgInkuK1cIiwgXCLogZrlkIhcIl0sIDEsIFwi5pCc57Si5qih5byPXCIsIHNtb2RlKS5zZWxlY3QoKHQpID0+IHtcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFwic21vZGVcIiwgXCJcIiArIE1ZX0lOREVYKTtcbiAgICAgICAgICAgICAgICB1cGRhdGVJdGVtKHQgKyBcIkBzZWFyY2hfbW9kZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBbXCLku4XpgInkuK1cIiwgXCLogZrlkIhcIl1bTVlfSU5ERVhdLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9lbXB0eVwiO1xuICAgICAgICAgICAgICAgIC8vcmVmcmVzaFBhZ2UoKTtcbiAgICAgICAgICAgIH0sIE1ZX1JVTEUudGl0bGUpXG4gICAgICAgIH0pLFxuICAgICAgICBwaWNfdXJsOiBcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvMjUuc3ZnXCIsXG4gICAgICAgIGNvbF90eXBlOiBcImljb25fM19yb3VuZF9maWxsXCIsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFwiQHNlYXJjaF9tb2RlXCIsXG4gICAgICAgICAgICBsb25nQ2xpY2s6IFt7XG4gICAgICAgICAgICAgICAgdGl0bGU6IFwi5oyH5a6a5pCc57Si5rqQXCIsXG4gICAgICAgICAgICAgICAganM6ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXCJTZWFyY2hBbGxvd1BvcFwiKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogXCLorr7nva5cIixcbiAgICAgICAgdXJsOiAkKFtcIuino+aekOeuoeeQhlwiLCBcIuWumOaWueW8ueW5lVwiLCBcImRycHnosIPor5Xml6Xlv5c6XCIgKyAoZ2V0SXRlbShcInVzZUxvZ1wiLCBcIlwiKSA9PSBcIlwiID8gXCLlhbPpl61cIiA6IFwi5byA5ZCvXCIpLCBcIuWIm+W7uuiuoumYheWcsOWdgFwiLCBcIuWIh+aNouWIl+ihqOagt+W8j1wiXSwgMSwgXCLorr7nva5cIikuc2VsZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGlmIChcIuino+aekOeuoeeQhlwiID09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaGlrZXI6Ly9wYWdlL3J1bGVNYW5hZ2Ujbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFwi5a6Y5pa55by55bmVXCIgPT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgbGV0IHVzZURhbm11ID0gISFnZXRJdGVtKFwidXNlRGFubXVcIiwgXCJcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXCLlvZPkuLrlrpjmupDml7bljLnphY3lvLnluZUo6ZyA6KaBZGFubXXnm5LlrZDmlK/mjIEpXFxu5b2T5YmNOlwiICsgdXNlRGFubXUgKyBcIlxcbueCueWHu+ehruWumuWNs+WPr1wiICsgKHVzZURhbm11ID8gXCLlhbPpl61cIiA6IFwi5byA5ZCvXCIpKS5jb25maXJtKCh1c2VEYW5tdSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFwidXNlRGFubXVcIiwgdXNlRGFubXUgPyBcIlwiIDogXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ0b2FzdDovL1wiICsgKHVzZURhbm11ID8gXCLlt7LlhbPpl61cIiA6IFwi5bey5byA5ZCvXCIpO1xuICAgICAgICAgICAgICAgIH0sIHVzZURhbm11KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQuaW5jbHVkZXMoXCJkcnB56LCD6K+V5pel5b+XXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHVzZUxvZyA9ICEhZ2V0SXRlbShcInVzZUxvZ1wiLCBcIlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJChcIuW8gOWQr+aXpeW/l+i+heWKqeiwg+ivle+8jOaZrumAmuS9v+eUqOS4jemcgOimgeW8gOWQr1xcbuW9k+WJjTpcIiArIHVzZUxvZyArIFwiXFxu54K55Ye756Gu5a6a5Y2z5Y+vXCIgKyAodXNlTG9nID8gXCLlhbPpl61cIiA6IFwi5byA5ZCvXCIpKS5jb25maXJtKCh1c2VMb2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcInVzZUxvZ1wiLCB1c2VMb2cgPyBcIlwiIDogXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcInJ1bnRpbWVDb25maWdcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRHJweU1hbmFnZS5kZWwoc291cmNlLmtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwidG9hc3Q6Ly9cIiArICh1c2VMb2cgPyBcIuW3suWFs+mXrVwiIDogXCLlt7LlvIDlkK9cIik7XG4gICAgICAgICAgICAgICAgfSwgdXNlTG9nKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFwi5Yib5bu66K6i6ZiF5Zyw5Z2AXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJoaWtlcjovL3BhZ2UvY3JlYXRlU3Vic2NyaXB0aW9uI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgY29sbGlzdCA9IFtcIm1vdmllXzNfbWFycXVlZVwiLCBcIm1vdmllXzNcIiwgXCJtb3ZpZV8yXCIsIFwibW92aWVfMVwiLCBcInRleHRfMVwiXTtcbiAgICAgICAgICAgICAgICBsZXQgaG9tZUxpc3RDb2wgPSBnZXRJdGVtKFwiaG9tZUxpc3RDb2xcIiwgXCJtb3ZpZV8zX21hcnF1ZWVcIik7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29sbGlzdC5pbmRleE9mKGhvbWVMaXN0Q29sKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gJChjb2xsaXN0LCAxLCBcIumAieaLqeagt+W8j1wiLCBpbmRleCkuc2VsZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcImhvbWVMaXN0Q29sXCIsIGlucHV0KTtcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHBpY191cmw6IFwiaHR0cHM6Ly9oaWtlcmZhbnMuY29tL3R1Ymlhby9tZXNzeS8zMC5zdmdcIixcbiAgICAgICAgY29sX3R5cGU6IFwiaWNvbl8zX3JvdW5kX2ZpbGxcIixcbiAgICB9KTtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogJ+aQnOe0oicsXG4gICAgICAgIC8vZGVzYzogJycsXG4gICAgICAgIGRlc2M6ICfopoHmkJzngrnku4DkuYgnLFxuICAgICAgICB1cmw6ICQudG9TdHJpbmcoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICdoaWtlcjovL3NlYXJjaD9ydWxlPScgKyBNWV9SVUxFLnRpdGxlICsgXCImcz1cIiArIGlucHV0O1xuICAgICAgICB9KSxcbiAgICAgICAgY29sX3R5cGU6ICdpbnB1dCcsXG4gICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IGdldE15VmFyKFwia2V5d29yZFwiLCBcIlwiKSxcbiAgICAgICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwdXRNeVZhcihcImtleXdvcmRcIiwgaW5wdXQpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfSlcbn1cbmxldCBkID0gW107XG5cbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbmxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKTtcbkRycHlNYW5hZ2UuaW5pdFBhZ2UoXCJob21lXCIpO1xuYWRkTGlzdGVuZXIoXCJvbkNsb3NlXCIsKCk9PntcbiAgICBjbGVhck15VmFyKFwibGlua3NcIik7XG59KTtcbnRyeSB7XG4gICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDMwICYmICFhbmRyb2lkLm9zLkVudmlyb25tZW50LmlzRXh0ZXJuYWxTdG9yYWdlTWFuYWdlcigpKSB7XG4gICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogXCLigJjigJjmj5DnpLrigJnigJlcIixcbiAgICAgICAgICAgIGRlc2M6IFwi5b2T5YmN5rKh5pyJ5paH5Lu2566h55CG5p2D6ZmQ5peg5rOV5q2j5bi45L2/55So6K+35omT5byA5rW36ZiU6K6+572uPT7mm7TlpJrorr7nva49PuWGhemDqOaWh+S7tueuoeeQhj0+5Y+z5LiK6KeSXCIsXG4gICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9lbXB0eVwiLFxuICAgICAgICAgICAgY29sX3R5cGU6IFwidGV4dF9jZW50ZXJfMVwiXG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSB7XG4gICAgICAgIGQucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogXCLov5jmsqHmnInphY3nva7op4bpopHmupBcIixcbiAgICAgICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvY3JlYXRlQ29uZmlnI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5I1wiLFxuICAgICAgICAgICAgY29sX3R5cGU6IFwidGV4dF9jZW50ZXJfMVwiLFxuICAgICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGZpbGVFeGlzdChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgICAgICAgaWYgKE1ZX1BBR0UgPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgc2V0SGllZChkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2V0SGllZChkLCBzb3VyY2UubmFtZSwgcnVudGltZUNvbmZpZy5nZXRDdXJyZW50Q29uZmlnKCkgfHwge30pO1xuICAgICAgICB9XG4gICAgICAgIC8vbG9nKERycHlNYW5hZ2UuZ2V0KHNvdXJjZS5rZXkpKVxuICAgICAgICBpZiAoZ2V0TXlWYXIoXCJsaW5rc1wiLCBcIlwiKSA9PSBcIlwiKSB7XG4gICAgICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiAn5Yqg6L295LitLi4uJyxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxuICAgICAgICAgICAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCIsXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogTVlfUlVMRS50aXRsZSArIFwibG9hZFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHNldFByZVJlc3VsdChkKVxuICAgICAgICB9XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIGxvYWQoZCwgRHJweU1hbmFnZS5nZXQoc291cmNlLmtleSksIHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXREcnB5UGF0aChkKTtcbiAgICB9XG5cbn0gY2F0Y2ggKGUpIHtcbiAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogXCLigJzigJxcIiArIGUudG9TdHJpbmcoKSArIFwi4oCd4oCdXCIsXG4gICAgICAgIGRlc2M6IGUubGluZU51bWJlcixcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vZW1wdHlcIixcbiAgICAgICAgY29sX3R5cGU6IFwidGV4dF9jZW50ZXJfMVwiXG4gICAgfSk7XG4gICAgZC5wdXNoKHtcbiAgICAgICAgdGl0bGU6IFwi5pu05o2i6YWN572uXCIsICAgICAgICBcbiAgICAgICAgdXJsOiBcImhpa2VyOi8vcGFnZS9jcmVhdGVDb25maWcjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjXCIsXG4gICAgICAgIGNvbF90eXBlOiBcInRleHRfY2VudGVyXzFcIixcbiAgICAgICAgZXh0cmE6e1xuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuc2V0UmVzdWx0KGQpOyIsInNlYXJjaF91cmwiOiJoaWtlcjovL2VtcHR5P3M9KiomcGFnZT1meXBhZ2UiLCJncm91cCI6IuW8gOWPkeS4reW/gyIsInNlYXJjaEZpbmQiOiJqczpcbihmdW5jdGlvbigpIHtcbiAgbGV0IHNtb2RlID0gTnVtYmVyKGdldEl0ZW0oXCJzbW9kZVwiLCBcIjBcIikpO1xuICBsZXQgdGVtc21vZGUgPSBnZXRNeVZhcihcInRlbXNtb2RlXCIsIFwiXCIpO1xuICBpZiAodGVtc21vZGUpIHtcbiAgICAgIHNtb2RlID0gTnVtYmVyKHRlbXNtb2RlKTtcbiAgICAgIGNsZWFyTXlWYXIoXCJ0ZW1zbW9kZVwiKTtcbiAgfVxuICBpZiAoIWZpbGVFeGlzdChcImhpa2VyOi8vZmlsZXMvZGF0YS9cIiArIE1ZX1JVTEUudGl0bGUgKyBcIi9saWJzX2hpa2VyL2RycHkyLmpzXCIpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572uZHJweVBhdGhcIixcbiAgICB1cmw6IFwiaGlrZXI6Ly9ob21lQFwiICsgTVlfUlVMRS50aXRsZVxuICB9XSk7XG4gIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiKTtcbiAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXCJEcnB5TWFuYWdlXCIpO1xuICBpZiAoIXJ1bnRpbWVDb25maWcuaXNQcmVwYXJlZCgpKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgdGl0bGU6IFwi6K+35YmN5b6A5bCP56iL5bqP5Li76aG16K6+572u5rqQXCIsXG4gICAgdXJsOiBcImhpa2VyOi8vaG9tZUBcIiArIE1ZX1JVTEUudGl0bGVcbiAgfV0pO1xuXG4gIGlmIChzbW9kZSA9PT0gMCkge1xuICAgIGxldCBzb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRTb3VyY2UoKTtcbiAgICBpZiAoIXNvdXJjZS5zZWFyY2hhYmxlKSByZXR1cm4gc2V0UmVzdWx0KFt7XG4gICAgICB0aXRsZTogXCLlvZPliY3mupDkuI3mlK/mjIHmkJzntKJcIixcbiAgICAgIHVybDogXCJoaWtlcjovL2VtcHR5XCJcbiAgICB9XSk7XG4gICAgbGV0IGRycHkgPSBEcnB5TWFuYWdlLmdldChzb3VyY2Uua2V5KTtcbiAgICBsZXQgaG9tZUxpc3QgPSBbXVxuICAgIHRyeSB7XG4gICAgICBob21lTGlzdCA9IEpTT04ucGFyc2UoZHJweS5zZWFyY2goTVlfS0VZV09SRCwgZmFsc2UsIE1ZX1BBR0UpKS5saXN0IHx8IFtdO1xuICAgIH0gY2F0Y2gge31cbiAgICBsZXQgZCA9IFtdO1xuICAgIGZvciAobGV0IGl0IG9mIGhvbWVMaXN0KSB7XG4gICAgICBkLnB1c2goe1xuICAgICAgICB0aXRsZTogaXQudm9kX25hbWUsXG4gICAgICAgIGRlc2M6IGl0LnZvZF9yZW1hcmtzK1wiwrdcIitzb3VyY2UubmFtZSxcbiAgICAgICAgY29udGVudDogaXQudm9kX2NvbnRlbnQsXG4gICAgICAgIHVybDogXCJoaWtlcjovL3BhZ2UvZGV0YWlsZWQjaW1tZXJzaXZlVGhlbWUjXCIsXG4gICAgICAgIHBpY191cmw6IGl0LnZvZF9waWMsXG4gICAgICAgIGNvbF90eXBlOiBcIm1vdmllXzNcIixcbiAgICAgICAgZXh0cmE6IHtcbiAgICAgICAgICB2b2RJZDogaXQudm9kX2lkLFxuICAgICAgICAgIGltZzogaXQudm9kX3BpYyxcbiAgICAgICAgICBzbmFtZTogc291cmNlLm5hbWUsXG4gICAgICAgICAgc2tleTogc291cmNlLmtleVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0UmVzdWx0KGQpO1xuICB9IGVsc2Uge1xuICAgIHNldFJlc3VsdChbe1xuICAgICAgdGl0bGU6IFwi54K55oiR5byA5aeL6IGa5ZCI5pCc57SiXCIgKyBNWV9LRVlXT1JELFxuICAgICAgdXJsOiBcImhpa2VyOi8vc2VhcmNoP3M9XCIgKyBNWV9LRVlXT1JELFxuICAgICAgZXh0cmE6IHtcbiAgICAgICAgZGVsZWdhdGVPbmx5U2VhcmNoOiB0cnVlLFxuICAgICAgICBydWxlczogJC50b1N0cmluZygoKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFwicnVudGltZUNvbmZpZ1wiLCBcInJ1bnRpbWVDb25maWdcIik7XG4gICAgICAgICAgICBsZXQgbGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsb3dTZWFyY2hTb3VyY2UoKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xuICBcbiAgICAgICAgICAgIGxldCBsaXN0aSA9IGxpc3QuZmluZEluZGV4KHggPT4geC5rZXkgPT0gc291cmNlLmtleSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChzb3VyY2Uuc2VhcmNoYWJsZSAmJiBsaXN0aSAhPSAtMSkge1xuICAgICAgICAgICAgICBsaXN0LnNwbGljZShsaXN0LmluZGV4T2Yoc291cmNlKSwgMSk7XG4gICAgICAgICAgICAgIGxpc3QudW5zaGlmdChzb3VyY2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcnVsZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGl0IG9mIGxpc3QpIHtcbiAgICAgICAgICAgICAgcnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGl0Lm5hbWUsXG4gICAgICAgICAgICAgICAgc2VhcmNoX3VybDogXCJoaWtlcjovL2VtcHR5P3BhZ2U9ZnlwYWdlJnNlYXJjaFRlcm1zPSoqXCIsXG4gICAgICAgICAgICAgICAgc2VhcmNoRmluZDogXCJqczpcIiArICQudG9TdHJpbmcoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgIGxldCBkcnB5ID0gR00uZGVmaW5lTW9kdWxlKFwiRHJweU1hbmFnZVwiKS5nZXQoaXRlbS5rZXkpO1xuXG4gICAgICAgICAgICAgICAgICBsZXQgaG9tZUxpc3QgPSBKU09OLnBhcnNlKGRycHkuc2VhcmNoKE1ZX0tFWVdPUkQsIGZhbHNlLCBNWV9QQUdFKSkubGlzdCB8fCBbXTtcbiAgICAgICAgICAgICAgICAgIGxldCBkID0gW107XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBpdCBvZiBob21lTGlzdCkge1xuICAgICAgICAgICAgICAgICAgICBkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBpdC52b2RfbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBkZXNjOiBpdC52b2RfcmVtYXJrcyxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiBpdC52b2RfY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmw6IFwiaGlrZXI6Ly9wYWdlL2RldGFpbGVkI2ltbWVyc2l2ZVRoZW1lI1wiLFxuICAgICAgICAgICAgICAgICAgICAgIHBpY191cmw6IGl0LnZvZF9waWMsXG4gICAgICAgICAgICAgICAgICAgICAgY29sX3R5cGU6IFwibW92aWVfM1wiLFxuICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2b2RJZDogaXQudm9kX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNQb2x5bWVyaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1nOiBpdC52b2RfcGljLFxuICAgICAgICAgICAgICAgICAgICAgICAgc25hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNrZXk6IGl0ZW0ua2V5LFxuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZXRSZXN1bHQoZCk7XG4gICAgICAgICAgICAgICAgfSwgaXQpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJ1bGVzKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBsb2coZS50b1N0cmluZygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfV0pO1xuICB9XG59KSgpIiwiZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsImRldGFpbF9maW5kX3J1bGUiOiIiLCJzZGV0YWlsX2NvbF90eXBlIjoibW92aWVfMSIsInNkZXRhaWxfZmluZF9ydWxlIjoiIiwidWEiOiJtb2JpbGUiLCJwcmVSdWxlIjoiLyo8JD5cbkBpbmNsdWRlIHN0YXJ0XG5odHRwOi8vaGlrZXIubm9raWEucHJlc3MvaGlrZXJ1bGUvcnVsZWxpc3QuanNvbj9pZD02OTE2JmF1dGg9MWQzNWU4ZjAtMjJlOC01MjcwLWE5ZDEtODI2ZjUzZjE3N2FkXG5AaW5jbHVkZSBlbmRcbjwkPiovXG4iLCJwYWdlcyI6Ilt7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZHJweVwiLFwicGF0aFwiOlwiZHJweVwiLFwicnVsZVwiOlwiZnVuY3Rpb24gaW5pdEhpa2VyKCkge1xcbiAgICBjb25zdCBpc0Nsb3NlTG9nID0gIWdldEl0ZW0oXFxcInVzZUxvZ1xcXCIsIFxcXCJcXFwiKTtcXG4gICAgY29uc3QgbG9jYWxLZXkgPSBcXFwiZHJweVxcXCI7XFxuICAgIGNvbnN0IENyeXB0b1V0aWwgPSAkLnJlcXVpcmUoXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcIik7XFxuICAgIGdsb2JhbFRoaXMubG9jYWwgPSB7XFxuICAgICAgICBzZXQocnVsZWtleSwgaywgdikge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obG9jYWxLZXkgKyBcXFwiQFxcXCIgKyBydWxla2V5ICsgXFxcIkBcXFwiICsgaywgdik7XFxuICAgICAgICB9LFxcbiAgICAgICAgZ2V0KHJ1bGVrZXksIGssIHYpIHtcXG4gICAgICAgICAgICByZXR1cm4gc3RvcmFnZTAuZ2V0SXRlbShsb2NhbEtleSArIFxcXCJAXFxcIiArIHJ1bGVrZXkgKyBcXFwiQFxcXCIgKyBrLCBcXFwiXFxcIikgfHwgdjtcXG4gICAgICAgIH0sXFxuICAgICAgICBkZWxldGUocnVsZWtleSwgaykge1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLmNsZWFySXRlbShsb2NhbEtleSArIFxcXCJAXFxcIiArIHJ1bGVrZXkgKyBcXFwiQFxcXCIgKyBrKTtcXG4gICAgICAgIH1cXG4gICAgfTtcXG4gICAgZXZhbChnZXRDcnlwdG9KUygpKTtcXG4gICAgZ2xvYmFsVGhpcy5DcnlwdG9KUyA9IENyeXB0b0pTO1xcblxcbiAgICBsZXQgJHJlcXVlc3QgPSByZXF1ZXN0O1xcbiAgICBsZXQgJHBvc3QgPSBwb3N0O1xcbiAgICBnbG9iYWxUaGlzLnJlcSA9IGZ1bmN0aW9uICh1cmwsIGNvYmopIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlcyA9IHt9O1xcbiAgICAgICAgICAgIGxldCBvYmogPSBPYmplY3QuYXNzaWduKHt9LCBjb2JqKTtcXG4gICAgICAgICAgICBpZiAob2JqLmRhdGEpIHtcXG4gICAgICAgICAgICAgICAgb2JqLmJvZHkgPSBvYmouZGF0YTtcXG4gICAgICAgICAgICAgICAgZGVsZXRlIG9iai5kYXRhO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KFxcXCJyZWRpcmVjdFxcXCIpKSBvYmoucmVkaXJlY3QgPSAhIW9iai5yZWRpcmVjdDtcXG4gICAgICAgICAgICBpZiAob2JqLmJ1ZmZlciA9PT0gMikge1xcbiAgICAgICAgICAgICAgICBvYmoudG9IZXggPSB0cnVlO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBvYmouaGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe1xcbiAgICAgICAgICAgICAgICBDb29raWU6IFxcXCIjbm9Db29raWUjXFxcIlxcbiAgICAgICAgICAgIH0sIG9iai5oZWFkZXJzKTtcXG4gICAgICAgICAgICBpZiAodXJsID09PSBcXFwiaHR0cHM6Ly9hcGkubm4uY2kvb2NyL2I2NC90ZXh0XFxcIiAmJiBvYmouaGVhZGVycykge1xcbiAgICAgICAgICAgICAgICBvYmouaGVhZGVyc1tcXFwiQ29udGVudC1UeXBlXFxcIl0gPSBcXFwidGV4dC9wbGFpblxcXCI7XFxuICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmICh1cmwuaW5jbHVkZXMoXFxcIj90eXBlPVxcXCIpIHx8IHVybC5pbmNsdWRlcyhcXFwiP3BhcmFtcz1cXFwiKSkpIHtcXG4gICAgICAgICAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIHVybC5sYXN0SW5kZXhPZihcXFwiP1xcXCIpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iai5oZWFkZXJzKSB7XFxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb2JqLmhlYWRlcnNba2V5XSAhPT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIG9iai5oZWFkZXJzW2tleV0gPSBTdHJpbmcob2JqLmhlYWRlcnNba2V5XSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbGV0IHIgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICAvKiBpZiAoU3RyaW5nKG9iai5tZXRob2QpLnRvTG93ZXJDYXNlKCkgPT09IFxcXCJwb3N0XFxcIikge1xcbiAgICAgICAgICAgICAgICAgciA9ICRwb3N0KHVybCwgb2JqKTtcXG4gICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgIHIgPSAkcmVxdWVzdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgIH0qL1xcbiAgICAgICAgICAgIHIgPSAkcmVxdWVzdCh1cmwsIG9iaik7XFxuICAgICAgICAgICAgaWYgKG9iai53aXRoSGVhZGVycykge1xcbiAgICAgICAgICAgICAgICByID0gSlNPTi5wYXJzZShyKTtcXG4gICAgICAgICAgICAgICAgcmVzLmNvbnRlbnQgPSByLmJvZHk7XFxuICAgICAgICAgICAgICAgIHJlcy5oZWFkZXJzID0ge307XFxuICAgICAgICAgICAgICAgIGZvciAobGV0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhyLmhlYWRlcnMgfHwge30pKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXMuaGVhZGVyc1trXSA9IHZbMF07XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXMuY29udGVudCA9IHI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmouYnVmZmVyID09PSAyKSB7XFxuICAgICAgICAgICAgICAgIHJlcy5jb250ZW50ID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlSGV4KHJlcy5jb250ZW50KS50b0Jhc2U2NChfYmFzZTY0Lk5PX1dSQVApO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICByZXR1cm4gcmVzO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhcXFwiRXJyb3JcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbiAgICAvKlxcbiAgICBjb25zdCBKaW5KYSA9ICQucmVxdWlyZShcXFwiaHR0cHM6Ly9jZG4uYm9vdGNkbi5uZXQvYWpheC9saWJzL211c3RhY2hlLmpzLzQuMS4wL211c3RhY2hlLmpzXFxcIik7XFxuICBcXG4gICAgY29uc3QgSlAgPSAkLnJlcXVpcmUoXFxcImh0dHBzOi8vanNvbnBhdGgtcGx1cy5naXRodWIuaW8vSlNPTlBhdGgvZGlzdC9pbmRleC1icm93c2VyLXVtZC5janNcXFwiKTtcXG4gICAgZ2xvYmFsVGhpcy5jaGVlcmlvID0ge1xcbiAgICAgICAgamluamEyKHRlbXBsYXRlLCBvYmopIHtcXG4gICAgICAgICAgICBcXG4gICAgICAgICAgICByZXR1cm4gJC5sb2coSmluSmEucmVuZGVyKHRlbXBsYXRlLCBvYmopKTtcXG4gICAgICAgIH0sXFxuICAgICAgICBqcChwYXRoLCBqc29uKSB7XFxuICAgICAgICAgICAgcmV0dXJuIEpQLkpTT05QYXRoKHtcXG4gICAgICAgICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgICAgICAganNvblxcbiAgICAgICAgICAgIH0pWzBdO1xcbiAgICAgICAgfVxcbiAgICB9Ki9cXG4gICAgZ2xvYmFsVGhpcy5wZGZhID0gX3BkZmE7XFxuICAgIGdsb2JhbFRoaXMucGQgPSBfcGQ7XFxuICAgIGdsb2JhbFRoaXMucGRmaCA9IF9wZGZoO1xcbiAgICBTdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGwgPSBmdW5jdGlvbiAoc2VhcmNoLCByZXBsYWNlbWVudCkge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQoc2VhcmNoKS5qb2luKHJlcGxhY2VtZW50KTtcXG4gICAgfTtcXG4gICAgbGV0ICR0b1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZztcXG4gICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xcbiAgICAgICAgcmV0dXJuICR0b1N0cmluZy5hcHBseSh0aGlzKS50cmltKCk7XFxuICAgIH07XFxuICAgIGlmIChpc0Nsb3NlTG9nKSB7XFxuICAgICAgICAvLyDph43lhpljb25zb2xlLmxvZ+WHveaVsFxcbiAgICAgICAgY29uc29sZS5sb2cgPSBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgICAgLy8g5qOA5p+l5Lyg5YWl5Y+C5pWw55qE5pWw6YePXFxuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XFxuICAgICAgICAgICAgICAgIC8vIOWmguaenOWPguaVsOaVsOmHj+Wkp+S6jjHvvIzosIPnlKjljp/lp4vnmoRjb25zb2xlLmxvZ+WHveaVsFxcbiAgICAgICAgICAgICAgICAvL29yaWdpbmFsTG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3VtZW50cyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAvLyDlpoLmnpzlj4LmlbDlj6rmnInkuIDkuKrvvIzliJnkuI3lgZrku7vkvZXmk43kvZxcXG4gICAgICAgIH07XFxuICAgIH1cXG59XFxuaW5pdEhpa2VyKCk7XFxuY29uc3QgZHJweVBhdGggPSBnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL2RhdGEvXFxcIiArIE1ZX1JVTEUudGl0bGUgKyBcXFwiL2xpYnNfaGlrZXIvZHJweTIuanNcXFwiKTtcXG5cXG5pZiAoIWZpbGVFeGlzdChkcnB5UGF0aCkpIHtcXG4gICAgdGhyb3cgbmV3IEVycm9yKFxcXCLnvLrlsJFkcnB5Lmpz6L+Q6KGM5bqTXFxcIik7XFxufVxcbmxldCBkcnB5ID0gJC5yZXF1aXJlKGRycHlQYXRoKTtcXG4vKlxcbmxldCBjdXJyZW50UGF0aCA9IFxcXCJcXFwiO1xcbmxldCAkaW5pdCA9IGRycHkuaW5pdDtcXG5kcnB5LmluaXQgPSBmdW5jdGlvbihleHQpIHtcXG4gICAgaWYgKGV4dCA9PT0gY3VycmVudFBhdGgpIHJldHVybjtcXG4gICAgJGluaXQuY2FsbCh0aGlzLCBleHQpO1xcbiAgICBjdXJyZW50UGF0aCA9IGV4dDtcXG59Ki9cXG4kLmV4cG9ydHMgPSBkcnB5O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfMV92ZXJ0aWNhbF9waWNfYmx1clwiLFwibmFtZVwiOlwi6K+m57uG6aG16Z2iXCIsXCJwYXRoXCI6XCJkZXRhaWxlZFwiLFwicnVsZVwiOlwianM6XFxuKGZ1bmN0aW9uICgpIHtcXG4gIGxldCBpZCA9IE1ZX1BBUkFNUy52b2RJZDtcXG4gIGFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBHTS5jbGVhcihcXFwicmVub3ZhdGVMaXN0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInNvcnRpXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBhZ2VudW1cXFwiKTtcXG4gIH0pO1xcbiAgYWRkTGlzdGVuZXIoJ29uUmVmcmVzaCcsICQudG9TdHJpbmcoKGlkKSA9PiB7XFxuICAgIC8vY2xlYXJNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiKVxcbiAgfSwgaWQpKVxcblxcbiAgLy/mlrnms5VcXG4gIGZ1bmN0aW9uIGZvbnRzdHlsZSh0ZXh0LCBwYXJhbXMpIHtcXG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHVuZGVmaW5lZDtcXG4gICAgdmFyIGggPSBwYXJhbXMuaCAhPT0gZmFsc2UgPyAn4oCc4oCc4oCd4oCdJyA6ICcnO1xcbiAgICB2YXIgdGFncyA9IHBhcmFtcy50YWdzIHx8IFxcXCJcXFwiO1xcbiAgICBpZiAocGFyYW1zLmMgIT0gdW5kZWZpbmVkKSB7XFxuICAgICAgdGV4dCA9IHRleHQuZm9udGNvbG9yKHBhcmFtcy5jKTtcXG4gICAgfVxcbiAgICBpZiAodGFncykge1xcbiAgICAgIHZhciB0YWdBcnJheSA9IHRhZ3Muc3BsaXQoJ3wnKS5maWx0ZXIoZSA9PiBlKTtcXG4gICAgICB2YXIgb3BlblRhZ3MgPSAnJztcXG4gICAgICB2YXIgY2xvc2VUYWdzID0gJyc7XFxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdBcnJheS5sZW5ndGg7IGkrKykge1xcbiAgICAgICAgb3BlblRhZ3MgKz0gJzwnICsgdGFnQXJyYXlbaV0gKyAnPic7XFxuICAgICAgICBjbG9zZVRhZ3MgPSAnPC8nICsgdGFnQXJyYXlbaV0gKyAnPicgKyBjbG9zZVRhZ3M7XFxuICAgICAgfVxcbiAgICAgIHRleHQgPSBvcGVuVGFncyArIHRleHQgKyBjbG9zZVRhZ3M7XFxuICAgIH1cXG4gICAgcmV0dXJuIGggKyB0ZXh0O1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gZmluZExvbmdlc3RFbGVtZW50KGFycikge1xcbiAgICByZXR1cm4gYXJyLnJlZHVjZSgoYSwgYikgPT4gYS5sZW5ndGggPiBiLmxlbmd0aCA/IGEgOiBiKTtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIGNvdW50VG90YWxCeXRlcyh0ZXh0KSB7XFxuICAgIHZhciBjb3VudCA9IDA7XFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xcbiAgICAgIHZhciBjb2RlID0gdGV4dC5jaGFyQ29kZUF0KGkpO1xcbiAgICAgIGlmIChjb2RlID49IDB4MDEwMCkgeyAvLyDlj4zlrZfoioLlrZfnrKbnmoQgVW5pY29kZSDnvJbnoIHlpKfkuo4gMjU1XFxuICAgICAgICBjb3VudCArPSAyOyAvLyDlj4zlrZfoioLlrZfnrKborqHmlbDkuLoyXFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGNvdW50ICs9IDE7IC8vIOWNleWtl+iKguWtl+espuiuoeaVsOS4ujFcXG4gICAgICB9XFxuICAgIH1cXG4gICAgcmV0dXJuIGNvdW50O1xcbiAgfVxcblxcbiAgZnVuY3Rpb24gc3Vic3RyKHN0ciwgbWF4TGVuZ3RoKSB7XFxuICAgIGxldCBsZW4gPSAwO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xcbiAgICAgIGlmIChzdHIuY2hhckNvZGVBdChpKSA+IDI1NSkge1xcbiAgICAgICAgbGVuICs9IDI7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIGxlbisrO1xcbiAgICAgIH1cXG4gICAgICBpZiAobGVuID4gbWF4TGVuZ3RoKSB7XFxuICAgICAgICByZXR1cm4gc3RyLnNsaWNlKDAsIGkpICsgJy4uLic7XFxuICAgICAgfVxcbiAgICB9XFxuICAgIHJldHVybiBzdHI7XFxuICB9XFxuXFxuICBmdW5jdGlvbiBzZXREZXNjKGRlc2MsIG51bSkge1xcbiAgICBpZiAoZGVzYyA9PSB1bmRlZmluZWQpIHtcXG4gICAgICByZXR1cm47XFxuICAgIH1cXG4gICAgZGVzYyA9IGRlc2MuY29uc3RydWN0b3IgPT0gQXJyYXkgPyBkZXNjLmpvaW4oJzxicj4nKSA6IGRlc2M7XFxuICAgIGlmIChkZXNjLnJlcGxhY2UoLyg8YnI+fFxcXFxzKykvZywgJycpLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcbiAgICAgIH0pXFxuICAgICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnYmlnX2JsYW5rX2Jsb2NrJ1xcbiAgICAgIH0pXFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuXFxuICAgIGNvbnN0IG1hcmsgPSAnZGVzYyc7XFxuICAgIG51bSA9IHR5cGVvZiAobnVtKSA9PSAndW5kZWZpbmVkJyA/IDEwMCA6IG51bVxcbiAgICBkZXNjID0gZGVzYy5zdGFydHNXaXRoKCfjgIDjgIAnKSA/IGRlc2MgOiAn44CA44CAJyArIGRlc2M7XFxuICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoLycvZywgXFxcIiYjMzk7XFxcIik7XFxuICAgIGRlc2MgPSBkZXNjLnJlcGxhY2UoL1xcXFxyXFxcXG4vZywgXFxcIjxicj5cXFwiKTtcXG4gICAgZGVzYyA9IGRlc2MucmVwbGFjZSgvXFxcXG4vZywgXFxcIjxicj5cXFwiKTtcXG4gICAgbGV0IHNkZXNjID0gc3Vic3RyKGRlc2MsIG51bSk7XFxuXFxuICAgIHZhciBjb2xvcnMgPSB7XFxuICAgICAgc2hvdzogXFxcImJsYWNrXFxcIixcXG4gICAgICBoaWRlOiBcXFwiZ3JleVxcXCJcXG4gICAgfVxcblxcbiAgICB2YXIgbGF6eSA9ICQoYCNub0xvYWRpbmcjYCkubGF6eVJ1bGUoKGRjLCBzZGMsIG0sIGNzKSA9PiB7XFxuICAgICAgdmFyIHNob3cgPSBzdG9yYWdlMC5nZXRJdGVtKG0sICcwJyk7XFxuICAgICAgdmFyIHRpdGxlID0gZmluZEl0ZW0oJ2Rlc2MnKS50aXRsZTtcXG4gICAgICB2YXIgcmUgPSAvKDxcXFxcL3NtYWxsPjxicj4uKj8+KS4rL2c7XFxuICAgICAgdmFyIGV4cCA9ICflsZXlvIA6JztcXG4gICAgICB2YXIgcmV0ID0gJ+aUtui1tzonO1xcbiAgICAgIGlmIChzaG93ID09ICcxJykge1xcbiAgICAgICAgdXBkYXRlSXRlbSgnZGVzYycsIHtcXG4gICAgICAgICAgdGl0bGU6IHRpdGxlXFxuICAgICAgICAgICAgLnJlcGxhY2UocmV0LCBleHApXFxuICAgICAgICAgICAgLnJlcGxhY2UocmUsICckMScgKyBzZGMgKyAnPC9zbWFsbD4nKVxcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oPFxcXFwvc21hbGw+PGJyPlxcXFw8Zm9udCBjb2xvcj1cXFwiKS4qPyhcXFwiPikvLCAnJDEnICsgY3MuaGlkZSArICckMicpXFxuXFxuICAgICAgICB9KVxcbiAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShtLCAnMCcpO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICB1cGRhdGVJdGVtKCdkZXNjJywge1xcbiAgICAgICAgICB0aXRsZTogdGl0bGVcXG4gICAgICAgICAgICAucmVwbGFjZShleHAsIHJldClcXG4gICAgICAgICAgICAucmVwbGFjZShyZSwgJyQxJyArIGRjICsgJzwvc21hbGw+JylcXG4gICAgICAgICAgICAucmVwbGFjZSgvKDxcXFxcL3NtYWxsPjxicj5cXFxcPGZvbnQgY29sb3I9XFxcIikuKj8oXFxcIj4pLywgJyQxJyArIGNzLnNob3cgKyAnJDInKVxcbiAgICAgICAgfSlcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0obSwgJzEnKTtcXG4gICAgICB9XFxuICAgICAgcmV0dXJuIGBoaWtlcjovL2VtcHR5YFxcbiAgICB9LCBkZXNjLCBzZGVzYywgbWFyaywgY29sb3JzKVxcbiAgICB2YXIgc2MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gJ+WxleW8gDonIDogJ+aUtui1tzonO1xcbiAgICB2YXIgZGMgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gc2Rlc2MgOiBkZXNjO1xcbiAgICB2YXIgY3MgPSBzdG9yYWdlMC5nZXRJdGVtKG1hcmssICcwJykgPT0gJzAnID8gY29sb3JzLmhpZGUgOiBjb2xvcnMuc2hvdztcXG4gICAgZC5wdXNoKHtcXG4gICAgICB0aXRsZTogJycgKyAnPGI+PGZvbnQgY29sb3I9XFxcIiMwOThBQzFcXFwiPuKIt+WJp+aDheeugOS7i1xcdDwvZm9udD48L2I+JyArIFxcXCI8c21hbGw+PGEgc3R5bGU9J3RleHQtZGVjb3JhdGlvbjogbm9uZTsnIGhyZWY9J1xcXCIgKyBsYXp5ICsgXFxcIic+XFxcIiArIHNjICsgJzwvYT48L3NtYWxsPjxicj48Zm9udCBjb2xvcj1cXFwiJyArIGNzICsgJ1xcXCI+JyArIGAke2RjfWAgKyAnPC9zbWFsbD4nLFxcbiAgICAgIGNvbF90eXBlOiAncmljaF90ZXh0JyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdkZXNjJyxcXG4gICAgICAgIGxpbmVTcGFjaW5nOiA2LFxcbiAgICAgICAgdGV4dFNpemU6IDE1LFxcbiAgICAgICAgbGluZVZpc2libGU6IHRydWUsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfVxcblxcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFN0cmluZy5wcm90b3R5cGUsICdTcGxpdCcsIHtcXG4gICAgdmFsdWU6IGZ1bmN0aW9uIChzLCBlKSB7XFxuICAgICAgaWYgKGUpIHtcXG4gICAgICAgIHJldHVybiB0aGlzLnNwbGl0KHMpLmZpbHRlcihpdGVtID0+IGl0ZW0gIT09ICcnKTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc3BsaXQocyk7XFxuICAgICAgfVxcbiAgICB9LFxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcXG4gIH0pO1xcblxcblxcbiAgbGV0IHNvcnRvYmogPSBbXFxuICAgIGZvbnRzdHlsZShcXFwi5q2j5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjMUFBRDE5XFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSksXFxuICAgIGZvbnRzdHlsZShcXFwi6YCG5bqPXFxcIiwge1xcbiAgICAgIGM6IFxcXCIjRkYwMDAwXFxcIixcXG4gICAgICB0YWdzOiBcXFwiYlxcXCJcXG4gICAgfSlcXG4gIF1cXG4gIC8v5pa55rOVXFxuXFxuICB2YXIgc29ydGkgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcblxcbiAgLy9sb2coc29ydG9iailcXG4gICQuZXh0ZW5kKHtcXG4gICAgc3BsaXRQYWdlKHRvdGFsSXRlbXMsIHBhZ2VTaXplKSB7XFxuICAgICAgcGFnZVNpemUgPSBwYWdlU2l6ZSB8fCA1MDtcXG4gICAgICBsZXQgcmVzdWx0ID0gW107XFxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gdG90YWxJdGVtczsgaSArPSBwYWdlU2l6ZSkge1xcbiAgICAgICAgbGV0IGVuZCA9IGkgKyBwYWdlU2l6ZSAtIDE7XFxuICAgICAgICBpZiAoZW5kID4gdG90YWxJdGVtcykge1xcbiAgICAgICAgICBlbmQgPSB0b3RhbEl0ZW1zO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmVzdWx0LnB1c2goYCR7aX0tJHtlbmR9YCk7XFxuICAgICAgfVxcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICAgIHNwbGl0QXJyYXlCeVJhbmdlcyhhcnJheSwgcmFuZ2VzKSB7XFxuICAgICAgLy8g5qC55o2u6IyD5Zu05ouG5YiG5pWw57uEXFxuICAgICAgdmFyIHJlc3VsdCA9IHJhbmdlcy5tYXAoZnVuY3Rpb24gKHJhbmdlKSB7XFxuICAgICAgICB2YXIgcGFydHMgPSByYW5nZS5zcGxpdCgnLScpLm1hcChOdW1iZXIpO1xcbiAgICAgICAgdmFyIHN0YXJ0ID0gcGFydHNbMF0gLSAxOyAvLyDlh48x5piv5Zug5Li65pWw57uE57Si5byV5LuOMOW8gOWni1xcbiAgICAgICAgdmFyIGVuZCA9IHBhcnRzWzFdIC0gMTtcXG4gICAgICAgIC8vIOS9v+eUqEFycmF5LnByb3RvdHlwZS5zbGljZeadpeiOt+WPluWtkOaVsOe7hFxcbiAgICAgICAgcmV0dXJuIGFycmF5LnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTsgLy8g5YyF5ous57uT5p2f57Si5byV77yM5omA5Lul5YqgMVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiByZXN1bHQ7XFxuICAgIH0sXFxuICB9KVxcblxcbiAgbGV0IHNvdXJjZSA9IHt9O1xcbiAgaWYoTVlfUEFSQU1TLnNvdXJjZSl7XFxuICAgICAgc291cmNlPU1ZX1BBUkFNUy5zb3VyY2U7XFxuICB9ZWxzZXtcXG4gICAgICBjb25zdCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgc291cmNlPXJ1bnRpbWVDb25maWcuZmluZFNvdXJjZShNWV9QQVJBTVMuc2tleSk7XFxuICAgICAgTVlfUEFSQU1TLnNvdXJjZT1zb3VyY2U7XFxuICAgICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbiAgfVxcbiAgXFxuICBjb25zdCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICBcXG4gIERycHlNYW5hZ2UuaW5pdFBhZ2UoXFxcImVyXFxcIik7XFxuICBsb2coc291cmNlKTtcXG4gIGxldCBkcnB5ID0gRHJweU1hbmFnZS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcblxcbiAgbGV0IGluZm8gPSBzdG9yYWdlMC5nZXRNeVZhcihpZCArIFxcXCJlcmluZm9cXFwiLCBcXFwiXFxcIik7XFxuXFxuICBpZiAoaW5mbyA9PSBcXFwiXFxcIikge1xcbiAgICBpbmZvID0gSlNPTi5wYXJzZShkcnB5LmRldGFpbChTdHJpbmcoaWQpKSkubGlzdFswXTtcXG4gICAgc3RvcmFnZTAucHV0TXlWYXIoaWQgKyBcXFwiZXJpbmZvXFxcIiwgaW5mbylcXG4gIH1cXG5cXG4gIGxldCBb5a+85ryULCDkuLvmvJRdID0gW2luZm8udm9kX2RpcmVjdG9yLCBpbmZvLnZvZF9hY3Rvcl1cXG4gIGlmICjlr7zmvJQgIT0gdW5kZWZpbmVkKSB7XFxuICAgIOWvvOa8lCA9IOWvvOa8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDlr7zmvJQgPSAvWzrvvJpdLy50ZXN0KOWvvOa8lCkgPyDlr7zmvJQgOiBcXFwi5a+85ryUOlxcXCIgKyDlr7zmvJRcXG4gIH1cXG4gIGlmICjkuLvmvJQgIT0gdW5kZWZpbmVkKSB7XFxuICAgIOS4u+a8lCA9IOS4u+a8lC5TcGxpdCgvXFxcXC8vZywgdHJ1ZSkuam9pbihcXFwiIFxcXCIpO1xcbiAgICDkuLvmvJQgPSAvWzrvvJpdLy50ZXN0KOS4u+a8lCkgPyDkuLvmvJQgOiBcXFwi5Li75ryUOlxcXCIgKyDkuLvmvJRcXG4gIH1cXG4gIGxldCBb5ZCN56ewLCDlpIfms6hdID0gW2luZm8udm9kX25hbWUsIGluZm8udm9kX3JlbWFya3NdXFxuICBpZiAo5aSH5rOoICE9IHVuZGVmaW5lZCkge1xcbiAgICDlpIfms6ggPSDlpIfms6guU3BsaXQoL1xcXFwvL2csIHRydWUpLmpvaW4oXFxcIiBcXFwiKTtcXG4gICAg5aSH5rOoID0gL1s677yaXS8udGVzdCjlpIfms6gpID8g5aSH5rOoIDogXFxcIuWkh+azqDpcXFwiICsg5aSH5rOoO1xcbiAgfVxcbiAgbGV0IHRpdGxlcyA9IFvlkI3np7AsIOWkh+azqF07XFxuICBsZXQgZGVzY3MgPSBb5a+85ryULCDkuLvmvJRdXFxuXFxuICBsZXQgZCA9IFtdO1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6IHRpdGxlcy5maWx0ZXIoZSA9PiBlKS5qb2luKFxcXCJcXFxcblxcXCIpLFxcbiAgICBkZXNjOiBkZXNjcy5maWx0ZXIoZSA9PiBlKS5qb2luKFxcXCJcXFxcblxcXCIpLFxcbiAgICBwaWNfdXJsOiBpbmZvLnZvZF9waWMgfHwgTVlfUEFSQU1TLmltZyxcXG4gICAgZXh0cmE6IHtcXG4gICAgICBncmFkaWVudDogZmFsc2UsXFxuICAgIH1cXG4gIH0pO1xcbiAgZC5wdXNoKHtcXG4gICAgdGl0bGU6ICfmlbDmja7mnaXmupA6JyArIE1ZX1BBUkFNUy5zbmFtZSxcXG4gICAgLy9kZXNjOlxcXCJcXFwiK01ZX1BBUkFNUy5za2V5K1xcXCJcXFxcdFxcXCIsXFxuICAgIGltZzogXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbWVzc3kvNzguc3ZnXFxcIixcXG4gICAgdXJsOiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwiYXZhdGFyXFxcIlxcbiAgfSlcXG4gIHNldERlc2MoaW5mby52b2RfY29udGVudClcXG5cXG4gIC8qXFxuICBmdW5jdGlvbiBwYXJzZVF1ZXJ5KHF1ZXJ5KSB7XFxuICAgIHZhciBvYmogPSB7fTtcXG4gICAgcXVlcnkuc3BsaXQoXFxcIiZcXFwiKS5maWx0ZXIoZSA9PiBlKS5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7XFxuICAgICAgdmFyIHBhcnRzID0gaXRlbS5zcGxpdChcXFwiPVxcXCIpO1xcbiAgICAgIG9ialtwYXJ0c1swXV0gPSBwYXJ0c1sxXTtcXG4gICAgfSk7XFxuICAgIHJldHVybiBvYmo7XFxuICB9XFxuXFxuICAvL2pz5omn6KGMXFxuICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICBkZWZSdWxlczogW1xcXCIqLm1wNFxcXCIsIFxcXCIqLm0zdThcXFwiXSxcXG4gIH07XFxuICB2YXIgZXh0cmEgPSB7XFxuICAgIFxcXCJ1YVxcXCI6IE1PQklMRV9VQVxcbiAgfVxcbiAgbGV0IHBhcnNlID0gSlNPTi5wYXJzZShkcnB5LnBsYXkoKSk7XFxuICAvL2NvbnNvbGUubG9nKHBhcnNlKTtcXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwicGFyc2VfZXh0cmFcXFwiKSkge1xcbiAgICBsZXQgcGFyc2VfZXh0cmEgPSBkZWNvZGVVUklDb21wb25lbnQocGFyc2UucGFyc2VfZXh0cmEpO1xcbiAgICBwYXJzZV9vYmogPSBPYmplY3QuYXNzaWduKHBhcnNlX29iaiwgcGFyc2VRdWVyeShwYXJzZV9leHRyYSkpO1xcbiAgICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgcGFyc2Vfb2JqW1xcXCJpbml0X3NjcmlwdFxcXCJdID0gYmFzZTY0RGVjb2RlKHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSk7XFxuICAgIH1cXG4gIH1cXG4gIGlmIChwYXJzZV9vYmouaGFzT3duUHJvcGVydHkoXFxcImlzX3BjXFxcIikgJiYgcGFyc2Vfb2JqW1xcXCJpc19wY1xcXCJdID09IFxcXCIxXFxcIikge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IFBDX1VBO1xcbiAgfVxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICBleHRyYVtcXFwidWFcXFwiXSA9IHBhcnNlW1xcXCJoZWFkZXJcXFwiXVtcXFwiVXNlci1BZ2VudFxcXCJdO1xcbiAgICAvL2V4dHJhW1xcXCJyZWRpcmVjdFxcXCJdPWZhbHNlO1xcbiAgICBleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxuICAgICAgZXZhbChqcylcXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci51c2VyQWdlbnQpXFxuICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcbiAgICB9LCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAndXNlckFnZW50Jywge1xcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgIHJldHVybiAnTXktQ3VzdG9tLVVBLVN0cmluZyc7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0pKVxcbiAgfVxcbiAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiY3VzdG9tX3JlZ2V4XFxcIikpIHtcXG4gICAgbGV0IGN1cnJlbnQgPSBwYXJzZV9vYmpbXFxcImRlZlJ1bGVzXFxcIl07XFxuICAgIGV4dHJhW1xcXCJ2aWRlb1J1bGVzXFxcIl0gPSBjdXJyZW50LmNvbmNhdChwYXJzZV9vYmouY3VzdG9tX3JlZ2V4LnNwbGl0KC9cXFxcfC9nKS5maWx0ZXIoZSA9PiBlKSlcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwianNcXFwiKSkge1xcbiAgICBleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzLCBwYXJzZSwgdCkgPT4ge1xcbiAgICAgIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgICAgZmJhLmxvZyh0ICsgXFxcIjrmiafooYxpbml0X3NjcmlwdFxcXCIpO1xcbiAgICAgICAgZXZhbChwYXJzZS5pbml0X3NjcmlwdCk7XFxuICAgICAgfVxcbiAgICAgIGZiYS5sb2cobmF2aWdhdG9yLnBsYXRmb3JtKTtcXG4gICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGpz54K55Ye7XFxcIilcXG4gICAgICBldmFsKGpzKVxcbiAgICB9LCBwYXJzZS5qcywgcGFyc2Vfb2JqLCBNWV9SVUxFLnRpdGxlKVxcbiAgfVxcbiAgLy9sb2coZXh0cmEpXFxuICAqL1xcbiAgbGV0IGZyb20gPSBbXTtcXG4gIGlmIChpbmZvLnZvZF9wbGF5X2Zyb20gIT0gdW5kZWZpbmVkKSB7XFxuICAgIGZyb20gPSBpbmZvLnZvZF9wbGF5X2Zyb20uc3BsaXQoXFxcIiQkJFxcXCIpO1xcbiAgICAvKmxldCBwbGF5TGF6eSA9ICQoXFxcIlxcXCIpLmxhenlSdWxlKCgpID0+IHtcXG4gICAgICBmdW5jdGlvbiBpc29mZmljaWFsKHVybCkge1xcbiAgICAgICAgbGV0IGZsYWcgPSBuZXcgUmVnRXhwKCdxcVxcXFwuY29tfGlxaXlpXFxcXC5jb218eW91a3VcXFxcLmNvbXxtZ3R2XFxcXC5jb218YmlsaWJpbGlcXFxcLmNvbXxzb2h1XFxcXC5jb218aXhpZ3VhXFxcXC5jb218cHB0dlxcXFwuY29tfG1pZ3V2aWRlb1xcXFwuY29tfGxlXFxcXC5jb218MTkwNVxcXFwuY29tfGZ1blxcXFwudHYnKTtcXG4gICAgICAgIHJldHVybiBmbGFnLnRlc3QodXJsKTtcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGRycHkgPSBHTS5kZWZpbmVNb2R1bGUoXFxcImRycHlcXFwiLCBcXFwiZHJweVxcXCIpO1xcbiAgICAgIGlucHV0ID0gaW5wdXQuc3BsaXQoXFxcIiNcXFwiKTtcXG4gICAgICBsZXQgcGxheSA9IEpTT04ucGFyc2UoZHJweS5wbGF5KGlucHV0WzFdLCBpbnB1dFswXS5yZXBsYWNlKFxcXCJ0dmJveC14ZzpcXFwiLCBcXFwiXFxcIiksIFtdKSk7XFxuICAgICAgbG9nKHBsYXkpXFxuICAgICAgbG9nKFxcXCJwbGF5LnVybFxcXCIpXFxuICAgICAgbGV0IHBhcnNlX29iaiA9IHtcXG4gICAgICAgIGRlZl9yZWdleDogU3RyaW5nLnJhd2BcXFxcLihtcDR8bTN1OCl8Y24vdG9zYCxcXG4gICAgICB9O1xcblxcbiAgICAgIGlmIChwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/ZG9cXFwiKSkge1xcbiAgICAgICAgTVlfVVJMID0gcGxheS51cmw7XFxuICAgICAgICBwbGF5LnVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwidXJsXFxcIiwgXFxcIlxcXCIpKTtcXG4gICAgICB9XFxuICAgICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcImh0dHBzOi8vcGFuLnF1YXJrLmNuL1xcXCIpKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vc2VhcmNoP3M9XFxcIiArIHBsYXkudXJsICsgXFxcIiZydWxlPXVja2vkupFcXFwiXFxuICAgICAgfVxcbiAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL2FsaXl1bj9ydWxlPeS6keebmOWQmy7nroAmcGFnZT1meXBhZ2UmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKTtcXG4gICAgICB9XFxuICAgICAgaWYgKHBsYXkucGFyc2UgPT09IDEpIHtcXG4gICAgICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICAgICAgcmV0dXJuIHBsYXkudXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGlzb2ZmaWNpYWwocGxheS51cmwpKSB7XFxuICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImhpa2VyOi8vcGFnZS9tdWxQYXJzZT9ydWxlPemFjee9ruWKqeaJi1xcXCIpLm11bFBhcnNlKHBsYXkudXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiBcXFwidmlkZW86Ly9cXFwiICsgcGxheS51cmw7XFxuICAgICAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxuICAgICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgICAgfVxcbiAgICB9KTsqL1xcbiAgfVxcblxcbiAgbGV0IHBsYXlMYXp5ID0gJChcXFwiXFxcIikubGF6eVJ1bGUoKGlkLCBzb3VyY2UpID0+IHtcXG4gICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wYXJzZShpbnB1dCwgaWQsIHNvdXJjZSk7XFxuICB9LCBcXFwiaWRcXFwiLCBzb3VyY2UpO1xcblxcbiAgbGV0IHBsYXlVcmxMaXN0ID0gW107XFxuICAvL2NvbnNvbGUubG9nKGluZm8udm9kX3BsYXlfdXJsKTtcXG4gIGxldCBwbGF5cGFnZXMgPSBbXTtcXG4gIGlmIChpbmZvLnZvZF9wbGF5X3VybCAmJiBpbmZvLnZvZF9wbGF5X3VybCAhPSBcXFwiXFxcIikge1xcbiAgICBsZXQgY29sID0gXFxcInRleHRfNFxcXCI7XFxuICAgIGxldCB0ZXh0YWxpZ24gPSBcXFwiXFxcIjtcXG4gICAgcGxheVVybExpc3QgPSBpbmZvLnZvZF9wbGF5X3VybC5zcGxpdChcXFwiJCQkXFxcIikubWFwKCh0LCBpKSA9PiB7XFxuICAgICAgbGV0IGltZyA9IFxcXCJcXFwiO1xcbiAgICAgIGxldCB0cyA9IHQuc3BsaXQoXFxcIiNcXFwiKS5tYXAoKGspID0+IGsuc3BsaXQoXFxcIiRcXFwiKVswXSk7XFxuICAgICAgbGV0IHBhZ2VzID0gJC5zcGxpdFBhZ2UodHMubGVuZ3RoKVxcbiAgICAgIGxldCB0YyA9IGNvdW50VG90YWxCeXRlcyhmaW5kTG9uZ2VzdEVsZW1lbnQodHMpKTtcXG4gICAgICBpZiAodHMuZmlsdGVyKGUgPT4gZSAhPSBcXFwiXFxcIikubGVuZ3RoKSB7XFxuICAgICAgICBwbGF5cGFnZXNbaV0gPSBwYWdlcztcXG4gICAgICB9XFxuICAgICAgaWYgKHRjID4gMjQpIHtcXG4gICAgICAgIGNvbCA9IFxcXCJ0ZXh0XzFcXFwiO1xcbiAgICAgICAgaW1nID0gXFxcImh0dHBzOi8vaGlrZXJmYW5zLmNvbS90dWJpYW8vbW92aWUvMTQ2LnN2Z1xcXCI7XFxuICAgICAgfSBlbHNlIGlmICh0YyA+PSAxMiAmJiB0YyA8IDE1KSB7XFxuICAgICAgICBjb2wgPSBcXFwidGV4dF8zXFxcIjtcXG4gICAgICB9IGVsc2UgaWYgKHRjID49IDE1KSB7XFxuICAgICAgICBjb2wgPSBcXFwidGV4dF8yXFxcIjtcXG4gICAgICAgIHRleHRhbGlnbiA9IFxcXCJsZWZ0XFxcIjtcXG4gICAgICB9XFxuICAgICAgbGV0IHBsYXlvYmogPSB0LnNwbGl0KFxcXCIjXFxcIikubWFwKChqKSA9PiB7XFxuICAgICAgICBsZXQgayA9IGouc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGxldCB0ID0ga1swXTtcXG4gICAgICAgIGxldCB1aWQgPSAoa1sxXXx8a1swXSk7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICB0aXRsZTogZm9udHN0eWxlKHQsIHtcXG4gICAgICAgICAgICB0YWdzOiBcXFwic21hbGxcXFwiXFxuICAgICAgICAgIH0pLFxcbiAgICAgICAgICB1cmw6ICB1aWQrIFxcXCIjXFxcIiArIGZyb21baV0gKyBwbGF5TGF6eS5yZXBsYWNlKCdcXFwiaWRcXFwiJywgJ1xcXCInICt1aWQgKyAnXFxcIicpLFxcbiAgICAgICAgICBjb2xfdHlwZTogY29sLFxcbiAgICAgICAgICBpbWc6IGltZyxcXG4gICAgICAgICAgLypleHRyYTogT2JqZWN0LmFzc2lnbih7fSwgZXh0cmEsIHtcXG4gICAgICAgICAgICBcXFwiUmVmZXJlclxcXCI6IGRlY29kZVVSSUNvbXBvbmVudChrWzFdKSxcXG4gICAgICAgICAgICBpZDoga1sxXSxcXG4gICAgICAgICAgICAvL2xpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRhbGlnbixcXG4gICAgICAgICAgICBjbHM6IFxcXCJwbGF5bGlzdFxcXCIsXFxuICAgICAgICAgIH0pKi9cXG4gICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpZDogdWlkLFxcbiAgICAgICAgICAgIGJsb2NrUnVsZXM6IFsnYmIuKi5wbmcnLCAnLmpwZycsIFxcXCJobVxcXFwuYmFpZHVcXFxcLmNvbVxcXFwvaG0uanNcXFwiXSxcXG4gICAgICAgICAgICB2aWRlb0V4Y2x1ZGVSdWxlczogWyc/dXJsPSddLFxcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZSxcXG4gICAgICAgICAgICB0ZXh0QWxpZ246IHRleHRhbGlnbixcXG4gICAgICAgICAgICBjbHM6IFxcXCJwbGF5bGlzdFxcXCIsXFxuICAgICAgICAgIH1cXG4gICAgICAgIH07XFxuICAgICAgfSk7XFxuICAgICAgcGxheW9iaiA9ICQuc3BsaXRBcnJheUJ5UmFuZ2VzKHBsYXlvYmosIHBhZ2VzKTtcXG4gICAgICByZXR1cm4gcGxheW9iajtcXG4gICAgfSk7XFxuICB9IGVsc2Uge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCJcXG4gICAgfSwge1xcbiAgICAgIHRpdGxlOiBcXFwi5pqC5peg5pKt5pS+5rqQ5oiW5pKt5pS+5YiX6KGo5a6a5L2N6ZSZ6K+vXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICAgIHVybDogTVlfUEFSQU1TLnZvZElkLFxcbiAgICB9KTtcXG4gICAgc2V0UmVzdWx0KGQpO1xcbiAgfVxcblxcblxcbiAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IDA7XFxuXFxuICBmdW5jdGlvbiByZW5vdmF0ZUxpc3QobG9jYXRpb24pIHtcXG4gICAgLy9kZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIik7XFxuICAgIGRlbGV0ZUl0ZW1CeUNscyhcXFwicGxheWxpc3RcXFwiKTtcXG4gICAgaWYgKHBsYXlVcmxMaXN0Lmxlbmd0aCA9PSAwKSB7XFxuICAgICAgcmV0dXJuO1xcbiAgICB9XFxuICAgIGxldCBwYWdlbnVtID0gZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBcXFwiMFxcXCIpO1xcbiAgICBsZXQgcGNvdW50ID0gcGxheVVybExpc3RbbG9jYXRpb25dLmxlbmd0aDtcXG4gICAgbGV0IGxpc3QgPSBwbGF5VXJsTGlzdFtsb2NhdGlvbl1bcGFnZW51bV07XFxuICAgIGlmICghbGlzdCkge1xcbiAgICAgIGZvciAobGV0IGkgPSBwYWdlbnVtOyBpID49IDA7IGktLSkge1xcbiAgICAgICAgbGlzdCA9IHBsYXlVcmxMaXN0W2xvY2F0aW9uXVtpXTtcXG4gICAgICAgIGlmIChsaXN0KSB7XFxuICAgICAgICAgIHBhZ2VudW0gPSBpO1xcbiAgICAgICAgICBicmVhaztcXG4gICAgICAgIH1cXG4gICAgICB9XFxuICAgIH1cXG4gICAgaWYgKGdldE15VmFyKFxcXCJzb3J0aVxcXCIsIFxcXCIwXFxcIikgPT0gMSkge1xcbiAgICAgIGxpc3QucmV2ZXJzZSgpO1xcbiAgICB9XFxuICAgICQuZXh0ZW5kKHtcXG4gICAgICB0ZW1wX2xpc3Q6IHBsYXlVcmxMaXN0W2xvY2F0aW9uXSxcXG4gICAgfSlcXG4gICAgbGV0IHBsYXlwID0gcGxheXBhZ2VzW2xvY2F0aW9uXTtcXG5cXG4gICAgaWYgKHBsYXlwICYmIHBsYXlwLmxlbmd0aCA+IDEpIHtcXG4gICAgICBsZXQgdGVtcCA9IHtcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIGNsczogXFxcInBsYXlwYWdlXFxcIlxcbiAgICAgICAgfVxcbiAgICAgIH1cXG4gICAgICBsZXQgcGFnZWFyciA9IHBsYXlwLm1hcCgoeCwgaSkgPT4gaSA9PSBwYWdlbnVtID8gJ+KAnOKAnOKAneKAnScgKyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KTtcXG4gICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlwYWdlXFxcIilcXG4gICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlwYWdlbGluZVxcXCIsIFt7XFxuICAgICAgICB0aXRsZTogJ+S4iuS4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID09IDApIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gcGNvdW50IC0gMTtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtLS07XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogcGxheXBbcGFnZW51bV0sXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfMlxcXCIsXFxuICAgICAgICB1cmw6ICQocGFnZWFyciwgMykuc2VsZWN0KChsb2NhdGlvbikgPT4ge1xcbiAgICAgICAgICBwdXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFN0cmluZyhNWV9JTkRFWCkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiXFxuICAgICAgICB9LCBsb2NhdGlvbiksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9LCB7XFxuICAgICAgICB0aXRsZTogJ+S4i+S4gOmhtScsXFxuICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfNFxcXCIsXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGxvY2F0aW9uLCBwY291bnQpID0+IHtcXG4gICAgICAgICAgbGV0IHBhZ2VudW0gPSBnZXRNeVZhcihcXFwicGFnZW51bVxcXCIsIFxcXCIwXFxcIik7XFxuICAgICAgICAgIGlmIChwYWdlbnVtID49IHBjb3VudCAtIDEpIHtcXG4gICAgICAgICAgICBwYWdlbnVtID0gMDtcXG4gICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBwYWdlbnVtKys7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgcHV0TXlWYXIoXFxcInBhZ2VudW1cXFwiLCBTdHJpbmcocGFnZW51bSkpO1xcbiAgICAgICAgICBHTS5nZXQoXFxcInJlbm92YXRlTGlzdFxcXCIsICgpID0+IHsgfSkobG9jYXRpb24pO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgbG9jYXRpb24sIHBjb3VudCksXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICBjbHM6IFxcXCJwbGF5cGFnZVxcXCJcXG4gICAgICAgIH1cXG4gICAgICB9XSlcXG4gICAgICAvKnBsYXlwID0gcGxheXAubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICAgbGV0IG9iaiA9IE9iamVjdC5hc3NpZ24oe30sIHRlbXAsIHtcXG4gICAgICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChwYWdlbnVtID09IGkgPyB4LmZvbnRjb2xvcihcXFwicmVkXFxcIikgOiB4KSxcXG4gICAgICAgICAgIHVybDogJCgnI25vTG9hZGluZyMnKS5sYXp5UnVsZSgoaSkgPT4ge1xcbiAgICAgICAgICAgICBpZiAoZ2V0TXlWYXIoXFxcInBhZ2VudW1cXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwYWdlbnVtXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgICAgZGVsZXRlSXRlbUJ5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpO1xcbiAgICAgICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsICQudGVtcF9saXN0W2ldKTtcXG4gICAgICAgICAgICAgZmluZEl0ZW1zQnlDbHMoXFxcInBsYXlwYWdlXFxcIikuZm9yRWFjaCgoeCwgaWkpID0+IHtcXG4gICAgICAgICAgICAgICBsZXQgdGl0bGUgPSB4LnRpdGxlLnJlcGxhY2UoL+KAmHzigJl84oCcfOKAnXw8W14+XSs+L2csIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICAgICBpZiAoaWkgPT0gaSkge1xcbiAgICAgICAgICAgICAgICAgdGl0bGUgPSAn4oCc4oCc4oCd4oCdJyArIHRpdGxlLmZvbnRjb2xvcihcXFwicmVkXFxcIik7XFxuICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW0oeC5leHRyYS5pZCwge1xcbiAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxcbiAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgICB9LCBpKSxcXG4gICAgICAgICAgIGV4dHJhOiBPYmplY3QuYXNzaWduKHt9LCB0ZW1wLmV4dHJhLCB7XFxuICAgICAgICAgICAgIGlkOiBcXFwicGFnZW51bVxcXCIgKyBpLFxcbiAgICAgICAgICAgfSlcXG4gICAgICAgICB9KVxcbiAgICAgICAgIHJldHVybiBvYmo7XFxuICAgICAgIH0pXFxuICAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheXBhZ2VsaW5lXFxcIiwgcGxheXApKi9cXG4gICAgfVxcbiAgICBpZiAobGlzdCkge1xcbiAgICAgIGFkZEl0ZW1BZnRlcihcXFwicGxheWxpc3RzXFxcIiwgbGlzdCk7XFxuICAgIH1cXG4gICAgdXBkYXRlSXRlbShcXFwibG9jYXRpb25AXFxcIiArIGN1cnJlbnRMb2NhdGlvbiwge1xcbiAgICAgIHRpdGxlOiBmcm9tW2N1cnJlbnRMb2NhdGlvbl0sXFxuICAgIH0pO1xcbiAgICB1cGRhdGVJdGVtKFxcXCJsb2NhdGlvbkBcXFwiICsgbG9jYXRpb24sIHtcXG4gICAgICB0aXRsZTogXFxcIuKAnOKAnFxcXCIgKyBmcm9tW2xvY2F0aW9uXSArIFxcXCLigJ3igJ1cXFwiLFxcbiAgICB9KTtcXG4gICAgY3VycmVudExvY2F0aW9uID0gbG9jYXRpb247XFxuICB9XFxuXFxuICBHTS5wdXQoXFxcInJlbm92YXRlTGlzdFxcXCIsIHJlbm92YXRlTGlzdCk7XFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJpZ19ibGFua19ibG9ja1xcXCJcXG4gIH0pO1xcbiAgaWYgKGZyb20ubGVuZ3RoKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgY29sX3R5cGU6IFxcXCJiaWdfYmxhbmtfYmxvY2tcXFwiLFxcbiAgICB9KVxcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBzb3J0b2JqW3NvcnRpXSxcXG4gICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHNvKSA9PiB7XFxuICAgICAgICBsZXQgc2kgPSBnZXRNeVZhcihcXFwic29ydGlcXFwiLCBcXFwiMFxcXCIpO1xcbiAgICAgICAgbGV0IGlpID0gKHNpID09IFxcXCIwXFxcIiA/IFxcXCIxXFxcIiA6IFxcXCIwXFxcIik7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJAc29ydFxcXCIsIHtcXG4gICAgICAgICAgdGl0bGU6IHNvW2lpXVxcbiAgICAgICAgfSlcXG4gICAgICAgIHZhciBwbGF5cyA9IGZpbmRJdGVtc0J5Q2xzKFxcXCJwbGF5bGlzdFxcXCIpLnJldmVyc2UoKS5tYXAoeCA9PiB7XFxuICAgICAgICAgIHguY29sX3R5cGUgPSB4LnR5cGU7XFxuICAgICAgICAgIHJldHVybiB4O1xcbiAgICAgICAgfSk7XFxuICAgICAgICBkZWxldGVJdGVtQnlDbHMoXFxcInBsYXlsaXN0XFxcIik7XFxuICAgICAgICBhZGRJdGVtQWZ0ZXIoXFxcInBsYXlsaXN0c1xcXCIsIHBsYXlzKTtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJzb3J0aVxcXCIsIGlpKTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgfSwgc29ydG9iaiksXFxuICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJAc29ydFxcXCIsXFxuICAgICAgfVxcbiAgICB9KVxcbiAgICBmb3IgKGxldCBpIGluIGZyb20pIHtcXG4gICAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21baV0sXFxuICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGksIGlkKSA9PiB7XFxuICAgICAgICAgIGlmIChnZXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgXFxcIjBcXFwiKSA9PSBpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBwdXRNeVZhcihpZCArIFxcXCJzb3VyY2VpXFxcIiwgU3RyaW5nKGkpKTtcXG4gICAgICAgICAgR00uZ2V0KFxcXCJyZW5vdmF0ZUxpc3RcXFwiLCAoKSA9PiB7IH0pKGkpO1xcbiAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICAgICAgfSwgaSwgaWQpLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgaWQ6IFxcXCJsb2NhdGlvbkBcXFwiICsgaVxcbiAgICAgICAgfSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwic2Nyb2xsX2J1dHRvblxcXCJcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfVxcbiAgLy9jb25zb2xlLmxvZyhwbGF5VXJsTGlzdCk7XFxuICAvKmlmIChwbGF5VXJsTGlzdC5sZW5ndGgpIHtcXG4gICAgdmFyIGVqb2JqID0ge1xcbiAgICAgIFxcXCJsaXN0XFxcIjogcGxheVVybExpc3QsXFxuICAgICAgXFxcInRhYlxcXCI6IGZyb20ubWFwKCh4LCBpKSA9PiBmcm9tW2ldKVxcbiAgICB9O1xcbiAgICDliJ3lp4vljJYoZCwgZWpvYmopXFxuICB9IGVsc2Uge1xcbiAgICBkLnB1c2goe1xcbiAgICAgIHRpdGxlOiBcXFwi5pqC5peg5pKt5pS+5rqQXFxcIixcXG4gICAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxuICAgICAgdXJsOiBNWV9QQVJBTVMudm9kSWQsXFxuICAgIH0pO1xcbiAgfSovXFxuXFxuICBkLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImJsYW5rX2Jsb2NrXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBpZDogXFxcInBsYXlwYWdlbGluZVxcXCJcXG4gICAgfVxcbiAgfSlcXG5cXG5cXG4gIGQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNcXFwiXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJibGFua19ibG9ja1xcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgaWQ6IFxcXCJwbGF5bGlzdHNFTkRcXFwiXFxuICAgIH1cXG4gIH0pO1xcblxcbiAgc2V0UmVzdWx0KGQpO1xcbiAgcmVub3ZhdGVMaXN0KGdldE15VmFyKGlkICsgXFxcInNvdXJjZWlcXFwiLCBcXFwiMFxcXCIpKTtcXG59KSgpXCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDmlofku7ZcIixcInBhdGhcIjpcImNvbmZpZ3NcIixcInJ1bGVcIjpcImNvbnN0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL3BhcnNlcy5qc29uXFxcIjtcXG5sZXQgZGF0YTtcXG5cXG5mdW5jdGlvbiBnZXRKc29uKCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xcbiAgICAgICAgcmV0dXJuIGRhdGE7XFxuICAgIH1cXG4gICAgdHJ5IHtcXG4gICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlKHBhdGgpIHx8IFxcXCJbXVxcXCIpO1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgZGF0YSA9IFtdO1xcbiAgICB9XFxuICAgIHJldHVybiBkYXRhO1xcbn1cXG5cXG5mdW5jdGlvbiBzYXZlSnNvbihqc29uKSB7XFxuICAgIHNhdmVGaWxlKHBhdGgsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0VXNlZnVsSnNvbigpIHtcXG4gICAgcmV0dXJuIGdldEpzb24oKS5maWx0ZXIodiA9PiAhdi5mb3JiaWRkZW4pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRGb3JiaWRkZW5Kc29uKCkge1xcbiAgICByZXR1cm4gZ2V0SnNvbigpLmZpbHRlcih2ID0+IHYuZm9yYmlkZGVuKTtcXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRKc29uLFxcbiAgICBzYXZlSnNvbixcXG4gICAgZ2V0VXNlZnVsSnNvbixcXG4gICAgZ2V0Rm9yYmlkZGVuSnNvbixcXG4gICAgcGF0aCxcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q566h55CGXCIsXCJwYXRoXCI6XCJydWxlTWFuYWdlXCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcbnNldFBhZ2VUaXRsZShcXFwi6Kej5p6Q566h55CGXFxcIik7XFxubGV0IGNvbmZpZ3MgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKTtcXG5sZXQgYXJyID0gY29uZmlncy5nZXRKc29uKCk7XFxubGV0IGxlbmd0aCA9IGFyci5sZW5ndGg7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmlrDlop5cXFwiLFxcbiAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcImljb25fc21hbGxfNFxcXCIsXFxuICAgIHBpY191cmw6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2RvbWFpbl9jb25maWdcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgcGFnZVRpdGxlOiBcXFwi5paw5aKe6Kej5p6QXFxcIlxcbiAgICB9XFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLliIbkuqtcXFwiLFxcbiAgICB1cmw6ICQoXFxcIi0xXFxcIiwgXFxcIui+k+WFpeS9oOimgeWIhuS6q+ino+aekOeahOW6j+WPt1xcXFxuLTHlhajpg6jvvIwtMuW3suWQr+eUqOeahO+8jC0z5bey56aB55So55qEXFxcIikuaW5wdXQoKGxlbmd0aCkgPT4ge1xcbiAgICAgICAgbGV0IGluZGV4YyA9IGlucHV0LnNwbGl0KC8sfO+8jC8pO1xcbiAgICAgICAgbGV0IGluZGV4cyA9IFtdO1xcbiAgICAgICAgbGV0IG1vID0gcGFyc2VJbnQoaW5kZXhjWzBdKTtcXG4gICAgICAgIGlmICghKGluZGV4Yy5sZW5ndGggIT09IDAgJiYgbW8gPCAwICYmIG1vID4gLTUpKSB7XFxuICAgICAgICAgICAgZm9yIChsZXQgaXQgb2YgaW5kZXhjKSB7XFxuICAgICAgICAgICAgICAgIGxldCBudW0gPSBwYXJzZUludChpdCk7XFxuICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obnVtKSB8fCBudW0gPj0gbGVuZ3RoIHx8IG51bSA8IDApIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mlbDlrZfkuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIGluZGV4cy5wdXNoKG51bSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuICQoW1xcXCJISUtFUlxcXCIsIFxcXCJUWFRcXFwiXS5jb25jYXQoZ2V0UGFzdGVzKCkpLCAyLCBcXFwi5YiG5Lqr5pa55byPXFxcIikuc2VsZWN0KChtbywgaW5kZXhzLCBleHQpID0+IHtcXG4gICAgICAgICAgICBmdW5jdGlvbiB1cChydWxlcykge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZWI2NCA9IGJhc2U2NEVuY29kZShKU09OLnN0cmluZ2lmeShydWxlcykpO1xcbiAgICAgICAgICAgICAgICBsZXQgZ2V0UGFzcyA9IChsZW5ndGgsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIxEUlBZ6Kej5p6Q77yM5YWx44CMXFxcIiArIGxlbmd0aCArIFxcXCLjgI3mnaHvvIzlpI3liLbmlbTmnaHlj6Pku6TmiZPlvIDova/ku7blsLHkvJroh6rliqjlr7zlhaUkXFxcIiArIHJ1bGUgKyBcXFwiJFxcXCIgKyB0eXBlICsgXFxcIkBpbXBvcnQ9anM6JC5yZXF1aXJlKCdpbXBvcnQ/cnVsZT0nK1xcXCIgKyBKU09OLnN0cmluZ2lmeShNWV9SVUxFLnRpdGxlKSArIFxcXCIpKGlucHV0KVxcXCI7XFxuICAgICAgICAgICAgICAgIGlmIChnZXRQYXN0ZXMoKS5pbmNsdWRlcyhpbnB1dCkpIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1ID0gc2hhcmVQYXN0ZShydWxlYjY0LCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgZ2V0UGFzcyhydWxlcy5sZW5ndGgsIHUsIFxcXCJiXFxcIik7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL3J1bGVzL0xveURnSWsvc2hhcmUvZHJweeino+aekOOAjFxcXCIgKyBydWxlcy5sZW5ndGggKyBcXFwi44CN5p2hLlxcXCIgKyAoaW5wdXQgPT09IFxcXCJISUtFUlxcXCIgPyBcXFwiaGlrZXJcXFwiIDogXFxcInR4dFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgd3JpdGVGaWxlKHBhdGgsIGdldFBhc3MocnVsZXMubGVuZ3RoLCBydWxlYjY0LCBcXFwiYVxcXCIpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwic2hhcmU6Ly9cXFwiICsgcGF0aDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBsZXQgcnVsZXM7XFxuICAgICAgICAgICAgaWYgKG1vID09PSAtMSkge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMikge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldFVzZWZ1bEpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1vID09PSAtMykge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEZvcmJpZGRlbkpzb24oKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBydWxlcyA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKS5maWx0ZXIoKHYsIGkpID0+IGluZGV4cy5pbmNsdWRlcyhpKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHJ1bGVzID0gcnVsZXMubWFwKCh2KSA9PiB7XFxuICAgICAgICAgICAgICAgIHYuZm9yYmlkZGVuID0gdW5kZWZpbmVkO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdjtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdXAocnVsZXMpO1xcbiAgICAgICAgfSwgbW8sIGluZGV4cywgaW5kZXhjWzFdKTtcXG5cXG4gICAgfSwgbGVuZ3RoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9zaGFyZV9ncmVlblxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumHjee9rlxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a6YeN572u77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDvvIzmgaLlpI3oh6rluKbop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICBkZWxldGVGaWxlKHBhdGgpO1xcbiAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikucGF0aCksXFxuICAgIGNvbF90eXBlOiBcXFwiaWNvbl9zbWFsbF80XFxcIixcXG4gICAgcGljX3VybDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fcmVmcmVzaFxcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIua4heepulxcXCIsXFxuICAgIHVybDogJChcXFwi5L2g56Gu5a6a5YWo6YOo5Yig6Zmk77yfXFxcXG7or6Xmk43kvZzkvJrliKDpmaTnjrDmnInop6PmnpDjgIJcXFwiKS5jb25maXJtKChwYXRoKSA9PiB7XFxuICAgICAgICB3cml0ZUZpbGUocGF0aCwgXFxcIltdXFxcIik7XFxuICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vZW1wdHlcXFwiO1xcbiAgICB9LCAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5wYXRoKSxcXG4gICAgY29sX3R5cGU6IFxcXCJpY29uX3NtYWxsXzRcXFwiLFxcbiAgICBwaWNfdXJsOiBcXFwiaGlrZXI6Ly9pbWFnZXMvaWNvbl9jb2RlX3ZpZXdcXFwiXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgLy90aXRsZTogJzxmb250IGNvbG9yPVxcXCIjMTNCNjFCXFxcIj7ilpAgPC9mb250PjxiPuino+aekOWIl+ihqDxiPiAoJyArIFN0cmluZyhsZW5ndGgpLmZvbnRjb2xvcihcXFwiI2ZmNjYwMVxcXCIpICsgXFxcIilcXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInJpY2hfdGV4dFxcXCIsXFxufSk7XFxubGV0IGNvdW50VGl0bGUgPSBkLmF0KC0xKTtcXG5cXG5cXG5sZXQgY291bnQgPSBkLmxlbmd0aDtcXG5cXG5mb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XFxuICAgIGxldCBpdCA9IGFycltpXTtcXG5cXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdWycgKyBpICsgJ108Yj4gICcgKyBpdC5uYW1lICsgKGl0LmZvcmJpZGRlbiA/IFxcXCIgI+KAnOKAnOemgeeUqOKAneKAnVxcXCIuc21hbGwoKSA6IFxcXCJcXFwiKSxcXG4gICAgICAgIGRlc2M6IGl0LnVybCxcXG4gICAgICAgIHVybDogJChbXFxcIue8lui+kVxcXCIsIFxcXCLliIbkuqtcXFwiLCBcXFwi56aB55SoL+WQr+eUqFxcXCIsIFxcXCLnp7vliqhcXFwiLCBcXFwi572u6aG2XFxcIiwgXFxcIuWIoOmZpFxcXCJdLCAxLCBcXFwi5pON5L2c77yaXFxcIiArIGl0Lm5hbWUpLnNlbGVjdCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIue8lui+kVxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjI25vUmVmcmVzaCNcXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliIbkuqtcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCBvcHMgPSBnZXRQYXN0ZXMoKTtcXG4gICAgICAgICAgICAgICAgb3BzLnVuc2hpZnQoXFxcIuWujOaVtOWPo+S7pFxcXCIpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChvcHMsIDIsIFxcXCLliIbkuqvmlrnlvI9cXFwiKS5zZWxlY3QoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKVtpbmRleF07XFxuICAgICAgICAgICAgICAgICAgICBydWxlLnVzZXIgPSB1bmRlZmluZWQ7XFxuICAgICAgICAgICAgICAgICAgICBydWxlLmZvcmJpZGRlbiA9IHVuZGVmaW5lZDtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBydWxlYjY0ID0gYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHJ1bGUpKTtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZXRQYXNzID0gKG5hbWUsIHJ1bGUsIHR5cGUpID0+IFxcXCLmtbfpmJTop4bnlYzvvIzjgIxcXFwiICsgbmFtZSArIFxcXCLjgI1EUlBZ6Kej5p6Q77yM5aSN5Yi25pW05p2h5Y+j5Luk5omT5byA6L2v5Lu25bCx5Lya6Ieq5Yqo5a+85YWlJFxcXCIgKyBydWxlICsgXFxcIiRcXFwiICsgdHlwZSArIFxcXCJAaW1wb3J0PWpzOiQucmVxdWlyZSgnaW1wb3J0P3J1bGU9JytcXFwiICsgSlNPTi5zdHJpbmdpZnkoTVlfUlVMRS50aXRsZSkgKyBcXFwiKShpbnB1dClcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09IFxcXCLlrozmlbTlj6Pku6RcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGdldFBhc3MocnVsZS5uYW1lLCBydWxlYjY0LCBcXFwiYVxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdSA9IHNoYXJlUGFzdGUocnVsZWI2NCwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBnZXRQYXNzKHJ1bGUubmFtZSwgdSwgXFxcImJcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLnp7vliqhcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGluZGV4ICsgXFxcIlxcXCIsIFxcXCLovpPlhaXkvY3nva5cXFwiKS5pbnB1dCgoaW5kZXgsIGxlbmd0aCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gTnVtYmVyKGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChOdW1iZXIuaXNOYU4obmV3SW5kZXgpIHx8IG5ld0luZGV4ID49IGxlbmd0aCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuI3lkozop4TnmoTkvY3nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZXMuc3BsaWNlKG5ld0luZGV4LCAwLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXG4gICAgICAgICAgICAgICAgfSwgaW5kZXgsIGxlbmd0aCk7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIue9rumhtlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgbGV0IG5ld0luZGV4ID0gMDtcXG4gICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IHJ1bGVzLnNwbGljZShpbmRleCwgMSlbMF07XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnNwbGljZShuZXdJbmRleCwgMCwgcnVsZSk7XFxuICAgICAgICAgICAgICAgICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLnNhdmVKc29uKHJ1bGVzKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLliKDpmaRcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFxcXCLnoa7orqTliKDpmaTvvJ9cXFwiKS5jb25maXJtKChpbmRleCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBydWxlcy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xcbiAgICAgICAgICAgICAgICAgICAgJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuc2F2ZUpzb24ocnVsZXMpO1xcbiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3suWIoOmZpFxcXCIgKyBydWxlLm5hbWU7XFxuICAgICAgICAgICAgICAgIH0sIGluZGV4KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBsZXQgYXJyID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IGFycltpbmRleF07XFxuICAgICAgICAgICAgICAgIHJ1bGUuZm9yYmlkZGVuID0gIXJ1bGUuZm9yYmlkZGVuO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyAocnVsZS5mb3JiaWRkZW4gPyBcXFwi56aB55SoXFxcIiA6IFxcXCLlkK/nlKhcXFwiKSArIHJ1bGUubmFtZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpLCBsZW5ndGgpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0XzFcXFwiLFxcbiAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICBpOiBpLFxcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogaXQubmFtZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG59XFxuY291bnRUaXRsZS50aXRsZSA9ICc8Zm9udCBjb2xvcj1cXFwiIzEzQjYxQlxcXCI+4paQIDwvZm9udD48Yj7op6PmnpDliJfooag8Yj4gKCcgKyAoKGQubGVuZ3RoIC0gY291bnQpICsgXFxcIi9cXFwiICsgbGVuZ3RoKS5mb250Y29sb3IoXFxcIiNmZjY2MDFcXFwiKSArIFxcXCIpXFxcIjtcXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLop6PmnpDnvJbovpFcIixcInBhdGhcIjpcInJ1bGVFZGl0XCIsXCJydWxlXCI6XCJqczpcXG52YXIgZCA9IFtdO1xcblxcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgJC50b1N0cmluZygoKSA9PiB7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX25hbWVcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfdXJsXFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcInBzX2ZsYWdcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19tZXRob2RcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIpO1xcbiAgICBjbGVhck15VmFyKFxcXCJwc19qc1xcXCIpO1xcbn0pKTtcXG5sZXQgdXJsSW5kZXggPSBwYXJzZUludChnZXRQYXJhbShcXFwiaW5kZXhcXFwiLCBcXFwiXFxcIikpO1xcbnVybEluZGV4ID0gTnVtYmVyLmlzTmFOKHVybEluZGV4KSA/IHZvaWQoMCkgOiB1cmxJbmRleDtcXG5sZXQgaW5kZXggPSB2b2lkKDApID09PSB1cmxJbmRleCA/IE1ZX1BBUkFNUy5pIDogdXJsSW5kZXg7XFxubGV0IGlzSW1wb3J0ID0gISFnZXRQYXJhbShcXFwiaXNJbXBvcnRcXFwiLCBcXFwiXFxcIik7XFxubGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG5sZXQgb2JqO1xcbmlmIChpc0ltcG9ydCkge1xcbiAgICB0cnkge1xcbiAgICAgICAgb2JqID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2ZpbGVzL19jYWNoZS9qaWV4aVNpbXBsZUltcG9ydC5qc29uXFxcIik7XFxuICAgICAgICBsZXQgdGlwID0gaW5kZXggIT09IHZvaWQoMCkgPyBcXFwi5pu05paw6Kej5p6QXFxcIiA6IFxcXCLlr7zlhaXop6PmnpBcXFwiO1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHRpcCArIFxcXCI6XFxcIiArIG9iai5uYW1lKTtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLigJjigJhcXFwiICsgdGlwICsgXFxcIuKAmeKAmVxcXCIsXFxuICAgICAgICAgICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL2VtcHR5XFxcIixcXG4gICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2VcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KTtcXG5cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgb2JqID0ge307XFxuICAgICAgICBiYWNrKCk7XFxuICAgICAgICB0b2FzdChcXFwi5a+85YWl6ZSZ6K+vXFxcIik7XFxuICAgIH1cXG59IGVsc2UgaWYgKGluZGV4ICE9PSB2b2lkKDApKSB7XFxuICAgIG9iaiA9IGFycltpbmRleF07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi57yW6L6R6Kej5p6QOlxcXCIgKyBvYmoubmFtZSk7XFxufSBlbHNlIHtcXG4gICAgb2JqID0ge1xcbiAgICAgICAgcnVuVHlwZTogXFxcIldFQlxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJHRVRcXFwiXFxuICAgIH07XFxuICAgIHNldFBhZ2VUaXRsZShcXFwi5paw5bu66Kej5p6QXFxcIik7XFxufVxcblxcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi5ZCN5a2XKOW/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IG9iai5uYW1lLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCLop6PmnpB1cmwo5b+F5aGrKVxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX3VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmoudXJsLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwiZmxhZyjlv4XloaspXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHR5cGU6IFxcXCJ0ZXh0YXJlYVxcXCIsXFxuICAgICAgICBoZWlnaHQ6IDIsXFxuICAgICAgICBoaWdobGlnaHQ6IHRydWUsXFxuICAgICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgcHV0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmZsYWcsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJoZWFkZXJzKOmAieWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMixcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfaGVhZGVyc1xcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouaGVhZGVycyxcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIH1cXG59KTtcXG5cXG5wdXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIG9iai5ydW5UeXBlIHx8IFxcXCJcXFwiKTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuino+aekOaooeW8j++8mlxcXCIgKyAob2JqLnJ1blR5cGUgfHwgXFxcIldFQlxcXCIpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbiAgICB1cmw6ICQoW1xcXCJXRUJcXFwiLCBcXFwiSlNPTlxcXCIsIFxcXCJKU1xcXCJdKS5zZWxlY3QoKCkgPT4ge1xcblxcbiAgICAgICAgcHV0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19ydW5UeXBlXFxcIiwge1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi6Kej5p6Q5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19ydW5UeXBlXFxcIixcXG4gICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICB9XFxufSk7XFxuXFxuXFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwianNvblBhdGgoSlNPTuino+aekOaooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgZGVmYXVsdFZhbHVlOiBvYmouanNvblBhdGgsXFxuICAgICAgICB0aXRsZVZpc2libGU6IGZhbHNlLFxcbiAgICB9XFxufSk7XFxucHV0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIG9iai5tZXRob2QgfHwgXFxcIlxcXCIpO1xcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwiSlNPTuivt+axguaooeW8j++8mlxcXCIgKyAob2JqLm1ldGhvZCB8fCBcXFwiR0VUXFxcIiksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgdXJsOiAkKFtcXFwiR0VUXFxcIiwgXFxcIlBPU1RcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG5cXG4gICAgICAgIHB1dE15VmFyKFxcXCJwc19tZXRob2RcXFwiLCBpbnB1dCk7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJwc19tZXRob2RcXFwiLCB7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCJKU09O6K+35rGC5qih5byP77yaXFxcIiArIGlucHV0XFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgIH0pLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgaWQ6IFxcXCJwc19tZXRob2RcXFwiLFxcbiAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgIH1cXG59KTtcXG5kLnB1c2goe1xcbiAgICBjb2xfdHlwZTogXFxcImxpbmVfYmxhbmtcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJpbnB1dFxcXCIsXFxuICAgIGRlc2M6IFxcXCJqcyhKU+aooeW8j+W/heWhqylcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgdHlwZTogXFxcInRleHRhcmVhXFxcIixcXG4gICAgICAgIGhlaWdodDogMyxcXG4gICAgICAgIGhpZ2hsaWdodDogdHJ1ZSxcXG4gICAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgICAgICBwdXRNeVZhcihcXFwicHNfanNcXFwiLCBpbnB1dCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogb2JqLmpzLFxcbiAgICAgICAgdGl0bGVWaXNpYmxlOiBmYWxzZSxcXG4gICAgfVxcbn0pO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuWIoOmZpFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIHVybEluZGV4KSA9PiB7XFxuICAgICAgICBpZiAoaW5kZXggPT09IHZvaWQoMCkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5q2k6aG55peg5rOV5Yig6ZmkXFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh1cmxJbmRleCAhPT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mraPlnKjmm7TmlrDop6PmnpDvvIzliKDpmaTor7fku47op6PmnpDnrqHnkIbov5vlhaVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgY29uZmlybSh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLmuKnppqjmj5DnpLpcXFwiLFxcbiAgICAgICAgICAgIGNvbnRlbnQ6IFxcXCLnoa7lrpropoHliKDpmaTmraTop6PmnpDlkJfvvJ/ms6jmhI/liKDpmaTlkI7ml6Dms5XmgaLlpI1cXFwiLFxcbiAgICAgICAgICAgIGNvbmZpcm06ICQudG9TdHJpbmcoKGluZGV4KSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBhcnIgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5nZXRKc29uKCk7XFxuICAgICAgICAgICAgICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xcbiAgICAgICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgICAgICBiYWNrKHRydWUpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5Yig6Zmk5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9LCBpbmRleClcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIlxcbiAgICB9LCBpbmRleCwgdXJsSW5kZXgpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuZC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLmtYvor5VcXFwiLFxcbiAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKCkgPT4ge1xcbiAgICAgICAgbGV0IHRlc3RLZXl3b3JkID0gZ2V0SXRlbShcXFwidGVzdFVybFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIHJldHVybiAkKHRlc3RLZXl3b3JkLCBcXFwi6K+36L6T5YWl5b2x6KeG572R56uZ5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInRlc3RVcmxcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IG5hbWUgPSBnZXRNeVZhcihcXFwicHNfbmFtZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgZmxhZyA9IGdldE15VmFyKFxcXCJwc19mbGFnXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgICAgbGV0IHJ1blR5cGUgPSBnZXRNeVZhcihcXFwicHNfcnVuVHlwZVxcXCIsIFxcXCJXRUJcXFwiKTtcXG4gICAgICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgICAgICBsZXQganNvblBhdGggPSBnZXRNeVZhcihcXFwicHNfanNvblBhdGhcXFwiLCBcXFwiXFxcIikudHJpbSgpIHx8IHZvaWQgMDtcXG4gICAgICAgICAgICBsZXQganMgPSBnZXRNeVZhcihcXFwicHNfanNcXFwiLCBcXFwiXFxcIikgfHwgdm9pZCAwO1xcbiAgICAgICAgICAgIGlmIChoZWFkZXJzKSB7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoZWFkZXJz5qC85byP6ZSZ6K+vOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwidmlkZW9VcmxcXFwiKS5wcmVwYXJlUGFyc2VzKFt7XFxuICAgICAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgICAgIHVybCxcXG4gICAgICAgICAgICAgICAgZmxhZyxcXG4gICAgICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICAgICAgcnVuVHlwZSxcXG4gICAgICAgICAgICAgICAgbWV0aG9kLFxcbiAgICAgICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICAgICAganNcXG4gICAgICAgICAgICB9XSwgaW5wdXQsbnVsbCwgdHJ1ZSk7XFxuICAgICAgICB9KTtcXG4gICAgfSksXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF8zXFxcIixcXG59KTtcXG5cXG5kLnB1c2goe1xcbiAgICB0aXRsZTogXFxcIuS/neWtmFxcXCIsXFxuICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgoaW5kZXgsIGlzSW1wb3J0KSA9PiB7XFxuICAgICAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJwc19uYW1lXFxcIiwgXFxcIlxcXCIpLnRyaW0oKTtcXG4gICAgICAgIGlmICghbmFtZSkge1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/lkI3lrZflvpfmnInkuIDkuKrlkKdcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IHVybCA9IGdldE15VmFyKFxcXCJwc191cmxcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKCF1cmwpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBmbGFnID0gZ2V0TXlWYXIoXFxcInBzX2ZsYWdcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoIWZsYWcpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6Kej5p6Q5Zyw5Z2A5qCH6K+G5LiN6IO95Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBoZWFkZXJzID0gZ2V0TXlWYXIoXFxcInBzX2hlYWRlcnNcXFwiLCBcXFwiXFxcIikudHJpbSgpO1xcbiAgICAgICAgaWYgKGhlYWRlcnMpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzID0gSlNPTi5wYXJzZShoZWFkZXJzKTtcXG4gICAgICAgICAgICAgICAgaWYodHlwZW9mIGhlYWRlcnMhPT1cXFwib2JqZWN0XFxcIikgdGhyb3cgbmV3IEVycm9yKFxcXCLplJnor6/nsbvlnovvvIzlv4XpobvkuLpPYmplY3RcXFwiKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGVhZGVyc+agvOW8j+mUmeivrzpcXFwiICsgZS50b1N0cmluZygpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydW5UeXBlID0gZ2V0TXlWYXIoXFxcInBzX3J1blR5cGVcXFwiLCBcXFwiV0VCXFxcIik7XFxuICAgICAgICBsZXQgbWV0aG9kID0gZ2V0TXlWYXIoXFxcInBzX21ldGhvZFxcXCIsIFxcXCJHRVRcXFwiKTtcXG4gICAgICAgIGxldCBqc29uUGF0aCA9IGdldE15VmFyKFxcXCJwc19qc29uUGF0aFxcXCIsIFxcXCJcXFwiKS50cmltKCkgfHwgdm9pZCAwO1xcbiAgICAgICAgbGV0IGpzID0gZ2V0TXlWYXIoXFxcInBzX2pzXFxcIiwgXFxcIlxcXCIpIHx8IHZvaWQgMDtcXG4gICAgICAgIGlmIChydW5UeXBlID09PSBcXFwiSlNPTlxcXCIgJiYgIWpzb25QYXRoKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pTT07mqKHlvI/kuIvlv4Xpobvloatqc29uUGF0aFxcXCI7XFxuICAgICAgICB9IGVsc2UgaWYgKHJ1blR5cGUgPT09IFxcXCJKU1xcXCIgJiYgIWpzKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL0pT5qih5byP5LiL5b+F6aG75aGranNcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlnc1xcXCIpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBvYmoxID0ge1xcbiAgICAgICAgICAgIG5hbWUsXFxuICAgICAgICAgICAgdXJsLFxcbiAgICAgICAgICAgIGZsYWcsXFxuICAgICAgICAgICAgaGVhZGVycyxcXG4gICAgICAgICAgICBydW5UeXBlLFxcbiAgICAgICAgICAgIG1ldGhvZCxcXG4gICAgICAgICAgICBqc29uUGF0aCxcXG4gICAgICAgICAgICBqc1xcbiAgICAgICAgfTtcXG4gICAgICAgIGlmIChpbmRleCA9PT0gdm9pZCgwKSkge1xcbiAgICAgICAgICAgIGlmIChhcnIuc29tZSh2ID0+IHYubmFtZSA9PT0gbmFtZSkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmIChvYmoxLmdyb3VwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBncm91cCA9IG9iajEuZ3JvdXA7XFxuICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IGFyci5maW5kSW5kZXgodiA9PiB2Lmdyb3VwID09PSBncm91cCk7XFxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci51bnNoaWZ0KG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMCwgb2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICBpZiAoaXNJbXBvcnQpIHtcXG4gICAgICAgICAgICAgICAgICAgIGFyci5wdXNoKG9iajEpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgYXJyLnVuc2hpZnQob2JqMSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBuYW1leSA9IGFycltpbmRleF0ubmFtZTtcXG4gICAgICAgICAgICBpZiAobmFtZSAhPT0gbmFtZXkpIHtcXG4gICAgICAgICAgICAgICAgaWYgKGFyci5zb21lKHYgPT4gdi5uYW1lID09PSBuYW1lKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+W3sue7j+WtmOWcqOivpeino+aekFxcXCI7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgb2JqMSA9IE9iamVjdC5hc3NpZ24oYXJyW2luZGV4XSwgb2JqMSk7XFxuICAgICAgICAgICAgYXJyLnNwbGljZShpbmRleCwgMSwgb2JqMSk7XFxuICAgICAgICB9XFxuICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3NcXFwiKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgYmFjayh0cnVlKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kv53lrZjmiJDlip9cXFwiO1xcbiAgICB9LCBpbmRleCwgaXNJbXBvcnQpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfM1xcXCIsXFxufSk7XFxuXFxuc2V0UmVzdWx0KGQpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6Kej5p6Q5a+85YWlXCIsXCJwYXRoXCI6XCJpbXBvcnRcIixcInJ1bGVcIjpcImpzOlxcbmZ1bmN0aW9uIHNhdmVDYWNoZShqc29uKSB7XFxuICAgIHdyaXRlRmlsZShcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvamlleGlTaW1wbGVJbXBvcnQuanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KGpzb24pKTtcXG59XFxuJC5leHBvcnRzID0gZnVuY3Rpb24ocGFzcykge1xcbiAgICB0cnkge1xcbiAgICAgICAgbGV0IFtfLCBydWxlLCB0eXBlXSA9IHBhc3Muc3BsaXQoXFxcIiRcXFwiKTtcXG4gICAgICAgIGlmICh0eXBlID09PSBcXFwiYlxcXCIpIHtcXG4gICAgICAgICAgICBydWxlID0gcGFyc2VQYXN0ZShydWxlKTtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlcyA9IEpTT04ucGFyc2UoYmFzZTY0RGVjb2RlKHJ1bGUpKTtcXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShydWxlcykpIHtcXG4gICAgICAgICAgICBydWxlcyA9IFtydWxlc107XFxuICAgICAgICB9XFxuICAgICAgICAvL3J1bGVzLnJldmVyc2UoKTtcXG4gICAgICAgIE1ZX1VSTCA9IG1vZHVsZS5pZDtcXG4gICAgICAgIGxldCBydWxlVGl0bGUgPSBnZXRQYXJhbShcXFwicnVsZVxcXCIpO1xcbiAgICAgICAgbGV0IGFyciA9ICQucmVxdWlyZShcXFwiY29uZmlncz9ydWxlPVxcXCIgKyBydWxlVGl0bGUpLmdldEpzb24oKTtcXG4gICAgICAgIGxldCBuZXdJID0gMDtcXG4gICAgICAgIGZvciAobGV0IHJ1bGUgb2YgcnVsZXMpIHtcXG4gICAgICAgICAgICBsZXQgaW5kZXggPSBhcnIuZmluZEluZGV4KHYgPT4gdi5uYW1lID09PSBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XFxuICAgICAgICAgICAgICAgIHJ1bGUgPSBPYmplY3QuYXNzaWduKGFycltpbmRleF0sIHJ1bGUpO1xcbiAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAxLCBydWxlKTtcXG4gICAgICAgICAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA9PT0gMSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2F2ZUNhY2hlKHJ1bGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvcnVsZUVkaXQjbm9IaXN0b3J5IyNub1JlY29yZEhpc3RvcnkjP2lzSW1wb3J0PXRydWUmaW5kZXg9XFxcIiArIGluZGV4ICsgXFxcIiZydWxlPVxcXCIgKyBydWxlVGl0bGU7XFxuICAgICAgICAgICAgICAgICAgICAvL3RvYXN0KFxcXCLlt7Lmm7TmlrDop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxvZyhcXFwi5bey5pu05paw6KeE5YiZ77yaXFxcIiArIHJ1bGUubmFtZSlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIG5ld0krKztcXG4gICAgICAgICAgICAgICAgYXJyLnB1c2gocnVsZSk7XFxuICAgICAgICAgICAgICAgIGlmIChydWxlcy5sZW5ndGggPT09IDEpIHtcXG4gICAgICAgICAgICAgICAgICAgIHNhdmVDYWNoZShydWxlKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9wYWdlL3J1bGVFZGl0I25vSGlzdG9yeSMjbm9SZWNvcmRIaXN0b3J5Iz9pc0ltcG9ydD10cnVlJnJ1bGU9XFxcIiArIHJ1bGVUaXRsZTtcXG4gICAgICAgICAgICAgICAgICAgIC8vdG9hc3QoXFxcIuW3suWvvOWFpeinhOWIme+8mlxcXCIgKyBydWxlLm5hbWUpO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgbG9nKFxcXCLlt7Llr7zlhaXop4TliJnvvJpcXFwiICsgcnVsZS5uYW1lKVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bGVzLmxlbmd0aCA+IDEpIHtcXG4gICAgICAgICAgICAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgcnVsZVRpdGxlKS5zYXZlSnNvbihhcnIpO1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmlrDlop7vvJpcXFwiICsgbmV3SSArIFxcXCIg6KaG55uW5pu05paw77yaXFxcIiArIChydWxlcy5sZW5ndGggLSBuZXdJKSk7XFxuICAgICAgICB9XFxuICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgdG9hc3QoXFxcIuWvvOWFpeWksei0pVxcXCIpO1xcbiAgICB9XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6KeG6aKR6Kej5p6QXCIsXCJwYXRoXCI6XCJ2aWRlb1VybFwiLFwicnVsZVwiOlwiZnVuY3Rpb24gaXNvZmZpY2lhbCh1cmwpIHtcXG4gIGxldCBmbGFnID0gbmV3IFJlZ0V4cCgncXFcXFxcLmNvbXxpcWl5aVxcXFwuY29tfHlvdWt1XFxcXC5jb218bWd0dlxcXFwuY29tfGJpbGliaWxpXFxcXC5jb218c29odVxcXFwuY29tfGl4aWd1YVxcXFwuY29tfHBwdHZcXFxcLmNvbXxtaWd1dmlkZW9cXFxcLmNvbXxsZVxcXFwuY29tfDE5MDVcXFxcLmNvbXxmdW5cXFxcLnR2Jyk7XFxuICByZXR1cm4gZmxhZy50ZXN0KHVybCk7XFxufVxcblxcbmZ1bmN0aW9uIHByb3h5KHRpdGxlKSB7XFxuICBmdW5jdGlvbiB0b1BhdGgodmFsdWUpIHtcXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcXG4gICAgICByZXR1cm4gW107XFxuICAgIH1cXG4gICAgbGV0IHBhdGggPSBbXTtcXG4gICAgbGV0IGN1cnJlbnQgPSAnJztcXG4gICAgbGV0IGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgbGV0IGVzY2FwZSA9IGZhbHNlO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgbGV0IGNoYXIgPSB2YWx1ZVtpXTtcXG4gICAgICBpZiAoZXNjYXBlKSB7XFxuICAgICAgICBjdXJyZW50ICs9IGNoYXI7XFxuICAgICAgICBlc2NhcGUgPSBmYWxzZTtcXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdcXFxcXFxcXCcpIHtcXG4gICAgICAgIGVzY2FwZSA9IHRydWU7XFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnLicgJiYgIWluQnJhY2tldHMpIHtcXG4gICAgICAgIHBhdGgucHVzaChjdXJyZW50KTtcXG4gICAgICAgIGN1cnJlbnQgPSAnJztcXG4gICAgICB9IGVsc2UgaWYgKGNoYXIgPT09ICdbJykge1xcbiAgICAgICAgaW5CcmFja2V0cyA9IHRydWU7XFxuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXScpIHtcXG4gICAgICAgIGluQnJhY2tldHMgPSBmYWxzZTtcXG4gICAgICB9IGVsc2Uge1xcbiAgICAgICAgY3VycmVudCArPSBjaGFyO1xcbiAgICAgIH1cXG4gICAgfVxcbiAgICBpZiAoY3VycmVudCkge1xcbiAgICAgIHBhdGgucHVzaChjdXJyZW50KTtcXG4gICAgfVxcbiAgICByZXR1cm4gcGF0aDtcXG4gIH1cXG5cXG4gIGZ1bmN0aW9uIGdldEpzb24ob2JqLCBwYXRoKSB7XFxuICAgIGlmICghb2JqIHx8ICFBcnJheS5pc0FycmF5KHBhdGgpKSB7XFxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcXG4gICAgfVxcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcXG4gICAgICByZXR1cm4gb2JqO1xcbiAgICB9XFxuICAgIGxldCBjdXJyZW50ID0gb2JqO1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcXG4gICAgICBsZXQga2V5ID0gcGF0aFtpXTtcXG4gICAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGN1cnJlbnQgIT09ICdvYmplY3QnKSB7XFxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xcbiAgICAgIH1cXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtrZXldO1xcbiAgICB9XFxuICAgIHJldHVybiBjdXJyZW50O1xcbiAgfVxcbiAgdHJ5IHtcXG4gICAgbGV0IHJ1blR5cGUgPSBNWV9QQVJBTVMucnVuVHlwZVswXTtcXG4gICAgbGV0IHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnVybFswXSkpO1xcbiAgICBpZiAocnVuVHlwZSA9PSBcXFwiSlNPTlxcXCIpIHtcXG5cXG4gICAgICBsZXQgcGFyYW0gPSBKU09OLnBhcnNlKGRlY29kZVVSSUNvbXBvbmVudChiYXNlNjREZWNvZGUoTVlfUEFSQU1TLnBhcmFtWzBdKSkpO1xcbiAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShyZXF1ZXN0KHVybCwge1xcbiAgICAgICAgaGVhZGVyczogcGFyYW0uaGVhZGVycyB8fCB7fSxcXG4gICAgICAgIG1ldGhvZDogcGFyYW0ubWV0aG9kIHx8IHZvaWQgMFxcbiAgICAgIH0pKTtcXG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgaGVhZGVyczogT2JqZWN0LmFzc2lnbih7fSwgcGFyYW0uaGVhZGVycyB8fCB7fSwge1xcbiAgICAgICAgICBcXFwiTG9jYXRpb25cXFwiOiBnZXRKc29uKGpzb24sIHRvUGF0aChwYXJhbS5qc29uUGF0aCkpLFxcbiAgICAgICAgfSlcXG4gICAgICB9KTtcXG4gICAgfSBlbHNlIGlmIChydW5UeXBlID09IFxcXCJKU1xcXCIpIHtcXG5cXG4gICAgICBsZXQgcGFyc2U7XFxuICAgICAgaWYgKE1ZX1BBUkFNUy5pbmRleCkge1xcbiAgICAgICAgcGFyc2UgPSAkLnJlcXVpcmUoXFxcImNvbmZpZ3M/cnVsZT1cXFwiICsgdGl0bGUpLmdldEpzb24oKVtNWV9QQVJBTVMuaW5kZXhbMF1dO1xcbiAgICAgIH0gZWxzZSB7XFxuICAgICAgICBwYXJzZSA9IEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KGJhc2U2NERlY29kZShNWV9QQVJBTVMucGFyYW1bMF0pKSk7XFxuICAgICAgfVxcbiAgICAgIGxldCByZXMgPSBuZXcgRnVuY3Rpb24oXFxcInVybFxcXCIsIFxcXCJzZWxmXFxcIiwgcGFyc2UuanMpKHVybCwgcGFyc2UpO1xcbiAgICAgIGlmICh0eXBlb2YgcmVzID09PSBcXFwic3RyaW5nXFxcIikge1xcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcXG4gICAgICAgICAgc3RhdHVzQ29kZTogMzAyLFxcbiAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgXFxcIkxvY2F0aW9uXFxcIjogcmVzXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pO1xcbiAgICAgIH0gZWxzZSBpZiAoJC50eXBlKHJlcykgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xcbiAgICAgICAgICBzdGF0dXNDb2RlOiAzMDIsXFxuICAgICAgICAgIGhlYWRlcnM6IHJlc1xcbiAgICAgICAgfSk7XFxuICAgICAgfVxcbiAgICB9XFxuICB9IGNhdGNoIChlKSB7XFxuICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCwgaXNUZXN0KSB7XFxuICBwbGF5bGlzdCA9IHBsYXlsaXN0IHx8IHtcXG4gICAgdXJsczogW10sXFxuICAgIG5hbWVzOiBbXSxcXG4gICAgaGVhZGVyczogW10sXFxuICAgIGlzOiBcXFwiI2lzVmlkZW89dHJ1ZSNcXFwiLFxcbiAgfTtcXG4gIGxldCBwcm94eVVybCA9IHN0YXJ0UHJveHlTZXJ2ZXIoJC50b1N0cmluZyhwcm94eSwgTVlfUlVMRS50aXRsZSkpO1xcbiAgcGFyc2VzLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgaWYgKHYuZm9yYmlkZGVuKSByZXR1cm47XFxuICAgIHBsYXlsaXN0Lm5hbWVzLnB1c2godi5uYW1lKTtcXG4gICAgaWYgKHYuaGVhZGVycykge1xcbiAgICAgIHBsYXlsaXN0LmhlYWRlcnMucHVzaCh2LmhlYWRlcnMpO1xcbiAgICB9XFxuICAgIGlmICh2LnJ1blR5cGUgPT09IFxcXCJKU09OXFxcIikge1xcbiAgICAgIGxldCBwYXJhbSA9IHtcXG4gICAgICAgIC8vdXJsOiB2LnVybCxcXG4gICAgICAgIG1ldGhvZDogdi5tZXRob2QsXFxuICAgICAgICBoZWFkZXJzOiB2LmhlYWRlcnMsXFxuICAgICAgICBqc29uUGF0aDogdi5qc29uUGF0aFxcbiAgICAgIH07XFxuICAgICAgcGxheWxpc3QudXJscy5wdXNoKHByb3h5VXJsICsgXFxcIj9ydW5UeXBlPUpTT04mdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKHYudXJsICsgdXJsKSkgKyBcXFwiJnBhcmFtPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKEpTT04uc3RyaW5naWZ5KHBhcmFtKSkpKTtcXG4gICAgfSBlbHNlIGlmICh2LnJ1blR5cGUgPT09IFxcXCJKU1xcXCIpIHtcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2gocHJveHlVcmwgKyBcXFwiP3J1blR5cGU9SlMmdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQoYmFzZTY0RW5jb2RlKHVybCkpICsgKGlzVGVzdCA/IFxcXCImcGFyYW09XFxcIiArIGVuY29kZVVSSUNvbXBvbmVudChiYXNlNjRFbmNvZGUoSlNPTi5zdHJpbmdpZnkodikpKSA6IFxcXCImaW5kZXg9XFxcIiArIGkpKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICBwbGF5bGlzdC51cmxzLnB1c2goXFxcInZpZGVvOi8vXFxcIiArIHYudXJsICsgdXJsKTtcXG4gICAgfVxcbiAgfSk7XFxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheWxpc3QpO1xcbn1cXG5cXG5mdW5jdGlvbiB1c2VQYXJzZXModXJsKSB7XFxuICBsZXQgcGFyc2VzID0gJC5yZXF1aXJlKFxcXCJjb25maWdzXFxcIikuZ2V0SnNvbigpO1xcbiAgaWYgKCFwYXJzZXMubGVuZ3RoKSByZXR1cm4gXFxcIndlYjovL1xcXCIgKyB1cmw7XFxuICBsZXQgcGxheWxpc3QgPSB7XFxuICAgIHVybHM6IFtdLFxcbiAgICBuYW1lczogW10sXFxuICAgIGhlYWRlcnM6IFtdLFxcbiAgICBpczogXFxcIiNpc1ZpZGVvPXRydWUjXFxcIixcXG4gIH07XFxuICB0cnkge1xcbiAgICBsZXQgdXNlRGFubXUgPSAhIWdldEl0ZW0oXFxcInVzZURhbm11XFxcIiwgXFxcIlxcXCIpO1xcbiAgICBpZiAodXNlRGFubXUpIHtcXG4gICAgICBwbGF5bGlzdC5kYW5tdSA9ICQucmVxdWlyZSgnZG1GdW4/cnVsZT1kbeebkuWtkCcpLmRtUm91dGUodXJsKTtcXG4gICAgfVxcbiAgfSBjYXRjaCB7IH1cXG4gIHJldHVybiBwcmVwYXJlUGFyc2VzKHBhcnNlcywgdXJsLCBwbGF5bGlzdCk7XFxufVxcbiQuZXhwb3J0cy5wYXJzZSA9IGZ1bmN0aW9uIChpbnB1dCwgaWQsIHNvdXJjZSkge1xcbiAgbGV0IGRycHkgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKS5nZXRCeVNvdXJjZShzb3VyY2UpO1xcbiAgaW5wdXQgPSBpbnB1dC5zcGxpdChcXFwiI1xcXCIpO1xcbiAgbGV0IHBsYXkgPSBKU09OLnBhcnNlKGRycHkucGxheShpbnB1dFsxXSwgaW5wdXRbMF0ucmVwbGFjZShcXFwidHZib3gteGc6XFxcIiwgXFxcIlxcXCIpLCBbXSkpO1xcbiAgLy8gbG9nKHBsYXkpXFxuICAvLyBsb2coaWQpXFxuICAvL2xvZyhwbGF5KVxcbiAgZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkge1xcbiAgICB2YXIgb2JqID0ge307XFxuICAgIHF1ZXJ5LnNwbGl0KFxcXCImXFxcIikuZmlsdGVyKGUgPT4gZSkuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkge1xcbiAgICAgIHZhciBwYXJ0cyA9IGl0ZW0uc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgICBvYmpbcGFydHNbMF1dID0gcGFydHNbMV07XFxuICAgIH0pO1xcbiAgICByZXR1cm4gb2JqO1xcbiAgfVxcbiAgdmFyIGV4dHJhID0ge1xcbiAgICBcXFwidWFcXFwiOiBNT0JJTEVfVUFcXG4gIH1cXG4gIGxldCBwYXJzZSA9IHBsYXk7XFxuICBsZXQgcGFyc2Vfb2JqID0ge1xcbiAgICBkZWZSdWxlczogW1xcXCIqLm1wNFxcXCIsIFxcXCIqLm0zdThcXFwiXSxcXG4gIH07XFxuICBpZiAocGFyc2UuaGFzT3duUHJvcGVydHkoXFxcInBhcnNlX2V4dHJhXFxcIikpIHtcXG4gICAgbGV0IHBhcnNlX2V4dHJhID0gZGVjb2RlVVJJQ29tcG9uZW50KHBhcnNlLnBhcnNlX2V4dHJhKTtcXG4gICAgcGFyc2Vfb2JqID0gT2JqZWN0LmFzc2lnbihwYXJzZV9vYmosIHBhcnNlUXVlcnkocGFyc2VfZXh0cmEpKTtcXG4gICAgaWYgKHBhcnNlX29iai5oYXNPd25Qcm9wZXJ0eShcXFwiaW5pdF9zY3JpcHRcXFwiKSkge1xcbiAgICAgIHBhcnNlX29ialtcXFwiaW5pdF9zY3JpcHRcXFwiXSA9IGJhc2U2NERlY29kZShwYXJzZV9vYmpbXFxcImluaXRfc2NyaXB0XFxcIl0pO1xcbiAgICB9XFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJpc19wY1xcXCIpICYmIHBhcnNlX29ialtcXFwiaXNfcGNcXFwiXSA9PSBcXFwiMVxcXCIpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBQQ19VQTtcXG4gIH1cXG4gIGlmIChwYXJzZS5oYXNPd25Qcm9wZXJ0eShcXFwiaGVhZGVyXFxcIikpIHtcXG4gICAgZXh0cmFbXFxcInVhXFxcIl0gPSBwYXJzZVtcXFwiaGVhZGVyXFxcIl1bXFxcIlVzZXItQWdlbnRcXFwiXTtcXG4gICAgLy9leHRyYVtcXFwicmVkaXJlY3RcXFwiXT1mYWxzZTtcXG4gICAgLypleHRyYVtcXFwianNcXFwiXSA9ICQudG9TdHJpbmcoKGpzKSA9PiB7XFxuICAgICAgZXZhbChqcylcXG4gICAgICBmYmEubG9nKG5hdmlnYXRvci51c2VyQWdlbnQpXFxuICAgICAgZmJhLmxvZyhsb2NhdGlvbi5ocmVmKVxcbiAgICB9LCAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobmF2aWdhdG9yLCAndXNlckFnZW50Jywge1xcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XFxuICAgICAgICAgIHJldHVybiAnTXktQ3VzdG9tLVVBLVN0cmluZyc7XFxuICAgICAgICB9XFxuICAgICAgfSk7XFxuICAgIH0pKSovXFxuICB9XFxuICBpZiAocGFyc2Vfb2JqLmhhc093blByb3BlcnR5KFxcXCJjdXN0b21fcmVnZXhcXFwiKSkge1xcbiAgICBsZXQgY3VycmVudCA9IHBhcnNlX29ialtcXFwiZGVmUnVsZXNcXFwiXTtcXG4gICAgZXh0cmFbXFxcInZpZGVvUnVsZXNcXFwiXSA9IGN1cnJlbnQuY29uY2F0KHBhcnNlX29iai5jdXN0b21fcmVnZXguc3BsaXQoL1xcXFx8L2cpLmZpbHRlcihlID0+IGUpKVxcbiAgfVxcbiAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJqc1xcXCIpICYmIHBhcnNlLmpzICE9IFxcXCJcXFwiKSB7XFxuICAgIGV4dHJhW1xcXCJqc1xcXCJdID0gJC50b1N0cmluZygoanMsIHBhcnNlLCB0KSA9PiB7XFxuICAgICAgaWYgKHBhcnNlLmhhc093blByb3BlcnR5KFxcXCJpbml0X3NjcmlwdFxcXCIpKSB7XFxuICAgICAgICBmYmEubG9nKHQgKyBcXFwiOuaJp+ihjGluaXRfc2NyaXB0XFxcIik7XFxuICAgICAgICBldmFsKHBhcnNlLmluaXRfc2NyaXB0KTtcXG4gICAgICB9XFxuICAgICAgZmJhLmxvZyhuYXZpZ2F0b3IucGxhdGZvcm0pO1xcbiAgICAgIGZiYS5sb2codCArIFxcXCI65omn6KGManPngrnlh7tcXFwiKVxcbiAgICAgIGV2YWwoanMpXFxuICAgIH0sIHBhcnNlLmpzLCBwYXJzZV9vYmosIE1ZX1JVTEUudGl0bGUpXFxuICB9XFxuICBsZXQgaXRlbSA9IGZpbmRJdGVtKGlkKTtcXG4gIHVwZGF0ZUl0ZW0oaWQsIHtcXG4gICAgZXh0cmE6IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0uZXh0cmEsIGV4dHJhKVxcbiAgfSlcXG5cXG4gIGlmIChwbGF5LnVybC5pbmNsdWRlcyhcXFwicHJveHk/ZG9cXFwiKSkge1xcbiAgICBNWV9VUkwgPSBwbGF5LnVybDtcXG4gICAgcGxheS51cmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInVybFxcXCIsIFxcXCJcXFwiKSk7XFxuICB9XFxuICBpZiAocGxheS51cmwuc3RhcnRzV2l0aChcXFwicHVzaDovL1xcXCIpKSB7XFxuICAgIHBsYXkudXJsID0gcGxheS51cmwucmVwbGFjZShcXFwicHVzaDovL1xcXCIsIFxcXCJcXFwiKTtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9cXFwiKSkge1xcbiAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cnVsZT1RdWFyay7nroAmcmVhbHVybD1cXFwiICsgZW5jb2RlVVJJQ29tcG9uZW50KHBsYXkudXJsKSArIFxcXCImc2hhcmVQd2Q9XFxcIjtcXG4gIH1cXG4gIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKCdodHRwczovL3d3dy5hbGl5dW5kcml2ZS5jb20vcy8nKSB8fCBwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJodHRwczovL3d3dy5hbGlwYW4uY29tL3MvXFxcIikpIHtcXG4gICAgcmV0dXJuIFxcXCJoaWtlcjovL3BhZ2UvYWxpeXVuP3J1bGU95LqR55uY5ZCbLueugCZwYWdlPWZ5cGFnZSZyZWFsdXJsPVxcXCIgKyBlbmNvZGVVUklDb21wb25lbnQocGxheS51cmwpO1xcbiAgfVxcbiAgaWYgKHBsYXkucGFyc2UgPT09IDEpIHtcXG4gICAgaWYgKHBsYXkudXJsLnN0YXJ0c1dpdGgoXFxcIm1hZ25ldDpcXFwiKSkge1xcbiAgICAgIHJldHVybiBwbGF5LnVybDtcXG4gICAgfVxcbiAgICBpZiAoaXNvZmZpY2lhbChwbGF5LnVybCkgJiYgKHBsYXkuZmxhZyB8fCBpbnB1dFsxXSkpIHtcXG4gICAgICByZXR1cm4gdXNlUGFyc2VzKHBsYXkudXJsKTtcXG4gICAgfVxcbiAgICByZXR1cm4gXFxcInZpZGVvOi8vXFxcIiArIHBsYXkudXJsO1xcbiAgfSBlbHNlIGlmIChwbGF5LnBhcnNlID09PSAwKSB7XFxuICAgIGlmIChwbGF5LnVybC5zdGFydHNXaXRoKFxcXCJtYWduZXQ6XFxcIikpIHtcXG4gICAgICByZXR1cm4gcGxheS51cmw7XFxuICAgIH1cXG4gICAgLy9sb2cocGxheSlcXG4gICAgdmFyIHBsYXlvYmogPSB7fTtcXG4gICAgcGxheW9iai51cmxzID0gW3BsYXkudXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIl07XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJoZWFkZXJcXFwiKSkge1xcbiAgICAgIHBsYXlvYmpbXFxcImhlYWRlcnNcXFwiXSA9IHBsYXkuaGVhZGVyO1xcbiAgICB9XFxuICAgIGlmIChwbGF5Lmhhc093blByb3BlcnR5KFxcXCJkYW5tYWt1XFxcIikpIHtcXG4gICAgICBwbGF5b2JqW1xcXCJkYW5tdVxcXCJdID0gcGxheS5kYW5tYWt1O1xcbiAgICB9XFxuICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5b2JqKTtcXG4gIH1cXG59XFxuJC5leHBvcnRzLnByZXBhcmVQYXJzZXMgPSBwcmVwYXJlUGFyc2VzO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Yib5bu66K6i6ZiFXCIsXCJwYXRoXCI6XCJjcmVhdGVTdWJzY3JpcHRpb25cIixcInJ1bGVcIjpcImpzOlxcbmxldCBsYXlvdXQgPSBbXTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIik7XFxuICAgIGNsZWFyTXlWYXIoXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiKTtcXG4gICAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX3N1Ym5hbWVfaW5wdXRcXFwiKTtcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6K6i6ZiF5ZCN56ewXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCIsIGlucHV0KTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfc3VibmFtZV9pbnB1dFxcXCJcXG4gICAgfVxcbn0pO1xcbmxldCBwYXRoID0gam9pblVybChnZXRQYXRoKFxcXCJoaWtlcjovL2ZpbGVzL1xcXCIpLCBcXFwiLi4vXFxcIi5yZXBlYXQoNSkpLnNsaWNlKDcpO1xcbmxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6IFxcXCLpgInmi6lcXFwiLFxcbiAgICB1cmw6IEpTT04uc3RyaW5naWZ5KGYuZmlsZVNlbGVjdGlvblVyaSh7XFxuICAgICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICAgICAgbGV0IHRhcmdldCA9IGZpbmRJdGVtKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIikuZXh0cmE7XFxuICAgICAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIHtcXG4gICAgICAgICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgICBpbml0aWFsUGF0aDogcGF0aCxcXG4gICAgICAgIHBhdHRlcm46IDFcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIuWCqOWtmOi3r+W+hFxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3ViX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwiaW5wdXRcXFwiLFxcbiAgICBkZXNjOiBcXFwi6K6i6ZiF5Zyw5Z2AXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgICAgb25DaGFuZ2U6ICQudG9TdHJpbmcoKCkgPT4ge1xcbiAgICAgICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfc3VidXJsX2lucHV0XFxcIiwgaW5wdXQpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBpZDogXFxcImRycHlIaWtlcl9zdWJ1cmxfaW5wdXRcXFwiXFxuICAgIH1cXG59KTtcXG5cXG5sYXlvdXQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi56Gu6K6kXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChpZCkgPT4ge1xcbiAgICAgICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1Yl9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGxldCB1cmwgPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX3N1YnVybF9pbnB1dFxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGxldCBuYW1lID0gZ2V0TXlWYXIoXFxcImRycHlIaWtlcl9zdWJuYW1lX2lucHV0XFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgaWYgKCEocGF0aCAmJiB1cmwgJiYgbmFtZSkpIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBydWxlID0gYmFzZTY0RW5jb2RlKFxcXCLmtbfpmJTop4bnlYzop4TliJnliIbkuqvvvIzlvZPliY3liIbkuqvnmoTmmK/vvJrlkIjpm4bop4TliJnorqLpmIXvv6Vob21lX3N1Yu+/pVxcXCIgKyBuYW1lICsgXFxcIkBAXFxcIiArIHVybCtgQGpzPSQucmVxdWlyZSgnc3Vic2NyaWJlP3J1bGU9JHtNWV9SVUxFLnRpdGxlfScpLnBhcnNlVXJsKGlucHV0LCAnJHtiYXNlNjRFbmNvZGUocGF0aCl9JylgKTtcXG4gICAgICAgIHJldHVybiBcXFwicnVsZTovL1xcXCIgKyBydWxlO1xcbiAgICB9KSxcXG4gICAgY29sX3R5cGU6IFxcXCJ0ZXh0X2NlbnRlcl8xXFxcIixcXG59KTtcXG5zZXRSZXN1bHQobGF5b3V0KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuino+aekOiuoumYhVwiLFwicGF0aFwiOlwic3Vic2NyaWJlXCIsXCJydWxlXCI6XCJqczpcXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCwgcGF0aCkge1xcbiAgICBsZXQgcm9wZSA9IHVybC5zcGxpdChcXFwiL1xcXCIpLnNsaWNlKDMsIDUpLmpvaW4oXFxcIi9cXFwiKTtcXG4gICAgbGV0IGh0bWwgPSBmZXRjaCh1cmwpO1xcbiAgICBcXG4gICAgbGV0IGpzb25UZXh0ID0gcGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIik7XFxuICAgIFxcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoanNvblRleHQpO1xcbiAgICBsZXQgbGlzdCA9IGpzb24ucGF5bG9hZC50cmVlLml0ZW1zO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgbGV0IGNvdW50ID0gMDtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgbmFtZSA9IGl0Lm5hbWU7XFxuICAgICAgICAgICAgbGV0IHNwYXRoID0gaXQucGF0aDtcXG4gICAgICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSBjb250aW51ZTtcXG4gICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKFxcXCIuXFxcIikpO1xcbiAgICAgICAgICAgIGxldCBydWxlID0gZmV0Y2goYGh0dHBzOi8vcmF3LmdpdG1pcnJvci5jb20vJHtyb3BlfS9tYXN0ZXIvJHtzcGF0aH1gKTtcXG4gICAgICAgICAgICBpZiAoISgoIXJ1bGUgfHwgIXJ1bGUuaW5jbHVkZXMoXFxcInJ1bGVcXFwiKSkgJiYgIWZpbGVFeGlzdChwYXRoICsgaXQubmFtZSkpKSB7XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoICsgaXQubmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICAgICAgJ2tleSc6IGBoaXB5X2pzXyR7bmFtZX1gLFxcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgICAgICAgICAndHlwZSc6IDMsXFxuICAgICAgICAgICAgICAgICAgICAnYXBpJzonLi4vbGlicy9kcnB5Mi5qcycsXFxuICAgICAgICAgICAgICAgICAgICAnc2VhcmNoYWJsZSc6IDEsXFxuICAgICAgICAgICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2ZpbHRlcmFibGUnOiAxLFxcbiAgICAgICAgICAgICAgICAgICAgJ2V4dCc6IFxcXCIuL1xcXCIgKyBpdC5uYW1lLFxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgY291bnQrKztcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgd3JpdGVGaWxlKHBhdGggKyBcXFwiaW5kZXguanNvblxcXCIsIEpTT04uc3RyaW5naWZ5KHtzaXRlczpydWxlc30pKTtcXG4gICAgcmV0dXJuIFxcXCJ0b2FzdDovL+aIkOWKn+abtOaWsFxcXCIgKyBjb3VudCArIFxcXCLkuKpcXFwiOztcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUluZGV4KHVybCwgcGF0aCkge1xcbiAgICBsZXQganNvbiA9IEpTT04ucGFyc2UocmVxdWVzdCh1cmwpKTtcXG4gICAgbGV0IGFyciA9IGpzb24uc2l0ZXM7XFxuICAgIGxldCBjb3VudCA9IDA7XFxuICAgIGxldCBpID0gMDtcXG4gICAgZm9yIChsZXQgaXQgb2YgYXJyKSB7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmICgoU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLm1pbi5qc1xcXCIpIHx8IFN0cmluZyhpdC5hcGkpLmluY2x1ZGVzKFxcXCJkcnB5Mi5qc1xcXCIpKSkge1xcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGl0LmV4dC5lbmRzV2l0aChcXFwiLmpzXFxcIikgPyBkZWNvZGVVUklDb21wb25lbnQoaXQuZXh0LnNwbGl0KFxcXCIvXFxcIikuYXQoLTEpKSA6IChpdC5uYW1lICsgXFxcIi5qc1xcXCIpO1xcbiAgICAgICAgICAgICAgICBsZXQgcnVsZTtcXG4gICAgICAgICAgICAgICAgaWYgKFN0cmluZyhpdC5leHQpLnN0YXJ0c1dpdGgoXFxcImh0dHBcXFwiKSkge1xcbiAgICAgICAgICAgICAgICAgICAgcnVsZSA9IHJlcXVlc3QoaXQuZXh0KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJ1bGUgPSByZXF1ZXN0KGpvaW5VcmwodXJsLCBpdC5leHQpKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBpdC5leHQgPSBcXFwiLi9cXFwiICsgbmFtZTtcXG4gICAgICAgICAgICAgICAgaWYgKCFydWxlIHx8ICFydWxlLmluY2x1ZGVzKFxcXCJydWxlXFxcIikpIHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICghZmlsZUV4aXN0KHBhdGggKyBuYW1lKSlcXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnIuc3BsaWNlKGksIDEpO1xcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XFxuICAgICAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoICsgbmFtZSwgcnVsZSk7XFxuICAgICAgICAgICAgICAgIGNvdW50Kys7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIGxvZyhlLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHdyaXRlRmlsZShwYXRoICsgXFxcImluZGV4Lmpzb25cXFwiLCBKU09OLnN0cmluZ2lmeShqc29uKSk7XFxuICAgIHJldHVybiBcXFwidG9hc3Q6Ly/miJDlip/mm7TmlrBcXFwiICsgY291bnQgKyBcXFwi5LiqXFxcIjtcXG59XFxuJC5leHBvcnRzLnBhcnNlVXJsID0gZnVuY3Rpb24odXJsLCBwYXRoKSB7XFxuICAgIHBhdGggPSBiYXNlNjREZWNvZGUocGF0aCk7XFxuICAgIHBhdGggPSBwYXRoLmVuZHNXaXRoKFxcXCIvXFxcIikgPyBwYXRoIDogcGF0aCArIFxcXCIvXFxcIjtcXG4gICAgdHJ5IHtcXG4gICAgICAgIGlmICh1cmwuc3RhcnRzV2l0aChcXFwiaHR0cHM6Ly9naXRodWIuY29tL2hqZGhueC9cXFwiKSkge1xcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCwgcGF0aCk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiBnZW5lcmF0ZUNvbmZpZ0J5SW5kZXgodXJsLCBwYXRoKTtcXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgbG9nKGUudG9TdHJpbmcoKSk7XFxuICAgICAgICByZXR1cm4gXFxcImVycm9yOlxcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH1cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi6L+Q6KGM5pe26YWN572u566h55CGXCIsXCJwYXRoXCI6XCJydW50aW1lQ29uZmlnXCIsXCJydWxlXCI6XCJqczpcXG5jb25zdCBzZWFyY2hBbGxvd1BhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9ydWxlcy9Mb3lEZ0lrL0RycHlIaWtlci9zZWFyY2hBbGxvdy5qc29uXFxcIjtcXG5sZXQgaXNQcmVwYXJlID0gZmFsc2U7XFxubGV0IGNvbmZpZ3MsIGN1cnJlbnRDb25maWcgPSB7fSxcXG4gICAgc291cmNlTGlzdCwgY3VycmVudFNvdXJjZSwgc2VhcmNoQWxsb3cgPSBbXTtcXG5cXG5mdW5jdGlvbiBpbml0KGNvbmZpZykge1xcbiAgICBpZighY29uZmlnKSByZXR1cm4gbnVsbDtcXG4gICAgaWYgKCFjb25maWcucGF0aCkgcmV0dXJuIG51bGw7XFxuICAgIHRyeSB7XFxuICAgICAgICBsZXQgZmlsZTtcXG4gICAgICAgIGxldCBzb3VyY2VMaXN0ID0gW107XFxuICAgICAgICBpZiAoY29uZmlnLnBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpICYmIChmaWxlID0gbmV3IGphdmEuaW8uRmlsZShjb25maWcucGF0aC5yZXBsYWNlKFxcXCJmaWxlOi8vXFxcIiwgXFxcIlxcXCIpKSkuaXNEaXJlY3RvcnkoKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5TG9jYWwoZmlsZSk7XFxuICAgICAgICAgICAgY29uZmlnLnR5cGUgPSBcXFwibG9jYWxEaXJcXFwiO1xcbiAgICAgICAgfSBlbHNlIGlmIChjb25maWcucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwczovL2dpdGh1Yi5jb21cXFwiKSkge1xcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKGNvbmZpZy5wYXRoKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJnaXRodWJEaXJcXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhmZXRjaChjb25maWcucGF0aCkpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCAhanNvbi5zaXRlcy5sZW5ndGgpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHNvdXJjZUxpc3QgPSBmaWx0ZXJPdGhlcihqc29uLnNpdGVzKTtcXG4gICAgICAgICAgICBjb25maWcudHlwZSA9IFxcXCJpbmRleFxcXCI7XFxuICAgICAgICB9XFxuICAgICAgICBmaWxlID0gdm9pZCAwO1xcbiAgICAgICAgbGV0IGN1cnJlbnRTb3VyY2UsIHNlYXJjaEFsbG93O1xcbiAgICAgICAgaWYgKGNvbmZpZy5jS2V5KSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBjb25maWcuY0tleSk7XFxuICAgICAgICAgICAgaWYgKCFjdXJyZW50U291cmNlKSB7XFxuICAgICAgICAgICAgICAgIGN1cnJlbnRTb3VyY2UgPSBzb3VyY2VMaXN0WzBdO1xcbiAgICAgICAgICAgICAgICAvL2N1cnJlbnRDb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSA9IHNvdXJjZUxpc3RbMF07XFxuICAgICAgICAgICAgLy9jb25maWcuY0tleSA9IHNvdXJjZUxpc3RbMF0ua2V5O1xcbiAgICAgICAgfVxcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyA9IEpTT04ucGFyc2UoZmV0Y2goc2VhcmNoQWxsb3dQYXRoKSB8fCBcXFwiW11cXFwiKTtcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICBkZWxldGVGaWxlKHNlYXJjaEFsbG93UGF0aCk7XFxuICAgICAgICAgICAgc2VhcmNoQWxsb3cgPSBbXTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgY3VycmVudFNvdXJjZSxcXG4gICAgICAgICAgICBzZWFyY2hBbGxvdyxcXG4gICAgICAgICAgICBzb3VyY2VMaXN0XFxuICAgICAgICB9O1xcbiAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICBsb2coZS50b1N0cmluZygpKTtcXG4gICAgfVxcbiAgICByZXR1cm4gbnVsbDtcXG59XFxuXFxuZnVuY3Rpb24gZ2VuZXJhdGVDb25maWdCeUxvY2FsKGRpckZpbGUpIHtcXG4gICAgbGV0IGxpc3QgPSBkaXJGaWxlLmxpc3RGaWxlcygpO1xcbiAgICBsZXQgcnVsZXMgPSBbXTtcXG4gICAgZm9yIChsZXQgaXQgb2YgbGlzdCkge1xcbiAgICAgICAgbGV0IG5hbWUgPSBTdHJpbmcoaXQuZ2V0TmFtZSgpKTtcXG4gICAgICAgIGxldCBwYXRoID0gaXQuZ2V0UGF0aCgpO1xcbiAgICAgICAgaWYgKCFuYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSB8fCBpdC5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYCR7cGF0aH1gLFxcbiAgICAgICAgfSk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHJ1bGVzO1xcbn1cXG5cXG5mdW5jdGlvbiBnZW5lcmF0ZUNvbmZpZ0J5R2l0aHViKHVybCkge1xcbiAgICAvL3VybD11cmwucmVwbGFjZSgvKCNHSVRIVUIjKSQvLFxcXCJcXFwiKTtcXG4gICAgbGV0IHJvcGUgPSB1cmwuc3BsaXQoXFxcIi9cXFwiKS5zbGljZSgzLCA1KS5qb2luKFxcXCIvXFxcIik7XFxuICAgIGxldCBodG1sID0gZmV0Y2godXJsKTtcXG4gICAgbGV0IGpzb25UZXh0ID0gcGRmaChodG1sLCBcXFwiI3JlcG8tY29udGVudC1wamF4LWNvbnRhaW5lciYmc2NyaXB0JiZIdG1sXFxcIik7XFxuICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XFxuICAgIGxldCBsaXN0ID0ganNvbi5wYXlsb2FkLnRyZWUuaXRlbXM7XFxuICAgIGxldCBydWxlcyA9IFtdO1xcbiAgICBmb3IgKGxldCBpdCBvZiBsaXN0KSB7XFxuICAgICAgICBsZXQgbmFtZSA9IGl0Lm5hbWU7XFxuICAgICAgICBsZXQgcGF0aCA9IGl0LnBhdGg7XFxuICAgICAgICBpZiAoIW5hbWUuZW5kc1dpdGgoXFxcIi5qc1xcXCIpKSBjb250aW51ZTtcXG4gICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoXFxcIi5cXFwiKSk7XFxuICAgICAgICBydWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAna2V5JzogYGhpcHlfanNfJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ25hbWUnOiBgJHtuYW1lfWAsXFxuICAgICAgICAgICAgJ3R5cGUnOiAzLFxcbiAgICAgICAgICAgICdzZWFyY2hhYmxlJzogMSxcXG4gICAgICAgICAgICAncXVpY2tTZWFyY2gnOiAxLFxcbiAgICAgICAgICAgICdmaWx0ZXJhYmxlJzogMSxcXG4gICAgICAgICAgICAnZXh0JzogYGh0dHBzOi8vcmF3LmdpdG1pcnJvci5jb20vJHtyb3BlfS9tYXN0ZXIvJHtwYXRofWAsXFxuICAgICAgICB9KTtcXG4gICAgICAgIC8qXFxuICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaGpkaG54L2hpcHktc2VydmVyL3RyZWUvbWFzdGVyL2FwcC90NC9maWxlcy9kcnB5X2pzXFxuICAgICAgICBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGpkaG54L2hpcHktc2VydmVyL21hc3Rlci9hcHAvdDQvZmlsZXMvZHJweV9qcy8zNjAlRTUlQkQlQjElRTglQTclODYlNUIlRTUlQUUlOTglNUQuanMqL1xcbiAgICB9XFxuICAgIHJldHVybiBydWxlcztcXG59XFxuXFxuZnVuY3Rpb24gcHJlcGFyZShjb25maWcpIHtcXG4gICAgbGV0IGRhdGEgPSBpbml0KGNvbmZpZyk7XFxuICAgIGlmICghZGF0YSkgcmV0dXJuIGZhbHNlO1xcbiAgICBjdXJyZW50U291cmNlID0gZGF0YS5jdXJyZW50U291cmNlO1xcbiAgICBzZWFyY2hBbGxvdyA9IGRhdGEuc2VhcmNoQWxsb3c7XFxuICAgIHNvdXJjZUxpc3QgPSBkYXRhLnNvdXJjZUxpc3Q7XFxuICAgIGN1cnJlbnRDb25maWcgPSBjb25maWc7XFxuICAgIHJldHVybiB0cnVlO1xcbn1cXG5cXG5mdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxufVxcblxcblxcbmZ1bmN0aW9uIGdldEN1cnJlbnRDb25maWcoKSB7XFxuICAgIHJldHVybiBjdXJyZW50Q29uZmlnfHx7fTtcXG59XFxuXFxuZnVuY3Rpb24gc2V0Q3VycmVudENvbmZpZyhjb25maWcpIHtcXG4gICAgbGV0IGNwYXRoID0gKGN1cnJlbnRDb25maWcgfHwge30pLnBhdGg7XFxuICAgIGlmIChwcmVwYXJlKGNvbmZpZykpIHtcXG4gICAgICAgIHN0b3JhZ2UwLnNldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCBjb25maWcpO1xcbiAgICAgICAgaWYgKGNwYXRoICE9IGNvbmZpZy5wYXRoKSB7XFxuICAgICAgICAgICAgZGVsZXRlRmlsZShzZWFyY2hBbGxvd1BhdGgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93ID0gW107XFxuICAgICAgICB9XFxuICAgICAgICBpc1ByZXBhcmUgPSB0cnVlO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICByZXR1cm4gZmFsc2U7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gZmluZFNvdXJjZShrZXkpIHtcXG4gICAgbGV0IHMgPSBzb3VyY2VMaXN0LmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgaWYgKHMpIHtcXG4gICAgICAgIHMuZXh0ID0gZ2V0QWJzb2x1dGVQYXRoKFN0cmluZyhzLmV4dCkpO1xcbiAgICB9XFxuICAgIHJldHVybiBzO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDdXJyZW50U291cmNlKCkge1xcbiAgICByZXR1cm4gY3VycmVudFNvdXJjZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0Q3VycmVudFNvdXJjZVBhdGgoKSB7XFxuICAgIGxldCBwYXRoID0gU3RyaW5nKGN1cnJlbnRTb3VyY2UuZXh0KTtcXG4gICAgcmV0dXJuIGdldEFic29sdXRlUGF0aChwYXRoKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWJzb2x1dGVQYXRoKHBhdGgpIHtcXG4gICAgcGF0aCA9IFN0cmluZyhwYXRoKTtcXG4gICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpIHx8IHBhdGguc3RhcnRzV2l0aChcXFwiZmlsZTovL1xcXCIpKSB7XFxuICAgICAgICByZXR1cm4gcGF0aDtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHJldHVybiBqb2luVXJsKGN1cnJlbnRDb25maWcucGF0aCwgcGF0aCk7XFxuICAgIH1cXG59XFxuXFxuZnVuY3Rpb24gc2V0Q3VycmVudFNvdXJjZShrZXkpIHtcXG4gICAgbGV0IHNvdXJjZSA9IHNvdXJjZUxpc3QuZmluZCh2ID0+IHYua2V5ID09PSBrZXkpO1xcbiAgICBpZiAoc291cmNlKSB7XFxuICAgICAgICBjdXJyZW50Q29uZmlnLmNLZXkgPSBrZXk7XFxuICAgICAgICBzdG9yYWdlMC5zZXRJdGVtKFxcXCJjdXJyZW50Q29uZmlnXFxcIiwgY3VycmVudENvbmZpZyk7XFxuICAgICAgICBjdXJyZW50U291cmNlID0gc291cmNlO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgIH1cXG4gICAgcmV0dXJuIGZhbHNlO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXRDYW5TZWFyY2hTb3VyY2UoKSB7XFxuICAgIHJldHVybiBzb3VyY2VMaXN0LmZpbHRlcih2ID0+IHYuc2VhcmNoYWJsZSA9PT0gdW5kZWZpbmVkIHx8IHYuc2VhcmNoYWJsZSk7XFxufVxcblxcbmZ1bmN0aW9uIGdldEFsbFNvdXJjZSgpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3Quc2xpY2UoKTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0QWxsU291cmNlcygpIHtcXG4gICAgcmV0dXJuIHNvdXJjZUxpc3Q7XFxufVxcblxcbmZ1bmN0aW9uIGdldFNlYXJjaEFsbG93KCkge1xcbiAgICByZXR1cm4gc2VhcmNoQWxsb3c7XFxufVxcblxcbmZ1bmN0aW9uIHNldFNlYXJjaEFsbG93KCkge1xcbiAgICBpZiAoQXJyYXkuaXNBcnJheShzZWFyY2hBbGxvdykpIHtcXG4gICAgICAgIHNhdmVGaWxlKHNlYXJjaEFsbG93UGF0aCwgSlNPTi5zdHJpbmdpZnkoc2VhcmNoQWxsb3cpKTtcXG4gICAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRBbGxvd1NlYXJjaFNvdXJjZSgpIHtcXG4gICAgbGV0IHNsaXN0O1xcbiAgICBpZiAoc2VhcmNoQWxsb3cubGVuZ3RoKSB7XFxuICAgICAgICBzbGlzdCA9IHNvdXJjZUxpc3QuZmlsdGVyKHYgPT4gc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpKTtcXG4gICAgfSBlbHNlIHtcXG4gICAgICAgIHNsaXN0ID0gc291cmNlTGlzdC5maWx0ZXIodiA9PiB2LnNlYXJjaGFibGUpO1xcbiAgICB9XFxuICAgIGlmIChzbGlzdC5sZW5ndGggPT0gMCkge1xcbiAgICAgICAgc2xpc3QgPSBzb3VyY2VMaXN0LnNsaWNlKCk7XFxuICAgIH1cXG4gICAgcmV0dXJuIHNsaXN0O1xcbn1cXG5cXG5mdW5jdGlvbiBpc1ByZXBhcmVkKCkge1xcbiAgICByZXR1cm4gaXNQcmVwYXJlO1xcbn1cXG5cXG5pc1ByZXBhcmUgPSBwcmVwYXJlKHN0b3JhZ2UwLmdldEl0ZW0oXFxcImN1cnJlbnRDb25maWdcXFwiLCB7fSkpO1xcbiQuZXhwb3J0cyA9IHtcXG4gICAgcHJlcGFyZSxcXG4gICAgZ2V0Q3VycmVudENvbmZpZyxcXG4gICAgc2V0Q3VycmVudENvbmZpZyxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZSxcXG4gICAgZ2V0Q3VycmVudFNvdXJjZVBhdGgsXFxuICAgIHNldEN1cnJlbnRTb3VyY2UsXFxuICAgIGdldENhblNlYXJjaFNvdXJjZSxcXG4gICAgZ2V0U2VhcmNoQWxsb3csXFxuICAgIHNldFNlYXJjaEFsbG93LFxcbiAgICBnZXRBbGxTb3VyY2UsXFxuICAgIGdldEFsbG93U2VhcmNoU291cmNlLFxcbiAgICBpc1ByZXBhcmVkLFxcbiAgICBnZXRBYnNvbHV0ZVBhdGgsXFxuICAgIGdldEFsbFNvdXJjZXMsXFxuICAgIGZpbmRTb3VyY2VcXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi57yW6L6R6YWN572uXCIsXCJwYXRoXCI6XCJjcmVhdGVDb25maWdcIixcInJ1bGVcIjpcImpzOlxcbmxldCBsYXlvdXQgPSBbXTtcXG5zZXRQYWdlVGl0bGUoXFxcIuWIm+W7uumFjee9rlxcXCIpO1xcbmxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxubGV0IGN1cnJlbnRjb25maWcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKTtcXG5sZXQgZiA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmFkZExpc3RlbmVyKFxcXCJvbkNsb3NlXFxcIiwgKCkgPT4ge1xcbiAgY2xlYXJNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIik7XFxuICBjbGVhck15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiKTtcXG59KTtcXG5cXG4vL+WOhuWPsumFjee9ruiusOW9lVxcbmZ1bmN0aW9uIHVuaXF1ZUFycmF5QnlQcm9wZXJ0eShhcnJheSwgcHJvcGVydHkpIHtcXG4gIGxldCB1bmlxdWUgPSBbXTtcXG4gIGxldCBtYXAgPSBuZXcgTWFwKCk7XFxuICBmb3IgKGxldCBpdGVtIG9mIGFycmF5KSB7XFxuICAgIGxldCBrZXkgPSBpdGVtW3Byb3BlcnR5XTtcXG4gICAgaWYgKCFtYXAuaGFzKGtleSkpIHtcXG4gICAgICBtYXAuc2V0KGtleSwgdHJ1ZSk7XFxuICAgICAgdW5pcXVlLnB1c2goaXRlbSk7XFxuICAgIH1cXG4gIH1cXG4gIHJldHVybiB1bmlxdWU7XFxufVxcbmxldCBjcGF0aCA9IFxcXCJoaWtlcjovL2ZpbGVzL2NhY2hlL1xcXCIgKyBcXFwiZHJweWNvbmZpZy5qc29uXFxcIjtcXG5sZXQgcGF0aGNvbmZpZ3MgPSBbXTtcXG50cnkge1xcbiAgcGF0aGNvbmZpZ3MgPSBKU09OLnBhcnNlKHJlYWRGaWxlKGNwYXRoKSkgfHwgW107XFxuICAvL3B1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnc1xcXCIscGF0aGNvbmZpZ3MpO1xcbn0gY2F0Y2ggKGUpIHtcXG4gIGNvbnNvbGUubG9nKGUubWVzc2FnZSk7XFxufVxcbnBhdGhjb25maWdzID0gdW5pcXVlQXJyYXlCeVByb3BlcnR5KHBhdGhjb25maWdzLCBcXFwicGF0aFxcXCIpO1xcbi8vbG9nKHBhdGhjb25maWdzKVxcblxcbmxldCBjb25maWdzX29iaiA9IHtcXG4gIHBhdGg6IGNwYXRoLFxcbiAgY29uZmlnczogcGF0aGNvbmZpZ3NcXG59XFxuLy/ljoblj7LphY3nva7orrDlvZVcXG5cXG5sYXlvdXQucHVzaCh7XFxuICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gIGRlc2M6IFxcXCLphY3nva7lkI3np7Ao5b+F5aGrKSAg6Lev5b6E5ZKM5paH5Lu25aS56YCJ5LqM6YCJ5LiAXFxcIixcXG4gIGV4dHJhOiB7XFxuICAgIHRpdGxlVmlzaWJsZTogZmFsc2UsXFxuICAgIGRlZmF1bHRWYWx1ZTogXFxcIlxcXCIsXFxuICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19uYW1lXFxcIiwgaW5wdXQpO1xcbiAgICB9KSxcXG4gICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiXFxuICB9XFxufSk7XFxuXFxubGV0IHNlbGVjdF9tb2RlID0gZ2V0SXRlbShcXFwic2VsZWN0X2NvbmZpZ19tb2RlXFxcIiwgXFxcIjBcXFwiKTtcXG5sZXQgbmF2ID0gW1xcXCLot6/lvoQvVVJMXFxcIiwgXFxcIuaWh+S7tuWkuVxcXCJdO1xcblxcbm5hdi5mb3JFYWNoKCh4LCBpKSA9PiB7XFxuICBsYXlvdXQucHVzaCh7XFxuICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIChpID09IHNlbGVjdF9tb2RlID8geC5mb250Y29sb3IoXFxcIiMxNUI3NkNcXFwiKSA6IHgpLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGkpID0+IHtcXG4gICAgICBzZXRJdGVtKFxcXCJzZWxlY3RfY29uZmlnX21vZGVcXFwiLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgfSwgaSksXFxuICAgIGNvbF90eXBlOiAnc2Nyb2xsX2J1dHRvbicsXFxuICB9KVxcbn0pXFxuXFxuXFxubGV0IHBhdGggPSBqb2luVXJsKGdldFBhdGgoXFxcImhpa2VyOi8vZmlsZXMvXFxcIiksIFxcXCIuLi9cXFwiLnJlcGVhdCg1KSkuc2xpY2UoNyk7XFxuXFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIwXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfcGF0aFxcXCIpLmV4dHJhO1xcbiAgICAgICAgdXBkYXRlSXRlbShcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwge1xcbiAgICAgICAgICBleHRyYTogT2JqZWN0LmFzc2lnbih0YXJnZXQsIHtcXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IFBBVEhcXG4gICAgICAgICAgfSlcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgfSksXFxuICAgICAgcm9vdERpclBhdGg6IHBhdGgsXFxuICAgICAgaW5pdGlhbFBhdGg6IHBhdGgsXFxuICAgICAgcGF0dGVybjogMCxcXG4gICAgICBmaWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIumFjee9rui3r+W+hC9VUkwg5pys5Zyw6YCJ5oupaW5kZXguanNvblxcXCIsXFxuICAgIGV4dHJhOiB7XFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBvbkNoYW5nZTogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBwdXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgaW5wdXQpO1xcbiAgICAgIH0pLFxcbiAgICAgIGlkOiBcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIlxcbiAgICB9XFxuICB9KTtcXG59XFxuaWYgKHNlbGVjdF9tb2RlID09IFxcXCIxXFxcIikge1xcbiAgbGF5b3V0LnB1c2goe1xcbiAgICB0aXRsZTogXFxcIumAieaLqVxcXCIsXFxuICAgIHVybDogSlNPTi5zdHJpbmdpZnkoZi5maWxlU2VsZWN0aW9uVXJpKHtcXG4gICAgICBjYWxsYmFjazogJC50b1N0cmluZygoKSA9PiB7XFxuICAgICAgICBsZXQgdGFyZ2V0ID0gZmluZEl0ZW0oXFxcImRycHlIaWtlcl9jb25maWdfZm9sZGVyXFxcIikuZXh0cmE7XFxuICAgICAgICB1cGRhdGVJdGVtKFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCIsIHtcXG4gICAgICAgICAgZXh0cmE6IE9iamVjdC5hc3NpZ24odGFyZ2V0LCB7XFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBQQVRIXFxuICAgICAgICAgIH0pXFxuICAgICAgICB9KTtcXG4gICAgICAgIHJldHVybiB0cnVlO1xcbiAgICAgIH0pLFxcbiAgICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICAgIGluaXRpYWxQYXRoOiBwYXRoLFxcbiAgICAgIHBhdHRlcm46IDEsXFxuICAgICAgLy9maWxlVHlwZTogXFxcIi5qc29uXFxcIixcXG4gICAgfSkpLFxcbiAgICBjb2xfdHlwZTogXFxcImlucHV0XFxcIixcXG4gICAgZGVzYzogXFxcIumFjee9ruaWh+S7tuWkuei3r+W+hCDpgInmi6lkcnB5X2pz55uu5b2VXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICBkZWZhdWx0VmFsdWU6IFxcXCJcXFwiLFxcbiAgICAgIG9uQ2hhbmdlOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHB1dE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX3BhdGhcXFwiLCBpbnB1dCk7XFxuICAgICAgfSksXFxuICAgICAgaWQ6IFxcXCJkcnB5SGlrZXJfY29uZmlnX2ZvbGRlclxcXCJcXG4gICAgfVxcbiAgfSk7XFxufVxcbmxheW91dC5wdXNoKHtcXG4gIGNvbF90eXBlOiBcXFwibGluZV9ibGFua1xcXCJcXG59KTtcXG5sYXlvdXQucHVzaCh7XFxuICB0aXRsZTogXFxcIuehruiupFxcXCIsXFxuICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoKGNvYmopID0+IHtcXG4gICAgbGV0IHBhdGggPSBnZXRNeVZhcihcXFwiZHJweUhpa2VyX2NvbmZpZ19wYXRoXFxcIiwgXFxcIlxcXCIpO1xcbiAgICBsZXQgbmFtZSA9IGdldE15VmFyKFxcXCJkcnB5SGlrZXJfY29uZmlnX25hbWVcXFwiLCBcXFwiXFxcIik7XFxuICAgIGlmICghKHBhdGggJiYgbmFtZSkpIHtcXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5LiN5Y+v5Li656m6XFxcIjtcXG4gICAgfVxcbiAgICBwYXRoID0gcGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBwYXRoIDogcGF0aC5zdGFydHNXaXRoKFxcXCIvXFxcIikgPyAoXFxcImZpbGU6Ly9cXFwiICsgcGF0aCkgOiBwYXRoO1xcbiAgICAvL2xvZyhwYXRoKVxcbiAgICB0cnkge1xcbiAgICAgIGxldCBydW50aW1lQ29uZmlnID0gR00uZGVmaW5lTW9kdWxlKFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgaWYgKHBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo5Yqg6L296YWN572uLi4uXFxcIik7XFxuICAgICAgfVxcblxcbiAgICAgIGlmIChydW50aW1lQ29uZmlnLnNldEN1cnJlbnRDb25maWcoe1xcbiAgICAgICAgcGF0aCxcXG4gICAgICAgIG5hbWUsXFxuICAgICAgfSkpIHtcXG4gICAgICAgIGNvYmouY29uZmlncy5wdXNoKHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZSxcXG4gICAgICAgIH0pXFxuICAgICAgICBjbGVhckl0ZW0oXFxcIm5vX2xvYWRpbmdcXFwiKTtcXG4gICAgICAgIHNhdmVGaWxlKGNvYmoucGF0aCwgSlNPTi5zdHJpbmdpZnkoY29iai5jb25maWdzKSk7XFxuICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgIGxldCBEcnB5TWFuYWdlID0gR00uZGVmaW5lTW9kdWxlKFxcXCJEcnB5TWFuYWdlXFxcIik7XFxuICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKCk7XFxuICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgIH1cXG4gICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6YWN572u5paH5Lu25pyJ6K+vXFxcIjtcXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9cXFwiICsgZS50b1N0cmluZygpO1xcbiAgICB9ZmluYWxseXtcXG4gICAgICBoaWRlTG9hZGluZygpO1xcbiAgICB9XFxuICB9LCBjb25maWdzX29iaiksXFxuICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiLFxcbn0pO1xcblxcbmlmIChwYXRoY29uZmlncy5sZW5ndGgpIHtcXG4gIGxheW91dC5wdXNoKHtcXG4gICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgXFxcIjxzbWFsbD7ljoblj7LphY3nva7orrDlvZUg54K55oiR6L+b6KGM6YWN572u5qOA6aqMPC9zbWFsbD5cXFwiLFxcbiAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKHApID0+IHtcXG4gICAgICAvL2xvZyhwKVxcbiAgICAgIGZ1bmN0aW9uIHVuaXF1ZShhcnIpIHtcXG4gICAgICAgIGNvbnN0IHJlcyA9IG5ldyBNYXAoKTtcXG4gICAgICAgIHJldHVybiBhcnIuZmlsdGVyKChhKSA9PiAhcmVzLmhhcyhhKSAmJiByZXMuc2V0KGEsIDEpKVxcbiAgICAgIH1cXG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xcbiAgICAgIGlmIChwLmxlbmd0aCA9PSAwKSB7XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5peg5Zyw5Z2AXFxcIjtcXG4gICAgICB9XFxuICAgICAgbGlzdCA9IHAubWFwKHggPT4geC5wYXRoKTtcXG4gICAgICB2YXIgdGFzayA9IGZ1bmN0aW9uKG9iaikge1xcbiAgICAgICAgbGV0IHMgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGpzRmlsZXMgPSBbXTtcXG4gICAgICAgIGxldCBjb3VudCA9IDA7XFxuXFxuICAgICAgICBmdW5jdGlvbiBmaWx0ZXJPdGhlcihsaXN0KSB7XFxuICAgICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihpdCA9PiBTdHJpbmcoaXQuYXBpKS5pbmNsdWRlcyhcXFwiZHJweTIubWluLmpzXFxcIikgfHwgU3RyaW5nKGl0LmFwaSkuaW5jbHVkZXMoXFxcImRycHkyLmpzXFxcIikpXFxuICAgICAgICB9XFxuICAgICAgICBpZiAob2JqLnVybC5zdGFydHNXaXRoKFxcXCJmaWxlOlxcXCIpKSB7XFxuICAgICAgICAgIGxldCBjb2RlID0gXFxcIm5vXFxcIjtcXG4gICAgICAgICAgbGV0IHBhdGggPSBvYmoudXJsLnJlcGxhY2UoXFxcImZpbGU6Ly9cXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICAgIGxldCBkaXIgPSBuZXcgamF2YS5pby5GaWxlKHBhdGgpO1xcbiAgICAgICAgICBpZiAoZGlyLmlzRGlyZWN0b3J5KCkpIHtcXG4gICAgICAgICAgICBsZXQgZmxpc3QgPSBkaXIubGlzdEZpbGVzKCk7XFxuICAgICAgICAgICAgZm9yICh2YXIgZiBvZiBmbGlzdCkge1xcbiAgICAgICAgICAgICAgLy8g5qOA5p+l5paH5Lu25ZCN5piv5ZCm5LulLmpz57uT5bC+XFxuICAgICAgICAgICAgICBpZiAoZi5pc0ZpbGUoKSAmJiBmLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkge1xcbiAgICAgICAgICAgICAgICBqc0ZpbGVzLnB1c2goZik7XFxuICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChkaXIuaXNGaWxlKCkgJiYgZmlsZUV4aXN0KG9iai51cmwpKSB7XFxuICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgIGpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlKG9iai51cmwpKTtcXG4gICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGpzb24uc2l0ZXMpIHx8IGpzb24uc2l0ZXMubGVuZ3RoKSB7XFxuICAgICAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgY29kZSA9IFxcXCJva1xcXCI7XFxuICAgICAgICAgIH1cXG4gICAgICAgICAgaWYgKGpzRmlsZXMubGVuZ3RoID49IDUpIHtcXG4gICAgICAgICAgICBjb3VudCA9IGpzRmlsZXMubGVuZ3RoO1xcbiAgICAgICAgICAgIGNvZGUgPSBcXFwib2tcXFwiO1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIHJldHVybiB7XFxuICAgICAgICAgICAgdGltZTogKERhdGUubm93KCkgLSBzKSxcXG4gICAgICAgICAgICB1cmw6IG9iai51cmwsXFxuICAgICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICAgIGNvZGU6IGNvZGUsXFxuICAgICAgICAgICAgaW5kZXg6IG9iai5pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIHZhciBqID0gSlNPTi5wYXJzZShmZXRjaChvYmoudXJsLCB7XFxuICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICB0aW1lb3V0OiA1MDAwLFxcbiAgICAgICAgfSkpO1xcbiAgICAgICAgbGV0IGUgPSBEYXRlLm5vdygpO1xcbiAgICAgICAgbGV0IGMgPSBlIC0gcztcXG4gICAgICAgIGlmIChvYmoudXJsLmluY2x1ZGVzKFxcXCJnaXRodWIuY29tXFxcIikgJiYgai5zdGF0dXNDb2RlID09IDIwMCkge1xcbiAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIHZhciBodG1sID0gai5ib2R5O1xcbiAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5wYXJzZShwZGZoKGh0bWwsIFxcXCIjcmVwby1jb250ZW50LXBqYXgtY29udGFpbmVyJiZzY3JpcHQmJkh0bWxcXFwiKSk7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBqc29uLnBheWxvYWQudHJlZS5pdGVtcztcXG4gICAgICAgICAgICBjb3VudCA9IGxpc3QuZmlsdGVyKHggPT4geC5uYW1lLmVuZHNXaXRoKFxcXCIuanNcXFwiKSkubGVuZ3RoO1xcbiAgICAgICAgICB9IGNhdGNoIHt9XFxuICAgICAgICB9XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UodG9Db3JyZWN0SlNPTlN0cmluZyhqLmJvZHkpIHx8IFxcXCJ7fVxcXCIpO1xcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShqc29uLnNpdGVzKSB8fCBqc29uLnNpdGVzLmxlbmd0aCkge1xcbiAgICAgICAgICAgIGNvdW50ID0gZmlsdGVyT3RoZXIoanNvbi5zaXRlcykubGVuZ3RoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcblxcbiAgICAgICAgcmV0dXJuIHtcXG4gICAgICAgICAgdGltZTogYyxcXG4gICAgICAgICAgdXJsOiBqLnVybCxcXG4gICAgICAgICAgY291bnQ6IGNvdW50LFxcbiAgICAgICAgICBjb2RlOiBqLnN0YXR1c0NvZGUsXFxuICAgICAgICAgIGluZGV4OiBvYmouaSxcXG4gICAgICAgIH1cXG4gICAgICB9O1xcbiAgICAgIGxldCB0YXNrcyA9IGxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgICAgICBpID0gaSArIDE7XFxuICAgICAgICByZXR1cm4ge1xcbiAgICAgICAgICBmdW5jOiB0YXNrLFxcbiAgICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICAgIHVybDogeCxcXG4gICAgICAgICAgICBpOiBpIC0gMSxcXG4gICAgICAgICAgfSxcXG4gICAgICAgICAgaWQ6ICd0YXNraWQnICsgaVxcbiAgICAgICAgfVxcbiAgICAgIH0pO1xcbiAgICAgIHZhciBjb3VudCA9IHN1Y2Nlc3MgPSB0YXNrcy5sZW5ndGg7XFxuICAgICAgYmUodGFza3MsIHtcXG4gICAgICAgIGZ1bmM6IGZ1bmN0aW9uKG9iaiwgaWQsIGVycm9yLCB0YXNrUmVzdWx0KSB7XFxuICAgICAgICAgIG9iai5yZXN1bHRzLnB1c2godGFza1Jlc3VsdClcXG4gICAgICAgICAgY291bnQgPSBjb3VudCAtIDE7XFxuICAgICAgICAgIGlmIChjb3VudCA+IDApIHtcXG4gICAgICAgICAgICBzaG93TG9hZGluZyhcXFwi5qOA5rWL5LitLi4u5Ymp5L2Z5Zyw5Z2A77yaXFxcIiArIGNvdW50KVxcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIH1cXG4gICAgICAgIH0sXFxuICAgICAgICBwYXJhbToge1xcbiAgICAgICAgICBoaTogJ2NjYycsXFxuICAgICAgICAgIHJlc3VsdHM6IHJlc3VsdHNcXG4gICAgICAgIH1cXG4gICAgICB9LCBzdWNjZXNzKTtcXG4gICAgICAvL2xvZyhyZXN1bHRzKVxcbiAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmZpbHRlcihmID0+IGYpO1xcbiAgICAgIHJlc3VsdHMuZm9yRWFjaCgoeCwgaSkgPT4ge1xcbiAgICAgICAgbGV0IGl0ZW0gPSBmaW5kSXRlbShcXFwicGF0aFxcXCIgKyB4LmluZGV4KTtcXG4gICAgICAgIGxldCByZWdleCA9IC8o5ZCN56ewOi4qPykoXFxcXHMrKT9cXFxcbi9nO1xcbiAgICAgICAgbGV0IHRpdGxlID0gXFxcIuWQjeensDpcXFwiICsgcFt4LmluZGV4XS5uYW1lICsgXFxcIiBcXFwiO1xcbiAgICAgICAgbGV0IHVybCA9IHBbeC5pbmRleF0ucGF0aDtcXG4gICAgICAgIGxldCBtc2cgPSBcXFwiXFxcIjtcXG4gICAgICAgIGxldCBjb3VudCA9IHguY291bnQgIT0gMCA/IFxcXCIg5rqQ5pWw6YePOlxcXCIgKyB4LmNvdW50IDogXFxcIlxcXCI7XFxuICAgICAgICBpZiAoL25vLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLphY3nva7mnInor69cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14oLTF8MHw0MDQpLy50ZXN0KHguY29kZSkpIHtcXG4gICAgICAgICAgbXNnID0gaXRlbS50aXRsZS5yZXBsYWNlKHJlZ2V4LCB0aXRsZSArIFxcXCLml6Dms5Xorr/pl65cXFwiLmZvbnRjb2xvcihcXFwicmVkXFxcIikgKyBcXFwiXFxcXG5cXFwiKTtcXG4gICAgICAgIH0gZWxzZSBpZiAoL14yMDAvLnRlc3QoeC5jb2RlKSkge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumAmuiur+ato+W4uFxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBcXFwiICDlu7bov586XFxcIiArIHgudGltZSArIGNvdW50ICsgXFxcIlxcXFxuXFxcIik7XFxuICAgICAgICAgIC8vdXJsID0gaXRlbS51cmw7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBtc2cgPSBpdGVtLnRpdGxlLnJlcGxhY2UocmVnZXgsIHRpdGxlICsgXFxcIumFjee9ruato+ehrlxcXCIuZm9udGNvbG9yKFxcXCIjM0NCMzcxXFxcIikgKyBjb3VudCArIFxcXCJcXFxcblxcXCIpO1xcbiAgICAgICAgICAvL3VybCA9IGl0ZW0udXJsO1xcbiAgICAgICAgfVxcbiAgICAgICAgdXBkYXRlSXRlbShpdGVtLmV4dHJhLmlkLCB7XFxuICAgICAgICAgIHRpdGxlOiBtc2csXFxuICAgICAgICAgIC8vdXJsOiB1cmwsXFxuICAgICAgICB9KVxcbiAgICAgIH0pO1xcbiAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCJcXG4gICAgfSwgcGF0aGNvbmZpZ3MpLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICB9KVxcbiAgcGF0aGNvbmZpZ3MuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xcbiAgICBsZXQgbG9uZ0MgPSBbe1xcbiAgICAgIHRpdGxlOiBcXFwi5ZCN56ewXFxcIixcXG4gICAgICBqczogJC50b1N0cmluZygoaXRlbSwgcCwgYykgPT4ge1xcbiAgICAgICAgbGV0IGkgPSBjLmZpbmRJbmRleCh4ID0+IHgubmFtZSA9PSBpdGVtLm5hbWUpO1xcbiAgICAgICAgaWYgKGkgIT0gLTEpIHtcXG4gICAgICAgICAgcmV0dXJuICQoY1tpXS5uYW1lLCBcXFwi6L6T5YWl5paw5ZCN56ewXFxcIikuaW5wdXQoKGMsIHAsIGkpID0+IHtcXG4gICAgICAgICAgICBjW2ldLm5hbWUgPSBpbnB1dDtcXG4gICAgICAgICAgICBzYXZlRmlsZShwLCBKU09OLnN0cmluZ2lmeShjKSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgfSwgYywgcCwgaSlcXG4gICAgICAgIH1cXG4gICAgICB9LCBpdGVtLCBjcGF0aCwgcGF0aGNvbmZpZ3MpXFxuICAgIH0sIHtcXG4gICAgICB0aXRsZTogXFxcIui3r+W+hFxcXCIsXFxuICAgICAganM6ICQudG9TdHJpbmcoKGl0ZW0sIHAsIGMpID0+IHtcXG4gICAgICAgIGxldCBpID0gYy5maW5kSW5kZXgoeCA9PiB4Lm5hbWUgPT0gaXRlbS5uYW1lKTtcXG4gICAgICAgIGlmIChpICE9IC0xKSB7XFxuICAgICAgICAgIHJldHVybiAkKGNbaV0ucGF0aCwgXFxcIui+k+WFpeaWsOi3r+W+hFxcXCIpLmlucHV0KChjLCBwLCBpKSA9PiB7XFxuICAgICAgICAgICAgY1tpXS5wYXRoID0gaW5wdXQ7XFxuICAgICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIH0sIGMsIHAsIGkpXFxuICAgICAgICB9XFxuICAgICAgfSwgaXRlbSwgY3BhdGgsIHBhdGhjb25maWdzKVxcbiAgICB9LCB7XFxuICAgICAgdGl0bGU6IFxcXCLliKDpmaRcXFwiLFxcbiAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtLCBwLCBjKSA9PiB7XFxuICAgICAgICBsZXQgaSA9IGMuZmluZEluZGV4KHggPT4geC5uYW1lID09IGl0ZW0ubmFtZSk7XFxuICAgICAgICBpZiAoaSAhPSAtMSkge1xcbiAgICAgICAgICBjLnNwbGljZShpLCAxKTtcXG4gICAgICAgICAgc2F2ZUZpbGUocCwgSlNPTi5zdHJpbmdpZnkoYykpO1xcbiAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0sIGNwYXRoLCBwYXRoY29uZmlncylcXG4gICAgfV1cXG4gICAgaWYgKGl0ZW0ucGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICBsb25nQy5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi6K6/6ZeuXFxcIixcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKChpdGVtKSA9PiB7XFxuICAgICAgICAgIGlmIChpdGVtLnBhdGguc3RhcnRzV2l0aChcXFwiaHR0cFxcXCIpKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ3ZWI6Ly9cXFwiICsgaXRlbS5wYXRoO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LCBpdGVtKVxcbiAgICAgIH0pXFxuICAgIH1cXG4gICAgbGV0IGN1cnJlbnQgPSBcXFwiXFxcIjtcXG4gICAgaWYgKGN1cnJlbnRjb25maWcgJiYgY3VycmVudGNvbmZpZy5oYXNPd25Qcm9wZXJ0eShcXFwicGF0aFxcXCIpKSB7XFxuICAgICAgaWYgKGl0ZW0ucGF0aCA9PSBjdXJyZW50Y29uZmlnLnBhdGgpIHtcXG4gICAgICAgIGN1cnJlbnQgPSBcXFwi4p6h77iPXFxcIjtcXG4gICAgICB9XFxuICAgIH1cXG4gICAgbGF5b3V0LnB1c2goe1xcbiAgICAgIHRpdGxlOiAn4oCc4oCc4oCd4oCdJyArIFxcXCI8c21hbGw+XFxcIiArIGN1cnJlbnQgKyBcXFwi5ZCN56ewOlxcXCIgKyBpdGVtLm5hbWUgKyBcXFwiXFxcXG7ot6/lvoQ6XFxcIiArIGl0ZW0ucGF0aCArIFxcXCI8L3NtYWxsPlxcXCIsXFxuICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKGl0ZW0gPT4ge1xcbiAgICAgICAgY2xlYXJJdGVtKFxcXCJub19sb2FkaW5nXFxcIik7XFxuICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgbGV0IHtcXG4gICAgICAgICAgcGF0aCxcXG4gICAgICAgICAgbmFtZVxcbiAgICAgICAgfSA9IGl0ZW07XFxuICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikpIHtcXG4gICAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOWKoOi9vemFjee9ri4uLlxcXCIpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudENvbmZpZyh7XFxuICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgIG5hbWUsXFxuICAgICAgICB9KSkge1xcbiAgICAgICAgICBiYWNrKGZhbHNlKTtcXG4gICAgICAgICAgbGV0IERycHlNYW5hZ2UgPSBHTS5kZWZpbmVNb2R1bGUoXFxcIkRycHlNYW5hZ2VcXFwiKTtcXG4gICAgICAgICAgRHJweU1hbmFnZS5jbGVhcigpO1xcbiAgICAgICAgICAkLnJlcXVpcmUoXFxcIkNoYW5nZVNvdXJjZVBvcFxcXCIpLnNob3coMTAwKTtcXG4gICAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLlpLHotKVcXFwiO1xcbiAgICAgICAgfVxcbiAgICAgIH0sIGl0ZW0pLFxcbiAgICAgIGNvbF90eXBlOiBcXFwidGV4dF8xXFxcIixcXG4gICAgICBleHRyYToge1xcbiAgICAgICAgaWQ6ICdwYXRoJyArIGksXFxuICAgICAgICBsb25nQ2xpY2s6IGxvbmdDXFxuICAgICAgfVxcbiAgICB9KVxcbiAgfSlcXG59XFxuXFxuXFxuc2V0UmVzdWx0KGxheW91dCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjaLmupDlvLnnqpdcIixcInBhdGhcIjpcIkNoYW5nZVNvdXJjZVBvcFwiLFwicnVsZVwiOlwiJC5leHBvcnRzLnNob3cgPSBmdW5jdGlvbiAodGltZSkge1xcbiAgaWYgKHRpbWUpIHtcXG4gICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCh0aW1lKTtcXG4gIH1cXG4gIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpO1xcbiAgbGV0IG5hbWUgPSBzb3VyY2UgPyBzb3VyY2UubmFtZSA6IFxcXCJcXFwiO1xcbiAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gIGxldCBzb3VyY2VOYW1lTGlzdCA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCkubWFwKHYgPT4ge1xcbiAgICByZXR1cm4gdi5uYW1lID09IG5hbWUgPyBcXFwi4oCY4oCYXFxcIiArIHYubmFtZSArIFxcXCLigJnigJlcXFwiIDogdi5uYW1lO1xcbiAgfSk7XFxuICBoaWtlclBvcC5zZXRVc2VTdGFydEFjdGl2aXR5KGZhbHNlKTtcXG4gIGZ1bmN0aW9uIG5hdHVyYWxTb3J0KGEsIGIpIHtcXG4gICAgYSA9IGEucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpO1xcbiAgICBiID0gYi5yZXBsYWNlKC9b4oCZ4oCYXS9nLCBcXFwiXFxcIik7XFxuICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYiwgdW5kZWZpbmVkLCB7XFxuICAgICAgbnVtZXJpYzogdHJ1ZSxcXG4gICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgIH0pO1xcbiAgfVxcblxcbiAgbGV0IHNwZW4gPSAzO1xcbiAgbGV0IGl0ZW1zID0gc291cmNlTmFtZUxpc3QubWFwKCh4LCBpKSA9PiB7XFxuICAgIHJldHVybiB7XFxuICAgICAgdGl0bGU6IHgsXFxuICAgICAgdXJsOiBpXFxuICAgIH1cXG4gIH0pXFxuXFxuICBsZXQgbmFtZXMgPSBpdGVtcy5tYXAodiA9PiB2LnRpdGxlKTtcXG4gIGxldCBzbmFtZSA9IG5hbWVzLnNsaWNlKCk7XFxuICBpZiAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSkge1xcbiAgICBuYW1lcyA9IG5hbWVzLnNvcnQobmF0dXJhbFNvcnQpO1xcbiAgfVxcbiAgbGV0IG1hbmFnZV9hbGwgPSBuYW1lcy5zbGljZSgpO1xcbiAgbGV0IHNlYXJjaEtleSA9IFxcXCJcXFwiO1xcbiAgaGlrZXJQb3Auc2VsZWN0Qm90dG9tUmVzKHtcXG4gICAgb3B0aW9uczogbmFtZXMsXFxuICAgIGNvbHVtbnM6IHNwZW4sXFxuICAgIHRpdGxlOiBcXFwi6YCJ5oup6KeG6aKR5rqQXFxcIiArIFxcXCLlvZPliY3lhbE6XFxcIiArIGl0ZW1zLmxlbmd0aCArIFxcXCLkuKrop4bpopHmupBcXFwiLFxcbiAgICAvL25vQXV0b0Rpc21pc3M6IHRydWUsXFxuICAgIHBvc2l0aW9uOiAxLFxcbiAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgaGludDogXFxcIua6kOWFs+mUruWtl1xcXCIsXFxuICAgICAgdGl0bGU6IFxcXCJva1xcXCIsXFxuICAgICAgb25DaGFuZ2UodGV4dCwgbWFuYWdlKSB7XFxuICAgICAgICAvL2xvZyhcXFwib25DaGFuZ2U6XFxcIit0ZXh0KVxcbiAgICAgICAgbGV0IGZsaXN0ID0gbmFtZXMuZmlsdGVyKHggPT4geC5pbmNsdWRlcyh0ZXh0KSk7XFxuICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgZmxpc3QuZm9yRWFjaCh4ID0+IHtcXG4gICAgICAgICAgbWFuYWdlLmxpc3QucHVzaCh4KTtcXG4gICAgICAgIH0pO1xcbiAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgIH0sXFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vdG9hc3Qocyk7XFxuICAgICAgICAvL2xvZyhtYW5hZ2UubGlzdCk7XFxuICAgICAgfSxcXG4gICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgIH0pLFxcbiAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG4gICAgICBzZXRJdGVtKFxcXCJub19sb2FkaW5nXFxcIiwgXFxcIjFcXFwiKTtcXG4gICAgICAvLyBtYW5hZ2UubGlzdC5mb3JFYWNoKCh2LCBpaSkgPT4gKFxcbiAgICAgIC8vICAgbWFuYWdlLmxpc3RbaWldID0gaSA9PT0gaWkgPyBcXFwi4oCY4oCYXFxcIiArIG5hbWVzW2lpXSArIFxcXCLigJnigJlcXFwiIDogbmFtZXNbaWldLnJlcGxhY2UoL1vigJnigJhdL2csIFxcXCJcXFwiKVxcbiAgICAgIC8vICkpO1xcbiAgICAgIGxldCBuYW1lID0gbWFuYWdlLmxpc3RbaV0ucmVwbGFjZSgvW+KAmeKAmF0vZywgXFxcIlxcXCIpO1xcbiAgICAgIGlmIChuYW1lID09IHNvdXJjZS5uYW1lKSB7XFxuICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuO1xcbiAgICAgIH1cXG4gICAgICBsZXQgc291cmNlcyA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlKCk7XFxuICAgICAgbGV0IGtleSA9IHNvdXJjZXMuZmluZCh2ID0+IHYubmFtZSA9PSBuYW1lKS5rZXk7XFxuXFxuICAgICAgLy9tYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgbGV0IHNvdXJjZU5hbWVMaXN0ID0gcnVudGltZUNvbmZpZy5zZXRDdXJyZW50U291cmNlKGtleSk7XFxuICAgICAgY2xlYXJNeVZhcihcXFwiY2F0ZWlcXFwiKTtcXG4gICAgICBjbGVhck15VmFyKFxcXCJjYXRlX29ialxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImlzaG9tZVxcXCIpO1xcbiAgICAgIGNsZWFyTXlWYXIoXFxcImxpbmtzXFxcIik7XFxuICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgfSxcXG4gICAgbWVudUNsaWNrKG1hbmFnZSkge1xcbiAgICAgIGhpa2VyUG9wLnNlbGVjdENlbnRlcih7XFxuICAgICAgICBvcHRpb25zOiBbXFxcIuaUueWPmOagt+W8j1xcXCIsIFxcXCLnrZvpgInmupBcXFwiLCBcXFwi6Ieq54S25o6S5bqPOlxcXCIgKyAoZ2V0SXRlbShcXFwibmF0dXJhbFxcXCIsIFxcXCJcXFwiKSA9PSBcXFwiXFxcIiA/IFxcXCLlhbPpl61cXFwiIDogXFxcIuWQr+eUqFxcXCIpLCBcXFwi5YCS5bqPXFxcIiwgXFxcIuWIt+aWsOmFjee9rlxcXCJdLFxcbiAgICAgICAgY29sdW1uczogMixcXG4gICAgICAgIHRpdGxlOiBcXFwi6K+36YCJ5oupXFxcIixcXG4gICAgICAgIGNsaWNrKHMsIGkpIHtcXG4gICAgICAgICAgaWYgKGkgPT09IDApIHtcXG4gICAgICAgICAgICBzcGVuID0gc3BlbiA9PSAzID8gMSA6IDM7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZUNvbHVtbnMoc3Blbik7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMSkge1xcbiAgICAgICAgICAgIGhpa2VyUG9wLmlucHV0Q29uZmlybSh7XFxuICAgICAgICAgICAgICBjb250ZW50OiBcXFwi6L6T5YWl5YWz6ZSu5a2XIOepuuaYvuekuuWFqOmDqFxcXCIsXFxuICAgICAgICAgICAgICB0aXRsZTogXFxcIuetm+mAiea6kFxcXCIsXFxuICAgICAgICAgICAgICBoaW50OiBcXFwi5rqQ5YWz6ZSu5a2XXFxcIixcXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogc2VhcmNoS2V5LFxcbiAgICAgICAgICAgICAgdGV4dGFyZWE6IGZhbHNlLCAvL+WkmuihjOaooeW8j1xcbiAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICBub0F1dG9Tb2Z0OiBmYWxzZSxcXG4gICAgICAgICAgICAgIC8vaGlkZUNhbmNlbDogdHJ1ZSxcXG4gICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICBsZXQgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIsIFxcXCJydW50aW1lQ29uZmlnXFxcIik7XFxuICAgICAgICAgICAgICAgIHNlYXJjaEtleSA9IHRleHQ7XFxuICAgICAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKS5tYXAoeCA9PiB4Lm5hbWUpO1xcbiAgICAgICAgICAgICAgICBsZXQgZmxpc3QgPSBsaXN0LmZpbHRlcih4ID0+IHguaW5jbHVkZXModGV4dCkpO1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBmbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeCk7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFxcXCJ0b2FzdDovL+i+k+WFpeS6hlxcXCIgKyB0ZXh0O1xcbiAgICAgICAgICAgICAgfSxcXG5cXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09PSAyKSB7XFxuICAgICAgICAgICAgbGV0IGxpc3QgPSBPYmplY3QuYXNzaWduKFtdLCBtYW5hZ2UubGlzdCk7XFxuICAgICAgICAgICAgbGV0IG5hdHVyYWwgPSBnZXRJdGVtKFxcXCJuYXR1cmFsXFxcIiwgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChuYXR1cmFsID09IFxcXCJcXFwiKSB7XFxuICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgbGlzdC5zb3J0KG5hdHVyYWxTb3J0KS5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgIG1hbmFnZS5saXN0Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICBzbmFtZS5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5wdXNoKHgpO1xcbiAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcIm5hdHVyYWxcXFwiLCBuYXR1cmFsID8gXFxcIlxcXCIgOiBcXFwiMVxcXCIpO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMykge1xcbiAgICAgICAgICAgIG1hbmFnZS5saXN0LnJldmVyc2UoKTtcXG4gICAgICAgICAgICBuYW1lcy5yZXZlcnNlKCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGZ1bmN0aW9uIGFycmF5RGlmZmVyZW5jZShhcnIxLCBhcnIyKSB7XFxuICAgICAgICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKGFycjIubWFwKGl0ZW0gPT4gW2l0ZW0ua2V5LCBpdGVtXSkpO1xcbiAgICAgICAgICAgICAgcmV0dXJuIGFycjEuZmlsdGVyKGl0ZW0gPT4gIW1hcC5oYXMoaXRlbS5rZXkpKTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbGV0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgICAgICAgICAgIGxldCBsaXN0ID0gcnVudGltZUNvbmZpZy5nZXRBbGxTb3VyY2UoKTtcXG4gICAgICAgICAgICBsZXQgQ2tleSA9IHJ1bnRpbWVDb25maWcuZ2V0Q3VycmVudFNvdXJjZSgpLmtleTtcXG4gICAgICAgICAgICAvL2xvZyhDa2V5KVxcbiAgICAgICAgICAgIGxldCBjZmcgPSBydW50aW1lQ29uZmlnLmdldEN1cnJlbnRDb25maWcoKVxcbiAgICAgICAgICAgIGxldCB7XFxuICAgICAgICAgICAgICBwYXRoLFxcbiAgICAgICAgICAgICAgbmFtZVxcbiAgICAgICAgICAgIH0gPSBjZmc7XFxuICAgICAgICAgICAgcnVudGltZUNvbmZpZy5zZXRDdXJyZW50Q29uZmlnKHtcXG4gICAgICAgICAgICAgIHBhdGgsXFxuICAgICAgICAgICAgICBuYW1lLFxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0Q3VycmVudFNvdXJjZShDa2V5KTtcXG4gICAgICAgICAgICBsZXQgbnNvdXJjZXMgPSBydW50aW1lQ29uZmlnLmdldEFsbFNvdXJjZSgpO1xcblxcbiAgICAgICAgICAgIGxldCBhbGlzdCA9IGFycmF5RGlmZmVyZW5jZShuc291cmNlcywgbGlzdCk7XFxuICAgICAgICAgICAgbGV0IGRsaXN0ID0gYXJyYXlEaWZmZXJlbmNlKGxpc3QsIG5zb3VyY2VzKTtcXG5cXG4gICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCB8fCBkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICBsZXQgbXNnID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgICBpZiAoYWxpc3QubGVuZ3RoID4gMCkge1xcbiAgICAgICAgICAgICAgICBhbGlzdC5mb3JFYWNoKHggPT4ge1xcbiAgICAgICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goeC5uYW1lKTtcXG4gICAgICAgICAgICAgICAgfSlcXG4gICAgICAgICAgICAgICAgbG9nKFxcXCLmlrDlop46XFxcIiArIGFsaXN0Lm1hcChrID0+IGsubmFtZSkuam9pbihcXFwiLFxcXCIpKVxcbiAgICAgICAgICAgICAgICBtc2cgKz0gXFxcIuaWsOWinlxcXCIgKyBhbGlzdC5sZW5ndGggKyBcXFwi5Liq5rqQXFxcIjtcXG4gICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgIGlmIChkbGlzdC5sZW5ndGggPiAwKSB7XFxuICAgICAgICAgICAgICAgIGRsaXN0LmZvckVhY2goeCA9PiB7XFxuICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3Quc3BsaWNlKG1hbmFnZS5saXN0LmluZGV4T2YoeC5uYW1lKSwgMSk7XFxuICAgICAgICAgICAgICAgIH0pXFxuICAgICAgICAgICAgICAgIGxvZyhcXFwi56e76ZmkOlxcXCIgKyBkbGlzdC5tYXAoayA9PiBrLm5hbWUpLmpvaW4oXFxcIixcXFwiKSlcXG4gICAgICAgICAgICAgICAgbXNnICs9IFxcXCIg56e76ZmkXFxcIiArIGRsaXN0Lmxlbmd0aCArIFxcXCLkuKrmupBcXFwiO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICAgICAgdG9hc3QobXNnICsgXFxcIiDmm7TlpJror6bmg4XnnItsb2dcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgdG9hc3QoXFxcIuW3suWIt+aWsFxcXCIpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfVxcbiAgICAgICAgfSxcXG4gICAgICB9KTtcXG4gICAgfVxcbiAgfSk7XFxufVwifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiZHJweeeuoeeQhlwiLFwicGF0aFwiOlwiRHJweU1hbmFnZVwiLFwicnVsZVwiOlwianM6XFxuY29uc3QgSlNFbmdpbmUgPSBjb20uZXhhbXBsZS5oaWtlcnZpZXcuc2VydmljZS5wYXJzZXIuSlNFbmdpbmU7XFxuY29uc3QgcnVudGltZUNvbmZpZyA9IEdNLmRlZmluZU1vZHVsZShcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbmNvbnN0IGRycHlNYXAgPSBuZXcgTWFwKCk7XFxuY29uc3QgR01rZXkgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxubG9nKFxcXCLliJ3lp4vljJZEcnB5TWFuYWdlXFxcIik7XFxuXFxuZnVuY3Rpb24gYnVpbGRKc0Vudih0aWNrZXQpIHtcXG4gICAgbGV0IGNvZGUgPSBTdHJpbmcucmF3IGBcXG4gICAgLy8gY29uc3QgbXlfcnVsZSA9ICdcXG4gICAgY29uc3QgTVlfUlVMRSA9ICR7bXlfcnVsZX07XFxuICAgIGNvbnN0IG15X3J1bGUgPSBKU09OLnN0cmluZ2lmeShNWV9SVUxFKTtcXG4gICAgY29uc3QgTVlfVElDS0VUID0gXFxcIiR7dGlja2V0fHxcXFwiXFxcIn1cXFwiO1xcbiAgICBldmFsKGdldEpzUGx1Z2luKCkpO1xcbiAgICBldmFsKGdldEpzTGF6eVBsdWdpbigpKTtcXG4gICAgYDtcXG4gICAgcmV0dXJuIGNvZGU7XFxufVxcblxcbmZ1bmN0aW9uIHN5bmMoZnVuYywgc3ApIHtcXG4gICAgcmV0dXJuIG5ldyBvcmcubW96aWxsYS5qYXZhc2NyaXB0LlN5bmNocm9uaXplcihmdW5jLCBzcCB8fCB7fSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZURycHkoa2V5KSB7XFxuICAgIEpTRW5naW5lLmdldEluc3RhbmNlKCkuZXZhbEpTKGJ1aWxkSnNFbnYoTVlfVElDS0VUKSArIFxcXCJcXFxcbiFcXFwiICsgJC50b1N0cmluZygoa2V5LCBHTWtleSwgTVlfVElDS0VUKSA9PiB7XFxuICAgICAgICBsZXQgZHJweSA9ICQucmVxdWlyZShcXFwiZHJweVxcXCIpO1xcbiAgICAgICAgR00uaGFzKEdNa2V5LCAoRHJweU1hbmFnZSkgPT4ge1xcbiAgICAgICAgICAgIERycHlNYW5hZ2UucHV0KGtleSwgZHJweSk7XFxuICAgICAgICB9KTtcXG4gICAgfSwga2V5LCBHTWtleSwgTVlfVElDS0VUKSArIFxcXCI7XFxcXG5cXFwiLCBcXFwiXFxcIiwgZmFsc2UpO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXQoa2V5KSB7XFxuICByZXR1cm4gc3luYygoKSA9PiB7XFxuICAgIC8vbG9nKGRycHlNYXAuc2l6ZSlcXG4gICAgaWYgKGRycHlNYXAuaGFzKGtleSkpIHtcXG4gICAgICByZXR1cm4gZHJweU1hcC5nZXQoa2V5KTtcXG4gICAgfVxcbiAgICBpZiAoZHJweU1hcC5zaXplID49IDUpIHtcXG4gICAgICBsb2coXFxcIuivt+axgjpcXFwiICsga2V5KVxcbiAgICAgIGRlbChBcnJheS5mcm9tKGRycHlNYXAua2V5cygpKS5hdCgwKSk7XFxuICAgIH1cXG4gICAgbGV0IHNvdXJjZSA9IHJ1bnRpbWVDb25maWcuZ2V0QWxsU291cmNlcygpLmZpbmQodiA9PiB2LmtleSA9PT0ga2V5KTtcXG4gICAgY3JlYXRlRHJweShrZXkpO1xcbiAgICBsZXQgZHJweSA9IGRycHlNYXAuZ2V0KGtleSk7XFxuICAgIGRycHkuaW5pdChydW50aW1lQ29uZmlnLmdldEFic29sdXRlUGF0aChzb3VyY2UuZXh0KSk7XFxuICAgIHJldHVybiBkcnB5O1xcbiAgfSwgdGhpcykuY2FsbCgpO1xcbn1cXG4vL3NvdXJjZS5leHTlv4XpobvkuLrnu53lr7not6/lvoRcXG5mdW5jdGlvbiBnZXRCeVNvdXJjZShzb3VyY2Upe1xcbiAgICByZXR1cm4gc3luYygoKSA9PiB7XFxuICAgICAgICBsZXQga2V5PXNvdXJjZS5rZXk7XFxuICAgICAgICAvL2xvZyhkcnB5TWFwLnNpemUpXFxuICAgICAgICBpZiAoZHJweU1hcC5oYXMoa2V5KSkge1xcbiAgICAgICAgICAgIHJldHVybiBkcnB5TWFwLmdldChrZXkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgaWYgKGRycHlNYXAuc2l6ZSA+PSA1KSB7XFxuICAgICAgICAgICAgbG9nKFxcXCLor7fmsYI6XFxcIiArIGtleSlcXG4gICAgICAgICAgICBkZWwoQXJyYXkuZnJvbShkcnB5TWFwLmtleXMoKSkuYXQoMCkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgY3JlYXRlRHJweShrZXkpO1xcbiAgICAgICAgbGV0IGRycHkgPSBkcnB5TWFwLmdldChrZXkpO1xcbiAgICAgICAgZHJweS5pbml0KHNvdXJjZS5leHQpO1xcbiAgICAgICAgcmV0dXJuIGRycHk7XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxuZnVuY3Rpb24gcHV0KGtleSwgZHJweSkge1xcbiAgICBzeW5jKCgpID0+IGRycHlNYXAuc2V0KGtleSwgZHJweSksIHRoaXMpLmNhbGwoKTtcXG59XFxuXFxuZnVuY3Rpb24gZGVsKGtleSkge1xcbiAgICBzeW5jKCgpID0+IHtcXG4gICAgICAgIGxvZyhcXFwi5Yig6ZmkXFxcIiArIGtleSk7XFxuICAgICAgICBpZiAoZHJweU1hcC5oYXMoa2V5KSkge1xcbiAgICAgICAgICAgIGRycHlNYXAuZGVsZXRlKGtleSk7XFxuICAgICAgICB9XFxuICAgIH0sIHRoaXMpLmNhbGwoKTtcXG59XFxubGV0IGlzSW5pdEhvbWUgPSBmYWxzZTtcXG4vL2xldCBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXG5sZXQgaXNJbml0RXJQYWdlID0gZmFsc2U7XFxuXFxuZnVuY3Rpb24gaW5pdFBhZ2UodHlwZSkge1xcbiAgICBzd2l0Y2ggKHR5cGUpIHtcXG4gICAgICAgIGNhc2UgXFxcImhvbWVcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdEhvbWUgPSB0cnVlO1xcbiAgICAgICAgICAgIC8vY2FzZSBcXFwic2VhcmNoXFxcIjpcXG4gICAgICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSB0cnVlO1xcbiAgICAgICAgY2FzZSBcXFwiZXJcXFwiOlxcbiAgICAgICAgICAgIGlzSW5pdGVyUGFnZSA9IHRydWU7XFxuICAgIH1cXG4gICAgYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAkLnRvU3RyaW5nKChHTWtleSwgdHlwZSkgPT4ge1xcbiAgICAgICAgbG9nKFxcXCJvbkNsb3NlXFxcIik7XFxuICAgICAgICBHTS5oYXMoR01rZXksIERycHlNYW5hZ2UgPT4ge1xcbiAgICAgICAgICAgIGxvZyhcXFwi5pyJR01rZXlcXFwiKTtcXG4gICAgICAgICAgICBEcnB5TWFuYWdlLmNsZWFyKHR5cGUpO1xcbiAgICAgICAgfSk7XFxuICAgIH0sIEdNa2V5LCB0eXBlKSk7XFxufVxcblxcbmZ1bmN0aW9uIGNsZWFyKHR5cGUpIHtcXG4gICAgc3dpdGNoICh0eXBlKSB7XFxuICAgICAgICBjYXNlIFxcXCJob21lXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRIb21lID0gZmFsc2U7XFxuICAgICAgICAvL2Nhc2UgXFxcInNlYXJjaFxcXCI6XFxuICAgICAgICAvLyAgICBpc0luaXRTZWFyY2ggPSBmYWxzZTtcXG4gICAgICAgIGNhc2UgXFxcImVyXFxcIjpcXG4gICAgICAgICAgICBpc0luaXRlclBhZ2UgPSBmYWxzZTtcXG4gICAgfVxcblxcbiAgICBpZiAoIWlzSW5pdEhvbWUgJiYgIWlzSW5pdEVyUGFnZSkge1xcbiAgICAgICAgbG9nKFxcXCLlvIDlp4vmuIXnkIZcXFwiKTtcXG4gICAgICAgIGRycHlNYXAuY2xlYXIoKTtcXG4gICAgICAgIEdNLmNsZWFyKEdNa2V5KTtcXG4gICAgfVxcbn1cXG4kLmV4cG9ydHMgPSB7XFxuICAgIGluaXRQYWdlLFxcbiAgICBnZXQsXFxuICAgIGdldEJ5U291cmNlLFxcbiAgICBkZWwsXFxuICAgIGNsZWFyLFxcbiAgICBwdXRcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmjIflrprmkJzntKLlvLnnqpdcIixcInBhdGhcIjpcIlNlYXJjaEFsbG93UG9wXCIsXCJydWxlXCI6XCJqczpcXG4kLmV4cG9ydHMuc2hvdyA9IGZ1bmN0aW9uICgpIHtcXG4gIGNvbnN0IHJ1bnRpbWVDb25maWcgPSBHTS5kZWZpbmVNb2R1bGUoXFxcInJ1bnRpbWVDb25maWdcXFwiLCBcXFwicnVudGltZUNvbmZpZ1xcXCIpO1xcbiAgY29uc3QgaGlrZXJQb3AgPSAkLnJlcXVpcmUoXFxcImh0dHA6Ly9oaWtlci5ub2tpYS5wcmVzcy9oaWtlcnVsZS9ydWxlbGlzdC5qc29uP2lkPTY5NjZcXFwiKTtcXG4gIGxldCBzZWFyY2hBbGxvdyA9IHJ1bnRpbWVDb25maWcuZ2V0U2VhcmNoQWxsb3coKTtcXG5cXG4gIGxldCBjYW5TZWFyY2hTb3VyY2UgPSBydW50aW1lQ29uZmlnLmdldENhblNlYXJjaFNvdXJjZSgpO1xcbiAgLy9sZXQgc291cmNlTmFtZUxpc3QgPSBjYW5TZWFyY2hTb3VyY2UubWFwKHY9PnYubmFtZSk7XFxuICBsZXQgZ2V0TmFtZXMgPSAoKSA9PiBkeW5hbWljU291cmNlLm1hcCh2ID0+IHNlYXJjaEFsbG93LmluY2x1ZGVzKHYua2V5KSA/IFxcXCLigJzigJzigJ3igJ1cXFwiICsgKHYubmFtZSArIFxcXCJcXFwiKS5mb250Y29sb3IoXFxcIiMwMDk5NjZcXFwiKSA6IHYubmFtZSk7XFxuICBsZXQgc3BlbiA9IDM7XFxuXFxuICAvL2xldCBkeW5hbWljTmFtZXMgPSBzb3VyY2VOYW1lTGlzdC5zbGljZSgpO1xcbiAgbGV0IGR5bmFtaWNTb3VyY2UgPSBjYW5TZWFyY2hTb3VyY2Uuc2xpY2UoKTtcXG4gIGxldCBzZWFyY2hvbmNvdW50ID0gZHluYW1pY1NvdXJjZS5maWx0ZXIodiA9PiBzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkpLmxlbmd0aDtcXG4gIGlmIChzZWFyY2hvbmNvdW50ID09IDApIHtcXG4gICAgc2VhcmNob25jb3VudCA9IGNhblNlYXJjaFNvdXJjZS5sZW5ndGg7XFxuICB9XFxuXFxuICBsZXQgc2VhcmNoS2V5ID0gXFxcIlxcXCI7XFxuICBoaWtlclBvcC5zZWxlY3RCb3R0b21SZXMoe1xcbiAgICBvcHRpb25zOiBnZXROYW1lcygpLFxcbiAgICBjb2x1bW5zOiBzcGVuLFxcbiAgICB0aXRsZTogXFxcIuWQr+eUqOaQnOe0oua6kDpcXFwiICsgc2VhcmNob25jb3VudCArIFxcXCLkuKog5YWxOlxcXCIgKyBjYW5TZWFyY2hTb3VyY2UubGVuZ3RoICsgXFxcIuS4quaQnOe0oua6kFxcXCIsXFxuICAgIG5vQXV0b0Rpc21pc3M6IHRydWUsXFxuICAgIHBvc2l0aW9uOiAxLFxcbiAgICBoZWlnaHQ6IC45LFxcbiAgICBleHRyYUlucHV0Qm94OiBuZXcgaGlrZXJQb3AuUmVzRXh0cmFJbnB1dEJveCh7XFxuICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICB0aXRsZTogXFxcIm9rXFxcIixcXG4gICAgICBvbkNoYW5nZSh0ZXh0LCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vbG9nKFxcXCJvbkNoYW5nZTpcXFwiK3RleHQpXFxuICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgbWFuYWdlLmxpc3QubGVuZ3RoID0gMDtcXG4gICAgICAgIGR5bmFtaWNTb3VyY2UubGVuZ3RoID0gMDtcXG4gICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgIGNhblNlYXJjaFNvdXJjZS5mb3JFYWNoKCh2LCBpKSA9PiB7XFxuICAgICAgICAgICAgaWYgKHRleHQuc3BsaXQoL1xcXFx8LykuZmlsdGVyKGYgPT4gZikuc29tZSh4ID0+IHYubmFtZS5pbmNsdWRlcyh4KSkpIHtcXG4gICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgIG1hbmFnZS5saXN0LnB1c2goc2VhcmNoQWxsb3cuaW5jbHVkZXModi5rZXkpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAodi5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpIDogdi5uYW1lKVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICBkeW5hbWljU291cmNlID0gY2FuU2VhcmNoU291cmNlLnNsaWNlKCk7XFxuICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgIH0sXFxuICAgICAgZGVmYXVsdFZhbHVlOiBcXFwiXFxcIixcXG4gICAgICBjbGljayhzLCBtYW5hZ2UpIHtcXG4gICAgICAgIC8vdG9hc3Qocyk7XFxuICAgICAgICAvL2xvZyhtYW5hZ2UubGlzdCk7XFxuICAgICAgfSxcXG4gICAgICB0aXRsZVZpc2libGU6IGZhbHNlXFxuICAgIH0pLFxcbiAgICBjbGljayhzLCBpLCBtYW5hZ2UpIHtcXG5cXG4gICAgICBsZXQga2V5ID0gZHluYW1pY1NvdXJjZVtpXS5rZXk7XFxuICAgICAgbGV0IGluZGV4ID0gLTE7XFxuICAgICAgaWYgKChpbmRleCA9IHNlYXJjaEFsbG93LmluZGV4T2Yoa2V5KSkgIT09IC0xKSB7XFxuICAgICAgICBtYW5hZ2UubGlzdFtpXSA9IGR5bmFtaWNTb3VyY2VbaV0ubmFtZTtcXG4gICAgICAgIHNlYXJjaEFsbG93LnNwbGljZShpbmRleCwgMSk7XFxuICAgICAgfSBlbHNlIHtcXG4gICAgICAgIG1hbmFnZS5saXN0W2ldID0gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyAoZHluYW1pY1NvdXJjZVtpXS5uYW1lICsgXFxcIlxcXCIpLmZvbnRjb2xvcihcXFwiIzAwOTk2NlxcXCIpO1xcbiAgICAgICAgc2VhcmNoQWxsb3cucHVzaChrZXkpO1xcbiAgICAgIH1cXG5cXG4gICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICB9LFxcbiAgICBtZW51Q2xpY2sobWFuYWdlKSB7XFxuICAgICAgaGlrZXJQb3Auc2VsZWN0Q2VudGVyKHtcXG4gICAgICAgIG9wdGlvbnM6IFtcXFwi5pS55Y+Y5qC35byPXFxcIiwgXFxcIuetm+mAiea6kFxcXCIsIFxcXCLoh6rnhLbmjpLluo9cXFwiLCBcXFwi5YCS5bqPXFxcIiwgXFxcIuWFqOmAiVxcXCIsIFxcXCLlj43pgIlcXFwiXSxcXG4gICAgICAgIGNvbHVtbnM6IDIsXFxuICAgICAgICB0aXRsZTogXFxcIuivt+mAieaLqVxcXCIsXFxuICAgICAgICBjbGljayhzLCBpKSB7XFxuICAgICAgICAgIGlmIChpID09PSAwKSB7XFxuICAgICAgICAgICAgc3BlbiA9IHNwZW4gPT0gMyA/IDEgOiAzO1xcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2VDb2x1bW5zKHNwZW4pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDEpIHtcXG4gICAgICAgICAgICBoaWtlclBvcC5pbnB1dENvbmZpcm0oe1xcbiAgICAgICAgICAgICAgY29udGVudDogXFxcIui+k+WFpeWFs+mUruWtlyDnqbrmmL7npLrlhajpg6hcXFwiLFxcbiAgICAgICAgICAgICAgdGl0bGU6IFxcXCLnrZvpgInmupBcXFwiLFxcbiAgICAgICAgICAgICAgaGludDogXFxcIua6kOWFs+mUruWtlyDlpJrkuKrnlKh86ZqU5byAXFxcIixcXG4gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogc2VhcmNoS2V5LFxcbiAgICAgICAgICAgICAgdGV4dGFyZWE6IGZhbHNlLCAvL+WkmuihjOaooeW8j1xcbiAgICAgICAgICAgICAgbWF4VGV4dGFyZWE6IHRydWUsXFxuICAgICAgICAgICAgICBub0F1dG9Tb2Z0OiBmYWxzZSxcXG4gICAgICAgICAgICAgIC8vaGlkZUNhbmNlbDogdHJ1ZSxcXG4gICAgICAgICAgICAgIGNvbmZpcm0odGV4dCkge1xcbiAgICAgICAgICAgICAgICBzZWFyY2hLZXkgPSB0ZXh0O1xcbiAgICAgICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcbiAgICAgICAgICAgICAgICBkeW5hbWljU291cmNlLmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgICAgIGlmICh0ZXh0KSB7XFxuICAgICAgICAgICAgICAgICAgY2FuU2VhcmNoU291cmNlLmZvckVhY2goKHYsIGkpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0LnNwbGl0KC9cXFxcfC8pLmZpbHRlcihmID0+IGYpLnNvbWUoeCA9PiB2Lm5hbWUuaW5jbHVkZXMoeCkpKSB7XFxuICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucHVzaCh2KTtcXG4gICAgICAgICAgICAgICAgICAgICAgbWFuYWdlLmxpc3QucHVzaChzZWFyY2hBbGxvdy5pbmNsdWRlcyh2LmtleSkgPyBcXFwi4oCc4oCc4oCd4oCdXFxcIiArICh2Lm5hbWUgKyBcXFwiXFxcIikuZm9udGNvbG9yKFxcXCIjMDA5OTY2XFxcIikgOiB2Lm5hbWUpXFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgZHluYW1pY1NvdXJjZSA9IGNhblNlYXJjaFNvdXJjZS5zbGljZSgpO1xcbiAgICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcblxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8v6L6T5YWl5LqGXFxcIiArIHRleHQ7XFxuICAgICAgICAgICAgICB9LFxcblxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDIpIHtcXG4gICAgICAgICAgICBsZXQgbGlzdCA9IE9iamVjdC5hc3NpZ24oW10sIG1hbmFnZS5saXN0KTtcXG4gICAgICAgICAgICBtYW5hZ2UubGlzdC5sZW5ndGggPSAwO1xcblxcblxcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2Uuc29ydCgoYSwgYikgPT4ge1xcbiAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhhLm5hbWUpLmxvY2FsZUNvbXBhcmUoU3RyaW5nKGIubmFtZSksIHVuZGVmaW5lZCwge1xcbiAgICAgICAgICAgICAgICBudW1lcmljOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBzZW5zaXRpdml0eTogJ2Jhc2UnXFxuICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAzKSB7XFxuICAgICAgICAgICAgbWFuYWdlLmxpc3QucmV2ZXJzZSgpO1xcbiAgICAgICAgICAgIGR5bmFtaWNTb3VyY2UucmV2ZXJzZSgpO1xcblxcbiAgICAgICAgICAgIG1hbmFnZS5jaGFuZ2UoKTtcXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDQpIHtcXG4gICAgICAgICAgICBkeW5hbWljU291cmNlLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgICBpZiAoIXNlYXJjaEFsbG93LmluY2x1ZGVzKHYpKSB7XFxuICAgICAgICAgICAgICAgIHNlYXJjaEFsbG93LnB1c2godi5rZXkpO1xcbiAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obWFuYWdlLmxpc3QsIGdldE5hbWVzKCkpO1xcbiAgICAgICAgICAgIHJ1bnRpbWVDb25maWcuc2V0U2VhcmNoQWxsb3coKTtcXG4gICAgICAgICAgICBtYW5hZ2UuY2hhbmdlKCk7XFxuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PSA1KSB7XFxuICAgICAgICAgICAgbGV0IHRlbWxpc3QgPSBzZWFyY2hBbGxvdy5zbGljZSgpO1xcbiAgICAgICAgICAgIHNlYXJjaEFsbG93Lmxlbmd0aCA9IDA7XFxuICAgICAgICAgICAgZHluYW1pY1NvdXJjZS5mb3JFYWNoKHYgPT4ge1xcbiAgICAgICAgICAgICAgaWYgKHRlbWxpc3QuaW5jbHVkZXModi5rZXkpKSByZXR1cm47XFxuICAgICAgICAgICAgICBzZWFyY2hBbGxvdy5wdXNoKHYua2V5KTtcXG4gICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1hbmFnZS5saXN0LCBnZXROYW1lcygpKTtcXG4gICAgICAgICAgICBydW50aW1lQ29uZmlnLnNldFNlYXJjaEFsbG93KCk7XFxuICAgICAgICAgICAgbWFuYWdlLmNoYW5nZSgpO1xcbiAgICAgICAgICB9XFxuICAgICAgICB9LFxcbiAgICAgIH0pO1xcbiAgICB9XFxuICB9KTtcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLliIbnsbtcIixcInBhdGhcIjpcImNhdGVnb3J5c1wiLFwicnVsZVwiOlwianM6XFxubGV0IGZsID0ge307XFxubGV0IHJlc3VsdHMgPSBbXTtcXG5sZXQgaG9tZWxpc3QgPSBbXTtcXG5sZXQgY2F0ZSA9IFxcXCJcXFwiO1xcblxcbmZ1bmN0aW9uIGdldENhdGVnb3J5cyhsYXlvdXQsZHJweSwgcGFnZSkge1xcbiAgbGV0IHJ1bGU9ZHJweS5ydW5NYWluKCdmdW5jdGlvbiBtYWluKCl7cmV0dXJuIHJ1bGV9Jyk7XFxuICBpZihydWxlLuS4gOe6pz09XFxcIlxcXCJ8fHJ1bGUu5LiA57qnPT11bmRlZmluZWQpe1xcbiAgICBjbGVhck15VmFyKFxcXCJsaW5rc1xcXCIpO1xcbiAgICBsYXlvdXQubGVuZ3RoPTA7XFxuICAgIHRocm93IG5ldyBFcnJvcihcXFwi6K+l5rqQ5Li65pCc57Si5rqQ77yM5LuF6IO96YCa6L+H5pCc57Si6K6/6Zeu5pWw5o2uXFxcIilcXG4gIH1cXG4gIHZhciBnZXRSYW5nZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHtcXG4gICAgcmV0dXJuICcjJyArICgnMDAwMDAnICsgKE1hdGgucmFuZG9tKCkgKiAweDEwMDAwMDAgPDwgMCkudG9TdHJpbmcoMTYpKS5zdWJzdHIoLTYpO1xcbiAgfVxcbiAgbGV0IGNhdGVnb3J5cyA9IEpTT04ucGFyc2UoZHJweS5ob21lKCkpO1xcbiAgbGV0IGZpbHRlcnMgPSBjYXRlZ29yeXMuZmlsdGVycztcXG4gIGxldCBjYXRlcyA9IGNhdGVnb3J5cy5jbGFzcyB8fCBbXTtcXG4gIGlmIChwYWdlID09IDEpIHtcXG4gICAgaG9tZWxpc3QgPSBKU09OLnBhcnNlKGRycHkuaG9tZVZvZCgpKS5saXN0O1xcbiAgICBpZiAoaG9tZWxpc3QgIT0gdW5kZWZpbmVkICYmIGhvbWVsaXN0Lmxlbmd0aCkge1xcbiAgICAgIHB1dE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMVxcXCIpO1xcbiAgICB9XFxuICB9XFxuICBpZiAoY2F0ZXMubGVuZ3RoID09IDAgJiYgKGhvbWVsaXN0ID09IHVuZGVmaW5lZCB8fCBob21lbGlzdC5sZW5ndGggPT0gMCkpIHtcXG4gICAgY2xlYXJNeVZhcihcXFwibGlua3NcXFwiKTtcXG4gICAgbGF5b3V0Lmxlbmd0aD0wO1xcbiAgICB0aHJvdyBuZXcgRXJyb3IoXFxcIuWIhuexu+iOt+WPluWksei0peWPr+iDvee9kee7nOmXrumimFxcXCIpO1xcbiAgfVxcbiAgaWYgKGdldE15VmFyKFxcXCJpc2hvbWVcXFwiLCBcXFwiMFxcXCIpID09IFxcXCIxXFxcIikge1xcbiAgICBjYXRlcy51bnNoaWZ0KHtcXG4gICAgICB0eXBlX25hbWU6ICfmjqjojZAnLFxcbiAgICAgIHR5cGVfaWQ6ICdob21lJyxcXG4gICAgfSlcXG4gIH1cXG4gIGxldCBsb2FkaT1sYXlvdXQuZmluZEluZGV4KHg9PnguZXh0cmEmJnguZXh0cmEuaWQ9PU1ZX1JVTEUudGl0bGUrXFxcImxvYWRcXFwiKTtcXG4gIGlmKGxvYWRpIT0tMSl7XFxuICAgICAgbGF5b3V0LnNwbGljZShsb2FkaSwxKVxcbiAgfVxcbiAgcHV0TXlWYXIoXFxcImxpbmtzXFxcIixcXFwiMVxcXCIpO1xcbiAgbGV0IGNhdGVpID0gZ2V0TXlWYXIoXFxcImNhdGVpXFxcIiwgXFxcIjBcXFwiKTtcXG4gIGNhdGUgPSBjYXRlc1tjYXRlaV0udHlwZV9pZDtcXG5cXG4gIHZhciBmb2xkID0gc3RvcmFnZTAuZ2V0SXRlbShcXFwiZm9sZFxcXCIsIFxcXCIwXFxcIik7XFxuICBsZXQgY29sb3IgPSBnZXRSYW5nZUNvbG9ycygpO1xcblxcbiAgaWYgKHBhZ2UgPT0gMSkge1xcbiAgICBjYXRlcy5mb3JFYWNoKChpdGVtLCBpKSA9PiB7XFxuICAgICAgbGV0IHQgPSBjYXRlaSA9PSBpID8gXFxcIuKAnOKAnOKAneKAnVxcXCIgKyBcXFwiPGI+XFxcIitpdGVtLnR5cGVfbmFtZS5mb250Y29sb3IoY29sb3IpICtcXFwiPC9iPlxcXCI6IGl0ZW0udHlwZV9uYW1lO1xcbiAgICAgIGxheW91dC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiB0LFxcbiAgICAgICAgdXJsOiAkKCcjbm9Mb2FkaW5nIycpLmxhenlSdWxlKChpLCB0aWQpID0+IHtcXG4gICAgICAgICAgcHV0TXlWYXIoXFxcImNhdGVpXFxcIiwgaSk7XFxuICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICB9LCBpLCBpdGVtLnR5cGVfaWQpLFxcbiAgICAgICAgY29sX3R5cGU6ICdzY3JvbGxfYnV0dG9uJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgIHRpZDogaXRlbS50eXBlX2lkLFxcbiAgICAgICAgICBhY3RpdmU6IGNhdGVpID09IGkgPyB0cnVlIDogZmFsc2UsXFxuICAgICAgICB9XFxuICAgICAgfSlcXG4gICAgfSlcXG4gIH1cXG5cXG4gIGlmIChjYXRlICE9ICdob21lJyAmJiBwYWdlID09IDEpIHtcXG4gICAgbGV0IGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICByZXR1cm4geC5leHRyYSAmJiB4LmV4dHJhLnRpZCA9PSBcXFwiaG9tZVxcXCJcXG4gICAgfSk7XFxuICAgIGlmIChob21laSA9PSAtMSkge1xcbiAgICAgIGhvbWVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHtcXG4gICAgICAgIHJldHVybiB4LmV4dHJhICYmIHguZXh0cmEudGlkO1xcbiAgICAgIH0pIC0gMTtcXG4gICAgfVxcbiAgICBpZiAoZmlsdGVycyAmJiBmaWx0ZXJzLmhhc093blByb3BlcnR5KGNhdGUpKSB7XFxuICAgICAgaWYgKGhvbWVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGhvbWVpICsgMSwgMCwge1xcbiAgICAgICAgICB0aXRsZTogZm9sZCA9PSBcXFwiMFxcXCIgPyBcXFwi4oCc4oCc4oCd4oCdPGI+XFxcIiArIFxcXCLiiKdcXFwiLmZvbnRjb2xvcihcXFwiIzFhYWQxOVxcXCIpICsgXFxcIjwvYj5cXFwiIDogXFxcIuKAnOKAnOKAneKAnTxiPlxcXCIgKyBcXFwi4oioXFxcIi5mb250Y29sb3IoXFxcIiNGRjAwMDBcXFwiKSArIFxcXCI8L2I+XFxcIixcXG4gICAgICAgICAgY29sX3R5cGU6IFxcXCJzY3JvbGxfYnV0dG9uXFxcIixcXG4gICAgICAgICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChmb2xkKSA9PiB7XFxuICAgICAgICAgICAgc3RvcmFnZTAuc2V0SXRlbShcXFwiZm9sZFxcXCIsIGZvbGQgPT0gXFxcIjBcXFwiID8gXFxcIjFcXFwiIDogXFxcIjBcXFwiKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwiaGlrZXI6Ly9lbXB0eVxcXCI7XFxuICAgICAgICAgIH0sIGZvbGQpLFxcbiAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2UsXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfVxcblxcbiAgICAgIGxldCBhY3RpdmVpID0gbGF5b3V0LmZpbmRJbmRleCh4ID0+IHguZXh0cmEgJiYgeC5leHRyYS5hY3RpdmUpO1xcbiAgICAgIGlmIChhY3RpdmVpICE9IC0xKSB7XFxuICAgICAgICBsYXlvdXQuc3BsaWNlKGFjdGl2ZWksIDAsIHtcXG4gICAgICAgICAgdGl0bGU6IFxcXCLigJzigJzigJ3igJ1cXFwiICsgJ/CfjIAnLFxcbiAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICB1cmw6ICQoJyNub0xvYWRpbmcjJykubGF6eVJ1bGUoKGMpID0+IHtcXG4gICAgICAgICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgICAgICAgZGVsZXRlIGNhdGVfb2JqW2NdO1xcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTlrozmiJBcXFwiO1xcbiAgICAgICAgICB9LCBjYXRlKVxcbiAgICAgICAgfSlcXG4gICAgICB9XFxuXFxuICAgICAgbGV0IGNsYXNzaWZ5ID0gZmlsdGVyc1tjYXRlXTtcXG4gICAgICB2YXIgaW5pdF9jYXRlID0gbmV3IEFycmF5KGNsYXNzaWZ5Lmxlbmd0aCkuZmlsbChcXFwiLTFcXFwiKTtcXG4gICAgICBsZXQgY2F0ZV9vYmogPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwiY2F0ZV9vYmpcXFwiLCB7fSk7XFxuICAgICAgY2F0ZV9vYmpbY2F0ZV0gPSBjYXRlX29ialtjYXRlXSA/IGNhdGVfb2JqW2NhdGVdIDogaW5pdF9jYXRlXFxuICAgICAgdmFyIGNhdGVfdGVtcCA9IGNhdGVfb2JqW2NhdGVdO1xcbiAgICAgIC8vdmFyIGZpbHRlcl9kZWY9c3RvcmFnZTAuZ2V0SXRlbShcXFwiZmlsdGVyX2RlZlxcXCIsIHt9KTtcXG4gICAgICBjbGFzc2lmeS5mb3JFYWNoKCh4LCBpbmRleCkgPT4ge1xcbiAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICBjb2xfdHlwZTogJ2JsYW5rX2Jsb2NrJ1xcbiAgICAgICAgfSlcXG4gICAgICAgIHgudmFsdWUuZm9yRWFjaCgoaXQsIGkpID0+IHtcXG4gICAgICAgICAgbGV0IHQgPSBpdC5uO1xcbiAgICAgICAgICBpZiAoY2F0ZV90ZW1wW2luZGV4XSA9PSBpKSB7XFxuICAgICAgICAgICAgdCA9IFxcXCI8Yj48Zm9udCBjb2xvcj1cXFwiICsgY29sb3IgKyBcXFwiPlxcXCIgKyB0ICsgXFxcIjwvZm9udD48L2I+XFxcIjtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBpdC52O1xcbiAgICAgICAgICB9XFxuICAgICAgICAgIGlmIChjYXRlX3RlbXBbaW5kZXhdID09IFxcXCItMVxcXCIpIHtcXG4gICAgICAgICAgICBmbFt4LmtleV0gPSBcXFwidW5kZWZpbmVkXFxcIjtcXG4gICAgICAgICAgfVxcbiAgICAgICAgICBpZiAoZm9sZCA9PSAxKSB7XFxuICAgICAgICAgICAgbGF5b3V0LnB1c2goe1xcbiAgICAgICAgICAgICAgdGl0bGU6ICfigJzigJzigJ3igJ0nICsgdCxcXG4gICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZSgobykgPT4ge1xcbiAgICAgICAgICAgICAgICBsZXQgaSA9IG8uaTtcXG4gICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcImlzX2RlZlxcXCIsIFxcXCIxXFxcIik7XFxuICAgICAgICAgICAgICAgIGxldCBjYXRlX29iaiA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJjYXRlX29ialxcXCIsIHt9KTtcXG5cXG4gICAgICAgICAgICAgICAgbGV0IGNhdGVfdGVtcCA9IG8uY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZV90ZW1wLmNvbnN0cnVjdG9yICE9IEFycmF5KSB7XFxuICAgICAgICAgICAgICAgICAgY2F0ZV90ZW1wID0gW107XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gby5pbmRleDtcXG4gICAgICAgICAgICAgICAgbGV0IGMgPSBjYXRlX3RlbXBbaW5kZXhdIHx8IFxcXCItMVxcXCI7XFxuICAgICAgICAgICAgICAgIC8vbG9nKGMpXFxuICAgICAgICAgICAgICAgIGlmIChjID09IGkpIHtcXG4gICAgICAgICAgICAgICAgICBvLmNhdGVfdGVtcFtpbmRleF0gPSBcXFwiLTFcXFwiO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgIG8uY2F0ZV90ZW1wW2luZGV4XSA9IGkgKyBcXFwiXFxcIjtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBjYXRlX29ialtvLmNhdGVdID0gY2F0ZV90ZW1wO1xcbiAgICAgICAgICAgICAgICAvL2xvZyhjYXRlX3RlbXApXFxuICAgICAgICAgICAgICAgIC8vc3RvcmFnZTAucHV0TXlWYXIoXFxcImNhdGVfdGVtcFxcXCIsIGNhdGVfdGVtcCk7XFxuICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJjYXRlX29ialxcXCIsIGNhdGVfb2JqKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJoaWtlcjovL2VtcHR5XFxcIjtcXG4gICAgICAgICAgICAgIH0sIHtcXG4gICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LFxcbiAgICAgICAgICAgICAgICBjYXRlX3RlbXA6IGNhdGVfdGVtcCxcXG4gICAgICAgICAgICAgICAgaTogaSxcXG4gICAgICAgICAgICAgICAgY2F0ZTogY2F0ZVxcbiAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICBjb2xfdHlwZTogJ3Njcm9sbF9idXR0b24nLFxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgICAgfSlcXG4gICAgfVxcbiAgfVxcbn1cXG5cXG5mdW5jdGlvbiBnZXRGbCgpIHtcXG4gIGZsID0gT2JqZWN0LmtleXMoZmwpLmZpbHRlcihrZXkgPT4gZmxba2V5XSAhPT0gXFxcInVuZGVmaW5lZFxcXCIpLnJlZHVjZSgocmVzLCBrZXkpID0+IHtcXG4gICAgcmVzW2tleV0gPSBmbFtrZXldO1xcbiAgICByZXR1cm4gcmVzO1xcbiAgfSwge30pO1xcbiAgcmV0dXJuIGZsXFxufVxcblxcbmZ1bmN0aW9uIGdldENhdGVMaXN0KCkge1xcbiAgcmV0dXJuIHtcXG4gICAgY2F0ZSxcXG4gICAgaG9tZWxpc3RcXG4gIH1cXG59XFxuXFxuXFxuJC5leHBvcnRzID0ge1xcbiAgZ2V0Y2F0ZWxpc3Q6IGdldENhdGVMaXN0LFxcbiAgZ2V0Y2F0ZWdvcnlzOiBnZXRDYXRlZ29yeXMsXFxuICBnZXRmbDogZ2V0RmxcXG59XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCLmnKzlnLDop4TliJnnrqHnkIZcIixcInBhdGhcIjpcIkxvY2FsRGlyXCIsXCJydWxlXCI6XCJqczpcXG5zZXRQYWdlVGl0bGUoXFxcIuaWh+S7tueuoeeQhlxcXCIpO1xcbmxldCBwYXRoID0gZ2V0UGF0aChTdHJpbmcoTVlfUEFSQU1TLmNwYXRoKSkucmVwbGFjZShcXFwiZmlsZTovL1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgZmlsZVNlbGVjdCA9ICQucmVxdWlyZShcXFwiaHR0cDovL2hpa2VyLm5va2lhLnByZXNzL2hpa2VydWxlL3J1bGVsaXN0Lmpzb24/aWQ9NTA5OVxcXCIpO1xcbmZpbGVTZWxlY3QuZmlsZVNlbGVjdGlvbih7XFxuICAgIGNhbGxiYWNrOiAkLnRvU3RyaW5nKCgpID0+IHtcXG4gICAgICAgIHJldHVybiBcXFwiZWRpdEZpbGU6Ly9maWxlOi8vXFxcIiArIFBBVEg7XFxuICAgIH0pLFxcbiAgICBtZW1vcnk6IFxcXCJmaWxlcGF0aFxcXCIsXFxuICAgIGZpbGVUeXBlOiBcXFwiLmpzXFxcIixcXG4gICAgZXhpdFNlYXJjaFJlZnJlc2g6IHRydWUsXFxuICAgIHBhdHRlcm46IDAsXFxuICAgIHJvb3REaXJQYXRoOiBwYXRoLFxcbiAgICBpbml0aWFsUGF0aDogcGF0aCxcXG59LCBNWV9QQVJBTVMubmV3V2luZG93ID8gW10gOiBbe1xcbiAgICB0aXRsZTogXFxcIuaWsOeql+WPo+aJk+W8gFxcXCIsXFxuICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCIsXFxuICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9Mb2NhbERpciNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiLFxcbiAgICBleHRyYToge1xcbiAgICAgICAgY3BhdGg6IE1ZX1BBUkFNUy5jcGF0aCxcXG4gICAgICAgIG5ld1dpbmRvdzogdHJ1ZSxcXG4gICAgICAgIHdpbmRvd0lkOiBNWV9SVUxFLnRpdGxlICsgXFxcIkBlZGl0ZmlsZVxcXCIsXFxuICAgICAgICBsaW5lVmlzaWJsZTogZmFsc2UsXFxuICAgICAgICBwYWdlVGl0bGU6IFxcXCLmlofku7bnrqHnkIZcXFwiXFxuICAgIH1cXG59XSk7XCJ9XSIsImljb24iOiIiLCJwcm94eSI6IiJ9
Add Comment
Please, Sign In to add comment