{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipDialog.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipDialog.vue","mtime":1733309211876},{"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:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge21hcFN0YXRlfSBmcm9tICd2dWV4Jw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQgaG90ZW50VWlVdGlscyBmcm9tICdAL2hvdGVudC11aS11dGlsLmpzJw0KaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdlbGVtZW50LXVpJw0KaW1wb3J0IHJlcSBmcm9tICdAL3JlcXVlc3QuanMnDQppbXBvcnQgc3ViX3Bpb19taXhpbiBmcm9tICJAL3N1Yi1wZXJtaXNzaW9uLW1peGluLmpzIg0KaW1wb3J0IEVpcFRhZyBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBUYWcudnVlJw0KaW1wb3J0IEVpcFNlbGVjdERpYSBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3REaWEudnVlJw0KZXhwb3J0IGRlZmF1bHQgew0KICBjb21wb25lbnRzOiB7RWlwVGFnLCBFaXBTZWxlY3REaWF9LA0KICBuYW1lOiAnZWlwLWRpYWxvZycsDQogIHByb3BzOiBbJ3ZhbGlkYXRlJywgJ3ZhbHVlJywgJ25hbWUnLCAncGVybWlzc2lvbicsICdhdHRlcicsICdzaW5nbGUnLCAnc2VsZWN0b3Jjb25maWcnLCAnY3VzdGRpYWxvZycsICdwbGFjZWhvbGRlcicsICd0b29sdGlwcGxhY2VtZW50J10sDQogIG1peGluczogW3N1Yl9waW9fbWl4aW5dLC8v5re35YWl5pa55byP5byV5YWl6KGo5Y2V57uE5Lu25Lit5YWs5YWx5bGe5oCn77yM5aSE55CG5a2Q6KGo44CB5a2Z6KGo6KGM5YaF6IGU5Yqo77yI5YiH6Z2i5L+u5pS5cGVybWlzc2lvbl9zdWLvvIkNCiAgZGF0YSgpIHsNCiAgICByZXR1cm4gew0KICAgICAgZGlhbG9nVmlzaWJsZTpmYWxzZSwvL+aJk+W8gOagkeW9oui+k+WFpeWKqOaAgeWPguaVsOWAvOeahOWvueivneahhg0KICAgICAgcGFnZVBhcmFtOnt9LC8v5qCR5b2i5a+56K+d5qGG5Y+C5pWwDQogICAgICBjb25kaXRpb25maWVsZFRyZWU6W10sLy/moJHlvaLlr7nor53moYbmnaHku7blrZfmrrUNCiAgICAgIGRhdGE6IHsNCiAgICAgICAgcXhkZDoge30NCiAgICAgIH0sDQogICAgICBpbnB1dFN1ZmZpeFdpZHRoOjAsDQogICAgICBwbGFjZWhvbGRlckJvOiAnJywNCiAgICAgIHF1aWNrU2VhcmNoOiAnJywgLy/loavlhpnmj5DnpLoNCiAgICAgIGNvbmRpdGlvbkJpbmQ6IFtdLCAvL+WPguaVsOafpeivouWtl+autQ0KICAgICAgbm9kZUtleTogJ0lEXycsIC8v5qCR5b2i5pWw5o2u54i2SWQNCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dMaXN0OiBmYWxzZSwNCiAgICAgIGN1c3RvbURpYWxvZ1Nob3dUcmVlOiBmYWxzZSwNCiAgICAgIHNlbGVjdE9yZ1Byb3BzOiB7DQogICAgICAgIGxhYmVsOiAnbmFtZScNCiAgICAgIH0sDQogICAgICBzdHlsZTogJycsIC8v5a+56K+d5qGG5a696auYDQogICAgICBzZWxlY3RPcmdzOiBudWxsLA0KICAgICAgaW5wdXRTdWZmaXhIZWlnaHQ6IDMzLA0KICAgICAgY29uZmlnOiBudWxsLA0KICAgICAgdXBkYXRpbmc6IGZhbHNlLA0KICAgICAgZGlzcGxheWZpZWxkOiBbXSwgLy/mmL7npLrlrZfmrrUNCiAgICAgIGN1c3RvbURpYWxvZzoge30sDQogICAgICBxdWVyeVBhcmFtOiAnJywgLy/mn6Xor6LmnaHku7bovpPlhaXnmoTlgLwNCiAgICAgIHByb3BzMTogW10sDQogICAgICBzaG93RGF0YTogW10sDQogICAgICBjaGVja0JveERhdGFBbGw6IFtdLCAvL+mAieS4reWvueixoeeahOmbhuWQiA0KICAgICAgZGVmYXVsdFByb3BzOiB7DQogICAgICAgIGNoaWxkcmVuOiAnY2hpbGRyZW4nLA0KICAgICAgICBsYWJlbDogJ2xhYmVsJywNCiAgICAgICAgaXNMZWFmOiJpc0xlYWYiDQogICAgICB9LA0KICAgICAgcHJvcHNEYXRhOiBbXSwNCiAgICAgIHF1ZXJ5c1Nob3c6IGZhbHNlLCAvL+aYr+WQpuaYvuekuuaQnOe0ouahhg0KICAgICAgdW5kZWZpbmVkYTogJycsDQogICAgICBpc0N1cnJlbnRDaGFuZ2U6IGZhbHNlLCAvL+aYr+WQpuS4jeaJp+ihjCBvcmdUYWJsZVNlbGVjdGlvbuaWueazlQ0KICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICBwYWdlOiAxLA0KICAgICAgICBwYWdlU2l6ZTogMjAsDQogICAgICAgIHRvdGFsOiAwDQogICAgICB9LA0KICAgICAgcGFyYW06IFtdLCAvL+e7keWumueahOihqOWNleWtl+autQ0KICAgICAgdHJlZUxpc3Q6IFtdLA0KICAgICAgZGlzcGxheUZpZWxkOiB7fSwNCiAgICAgIHF1ZXJ5UGFyYW1zOiBbXSwNCiAgICAgIHBsYWNlaG9sZGVyczogW10sDQogICAgICBvbGRzZWxlY3RPcmdzOiBbXSwNCiAgICAgIGNvbWJpbmF0aW9uVHJlZURhdGE6W10sDQogICAgICBjb21iaVRyZWVEaXNwbGF5RmllbGQ6W10sDQogICAgICBjb21iaW5hdGlvblRyZWVRdWVyeXM6W10sDQogICAgICBjb21iaW5hdGlvblJ1bGU6e30sDQogICAgICB0b2dnbGVCdG46ICJlbC1pY29uLWFycm93LWxlZnQiLA0KICAgICAgdHJlZVNob3c6IHRydWUsDQogICAgICB0cmFuc3Rpb25XaWR0aDogIjI1JSIsDQogICAgICBsZWZ0VHJlZVRpdGxlOiIiLA0KICAgICAgd3JpdGVhYmxlOnRydWUsDQogICAgfQ0KICB9LA0KICB3YXRjaDogew0KICAgIHByb3BzMTogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgIC8v5qCR5b2iDQogICAgICBpZiAodGhpcy5zaG93RGF0YSAhPSB1bmRlZmluZWQgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgICBsZXQgZGF0YSA9IFtdDQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaG93RGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGRhdGEucHVzaCh0aGlzLnNob3dEYXRhW2ldKQ0KICAgICAgICB9DQogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpc18uJHJlZnMudHJlZS5zZXRDaGVja2VkKGRhdGFbaV0sIHRydWUpDQogICAgICAgICAgICB0aGlzXy5jaGVja05vZGUoZGF0YVtpXSwgdGhpc18pDQogICAgICAgICAgfQ0KICAgICAgICB9LCAyMDApDQogICAgICB9DQogICAgfQ0KICB9LA0KICBtb3VudGVkKCkgew0KICAgIGNvbnN0IHsgc3ViU2NvcGVFbCwgaW5kZXggfSA9IGhvdGVudFVpVXRpbHMuZ2V0U3ViU2NvcGVFbEFuZEluZGV4KHRoaXMuJGVsKTsNCiAgICBpZiAoc3ViU2NvcGVFbCAmJiAoc3ViU2NvcGVFbC5nZXRBdHRyaWJ1dGUoInJvd19yZWFkb25seSIpID09ICd0cnVlJyB8fCBzdWJTY29wZUVsLmdldEF0dHJpYnV0ZSgicm93X3JlYWRvbmx5IikgPT09IHRydWUpKSB7DQogICAgICB0aGlzLndyaXRlYWJsZSA9IGZhbHNlOw0KICAgIH0NCiAgICAvL+iOt+WPluWvueivneahhuaMiemSruWQjeensOWuveW6pg0KICAgIGlmKHRoaXMuJHJlZnMuaW5wdXRTdWZmaXgpew0KICAgICAgdGhpcy5pbnB1dFN1ZmZpeFdpZHRoID0gdGhpcy4kcmVmcy5pbnB1dFN1ZmZpeC5vZmZzZXRXaWR0aCsxOw0KICAgIH0NCiAgfSwNCiAgY29tcHV0ZWQ6IG1hcFN0YXRlKHsNCiAgICAvLyBwYWdpbmF0aW9uOiBzdGF0ZSA9PiBzdGF0ZS5kaWFsb2cucGFnaW5hdGlvbiwNCiAgICB0b3RhbDogc3RhdGUgPT4gc3RhdGUuZGlhbG9nLnRvdGFsLA0KICAgIGRpYWxvZ0RhdGE6IHN0YXRlID0+IHsNCiAgICAgIHJldHVybiBzdGF0ZS5kaWFsb2cucm93cw0KICAgIH0sDQogICAgaW5wdXRWYWw6IGZ1bmN0aW9uKCkgew0KICAgICAgaWYgKCF0aGlzLnZhbHVlIHx8IHRoaXMudmFsdWUgPT0gJ3x8W10nKSB7DQogICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gW10NCiAgICAgICAgLy8gdGhpcy5zaG93RGF0YSA9IFtdOw0KICAgICAgICByZXR1cm4gbnVsbA0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgbGV0IG5hbWVBcnkgPSB0aGlzLnZhbHVlLnNwbGl0KCcsJykNCiAgICAgICAgaWYgKHRoaXMudmFsdWUuaW5kZXhPZignfHwnKSA+IDApIHsNCiAgICAgICAgICBuYW1lQXJ5ID0gdGhpcy52YWx1ZS5zcGxpdCgnfHwnKVswXS5zcGxpdCgnLCcpDQogICAgICAgICAgLy8gdGhpcy5zaG93RGF0YT1KU09OLnBhcnNlKHRoaXMudmFsdWUuc3BsaXQoInx8IilbMV0pOw0KICAgICAgICB9DQogICAgICAgIC8vICB0aGlzLnNob3dEYXRhID10aGlzLnNlbGVjdE9yZ3M7DQogICAgICAgIGxldCBpZEFyeSA9IG51bGwNCiAgICAgICAgbGV0IGFjY291bnRBcnkgPSBudWxsDQogICAgICAgIGxldCByZXN1bHQgPSBbXQ0KICAgICAgICBuYW1lQXJ5LmZvckVhY2goKG0sIGkpID0+IHsNCiAgICAgICAgICBsZXQgbiA9IHt2YWx1ZTogbX0NCiAgICAgICAgICByZXN1bHQucHVzaChuKQ0KICAgICAgICB9KQ0KICAgICAgICByZXR1cm4gcmVzdWx0Ow0KICAgICAgfQ0KICAgIH0sDQogICAgaW5wdXRXcml0ZWFibGU6IGZ1bmN0aW9uKCkgew0KICAgICAgcmV0dXJuIHRoaXMud3JpdGVhYmxlID8gdXRpbHMuZ2V0V3JpdGVhYmxlKHRoaXMucGVybWlzc2lvbl9zdWIpOnRoaXMud3JpdGVhYmxlOw0KICAgIH0sDQogICAgaW5wdXRWYWxpZGF0ZTogZnVuY3Rpb24oKSB7DQogICAgICB2YXIgdmFsaWRhdGVPYmogPSB0aGlzLiRzdG9yZS5zdGF0ZS5pbmRleC52YWxpZGF0ZQ0KICAgICAgcmV0dXJuIHV0aWxzLmFkZFJlcXVpcmVkT3JOb3QodGhpcy5wZXJtaXNzaW9uX3N1YiwgdGhpcy52YWxpZGF0ZSwgdmFsaWRhdGVPYmosIHRoaXMpDQogICAgfSwNCiAgICBpbnB1dE5hbWU6IGZ1bmN0aW9uKCkgew0KICAgICAgbGV0IGxhYmVsZGVzYyA9ICcnDQogICAgICBpZiAodGhpcy4kc2xvdHMgJiYgdGhpcy4kc2xvdHMubGFiZWxkZXNjICYmIHRoaXMuJHNsb3RzLmxhYmVsZGVzY1swXS5jaGlsZHJlbiAmJiB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dCkgew0KICAgICAgICBsYWJlbGRlc2MgPSB0aGlzLiRzbG90cy5sYWJlbGRlc2NbMF0uY2hpbGRyZW5bMF0udGV4dA0KICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpICsgJy0nICsgbGFiZWxkZXNjDQogICAgICB9IGVsc2Ugew0KICAgICAgICByZXR1cm4gdGhpcy5uYW1lID8gdGhpcy5uYW1lIDogdXRpbHMuZ2V0TmFtZSgpDQogICAgICB9DQogICAgfSwNCiAgICAvLyDmmK/lkKbmnInlm57loavorr7nva4NCiAgICBiaW5kU2V0OiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLnNlbGVjdG9yY29uZmlnID8gdGhpcy5zZWxlY3RvcmNvbmZpZy5iaW5kIDogbnVsbA0KICAgIH0NCiAgfSksDQogIGNyZWF0ZWQoKSB7DQogICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKSB7DQogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSAn6K+36YCJ5oup5YaF5a65Jw0KICAgIH0gZWxzZSB7DQogICAgICB0aGlzLnBsYWNlaG9sZGVyQm8gPSB0aGlzLnBsYWNlaG9sZGVyDQogICAgfQ0KICAgIHRoaXMuJHZhbGlkYXRvciA9IHRoaXMuJHJvb3QuJHZhbGlkYXRvcg0KICB9LA0KICBtZXRob2RzOiB7DQogICAgc2VsZWN0QWxsKHNlbGVjdGlvbikgew0KICAgICAgaWYodGhpcy5vbGRzZWxlY3RPcmdzIT1udWxsICYmIHNlbGVjdGlvbi5sZW5ndGg+MCl7DQogICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgc2VsZWN0aW9uLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgaWYgKHRoaXMuaW5kZXhBcnJheSh0aGlzLm9sZHNlbGVjdE9yZ3MsIHNlbGVjdGlvblt4XSkgPT09IC0xKSB7DQogICAgICAgICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25beF0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLm9sZHNlbGVjdE9yZ3MpOw0KICAgICAgfWVsc2V7DQogICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IF8uY2xvbmVEZWVwKHNlbGVjdGlvbik7DQogICAgICB9DQogICAgfSwNCiAgICBjaGVja05vZGUoZGF0YSwgdGhpc18sIHBub2RlKSB7DQogICAgICBpZiAoZGF0YS5QaWQpIHsNCiAgICAgICAgbGV0IG5vZGUgPSB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUoZGF0YS5QaWQpDQogICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWUNCiAgICAgICAgaWYgKG5vZGUuZGF0YS5QaWQpIHsNCiAgICAgICAgICB0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuaW5kZXRlcm1pbmF0ZSA9IHRydWUNCiAgICAgICAgICB0aGlzLmNoZWNrTm9kZSh0aGlzXy4kcmVmcy50cmVlLmdldE5vZGUobm9kZS5kYXRhLlBpZCkuZGF0YSwgdGhpc18sIHRoaXNfLiRyZWZzLnRyZWUuZ2V0Tm9kZShub2RlLmRhdGEuUGlkKSkNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIW5vZGUuaW5kZXRlcm1pbmF0ZSkgew0KICAgICAgICAgIG5vZGUuaW5kZXRlcm1pbmF0ZSA9IHRydWUNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmIChwbm9kZSAmJiAhcG5vZGUuaW5kZXRlcm1pbmF0ZSkgew0KICAgICAgICBwbm9kZS5pbmRldGVybWluYXRlID0gdHJ1ZQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy/lm57ovabmn6Xor6INCiAgICBzZWFyY2hFbnRlckZ1bjogZnVuY3Rpb24oZSkgew0KICAgICAgdmFyIGtleUNvZGUgPSB3aW5kb3cuZXZlbnQgPyBlLmtleUNvZGUgOiBlLndoaWNoDQogICAgICBpZiAoa2V5Q29kZSA9PSAxMykgew0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICB9DQogICAgfSwNCiAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbihzaXplKSB7DQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgIC8v5q+P6aG15LiL5ouJ5pi+56S65pWw5o2uDQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZVNpemUgPSBzaXplDQogICAgICB0aGlzLnNlYXJjaCgpDQogICAgfSwNCiAgICBoYW5kbGVDdXJyZW50Q2hhbmdlOiBmdW5jdGlvbihjdXJyZW50UGFnZSkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IHVuZGVmaW5lZCAmJiB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID4gMCkgew0KICAgICAgICB0aGlzLnNlbGVjdE9yZ3MuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICAgIGxldCByZXMgPSB0aGlzXy5pbmRleEFycmF5KHRoaXNfLmNoZWNrQm94RGF0YUFsbCwgcm93KQ0KICAgICAgICAgIGlmIChyZXMgPT0gLTEpIHsNCiAgICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5wdXNoKHJvdykNCiAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgICB9DQogICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgIC8v54K55Ye756ys5Yeg6aG1DQogICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlDQogICAgICB0aGlzLnNlYXJjaCgpDQogICAgfSwNCiAgICBjaGVja0xpc3QoKSB7DQogICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAvL+WIl+ihqA0KICAgICAgICBpZiAodGhpc18uY2hlY2tCb3hEYXRhQWxsICE9IHVuZGVmaW5lZCAmJiB0aGlzXy5jaGVja0JveERhdGFBbGwubGVuZ3RoID4gMCkgew0KICAgICAgICAgIHRoaXNfLmNoZWNrQm94RGF0YUFsbC5mb3JFYWNoKHJvdyA9PiB7DQogICAgICAgICAgICBsZXQgcmVzID0gdGhpc18uaW5kZXhBcnJheSh0aGlzXy5kaWFsb2dEYXRhLCByb3cpDQogICAgICAgICAgICB0aGlzXy51bmRlZmluZWRhID0gcmVzDQogICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7DQogICAgICAgICAgICAgIHRoaXNfLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgICAgICAgdGhpc18udG9nZ2xlUm93U2VsZWN0aW9uKHJlcywgdHJ1ZSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9LCAzMDApDQogICAgfSwNCiAgICB0b2dnbGVSb3dTZWxlY3Rpb24ocmVzLCB2YWwpIHsNCiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUudG9nZ2xlUm93U2VsZWN0aW9uKHRoaXMuZGlhbG9nRGF0YVtyZXNdLCB2YWwpDQogICAgfSwNCiAgICBzaG93RGlhbG9nKGl0ZW0pIHsNCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgdmFyIGFsaWFzID0gdGhpcy5jdXN0ZGlhbG9nLmN1c3REaWFsb2cuYWxpYXMNCiAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdmb3JtL2dldEJ5QWxpYXMnLCBhbGlhcykudGhlbihjdXN0b21EaWFsb2cgPT4gew0KICAgICAgICBpZiAoIWN1c3RvbURpYWxvZyB8fCAhY3VzdG9tRGlhbG9nLmFsaWFzKSB7DQogICAgICAgICAgTWVzc2FnZS5lcnJvcign5a+56K+d5qGG5Yir5ZCN44CQJyArIGFsaWFzICsgJ+OAkeS4jeWtmOWcqO+8gScpDQogICAgICAgICAgcmV0dXJuDQogICAgICAgIH0NCiAgICAgICAgaWYgKGN1c3RvbURpYWxvZy5zdHlsZSA9PSAxKSB7DQogICAgICAgICAgdmFyIGRpc3BsYXlsaXN0ID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICAgIHRoaXNfLm5vZGVLZXkgPSBkaXNwbGF5bGlzdC5pZA0KICAgICAgICB9DQogICAgICAgIC8v5a+56K+d5qGG5oyJ6KGo5Y2V5a2X5q615p+l6K+i77yI5Y+C5pWw5Lyg5YWl55qE77yJDQogICAgICAgIGxldCBiaW5kTGlzdCA9IHRoaXNfLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jb25kaXRpb25zDQogICAgICAgIHRoaXNfLnBhcmFtID0gW10gLy/nu5HlrprnmoTooajljZXlrZfmrrUNCiAgICAgICAgaWYgKGJpbmRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGVsZSA9PiB7DQogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAnMycgJiYgZWxlLmJpbmQpIHsNCiAgICAgICAgICAgICAgbGV0IG9iaiA9IHt9DQogICAgICAgICAgICAgIG9iai5maWVsZCA9IGVsZS5maWVsZA0KICAgICAgICAgICAgICBvYmouYmluZCA9IGVsZS5iaW5kDQogICAgICAgICAgICAgIHRoaXNfLnBhcmFtLnB1c2gob2JqKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgIH0NCiAgICAgICAgLy/liKTmlq3lr7nor53moYbmn6Xor6LmmK/lkKbmnInmnaHku7YNCiAgICAgICAgbGV0IHVzZXJJbnB1dExpc3QgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkNCiAgICAgICAgdGhpc18ucXVpY2tTZWFyY2ggPSAnJyAvL+Whq+WGmeaPkOekuiBwbGFjZWhvbGRlcg0KICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kID0gW10NCiAgICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0gW10NCiAgICAgICAgbGV0IHBsYWNlaG9sZGVycyA9IFtdDQogICAgICAgIGlmICh1c2VySW5wdXRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB1c2VySW5wdXRMaXN0LmZvckVhY2goZWxlID0+IHsNCiAgICAgICAgICAgIHZhciBvYmogPSB7fQ0KICAgICAgICAgICAgLy/mnaHku7bmn6Xor6Llj4LmlbDvvIjnlKjmiLfovpPlhaXnmoTvvIkg5paH5pys5qGG6L6T5YWlDQogICAgICAgICAgICBpZiAoZWxlLmRlZmF1bHRUeXBlID09ICcxJykgew0KICAgICAgICAgICAgICBvYmpbZWxlLmZpZWxkXSA9ICcnDQogICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zLnB1c2gob2JqKQ0KICAgICAgICAgICAgICB0aGlzXy5jb25kaXRpb25CaW5kLnB1c2goZWxlKQ0KICAgICAgICAgICAgICBwbGFjZWhvbGRlcnMucHVzaCgn6K+36L6T5YWlJyArIGVsZS5jb21tZW50KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgICAgdGhpcy4kc2V0KHRoaXMsICdxdWVyeVBhcmFtcycsIHF1ZXJ5UGFyYW1zKQ0KICAgICAgICAgIHRoaXMuJHNldCh0aGlzLCAncGxhY2Vob2xkZXJzJywgcGxhY2Vob2xkZXJzKQ0KICAgICAgICB9DQogICAgICAgIC8v5Yik5pat5piv5ZCm5pi+56S65p2h5Lu25p+l6K+i6L6T5YWl5qGGDQogICAgICAgIGlmICh0aGlzXy5xdWlja1NlYXJjaCAhPSAnJykgew0KICAgICAgICAgIHRoaXNfLnF1ZXJ5c1Nob3cgPSB0cnVlDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpc18ucXVlcnlzU2hvdyA9IHRydWUNCiAgICAgICAgfQ0KICAgICAgICB0aGlzXy5xdWlja1NlYXJjaCA9ICfor7fovpPlhaUnICsgdGhpcy5xdWlja1NlYXJjaCArICfmn6Xor6InDQogICAgICAgIHRoaXNfLnN0eWxlID0gJ2hlaWdodDonICsgY3VzdG9tRGlhbG9nLmhlaWdodCArICdweCcNCiAgICAgICAgaWYgKHdpbmRvdy5zY3JlZW4uaGVpZ2h0ICYmIHdpbmRvdy5zY3JlZW4uaGVpZ2h0IDw9IDkwMCkgew0KICAgICAgICAgIHRoaXMuc3R5bGUgPSAnaGVpZ2h0OjQ0MHB4Jw0KICAgICAgICB9DQogICAgICAgIGlmIChjdXN0b21EaWFsb2cuc3R5bGUgPT0gMCB8fCBjdXN0b21EaWFsb2cuc3R5bGUgPT0gMikgew0KICAgICAgICAgIC8v5YiX6KGoDQogICAgICAgICAgdGhpc18uY3VzdG9tRGlhbG9nU2hvdyh7YWxpYXM6IGFsaWFzLCBjdXN0b21EaWFsb2c6IGN1c3RvbURpYWxvZ30pDQogICAgICAgIH0gZWxzZSBpZihjdXN0b21EaWFsb2cuc3R5bGUgPT0gMSkgew0KICAgICAgICAgIC8v5qCR5b2iDQogICAgICAgICAgdGhpc18ucGFnZVBhcmFtID0geyBhbGlhczogYWxpYXMsY3VzdG9tRGlhbG9nOiBjdXN0b21EaWFsb2cgfTsNCiAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSBjdXN0b21EaWFsb2c7DQogICAgICAgICAgbGV0IHBhcmFtID0ge307DQogICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gW107DQogICAgICAgICAgLy/liKTmlq3mmK/lkKblrZjlnKjmnaHku7YNCiAgICAgICAgICBpZihjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpew0KICAgICAgICAgICAgdGhpc18uY29uZGl0aW9uZmllbGRUcmVlID0gSlNPTi5wYXJzZShjdXN0b21EaWFsb2cuY29uZGl0aW9uZmllbGQpOw0KICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsNCiAgICAgICAgICAgICAgICAvL+WIpOaWreadoeS7tuWtl+auteaYr+WQpuaYr+WKqOaAgeS8oOWFpe+8iGRlZmF1bHRUeXBl77yaNO+8muWKqOaAgeS8oOWFpe+8jDLvvJrlm7rlrprlgLwg77yJDQogICAgICAgICAgICAgICAgaWYgKHRoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5kZWZhdWx0VHlwZSA9PSAiNCIpIHsNCiAgICAgICAgICAgICAgICAgIHBhcmFtW3RoaXNfLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZF0gPSB0aGlzXy5jb25kaXRpb25maWVsZFRyZWVbaV0uY29tbWVudDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgLy/mnInliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkocGFyYW0pICE9ICJ7fSIpIHsNCiAgICAgICAgICAgIHRoaXNfLmRpYWxvZ1Zpc2libGUgPSB0cnVlOw0KICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgLy/ml6DliqjmgIHkvKDlhaXnmoTlrZfmrrUNCiAgICAgICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1RyZWVTaG93KHRoaXNfLnBhZ2VQYXJhbSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9KQ0KICAgIH0sDQogICAgLy/miZPlvIDmoJHlvaLliqjmgIHlj4LmlbDovpPlhaXlgLznmoTlr7nor53moYYNCiAgICBoYW5kbGVTYXZlKCl7DQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1RyZWVTaG93KHRoaXMucGFnZVBhcmFtKTsNCiAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IGZhbHNlOw0KICAgIH0sDQogICAgLy/lhbPpl63moJHlvaLliqjmgIHlj4LmlbDovpPlhaXlgLznmoTlr7nor53moYYNCiAgICBoYW5kbGVDbG9zZSgpew0KICAgICAgdGhpcy5kaWFsb2dWaXNpYmxlID0gZmFsc2U7DQogICAgfSwNCiAgICAvL+WIpOaWreaVsOaNruaYr+WQpuWMheWQq+afkOS4quWvueixoe+8jOW5tui/lOWbnuaVsOaNruWMheWQq+WvueixoeeahOS4i+aghw0KICAgIGluZGV4QXJyYXkoYXJyYXksIGl0ZW0pIHsNCiAgICAgIGlmIChhcnJheS5sZW5ndGggPT0gMCkgew0KICAgICAgICByZXR1cm4gLTENCiAgICAgIH0NCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGFycmF5W2ldKSA9PSBKU09OLnN0cmluZ2lmeShpdGVtKSkgew0KICAgICAgICAgIHJldHVybiBpDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiAtMQ0KICAgIH0sDQogICAgLy/ngrnlh7vliJfooajmn5DkuIDkuKrlpI3pgInmoYbml7bop6blj5ENCiAgICBvblRhYmxlU2VsZWN0KHJvd3MsIHJvdykgew0KICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSBmYWxzZQ0KICAgICAgLy/liKTmlq3ngrnlh7vliJfooajmlbDmja7ml7blpI3pgInmoYbmmK/lkKbli77pgIkgIHNlbGVjdGVk77yadHJ1ZeS4jeWLvumAie+8jGZhbHNl5Yu+6YCJDQogICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTENCiAgICAgIGlmIChzZWxlY3RlZCkgew0KICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IHRydWUNCiAgICAgICAgbGV0IHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShyZXMsIDEpDQogICAgICB9DQogICAgfSwNCiAgICAvL+eCueWHu+WIl+ihqOafkOS4gOadoeaVsOaNruaXtuinpuWPkQ0KICAgIG9yZ1Jvd0NsaWNrKHJvdywgY29sdW1uLCBldmVudCkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQuY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0uY2hpbGRyZW5bMF0pLnRyaWdnZXIoJ2NsaWNrJykNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnB1c2gocm93KQ0KICAgICAgfSBlbHNlIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gIT0gMSkgew0KICAgICAgICB0aGlzLmlzQ3VycmVudENoYW5nZSA9IGZhbHNlDQogICAgICAgIC8v5Yik5pat54K55Ye75YiX6KGo5pWw5o2u5pe25aSN6YCJ5qGG5piv5ZCm5Yu+6YCJICBzZWxlY3RlZO+8mnRydWXkuI3li77pgInvvIxmYWxzZeWLvumAiQ0KICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdE9yZ3MgJiYgdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCA+IDAgJiYgdGhpcy5pbmRleEFycmF5KHRoaXMuc2VsZWN0T3Jncywgcm93KSAhPT0gLTENCiAgICAgICAgaWYgKHNlbGVjdGVkKSB7DQogICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAgICAgbGV0IHJlcyA9IHRoaXMuaW5kZXhBcnJheSh0aGlzLnNlbGVjdE9yZ3MsIHJvdykNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSkNCiAgICAgICAgfQ0KICAgICAgICB0aGlzLiRyZWZzLm9yZ1RhYmxlLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3cpDQogICAgICB9DQogICAgfSwNCiAgICAvL+WIl+ihqOWkjemAieahhuacieaUueWPmOaXtuinpuWPkQ0KICAgIG9yZ1RhYmxlU2VsZWN0aW9uKHNlbGVjdGlvbikgew0KICAgICAgLy/lhajpgInnmoTmg4XlhrXnibnmrorlpITnkIYo5Li65LqG5LiO5Y6f5pys5Yqf6IO96YC76L6R5LiN5Yay56qBLOWFiOWkjeWItuS4gOS7veaXp+eahOmAieS4reaVsOaNri7nhLblkI7mi7/liLDlhajpgInkuovku7bkuK3ljrvorqHnrpcpDQogICAgICB0aGlzLm9sZHNlbGVjdE9yZ3MgPSBfLmNsb25lRGVlcCh0aGlzLnNlbGVjdE9yZ3MpDQogICAgICAvL+WkmumAiQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSAhPSAxICYmICF0aGlzLmlzQ3VycmVudENoYW5nZSkgew0KICAgICAgICBpZiAoc2VsZWN0aW9uICYmIHNlbGVjdGlvbi5sZW5ndGggPiAwKSB7DQogICAgICAgICAgaWYgKHNlbGVjdGlvbi5sZW5ndGggPT0gMSAmJiAoIXRoaXMuc2VsZWN0T3JncyB8fCB0aGlzLnNlbGVjdE9yZ3MubGVuZ3RoID09IDApKSB7DQogICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MgPSBzZWxlY3Rpb24NCiAgICAgICAgICB9IGVsc2UgaWYgKCghdGhpcy5zZWxlY3RPcmdzIHx8IHRoaXMuc2VsZWN0T3Jncy5sZW5ndGggPT0gMCkgJiYgc2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdDQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3IgKGxldCBpID0gc2VsZWN0aW9uLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNDdXJyZW50Q2hhbmdlICYmIHNlbGVjdGlvbi5sZW5ndGggPj0gMTApIHsNCiAgICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RPcmdzKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3JncyA9IFtdDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBmb3IgKGxldCB1ID0gdGhpcy5zZWxlY3RPcmdzLmxlbmd0aCAtIDE7IHUgPj0gMDsgdS0tKSB7DQogICAgICAgICAgICAgICAgbGV0IHJlcyA9IHRoaXMuaW5kZXhBcnJheShzZWxlY3Rpb24sIHRoaXMuc2VsZWN0T3Jnc1t1XSkNCiAgICAgICAgICAgICAgICBpZiAocmVzICE9IC0xKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKHJlcywgMSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0T3Jncy5wdXNoKHNlbGVjdGlvbltpXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNlbGVjdGlvbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgew0KICAgICAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3MucHVzaChzZWxlY3Rpb25baV0pDQogICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICBkaWFsb2dDb25maXJtKCkgew0KICAgICAgdGhpcy5xdWVyeVBhcmFtID0gJycNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSBmYWxzZQ0KICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkNCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKQ0KICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImRpYWxvZy9zZXREaWFsb2dEYXRhIiwgW10pOw0KICAgIH0sDQogICAgLy/ph43nva4NCiAgICByZXNldCgpIHsNCiAgICAgIHRoaXMucXVlcnlQYXJhbXMuZm9yRWFjaChwYXJhbU9iaiA9PiB7DQogICAgICAgIGZvciAobGV0IGtleSBpbiBwYXJhbU9iaikgew0KICAgICAgICAgIHRoaXMucXVlcnlQYXJhbXNba2V5XSA9ICcnDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICAvL+e7hOWQiOagkemHjee9rg0KICAgICAgbGV0IG5vZGVzID0gdGhpcy4kcmVmcy5jb21iaW5hdGlvblRyZWUuc3RvcmUubm9kZXNNYXA7DQogICAgICBmb3IobGV0IGtleSBpbiBub2Rlcyl7DQogICAgICAgIG5vZGVzW2tleV0uZXhwYW5kZWQgPSBmYWxzZTsNCiAgICAgIH0NCiAgICAgIHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLnNwbGljZSgwKTsNCiAgICAgIHRoaXMuc2VhcmNoKHRydWUpDQogICAgfSwNCiAgICAvL+afpeivog0KICAgIHNlYXJjaChyZXNldFBhZ2ludGlvbikgew0KICAgICAgbGV0IHF1ZXJ5cyA9IFtdIC8v5p+l6K+i5p2h5Lu2DQogICAgICBsZXQgcXVlcnlGaWx0ZXIgPSB7fQ0KICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMucGFnaW5hdGlvbikgPT0gJ3t9Jykgew0KICAgICAgICB0aGlzLnBhZ2luYXRpb24gPSB7cGFnZTogJzEnLCBwYWdlU2l6ZTogJzEwJywgc2hvd1RvdGFsOiAndHJ1ZSd9DQogICAgICB9DQogICAgICBsZXQgcGFnZUJlYW4gPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbn0NCiAgICAgIGlmIChyZXNldFBhZ2ludGlvbikgew0KICAgICAgICBwYWdlQmVhbi5wYWdlQmVhbiA9IHtwYWdlOiAnMScsIHBhZ2VTaXplOiAnMTAnLCBzaG93VG90YWw6ICd0cnVlJ30NCiAgICAgIH0NCiAgICAgIC8v55So5oi36L6T5YWl55qEDQogICAgICBpZiAodGhpcy5xdWVyeVBhcmFtcy5sZW5ndGggIT0gMCAmJiB0aGlzLnF1ZXJ5UGFyYW1zWzBdICE9ICcnKSB7DQogICAgICAgIHRoaXMuY29uZGl0aW9uQmluZC5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gew0KICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkLA0KICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnlQYXJhbXNbaXRlbS5maWVsZF0sDQogICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICB9KQ0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgLy/lj4LmlbDkvKDlhaXnmoTmn6Xor6Lmi7zmjqUNCiAgICAgIGlmICh0aGlzLnBhcmFtKSB7DQogICAgICAgIGNvbnN0IHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpDQogICAgICAgIHRoaXMucGFyYW0uZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICBwcm9wZXJ0eTogaXRlbS5maWVsZCwNCiAgICAgICAgICAgIHZhbHVlOiB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgaXRlbS5iaW5kKSwNCiAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICBvcGVyYXRpb246ICdMSUtFJywNCiAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgIH0pDQogICAgICAgIH0pDQogICAgICB9DQogICAgICAvL+adpeiHque7hOWQiOWvueivneahhueahA0KICAgICAgaWYodGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMgJiYgdGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXMubGVuZ3RoICE9IDApew0KICAgICAgICBmb3IobGV0IGkgPSAwIDsgaSA8IHRoaXMuY29tYmluYXRpb25UcmVlUXVlcnlzLmxlbmd0aCA7IGkrKyl7DQogICAgICAgICAgcXVlcnlzLnB1c2godGhpcy5jb21iaW5hdGlvblRyZWVRdWVyeXNbaV0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAocXVlcnlzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgcXVlcnlGaWx0ZXIgPSB0aGlzLmhhbmRsZVBvc3REYXRhKHtwYWdlQmVhbjogcGFnZUJlYW4ucGFnZUJlYW4sIHF1ZXJ5c30pOw0KICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5wYWdlQmVhbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvZ2V0bGlzdEpzb24nLCB0aGlzLmN1c3RvbURpYWxvZykudGhlbigoKSA9PiB7DQogICAgICAgICAgdGhpcy5jaGVja0xpc3QoKQ0KICAgICAgICB9KQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cucGFnZUJlYW4gPSBwYWdlQmVhbg0KICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL2dldGxpc3RKc29uJywgdGhpcy5jdXN0b21EaWFsb2cpLnRoZW4oKCkgPT4gew0KICAgICAgICAgIHRoaXMuY2hlY2tMaXN0KCkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICB9LA0KICAgIC8vIOWkhOeQhlBPU1Tor7fmsYLml7bnmoTlj4LmlbANCiAgICBoYW5kbGVQb3N0RGF0YSAocXVlcnlGaWx0ZXIpIHsNCiAgICAgICAgaWYgKCF0aGlzLmN1c3RvbURpYWxvZy5kYXRhUGFyYW0gfHwgdGhpcy5jdXN0b21EaWFsb2cuZGF0YVBhcmFtLmNvbnN0cnVjdG9yICE9IFN0cmluZykgew0KICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5RmlsdGVyOw0KICAgICAgICB9DQogICAgICAgIC8vIOaehOW7uuS4iuS4i+aWh+aVsOaNruWvueixoQ0KICAgICAgICBsZXQgY3R4ID0ge307DQogICAgICAgIHF1ZXJ5RmlsdGVyICYmDQogICAgICAgICAgICBxdWVyeUZpbHRlci5xdWVyeXMuZm9yRWFjaChlbGVtZW50ID0+IHsNCiAgICAgICAgICAgICAgICBjdHhbZWxlbWVudC5wcm9wZXJ0eV0gPSBlbGVtZW50LnZhbHVlOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIGNvbnN0IGV4cCA9IGhvdGVudFVpVXRpbHMucGFyc2VFeHAodGhpcy5jdXN0b21EaWFsb2cuZGF0YVBhcmFtLCBjdHgpOw0KICAgICAgICB0cnkgew0KICAgICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwKTsNCiAgICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICAgICAgQ3VzdG9tUXVlcnkuX3Rocm93RXhjZXB0aW9uKGBQT1NU5Y+C5pWw5LiN5piv5pyJ5pWI55qESlNPTuagvOW8jyR7cXVlcnkuZGF0YVBhcmFtfWApOw0KICAgICAgICB9DQogICAgfSwNCiAgICBhc3luYyBkb1F1ZXJ5KHBhcmFtKSB7DQogICAgICBsZXQgcGFyYW1Mb2FkRGF0YSA9IFtdDQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgLy/ojrflj5blhbPogZTmn6Xor6Lnu5HlrprnmoTooajljZXlj4LmlbANCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW0uY29uZGl0aW9uZmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgaWYgKHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCAhPSAnJykgew0KICAgICAgICAgIGxldCBiaW5kVmFsID0gdXRpbHMuZ2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLmNvbmRpdGlvbmZpZWxkW2ldLmZpZWxkUGF0aCwgbnVsbCkNCiAgICAgICAgICBsZXQgb2JqID0ge2tleTogcGFyYW0uY29uZGl0aW9uZmllbGRbaV0uZmllbGQsIHZhbHVlOiBiaW5kVmFsfQ0KICAgICAgICAgIHBhcmFtTG9hZERhdGEucHVzaChvYmopDQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgbGV0IHF1ZXJ5VXJsID0gcGFyYW0uZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICcke2Zvcm19L2Zvcm0vY3VzdG9tUXVlcnkvdjEvZG9RdWVyeT9hbGlhcz0nICsgcGFyYW0uYWxpYXMgKyAnJnBhZ2U9MScgOiBwYXJhbS51cmwNCiAgICAgIGxldCByZXF1ZXN0TWV0aG9kID0gJ1BPU1QnDQogICAgICAvL+WmguaenOWFs+iBlOaVsOaNruWIl+ihqOafpeivouaVsOaNruS4jeaYr+aVsOaNrua6kOWImeivt+axguaWueazleS4unJlc3RmdWzphY3nva7nmoTor7fmsYLmlrnlvI8NCiAgICAgIGlmIChwYXJhbS5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgIHJlcXVlc3RNZXRob2QgPSBwYXJhbS5yZXF1ZXN0VHlwZQ0KICAgICAgfQ0KICAgICAgLy/mn6Xor6LmlbDmja4NCiAgICAgIHJlcS5yZXF1ZXN0KHt1cmw6IHF1ZXJ5VXJsLCBtZXRob2Q6IHJlcXVlc3RNZXRob2QsIGRhdGE6IHBhcmFtTG9hZERhdGF9KS50aGVuKHJlcyA9PiB7DQogICAgICAgIC8v5Yik5pat5piv5ZCm5pyJ5YWz6IGU5p+l6K+i5pWw5o2u6L+U5ZueDQogICAgICAgIGlmIChyZXMuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgIGZvciAobGV0IGlvID0gMDsgaW8gPCBwYXJhbS5yZXN1bHRmaWVsZC5sZW5ndGg7IGlvKyspIHsNCiAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoICE9ICcnKSB7DQogICAgICAgICAgICAgIGxldCB2YWwgPSAnJw0KICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcy5kYXRhLnJvd3MubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocmVzLmRhdGEucm93c1tqXVtwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRdKSB7DQogICAgICAgICAgICAgICAgICB2YWwgPSB2YWwgKyByZXMuZGF0YS5yb3dzW2pdW3BhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZF0gKyAnLCcNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgdmFsID0gdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSkNCiAgICAgICAgICAgICAgbGV0IHBhdGhBcnIgPSBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsNCiAgICAgICAgICAgICAgICAvL+S4u+ihqA0KICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIG51bGwpDQogICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0aEFyci5sZW5ndGggPT0gNCkgew0KICAgICAgICAgICAgICAgIC8v5a2Q6KGoDQogICAgICAgICAgICAgICAgbGV0IHN1YkRhdGEgPSBwSW5zdC5kYXRhW3BhdGhBcnJbMV1dW3BhdGhBcnJbMl1dDQogICAgICAgICAgICAgICAgaWYgKHN1YkRhdGEubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5rKh5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICBsZXQgc3ViVGFiTmFtZSA9IHBhdGhBcnJbMl0ucmVwbGFjZSgnc3ViXycsICcnKQ0KICAgICAgICAgICAgICAgICAgLy/lvpfliLDlrZDooajnmoTmiYDmnInlrZfmrrUNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJJbml0RGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV0uaW5pdERhdGFbc3ViVGFiTmFtZV0gfHwge30NCiAgICAgICAgICAgICAgICAgIC8v5oqK5pWw57uE6YeM6Z2i55qE5YC85Li6IG51bGwg6L2s5o2i5Li656m65a2X56ym5LiyDQogICAgICAgICAgICAgICAgICBsZXQgc3RyID0gSlNPTi5zdHJpbmdpZnkoc3ViSW5pdERhdGEpLnJlcGxhY2UoL251bGwvZywgJyIiJykNCiAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhID0gSlNPTi5wYXJzZShzdHIpDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc3ViRGF0YSkgew0KICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtmeihqOaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ3N1Yl8nKSA9PSAwICYmIHN1YkRhdGFba2V5XS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgICAgc3ViRGF0YVtrZXldID0gW10gLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAvL+eCuea3u+WKoOaXtuWIpOaWreimgeaWsOWinuWtkOihqOiusOW9leS4reeahOWtl+auteaYr+WQpuacieWAvA0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViRGF0YVtrZXldKSB7DQogICAgICAgICAgICAgICAgICAgICAgc3ViRGF0YVtrZXldID0gJycgLy/mnInliJnmuIXnqboNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgLy/mlrDlop7kuIDmnaHmlbDmja4NCiAgICAgICAgICAgICAgICAgIHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0ucHVzaChzdWJEYXRhKQ0KICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXJhbS5yZXN1bHRmaWVsZFtpb10uZmllbGRQYXRoLCB2YWwsIDApDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIC8v5a2Q6KGo5pyJ5pWw5o2u55qE5oOF5Ya1DQogICAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgICAgLy/lr7nor53moYblhbPogZTmn6Xor6Lov5Tlm57nmoTlgLzotYvlgLznu5nnu5HlrprnmoTlrZfmrrUNCiAgICAgICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvXS5maWVsZFBhdGgsIHZhbCwgcCkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgLy/msqHmnInov5Tlm57nmoTlgLzliJnmuIXnqboNCiAgICAgICAgICAvL+iOt+WPluWFs+iBlOafpeivoui/lOWbnueahOihqOWNleWPguaVsA0KICAgICAgICAgIGZvciAobGV0IGlvcCA9IDA7IGlvcCA8IHBhcmFtLnJlc3VsdGZpZWxkLmxlbmd0aDsgaW9wKyspIHsNCiAgICAgICAgICAgIGlmIChwYXJhbS5yZXN1bHRmaWVsZFtpb3BdLmZpZWxkUGF0aCAhPSAnJykgew0KICAgICAgICAgICAgICBsZXQgcGF0aEFyciA9IHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLnNwbGl0KCcuJykNCiAgICAgICAgICAgICAgaWYgKHBhdGhBcnIubGVuZ3RoID09IDMpIHsNCiAgICAgICAgICAgICAgICAvL+S4u+ihqA0KICAgICAgICAgICAgICAgIC8v6LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsIHBhcmFtLnJlc3VsdGZpZWxkW2lvcF0uZmllbGRQYXRoLCAnJywgbnVsbCkNCiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXRoQXJyLmxlbmd0aCA9PSA0KSB7DQogICAgICAgICAgICAgICAgLy/lrZDooagNCiAgICAgICAgICAgICAgICBsZXQgc3ViRGF0YSA9IHBJbnN0LmRhdGFbcGF0aEFyclsxXV1bcGF0aEFyclsyXV0NCiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHN1YkRhdGEubGVuZ3RoOyBwKyspIHsNCiAgICAgICAgICAgICAgICAgIC8v5a+56K+d5qGG5YWz6IGU5p+l6K+i6L+U5Zue55qE5YC86LWL5YC857uZ57uR5a6a55qE5a2X5q61DQogICAgICAgICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGFyYW0ucmVzdWx0ZmllbGRbaW9wXS5maWVsZFBhdGgsICcnLCBwKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9LA0KICAgIC8vIOWQjOatpemAieaLqee7k+aenA0KICAgIHN5bmNJbnB1dFZhbHVlKCkgew0KICAgICAgbGV0IHRoaXNJbmRleCA9IG51bGwgLy/lvZPliY3mlbDmja7miYDlnKjkuIvmoIcNCiAgICAgIGxldCBwYXJlbnRJbmRleCA9IG51bGwgLy/niLboioLngrnmiYDlnKjkuIvmoIcNCiAgICAgIGlmICh0aGlzLiRlbCkgew0KICAgICAgICB0aGlzSW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpcy4kZWwsICdkYXRhLWluZGV4JykNCiAgICAgICAgcGFyZW50SW5kZXggPSB1dGlscy5nZXRTb21lQXR0cmlidXRlRnJvbVBhcmVudEVsZW1lbnQodGhpcy4kcGFyZW50LiRlbCwgJ2RhdGEtaW5kZXgnKQ0KICAgICAgfQ0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpDQogICAgICAvL+aLv+WIsOi/lOWbnueahOWtl+autQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPSB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gcmV0dXJuU3RyW2ldLmZpZWxkLnRvTG93ZXJDYXNlKCkgOiByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9IHRoaXMuY3VzdG9tRGlhbG9nLmRzVHlwZSA9PSAnZGF0YVNvdXJjZScgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b0xvd2VyQ2FzZSgpIDogcmV0dXJuU3RyW2ldLmNvbW1lbnQNCiAgICAgIH0NCiAgICAgIGNvbnN0IHRoaXNfID0gdGhpcw0KICAgICAgdmFyIHMgPSB0aGlzLnNlbGVjdE9yZ3MNCiAgICAgIHRoaXMuc2hvd0RhdGEgPSBbLi4udGhpcy5zZWxlY3RPcmdzXQ0KICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwgPSBbLi4udGhpcy5zZWxlY3RPcmdzXQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICBzID0gdGhpcy5zZWxlY3RPcmdzDQogICAgICB9DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgbGV0IHNGaWVsZCA9IHNbMF1bZmllbGRbaV1dID09PSB1bmRlZmluZWQgPyAnJyA6IHNbMF1bZmllbGRbaV1dDQogICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzRmllbGQpDQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBlbmNvZGVTdHIgKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdmFyIHRlbXAgPSAnJw0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgbGV0IGVuY29kZVN0ciA9IGVuY29kZVVSSUNvbXBvbmVudChzW2ldW2ZpZWxkW2pdXSkNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtqXSArICciOiInICsgZW5jb2RlU3RyICsgJyIsJw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZiAodGVtcCAhPSAnJykgew0KICAgICAgICAgICAgdGVtcCA9ICd7JyArIHRlbXAuc3Vic3RyaW5nKDAsIHRlbXAubGVuZ3RoIC0gMSkgKyAnfScNCiAgICAgICAgICB9DQogICAgICAgICAgc3RyLnB1c2godXRpbHMucGFyc2VUb0pzb24odGVtcCkpDQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIC8vIHRoaXMuJGVtaXQoImlucHV0IiwgSlNPTi5zdHJpbmdpZnkoc3RyKSk7DQogICAgICBjb25zdCBwSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKQ0KICAgICAgY29uc3QgX3RoaXMgPSB0aGlzDQogICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgIHZhciB2YWwgPSAnJw0KICAgICAgICB2YXIgZnJvbSA9ICcnDQogICAgICAgIGlmIChfdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdyZXN0ZnVsJykgew0KICAgICAgICAgIGZyb20gPSBjb24uZnJvbQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b0xvd2VyQ2FzZSgpDQogICAgICAgIH0NCiAgICAgICAgc3RyLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgdmFsICs9IGRlY29kZVVSSUNvbXBvbmVudChpdGVtW2Zyb21dKSArICcsJw0KICAgICAgICB9KQ0KICAgICAgICBpZiAodGhpcy5hdHRlciA9PSAnZGF0YS4nICsgY29uWyd0YXJnZXQnXVswXSkgew0KICAgICAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpDQogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwsIHRoaXNJbmRleCkNCiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmF0dGVyID09ICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdKSB7DQogICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdzZWFyY2hGb3JtLicgKyBjb25bJ3RhcmdldCddWzBdLCB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGggLSAxKSwgdGhpc0luZGV4KQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGxldCBjb25maWdBdHRyPSBjb25bJ3RhcmdldCddWzBdLnNwbGl0KCIuIikNCiAgICAgICAgICBsZXQgcGF0aD0gY29uWyd0YXJnZXQnXVswXTsNCiAgICAgICAgICBpZiAoY29uZmlnQXR0ci5sZW5ndGg9PTQgJiYgcGFyZW50SW5kZXg+PTApey8v5a2Z6KGo5pWw5o2u6LWL5YC8DQogICAgICAgICAgICBwYXRoPWNvbmZpZ0F0dHJbMF0rIi4iK2NvbmZpZ0F0dHJbMV0rIlsiK3BhcmVudEluZGV4KyJdLiIrY29uZmlnQXR0clsyXSsiLiIrY29uZmlnQXR0clszXTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHBJbnN0LmRhdGEpew0KICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdkYXRhLicgK3BhdGgsdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCkNCiAgICAgICAgICB9IGVsc2V7DQogICAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ21vZGVsLicgK3BhdGgsdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICAvL+WIpOaWreWvueivneahhuaYr+WQpue7keWumuS6huWFs+iBlOafpeivog0KICAgICAgbGV0IGN1c3RRdWVyeUpzb24gPSB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5jdXN0UXVlcnlKc29uDQogICAgICBpZiAoY3VzdFF1ZXJ5SnNvbi5sZW5ndGggPiAwKSB7DQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3VzdFF1ZXJ5SnNvbi5sZW5ndGg7IGkrKykgew0KICAgICAgICAgIGlmIChjdXN0UXVlcnlKc29uW2ldLmNvbmRpdGlvbmZpZWxkLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgIHRoaXMuZG9RdWVyeShjdXN0UXVlcnlKc29uW2ldKQ0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbJyArIGN1c3RRdWVyeUpzb25baV0uY29tbWVudCArICdd5YWz6IGU5p+l6K+i5Y+W5YC85Y+C5pWw5pyq57uR5a6a6KGo5Y2V5a2X5q61JykNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5Y+W5raI5oyJ6ZKuDQogICAgZGlhbG9nQ2FuY2VsKCkgew0KICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICB0aGlzXy5xdWVyeVBhcmFtID0gJycNCiAgICAgIHRoaXNfLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkudGhlbigoKSA9PiB7DQogICAgICAgIHRoaXNfLmN1c3RvbURpYWxvZ1Nob3dMaXN0ID0gZmFsc2UNCiAgICAgICAgLy/liKTmlq3mmK/lkKbmmK/ngrnlh7vkuobnoa7orqTlho3ngrnlh7vlj5bmtojnmoQgIGlucHV0VmFs5rKh5pyJ5YC85YiZ6KGo56S655u05o6l54K55Ye755qE5Y+W5raIDQogICAgICAgIGlmICghdGhpc18uaW5wdXRWYWwpIHsNCiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gW10NCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICB0aGlzXy5zZWxlY3RPcmdzID0gWy4uLnRoaXNfLnNob3dEYXRhXQ0KICAgICAgICAgIHRoaXMuY2hlY2tCb3hEYXRhQWxsID0gWy4uLnRoaXNfLnNlbGVjdE9yZ3NdDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgfSwNCiAgICBkaWFsb2dUcmVlQ29uZmlybSgpIHsNCiAgICAgIHRoaXMuY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpDQogICAgICBsZXQgdGhpc0luZGV4ID0gbnVsbCAvL+W9k+WJjeaVsOaNruaJgOWcqOS4i+aghw0KICAgICAgbGV0IHBhcmVudEluZGV4ID0gbnVsbCAvL+eItuiKgueCueaJgOWcqOS4i+aghw0KICAgICAgaWYgKHRoaXMuJGVsKSB7DQogICAgICAgIHRoaXNJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRlbCwgJ2RhdGEtaW5kZXgnKQ0KICAgICAgICBwYXJlbnRJbmRleCA9IHV0aWxzLmdldFNvbWVBdHRyaWJ1dGVGcm9tUGFyZW50RWxlbWVudCh0aGlzLiRwYXJlbnQuJGVsLCAnZGF0YS1pbmRleCcpDQogICAgICB9DQogICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZGlhbG9nL3NldERpYWxvZ0RhdGEnLCBbXSkNCiAgICAgIHZhciByZXR1cm5TdHIgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLnJlc3VsdGZpZWxkKQ0KICAgICAgdmFyIGZpZWxkID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBjb21tZW50ID0gbmV3IEFycmF5KFtyZXR1cm5TdHIubGVuZ3RoXSkNCiAgICAgIHZhciBzdHIgPSBbXQ0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXR1cm5TdHIubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgZmllbGRbaV0gPSByZXR1cm5TdHJbaV0uZmllbGQNCiAgICAgICAgY29tbWVudFtpXSA9IHJldHVyblN0cltpXS5jb21tZW50DQogICAgICB9DQogICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuc2VsZWN0TnVtID09PSAxKSB7DQogICAgICAgIHZhciBub2RlcyA9IHRoaXMucHJvcHNEYXRhWzBdDQogICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tZW50Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1tmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gJycpIHsNCiAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICB9DQogICAgICAgIHN0ci5wdXNoKHV0aWxzLnBhcnNlVG9Kc29uKHRlbXApKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5wcm9wc0RhdGENCiAgICAgICAgbm9kZXMuZm9yRWFjaCgoaXRlbSwgaykgPT4gew0KICAgICAgICAgIHZhciB0ZW1wID0gJycNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRlbXAgKz0gJyInICsgY29tbWVudFtpXSArICciOiInICsgbm9kZXNbZmllbGRbaV1dICsgJyIsJw0KICAgICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyBub2Rlc1trXVtmaWVsZFtpXV0gKyAnIiwnDQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICh0ZW1wICE9ICcnKSB7DQogICAgICAgICAgICB0ZW1wID0gJ3snICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICd9Jw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaCh1dGlscy5wYXJzZVRvSnNvbih0ZW1wKSkNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIGNvbnN0IHBJbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpDQogICAgICB0aGlzLmN1c3RkaWFsb2cuY3VzdERpYWxvZy5tYXBwaW5nQ29uZi5mb3JFYWNoKGNvbiA9PiB7DQogICAgICAgIHZhciB2YWwgPSAnJw0KICAgICAgICBzdHIuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICB2YWwgKz0gaXRlbVtjb24uZnJvbV0gKyAnLCcNCiAgICAgICAgfSkNCiAgICAgICAgaWYgKHRoaXMuYXR0ZXIgPT0gJ2RhdGEuJyArIGNvblsndGFyZ2V0J11bMF0pIHsNCiAgICAgICAgICB1dGlscy5zZXRWYWx1ZUJ5UGF0aChwSW5zdCwgJ2RhdGEuJyArIGNvblsndGFyZ2V0J11bMF0sIHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpDQogICAgICAgIH0gZWxzZSBpZiAodGhpcy5hdHRlciA9PSAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSkgew0KICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnc2VhcmNoRm9ybS4nICsgY29uWyd0YXJnZXQnXVswXSwgdmFsLnN1YnN0cmluZygwLCB2YWwubGVuZ3RoIC0gMSksIHRoaXNJbmRleCkNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBsZXQgY29uZmlnQXR0cj0gY29uWyd0YXJnZXQnXVswXS5zcGxpdCgiLiIpDQogICAgICAgICAgbGV0IHBhdGg9IGNvblsndGFyZ2V0J11bMF07DQogICAgICAgICAgaWYgKGNvbmZpZ0F0dHIubGVuZ3RoPT00ICYmIHBhcmVudEluZGV4Pj0wKXsvL+WtmeihqOaVsOaNrui1i+WAvA0KICAgICAgICAgICAgcGF0aD1jb25maWdBdHRyWzBdKyIuIitjb25maWdBdHRyWzFdKyJbIitwYXJlbnRJbmRleCsiXS4iK2NvbmZpZ0F0dHJbMl0rIi4iK2NvbmZpZ0F0dHJbM107DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmIChwSW5zdC5kYXRhKXsNCiAgICAgICAgICAgIHV0aWxzLnNldFZhbHVlQnlQYXRoKHBJbnN0LCAnZGF0YS4nICtwYXRoLHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpDQogICAgICAgICAgfSBlbHNlew0KICAgICAgICAgICAgdXRpbHMuc2V0VmFsdWVCeVBhdGgocEluc3QsICdtb2RlbC4nICtwYXRoLHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCAtIDEpLCB0aGlzSW5kZXgpDQogICAgICAgICAgfQ0KDQogICAgICAgIH0NCiAgICAgIH0pDQogICAgICAvL3RoaXMuJGVtaXQoImlucHV0IiwgSlNPTi5zdHJpbmdpZnkoc3RyKSk7DQogICAgICB0aGlzLnNob3dEYXRhID0gWy4uLnRoaXMucHJvcHNEYXRhXSAvL+WbnuaYvueahOWAvA0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IGZhbHNlDQogICAgfSwNCiAgICBkaWFsb2dDYW5jZWxUcmVlKCkgew0KICAgICAgdGhpcy4kc3RvcmUuZGlzcGF0Y2goJ2RpYWxvZy9zZXREaWFsb2dEYXRhJywgW10pDQogICAgICB0aGlzLmN1c3RvbURpYWxvZ1Nob3dUcmVlID0gZmFsc2UNCiAgICB9LA0KICAgIGdldENoZWNrZWQoZGF0YSwgY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdDQogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSkNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHRoaXMucHJvcHNEYXRhID0gdGhpcy4kcmVmcy50cmVlLmdldENoZWNrZWROb2RlcygpDQogICAgICB9DQogICAgfSwNCiAgICB0cmVlQ2xpY2soZGF0YSwgbiwgaSkgew0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB0aGlzLnByb3BzRGF0YSA9IFtdDQogICAgICAgIHRoaXMucHJvcHNEYXRhLnB1c2goZGF0YSkNCiAgICAgIH0NCiAgICB9LA0KICAgIGNsZWFyQWxsU2VsZWN0T3JncygpIHsNCiAgICAgIHRoaXMuc2VsZWN0T3JncyA9IG51bGwNCiAgICAgIHRoaXMuJHJlZnMub3JnVGFibGUuY2xlYXJTZWxlY3Rpb24oKQ0KICAgIH0sDQogICAgcmVtb3ZlU2VsZWN0T3JnKGl0ZW0pIHsNCiAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5zZWxlY3ROdW0gPT09IDEpIHsNCiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCAnJykNCiAgICAgICAgdGhpcy5zZWxlY3RPcmdzLnNwbGljZShpdGVtLCAxKQ0KICAgICAgICB0aGlzLnNob3dEYXRhLnNwbGljZShpdGVtLCAxKQ0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdGhpcy5pbnB1dFZhbC5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgLy8gbGV0IHJlbW92ZUlkID0gdGhpcy5zaG93RGF0YVtpdGVtXTsNCiAgICAgICAgLy/moJHlvaINCiAgICAgICAgaWYgKHRoaXMucHJvcHNEYXRhLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICB0aGlzLnByb3BzRGF0YS5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgfQ0KICAgICAgICBpZiAodGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdGhpcy5zaG93RGF0YS5zcGxpY2UoaXRlbSwgMSkNCiAgICAgICAgfQ0KICAgICAgICAvL+WIl+ihqA0KICAgICAgICBpZiAodGhpcy5zZWxlY3RPcmdzICE9IG51bGwpIHsNCiAgICAgICAgICB0aGlzLnNlbGVjdE9yZ3Muc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgICAgdGhpcy5jaGVja0JveERhdGFBbGwuc3BsaWNlKGl0ZW0sIDEpDQogICAgICAgICAgdGhpcy5zZWxlY3RPcmdzLmZvckVhY2gocm93ID0+IHsNCiAgICAgICAgICAgIC8vIGlmKGl0ZW0uaWQgPT1yZW1vdmVJZCApew0KICAgICAgICAgICAgdGhpcy5pc0N1cnJlbnRDaGFuZ2UgPSB0cnVlDQogICAgICAgICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihyb3csIGZhbHNlKQ0KICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgIH0pDQogICAgICAgIH0NCiAgICAgICAgdGhpcy5jYWxhY0lucHV0U3VmZml4SGVpZ2h0KCkNCiAgICAgICAgbGV0IHZhbHVlID0gJycNCiAgICAgICAgdGhpcy5pbnB1dFZhbC5mb3JFYWNoKHZhbCA9PiB7DQogICAgICAgICAgdmFsdWUgKz0gdmFsLnZhbHVlICsgJywnDQogICAgICAgIH0pDQogICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoIC0gMSkNCiAgICAgICAgfQ0KICAgICAgICBpZiAodmFsdWUgIT0gJycpIHsNCiAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgJ3x8JyArIEpTT04uc3RyaW5naWZ5KHRoaXMuc2hvd0RhdGEpDQogICAgICAgIH0NCiAgICAgICAgdGhpcy4kZW1pdCgnaW5wdXQnLCB2YWx1ZSkNCiAgICAgIH0NCiAgICAgIHRoaXMuc3luY0lucHV0VmFsdWUoKQ0KICAgIH0sDQogICAgY2FsYWNJbnB1dFN1ZmZpeEhlaWdodCgpIHsNCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICBpZiAoIXRoaXMuJHJlZnMudGFnU3BhbnMpIHJldHVybg0KICAgICAgICBpZiAodGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQpIHsNCiAgICAgICAgICB0aGlzLmlucHV0U3VmZml4SGVpZ2h0ID0gdGhpcy4kcmVmcy50YWdTcGFucy5vZmZzZXRIZWlnaHQgKyA1DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdGhpcy5pbnB1dFN1ZmZpeEhlaWdodCA9IDMwDQogICAgICAgIH0NCiAgICAgICAgLy8g6Kem5Y+R6aqM6K+BDQogICAgICAgIHRoaXMuJHZhbGlkYXRvci52YWxpZGF0ZSgpDQogICAgICB9LCAwKQ0KICAgIH0sDQogICAgY3VzdG9tRGlhbG9nU2hvdyhwYWdlUGFyYW0pIHsNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nU2hvd0xpc3QgPSB0cnVlDQogICAgICB0aGlzLmN1c3RvbURpYWxvZyA9IHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cNCiAgICAgIHRoaXMuY3VzdG9tRGlhbG9nLnF1ZXJ5VXJsID0NCiAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJw0KICAgICAgICAgID8gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0TGlzdERhdGE/YWxpYXM9JyArDQogICAgICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5hbGlhcyArDQogICAgICAgICAgICAnJm1hcFBhcmFtPScgKw0KICAgICAgICAgICAgKHRoaXMuY3VzdG9tRGlhbG9nLm1hcFBhcmFtID8gdGhpcy5jdXN0b21EaWFsb2cubWFwUGFyYW0gOiAnJykNCiAgICAgICAgICA6IHRoaXMuY3VzdG9tRGlhbG9nLnVybA0KICAgICAgaWYgKHRoaXMuZGlhbG9nRGF0YS5sZW5ndGggPCAxKSB7DQogICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGQgPSBKU09OLnBhcnNlKHBhZ2VQYXJhbS5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKQ0KICAgICAgICBpZiAodGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJykgew0KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHRoaXMuZGlzcGxheWZpZWxkW2ldLmZpZWxkID0gdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGlmICh0aGlzLmRpYWxvZ0RhdGEubGVuZ3RoID4gMSkgew0KICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICB9DQogICAgICBpZiAodGhpcy5kaWFsb2dEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZmllbGQubGVuZ3RoID09IDApIHsNCiAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICB0aGlzLmRpc3BsYXlmaWVsZCA9IEpTT04ucGFyc2UocGFnZVBhcmFtLmN1c3RvbURpYWxvZy5kaXNwbGF5ZmllbGQpDQogICAgICAgIGlmICh0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnKSB7DQogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRpc3BsYXlmaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZmllbGRbaV0uZmllbGQgPSB0aGlzLmRpc3BsYXlmaWVsZFtpXS5maWVsZC50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICBjdXN0b21EaWFsb2dUcmVlU2hvdyhwYWdlUGFyYW0pIHsNCiAgICAgIHZhciBjdXN0b21EaWFsb2cgPSB0aGlzLmN1c3RvbURpYWxvZw0KICAgICAgbGV0IG1hcFBhcmFtT2JqID0ge307Ly/mlbDmja7mnaXmupDmmK/mlbDmja7mupDvvIzkuJTmnInliqjmgIHlj4LmlbDkvKDlhaXml7bosIPnlKgNCiAgICAgIGxldCBtYXBQYXJhbSA9ICIiOw0KICAgICAgbGV0IGRlZmF1bHRQVmFsdWUgPSAiIjsvL+eItklE5YC8DQogICAgICBpZih0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZS5sZW5ndGg+MCl7DQogICAgICAgIGZvcihsZXQgaT0wO2k8dGhpcy5jb25kaXRpb25maWVsZFRyZWUubGVuZ3RoO2krKyl7DQogICAgICAgICAgaWYodGhpcy5jb25kaXRpb25maWVsZFRyZWVbaV0uZGVmYXVsdFR5cGU9PSI0Iil7Ly/liqjmgIHkvKDlhaUNCiAgICAgICAgICAgIC8v5b6X5Yiw6L6T5YWl55qE5p2h5Lu25a2X5q615YC8DQogICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbaV0ucGFyYW1WYWw7DQogICAgICAgICAgICBpZiAoIXZhbCkgew0KICAgICAgICAgICAgICBjb250aW51ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5b6X5Yiw5p2h5Lu25a2X5q61S0VZDQogICAgICAgICAgICBsZXQga2V5ID0gdGhpcy5jb25kaXRpb25maWVsZFRyZWVbaV0uZmllbGQ7DQogICAgICAgICAgICBtYXBQYXJhbU9ialtrZXldID0gdmFsOw0KICAgICAgICAgIH1lbHNlIGlmKHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW2ldLmRlZmF1bHRUeXBlPT0iMiIpey8v5Zu65a6a5YC8DQogICAgICAgICAgICAvL+W+l+WIsOi+k+WFpeeahOadoeS7tuWtl+auteWAvA0KICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuY29uZGl0aW9uZmllbGRUcmVlW2ldLmRlZmF1bHRWYWx1ZTsNCiAgICAgICAgICAgIGlmICghdmFsKSB7DQogICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/lvpfliLDmnaHku7blrZfmrrVLRVkNCiAgICAgICAgICAgIGxldCBrZXkgPSB0aGlzLmNvbmRpdGlvbmZpZWxkVHJlZVtpXS5maWVsZDsNCiAgICAgICAgICAgIG1hcFBhcmFtT2JqW2tleV0gPSB2YWw7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmKEpTT04uc3RyaW5naWZ5KG1hcFBhcmFtT2JqKSE9Int9Iil7DQogICAgICAgICAgLy/ojrflj5blr7nor53moYbphY3nva7nmoTniLZJROWtl+autQ0KICAgICAgICAgIGxldCBwaWQgPSBKU09OLnBhcnNlKHRoaXMuY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkucGlkOw0KICAgICAgICAgIGZvcihsZXQgbSBpbiBtYXBQYXJhbU9iail7DQogICAgICAgICAgICBpZihwaWQgPT0gbSl7DQogICAgICAgICAgICAgIGRlZmF1bHRQVmFsdWUgPSBtYXBQYXJhbU9ialttXTsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIG1hcFBhcmFtID0gSlNPTi5zdHJpbmdpZnkobWFwUGFyYW1PYmopOw0KICAgICAgICAgIG1hcFBhcmFtID0gbWFwUGFyYW0uc3Vic3RyaW5nKDEsIG1hcFBhcmFtLmxlbmd0aCAtIDEpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICB2YXIgcmVxdWVzdFR5cGUgPSBjdXN0b21EaWFsb2cuZHNUeXBlID09ICdkYXRhU291cmNlJyA/ICdHRVQnIDogY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlID8gY3VzdG9tRGlhbG9nLnJlcXVlc3RUeXBlIDogJ1BPU1QnDQogICAgICB2YXIgdXJsID0gJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArIHBhZ2VQYXJhbS5hbGlhcyArICcmbWFwUGFyYW09JyArIG1hcFBhcmFtDQogICAgICB2YXIgcGFyYW1zT2JqID0ge30NCiAgICAgIGlmIChjdXN0b21EaWFsb2cuZHNUeXBlICE9ICdkYXRhU291cmNlJykgew0KICAgICAgICB1cmwgPSBjdXN0b21EaWFsb2cudXJsDQogICAgICAgIHZhciB0ZW1wbGF0ZVBhID0gY3VzdG9tRGlhbG9nLmRhdGFQYXJhbQ0KICAgICAgICBpZiAoY3VzdG9tRGlhbG9nLmNvbmRpdGlvbmZpZWxkKSB7DQogICAgICAgICAgdmFyIGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKGN1c3RvbURpYWxvZy5jb25kaXRpb25maWVsZCkNCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbnMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgIHZhciBjb24gPSBjb25kaXRpb25zW2ldDQogICAgICAgICAgICBpZiAocmVxdWVzdFR5cGUgPT0gJ1BPU1QnKSB7DQogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZVBhKSB7DQogICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksIGNvbi5kZWZhdWx0VmFsdWUpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGFyYW1zT2JqW2Nvbi5maWVsZF0gPSBjb24uZGVmYXVsdFZhbHVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHZhciBsakNoYXIgPSB1cmwuaW5kZXhPZignPycpID09IC0xID8gJz8nIDogJyYnDQogICAgICAgICAgICAgIHVybCA9IHVybCArIGxqQ2hhciArIGNvbi5maWVsZCArICc9JyArIGNvbi5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXBsYXRlUGEpIHsNCiAgICAgICAgICAgIHBhcmFtc09iaiA9IEpTT04ucGFyc2UodGVtcGxhdGVQYSkNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHZhciByZXF1ZXN0UGFyYW1zID0ge30NCiAgICAgIHJlcXVlc3RQYXJhbXMucmVxdWVzdFR5cGUgPSByZXF1ZXN0VHlwZQ0KICAgICAgcmVxdWVzdFBhcmFtcy51cmwgPSB1cmwNCiAgICAgIHJlcXVlc3RQYXJhbXMucGFyYW1zT2JqID0gcGFyYW1zT2JqDQogICAgICB0aGlzLnNlYXJjaFRyZWUocmVxdWVzdFBhcmFtcyxkZWZhdWx0UFZhbHVlKQ0KICAgICAgdGhpcy5jdXN0b21EaWFsb2dTaG93VHJlZSA9IHRydWUNCiAgICB9LA0KICAgIC8v5qCR5b2i5p+l6K+iDQogICAgc2VhcmNoVHJlZShyZXF1ZXN0UGFyYW1zLGRlZmF1bHRQVmFsdWUpIHsNCiAgICAgIGNvbnN0IHRoaXNfPXRoaXM7DQogICAgICBsZXQgcXVlcnkgPSByZXF1ZXN0UGFyYW1zLnJlcXVlc3RUeXBlID09ICdQT1NUJz9yZXEucG9zdChyZXF1ZXN0UGFyYW1zLnVybCxyZXF1ZXN0UGFyYW1zLnBhcmFtc09iaik6cmVxLmdldChyZXF1ZXN0UGFyYW1zLnVybCk7DQogICAgICBxdWVyeS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkgew0KICAgICAgICAvL+aYvuekuuWtl+autemFjee9rg0KICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSh0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkKTsNCiAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkOw0KICAgICAgICAvL+aKiuWvueivneahhumFjee9rueahOaYvuekuuWtl+auteaYvuekuuWQjeensOi1i+WAvOe7meagkeW9oueahOaYvuekuuWAvA0KICAgICAgICB0aGlzXy5kZWZhdWx0UHJvcHMubGFiZWw9ZGlzcGxheWZpZWxkLmRpc3BsYXlOYW1lOw0KICAgICAgICB0aGlzXy50cmVlTGlzdCA9IHJlc3BvbnNlLmRhdGE7DQogICAgICAgIC8v5b6X5Yiw6KaB5Yqg6L295qCR55qE5L+h5oGvDQogICAgICAgIGlmKGRlZmF1bHRQVmFsdWUpew0KICAgICAgICAgIGRpc3BsYXlmaWVsZC5wdmFsdWUgPSBkZWZhdWx0UFZhbHVlOw0KICAgICAgICB9DQogICAgICAgIHRoaXNfLnByb3BzMSA9IHRoaXNfLnRvVHJlZURhdGEocmVzcG9uc2UuZGF0YSxkaXNwbGF5ZmllbGQuaWQsZGlzcGxheWZpZWxkLnBpZCxkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWUsIGRpc3BsYXlmaWVsZC5wdmFsdWUgPyBkaXNwbGF5ZmllbGQucHZhbHVlIDogMCk7DQogICAgICB9KTsNCiAgICB9LA0KICAgIC8v5Yqg6L295qCR55qE5L+h5oGvDQogICAgdG9UcmVlRGF0YShkYXRhLCBpZCwgcGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wDQogICAgICByZXR1cm4gdGhpcy50cmFuc2xhdGVEYXRhVG9UcmVlKGRhdGEscGlkLGlkLG5hbWUscHZhbHVlKTsNCiAgICB9LA0KICAgIHRyYW5zbGF0ZURhdGFUb1RyZWUoZGF0YSxwaWQsaWQsbmFtZSxwdmFsdWUpIHsNCiAgICAgICAgLy/miormoJHmlbDmja7mnInlrZDoioLngrnnmoTmlbDmja7lhajpg6jov4fmu6TmjonvvIjlj6rnlZnniLboioLngrnnmoTmlbDmja7vvIkNCiAgICAgICAgbGV0IHBhcmVudHMgPSBkYXRhLmZpbHRlcih2YWx1ZSA9PiB2YWx1ZVtpZF0gPT0gdmFsdWVbcGlkXSB8fCB2YWx1ZVtwaWRdID09IG51bGwgfHwgdmFsdWVbcGlkXSA9PSBwdmFsdWUpOw0KICAgICAgICBpZiAoIXBhcmVudHMpew0KICAgICAgICAgICAgcGFyZW50cyA9IGRhdGEuZmlsdGVyKHZhbHVlID0+IHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmIHZhbHVlW3BpZF0gIT0gbnVsbCAmJiB2YWx1ZVtpZF0gIT0gdmFsdWVbcGlkXSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHBhcmVudHMNCiAgICB9LA0KICAgIGxvYWRUcmVlKG5vZGUsIHJlc29sdmUpIHsNCiAgICAgIGlmIChub2RlKSB7DQogICAgICAgIGxldCB0aGlzXyA9IHRoaXMNCiAgICAgICAgbGV0IGRpc3BsYXlGaWVsZCA9IHRoaXNfLmN1c3RvbURpYWxvZy5zdHlsZSA9PSAyID8gdGhpc18uY29tYmlUcmVlRGlzcGxheUZpZWxkIDogdGhpc18uZGlzcGxheUZpZWxkDQogICAgICAgIHJlc29sdmUodGhpcy50cmVlTGlzdC5maWx0ZXIodmFsdWUgPT4gdmFsdWVbZGlzcGxheUZpZWxkLnBpZF0gPT09IG5vZGUuZGF0YVtkaXNwbGF5RmllbGQuaWRdKSkNCiAgICAgICAgaWYgKHRoaXMuc2hvd0RhdGEgJiYgdGhpcy5zaG93RGF0YS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICB0aGlzLnNob3dEYXRhLmZvckVhY2godiA9PiB7DQogICAgICAgICAgICAgIGlmICh2LlBpZCA9PSBub2RlLmtleSkgew0KICAgICAgICAgICAgICAgIHRoaXNfLiRyZWZzLnRyZWUuc2V0Q2hlY2tlZCh2LCB0cnVlKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXNfLmNoZWNrTm9kZSh2LCB0aGlzXykNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LCA0MDApDQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KDQogICAgYWZ0ZXJPcGVuKCl7DQogICAgICAvL+aJk+W8gOWvueivneahhuS5i+WQjuWKoOi9veagkQ0KICAgICAgdGhpcy5sb2FkQ29tYmluYXRpb25UcmVlKCkNCiAgICB9LA0KICAgIGxvYWRDb21iaW5hdGlvblRyZWUoKXsNCiAgICAgIGlmKHRoaXMuY3VzdG9tRGlhbG9nLnN0eWxlICE9IDIpew0KICAgICAgICByZXR1cm4gOw0KICAgICAgfQ0KICAgICAgbGV0IGNvbWJpbmF0aW9uUnVsZSA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cuY29tYmluYXRpb25SdWxlKTsNCiAgICAgIHRoaXMuY29tYmluYXRpb25SdWxlID0gY29tYmluYXRpb25SdWxlOw0KICAgICAgbGV0IHRyZWVBbGlhcyA9IGNvbWJpbmF0aW9uUnVsZS5sZWZ0VHJlZTsNCiAgICAgIC8v6I635Y+W5a+56K+d5qGG5pWw5o2uDQogICAgICByZXEuZ2V0KCcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldEJ5QWxpYXM/YWxpYXM9Jyt0cmVlQWxpYXMpLnRoZW4ocmVzcD0+ew0KICAgICAgICBsZXQgdHJlZURpYWxvZyA9IHJlc3AuZGF0YTsNCiAgICAgICAgdGhpcy5sZWZ0VHJlZVRpdGxlID0gdHJlZURpYWxvZy5uYW1lOw0KICAgICAgICBsZXQgcmVxUGFyYW0gPSB7fTsNCiAgICAgICAgbGV0IHJlcXVlc3RUeXBlID0gdHJlZURpYWxvZy5kc1R5cGUgPT0gJ2RhdGFTb3VyY2UnID8gJ0dFVCcgOiB0cmVlRGlhbG9nLnJlcXVlc3RUeXBlID8gdHJlZURpYWxvZy5yZXF1ZXN0VHlwZSA6ICdQT1NUJzsNCiAgICAgICAgbGV0IHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldFRyZWVEYXRhP2FsaWFzPScgKyB0cmVlQWxpYXMgKyAiJm1hcFBhcmFtPSI7DQogICAgICAgIGxldCBwYXJhbXNPYmogPSB7fTsNCiAgICAgICAgaWYodHJlZURpYWxvZy5kc1R5cGUgIT0gJ2RhdGFTb3VyY2UnKXsNCiAgICAgICAgICB1cmwgPSB0cmVlRGlhbG9nLnVybDsNCiAgICAgICAgICBsZXQgdGVtcGxhdGVQYSA9IHRyZWVEaWFsb2cuZGF0YVBhcmFtOw0KICAgICAgICAgIGlmKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpew0KICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cuY29uZGl0aW9uZmllbGQpOw0KICAgICAgICAgICAgZm9yKGxldCBpID0gMCA7IGkgPCBjb25kaXRpb25zLmxlbmd0aCA7IGkrKyl7DQogICAgICAgICAgICAgIGxldCBjb24gPSBjb25kaXRpb25zW2ldOw0KICAgICAgICAgICAgICBpZihyZXF1ZXN0VHlwZSA9PSAnUE9TVCcpew0KICAgICAgICAgICAgICAgIGlmKHRlbXBsYXRlUGEpew0KICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQYSA9IHRlbXBsYXRlUGEucmVwbGFjZShuZXcgUmVnRXhwKCdcXHsnICsgY29uLmZpZWxkICsgJ1xcfScsICdnJyksY29uLmRlZmF1bHRWYWx1ZSk7DQogICAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgICBwYXJhbXNPYmpbY29uLmZpZWxkXSA9IGNvbi5kZWZhdWx0VmFsdWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICBsZXQgbGpDaGFyID0gdXJsLmluZGV4T2YoJz8nKSA9PSAtMSA/ICc/JyA6ICcmJzsNCiAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyBsakNoYXIgKyBjb24uZmllbGQgKyAnPScgKyBjb24uZGVmYXVsdFZhbHVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZih0ZW1wbGF0ZVBhKXsNCiAgICAgICAgICAgICAgcGFyYW1zT2JqID0gSlNPTi5wYXJzZSh0ZW1wbGF0ZVBhKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgbGV0IHJlcXVlc3RQYXJhbXMgPSB7fTsNCiAgICAgICAgcmVxdWVzdFBhcmFtcy5yZXF1ZXN0VHlwZSA9IHJlcXVlc3RUeXBlOw0KICAgICAgICByZXF1ZXN0UGFyYW1zLnVybCA9IHVybDsNCiAgICAgICAgcmVxdWVzdFBhcmFtcy5wYXJhbXNPYmogPSBwYXJhbXNPYmo7DQogICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdkaWFsb2cvZ2V0VHJlZURhdGEnLHJlcXVlc3RQYXJhbXMpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgaWYodHJlZURpYWxvZy5kaXNwbGF5ZmllbGQgJiYgdHJlZURpYWxvZy5yZXN1bHRmaWVsZCl7DQogICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gSlNPTi5wYXJzZSh0cmVlRGlhbG9nLmRpc3BsYXlmaWVsZCk7DQogICAgICAgICAgICBsZXQgcmVzdWx0ZmllbGQgPSBKU09OLnBhcnNlKHRyZWVEaWFsb2cucmVzdWx0ZmllbGQpOw0KICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJvcHMubGFiZWwgPSBkaXNwbGF5RmllbGQuZGlzcGxheU5hbWU7DQogICAgICAgICAgICB0aGlzLnRyZWVMaXN0ID0gcmVzcDsNCiAgICAgICAgICAgIHRoaXMuY29tYmlUcmVlRGlzcGxheUZpZWxkID0gZGlzcGxheUZpZWxkOw0KICAgICAgICAgICAgdGhpcy5jb21iaW5hdGlvblRyZWVEYXRhID0gdGhpcy50b1RyZWVEYXRhKA0KICAgICAgICAgICAgICByZXNwLA0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGQuaWQsDQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgIGRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkLnB2YWx1ZSA/IGRpc3BsYXlGaWVsZC5wdmFsdWU6JzAnLA0KICAgICAgICAgICAgICByZXN1bHRmaWVsZA0KICAgICAgICAgICAgKQ0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICAgIH0pDQogICAgfSwNCiAgICBjb21iaVRyZWVDbGljayhwYXJhbU9iaixub2RlLG5vZGVDb21wb25lbnQpew0KICAgICAgLy/nu4TlkIjlr7nor53moYbngrnlh7vlt6bmoJENCiAgICAgIC8v5riF56m65pen55qEDQogICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5zcGxpY2UoMCk7DQogICAgICBsZXQgY29tYmluYXRpb25SdWxlID0gSlNPTi5wYXJzZSh0aGlzLmN1c3RvbURpYWxvZy5jb21iaW5hdGlvblJ1bGUpOw0KICAgICAgaWYoIWNvbWJpbmF0aW9uUnVsZS5ydWxlcyB8fCBjb21iaW5hdGlvblJ1bGUucnVsZXMubGVuZ3RoID09IDApew0KICAgICAgICByZXR1cm4gOw0KICAgICAgfQ0KICAgICAgbGV0IHJ1bGVzID0gY29tYmluYXRpb25SdWxlLnJ1bGVzOw0KICAgICAgZm9yKGxldCBpID0gMDtpIDwgcnVsZXMubGVuZ3RoIDsgaSsrKXsNCiAgICAgICAgbGV0IHZhbHVlID0gcGFyYW1PYmpbcnVsZXNbaV0udHJlZUZpZWxkXTsNCiAgICAgICAgbGV0IHByb3BlcnR5ID0gcnVsZXNbaV0ubGlzdEZpZWxkOw0KICAgICAgICB0aGlzLmNvbWJpbmF0aW9uVHJlZVF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICBwcm9wZXJ0eTpwcm9wZXJ0eSwNCiAgICAgICAgICB2YWx1ZTogdmFsdWUsDQogICAgICAgICAgZ3JvdXA6ICJ0cmVlR3JvdXAiLA0KICAgICAgICAgIG9wZXJhdGlvbjp0aGlzLmdldE9wZXJhdGlvbihydWxlc1tpXS5jb25kaXRpb24pLA0KICAgICAgICAgIHJlbGF0aW9uOiAiQU5EIg0KICAgICAgICB9KQ0KICAgICAgfQ0KICAgICAgdGhpcy5zZWFyY2goKTsNCiAgICB9LA0KICAgIC8v6I635Y+W6L+Q566X56ym5Y+3DQogICAgZ2V0T3BlcmF0aW9uKG9sZCl7DQogICAgICBpZighb2xkKXsNCiAgICAgICAgcmV0dXJuICIiOw0KICAgICAgfQ0KICAgICAgaWYob2xkID09ICJFUSIpew0KICAgICAgICByZXR1cm4gIkVRVUFMIjsNCiAgICAgIH0NCiAgICAgIGlmKG9sZCA9PSAiTEsiKXsNCiAgICAgICAgcmV0dXJuICJMSUtFIg0KICAgICAgfQ0KICAgICAgaWYob2xkID09ICJMRksiKXsNCiAgICAgICAgcmV0dXJuICJMSUtFIg0KICAgICAgfQ0KICAgICAgaWYob2xkID09ICJJTiIpew0KICAgICAgICByZXR1cm4gIklOIjsNCiAgICAgIH0NCiAgICB9LA0KICAgIHRvZ2dsZVRyZWUoKXsNCiAgICAgIGlmKHRoaXMudHJlZVNob3cpew0KICAgICAgICB0aGlzLnRyZWVTaG93ID0gZmFsc2U7DQogICAgICAgIHRoaXMudHJhbnN0aW9uV2lkdGggPSAiMCUiOw0KICAgICAgICB0aGlzLnRvZ2dsZUJ0biA9ICJlbC1pY29uLWFycm93LXJpZ2h0Ig0KICAgICAgfWVsc2V7DQogICAgICAgIHRoaXMudHJlZVNob3cgPSB0cnVlOw0KICAgICAgICB0aGlzLnRyYW5zdGlvbldpZHRoID0gIjI1JSI7DQogICAgICAgIHRoaXMudG9nZ2xlQnRuID0gImVsLWljb24tYXJyb3ctbGVmdCINCiAgICAgIH0NCiAgICB9DQogIH0NCn0NCg=="},null]}