xiaomianao666

邀您一起看:音乐

May 5th, 2025
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 海阔视界规则分享,当前分享的是:二级页面详情¥page_detail¥音乐@@eyJkYXRhIjoie1wiYXNzb2NpYXRlZE1vZGVsc01hcEZvckpvaW5UYWJsZVwiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhGS1wiOnt9LFwiYXNzb2NpYXRlZE1vZGVsc01hcFdpdGhvdXRGS1wiOnt9LFwiZmllbGRzVG9TZXRUb0RlZmF1bHRcIjpbXSxcImdtdE1vZGlmaWVkXCI6MCxcImlkXCI6MCxcImxhc3RfY2hhcHRlcl9ydWxlXCI6XCJcIixcImxpc3RUb0NsZWFyQXNzb2NpYXRlZEZLXCI6W10sXCJsaXN0VG9DbGVhclNlbGZGS1wiOltdLFwicGFnZUxpc3RcIjpbe1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuWkuOWFi+WIl+ihqEFQSVwiLFwicGF0aFwiOlwiUXVhcmtTaGFyZUFwaVwiLFwicnVsZVwiOlwianM6XFxuLy9AYXV0aG9yIExveURnSWtcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcImh0dHBSZXF1ZXN0XFxcIik7XFxubGV0IENvb2tpZU1hbmFnZT0kLnJlcXVpcmUoXFxcIkNvb2tpZU1hbmFnZVxcXCIpO1xcbmxldCBmcm9tRHJpdmUgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxubGV0IHByLCBiYXNlVXJsLCBjb29raWU7XFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICBiYXNlVXJsID0gXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwiVUNCcm93c2VyXFxcIjtcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxufSBlbHNlIHtcXG4gICAgYmFzZVVybCA9IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuXFxcIjtcXG4gICAgcHIgPSBcXFwidWNwcm9cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmZ1bmN0aW9uIFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpIHtcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXG4gICAgdGhpcy5zaGFyZVB3ZCA9IHNoYXJlUHdkO1xcbiAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayA9ICgoKSA9PiB2b2lkIDApO1xcbiAgICAvL3RoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxufVxcbk9iamVjdC5hc3NpZ24oUXVhcmtTaGFyZUFwaS5wcm90b3R5cGUsIHtcXG4gICAgc2V0UmVmcmVzaChyZWZyZXNoQ2FsbEJhY2spIHtcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrID0gcmVmcmVzaENhbGxCYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHNldFRva2VuKHNoYXJlVG9rZW4pIHtcXG4gICAgICAgIHRoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW47XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgcmVxdWVzdEh0dHAoYXBpKSB7XFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXCJodHRwXFxcIikgPyBhcGkgOiAoYmFzZVVybCArIGFwaSkpLnN1Y2Nlc3MoKGJvZHkscmVzKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGNvb2tpZU1hbmFnZS5hZGQocmVzLmhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSk7XFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxuICAgICAgICB9KS5oZWFkZXJzKHtcXG4gICAgICAgICAgICBcXFwiY29va2llXFxcIjogY29va2llTWFuYWdlLmdldCgpLFxcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIk1vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIHF1YXJrLWNsb3VkLWRyaXZlLzIuNS4yMCBDaHJvbWUvMTAwLjAuNDg5Ni4xNjAgRWxlY3Ryb24vMTguMy41LjQtYjQ3ODQ5MTEwMCBTYWZhcmkvNTM3LjM2IENoYW5uZWwvcGNra19vdGhlcl9jaFxcXCIsXFxuICAgICAgICAgICAgXFxcInJlZmVyZXJcXFwiOiBiYXNlVXJsXFxuICAgICAgICB9KTtcXG4gICAgfSxcXG4gICAgZ2V0VG9rZW4oKSB7XFxuICAgICAgICBpZiAodGhpcy5zaGFyZUlkICE9PSBcXFwic2VsZlxcXCIpIHtcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcIlxcXCI7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldFBpY0Nvb2tpZSgpe1xcbiAgICAgICAgcmV0dXJuIGNvb2tpZU1hbmFnZS5nZXQoKTtcXG4gICAgICAgIFxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVRva2VuKCkge1xcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL3Rva2VuXFxcIikuYm9keSh7XFxuICAgICAgICAgICAgXFxcInB3ZF9pZFxcXCI6IHRoaXMuc2hhcmVJZCxcXG4gICAgICAgICAgICBcXFwicGFzc2NvZGVcXFwiOiB0aGlzLnNoYXJlUHdkLFxcbiAgICAgICAgfSkuYm9keVRvU3RyaW5nKHRydWUpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxuICAgICAgICB0aGlzLnJlZnJlc2hDYWxsQmFjayhyZXN1bHQuZGF0YS5zdG9rZW4sIHRoaXMpO1xcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hhcmVUb2tlbjtcXG4gICAgfSxcXG4gICAgX2dldFNlbGZMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuLzEvY2xvdWRkcml2ZS9maWxlL3NvcnQ/cHI9XFxcIiArIHByICsgXFxcIiZmcj1wY1xcXCIpLmJ1aWxkVXJsKHtcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCIwXFxcIixcXG4gICAgICAgICAgICBmb3JjZTogMCxcXG4gICAgICAgICAgICBfcGFnZTogcGFnZSxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcbiAgICAgICAgICAgIHVjX3BhcmFtX3N0cjogXFxcIlxcXCIsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9mZXRjaF9zdWJfZGlyczogMCxcXG4gICAgICAgICAgICBfc29ydDogXFxcImZpbGVfdHlwZTphc2MsXFxcIiArIG9yZGVyQnlcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcXG4gICAgfSxcXG4gICAgX2dldFNoYXJlTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGV0YWlsP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5idWlsZFVybCh7XFxuICAgICAgICAgICAgcHdkX2lkOiB0aGlzLnNoYXJlSWQgfHwgXFxcIlxcXCIsXFxuICAgICAgICAgICAgc3Rva2VuOiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5nZXRUb2tlbigpIHx8IFxcXCJcXFwiKSxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXCJcXFwiLFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcbiAgICAgICAgICAgIF9zaXplOiAxMDAsXFxuICAgICAgICAgICAgX2ZldGNoX2Jhbm5lcjogMSxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcbiAgICAgICAgICAgIF9zb3J0OiBcXFwiZmlsZV90eXBlOmFzYyxcXFwiICsgb3JkZXJCeVxcbiAgICAgICAgfSkuZXJyb3JXaXRoUmV0cnkoKGVyciwgcmVzLCBodHRwKSA9PiB7XFxuICAgICAgICAgICAgaWYgKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UuaW5jbHVkZXMoJ3N0b2tlbicpKSB7XFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxuICAgICAgICAgICAgICAgICAgICBidWlsZFVybDoge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b2tlbjogZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuZ2V0U2hhcmVUb2tlbigpIHx8IFxcXCJcXFwiKVxcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcbiAgICB9LFxcbiAgICBnZXRMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXCJzZWxmXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTaGFyZUxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTZWxmTGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IFF1YXJrU2hhcmVBcGk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJodHRwUmVxdWVzdFwiLFwicGF0aFwiOlwiaHR0cFJlcXVlc3RcIixcInJ1bGVcIjpcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcbiAgICB0aGlzLnVybCA9IHVybDtcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcbiAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgfSk7XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxuICAgIHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9IChlcnIsIHJlcywgdHJ5UmVzdGFydCkgPT4gZmFsc2U7XFxuICAgIHRoaXMuc3VjY2Vzc0NhbGxiYWNrID0gKGJvZHksIHN0YXR1c0NvZGUsIGhlYWRlcnMpID0+IGJvZHk7XFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXG4gICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmZXRjaDtcXG4gICAgdGhpcy5fYm9keVRvU3RyaW5nID0gZmFsc2U7XFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxufVxcblxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxuICAgIGJvZHlUb1N0cmluZyhmbGFnKSB7XFxuICAgICAgICB0aGlzLl9ib2R5VG9TdHJpbmcgPSAhIWZsYWc7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgYm9keShib2R5KSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXG4gICAgICAgIHRoaXMuYnVpbGRQYXJhbSA9IGJ1aWxkUGFyYW0gfHwge307XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgc2V0U3RhcnRSZXF1ZXN0RnVuYyhmdW5jKSB7XFxuICAgICAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZ1bmM7XFxuICAgICAgICByZXR1cm4gdGhpcztcXG4gICAgfSxcXG4gICAgaGVhZGVycyhoZWFkZXJzKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIHN1Y2Nlc3NDYWxsYmFjayAhPT0gXFxcImZ1bmN0aW9uXFxcIikgcmV0dXJuIHRoaXM7XFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxuICAgICAgICBpZiAodHlwZW9mIGVycm9yQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JUeXBlQ2FsbGJhY2sgIT09IFxcXCJmdW5jdGlvblxcXCIpIHJldHVybiB0aGlzO1xcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXG4gICAgICAgIGlmICh0eXBlb2YgcmV0cnlDb3VudCA9PT0gXFxcImZ1bmN0aW9uXFxcIiAmJiB0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSA9PT0gXFxcInVuZGVmaW5lZFxcXCIpIHtcXG4gICAgICAgICAgICBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gcmV0cnlDb3VudDtcXG4gICAgICAgICAgICByZXRyeUNvdW50ID0gMTtcXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFja1dpdGhSZXRyeSAhPT0gXFxcImZ1bmN0aW9uXFxcIikge1xcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcbiAgICAgICAgfVxcbiAgICAgICAgdGhpcy5yZXRyeUNvdW50ID0gTnVtYmVyKHJldHJ5Q291bnQpO1xcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9LFxcbiAgICBzdGFydCh0b0pzb24pIHtcXG4gICAgICAgIGxldCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5vcHRpb25zKTtcXG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFwib2JqZWN0XFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXG4gICAgICAgICAgICBvcHRpb25zLmJvZHkgPSBKU09OLnN0cmluZ2lmeShvcHRpb25zLmJvZHkpO1xcbiAgICAgICAgfVxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxuICAgICAgICB0cnkge1xcbiAgICAgICAgICAgIGlmIChyZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPD0gMzAwKSB7XFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxuICAgICAgICAgICAgICAgIGlmICh0b0pzb24pIHtcXG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3NDYWxsYmFjayhib2R5LCByZXMpO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGNhdGNoIChlcnIpIHtcXG4gICAgICAgICAgICB0cnkge1xcbiAgICAgICAgICAgICAgICBlcnIgPSB0aGlzLmVycm9yVHlwZUNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICh0aGlzLnJldHJ5Q291bnQpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxuICAgICAgICAgICAgICAgIGlmICh0cnlSZXN1bHQpIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudC0tO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSxcXG4gICAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XFxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7XFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXG4gICAgICAgIH0pO1xcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxuICAgIH0sXFxuICAgIG1lcmdlSGVhZEFuZEJvZHkob3B0aW9ucykge1xcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5vcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiICYmIHR5cGVvZiBvcHRpb25zLmJvZHkgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLm9wdGlvbnMuYm9keXx8e30sIG9wdGlvbnMuYm9keSk7XFxuICAgICAgICB9XFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXCJvYmplY3RcXFwiKSB7XFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmJ1aWxkUGFyYW18fHt9LCBvcHRpb25zLmJ1aWxkVXJsKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB0aGlzO1xcbiAgICB9XFxufSk7XFxuXFxuT2JqZWN0LmFzc2lnbihodHRwUmVxdWVzdCwge1xcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKTtcXG4gICAgfSxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpO1xcbiAgICB9LFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocmVxdWVzdCk7XFxuICAgIH0sXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdFJlcXVlc3QpO1xcbiAgICB9LFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXG4gICAgICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsLCBvcHRpb25zKS5zZXRTdGFydFJlcXVlc3RGdW5jKGZldGNoQ29va2llKTtcXG4gICAgfVxcbn0pO1xcbiQuZXhwb3J0cyA9IGh0dHBSZXF1ZXN0O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aS45YWL5YiX6KGoXCIsXCJwYXRoXCI6XCJxdWFya0xpc3RcIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuXFxuYWRkTGlzdGVuZXIoXFxcIm9uQ2xvc2VcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiKSk7XFxuYWRkTGlzdGVuZXIoXFxcIm9uUmVmcmVzaFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5sZXQgc29VcmwgPSBkZWNvZGVVUklDb21wb25lbnQoZ2V0UGFyYW0oXFxcInJlYWx1cmxcXFwiLCBcXFwiXFxcIikpO1xcbmxldCBmcm9tRHJpdmUgPSBNWV9QQVJBTVMuZnJvbURyaXZlIHx8IFxcXCJxdWFya1xcXCI7XFxuXFxuaWYgKHNvVXJsLmluY2x1ZGVzKFxcXCJkcml2ZS51Yy5jblxcXCIpKSB7XFxuICAgIGZyb21Ecml2ZSA9IFxcXCJ1Y1xcXCI7XFxufVxcbmxldCByZWFsdXJsID0gc29Vcmwuc3BsaXQoXFxcIj9cXFwiKVswXTtcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcIi9cXFwiKTtcXG5cXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFwiI1xcXCIsIFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFwic2hhcmVQd2RcXFwiLCBNWV9QQVJBTVMuc2hhcmVQd2QgfHwgZ2V0UGFyYW0oXFxcInBhc3Njb2RlXFxcIiwgXFxcIlxcXCIsIHNvVXJsKSB8fCBcXFwiXFxcIik7XFxubGV0IHNoYXJlVG9rZW4gPSBnZXRQYXJhbShcXFwic2hhcmVUb2tlblxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXCJcXFwiKTtcXG5cXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXG5cXG5sZXQgc29ydCA9IHtcXG4gICAgXFxcIuWQjeensOato+W6j1xcXCI6IFxcXCJmaWxlX25hbWU6YXNjXFxcIixcXG4gICAgXFxcIuWQjeensOWAkuW6j1xcXCI6IFxcXCJmaWxlX25hbWU6ZGVzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TmraPluo9cXFwiOiBcXFwidXBkYXRlZF9hdDphc2NcXFwiLFxcbiAgICBcXFwi5pe26Ze05YCS5bqPXFxcIjogXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXCJcXG59O1xcbmxldCBzdHlsZXMgPSBbXFxcInRleHRfMVxcXCIsIFxcXCJhdmF0YXJcXFwiXTtcXG5cXG5sZXQgc29ydFZhbHVlID0gc29ydFtnZXRJdGVtKFxcXCJzb3J0S2V5XFxcIiwgXFxcIuWQjeensOato+W6j1xcXCIpXTtcXG5sZXQgc3R5bGUgPSBnZXRJdGVtKFxcXCJzdHlsZVxcXCIsIHN0eWxlc1swXSk7XFxuaWYgKE1ZX1BBR0UgPT0gMSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJVQ+e9keebmFxcXCIgOiBcXFwi5aS45YWL572R55uYXFxcIixcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIiA/IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcIiA6IFxcXCJoaWtlcjovL2ltYWdlcy9pY29uX2t1YWtlXFxcIixcXG4gICAgICAgIHVybDogJChcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFwiKS5jb25maXJtKCgpID0+IHt9KSxcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogc3R5bGUsXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdzdHlsZScsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIiksXFxuICAgICAgICB1cmw6ICQoT2JqZWN0LmtleXMoc29ydCksIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBpbnB1dClcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgfSksXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfc29ydC5zdmdcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpLFxcbiAgICAgICAgdXJsOiAkKFtcXFwi6L2s56CBXFxcIiwgXFxcIuWOn+eUu1xcXCIsIFxcXCLmma7pgJrljp/nlLtcXFwiLCBcXFwiY3VybFxcXCIsIFxcXCJhcmlhMlxcXCIsIFxcXCJSUENcXFwiXSwgMiwgXFxcIuaSreaUvuaooeW8j1xcXCIpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5YiH5o2i5oiQ5YqfXFxcIjtcXG4gICAgICAgIH0pLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcIixcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogXFxcIuWKn+iDvVxcXCIsXFxuICAgICAgICB1cmw6ICQoW1xcXCLot7PovazlpLjlhYtBUFBcXFwiLCBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIiwgXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIsIFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiLCBcXFwi6K6+572uUlBDXFxcIl0sIDIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSkgPT4ge1xcbiAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIui3s+i9rOWkuOWFi0FQUFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJxa2xpbms6Ly93d3cudWMuY24vYjIwYjg0ZmQ3MzVhOGRkM2Y3NTQxMTI5YmFjYzRlOWE/YWN0aW9uPW9wZW5fdXJsJnVybD1odHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLkuKrkurrotKblj7fnrqHnkIZcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkLnJlcXVpcmUoXFxcImFjY291bnRcXFwiKTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5Y6f55S75LiL6L2957q/56iLXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFxcXCIxMFxcXCIpLCBcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChzcGVlZFRocmVhZCA8IDMgfHwgc3BlZWRUaHJlYWQgPiAzMikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7kuI3lkIjms5VcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcIikge1xcbiAgICAgICAgICAgICAgICBpZiAoZnJvbURyaXZlID09PSBcXFwidWNcXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcImNvcHk6Ly9cXFwiICsgYnVpbGRVcmwoXFxcImh0dHBzOi8vZHJpdmUudWMuY24vcy9cXFwiICsgc2hhcmVJZCArIFxcXCI/cHVibGljPTEjL2xpc3Qvc2hhcmVcXFwiLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFwiICsgc2hhcmVJZCwge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3Njb2RlOiBzaGFyZVB3ZFxcbiAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6K6+572uUlBDXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gJChbXFxcIuiuvue9rlJQQ+WcsOWdgFxcXCIsIFxcXCLorr7nva5Ub2tlblxcXCIsIFxcXCLkuIvovb3nm67lvZVcXFwiXSkuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcIuiuvue9rlJQQ+WcsOWdgFxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb3duVG9vbCA9ICQucmVxdWlyZShcXFwiRG93blRvb2xcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJycGNVcmxcXFwiLCBEb3duVG9vbC5nZXREZWZScGNVcmwoKSksIFxcXCJSUEPlnLDlnYAs5Li656m66Ieq5Yqo6I635Y+W5bGA5Z+f572R5Zyw5Z2AXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJwY1VybFxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJdGVtKFxcXCJycGNVcmxcXFwiKTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/muIXpmaTorr7nva5cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi6K6+572uVG9rZW5cXFwiKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwicnBjQXJpYVRva2VuXFxcIiwgXFxcIlxcXCIpLCBcXFwiVG9rZW4s5rKh5pyJ5bCx5LiN5aGrXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJycGNBcmlhVG9rZW5cXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFwicnBjRG93bkRpclxcXCIsIFxcXCJcXFwiKSwgXFxcIuS4i+i9veS/neWtmOebruW9lSzkuLrnqbrlsLHmjInkuIvovb3lmajpu5jorqTot6/lvoRcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJwY0Rvd25EaXJcXFwiLCBpbnB1dCk7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSxcXG4gICAgICAgIGNvbF90eXBlOiBcXFwiaWNvbl81XFxcIixcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9maWxlaW50by5zdmdcXFwiLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIGNvbF90eXBlOiAnbGluZV9ibGFuaydcXG4gICAgfSk7XFxufVxcblxcblxcbmxldCBRdWFya1NoYXJlQXBpID0gJC5yZXF1aXJlKFxcXCJRdWFya1NoYXJlQXBpXFxcIiwgZnJvbURyaXZlKTtcXG5sZXQgcXVhcmtTaGFyZUFwaSA9IG5ldyBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKS5zZXRUb2tlbihzaGFyZVRva2VuKS5zZXRSZWZyZXNoKChzaGFyZVRva2VuKSA9PiB7XFxuICAgIE1ZX1BBUkFNUy5zaGFyZVRva2VuID0gc2hhcmVUb2tlbjtcXG4gICAgc2V0UGFnZVBhcmFtcyhNWV9QQVJBTVMpO1xcbn0pO1xcblxcbmZ1bmN0aW9uIGZvcm1hdFNpemUoc2l6ZSkge1xcbiAgICBpZiAoIXNpemUpIHtcXG4gICAgICAgIHJldHVybiAnJztcXG4gICAgfVxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcbiAgICBsZXQgaSA9IDA7XFxuICAgIHdoaWxlIChzaXplID49IDEwMjQpIHtcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXG4gICAgICAgIGkrKztcXG4gICAgfVxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXG4gICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXG59XFxuXFxubGV0IHN1YkV4dHMgPSBbXFxcInZ0dFxcXCIsIFxcXCJzcnRcXFwiLCBcXFwiYXNzXFxcIl07XFxubGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgdmlkZW86IFxcXCLwn46sXFxcIixcXG4gICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgIGltYWdlOiBcXFwi8J+WvFxcXCIsXFxuICAgIGFyY2hpdmU6IFxcXCLwn5OmXFxcIixcXG4gICAgXFxcImRlZmF1bHRcXFwiOiBcXFwi4p2TXFxcIlxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREb3duVXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnksIGZyb21Ecml2ZSkge1xcblxcbiAgICB0cnkge1xcbiAgICAgICAgc2hvd0xvYWRpbmcoXFxcIuato+WcqOiOt+WPli4uLlxcXCIpO1xcbiAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCB7fSk7XFxuICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcInBsYXlcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxuICAgICAgICAgICAgcGxheVVybENhY2hlW2ZpZF0gPSB1cmw7XFxuICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIsIHBsYXlVcmxDYWNoZSk7XFxuICAgICAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgICAgIH1cXG4gICAgfSBmaW5hbGx5IHtcXG4gICAgICAgIGhpZGVMb2FkaW5nKCk7XFxuICAgIH1cXG59XFxudHJ5IHtcXG4gICAgdmFyIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUoZmlsZUlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcbiAgICAvL+iuvue9ruagh+mimFxcbiAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxuICAgIGlmIChzaGFyZUlkICE9PSBcXFwic2VsZlxcXCIpIHtcXG4gICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxuXFxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcbiAgICAgICAgICAgIHJlcyA9IHF1YXJrU2hhcmVBcGkuZ2V0TGlzdEZpbGUocmVzLmRhdGEuc2hhcmUuZmlyc3RfZmlkLCBNWV9QQUdFLCBzb3J0VmFsdWUpO1xcbiAgICAgICAgICAgIHNldFBhZ2VUaXRsZShyZXMuZGF0YS5zaGFyZS50aXRsZSk7XFxuICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcbiAgICAgICAgfVxcbiAgICB9XFxuICAgIGxldCBuY29va2llID0gcXVhcmtTaGFyZUFwaS5nZXRQaWNDb29raWUoKTtcXG4gICAgLy9sb2cobmNvb2tpZSlcXG4gICAgbGlzdC5mb3JFYWNoKGl0ZW0gPT4ge1xcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgICAgIGlmIChpdGVtLmRpcikge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBpdGVtLmluY2x1ZGVfaXRlbXMgKyAn6aG5ICAnLFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L3R1Ymlhby9tZXNzeS8yNy5zdmdcXFwiLFxcbiAgICAgICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcbiAgICAgICAgICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVUb2tlbjogcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgICAgICBmcm9tRHJpdmVcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICAgICAgZGVzYzogJC5kYXRlRm9ybWF0KGl0ZW0udXBkYXRlZF9hdCwgJ3l5eXktTU0tZGQnKSArICcgICcgKyBmb3JtYXRTaXplKGl0ZW0uc2l6ZSksXFxuICAgICAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogbmNvb2tpZVxcbiAgICAgICAgICAgICAgICB9KS5pbWFnZSgpLFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcIiNub0xvYWRpbmcjXFxcIikubGF6eVJ1bGUoZ2V0RG93blVybCwgaXRlbS5maWQsIGl0ZW0uc2hhcmVfZmlkX3Rva2VuLCBzaGFyZUlkLCBxdWFya1NoYXJlQXBpLmdldFRva2VuKCksIGl0ZW0ub2JqX2NhdGVnb3J5LCBmcm9tRHJpdmUpLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBpZDogaXRlbS5maWQsXFxuICAgICAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxuXFxuICAgICAgICAgICAgICAgICAgICBjbHM6ICdwbGF5bGlzdCAnICsgaXRlbS5vYmpfY2F0ZWdvcnlcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0pXFxuICAgICAgICB9XFxuXFxuICAgIH0pO1xcbn0gY2F0Y2ggKGUpIHtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBlLm1lc3NhZ2UsXFxuICAgICAgICB1cmw6ICdoaWtlcjovL2VtcHR5JyxcXG4gICAgICAgIGNvbF90eXBlOiAndGV4dF9jZW50ZXJfMScsXFxuICAgICAgICBleHRyYToge1xcbiAgICAgICAgICAgIGxpbmVWaXNpYmxlOiBmYWxzZVxcbiAgICAgICAgfVxcbiAgICB9KTtcXG4gICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFwi5o+Q5Y+W56CBXFxcIikpIHtcXG4gICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgdGl0bGU6IFxcXCLovpPlhaXmj5Dlj5bnoIFcXFwiLFxcbiAgICAgICAgICAgIHVybDogJCgpLmlucHV0KChNWV9QQVJBTVMpID0+IHtcXG4gICAgICAgICAgICAgICAgc2V0UGFnZVBhcmFtcyhPYmplY3QuYXNzaWduKHt9LCBNWV9QQVJBTVMsIHtcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlUHdkOiBpbnB1dFxcbiAgICAgICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgfSwgTVlfUEFSQU1TKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxuICAgICAgICB9KTtcXG4gICAgfVxcbn1cXG5zZXRSZXN1bHQoZCk7XCJ9LHtcImNvbF90eXBlXCI6XCJtb3ZpZV8zXCIsXCJuYW1lXCI6XCJwbGF5XCIsXCJwYXRoXCI6XCJwbGF5XCIsXCJydWxlXCI6XCJqczpcXG5sZXQgZnJvbURyaXZlID0gbW9kdWxlLmltcG9ydFBhcmFtO1xcbmxldCBwciwgaG9tZVVybCwgYXBpLCBjb29raWU7XFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcInVjXFxcIikge1xcbiAgICBob21lVXJsID0gXFxcImh0dHBzOi8vZHJpdmUudWMuY24vXFxcIjtcXG4gICAgcHIgPSBcXFwiVUNCcm93c2VyXFxcIjtcXG4gICAgYXBpID0gXFxcImh0dHBzOi8vcGMtYXBpLnVjLmNuXFxcIjtcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxufSBlbHNlIHtcXG4gICAgaG9tZVVybCA9IFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuL1xcXCI7XFxuICAgIHByID0gXFxcInVjcHJvXFxcIjtcXG4gICAgYXBpID0gXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY25cXFwiO1xcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG59XFxuXFxubGV0IENvb2tpZU1hbmFnZSA9ICQucmVxdWlyZShcXFwiQ29va2llTWFuYWdlXFxcIik7XFxuXFxuY29uc3QgY29va2llTWFuYWdlID0gbmV3IENvb2tpZU1hbmFnZShjb29raWUpO1xcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFwiaHR0cFJlcXVlc3RcXFwiKTtcXG5cXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcbiAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKHRpbWUgfHwgNjAwKTtcXG59XFxuXFxuZnVuY3Rpb24gcmVxdWVzdEh0dHAodXJsKSB7XFxuICAgIHJldHVybiBuZXcgaHR0cFJlcXVlc3QodXJsKVxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihib2R5Lm1lc3NhZ2UpO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXCJzZXQtY29va2llXFxcIl0pO1xcbiAgICAgICAgICAgIHJldHVybiBib2R5O1xcbiAgICAgICAgfSlcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlKTtcXG4gICAgICAgIH0pXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxuICAgICAgICAuaGVhZGVycyh7XFxuICAgICAgICAgICAgY29va2llOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcIixcXG4gICAgICAgICAgICBcXFwicmVmZXJlclxcXCI6IGhvbWVVcmxcXG4gICAgICAgIH0pO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREcml2ZUluZm8oKSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvZGlyP3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGMmYXZlcj0xXFxcIikuc3RhcnQodHJ1ZSk7XFxufVxcblxcbmZ1bmN0aW9uIGNyZWF0ZVNhdmVUYXNrKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbikge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRfbGlzdFxcXCI6IFtcXG4gICAgICAgICAgICBmaWRcXG4gICAgICAgIF0sXFxuICAgICAgICBcXFwiZmlkX3Rva2VuX2xpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkX3Rva2VuXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcInRvX3BkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLmZpZCxcXG4gICAgICAgIFxcXCJwd2RfaWRcXFwiOiBwd2RfaWQsXFxuICAgICAgICBcXFwic3Rva2VuXFxcIjogc3Rva2VuLFxcbiAgICAgICAgXFxcInBkaXJfZmlkXFxcIjogZHJpdmVJbmZvLmRhdGEuZGlyLnBkaXJfZmlkXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBjcmVhdGVEZWxldGVUYXNrKGZpZCkge1xcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXG4gICAgICAgIFxcXCJhY3Rpb25fdHlwZVxcXCI6IDIsXFxuICAgICAgICBcXFwiZmlsZWxpc3RcXFwiOiBbXFxuICAgICAgICAgICAgZmlkXFxuICAgICAgICBdLFxcbiAgICAgICAgXFxcImV4Y2x1ZGVfZmlkc1xcXCI6IFtdXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFwiLzEvY2xvdWRkcml2ZS90YXNrXFxcIikuYnVpbGRVcmwoe1xcbiAgICAgICAgcHI6IHByLFxcbiAgICAgICAgZnI6IFxcXCJwY1xcXCIsXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcbiAgICAgICAgcmV0cnlfaW5kZXg6IHJldHJ5X2luZGV4XFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2sodGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB3YWl0U2xlZXAoMzAwICogKGkgKyAxKSk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiB2b2lkKDApO1xcbn1cXG5cXG5mdW5jdGlvbiBxdWVyeVRhc2tTdGF0dXModGFza19pZCkge1xcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzID0gdGFzayh0YXNrX2lkLCBpICsgXFxcIlxcXCIpO1xcbiAgICAgICAgICAgIGlmIChyZXMuZGF0YS5zdGF0dXMgPT09IDIpIHtcXG4gICAgICAgICAgICAgICAgd2FpdFNsZWVwKDEwMDApO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCk7XFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcbiAgICB9XFxuICAgIHJldHVybiBmYWxzZTtcXG59XFxuXFxuZnVuY3Rpb24gZ2V0UHJldmlld1ZpZGVvKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS92Mi9wbGF5P3ByPVxcXCIgKyBwciArIFxcXCImZnI9cGNcXFwiKS5ib2R5KHtcXG4gICAgICAgIFxcXCJmaWRcXFwiOiBmaWQsXFxuICAgICAgICBcXFwicmVzb2x1dGlvbnNcXFwiOiBcXFwibm9ybWFsLGxvdyxoaWdoLHN1cGVyLDJrLDRrXFxcIixcXG4gICAgICAgIFxcXCJzdXBwb3J0c1xcXCI6IFxcXCJmbXA0LG0zdThcXFwiXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcblxcbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGZpZCkge1xcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS9kb3dubG9hZD9wcj1cXFwiICsgcHIgKyBcXFwiJmZyPXBjXFxcIikuYm9keSh7XFxuICAgICAgICBcXFwiZmlkc1xcXCI6IFtmaWRdXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxufVxcblxcblxcbmNvbnN0IERvd25Ub29sID0gJC5yZXF1aXJlKFxcXCJEb3duVG9vbFxcXCIpO1xcblxcbmZ1bmN0aW9uIGdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgaXNnZXRjdXJsKSB7XFxuICAgIGxldCBpc1NoYXJlID0gcHdkX2lkICE9PSBcXFwic2VsZlxcXCI7XFxuICAgIFxcbiAgICB0cnkge1xcbiAgICAgICAgaWYgKCFjb29raWUpIHJldHVybiBcXFwidG9hc3Q6Ly/or7fnmbvlvZXotKblj7dcXFwiO1xcbiAgICAgICAgbGV0IGFzZmlkID0gXFxcIlxcXCI7XFxuICAgICAgICBpZiAoaXNTaGFyZSkge1xcbiAgICAgICAgICAgIGxldCB0YXNrSWQgPSBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pLmRhdGEudGFza19pZDtcXG4gICAgICAgICAgICBhc2ZpZCA9IHF1ZXJ5VGFzayh0YXNrSWQpO1xcbiAgICAgICAgICAgIGlmICghYXNmaWQpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iOt+WPluWksei0pVxcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICBhc2ZpZCA9IGZpZDtcXG4gICAgICAgIH1cXG4gICAgICAgIGxldCBwbGF5Q29va2llID0gY29va2llTWFuYWdlLmdldCgpO1xcbiAgICAgICAgLyppZiAocHIgPT09IFxcXCJVQ0Jyb3dzZXJcXFwiKSB7XFxuICAgICAgICAgICAgcGxheUNvb2tpZSA9IGNvb2tpZTtcXG4gICAgICAgIH0qL1xcbiAgICAgICAgbGV0IHBsYXlIZWFkZXIgPSB7XFxuICAgICAgICAgICAgUmVmZXJlcjogaG9tZVVybCxcXG4gICAgICAgICAgICBjb29raWU6IHBsYXlDb29raWUsXFxuICAgICAgICAgICAgXFxcIlVzZXItQWdlbnRcXFwiOiBcXFwiTW96aWxsYS81LjAgKE1hY2ludG9zaDsgSW50ZWwgTWFjIE9TIFggMTBfMTVfNykgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzEwMC4wLjQ4OTYuNTggVUNCcm93c2VyLzE2LjUuOC4xMzA5IE1vYmlsZSBTYWZhcmkvNTM3LjM2XFxcIlxcbiAgICAgICAgfTtcXG4gICAgICAgIC8qbGV0IHBsYXlIZWFkZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgcGxheUhlYWRlciwge1xcbiAgICAgICAgICAgIFxcXCJVc2VyLUFnZW50XFxcIjogXFxcIkxvZ1N0YXRpc3RpY1xcXCJcXG4gICAgICAgIH0pOyovXFxuICAgICAgICBsZXQgY2hlY2tTaGFyZT0oKT0+KGlzU2hhcmUgJiYgY3JlYXRlRGVsZXRlVGFzayhhc2ZpZCkpfHwocGxheUhlYWRlci5jb29raWU9Y29va2llTWFuYWdlLmdldCgpKTtcXG4gICAgICAgIGxldCBwbGF5TW9kZSA9IGdldEl0ZW0oXFxcInF1YXJrX3BsYXlNb2RlXFxcIiwgXFxcIui9rOeggVxcXCIpO1xcbiAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFwiUlBDXFxcIikge1xcbiAgICAgICAgICAgIGxldCBkb3duSW5mbyA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdO1xcbiAgICAgICAgICAgIGxldCBkb3dubG9hZF91cmwgPSBkb3duSW5mby5kb3dubG9hZF91cmw7XFxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZG93bkluZm8uZmlsZV9uYW1lO1xcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICByZXR1cm4gRG93blRvb2wudXBkYXRlUnBjKGRvd25sb2FkX3VybCwgcGxheUhlYWRlciwgZmlsZW5hbWUpID8gXFxcInRvYXN0Oi8v5Yib5bu65oiQ5YqfXFxcIiA6IFxcXCJ0b2FzdDovL+WIm+W7uuWksei0pVxcXCI7XFxuICAgICAgICAgICAgLy9yZXR1cm4gXFxcInRvYXN0Oi8v5bey5o6o6YCBXFxcIjtcXG4gICAgICAgIH0gZWxzZSBpZiAoW1xcXCJjdXJsXFxcIiwgXFxcImFyaWEyXFxcIl0uaW5jbHVkZXMocGxheU1vZGUpKSB7XFxuICAgICAgICAgICAgbGV0IGRvd25JbmZvID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF07XFxuICAgICAgICAgICAgbGV0IGRvd25sb2FkX3VybCA9IGRvd25JbmZvLmRvd25sb2FkX3VybDtcXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkb3duSW5mby5maWxlX25hbWU7XFxuICAgICAgICAgICAgY2hlY2tTaGFyZSgpXFxuICAgICAgICAgICAgbGV0IGNubWQgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCJjdXJsXFxcIikge1xcbiAgICAgICAgICAgICAgICBjbm1kID0gRG93blRvb2wuZ2V0RG93bkNVUkwoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY25tZCA9IERvd25Ub29sLmdldERvd25BcmlhMmMoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSwgTnVtYmVyKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIikpKTtcXG4gICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgbGV0IHBhdGggPSBcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcIiArIGZpbGVuYW1lICsgXFxcIihcXFwiICsgcGxheU1vZGUgKyBcXFwiKS50eHRcXFwiO1xcbiAgICAgICAgICAgIHdyaXRlRmlsZShwYXRoLCBjbm1kKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInNoYXJlOi8vXFxcIiArIHBhdGg7XFxuICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09IFxcXCJ2aWRlb1xcXCIpIHtcXG5cXG4gICAgICAgICAgICBpZiAocGxheU1vZGUgPT09IFxcXCLovaznoIFcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGxldCB2aWRlb1JlcyA9IGdldFByZXZpZXdWaWRlbyhhc2ZpZCk7XFxuICAgICAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtdLFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbXVxcbiAgICAgICAgICAgICAgICB9OyAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgdmlkZW9MaXN0LmZpbHRlcih2ID0+IHYuYWNjZXNzYWJsZSkuZm9yRWFjaCh2ID0+IHtcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0Lm5hbWVzLnB1c2godi5yZXNvbHV0aW9uKTtcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LnVybHMucHVzaCh2LnZpZGVvX2luZm8udXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIik7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC5oZWFkZXJzLnB1c2gocGxheUhlYWRlcik7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcblxcbiAgICAgICAgICAgICAgICBsZXQgcGxheVVybCA9IGdldERvd25sb2FkVXJsKGFzZmlkKS5kYXRhWzBdLmRvd25sb2FkX3VybDtcXG4gICAgICAgICAgICAgICAgY2hlY2tTaGFyZSgpO1xcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxuICAgICAgICAgICAgICAgICAgICBuYW1lczogW3BsYXlNb2RlXSxcXG4gICAgICAgICAgICAgICAgICAgIHVybHM6IFtwbGF5VXJsICsgXFxcIiNpc1ZpZGVvPXRydWUjXFxcIiArIChwbGF5TW9kZSA9PT0gXFxcIuWOn+eUu1xcXCIgPyBcXFwiI2Zhc3RQbGF5TW9kZSMjdGhyZWFkcz1cXFwiICsgZ2V0SXRlbShcXFwic3BlZWRUaHJlYWRcXFwiLCBcXFwiMTBcXFwiKSArIFxcXCIjXFxcIiA6IFxcXCJcXFwiKV0sXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbcGxheUhlYWRlcl1cXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICBcXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcblxcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXG4gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT09ICdhdWRpbycpIHtcXG4gICAgICAgICAgICAgICAgbGV0IHBsYXlMaXN0ID0ge1xcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtcXFwi6Z+z6aKRXFxcIl0sXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXCIjaXNNdXNpYz10cnVlI1xcXCJdLFxcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogW3BsYXlIZWFkZXJdLFxcbiAgICAgICAgICAgICAgICAgICAgbHlyaWM6IFxcXCJcXFwiXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBsYXlMaXN0KTtcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnaW1hZ2UnKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKHBsYXlVcmwsIHBsYXlIZWFkZXIpLmltYWdlKCk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgcGxheUhlYWRlciA9IE9iamVjdC5rZXlzKHBsYXlIZWFkZXIpLm1hcChrZXkgPT4ga2V5ICsgXFxcIkBcXFwiICsgU3RyaW5nKHBsYXlIZWFkZXJba2V5XSkucmVwbGFjZSgvOy9nLCBcXFwi77yb77ybXFxcIikpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcImRvd25sb2FkOi8vXFxcIiArIHBsYXlVcmwgKyBcXFwiO3tcXFwiICsgcGxheUhlYWRlci5qb2luKFxcXCImJlxcXCIpICsgXFxcIn1cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgaWYgKGUubWVzc2FnZS5pbmNsdWRlcyhcXFwicmVxdWlyZSBsb2dpblxcXCIpIHx8IGUubWVzc2FnZS5pbmNsdWRlcyhcXFwidG9rZW5cXFwiKSB8fCBlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcImludmFsaWRcXFwiKSkge1xcbiAgICAgICAgICAgIHRvYXN0KFxcXCLmnKrnmbvlvZXmiJbnmbvlvZXov4fmnJ/vvIzor7fph43mlrDnmbvlvZVcXFwiKTtcXG4gICAgICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT1cXFwiICsgZnJvbURyaXZlO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL1xcXCIgKyBlLnRvU3RyaW5nKCk7XFxuICAgIH1cXG59XFxuXFxuJC5leHBvcnRzID0ge1xcbiAgICBnZXRQbGF5VXJsXFxufTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIueZu+W9lei0puWPt1wiLFwicGF0aFwiOlwibG9naW5cIixcInJ1bGVcIjpcImpzOlxcbmxldCBkID0gW107XFxuc2V0UGFnZVRpdGxlKFxcXCLnmbvlvZXotKblj7dcXFwiKTtcXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcImNvb2tpZVxcXCIpKTtcXG5sZXQgZnJvbT1nZXRQYXJhbShcXFwiZnJvbVxcXCIsXFxcIlxcXCIpO1xcblxcbmQucHVzaCh7XFxuICAgIHRpdGxlOiBcXFwi4oCc4oCc56Gu6K6k55m75b2V4oCd4oCdXFxcIixcXG4gICAgdXJsOiAkKFxcXCIjbm9Mb2FkaW5nI1xcXCIpLmxhenlSdWxlKChmcm9tKSA9PiB7XFxuICAgICAgICAvL2xldCBjbSA9IGFuZHJvaWQud2Via2l0LkNvb2tpZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcXG4gICAgICAgIC8vbGV0IGNtID0gY29tLnRlbmNlbnQuc210dC5zZGsuQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xcbiAgICAgICAgLy9sZXQgY29va2llID0gU3RyaW5nKGNtLmdldENvb2tpZShcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFwiKSB8fCBcXFwiXFxcIik7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0TXlWYXIoXFxcImNvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGNvb2tpZSkpIHtcXG4gICAgICAgICAgICBpZihmcm9tPT09XFxcInVjXFxcIil7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInVjQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBiYWNrKCk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9XFxuICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5pyq55m75b2VXFxcIjtcXG4gICAgfSwgZnJvbSksXFxuICAgIGRlc2M6IFxcXCLigJzigJzigJ3igJ08c21hbGw+54K55Ye75aS05YOP5Y+v5Lul6YCA5Ye66LSm5Y+36YeN5paw55m75b2VPC9zbWFsbD5cXFwiLFxcbiAgICBjb2xfdHlwZTogXFxcInRleHRfY2VudGVyXzFcXFwiXFxufSk7XFxuZC5wdXNoKHtcXG4gICAgY29sX3R5cGU6IFxcXCJsaW5lX2JsYW5rXFxcIlxcbn0pO1xcbmxldCBkdXJsPWZyb209PT1cXFwidWNcXFwiP1xcXCJodHRwczovL2RyaXZlLnVjLmNuXFxcIjpcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFwiO1xcbmQucHVzaCh7XFxuICAgIGNvbF90eXBlOiBcXFwieDVfd2Vidmlld19zaW5nbGVcXFwiLFxcbiAgICB1cmw6IGR1cmwsXFxuICAgIGRlc2M6IFxcXCJsaXN0JiZzY3JlZW4tMTUwXFxcIixcXG4gICAgZXh0cmE6IHtcXG4gICAgICAgIHVhOiBQQ19VQSxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCh0aXRsZSwgZHVybCkgPT4ge1xcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgIGNvb2tpZSA9IGZiYS5nZXRDb29raWUoZHVybCk7XFxuICAgICAgICAgICAgICAgIGZiYS5wdXRWYXIodGl0bGUgKyBcXFwiQGNvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgfSwgMjAwKTtcXG4gICAgICAgIH0sIE1ZX1JVTEUudGl0bGUsIGR1cmwpXFxuICAgIH1cXG59KTtcXG5zZXRSZXN1bHQoZClcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIuW3peWFt1wiLFwicGF0aFwiOlwidG9vbFwiLFwicnVsZVwiOlwianM6XFxuXFxuJC5leHBvcnRzPXtcXG4gICAgaXNMb2dpbkNvb2tpZShjb29raWUpe1xcbiAgICAgICAgLy9yZXR1cm4gdHJ1ZTtcXG4gICAgICAgIHJldHVybiAhIShjb29raWUgICYmIGNvb2tpZS5pbmNsdWRlcyhcXFwiX191aWQ9XFxcIikgJiYgY29va2llLmluY2x1ZGVzKFxcXCJfX3B1cz1cXFwiKSk7XFxuICAgIH1cXG59O1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5Liq5Lq66LSm5Y+36K6+572uXCIsXCJwYXRoXCI6XCJhY2NvdW50XCIsXCJydWxlXCI6XCIkLmV4cG9ydHMgPSAkKFtcXFwi5aS45YWL5LqM57u056CB55m75b2VXFxcIiwgXFxcIkNvb2tpZeeZu+W9lVxcXCIsIFxcXCLnvZHpobXnmbvlvZVcXFwiLCBcXFwi5aSN5Yi2Q29va2llXFxcIiwgXFxcIua4hemZpENvb2tpZVxcXCIsIFxcXCLojrflj5bnvZHnu5zlhbHkuqtLS0Nvb2tpZVxcXCIsIFxcXCJVQ+S6jOe7tOeggeeZu+W9lVxcXCIsIFxcXCJVQ+e9kemhteeZu+W9lVxcXCIsIFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXCIsIFxcXCLlpI3liLZVQ0Nvb2tpZVxcXCIsIFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXCJdKS5zZWxlY3QoKGlzcikgPT4ge1xcbiAgICBmdW5jdGlvbiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSB7XFxuICAgICAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCBmdW5jdGlvbihjKSB7XFxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxcbiAgICAgICAgICAgICAgICB2ID0gYyA9PT0gJ3gnID8gciA6IChyICYgMHgzIHwgMHg4KTtcXG4gICAgICAgICAgICByZXR1cm4gdi50b1N0cmluZygxNik7XFxuICAgICAgICB9KTtcXG4gICAgfVxcbiAgICBpZiAoaW5wdXQgPT09IFxcXCLnvZHpobXnmbvlvZVcXFwiKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwiQ29va2ll55m75b2VXFxcIikge1xcbiAgICAgICAgcmV0dXJuICQoXFxcIlxcXCIsIFxcXCLor7fovpPlhaVDb29raWVcXFwiKS5pbnB1dCgoaXNyKSA9PiB7XFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoaW5wdXQpKSB7XFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXHMvZywgXFxcIlxcXCIpKTtcXG4gICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFwiO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIGlzcik7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLku45UVkJPWOiOt+WPlkNvb2tpZVxcXCIpIHtcXG4gICAgICAgIGxldCBwYXRoID0gXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFwiO1xcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSkge1xcbiAgICAgICAgICAgIGlmICghbmV3IGphdmEuaW8uRmlsZShwYXRoKS5jYW5SZWFkKCkpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcIuayoeacieadg+mZkOivu+WPlkNvb2tpZeaWh+S7tu+8jOivt+aJk+W8gOaJgOacieaWh+S7tuadg+mZkFxcXFxu5rW36ZiU6K6+572uLT7mm7TlpJrlip/og70tPuWGhemDqOaWh+S7tueuoeeQhi0+5Y+z5LiK6KeSXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFwiZmlsZTovL1xcXCIgKyBwYXRoKSk7XFxuICAgICAgICAgICAgICAgIGxldCBjb29raWUgPSBqc29uLmNvb2tpZTtcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoY29va2llKSkge1xcbiAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBjb29raWUpO1xcbiAgICAgICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFwiO1xcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSl5YWx5Lqr5paH5Lu25o2f5Z2PXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHJldHVybiAkKFxcXCLmnKrmo4DmtYvliLBUVkJPWOeahENvb2tpZeaWh+S7tlxcXFxu6K+35L2/55So6L+H5ZCO5YaN5bCd6K+VXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLZDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFwicXVhcmtDb29raWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoY29va2llKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGNvb2tpZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmuIXpmaRDb29raWVcXFwiKSB7XFxuICAgICAgICBjbGVhckl0ZW0oXFxcInF1YXJrQ29va2llXFxcIik7XFxuICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/pgIDlh7rnmbvlvZVcXFwiO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwiVUPnvZHpobXnmbvlvZVcXFwiKSB7XFxuICAgICAgICByZXR1cm4gXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSM/ZnJvbT11Y1xcXCI7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCJVQ0Nvb2tpZeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHJldHVybiAkKFxcXCJcXFwiLCBcXFwi6K+36L6T5YWlQ29va2llXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcInRvb2xcXFwiKS5pc0xvZ2luQ29va2llKGlucHV0KSkge1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJ1Y0Nvb2tpZVxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxzL2csIFxcXCJcXFwiKSk7XFxuICAgICAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcIjtcXG4gICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8vQ29va2ll5qC85byP6ZSZ6K+vXFxcIjtcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9LCBpc3IpO1xcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFwi5aSN5Yi2VUNDb29raWVcXFwiKSB7XFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFwidWNDb29raWVcXFwiLCBcXFwiXFxcIik7XFxuICAgICAgICBpZiAoY29va2llKSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGNvb2tpZTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXCI7XFxuICAgICAgICB9XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXCIpIHtcXG4gICAgICAgIGNsZWFySXRlbShcXFwidWNDb29raWVcXFwiKTtcXG4gICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+mAgOWHuueZu+W9lVxcXCI7XFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLojrflj5bnvZHnu5zlhbHkuqtLS0Nvb2tpZVxcXCIpIHtcXG4gICAgICAgIGxldCBoaGQgPSB7XFxuICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnQXBhY2hlLUh0dHBDbGllbnQvVU5BVkFJTEFCTEUgKGphdmEgMS40KSdcXG4gICAgICAgIH3CoFxcbiAgICAgICAgbGV0IGR4Y3VybCA9ICdodHRwOi8vYXBpLnY2eC53aHQuZGd3aHQudG9wL3RleHQvM2RlODhkMTBkMDE5MjliZS8nXFxuICAgICAgICBsZXQgeGNkYXRhID0gWydjOTlkNzQxMWNjYzI5YmMxJ11cXG4gICAgICAgIGxldCBkeGMgPSBbXVxcbiAgICAgICAgbGV0IHlzY29va2llID0gJydcXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeGNkYXRhLmxlbmd0aDsgaSsrKSB7XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBmZXRjaChkeGN1cmwgKyB4Y2RhdGFbaV0sIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogaGhkXFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFwidG9vbFxcXCIpLmlzTG9naW5Db29raWUoZGF0YSkpIHtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIHlzY29va2llID0gZGF0YS5zcGxpdChcXFwi4pGgXFxcIilbMV07XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH1cXG4gICAgICAgIGlmICh5c2Nvb2tpZSkge1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInF1YXJrQ29va2llXFxcIiwgeXNjb29raWUpO1xcbiAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFwiO1xcbiAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgIH1cXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXCIpIHtcXG4gICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgbGV0IHJlcXVlc3RfaWQgPSBnZW5lcmF0ZVJhbmRvbVVVSUQoKTtcXG4gICAgICAgICAgICBsZXQgcWNUb2tlbiA9IEpTT04ucGFyc2UoZmV0Y2goYnVpbGRVcmwoXFxcImh0dHBzOi8vdW9wLnF1YXJrLmNuL2Nhcy9hamF4L2dldFRva2VuRm9yUXJjb2RlTG9naW5cXFwiLCB7XFxuICAgICAgICAgICAgICAgIHJlcXVlc3RfaWQsXFxuICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcIjUzMlxcXCIsXFxuICAgICAgICAgICAgICAgIHY6IFxcXCIxLjJcXFwiXFxuICAgICAgICAgICAgfSkpKS5kYXRhLm1lbWJlcnMudG9rZW47XFxuICAgICAgICAgICAgY3JlYXRlUVJDb2RlKGBodHRwczovL3N1LnF1YXJrLmNuLzRfZU1IQko/dG9rZW49JHtxY1Rva2VufSZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBgLCBmYWxzZSk7XFxuICAgICAgICAgICAgbGV0IHNlcnZpY2VfdGlja2V0ID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGVjID0gMDsgaSA8IDMwOyBpKyspIHtcXG4gICAgICAgICAgICAgICAgamF2YS5sYW5nLlRocmVhZC5zbGVlcCgyMDAwKTtcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWNrZXQgPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXCJodHRwczovL3VvcC5xdWFyay5jbi9jYXMvYWpheC9nZXRTZXJ2aWNlVGlja2V0QnlRcmNvZGVUb2tlblxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2lkOiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSxcXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IFxcXCI1MzJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHY6IFxcXCIxLjJcXFwiLFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuOiBxY1Rva2VuXFxuICAgICAgICAgICAgICAgICAgICB9KSkpO1xcbiAgICAgICAgICAgICAgICAgICAgLy9sb2codGlja2V0KVxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gMjAwMDAwMCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGlja2V0ID0gdGlja2V0LmRhdGEubWVtYmVycy5zZXJ2aWNlX3RpY2tldDtcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAxKSBjb250aW51ZTtcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAyIHx8IGkgPT09IDI5KSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+S6jOe7tOeggei/h+acn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXG4gICAgICAgICAgICAgICAgICAgIGVjKys7XFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWMgPj0gNSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/mn6Xor6Lkuoznu7TnoIHlh7rplJlcXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9XFxuXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGlmICghc2VydmljZV90aWNrZXQpIHJldHVybiBcXFwidG9hc3Q6Ly90aWNrZXTojrflj5blpLHotKVcXFwiO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKGZldGNoKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9hY2NvdW50L2luZm8/c3Q9XFxcIiArIHNlcnZpY2VfdGlja2V0ICsgXFxcIiZsdz1zY2FuXFxcIiwge1xcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAvL2xvZyhyZXMpXFxuICAgICAgICAgICAgaWYgKCFKU09OLnBhcnNlKHJlcy5ib2R5KS5zdWNjZXNzKSByZXR1cm4gXFxcInRvYXN0Oi8vdGlja2V06aqM6K+B5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcIlxcXCI7XFxuICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSByZXMuaGVhZGVycztcXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGhlYWRlcnNbXFxcInNldC1jb29raWVcXFwiXSkge1xcbiAgICAgICAgICAgICAgICBjb29raWUgKz0gYy5zcGxpdChcXFwiO1xcXCIpWzBdICsgXFxcIjtcXFwiO1xcbiAgICAgICAgICAgIH1cXG5cXG4gICAgICAgICAgICBsb2coY29va2llKTtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya0Nvb2tpZVxcXCIsIGNvb2tpZSk7XFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoZmFsc2UpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFwiO1xcbiAgICAgICAgfSBjYXRjaCAoZSkge1xcbiAgICAgICAgICAgIHJldHVybiAoXFxcInRvYXN0Oi8v55m75b2V5aSx6LSl77yaXFxcIiArIGUudG9TdHJpbmcoKSk7XFxuICAgICAgICB9XFxuICAgICAgICAvL2h0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj1zdDk2YTYzMzM5MG55OXl6bGswaXZ1b3VjN2I5Z2ZtaiZjbGllbnRfaWQ9NTMyJnNzYj13ZWJsb2dpbiZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q09QVCUzQVNBUkVBJTQwMCU3Q09QVCUzQUlNTUVSU0lWRSU0MDElN0NPUFQlM0FCQUNLX0JUTl9TVFlMRSU0MDBcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIlVD5LqM57u056CB55m75b2VXFxcIikge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcbiAgICAgICAgICAgIGxldCBxY1Rva2VuID0gSlNPTi5wYXJzZShwb3N0KGBodHRwczovL2FwaS5vcGVuLnVjLmNuL2Nhcy9hamF4L2dldFRva2VuRm9yUXJjb2RlTG9naW4/X190PSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCwge1xcbiAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODFgXFxuICAgICAgICAgICAgfSkpLmRhdGEubWVtYmVycy50b2tlbjtcXG4gICAgICAgICAgICBjcmVhdGVRUkNvZGUoYGh0dHBzOi8vc3UudWMuY24vMV9uMFpDdj90b2tlbj0ke3FjVG9rZW59JmNsaWVudF9pZD0zODEmdWNfcGFyYW1fc3RyPSZ1Y19iaXpfc3RyPVMlM0FjdXN0b20lN0NDJTNBdGl0bGViYXJfZml4YCwgZmFsc2UpO1xcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlX3RpY2tldCA9IFxcXCJcXFwiO1xcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBlYyA9IDA7IGkgPCAzMDsgaSsrKSB7XFxuICAgICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMjAwMCk7XFxuICAgICAgICAgICAgICAgIHRyeSB7XFxuICAgICAgICAgICAgICAgICAgICBsZXQgdGlja2V0ID0gSlNPTi5wYXJzZShwb3N0KGBodHRwczovL2FwaS5vcGVuLnVjLmNuL2Nhcy9hamF4L2dldFNlcnZpY2VUaWNrZXRCeVFyY29kZVRva2VuP19fdD0ke25ldyBEYXRlKCkuZ2V0VGltZSgpfWAsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBib2R5OiBgdj0xLjImcmVxdWVzdF9pZD0ke3JlcXVlc3RfaWR9JmNsaWVudF9pZD0zODEmdG9rZW49JHtxY1Rva2VufWBcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgICAgIC8vbG9nKHRpY2tldClcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDIwMDAwMDApIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3RpY2tldCA9IHRpY2tldC5kYXRhLm1lbWJlcnMuc2VydmljZV90aWNrZXQ7XFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMSkgY29udGludWU7XFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMiB8fCBpID09PSAyOSkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/kuoznu7TnoIHov4fmnJ9cXFwiO1xcbiAgICAgICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgICAgICAgICBlYysrO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVjID49IDUpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcInRvYXN0Oi8v5p+l6K+i5LqM57u056CB5Ye66ZSZXFxcIjtcXG4gICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgfVxcblxcbiAgICAgICAgICAgIH1cXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2VfdGlja2V0KSByZXR1cm4gXFxcInRvYXN0Oi8vdGlja2V06I635Y+W5aSx6LSlXFxcIjtcXG4gICAgICAgICAgICBsZXQgcmVzID0gSlNPTi5wYXJzZShmZXRjaChgaHR0cHM6Ly9kcml2ZS51Yy5jbi9hY2NvdW50L2luZm8/c3Q9JHtzZXJ2aWNlX3RpY2tldH1gLCB7XFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIC8vbG9nKHJlcylcXG4gICAgICAgICAgICBpZiAoIUpTT04ucGFyc2UocmVzLmJvZHkpLnN1Y2Nlc3MpIHJldHVybiBcXFwidG9hc3Q6Ly90aWNrZXTpqozor4HlpLHotKVcXFwiO1xcbiAgICAgICAgICAgIGxldCBjb29raWUgPSBcXFwiXFxcIjtcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xcbiAgICAgICAgICAgIGZvciAobGV0IGMgb2YgaGVhZGVyc1tcXFwic2V0LWNvb2tpZVxcXCJdKSB7XFxuICAgICAgICAgICAgICAgIGNvb2tpZSArPSBjLnNwbGl0KFxcXCI7XFxcIilbMF0gKyBcXFwiO1xcXCI7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIGxvZyhjb29raWUpO1xcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcInVjQ29va2llXFxcIiwgY29va2llKTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxuICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXCI7XFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxuICAgICAgICAgICAgcmV0dXJuIChcXFwidG9hc3Q6Ly/nmbvlvZXlpLHotKXvvJpcXFwiICsgZS50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgfVxcbn0sICQuaW1wb3J0UGFyYW0pO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwiQ29va2llTWFuYWdlXCIsXCJwYXRoXCI6XCJDb29raWVNYW5hZ2VcIixcInJ1bGVcIjpcImZ1bmN0aW9uIENvb2tpZU1hbmFnZShjb29raWUpIHtcXG4gICAgdGhpcy5jb29raWUgPSB7fTtcXG4gICAgdGhpcy5hZGQoY29va2llKTtcXG59XFxuT2JqZWN0LmFzc2lnbihDb29raWVNYW5hZ2UucHJvdG90eXBlLCB7XFxuICAgIGFkZChjb29raWUpIHtcXG4gICAgICAgIGxldCBjb29raWVzID0gW107XFxuICAgICAgICBpZiAodHlwZW9mIGNvb2tpZSA9PT0gXFxcInN0cmluZ1xcXCIpIHtcXG4gICAgICAgICAgICBjb29raWVzID0gY29va2llLnNwbGl0KFxcXCI7XFxcIik7XFxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29va2llKSkge1xcbiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWU7XFxuICAgICAgICB9XFxuICAgICAgICBjb29raWVzLmZvckVhY2godiA9PiB7XFxuICAgICAgICAgICAgdiA9IHYuc3BsaXQoXFxcIj1cXFwiKTtcXG4gICAgICAgICAgICBpZiAodi5sZW5ndGggPCAyKSByZXR1cm47XFxuICAgICAgICAgICAgbGV0IGtleSA9IHYuc2hpZnQoKS50cmltKCk7XFxuICAgICAgICAgICAgdGhpcy5jb29raWVba2V5XSA9IHYuam9pbihcXFwiPVxcXCIpLnRyaW0oKTtcXG4gICAgICAgIH0pO1xcbiAgICB9LFxcbiAgICBnZXQoKSB7XFxuICAgICAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5jb29raWUpLm1hcCh2ID0+IHZbMF0gKyBcXFwiPVxcXCIgKyB2WzFdKS5qb2luKFxcXCI7XFxcIik7XFxuICAgIH1cXG59KTtcXG4vL2NvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXG4kLmV4cG9ydHM9Q29va2llTWFuYWdlO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aSp57+8QVBJXCIsXCJwYXRoXCI6XCJDbG91ZERyaXZlXCIsXCJydWxlXCI6XCJjb25zdCBDcnlwdG9VdGlsID0gJC5yZXF1aXJlKFxcXCJoaWtlcjovL2Fzc2V0cy9jcnlwdG8tamF2YS5qc1xcXCIpO1xcblxcbmZ1bmN0aW9uIENsb3VkRHJpdmUoKSB7XFxuICAgIHRoaXMucmVnZXggPSAvaHR0cHM6XFxcXC9cXFxcL2Nsb3VkXFxcXC4xODlcXFxcLmNuXFxcXC93ZWJcXFxcL3NoYXJlXFxcXD9jb2RlPShbMC05QS1aYS16XSspLzsgLy9odHRwczovL2Nsb3VkLjE4OS5jbi93ZWIvc2hhcmU/Y29kZT1xSTNhTWpxWVJycWFcXG4gICAgdGhpcy5jb25maWcgPSB7XFxuICAgICAgICBjbGllbnRJZDogJzUzODEzNTE1MDY5MzQxMicsXFxuICAgICAgICBtb2RlbDogJ0tCMjAwMCcsXFxuICAgICAgICB2ZXJzaW9uOiAnOS4wLjYnLFxcbiAgICAgICAgcHViS2V5OiAnTUlHZk1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FDWkx5VjRnSE5EVUdKTVpvT2NZYXV4bU5Fc0tyYzBUbExlQkVWVklJUU56RzRXcWppbWNlT2o1UjlFVHdEZWVTTjN5ZWpBS0xHSGd4ODNseXkyd0Jqdm5iZm0vbkxPYnlXd1FELzA5Q21wWmR4b0ZZQ0g2cmREalJwd1pPWjJuWFNacGdrWlhvT0JrZk5YTnhuTjc0YVh0aG8yZHFCeW5UdzNORlRXeVFsOEJRSURBUUFCJyxcXG4gICAgfTtcXG4gICAgdGhpcy5oZWFkZXJzID0ge1xcbiAgICAgICAgJ1VzZXItQWdlbnQnOiBgTW96aWxsYS81LjAgKExpbnV4OyBVOyBBbmRyb2lkIDExOyAke3RoaXMuY29uZmlnLm1vZGVsfSBCdWlsZC9SUDFBLjIwMTAwNS4wMDEpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NC4wLjM3MjkuMTM2IE1vYmlsZSBTYWZhcmkvNTM3LjM2IEVjbG91ZC8ke3RoaXMuY29uZmlnLnZlcnNpb259IEFuZHJvaWQvMzAgY2xpZW50SWQvJHt0aGlzLmNvbmZpZy5jbGllbnRJZH0gY2xpZW50TW9kZWwvJHt0aGlzLmNvbmZpZy5tb2RlbH0gY2xpZW50Q2hhbm5lbElkL3FxIHByb1ZlcnNpb24vMS4wLjZgLFxcbiAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9tLmNsb3VkLjE4OS5jbi96aHVhbnRpLzIwMTYvc2lnbi9pbmRleC5qc3A/YWxidW1CYWNrdXBPcGVuZWQ9MScsXFxuICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxcbiAgICB9O1xcbiAgICB0aGlzLmFwaSA9ICdodHRwczovL2Nsb3VkLjE4OS5jbi9hcGknO1xcbiAgICB0aGlzLnNoYXJlQ29kZSA9ICcnO1xcbiAgICB0aGlzLmFjY2Vzc0NvZGUgPSAnJztcXG4gICAgdGhpcy5zaGFyZUlkID0gJyc7XFxuICAgIHRoaXMuc2hhcmVNb2RlID0gJyc7XFxuICAgIHRoaXMuaXNGb2xkZXIgPSAnJztcXG59XFxuT2JqZWN0LmFzc2lnbihDbG91ZERyaXZlLnByb3RvdHlwZSwge1xcbiAgICBjaGVja0Nvb2tpZSgpIHtcXG4gICAgICAgIGlmICghdGhpcy5jb29raWUgJiYgdGhpcy5hY2NvdW50ICYmIHRoaXMucGFzc3dvcmQpIHtcXG4gICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIHRoaXMubG9naW4odGhpcy5hY2NvdW50LCB0aGlzLnBhc3N3b3JkKSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcXFwi5pyq55m75b2VXFxcIik7XFxuICAgICAgICB9XFxuICAgIH0sXFxuICAgIGdldENvb2tpZSgpIHtcXG4gICAgICAgIHJldHVybiBnZXRJdGVtKFxcXCJjbG91ZENvb2tpZVxcXCIsIFxcXCJcXFwiKTtcXG4gICAgfSxcXG4gICAgbG9naW4odW5hbWUsIHBhc3N3ZCkge1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9vcGVuLmUuMTg5LmNuL2FwaS9sb2dib3gvY29uZmlnL2VuY3J5cHRDb25mLmRvP2FwcElkPWNsb3VkJykpO1xcbiAgICAgICAgICAgIGxldCBwdWJLZXkgPSByZXNwLmRhdGEucHViS2V5O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8vY2xvdWQuMTg5LmNuL2FwaS9wb3J0YWwvbG9naW5VcmwuYWN0aW9uP3JlZGlyZWN0VVJMPWh0dHBzOi8vY2xvdWQuMTg5LmNuL3dlYi9yZWRpcmVjdC5odG1sP3JldHVyblVSTD0vbWFpbi5hY3Rpb24nLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgIGNvb2tpZTogXFxcIiNub0Nvb2tpZSNcXFwiXFxuICAgICAgICAgICAgICAgIH0sXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIC8vbG9nKHJlc3ApXFxuICAgICAgICAgICAgLy8g6I635Y+W5pyA5ZCO6K+35rGCdXJs5Lit55qE5Y+C5pWwcmVxSWTlkoxsdFxcbiAgICAgICAgICAgIGxldCBSZXFpZCA9IHJlc3AudXJsLm1hdGNoKC9yZXFJZD0oXFxcXHcrKS8pWzFdO1xcbiAgICAgICAgICAgIGxldCBMdCA9IHJlc3AudXJsLm1hdGNoKC9sdD0oXFxcXHcrKS8pWzFdO1xcbiAgICAgICAgICAgIGxldCB0SGVhZGVycyA9IHtcXG4gICAgICAgICAgICAgICAgXFxcIkNvbnRlbnQtVHlwZVxcXCI6IFxcXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcXFwiLFxcbiAgICAgICAgICAgICAgICAnVXNlci1BZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0OyBydjo3NC4wKSBHZWNrby8yMDEwMDEwMSBGaXJlZm94Lzc2LjAnLFxcbiAgICAgICAgICAgICAgICAnUmVmZXJlcic6ICdodHRwczovL29wZW4uZS4xODkuY24vJyxcXG4gICAgICAgICAgICAgICAgTHQsXFxuICAgICAgICAgICAgICAgIFJlcWlkLFxcbiAgICAgICAgICAgIH07XFxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XFxuICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjAnLFxcbiAgICAgICAgICAgICAgICBhcHBLZXk6ICdjbG91ZCdcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vb3Blbi5lLjE4OS5jbi9hcGkvbG9nYm94L29hdXRoMi9hcHBDb25mLmRvJywge1xcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB0SGVhZGVycyxcXG4gICAgICAgICAgICAgICAgYm9keTogZGF0YVxcbiAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICBsZXQgcmV0dXJuVXJsID0gcmVzcC5kYXRhLnJldHVyblVybDtcXG4gICAgICAgICAgICBsZXQgcGFyYW1JZCA9IHJlc3AuZGF0YS5wYXJhbUlkO1xcbiAgICAgICAgICAgIC8vY29uc3Qga2V5RGF0YSA9IGAtLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLVxcXFxuJHtwdWJLZXl9XFxcXG4tLS0tLUVORCBQVUJMSUMgS0VZLS0tLS1gO1xcbiAgICAgICAgICAgIC8vY29uc3QganNlbmNyeXB0ID0gbmV3IEpTRW5jcnlwdCgpO1xcbiAgICAgICAgICAgIC8vanNlbmNyeXB0LnNldFB1YmxpY0tleShrZXlEYXRhKTtcXG4gICAgICAgICAgICAvL2NvbnN0IGVuVW5hbWUgPSBCdWZmZXIuZnJvbShqc2VuY3J5cHQuZW5jcnlwdCh1bmFtZSksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxuICAgICAgICAgICAgLy9jb25zdCBlblBhc3N3ZCA9IEJ1ZmZlci5mcm9tKGpzZW5jcnlwdC5lbmNyeXB0KHBhc3N3ZCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxuICAgICAgICAgICAgbGV0IGVuVW5hbWUgPSBDcnlwdG9VdGlsLkRhdGEucGFyc2VCYXNlNjQocnNhRW5jcnlwdCh1bmFtZSwgcHViS2V5KSwgX2Jhc2U2NC5OT19XUkFQKS50b0hleCgpLnRvVXBwZXJDYXNlKCk7XFxuICAgICAgICAgICAgbGV0IGVuUGFzc3dkID0gQ3J5cHRvVXRpbC5EYXRhLnBhcnNlQmFzZTY0KHJzYUVuY3J5cHQocGFzc3dkLCBwdWJLZXkpLCBfYmFzZTY0Lk5PX1dSQVApLnRvSGV4KCkudG9VcHBlckNhc2UoKTtcXG4gICAgICAgICAgICBkYXRhID0ge1xcbiAgICAgICAgICAgICAgICBhcHBLZXk6ICdjbG91ZCcsXFxuICAgICAgICAgICAgICAgIHZlcnNpb246ICcyLjAnLFxcbiAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogJzAxJyxcXG4gICAgICAgICAgICAgICAgbWFpbFN1ZmZpeDogJ0AxODkuY24nLFxcbiAgICAgICAgICAgICAgICB2YWxpZGF0ZUNvZGU6ICcnLFxcbiAgICAgICAgICAgICAgICByZXR1cm5VcmwsXFxuICAgICAgICAgICAgICAgIHBhcmFtSWQsXFxuICAgICAgICAgICAgICAgIGNhcHRjaGFUb2tlbjogJycsXFxuICAgICAgICAgICAgICAgIGR5bmFtaWNDaGVjazogJ0ZBTFNFJyxcXG4gICAgICAgICAgICAgICAgY2xpZW50VHlwZTogJzEnLFxcbiAgICAgICAgICAgICAgICBjYl9TYXZlTmFtZTogJzAnLFxcbiAgICAgICAgICAgICAgICBpc09hdXRoMjogZmFsc2UsXFxuICAgICAgICAgICAgICAgIHVzZXJOYW1lOiBge05SUH0ke2VuVW5hbWV9YCxcXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IGB7TlJQfSR7ZW5QYXNzd2R9YCxcXG4gICAgICAgICAgICB9O1xcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHBvc3QoJ2h0dHBzOi8vb3Blbi5lLjE4OS5jbi9hcGkvbG9nYm94L29hdXRoMi9sb2dpblN1Ym1pdC5kbycsIHtcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdEhlYWRlcnMsXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcbiAgICAgICAgICAgICAgICBib2R5OiBkYXRhXFxuICAgICAgICAgICAgfSkpO1xcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKHJlc3AuYm9keSk7XFxuICAgICAgICAgICAgaWYgKHJlcy50b1VybCkge1xcblxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llcyA9IHJlc3AuaGVhZGVyc1snc2V0LWNvb2tpZSddLm1hcChpdCA9PiBpdC5zcGxpdCgnOycpWzBdKS5qb2luKCc7Jyk7XFxuICAgICAgICAgICAgICAgIHJlcyA9IEpTT04ucGFyc2UocmVxdWVzdChyZXMudG9VcmwsIHtcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuaGVhZGVycywge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogY29va2llc1xcbiAgICAgICAgICAgICAgICAgICAgfSksXFxuICAgICAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcbiAgICAgICAgICAgICAgICB9KSk7XFxuXFxuICAgICAgICAgICAgICAgIGNvb2tpZXMgKz0gJzsgJyArIChyZXMuaGVhZGVyc1snc2V0LWNvb2tpZSddIHx8IFtdKS5tYXAoaXQgPT4gaXQuc3BsaXQoJzsnKVswXSkuam9pbignOycpO1xcbiAgICAgICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIGNvb2tpZXMpO1xcbiAgICAgICAgICAgICAgICBsb2coY29va2llcyk7XFxuICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGxvZ2luOicgKyBKU09OLnN0cmluZ2lmeShyZXNwKSk7XFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgbG9naW46JyArIGVycm9yLnRvU3RyaW5nKCkpO1xcbiAgICAgICAgfVxcbiAgICB9LFxcbiAgICBnZXRTaGFyZVVybERhdGEodXJsKSB7XFxuICAgICAgICBsZXQgbWF0Y2hlcyA9IHRoaXMucmVnZXguZXhlYyh1cmwpO1xcbiAgICAgICAgbGV0IHNoYXJlRGF0YTAgPSB7fTtcXG4gICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXNbMV0pIHtcXG4gICAgICAgICAgICBzaGFyZURhdGEwLnNoYXJlQ29kZSA9IG1hdGNoZXNbMV07XFxuICAgICAgICAgICAgbGV0IGFjY2Vzc0NvZGVNYXRjaCA9IHVybC5tYXRjaCgv6K6/6Zeu56CB77yaKFthLXpBLVowLTldKykvKTtcXG4gICAgICAgICAgICBzaGFyZURhdGEwLmFjY2Vzc0NvZGUgPSBhY2Nlc3NDb2RlTWF0Y2ggPyBhY2Nlc3NDb2RlTWF0Y2hbMV0gOiAnJztcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IG1hdGNoZXNfID0gdXJsLm1hdGNoKC9odHRwczpcXFxcL1xcXFwvY2xvdWRcXFxcLjE4OVxcXFwuY25cXFxcL3RcXFxcLyhbMC05QS1aYS16XSspLyk7XFxuICAgICAgICAgICAgc2hhcmVEYXRhMC5zaGFyZUNvZGUgPSBtYXRjaGVzXyA/IG1hdGNoZXNfWzFdIDogbnVsbDtcXG4gICAgICAgICAgICBsZXQgYWNjZXNzQ29kZU1hdGNoID0gdXJsLm1hdGNoKC/orr/pl67noIHvvJooW2EtekEtWjAtOV0rKS8pO1xcbiAgICAgICAgICAgIHNoYXJlRGF0YTAuYWNjZXNzQ29kZSA9IGFjY2Vzc0NvZGVNYXRjaCA/IGFjY2Vzc0NvZGVNYXRjaFsxXSA6ICcnO1xcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIHNoYXJlRGF0YTA7XFxuICAgIH0sXFxuICAgIGdldFNoYXJlSW5mb0RhdGEoc2hhcmVVcmwsIGNvZGUpIHtcXG4gICAgICAgIGxldCBzaGFyZURhdGEgPSB0aGlzLmdldFNoYXJlVXJsRGF0YShzaGFyZVVybCk7XFxuICAgICAgICBjb2RlICYmIChzaGFyZURhdGEuYWNjZXNzQ29kZSA9IGNvZGUpO1xcbiAgICAgICAgdHJ5IHtcXG4gICAgICAgICAgICBsZXQgcmVzcCA9IEpTT04ucGFyc2UocmVxdWVzdChgJHt0aGlzLmFwaX0vb3Blbi9zaGFyZS9nZXRTaGFyZUluZm9CeUNvZGVWMi5hY3Rpb24/a2V5PW5vQ2FjaGUmc2hhcmVDb2RlPSR7c2hhcmVEYXRhLnNoYXJlQ29kZX1gLCB7XFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcXG4gICAgICAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzEuMC4wLjAgU2FmYXJpLzUzNy4zNicsXFxuICAgICAgICAgICAgICAgICAgICAnYWNjZXB0JzogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD1VVEYtOCcsXFxuICAgICAgICAgICAgICAgICAgICAvLydhY2NlcHQtZW5jb2RpbmcnOiAnZ3ppcCwgZGVmbGF0ZSwgYnIsIHpzdGQnLFxcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdC1sYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOScsXFxuICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICB9KSk7XFxuICAgICAgICAgICAgc2hhcmVEYXRhLnJvb3RGaWxlSWQgPSByZXNwLmZpbGVJZDtcXG4gICAgICAgICAgICBzaGFyZURhdGEuc2hhcmVJZCA9IHJlc3Auc2hhcmVJZDtcXG4gICAgICAgICAgICBzaGFyZURhdGEuc2hhcmVNb2RlID0gcmVzcC5zaGFyZU1vZGU7XFxuICAgICAgICAgICAgc2hhcmVEYXRhLmlzRm9sZGVyID0gcmVzcC5pc0ZvbGRlcjtcXG4gICAgICAgICAgICByZXR1cm4gc2hhcmVEYXRhO1xcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgZ2V0U2hhcmVJbmZvOicgKyBlcnJvci50b1N0cmluZygpKTtcXG4gICAgICAgIH1cXG4gICAgICAgIHJldHVybiB7fTtcXG4gICAgfSxcXG4gICAgZ2V0U2hhcmVGaWxlcyhmaWxlSWQsIHNoYXJlRGF0YSwgcGFnZSwgb3JkZXJCeSkge1xcbiAgICAgICAgbGV0IHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoYCR7dGhpcy5hcGl9L29wZW4vc2hhcmUvbGlzdFNoYXJlRGlyLmFjdGlvbj9rZXk9bm9DYWNoZSZwYWdlTnVtPSR7cGFnZXx8MX0mcGFnZVNpemU9NjAmZmlsZUlkPSR7ZmlsZUlkfSZzaGFyZURpckZpbGVJZD0ke2ZpbGVJZH0maXNGb2xkZXI9JHtzaGFyZURhdGEuaXNGb2xkZXJ9JnNoYXJlSWQ9JHtzaGFyZURhdGEuc2hhcmVJZHx8XFxcIlxcXCJ9JnNoYXJlTW9kZT0ke3NoYXJlRGF0YS5zaGFyZU1vZGV9Jmljb25PcHRpb249NSZvcmRlckJ5PSR7b3JkZXJCeXx8XFxcImxhc3RPcFRpbWVcXFwifSZkZXNjZW5kaW5nPXRydWUmYWNjZXNzQ29kZT0ke3NoYXJlRGF0YS5hY2Nlc3NDb2RlfWAsIHtcXG4gICAgICAgICAgICBoZWFkZXJzOiB7XFxuICAgICAgICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXG4gICAgICAgICAgICAgICAgJ3VzZXItYWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzMS4wLjAuMCBTYWZhcmkvNTM3LjM2JyxcXG4gICAgICAgICAgICB9XFxuICAgICAgICB9KSk7XFxuICAgICAgICBsb2cocmVzcClcXG4gICAgICAgIGxldCBmaWxlcyA9IFtdO1xcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNwLmZpbGVMaXN0QU8uZmlsZUxpc3QpIHtcXG4gICAgICAgICAgICBmaWxlcy5wdXNoKHtcXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmlkLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxuICAgICAgICAgICAgICAgIGxhc3RPcFRpbWU6IGl0ZW0ubGFzdE9wVGltZSxcXG4gICAgICAgICAgICAgICAgZGlyOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBpdGVtLm1lZGlhVHlwZVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNwLmZpbGVMaXN0QU8uZm9sZGVyTGlzdCkge1xcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZC50b1N0cmluZygpLFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUudG9TdHJpbmcoKSxcXG4gICAgICAgICAgICAgICAgbGFzdE9wVGltZTogaXRlbS5sYXN0T3BUaW1lLnRvU3RyaW5nKCksXFxuICAgICAgICAgICAgICAgIGRpcjogdHJ1ZVxcbiAgICAgICAgICAgIH0pO1xcblxcbiAgICAgICAgfVxcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xcbiAgICB9XFxufSk7XFxuJC5leHBvcnRzID0gbmV3IENsb3VkRHJpdmUoKTtcXG4vL25ldyBDbG91ZERyaXZlKCkubG9naW4oXFxcIjE4MTgxMTI1NTM4XFxcIiwgXFxcIl5BMUIyQzNAbG95ZGdpa1xcXCIpO1wifSx7XCJjb2xfdHlwZVwiOlwibW92aWVfM1wiLFwibmFtZVwiOlwi5aSp57+85YiX6KGoXCIsXCJwYXRoXCI6XCJjbG91ZFNoYXJlTGlzdFwiLFwicnVsZVwiOlwianM6XFxubGV0IHRpdGxlSGVhZCA9IHtcXG4gICAgdmlkZW86IFxcXCLwn46sXFxcIixcXG4gICAgYXVkaW86IFxcXCLwn461XFxcIixcXG4gICAgZG9jOiBcXFwi8J+TkVxcXCIsXFxuICAgIGltYWdlOiBcXFwi8J+WvFxcXCIsXFxuICAgIGFyY2hpdmU6IFxcXCLwn5OmXFxcIixcXG4gICAgXFxcImRlZmF1bHRcXFwiOiBcXFwi4p2TXFxcIlxcbn07XFxuXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXG4gICAgbGV0IGhlYWQgPSB0aXRsZUhlYWRbdHlwZV07XFxuXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXCLinZNcXFwiO1xcbn1cXG5cXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXG4gICAgaWYgKCFzaXplKSB7XFxuICAgICAgICByZXR1cm4gJyc7XFxuICAgIH1cXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXG4gICAgbGV0IGkgPSAwO1xcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxuICAgICAgICBpKys7XFxuICAgIH1cXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxuICAgIHJldHVybiBgJHtzaXplfSAke3VuaXRzW2ldfWA7XFxufVxcblxcblxcbmxldCByZWFsdXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXCJyZWFsdXJsXFxcIiwgXFxcIlxcXCIpKTtcXG5cXG5cXG5sZXQgY2xvdWREcml2ZSA9ICQucmVxdWlyZShcXFwiQ2xvdWREcml2ZVxcXCIpO1xcblxcblxcbmxldCBzaGFyZURhdGEgPSBjbG91ZERyaXZlLmdldFNoYXJlSW5mb0RhdGEocmVhbHVybCk7XFxubGV0IGxpc3QgPSBjbG91ZERyaXZlLmdldFNoYXJlRmlsZXMoTVlfUEFSQU1TLmZpbGVJZCB8fCBzaGFyZURhdGEucm9vdEZpbGVJZCwgc2hhcmVEYXRhLCBNWV9QQUdFKTtcXG5cXG5sZXQgZCA9IFtdO1xcbmxpc3QuZm9yRWFjaChpdGVtID0+IHtcXG4gICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXG4gICAgaWYgKGl0ZW0uZGlyKSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBcXFwi8J+TglxcXCIgKyBpdGVtLmZpbGVfbmFtZSxcXG4gICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGl0ZW0uaW5jbHVkZV9pdGVtcyArICfpobkgICcsXFxuICAgICAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcIixcXG4gICAgICAgICAgICB1cmw6IFxcXCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3BhZ2U9ZnlwYWdlXFxcIixcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgc2hhcmVJZCxcXG4gICAgICAgICAgICAgICAgc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXG4gICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgZnJvbURyaXZlXFxuICAgICAgICAgICAgfVxcbiAgICAgICAgfSk7XFxuICAgIH0gZWxzZSB7XFxuICAgICAgICBkLnB1c2goe1xcbiAgICAgICAgICAgIHRpdGxlOiBnZXRIZWFkKGl0ZW0ub2JqX2NhdGVnb3J5KSArIGl0ZW0uZmlsZV9uYW1lLFxcbiAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcbiAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXG4gICAgICAgICAgICAgICAgY29va2llOiBuY29va2llXFxuICAgICAgICAgICAgfSkuaW1hZ2UoKSxcXG4gICAgICAgICAgICB1cmw6ICQoKS5sYXp5UnVsZSgoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsQ2FjaGUgPSBzdG9yYWdlMC5nZXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwge30pO1xcbiAgICAgICAgICAgICAgICBpZiAocGxheVVybENhY2hlW2ZpZF0pIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSAkLnJlcXVpcmUoXFxcInBsYXlcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxuICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXCJwbGF5VXJsQ2FjaGVcXFwiLCBwbGF5VXJsQ2FjaGUpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0sIGl0ZW0uZmlkLCBpdGVtLnNoYXJlX2ZpZF90b2tlbiwgc2hhcmVJZCwgcXVhcmtTaGFyZUFwaS5nZXRUb2tlbigpLCBpdGVtLm9ial9jYXRlZ29yeSwgZnJvbURyaXZlKSxcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgaWQ6IGl0ZW0uZmlkLFxcbiAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxuICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0pXFxuICAgIH1cXG5cXG59KTtcIn0se1wiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcIm5hbWVcIjpcIkRvd25Ub29sXCIsXCJwYXRoXCI6XCJEb3duVG9vbFwiLFwicnVsZVwiOlwianM6XFxuXFxuZnVuY3Rpb24gZ2V0RG93bkNVUkwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkge1xcbiAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgY3VybCBjb21tYW5kIHdpdGggdGhlIFVSTFxcbiAgICBsZXQgY3VybENvbW1hbmQgPSBgY3VybCAtbyBcXFwiJHtmaWxlbmFtZX1cXFwiIFxcXCIke3VybH1cXFwiYDtcXG5cXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIGN1cmwgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxuICAgIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgY3VybENvbW1hbmQgKz0gT2JqZWN0LmVudHJpZXMoaGVhZGVycykucmVkdWNlKChjb21tYW5kLCBba2V5LCB2YWx1ZV0pID0+IHtcXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29tbWFuZH0gLUggXFxcIiR7a2V5fTogJHt2YWx1ZX1cXFwiYDtcXG4gICAgICAgIH0sICcgJyk7XFxuICAgIH1cXG5cXG4gICAgcmV0dXJuIGN1cmxDb21tYW5kO1xcbn1cXG5cXG5mdW5jdGlvbiBnZXREb3duQXJpYTJjKHVybCwgaGVhZGVycywgZmlsZW5hbWUsIGN1dCkge1xcbiAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgYXJpYTJjIGNvbW1hbmQgd2l0aCB0aGUgVVJMIGFuZCBudW1iZXIgb2YgY29ubmVjdGlvbnMvc2VnbWVudHNcXG4gICAgY3V0ID0gY3V0IHx8IDE7XFxuICAgIGN1dCA9IGN1dCA+IDE2ID8gMTYgOiBjdXQ7XFxuXFxuICAgIGxldCBhcmlhMkNvbW1hbmQgPSBgYXJpYTJjIC14ICR7Y3V0fSAtcyAke2N1dH0gLW8gXFxcIiR7ZmlsZW5hbWV9XFxcIiBcXFwiJHt1cmx9XFxcImA7XFxuXFxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSBhcmlhMmMgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxuICAgIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xcbiAgICAgICAgYXJpYTJDb21tYW5kICs9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLnJlZHVjZSgoY29tbWFuZCwgW2tleSwgdmFsdWVdKSA9PiB7XFxuICAgICAgICAgICAgcmV0dXJuIGAke2NvbW1hbmR9IC0taGVhZGVyPVxcXCIke2tleX06ICR7dmFsdWV9XFxcImA7XFxuICAgICAgICB9LCAnICcpO1xcbiAgICB9XFxuXFxuICAgIHJldHVybiBhcmlhMkNvbW1hbmQ7XFxufVxcbmZ1bmN0aW9uIGdldERlZlJwY1VybCgpe1xcbiAgICBsZXQgZGVmaXAgPSBnZXRJUCgpLnNwbGl0KFxcXCIuXFxcIik7XFxuICAgIGRlZmlwLnB1c2goTnVtYmVyKGRlZmlwLnBvcCgpKSArIDIpO1xcbiAgICByZXR1cm4gXFxcImh0dHA6Ly9cXFwiICsgZGVmaXAuam9pbihcXFwiLlxcXCIpICsgXFxcIjoxNjgwMC9qc29ucnBjXFxcIjtcXG59XFxuZnVuY3Rpb24gdXBkYXRlUnBjKHVybCwgaGVhZGVycywgZmlsZW5hbWUpIHtcXG4gICAgLy9sb2coaGVhZGVycylcXG4gICAgbGV0IGhlYWRlciA9IFtdO1xcbiAgICBsZXQgcnBjRGF0YSA9IHtcXG4gICAgICAgIGlkOiBEYXRlLm5vdygpLFxcbiAgICAgICAganNvbnJwYzogXFxcIjIuMFxcXCIsXFxuICAgICAgICBtZXRob2Q6IFxcXCJhcmlhMi5hZGRVcmlcXFwiLFxcbiAgICAgICAgcGFyYW1zOiBbXFxcInRva2VuOlxcXCIgKyBnZXRJdGVtKFxcXCJycGNBcmlhVG9rZW5cXFwiLCBcXFwiXFxcIiksIFt1cmxdLCB7XFxuICAgICAgICAgICAgZGlyOiBnZXRJdGVtKFxcXCJycGNEb3duRGlyXFxcIixcXFwiXFxcIil8fHZvaWQgMCxcXG4gICAgICAgICAgICBvdXQ6IGZpbGVuYW1lLFxcbiAgICAgICAgICAgIGhlYWRlclxcbiAgICAgICAgfV1cXG4gICAgfTtcXG5cXG4gICAgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XFxuICAgICAgICBPYmplY3QuZW50cmllcyhoZWFkZXJzKS5mb3JFYWNoKFtrZXksIHZhbHVlXSA9PiB7XFxuICAgICAgICAgICAgaGVhZGVyLnB1c2goYCR7a2V5fTogJHt2YWx1ZX1gKTtcXG4gICAgICAgIH0pO1xcbiAgICB9XFxuICAgIFxcbiAgICBsZXQgcmVzID0gcG9zdChnZXRJdGVtKFxcXCJycGNVcmxcXFwiLCBnZXREZWZScGNVcmwoKSksIHtcXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJwY0RhdGEpXFxuICAgIH0pO1xcbiAgICByZXR1cm4gcmVzLmluY2x1ZGVzKCdcXFwicmVzdWx0XFxcIjonKTtcXG59XFxuXFxuJC5leHBvcnRzPXtcXG4gICAgZ2V0RG93bkNVUkwsXFxuICAgIGdldERvd25BcmlhMmMsXFxuICAgIHVwZGF0ZVJwYyxcXG4gICAgZ2V0RGVmUnBjVXJsXFxufTtcXG5cIn1dLFwicGFyYW1zXCI6XCJ7XFxcImhpZGVTZXR0aW5nXFxcIjp0cnVlLFxcXCJwYWdlVGl0bGVcXFwiOlxcXCLmkJzntKJcXFwiLFxcXCJzaGFyZVRva2VuXFxcIjpcXFwiL3JiWU5LVkMwVllKVHFNT0JIeVFVTUF1UlRsdnVxUUhMNDFUVnlrdm9zTT1cXFwifVwiLFwic2F2ZWRcIjpmYWxzZSxcInRpdGxlXCI6XCJRdWFyay7nroBcIixcInZlcnNpb25cIjowLFwidXJsXCI6XCJoaWtlcjovL3BhZ2UvcXVhcmtMaXN0P3JlYWx1cmw9aHR0cHMlM0ElMkYlMkZwYW4ucXVhcmsuY24lMkZzJTJGYjcyMTdkMjFhZmEwJnNoYXJlUHdkPVwiLFwiY29sX3R5cGVcIjpcIm1vdmllXzNcIixcImZpbmRfcnVsZVwiOlwianM6XFxubGV0IGQgPSBbXTtcXG5cXG5hZGRMaXN0ZW5lcihcXFwib25DbG9zZVxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIpKTtcXG5hZGRMaXN0ZW5lcihcXFwib25SZWZyZXNoXFxcIiwgKCkgPT4gY2xlYXJNeVZhcihcXFwicGxheVVybENhY2hlXFxcIikpO1xcbmxldCBzb1VybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFwicmVhbHVybFxcXCIsIFxcXCJcXFwiKSk7XFxubGV0IGZyb21Ecml2ZSA9IE1ZX1BBUkFNUy5mcm9tRHJpdmUgfHwgXFxcInF1YXJrXFxcIjtcXG5cXG5pZiAoc29VcmwuaW5jbHVkZXMoXFxcImRyaXZlLnVjLmNuXFxcIikpIHtcXG4gICAgZnJvbURyaXZlID0gXFxcInVjXFxcIjtcXG59XFxubGV0IHJlYWx1cmwgPSBzb1VybC5zcGxpdChcXFwiP1xcXCIpWzBdO1xcbmxldCB1cmxEYXRhID0gcmVhbHVybC5zcGxpdChcXFwiL1xcXCIpO1xcblxcbmxldCBzaGFyZUlkID0gTVlfUEFSQU1TLnNoYXJlSWQgfHwgdXJsRGF0YVs0XS5yZXBsYWNlKFxcXCIjXFxcIiwgXFxcIlxcXCIpO1xcbmxldCBzaGFyZVB3ZCA9IGdldFBhcmFtKFxcXCJzaGFyZVB3ZFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBnZXRQYXJhbShcXFwicGFzc2NvZGVcXFwiLCBcXFwiXFxcIiwgc29VcmwpIHx8IFxcXCJcXFwiKTtcXG5sZXQgc2hhcmVUb2tlbiA9IGdldFBhcmFtKFxcXCJzaGFyZVRva2VuXFxcIiwgTVlfUEFSQU1TLnNoYXJlVG9rZW4gfHwgXFxcIlxcXCIpO1xcblxcbmxldCBmaWxlSWQgPSBNWV9QQVJBTVMuZmlsZUlkO1xcblxcbmxldCBzb3J0ID0ge1xcbiAgICBcXFwi5ZCN56ew5q2j5bqPXFxcIjogXFxcImZpbGVfbmFtZTphc2NcXFwiLFxcbiAgICBcXFwi5ZCN56ew5YCS5bqPXFxcIjogXFxcImZpbGVfbmFtZTpkZXNjXFxcIixcXG4gICAgXFxcIuaXtumXtOato+W6j1xcXCI6IFxcXCJ1cGRhdGVkX2F0OmFzY1xcXCIsXFxuICAgIFxcXCLml7bpl7TlgJLluo9cXFwiOiBcXFwidXBkYXRlZF9hdDpkZXNjXFxcIlxcbn07XFxubGV0IHN0eWxlcyA9IFtcXFwidGV4dF8xXFxcIiwgXFxcImF2YXRhclxcXCJdO1xcblxcbmxldCBzb3J0VmFsdWUgPSBzb3J0W2dldEl0ZW0oXFxcInNvcnRLZXlcXFwiLCBcXFwi5ZCN56ew5q2j5bqPXFxcIildO1xcbmxldCBzdHlsZSA9IGdldEl0ZW0oXFxcInN0eWxlXFxcIiwgc3R5bGVzWzBdKTtcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZnJvbURyaXZlID09PSBcXFwidWNcXFwiID8gXFxcIlVD572R55uYXFxcIiA6IFxcXCLlpLjlhYvnvZHnm5hcXFwiLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogZnJvbURyaXZlID09PSBcXFwidWNcXFwiID8gXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vZXJkaS8xNC5wbmdcXFwiIDogXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fa3Vha2VcXFwiLFxcbiAgICAgICAgdXJsOiAkKFxcXCLngrnlh7vlip/og73mjInpkq49PuS4quS6uui0puWPt+euoeeQhuWNs+WPr+eZu+W9lei0puWPt1xcXCIpLmNvbmZpcm0oKCkgPT4ge30pLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBzdHlsZSxcXG4gICAgICAgIHVybDogJChzdHlsZXMsIDEsICfor7fpgInmi6knKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgIHNldEl0ZW0oJ3N0eWxlJywgaW5wdXQpO1xcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9pY29uLnN2Z1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCJcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFwic29ydEtleVxcXCIsIFxcXCLlkI3np7DmraPluo9cXFwiKSxcXG4gICAgICAgIHVybDogJChPYmplY3Qua2V5cyhzb3J0KSwgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxuICAgICAgICAgICAgc2V0SXRlbShcXFwic29ydEtleVxcXCIsIGlucHV0KVxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxuICAgICAgICB9KSxcXG4gICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9zb3J0LnN2Z1xcXCIsXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCJcXG4gICAgfSk7XFxuICAgIGQucHVzaCh7XFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFwicXVhcmtfcGxheU1vZGVcXFwiLCBcXFwi6L2s56CBXFxcIiksXFxuICAgICAgICB1cmw6ICQoW1xcXCLovaznoIFcXFwiLCBcXFwi5Y6f55S7XFxcIiwgXFxcIuaZrumAmuWOn+eUu1xcXCIsIFxcXCJjdXJsXFxcIiwgXFxcImFyaWEyXFxcIiwgXFxcIlJQQ1xcXCJdLCAyLCBcXFwi5pKt5pS+5qih5byPXFxcIikuc2VsZWN0KCgpID0+IHtcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXCJxdWFya19wbGF5TW9kZVxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcbiAgICAgICAgICAgIHJldHVybiBcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFwiO1xcbiAgICAgICAgfSksXFxuICAgICAgICBjb2xfdHlwZTogXFxcImljb25fNVxcXCIsXFxuICAgICAgICBwaWNfdXJsOiBcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfcGxheS5zdmdcXFwiLFxcbiAgICB9KTtcXG4gICAgZC5wdXNoKHtcXG4gICAgICAgIHRpdGxlOiBcXFwi5Yqf6IO9XFxcIixcXG4gICAgICAgIHVybDogJChbXFxcIui3s+i9rOWkuOWFi0FQUFxcXCIsIFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiLCBcXFwi5Liq5Lq66LSm5Y+3566h55CGXFxcIiwgXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXCIsIFxcXCLorr7nva5SUENcXFwiXSwgMikuc2VsZWN0KChzaGFyZUlkLCBzaGFyZVB3ZCwgZnJvbURyaXZlKSA9PiB7XFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6Lez6L2s5aS45YWLQVBQXFxcIikge1xcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcInFrbGluazovL3d3dy51Yy5jbi9iMjBiODRmZDczNWE4ZGQzZjc1NDExMjliYWNjNGU5YT9hY3Rpb249b3Blbl91cmwmdXJsPWh0dHBzOi8vcGFuLnF1YXJrLmNuL3MvXFxcIiArIHNoYXJlSWQ7XFxuICAgICAgICAgICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcIuS4quS6uui0puWPt+euoeeQhlxcXCIpIHtcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFwiYWNjb3VudFxcXCIpO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLljp/nlLvkuIvovb3nur/nqItcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInNwZWVkVGhyZWFkXFxcIiwgXFxcIjEwXFxcIiksIFxcXCLor7fovpPlhaUzLTMy5LmL6Ze055qE5pW05pWwXFxcIikuaW5wdXQoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNwZWVkVGhyZWFkID0gcGFyc2VJbnQoaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXCI7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXCJzcGVlZFRocmVhZFxcXCIsIFN0cmluZyhzcGVlZFRocmVhZCkpO1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFwiKSB7XFxuICAgICAgICAgICAgICAgIGlmIChmcm9tRHJpdmUgPT09IFxcXCJ1Y1xcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFwiY29weTovL1xcXCIgKyBidWlsZFVybChcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jbi9zL1xcXCIgKyBzaGFyZUlkICsgXFxcIj9wdWJsaWM9MSMvbGlzdC9zaGFyZVxcXCIsIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogc2hhcmVQd2RcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJjb3B5Oi8vXFxcIiArIGJ1aWxkVXJsKFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9zL1xcXCIgKyBzaGFyZUlkLCB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2NvZGU6IHNoYXJlUHdkXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgfVxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLorr7nva5SUENcXFwiKSB7XFxuICAgICAgICAgICAgICAgIHJldHVybiAkKFtcXFwi6K6+572uUlBD5Zyw5Z2AXFxcIiwgXFxcIuiuvue9rlRva2VuXFxcIiwgXFxcIuS4i+i9veebruW9lVxcXCJdKS5zZWxlY3QoKCkgPT4ge1xcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFwi6K6+572uUlBD5Zyw5Z2AXFxcIikge1xcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvd25Ub29sID0gJC5yZXF1aXJlKFxcXCJEb3duVG9vbFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcInJwY1VybFxcXCIsIERvd25Ub29sLmdldERlZlJwY1VybCgpKSwgXFxcIlJQQ+WcsOWdgCzkuLrnqbroh6rliqjojrflj5blsYDln5/nvZHlnLDlnYBcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkge1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicnBjVXJsXFxcIiwgaW5wdXQpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcInJwY1VybFxcXCIpO1xcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+a4hemZpOiuvue9rlxcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXCLorr7nva5Ub2tlblxcXCIpIHtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJycGNBcmlhVG9rZW5cXFwiLCBcXFwiXFxcIiksIFxcXCJUb2tlbizmsqHmnInlsLHkuI3loatcXFwiKS5pbnB1dCgoKSA9PiB7XFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcInJwY0FyaWFUb2tlblxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXCJycGNEb3duRGlyXFxcIiwgXFxcIlxcXCIpLCBcXFwi5LiL6L295L+d5a2Y55uu5b2VLOS4uuepuuWwseaMieS4i+i9veWZqOm7mOiupOi3r+W+hFxcXCIpLmlucHV0KCgpID0+IHtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXRlbShcXFwicnBjRG93bkRpclxcXCIsIGlucHV0KTtcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXCI7XFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxuICAgICAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgICAgIH0pO1xcbiAgICAgICAgICAgIH1cXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpLFxcbiAgICAgICAgY29sX3R5cGU6IFxcXCJpY29uXzVcXFwiLFxcbiAgICAgICAgcGljX3VybDogXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX2ZpbGVpbnRvLnN2Z1xcXCIsXFxuICAgIH0pO1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgY29sX3R5cGU6ICdsaW5lX2JsYW5rJ1xcbiAgICB9KTtcXG59XFxuXFxuXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcIlF1YXJrU2hhcmVBcGlcXFwiLCBmcm9tRHJpdmUpO1xcbmxldCBxdWFya1NoYXJlQXBpID0gbmV3IFF1YXJrU2hhcmVBcGkoc2hhcmVJZCwgc2hhcmVQd2QpLnNldFRva2VuKHNoYXJlVG9rZW4pLnNldFJlZnJlc2goKHNoYXJlVG9rZW4pID0+IHtcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcbiAgICBzZXRQYWdlUGFyYW1zKE1ZX1BBUkFNUyk7XFxufSk7XFxuXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxuICAgIGlmICghc2l6ZSkge1xcbiAgICAgICAgcmV0dXJuICcnO1xcbiAgICB9XFxuICAgIGNvbnN0IHVuaXRzID0gWydCJywgJ0tCJywgJ01CJywgJ0dCJywgJ1RCJywgJ1BCJywgJ0VCJywgJ1pCJywgJ1lCJ107XFxuICAgIGxldCBpID0gMDtcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcbiAgICAgICAgc2l6ZSAvPSAxMDI0O1xcbiAgICAgICAgaSsrO1xcbiAgICB9XFxuICAgIHNpemUgPSBpID8gTnVtYmVyKHNpemUudG9GaXhlZCgyKSkgOiBzaXplO1xcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcbn1cXG5cXG5sZXQgc3ViRXh0cyA9IFtcXFwidnR0XFxcIiwgXFxcInNydFxcXCIsIFxcXCJhc3NcXFwiXTtcXG5sZXQgdGl0bGVIZWFkID0ge1xcbiAgICB2aWRlbzogXFxcIvCfjqxcXFwiLFxcbiAgICBhdWRpbzogXFxcIvCfjrVcXFwiLFxcbiAgICBkb2M6IFxcXCLwn5ORXFxcIixcXG4gICAgaW1hZ2U6IFxcXCLwn5a8XFxcIixcXG4gICAgYXJjaGl2ZTogXFxcIvCfk6ZcXFwiLFxcbiAgICBcXFwiZGVmYXVsdFxcXCI6IFxcXCLinZNcXFwiXFxufTtcXG5cXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXG5cXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcIuKdk1xcXCI7XFxufVxcblxcbmZ1bmN0aW9uIGdldERvd25VcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSB7XFxuXFxuICAgIHRyeSB7XFxuICAgICAgICBzaG93TG9hZGluZyhcXFwi5q2j5Zyo6I635Y+WLi4uXFxcIik7XFxuICAgICAgICBsZXQgcGxheVVybENhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcInBsYXlVcmxDYWNoZVxcXCIsIHt9KTtcXG4gICAgICAgIGlmIChwbGF5VXJsQ2FjaGVbZmlkXSkge1xcbiAgICAgICAgICAgIHJldHVybiBwbGF5VXJsQ2FjaGVbZmlkXTtcXG4gICAgICAgIH0gZWxzZSB7XFxuICAgICAgICAgICAgbGV0IHVybCA9ICQucmVxdWlyZShcXFwicGxheVxcXCIsIGZyb21Ecml2ZSkuZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5KTtcXG4gICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXG4gICAgICAgICAgICBzdG9yYWdlMC5wdXRNeVZhcihcXFwicGxheVVybENhY2hlXFxcIiwgcGxheVVybENhY2hlKTtcXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xcbiAgICAgICAgfVxcbiAgICB9IGZpbmFsbHkge1xcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXG4gICAgfVxcbn1cXG50cnkge1xcbiAgICB2YXIgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShmaWxlSWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxuICAgIC8v6K6+572u5qCH6aKYXFxuICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXG4gICAgaWYgKHNoYXJlSWQgIT09IFxcXCJzZWxmXFxcIikge1xcbiAgICAgICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXG5cXG4gICAgICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCAmJiAhZmlsZUlkKSB7XFxuICAgICAgICAgICAgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShyZXMuZGF0YS5zaGFyZS5maXJzdF9maWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxuICAgICAgICAgICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXG4gICAgICAgICAgICB2YXIgbGlzdCA9IHJlcy5kYXRhLmxpc3QgfHwgW107XFxuICAgICAgICB9XFxuICAgIH1cXG4gICAgbGV0IG5jb29raWUgPSBxdWFya1NoYXJlQXBpLmdldFBpY0Nvb2tpZSgpO1xcbiAgICAvL2xvZyhuY29va2llKVxcbiAgICBsaXN0LmZvckVhY2goaXRlbSA9PiB7XFxuICAgICAgICAvL+WIpOaWreaYr+WQpuaWh+S7tuWkuVxcbiAgICAgICAgaWYgKGl0ZW0uZGlyKSB7XFxuICAgICAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICAgICAgdGl0bGU6IFxcXCLwn5OCXFxcIiArIGl0ZW0uZmlsZV9uYW1lLFxcbiAgICAgICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGl0ZW0uaW5jbHVkZV9pdGVtcyArICfpobkgICcsXFxuICAgICAgICAgICAgICAgIHBpY191cmw6IFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL21lc3N5LzI3LnN2Z1xcXCIsXFxuICAgICAgICAgICAgICAgIHVybDogXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cGFnZT1meXBhZ2VcXFwiLFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgICAgICAgICBzaGFyZUlkLFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2QsXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVRva2VuOiBxdWFya1NoYXJlQXBpLmdldFRva2VuKCksXFxuICAgICAgICAgICAgICAgICAgICBmaWxlSWQ6IGl0ZW0uZmlkLFxcbiAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG4gICAgICAgICAgICAgICAgICAgIGZyb21Ecml2ZVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSk7XFxuICAgICAgICB9IGVsc2Uge1xcbiAgICAgICAgICAgIGQucHVzaCh7XFxuICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRIZWFkKGl0ZW0ub2JqX2NhdGVnb3J5KSArIGl0ZW0uZmlsZV9uYW1lLFxcbiAgICAgICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGZvcm1hdFNpemUoaXRlbS5zaXplKSxcXG4gICAgICAgICAgICAgICAgcGljX3VybDogJChpdGVtLnRodW1ibmFpbCwge1xcbiAgICAgICAgICAgICAgICAgICAgY29va2llOiBuY29va2llXFxuICAgICAgICAgICAgICAgIH0pLmltYWdlKCksXFxuICAgICAgICAgICAgICAgIHVybDogJChcXFwiI25vTG9hZGluZyNcXFwiKS5sYXp5UnVsZShnZXREb3duVXJsLCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnksIGZyb21Ecml2ZSksXFxuICAgICAgICAgICAgICAgIGNvbF90eXBlOiBzdHlsZSxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXG4gICAgICAgICAgICAgICAgICAgIC8vaW5oZXJpdFRpdGxlOiBmYWxzZSxcXG5cXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcbiAgICAgICAgICAgICAgICB9XFxuICAgICAgICAgICAgfSlcXG4gICAgICAgIH1cXG5cXG4gICAgfSk7XFxufSBjYXRjaCAoZSkge1xcbiAgICBkLnB1c2goe1xcbiAgICAgICAgdGl0bGU6IGUubWVzc2FnZSxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcbiAgICAgICAgY29sX3R5cGU6ICd0ZXh0X2NlbnRlcl8xJyxcXG4gICAgICAgIGV4dHJhOiB7XFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxuICAgICAgICB9XFxuICAgIH0pO1xcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXCLmj5Dlj5bnoIFcXFwiKSkge1xcbiAgICAgICAgZC5wdXNoKHtcXG4gICAgICAgICAgICB0aXRsZTogXFxcIui+k+WFpeaPkOWPlueggVxcXCIsXFxuICAgICAgICAgICAgdXJsOiAkKCkuaW5wdXQoKE1ZX1BBUkFNUykgPT4ge1xcbiAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IGlucHV0XFxuICAgICAgICAgICAgICAgIH0pKTtcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXG4gICAgICAgICAgICB9LCBNWV9QQVJBTVMpLFxcbiAgICAgICAgICAgIGNvbF90eXBlOiBcXFwidGV4dF9jZW50ZXJfMVxcXCJcXG4gICAgICAgIH0pO1xcbiAgICB9XFxufVxcbnNldFJlc3VsdChkKTtcIixcImdyb3VwXCI6XCLlvIDlj5HkuK3lv4NcIixcInVhXCI6XCJtb2JpbGVcIixcInByZVJ1bGVcIjpcIlwiLFwicGFnZXNcIjpcIlt7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLlpLjlhYvliJfooahBUElcXFwiLFxcXCJwYXRoXFxcIjpcXFwiUXVhcmtTaGFyZUFwaVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbi8vQGF1dGhvciBMb3lEZ0lrXFxcXG5sZXQgaHR0cFJlcXVlc3QgPSAkLnJlcXVpcmUoXFxcXFxcXCJodHRwUmVxdWVzdFxcXFxcXFwiKTtcXFxcbmxldCBDb29raWVNYW5hZ2U9JC5yZXF1aXJlKFxcXFxcXFwiQ29va2llTWFuYWdlXFxcXFxcXCIpO1xcXFxubGV0IGZyb21Ecml2ZSA9IG1vZHVsZS5pbXBvcnRQYXJhbTtcXFxcbmxldCBwciwgYmFzZVVybCwgY29va2llO1xcXFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiKSB7XFxcXG4gICAgYmFzZVVybCA9IFxcXFxcXFwiaHR0cHM6Ly9wYy1hcGkudWMuY25cXFxcXFxcIjtcXFxcbiAgICBwciA9IFxcXFxcXFwiVUNCcm93c2VyXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufSBlbHNlIHtcXFxcbiAgICBiYXNlVXJsID0gXFxcXFxcXCJodHRwczovL2RyaXZlLnF1YXJrLmNuXFxcXFxcXCI7XFxcXG4gICAgcHIgPSBcXFxcXFxcInVjcHJvXFxcXFxcXCI7XFxcXG4gICAgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxufVxcXFxuXFxcXG5jb25zdCBjb29raWVNYW5hZ2UgPSBuZXcgQ29va2llTWFuYWdlKGNvb2tpZSk7XFxcXG5mdW5jdGlvbiBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKSB7XFxcXG4gICAgdGhpcy5zaGFyZUlkID0gc2hhcmVJZDtcXFxcbiAgICB0aGlzLnNoYXJlUHdkID0gc2hhcmVQd2Q7XFxcXG4gICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSAoKCkgPT4gdm9pZCAwKTtcXFxcbiAgICAvL3RoaXMuc2hhcmVUb2tlbiA9IHNoYXJlVG9rZW4gfHwgdGhpcy5nZXRTaGFyZVRva2VuKCk7XFxcXG59XFxcXG5PYmplY3QuYXNzaWduKFF1YXJrU2hhcmVBcGkucHJvdG90eXBlLCB7XFxcXG4gICAgc2V0UmVmcmVzaChyZWZyZXNoQ2FsbEJhY2spIHtcXFxcbiAgICAgICAgdGhpcy5yZWZyZXNoQ2FsbEJhY2sgPSByZWZyZXNoQ2FsbEJhY2s7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgc2V0VG9rZW4oc2hhcmVUb2tlbikge1xcXFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHJlcXVlc3RIdHRwKGFwaSkge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KGFwaS5zdGFydHNXaXRoKFxcXFxcXFwiaHR0cFxcXFxcXFwiKSA/IGFwaSA6IChiYXNlVXJsICsgYXBpKSkuc3VjY2VzcygoYm9keSxyZXMpID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChib2R5LnN0YXR1cyAhPT0gMjAwKSB7XFxcXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJvZHkubWVzc2FnZSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBjb29raWVNYW5hZ2UuYWRkKHJlcy5oZWFkZXJzW1xcXFxcXFwic2V0LWNvb2tpZVxcXFxcXFwiXSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gYm9keTtcXFxcbiAgICAgICAgfSkuaGVhZGVycyh7XFxcXG4gICAgICAgICAgICBcXFxcXFxcImNvb2tpZVxcXFxcXFwiOiBjb29raWVNYW5hZ2UuZ2V0KCksXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBxdWFyay1jbG91ZC1kcml2ZS8yLjUuMjAgQ2hyb21lLzEwMC4wLjQ4OTYuMTYwIEVsZWN0cm9uLzE4LjMuNS40LWI0Nzg0OTExMDAgU2FmYXJpLzUzNy4zNiBDaGFubmVsL3Bja2tfb3RoZXJfY2hcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIFxcXFxcXFwicmVmZXJlclxcXFxcXFwiOiBiYXNlVXJsXFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0VG9rZW4oKSB7XFxcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXFxcXFwic2VsZlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zaGFyZVRva2VuIHx8IHRoaXMuZ2V0U2hhcmVUb2tlbigpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGdldFBpY0Nvb2tpZSgpe1xcXFxuICAgICAgICByZXR1cm4gY29va2llTWFuYWdlLmdldCgpO1xcXFxuICAgICAgICBcXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlVG9rZW4oKSB7XFxcXG4gICAgICAgIGxldCByZXN1bHQgPSB0aGlzLnJlcXVlc3RIdHRwKFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2UvdG9rZW5cXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgICAgICBcXFxcXFxcInB3ZF9pZFxcXFxcXFwiOiB0aGlzLnNoYXJlSWQsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInBhc3Njb2RlXFxcXFxcXCI6IHRoaXMuc2hhcmVQd2QsXFxcXG4gICAgICAgIH0pLmJvZHlUb1N0cmluZyh0cnVlKS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxuICAgICAgICB0aGlzLnNoYXJlVG9rZW4gPSByZXN1bHQuZGF0YS5zdG9rZW47XFxcXG4gICAgICAgIHRoaXMucmVmcmVzaENhbGxCYWNrKHJlc3VsdC5kYXRhLnN0b2tlbiwgdGhpcyk7XFxcXG4gICAgICAgIHJldHVybiB0aGlzLnNoYXJlVG9rZW47XFxcXG4gICAgfSxcXFxcbiAgICBfZ2V0U2VsZkxpc3RGaWxlKGZpbGVJZCwgcGFnZSwgb3JkZXJCeSkge1xcXFxuICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5yZXF1ZXN0SHR0cChcXFxcXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY24vMS9jbG91ZGRyaXZlL2ZpbGUvc29ydD9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYnVpbGRVcmwoe1xcXFxuICAgICAgICAgICAgcGRpcl9maWQ6IGZpbGVJZCB8fCBcXFxcXFxcIjBcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIGZvcmNlOiAwLFxcXFxuICAgICAgICAgICAgX3BhZ2U6IHBhZ2UsXFxcXG4gICAgICAgICAgICBfc2l6ZTogMTAwLFxcXFxuICAgICAgICAgICAgdWNfcGFyYW1fc3RyOiBcXFxcXFxcIlxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgX2ZldGNoX3RvdGFsOiAxLFxcXFxuICAgICAgICAgICAgX2ZldGNoX3N1Yl9kaXJzOiAwLFxcXFxuICAgICAgICAgICAgX3NvcnQ6IFxcXFxcXFwiZmlsZV90eXBlOmFzYyxcXFxcXFxcIiArIG9yZGVyQnlcXFxcbiAgICAgICAgfSkuc3RhcnQodHJ1ZSk7XFxcXG4gICAgICAgIHJldHVybiByZXN1bHQ7XFxcXG4gICAgfSxcXFxcbiAgICBfZ2V0U2hhcmVMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpIHtcXFxcbiAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMucmVxdWVzdEh0dHAoXFxcXFxcXCIvMS9jbG91ZGRyaXZlL3NoYXJlL3NoYXJlcGFnZS9kZXRhaWw/cHI9XFxcXFxcXCIgKyBwciArIFxcXFxcXFwiJmZyPXBjXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgICAgIHB3ZF9pZDogdGhpcy5zaGFyZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBzdG9rZW46IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFRva2VuKCkgfHwgXFxcXFxcXCJcXFxcXFxcIiksXFxcXG4gICAgICAgICAgICBwZGlyX2ZpZDogZmlsZUlkIHx8IFxcXFxcXFwiXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBmb3JjZTogMCxcXFxcbiAgICAgICAgICAgIF9wYWdlOiBwYWdlLFxcXFxuICAgICAgICAgICAgX3NpemU6IDEwMCxcXFxcbiAgICAgICAgICAgIF9mZXRjaF9iYW5uZXI6IDEsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfc2hhcmU6IDEsXFxcXG4gICAgICAgICAgICBfZmV0Y2hfdG90YWw6IDEsXFxcXG4gICAgICAgICAgICBfc29ydDogXFxcXFxcXCJmaWxlX3R5cGU6YXNjLFxcXFxcXFwiICsgb3JkZXJCeVxcXFxuICAgICAgICB9KS5lcnJvcldpdGhSZXRyeSgoZXJyLCByZXMsIGh0dHApID0+IHtcXFxcbiAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJlcy5ib2R5KS5tZXNzYWdlLmluY2x1ZGVzKCdzdG9rZW4nKSkge1xcXFxuICAgICAgICAgICAgICAgIGh0dHAubWVyZ2VIZWFkQW5kQm9keSh7XFxcXG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkVXJsOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9rZW46IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmdldFNoYXJlVG9rZW4oKSB8fCBcXFxcXFxcIlxcXFxcXFwiKVxcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xcXFxuICAgIH0sXFxcXG4gICAgZ2V0TGlzdEZpbGUoZmlsZUlkLCBwYWdlLCBvcmRlckJ5KSB7XFxcXG4gICAgICAgIGlmICh0aGlzLnNoYXJlSWQgIT09IFxcXFxcXFwic2VsZlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2hhcmVMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNlbGZMaXN0RmlsZShmaWxlSWQsIHBhZ2UsIG9yZGVyQnkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxufSk7XFxcXG4kLmV4cG9ydHMgPSBRdWFya1NoYXJlQXBpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcImh0dHBSZXF1ZXN0XFxcIixcXFwicGF0aFxcXCI6XFxcImh0dHBSZXF1ZXN0XFxcIixcXFwicnVsZVxcXCI6XFxcImZ1bmN0aW9uIGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgIHRoaXMucmV0cnlDb3VudCA9IDA7XFxcXG4gICAgdGhpcy51cmwgPSB1cmw7XFxcXG4gICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcXFxuICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgIH0pO1xcXFxuICAgIHRoaXMuZXJyb3JDYWxsYmFjayA9IChlcnIsIHJlcykgPT4ge3Rocm93IGVycn07XFxcXG4gICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gKGVyciwgcmVzLCB0cnlSZXN0YXJ0KSA9PiBmYWxzZTtcXFxcbiAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IChib2R5LCBzdGF0dXNDb2RlLCBoZWFkZXJzKSA9PiBib2R5O1xcXFxuICAgIHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2sgPSAoZXJyLCByZXMpID0+IGVycjtcXFxcbiAgICB0aGlzLnN0YXJ0UmVxdWVzdCA9IGZldGNoO1xcXFxuICAgIHRoaXMuX2JvZHlUb1N0cmluZyA9IGZhbHNlO1xcXFxuICAgIHRoaXMuYnVpbGRQYXJhbSA9IHZvaWQoMCk7XFxcXG59XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QucHJvdG90eXBlLCB7XFxcXG4gICAgYm9keVRvU3RyaW5nKGZsYWcpIHtcXFxcbiAgICAgICAgdGhpcy5fYm9keVRvU3RyaW5nID0gISFmbGFnO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGJvZHkoYm9keSkge1xcXFxuICAgICAgICB0aGlzLm9wdGlvbnMuYm9keSA9IGJvZHkgfHwgdm9pZCAwO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGJ1aWxkVXJsKGJ1aWxkUGFyYW0pIHtcXFxcbiAgICAgICAgdGhpcy5idWlsZFBhcmFtID0gYnVpbGRQYXJhbSB8fCB7fTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzZXRTdGFydFJlcXVlc3RGdW5jKGZ1bmMpIHtcXFxcbiAgICAgICAgdGhpcy5zdGFydFJlcXVlc3QgPSBmdW5jO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGhlYWRlcnMoaGVhZGVycykge1xcXFxuICAgICAgICB0aGlzLm9wdGlvbnMuaGVhZGVycyA9IGhlYWRlcnMgfHwgdm9pZCAwO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIHN1Y2Nlc3Moc3VjY2Vzc0NhbGxiYWNrKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2Ygc3VjY2Vzc0NhbGxiYWNrICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB0aGlzLnN1Y2Nlc3NDYWxsYmFjayA9IHN1Y2Nlc3NDYWxsYmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBlcnJvcihlcnJvckNhbGxiYWNrKSB7XFxcXG4gICAgICAgIGlmICh0eXBlb2YgZXJyb3JDYWxsYmFjayAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrID0gZXJyb3JDYWxsYmFjaztcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBlcnJvclR5cGUoZXJyb3JUeXBlQ2FsbGJhY2spIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvclR5cGVDYWxsYmFjayAhPT0gXFxcXFxcXCJmdW5jdGlvblxcXFxcXFwiKSByZXR1cm4gdGhpcztcXFxcbiAgICAgICAgdGhpcy5lcnJvclR5cGVDYWxsYmFjayA9IGVycm9yVHlwZUNhbGxiYWNrO1xcXFxuICAgICAgICByZXR1cm4gdGhpcztcXFxcbiAgICB9LFxcXFxuICAgIGVycm9yV2l0aFJldHJ5KHJldHJ5Q291bnQsIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkpIHtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiByZXRyeUNvdW50ID09PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIgJiYgdHlwZW9mIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPT09IFxcXFxcXFwidW5kZWZpbmVkXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGVycm9yQ2FsbGJhY2tXaXRoUmV0cnkgPSByZXRyeUNvdW50O1xcXFxuICAgICAgICAgICAgcmV0cnlDb3VudCA9IDE7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgaWYgKHR5cGVvZiBlcnJvckNhbGxiYWNrV2l0aFJldHJ5ICE9PSBcXFxcXFxcImZ1bmN0aW9uXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHRoaXMucmV0cnlDb3VudCA9IE51bWJlcihyZXRyeUNvdW50KTtcXFxcbiAgICAgICAgdGhpcy5lcnJvckNhbGxiYWNrV2l0aFJldHJ5ID0gZXJyb3JDYWxsYmFja1dpdGhSZXRyeTtcXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfSxcXFxcbiAgICBzdGFydCh0b0pzb24pIHtcXFxcbiAgICAgICAgbGV0IG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLm9wdGlvbnMpO1xcXFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYm9keSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIiAmJiB0aGlzLl9ib2R5VG9TdHJpbmcpIHtcXFxcbiAgICAgICAgICAgIG9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KG9wdGlvbnMuYm9keSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgdmFyIHJlcyA9IEpTT04ucGFyc2UodGhpcy5zdGFydFJlcXVlc3QodGhpcy5idWlsZFBhcmFtP2J1aWxkVXJsKHRoaXMudXJsLCB0aGlzLmJ1aWxkUGFyYW0pOnRoaXMudXJsLCBvcHRpb25zKSk7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMjAwICYmIHJlcy5zdGF0dXNDb2RlIDw9IDMwMCkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBib2R5ID0gcmVzLmJvZHk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHRvSnNvbikge1xcXFxuICAgICAgICAgICAgICAgICAgICBib2R5ID0gSlNPTi5wYXJzZShib2R5KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3VjY2Vzc0NhbGxiYWNrKGJvZHksIHJlcyk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihTdHJpbmcocmVzLnN0YXR1c0NvZGUpKTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGVyciA9IHRoaXMuZXJyb3JUeXBlQ2FsbGJhY2soZXJyLCByZXMpO1xcXFxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAodGhpcy5yZXRyeUNvdW50KSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHRyeVJlc3VsdCA9IHRoaXMuZXJyb3JDYWxsYmFja1dpdGhSZXRyeShlcnIsIHJlcywgdGhpcyk7XFxcXG4gICAgICAgICAgICAgICAgaWYgKHRyeVJlc3VsdCkge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQtLTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQodG9Kc29uKTtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHJ5Q291bnQgPSAwO1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lcnJvckNhbGxiYWNrKGVyciwgcmVzKTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9yQ2FsbGJhY2soZXJyLCByZXMpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcXFxcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucywge1xcXFxuICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgICAgIHJldHVybiB0aGlzO1xcXFxuICAgIH0sXFxcXG4gICAgbWVyZ2VIZWFkQW5kQm9keShvcHRpb25zKSB7XFxcXG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xcXFxuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5oZWFkZXJzfHx7fSwgb3B0aW9ucy5oZWFkZXJzKTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuYm9keSA9PT0gXFxcXFxcXCJvYmplY3RcXFxcXFxcIiAmJiB0eXBlb2Ygb3B0aW9ucy5ib2R5ID09PSBcXFxcXFxcIm9iamVjdFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMub3B0aW9ucy5ib2R5fHx7fSwgb3B0aW9ucy5ib2R5KTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuYnVpbGRVcmwgPT09IFxcXFxcXFwib2JqZWN0XFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5idWlsZFBhcmFtfHx7fSwgb3B0aW9ucy5idWlsZFVybCk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgcmV0dXJuIHRoaXM7XFxcXG4gICAgfVxcXFxufSk7XFxcXG5cXFxcbk9iamVjdC5hc3NpZ24oaHR0cFJlcXVlc3QsIHtcXFxcbiAgICBmZXRjaCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpO1xcXFxuICAgIH0sXFxcXG4gICAgcG9zdCh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCk7XFxcXG4gICAgfSxcXFxcbiAgICByZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhyZXF1ZXN0KTtcXFxcbiAgICB9LFxcXFxuICAgIHBvc3RSZXF1ZXN0KHVybCwgb3B0aW9ucykge1xcXFxuICAgICAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybCwgb3B0aW9ucykuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0UmVxdWVzdCk7XFxcXG4gICAgfSxcXFxcbiAgICBmZXRjaENvb2tpZSh1cmwsIG9wdGlvbnMpIHtcXFxcbiAgICAgICAgcmV0dXJuIG5ldyBodHRwUmVxdWVzdCh1cmwsIG9wdGlvbnMpLnNldFN0YXJ0UmVxdWVzdEZ1bmMoZmV0Y2hDb29raWUpO1xcXFxuICAgIH1cXFxcbn0pO1xcXFxuJC5leHBvcnRzID0gaHR0cFJlcXVlc3Q7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5aS45YWL5YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcInF1YXJrTGlzdFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBkID0gW107XFxcXG5cXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25DbG9zZVxcXFxcXFwiLCAoKSA9PiBjbGVhck15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIpKTtcXFxcbmFkZExpc3RlbmVyKFxcXFxcXFwib25SZWZyZXNoXFxcXFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIikpO1xcXFxubGV0IHNvVXJsID0gZGVjb2RlVVJJQ29tcG9uZW50KGdldFBhcmFtKFxcXFxcXFwicmVhbHVybFxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG5sZXQgZnJvbURyaXZlID0gTVlfUEFSQU1TLmZyb21Ecml2ZSB8fCBcXFxcXFxcInF1YXJrXFxcXFxcXCI7XFxcXG5cXFxcbmlmIChzb1VybC5pbmNsdWRlcyhcXFxcXFxcImRyaXZlLnVjLmNuXFxcXFxcXCIpKSB7XFxcXG4gICAgZnJvbURyaXZlID0gXFxcXFxcXCJ1Y1xcXFxcXFwiO1xcXFxufVxcXFxubGV0IHJlYWx1cmwgPSBzb1VybC5zcGxpdChcXFxcXFxcIj9cXFxcXFxcIilbMF07XFxcXG5sZXQgdXJsRGF0YSA9IHJlYWx1cmwuc3BsaXQoXFxcXFxcXCIvXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgc2hhcmVJZCA9IE1ZX1BBUkFNUy5zaGFyZUlkIHx8IHVybERhdGFbNF0ucmVwbGFjZShcXFxcXFxcIiNcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5sZXQgc2hhcmVQd2QgPSBnZXRQYXJhbShcXFxcXFxcInNoYXJlUHdkXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVB3ZCB8fCBnZXRQYXJhbShcXFxcXFxcInBhc3Njb2RlXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIsIHNvVXJsKSB8fCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbmxldCBzaGFyZVRva2VuID0gZ2V0UGFyYW0oXFxcXFxcXCJzaGFyZVRva2VuXFxcXFxcXCIsIE1ZX1BBUkFNUy5zaGFyZVRva2VuIHx8IFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuXFxcXG5sZXQgZmlsZUlkID0gTVlfUEFSQU1TLmZpbGVJZDtcXFxcblxcXFxubGV0IHNvcnQgPSB7XFxcXG4gICAgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6YXNjXFxcXFxcXCIsXFxcXG4gICAgXFxcXFxcXCLlkI3np7DlgJLluo9cXFxcXFxcIjogXFxcXFxcXCJmaWxlX25hbWU6ZGVzY1xcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwi5pe26Ze05q2j5bqPXFxcXFxcXCI6IFxcXFxcXFwidXBkYXRlZF9hdDphc2NcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcIuaXtumXtOWAkuW6j1xcXFxcXFwiOiBcXFxcXFxcInVwZGF0ZWRfYXQ6ZGVzY1xcXFxcXFwiXFxcXG59O1xcXFxubGV0IHN0eWxlcyA9IFtcXFxcXFxcInRleHRfMVxcXFxcXFwiLCBcXFxcXFxcImF2YXRhclxcXFxcXFwiXTtcXFxcblxcXFxubGV0IHNvcnRWYWx1ZSA9IHNvcnRbZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIildO1xcXFxubGV0IHN0eWxlID0gZ2V0SXRlbShcXFxcXFxcInN0eWxlXFxcXFxcXCIsIHN0eWxlc1swXSk7XFxcXG5pZiAoTVlfUEFHRSA9PSAxKSB7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiID8gXFxcXFxcXCJVQ+e9keebmFxcXFxcXFwiIDogXFxcXFxcXCLlpLjlhYvnvZHnm5hcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCIsXFxcXG4gICAgICAgIHBpY191cmw6IGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiID8gXFxcXFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvdHViaWFvL2VyZGkvMTQucG5nXFxcXFxcXCIgOiBcXFxcXFxcImhpa2VyOi8vaW1hZ2VzL2ljb25fa3Vha2VcXFxcXFxcIixcXFxcbiAgICAgICAgdXJsOiAkKFxcXFxcXFwi54K55Ye75Yqf6IO95oyJ6ZKuPT7kuKrkurrotKblj7fnrqHnkIbljbPlj6/nmbvlvZXotKblj7dcXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSksXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IHN0eWxlLFxcXFxuICAgICAgICB1cmw6ICQoc3R5bGVzLCAxLCAn6K+36YCJ5oupJykuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oJ3N0eWxlJywgaW5wdXQpO1xcXFxuICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIHBpY191cmw6IFxcXFxcXFwiaHR0cDovLzEyMy41Ni4xMDUuMTQ1L2ltZy9hbGlfaWNvbi5zdmdcXFxcXFxcIixcXFxcbiAgICAgICAgY29sX3R5cGU6IFxcXFxcXFwiaWNvbl81XFxcXFxcXCJcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICB0aXRsZTogZ2V0SXRlbShcXFxcXFxcInNvcnRLZXlcXFxcXFxcIiwgXFxcXFxcXCLlkI3np7DmraPluo9cXFxcXFxcIiksXFxcXG4gICAgICAgIHVybDogJChPYmplY3Qua2V5cyhzb3J0KSwgMSwgJ+ivt+mAieaLqScpLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwic29ydEtleVxcXFxcXFwiLCBpbnB1dClcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgIH0pLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3NvcnQuc3ZnXFxcXFxcXCIsXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fNVxcXFxcXFwiXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IGdldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSxcXFxcbiAgICAgICAgdXJsOiAkKFtcXFxcXFxcIui9rOeggVxcXFxcXFwiLCBcXFxcXFxcIuWOn+eUu1xcXFxcXFwiLCBcXFxcXFxcIuaZrumAmuWOn+eUu1xcXFxcXFwiLCBcXFxcXFxcImN1cmxcXFxcXFxcIiwgXFxcXFxcXCJhcmlhMlxcXFxcXFwiLCBcXFxcXFxcIlJQQ1xcXFxcXFwiXSwgMiwgXFxcXFxcXCLmkq3mlL7mqKHlvI9cXFxcXFxcIikuc2VsZWN0KCgpID0+IHtcXFxcbiAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya19wbGF5TW9kZVxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/liIfmjaLmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSksXFxcXG4gICAgICAgIGNvbF90eXBlOiBcXFxcXFxcImljb25fNVxcXFxcXFwiLFxcXFxuICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS9pbWcvYWxpX3BsYXkuc3ZnXFxcXFxcXCIsXFxcXG4gICAgfSk7XFxcXG4gICAgZC5wdXNoKHtcXFxcbiAgICAgICAgdGl0bGU6IFxcXFxcXFwi5Yqf6IO9XFxcXFxcXCIsXFxcXG4gICAgICAgIHVybDogJChbXFxcXFxcXCLot7PovazlpLjlhYtBUFBcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLbliIbkuqvpk77mjqVcXFxcXFxcIiwgXFxcXFxcXCLkuKrkurrotKblj7fnrqHnkIZcXFxcXFxcIiwgXFxcXFxcXCLljp/nlLvkuIvovb3nur/nqItcXFxcXFxcIiwgXFxcXFxcXCLorr7nva5SUENcXFxcXFxcIl0sIDIpLnNlbGVjdCgoc2hhcmVJZCwgc2hhcmVQd2QsIGZyb21Ecml2ZSkgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIui3s+i9rOWkuOWFi0FQUFxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwicWtsaW5rOi8vd3d3LnVjLmNuL2IyMGI4NGZkNzM1YThkZDNmNzU0MTEyOWJhY2M0ZTlhP2FjdGlvbj1vcGVuX3VybCZ1cmw9aHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFxcXFxcIiArIHNoYXJlSWQ7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuS4quS6uui0puWPt+euoeeQhlxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQucmVxdWlyZShcXFxcXFxcImFjY291bnRcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWOn+eUu+S4i+i9vee6v+eoi1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFxcXFxcInNwZWVkVGhyZWFkXFxcXFxcXCIsIFxcXFxcXFwiMTBcXFxcXFxcIiksIFxcXFxcXFwi6K+36L6T5YWlMy0zMuS5i+mXtOeahOaVtOaVsFxcXFxcXFwiKS5pbnB1dCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCBzcGVlZFRocmVhZCA9IHBhcnNlSW50KGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkVGhyZWFkIDwgMyB8fCBzcGVlZFRocmVhZCA+IDMyKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruS4jeWQiOazlVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBTdHJpbmcoc3BlZWRUaHJlYWQpKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi25YiG5Lqr6ZO+5o6lXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBpZiAoZnJvbURyaXZlID09PSBcXFxcXFxcInVjXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL2RyaXZlLnVjLmNuL3MvXFxcXFxcXCIgKyBzaGFyZUlkICsgXFxcXFxcXCI/cHVibGljPTEjL2xpc3Qvc2hhcmVcXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2Q6IHNoYXJlUHdkXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcImNvcHk6Ly9cXFxcXFxcIiArIGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY24vcy9cXFxcXFxcIiArIHNoYXJlSWQsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3Njb2RlOiBzaGFyZVB3ZFxcXFxuICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiuvue9rlJQQ1xcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoW1xcXFxcXFwi6K6+572uUlBD5Zyw5Z2AXFxcXFxcXCIsIFxcXFxcXFwi6K6+572uVG9rZW5cXFxcXFxcIiwgXFxcXFxcXCLkuIvovb3nm67lvZVcXFxcXFxcIl0pLnNlbGVjdCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLorr7nva5SUEPlnLDlnYBcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG93blRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJEb3duVG9vbFxcXFxcXFwiKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkKGdldEl0ZW0oXFxcXFxcXCJycGNVcmxcXFxcXFxcIiwgRG93blRvb2wuZ2V0RGVmUnBjVXJsKCkpLCBcXFxcXFxcIlJQQ+WcsOWdgCzkuLrnqbroh6rliqjojrflj5blsYDln5/nvZHlnLDlnYBcXFxcXFxcIikuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicnBjVXJsXFxcXFxcXCIsIGlucHV0KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhckl0ZW0oXFxcXFxcXCJycGNVcmxcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5riF6Zmk6K6+572uXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi6K6+572uVG9rZW5cXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICQoZ2V0SXRlbShcXFxcXFxcInJwY0FyaWFUb2tlblxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwgXFxcXFxcXCJUb2tlbizmsqHmnInlsLHkuI3loatcXFxcXFxcIikuaW5wdXQoKCkgPT4ge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJycGNBcmlhVG9rZW5cXFxcXFxcIiwgaW5wdXQpO1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K6+572u5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJChnZXRJdGVtKFxcXFxcXFwicnBjRG93bkRpclxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKSwgXFxcXFxcXCLkuIvovb3kv53lrZjnm67lvZUs5Li656m65bCx5oyJ5LiL6L295Zmo6buY6K6k6Lev5b6EXFxcXFxcXCIpLmlucHV0KCgpID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwicnBjRG93bkRpclxcXFxcXFwiLCBpbnB1dCk7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0sIHNoYXJlSWQsIHNoYXJlUHdkLCBmcm9tRHJpdmUpLFxcXFxuICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJpY29uXzVcXFxcXFxcIixcXFxcbiAgICAgICAgcGljX3VybDogXFxcXFxcXCJodHRwOi8vMTIzLjU2LjEwNS4xNDUvaW1nL2FsaV9maWxlaW50by5zdmdcXFxcXFxcIixcXFxcbiAgICB9KTtcXFxcbiAgICBkLnB1c2goe1xcXFxuICAgICAgICBjb2xfdHlwZTogJ2xpbmVfYmxhbmsnXFxcXG4gICAgfSk7XFxcXG59XFxcXG5cXFxcblxcXFxubGV0IFF1YXJrU2hhcmVBcGkgPSAkLnJlcXVpcmUoXFxcXFxcXCJRdWFya1NoYXJlQXBpXFxcXFxcXCIsIGZyb21Ecml2ZSk7XFxcXG5sZXQgcXVhcmtTaGFyZUFwaSA9IG5ldyBRdWFya1NoYXJlQXBpKHNoYXJlSWQsIHNoYXJlUHdkKS5zZXRUb2tlbihzaGFyZVRva2VuKS5zZXRSZWZyZXNoKChzaGFyZVRva2VuKSA9PiB7XFxcXG4gICAgTVlfUEFSQU1TLnNoYXJlVG9rZW4gPSBzaGFyZVRva2VuO1xcXFxuICAgIHNldFBhZ2VQYXJhbXMoTVlfUEFSQU1TKTtcXFxcbn0pO1xcXFxuXFxcXG5mdW5jdGlvbiBmb3JtYXRTaXplKHNpemUpIHtcXFxcbiAgICBpZiAoIXNpemUpIHtcXFxcbiAgICAgICAgcmV0dXJuICcnO1xcXFxuICAgIH1cXFxcbiAgICBjb25zdCB1bml0cyA9IFsnQicsICdLQicsICdNQicsICdHQicsICdUQicsICdQQicsICdFQicsICdaQicsICdZQiddO1xcXFxuICAgIGxldCBpID0gMDtcXFxcbiAgICB3aGlsZSAoc2l6ZSA+PSAxMDI0KSB7XFxcXG4gICAgICAgIHNpemUgLz0gMTAyNDtcXFxcbiAgICAgICAgaSsrO1xcXFxuICAgIH1cXFxcbiAgICBzaXplID0gaSA/IE51bWJlcihzaXplLnRvRml4ZWQoMikpIDogc2l6ZTtcXFxcbiAgICByZXR1cm4gYCR7c2l6ZX0gJHt1bml0c1tpXX1gO1xcXFxufVxcXFxuXFxcXG5sZXQgc3ViRXh0cyA9IFtcXFxcXFxcInZ0dFxcXFxcXFwiLCBcXFxcXFxcInNydFxcXFxcXFwiLCBcXFxcXFxcImFzc1xcXFxcXFwiXTtcXFxcbmxldCB0aXRsZUhlYWQgPSB7XFxcXG4gICAgdmlkZW86IFxcXFxcXFwi8J+OrFxcXFxcXFwiLFxcXFxuICAgIGF1ZGlvOiBcXFxcXFxcIvCfjrVcXFxcXFxcIixcXFxcbiAgICBkb2M6IFxcXFxcXFwi8J+TkVxcXFxcXFwiLFxcXFxuICAgIGltYWdlOiBcXFxcXFxcIvCflrxcXFxcXFxcIixcXFxcbiAgICBhcmNoaXZlOiBcXFxcXFxcIvCfk6ZcXFxcXFxcIixcXFxcbiAgICBcXFxcXFxcImRlZmF1bHRcXFxcXFxcIjogXFxcXFxcXCLinZNcXFxcXFxcIlxcXFxufTtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0SGVhZCh0eXBlLCBleHQpIHtcXFxcbiAgICBsZXQgaGVhZCA9IHRpdGxlSGVhZFt0eXBlXTtcXFxcblxcXFxuICAgIHJldHVybiBoZWFkIHx8IFxcXFxcXFwi4p2TXFxcXFxcXCI7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldERvd25VcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSwgZnJvbURyaXZlKSB7XFxcXG5cXFxcbiAgICB0cnkge1xcXFxuICAgICAgICBzaG93TG9hZGluZyhcXFxcXFxcIuato+WcqOiOt+WPli4uLlxcXFxcXFwiKTtcXFxcbiAgICAgICAgbGV0IHBsYXlVcmxDYWNoZSA9IHN0b3JhZ2UwLmdldE15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIsIHt9KTtcXFxcbiAgICAgICAgaWYgKHBsYXlVcmxDYWNoZVtmaWRdKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBsZXQgdXJsID0gJC5yZXF1aXJlKFxcXFxcXFwicGxheVxcXFxcXFwiLCBmcm9tRHJpdmUpLmdldFBsYXlVcmwoZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuLCBjYXRlZ29yeSk7XFxcXG4gICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXFxcbiAgICAgICAgICAgIHN0b3JhZ2UwLnB1dE15VmFyKFxcXFxcXFwicGxheVVybENhY2hlXFxcXFxcXCIsIHBsYXlVcmxDYWNoZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gdXJsO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBmaW5hbGx5IHtcXFxcbiAgICAgICAgaGlkZUxvYWRpbmcoKTtcXFxcbiAgICB9XFxcXG59XFxcXG50cnkge1xcXFxuICAgIHZhciByZXMgPSBxdWFya1NoYXJlQXBpLmdldExpc3RGaWxlKGZpbGVJZCwgTVlfUEFHRSwgc29ydFZhbHVlKTtcXFxcbiAgICAvL+iuvue9ruagh+mimFxcXFxuICAgIHZhciBsaXN0ID0gcmVzLmRhdGEubGlzdCB8fCBbXTtcXFxcbiAgICBpZiAoc2hhcmVJZCAhPT0gXFxcXFxcXCJzZWxmXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgc2V0UGFnZVRpdGxlKHJlcy5kYXRhLnNoYXJlLnRpdGxlKTtcXFxcblxcXFxuICAgICAgICBpZiAobGlzdC5sZW5ndGggPT09IDAgJiYgIWZpbGVJZCkge1xcXFxuICAgICAgICAgICAgcmVzID0gcXVhcmtTaGFyZUFwaS5nZXRMaXN0RmlsZShyZXMuZGF0YS5zaGFyZS5maXJzdF9maWQsIE1ZX1BBR0UsIHNvcnRWYWx1ZSk7XFxcXG4gICAgICAgICAgICBzZXRQYWdlVGl0bGUocmVzLmRhdGEuc2hhcmUudGl0bGUpO1xcXFxuICAgICAgICAgICAgdmFyIGxpc3QgPSByZXMuZGF0YS5saXN0IHx8IFtdO1xcXFxuICAgICAgICB9XFxcXG4gICAgfVxcXFxuICAgIGxldCBuY29va2llID0gcXVhcmtTaGFyZUFwaS5nZXRQaWNDb29raWUoKTtcXFxcbiAgICAvL2xvZyhuY29va2llKVxcXFxuICAgIGxpc3QuZm9yRWFjaChpdGVtID0+IHtcXFxcbiAgICAgICAgLy/liKTmlq3mmK/lkKbmlofku7blpLlcXFxcbiAgICAgICAgaWYgKGl0ZW0uZGlyKSB7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBcXFxcXFxcIvCfk4JcXFxcXFxcIiArIGl0ZW0uZmlsZV9uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgaXRlbS5pbmNsdWRlX2l0ZW1zICsgJ+mhuSAgJyxcXFxcbiAgICAgICAgICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdXJsOiBcXFxcXFxcImhpa2VyOi8vcGFnZS9xdWFya0xpc3Q/cGFnZT1meXBhZ2VcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxcXG4gICAgICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVJZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmVQd2QsXFxcXG4gICAgICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZmlsZUlkOiBpdGVtLmZpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgaW5oZXJpdFRpdGxlOiBmYWxzZSxcXFxcbiAgICAgICAgICAgICAgICAgICAgZnJvbURyaXZlXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIHRpdGxlOiBnZXRIZWFkKGl0ZW0ub2JqX2NhdGVnb3J5KSArIGl0ZW0uZmlsZV9uYW1lLFxcXFxuICAgICAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcXFxuICAgICAgICAgICAgICAgIHBpY191cmw6ICQoaXRlbS50aHVtYm5haWwsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgY29va2llOiBuY29va2llXFxcXG4gICAgICAgICAgICAgICAgfSkuaW1hZ2UoKSxcXFxcbiAgICAgICAgICAgICAgICB1cmw6ICQoXFxcXFxcXCIjbm9Mb2FkaW5nI1xcXFxcXFwiKS5sYXp5UnVsZShnZXREb3duVXJsLCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnksIGZyb21Ecml2ZSksXFxcXG4gICAgICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcXFxuICAgICAgICAgICAgICAgIGV4dHJhOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9pbmhlcml0VGl0bGU6IGZhbHNlLFxcXFxuXFxcXG4gICAgICAgICAgICAgICAgICAgIGNsczogJ3BsYXlsaXN0ICcgKyBpdGVtLm9ial9jYXRlZ29yeVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0pXFxcXG4gICAgICAgIH1cXFxcblxcXFxuICAgIH0pO1xcXFxufSBjYXRjaCAoZSkge1xcXFxuICAgIGQucHVzaCh7XFxcXG4gICAgICAgIHRpdGxlOiBlLm1lc3NhZ2UsXFxcXG4gICAgICAgIHVybDogJ2hpa2VyOi8vZW1wdHknLFxcXFxuICAgICAgICBjb2xfdHlwZTogJ3RleHRfY2VudGVyXzEnLFxcXFxuICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgbGluZVZpc2libGU6IGZhbHNlXFxcXG4gICAgICAgIH1cXFxcbiAgICB9KTtcXFxcbiAgICBpZiAoZS5tZXNzYWdlLmluY2x1ZGVzKFxcXFxcXFwi5o+Q5Y+W56CBXFxcXFxcXCIpKSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogXFxcXFxcXCLovpPlhaXmj5Dlj5bnoIFcXFxcXFxcIixcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmlucHV0KChNWV9QQVJBTVMpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBzZXRQYWdlUGFyYW1zKE9iamVjdC5hc3NpZ24oe30sIE1ZX1BBUkFNUywge1xcXFxuICAgICAgICAgICAgICAgICAgICBzaGFyZVB3ZDogaW5wdXRcXFxcbiAgICAgICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAgICAgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgIH0sIE1ZX1BBUkFNUyksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogXFxcXFxcXCJ0ZXh0X2NlbnRlcl8xXFxcXFxcXCJcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfVxcXFxufVxcXFxuc2V0UmVzdWx0KGQpO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcInBsYXlcXFwiLFxcXCJwYXRoXFxcIjpcXFwicGxheVxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcbmxldCBmcm9tRHJpdmUgPSBtb2R1bGUuaW1wb3J0UGFyYW07XFxcXG5sZXQgcHIsIGhvbWVVcmwsIGFwaSwgY29va2llO1xcXFxuaWYgKGZyb21Ecml2ZSA9PT0gXFxcXFxcXCJ1Y1xcXFxcXFwiKSB7XFxcXG4gICAgaG9tZVVybCA9IFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS51Yy5jbi9cXFxcXFxcIjtcXFxcbiAgICBwciA9IFxcXFxcXFwiVUNCcm93c2VyXFxcXFxcXCI7XFxcXG4gICAgYXBpID0gXFxcXFxcXCJodHRwczovL3BjLWFwaS51Yy5jblxcXFxcXFwiO1xcXFxuICAgIGNvb2tpZSA9IGdldEl0ZW0oXFxcXFxcXCJ1Y0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbn0gZWxzZSB7XFxcXG4gICAgaG9tZVVybCA9IFxcXFxcXFwiaHR0cHM6Ly9kcml2ZS5xdWFyay5jbi9cXFxcXFxcIjtcXFxcbiAgICBwciA9IFxcXFxcXFwidWNwcm9cXFxcXFxcIjtcXFxcbiAgICBhcGkgPSBcXFxcXFxcImh0dHBzOi8vZHJpdmUucXVhcmsuY25cXFxcXFxcIjtcXFxcbiAgICBjb29raWUgPSBnZXRJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG59XFxcXG5cXFxcbmxldCBDb29raWVNYW5hZ2UgPSAkLnJlcXVpcmUoXFxcXFxcXCJDb29raWVNYW5hZ2VcXFxcXFxcIik7XFxcXG5cXFxcbmNvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXFxcbmxldCBodHRwUmVxdWVzdCA9ICQucmVxdWlyZShcXFxcXFxcImh0dHBSZXF1ZXN0XFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiB3YWl0U2xlZXAodGltZSkge1xcXFxuICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAodGltZSB8fCA2MDApO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiByZXF1ZXN0SHR0cCh1cmwpIHtcXFxcbiAgICByZXR1cm4gbmV3IGh0dHBSZXF1ZXN0KHVybClcXFxcbiAgICAgICAgLnN1Y2Nlc3MoKGJvZHksIHJlcykgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKGJvZHkuc3RhdHVzICE9PSAyMDApIHtcXFxcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYm9keS5tZXNzYWdlKTtcXFxcbiAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgY29va2llTWFuYWdlLmFkZChyZXMuaGVhZGVyc1tcXFxcXFxcInNldC1jb29raWVcXFxcXFxcIl0pO1xcXFxuICAgICAgICAgICAgcmV0dXJuIGJvZHk7XFxcXG4gICAgICAgIH0pXFxcXG4gICAgICAgIC5lcnJvclR5cGUoKGVyciwgcmVzKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKEpTT04ucGFyc2UocmVzLmJvZHkpLm1lc3NhZ2UpO1xcXFxuICAgICAgICB9KVxcXFxuICAgICAgICAuYm9keVRvU3RyaW5nKHRydWUpXFxcXG4gICAgICAgIC5oZWFkZXJzKHtcXFxcbiAgICAgICAgICAgIGNvb2tpZTogY29va2llTWFuYWdlLmdldCgpLFxcXFxuICAgICAgICAgICAgXFxcXFxcXCJVc2VyLUFnZW50XFxcXFxcXCI6IFxcXFxcXFwiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgcXVhcmstY2xvdWQtZHJpdmUvMi41LjIwIENocm9tZS8xMDAuMC40ODk2LjE2MCBFbGVjdHJvbi8xOC4zLjUuNC1iNDc4NDkxMTAwIFNhZmFyaS81MzcuMzYgQ2hhbm5lbC9wY2trX290aGVyX2NoXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICBcXFxcXFxcInJlZmVyZXJcXFxcXFxcIjogaG9tZVVybFxcXFxuICAgICAgICB9KTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RHJpdmVJbmZvKCkge1xcXFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvc2hhcmUvc2hhcmVwYWdlL2Rpcj9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGMmYXZlcj0xXFxcXFxcXCIpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiBjcmVhdGVTYXZlVGFzayhmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4pIHtcXFxcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9zaGFyZS9zaGFyZXBhZ2Uvc2F2ZT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRfbGlzdFxcXFxcXFwiOiBbXFxcXG4gICAgICAgICAgICBmaWRcXFxcbiAgICAgICAgXSxcXFxcbiAgICAgICAgXFxcXFxcXCJmaWRfdG9rZW5fbGlzdFxcXFxcXFwiOiBbXFxcXG4gICAgICAgICAgICBmaWRfdG9rZW5cXFxcbiAgICAgICAgXSxcXFxcbiAgICAgICAgXFxcXFxcXCJ0b19wZGlyX2ZpZFxcXFxcXFwiOiBkcml2ZUluZm8uZGF0YS5kaXIuZmlkLFxcXFxuICAgICAgICBcXFxcXFxcInB3ZF9pZFxcXFxcXFwiOiBwd2RfaWQsXFxcXG4gICAgICAgIFxcXFxcXFwic3Rva2VuXFxcXFxcXCI6IHN0b2tlbixcXFxcbiAgICAgICAgXFxcXFxcXCJwZGlyX2ZpZFxcXFxcXFwiOiBkcml2ZUluZm8uZGF0YS5kaXIucGRpcl9maWRcXFxcbiAgICB9KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gY3JlYXRlRGVsZXRlVGFzayhmaWQpIHtcXFxcbiAgICBsZXQgZHJpdmVJbmZvID0gZ2V0RHJpdmVJbmZvKCk7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS9maWxlL2RlbGV0ZT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuc2V0U3RhcnRSZXF1ZXN0RnVuYyhwb3N0KS5ib2R5KHtcXFxcbiAgICAgICAgXFxcXFxcXCJhY3Rpb25fdHlwZVxcXFxcXFwiOiAyLFxcXFxuICAgICAgICBcXFxcXFxcImZpbGVsaXN0XFxcXFxcXCI6IFtcXFxcbiAgICAgICAgICAgIGZpZFxcXFxuICAgICAgICBdLFxcXFxuICAgICAgICBcXFxcXFxcImV4Y2x1ZGVfZmlkc1xcXFxcXFwiOiBbXVxcXFxuICAgIH0pLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5mdW5jdGlvbiB0YXNrKHRhc2tfaWQsIHJldHJ5X2luZGV4KSB7XFxcXG4gICAgcmV0dXJuIHJlcXVlc3RIdHRwKGFwaSArIFxcXFxcXFwiLzEvY2xvdWRkcml2ZS90YXNrXFxcXFxcXCIpLmJ1aWxkVXJsKHtcXFxcbiAgICAgICAgcHI6IHByLFxcXFxuICAgICAgICBmcjogXFxcXFxcXCJwY1xcXFxcXFwiLFxcXFxuICAgICAgICB0YXNrX2lkOiB0YXNrX2lkLFxcXFxuICAgICAgICByZXRyeV9pbmRleDogcmV0cnlfaW5kZXhcXFxcbiAgICB9KS5zdGFydCh0cnVlKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcXVlcnlUYXNrKHRhc2tfaWQpIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDk7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHRhc2sodGFza19pZCwgaSArIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIHdhaXRTbGVlcCgxMDAwKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzLmRhdGEuc2F2ZV9hcy5zYXZlX2FzX3RvcF9maWRzWzBdO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgd2FpdFNsZWVwKDMwMCAqIChpICsgMSkpO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gdm9pZCgwKTtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gcXVlcnlUYXNrU3RhdHVzKHRhc2tfaWQpIHtcXFxcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDY7IGkrKykge1xcXFxuICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IHRhc2sodGFza19pZCwgaSArIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgaWYgKHJlcy5kYXRhLnN0YXR1cyA9PT0gMikge1xcXFxuICAgICAgICAgICAgICAgIHdhaXRTbGVlcCgxMDAwKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIHdhaXRTbGVlcCgzMDApO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgIH1cXFxcbiAgICByZXR1cm4gZmFsc2U7XFxcXG59XFxcXG5cXFxcbmZ1bmN0aW9uIGdldFByZXZpZXdWaWRlbyhmaWQpIHtcXFxcbiAgICByZXR1cm4gcmVxdWVzdEh0dHAoYXBpICsgXFxcXFxcXCIvMS9jbG91ZGRyaXZlL2ZpbGUvdjIvcGxheT9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgIFxcXFxcXFwiZmlkXFxcXFxcXCI6IGZpZCxcXFxcbiAgICAgICAgXFxcXFxcXCJyZXNvbHV0aW9uc1xcXFxcXFwiOiBcXFxcXFxcIm5vcm1hbCxsb3csaGlnaCxzdXBlciwyayw0a1xcXFxcXFwiLFxcXFxuICAgICAgICBcXFxcXFxcInN1cHBvcnRzXFxcXFxcXCI6IFxcXFxcXFwiZm1wNCxtM3U4XFxcXFxcXCJcXFxcbiAgICB9KS5zZXRTdGFydFJlcXVlc3RGdW5jKHBvc3QpLnN0YXJ0KHRydWUpO1xcXFxufVxcXFxuXFxcXG5cXFxcbmZ1bmN0aW9uIGdldERvd25sb2FkVXJsKGZpZCkge1xcXFxuICAgIHJldHVybiByZXF1ZXN0SHR0cChhcGkgKyBcXFxcXFxcIi8xL2Nsb3VkZHJpdmUvZmlsZS9kb3dubG9hZD9wcj1cXFxcXFxcIiArIHByICsgXFxcXFxcXCImZnI9cGNcXFxcXFxcIikuYm9keSh7XFxcXG4gICAgICAgIFxcXFxcXFwiZmlkc1xcXFxcXFwiOiBbZmlkXVxcXFxuICAgIH0pLnNldFN0YXJ0UmVxdWVzdEZ1bmMocG9zdCkuc3RhcnQodHJ1ZSk7XFxcXG59XFxcXG5cXFxcblxcXFxuY29uc3QgRG93blRvb2wgPSAkLnJlcXVpcmUoXFxcXFxcXCJEb3duVG9vbFxcXFxcXFwiKTtcXFxcblxcXFxuZnVuY3Rpb24gZ2V0UGxheVVybChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5LCBpc2dldGN1cmwpIHtcXFxcbiAgICBsZXQgaXNTaGFyZSA9IHB3ZF9pZCAhPT0gXFxcXFxcXCJzZWxmXFxcXFxcXCI7XFxcXG4gICAgXFxcXG4gICAgdHJ5IHtcXFxcbiAgICAgICAgaWYgKCFjb29raWUpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6K+355m75b2V6LSm5Y+3XFxcXFxcXCI7XFxcXG4gICAgICAgIGxldCBhc2ZpZCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgIGlmIChpc1NoYXJlKSB7XFxcXG4gICAgICAgICAgICBsZXQgdGFza0lkID0gY3JlYXRlU2F2ZVRhc2soZmlkLCBmaWRfdG9rZW4sIHB3ZF9pZCwgc3Rva2VuKS5kYXRhLnRhc2tfaWQ7XFxcXG4gICAgICAgICAgICBhc2ZpZCA9IHF1ZXJ5VGFzayh0YXNrSWQpO1xcXFxuICAgICAgICAgICAgaWYgKCFhc2ZpZCkge1xcXFxuICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICBhc2ZpZCA9IGZpZDtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBsZXQgcGxheUNvb2tpZSA9IGNvb2tpZU1hbmFnZS5nZXQoKTtcXFxcbiAgICAgICAgLyppZiAocHIgPT09IFxcXFxcXFwiVUNCcm93c2VyXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIHBsYXlDb29raWUgPSBjb29raWU7XFxcXG4gICAgICAgIH0qL1xcXFxuICAgICAgICBsZXQgcGxheUhlYWRlciA9IHtcXFxcbiAgICAgICAgICAgIFJlZmVyZXI6IGhvbWVVcmwsXFxcXG4gICAgICAgICAgICBjb29raWU6IHBsYXlDb29raWUsXFxcXG4gICAgICAgICAgICBcXFxcXFxcIlVzZXItQWdlbnRcXFxcXFxcIjogXFxcXFxcXCJNb3ppbGxhLzUuMCAoTWFjaW50b3NoOyBJbnRlbCBNYWMgT1MgWCAxMF8xNV83KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBWZXJzaW9uLzQuMCBDaHJvbWUvMTAwLjAuNDg5Ni41OCBVQ0Jyb3dzZXIvMTYuNS44LjEzMDkgTW9iaWxlIFNhZmFyaS81MzcuMzZcXFxcXFxcIlxcXFxuICAgICAgICB9O1xcXFxuICAgICAgICAvKmxldCBwbGF5SGVhZGVycyA9IE9iamVjdC5hc3NpZ24oe30sIHBsYXlIZWFkZXIsIHtcXFxcbiAgICAgICAgICAgIFxcXFxcXFwiVXNlci1BZ2VudFxcXFxcXFwiOiBcXFxcXFxcIkxvZ1N0YXRpc3RpY1xcXFxcXFwiXFxcXG4gICAgICAgIH0pOyovXFxcXG4gICAgICAgIGxldCBjaGVja1NoYXJlPSgpPT4oaXNTaGFyZSAmJiBjcmVhdGVEZWxldGVUYXNrKGFzZmlkKSl8fChwbGF5SGVhZGVyLmNvb2tpZT1jb29raWVNYW5hZ2UuZ2V0KCkpO1xcXFxuICAgICAgICBsZXQgcGxheU1vZGUgPSBnZXRJdGVtKFxcXFxcXFwicXVhcmtfcGxheU1vZGVcXFxcXFxcIiwgXFxcXFxcXCLovaznoIFcXFxcXFxcIik7XFxcXG4gICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcXFxcXCJSUENcXFxcXFxcIikge1xcXFxuICAgICAgICAgICAgbGV0IGRvd25JbmZvID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF07XFxcXG4gICAgICAgICAgICBsZXQgZG93bmxvYWRfdXJsID0gZG93bkluZm8uZG93bmxvYWRfdXJsO1xcXFxuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gZG93bkluZm8uZmlsZV9uYW1lO1xcXFxuICAgICAgICAgICAgY2hlY2tTaGFyZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIERvd25Ub29sLnVwZGF0ZVJwYyhkb3dubG9hZF91cmwsIHBsYXlIZWFkZXIsIGZpbGVuYW1lKSA/IFxcXFxcXFwidG9hc3Q6Ly/liJvlu7rmiJDlip9cXFxcXFxcIiA6IFxcXFxcXFwidG9hc3Q6Ly/liJvlu7rlpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIC8vcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/lt7LmjqjpgIFcXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChbXFxcXFxcXCJjdXJsXFxcXFxcXCIsIFxcXFxcXFwiYXJpYTJcXFxcXFxcIl0uaW5jbHVkZXMocGxheU1vZGUpKSB7XFxcXG4gICAgICAgICAgICBsZXQgZG93bkluZm8gPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXTtcXFxcbiAgICAgICAgICAgIGxldCBkb3dubG9hZF91cmwgPSBkb3duSW5mby5kb3dubG9hZF91cmw7XFxcXG4gICAgICAgICAgICBsZXQgZmlsZW5hbWUgPSBkb3duSW5mby5maWxlX25hbWU7XFxcXG4gICAgICAgICAgICBjaGVja1NoYXJlKClcXFxcbiAgICAgICAgICAgIGxldCBjbm1kID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGlmIChwbGF5TW9kZSA9PT0gXFxcXFxcXCJjdXJsXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgICAgICBjbm1kID0gRG93blRvb2wuZ2V0RG93bkNVUkwoZG93bmxvYWRfdXJsLCBwbGF5SGVhZGVyLCBmaWxlbmFtZSk7XFxcXG4gICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgIGNubWQgPSBEb3duVG9vbC5nZXREb3duQXJpYTJjKGRvd25sb2FkX3VybCwgcGxheUhlYWRlciwgZmlsZW5hbWUsIE51bWJlcihnZXRJdGVtKFxcXFxcXFwic3BlZWRUaHJlYWRcXFxcXFxcIiwgXFxcXFxcXCIxMFxcXFxcXFwiKSkpO1xcXFxuICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICBsZXQgcGF0aCA9IFxcXFxcXFwiaGlrZXI6Ly9maWxlcy9fY2FjaGUvXFxcXFxcXCIgKyBmaWxlbmFtZSArIFxcXFxcXFwiKFxcXFxcXFwiICsgcGxheU1vZGUgKyBcXFxcXFxcIikudHh0XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB3cml0ZUZpbGUocGF0aCwgY25tZCk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJzaGFyZTovL1xcXFxcXFwiICsgcGF0aDtcXFxcbiAgICAgICAgfSBlbHNlIGlmIChjYXRlZ29yeSA9PSBcXFxcXFxcInZpZGVvXFxcXFxcXCIpIHtcXFxcblxcXFxuICAgICAgICAgICAgaWYgKHBsYXlNb2RlID09PSBcXFxcXFxcIui9rOeggVxcXFxcXFwiKSB7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvUmVzID0gZ2V0UHJldmlld1ZpZGVvKGFzZmlkKTtcXFxcbiAgICAgICAgICAgICAgICBjaGVja1NoYXJlKCk7XFxcXG4gICAgICAgICAgICAgICAgbGV0IHZpZGVvTGlzdCA9IHZpZGVvUmVzLmRhdGEudmlkZW9fbGlzdDtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW10sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtdXFxcXG4gICAgICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgXFxcXG4gICAgICAgICAgICAgICAgdmlkZW9MaXN0LmZpbHRlcih2ID0+IHYuYWNjZXNzYWJsZSkuZm9yRWFjaCh2ID0+IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgcGxheUxpc3QubmFtZXMucHVzaCh2LnJlc29sdXRpb24pO1xcXFxuICAgICAgICAgICAgICAgICAgICBwbGF5TGlzdC51cmxzLnB1c2godi52aWRlb19pbmZvLnVybCArIFxcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIik7XFxcXG4gICAgICAgICAgICAgICAgICAgIHBsYXlMaXN0LmhlYWRlcnMucHVzaChwbGF5SGVhZGVyKTtcXFxcbiAgICAgICAgICAgICAgICB9KTtcXFxcbiAgICAgICAgICAgICAgICBcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcblxcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5VXJsID0gZ2V0RG93bmxvYWRVcmwoYXNmaWQpLmRhdGFbMF0uZG93bmxvYWRfdXJsO1xcXFxuICAgICAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheUxpc3QgPSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIG5hbWVzOiBbcGxheU1vZGVdLFxcXFxuICAgICAgICAgICAgICAgICAgICB1cmxzOiBbcGxheVVybCArIFxcXFxcXFwiI2lzVmlkZW89dHJ1ZSNcXFxcXFxcIiArIChwbGF5TW9kZSA9PT0gXFxcXFxcXCLljp/nlLtcXFxcXFxcIiA/IFxcXFxcXFwiI2Zhc3RQbGF5TW9kZSMjdGhyZWFkcz1cXFxcXFxcIiArIGdldEl0ZW0oXFxcXFxcXCJzcGVlZFRocmVhZFxcXFxcXFwiLCBcXFxcXFxcIjEwXFxcXFxcXCIpICsgXFxcXFxcXCIjXFxcXFxcXCIgOiBcXFxcXFxcIlxcXFxcXFwiKV0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IFtwbGF5SGVhZGVyXVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICBcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGxheUxpc3QpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgbGV0IHBsYXlVcmwgPSBnZXREb3dubG9hZFVybChhc2ZpZCkuZGF0YVswXS5kb3dubG9hZF91cmw7XFxcXG5cXFxcbiAgICAgICAgICAgIGNoZWNrU2hhcmUoKTtcXFxcbiAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PT0gJ2F1ZGlvJykge1xcXFxuICAgICAgICAgICAgICAgIGxldCBwbGF5TGlzdCA9IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbmFtZXM6IFtcXFxcXFxcIumfs+mikVxcXFxcXFwiXSxcXFxcbiAgICAgICAgICAgICAgICAgICAgdXJsczogW3BsYXlVcmwgKyBcXFxcXFxcIiNpc011c2ljPXRydWUjXFxcXFxcXCJdLFxcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBbcGxheUhlYWRlcl0sXFxcXG4gICAgICAgICAgICAgICAgICAgIGx5cmljOiBcXFxcXFxcIlxcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwbGF5TGlzdCk7XFxcXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5ID09PSAnaW1hZ2UnKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQocGxheVVybCwgcGxheUhlYWRlcikuaW1hZ2UoKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcGxheUhlYWRlciA9IE9iamVjdC5rZXlzKHBsYXlIZWFkZXIpLm1hcChrZXkgPT4ga2V5ICsgXFxcXFxcXCJAXFxcXFxcXCIgKyBTdHJpbmcocGxheUhlYWRlcltrZXldKS5yZXBsYWNlKC87L2csIFxcXFxcXFwi77yb77ybXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJkb3dubG9hZDovL1xcXFxcXFwiICsgcGxheVVybCArIFxcXFxcXFwiO3tcXFxcXFxcIiArIHBsYXlIZWFkZXIuam9pbihcXFxcXFxcIiYmXFxcXFxcXCIpICsgXFxcXFxcXCJ9XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgIGlmIChlLm1lc3NhZ2UuaW5jbHVkZXMoXFxcXFxcXCJyZXF1aXJlIGxvZ2luXFxcXFxcXCIpIHx8IGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcInRva2VuXFxcXFxcXCIpIHx8IGUubWVzc2FnZS5pbmNsdWRlcyhcXFxcXFxcImludmFsaWRcXFxcXFxcIikpIHtcXFxcbiAgICAgICAgICAgIHRvYXN0KFxcXFxcXFwi5pyq55m75b2V5oiW55m75b2V6L+H5pyf77yM6K+36YeN5paw55m75b2VXFxcXFxcXCIpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiaGlrZXI6Ly9wYWdlL2xvZ2luI25vUmVjb3JkSGlzdG9yeSMjbm9IaXN0b3J5Iz9mcm9tPVxcXFxcXFwiICsgZnJvbURyaXZlO1xcXFxuICAgICAgICB9XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vXFxcXFxcXCIgKyBlLnRvU3RyaW5nKCk7XFxcXG4gICAgfVxcXFxufVxcXFxuXFxcXG4kLmV4cG9ydHMgPSB7XFxcXG4gICAgZ2V0UGxheVVybFxcXFxufTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCLnmbvlvZXotKblj7dcXFwiLFxcXCJwYXRoXFxcIjpcXFwibG9naW5cXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5sZXQgZCA9IFtdO1xcXFxuc2V0UGFnZVRpdGxlKFxcXFxcXFwi55m75b2V6LSm5Y+3XFxcXFxcXCIpO1xcXFxuYWRkTGlzdGVuZXIoXFxcXFxcXCJvbkNsb3NlXFxcXFxcXCIsICgpID0+IGNsZWFyTXlWYXIoXFxcXFxcXCJjb29raWVcXFxcXFxcIikpO1xcXFxubGV0IGZyb209Z2V0UGFyYW0oXFxcXFxcXCJmcm9tXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIik7XFxcXG5cXFxcbmQucHVzaCh7XFxcXG4gICAgdGl0bGU6IFxcXFxcXFwi4oCc4oCc56Gu6K6k55m75b2V4oCd4oCdXFxcXFxcXCIsXFxcXG4gICAgdXJsOiAkKFxcXFxcXFwiI25vTG9hZGluZyNcXFxcXFxcIikubGF6eVJ1bGUoKGZyb20pID0+IHtcXFxcbiAgICAgICAgLy9sZXQgY20gPSBhbmRyb2lkLndlYmtpdC5Db29raWVNYW5hZ2VyLmdldEluc3RhbmNlKCk7XFxcXG4gICAgICAgIC8vbGV0IGNtID0gY29tLnRlbmNlbnQuc210dC5zZGsuQ29va2llTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xcXFxuICAgICAgICAvL2xldCBjb29raWUgPSBTdHJpbmcoY20uZ2V0Q29va2llKFxcXFxcXFwiaHR0cHM6Ly9wYW4ucXVhcmsuY25cXFxcXFxcIikgfHwgXFxcXFxcXCJcXFxcXFxcIik7XFxcXG4gICAgICAgIGxldCBjb29raWUgPSBnZXRNeVZhcihcXFxcXFxcImNvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShjb29raWUpKSB7XFxcXG4gICAgICAgICAgICBpZihmcm9tPT09XFxcXFxcXCJ1Y1xcXFxcXFwiKXtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIH1lbHNle1xcXFxuICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgYmFjaygpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/nmbvlvZXmiJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXFxcXFwiO1xcXFxuICAgIH0sIGZyb20pLFxcXFxuICAgIGRlc2M6IFxcXFxcXFwi4oCc4oCc4oCd4oCdPHNtYWxsPueCueWHu+WktOWDj+WPr+S7pemAgOWHuui0puWPt+mHjeaWsOeZu+W9lTwvc21hbGw+XFxcXFxcXCIsXFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwidGV4dF9jZW50ZXJfMVxcXFxcXFwiXFxcXG59KTtcXFxcbmQucHVzaCh7XFxcXG4gICAgY29sX3R5cGU6IFxcXFxcXFwibGluZV9ibGFua1xcXFxcXFwiXFxcXG59KTtcXFxcbmxldCBkdXJsPWZyb209PT1cXFxcXFxcInVjXFxcXFxcXCI/XFxcXFxcXCJodHRwczovL2RyaXZlLnVjLmNuXFxcXFxcXCI6XFxcXFxcXCJodHRwczovL3Bhbi5xdWFyay5jblxcXFxcXFwiO1xcXFxuZC5wdXNoKHtcXFxcbiAgICBjb2xfdHlwZTogXFxcXFxcXCJ4NV93ZWJ2aWV3X3NpbmdsZVxcXFxcXFwiLFxcXFxuICAgIHVybDogZHVybCxcXFxcbiAgICBkZXNjOiBcXFxcXFxcImxpc3QmJnNjcmVlbi0xNTBcXFxcXFxcIixcXFxcbiAgICBleHRyYToge1xcXFxuICAgICAgICB1YTogUENfVUEsXFxcXG4gICAgICAgIGpzOiAkLnRvU3RyaW5nKCh0aXRsZSwgZHVybCkgPT4ge1xcXFxuICAgICAgICAgICAgbGV0IGNvb2tpZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XFxcXG4gICAgICAgICAgICAgICAgY29va2llID0gZmJhLmdldENvb2tpZShkdXJsKTtcXFxcbiAgICAgICAgICAgICAgICBmYmEucHV0VmFyKHRpdGxlICsgXFxcXFxcXCJAY29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICB9LCAyMDApO1xcXFxuICAgICAgICB9LCBNWV9SVUxFLnRpdGxlLCBkdXJsKVxcXFxuICAgIH1cXFxcbn0pO1xcXFxuc2V0UmVzdWx0KGQpXFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5bel5YW3XFxcIixcXFwicGF0aFxcXCI6XFxcInRvb2xcXFwiLFxcXCJydWxlXFxcIjpcXFwianM6XFxcXG5cXFxcbiQuZXhwb3J0cz17XFxcXG4gICAgaXNMb2dpbkNvb2tpZShjb29raWUpe1xcXFxuICAgICAgICAvL3JldHVybiB0cnVlO1xcXFxuICAgICAgICByZXR1cm4gISEoY29va2llICAmJiBjb29raWUuaW5jbHVkZXMoXFxcXFxcXCJfX3VpZD1cXFxcXFxcIikgJiYgY29va2llLmluY2x1ZGVzKFxcXFxcXFwiX19wdXM9XFxcXFxcXCIpKTtcXFxcbiAgICB9XFxcXG59O1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIuS4quS6uui0puWPt+iuvue9rlxcXCIsXFxcInBhdGhcXFwiOlxcXCJhY2NvdW50XFxcIixcXFwicnVsZVxcXCI6XFxcIiQuZXhwb3J0cyA9ICQoW1xcXFxcXFwi5aS45YWL5LqM57u056CB55m75b2VXFxcXFxcXCIsIFxcXFxcXFwiQ29va2ll55m75b2VXFxcXFxcXCIsIFxcXFxcXFwi572R6aG155m75b2VXFxcXFxcXCIsIFxcXFxcXFwi5aSN5Yi2Q29va2llXFxcXFxcXCIsIFxcXFxcXFwi5riF6ZmkQ29va2llXFxcXFxcXCIsIFxcXFxcXFwi6I635Y+W572R57uc5YWx5LqrS0tDb29raWVcXFxcXFxcIiwgXFxcXFxcXCJVQ+S6jOe7tOeggeeZu+W9lVxcXFxcXFwiLCBcXFxcXFxcIlVD572R6aG155m75b2VXFxcXFxcXCIsIFxcXFxcXFwiVUNDb29raWXnmbvlvZVcXFxcXFxcIiwgXFxcXFxcXCLlpI3liLZVQ0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIua4hemZpFVDQ29va2llXFxcXFxcXCJdKS5zZWxlY3QoKGlzcikgPT4ge1xcXFxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlUmFuZG9tVVVJRCgpIHtcXFxcbiAgICAgICAgcmV0dXJuICd4eHh4eHh4eC14eHh4LTR4eHgteXh4eC14eHh4eHh4eHh4eHgnLnJlcGxhY2UoL1t4eV0vZywgZnVuY3Rpb24oYykge1xcXFxuICAgICAgICAgICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwLFxcXFxuICAgICAgICAgICAgICAgIHYgPSBjID09PSAneCcgPyByIDogKHIgJiAweDMgfCAweDgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoMTYpO1xcXFxuICAgICAgICB9KTtcXFxcbiAgICB9XFxcXG4gICAgaWYgKGlucHV0ID09PSBcXFxcXFxcIue9kemhteeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiBcXFxcXFxcImhpa2VyOi8vcGFnZS9sb2dpbiNub1JlY29yZEhpc3RvcnkjI25vSGlzdG9yeSNcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIkNvb2tpZeeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHJldHVybiAkKFxcXFxcXFwiXFxcXFxcXCIsIFxcXFxcXFwi6K+36L6T5YWlQ29va2llXFxcXFxcXCIpLmlucHV0KChpc3IpID0+IHtcXFxcbiAgICAgICAgICAgIGlmICgkLnJlcXVpcmUoXFxcXFxcXCJ0b29sXFxcXFxcXCIpLmlzTG9naW5Db29raWUoaW5wdXQpKSB7XFxcXG4gICAgICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGlucHV0LnJlcGxhY2UoL1xcXFxcXFxccy9nLCBcXFxcXFxcIlxcXFxcXFwiKSk7XFxcXG4gICAgICAgICAgICAgICAgaXNyICYmIHJlZnJlc2hQYWdlKCk7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly9Db29raWXmoLzlvI/plJnor69cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIH1cXFxcbiAgICAgICAgfSwgaXNyKTtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuS7jlRWQk9Y6I635Y+WQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IHBhdGggPSBcXFxcXFxcIi9zdG9yYWdlL2VtdWxhdGVkLzAvVFYvLnF1YXJrX3VzZXJcXFxcXFxcIjtcXFxcbiAgICAgICAgaWYgKGZpbGVFeGlzdChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgpKSB7XFxcXG4gICAgICAgICAgICBpZiAoIW5ldyBqYXZhLmlvLkZpbGUocGF0aCkuY2FuUmVhZCgpKSB7XFxcXG4gICAgICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLmsqHmnInmnYPpmZDor7vlj5ZDb29raWXmlofku7bvvIzor7fmiZPlvIDmiYDmnInmlofku7bmnYPpmZBcXFxcXFxcXG7mtbfpmJTorr7nva4tPuabtOWkmuWKn+iDvS0+5YaF6YOo5paH5Lu2566h55CGLT7lj7PkuIrop5JcXFxcXFxcIikuY29uZmlybSgoKSA9PiB7fSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB0cnkge1xcXFxuICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShmZXRjaChcXFxcXFxcImZpbGU6Ly9cXFxcXFxcIiArIHBhdGgpKTtcXFxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llID0ganNvbi5jb29raWU7XFxcXG4gICAgICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShjb29raWUpKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHNldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBjb29raWUpO1xcXFxuICAgICAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iOt+WPluWksei0peWFseS6q+aWh+S7tuaNn+Wdj1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuICQoXFxcXFxcXCLmnKrmo4DmtYvliLBUVkJPWOeahENvb2tpZeaWh+S7tlxcXFxcXFxcbuivt+S9v+eUqOi/h+WQjuWGjeWwneivlVxcXFxcXFwiKS5jb25maXJtKCgpID0+IHt9KTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi2Q29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IGNvb2tpZSA9IGdldEl0ZW0oXFxcXFxcXCJxdWFya0Nvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICAgICAgaWYgKGNvb2tpZSkge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwiY29weTovL1xcXFxcXFwiICsgY29va2llO1xcXFxuICAgICAgICB9IGVsc2Uge1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mnKrnmbvlvZVcXFxcXFxcIjtcXFxcbiAgICAgICAgfVxcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5riF6ZmkQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgY2xlYXJJdGVtKFxcXFxcXFwicXVhcmtDb29raWVcXFxcXFxcIik7XFxcXG4gICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+mAgOWHuueZu+W9lVxcXFxcXFwiO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwiVUPnvZHpobXnmbvlvZVcXFxcXFxcIikge1xcXFxuICAgICAgICByZXR1cm4gXFxcXFxcXCJoaWtlcjovL3BhZ2UvbG9naW4jbm9SZWNvcmRIaXN0b3J5IyNub0hpc3RvcnkjP2Zyb209dWNcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIlVDQ29va2ll55m75b2VXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgcmV0dXJuICQoXFxcXFxcXCJcXFxcXFxcIiwgXFxcXFxcXCLor7fovpPlhaVDb29raWVcXFxcXFxcIikuaW5wdXQoKGlzcikgPT4ge1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShpbnB1dCkpIHtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgaW5wdXQucmVwbGFjZSgvXFxcXFxcXFxzL2csIFxcXFxcXFwiXFxcXFxcXCIpKTtcXFxcbiAgICAgICAgICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+iuvue9ruaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL0Nvb2tpZeagvOW8j+mUmeivr1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9LCBpc3IpO1xcXFxuICAgIH0gZWxzZSBpZiAoaW5wdXQgPT09IFxcXFxcXFwi5aSN5Yi2VUNDb29raWVcXFxcXFxcIikge1xcXFxuICAgICAgICBsZXQgY29va2llID0gZ2V0SXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIsIFxcXFxcXFwiXFxcXFxcXCIpO1xcXFxuICAgICAgICBpZiAoY29va2llKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJjb3B5Oi8vXFxcXFxcXCIgKyBjb29raWU7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+acqueZu+W9lVxcXFxcXFwiO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCLmuIXpmaRVQ0Nvb2tpZVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIGNsZWFySXRlbShcXFxcXFxcInVjQ29va2llXFxcXFxcXCIpO1xcXFxuICAgICAgICBpc3IgJiYgcmVmcmVzaFBhZ2UoKTtcXFxcbiAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/pgIDlh7rnmbvlvZVcXFxcXFxcIjtcXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuiOt+WPlue9kee7nOWFseS6q0tLQ29va2llXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgbGV0IGhoZCA9IHtcXFxcbiAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ0FwYWNoZS1IdHRwQ2xpZW50L1VOQVZBSUxBQkxFIChqYXZhIDEuNCknXFxcXG4gICAgICAgIH3CoFxcXFxuICAgICAgICBsZXQgZHhjdXJsID0gJ2h0dHA6Ly9hcGkudjZ4LndodC5kZ3dodC50b3AvdGV4dC8zZGU4OGQxMGQwMTkyOWJlLydcXFxcbiAgICAgICAgbGV0IHhjZGF0YSA9IFsnYzk5ZDc0MTFjY2MyOWJjMSddXFxcXG4gICAgICAgIGxldCBkeGMgPSBbXVxcXFxuICAgICAgICBsZXQgeXNjb29raWUgPSAnJ1xcXFxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHhjZGF0YS5sZW5ndGg7IGkrKykge1xcXFxuICAgICAgICAgICAgbGV0IGRhdGEgPSBmZXRjaChkeGN1cmwgKyB4Y2RhdGFbaV0sIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBoaGRcXFxcbiAgICAgICAgICAgIH0pO1xcXFxuICAgICAgICAgICAgaWYgKCQucmVxdWlyZShcXFxcXFxcInRvb2xcXFxcXFxcIikuaXNMb2dpbkNvb2tpZShkYXRhKSkge1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIHlzY29va2llID0gZGF0YS5zcGxpdChcXFxcXFxcIuKRoFxcXFxcXFwiKVsxXTtcXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxcXFxuICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9XFxcXG4gICAgICAgIGlmICh5c2Nvb2tpZSkge1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIHlzY29va2llKTtcXFxcbiAgICAgICAgICAgIGlzciAmJiByZWZyZXNoUGFnZSgpO1xcXFxuICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/orr7nva7miJDlip9cXFxcXFxcIjtcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v6I635Y+W5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9IGVsc2UgaWYgKGlucHV0ID09PSBcXFxcXFxcIuWkuOWFi+S6jOe7tOeggeeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcXFxuICAgICAgICAgICAgbGV0IHFjVG9rZW4gPSBKU09OLnBhcnNlKGZldGNoKGJ1aWxkVXJsKFxcXFxcXFwiaHR0cHM6Ly91b3AucXVhcmsuY24vY2FzL2FqYXgvZ2V0VG9rZW5Gb3JRcmNvZGVMb2dpblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgcmVxdWVzdF9pZCxcXFxcbiAgICAgICAgICAgICAgICBjbGllbnRfaWQ6IFxcXFxcXFwiNTMyXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgdjogXFxcXFxcXCIxLjJcXFxcXFxcIlxcXFxuICAgICAgICAgICAgfSkpKS5kYXRhLm1lbWJlcnMudG9rZW47XFxcXG4gICAgICAgICAgICBjcmVhdGVRUkNvZGUoYGh0dHBzOi8vc3UucXVhcmsuY24vNF9lTUhCSj90b2tlbj0ke3FjVG9rZW59JmNsaWVudF9pZD01MzImc3NiPXdlYmxvZ2luJnVjX3BhcmFtX3N0cj0mdWNfYml6X3N0cj1TJTNBY3VzdG9tJTdDT1BUJTNBU0FSRUElNDAwJTdDT1BUJTNBSU1NRVJTSVZFJTQwMSU3Q09QVCUzQUJBQ0tfQlROX1NUWUxFJTQwMGAsIGZhbHNlKTtcXFxcbiAgICAgICAgICAgIGxldCBzZXJ2aWNlX3RpY2tldCA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgZWMgPSAwOyBpIDwgMzA7IGkrKykge1xcXFxuICAgICAgICAgICAgICAgIGphdmEubGFuZy5UaHJlYWQuc2xlZXAoMjAwMCk7XFxcXG4gICAgICAgICAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRpY2tldCA9IEpTT04ucGFyc2UoZmV0Y2goYnVpbGRVcmwoXFxcXFxcXCJodHRwczovL3VvcC5xdWFyay5jbi9jYXMvYWpheC9nZXRTZXJ2aWNlVGlja2V0QnlRcmNvZGVUb2tlblxcXFxcXFwiLCB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X2lkOiBnZW5lcmF0ZVJhbmRvbVVVSUQoKSxcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9pZDogXFxcXFxcXCI1MzJcXFxcXFxcIixcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHY6IFxcXFxcXFwiMS4yXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbjogcWNUb2tlblxcXFxuICAgICAgICAgICAgICAgICAgICB9KSkpO1xcXFxuICAgICAgICAgICAgICAgICAgICAvL2xvZyh0aWNrZXQpXFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDIwMDAwMDApIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VfdGlja2V0ID0gdGlja2V0LmRhdGEubWVtYmVycy5zZXJ2aWNlX3RpY2tldDtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAxKSBjb250aW51ZTtcXFxcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpY2tldC5zdGF0dXMgPT0gNTAwMDQwMDIgfHwgaSA9PT0gMjkpIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v5LqM57u056CB6L+H5pyfXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICAgICAgICAgIH1cXFxcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGVjKys7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmIChlYyA+PSA1KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+afpeivouS6jOe7tOeggeWHuumUmVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICBpZiAoIXNlcnZpY2VfdGlja2V0KSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL3RpY2tldOiOt+WPluWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IHJlcyA9IEpTT04ucGFyc2UoZmV0Y2goXFxcXFxcXCJodHRwczovL3Bhbi5xdWFyay5jbi9hY2NvdW50L2luZm8/c3Q9XFxcXFxcXCIgKyBzZXJ2aWNlX3RpY2tldCArIFxcXFxcXFwiJmx3PXNjYW5cXFxcXFxcIiwge1xcXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlXFxcXG4gICAgICAgICAgICB9KSk7XFxcXG4gICAgICAgICAgICAvL2xvZyhyZXMpXFxcXG4gICAgICAgICAgICBpZiAoIUpTT04ucGFyc2UocmVzLmJvZHkpLnN1Y2Nlc3MpIHJldHVybiBcXFxcXFxcInRvYXN0Oi8vdGlja2V06aqM6K+B5aSx6LSlXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgY29va2llID0gXFxcXFxcXCJcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCBoZWFkZXJzID0gcmVzLmhlYWRlcnM7XFxcXG4gICAgICAgICAgICBmb3IgKGxldCBjIG9mIGhlYWRlcnNbXFxcXFxcXCJzZXQtY29va2llXFxcXFxcXCJdKSB7XFxcXG4gICAgICAgICAgICAgICAgY29va2llICs9IGMuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpWzBdICsgXFxcXFxcXCI7XFxcXFxcXCI7XFxcXG4gICAgICAgICAgICB9XFxcXG5cXFxcbiAgICAgICAgICAgIGxvZyhjb29raWUpO1xcXFxuICAgICAgICAgICAgc2V0SXRlbShcXFxcXFxcInF1YXJrQ29va2llXFxcXFxcXCIsIGNvb2tpZSk7XFxcXG4gICAgICAgICAgICByZWZyZXNoUGFnZShmYWxzZSk7XFxcXG4gICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+eZu+W9leaIkOWKn1xcXFxcXFwiO1xcXFxuICAgICAgICB9IGNhdGNoIChlKSB7XFxcXG4gICAgICAgICAgICByZXR1cm4gKFxcXFxcXFwidG9hc3Q6Ly/nmbvlvZXlpLHotKXvvJpcXFxcXFxcIiArIGUudG9TdHJpbmcoKSk7XFxcXG4gICAgICAgIH1cXFxcbiAgICAgICAgLy9odHRwczovL3N1LnF1YXJrLmNuLzRfZU1IQko/dG9rZW49c3Q5NmE2MzMzOTBueTl5emxrMGl2dW91YzdiOWdmbWomY2xpZW50X2lkPTUzMiZzc2I9d2VibG9naW4mdWNfcGFyYW1fc3RyPSZ1Y19iaXpfc3RyPVMlM0FjdXN0b20lN0NPUFQlM0FTQVJFQSU0MDAlN0NPUFQlM0FJTU1FUlNJVkUlNDAxJTdDT1BUJTNBQkFDS19CVE5fU1RZTEUlNDAwXFxcXG4gICAgfSBlbHNlIGlmIChpbnB1dCA9PT0gXFxcXFxcXCJVQ+S6jOe7tOeggeeZu+W9lVxcXFxcXFwiKSB7XFxcXG4gICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICBsZXQgcmVxdWVzdF9pZCA9IGdlbmVyYXRlUmFuZG9tVVVJRCgpO1xcXFxuICAgICAgICAgICAgbGV0IHFjVG9rZW4gPSBKU09OLnBhcnNlKHBvc3QoYGh0dHBzOi8vYXBpLm9wZW4udWMuY24vY2FzL2FqYXgvZ2V0VG9rZW5Gb3JRcmNvZGVMb2dpbj9fX3Q9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLCB7XFxcXG4gICAgICAgICAgICAgICAgYm9keTogYHY9MS4yJnJlcXVlc3RfaWQ9JHtyZXF1ZXN0X2lkfSZjbGllbnRfaWQ9MzgxYFxcXFxuICAgICAgICAgICAgfSkpLmRhdGEubWVtYmVycy50b2tlbjtcXFxcbiAgICAgICAgICAgIGNyZWF0ZVFSQ29kZShgaHR0cHM6Ly9zdS51Yy5jbi8xX24wWkN2P3Rva2VuPSR7cWNUb2tlbn0mY2xpZW50X2lkPTM4MSZ1Y19wYXJhbV9zdHI9JnVjX2Jpel9zdHI9UyUzQWN1c3RvbSU3Q0MlM0F0aXRsZWJhcl9maXhgLCBmYWxzZSk7XFxcXG4gICAgICAgICAgICBsZXQgc2VydmljZV90aWNrZXQgPSBcXFxcXFxcIlxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGVjID0gMDsgaSA8IDMwOyBpKyspIHtcXFxcbiAgICAgICAgICAgICAgICBqYXZhLmxhbmcuVGhyZWFkLnNsZWVwKDIwMDApO1xcXFxuICAgICAgICAgICAgICAgIHRyeSB7XFxcXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aWNrZXQgPSBKU09OLnBhcnNlKHBvc3QoYGh0dHBzOi8vYXBpLm9wZW4udWMuY24vY2FzL2FqYXgvZ2V0U2VydmljZVRpY2tldEJ5UXJjb2RlVG9rZW4/X190PSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCwge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogYHY9MS4yJnJlcXVlc3RfaWQ9JHtyZXF1ZXN0X2lkfSZjbGllbnRfaWQ9MzgxJnRva2VuPSR7cWNUb2tlbn1gXFxcXG4gICAgICAgICAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgLy9sb2codGlja2V0KVxcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSAyMDAwMDAwKSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlX3RpY2tldCA9IHRpY2tldC5kYXRhLm1lbWJlcnMuc2VydmljZV90aWNrZXQ7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0LnN0YXR1cyA9PSA1MDAwNDAwMSkgY29udGludWU7XFxcXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aWNrZXQuc3RhdHVzID09IDUwMDA0MDAyIHx8IGkgPT09IDI5KSB7XFxcXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL+S6jOe7tOeggei/h+acn1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xcXFxuICAgICAgICAgICAgICAgICAgICBlYysrO1xcXFxuICAgICAgICAgICAgICAgICAgICBpZiAoZWMgPj0gNSkge1xcXFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly/mn6Xor6Lkuoznu7TnoIHlh7rplJlcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgICAgIH1cXFxcblxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgaWYgKCFzZXJ2aWNlX3RpY2tldCkgcmV0dXJuIFxcXFxcXFwidG9hc3Q6Ly90aWNrZXTojrflj5blpLHotKVcXFxcXFxcIjtcXFxcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKGZldGNoKGBodHRwczovL2RyaXZlLnVjLmNuL2FjY291bnQvaW5mbz9zdD0ke3NlcnZpY2VfdGlja2V0fWAsIHtcXFxcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgLy9sb2cocmVzKVxcXFxuICAgICAgICAgICAgaWYgKCFKU09OLnBhcnNlKHJlcy5ib2R5KS5zdWNjZXNzKSByZXR1cm4gXFxcXFxcXCJ0b2FzdDovL3RpY2tldOmqjOivgeWksei0pVxcXFxcXFwiO1xcXFxuICAgICAgICAgICAgbGV0IGNvb2tpZSA9IFxcXFxcXFwiXFxcXFxcXCI7XFxcXG4gICAgICAgICAgICBsZXQgaGVhZGVycyA9IHJlcy5oZWFkZXJzO1xcXFxuICAgICAgICAgICAgZm9yIChsZXQgYyBvZiBoZWFkZXJzW1xcXFxcXFwic2V0LWNvb2tpZVxcXFxcXFwiXSkge1xcXFxuICAgICAgICAgICAgICAgIGNvb2tpZSArPSBjLnNwbGl0KFxcXFxcXFwiO1xcXFxcXFwiKVswXSArIFxcXFxcXFwiO1xcXFxcXFwiO1xcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgbG9nKGNvb2tpZSk7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKFxcXFxcXFwidWNDb29raWVcXFxcXFxcIiwgY29va2llKTtcXFxcbiAgICAgICAgICAgIHJlZnJlc2hQYWdlKGZhbHNlKTtcXFxcbiAgICAgICAgICAgIHJldHVybiBcXFxcXFxcInRvYXN0Oi8v55m75b2V5oiQ5YqfXFxcXFxcXCI7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcXFxcbiAgICAgICAgICAgIHJldHVybiAoXFxcXFxcXCJ0b2FzdDovL+eZu+W9leWksei0pe+8mlxcXFxcXFwiICsgZS50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgIH1cXFxcbn0sICQuaW1wb3J0UGFyYW0pO1xcXCJ9LHtcXFwiY29sX3R5cGVcXFwiOlxcXCJtb3ZpZV8zXFxcIixcXFwibmFtZVxcXCI6XFxcIkNvb2tpZU1hbmFnZVxcXCIsXFxcInBhdGhcXFwiOlxcXCJDb29raWVNYW5hZ2VcXFwiLFxcXCJydWxlXFxcIjpcXFwiZnVuY3Rpb24gQ29va2llTWFuYWdlKGNvb2tpZSkge1xcXFxuICAgIHRoaXMuY29va2llID0ge307XFxcXG4gICAgdGhpcy5hZGQoY29va2llKTtcXFxcbn1cXFxcbk9iamVjdC5hc3NpZ24oQ29va2llTWFuYWdlLnByb3RvdHlwZSwge1xcXFxuICAgIGFkZChjb29raWUpIHtcXFxcbiAgICAgICAgbGV0IGNvb2tpZXMgPSBbXTtcXFxcbiAgICAgICAgaWYgKHR5cGVvZiBjb29raWUgPT09IFxcXFxcXFwic3RyaW5nXFxcXFxcXCIpIHtcXFxcbiAgICAgICAgICAgIGNvb2tpZXMgPSBjb29raWUuc3BsaXQoXFxcXFxcXCI7XFxcXFxcXCIpO1xcXFxuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29va2llKSkge1xcXFxuICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBjb29raWVzLmZvckVhY2godiA9PiB7XFxcXG4gICAgICAgICAgICB2ID0gdi5zcGxpdChcXFxcXFxcIj1cXFxcXFxcIik7XFxcXG4gICAgICAgICAgICBpZiAodi5sZW5ndGggPCAyKSByZXR1cm47XFxcXG4gICAgICAgICAgICBsZXQga2V5ID0gdi5zaGlmdCgpLnRyaW0oKTtcXFxcbiAgICAgICAgICAgIHRoaXMuY29va2llW2tleV0gPSB2LmpvaW4oXFxcXFxcXCI9XFxcXFxcXCIpLnRyaW0oKTtcXFxcbiAgICAgICAgfSk7XFxcXG4gICAgfSxcXFxcbiAgICBnZXQoKSB7XFxcXG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLmNvb2tpZSkubWFwKHYgPT4gdlswXSArIFxcXFxcXFwiPVxcXFxcXFwiICsgdlsxXSkuam9pbihcXFxcXFxcIjtcXFxcXFxcIik7XFxcXG4gICAgfVxcXFxufSk7XFxcXG4vL2NvbnN0IGNvb2tpZU1hbmFnZSA9IG5ldyBDb29raWVNYW5hZ2UoY29va2llKTtcXFxcbiQuZXhwb3J0cz1Db29raWVNYW5hZ2U7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5aSp57+8QVBJXFxcIixcXFwicGF0aFxcXCI6XFxcIkNsb3VkRHJpdmVcXFwiLFxcXCJydWxlXFxcIjpcXFwiY29uc3QgQ3J5cHRvVXRpbCA9ICQucmVxdWlyZShcXFxcXFxcImhpa2VyOi8vYXNzZXRzL2NyeXB0by1qYXZhLmpzXFxcXFxcXCIpO1xcXFxuXFxcXG5mdW5jdGlvbiBDbG91ZERyaXZlKCkge1xcXFxuICAgIHRoaXMucmVnZXggPSAvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvY2xvdWRcXFxcXFxcXC4xODlcXFxcXFxcXC5jblxcXFxcXFxcL3dlYlxcXFxcXFxcL3NoYXJlXFxcXFxcXFw/Y29kZT0oWzAtOUEtWmEtel0rKS87IC8vaHR0cHM6Ly9jbG91ZC4xODkuY24vd2ViL3NoYXJlP2NvZGU9cUkzYU1qcVlScnFhXFxcXG4gICAgdGhpcy5jb25maWcgPSB7XFxcXG4gICAgICAgIGNsaWVudElkOiAnNTM4MTM1MTUwNjkzNDEyJyxcXFxcbiAgICAgICAgbW9kZWw6ICdLQjIwMDAnLFxcXFxuICAgICAgICB2ZXJzaW9uOiAnOS4wLjYnLFxcXFxuICAgICAgICBwdWJLZXk6ICdNSUdmTUEwR0NTcUdTSWIzRFFFQkFRVUFBNEdOQURDQmlRS0JnUUNaTHlWNGdITkRVR0pNWm9PY1lhdXhtTkVzS3JjMFRsTGVCRVZWSUlRTnpHNFdxamltY2VPajVSOUVUd0RlZVNOM3llakFLTEdIZ3g4M2x5eTJ3Qmp2bmJmbS9uTE9ieVd3UUQvMDlDbXBaZHhvRllDSDZyZERqUnB3Wk9aMm5YU1pwZ2taWG9PQmtmTlhOeG5ONzRhWHRobzJkcUJ5blR3M05GVFd5UWw4QlFJREFRQUInLFxcXFxuICAgIH07XFxcXG4gICAgdGhpcy5oZWFkZXJzID0ge1xcXFxuICAgICAgICAnVXNlci1BZ2VudCc6IGBNb3ppbGxhLzUuMCAoTGludXg7IFU7IEFuZHJvaWQgMTE7ICR7dGhpcy5jb25maWcubW9kZWx9IEJ1aWxkL1JQMUEuMjAxMDA1LjAwMSkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xMzYgTW9iaWxlIFNhZmFyaS81MzcuMzYgRWNsb3VkLyR7dGhpcy5jb25maWcudmVyc2lvbn0gQW5kcm9pZC8zMCBjbGllbnRJZC8ke3RoaXMuY29uZmlnLmNsaWVudElkfSBjbGllbnRNb2RlbC8ke3RoaXMuY29uZmlnLm1vZGVsfSBjbGllbnRDaGFubmVsSWQvcXEgcHJvVmVyc2lvbi8xLjAuNmAsXFxcXG4gICAgICAgICdSZWZlcmVyJzogJ2h0dHBzOi8vbS5jbG91ZC4xODkuY24vemh1YW50aS8yMDE2L3NpZ24vaW5kZXguanNwP2FsYnVtQmFja3VwT3BlbmVkPTEnLFxcXFxuICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxcXFxuICAgIH07XFxcXG4gICAgdGhpcy5hcGkgPSAnaHR0cHM6Ly9jbG91ZC4xODkuY24vYXBpJztcXFxcbiAgICB0aGlzLnNoYXJlQ29kZSA9ICcnO1xcXFxuICAgIHRoaXMuYWNjZXNzQ29kZSA9ICcnO1xcXFxuICAgIHRoaXMuc2hhcmVJZCA9ICcnO1xcXFxuICAgIHRoaXMuc2hhcmVNb2RlID0gJyc7XFxcXG4gICAgdGhpcy5pc0ZvbGRlciA9ICcnO1xcXFxufVxcXFxuT2JqZWN0LmFzc2lnbihDbG91ZERyaXZlLnByb3RvdHlwZSwge1xcXFxuICAgIGNoZWNrQ29va2llKCkge1xcXFxuICAgICAgICBpZiAoIXRoaXMuY29va2llICYmIHRoaXMuYWNjb3VudCAmJiB0aGlzLnBhc3N3b3JkKSB7XFxcXG4gICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIHRoaXMubG9naW4odGhpcy5hY2NvdW50LCB0aGlzLnBhc3N3b3JkKSk7XFxcXG4gICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXFxcXFxcXCLmnKrnmbvlvZVcXFxcXFxcIik7XFxcXG4gICAgICAgIH1cXFxcbiAgICB9LFxcXFxuICAgIGdldENvb2tpZSgpIHtcXFxcbiAgICAgICAgcmV0dXJuIGdldEl0ZW0oXFxcXFxcXCJjbG91ZENvb2tpZVxcXFxcXFwiLCBcXFxcXFxcIlxcXFxcXFwiKTtcXFxcbiAgICB9LFxcXFxuICAgIGxvZ2luKHVuYW1lLCBwYXNzd2QpIHtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXNwID0gSlNPTi5wYXJzZShwb3N0KCdodHRwczovL29wZW4uZS4xODkuY24vYXBpL2xvZ2JveC9jb25maWcvZW5jcnlwdENvbmYuZG8/YXBwSWQ9Y2xvdWQnKSk7XFxcXG4gICAgICAgICAgICBsZXQgcHViS2V5ID0gcmVzcC5kYXRhLnB1YktleTtcXFxcbiAgICAgICAgICAgIHJlc3AgPSBKU09OLnBhcnNlKHJlcXVlc3QoJ2h0dHBzOi8vY2xvdWQuMTg5LmNuL2FwaS9wb3J0YWwvbG9naW5VcmwuYWN0aW9uP3JlZGlyZWN0VVJMPWh0dHBzOi8vY2xvdWQuMTg5LmNuL3dlYi9yZWRpcmVjdC5odG1sP3JldHVyblVSTD0vbWFpbi5hY3Rpb24nLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICAgICBjb29raWU6IFxcXFxcXFwiI25vQ29va2llI1xcXFxcXFwiXFxcXG4gICAgICAgICAgICAgICAgfSxcXFxcbiAgICAgICAgICAgICAgICB3aXRoSGVhZGVyczogdHJ1ZVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgLy9sb2cocmVzcClcXFxcbiAgICAgICAgICAgIC8vIOiOt+WPluacgOWQjuivt+axgnVybOS4reeahOWPguaVsHJlcUlk5ZKMbHRcXFxcbiAgICAgICAgICAgIGxldCBSZXFpZCA9IHJlc3AudXJsLm1hdGNoKC9yZXFJZD0oXFxcXFxcXFx3KykvKVsxXTtcXFxcbiAgICAgICAgICAgIGxldCBMdCA9IHJlc3AudXJsLm1hdGNoKC9sdD0oXFxcXFxcXFx3KykvKVsxXTtcXFxcbiAgICAgICAgICAgIGxldCB0SGVhZGVycyA9IHtcXFxcbiAgICAgICAgICAgICAgICBcXFxcXFxcIkNvbnRlbnQtVHlwZVxcXFxcXFwiOiBcXFxcXFxcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgICAgICdVc2VyLUFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQ7IHJ2Ojc0LjApIEdlY2tvLzIwMTAwMTAxIEZpcmVmb3gvNzYuMCcsXFxcXG4gICAgICAgICAgICAgICAgJ1JlZmVyZXInOiAnaHR0cHM6Ly9vcGVuLmUuMTg5LmNuLycsXFxcXG4gICAgICAgICAgICAgICAgTHQsXFxcXG4gICAgICAgICAgICAgICAgUmVxaWQsXFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XFxcXG4gICAgICAgICAgICAgICAgdmVyc2lvbjogJzIuMCcsXFxcXG4gICAgICAgICAgICAgICAgYXBwS2V5OiAnY2xvdWQnXFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgcmVzcCA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9vcGVuLmUuMTg5LmNuL2FwaS9sb2dib3gvb2F1dGgyL2FwcENvbmYuZG8nLCB7XFxcXG4gICAgICAgICAgICAgICAgaGVhZGVyczogdEhlYWRlcnMsXFxcXG4gICAgICAgICAgICAgICAgYm9keTogZGF0YVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgbGV0IHJldHVyblVybCA9IHJlc3AuZGF0YS5yZXR1cm5Vcmw7XFxcXG4gICAgICAgICAgICBsZXQgcGFyYW1JZCA9IHJlc3AuZGF0YS5wYXJhbUlkO1xcXFxuICAgICAgICAgICAgLy9jb25zdCBrZXlEYXRhID0gYC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tXFxcXFxcXFxuJHtwdWJLZXl9XFxcXFxcXFxuLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tYDtcXFxcbiAgICAgICAgICAgIC8vY29uc3QganNlbmNyeXB0ID0gbmV3IEpTRW5jcnlwdCgpO1xcXFxuICAgICAgICAgICAgLy9qc2VuY3J5cHQuc2V0UHVibGljS2V5KGtleURhdGEpO1xcXFxuICAgICAgICAgICAgLy9jb25zdCBlblVuYW1lID0gQnVmZmVyLmZyb20oanNlbmNyeXB0LmVuY3J5cHQodW5hbWUpLCAnYmFzZTY0JykudG9TdHJpbmcoJ2hleCcpO1xcXFxuICAgICAgICAgICAgLy9jb25zdCBlblBhc3N3ZCA9IEJ1ZmZlci5mcm9tKGpzZW5jcnlwdC5lbmNyeXB0KHBhc3N3ZCksICdiYXNlNjQnKS50b1N0cmluZygnaGV4Jyk7XFxcXG4gICAgICAgICAgICBsZXQgZW5VbmFtZSA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUJhc2U2NChyc2FFbmNyeXB0KHVuYW1lLCBwdWJLZXkpLCBfYmFzZTY0Lk5PX1dSQVApLnRvSGV4KCkudG9VcHBlckNhc2UoKTtcXFxcbiAgICAgICAgICAgIGxldCBlblBhc3N3ZCA9IENyeXB0b1V0aWwuRGF0YS5wYXJzZUJhc2U2NChyc2FFbmNyeXB0KHBhc3N3ZCwgcHViS2V5KSwgX2Jhc2U2NC5OT19XUkFQKS50b0hleCgpLnRvVXBwZXJDYXNlKCk7XFxcXG4gICAgICAgICAgICBkYXRhID0ge1xcXFxuICAgICAgICAgICAgICAgIGFwcEtleTogJ2Nsb3VkJyxcXFxcbiAgICAgICAgICAgICAgICB2ZXJzaW9uOiAnMi4wJyxcXFxcbiAgICAgICAgICAgICAgICBhY2NvdW50VHlwZTogJzAxJyxcXFxcbiAgICAgICAgICAgICAgICBtYWlsU3VmZml4OiAnQDE4OS5jbicsXFxcXG4gICAgICAgICAgICAgICAgdmFsaWRhdGVDb2RlOiAnJyxcXFxcbiAgICAgICAgICAgICAgICByZXR1cm5VcmwsXFxcXG4gICAgICAgICAgICAgICAgcGFyYW1JZCxcXFxcbiAgICAgICAgICAgICAgICBjYXB0Y2hhVG9rZW46ICcnLFxcXFxuICAgICAgICAgICAgICAgIGR5bmFtaWNDaGVjazogJ0ZBTFNFJyxcXFxcbiAgICAgICAgICAgICAgICBjbGllbnRUeXBlOiAnMScsXFxcXG4gICAgICAgICAgICAgICAgY2JfU2F2ZU5hbWU6ICcwJyxcXFxcbiAgICAgICAgICAgICAgICBpc09hdXRoMjogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgdXNlck5hbWU6IGB7TlJQfSR7ZW5VbmFtZX1gLFxcXFxuICAgICAgICAgICAgICAgIHBhc3N3b3JkOiBge05SUH0ke2VuUGFzc3dkfWAsXFxcXG4gICAgICAgICAgICB9O1xcXFxuICAgICAgICAgICAgcmVzcCA9IEpTT04ucGFyc2UocG9zdCgnaHR0cHM6Ly9vcGVuLmUuMTg5LmNuL2FwaS9sb2dib3gvb2F1dGgyL2xvZ2luU3VibWl0LmRvJywge1xcXFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHRIZWFkZXJzLFxcXFxuICAgICAgICAgICAgICAgIHdpdGhIZWFkZXJzOiB0cnVlLFxcXFxuICAgICAgICAgICAgICAgIGJvZHk6IGRhdGFcXFxcbiAgICAgICAgICAgIH0pKTtcXFxcbiAgICAgICAgICAgIGxldCByZXMgPSBKU09OLnBhcnNlKHJlc3AuYm9keSk7XFxcXG4gICAgICAgICAgICBpZiAocmVzLnRvVXJsKSB7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBsZXQgY29va2llcyA9IHJlc3AuaGVhZGVyc1snc2V0LWNvb2tpZSddLm1hcChpdCA9PiBpdC5zcGxpdCgnOycpWzBdKS5qb2luKCc7Jyk7XFxcXG4gICAgICAgICAgICAgICAgcmVzID0gSlNPTi5wYXJzZShyZXF1ZXN0KHJlcy50b1VybCwge1xcXFxuICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmhlYWRlcnMsIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZTogY29va2llc1xcXFxuICAgICAgICAgICAgICAgICAgICB9KSxcXFxcbiAgICAgICAgICAgICAgICAgICAgd2l0aEhlYWRlcnM6IHRydWVcXFxcbiAgICAgICAgICAgICAgICB9KSk7XFxcXG5cXFxcbiAgICAgICAgICAgICAgICBjb29raWVzICs9ICc7ICcgKyAocmVzLmhlYWRlcnNbJ3NldC1jb29raWUnXSB8fCBbXSkubWFwKGl0ID0+IGl0LnNwbGl0KCc7JylbMF0pLmpvaW4oJzsnKTtcXFxcbiAgICAgICAgICAgICAgICBzZXRJdGVtKCdjbG91ZENvb2tpZScsIGNvb2tpZXMpO1xcXFxuICAgICAgICAgICAgICAgIGxvZyhjb29raWVzKTtcXFxcbiAgICAgICAgICAgIH0gZWxzZSB7XFxcXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZHVyaW5nIGxvZ2luOicgKyBKU09OLnN0cmluZ2lmeShyZXNwKSk7XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XFxcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgbG9naW46JyArIGVycm9yLnRvU3RyaW5nKCkpO1xcXFxuICAgICAgICB9XFxcXG4gICAgfSxcXFxcbiAgICBnZXRTaGFyZVVybERhdGEodXJsKSB7XFxcXG4gICAgICAgIGxldCBtYXRjaGVzID0gdGhpcy5yZWdleC5leGVjKHVybCk7XFxcXG4gICAgICAgIGxldCBzaGFyZURhdGEwID0ge307XFxcXG4gICAgICAgIGlmIChtYXRjaGVzICYmIG1hdGNoZXNbMV0pIHtcXFxcbiAgICAgICAgICAgIHNoYXJlRGF0YTAuc2hhcmVDb2RlID0gbWF0Y2hlc1sxXTtcXFxcbiAgICAgICAgICAgIGxldCBhY2Nlc3NDb2RlTWF0Y2ggPSB1cmwubWF0Y2goL+iuv+mXruegge+8mihbYS16QS1aMC05XSspLyk7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEwLmFjY2Vzc0NvZGUgPSBhY2Nlc3NDb2RlTWF0Y2ggPyBhY2Nlc3NDb2RlTWF0Y2hbMV0gOiAnJztcXFxcbiAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgIGxldCBtYXRjaGVzXyA9IHVybC5tYXRjaCgvaHR0cHM6XFxcXFxcXFwvXFxcXFxcXFwvY2xvdWRcXFxcXFxcXC4xODlcXFxcXFxcXC5jblxcXFxcXFxcL3RcXFxcXFxcXC8oWzAtOUEtWmEtel0rKS8pO1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhMC5zaGFyZUNvZGUgPSBtYXRjaGVzXyA/IG1hdGNoZXNfWzFdIDogbnVsbDtcXFxcbiAgICAgICAgICAgIGxldCBhY2Nlc3NDb2RlTWF0Y2ggPSB1cmwubWF0Y2goL+iuv+mXruegge+8mihbYS16QS1aMC05XSspLyk7XFxcXG4gICAgICAgICAgICBzaGFyZURhdGEwLmFjY2Vzc0NvZGUgPSBhY2Nlc3NDb2RlTWF0Y2ggPyBhY2Nlc3NDb2RlTWF0Y2hbMV0gOiAnJztcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gc2hhcmVEYXRhMDtcXFxcbiAgICB9LFxcXFxuICAgIGdldFNoYXJlSW5mb0RhdGEoc2hhcmVVcmwsIGNvZGUpIHtcXFxcbiAgICAgICAgbGV0IHNoYXJlRGF0YSA9IHRoaXMuZ2V0U2hhcmVVcmxEYXRhKHNoYXJlVXJsKTtcXFxcbiAgICAgICAgY29kZSAmJiAoc2hhcmVEYXRhLmFjY2Vzc0NvZGUgPSBjb2RlKTtcXFxcbiAgICAgICAgdHJ5IHtcXFxcbiAgICAgICAgICAgIGxldCByZXNwID0gSlNPTi5wYXJzZShyZXF1ZXN0KGAke3RoaXMuYXBpfS9vcGVuL3NoYXJlL2dldFNoYXJlSW5mb0J5Q29kZVYyLmFjdGlvbj9rZXk9bm9DYWNoZSZzaGFyZUNvZGU9JHtzaGFyZURhdGEuc2hhcmVDb2RlfWAsIHtcXFxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB7XFxcXG4gICAgICAgICAgICAgICAgICAgICd1c2VyLWFnZW50JzogJ01vemlsbGEvNS4wIChXaW5kb3dzIE5UIDEwLjA7IFdpbjY0OyB4NjQpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS8xMzEuMC4wLjAgU2FmYXJpLzUzNy4zNicsXFxcXG4gICAgICAgICAgICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXFxcbiAgICAgICAgICAgICAgICAgICAgLy8nYWNjZXB0LWVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUsIGJyLCB6c3RkJyxcXFxcbiAgICAgICAgICAgICAgICAgICAgJ2FjY2VwdC1sYW5ndWFnZSc6ICd6aC1DTix6aDtxPTAuOScsXFxcXG4gICAgICAgICAgICAgICAgfVxcXFxuICAgICAgICAgICAgfSkpO1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhLnJvb3RGaWxlSWQgPSByZXNwLmZpbGVJZDtcXFxcbiAgICAgICAgICAgIHNoYXJlRGF0YS5zaGFyZUlkID0gcmVzcC5zaGFyZUlkO1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhLnNoYXJlTW9kZSA9IHJlc3Auc2hhcmVNb2RlO1xcXFxuICAgICAgICAgICAgc2hhcmVEYXRhLmlzRm9sZGVyID0gcmVzcC5pc0ZvbGRlcjtcXFxcbiAgICAgICAgICAgIHJldHVybiBzaGFyZURhdGE7XFxcXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XFxcXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgZ2V0U2hhcmVJbmZvOicgKyBlcnJvci50b1N0cmluZygpKTtcXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4ge307XFxcXG4gICAgfSxcXFxcbiAgICBnZXRTaGFyZUZpbGVzKGZpbGVJZCwgc2hhcmVEYXRhLCBwYWdlLCBvcmRlckJ5KSB7XFxcXG4gICAgICAgIGxldCByZXNwID0gSlNPTi5wYXJzZShyZXF1ZXN0KGAke3RoaXMuYXBpfS9vcGVuL3NoYXJlL2xpc3RTaGFyZURpci5hY3Rpb24/a2V5PW5vQ2FjaGUmcGFnZU51bT0ke3BhZ2V8fDF9JnBhZ2VTaXplPTYwJmZpbGVJZD0ke2ZpbGVJZH0mc2hhcmVEaXJGaWxlSWQ9JHtmaWxlSWR9JmlzRm9sZGVyPSR7c2hhcmVEYXRhLmlzRm9sZGVyfSZzaGFyZUlkPSR7c2hhcmVEYXRhLnNoYXJlSWR8fFxcXFxcXFwiXFxcXFxcXCJ9JnNoYXJlTW9kZT0ke3NoYXJlRGF0YS5zaGFyZU1vZGV9Jmljb25PcHRpb249NSZvcmRlckJ5PSR7b3JkZXJCeXx8XFxcXFxcXCJsYXN0T3BUaW1lXFxcXFxcXCJ9JmRlc2NlbmRpbmc9dHJ1ZSZhY2Nlc3NDb2RlPSR7c2hhcmVEYXRhLmFjY2Vzc0NvZGV9YCwge1xcXFxuICAgICAgICAgICAgaGVhZGVyczoge1xcXFxuICAgICAgICAgICAgICAgICdhY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04JyxcXFxcbiAgICAgICAgICAgICAgICAndXNlci1hZ2VudCc6ICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTMxLjAuMC4wIFNhZmFyaS81MzcuMzYnLFxcXFxuICAgICAgICAgICAgfVxcXFxuICAgICAgICB9KSk7XFxcXG4gICAgICAgIGxvZyhyZXNwKVxcXFxuICAgICAgICBsZXQgZmlsZXMgPSBbXTtcXFxcbiAgICAgICAgZm9yIChsZXQgaXRlbSBvZiByZXNwLmZpbGVMaXN0QU8uZmlsZUxpc3QpIHtcXFxcbiAgICAgICAgICAgIGZpbGVzLnB1c2goe1xcXFxuICAgICAgICAgICAgICAgIGZpbGVJZDogaXRlbS5pZCxcXFxcbiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXFxcXG4gICAgICAgICAgICAgICAgbGFzdE9wVGltZTogaXRlbS5sYXN0T3BUaW1lLFxcXFxuICAgICAgICAgICAgICAgIGRpcjogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgbWVkaWFUeXBlOiBpdGVtLm1lZGlhVHlwZVxcXFxuICAgICAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICBmb3IgKGxldCBpdGVtIG9mIHJlc3AuZmlsZUxpc3RBTy5mb2xkZXJMaXN0KSB7XFxcXG4gICAgICAgICAgICBmaWxlcy5wdXNoKHtcXFxcbiAgICAgICAgICAgICAgICBpZDogaXRlbS5pZC50b1N0cmluZygpLFxcXFxuICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZS50b1N0cmluZygpLFxcXFxuICAgICAgICAgICAgICAgIGxhc3RPcFRpbWU6IGl0ZW0ubGFzdE9wVGltZS50b1N0cmluZygpLFxcXFxuICAgICAgICAgICAgICAgIGRpcjogdHJ1ZVxcXFxuICAgICAgICAgICAgfSk7XFxcXG5cXFxcbiAgICAgICAgfVxcXFxuICAgICAgICByZXR1cm4gZmlsZXM7XFxcXG4gICAgfVxcXFxufSk7XFxcXG4kLmV4cG9ydHMgPSBuZXcgQ2xvdWREcml2ZSgpO1xcXFxuLy9uZXcgQ2xvdWREcml2ZSgpLmxvZ2luKFxcXFxcXFwiMTgxODExMjU1MzhcXFxcXFxcIiwgXFxcXFxcXCJeQTFCMkMzQGxveWRnaWtcXFxcXFxcIik7XFxcIn0se1xcXCJjb2xfdHlwZVxcXCI6XFxcIm1vdmllXzNcXFwiLFxcXCJuYW1lXFxcIjpcXFwi5aSp57+85YiX6KGoXFxcIixcXFwicGF0aFxcXCI6XFxcImNsb3VkU2hhcmVMaXN0XFxcIixcXFwicnVsZVxcXCI6XFxcImpzOlxcXFxubGV0IHRpdGxlSGVhZCA9IHtcXFxcbiAgICB2aWRlbzogXFxcXFxcXCLwn46sXFxcXFxcXCIsXFxcXG4gICAgYXVkaW86IFxcXFxcXFwi8J+OtVxcXFxcXFwiLFxcXFxuICAgIGRvYzogXFxcXFxcXCLwn5ORXFxcXFxcXCIsXFxcXG4gICAgaW1hZ2U6IFxcXFxcXFwi8J+WvFxcXFxcXFwiLFxcXFxuICAgIGFyY2hpdmU6IFxcXFxcXFwi8J+TplxcXFxcXFwiLFxcXFxuICAgIFxcXFxcXFwiZGVmYXVsdFxcXFxcXFwiOiBcXFxcXFxcIuKdk1xcXFxcXFwiXFxcXG59O1xcXFxuXFxcXG5mdW5jdGlvbiBnZXRIZWFkKHR5cGUsIGV4dCkge1xcXFxuICAgIGxldCBoZWFkID0gdGl0bGVIZWFkW3R5cGVdO1xcXFxuXFxcXG4gICAgcmV0dXJuIGhlYWQgfHwgXFxcXFxcXCLinZNcXFxcXFxcIjtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZm9ybWF0U2l6ZShzaXplKSB7XFxcXG4gICAgaWYgKCFzaXplKSB7XFxcXG4gICAgICAgIHJldHVybiAnJztcXFxcbiAgICB9XFxcXG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInLCAnUEInLCAnRUInLCAnWkInLCAnWUInXTtcXFxcbiAgICBsZXQgaSA9IDA7XFxcXG4gICAgd2hpbGUgKHNpemUgPj0gMTAyNCkge1xcXFxuICAgICAgICBzaXplIC89IDEwMjQ7XFxcXG4gICAgICAgIGkrKztcXFxcbiAgICB9XFxcXG4gICAgc2l6ZSA9IGkgPyBOdW1iZXIoc2l6ZS50b0ZpeGVkKDIpKSA6IHNpemU7XFxcXG4gICAgcmV0dXJuIGAke3NpemV9ICR7dW5pdHNbaV19YDtcXFxcbn1cXFxcblxcXFxuXFxcXG5sZXQgcmVhbHVybCA9IGRlY29kZVVSSUNvbXBvbmVudChnZXRQYXJhbShcXFxcXFxcInJlYWx1cmxcXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIikpO1xcXFxuXFxcXG5cXFxcbmxldCBjbG91ZERyaXZlID0gJC5yZXF1aXJlKFxcXFxcXFwiQ2xvdWREcml2ZVxcXFxcXFwiKTtcXFxcblxcXFxuXFxcXG5sZXQgc2hhcmVEYXRhID0gY2xvdWREcml2ZS5nZXRTaGFyZUluZm9EYXRhKHJlYWx1cmwpO1xcXFxubGV0IGxpc3QgPSBjbG91ZERyaXZlLmdldFNoYXJlRmlsZXMoTVlfUEFSQU1TLmZpbGVJZCB8fCBzaGFyZURhdGEucm9vdEZpbGVJZCwgc2hhcmVEYXRhLCBNWV9QQUdFKTtcXFxcblxcXFxubGV0IGQgPSBbXTtcXFxcbmxpc3QuZm9yRWFjaChpdGVtID0+IHtcXFxcbiAgICAvL+WIpOaWreaYr+WQpuaWh+S7tuWkuVxcXFxuICAgIGlmIChpdGVtLmRpcikge1xcXFxuICAgICAgICBkLnB1c2goe1xcXFxuICAgICAgICAgICAgdGl0bGU6IFxcXFxcXFwi8J+TglxcXFxcXFwiICsgaXRlbS5maWxlX25hbWUsXFxcXG4gICAgICAgICAgICBkZXNjOiAkLmRhdGVGb3JtYXQoaXRlbS51cGRhdGVkX2F0LCAneXl5eS1NTS1kZCcpICsgJyAgJyArIGl0ZW0uaW5jbHVkZV9pdGVtcyArICfpobkgICcsXFxcXG4gICAgICAgICAgICBwaWNfdXJsOiBcXFxcXFxcImh0dHA6Ly8xMjMuNTYuMTA1LjE0NS90dWJpYW8vbWVzc3kvMjcuc3ZnXFxcXFxcXCIsXFxcXG4gICAgICAgICAgICB1cmw6IFxcXFxcXFwiaGlrZXI6Ly9wYWdlL3F1YXJrTGlzdD9wYWdlPWZ5cGFnZVxcXFxcXFwiLFxcXFxuICAgICAgICAgICAgY29sX3R5cGU6IHN0eWxlLFxcXFxuICAgICAgICAgICAgZXh0cmE6IHtcXFxcbiAgICAgICAgICAgICAgICBzaGFyZUlkLFxcXFxuICAgICAgICAgICAgICAgIHNoYXJlUHdkLFxcXFxuICAgICAgICAgICAgICAgIHNoYXJlVG9rZW46IHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSxcXFxcbiAgICAgICAgICAgICAgICBmaWxlSWQ6IGl0ZW0uZmlkLFxcXFxuICAgICAgICAgICAgICAgIGluaGVyaXRUaXRsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgZnJvbURyaXZlXFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH0gZWxzZSB7XFxcXG4gICAgICAgIGQucHVzaCh7XFxcXG4gICAgICAgICAgICB0aXRsZTogZ2V0SGVhZChpdGVtLm9ial9jYXRlZ29yeSkgKyBpdGVtLmZpbGVfbmFtZSxcXFxcbiAgICAgICAgICAgIGRlc2M6ICQuZGF0ZUZvcm1hdChpdGVtLnVwZGF0ZWRfYXQsICd5eXl5LU1NLWRkJykgKyAnICAnICsgZm9ybWF0U2l6ZShpdGVtLnNpemUpLFxcXFxuICAgICAgICAgICAgcGljX3VybDogJChpdGVtLnRodW1ibmFpbCwge1xcXFxuICAgICAgICAgICAgICAgIGNvb2tpZTogbmNvb2tpZVxcXFxuICAgICAgICAgICAgfSkuaW1hZ2UoKSxcXFxcbiAgICAgICAgICAgIHVybDogJCgpLmxhenlSdWxlKChmaWQsIGZpZF90b2tlbiwgcHdkX2lkLCBzdG9rZW4sIGNhdGVnb3J5LCBmcm9tRHJpdmUpID0+IHtcXFxcbiAgICAgICAgICAgICAgICBsZXQgcGxheVVybENhY2hlID0gc3RvcmFnZTAuZ2V0TXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIiwge30pO1xcXFxuICAgICAgICAgICAgICAgIGlmIChwbGF5VXJsQ2FjaGVbZmlkXSkge1xcXFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxheVVybENhY2hlW2ZpZF07XFxcXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcXFxcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICQucmVxdWlyZShcXFxcXFxcInBsYXlcXFxcXFxcIiwgZnJvbURyaXZlKS5nZXRQbGF5VXJsKGZpZCwgZmlkX3Rva2VuLCBwd2RfaWQsIHN0b2tlbiwgY2F0ZWdvcnkpO1xcXFxuICAgICAgICAgICAgICAgICAgICBwbGF5VXJsQ2FjaGVbZmlkXSA9IHVybDtcXFxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZTAucHV0TXlWYXIoXFxcXFxcXCJwbGF5VXJsQ2FjaGVcXFxcXFxcIiwgcGxheVVybENhY2hlKTtcXFxcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybDtcXFxcbiAgICAgICAgICAgICAgICB9XFxcXG4gICAgICAgICAgICB9LCBpdGVtLmZpZCwgaXRlbS5zaGFyZV9maWRfdG9rZW4sIHNoYXJlSWQsIHF1YXJrU2hhcmVBcGkuZ2V0VG9rZW4oKSwgaXRlbS5vYmpfY2F0ZWdvcnksIGZyb21Ecml2ZSksXFxcXG4gICAgICAgICAgICBjb2xfdHlwZTogc3R5bGUsXFxcXG4gICAgICAgICAgICBleHRyYToge1xcXFxuICAgICAgICAgICAgICAgIGlkOiBpdGVtLmZpZCxcXFxcbiAgICAgICAgICAgICAgICAvL2luaGVyaXRUaXRsZTogZmFsc2UsXFxcXG4gICAgICAgICAgICAgICAgY2xzOiAncGxheWxpc3QgJyArIGl0ZW0ub2JqX2NhdGVnb3J5XFxcXG4gICAgICAgICAgICB9XFxcXG4gICAgICAgIH0pXFxcXG4gICAgfVxcXFxuXFxcXG59KTtcXFwifSx7XFxcImNvbF90eXBlXFxcIjpcXFwibW92aWVfM1xcXCIsXFxcIm5hbWVcXFwiOlxcXCJEb3duVG9vbFxcXCIsXFxcInBhdGhcXFwiOlxcXCJEb3duVG9vbFxcXCIsXFxcInJ1bGVcXFwiOlxcXCJqczpcXFxcblxcXFxuZnVuY3Rpb24gZ2V0RG93bkNVUkwodXJsLCBoZWFkZXJzLCBmaWxlbmFtZSkge1xcXFxuICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBjdXJsIGNvbW1hbmQgd2l0aCB0aGUgVVJMXFxcXG4gICAgbGV0IGN1cmxDb21tYW5kID0gYGN1cmwgLW8gXFxcXFxcXCIke2ZpbGVuYW1lfVxcXFxcXFwiIFxcXFxcXFwiJHt1cmx9XFxcXFxcXCJgO1xcXFxuXFxcXG4gICAgLy8gQWRkIGhlYWRlcnMgdG8gdGhlIGN1cmwgY29tbWFuZCBpZiBhbnkgYXJlIHByb3ZpZGVkXFxcXG4gICAgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XFxcXG4gICAgICAgIGN1cmxDb21tYW5kICs9IE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLnJlZHVjZSgoY29tbWFuZCwgW2tleSwgdmFsdWVdKSA9PiB7XFxcXG4gICAgICAgICAgICByZXR1cm4gYCR7Y29tbWFuZH0gLUggXFxcXFxcXCIke2tleX06ICR7dmFsdWV9XFxcXFxcXCJgO1xcXFxuICAgICAgICB9LCAnICcpO1xcXFxuICAgIH1cXFxcblxcXFxuICAgIHJldHVybiBjdXJsQ29tbWFuZDtcXFxcbn1cXFxcblxcXFxuZnVuY3Rpb24gZ2V0RG93bkFyaWEyYyh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lLCBjdXQpIHtcXFxcbiAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgYXJpYTJjIGNvbW1hbmQgd2l0aCB0aGUgVVJMIGFuZCBudW1iZXIgb2YgY29ubmVjdGlvbnMvc2VnbWVudHNcXFxcbiAgICBjdXQgPSBjdXQgfHwgMTtcXFxcbiAgICBjdXQgPSBjdXQgPiAxNiA/IDE2IDogY3V0O1xcXFxuXFxcXG4gICAgbGV0IGFyaWEyQ29tbWFuZCA9IGBhcmlhMmMgLXggJHtjdXR9IC1zICR7Y3V0fSAtbyBcXFxcXFxcIiR7ZmlsZW5hbWV9XFxcXFxcXCIgXFxcXFxcXCIke3VybH1cXFxcXFxcImA7XFxcXG5cXFxcbiAgICAvLyBBZGQgaGVhZGVycyB0byB0aGUgYXJpYTJjIGNvbW1hbmQgaWYgYW55IGFyZSBwcm92aWRlZFxcXFxuICAgIGlmIChoZWFkZXJzICYmIHR5cGVvZiBoZWFkZXJzID09PSAnb2JqZWN0Jykge1xcXFxuICAgICAgICBhcmlhMkNvbW1hbmQgKz0gT2JqZWN0LmVudHJpZXMoaGVhZGVycykucmVkdWNlKChjb21tYW5kLCBba2V5LCB2YWx1ZV0pID0+IHtcXFxcbiAgICAgICAgICAgIHJldHVybiBgJHtjb21tYW5kfSAtLWhlYWRlcj1cXFxcXFxcIiR7a2V5fTogJHt2YWx1ZX1cXFxcXFxcImA7XFxcXG4gICAgICAgIH0sICcgJyk7XFxcXG4gICAgfVxcXFxuXFxcXG4gICAgcmV0dXJuIGFyaWEyQ29tbWFuZDtcXFxcbn1cXFxcbmZ1bmN0aW9uIGdldERlZlJwY1VybCgpe1xcXFxuICAgIGxldCBkZWZpcCA9IGdldElQKCkuc3BsaXQoXFxcXFxcXCIuXFxcXFxcXCIpO1xcXFxuICAgIGRlZmlwLnB1c2goTnVtYmVyKGRlZmlwLnBvcCgpKSArIDIpO1xcXFxuICAgIHJldHVybiBcXFxcXFxcImh0dHA6Ly9cXFxcXFxcIiArIGRlZmlwLmpvaW4oXFxcXFxcXCIuXFxcXFxcXCIpICsgXFxcXFxcXCI6MTY4MDAvanNvbnJwY1xcXFxcXFwiO1xcXFxufVxcXFxuZnVuY3Rpb24gdXBkYXRlUnBjKHVybCwgaGVhZGVycywgZmlsZW5hbWUpIHtcXFxcbiAgICAvL2xvZyhoZWFkZXJzKVxcXFxuICAgIGxldCBoZWFkZXIgPSBbXTtcXFxcbiAgICBsZXQgcnBjRGF0YSA9IHtcXFxcbiAgICAgICAgaWQ6IERhdGUubm93KCksXFxcXG4gICAgICAgIGpzb25ycGM6IFxcXFxcXFwiMi4wXFxcXFxcXCIsXFxcXG4gICAgICAgIG1ldGhvZDogXFxcXFxcXCJhcmlhMi5hZGRVcmlcXFxcXFxcIixcXFxcbiAgICAgICAgcGFyYW1zOiBbXFxcXFxcXCJ0b2tlbjpcXFxcXFxcIiArIGdldEl0ZW0oXFxcXFxcXCJycGNBcmlhVG9rZW5cXFxcXFxcIiwgXFxcXFxcXCJcXFxcXFxcIiksIFt1cmxdLCB7XFxcXG4gICAgICAgICAgICBkaXI6IGdldEl0ZW0oXFxcXFxcXCJycGNEb3duRGlyXFxcXFxcXCIsXFxcXFxcXCJcXFxcXFxcIil8fHZvaWQgMCxcXFxcbiAgICAgICAgICAgIG91dDogZmlsZW5hbWUsXFxcXG4gICAgICAgICAgICBoZWFkZXJcXFxcbiAgICAgICAgfV1cXFxcbiAgICB9O1xcXFxuXFxcXG4gICAgaWYgKGhlYWRlcnMgJiYgdHlwZW9mIGhlYWRlcnMgPT09ICdvYmplY3QnKSB7XFxcXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGhlYWRlcnMpLmZvckVhY2goW2tleSwgdmFsdWVdID0+IHtcXFxcbiAgICAgICAgICAgIGhlYWRlci5wdXNoKGAke2tleX06ICR7dmFsdWV9YCk7XFxcXG4gICAgICAgIH0pO1xcXFxuICAgIH1cXFxcbiAgICBcXFxcbiAgICBsZXQgcmVzID0gcG9zdChnZXRJdGVtKFxcXFxcXFwicnBjVXJsXFxcXFxcXCIsIGdldERlZlJwY1VybCgpKSwge1xcXFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShycGNEYXRhKVxcXFxuICAgIH0pO1xcXFxuICAgIHJldHVybiByZXMuaW5jbHVkZXMoJ1xcXFxcXFwicmVzdWx0XFxcXFxcXCI6Jyk7XFxcXG59XFxcXG5cXFxcbiQuZXhwb3J0cz17XFxcXG4gICAgZ2V0RG93bkNVUkwsXFxcXG4gICAgZ2V0RG93bkFyaWEyYyxcXFxcbiAgICB1cGRhdGVScGMsXFxcXG4gICAgZ2V0RGVmUnBjVXJsXFxcXG59O1xcXFxuXFxcIn1dXCIsXCJwcm94eVwiOlwiXCJ9IiwidGl0bGUiOiLpn7PkuZAifQ==
Add Comment
Please, Sign In to add comment