{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSunDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipSunDialog.vue","mtime":1733309211938},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgeyBtYXBTdGF0ZSB9IGZyb20gInZ1ZXgiOw0KaW1wb3J0IHV0aWxzIGZyb20gIkAvdXRpbHMuanMiOw0KaW1wb3J0IGhvdGVudFVpVXRpbHMgZnJvbSAiQC9ob3RlbnQtdWktdXRpbC5qcyI7DQppbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAiZWxlbWVudC11aSI7DQppbXBvcnQgcmVxIGZyb20gIkAvcmVxdWVzdC5qcyI7DQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICJAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzIjsNCmltcG9ydCBFaXBUYWcgZnJvbSAiQC9jb21wb25lbnRzL2VpcENvbnRyb2wvRWlwVGFnLnZ1ZSI7DQppbXBvcnQgRWlwU2VsZWN0RGlhIGZyb20gIkAvY29tcG9uZW50cy9laXBDb250cm9sL0VpcFNlbGVjdERpYS52dWUiOw0KZXhwb3J0IGRlZmF1bHQgew0KICBjb21wb25lbnRzOiB7IEVpcFRhZywgRWlwU2VsZWN0RGlhIH0sDQogIG5hbWU6ICJlaXAtZGlhbG9nIiwNCiAgcHJvcHM6IFsNCiAgICAidmFsaWRhdGUiLA0KICAgICJ2YWx1ZSIsDQogICAgIm5hbWUiLA0KICAgICJwZXJtaXNzaW9uIiwNCiAgICAiYXR0ZXIiLA0KICAgICJzaW5nbGUiLA0KICAgICJzZWxlY3RvcmNvbmZpZyIsDQogICAgImN1c3RkaWFsb2ciLA0KICAgICJwbGFjZWhvbGRlciIsDQogICAgInRvb2x0aXBwbGFjZW1lbnQiLA0KICAgICdpbml0RmlsbERhdGEnLA0KICAgICdpbml0RmlsbERhdGFUeXBlJywNCiAgICAncmVsYXRpb24nLA0KICAgICdtYXhSb3cnDQogIF0sDQogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLCAvL+a3t+WFpeaWueW8j+W8leWFpeihqOWNlee7hOS7tuS4reWFrOWFseWxnuaAp++8jOWkhOeQhuWtkOihqOOAgeWtmeihqOihjOWGheiBlOWKqO+8iOWIh+mdouS/ruaUuXBlcm1pc3Npb25fc3Vi77yJDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIGRhdGE6IHsNCiAgICAgICAgcXhkZDoge30sDQogICAgICB9LA0KICAgICAgaW5wdXRTdWZmaXhXaWR0aDogMCwNCiAgICAgIHBsYWNlaG9sZGVyQm86ICIiLA0KICAgICAgcXVpY2tTZWFyY2g6ICIiLCAvL+Whq+WGmeaPkOekug0KICAgICAgY29uZGl0aW9uQmluZDogW10sIC8v5Y+C5pWw5p+l6K+i5a2X5q61DQogICAgICBub2RlS2V5OiAiSURfIiwgLy/moJHlvaLmlbDmja7niLZJZA0KICAgICAgY3VzdG9tRGlhbG9nU2hvd0xpc3Q6IGZhbHNlLA0KICAgICAgY3VzdG9tRGlhbG9nU2hvd1RyZWU6IGZhbHNlLA0KICAgICAgc2VsZWN0T3JnUHJvcHM6IHsNCiAgICAgICAgbGFiZWw6ICJuYW1lIiwNCiAgICAgIH0sDQogICAgICBzdHlsZTogIiIsIC8v5a+56K+d5qGG5a696auYDQogICAgICBzZWxlY3RPcmdzOiBudWxsLA0KICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLA0KICAgICAgY29uZmlnOiBudWxsLA0KICAgICAgdXBkYXRpbmc6IGZhbHNlLA0KICAgICAgZGlzcGxheWZpZWxkOiBbXSwgLy/mmL7npLrlrZfmrrUNCiAgICAgIGN1c3RvbURpYWxvZzoge30sDQogICAgICBxdWVyeVBhcmFtOiAiIiwgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwNCiAgICAgIHByb3BzMTogW10sDQogICAgICBzaG93RGF0YTogW10sDQogICAgICBjaGVja0JveERhdGFBbGw6IFtdLCAvL+mAieS4reWvueixoeeahOmbhuWQiA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIGNoaWxkcmVuOiAiY2hpbGRyZW4iLA0KICAgICAgICBsYWJlbDogImxhYmVsIiwNCiAgICAgIH0sDQogICAgICBwcm9wc0RhdGE6IFtdLA0KICAgICAgcXVlcnlzU2hvdzogZmFsc2UsIC8v5piv5ZCm5pi+56S65pCc57Si5qGGDQogICAgICB1bmRlZmluZWRhOiAiIiwNCiAgICAgIGlzQ3VycmVudENoYW5nZTogZmFsc2UsIC8v5piv5ZCm5LiN5omn6KGMIG9yZ1RhYmxlU2VsZWN0aW9u5pa55rOVDQogICAgICBwYWdpbmF0aW9uOiB7DQogICAgICAgIHBhZ2U6IDEsDQogICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgdG90YWw6IDAsDQogICAgICB9LA0KICAgICAgcGFyYW06IFtdLCAvL+e7keWumueahOihqOWNleWtl+autQ0KICAgICAgdHJlZUxpc3Q6IFtdLA0KICAgICAgZGlzcGxheUZpZWxkOiB7fSwNCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwNCiAgICAgIHBsYWNlaG9sZGVyczogW10sDQogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6IFtdLA0KICAgICAgY29tYmlUcmVlRGlzcGxheUZpZWxkOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uVHJlZVF1ZXJ5czogW10sDQogICAgICBjb21iaW5hdGlvblJ1bGU6IHt9LA0KICAgICAgdG9nZ2xlQnRuOiAiZWwtaWNvbi1hcnJvdy1sZWZ0IiwNCiAgICAgIHRyZWVTaG93OiB0cnVlLA0KICAgICAgdHJhbnN0aW9uV2lkdGg6ICIyNSUiLA0KICAgICAgbGVmdFRyZWVUaXRsZTogIiIsDQogICAgICB3cml0ZWFibGU6IHRydWUsDQogICAgICBpc1Nob3c6IHRydWUsDQogICAgfTsNCiAgfSwNCiAgd2F0Y2g6IHsNCiAgICBwcm9wczE6IGZ1bmN0aW9uIChuZXdWYWwsIG9sZFZhbCkgew0KICAgICAgLy/moJHlvaINCiAgICAgIGlmICh0aGlzLnNob3dEYXRhICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgY29uc3QgdGhpc18gPSB0aGlzOw0KICAgICAgICBsZXQgZGF0YSA9IFtdOw0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2hvd0RhdGEubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBkYXRhLnB1c2godGhpcy5zaG93RGF0YVtpXSk7DQogICAgICAgIH0NCiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQoZGF0YVtpXSwgdHJ1ZSk7DQogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtpXSwgdGhpc18pOw0KICAgICAgICAgIH0NCiAgICAgICAgfSwgMjAwKTsNCiAgICAgIH0NCiAgICB9LA0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIGlmICh0aGlzLmluaXRGaWxsRGF0YSkgew0KICAgICAgdGhpcy5pbml0VGVtcGxhdGVEYXRhKCkNCiAgICB9DQogICAgbGV0IHJlcXVlc3RUeXBlID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoJz8nKVswXS5zcGxpdCgnLycpDQogICAgbGV0IGlzRG9uZUxpc3QgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zcGxpdCgnLycpDQogICAgaWYgKA0KICAgICAgcmVxdWVzdFR5cGVbcmVxdWVzdFR5cGUubGVuZ3RoIC0gMV0gPT0gJ2dldCcgfHwNCiAgICAgIHJlcXVlc3RUeXBlW3JlcXVlc3RUeXBlLmxlbmd0aCAtIDJdID09ICdnZXQnIHx8DQogICAgICBpc0RvbmVMaXN0W2lzRG9uZUxpc3QubGVuZ3RoIC0gMV0gPT0gJ2RvbmVMaXN0Jw0KICAgICkgew0KICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZQ0KICAgIH0NCiAgfSwNCiAgY29tcHV0ZWQ6IG1hcFN0YXRlKHsNCiAgICB0b3RhbDogKHN0YXRlKSA9PiBzdGF0ZS5kaWFsb2cudG90YWwsDQogICAgZGlhbG9nRGF0YTogKHN0YXRlKSA9PiB7DQogICAgICByZXR1cm4gc3RhdGUuZGlhbG9nLnJvd3M7DQogICAgfSwNCiAgICBpbnB1dFZhbDogZnVuY3Rpb24gKCkgew0KICAgICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUgPT0gInx8W10iKSB7DQogICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gW107DQogICAgICAgIC8vIHRoaXMuc2hvd0RhdGEgPSBbXTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBsZXQgbmFtZUFyeSA9IHRoaXMudmFsdWUuc3BsaXQoIiwiKTsNCiAgICAgICAgaWYgKHRoaXMudmFsdWUuaW5kZXhPZigifHwiKSA+IDApIHsNCiAgICAgICAgICBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgifHwiKVswXS5zcGxpdCgiLCIpOw0KICAgICAgICAgIC8vIHRoaXMuc2hvd0RhdGE9SlNPTi5wYXJzZSh0aGlzLnZhbHVlLnNwbGl0KCJ8fCIpWzFdKTsNCiAgICAgICAgfQ0KICAgICAgICAvLyAgdGhpcy5zaG93RGF0YSA9dGhpcy5zZWxlY3RPcmdzOw0KICAgICAgICBsZXQgaWRBcnkgPSBudWxsOw0KICAgICAgICBsZXQgYWNjb3VudEFyeSA9IG51bGw7DQogICAgICAgIGxldCByZXN1bHQgPSBbXTsNCiAgICAgICAgbmFtZUFyeS5mb3JFYWNoKChtLCBpKSA9PiB7DQogICAgICAgICAgbGV0IG4gPSB7IHZhbHVlOiBtIH07DQogICAgICAgICAgcmVzdWx0LnB1c2gobik7DQogICAgICAgIH0pOw0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgfQ0KICAgIH0sDQogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uICgpIHsNCiAgICAgIHJldHVybiB0aGlzLndyaXRlYWJsZQ0KICAgICAgICA/IHV0aWxzLmdldFdyaXRlYWJsZSh0aGlzLnBlcm1pc3Npb25fc3ViKQ0KICAgICAgICA6IHRoaXMud3JpdGVhYmxlOw0KICAgIH0sDQogICAgaW5wdXRWYWxpZGF0ZTogZnVuY3Rpb24gKCkgew0KICAgICAgdmFyIHZhbGlkYXRlT2JqID0gdGhpcy4kc3RvcmUuc3RhdGUuaW5kZXgudmFsaWRhdGU7DQogICAgICByZXR1cm4gdXRpbHMuYWRkUmVxdWlyZWRPck5vdCgNCiAgICAgICAgdGhpcy5wZXJtaXNzaW9uX3N1YiwNCiAgICAgICAgdGhpcy52YWxpZGF0ZSwNCiAgICAgICAgdmFsaWRhdGVPYmosDQogICAgICAgIHRoaXMNCiAgICAgICk7DQogICAgfSwNCiAgICBpbnB1dE5hbWU6IGZ1bmN0aW9uICgpIHsNCiAgICAgIGxldCBsYWJlbGRlc2MgPSAiIjsNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy4kc2xvdHMgJiYNCiAgICAgICAgdGhpcy4kc2xvdHMubGFiZWxkZXNjICYmDQogICAgICAgIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlbiAmJg0KICAgICAgICB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dA0KICAgICAgKSB7DQogICAgICAgIGxhYmVsZGVzYyA9IHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlblswXS50ZXh0Ow0KICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpICsgIi0iICsgbGFiZWxkZXNjOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcmV0dXJuIHRoaXMubmFtZSA/IHRoaXMubmFtZSA6IHV0aWxzLmdldE5hbWUoKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOaYr+WQpuacieWbnuWhq+iuvue9rg0KICAgIGJpbmRTZXQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yY29uZmlnID8gdGhpcy5zZWxlY3RvcmNvbmZpZy5iaW5kIDogbnVsbDsNCiAgICB9LA0KICB9KSwNCiAgY3JlYXRlZCgpIHsNCiAgICBpZiAoIXRoaXMucGxhY2Vob2xkZXIpIHsNCiAgICAgIHRoaXMucGxhY2Vob2xkZXJCbyA9ICLor7fpgInmi6nlhoXlrrkiOw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSB0aGlzLnBsYWNlaG9sZGVyOw0KICAgIH0NCiAgICB0aGlzLiR2YWxpZGF0b3IgPSB0aGlzLiRyb290LiR2YWxpZGF0b3I7DQogIH0sDQogIG1ldGhvZHM6IHsNCiAgICBzZWxlY3RBbGwoc2VsZWN0aW9uKSB7DQogICAgICBpZiAodGhpcy5vbGRzZWxlY3RPcmdzICE9IG51bGwgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBzZWxlY3Rpb24ubGVuZ3RoOyB4KyspIHsNCiAgICAgICAgICBpZiAodGhpcy5pbmRleEFycmF5KHRoaXMub2xkc2VsZWN0T3Jncywgc2VsZWN0aW9uW3hdKSA9PT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXMub2xkc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvblt4XSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHRoaXMub2xkc2VsZWN0T3Jncyk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcChzZWxlY3Rpb24pOw0KICAgICAgfQ0KICAgIH0sDQogICAgY2hlY2tOb2RlKGRhdGEsIHRoaXNfLCBwbm9kZSkgew0KICAgICAgaWYgKGRhdGEuUGlkKSB7DQogICAgICAgIGxldCBub2RlID0gdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKGRhdGEuUGlkKTsNCiAgICAgICAgbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZTsNCiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsNCiAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuaW5kZXRlcm1pbmF0ZSA9IHRydWU7DQogICAgICAgICAgdGhpcy5jaGVja05vZGUoDQogICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuZGF0YSwNCiAgICAgICAgICAgIHRoaXNfLA0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5nZXROb2RlKG5vZGUuZGF0YS5QaWQpDQogICAgICAgICAgKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIW5vZGUuaW5kZXRlcm1pbmF0ZSkgew0KICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7DQogICAgICAgIH0NCiAgICAgIH0gZWxzZSBpZiAocG5vZGUgJiYgIXBub2RlLmluZGV0ZXJtaW5hdGUpIHsNCiAgICAgICAgcG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWU7DQogICAgICB9DQogICAgfSwNCiAgICAvL+Wbnui9puafpeivog0KICAgIHNlYXJjaEVudGVyRnVuOiBmdW5jdGlvbiAoZSkgew0KICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoOw0KICAgICAgaWYgKGtleUNvZGUgPT0gMTMpIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGhhbmRsZVNpemVDaGFuZ2U6IGZ1bmN0aW9uIChzaXplKSB7DQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7DQogICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrg0KICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZTsNCiAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgfSwNCiAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbiAoY3VycmVudFBhZ2UpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIGlmICh0aGlzLnNlbGVjdE9yZ3MgIT0gdW5kZWZpbmVkICYmIHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPiAwKSB7DQogICAgICAgIHRoaXMuc2VsZWN0T3Jncy5mb3JFYWNoKChyb3cpID0+IHsNCiAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5jaGVja0JveERhdGFBbGwsIHJvdyk7DQogICAgICAgICAgaWYgKHJlcyA9PSAtMSkgew0KICAgICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOw0KICAgICAgLy/ngrnlh7vnrKzlh6DpobUNCiAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gY3VycmVudFBhZ2U7DQogICAgICB0aGlzLnNlYXJjaCgpOw0KICAgIH0sDQogICAgY2hlY2tMaXN0KCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzOw0KICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgIC8v5YiX6KGoDQogICAgICAgIGlmICgNCiAgICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwgIT0gdW5kZWZpbmVkICYmDQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmxlbmd0aCA+IDANCiAgICAgICAgKSB7DQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLmZvckVhY2goKHJvdykgPT4gew0KICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXNfLmluZGV4QXJyYXkodGhpc18uZGlhbG9nRGF0YSwgcm93KTsNCiAgICAgICAgICAgIHRoaXNfLnVuZGVmaW5lZGEgPSByZXM7DQogICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7DQogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWU7DQogICAgICAgICAgICAgIHRoaXNfLnRvZ2dsZVJvd1NlbGVjdGlvbihyZXMsIHRydWUpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9LCAzMDApOw0KICAgIH0sDQogICAgdG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdmFsKSB7DQogICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbih0aGlzLmRpYWxvZ0RhdGFbcmVzXSwgdmFsKTsNCiAgICB9LA0KICAgIHNob3dEaWFsb2coaXRlbSkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzOw0KICAgICAgLy/nrKzkuozmrKHngrnlh7vlrZDooajlm57loavlr7nor53moYYg56ys5LiA5qyh6YCJ5Lit55qE5pWw5o2u5LiN5piv6YCJ5Lit54q25oCBDQogICAgICBpZih0aGlzXy5zZWxlY3RPcmdzKXsNCiAgICAgICAgdGhpc18uc2VsZWN0T3Jncy5lbXB0eSgpOw0KICAgICAgICB0aGlzXy5jaGVja0JveERhdGFBbGwuZW1wdHkoKTsNCiAgICAgIH0NCiAgICAgIHZhciBhbGlhcyA9IHRoaXMuY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmFsaWFzOw0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vZ2V0QnlBbGlhcyIsIGFsaWFzKS50aGVuKChjdXN0b21EaWFsb2cpID0+IHsNCiAgICAgICAgaWYgKCFjdXN0b21EaWFsb2cgfHwgIWN1c3RvbURpYWxvZy5hbGlhcykgew0KICAgICAgICAgIE1lc3NhZ2UuZXJyb3IoIuWvueivneahhuWIq+WQjeOAkCIgKyBhbGlhcyArICLjgJHkuI3lrZjlnKjvvIEiKTsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7DQogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsNCiAgICAgICAgICB0aGlzXy5ub2RlS2V5ID0gZGlzcGxheWxpc3QuaWQ7DQogICAgICAgIH0NCiAgICAgICAgLy/lr7nor53moYbmjInooajljZXlrZfmrrXmn6Xor6LvvIjlj4LmlbDkvKDlhaXnmoTvvIkNCiAgICAgICAgbGV0IGJpbmRMaXN0ID0gdGhpc18uY3VzdGRpYWxvZy5jdXN0RGlhbG9nLmNvbmRpdGlvbnM7DQogICAgICAgIHRoaXNfLnBhcmFtID0gW107IC8v57uR5a6a55qE6KGo5Y2V5a2X5q61DQogICAgICAgIGlmIChiaW5kTGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgYmluZExpc3QuZm9yRWFjaCgoZWxlKSA9PiB7DQogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAiMyIgJiYgZWxlLmJpbmQpIHsNCiAgICAgICAgICAgICAgbGV0IG9iaiA9IHt9Ow0KICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQ7DQogICAgICAgICAgICAgIG9iai5iaW5kID0gZWxlLmJpbmQ7DQogICAgICAgICAgICAgIHRoaXNfLnBhcmFtLnB1c2gob2JqKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICAvL+WIpOaWreWvueivneahhuafpeivouaYr+WQpuacieadoeS7tg0KICAgICAgICBsZXQgdXNlcklucHV0TGlzdCA9IEpTT04ucGFyc2UoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKTsNCiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAiIjsgLy/loavlhpnmj5DnpLogcGxhY2Vob2xkZXINCiAgICAgICAgdGhpc18uY29uZGl0aW9uQmluZCA9IFtdOw0KICAgICAgICBsZXQgcXVlcnlQYXJhbXMgPSBbXTsNCiAgICAgICAgbGV0IHBsYWNlaG9sZGVycyA9IFtdOw0KICAgICAgICBpZiAodXNlcklucHV0TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdXNlcklucHV0TGlzdC5mb3JFYWNoKChlbGUpID0+IHsNCiAgICAgICAgICAgIHZhciBvYmogPSB7fTsNCiAgICAgICAgICAgIC8v5p2h5Lu25p+l6K+i5Y+C5pWw77yI55So5oi36L6T5YWl55qE77yJIOaWh+acrOahhui+k+WFpQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAiMSIpIHsNCiAgICAgICAgICAgICAgb2JqW2VsZS5maWVsZF0gPSAiIjsNCiAgICAgICAgICAgICAgcXVlcnlQYXJhbXMucHVzaChvYmopOw0KICAgICAgICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kLnB1c2goZWxlKTsNCiAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goIuivt+i+k+WFpSIgKyBlbGUuY29tbWVudCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSk7DQogICAgICAgICAgdGhpcy4kc2V0KHRoaXMsICJxdWVyeVBhcmFtcyIsIHF1ZXJ5UGFyYW1zKTsNCiAgICAgICAgICB0aGlzLiRzZXQodGhpcywgInBsYWNlaG9sZGVycyIsIHBsYWNlaG9sZGVycyk7DQogICAgICAgIH0NCiAgICAgICAgLy/liKTmlq3mmK/lkKbmmL7npLrmnaHku7bmn6Xor6LovpPlhaXmoYYNCiAgICAgICAgaWYgKHRoaXNfLnF1aWNrU2VhcmNoICE9ICIiKSB7DQogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWU7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IGZhbHNlOw0KICAgICAgICB9DQogICAgICAgIHRoaXNfLnF1aWNrU2VhcmNoID0gIuivt+i+k+WFpSIgKyB0aGlzLnF1aWNrU2VhcmNoICsgIuafpeivoiI7DQogICAgICAgIHRoaXNfLnN0eWxlID0gImhlaWdodDoiICsgY3VzdG9tRGlhbG9nLmhlaWdodCArICJweCI7DQogICAgICAgIGlmICh3aW5kb3cuc2NyZWVuLmhlaWdodCAmJiB3aW5kb3cuc2NyZWVuLmhlaWdodCA8PSA5MDApIHsNCiAgICAgICAgICB0aGlzLnN0eWxlID0gImhlaWdodDo0NDBweCI7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAwIHx8IGN1c3RvbURpYWxvZy5zdHlsZSA9PSAyKSB7DQogICAgICAgICAgLy/liJfooagNCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93KHsgYWxpYXM6IGFsaWFzLCBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZyB9KTsNCiAgICAgICAgfSBlbHNlIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIC8v5qCR5b2iDQogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nVHJlZVNob3coew0KICAgICAgICAgICAgYWxpYXM6IGFsaWFzLA0KICAgICAgICAgICAgY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2csDQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy/liKTmlq3mlbDmja7mmK/lkKbljIXlkKvmn5DkuKrlr7nosaHvvIzlubbov5Tlm57mlbDmja7ljIXlkKvlr7nosaHnmoTkuIvmoIcNCiAgICBpbmRleEFycmF5KGFycmF5LCBpdGVtKSB7DQogICAgICBpZiAoYXJyYXkubGVuZ3RoID09IDApIHsNCiAgICAgICAgcmV0dXJuIC0xOw0KICAgICAgfQ0KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgew0KICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoYXJyYXlbaV0pID09IEpTT04uc3RyaW5naWZ5KGl0ZW0pKSB7DQogICAgICAgICAgcmV0dXJuIGk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiAtMTsNCiAgICB9LA0KICAgIC8v54K55Ye75YiX6KGo5p+Q5LiA5Liq5aSN6YCJ5qGG5pe26Kem5Y+RDQogICAgb25UYWJsZVNlbGVjdChyb3dzLCByb3cpIHsNCiAgICAgIHRoaXMuaXNDdXJyZW50Q2hhbmdlID0gZmFsc2U7DQogICAgICAvL+WIpOaWreeCueWHu+WIl+ihqOaVsOaNruaXtuWkjemAieahhuaYr+WQpuWLvumAiSAgc2VsZWN0ZWTvvJp0cnVl5LiN5Yu+6YCJ77yMZmFsc2Xli77pgIkNCiAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgIHRoaXMuc2VsZWN0T3JncyAmJg0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCAmJg0KICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsNCiAgICAgIGlmIChzZWxlY3RlZCkgew0KICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7DQogICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOw0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSk7DQogICAgICB9DQogICAgfSwNCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOadoeaVsOaNruaXtuinpuWPkQ0KICAgIG9yZ1Jvd0NsaWNrKHJvdywgY29sdW1uLCBldmVudCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoDQogICAgICAgICAgImNsaWNrIg0KICAgICAgICApOw0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBbXTsNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KTsNCiAgICAgIH0gZWxzZSBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEpIHsNCiAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZTsNCiAgICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICAgIGxldCBzZWxlY3RlZCA9DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzICYmDQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYNCiAgICAgICAgICB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpICE9PSAtMTsNCiAgICAgICAgaWYgKHNlbGVjdGVkKSB7DQogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlOw0KICAgICAgICAgIGxldCByZXMgPSB0aGlzLmluZGV4QXJyYXkodGhpcy5zZWxlY3RPcmdzLCByb3cpOw0KICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5zcGxpY2UocmVzLCAxKTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpOw0KICAgICAgfQ0KICAgIH0sDQogICAgLy/liJfooajlpI3pgInmoYbmnInmlLnlj5jml7bop6blj5ENCiAgICBvcmdUYWJsZVNlbGVjdGlvbihzZWxlY3Rpb24pIHsNCiAgICAgIC8v5YWo6YCJ55qE5oOF5Ya154m55q6K5aSE55CGKOS4uuS6huS4juWOn+acrOWKn+iDvemAu+i+keS4jeWGsueqgSzlhYjlpI3liLbkuIDku73ml6fnmoTpgInkuK3mlbDmja4u54S25ZCO5ou/5Yiw5YWo6YCJ5LqL5Lu25Lit5Y676K6h566XKQ0KICAgICAgdGhpcy5vbGRzZWxlY3RPcmdzID0gXy5jbG9uZURlZXAodGhpcy5zZWxlY3RPcmdzKTsNCiAgICAgIC8v5aSa6YCJDQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtICE9IDEgJiYgIXRoaXMuaXNDdXJyZW50Q2hhbmdlKSB7DQogICAgICAgIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBpZiAoDQogICAgICAgICAgICBzZWxlY3Rpb24ubGVuZ3RoID09IDEgJiYNCiAgICAgICAgICAgICghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkNCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IHNlbGVjdGlvbjsNCiAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgKCF0aGlzLnNlbGVjdE9yZ3MgfHwgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA9PSAwKSAmJg0KICAgICAgICAgICAgc2VsZWN0aW9uLmxlbmd0aCA+IDENCiAgICAgICAgICApIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0N1cnJlbnRDaGFuZ2UgJiYgc2VsZWN0aW9uLmxlbmd0aCA+PSAxMCkgew0KICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdE9yZ3MpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW107DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmb3IgKGxldCB1ID0gdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCAtIDE7IHUgPj0gMDsgdS0tKSB7DQogICAgICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSk7DQogICAgICAgICAgICAgICAgaWYgKHJlcyAhPSAtMSkgew0KICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2goc2VsZWN0aW9uW2ldKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGRpYWxvZ0NvbmZpcm0oKSB7DQogICAgICBpZighdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGg9PTApew0KICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCLor7fpgInmi6nmlbDmja7lm57loasiKTsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gIiI7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2U7DQogICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsNCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKTsNCiAgICB9LA0KICAgIC8v6YeN572uDQogICAgcmVzZXQoKSB7DQogICAgICB0aGlzLnF1ZXJ5UGFyYW1zLmZvckVhY2goKHBhcmFtT2JqKSA9PiB7DQogICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbU9iaikgew0KICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXNba2V5XSA9ICIiOw0KICAgICAgICB9DQogICAgICB9KTsNCiAgICAgIC8v57uE5ZCI5qCR6YeN572uDQogICAgICBpZih0aGlzLiRyZWZzLmNvbWJpbmF0aW9uVHJlZSl7DQogICAgICAgIGxldCBub2RlcyA9IHRoaXMuJHJlZnMuY29tYmluYXRpb25UcmVlLnN0b3JlLm5vZGVzTWFwOw0KICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9kZXMpIHsNCiAgICAgICAgICBub2Rlc1trZXldLmV4cGFuZGVkID0gZmFsc2U7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnNwbGljZSgwKTsNCiAgICAgIHRoaXMuc2VhcmNoKHRydWUpOw0KICAgIH0sDQogICAgLy/mn6Xor6INCiAgICBzZWFyY2gocmVzZXRQYWdpbnRpb24pIHsNCiAgICAgIGxldCBxdWVyeXMgPSBbXTsgLy/mn6Xor6LmnaHku7YNCiAgICAgIGxldCBxdWVyeUZpbHRlciA9IHt9Ow0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gInt9Iikgew0KICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7IHBhZ2U6IDEsIHBhZ2VTaXplOiAyMCwgc2hvd1RvdGFsOiAidHJ1ZSIgfTsNCiAgICAgIH0NCiAgICAgIGxldCBwYWdlQmVhbiA9IHsgcGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiB9Ow0KICAgICAgaWYgKHJlc2V0UGFnaW50aW9uKSB7DQogICAgICAgIHBhZ2VCZWFuLnBhZ2VCZWFuID0geyBwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogInRydWUiIH07DQogICAgICB9DQogICAgICAvL+eUqOaIt+i+k+WFpeeahA0KICAgICAgaWYgKHRoaXMucXVlcnlQYXJhbXMubGVuZ3RoICE9IDAgJiYgdGhpcy5xdWVyeVBhcmFtc1swXSAhPSAiIikgew0KICAgICAgICB0aGlzLmNvbmRpdGlvbkJpbmQuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHsNCiAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwNCiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5UGFyYW1zW2l0ZW0uZmllbGRdLA0KICAgICAgICAgICAgZ3JvdXA6ICJtYWluIiwNCiAgICAgICAgICAgIG9wZXJhdGlvbjogIkxJS0UiLA0KICAgICAgICAgICAgcmVsYXRpb246ICJBTkQiLA0KICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICAgIC8v5Y+C5pWw5Lyg5YWl55qE5p+l6K+i5ou85o6lDQogICAgICBpZiAodGhpcy5wYXJhbSkgew0KICAgICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgICAgdGhpcy5wYXJhbS5mb3JFYWNoKChpdGVtKSA9PiB7DQogICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGQsDQogICAgICAgICAgICB2YWx1ZTogdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIGl0ZW0uYmluZCksDQogICAgICAgICAgICBncm91cDogIm1haW4iLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAiTElLRSIsDQogICAgICAgICAgICByZWxhdGlvbjogIkFORCIsDQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgLy/mnaXoh6rnu4TlkIjlr7nor53moYbnmoQNCiAgICAgIGlmICgNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDANCiAgICAgICkgew0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGlmIChxdWVyeXMubGVuZ3RoID4gMCkgew0KICAgICAgICBxdWVyeUZpbHRlciA9IHsgcGFnZUJlYW46IHBhZ2VCZWFuLnBhZ2VCZWFuLCBxdWVyeXMgfTsNCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBxdWVyeUZpbHRlcjsNCiAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAuZGlzcGF0Y2goImRpYWxvZy9nZXRsaXN0SnNvbiIsIHRoaXMuY3VzdG9tRGlhbG9nKQ0KICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCk7DQogICAgICAgICAgfSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHBhZ2VCZWFuOw0KICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgIC5kaXNwYXRjaCgiZGlhbG9nL2dldGxpc3RKc29uIiwgdGhpcy5jdXN0b21EaWFsb2cpDQogICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgdGhpcy5jaGVja0xpc3QoKTsNCiAgICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGFzeW5jIGRvUXVlcnkocGFyYW0pIHsNCiAgICAgIGxldCBwYXJhbUxvYWREYXRhID0gW107DQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i57uR5a6a55qE6KGo5Y2V5Y+C5pWwDQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtLmNvbmRpdGlvbmZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGlmIChwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGggIT0gIiIpIHsNCiAgICAgICAgICBsZXQgYmluZFZhbCA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICBwYXJhbS5jb25kaXRpb25maWVsZFtpXS5maWVsZFBhdGgsDQogICAgICAgICAgICBudWxsDQogICAgICAgICAgKTsNCiAgICAgICAgICBsZXQgb2JqID0geyBrZXk6IHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkLCB2YWx1ZTogYmluZFZhbCB9Ow0KICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGxldCBxdWVyeVVybCA9DQogICAgICAgIHBhcmFtLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSINCiAgICAgICAgICA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0iICsNCiAgICAgICAgICAgIHBhcmFtLmFsaWFzICsNCiAgICAgICAgICAgICImcGFnZT0xIg0KICAgICAgICAgIDogcGFyYW0udXJsOw0KICAgICAgbGV0IHJlcXVlc3RNZXRob2QgPSAiUE9TVCI7DQogICAgICAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8NCiAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZTsNCiAgICAgIH0NCiAgICAgIC8v5p+l6K+i5pWw5o2uDQogICAgICByZXENCiAgICAgICAgLnJlcXVlc3QoeyB1cmw6IHF1ZXJ5VXJsLCBtZXRob2Q6IHJlcXVlc3RNZXRob2QsIGRhdGE6IHBhcmFtTG9hZERhdGEgfSkNCiAgICAgICAgLnRoZW4oKHJlcykgPT4gew0KICAgICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueDQogICAgICAgICAgaWYgKHJlcy5kYXRhLnJvd3MubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lov5Tlm57nmoTooajljZXlj4LmlbANCiAgICAgICAgICAgIGZvciAobGV0IGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsNCiAgICAgICAgICAgICAgaWYgKHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGggIT0gIiIpIHsNCiAgICAgICAgICAgICAgICBsZXQgdmFsID0gIiI7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZXMuZGF0YS5yb3dzLmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICAgIHZhbCA9DQogICAgICAgICAgICAgICAgICAgICAgdmFsICsgcmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdICsgIiwiOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB2YWwgPSB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKTsNCiAgICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGguc3BsaXQoIi4iKTsNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9dLmZpZWxkUGF0aCwNCiAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICBudWxsDQogICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXTsNCiAgICAgICAgICAgICAgICAgIGlmIChzdWJEYXRhLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICAgIGxldCBzdWJUYWJOYW1lID0gcGF0aEFyclsyXS5yZXBsYWNlKCJzdWJfIiwgIiIpOw0KICAgICAgICAgICAgICAgICAgICAvL+W+l+WIsOWtkOihqOeahOaJgOacieWtl+autQ0KICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSW5pdERhdGEgPQ0KICAgICAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge307DQogICAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyDQogICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSBKU09OLnN0cmluZ2lmeShzdWJJbml0RGF0YSkucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgICAgICAvbnVsbC9nLA0KICAgICAgICAgICAgICAgICAgICAgICciIicNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBKU09OLnBhcnNlKHN0cik7DQogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzdWJEYXRhKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZnooajmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoInN1Yl8iKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSBbXTsgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgLy/ngrnmt7vliqDml7bliKTmlq3opoHmlrDlop7lrZDooajorrDlvZXkuK3nmoTlrZfmrrXmmK/lkKbmnInlgLwNCiAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtrZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhW2tleV0gPSAiIjsgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4NCiAgICAgICAgICAgICAgICAgICAgcEluc3QuZGF0YVtwYXRoQXJyWzFdXVtwYXRoQXJyWzJdXS5wdXNoKHN1YkRhdGEpOw0KICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgICBwSW5zdCwNCiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgIHZhbCwNCiAgICAgICAgICAgICAgICAgICAgICAwDQogICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAvL+WtkOihqOacieaVsOaNrueahOaDheWGtQ0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgICAvL+WvueivneahhuWFs+iBlOafpeivoui/lOWbnueahOWAvOi1i+WAvOe7mee7keWumueahOWtl+autQ0KICAgICAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgdmFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgcA0KICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboNCiAgICAgICAgICAgIC8v6I635Y+W5YWz6IGU5p+l6K+i6L+U5Zue55qE6KGo5Y2V5Y+C5pWwDQogICAgICAgICAgICBmb3IgKGxldCBpb3AgPSAwOyBpb3AgPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvcCsrKSB7DQogICAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAiIikgew0KICAgICAgICAgICAgICAgIGxldCBwYXRoQXJyID0gcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGguc3BsaXQoIi4iKTsNCiAgICAgICAgICAgICAgICBpZiAocGF0aEFyci5sZW5ndGggPT0gMykgew0KICAgICAgICAgICAgICAgICAgLy/kuLvooagNCiAgICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aCgNCiAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLA0KICAgICAgICAgICAgICAgICAgICAiIiwNCiAgICAgICAgICAgICAgICAgICAgbnVsbA0KICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhdGhBcnIubGVuZ3RoID09IDQpIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGoDQogICAgICAgICAgICAgICAgICBsZXQgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV07DQogICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgoDQogICAgICAgICAgICAgICAgICAgICAgcEluc3QsDQogICAgICAgICAgICAgICAgICAgICAgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsDQogICAgICAgICAgICAgICAgICAgICAgIiIsDQogICAgICAgICAgICAgICAgICAgICAgcA0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCiAgICAvLyDlkIzmraXpgInmi6nnu5PmnpwNCiAgICBzeW5jSW5wdXRWYWx1ZSgpIHsNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgY29tbWVudCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pDQogICAgICB2YXIgc3RyID0gW10NCiAgICAgIHZhciBpZHMgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPQ0KICAgICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkNCiAgICAgICAgICAgIDogcmV0dXJuU3RyW2ldLmZpZWxkDQogICAgICAgIGNvbW1lbnRbaV0gPQ0KICAgICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScNCiAgICAgICAgICAgID8gcmV0dXJuU3RyW2ldLmNvbW1lbnQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgOiByZXR1cm5TdHJbaV0uY29tbWVudA0KICAgICAgfQ0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsIHx8IHRoaXNfLmNoZWNrQm94RGF0YUFsbC5sZW5ndGggPCAxKSB7DQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KQ0KICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXNfLmluZGV4QXJyYXkpLmluZGV4T2YoSlNPTi5zdHJpbmdpZnkocm93KSkgPT0gLTENCiAgICAgICAgKSB7DQogICAgICAgICAgdGhpc18uY2hlY2tCb3hEYXRhQWxsLnB1c2gocm93KQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3MNCg0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tbWVudC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGxldCBlbmNvZGVTdHIgPSBlbmNvZGVVUklDb21wb25lbnQoc1swXVtmaWVsZFtpXV0pDQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKEpTT04ucGFyc2UodGVtcCkpDQogICAgICAgIGlkcy5wdXNoKHNbMF0uaWQpDQogICAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBjb21tZW50Lmxlbmd0aDsgaisrKSB7DQogICAgICAgICAgICBsZXQgZW5jb2RlU3RyID0gZW5jb2RlVVJJQ29tcG9uZW50KHNbaV1bZmllbGRbal1dKQ0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2pdICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKQ0KICAgICAgICAgIGlkcy5wdXNoKHNbaV0uaWQpDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGNvbnN0IHJldHVybkRhdGEgPSBzdHINCiAgICAgIGNvbnN0IF90aGlzID0gdGhpcw0KICAgICAgY29uc3QgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcykNCiAgICAgIHRyeXsNCiAgICAgICAgbGV0IHJldHVyblNpemUgPSByZXR1cm5EYXRhLmxlbmd0aDsNCiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZnooagNCiAgICAgICAgaWYgKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uID09ICdvbmV0b29uZScpIHsNCiAgICAgICAgICBpZihyZXR1cm5TaXplPjEpew0KICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuS4gOWvueS4gOWtmeihqOWPquiDvemAieaLqeS4gOadoeaVsOaNriIpOw0KICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm5EYXRhLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsOw0KICAgICAgICAgIHZhciBzdWJMaW5lRGF0YSA9IHt9Ow0KICAgICAgICAgIF90aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgew0KICAgICAgICAgICAgICB0YXJnZXRBcnJheSA9IGNvbi50YXJnZXRbMF0uc3BsaXQoIi4iKTsNCiAgICAgICAgICAgICAgdmFyIGZyb20gPSAiIjsNCiAgICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7DQogICAgICAgICAgICAgICAgZnJvbSA9IGNvbi5mcm9tOw0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHN1YkxpbmVEYXRhW3RhcmdldEFycmF5W3RhcmdldEFycmF5Lmxlbmd0aCAtIDFdXSA9IGRlY29kZVVSSUNvbXBvbmVudChyb3dbZnJvbV0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGlmICh0YXJnZXRBcnJheSkgew0KICAgICAgICAgICAgLy/lrZDooajnmoTkuIvmoIcNCiAgICAgICAgICAgIGxldCBzdWJJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudChfdGhpcy4kZWwsImRhdGEtaW5kZXgiKTsNCiAgICAgICAgICAgIC8v5Yik5pat5a2Z6KGo5piv5ZCm562J5LqO56m6DQogICAgICAgICAgICBpZighZm9ybUluc3RbImRhdGEiXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dW3N1YkluZGV4XVt0YXJnZXRBcnJheVsyXV0pew0KICAgICAgICAgICAgICAvL+WmguaenOetieS6juepuuWImeiuqeWug+etieS6juepuuaVsOe7hA0KICAgICAgICAgICAgICBmb3JtSW5zdFsiZGF0YSJdW3RhcmdldEFycmF5WzBdXVt0YXJnZXRBcnJheVsxXV1bc3ViSW5kZXhdW3RhcmdldEFycmF5WzJdXSA9IG5ldyBBcnJheSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IHN1YkJvID0gZm9ybUluc3RbImRhdGEiXVt0YXJnZXRBcnJheVswXV1bdGFyZ2V0QXJyYXlbMV1dW3N1YkluZGV4XVt0YXJnZXRBcnJheVsyXV07DQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuWkp+S6juWtmeihqOaVsOaNruacgOWkp+ihjOaVsA0KICAgICAgICAgICAgaWYodGhpc18ubWF4Um93ICE9MCAmJiAoc3ViQm8ubGVuZ3RoICsgcmV0dXJuU2l6ZSk+dGhpc18ubWF4Um93KXsNCiAgICAgICAgICAgICAgdGhpc18uJG1lc3NhZ2UuZXJyb3IoIuWtmeihqOaVsOaNruW3sui2hei/h+acgOWkp+ihjOaVsOOAkCIrdGhpc18ubWF4Um93KyLjgJEiKTsNCiAgICAgICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlOw0KICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkVuZEl0ZXJhdGl2ZSIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/kuIDlr7nkuIDlrZnooagNCiAgICAgICAgICAgIGlmKF90aGlzLnJlbGF0aW9uICYmIF90aGlzLnJlbGF0aW9uPT0ib25ldG9vbmUiKXsNCiAgICAgICAgICAgICAgc3ViQm8uZW1wdHkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHN1YkJvLnB1c2goc3ViTGluZURhdGEpOw0KICAgICAgICAgICAgcmV0dXJuU2l6ZS0tDQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH1jYXRjaChlKSB7DQogICAgICAgIGlmKGUubWVzc2FnZSE9IkVuZEl0ZXJhdGl2ZSIpIHRocm93IGU7DQogICAgICB9Ow0KICAgIH0sDQogICAgLy/lj5bmtojmjInpkq4NCiAgICBkaWFsb2dDYW5jZWwoKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXM7DQogICAgICB0aGlzXy5xdWVyeVBhcmFtID0gIiI7DQogICAgICB0aGlzXy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pLnRoZW4oKCkgPT4gew0KICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IGZhbHNlOw0KICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+eCueWHu+S6huehruiupOWGjeeCueWHu+WPlua2iOeahCAgaW5wdXRWYWzmsqHmnInlgLzliJnooajnpLrnm7TmjqXngrnlh7vnmoTlj5bmtogNCiAgICAgICAgaWYgKCF0aGlzXy5pbnB1dFZhbCkgew0KICAgICAgICAgIHRoaXNfLnNlbGVjdE9yZ3MgPSBbXTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gWy4uLnRoaXNfLnNob3dEYXRhXTsNCiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbCA9IFsuLi50aGlzXy5zZWxlY3RPcmdzXTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfSwNCiAgICBkaWFsb2dUcmVlQ29uZmlybSgpIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpczsNCiAgICAgIGlmKHRoaXNfLnByb3BzRGF0YS5sZW5ndGg9PTApew0KICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi6K+36YCJ5oup5pWw5o2u5Zue5aGrIik7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvc2V0RGlhbG9nRGF0YScsIFtdKQ0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICB2YXIgZmllbGQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKQ0KICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKQ0KICAgICAgdmFyIHN0ciA9IFtdDQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJldHVyblN0ci5sZW5ndGg7IGkrKykgew0KICAgICAgICBmaWVsZFtpXSA9IHJldHVyblN0cltpXS5maWVsZA0KICAgICAgICBjb21tZW50W2ldID0gcmV0dXJuU3RyW2ldLmNvbW1lbnQNCiAgICAgIH0NCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGFbMF0NCiAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgIHRlbXAgPSAneycgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgJ30nDQogICAgICAgIH0NCiAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhDQogICAgICAgIG5vZGVzLmZvckVhY2goKGl0ZW0sIGspID0+IHsNCiAgICAgICAgICB2YXIgdGVtcCA9ICcnDQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbaV0gKyAnIjoiJyArIG5vZGVzW2ZpZWxkW2ldXSArICciLCcNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNba11bZmllbGRbaV1dICsgJyIsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2goSlNPTi5wYXJzZSh0ZW1wKSkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIGNvbnN0IHJldHVybkRhdGEgPSBzdHINCiAgICAgIGNvbnN0IGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpDQogICAgICB0cnl7DQogICAgICAgIGxldCByZXR1cm5TaXplID0gcmV0dXJuRGF0YS5sZW5ndGg7DQogICAgICAgIC8v5Yik5pat5piv5ZCm5piv5LiA5a+55LiA5a2Z6KGoDQogICAgICAgIGlmICh0aGlzXy5yZWxhdGlvbiAmJiB0aGlzXy5yZWxhdGlvbiA9PSAnb25ldG9vbmUnKSB7DQogICAgICAgICAgaWYocmV0dXJuU2l6ZT4xKXsNCiAgICAgICAgICAgIHRoaXNfLiRtZXNzYWdlLmVycm9yKCLkuIDlr7nkuIDlrZnooajlj6rog73pgInmi6nkuIDmnaHmlbDmja4iKTsNCiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuRGF0YS5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgICAgdmFyIHRhcmdldEFycmF5ID0gbnVsbDsNCiAgICAgICAgICB2YXIgc3ViTGluZURhdGEgPSB7fTsNCiAgICAgICAgICB2YXIgcGF0aEFycmF5ID0gbnVsbDsNCiAgICAgICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgICAgICB0YXJnZXRBcnJheSA9IG51bGw7DQogICAgICAgICAgICBpZihjb24udGFyZ2V0WzBdKXsNCiAgICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihjb24udGFyZ2V0WzBdICYmICFwYXRoQXJyYXkpew0KICAgICAgICAgICAgICBwYXRoQXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICB2YXIgZnJvbSA9ICIiOw0KICAgICAgICAgICAgaWYgKHRoaXNfLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7DQogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRhcmdldEFycmF5KXsNCiAgICAgICAgICAgICAgc3ViTGluZURhdGFbdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV1dID0gcm93W2Zyb21dOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICAgIGlmIChwYXRoQXJyYXkpIHsNCiAgICAgICAgICAgIC8v5a2Q6KGo55qE5LiL5qCHDQogICAgICAgICAgICBsZXQgc3ViSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpc18uJGVsLCJkYXRhLWluZGV4Iik7DQogICAgICAgICAgICAvL+WIpOaWreWtmeihqOaYr+WQpuetieS6juepug0KICAgICAgICAgICAgaWYoIWZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dKXsNCiAgICAgICAgICAgICAgLy/lpoLmnpznrYnkuo7nqbrliJnorqnlroPnrYnkuo7nqbrmlbDnu4QNCiAgICAgICAgICAgICAgZm9ybUluc3RbImRhdGEiXVtwYXRoQXJyYXlbMF1dW3BhdGhBcnJheVsxXV1bc3ViSW5kZXhdW3BhdGhBcnJheVsyXV0gPSBuZXcgQXJyYXkoKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciBzdWJCbyA9IGZvcm1JbnN0WyJkYXRhIl1bcGF0aEFycmF5WzBdXVtwYXRoQXJyYXlbMV1dW3N1YkluZGV4XVtwYXRoQXJyYXlbMl1dOw0KICAgICAgICAgICAgIC8v5Yik5pat5piv5ZCm5aSn5LqO5a2Z6KGo5pWw5o2u5pyA5aSn6KGM5pWwDQogICAgICAgICAgICBpZih0aGlzXy5tYXhSb3cgIT0wICYmIChzdWJCby5sZW5ndGggKyByZXR1cm5TaXplKT50aGlzXy5tYXhSb3cpew0KICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZS5lcnJvcigi5a2Z6KGo5pWw5o2u5bey6LaF6L+H5pyA5aSn6KGM5pWw44CQIit0aGlzXy5tYXhSb3crIuOAkSIpOw0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWU7DQogICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiRW5kSXRlcmF0aXZlIik7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+WIpOaWreaYr+WQpuaYr+S4gOWvueS4gOWtmeihqA0KICAgICAgICAgICAgaWYodGhpc18ucmVsYXRpb24gJiYgdGhpc18ucmVsYXRpb249PSJvbmV0b29uZSIpew0KICAgICAgICAgICAgICBzdWJCby5lbXB0eSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3ViQm8ucHVzaChzdWJMaW5lRGF0YSk7DQogICAgICAgICAgICByZXR1cm5TaXplLS0NCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2U7DQogICAgICB9Y2F0Y2goZSkgew0KICAgICAgICBpZihlLm1lc3NhZ2UhPSJFbmRJdGVyYXRpdmUiKSB0aHJvdyBlOw0KICAgICAgfTsNCg0KICAgIH0sDQogICAgZGlhbG9nQ2FuY2VsVHJlZSgpIHsNCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJkaWFsb2cvc2V0RGlhbG9nRGF0YSIsIFtdKTsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd1RyZWUgPSBmYWxzZTsNCiAgICB9LA0KICAgIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOw0KICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5wcm9wc0RhdGEgPSB0aGlzLiRyZWZzLnRyZWUuZ2V0Q2hlY2tlZE5vZGVzKCk7DQogICAgICB9DQogICAgfSwNCiAgICB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdOw0KICAgICAgICB0aGlzLnByb3BzRGF0YS5wdXNoKGRhdGEpOw0KICAgICAgfQ0KICAgIH0sDQogICAgY2xlYXJBbGxTZWxlY3RPcmdzKCkgew0KICAgICAgdGhpcy5zZWxlY3RPcmdzID0gbnVsbDsNCiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKTsNCiAgICB9LA0KICAgIHJlbW92ZVNlbGVjdE9yZyhpdGVtKSB7DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHRoaXMuJGVtaXQoImlucHV0IiwgIiIpOw0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpOw0KICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMuaW5wdXRWYWwuc3BsaWNlKGl0ZW0sIDEpOw0KICAgICAgICAvLyBsZXQgcmVtb3ZlSWQgPSB0aGlzLnNob3dEYXRhW2l0ZW1dOw0KICAgICAgICAvL+agkeW9og0KICAgICAgICBpZiAodGhpcy5wcm9wc0RhdGEubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHRoaXMucHJvcHNEYXRhLnNwbGljZShpdGVtLCAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSk7DQogICAgICAgIH0NCiAgICAgICAgLy/liJfooagNCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0T3JncyAhPSBudWxsKSB7DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKTsNCiAgICAgICAgICB0aGlzLmNoZWNrQm94RGF0YUFsbC5zcGxpY2UoaXRlbSwgMSk7DQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2goKHJvdykgPT4gew0KICAgICAgICAgICAgLy8gaWYoaXRlbS5pZCA9PXJlbW92ZUlkICl7DQogICAgICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWU7DQogICAgICAgICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3csIGZhbHNlKTsNCiAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLmNhbGFjSW5wdXRTdWZmaXhIZWlnaHQoKTsNCiAgICAgICAgbGV0IHZhbHVlID0gIiI7DQogICAgICAgIHRoaXMuaW5wdXRWYWwuZm9yRWFjaCgodmFsKSA9PiB7DQogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgIiwiOw0KICAgICAgICB9KTsNCiAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsdWUgIT0gIiIpIHsNCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgInx8IiArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpOw0KICAgICAgICB9DQogICAgICAgIHRoaXMuJGVtaXQoImlucHV0IiwgdmFsdWUpOw0KICAgICAgfQ0KICAgICAgdGhpcy5zeW5jSW5wdXRWYWx1ZSgpOw0KICAgIH0sDQogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoIXRoaXMuJHJlZnMudGFnU3BhbnMpIHJldHVybjsNCiAgICAgICAgaWYgKHRoaXMuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0KSB7DQogICAgICAgICAgdGhpcy5pbnB1dFN1ZmZpeEhlaWdodCA9IHRoaXMuJHJlZnMudGFnU3BhbnMub2Zmc2V0SGVpZ2h0ICsgNTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzLmlucHV0U3VmZml4SGVpZ2h0ID0gMzA7DQogICAgICAgIH0NCiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BDQogICAgICAgIHRoaXMuJHZhbGlkYXRvci52YWxpZGF0ZSgpOw0KICAgICAgfSwgMCk7DQogICAgfSwNCiAgICBjdXN0b21EaWFsb2dTaG93KHBhZ2VQYXJhbSkgew0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93TGlzdCA9IHRydWU7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZy5xdWVyeVVybCA9DQogICAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSINCiAgICAgICAgICA/ICIke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPSIgKw0KICAgICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuYWxpYXMgKw0KICAgICAgICAgICAgIiZtYXBQYXJhbT0iICsNCiAgICAgICAgICAgICh0aGlzLmN1c3RvbURpYWxvZy5tYXBQYXJhbSA/IHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtIDogIiIpDQogICAgICAgICAgOiB0aGlzLmN1c3RvbURpYWxvZy51cmw7DQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgdGhpcy5wYWdpbmF0aW9uID0geyBwYWdlOiAxLCBwYWdlU2l6ZTogMjAsIHNob3dUb3RhbDogInRydWUiIH07DQogICAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7DQogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFsNCiAgICAgICAgICAgICAgaQ0KICAgICAgICAgICAgXS5maWVsZC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMSkgew0KICAgICAgICB0aGlzLnNlYXJjaCgpOw0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuZGlzcGxheWZpZWxkLmxlbmd0aCA9PSAwKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCk7DQogICAgICAgIHRoaXMuZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZShwYWdlUGFyYW0uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCk7DQogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFsNCiAgICAgICAgICAgICAgaQ0KICAgICAgICAgICAgXS5maWVsZC50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY3VzdG9tRGlhbG9nVHJlZVNob3cocGFnZVBhcmFtKSB7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2c7DQogICAgICB2YXIgY3VzdG9tRGlhbG9nID0gdGhpcy5jdXN0b21EaWFsb2c7DQogICAgICB2YXIgbWFwUGFyYW0gPSAiIjsNCiAgICAgIGlmIChwYWdlUGFyYW0ucGFyYW0gIT0gdW5kZWZpbmVkKSB7DQogICAgICAgIG1hcFBhcmFtID0gSlNPTi5zdHJpbmdpZnkocGFnZVBhcmFtLnBhcmFtKTsNCiAgICAgICAgbWFwUGFyYW0gPSBtYXBQYXJhbS5zdWJzdHJpbmcoMSwgbWFwUGFyYW0ubGVuZ3RoIC0gMSk7DQogICAgICB9DQogICAgICB2YXIgcmVxdWVzdFR5cGUgPQ0KICAgICAgICBjdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIg0KICAgICAgICAgID8gIkdFVCINCiAgICAgICAgICA6IGN1c3RvbURpYWxvZy5yZXF1ZXN0VHlwZQ0KICAgICAgICAgID8gY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlDQogICAgICAgICAgOiAiUE9TVCI7DQogICAgICB2YXIgdXJsID0NCiAgICAgICAgIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9IiArDQogICAgICAgIHBhZ2VQYXJhbS5hbGlhcyArDQogICAgICAgICImbWFwUGFyYW09IiArDQogICAgICAgIG1hcFBhcmFtOw0KICAgICAgdmFyIHBhcmFtc09iaiA9IHt9Ow0KICAgICAgaWYgKGN1c3RvbURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgIHVybCA9IGN1c3RvbURpYWxvZy51cmw7DQogICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gY3VzdG9tRGlhbG9nLmRhdGFQYXJhbTsNCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkgew0KICAgICAgICAgIHZhciBjb25kaXRpb25zID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOw0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdmFyIGNvbiA9IGNvbmRpdGlvbnNbaV07DQogICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gIlBPU1QiKSB7DQogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZSgNCiAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoIlxceyIgKyBjb24uZmllbGQgKyAiXFx9IiwgImciKSwNCiAgICAgICAgICAgICAgICAgIGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdmFyIGxqQ2hhciA9IHVybC5pbmRleE9mKCI/IikgPT0gLTEgPyAiPyIgOiAiJiI7DQogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICI9IiArIGNvbi5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICBwYXJhbXNPYmogPSBKU09OLnBhcnNlKHRlbXBsYXRlUGEpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgdmFyIHJlcXVlc3RQYXJhbXMgPSB7fTsNCiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZTsNCiAgICAgIHJlcXVlc3RQYXJhbXMudXJsID0gdXJsOw0KICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7DQogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyk7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gdHJ1ZTsNCiAgICB9LA0KICAgIC8v5qCR5b2i5p+l6K+iDQogICAgc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXM7DQogICAgICBsZXQgcXVlcnkgPQ0KICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID09ICJQT1NUIg0KICAgICAgICAgID8gcmVxLnBvc3QocmVxdWVzdFBhcmFtcy51cmwsIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqKQ0KICAgICAgICAgIDogcmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7DQogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAvL+aYvuekuuWtl+autemFjee9rg0KICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsNCiAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOw0KICAgICAgICAvL+aKiuWvueivneahhumFjee9rueahOaYvuekuuWtl+auteaYvuekuuWQjeensOi1i+WAvOe7meagkeW9oueahOaYvuekuuWAvA0KICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWU7DQogICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcG9uc2UuZGF0YTsNCiAgICAgICAgLy/lvpfliLDopoHliqDovb3moJHnmoTkv6Hmga8NCiAgICAgICAgdGhpc18ucHJvcHMxID0gdGhpc18udG9UcmVlRGF0YSgNCiAgICAgICAgICByZXNwb25zZS5kYXRhLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5pZCwNCiAgICAgICAgICBkaXNwbGF5ZmllbGQucGlkLA0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICBkaXNwbGF5ZmllbGQucHZhbHVlID8gZGlzcGxheWZpZWxkLnB2YWx1ZSA6IDANCiAgICAgICAgKTsNCiAgICAgIH0pOw0KICAgIH0sDQogICAgLy/liqDovb3moJHnmoTkv6Hmga8NCiAgICB0b1RyZWVEYXRhKGRhdGEsIGlkLCBwaWQsIG5hbWUsIHB2YWx1ZSkgew0KICAgICAgLy8g5bu656uL5Liq5qCR5b2i57uT5p6ELOmcgOimgeWumuS5ieS4quacgOmhtuWxgueahOeItuiKgueCue+8jHB2YWx1ZeaYrzANCiAgICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKTsNCiAgICB9LA0KICAgIHRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSwgcGlkLCBpZCwgbmFtZSwgcHZhbHVlKSB7DQogICAgICAvL+aKiuagkeaVsOaNruacieWtkOiKgueCueeahOaVsOaNruWFqOmDqOi/h+a7pOaOie+8iOWPqueVmeeItuiKgueCueeahOaVsOaNru+8iQ0KICAgICAgbGV0IHBhcmVudHMgPSBkYXRhLmZpbHRlcigNCiAgICAgICAgKHZhbHVlKSA9Pg0KICAgICAgICAgIHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8IHZhbHVlW3BpZF0gPT0gbnVsbCB8fCB2YWx1ZVtwaWRdID09IHB2YWx1ZQ0KICAgICAgKTsNCiAgICAgIGlmICghcGFyZW50cykgew0KICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoDQogICAgICAgICAgKHZhbHVlKSA9Pg0KICAgICAgICAgICAgdmFsdWVbcGlkXSAhPT0gInVuZGVmaW5lZCIgJiYNCiAgICAgICAgICAgIHZhbHVlW3BpZF0gIT0gbnVsbCAmJg0KICAgICAgICAgICAgdmFsdWVbaWRdICE9IHZhbHVlW3BpZF0NCiAgICAgICAgKTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBwYXJlbnRzOw0KICAgIH0sDQogICAgbG9hZFRyZWUobm9kZSwgcmVzb2x2ZSkgew0KICAgICAgaWYgKG5vZGUpIHsNCiAgICAgICAgbGV0IHRoaXNfID0gdGhpczsNCiAgICAgICAgbGV0IGRpc3BsYXlGaWVsZCA9DQogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nLnN0eWxlID09IDINCiAgICAgICAgICAgID8gdGhpc18uY29tYmlUcmVlRGlzcGxheUZpZWxkDQogICAgICAgICAgICA6IHRoaXNfLmRpc3BsYXlGaWVsZDsNCiAgICAgICAgcmVzb2x2ZSgNCiAgICAgICAgICB0aGlzLnRyZWVMaXN0LmZpbHRlcigNCiAgICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWVbZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtkaXNwbGF5RmllbGQuaWRdDQogICAgICAgICAgKQ0KICAgICAgICApOw0KICAgICAgICBpZiAodGhpcy5zaG93RGF0YSAmJiB0aGlzLnNob3dEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgIHRoaXMuc2hvd0RhdGEuZm9yRWFjaCgodikgPT4gew0KICAgICAgICAgICAgICBpZiAodi5QaWQgPT0gbm9kZS5rZXkpIHsNCiAgICAgICAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLnNldENoZWNrZWQodiwgdHJ1ZSk7DQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpc18uY2hlY2tOb2RlKHYsIHRoaXNfKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSwgNDAwKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQoNCiAgICBhZnRlck9wZW4oKSB7DQogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQ0KICAgICAgdGhpcy5sb2FkQ29tYmluYXRpb25UcmVlKCk7DQogICAgfSwNCiAgICBsb2FkQ29tYmluYXRpb25UcmVlKCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpIHsNCiAgICAgICAgcmV0dXJuOw0KICAgICAgfQ0KICAgICAgbGV0IGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsNCiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOw0KICAgICAgbGV0IHRyZWVBbGlhcyA9IGNvbWJpbmF0aW9uUnVsZS5sZWZ0VHJlZTsNCiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uDQogICAgICByZXENCiAgICAgICAgLmdldCgiJHtmb3JtfS9mb3JtL2N1c3RvbURpYWxvZy92MS9nZXRCeUFsaWFzP2FsaWFzPSIgKyB0cmVlQWxpYXMpDQogICAgICAgIC50aGVuKChyZXNwKSA9PiB7DQogICAgICAgICAgbGV0IHRyZWVEaWFsb2cgPSByZXNwLmRhdGE7DQogICAgICAgICAgdGhpcy5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOw0KICAgICAgICAgIGxldCByZXFQYXJhbSA9IHt9Ow0KICAgICAgICAgIGxldCByZXF1ZXN0VHlwZSA9DQogICAgICAgICAgICB0cmVlRGlhbG9nLmRzVHlwZSA9PSAiZGF0YVNvdXJjZSINCiAgICAgICAgICAgICAgPyAiR0VUIg0KICAgICAgICAgICAgICA6IHRyZWVEaWFsb2cucmVxdWVzdFR5cGUNCiAgICAgICAgICAgICAgPyB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlDQogICAgICAgICAgICAgIDogIlBPU1QiOw0KICAgICAgICAgIGxldCB1cmwgPQ0KICAgICAgICAgICAgIiR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9IiArDQogICAgICAgICAgICB0cmVlQWxpYXMgKw0KICAgICAgICAgICAgIiZtYXBQYXJhbT0iOw0KICAgICAgICAgIGxldCBwYXJhbXNPYmogPSB7fTsNCiAgICAgICAgICBpZiAodHJlZURpYWxvZy5kc1R5cGUgIT0gImRhdGFTb3VyY2UiKSB7DQogICAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsNCiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVBhID0gdHJlZURpYWxvZy5kYXRhUGFyYW07DQogICAgICAgICAgICBpZiAodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCkgew0KICAgICAgICAgICAgICBsZXQgY29uZGl0aW9ucyA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5jb25kaXRpb25maWVsZCk7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9ucy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGxldCBjb24gPSBjb25kaXRpb25zW2ldOw0KICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0VHlwZSA9PSAiUE9TVCIpIHsNCiAgICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGEgPSB0ZW1wbGF0ZVBhLnJlcGxhY2UoDQogICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cCgiXFx7IiArIGNvbi5maWVsZCArICJcXH0iLCAiZyIpLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtc09ialtjb24uZmllbGRdID0gY29uLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbGV0IGxqQ2hhciA9IHVybC5pbmRleE9mKCI/IikgPT0gLTEgPyAiPyIgOiAiJiI7DQogICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAiPSIgKyBjb24uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZiAodGVtcGxhdGVQYSkgew0KICAgICAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSk7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fTsNCiAgICAgICAgICByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID0gcmVxdWVzdFR5cGU7DQogICAgICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmw7DQogICAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7DQogICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgIC5kaXNwYXRjaCgiZGlhbG9nL2dldFRyZWVEYXRhIiwgcmVxdWVzdFBhcmFtcykNCiAgICAgICAgICAgIC50aGVuKChyZXNwKSA9PiB7DQogICAgICAgICAgICAgIGlmICh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCAmJiB0cmVlRGlhbG9nLnJlc3VsdGZpZWxkKSB7DQogICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlGaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQpOw0KICAgICAgICAgICAgICAgIGxldCByZXN1bHRmaWVsZCA9IEpTT04ucGFyc2UodHJlZURpYWxvZy5yZXN1bHRmaWVsZCk7DQogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7DQogICAgICAgICAgICAgICAgdGhpcy50cmVlTGlzdCA9IHJlc3A7DQogICAgICAgICAgICAgICAgdGhpcy5jb21iaVRyZWVEaXNwbGF5RmllbGQgPSBkaXNwbGF5RmllbGQ7DQogICAgICAgICAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVEYXRhID0gdGhpcy50b1RyZWVEYXRhKA0KICAgICAgICAgICAgICAgICAgcmVzcCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5pZCwNCiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWUsDQogICAgICAgICAgICAgICAgICBkaXNwbGF5RmllbGQucHZhbHVlID8gZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICIwIiwNCiAgICAgICAgICAgICAgICAgIHJlc3VsdGZpZWxkDQogICAgICAgICAgICAgICAgKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgIH0sDQogICAgY29tYmlUcmVlQ2xpY2socGFyYW1PYmosIG5vZGUsIG5vZGVDb21wb25lbnQpIHsNCiAgICAgIC8v57uE5ZCI5a+56K+d5qGG54K55Ye75bem5qCRDQogICAgICAvL+a4heepuuaXp+eahA0KICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMuc3BsaWNlKDApOw0KICAgICAgbGV0IGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsNCiAgICAgIGlmICghY29tYmluYXRpb25SdWxlLnJ1bGVzIHx8IGNvbWJpbmF0aW9uUnVsZS5ydWxlcy5sZW5ndGggPT0gMCkgew0KICAgICAgICByZXR1cm47DQogICAgICB9DQogICAgICBsZXQgcnVsZXMgPSBjb21iaW5hdGlvblJ1bGUucnVsZXM7DQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGxldCB2YWx1ZSA9IHBhcmFtT2JqW3J1bGVzW2ldLnRyZWVGaWVsZF07DQogICAgICAgIGxldCBwcm9wZXJ0eSA9IHJ1bGVzW2ldLmxpc3RGaWVsZDsNCiAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMucHVzaCh7DQogICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LA0KICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICBncm91cDogInRyZWVHcm91cCIsDQogICAgICAgICAgb3BlcmF0aW9uOiB0aGlzLmdldE9wZXJhdGlvbihydWxlc1tpXS5jb25kaXRpb24pLA0KICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIiwNCiAgICAgICAgfSk7DQogICAgICB9DQogICAgICB0aGlzLnNlYXJjaCgpOw0KICAgIH0sDQogICAgLy/ojrflj5bov5DnrpfnrKblj7cNCiAgICBnZXRPcGVyYXRpb24ob2xkKSB7DQogICAgICBpZiAoIW9sZCkgew0KICAgICAgICByZXR1cm4gIiI7DQogICAgICB9DQogICAgICBpZiAob2xkID09ICJFUSIpIHsNCiAgICAgICAgcmV0dXJuICJFUVVBTCI7DQogICAgICB9DQogICAgICBpZiAob2xkID09ICJMSyIpIHsNCiAgICAgICAgcmV0dXJuICJMSUtFIjsNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gIkxGSyIpIHsNCiAgICAgICAgcmV0dXJuICJMSUtFIjsNCiAgICAgIH0NCiAgICAgIGlmIChvbGQgPT0gIklOIikgew0KICAgICAgICByZXR1cm4gIklOIjsNCiAgICAgIH0NCiAgICB9LA0KICAgIHRvZ2dsZVRyZWUoKSB7DQogICAgICBpZiAodGhpcy50cmVlU2hvdykgew0KICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7DQogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMCUiOw0KICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICJlbC1pY29uLWFycm93LXJpZ2h0IjsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOw0KICAgICAgICB0aGlzLnRyYW5zdGlvbldpZHRoID0gIjI1JSI7DQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctbGVmdCI7DQogICAgICB9DQogICAgfSwNCiAgfSwNCn07DQo="},null]}