{"remainingRequest":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue?vue&type=script&lang=js&","dependencies":[{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\src\\components\\dataTemplate\\TemplateDynamicView.vue","mtime":1705895419251},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\bzzgj-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQge0xvYWRpbmd9IGZyb20gJ2VsZW1lbnQtdWknDQppbXBvcnQgSHRDaGVja2JveCBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdENoZWNrYm94LnZ1ZScNCmltcG9ydCBIdERpYWxvZyBmcm9tICdAL2NvbXBvbmVudHMvY29udHJvbC9IdERpYWxvZy52dWUnDQppbXBvcnQgSHREaWFsb2dCdG4gZnJvbSAnQC9jb21wb25lbnRzL2NvbnRyb2wvaHREaWFsb2dCdG4udnVlJw0KaW1wb3J0IEVpcFNlbGVjdCBmcm9tICdAL2NvbXBvbmVudHMvZWlwQ29udHJvbC9FaXBTZWxlY3QudnVlJw0KaW1wb3J0IFZSdW50aW1lVGVtcGxhdGUgZnJvbSAndi1ydW50aW1lLXRlbXBsYXRlJw0KaW1wb3J0IHV0aWxzIGZyb20gJ0AvdXRpbHMuanMnDQppbXBvcnQge0Jhc2U2NH0gZnJvbSAnanMtYmFzZTY0Jw0KaW1wb3J0IFZ1ZSBmcm9tICd2dWUnDQppbXBvcnQgUVJDb2RlIGZyb20gJ3FyY29kZScNCmltcG9ydCByZXEgZnJvbSAnQC9yZXF1ZXN0LmpzJw0KaW1wb3J0IGZvcm0gZnJvbSAnQC9hcGkvZm9ybS5qcycNCmltcG9ydCBkaWFsb2cgZnJvbSAnQC9hcGkvZGlhbG9nQXBpLmpzJw0KDQpjb25zdCBUZW1wbGF0ZUJhdGNoVXBkYXRlRGlhbG9nID0gKCkgPT4NCiAgaW1wb3J0KCdAL2NvbXBvbmVudHMvZGlhbG9nL1RlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2cudnVlJykNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogJ3RlbXBsYXRlLWR5bmFtaWMtdmlldycsDQogIHByb3BzOiB7DQogICAgdGVtcGxhdGVLZXk6IFN0cmluZywNCiAgICBodG1sOiBTdHJpbmcsDQogICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsDQogICAgcGFyYW1ldGVycVF1ZXJ5czogU3RyaW5nLA0KICAgIHNpbmdsZTogew0KICAgICAgZGVmYXVsdDogJ3RydWUnDQogICAgfSwNCiAgICBkZWZLZXk6IFN0cmluZywNCiAgICB0YXNrVHlwZTogew0KICAgICAgZGVmYXVsdDogJycNCiAgICB9LA0KICAgIGRhdGFWaWV3OiBPYmplY3QsDQogICAgaXNKb2luRmxvdzogew0KICAgICAgZGVmYXVsdDogZmFsc2UNCiAgICB9DQogIH0sDQogIGRhdGEoKSB7DQogICAgcmV0dXJuIHsNCiAgICAgIHJlZnJlc2hUaW1lOiBuZXcgRGF0ZSgpLmdldFRpbWUoKSwNCiAgICAgIHNob3dEYXRlVmlldzogdHJ1ZQ0KICAgIH0NCiAgfSwNCiAgY3JlYXRlZCgpIHsNCiAgICB0aGlzLmluaXQoKQ0KICB9LA0KICB3YXRjaDogew0KICAgIGh0bWw6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICB0aGlzLmluaXQoKQ0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgbWV0aG9kczogew0KICAgIGluaXQoKSB7DQogICAgICBWdWUuY29tcG9uZW50KCdodC1kYXRhdmlldy1ydW50aW1lLXRlbXBsYXRlJywgew0KICAgICAgICB0ZW1wbGF0ZTogdGhpcy5odG1sLA0KICAgICAgICBwcm9wczogew0KICAgICAgICAgIHRlbXBsYXRlS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGVtcGxhdGVJbmZvOiBPYmplY3QsDQogICAgICAgICAgc2luZ2xlOiBTdHJpbmcsDQogICAgICAgICAgZGVmS2V5OiBTdHJpbmcsDQogICAgICAgICAgdGFza1R5cGU6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6ICcnDQogICAgICAgICAgfSwNCiAgICAgICAgICBkYXRhVmlldzogT2JqZWN0LA0KICAgICAgICAgIGlzSm9pbkZsb3c6IHsNCiAgICAgICAgICAgIGRlZmF1bHQ6IGZhbHNlDQogICAgICAgICAgfSwNCiAgICAgICAgICBwYXJhbWV0ZXJxUXVlcnlzOiBTdHJpbmcNCiAgICAgICAgfSwNCiAgICAgICAgZGF0YSgpIHsNCiAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgdHJlZVF1ZXJ5czogW10sDQogICAgICAgICAgICBhbGlhc19uZXc6ICdzdGF0ZW1lbnQnLA0KICAgICAgICAgICAgbG9hZGluZzogZmFsc2UsDQogICAgICAgICAgICBRUkNvZGV1cmw6ICcnLA0KICAgICAgICAgICAgUVJDb2RlRGlhbG9nOiBmYWxzZSwNCiAgICAgICAgICAgIGh0bWw6ICcnLA0KICAgICAgICAgICAgdGFibGVEYXRhOiB7c2VsZWN0Um93czogW10sIHF1ZXJ5czogJyd9LA0KICAgICAgICAgICAgZGlhbG9nRXhwb3J0VmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICBleHBvcnREYXRhOiB7Z2V0VHlwZTogJ2FsbCcsIGV4cEZpZWxkOiBbXX0sDQogICAgICAgICAgICBkaXNwbGF5RmllbGRzOiBbXSwNCiAgICAgICAgICAgIGV4cG9ydFNlbGxlY3Rpb246IFtdLA0KICAgICAgICAgICAgc2VhcmNoRm9ybToge0ZfeGI6ICcnLCBGX3htOiAnJ30sDQogICAgICAgICAgICBxdWVyeUZvcm06IHsNCiAgICAgICAgICAgICAgcXVlcnlEYXRhOiAnJw0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGZvcm1UeXBlOiBmYWxzZSwNCiAgICAgICAgICAgIGxhYmVsUG9zaXRpb246ICdsZWZ0JywNCiAgICAgICAgICAgIGluY29uczogJ2VsLWljb24tYXJyb3ctZG93bicsDQogICAgICAgICAgICBvcHRpb25zOiB7DQogICAgICAgICAgICAgIGZ1bGxzY3JlZW46IHRydWUsDQogICAgICAgICAgICAgIGxvY2s6IHRydWUNCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByb3dUZW1wbGF0ZUlkOiBudWxsLA0KICAgICAgICAgICAgcm93SWQ6IG51bGwsDQogICAgICAgICAgICBRUkNvZGVTaG93OiB0cnVlLA0KICAgICAgICAgICAgUVJDb2RlRGVzYzogW10sDQogICAgICAgICAgICB0cmVlOiBbXSwNCiAgICAgICAgICAgIGN1c3RvbURpYWxvZzogW10sDQogICAgICAgICAgICB0YWJsZUhlaWdodDogMC42ODUgKiB3aW5kb3cuaW5uZXJIZWlnaHQsDQogICAgICAgICAgICBkaWFsb2dTdWJWaXNpYmxlOiBmYWxzZSwNCiAgICAgICAgICAgIHRhYnM6IFtdLA0KICAgICAgICAgICAgZW50czogW10sDQogICAgICAgICAgICBtb2RpZnlSZWNvcmQ6IHsNCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7DQogICAgICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICAgICAgcGFnZVNpemU6IDIwLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICByZWNvcmRMaXN0OiBbXSwNCiAgICAgICAgICAgIHJlY29yZFJlZklkOiAnJywNCiAgICAgICAgICAgIGRpYWxvZ1JlY29yZFZpc2libGU6IGZhbHNlLA0KICAgICAgICAgICAgcmVjb3JkVGFibGVMb2FkaW5nOiBmYWxzZSwNCiAgICAgICAgICAgIG1vZGlmeURldGFpbERpYWxvZ1Zpc2libGU6IGZhbHNlLA0KICAgICAgICAgICAgY3VycmVudE1vZGlmeToge30sDQogICAgICAgICAgICByZWZJZDogJycsDQogICAgICAgICAgICBxdWVyeVN1YlZhbHVlOiAnJywNCiAgICAgICAgICAgIHN1YlRhYmxlTG9hZGluZzogZmFsc2UsDQogICAgICAgICAgICBjdXJyZW50VGFiTmFtZTogJycsDQogICAgICAgICAgICBjdXJyZW50VGFiOiB7fSwNCiAgICAgICAgICAgIGV4cG9ydFR5cGU6ICdtYWluJywNCiAgICAgICAgICAgIHN1YkRpc3BsYXlGaWVsZHM6IFtdLA0KICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkc0xpc3Q6IFtdLA0KICAgICAgICAgICAgbm90UHJpbnQ6IGZhbHNlLA0KICAgICAgICAgICAgZGlzcGxheUZpZWxkOiB7fSwNCiAgICAgICAgICAgIHRyZWVMaXN0OiBbXSwNCiAgICAgICAgICAgIHJvd3M6IFtdLA0KICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICBwYWdlU2l6ZTogMTANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBwYWdpbmF0aW9uTGF5b3V0OiAndG90YWwsIHNpemVzLCBwcmV2LCBwYWdlciwgbmV4dCwganVtcGVyJywNCiAgICAgICAgICAgIHRvdGFsOiAwLA0KICAgICAgICAgICAgcGVybWlzc2lvbjogew0KICAgICAgICAgICAgICBwcmludDogdHJ1ZSwNCiAgICAgICAgICAgICAgYWRkOiB0cnVlLA0KICAgICAgICAgICAgICBkZWw6IHRydWUsDQogICAgICAgICAgICAgIGV4cG9ydDogdHJ1ZSwNCiAgICAgICAgICAgICAgZWRpdDogdHJ1ZSwNCiAgICAgICAgICAgICAgaGlkZGVuOiBmYWxzZQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIHNob3dSaWdodE1lbnU6IHRydWUsDQogICAgICAgICAgICBsaXN0U2VsZWN0YWJsZTogdHJ1ZSwNCiAgICAgICAgICAgIGZpbHRlcnM6IHt9LA0KICAgICAgICAgICAgc29ydGVyOiBudWxsLA0KICAgICAgICAgICAgZGlhbG9nU3VuVmlzaWJsZTogZmFsc2UsIC8v5a2Z6KGo5a+56K+d5qGGDQogICAgICAgICAgICBzdW5UYWJzOiBbXSwgLy/lrZnooajmlbDmja4NCiAgICAgICAgICAgIHF1ZXJ5U3VuVmFsdWU6ICcnLA0KICAgICAgICAgICAgb3BlcmF0ZUNvbFdpZHRoOiAnMjQwJywNCiAgICAgICAgICAgIHN1bW1hcnlGaWVsZHM6IFtdLA0KICAgICAgICAgICAgZGlhbG9nVmlzaWJsZTogZmFsc2UsDQogICAgICAgICAgICBwYWdlUmVzdWx0OiB7DQogICAgICAgICAgICAgIHBhZ2U6IDEsDQogICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgIH0sDQogICAgICAgICAgICBsb2dEYXRhOiBbXSwNCiAgICAgICAgICAgIG5vdFNvcnRhYmxlRmllbGRzOiBbDQogICAgICAgICAgICAgICdicG1fc3RhdHVzXycsDQogICAgICAgICAgICAgICdicG1fcHJvY19pbnN0X2lkXycsDQogICAgICAgICAgICAgICdicG1fc3ViamVjdF8nLA0KICAgICAgICAgICAgICAnYnBtX3Byb2NfZGVmX25hbWVfJywNCiAgICAgICAgICAgICAgJ2JwbV9jcmVhdGVfdGltZV8nLA0KICAgICAgICAgICAgICAnYnBtX2VuZF90aW1lXycsDQogICAgICAgICAgICAgICdicG1faXNfZm9yYmlkZGVuXycsDQogICAgICAgICAgICAgICdicG1fY3JlYXRvcl8nDQogICAgICAgICAgICBdLA0KICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdDogW10sIC8v5om56YeP5pu05paw5pWw5o2uDQogICAgICAgICAgICBpZ25vcmVkQWxpYXM6IFsnYXBwQ2VudGVyRnJvbnQnXSwNCiAgICAgICAgICAgIFFSQ29kZVBhdHRlcm46IHRydWUsDQogICAgICAgICAgICBRUkNvZGVUeXBlOiAnJywNCiAgICAgICAgICAgIGlzTW9iaWxlOiBmYWxzZSwNCiAgICAgICAgICAgIGFjdGl2ZU5hbWVzOiBbJzEnXSwNCiAgICAgICAgICAgIHN3aXRjaE1hcDoge30sDQogICAgICAgICAgICBmaWx0ZXJNYXA6IHt9DQogICAgICAgICAgfQ0KICAgICAgICB9LA0KICAgICAgICBjb21wb25lbnRzOiB7DQogICAgICAgICAgVlJ1bnRpbWVUZW1wbGF0ZSwNCiAgICAgICAgICBIdENoZWNrYm94LA0KICAgICAgICAgIEh0RGlhbG9nLA0KICAgICAgICAgIEh0RGlhbG9nQnRuLA0KICAgICAgICAgIFRlbXBsYXRlQmF0Y2hVcGRhdGVEaWFsb2csDQogICAgICAgICAgRWlwU2VsZWN0DQogICAgICAgIH0sDQogICAgICAgIHdhdGNoOiB7DQogICAgICAgICAgZW50czogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWx1ZSkgew0KICAgICAgICAgICAgICBpZiAobmV3VmFsICYmIG5ld1ZhbC5sZW5ndGggPj0gMSAmJiBuZXdWYWwgIT0gb2xkVmFsdWUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmdldFN1YkRhdGEodGhpcywgdGhpcy5yZWZJZCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIGRlZXA6IHRydWUsDQogICAgICAgICAgICBpbW1lZGlhdGU6IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIHRlbXBsYXRlSW5mbzogew0KICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24obmV3VmFsLCBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgaWYgKG5ld1ZhbCAmJiBuZXdWYWwuaWQpIHsNCiAgICAgICAgICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh0aGlzLm9wdGlvbnMpDQogICAgICAgICAgICAgICAgbGV0IF9tZSA9IHRoaXMNCiAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvID0gbmV3VmFsDQogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKSB7DQogICAgICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkID0gdXRpbHMucGFyc2VUb0pzb24oDQogICAgICAgICAgICAgICAgICAgIF9tZS50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXlGaWVsZC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICBpZiAoZGlzcGxheUZpZWxkW2ldLnR5cGUpIHsNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMucHVzaChkaXNwbGF5RmllbGRbaV0pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKF9tZS50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpIHsNCiAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb25GaWVsZCA9IHV0aWxzLnBhcnNlVG9Kc29uKA0KICAgICAgICAgICAgICAgICAgICBfbWUudGVtcGxhdGVJbmZvLmNvbmRpdGlvbkZpZWxkDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbmRpdGlvbkZpZWxkLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSAnRl8nICsgY29uZGl0aW9uRmllbGRbaV0ubmFtZQ0KICAgICAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBmaWVsZE5hbWUsICcnKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0ge3RlbXBsYXRlSWQ6IF9tZS50ZW1wbGF0ZUluZm8uaWR9DQogICAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICAgICAgcGFnZUJlYW46IHsNCiAgICAgICAgICAgICAgICAgICAgcGFnZTogJzEnLA0KICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogbmV3VmFsLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgICAgICBzaG93VG90YWw6ICd0cnVlJw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gLy/liJ3mrKHliqDovb3pu5jorqRwYWdlQmVhbg0KICAgICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW4NCiAgICAgICAgICAgICAgICBpZiAoX21lLmlzSm9pbkZsb3cpIHsNCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICAgICAgcGFyYW1zLnRhc2tUeXBlID0gX21lLnRhc2tUeXBlDQogICAgICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gX21lLmRlZktleQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBpZiAoX21lLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgICAgICBfbWUuaGFuZGVsQmluZEZpbGVkVmFsdWEoKQ0KICAgICAgICAgICAgICAgICAgLy/lhbPogZTmn6Xor6LlrZfmrrUNCiAgICAgICAgICAgICAgICAgIGlmIChfbWUuZGF0YVZpZXcuc2VsZWN0TGlzdCAmJiBfbWUuZGF0YVZpZXcuc2VsZWN0TGlzdC5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZWxlY3RMaXN0ID0gX21lLmRhdGFWaWV3LnNlbGVjdExpc3QNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gX21lLmRhdGFWaWV3LnJlZklkVmFsdWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFyYW1ldGVycVF1ZXJ5cykgew0KICAgICAgICAgICAgICAgICAgdmFyIHF1ZXJ5cyA9IEpTT04ucGFyc2UoDQogICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoZGVjb2RlVVJJQ29tcG9uZW50KHRoaXMucGFyYW1ldGVycVF1ZXJ5cykpDQogICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBxdWVyeXMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGRlZmF1bHRRdWVyeSA9IHRoaXMuYnVpbGREZWZhdWx0UXVlcnlzKCkNCiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFF1ZXJ5Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsNCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzLmNvbmNhdChkZWZhdWx0UXVlcnkpDQogICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMgPSBkZWZhdWx0UXVlcnkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgLy/lpoLmnpzmnInorr7nva7pu5jorqTmjpLluo8s5LyY5YWI5L2/55So6buY6K6k5o6S5bqPDQogICAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgew0KICAgICAgICAgICAgICAgICAgbGV0IHNvcnRGaWVsZCA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uc29ydEZpZWxkKQ0KICAgICAgICAgICAgICAgICAgbGV0IHNvcnRlciA9IFtdDQogICAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNvcnRGaWVsZC5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgICBzb3J0ZXIucHVzaCh7J3Byb3BlcnR5Jzogc29ydEZpZWxkW3hdLm5hbWUsICdkaXJlY3Rpb24nOiBzb3J0RmllbGRbeF0uc29ydH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5zb3J0ZXIgPSBzb3J0ZXINCiAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgICAgICBpZiAocGFyYW1zLnRlbXBsYXRlSWQpIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRCcG1UZW1wbGF0ZUJ5UGFnaW5hdGlvbicsIHBhcmFtcykNCiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLnJvd3MgPSByZXNwb25zZS5kYXRhLnJvd3MNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy50b3RhbCA9IHJlc3BvbnNlLmRhdGEudG90YWwNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gcmVzcG9uc2UuZGF0YS5wYWdlU2l6ZQ0KICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmcuY2xvc2UoKQ0KICAgICAgICAgICAgICAgICAgICAgIHRoaXNfLmluaXRTd2l0Y2hTdGF0dXMoKQ0KICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzXy4kZWwgJiYgdGhpc18uJGVsLnF1ZXJ5U2VsZWN0b3IpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0b3BCdG5Eb20gPSB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Rpdi50b3BfYnRuX2NvbCcNCiAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIXRvcEJ0bkRvbSB8fA0KICAgICAgICAgICAgICAgICAgICAgICAgICAoIXRvcEJ0bkRvbS5xdWVyeVNlbGVjdG9yKCdpLmVsLWljb24tZGVsZXRlJykgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1lZGl0JykgJiYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdG9wQnRuRG9tLnF1ZXJ5U2VsZWN0b3IoJ2kuZWwtaWNvbi1zLWdyaWQnKSkNCiAgICAgICAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5saXN0U2VsZWN0YWJsZSA9IGZhbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGREb20gPSB0aGlzXy4kZWwucXVlcnlTZWxlY3RvcigndGQucmlnaHRfbWVudScpDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGREb20gfHwgKCF0ZERvbS5xdWVyeVNlbGVjdG9yKCdidXR0b24nKSAmJiB0ZERvbS5xdWVyeVNlbGVjdG9yKCdzd2l0Y2gnKSkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5zaG93UmlnaHRNZW51ID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwKQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgbG9hZGluZy5jbG9zZSgpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwudHJlZUZpZWxkICYmIG5ld1ZhbC50cmVlRmllbGQgIT09ICd7fScpIHsNCiAgICAgICAgICAgICAgICAgIGxldCB0cmVlRmllbGQgPSBKU09OLnBhcnNlKG5ld1ZhbC50cmVlRmllbGQpDQogICAgICAgICAgICAgICAgICB0aGlzLmluaXRUcmVlKHRyZWVGaWVsZCkNCiAgICAgICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCByZXNwID0+IHsNCiAgICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YkRpc3BsYXlGaWVsZHMgPSBbXQ0KICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHIgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgc3ViRGlzcGxheUZpZWxkcy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYzogYXR0ci5jb21tZW50LA0KICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBhdHRyLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXR0ci5jb2x1bW5UeXBlDQogICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJEaXNwbGF5RmllbGRzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBzdWJEaXNwbGF5RmllbGRzLA0KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5uYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudDogaXRlbS5jb21tZW50DQogICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChuZXdWYWwuc3VtbWFyeUZpZWxkKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlGaWVsZHMgPSBKU09OLnBhcnNlKG5ld1ZhbC5zdW1tYXJ5RmllbGQpDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgZGVlcDogdHJ1ZSwNCiAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgY3VycmVudFRhYk5hbWU6IGZ1bmN0aW9uKG5ld1ZhbCkgew0KICAgICAgICAgICAgaWYgKG5ld1ZhbCkgew0KICAgICAgICAgICAgICB0aGlzLnF1ZXJ5U3ViVmFsdWUgPSAnJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfSwNCiAgICAgICAgY29tcHV0ZWQ6IHsNCiAgICAgICAgICBzaG93RHJhZnRMaXN0KCkgey8v5aaC5p6c5b2T5YmN6aG16Z2i6KKr5bWM5YWlaWZyYW1l6YeM6Z2i5LiN5pi+56S66I2J56i/DQogICAgICAgICAgICByZXR1cm4gd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3ANCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIG1vdW50ZWQoKSB7DQogICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgbGV0IHRoaXNfID0gdGhpcw0KICAgICAgICAgIHRoaXMuJHJvb3QuJG9uKCdmb3JtLXJlbG9hZC1zdWNjZXNzJywgZnVuY3Rpb24oKSB7DQogICAgICAgICAgICB0aGlzXy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgfSkNCiAgICAgICAgICB0aGlzLiRlbWl0KCdhZnRlck1vdW50ZWQnKQ0KICAgICAgICB9LA0KICAgICAgICBtZXRob2RzOiB7DQogICAgICAgICAgbG9hZERhdGEocGFyYW0sIGNiKSB7DQogICAgICAgICAgICBsZXQgcXVlcnlzID0gcGFyYW0ucXVlcnlzIHx8IFtdDQogICAgICAgICAgICBsZXQgaGFzRGVmYXVsdFF1ZXJ5ID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuaGFuZGVsQmluZEZpbGVkVmFsdWEoKQ0KICAgICAgICAgICAgbGV0IHBJRCA9IHRoaXMuZGF0YVZpZXcucmVmSWRWYWx1ZQ0KICAgICAgICAgICAgcXVlcnlzLmZvckVhY2gocSA9PiB7DQogICAgICAgICAgICAgIGlmIChxLnByb3BlcnR5ID09ICdQSWQnKSB7DQogICAgICAgICAgICAgICAgaGFzRGVmYXVsdFF1ZXJ5ID0gdHJ1ZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgaWYgKCFoYXNEZWZhdWx0UXVlcnkpIHsNCiAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICBncm91cDogJ2RlZmFsdXQnLA0KICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnUElkJywNCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IHBJRA0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmYWx1dCcsDQogICAgICAgICAgICAgICAgcHJvcGVydHk6ICdib0FsaWFzJywNCiAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcsDQogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHBhcmFtLnF1ZXJ5cyA9IHF1ZXJ5cw0KICAgICAgICAgICAgcmVxDQogICAgICAgICAgICAgIC5wb3N0KA0KICAgICAgICAgICAgICAgIHdpbmRvdy5jb250ZXh0LmZvcm0gKyAnL2Zvcm0vZm9ybURhdGFJbXBvcnRMb2cvdjEvbGlzdEpzb24nLA0KICAgICAgICAgICAgICAgIHBhcmFtDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlID0gZGF0YS5kYXRhDQogICAgICAgICAgICAgICAgdGhpcy5sb2dEYXRhID0gcmVzcG9uc2Uucm93cw0KICAgICAgICAgICAgICAgIHRoaXMucGFnZVJlc3VsdCA9IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2U6IHJlc3BvbnNlLnBhZ2UsDQogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcmVzcG9uc2UucGFnZVNpemUsDQogICAgICAgICAgICAgICAgICB0b3RhbDogcmVzcG9uc2UudG90YWwNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IGNiKCkpDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kZWxCaW5kRmlsZWRWYWx1YSgpIHsNCiAgICAgICAgICAgIC8v5pWw5o2u6KeG5Zu+5o6n5Lu2DQogICAgICAgICAgICBsZXQgX21lID0gdGhpcw0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgY29uc3QgcEluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UoDQogICAgICAgICAgICAgICAgdGhpcy4kcGFyZW50LiRwYXJlbnQuJHBhcmVudC4kcGFyZW50DQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgaWYgKCFwSW5zdFt0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXNdKSB7DQogICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzID0gT2JqZWN0LmtleXMocEluc3QuZGF0YSlbMF0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBsZXQgcmVmSWRWYWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKA0KICAgICAgICAgICAgICAgIHBJbnN0LA0KICAgICAgICAgICAgICAgICdkYXRhLicgKyB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgKyAnLmlkXycNCiAgICAgICAgICAgICAgKQ0KDQogICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICBzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJykgJiYNCiAgICAgICAgICAgICAgICAhcmVmSWRWYWx1ZQ0KICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICByZWZJZFZhbHVlID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZm9ybUltcG9ydFRlbXBSZWZJZCcpDQogICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlZklkVmFsdWUpIHsNCiAgICAgICAgICAgICAgICAvL+WvvOWFpeeahOaXtuWAmeayoeacieWFs+mUrueahOWklumUru+8jOWImeS4uuWFtuiHquWKqOa3u+WKoA0KICAgICAgICAgICAgICAgIHJlZklkVmFsdWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKQ0KICAgICAgICAgICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wUmVmSWQnLCByZWZJZFZhbHVlKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIF9tZS5kYXRhVmlldy5yZWZJZFZhbHVlID0gcmVmSWRWYWx1ZQ0KDQogICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICBwSW5zdC5wZXJtaXNzaW9uICYmDQogICAgICAgICAgICAgICAgcEluc3QucGVybWlzc2lvbi50YWJsZSAmJg0KICAgICAgICAgICAgICAgIHBJbnN0LnBlcm1pc3Npb24udGFibGVbdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc10NCiAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgdGhpcy5wZXJtaXNzaW9uID0NCiAgICAgICAgICAgICAgICAgIHBJbnN0LnBlcm1pc3Npb24udGFibGVbdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc10NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uLmhpZGRlbikgew0KICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5zaG93RGF0ZVZpZXcgPSBmYWxzZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61DQogICAgICAgICAgICAgIGxldCBzZWxlY3RMaXN0ID0gdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0DQogICAgICAgICAgICAgIGlmIChzZWxlY3RMaXN0ICYmIHNlbGVjdExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0TGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9DQogICAgICAgICAgICAgICAgICAgICAgJ2RhdGEuJyArDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgICAnLicgKw0KICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdExpc3RbaV0uc2VsZWN0RmllbGQNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB1dGlscy5nZXRWYWx1ZUJ5UGF0aChwSW5zdCwgcGF0aCkNCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0TGlzdFtpXS5zZWxlY3RWYWx1ZSA9IHZhbHVlDQoNCiAgICAgICAgICAgICAgICAgICAgLy/mt7vliqDnm5HlkKwNCiAgICAgICAgICAgICAgICAgICAgcEluc3QuJHdhdGNoKHBhdGgsIGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7DQogICAgICAgICAgICAgICAgICAgICAgLy8g55uR5ZCs5Lit5L2/55So6Ze06ZqU6K+35rGC77yM5YeP5bCR6K+35rGC5qyh5pWwDQogICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCkNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdWYWwgIT09IG9sZFZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAvL19tZS5zZXREYXRhVmlld1ZhbHVlKF9tZS5kYXRhVmlldyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIF9tZS5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0sIDUwMCkNCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgLy/lhbPogZTloavlhYXlrZfmrrUNCiAgICAgICAgICAgICAgbGV0IGJpbmRMaXN0ID0gdGhpcy5kYXRhVmlldy5iaW5kTGlzdA0KICAgICAgICAgICAgICBpZiAoYmluZExpc3QgJiYgYmluZExpc3QubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZExpc3QubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIGlmIChiaW5kTGlzdFtpXS5maWxsRmllbGQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9DQogICAgICAgICAgICAgICAgICAgICAgJ2RhdGEuJyArDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgICAnLicgKw0KICAgICAgICAgICAgICAgICAgICAgIGJpbmRMaXN0W2ldLmZpbGxGaWVsZA0KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHV0aWxzLmdldFZhbHVlQnlQYXRoKHBJbnN0LCBwYXRoKQ0KDQogICAgICAgICAgICAgICAgICAgIGJpbmRMaXN0W2ldLmZpbGxWYWx1ZSA9IHZhbHVlDQogICAgICAgICAgICAgICAgICAgIHBJbnN0LiR3YXRjaChwYXRoLCBmdW5jdGlvbihuZXdWYWwsIG9sZFZhbCkgew0KICAgICAgICAgICAgICAgICAgICAgIC8vIOebkeWQrOS4reS9v+eUqOmXtOmalOivt+axgu+8jOWHj+Wwkeivt+axguasoeaVsA0KICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpDQogICAgICAgICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3VmFsICE9PSBvbGRWYWwpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgLy9fbWUuc2V0RGF0YVZpZXdWYWx1ZShfbWUuZGF0YVZpZXcpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICBfbWUuc2VhcmNoKCkNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9LCA1MDApDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBwcmludExpc3QoKSB7DQogICAgICAgICAgICB0aGlzLm5vdFByaW50ID0gdHJ1ZQ0KICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7DQogICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoDQogICAgICAgICAgICAgICAgJ3ByaW50RGF0YScNCiAgICAgICAgICAgICAgKS5pbm5lckhUTUwNCiAgICAgICAgICAgICAgd2luZG93LnByaW50KCkNCiAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCkNCiAgICAgICAgICAgIH0sIDIwMCkNCiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gew0KICAgICAgICAgICAgICB0aGlzLm5vdFByaW50ID0gZmFsc2UNCiAgICAgICAgICAgIH0sIDIwMCkNCiAgICAgICAgICB9LA0KICAgICAgICAgIHByaW50RGV0YWlsKHRlbXBsYXRlSWQsIGlkLCBhY3Rpb24pIHsNCiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNDQogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIGFjdGlvbiArDQogICAgICAgICAgICAgICcvdHJ1ZScNCiAgICAgICAgICAgIGlmIChpZCkgew0KICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdXJsICs9ICc/Jw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdmFyIHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnDQogICAgICAgICAgICBsZXQgcGF0aCA9IHVybCArIHN0YXJ0Rmxvd1N0cg0KICAgICAgICAgICAgaWYgKHBhdGguaW5kZXhPZignb3RoZXJtZW51JykgIT0gLTEpIHsNCiAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgnL290aGVybWVudScsICcvc3RhdGVtZW50JykNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goew0KICAgICAgICAgICAgICBwYXRoOiBwYXRoLA0KICAgICAgICAgICAgICBxdWVyeToge2lzUHJpbnQ6IHRydWV9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgY29tcGxldGUocm93LCB0YXNrVHlwZSkgew0KICAgICAgICAgICAgaWYgKHRhc2tUeXBlID09ICd0b2RvJykgew0KICAgICAgICAgICAgICB2YXIgdXJsID0gd2luZG93LmNvbnRleHQuYnBtUnVuVGltZSArICcvcnVudGltZS90YXNrL3YxL2dldEJwbVRhc2tCeUluc3RJZD9pbnN0SWQ9JyArIHJvdy5icG1fcHJvY19pbnN0X2lkXw0KICAgICAgICAgICAgICByZXEuZ2V0KHVybCkudGhlbihyZXMgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXMuZGF0YS5sZW5ndGggPT0gMCkgew0KICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign5q2k5Lu75Yqh5bey6KKr5aSE55CG5oiW5LiN5a2Y5Zyo77yBJykNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcy5kYXRhLmxlbmd0aCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCgnL3JlcG9ydE1vZHVsZUluc3QvJyArIHJlcy5kYXRhWzBdLmlkICsgJy8wJyArICcvJyArIHRoaXMuZGVmS2V5ICsgJy90cnVlLycgKyB0aGlzLnRlbXBsYXRlS2V5KQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfmmoLkuI3mlK/mjIHvvIEnKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ2RvbmUnKSB7DQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvZG9uZUxpc3QvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ3JlcXVlc3QnKSB7DQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdERvbmUvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVxdWVzdC8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KQ0KICAgICAgICAgICAgfSBlbHNlIGlmICh0YXNrVHlwZSA9PSAndG9kb1JlYWQnKSB7DQogICAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHsncGFnZSc6IDEsICdwYWdlU2l6ZSc6IDEwLCAnc2hvd1RvdGFsJzogJ3RydWUnfQ0KICAgICAgICAgICAgICBsZXQgc3RhdHVzID0gcm93LmJwbV9zdGF0dXNfDQogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXROb3RpY2VUb2RvUmVhZExpc3QnLCB7DQogICAgICAgICAgICAgICAgcGFnZUJlYW46IHBhZ2VCZWFuLA0KICAgICAgICAgICAgICAgIHF1ZXJ5czogW3twcm9wZXJ0eTogJ3Byb2NfaW5zdF9pZF8nLCB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLCBvcGVyYXRpb246ICdFUVVBTCcsIHJlbGF0aW9uOiAnQU5EJ31dDQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgIGxldCBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZA0KICAgICAgICAgICAgICAgICAgbGV0IHVybCA9ICcnDQogICAgICAgICAgICAgICAgICA3DQogICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09ICdGT0xMT1cnKSB7DQogICAgICAgICAgICAgICAgICAgIHVybCA9ICcvcmVwb3J0TW9kdWxlSW5zdFRhc2tSZWFkLycgKyBpZCArICcvRk9MTE9XLycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09ICdDT01NVScpIHsNCiAgICAgICAgICAgICAgICAgICAgdXJsID0gJy9yZXBvcnRNb2R1bGVJbnN0LycgKyBpZCArICcvMC8nICsgdGhpcy5kZWZLZXkgKyAnL3RydWUvJyArIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHVybCA9ICcvcmVwb3J0TW9kdWxlSW5zdFJlYWQvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvcmVhZC8nICsgaWQgKyAnLycgKyB0aGlzLmRlZktleSArICcvJyArIHRoaXMudGVtcGxhdGVLZXkNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKHVybCkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9IGVsc2UgaWYgKHRhc2tUeXBlID09ICdkb25lUmVhZCcpIHsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0geydwYWdlJzogMSwgJ3BhZ2VTaXplJzogMTAsICdzaG93VG90YWwnOiAndHJ1ZSd9DQogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXROb3RpY2VEb25lUmVhZExpc3QnLCB7DQogICAgICAgICAgICAgICAgcGFnZUJlYW46IHBhZ2VCZWFuLA0KICAgICAgICAgICAgICAgIHF1ZXJ5czogW3twcm9wZXJ0eTogJ3Byb2NfaW5zdF9pZF8nLCB2YWx1ZTogcm93LmJwbV9wcm9jX2luc3RfaWRfLCBvcGVyYXRpb246ICdFUVVBTCcsIHJlbGF0aW9uOiAnQU5EJ31dDQogICAgICAgICAgICAgIH0pLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJvd3MgJiYgcmVzcG9uc2UuZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgIGxldCBpZCA9IHJlc3BvbnNlLmRhdGEucm93c1swXS5pZA0KICAgICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2goJy9yZXBvcnRNb2R1bGVJbnN0RG9uZS8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy9yZWFkL2RvbmUvJyArIGlkICsgJy8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ215UmVhZCcpIHsNCiAgICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0geydwYWdlJzogMSwgJ3BhZ2VTaXplJzogMTAsICdzaG93VG90YWwnOiAndHJ1ZSd9DQogICAgICAgICAgICAgIHJlcS5wb3N0KCcke2JwbVJ1blRpbWV9L3J1bnRpbWUvdGFzay92MS9nZXRNeU5vdGljZVJlYWRMaXN0Jywgew0KICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiBwYWdlQmVhbiwNCiAgICAgICAgICAgICAgICBxdWVyeXM6IFt7cHJvcGVydHk6ICdwcm9jX2luc3RfaWRfJywgdmFsdWU6IHJvdy5icG1fcHJvY19pbnN0X2lkXywgb3BlcmF0aW9uOiAnRVFVQUwnLCByZWxhdGlvbjogJ0FORCd9XQ0KICAgICAgICAgICAgICB9KS50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yb3dzICYmIHJlc3BvbnNlLmRhdGEucm93cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICBsZXQgaWQgPSByZXNwb25zZS5kYXRhLnJvd3NbMF0uaWQNCiAgICAgICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdE15UmVhZC8nICsgcm93LmJwbV9wcm9jX2luc3RfaWRfICsgJy8nICsgaWQgKyAnL215UmVhZC8nICsgdGhpcy5kZWZLZXkgKyAnLycgKyB0aGlzLnRlbXBsYXRlS2V5KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFza1R5cGUgPT0gJ215RGVsZWdhdGUnKSB7DQogICAgICAgICAgICAgIHRoaXMuJHJvdXRlci5wdXNoKCcvcmVwb3J0TW9kdWxlSW5zdFJlYWQvJyArIHJvdy5icG1fcHJvY19pbnN0X2lkXyArICcvZGVsZWdhdGUvJyArIHRoaXMuZGVmS2V5ICsgJy8nICsgdGhpcy50ZW1wbGF0ZUtleSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5LiL6L295YWo6YOo6YCJ5Lit55qE5LqM57u056CBDQogICAgICAgICAgZG93bmxvYWRBbGxRUkNvZGUoDQogICAgICAgICAgICB0ZW1wbGF0ZUlkLA0KICAgICAgICAgICAgbW9iaWxlRm9ybUFsaWFzLA0KICAgICAgICAgICAgZGlzcGxheSwNCiAgICAgICAgICAgIHBrRmllbGQsDQogICAgICAgICAgICBRUkNvZGVQYXR0ZXJuDQogICAgICAgICAgKSB7DQogICAgICAgICAgICB0aGlzLlFSQ29kZVBhdHRlcm4gPSBRUkNvZGVQYXR0ZXJuDQogICAgICAgICAgICBjb25zdCBfc2VsZWN0RGF0YSA9IHRoaXMuJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLnNlbGVjdGlvbg0KICAgICAgICAgICAgaWYgKF9zZWxlY3REYXRhLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLmVycm9yKCfor7foh7PlsJHpgInkuK3kuIDmnaHmlbDmja4hJykNCiAgICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlDQogICAgICAgICAgICBsZXQgYWNjb3VudCA9IEJhc2U2NC5lbmNvZGUoDQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLmFjY291bnQNCiAgICAgICAgICAgICkNCiAgICAgICAgICAgIGxldCB0b2tlbiA9IHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuDQogICAgICAgICAgICBsZXQgbW9iaWxlID0gd2luZG93LmNvbnRleHQubW9iaWxlDQogICAgICAgICAgICBsZXQgUVJDb2RldXJsID0gJycNCiAgICAgICAgICAgIGxldCB6aXAgPSBuZXcgSlNaaXAoKQ0KICAgICAgICAgICAgLy8g5Yib5bu65LiA5Liq5ZCN5Li6aW1hZ2Vz55qE5paw55qE5paH5Lu255uu5b2VDQogICAgICAgICAgICBsZXQgaW1nID0gemlwLmZvbGRlcignaW1hZ2VzJykNCiAgICAgICAgICAgIGxldCBwbGlzdCA9IFtdDQogICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IF9zZWxlY3REYXRhLmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVBhdHRlcm4pIHsNCiAgICAgICAgICAgICAgICBRUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICAgICAgbW9iaWxlICsNCiAgICAgICAgICAgICAgICAgICcvUVJDb2RlRm9ybS8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICAgJy9nZXQnICsNCiAgICAgICAgICAgICAgICAgICc/aWQ9JyArDQogICAgICAgICAgICAgICAgICBfc2VsZWN0RGF0YVt4XVtwa0ZpZWxkXSArDQogICAgICAgICAgICAgICAgICAnJnRva2VuPScgKw0KICAgICAgICAgICAgICAgICAgdG9rZW4NCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBRUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICAgICAgbW9iaWxlICsNCiAgICAgICAgICAgICAgICAgICcvUVJDb2RlRm9ybS8nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICAgJy9lZGl0JyArDQogICAgICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICAgICAgX3NlbGVjdERhdGFbeF1bcGtGaWVsZF0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBsZXQgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykNCg0KICAgICAgICAgICAgICBRUkNvZGUudG9DYW52YXMobXNnLCBRUkNvZGV1cmwsIGZ1bmN0aW9uKGVycm9yKSB7DQogICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIGxldCBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykNCiAgICAgICAgICAgICAgX2NhbnZhcy5zZXRBdHRyaWJ1dGUoJ2lkJywgJ1FSQ29kZUFuZERlc2NBbGwnICsgeCkNCiAgICAgICAgICAgICAgX2NhbnZhcy5zZXRBdHRyaWJ1dGUoDQogICAgICAgICAgICAgICAgJ3N0eWxlJywNCiAgICAgICAgICAgICAgICAndGV4dC1hbGlnbjpjZW50ZXI7d2lkdGg6JyArIG1zZy53aWR0aCArICdweDsnDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgX2NhbnZhcy5hcHBlbmRDaGlsZChtc2cpDQogICAgICAgICAgICAgIC8v5Yib5bu65bqV6YOo55qE5o+P6L+w5L+h5oGvDQogICAgICAgICAgICAgIGZvciAobGV0IFkgPSAwOyBZIDwgZGlzcGxheS5sZW5ndGg7IFkrKykgew0KICAgICAgICAgICAgICAgIGxldCBpdGVtID0gSlNPTi5wYXJzZShkaXNwbGF5W1ldKQ0KICAgICAgICAgICAgICAgIGlmIChfc2VsZWN0RGF0YVt4XVtpdGVtLm5hbWVdKSB7DQogICAgICAgICAgICAgICAgICBsZXQgZGVzYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpDQogICAgICAgICAgICAgICAgICBkZXNjLmlubmVySFRNTCA9IGl0ZW0uZGVzYyArICc6JyArIF9zZWxlY3REYXRhW3hdW2l0ZW0ubmFtZV0NCiAgICAgICAgICAgICAgICAgIF9jYW52YXMuYXBwZW5kQ2hpbGQoZGVzYykNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1FSQ29kZUFuZERlc2NBbGwnKS5hcHBlbmRDaGlsZChfY2FudmFzKQ0KICAgICAgICAgICAgICBwbGlzdC5wdXNoKA0KICAgICAgICAgICAgICAgIHRoaXMuZG93bmxvYWRRUkNvZGVBbmREZXNjKCcjUVJDb2RlQW5kRGVzY0FsbCcgKyB4LCBfY2FudmFzKQ0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9DQogICAgICAgICAgICBQcm9taXNlLmFsbChwbGlzdCkudGhlbihyZXN1bHQgPT4gew0KICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUVJDb2RlQW5kRGVzY0FsbCcpLmlubmVySFRNTCA9ICcnDQogICAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgcmVzdWx0Lmxlbmd0aDsgeCsrKSB7DQogICAgICAgICAgICAgICAgbGV0IGNhbnZhcyA9IHJlc3VsdFt4XQ0KICAgICAgICAgICAgICAgIGxldCBpbWFnZSA9IGNhbnZhcy50b0RhdGFVUkwoKS5zcGxpdCgnO2Jhc2U2NCwnKVsxXQ0KICAgICAgICAgICAgICAgIC8vIOi/meS4qmltYWdlc+aWh+S7tuebruW9leS4reWIm+W7uuS4gOS4qmJhc2U2NOaVsOaNruS4umltZ0RhdGHnmoTlm77lg4/vvIzlm77lg4/lkI3mmK9zbWlsZS5naWYNCiAgICAgICAgICAgICAgICBpbWcuZmlsZSh4ICsgJy5wbmcnLCBpbWFnZSwge2Jhc2U2NDogdHJ1ZX0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgLy8g5oqK5omT5YyF5YaF5a655byC5q2l6L2s5oiQYmxvYuS6jOi/m+WItuagvOW8jw0KICAgICAgICAgICAgICB6aXAuZ2VuZXJhdGVBc3luYyh7dHlwZTogJ2Jsb2InfSkudGhlbihmdW5jdGlvbihjb250ZW50KSB7DQogICAgICAgICAgICAgICAgbGV0IGVsZUxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykNCiAgICAgICAgICAgICAgICBlbGVMaW5rLmRvd25sb2FkID0gJ+S6jOe7tOeggS56aXAnDQogICAgICAgICAgICAgICAgZWxlTGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnDQogICAgICAgICAgICAgICAgLy8g5LiL6L295YaF5a656L2s5Y+Y5oiQYmxvYuWcsOWdgA0KICAgICAgICAgICAgICAgIGVsZUxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoY29udGVudCkNCiAgICAgICAgICAgICAgICAvLyDop6blj5Hngrnlh7sNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZUxpbmspDQogICAgICAgICAgICAgICAgZWxlTGluay5jbGljaygpDQogICAgICAgICAgICAgICAgLy8g54S25ZCO56e76ZmkDQogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbGVMaW5rKQ0KICAgICAgICAgICAgICB9KQ0KDQogICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgb25Db3B5KGUpIHsNCiAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uuc3VjY2Vzcygn5YaF5a655bey5aSN5Yi25Yiw5Ymq5YiH5p2/77yBJykNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8vIOWkjeWItuWksei0peaXtueahOWbnuiwg+WHveaVsA0KICAgICAgICAgIG9uRXJyb3IoZSkgew0KICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcign5oqx5q2J77yM5aSN5Yi25aSx6LSl77yBJykNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRvd25sb2FkUVJDb2RlKCkgew0KICAgICAgICAgICAgbGV0IHBsaXN0ID0gW10NCiAgICAgICAgICAgIGxldCBfY2FudmFzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI1FSQ29kZUFuZERlc2MnKQ0KICAgICAgICAgICAgcGxpc3QucHVzaCh0aGlzLmRvd25sb2FkUVJDb2RlQW5kRGVzYygnI1FSQ29kZUFuZERlc2MnLCBfY2FudmFzKSkNCiAgICAgICAgICAgIFByb21pc2UuYWxsKHBsaXN0KS50aGVuKHJlc3VsdCA9PiB7DQogICAgICAgICAgICAgIGxldCBjYW52YXMgPSByZXN1bHRbMF0NCiAgICAgICAgICAgICAgbGV0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykNCiAgICAgICAgICAgICAgbGluay5ocmVmID0gY2FudmFzLnRvRGF0YVVSTCgpIC8v5LiL6L296ZO+5o6lDQogICAgICAgICAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdkb3dubG9hZCcsICfkuoznu7TnoIEuanBnJykNCiAgICAgICAgICAgICAgbGluay5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnIC8vYeagh+etvumakOiXjw0KICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspDQogICAgICAgICAgICAgIGxpbmsuY2xpY2soKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5oqK5LqM57u056CB5LiO5LqM57u056CB6K+05piO5LiA6LW35LiL6L295oiQ5Zu+54mHDQogICAgICAgICAgZG93bmxvYWRRUkNvZGVBbmREZXNjKGNsYXNzcywgX2NhbnZhcykgew0KICAgICAgICAgICAgbGV0IHAyID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgICAgICAgICAgICBsZXQgY2FudmFzMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpDQogICAgICAgICAgICAgIGxldCB3ID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoX2NhbnZhcykud2lkdGgpDQogICAgICAgICAgICAgIGxldCBoID0gcGFyc2VJbnQod2luZG93LmdldENvbXB1dGVkU3R5bGUoX2NhbnZhcykuaGVpZ2h0KQ0KICAgICAgICAgICAgICAvL+WwhmNhbnZhc+eUu+W4g+aUvuWkp+iLpeW5suWAje+8jOeEtuWQjuebm+aUvuWcqOi+g+Wwj+eahOWuueWZqOWGhe+8jOWwseaYvuW+l+S4jeaooeeziuS6hg0KICAgICAgICAgICAgICBjYW52YXMyLndpZHRoID0gdyAqIDINCiAgICAgICAgICAgICAgY2FudmFzMi5oZWlnaHQgPSBoICogMg0KICAgICAgICAgICAgICBjYW52YXMyLnN0eWxlLndpZHRoID0gdyArICdweCcNCiAgICAgICAgICAgICAgY2FudmFzMi5zdHlsZS5oZWlnaHQgPSBoICsgJ3B4Jw0KICAgICAgICAgICAgICAvL+WPr+S7peaMieeFp+iHquW3seeahOmcgOaxgu+8jOWvuWNvbnRleHTnmoTlj4LmlbDkv67mlLksdHJhbnNsYXRl5oyH55qE5piv5YGP56e76YePDQogICAgICAgICAgICAgIGxldCBjb250ZXh0ID0gY2FudmFzMi5nZXRDb250ZXh0KCcyZCcpDQogICAgICAgICAgICAgIGNvbnRleHQuc2NhbGUoMiwgMikNCiAgICAgICAgICAgICAgcmV0dXJuIGh0bWwyY2FudmFzKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY2xhc3NzKSwgew0KICAgICAgICAgICAgICAgIGNhbnZhczogY2FudmFzMg0KICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uKGNhbnZhcykgew0KICAgICAgICAgICAgICAgIHJlc29sdmUoY2FudmFzKQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIHJldHVybiBwMg0KICAgICAgICAgIH0sDQogICAgICAgICAgUVJDb2RlRGlhbG9nQ2xvc2UoKSB7DQogICAgICAgICAgICB0aGlzLlFSQ29kZVR5cGUgPSAnJw0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSBmYWxzZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZm91bmRRUkNvZGUoKSB7DQogICAgICAgICAgICAvKnRoaXMuUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgd2luZG93LmNvbnRleHQuZnJvbnQgKw0KICAgICAgICAgICAgICAiL1FSQ29kZUZvcm0vIiArDQogICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAiL2dldCIgKw0KICAgICAgICAgICAgICAiP2lkPSIgKw0KICAgICAgICAgICAgICB0aGlzLnJvd0lkICsNCiAgICAgICAgICAgICAgIiZ0b2tlbj0iICsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUuc3RhdGUubG9naW4uY3VycmVudFVzZXIudG9rZW47Ki8NCiAgICAgICAgICAgIGlmICh0aGlzLlFSQ29kZVR5cGUgPT0gJ2FkZCcpIHsNCiAgICAgICAgICAgICAgbGV0IGlzU3RhcnRGbG93ID0gdGhpcy50ZW1wbGF0ZUluZm8uZGVmSWQgPyAndHJ1ZScgOiAnZmFsc2UnDQogICAgICAgICAgICAgIHRoaXMuUVJDb2RldXJsID0NCiAgICAgICAgICAgICAgICByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArDQogICAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICcvYWRkLz9zdGFydEZsb3c9JyArDQogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cNCiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgew0KICAgICAgICAgICAgICAgIGxldCB0b2tlbiA9IHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuDQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgKz0gJyZ0b2tlbj0nICsgdG9rZW4NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgLy/kuI3orrrpnIDkuI3pnIDopoHnmbvlvZXvvIzorr/pl67nmoTpg73mmK/mmI7nu4bpobXpnaINCiAgICAgICAgICAgICAgaWYgKHRoaXMuUVJDb2RlUGF0dGVybikgew0KICAgICAgICAgICAgICAgIC8v5YWN55m75b2VDQogICAgICAgICAgICAgICAgdGhpcy5RUkNvZGV1cmwgPQ0KICAgICAgICAgICAgICAgICAgcmVxLmdldENvbnRleHQoKS5tb2JpbGUgKw0KICAgICAgICAgICAgICAgICAgJy9RUkNvZGVGb3JtLycgKw0KICAgICAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICAgICAnL2dldD9pZD0nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMucm93SWQgKw0KICAgICAgICAgICAgICAgICAgJyZ0b2tlbj0nICsNCiAgICAgICAgICAgICAgICAgIHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLnRva2VuDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgLy/pnIDopoHnmbvlvZUNCiAgICAgICAgICAgICAgICB0aGlzLlFSQ29kZXVybCA9DQogICAgICAgICAgICAgICAgICByZXEuZ2V0Q29udGV4dCgpLm1vYmlsZSArDQogICAgICAgICAgICAgICAgICAnL1FSQ29kZUZvcm0vJyArDQogICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgICAgICcvZ2V0P2lkPScgKw0KICAgICAgICAgICAgICAgICAgdGhpcy5yb3dJZA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvLyBCYXNlNjQuZW5jb2RlKHRoaXMuJHN0b3JlLnN0YXRlLmxvZ2luLmN1cnJlbnRVc2VyLmFjY291bnQpOw0KICAgICAgICAgICAgbGV0IG1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdRUkNvZGUnKQ0KDQogICAgICAgICAgICBRUkNvZGUudG9DYW52YXMobXNnLCB0aGlzLlFSQ29kZXVybCwgZnVuY3Rpb24oZXJyb3IpIHsNCiAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVTaG93ID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UVJDb2RlKA0KICAgICAgICAgICAgdGVtcGxhdGVJZCwNCiAgICAgICAgICAgIGlkLA0KICAgICAgICAgICAgbW9iaWxlRm9ybUFsaWFzLA0KICAgICAgICAgICAgZGlzcGxheSwNCiAgICAgICAgICAgIGluZGV4LA0KICAgICAgICAgICAgUVJDb2RlUGF0dGVybg0KICAgICAgICAgICkgew0KICAgICAgICAgICAgdGhpcy5RUkNvZGVQYXR0ZXJuID0gUVJDb2RlUGF0dGVybg0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjID0gW10NCiAgICAgICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgZGlzcGxheS5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICBsZXQgaXRlbSA9IEpTT04ucGFyc2UoZGlzcGxheVt4XSkNCiAgICAgICAgICAgICAgaWYgKHRoaXMucm93c1tpbmRleF1baXRlbS5uYW1lXSkgew0KICAgICAgICAgICAgICAgIHRoaXMuUVJDb2RlRGVzYy5wdXNoKA0KICAgICAgICAgICAgICAgICAgaXRlbS5kZXNjICsgJzonICsgdGhpcy5yb3dzW2luZGV4XVtpdGVtLm5hbWVdDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLm1vYmlsZUZvcm1BbGlhcyA9IG1vYmlsZUZvcm1BbGlhcw0KICAgICAgICAgICAgdGhpcy5RUkNvZGVTaG93ID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlRGlhbG9nID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy5yb3dUZW1wbGF0ZUlkID0gdGVtcGxhdGVJZA0KICAgICAgICAgICAgdGhpcy5yb3dJZCA9IGlkDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVTaXplQ2hhbmdlOiBmdW5jdGlvbihzaXplKSB7DQogICAgICAgICAgICAvL+avj+mhteS4i+aLieaYvuekuuaVsOaNrg0KICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplID0gc2l6ZQ0KICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlQ3VycmVudENoYW5nZTogZnVuY3Rpb24oY3VycmVudFBhZ2UpIHsNCiAgICAgICAgICAgIC8v54K55Ye756ys5Yeg6aG1DQogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IGN1cnJlbnRQYWdlDQogICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRQYXJhbSgpIHsNCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7fQ0KICAgICAgICAgICAgaWYgKHN0ciA9PSAnZmluZCcpIHsNCiAgICAgICAgICAgICAgLy8gdGhpcy4kc3RvcmUuZGlzcGF0Y2goImZvcm0vc2V0QnBtVGVtcGxhdGVQYWdpbmF0aW9uUGFnZU51bSIsIDEpOw0KICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy/liKTmlq3kuLrlkIjlubbmn6Xor6Lov5jmmK/liIblvIDmn6Xor6INCiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7DQogICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblkIjlubbmn6Xor6INCiAgICAgICAgICAgICAgaWYgKCQoJy5zZWFyY2gtcXVlcnknKS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRDb25kaXRpb25RdWVyeSgpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKA0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiAmJg0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiAmJg0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMNCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICBsZXQgdGVtcFF1ZXJ5UyA9IFtdDQogICAgICAgICAgICAgIGxldCBiZXR3ZWVuQ29uZGl0aW9ucyA9IHt9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cy5mb3JFYWNoKHEgPT4gew0KICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgIHEudmFsdWUgJiYNCiAgICAgICAgICAgICAgICAgIChxLm9wZXJhdGlvbiAhPSAnQkVUV0VFTicgfHwgcS52YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheSkNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChxKQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocS52YWx1ZSkgew0KICAgICAgICAgICAgICAgICAgbGV0IGNvbmRpdGlvbnMgPSBxDQogICAgICAgICAgICAgICAgICBpZiAoYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0pIHsNCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucyA9IGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldDQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUgPSBbY29uZGl0aW9ucy52YWx1ZV0NCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucy52YWx1ZS5wdXNoKHEudmFsdWUpDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XSA9IGNvbmRpdGlvbnMNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGJldHdlZW5Db25kaXRpb25zKSB7DQogICAgICAgICAgICAgICAgdGVtcFF1ZXJ5Uy5wdXNoKGJldHdlZW5Db25kaXRpb25zW2tleV0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gdGVtcFF1ZXJ5Uw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgIH0sDQogICAgICAgICAgc2VhcmNoKHN0cikgew0KICAgICAgICAgICAgY29uc3QgbG9hZGluZyA9IHRoaXMuJGxvYWRpbmcodGhpcy5vcHRpb25zKQ0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt9DQogICAgICAgICAgICBpZiAoc3RyID09ICdmaW5kJykgew0KICAgICAgICAgICAgICAvLyB0aGlzLiRzdG9yZS5kaXNwYXRjaCgiZm9ybS9zZXRCcG1UZW1wbGF0ZVBhZ2luYXRpb25QYWdlTnVtIiwgMSk7DQogICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/liKTmlq3kuLrlkIjlubbmn6Xor6Lov5jmmK/liIblvIDmn6Xor6INCiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1UeXBlKSB7DQogICAgICAgICAgICAgIHBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlGaWx0ZXIoKQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblkIjlubbmn6Xor6INCiAgICAgICAgICAgICAgaWYgKCQoJy5zZWFyY2gtcXVlcnknKS5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRDb25kaXRpb25RdWVyeSgpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcGFyYW1zID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChwYXJhbXMucGFnaW5hdGlvbiAmJiBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMpIHsNCiAgICAgICAgICAgICAgbGV0IHRlbXBRdWVyeVMgPSBbXQ0KICAgICAgICAgICAgICBsZXQgYmV0d2VlbkNvbmRpdGlvbnMgPSB7fQ0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuZm9yRWFjaChxID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICBxLnZhbHVlICYmDQogICAgICAgICAgICAgICAgICAocS5vcGVyYXRpb24gIT0gJ0JFVFdFRU4nIHx8IHEudmFsdWUuY29uc3RydWN0b3IgPT0gQXJyYXkpDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICB0ZW1wUXVlcnlTLnB1c2gocSkNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEudmFsdWUpIHsNCiAgICAgICAgICAgICAgICAgIGxldCBjb25kaXRpb25zID0gcQ0KICAgICAgICAgICAgICAgICAgaWYgKGJldHdlZW5Db25kaXRpb25zW3EucHJvcGVydHldKSB7DQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgPSBiZXR3ZWVuQ29uZGl0aW9uc1txLnByb3BlcnR5XQ0KICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zLnZhbHVlID0gW2NvbmRpdGlvbnMudmFsdWVdDQogICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMudmFsdWUucHVzaChxLnZhbHVlKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgYmV0d2VlbkNvbmRpdGlvbnNbcS5wcm9wZXJ0eV0gPSBjb25kaXRpb25zDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBiZXR3ZWVuQ29uZGl0aW9ucykgew0KICAgICAgICAgICAgICAgIHRlbXBRdWVyeVMucHVzaChiZXR3ZWVuQ29uZGl0aW9uc1trZXldKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uLnF1ZXJ5cyA9IHRlbXBRdWVyeVMNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzDQogICAgICAgICAgICAgICAgPyBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuY29uY2F0KHRoaXMudHJlZVF1ZXJ5cykNCiAgICAgICAgICAgICAgICA6IHRoaXMudHJlZVF1ZXJ5cw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/miorov4fmu6TmoJHnmoTmnaHku7bkuZ/mi7zmjqXov5vljrsNCiAgICAgICAgICAgIGlmICh0aGlzLnRyZWVRdWVyeXMgJiYgdGhpcy50cmVlUXVlcnlzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzID0gcGFyYW1zLnBhZ2luYXRpb24ucXVlcnlzDQogICAgICAgICAgICAgICAgPyBwYXJhbXMucGFnaW5hdGlvbi5xdWVyeXMuY29uY2F0KHRoaXMudHJlZVF1ZXJ5cykNCiAgICAgICAgICAgICAgICA6IHRoaXMudHJlZVF1ZXJ5cw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvL+aVsOaNruinhuWbvuaOp+S7tg0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgICAgIHBhcmFtcy5yZWZJZFZhbHVlID0gdGhpcy5kYXRhVmlldy5yZWZJZFZhbHVlDQogICAgICAgICAgICAgIC8v5YWz6IGU5p+l6K+i5a2X5q61DQogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZQ0KICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoJC5pc0VtcHR5T2JqZWN0KHRoaXMuc2VhcmNoRm9ybSkpIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgICAgLnRoZW4ocmVzcG9uc2UgPT4gew0KICAgICAgICAgICAgICAgICAgdGhpc18ucm93cyA9IHJlc3BvbnNlLmRhdGEucm93cw0KICAgICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgICB0aGlzXy5wYWdpbmF0aW9uLnBhZ2UgPSByZXNwb25zZS5kYXRhLnBhZ2UNCiAgICAgICAgICAgICAgICAgIHRoaXNfLnBhZ2luYXRpb24ucGFnZVNpemUgPSByZXNwb25zZS5kYXRhLnBhZ2VTaXplDQogICAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UXVlcnlGaWx0ZXIoKSB7DQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0gdGhpcy5nZXRTZWFyY2hJdGVtcygpDQogICAgICAgICAgICBsZXQgZmllbGRUeXBlTWFwID0gdGhpcy5nZXRGaWVsZFR5cGUoKQ0KICAgICAgICAgICAgbGV0IHNwZWNpYWxNYXAgPSB0aGlzLmdldFNwZWNpYWxNYXAoKQ0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdIC8v5p+l6K+i5p2h5Lu2DQogICAgICAgICAgICBsZXQgcXVlcnlGaWx0ZXIgPSB7fQ0KICAgICAgICAgICAgbGV0IHBhZ2VCZWFuID0ge3BhZ2VCZWFuOiB0aGlzLnBhZ2luYXRpb259DQogICAgICAgICAgICBsZXQgcGFyYW1zID0ge3RlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkfQ0KICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBwYWdlQmVhbg0KICAgICAgICAgICAgaWYgKCQuaXNFbXB0eU9iamVjdCh0aGlzLnNlYXJjaEZvcm0pKSB7DQogICAgICAgICAgICAgIHJldHVybiBwYXJhbXMNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnNlYXJjaEZvcm0pIHsNCiAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5zZWFyY2hGb3JtW2tleV0gIT0gJ3VuZGVmaW5lZCcgJiYNCiAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoRm9ybVtrZXldICE9ICcnICYmDQogICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaEZvcm1ba2V5XSAhPSBudWxsDQogICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hGb3JtW2tleV0gaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2VhcmNoRm9ybVtrZXldLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNlYXJjaEZvcm1ba2V5XVtpXSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9wZXJhdGlvbk1hcFtrZXldLA0KICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlYXJjaEZvcm1ba2V5XS5pbmNsdWRlcygnLCcpICYmICFzcGVjaWFsTWFwW2tleV0pIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IGFyciA9IHRoaXMuc2VhcmNoRm9ybVtrZXldLnNwbGl0KCcsJykNCiAgICAgICAgICAgICAgICAgICAgYXJyLmZvckVhY2godiA9PiB7DQogICAgICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGtleSwNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LA0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sDQogICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5zZWFyY2hGb3JtW2tleV0NCiAgICAgICAgICAgICAgICAgICAgLy/mlbTmlbDnsbvlnosNCiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkVHlwZU1hcFtrZXldICYmIGZpZWxkVHlwZU1hcFtrZXldID09ICdudW1iZXInKSB7DQogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHRoaXMuc2VhcmNoRm9ybVtrZXldKQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eToga2V5LA0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogb3BlcmF0aW9uTWFwW2tleV0sDQogICAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHRoaXMuY2xlYXJRdWVyeUJ5R3JvdXBOYW1lKHF1ZXJ5cywgJ2ZpbHRlcicpDQogICAgICAgICAgICAgIC8vIOWwhui/h+a7pOadoeS7tua3u+WKoOafpeivouWPguaVsOaVsOe7hOS4rQ0KICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIGxldCBwcmVmaXggPSB0aGlzLnRlbXBsYXRlSW5mby5pc0V4dGVybmFsID09PSAxID8gJycgOiAnRl8nDQogICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5maWx0ZXJzKS5mb3JFYWNoKGsgPT4gew0KICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSB7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBwcmVmaXggKyBrLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ2ZpbHRlcicsDQogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnQU5EJw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnRVFVQUwnDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXIubGVuZ3RoID4gMSkgew0KICAgICAgICAgICAgICAgICAgICBxdWVyeS5vcGVyYXRpb24gPSAnSU4nDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyDQogICAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwgcXVlcnlzfQ0KICAgICAgICAgICAgICAvL+WmguaenOacieiuvue9rum7mOiupOaOkuW6jyzkvJjlhYjkvb/nlKjpu5jorqTmjpLluo8NCiAgICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkgew0KICAgICAgICAgICAgICAgIGxldCBzb3J0RmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnNvcnRGaWVsZCkNCiAgICAgICAgICAgICAgICBsZXQgc29ydGVyID0gW10NCiAgICAgICAgICAgICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNvcnRGaWVsZC5sZW5ndGg7IHgrKykgew0KICAgICAgICAgICAgICAgICAgc29ydGVyLnB1c2goeydwcm9wZXJ0eSc6IHNvcnRGaWVsZFt4XS5uYW1lLCAnZGlyZWN0aW9uJzogc29ydEZpZWxkW3hdLnNvcnR9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBxdWVyeUZpbHRlci5zb3J0ZXIgPSBzb3J0ZXINCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBpZiAodGhpcy5zb3J0ZXIgJiYgdGhpcy5zb3J0ZXIubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICAgIHF1ZXJ5RmlsdGVyLnNvcnRlciA9IHRoaXMuc29ydGVyDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcg0KICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICAvLyDpgJrov4fliIbnu4TlkI3np7DmuIXpmaTlr7nlupTmn6Xor6LmnaHku7YNCiAgICAgICAgICBjbGVhclF1ZXJ5QnlHcm91cE5hbWUocXVlcnlzLCBncm91cE5hbWUpIHsNCiAgICAgICAgICAgIC8vIOW+heWIoOmZpOeahOafpeivouadoeS7tg0KICAgICAgICAgICAgbGV0IHRvRGVsZXRlID0gW10NCiAgICAgICAgICAgIHF1ZXJ5cyAmJg0KICAgICAgICAgICAgcXVlcnlzLmZvckVhY2gocXVlcnkgPT4gew0KICAgICAgICAgICAgICBpZiAocXVlcnkuZ3JvdXAgPT0gZ3JvdXBOYW1lKSB7DQogICAgICAgICAgICAgICAgdG9EZWxldGUucHVzaChxdWVyeSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIHRvRGVsZXRlLmZvckVhY2goZCA9PiB7DQogICAgICAgICAgICAgIHF1ZXJ5cy5yZW1vdmUoZCkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVTb3J0Q2hhbmdlKGNvbHVtbikgew0KICAgICAgICAgICAgaWYgKCFjb2x1bW4ub3JkZXIpIHsNCiAgICAgICAgICAgICAgdGhpcy5zb3J0ZXIgPSBudWxsDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLnNvcnRlciA9IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogY29sdW1uLnByb3AsDQogICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IGNvbHVtbi5vcmRlciA9PSAnYXNjZW5kaW5nJyA/ICdBU0MnIDogJ0RFU0MnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBdDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgfSwNCiAgICAgICAgICBoYW5kbGVGaWx0ZXJDaGFuZ2UobSkgew0KICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gey4uLnRoaXMuZmlsdGVycywgLi4ubX0NCiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykuZm9yRWFjaChrID0+IHsNCiAgICAgICAgICAgICAgaWYgKCF0aGlzLmZpbHRlcnNba10gfHwgdGhpcy5maWx0ZXJzW2tdLmxlbmd0aCA9PSAwKSB7DQogICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyc1trXQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0U2VhcmNoSXRlbXMoKSB7DQogICAgICAgICAgICBsZXQgc2VhcmNoSXRlbXMgPSAkKCcuc2VhcmNoLWl0ZW0nKQ0KICAgICAgICAgICAgbGV0IG9wZXJhdGlvbk1hcCA9IHt9DQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uVHlwZSA9IHsNCiAgICAgICAgICAgICAgbGlrZTogJ0xJS0UnLA0KICAgICAgICAgICAgICBlcXVhbDogJ0VRVUFMJywNCiAgICAgICAgICAgICAgYmV0d2VlbjogJ0JFVFdFRU4nLA0KICAgICAgICAgICAgICBsZWZ0X2xpa2U6ICdMRUZUX0xJS0UnLA0KICAgICAgICAgICAgICByaWdodF9saWtlOiAnUklHSFRfTElLRScNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9ICc9Jw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cignb3BlcmF0aW9uJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFskKHNlYXJjaEl0ZW1zW2ldKS5hdHRyKCdodC1xdWVyeScpXSA9DQogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0gIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICAgICAgICA/IG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXQ0KICAgICAgICAgICAgICAgICAgICAgIDogb3BlcmF0aW9uDQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICgNCiAgICAgICAgICAgICAgICAgIHR5cGVvZiAkKHNlYXJjaEl0ZW1zW2ldKQ0KICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ29wZXJhdGlvbicpDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbDQogICAgICAgICAgICAgICAgICAgICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgICAuYXR0cignaHQtcXVlcnknKQ0KICAgICAgICAgICAgICAgICAgICBdID0NCiAgICAgICAgICAgICAgICAgICAgdHlwZW9mIG9wZXJhdGlvblR5cGVbb3BlcmF0aW9uXSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICAgICAgICAgID8gb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dDQogICAgICAgICAgICAgICAgICAgICAgOiBvcGVyYXRpb24NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBvcGVyYXRpb25NYXANCiAgICAgICAgICB9LA0KICAgICAgICAgIGdldEZpZWxkVHlwZSgpIHsNCiAgICAgICAgICAgIGxldCBzZWFyY2hJdGVtcyA9ICQoJy5zZWFyY2gtaXRlbScpDQogICAgICAgICAgICBsZXQgb3BlcmF0aW9uTWFwID0ge30NCiAgICAgICAgICAgIGxldCBvcGVyYXRpb25UeXBlID0gew0KICAgICAgICAgICAgICBudW1iZXI6ICdudW1iZXInLA0KICAgICAgICAgICAgICB0ZXh0OiAndGV4dCcNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChzZWFyY2hJdGVtcykgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlYXJjaEl0ZW1zLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgbGV0IG9wZXJhdGlvbiA9ICc9Jw0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gJChzZWFyY2hJdGVtc1tpXSkuYXR0cigndHlwZScpDQogICAgICAgICAgICAgICAgICBvcGVyYXRpb25NYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0NCiAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhdGlvbg0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9ICQoc2VhcmNoSXRlbXNbaV0pDQogICAgICAgICAgICAgICAgICAgIC5jaGlsZHJlbigpDQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd0eXBlJykNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbk1hcFsNCiAgICAgICAgICAgICAgICAgICAgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgICAuY2hpbGRyZW4oKQ0KICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdodC1xdWVyeScpDQogICAgICAgICAgICAgICAgICAgIF0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2Ygb3BlcmF0aW9uVHlwZVtvcGVyYXRpb25dICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgICAgICAgPyBvcGVyYXRpb25UeXBlW29wZXJhdGlvbl0NCiAgICAgICAgICAgICAgICAgICAgICA6IG9wZXJhdGlvbg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIG9wZXJhdGlvbk1hcA0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/ojrflj5bnibnmrormn6Xor6Lmg4XlhrXvvIjoh6rlrprkuYnlr7nor53moYbvvIkNCiAgICAgICAgICBnZXRTcGVjaWFsTWFwKCkgew0KICAgICAgICAgICAgbGV0IHNlYXJjaEl0ZW1zID0gJCgnLnNlYXJjaC1pdGVtJykNCiAgICAgICAgICAgIGxldCBmaWVsZFF1ZXJ5TWFwID0ge30vL+afpeivouadoeS7tuWtl+autQ0KDQogICAgICAgICAgICBpZiAoc2VhcmNoSXRlbXMpIHsNCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWFyY2hJdGVtcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKSAhPSAndW5kZWZpbmVkJykgew0KICAgICAgICAgICAgICAgICAgLy/mn6Xor6LmnaHku7blrZfmrrUNCiAgICAgICAgICAgICAgICAgIGZpZWxkUXVlcnlNYXBbJChzZWFyY2hJdGVtc1tpXSkuYXR0cignaHQtcXVlcnknKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuYXR0cignc3BlY2lhbC1xdWVyeScpICE9ICd1bmRlZmluZWQnDQogICAgICAgICAgICAgICAgICAgICAgPyB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgOiBmYWxzZQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoDQogICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkNCiAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCkNCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2h0LXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICAgIC8v5p+l6K+i5p2h5Lu25a2X5q61DQogICAgICAgICAgICAgICAgICBmaWVsZFF1ZXJ5TWFwWyQoc2VhcmNoSXRlbXNbaV0pLmNoaWxkcmVuKCkuYXR0cignaHQtcXVlcnknKV0gPQ0KICAgICAgICAgICAgICAgICAgICB0eXBlb2YgJChzZWFyY2hJdGVtc1tpXSkuY2hpbGRyZW4oKS5hdHRyKCdzcGVjaWFsLXF1ZXJ5JykgIT0gJ3VuZGVmaW5lZCcNCiAgICAgICAgICAgICAgICAgICAgICA/IHRydWUNCiAgICAgICAgICAgICAgICAgICAgICA6IGZhbHNlDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gZmllbGRRdWVyeU1hcA0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0Q29uZGl0aW9uUXVlcnkoKSB7DQogICAgICAgICAgICBsZXQgc2VhcmNoQWxsID0gJCgnLnNlYXJjaC1xdWVyeScpDQogICAgICAgICAgICBsZXQgdmFsdWVzID0gJycNCiAgICAgICAgICAgIGxldCBxdWVyeXMgPSBbXSAvL+afpeivouadoeS7tg0KICAgICAgICAgICAgbGV0IHF1ZXJ5RmlsdGVyID0ge30NCiAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHtwYWdlQmVhbjogdGhpcy5wYWdpbmF0aW9ufQ0KICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHt0ZW1wbGF0ZUlkOiB0aGlzLnRlbXBsYXRlSW5mby5pZH0NCiAgICAgICAgICAgIHBhcmFtcy5wYWdpbmF0aW9uID0gcGFnZUJlYW4NCg0KICAgICAgICAgICAgLy8g5bCG6L+H5ruk5p2h5Lu25re75Yqg5p+l6K+i5Y+C5pWw5pWw57uE5LitDQogICAgICAgICAgICBpZiAodGhpcy5maWx0ZXJzICYmIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVycykubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBsZXQgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PT0gMSA/ICcnIDogJ0ZfJw0KICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcnMpLmZvckVhY2goayA9PiB7DQogICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5maWx0ZXJzW2tdDQogICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IHByZWZpeCArIGssDQogICAgICAgICAgICAgICAgICB2YWx1ZTogZmlsdGVyWzBdLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdmaWx0ZXInLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIubGVuZ3RoID09IDEpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdFUVVBTCcNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHF1ZXJ5KQ0KICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyLmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5Lm9wZXJhdGlvbiA9ICdJTicNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlID0gZmlsdGVyDQogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaChxdWVyeSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5Rm9ybS5xdWVyeURhdGEgPT0gJycpIHsNCiAgICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwgcXVlcnlzfQ0KICAgICAgICAgICAgICBwYXJhbXMucGFnaW5hdGlvbiA9IHF1ZXJ5RmlsdGVyDQogICAgICAgICAgICAgIHJldHVybiBwYXJhbXMNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICB0eXBlb2YgJCgkKHNlYXJjaEFsbFswXSkuY2hpbGRyZW4oKVswXSkuYXR0cigNCiAgICAgICAgICAgICAgICAgICdodC1xdWljay1zZWFyY2gnDQogICAgICAgICAgICAgICAgKSAhPSAndW5kZWZpbmVkJw0KICAgICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgICB2YWx1ZXMgPSAkKCQoc2VhcmNoQWxsWzBdKS5jaGlsZHJlbigpWzBdKS5hdHRyKA0KICAgICAgICAgICAgICAgICAgJ2h0LXF1aWNrLXNlYXJjaCcNCiAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgbGV0IGFyciA9IHZhbHVlcy5zcGxpdCgnLCcpDQogICAgICAgICAgICAgICAgZm9yIChsZXQgdmFsdWUgb2YgYXJyKSB7DQogICAgICAgICAgICAgICAgICBxdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiB2YWx1ZSwNCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnlGb3JtLnF1ZXJ5RGF0YSwNCiAgICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICAgICAgICAgIHJlbGF0aW9uOiAnT1InDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcXVlcnlGaWx0ZXIgPSB7cGFnZUJlYW46IHRoaXMucGFnaW5hdGlvbiwgcXVlcnlzfQ0KICAgICAgICAgICAgcGFyYW1zLnBhZ2luYXRpb24gPSBxdWVyeUZpbHRlcg0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtcw0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/miZPlvIDpq5jnuqfmo4DntKINCiAgICAgICAgICBhZHZhbmNlZCgpIHsNCiAgICAgICAgICAgIHRoaXMuZm9ybVR5cGUgPSAhdGhpcy5mb3JtVHlwZQ0KICAgICAgICAgICAgaWYgKHRoaXMuZm9ybVR5cGUpIHsNCiAgICAgICAgICAgICAgdGhpcy5pbmNvbnMgPSAnZWwtaWNvbi1hcnJvdy11cCcNCiAgICAgICAgICAgICAgdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhID0gJycNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHRoaXMuaW5jb25zID0gJ2VsLWljb24tYXJyb3ctZG93bicNCiAgICAgICAgICAgICAgdGhpcy5zZWFyY2hGb3JtID0ge30NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Zue6L2m5p+l6K+iDQogICAgICAgICAgc2VhcmNoRW50ZXJGdW46IGZ1bmN0aW9uKGUpIHsNCiAgICAgICAgICAgIGxldCBrZXlDb2RlID0gd2luZG93LmV2ZW50ID8gZS5rZXlDb2RlIDogZS53aGljaA0KICAgICAgICAgICAgaWYgKGtleUNvZGUgPT0gMTMpIHsNCiAgICAgICAgICAgICAgdGhpcy5zZWFyY2goJ2ZpbmQnKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgcmVzZXQoZmxhZykgew0KICAgICAgICAgICAgdGhpcy5xdWVyeUZvcm0ucXVlcnlEYXRhID0gJycNCiAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZCkgew0KICAgICAgICAgICAgICBsZXQgY29uZGl0aW9uRmllbGQgPSB1dGlscy5wYXJzZVRvSnNvbigNCiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlSW5mby5jb25kaXRpb25GaWVsZA0KICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZGl0aW9uRmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgZmllbGROYW1lID0gJ0ZfJyArIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWUNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zZWFyY2hGb3JtLCBmaWVsZE5hbWUsICcnKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLnNlYXJjaEZvcm0sIGNvbmRpdGlvbkZpZWxkW2ldLm5hbWUsICcnKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSB7fQ0KICAgICAgICAgICAgdGhpcy4kcmVmcy5tdWx0aXBsZVRlbXBsYXRlVGFibGUuY2xlYXJGaWx0ZXIoKQ0KICAgICAgICAgICAgaWYgKCFmbGFnKSB7DQogICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCdmaW5kJykNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVNlbGVjdGlvbkNoYW5nZSh2YWwpIHsNCiAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPSB2YWwNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRlbGV0ZWQoKSB7DQogICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fA0KICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlofku7bliKDpmaQhJykNCiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLiRjb25maXJtKCfmraTmk43kvZzlsIbliKDpmaTor6Xmlofku7YsIOaYr+WQpue7p+e7rT8nLCAn5o+Q56S6Jywgew0KICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICflj5bmtognLA0KICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgcyA9IFtdDQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICBzLnB1c2goDQogICAgICAgICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3NbaV1bdGhpcy50ZW1wbGF0ZUluZm8ucGtGaWVsZF0NCiAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgICAgICAgICAgICBpZHM6IHMuam9pbignLCcpLA0KICAgICAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRlbChpZCkgew0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5Yig6Zmk6K+l5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsNCiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB7aWRzOiBpZCwgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhc30NCiAgICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2RlbGV0ZVRlbXBsYXRlRGF0YUJ5SWQnLCBkYXRhKQ0KICAgICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb24ucGFnZSA9IDENCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbmZvJywNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Llj5bmtojliKDpmaQnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIG9wZXJhdGluZyh0ZW1wbGF0ZUlkLCBpZCwgYWN0aW9uLCBkZWZJZCwgaXNTdGFydEZsb3csIG9wZW5UeXBlKSB7DQogICAgICAgICAgICAvL2lzU3RhcnRGbG93IO+8iGZhbHNl77ya5Y+v5Lul5Y+R6LW35rWB56iL77yMdHJ1Ze+8muS4jeWPr+S7peWPkei1t+a1geeoi++8iQ0KICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkICYmICFpc1N0YXJ0Rmxvdykgew0KICAgICAgICAgICAgICAvL+WFiOmFjee9ruS4jeiDveWPkei1t+a1geeoiw0KICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICdhZGQnICYmIGlzU3RhcnRGbG93ID09ICcnKSB7DQogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSAnZWRpdCcgJiYgaXNTdGFydEZsb3cgPT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSB0cnVlDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgLy/lho3liKTmlq3mmK/lkKblj6/ku6Xlj5HotbfmtYHnqIsNCiAgICAgICAgICAgICAgbGV0IG1hbmFnZUZpZWxkID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCkNCiAgICAgICAgICAgICAgLy/liKTmlq3mmK/lkKbphY3nva7kuoblj5HotbfmtYHnqIvmjInpkq4NCiAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtYW5hZ2VGaWVsZC5sZW5ndGg7IGsrKykgew0KICAgICAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gJ2FkZCcgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAnc3RhcnRGbG93Jykgew0KICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSAnZWRpdCcgJiYgbWFuYWdlRmllbGRba10ubmFtZSA9PSAnc3RhcnRGbG93Jykgew0KICAgICAgICAgICAgICAgICAgaXNTdGFydEZsb3cgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmICghdGVtcGxhdGVJZCkgew0KICAgICAgICAgICAgICB0ZW1wbGF0ZUlkID0gdGhpcy50ZW1wbGF0ZUluZm8uaWQNCiAgICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uID09ICdzZWxlY3QnID8gJ2dldCcgOiAnYWRkJw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgLy/mlbDmja7op4blm77pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0gIOW5tuS4lOW9k+WJjeaVsOaNruinhuWbvuS4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbviAgZGF0YVZpZXcNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJg0KICAgICAgICAgICAgICAhdGhpcy5kYXRhVmlldyAmJg0KICAgICAgICAgICAgICAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykNCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvdGVtcGxhdGUvZm9ybS8nICsNCiAgICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUtleSArDQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIGFjdGlvbg0KICAgICAgICAgICAgaWYgKHRoaXMuaXNKb2luRmxvdykgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9ICdzdGF0ZW1lbnQnDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodGhpcy5zaW5nbGUgPT0gJ3RydWUnKSB7DQogICAgICAgICAgICAgIHVybCA9DQogICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICAgJy90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVLZXkgKw0KICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgYWN0aW9uICsNCiAgICAgICAgICAgICAgICAnL3RydWUnDQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+WIpOaWreaVsOaNruinhuWbvuaOp+S7tg0KICAgICAgICAgICAgbGV0IGlzRGF0YVZpZXcgPSBmYWxzZQ0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcuYm9EZWZBbGlhcyAmJiB0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgIT0gJycpIHsNCiAgICAgICAgICAgICAgICBpc0RhdGFWaWV3ID0gdHJ1ZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChvcGVuVHlwZSA9PSAnbmV3JyB8fCB0aGlzLmlzSm9pbkZsb3cgfHwgaXNEYXRhVmlldykgew0KICAgICAgICAgICAgICB1cmwgKz0gJy9uZXcnDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChpZCkgew0KICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnP2lkPScgKyBpZCArICcmJw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdXJsICs9ICc/Jw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IHN0YXJ0Rmxvd1N0ciA9ICdzdGFydEZsb3c9ZmFsc2UnDQogICAgICAgICAgICBpZiAoYWN0aW9uID09ICdhZGQnICYmIGRlZklkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSkgew0KICAgICAgICAgICAgICBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PXRydWUnDQogICAgICAgICAgICB9IGVsc2UgaWYgKGlkICYmIGlzU3RhcnRGbG93ID09PSBmYWxzZSAmJiBkZWZJZCkgew0KICAgICAgICAgICAgICBzdGFydEZsb3dTdHIgPSAnc3RhcnRGbG93PXRydWUnDQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgZGF0YVVybCA9ICcnDQogICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldykgew0KICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVmlldy5iaW5kTGlzdCAmJiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBsZXQgYmluZExpc3QgPSBbXQ0KICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kYXRhVmlldy5iaW5kTGlzdC5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB7a2V5OiB0aGlzLmRhdGFWaWV3LmJpbmRMaXN0W2ldLmJpbmRGaWxsZCwgdmFsdWU6IHRoaXMuZGF0YVZpZXcuYmluZExpc3RbaV0uZmlsbFZhbHVlfQ0KICAgICAgICAgICAgICAgICAgYmluZExpc3QucHVzaChpdGVtKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBkYXRhVXJsID0gJyZiaW5kTGlzdD0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEJhc2U2NC5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoYmluZExpc3QpKSkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHINCiAgICAgICAgICAgIGlmIChkYXRhVXJsICE9ICcnKSB7DQogICAgICAgICAgICAgIHBhdGggPSB1cmwgKyBzdGFydEZsb3dTdHIgKyBkYXRhVXJsDQogICAgICAgICAgICB9DQogICAgICAgICAgICBkZWJ1Z2dlcjsNCiAgICAgICAgICAgIC8vVE9ETyDlpoLmnpzmmK/mqKHlnZflvIDlj5Eg5YWo6YOo5bey5paw56qX5Y+j5omT5byADQogICAgICAgICAgICBpZiAob3BlblR5cGUgPT0gJ25ldycgfHwgdGhpcy5pc0pvaW5GbG93IHx8IGlzRGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgd2luZG93Lm9wZW4oDQogICAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnJlc29sdmUocGF0aC5yZXBsYWNlKHRoaXMuYWxpYXNfbmV3LCAnc3RhdGVtZW50JykgKyAnJmlzTmV3UGFnZT10cnVlJykuaHJlZiwNCiAgICAgICAgICAgICAgICAnX2JsYW5rJw0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKCdvdGhlcm1lbnUnKSAhPSAtMSkgew0KICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoJy9vdGhlcm1lbnUnLCAnL3N0YXRlbWVudCcpDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2gocGF0aCkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIG9wZW5VcmwodXJsLCB0eXBlLCByb3csIGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgaWYgKHJvdyAmJiBmaWVsZE5hbWUpIHsNCiAgICAgICAgICAgICAgdXJsID0gdGhpcy5oYW5kbGVkVXJsUGFyYW1zKHVybCwgcm93LCBmaWVsZE5hbWUpDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAodHlwZSA9PSAnbmV3Jykgew0KICAgICAgICAgICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmwNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZWRVcmxQYXJhbXModXJsLCByb3csIGZpZWxkTmFtZSkgew0KICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgew0KICAgICAgICAgICAgICBsZXQgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UodGhpcy50ZW1wbGF0ZUluZm8uZGlzcGxheUZpZWxkKQ0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goZGlzcGxheSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGRpc3BsYXkubmFtZSA9PSBmaWVsZE5hbWUpIHsNCiAgICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5LnVybFBhcmFtcyAmJiBkaXNwbGF5LnVybFBhcmFtcy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCB1cmxQYXJhbXMgPSBkaXNwbGF5LnVybFBhcmFtcw0KICAgICAgICAgICAgICAgICAgICBsZXQgc3VmZml4ID0gJycNCiAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zLmZvckVhY2gocGFyYW0gPT4gew0KICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWZmaXgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpeCArPSAnJicNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4ICsgcGFyYW0ubmFtZSArICc9JyArIHJvd1twYXJhbS5maWVsZF0NCiAgICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICAgICAgaWYgKHN1ZmZpeCkgew0KICAgICAgICAgICAgICAgICAgICAgIGlmICh1cmwuaW5kZXhPZignPycpICE9IC0xKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSB1cmwgKyAnJicgKyBzdWZmaXgNCiAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gdXJsICsgJz8nICsgc3VmZml4DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1cmwNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHVybA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB1cmwNCiAgICAgICAgICB9LA0KICAgICAgICAgIHZpZXdSZXBvcnQoZGF0YSwganNvblN0ciwgb3BlblR5cGUpIHsNCiAgICAgICAgICAgIGxldCBpdGVtID0gSlNPTi5wYXJzZShCYXNlNjQuZGVjb2RlKGpzb25TdHIpKQ0KICAgICAgICAgICAgbGV0IGNvbmRpdGlvbkZpZWxkID0gaXRlbS5jb25kaXRpb25GaWVsZA0KICAgICAgICAgICAgbGV0IHF1ZXJ5cyA9IFtdDQogICAgICAgICAgICBpZiAoY29uZGl0aW9uRmllbGQgJiYgY29uZGl0aW9uRmllbGQubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBjb25kaXRpb25GaWVsZC5mb3JFYWNoKG9iaiA9PiB7DQogICAgICAgICAgICAgICAgaWYgKG9iai5wYXJhbWV0ZXIpIHsNCiAgICAgICAgICAgICAgICAgIHF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IG9iai5rZXksDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhW29iai5wYXJhbWV0ZXJdLA0KICAgICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb246IG9iai5xdCwNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5pWw5o2u6ZqP5py65re75Yqg5Yiw5YW25LuW6I+c5Y2V5LiL6Z2i5pe26I635Y+W5b2T5YmN6I+c5Y2V55qE5Yir5ZCNDQogICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnLycgKw0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyArDQogICAgICAgICAgICAgICcvdGVtcGxhdGUvcHJldmlldy8nICsNCiAgICAgICAgICAgICAgaXRlbS5hbGlhcyArDQogICAgICAgICAgICAgICcvZmFsc2UvJyArDQogICAgICAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChCYXNlNjQuZW5jb2RlKEpTT04uc3RyaW5naWZ5KHF1ZXJ5cykpKQ0KICAgICAgICAgICAgLy91cmwg6L2s56CB6Ziy5q2i5pyJ5pac5p2gIOWvvOiHtOi3r+eUsei3s+i9rOS4jeWvuQ0KICAgICAgICAgICAgaWYgKG9wZW5UeXBlID09ICduZXcnKSB7DQogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHRoaXMuJHJvdXRlci5yZXNvbHZlKHVybCkuaHJlZiwgJ19ibGFuaycpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRyb3V0ZXIucHVzaCh1cmwpDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBzdGFydEZsb3coaWQpIHsNCiAgICAgICAgICAgIGxldCBkYXRhID0gew0KICAgICAgICAgICAgICBkZWZLZXk6IHRoaXMudGVtcGxhdGVJbmZvLmRlZklkLA0KICAgICAgICAgICAgICBidXNpbmVzc0tleTogaWQsDQogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBsb2FkaW5nSW5zdGFuY2UgPSBMb2FkaW5nLnNlcnZpY2Uoe2Z1bGxzY3JlZW46IHRydWV9KSAvL+W8gOWniw0KICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgLmRpc3BhdGNoKCdzdG9yZVByb2Nlc3Mvc3RhcnRGb3JtJywgZGF0YSkNCiAgICAgICAgICAgICAgLnRoZW4ocmVzdWx0ID0+IHsNCiAgICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN0YXRlKSB7DQogICAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlLnN1Y2Nlc3MocmVzdWx0Lm1lc3NhZ2UpDQogICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaCgpDQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS5lcnJvcihyZXN1bHQubWVzc2FnZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+eCueWHu+WvvOWHuuaMiemSrg0KICAgICAgICAgIGV4cG9ydHMoZXhwb3J0U2V0dGluZ0ZpZWxkcykgew0KICAgICAgICAgICAgbGV0IGRpc3BsYXlGaWVsZHMgPSBbXQ0KICAgICAgICAgICAgaWYgKGV4cG9ydFNldHRpbmdGaWVsZHMpIHsNCiAgICAgICAgICAgICAgZGlzcGxheUZpZWxkcyA9IEpTT04ucGFyc2UoQmFzZTY0LmRlY29kZShleHBvcnRTZXR0aW5nRmllbGRzKSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChkaXNwbGF5RmllbGRzLmxlbmd0aCA9PSAwICYmIHRoaXMudGVtcGxhdGVJbmZvLmRpc3BsYXlGaWVsZCkgew0KICAgICAgICAgICAgICBkaXNwbGF5RmllbGRzID0gSlNPTi5wYXJzZSh0aGlzLnRlbXBsYXRlSW5mby5kaXNwbGF5RmllbGQpDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLmV4cG9ydFR5cGUgPSAnbWFpbicNCiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcyA9IFtdDQogICAgICAgICAgICBkaXNwbGF5RmllbGRzLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgIGlmIChpdGVtLnR5cGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMucHVzaChpdGVtKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaW1wb3J0Q29tbWFuZChwYXJhbXMpIHsNCiAgICAgICAgICAgIHN3aXRjaCAocGFyYW1zLmNvbW1hbmQpIHsNCiAgICAgICAgICAgICAgY2FzZSAnZG93bmxvYWRUZW1wRmlsZSc6DQogICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZE1haW5UZW1wRmlsZSgpDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgY2FzZSAnaW1wb3J0TWFpbic6DQogICAgICAgICAgICAgICAgdGhpcy5pbXBvcnRNYWluKCkNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICBjYXNlICdsb2cnOg0KICAgICAgICAgICAgICAgIHRoaXMub3BlbkxvZygpDQogICAgICAgICAgICAgICAgYnJlYWsNCiAgICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgb3BlbkxvZygpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIGRvd25sb2FkTWFpblRlbXBGaWxlKCkgew0KICAgICAgICAgICAgbGV0IGN1c3RvbVRlbXBsYXRlSWQgPSAnJw0KICAgICAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVJbmZvICYmIHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKSB7DQogICAgICAgICAgICAgIGxldCBtYW5hZ2VGaWVsZExpc3QgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLm1hbmFnZUZpZWxkKQ0KICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWFuYWdlRmllbGRMaXN0Lmxlbmd0aDsgaW5kZXgrKykgew0KICAgICAgICAgICAgICAgIGxldCBtYW5hZ2UgPSBtYW5hZ2VGaWVsZExpc3RbaW5kZXhdDQogICAgICAgICAgICAgICAgaWYgKG1hbmFnZS5uYW1lID09ICdpbXBvcnQnKSB7DQogICAgICAgICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgICAgICAgIG1hbmFnZS5pbXBvcnRUZW1wbGF0ZSAmJg0KICAgICAgICAgICAgICAgICAgICBtYW5hZ2UuaW1wb3J0VGVtcGxhdGUubGVuZ3RoID4gMA0KICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGN1c3RvbVRlbXBsYXRlSWQgPSBtYW5hZ2UuaW1wb3J0VGVtcGxhdGVbMF0uaWQNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGJyZWFrDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmIChjdXN0b21UZW1wbGF0ZUlkKSB7DQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCdtZW51L2Rvd25sb2FkRmlsZScsIGN1c3RvbVRlbXBsYXRlSWQpDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBsZXQgbG9hZGluZ0luc3RhbmNlID0gTG9hZGluZy5zZXJ2aWNlKHtmdWxsc2NyZWVuOiB0cnVlfSkgLy/lvIDlp4sNCiAgICAgICAgICAgICAgdGhpcy4kc3RvcmUNCiAgICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZG93bmxvYWRNYWluVGVtcEZpbGUnLCB0aGlzLnRlbXBsYXRlSW5mby5hbGlhcykNCiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7DQogICAgICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC5jYXRjaChjID0+IHsNCiAgICAgICAgICAgICAgICAgIGxvYWRpbmdJbnN0YW5jZS5jbG9zZSgpDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KDQogICAgICAgICAgaW1wb3J0TWFpbihwYXJhbSkgew0KICAgICAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCkNCiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpDQoNCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7DQogICAgICAgICAgICAgIGRhdGE6IGZvcm1EYXRhLA0KICAgICAgICAgICAgICBhbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYWxpYXMNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVZpZXcpIHsNCiAgICAgICAgICAgICAgdGhpcy5oYW5kZWxCaW5kRmlsZWRWYWx1YSgpDQogICAgICAgICAgICAgIHBhcmFtcy5iaW5kRmlsbGQgPSB0aGlzLmRhdGFWaWV3LmJpbmRGaWxsZCB8fCAnJw0KICAgICAgICAgICAgICBwYXJhbXMuZmlsbFZhbHVlID0gdGhpcy5kYXRhVmlldy5maWxsVmFsdWUgfHwgJycNCiAgICAgICAgICAgICAgcGFyYW1zLnJlZklkVmFsdWUgPSB0aGlzLmRhdGFWaWV3LnJlZklkVmFsdWUNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgbGV0IGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7ZnVsbHNjcmVlbjogdHJ1ZX0pIC8v5byA5aeLDQogICAgICAgICAgICBmb3JtLm1haW5JbXBvcnQocGFyYW1zLCBkYXRhID0+IHsNCiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCkgLy8g57uT5p2fDQogICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7DQogICAgICAgICAgICAgICAgLy/lr7zlhaXmiJDlip/kuYvlkI7ph43mlrDmuLLmn5PlvZPliY3nu4Tku7YNCiAgICAgICAgICAgICAgICB0aGlzLiRwYXJlbnQucmVmcmVzaFRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKQ0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdzdWNjZXNzJywgbWVzc2FnZTogZGF0YS5tZXNzYWdlfSkNCiAgICAgICAgICAgICAgICBwYXJhbS5vblN1Y2Nlc3MoKQ0KICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCdmb3JtSW1wb3J0VGVtcFJlZklkJykpIHsNCiAgICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShkYXRhLnZhbHVlKQ0KICAgICAgICAgICAgICAgICAganNvbi5ib0FsaWFzID0gdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzDQogICAgICAgICAgICAgICAgICBsZXQgb2xkQ29uZiA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2Zvcm1JbXBvcnRUZW1wSnNvbicpDQogICAgICAgICAgICAgICAgICBpZiAoIW9sZENvbmYpIHsNCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgNCiAgICAgICAgICAgICAgICAgICAgICAnZm9ybUltcG9ydFRlbXBKc29uJywNCiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShbanNvbl0pDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBvbGRKb3NuID0gSlNPTi5wYXJzZShvbGRDb25mKQ0KICAgICAgICAgICAgICAgICAgICBsZXQgaXNJbk9sZEpvc24gPSBmYWxzZQ0KICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2xkSm9zbi5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGQgPSBvbGRKb3NuW2luZGV4XQ0KICAgICAgICAgICAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgICAgICAgICAgIG9sZC50YWJOYW1lID09IGpzb24udGFiTmFtZSAmJg0KICAgICAgICAgICAgICAgICAgICAgICAgb2xkLmJpbmRGaWxsZCA9PSBqc29uLmJpbmRGaWxsZA0KICAgICAgICAgICAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAgICAgICAgICAgaXNJbk9sZEpvc24gPSB0cnVlDQogICAgICAgICAgICAgICAgICAgICAgICBicmVhaw0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5PbGRKb3NuKSB7DQogICAgICAgICAgICAgICAgICAgICAgb2xkSm9zbi5wdXNoKGpzb24pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgNCiAgICAgICAgICAgICAgICAgICAgICAnZm9ybUltcG9ydFRlbXBKc29uJywNCiAgICAgICAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvbGRKb3NuKQ0KICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKCkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBwYXJhbS5vbkVycm9yKCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5pi+56S65a2Q6KGo5a+56K+d5qGGDQogICAgICAgICAgc2hvd1N1Ykxpc3QocmVmSWQpIHsNCiAgICAgICAgICAgIHRoaXMucmVmSWQgPSByZWZJZA0KICAgICAgICAgICAgdGhpcy5nZXRTdWJFbnRzQnlGb3JtS2V5KHJlZklkKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/mmL7npLrkv67mlLnorrDlvZUNCiAgICAgICAgICBvcGVuUmVjb3JkTGlzdChyZWZJZCkgew0KICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWNvcmRWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgICAgdGhpcy5yZWNvcmRSZWZJZCA9IHJlZklkDQogICAgICAgICAgICBsZXQgcGFyYW0gPSB7DQogICAgICAgICAgICAgIHBhZ2VCZWFuOiB7cGFnZTogMSwgcGFnZVNpemU6IDIwLCBzaG93VG90YWw6IHRydWV9LA0KICAgICAgICAgICAgICBzb3J0ZXI6IFt7ZGlyZWN0aW9uOiAnQVNDJywgcHJvcGVydHk6ICdtb2RpZnlUaW1lJ31dLA0KICAgICAgICAgICAgICBxdWVyeXM6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3JlZl9pZF8nLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucmVjb3JkUmVmSWQsDQogICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBdDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIGxldCB1cmwgPSAnJHticG1SdW5UaW1lfS9icG0vYm9EYXRhTW9kaWZ5UmVjb3JkL3YxL2xpc3RKc29uJw0KICAgICAgICAgICAgcmVxLnBvc3QodXJsLCBwYXJhbSkudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93cw0KICAgICAgICAgICAgICB0aGlzLm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLmRhdGEucGFnZVNpemUsDQogICAgICAgICAgICAgICAgcGFnZTogcmVzcC5kYXRhLnBhZ2UsDQogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgaGFuZGxlUmVjb3JkQ3VycmVudENoYW5nZShpbmRleCwgbW9kaWZ5UmVjb3JkKSB7DQogICAgICAgICAgICBtb2RpZnlSZWNvcmQucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gaW5kZXgNCiAgICAgICAgICAgIGxldCBwYXJhbSA9IHsNCiAgICAgICAgICAgICAgcGFnZUJlYW46IG1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuLA0KICAgICAgICAgICAgICBzb3J0ZXI6IFt7ZGlyZWN0aW9uOiAnQVNDJywgcHJvcGVydHk6ICdtb2RpZnlUaW1lJ31dLA0KICAgICAgICAgICAgICBxdWVyeXM6IFsNCiAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogJ3JlZl9pZF8nLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucmVjb3JkUmVmSWQsDQogICAgICAgICAgICAgICAgICBncm91cDogJ21haW4nLA0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBdDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnJlY29yZFRhYmxlTG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIGxldCB1cmwgPSAnJHticG1SdW5UaW1lfS9icG0vYm9EYXRhTW9kaWZ5UmVjb3JkL3YxL2xpc3RKc29uJw0KICAgICAgICAgICAgcmVxLnBvc3QodXJsLCBwYXJhbSkudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5yZWNvcmRUYWJsZUxvYWRpbmcgPSBmYWxzZQ0KICAgICAgICAgICAgICB0aGlzLnJlY29yZExpc3QgPSByZXNwLmRhdGEucm93cw0KICAgICAgICAgICAgICB0aGlzLm1vZGlmeVJlY29yZC5wYWdpbmF0aW9uLnBhZ2VCZWFuID0gew0KICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLmRhdGEucGFnZVNpemUsDQogICAgICAgICAgICAgICAgcGFnZTogcmVzcC5kYXRhLnBhZ2UsDQogICAgICAgICAgICAgICAgdG90YWw6IHJlc3AuZGF0YS50b3RhbA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lj5bmtojkv67mlLnorrDlvZXlr7nor53moYYNCiAgICAgICAgICByZWNvcmRDYW5jZWwoKSB7DQogICAgICAgICAgICB0aGlzLmRpYWxvZ1JlY29yZFZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5yZWNvcmRMaXN0ID0gW10NCiAgICAgICAgICAgIHRoaXMucmVjb3JkUmVmSWQgPSAnJw0KICAgICAgICAgICAgdGhpcy5tb2RpZnlSZWNvcmQgPSB7DQogICAgICAgICAgICAgIHBhZ2luYXRpb246IHsNCiAgICAgICAgICAgICAgICBwYWdlQmVhbjogew0KICAgICAgICAgICAgICAgICAgcGFnZTogMSwNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiAyMCwNCiAgICAgICAgICAgICAgICAgIHRvdGFsOiAwDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICAvLw0KICAgICAgICAgIG9wZW5Nb2RpZnlEZXRhaWwocm93KSB7DQogICAgICAgICAgICB0aGlzLmN1cnJlbnRNb2RpZnkgPSByb3cNCiAgICAgICAgICAgIHRoaXMubW9kaWZ5RGV0YWlsRGlhbG9nVmlzaWJsZSA9IHRydWUNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5p+l55yL5L+u5pS56K6w5b2V6K+m5oOFDQogICAgICAgICAgc2hvd01vZGlmeVJlY29yZChpZCwgcmVmSWQpIHsNCiAgICAgICAgICAgIHZhciB1cmwgPQ0KICAgICAgICAgICAgICAnL3N0YXRlbWVudC90ZW1wbGF0ZS9mb3JtLycgKw0KICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlS2V5ICsNCiAgICAgICAgICAgICAgJy9nZXQvdHJ1ZScgKw0KICAgICAgICAgICAgICAnP2lkPScgKw0KICAgICAgICAgICAgICByZWZJZCArDQogICAgICAgICAgICAgICcmc3RhcnRGbG93PWZhbHNlJnJlY29yZElkPScgKw0KICAgICAgICAgICAgICBpZCArDQogICAgICAgICAgICAgICcmaXNOZXdQYWdlPXRydWUnDQogICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLiRyb3V0ZXIucmVzb2x2ZSh1cmwpLmhyZWYsICdfYmxhbmsnKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/noa7lrprlr7zlh7oNCiAgICAgICAgICBzdWJtaXRFeHBvcnQoKSB7DQogICAgICAgICAgICBpZiAoIXRoaXMuZXhwb3J0RGF0YSB8fCB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQubGVuZ3RoIDwgMSkgew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICB0eXBlOiAnaW5mbycsDQogICAgICAgICAgICAgICAgbWVzc2FnZTogJ+ivt+mAieaLqeimgeWvvOWHuueahOWtl+aute+8gScNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGlmICh0aGlzLmV4cG9ydFR5cGUgPT09ICdtYWluJykgdGhpcy5leHBvcnRNYWluKCkNCiAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgdGhpcy5leHBvcnRTdWJEYXRhKA0KICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCwNCiAgICAgICAgICAgICAgICB0aGlzLnJlZklkLA0KICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYi5lbnROYW1lDQogICAgICAgICAgICAgICkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGV4cG9ydE1haW4oKSB7DQogICAgICAgICAgICBsZXQgZXhwRmllbGQgPSAnJw0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgaWYgKGkgPiAwKSB7DQogICAgICAgICAgICAgICAgZXhwRmllbGQgKz0gJywnDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZXhwRmllbGQgKz0gdGhpcy5leHBvcnREYXRhLmV4cEZpZWxkW2ldLm5hbWUNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGV4cEZpZWxkID0gQmFzZTY0LmVuY29kZShleHBGaWVsZCkNCg0KICAgICAgICAgICAgbGV0IGRhdGEgPSB7DQogICAgICAgICAgICAgIGJvQWxpYXM6IHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzLA0KICAgICAgICAgICAgICBnZXRUeXBlOiB0aGlzLmV4cG9ydERhdGEuZ2V0VHlwZSwNCiAgICAgICAgICAgICAgZXhwRmllbGQ6IGV4cEZpZWxkLA0KICAgICAgICAgICAgICBmaWx0ZXJLZXk6ICcnDQogICAgICAgICAgICB9DQogICAgICAgICAgICBkYXRhLnF1ZXJ5ID0gdGhpcy5nZXRRdWVyeUZpbHRlcigpLnBhZ2luYXRpb24NCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3ICYmIHRoaXMuZGF0YVZpZXcuYmluZFNlbGVjdGQpIHsNCiAgICAgICAgICAgICAgZGF0YS5xdWVyeS5xdWVyeXMucHVzaCh7DQogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuZGF0YVZpZXcuc2VsZWN0VmFsdWUsDQogICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgIHByb3BlcnR5OiAnRl8nICsgdGhpcy5kYXRhVmlldy5iaW5kU2VsZWN0ZA0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgbGV0IGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7ZnVsbHNjcmVlbjogdHJ1ZX0pIC8v5byA5aeLDQogICAgICAgICAgICB0aGlzLiRzdG9yZS5kaXNwYXRjaCgnZm9ybS90ZW1wbGF0ZUV4cG9ydCcsIGRhdGEpLnRoZW4oKCkgPT4gew0KICAgICAgICAgICAgICBsb2FkaW5nSW5zdGFuY2UuY2xvc2UoKSAvLyDnu5PmnZ8NCiAgICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgdGhpcy5leHBvcnRTdWJEYXRhKA0KICAgICAgICAgICAgICAgIHRoaXMuJHJlZnNbJ3N1YkV4cG9ydFRhYmxlJ11baV0uc2VsZWN0aW9uLA0KICAgICAgICAgICAgICAgICcnLA0KICAgICAgICAgICAgICAgIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3RbaV0ubmFtZQ0KICAgICAgICAgICAgICApDQogICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLiRyZWZzWydzdWJFeHBvcnRUYWJsZSddW2ldLCAnc2VsZWN0aW9uJywgW10pDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBleHBvcnRTdWJEYXRhKGV4cEZpZWxkcywgcmVmSWQsIGFsaWFzKSB7DQogICAgICAgICAgICBsZXQgZXhwRmllbGQgPSBbXQ0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBGaWVsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgZXhwRmllbGQucHVzaCh7DQogICAgICAgICAgICAgICAga2V5OiBleHBGaWVsZHNbaV0ubmFtZSwNCiAgICAgICAgICAgICAgICB2YWx1ZTogZXhwRmllbGRzW2ldLmRlc2MNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBkYXRhID0gew0KICAgICAgICAgICAgICBhbGlhczogYWxpYXMsDQogICAgICAgICAgICAgIHJlZklkOiByZWZJZCwNCiAgICAgICAgICAgICAgdHlwZTogdGhpcy5leHBvcnREYXRhLmdldFR5cGUsDQogICAgICAgICAgICAgIGV4cEZpZWxkOiBKU09OLnN0cmluZ2lmeShleHBGaWVsZCksDQogICAgICAgICAgICAgIGZpbHRlcktleTogJycNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGRhdGEucXVlcnlGaWx0ZXIgPSB0aGlzLmN1cnJlbnRUYWIucGFnaW5hdGlvbg0KICAgICAgICAgICAgbGV0IGxvYWRpbmdJbnN0YW5jZSA9IExvYWRpbmcuc2VydmljZSh7ZnVsbHNjcmVlbjogdHJ1ZX0pDQogICAgICAgICAgICBmb3JtLnN1YkV4cG9ydChkYXRhLCByZXNwID0+IHsNCiAgICAgICAgICAgICAgbG9hZGluZ0luc3RhbmNlLmNsb3NlKCkNCiAgICAgICAgICAgICAgdGhpcy5kaWFsb2dFeHBvcnRWaXNpYmxlID0gZmFsc2UNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WPlua2iOWvvOWHug0KICAgICAgICAgIGV4cG9ydENhbmNlbCgpIHsNCiAgICAgICAgICAgIHRoaXMuZGlhbG9nRXhwb3J0VmlzaWJsZSA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSBbXQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lj5bmtojlrZDooajlr7nor53moYYNCiAgICAgICAgICBzdWJDYW5jZWwoKSB7DQogICAgICAgICAgICB0aGlzLmRpYWxvZ1N1YlZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy50YWJzID0gW10NCiAgICAgICAgICAgIHRoaXMuZW50cyA9IFtdDQogICAgICAgICAgfSwNCiAgICAgICAgICBzdW5DYW5jZWwoKSB7DQogICAgICAgICAgICB0aGlzLmRpYWxvZ1N1blZpc2libGUgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5zdW5UYWJzID0gW10NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZUV4cG9ydFNlbGVjdGlvbkNoYW5nZSh2YWwpIHsNCiAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IFtdDQogICAgICAgICAgICBpZiAodmFsKSB7DQogICAgICAgICAgICAgIHRoaXMuZXhwb3J0RGF0YS5leHBGaWVsZCA9IHZhbA0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgLy/lhajpgIkNCiAgICAgICAgICBoYW5kbGVFeHBvcnRTZWxlY3RBbGwoKSB7DQogICAgICAgICAgICB0aGlzLmV4cG9ydERhdGEuZXhwRmllbGQgPSB0aGlzLmRpc3BsYXlGaWVsZHMNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5o6S5bqPDQogICAgICAgICAgc29ydChpbmRleCwgdHlwZSkgew0KICAgICAgICAgICAgaWYgKCd1cCcgPT0gdHlwZSkgew0KICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICflt7Lnu4/mmK/liJfooajkuK3nrKzkuIDkvY0nLA0KICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBsZXQgdGVtcCA9IHRoaXMuZGlzcGxheUZpZWxkc1tpbmRleCAtIDFdDQogICAgICAgICAgICAgICAgdGhpcy4kc2V0KA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLA0KICAgICAgICAgICAgICAgICAgaW5kZXggLSAxLA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4XQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5kaXNwbGF5RmllbGRzLCBpbmRleCwgdGVtcCkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLmRpc3BsYXlGaWVsZHMubGVuZ3RoIC0gMSkgew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ+W3sue7j+aYr+WIl+ihqOS4reacgOWQjuS4gOS9jScsDQogICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMuaXNUcmFuc2l0aW9uID0gdHJ1ZQ0KICAgICAgICAgICAgICAgIGxldCBpID0gdGhpcy5kaXNwbGF5RmllbGRzW2luZGV4ICsgMV0NCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQoDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHMsDQogICAgICAgICAgICAgICAgICBpbmRleCArIDEsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZHNbaW5kZXhdDQogICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgIHRoaXMuJHNldCh0aGlzLmRpc3BsYXlGaWVsZHMsIGluZGV4LCBpKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBhc3luYyBnZXRTdW5EYXRhKHRhYiwgcm93KSB7DQogICAgICAgICAgICBsZXQgZW50cyA9IHRhYi5jaGlsZEVudHMNCiAgICAgICAgICAgIGxldCBwayA9IHRhYi5wa0tleQ0KICAgICAgICAgICAgbGV0IHJlZklkID0gJycNCiAgICAgICAgICAgIGlmIChyb3dbcGsudG9Mb2NhbGVMb3dlckNhc2UoKV0pIHsNCiAgICAgICAgICAgICAgcmVmSWQgPSByb3dbcGsudG9Mb2NhbGVMb3dlckNhc2UoKV0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIHJlZklkID0gcm93W3BrLnRvVXBwZXJDYXNlKCldDQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIGlmIChlbnRzICYmIGVudHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBsZXQgdGFiID0gYXdhaXQgdGhpcy5nZXRCb0RhdGEoZW50c1tpXSwgcmVmSWQpDQogICAgICAgICAgICAgICAgdGhpcy5zdW5UYWJzLnB1c2godGFiKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICB0aGlzLmRpYWxvZ1N1blZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRCb0RhdGEoZW50LCByZWZJZCkgew0KICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZUxpc3QgPSBlbnQuYXR0cmlidXRlTGlzdA0KICAgICAgICAgICAgbGV0IHRhYiA9IHsNCiAgICAgICAgICAgICAgcmVmSWQ6IHJlZklkLA0KICAgICAgICAgICAgICBwa0tleTogZW50LnBrS2V5LA0KICAgICAgICAgICAgICBuYW1lOiBlbnQudGFibGVOYW1lLA0KICAgICAgICAgICAgICBlbnROYW1lOiBlbnQubmFtZSwNCiAgICAgICAgICAgICAgdGl0bGU6IGVudC5jb21tZW50LA0KICAgICAgICAgICAgICBhdHRyaWJ1dGVMaXN0OiBhdHRyaWJ1dGVMaXN0LA0KICAgICAgICAgICAgICBjb21tZW50OiBlbnQuY29tbWVudCwNCiAgICAgICAgICAgICAgcGFnaW5hdGlvbjogew0KICAgICAgICAgICAgICAgIHBhZ2VCZWFuOiB7DQogICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogMjAsDQogICAgICAgICAgICAgICAgICBwYWdlOiAxLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IDANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRhYi5jaGlsZEVudHMgPSBbXQ0KICAgICAgICAgICAgaWYgKGVudC5jaGlsZEVudHMgJiYgZW50LmNoaWxkRW50cy5sZW5ndGggPiAwKSB7DQogICAgICAgICAgICAgIHRhYi5jaGlsZEVudHMgPSBlbnQuY2hpbGRFbnRzDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gew0KICAgICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRTdWJEYXRhUGFnaW5hdGlvbicsIHsNCiAgICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHRhYi5wYWdpbmF0aW9uLA0KICAgICAgICAgICAgICAgICAgbmFtZTogZW50Lm5hbWUsDQogICAgICAgICAgICAgICAgICByZWZJZDogcmVmSWQNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC50aGVuKGRhdGEgPT4gew0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yb3dzLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2VTaXplID0gZGF0YS5wYWdlU2l6ZQ0KICAgICAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbi5wYWdlID0gZGF0YS5wYWdlDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnRvdGFsID0gZGF0YS50b3RhbA0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gW10NCiAgICAgICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZVNpemUgPSAxDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnBhZ2UgPSAxDQogICAgICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnBhZ2VCZWFuLnRvdGFsID0gMA0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0YWIpDQogICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRTdWJFbnRzQnlGb3JtS2V5KHJlZklkKSB7DQogICAgICAgICAgICAvKmlmICghdGhpcy5lbnRzIHx8IHRoaXMuZW50cy5sZW5ndGggPCAxKSB7DQogICAgICAgICAgICAgIGZvcm0uZ2V0U3ViRW50c0J5Rm9ybUtleSh0aGlzLnRlbXBsYXRlSW5mby5mb3JtS2V5LCAocmVzcCkgPT4gew0KICAgICAgICAgICAgICAgIC8vIOWtkOihqOS4juWtmeihqOWtl+auteWQjeiuvue9ruWwj+WGmQ0KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzcC5kYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICByZXNwLmRhdGFbaV0uYXR0cmlidXRlTGlzdC5mb3JFYWNoKGF0dHJpYnV0ZSA9PiB7DQogICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5maWVsZE5hbWUgPSBhdHRyaWJ1dGUuZmllbGROYW1lLnRvTG93ZXJDYXNlKCk7DQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgcmVzcC5kYXRhW2ldLmNoaWxkRW50cy5mb3JFYWNoKHNob3dDaGlsZEVudCA9PiB7DQogICAgICAgICAgICAgICAgICAgIHNob3dDaGlsZEVudC5hdHRyaWJ1dGVMaXN0LmZvckVhY2goYXR0cmlidXRlID0+IHsNCiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpOw0KICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGhpcy5lbnRzID0gcmVzcC5kYXRhOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIH0gZWxzZSB7Ki8NCiAgICAgICAgICAgIHRoaXMuZ2V0U3ViRGF0YSh0aGlzLCByZWZJZCkNCiAgICAgICAgICAgIC8qIH0qLw0KICAgICAgICAgIH0sDQogICAgICAgICAgYXN5bmMgZ2V0U3ViRGF0YShfbWUsIHJlZklkKSB7DQogICAgICAgICAgICAvL2xldCBlbnRzID0gdGhpcy5lbnRzOw0KICAgICAgICAgICAgbGV0IGVudHMgPSBKU09OLnBhcnNlKF9tZS50ZW1wbGF0ZUluZm8uc3ViRmllbGQpDQoNCiAgICAgICAgICAgIGlmIChlbnRzICYmIGVudHMubGVuZ3RoID4gMCkgew0KICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVudHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBlbnRzW2ldLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyID0+IHsNCiAgICAgICAgICAgICAgICAgIGF0dHIuZmllbGROYW1lID0gYXR0ci5maWVsZE5hbWUudG9Mb3dlckNhc2UoKQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgZW50c1tpXS5jaGlsZEVudHMuZm9yRWFjaChzaG93Q2hpbGRFbnQgPT4gew0KICAgICAgICAgICAgICAgICAgc2hvd0NoaWxkRW50LmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChhdHRyaWJ1dGUgPT4gew0KICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUuZmllbGROYW1lID0gYXR0cmlidXRlLmZpZWxkTmFtZS50b0xvd2VyQ2FzZSgpDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgbGV0IHRhYiA9IGF3YWl0IHRoaXMuZ2V0Qm9EYXRhKGVudHNbaV0sIHJlZklkKQ0KICAgICAgICAgICAgICAgIHRoaXMudGFicy5wdXNoKHRhYikNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5kaWFsb2dTdWJWaXNpYmxlID0gdHJ1ZQ0KICAgICAgICAgIH0sDQogICAgICAgICAgbm9kZUNsaWNrKG5vZGUpIHsNCiAgICAgICAgICAgIGNvbnN0IGxvYWRpbmcgPSB0aGlzLiRsb2FkaW5nKHRoaXMub3B0aW9ucykNCiAgICAgICAgICAgIC8vIHRoaXMuJHN0b3JlLmRpc3BhdGNoKCJmb3JtL3NldEJwbVRlbXBsYXRlUGFnaW5hdGlvblBhZ2VOdW0iLCAxKTsNCiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbi5wYWdlID0gMQ0KICAgICAgICAgICAgLy/mr4/mrKHngrnlh7vov4fmu6TmoJEs5bqU6K+l5oqK5Y+z6L6555qEdGFibGUg5LiO5YiG6aG15YWo6YOo6YeN572u5Li65Yid5aeLDQoNCiAgICAgICAgICAgIGxldCBwYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgcGFnZUJlYW46IHtwYWdlOiAxLCBwYWdlU2l6ZTogdGhpcy5wYWdpbmF0aW9uLnBhZ2VTaXplfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcGFnZUJlYW4ucXVlcnlzID0gW10NCiAgICAgICAgICAgIGlmICghbm9kZS5pZCB8fCBub2RlLmlkICE9IC0xKSB7DQogICAgICAgICAgICAgIGxldCB0cmVlRmllbGQgPSBKU09OLnBhcnNlKHRoaXMudGVtcGxhdGVJbmZvLnRyZWVGaWVsZCkNCiAgICAgICAgICAgICAgdHJlZUZpZWxkLnF1ZXJ5cy5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgICAgICAgIGlmIChpdGVtLmtleV8gJiYgaXRlbS52YWx1ZV8pIHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VCZWFuLnF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6ICckVFJFRSQnICsgaXRlbS5rZXlfLA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZTogbm9kZVtpdGVtLnZhbHVlX10sDQogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnbWFpbicsDQogICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0VRVUFMJywNCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdBTkQnDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5oqK6L+H5ruk5qCR55qE5p+l6K+i5p2h5Lu25a2Y5LiA5Lu96LW35p2lLOWPs+i+ueeahOaQnOe0ouS4juWIhumhteaJjeiDveWQjOaXtuS9v+eUqA0KICAgICAgICAgICAgdGhpcy50cmVlUXVlcnlzID0gcGFnZUJlYW4ucXVlcnlzDQoNCiAgICAgICAgICAgIGxldCBwYXJhbXMgPSB7DQogICAgICAgICAgICAgIHRlbXBsYXRlSWQ6IHRoaXMudGVtcGxhdGVJbmZvLmlkLA0KICAgICAgICAgICAgICBwYWdpbmF0aW9uOiBwYWdlQmVhbg0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5yZXNldCh0cnVlKQ0KICAgICAgICAgICAgLy/mlbDmja7op4blm77mjqfku7YNCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LnNlbGVjdExpc3QgJiYgdGhpcy5kYXRhVmlldy5zZWxlY3RMaXN0Lmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICBwYXJhbXMuc2VsZWN0TGlzdCA9IHRoaXMuZGF0YVZpZXcuc2VsZWN0TGlzdA0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBjb25zdCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGlmICh0aGlzXy5pc0pvaW5GbG93KSB7DQogICAgICAgICAgICAgIHBhcmFtcy5pc0pvaW5GbG93ID0gdHJ1ZQ0KICAgICAgICAgICAgICBwYXJhbXMudGFza1R5cGUgPSB0aGlzXy50YXNrVHlwZQ0KICAgICAgICAgICAgICBwYXJhbXMuZGVmS2V5ID0gdGhpc18uZGVmS2V5DQogICAgICAgICAgICB9DQogICAgICAgICAgICB0aGlzLiRzdG9yZQ0KICAgICAgICAgICAgICAuZGlzcGF0Y2goJ2Zvcm0vZ2V0QnBtVGVtcGxhdGVCeVBhZ2luYXRpb24nLCBwYXJhbXMpDQogICAgICAgICAgICAgIC50aGVuKHJlc3BvbnNlID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzXy5yb3dzID0gcmVzcG9uc2UuZGF0YS5yb3dzDQogICAgICAgICAgICAgICAgdGhpc18udG90YWwgPSByZXNwb25zZS5kYXRhLnRvdGFsDQogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlID0gcmVzcG9uc2UuZGF0YS5wYWdlDQogICAgICAgICAgICAgICAgdGhpc18ucGFnaW5hdGlvbi5wYWdlU2l6ZSA9IHJlc3BvbnNlLmRhdGEucGFnZVNpemUNCiAgICAgICAgICAgICAgICBsb2FkaW5nLmNsb3NlKCkNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIC8v5Yqg6L295qCR55qE5L+h5oGvDQogICAgICAgICAgdG9UcmVlRGF0YShkYXRhLCBpZCwgcGlkLCBuYW1lLCBwdmFsdWUpIHsNCiAgICAgICAgICAgIC8vIOW7uueri+S4quagkeW9oue7k+aehCzpnIDopoHlrprkuYnkuKrmnIDpobblsYLnmoTniLboioLngrnvvIxwdmFsdWXmmK8wDQogICAgICAgICAgICBsZXQgcGFyZW50cyA9IGRhdGEuZmlsdGVyKA0KICAgICAgICAgICAgICB2YWx1ZSA9Pg0KICAgICAgICAgICAgICAgIHZhbHVlW2lkXSA9PSB2YWx1ZVtwaWRdIHx8DQogICAgICAgICAgICAgICAgdmFsdWVbcGlkXSA9PSBudWxsIHx8DQogICAgICAgICAgICAgICAgdmFsdWVbcGlkXSA9PSBwdmFsdWUNCiAgICAgICAgICAgICkNCiAgICAgICAgICAgIGlmICghcGFyZW50cykgew0KICAgICAgICAgICAgICBwYXJlbnRzID0gZGF0YS5maWx0ZXIoDQogICAgICAgICAgICAgICAgdmFsdWUgPT4NCiAgICAgICAgICAgICAgICAgIHZhbHVlW3BpZF0gIT09ICd1bmRlZmluZWQnICYmDQogICAgICAgICAgICAgICAgICB2YWx1ZVtwaWRdICE9IG51bGwgJiYNCiAgICAgICAgICAgICAgICAgIHZhbHVlW2lkXSAhPSB2YWx1ZVtwaWRdDQogICAgICAgICAgICAgICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiBwYXJlbnRzDQogICAgICAgICAgfSwNCiAgICAgICAgICAvL+WIneWni+WMluagkQ0KICAgICAgICAgIGluaXRUcmVlKHRyZWVGaWVsZCkgew0KICAgICAgICAgICAgY29uc3QgdGhpc18gPSB0aGlzDQogICAgICAgICAgICBmb3JtLmdldEJ5QWxpYXModHJlZUZpZWxkLmFsaWFzLCByZXMgPT4gew0KICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cgPSByZXMNCiAgICAgICAgICAgICAgZGlhbG9nLmdldFRyZWVEYXRhKA0KICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIHJlcXVlc3RUeXBlOiAnR0VUJywNCiAgICAgICAgICAgICAgICAgIHVybDoNCiAgICAgICAgICAgICAgICAgICAgJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0VHJlZURhdGE/YWxpYXM9JyArDQogICAgICAgICAgICAgICAgICAgIHRyZWVGaWVsZC5hbGlhcyArDQogICAgICAgICAgICAgICAgICAgICcmbWFwUGFyYW09Jw0KICAgICAgICAgICAgICAgIH0sDQogICAgICAgICAgICAgICAgcmVzcCA9PiB7DQogICAgICAgICAgICAgICAgICBpZiAodGhpc18uY3VzdG9tRGlhbG9nLmRpc3BsYXlmaWVsZCkgew0KICAgICAgICAgICAgICAgICAgICBsZXQgZGlzcGxheWZpZWxkID0gSlNPTi5wYXJzZSgNCiAgICAgICAgICAgICAgICAgICAgICB0aGlzXy5jdXN0b21EaWFsb2cuZGlzcGxheWZpZWxkDQogICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgdGhpc18uZGlzcGxheUZpZWxkID0gZGlzcGxheWZpZWxkDQogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWVMaXN0ID0gcmVzcC5kYXRhDQogICAgICAgICAgICAgICAgICAgIGxldCBoZWFkID0ge30NCiAgICAgICAgICAgICAgICAgICAgaGVhZFtkaXNwbGF5ZmllbGQuZGlzcGxheU5hbWVdID0gJ+WFqOmDqCcNCiAgICAgICAgICAgICAgICAgICAgaGVhZC5pZCA9IC0xDQogICAgICAgICAgICAgICAgICAgIHRoaXNfLnRyZWUucHVzaChoZWFkKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICB9LA0KICAgICAgICAgIGxvYWRUcmVlKG5vZGUsIHJlc29sdmUpIHsNCiAgICAgICAgICAgIGlmIChub2RlKSB7DQogICAgICAgICAgICAgIGlmIChub2RlLmRhdGEuaWQgPT09IC0xKSB7DQogICAgICAgICAgICAgICAgbGV0IHRyZWUgPSB0aGlzLnRvVHJlZURhdGEoDQogICAgICAgICAgICAgICAgICB0aGlzLnRyZWVMaXN0LA0KICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGQuaWQsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZC5waWQsDQogICAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlGaWVsZC5kaXNwbGF5TmFtZSwNCiAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA/IHRoaXMuZGlzcGxheUZpZWxkLnB2YWx1ZSA6ICcwJw0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICByZXNvbHZlKHRyZWUpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgcmVzb2x2ZSgNCiAgICAgICAgICAgICAgICAgIHRoaXMudHJlZUxpc3QuZmlsdGVyKA0KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9Pg0KICAgICAgICAgICAgICAgICAgICAgIHZhbHVlW3RoaXMuZGlzcGxheUZpZWxkLnBpZF0gPT09DQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhW3RoaXMuZGlzcGxheUZpZWxkLmlkXQ0KICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgcmVzb2x2ZShbXSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIGhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoaW5kZXgsIHRhYikgew0KICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucGFnZUJlYW4ucGFnZSA9IGluZGV4DQogICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IHRydWUNCiAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9nZXRTdWJEYXRhUGFnaW5hdGlvbicsIHsNCiAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB0YWIucGFnaW5hdGlvbiwNCiAgICAgICAgICAgICAgICBuYW1lOiB0YWIuZW50TmFtZSwNCiAgICAgICAgICAgICAgICByZWZJZDogdGFiLnJlZklkID8gdGFiLnJlZklkIDogdGhpcy5yZWZJZA0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAudGhlbihyZXNwID0+IHsNCiAgICAgICAgICAgICAgICB0YWIucGFnaW5hdGlvbi5wYWdlQmVhbiA9IHsNCiAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiByZXNwLnBhZ2VTaXplLA0KICAgICAgICAgICAgICAgICAgcGFnZTogcmVzcC5wYWdlLA0KICAgICAgICAgICAgICAgICAgdG90YWw6IHJlc3AudG90YWwNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgdGFiLmRhdGFMaXN0ID0gcmVzcC5yb3dzDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHsNCiAgICAgICAgICAgICAgICB0aGlzLnN1YlRhYmxlTG9hZGluZyA9IGZhbHNlDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBxdWVyeVN1YlRhYmxlKHRhYikgew0KICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzID0gW10NCiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXJ5U3ViVmFsdWUpIHsNCiAgICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICAvL3BnU3Fs5L2/55So5qih57OK5p+l6K+i77yM57G75Z6L5LiN5Yy56YWN5pe25Lya5oql6ZSZ77yM5q2k5aSE5Y+q5L+d55WZdmFyY2hhcuexu+Weiw0KICAgICAgICAgICAgICAgIC8vIGlmIChpdGVtLmRhdGFUeXBlID09ICd2YXJjaGFyJykgew0KICAgICAgICAgICAgICAgIHRhYi5wYWdpbmF0aW9uLnF1ZXJ5cy5wdXNoKHsNCiAgICAgICAgICAgICAgICAgIHByb3BlcnR5OiBpdGVtLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5U3ViVmFsdWUsDQogICAgICAgICAgICAgICAgICBncm91cDogJ290aGVyJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogJ0xJS0UnLA0KICAgICAgICAgICAgICAgICAgcmVsYXRpb246ICdPUicNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgIC8vIH0NCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5xdWVyeVN1blZhbHVlKSB7DQogICAgICAgICAgICAgIHRhYi5hdHRyaWJ1dGVMaXN0LmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgLy8gaWYgKGl0ZW0uZGF0YVR5cGUgPT0gJ3ZhcmNoYXInKSB7DQogICAgICAgICAgICAgICAgdGFiLnBhZ2luYXRpb24ucXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGl0ZW0uZmllbGROYW1lLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnlTdW5WYWx1ZSwNCiAgICAgICAgICAgICAgICAgIGdyb3VwOiAnb3RoZXInLA0KICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnTElLRScsDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgLy8gfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgdGhpcy5oYW5kbGVTdWJDdXJyZW50Q2hhbmdlKDEsIHRhYikNCiAgICAgICAgICB9LA0KICAgICAgICAgIGltcG9ydFN1YihwYXJhbSkgew0KICAgICAgICAgICAgbGV0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCkNCiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIHBhcmFtLmZpbGUpDQogICAgICAgICAgICBsZXQgcGFyYW1zID0gew0KICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSwNCiAgICAgICAgICAgICAgYWxpYXM6IHRoaXMuY3VycmVudFRhYi5lbnROYW1lLA0KICAgICAgICAgICAgICByZWZJZDogdGhpcy5yZWZJZA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgZm9ybS5zdWJJbXBvcnQocGFyYW1zLCBkYXRhID0+IHsNCiAgICAgICAgICAgICAgaWYgKGRhdGEuc3RhdGUpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnc3VjY2VzcycsIG1lc3NhZ2U6IGRhdGEubWVzc2FnZX0pDQogICAgICAgICAgICAgICAgcGFyYW0ub25TdWNjZXNzKCkNCiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1YkN1cnJlbnRDaGFuZ2UoMSwgdGhpcy5jdXJyZW50VGFiKQ0KICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2UuZXJyb3IoZGF0YS5tZXNzYWdlKQ0KICAgICAgICAgICAgICAgIHBhcmFtLm9uRXJyb3IoKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZXhwb3J0U3ViKHRhYikgew0KICAgICAgICAgICAgdGhpcy5leHBvcnRUeXBlID0gJ3N1YicNCiAgICAgICAgICAgIHRoaXMuY3VycmVudFRhYiA9IHRhYg0KICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzID0gW10NCiAgICAgICAgICAgIHRoaXMuc3ViRGlzcGxheUZpZWxkc0xpc3QgPSBbXQ0KICAgICAgICAgICAgdGFiLmF0dHJpYnV0ZUxpc3QuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5RmllbGRzLnB1c2goew0KICAgICAgICAgICAgICAgIGRlc2M6IGl0ZW0uY29tbWVudCwNCiAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLmZpZWxkTmFtZSwNCiAgICAgICAgICAgICAgICB0eXBlOiBpdGVtLmNvbHVtblR5cGUNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIH0pDQogICAgICAgICAgICB0aGlzLmRpYWxvZ0V4cG9ydFZpc2libGUgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBpbXBvcnRCdXR0b24odGFiKSB7DQogICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSB0YWINCiAgICAgICAgICB9LA0KICAgICAgICAgIG15RHJhZnRMaXN0KCkgew0KICAgICAgICAgICAgLy/mlbDmja7op4blm77pmo/mnLrmt7vliqDliLDlhbbku5boj5zljZXkuIvpnaLml7bojrflj5blvZPliY3oj5zljZXnmoTliKvlkI0gIOW5tuS4lOW9k+WJjeaVsOaNruinhuWbvuS4jeaYr+ihqOWNlemHjOeahOaVsOaNruinhuWbviAgZGF0YVZpZXcNCiAgICAgICAgICAgIGlmICgNCiAgICAgICAgICAgICAgc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcyAmJg0KICAgICAgICAgICAgICAhdGhpcy5kYXRhVmlldyAmJg0KICAgICAgICAgICAgICAhdGhpcy5pZ25vcmVkQWxpYXMuaW5jbHVkZXMoc2Vzc2lvblN0b3JhZ2UubWVudV9hbGlhcykNCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICB0aGlzLmFsaWFzX25ldyA9IHNlc3Npb25TdG9yYWdlLm1lbnVfYWxpYXMNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBkYXRhVmlld0ZsYWcgPSBmYWxzZQ0KICAgICAgICAgICAgLy/liKTmlq3lvZPliY3mlbDmja7op4blm77mmK/kuI3mmK/ooajljZXph4znmoTmlbDmja7op4blm74NCiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3KSB7DQogICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFWaWV3LmJvRGVmQWxpYXMgJiYgdGhpcy5kYXRhVmlldy5ib0RlZkFsaWFzICE9ICcnKSB7DQogICAgICAgICAgICAgICAgZGF0YVZpZXdGbGFnID0gdHJ1ZQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBsZXQgcGF0aCA9DQogICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgIHRoaXMuYWxpYXNfbmV3ICsNCiAgICAgICAgICAgICAgJy9kcmFmdExpc3QvJyArDQogICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVJbmZvLmFsaWFzICsNCiAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgZGF0YVZpZXdGbGFnDQogICAgICAgICAgICBpZiAodGhpcy5vcGVuVHlwZSA9PSAnbmV3JyB8fCBkYXRhVmlld0ZsYWcpIHsNCiAgICAgICAgICAgICAgcGF0aCArPSAnP2lzTmV3PXRydWUnDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoZGF0YVZpZXdGbGFnKSB7DQogICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHBhdGgsICdfYmxhbmsnKQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgdGhpcy4kcm91dGVyLnB1c2gocGF0aCkNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy8gbGV0IHVybCA9DQogICAgICAgICAgICAvLyAgICIvc3RhdGVtZW50L2RyYWZ0TGlzdD90ZW1wQWxpYXM9IiArIDsNCiAgICAgICAgICAgIC8vIGNvbnN0IHsgaHJlZiB9ID0gdGhpcy4kcm91dGVyLnB1c2goew0KICAgICAgICAgICAgLy8gICBwYXRoOiB1cmwsDQogICAgICAgICAgICAvLyB9KTsNCiAgICAgICAgICAgIC8vIHdpbmRvdy5vcGVuKGhyZWYsICJfYmxhbmsiKTsNCiAgICAgICAgICB9LA0KICAgICAgICAgIGluaXRTd2l0Y2hTdGF0dXMoKSB7DQogICAgICAgICAgICAvL+WIneWni+WMluW8gOWFs+eKtuaAgQ0KICAgICAgICAgICAgbGV0IG1hbmFnZXMgPSB1dGlscy5wYXJzZVRvSnNvbih0aGlzLnRlbXBsYXRlSW5mby5tYW5hZ2VGaWVsZCkNCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFuYWdlcy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICBpZiAobWFuYWdlc1tpXS5uYW1lID09PSAnc3dpdGNoJykgew0KICAgICAgICAgICAgICAgIGxldCBmaWVsZE5hbWUgPSBtYW5hZ2VzW2ldLmJpbmQNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQodGhpcy5zd2l0Y2hNYXAsIGZpZWxkTmFtZSwge30pDQogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbiA9IG1hbmFnZXNbaV0uc3dpdGNoT24NCiAgICAgICAgICAgICAgICB0aGlzLnN3aXRjaE1hcFtmaWVsZE5hbWVdLm9mZiA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmDQogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vbkxhYmVsID0gbWFuYWdlc1tpXS5zd2l0Y2hPbkxhYmVsDQogICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hNYXBbZmllbGROYW1lXS5vZmZMYWJlbCA9IG1hbmFnZXNbaV0uc3dpdGNoT2ZmTGFiZWwNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgc3dpdGNoQ2hhbmdlKHBrVmFsLCBvbiwgb2ZmLCBmaWVsZE5hbWUsIHJvdywgZGVmYXVsdFRydWUpIHsNCiAgICAgICAgICAgIGxldCB0aGlzXyA9IHRoaXMNCiAgICAgICAgICAgIGxldCB2YWwgPSByb3dbZmllbGROYW1lXQ0KICAgICAgICAgICAgaWYgKHZhbCAhPSBvbiAmJiB2YWwgIT0gb2ZmKSB7DQogICAgICAgICAgICAgIGlmIChkZWZhdWx0VHJ1ZSA9PSAndHJ1ZScpIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQocm93LCBmaWVsZE5hbWUsIG9mZikNCiAgICAgICAgICAgICAgICB2YWwgPSBvZmYNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICB0aGlzLiRzZXQocm93LCBmaWVsZE5hbWUsIG9uKQ0KICAgICAgICAgICAgICAgIHZhbCA9IG9uDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHRoaXNfDQogICAgICAgICAgICAgIC4kY29uZmlybSgn5bCG5Lya5L+u5pS56K+l5pWw5o2u77yM5piv5ZCm57un57utPycsIHsNCiAgICAgICAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogJ+ehruWumicsDQogICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogJ+WPlua2iCcsDQogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgZm9ybSA9IHdpbmRvdy5jb250ZXh0LmZvcm0NCiAgICAgICAgICAgICAgICBsZXQgZm9ybUFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmZvcm1LZXkgLy/ooajljZXliKvlkI0NCiAgICAgICAgICAgICAgICBsZXQgZGF0YURlZkFsaWFzID0gdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMgLy/mlbDmja7lu7rmqKHliKvlkI0NCiAgICAgICAgICAgICAgICByZXENCiAgICAgICAgICAgICAgICAgIC5nZXQoDQogICAgICAgICAgICAgICAgICAgIGZvcm0gKw0KICAgICAgICAgICAgICAgICAgICAnL2Zvcm0vZGF0YVRlbXBsYXRlL3YxL2dldEZvcm0vJyArDQogICAgICAgICAgICAgICAgICAgIGZvcm1BbGlhcyArDQogICAgICAgICAgICAgICAgICAgICcvJyArDQogICAgICAgICAgICAgICAgICAgIGRhdGFEZWZBbGlhcyArDQogICAgICAgICAgICAgICAgICAgICc/aWQ9JyArDQogICAgICAgICAgICAgICAgICAgIHBrVmFsICsNCiAgICAgICAgICAgICAgICAgICAgJyZhY3Rpb249Z2V0JnJlY29yZElkPScNCiAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgIC50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICAgICAgICBsZXQgYm9EYXRhID0gcmVzcC5kYXRhLmRhdGENCiAgICAgICAgICAgICAgICAgICAgYm9EYXRhW2RhdGFEZWZBbGlhc11bZmllbGROYW1lXSA9IHZhbA0KICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZURhdGEgPSB7DQogICAgICAgICAgICAgICAgICAgICAgYm9BbGlhczogdGhpc18udGVtcGxhdGVJbmZvLmJvRGVmQWxpYXMsDQogICAgICAgICAgICAgICAgICAgICAgYm9EYXRhOiByZXNwLmRhdGEuZGF0YQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIHRoaXNfLiRzdG9yZQ0KICAgICAgICAgICAgICAgICAgICAgIC5kaXNwYXRjaCgnZm9ybS9ib1NhdmUnLCBzYXZlRGF0YSkNCiAgICAgICAgICAgICAgICAgICAgICAudGhlbihyZXN1bHQgPT4gew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zdGF0ZSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICfkv53lrZjmiJDlip8nDQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzXy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAn5L+d5a2Y5aSx6LSlJw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIGxldCBmb3JtID0gd2luZG93LmNvbnRleHQuZm9ybQ0KICAgICAgICAgICAgICAgIGxldCBmb3JtQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uZm9ybUtleSAvL+ihqOWNleWIq+WQjQ0KICAgICAgICAgICAgICAgIGxldCBkYXRhRGVmQWxpYXMgPSB0aGlzXy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcyAvL+aVsOaNruW7uuaooeWIq+WQjQ0KICAgICAgICAgICAgICAgIHJlcQ0KICAgICAgICAgICAgICAgICAgLmdldCgNCiAgICAgICAgICAgICAgICAgICAgZm9ybSArDQogICAgICAgICAgICAgICAgICAgICcvZm9ybS9kYXRhVGVtcGxhdGUvdjEvZ2V0Rm9ybS8nICsNCiAgICAgICAgICAgICAgICAgICAgZm9ybUFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgJy8nICsNCiAgICAgICAgICAgICAgICAgICAgZGF0YURlZkFsaWFzICsNCiAgICAgICAgICAgICAgICAgICAgJz9pZD0nICsNCiAgICAgICAgICAgICAgICAgICAgcGtWYWwgKw0KICAgICAgICAgICAgICAgICAgICAnJmFjdGlvbj1nZXQmcmVjb3JkSWQ9Jw0KICAgICAgICAgICAgICAgICAgKS50aGVuKHJlc3AgPT4gew0KICAgICAgICAgICAgICAgICAgdGhpc18uJHNldChyb3csIGZpZWxkTmFtZSwgcmVzcC5kYXRhLmRhdGFbZGF0YURlZkFsaWFzXVtmaWVsZE5hbWVdKQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgfSwNCiAgICAgICAgICBkaXNwbGF5KG1wRGlzcGxheSkgew0KICAgICAgICAgICAgLy9wY+err+eahOaVsOaNruaKpeihqOS4jemcgOimgeWBmuacrOaWueazleeahOWkhOeQhu+8jOebtOaOpei/lOWbnnRydWXljbPlj6/jgIINCiAgICAgICAgICAgIHJldHVybiB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRGaXhlZChmaXhlZCkgew0KICAgICAgICAgICAgcmV0dXJuIGZpeGVkDQogICAgICAgICAgfSwNCiAgICAgICAgICBzdW1tYXJ5KG1ldGhvZCwgZmllbGQsIGRlY2ltYWwpIHsNCiAgICAgICAgICAgIGxldCBsaXN0ID0gdGhpcy5yb3dzDQogICAgICAgICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtW2ZpZWxkXSAhPT0gdW5kZWZpbmVkICYmIGl0ZW1bZmllbGRdICE9PSAnJykNCiAgICAgICAgICAgICAgLm1hcChpdGVtID0+IG5ldyBOdW1iZXIoaXRlbVtmaWVsZF0pKQ0KICAgICAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QubGVuZ3RoID09IDApIHsNCiAgICAgICAgICAgICAgcmV0dXJuDQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAobWV0aG9kID09PSAnY291bnQnKSB7DQogICAgICAgICAgICAgIHJldHVybiBsaXN0Lmxlbmd0aA0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdzdW0nKSB7DQogICAgICAgICAgICAgIHJldHVybiBsaXN0LnJlZHVjZSgoYSwgYikgPT4gYSArIGIpLnRvRml4ZWQoZGVjaW1hbCkNCiAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kID09PSAnbWluJykgew0KICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oLi4ubGlzdCkudG9GaXhlZChkZWNpbWFsKQ0KICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2QgPT09ICdtYXgnKSB7DQogICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCguLi5saXN0KS50b0ZpeGVkKGRlY2ltYWwpDQogICAgICAgICAgICB9IGVsc2UgaWYgKG1ldGhvZCA9PT0gJ2F2ZycpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIChsaXN0LnJlZHVjZSgoYSwgYikgPT4gYSArIGIpIC8gbGlzdC5sZW5ndGgpLnRvRml4ZWQoDQogICAgICAgICAgICAgICAgZGVjaW1hbA0KICAgICAgICAgICAgICApDQogICAgICAgICAgICB9DQogICAgICAgICAgfSwNCiAgICAgICAgICBnZXRDb2xvcihkYXRhLCByb3cpIHsNCiAgICAgICAgICAgIGxldCByZXN1Q29sb3IgPSAnY29sb3I6YmxhY2snDQogICAgICAgICAgICBsZXQgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKQ0KICAgICAgICAgICAgbGV0IGNvbG9yUnVsZSA9IEpTT04ucGFyc2UoZGVjb2RlKQ0KICAgICAgICAgICAgaWYgKGNvbG9yUnVsZSAmJiBjb2xvclJ1bGUgaW5zdGFuY2VvZiBBcnJheSkgew0KICAgICAgICAgICAgICBjb2xvclJ1bGUuZm9yRWFjaChydWxlID0+IHsNCiAgICAgICAgICAgICAgICBsZXQgRm4gPSBGdW5jdGlvbignZGF0YScsIHJ1bGUucHJvUnVsZSkNCiAgICAgICAgICAgICAgICBpZiAoRm4ocm93KSkgew0KICAgICAgICAgICAgICAgICAgcmVzdUNvbG9yID0gJ2NvbG9yOicgKyBydWxlLnByb0NvbG9yDQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgcmV0dXJuIHJlc3VDb2xvcg0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UHJvVmFsdWUodmFsdWUsIHJ1bGUpIHsNCiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKCh2YWx1ZSAvIHJ1bGUpICogMTAwMDApIC8gMTAwIC8vIOWwj+aVsOeCueWQjuS4pOS9jeeZvuWIhuavlA0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0UHJvQ29sb3IoZGF0YSwgcm93KSB7DQogICAgICAgICAgICBsZXQgcmVzdUNvbG9yID0gJyM0MDllZmYnDQogICAgICAgICAgICBsZXQgZGVjb2RlID0gQmFzZTY0LmRlY29kZShkYXRhKQ0KICAgICAgICAgICAgLypkZWNvZGU9ZGVjb2RlLnJlcGxhY2UoL1xzKiEvZywiIik7Ki8NCiAgICAgICAgICAgIGxldCBjb2xvclJ1bGUgPSBKU09OLnBhcnNlKGRlY29kZSkNCiAgICAgICAgICAgIGlmIChjb2xvclJ1bGUgJiYgY29sb3JSdWxlIGluc3RhbmNlb2YgQXJyYXkpIHsNCiAgICAgICAgICAgICAgY29sb3JSdWxlLmZvckVhY2gocnVsZSA9PiB7DQogICAgICAgICAgICAgICAgbGV0IEZuID0gRnVuY3Rpb24oJ2RhdGEnLCBydWxlLnByb1J1bGUpDQogICAgICAgICAgICAgICAgaWYgKEZuKHJvdykpIHsNCiAgICAgICAgICAgICAgICAgIHJlc3VDb2xvciA9IHJ1bGUucHJvQ29sb3INCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmVzdUNvbG9yDQogICAgICAgICAgfSwNCiAgICAgICAgICBpc1NvcnRhYmxlKGZpZWxkKSB7DQogICAgICAgICAgICBsZXQgaXNDbG9iID0gZmFsc2UNCiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4gew0KICAgICAgICAgICAgICBpZiAoaXRlbS5uYW1lID09PSBmaWVsZCAmJiBpdGVtLnR5cGUgPT09ICdjbG9iJykgew0KICAgICAgICAgICAgICAgIGlzQ2xvYiA9IHRydWUNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSkNCiAgICAgICAgICAgIHJldHVybiAhdGhpcy5ub3RTb3J0YWJsZUZpZWxkcy5pbmNsdWRlcyhmaWVsZCkgJiYgIWlzQ2xvYg0KICAgICAgICAgIH0sDQogICAgICAgICAgY3VzdG9tRXZpbEpTKHJvdywgaHRTY3JpcHQpIHsNCiAgICAgICAgICAgIGxldCBGbiA9IEZ1bmN0aW9uKCdfcmVxJywgJ3JvdycsICdfdGhpcycsIEJhc2U2NC5kZWNvZGUoaHRTY3JpcHQpKSAvL+S4gOS4quWPmOmHj+aMh+WQkUZ1bmN0aW9u77yM6Ziy5q2i5pyJ5Lqb5YmN56uv57yW6K+R5bel5YW35oql6ZSZDQogICAgICAgICAgICBsZXQgcmVzdWx0ID0gRm4ocmVxLCByb3csIHRoaXMpDQogICAgICAgICAgfSwNCiAgICAgICAgICBiYXRjaFVwZGF0ZSh0aXRsZSwgYmFzZTY0SnNvbiwgYmFzZTY0RmlsZWRzKSB7DQogICAgICAgICAgICBpZiAoDQogICAgICAgICAgICAgIHRoaXMudGFibGVEYXRhLnNlbGVjdFJvd3MgPT0gbnVsbCB8fA0KICAgICAgICAgICAgICB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzLmxlbmd0aCA9PSAwDQogICAgICAgICAgICApIHsNCiAgICAgICAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCfor7fpgInmi6nmlbDmja4nKQ0KICAgICAgICAgICAgICByZXR1cm4gZmFsc2UNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWVMaXN0ID0gW10NCiAgICAgICAgICAgIGxldCBvdXRGb3JtID0gW10NCiAgICAgICAgICAgIGlmIChiYXNlNjRKc29uKSB7DQogICAgICAgICAgICAgIC8v5piv5ZCm5pyJ55So5oi36Ieq5bex6L6T5YWl55qE5a2X5q61DQogICAgICAgICAgICAgIGxldCByZXMgPSB0cnVlDQogICAgICAgICAgICAgIGxldCBiYXRjaFVwZGF0ZURhdGEgPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0SnNvbikpDQogICAgICAgICAgICAgIGxldCBmaWxlZHNPYmogPSBKU09OLnBhcnNlKEJhc2U2NC5kZWNvZGUoYmFzZTY0RmlsZWRzKSkNCiAgICAgICAgICAgICAgYmF0Y2hVcGRhdGVEYXRhLmZvckVhY2goaXRlbSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKGl0ZW0udmFsdWVUeXBlID09IDEpIHsNCiAgICAgICAgICAgICAgICAgIHZhciBpc1JlcXVpcmVkID0gZmFsc2UNCiAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmlzUmVxdWlyZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgaXNSZXF1aXJlZCA9IHRydWUNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGxldCBvYmogPSB7DQogICAgICAgICAgICAgICAgICAgIG5hbWU6IGl0ZW0ubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgZGVzYzogZmlsZWRzT2JqW2l0ZW0ubmFtZV0sDQogICAgICAgICAgICAgICAgICAgIG91dFR5cGU6IGl0ZW0ub3V0VmFsdWVUeXBlLA0KICAgICAgICAgICAgICAgICAgICBzaW5nbGU6IGZhbHNlLA0KICAgICAgICAgICAgICAgICAgICBzZWxlY3RDdXJyZW50OiBmYWxzZSwNCiAgICAgICAgICAgICAgICAgICAgaXNSZXF1aXJlZDogaXNSZXF1aXJlZA0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ub3V0VmFsdWVUeXBlID09ICdzZWxlY3QnKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RDb25maWcgPSBKU09OLnBhcnNlKGl0ZW0ub3V0Q29uZmlnKQ0KICAgICAgICAgICAgICAgICAgICBvYmouZ2FuZ2VkID0ge2FsaWFzOiAnJywgdmFsdWVCaW5kOiAnJywgbm9Jbml0OiAnJywgbGFiZWxCaW5kOiAnJywgYmluZDoge319DQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RDb25maWcuY3VzdG9tUXVlcnkpIHsNCiAgICAgICAgICAgICAgICAgICAgICBsZXQgZ2FuZ2VkID0gew0KICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXM6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5hbGlhcywNCiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQmluZDogc2VsZWN0Q29uZmlnLmN1c3RvbVF1ZXJ5LnZhbHVlQmluZCwNCiAgICAgICAgICAgICAgICAgICAgICAgIG5vSW5pdDogJycsDQogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEJpbmQ6IHNlbGVjdENvbmZpZy5jdXN0b21RdWVyeS5sYWJlbEJpbmQsDQogICAgICAgICAgICAgICAgICAgICAgICBiaW5kOiB7fQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBvYmouZ2FuZ2VkID0gZ2FuZ2VkDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLnNlbGVjdERhdGEgPSBzZWxlY3RDb25maWcuc2VsZWN0RGF0YQ0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLm91dFZhbHVlVHlwZSA9PSAnZGlhbG9nJykgew0KICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0Q29uZmlnID0gSlNPTi5wYXJzZShpdGVtLm91dENvbmZpZykNCiAgICAgICAgICAgICAgICAgICAgbGV0IGRpYWxvZ0NvbmZpZyA9IHNlbGVjdENvbmZpZy5kaWFsb2dDb25maWcNCiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcHBpbmdDb25mID0gW10NCiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlciA9IHNlbGVjdENvbmZpZy5wYXJhbWV0ZXINCiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIHBhcmFtZXRlcikgew0KICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHBhcmFtZXRlcltrZXldIHx8ICcnDQogICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ0NvbmYucHVzaCh7ZnJvbToga2V5LCB0YXJnZXQ6IFt2YWx1ZV0sIHRhcmdldFN1YjogW3ZhbHVlXX0pDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgbGV0IGN1c3RkaWFsb2cgPSB7DQogICAgICAgICAgICAgICAgICAgICAgc2VsZWN0TnVtOiBkaWFsb2dDb25maWcuc2VsZWN0TnVtLA0KICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnM6IFtdLA0KICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdDb25mOiBtYXBwaW5nQ29uZiwNCiAgICAgICAgICAgICAgICAgICAgICBjdXN0UXVlcnlKc29uOiBbXSwNCiAgICAgICAgICAgICAgICAgICAgICBhbGlhczogZGlhbG9nQ29uZmlnLmFsaWFzLA0KICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRpYWxvZ0NvbmZpZy5jdXN0RGlhbG9nDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgb2JqLmN1c3RkaWFsb2cgPSB7bmFtZTogJ+ivt+mAieaLqScsIGN1c3REaWFsb2c6IGN1c3RkaWFsb2csIHJlc3VsdEZpZWxkOiBkaWFsb2dDb25maWcucmVzdWx0RmllbGR9DQogICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKA0KICAgICAgICAgICAgICAgICAgICBpdGVtLm91dENvbmZpZyAmJg0KICAgICAgICAgICAgICAgICAgICAoaXRlbS5vdXRWYWx1ZVR5cGUgIT0gJ2lucHV0JyB8fA0KICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdkYXRhJyB8fA0KICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ub3V0VmFsdWVUeXBlICE9ICdudW1iZXInKQ0KICAgICAgICAgICAgICAgICAgKSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBvdXRDb25maWcgPSBKU09OLnBhcnNlKGl0ZW0ub3V0Q29uZmlnKQ0KICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gb3V0Q29uZmlnLnBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gcGFyYW1ldGVyKSB7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJba2V5XSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtZXRlcltrZXldDQogICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcltrZXldID0gJ2RhdGEuJyArIHBhcmFtZXRlcltrZXldDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGlmIChvdXRDb25maWcuc2VsZWN0Q3VycmVudCkgew0KICAgICAgICAgICAgICAgICAgICAgIG9iai5zZWxlY3RDdXJyZW50ID0gb3V0Q29uZmlnLnNlbGVjdEN1cnJlbnQNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q29uZmlnLmlzU2luZ2xlKSB7DQogICAgICAgICAgICAgICAgICAgICAgb2JqLnNpbmdsZSA9IG91dENvbmZpZy5pc1NpbmdsZQ0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIG9iai5iaW5kQ29uZmlnID0gcGFyYW1ldGVyDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBvdXRGb3JtLnB1c2gob2JqKQ0KICAgICAgICAgICAgICAgICAgcmVzID0gZmFsc2UNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdC5wdXNoKHsNCiAgICAgICAgICAgICAgICAgICAga2V5OiBpdGVtLm5hbWUsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpdGVtLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIGlmIChyZXMpIHsNCiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJvKGRlZmF1bHRWYWx1ZUxpc3QpDQogICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVMaXN0ID0gZGVmYXVsdFZhbHVlTGlzdA0KICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudGVtcGxhdGVCYXRjaFVwZGF0ZURpYWxvZy5zaG93RGlhbG9nKHRpdGxlLCBvdXRGb3JtKQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICB0aGlzLiRtZXNzYWdlKHt0eXBlOiAnaW5mbycsIG1lc3NhZ2U6ICfmnKrorr7nva7mm7TmlrDlhoXlrrknfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9LA0KICAgICAgICAgIG9uQ29uZmlybShkYXRhKSB7DQogICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlTGlzdCA9IFtdDQogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gZGF0YSkgew0KICAgICAgICAgICAgICBkZWZhdWx0VmFsdWVMaXN0LnB1c2goe2tleToga2V5LCB2YWx1ZTogZGF0YVtrZXldfSkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGxldCBib0RhdGEgPSB0aGlzLmRlZmF1bHRWYWx1ZUxpc3QgPyB0aGlzLmRlZmF1bHRWYWx1ZUxpc3QuY29uY2F0KGRlZmF1bHRWYWx1ZUxpc3QpIDogdGhpcy5kZWZhdWx0VmFsdWUNCiAgICAgICAgICAgIHRoaXMudXBkYXRlQm8oYm9EYXRhKQ0KICAgICAgICAgIH0sDQogICAgICAgICAgdXBkYXRlQm8oZGVmYXVsdFZhbHVlTGlzdCkgew0KICAgICAgICAgICAgdGhpcy4kY29uZmlybSgn5q2k5pON5L2c5bCG5om56YeP5pu05paw5pWw5o2uLCDmmK/lkKbnu6fnu60/JywgJ+aPkOekuicsIHsNCiAgICAgICAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICfnoa7lrponLA0KICAgICAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAn5Y+W5raIJywNCiAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnDQogICAgICAgICAgICB9KS50aGVuKCgpID0+IHsNCiAgICAgICAgICAgICAgbGV0IHNlbGVjdFJvd3MgPSB0aGlzLnRhYmxlRGF0YS5zZWxlY3RSb3dzDQogICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0Um93cy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICAgICAgIHNlbGVjdFJvd3NbaV0uZm9ybUtleSA9IHRoaXMudGVtcGxhdGVJbmZvLmZvcm1LZXkNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRlZmF1bHRWYWx1ZUxpc3QubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICAgICAgICAgIHNlbGVjdFJvd3NbaV1bZGVmYXVsdFZhbHVlTGlzdFtqXS5rZXldID0NCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTGlzdFtqXS52YWx1ZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICBsZXQgZGF0YSA9IHsNCiAgICAgICAgICAgICAgICBib0RhdGE6IHNlbGVjdFJvd3MsDQogICAgICAgICAgICAgICAgYm9BbGlhczogdGhpcy50ZW1wbGF0ZUluZm8uYm9EZWZBbGlhcw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIHRoaXMuJHN0b3JlDQogICAgICAgICAgICAgICAgLmRpc3BhdGNoKCdmb3JtL2JhdGNoVXBkYXRlVGVtcGxhdGVEYXRhJywgZGF0YSkNCiAgICAgICAgICAgICAgICAudGhlbihkYXRhID0+IHsNCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnN0YXRlKSB7DQogICAgICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdzdWNjZXNzJywgbWVzc2FnZTogZGF0YS5tZXNzYWdlfSkNCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2goKQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gew0KICAgICAgICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoe3R5cGU6ICdpbmZvJywgbWVzc2FnZTogJ+W3suWPlua2iOabtOaWsCd9KQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgIH0sDQogICAgICAgICAgYWRkQ29tbWFuZChjb21tYW5kKSB7DQogICAgICAgICAgICBpZiAoY29tbWFuZCA9PSAnbm90TG9naW4nIHx8IGNvbW1hbmQgPT0gJ2xvZ2luJykgew0KICAgICAgICAgICAgICB0aGlzLmdldEFkZFFSQ29kZShjb21tYW5kKQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sDQogICAgICAgICAgZ2V0QWRkUVJDb2RlKGNvbW1hbmQpIHsNCiAgICAgICAgICAgIHRoaXMuUVJDb2RlUGF0dGVybiA9IGNvbW1hbmQgPT0gJ25vdExvZ2luJyA/IHRydWUgOiBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEZXNjID0gW10NCiAgICAgICAgICAgIHRoaXMuUVJDb2RlVHlwZSA9ICdhZGQnDQogICAgICAgICAgICB0aGlzLlFSQ29kZVNob3cgPSBmYWxzZQ0KICAgICAgICAgICAgdGhpcy5RUkNvZGVEaWFsb2cgPSB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBzaG93U2VhcmNoUGFuZSgpIHsNCiAgICAgICAgICAgIHJldHVybiB0cnVlDQogICAgICAgICAgfSwNCiAgICAgICAgICBidWlsZERlZmF1bHRRdWVyeXMoKSB7DQogICAgICAgICAgICBsZXQgdGhpc18gPSB0aGlzDQogICAgICAgICAgICBsZXQgcXVlcnlzID0gW10NCiAgICAgICAgICAgIGxldCBjb25kaXRpb25zID0gSlNPTi5wYXJzZSh0aGlzXy50ZW1wbGF0ZUluZm8uY29uZGl0aW9uRmllbGQpDQogICAgICAgICAgICBsZXQgcHJlZml4ID0gdGhpcy50ZW1wbGF0ZUluZm8uaXNFeHRlcm5hbCA9PSAxID8gJycgOiAnRl8nDQogICAgICAgICAgICAvL+adoeS7tuWtl+autem7mOiupOWAvOWIpOaWrQ0KICAgICAgICAgICAgY29uZGl0aW9ucy5mb3JFYWNoKGNvbmRpdGlvbiA9PiB7DQogICAgICAgICAgICAgIGlmIChjb25kaXRpb24uZGVmYXVsdFZhbHVlKSB7DQogICAgICAgICAgICAgICAgbGV0IGZpZWxkID0gY29uZGl0aW9uLmNvbFByZWZpeCArIGNvbmRpdGlvbi5uYQ0KICAgICAgICAgICAgICAgIHRoaXNfLiRzZXQodGhpc18uc2VhcmNoRm9ybSwgZmllbGQsIGNvbmRpdGlvbi5kZWZhdWx0VmFsdWUpDQogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY29uZGl0aW9uLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGlmIChjb25kaXRpb24udHkgPT0gJ251bWJlcicpIHsNCiAgICAgICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkLA0KICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLA0KICAgICAgICAgICAgICAgICAgZ3JvdXA6ICdtYWluJywNCiAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbjogY29uZGl0aW9uLnF0LnRvVXBwZXJDYXNlKCksDQogICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ0FORCcNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLy/nrZvpgInlrZfmrrXpu5jorqTlgLzliKTmlq0NCg0KICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBKU09OLnBhcnNlKHRoaXNfLnRlbXBsYXRlSW5mby5maWx0ZXJpbmdGaWVsZCkNCiAgICAgICAgICAgIGZpbHRlcnMuZm9yRWFjaChmaWx0ZXIgPT4gew0KICAgICAgICAgICAgICBpZiAoZmlsdGVyLmRlZmF1bHRWYWx1ZSAmJiBmaWx0ZXIuZGVmYXVsdFZhbHVlLmxlbmd0aCA+IDApIHsNCiAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbZmlsdGVyLm5hbWVdID0gZmlsdGVyLmRlZmF1bHRWYWx1ZQ0KICAgICAgICAgICAgICAgIGZpbHRlci5kZWZhdWx0VmFsdWUuZm9yRWFjaCh2YWwgPT4gew0KICAgICAgICAgICAgICAgICAgcXVlcnlzLnB1c2goew0KICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJlZml4ICsgZmlsdGVyLm5hbWUsDQogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsDQogICAgICAgICAgICAgICAgICAgIGdyb3VwOiAnZGVmVmFsXycgKyBmaWx0ZXIubmFtZSwNCiAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uOiAnRVFVQUwnLA0KICAgICAgICAgICAgICAgICAgICByZWxhdGlvbjogJ09SJw0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgdGhpc18uJG9uKCdhZnRlck1vdW50ZWQnLCAoKSA9PiB7DQogICAgICAgICAgICAgIGxldCBoZWFkZXJDb2x1bW5zID0gdGhpc18uJHJlZnMubXVsdGlwbGVUZW1wbGF0ZVRhYmxlLiRyZWZzLnRhYmxlSGVhZGVyLmNvbHVtbnMNCiAgICAgICAgICAgICAgaGVhZGVyQ29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHRoaXNfLmZpbHRlck1hcC5oYXNPd25Qcm9wZXJ0eShjb2x1bW4ucHJvcGVydHkpKSB7DQogICAgICAgICAgICAgICAgICB0aGlzXy5maWx0ZXJNYXBbY29sdW1uLnByb3BlcnR5XS5mb3JFYWNoKHZhbCA9PiB7DQogICAgICAgICAgICAgICAgICAgIGNvbHVtbi5maWx0ZXJlZFZhbHVlLnB1c2godmFsKQ0KICAgICAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5cw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfSkNCiAgICB9DQogIH0NCn0NCg=="},null]}