{"remainingRequest":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipHotTable.vue?vue&type=script&lang=js","dependencies":[{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\src\\components\\eipControl\\EipHotTable.vue","mtime":1733309211891},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\babel-loader\\lib\\index.js","mtime":456789000000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\@vue\\cli-plugin-babel\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"D:\\jenkins\\workspace\\dataShare-fvue\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KDQppbXBvcnQgdXRpbHMgZnJvbSAiQC91dGlscy5qcyI7DQppbXBvcnQgRm9ybU1hdGggZnJvbSAiQC9tYXRoLmpzIjsNCmltcG9ydCB7IEhvdFRhYmxlIH0gZnJvbSAiQGhhbmRzb250YWJsZS92dWUiOw0KaW1wb3J0IFN1YkRhdGFEZXRhaWwgZnJvbSAiQC9jb21wb25lbnRzL2Zsb3cvU3ViRGF0YURldGFpbC52dWUiOw0KaW1wb3J0ICJoYW5kc29udGFibGUvZGlzdC9oYW5kc29udGFibGUuZnVsbC5jc3MiOw0KaW1wb3J0IEhhbmRzb250YWJsZSBmcm9tICJoYW5kc29udGFibGUiOw0KaW1wb3J0ICJoYW5kc29udGFibGUvbGFuZ3VhZ2VzL3poLUNOIjsNCmV4cG9ydCBkZWZhdWx0IHsNCiAgbmFtZTogImVpcC1ob3QtdGFibGUiLA0KICBwcm9wczogew0KICAgIG9wdGlvbnM6U3RyaW5nLA0KICAgIGluaXRjb25mOiBTdHJpbmcsDQogICAgcGVybWlzc2lvbjogT2JqZWN0LA0KICAgIGlzSW5pdFRlbXBsYXRlRGF0YTogU3RyaW5nLA0KICAgIGluaXRGaWxsRGF0YVR5cGU6IFN0cmluZywNCiAgICBhZGRJbml0VGVtcGxhdGVEYXRhOiBTdHJpbmcsLy/lhYHorrjmt7vliqDliJ3lp4vljJbmlbDmja4NCiAgICBpbml0U3VtUm93OiBTdHJpbmcsLy/liJ3lp4vljJbnu5/orqHooYwNCiAgICBuYW1lOlN0cmluZywNCiAgfSwNCiAgY29tcG9uZW50czoge0hvdFRhYmxlLFN1YkRhdGFEZXRhaWx9LA0KICBkYXRhKCkgew0KICAgIHJldHVybiB7DQogICAgICByb290Oidob3QtdGFibGUnLA0KICAgICAgbXlSZW5kZXJlcjp0aGlzLnJlbmRlcmVyTWUsDQogICAgICBzdWJUYWJsZVBhdGg6JycsDQogICAgICBmb3JtRmllbGRzOiBbXSwNCiAgICAgIGZvcm1JZDogJycsDQogICAgICBob3RTZXR0aW5nczogew0KICAgICAgICBkYXRhOiBbICAgICAgICAvL+aVsOaNruWPr+S7peaYr+S6jOe7tOaVsOe7hO+8jOS5n+WPr+S7peaYr+aVsOe7hOWvueixoQ0KICAgICAgICAgIFtdDQogICAgICAgIF0sDQogICAgICAgIGNsYXNzTmFtZTogImh0Q2VudGVyIGh0TWlkZGxlIiwgLy/ljZXlhYPmoLzmloflrZflr7npvZDmlrnlvI8oaHRMZWZ0LGh0UmlnaHQsaHRDZW50ZXIpDQogICAgICAgIGN1cnJlbnRSb3dDbGFzc05hbWU6ICJteS1zZWxlY3RSb3ciLCAvL+e7memAieS4reihjOa3u+WKoOiHquWumuS5iWNsYXNz57G75ZCNDQogICAgICAgIGN1cnJlbnRDb2xDbGFzc05hbWU6ICJteS1zZWxlY3RDb2wiLCAvL+e7memAieS4reWIl+a3u+WKoOiHquWumuS5iWNsYXNz57G75ZCNDQogICAgICAgIGF1dG9XcmFwUm93OiB0cnVlLCAvL+aWh+Wtl+aYr+WQpuiHquWKqOaNouihjCjlvZPmsqHmnInorr7nva5jb2xXaWR0aHPml7bnlJ/mlYgpDQogICAgICAgIGZpeGVkQ29sdW1uc0xlZnQ6IDEsLy/lm7rlrprlt6bovrnliJfmlbANCiAgICAgICAgZml4ZWRSb3dzVG9wOiAwLC8v5Zu65a6a5LiK6L655YiX5pWwDQogICAgICAgIC8vIGZpbGxIYW5kbGU6IHRydWUsIC8v5piv5ZCm5byA5ZCv5ouW5ou95aSN5Yi25pON5L2cKHRydWUsZmFsc2UsJ2hvcml6b250YWwn5rC05bmz5aSN5Yi2LCd2ZXJ0aWNhbCflnoLnm7TlpI3liLYpDQogICAgICAgIGF1dG9Sb3dTaXplOiBmYWxzZSwNCiAgICAgICAgYXV0b0NvbHVtblNpemU6IHRydWUsDQogICAgICAgIC8vIGhpZ2hsaWdodGVkUm93czpbXSwNCiAgICAgICAgLy8gcmVhZE9ubHk6dHJ1ZSwNCiAgICAgICAgLy8gY29tbWVudHM6IHRydWUsDQogICAgICAgIHdpZHRoOiAiMTAwJSIsDQogICAgICAgIGhlaWdodDoiODB2aCIsDQogICAgICAgIHN0cmV0Y2hIOidhbGwnLA0KICAgICAgICBsYW5ndWFnZTogInpoLUNOIiwNCiAgICAgICAgY29sSGVhZGVyczogdHJ1ZSwgLy9bJ0EnLCAnQicsICdDJ10sIC8v5piv5ZCm5bGV56S65YiX6KGo5aS0LOm7mOiupOaYr0EsQixD562J5a2X5q+NLOWPr+S7pVsn5YiXMScsJ+WIlzInXei/m+ihjOiHquWumuS5ieWxleekug0KICAgICAgICByb3dIZWFkZXJzOiB0cnVlLCAvL+aYr+WQpuWxleekuuihjOihqOWktCzpu5jorqTmmK8xLDIsM+etieaVsOaNrizlj6/ku6VbJ+ihjDEnLCfooYwyJ13ov5vooYzoh6rlrprkuYnlsZXnpLoNCiAgICAgICAgY29udGV4dE1lbnU6ew0KICAgICAgICAgIGl0ZW1zOnsNCiAgICAgICAgICB9DQogICAgICAgIH0sDQogICAgICAgIGxpY2Vuc2VLZXk6wqAibm9uLWNvbW1lcmNpYWwtYW5kLWV2YWx1YXRpb24iLA0KICAgICAgICBtZXJnZUNlbGxzOiB0cnVlLA0KICAgICAgICAvL2NvbnRleHRNZW51OiB0cnVlLA0KICAgICAgICB3b3JkV3JhcDogdHJ1ZSwvL+iHquWKqOaNouihjA0KICAgICAgICAvLyBtZXJnZUNlbGxzOiB0cnVlLA0KICAgICAgICAvLyBtYW51YWxDb2x1bW5GcmVlemU6IHRydWUsIC8v5omL5Yqo5Zu65a6a5YiXICA/DQogICAgICAgIC8vIG1hbnVhbENvbHVtbk1vdmU6IHRydWUsIC8v5omL5Yqo56e75Yqo5YiXDQogICAgICAgIC8vIG1hbnVhbFJvd01vdmU6IHRydWUsICAgLy/miYvliqjnp7vliqjooYwNCiAgICAgICAgIG1hbnVhbENvbHVtblJlc2l6ZTogdHJ1ZSwvL+aJi+W3peabtOaUueWIl+i3nQ0KICAgICAgICAgbWFudWFsUm93UmVzaXplOiB0cnVlLC8v5omL5Yqo5pu05pS56KGM6LedDQogICAgICAgIC8vIGNvbW1lbnRzOiB0cnVlLCAvL+a3u+WKoOazqOmHiiAgDQogICAgICAgIC8vIGN1c3RvbUJvcmRlcnM6W10sLy/mt7vliqDovrnmoYYNCiAgICAgICAgIGNvbHVtblNvcnRpbmc6IGZhbHNlLA0KICAgICAgICAvLyBzdHJldGNoSDogJ2FsbCcsLy/moLnmja7lrr3luqbmqKrlkJHmianlsZXvvIxsYXN0OuWPquaJqeWxleacgOWQjuS4gOWIl++8jG5vbmXvvJrpu5jorqTkuI3mianlsZUNCiAgICAgICAgLy8gZmlsbEhhbmRsZTogdHJ1ZSwgLy/pgInkuK3mi5bmi73lpI3liLYgcG9zc2libGUgdmFsdWVzOiB0cnVlLCBmYWxzZSwgImhvcml6b250YWwiLCAidmVydGljYWwiDQogICAgICAgIC8vIGZpeGVkQ29sdW1uc0xlZnQ6IDEsLy/lm7rlrprlt6bovrnliJfmlbANCiAgICAgICAgLy8gZml4ZWRSb3dzVG9wOiAwLC8v5Zu65a6a5LiK6L655YiX5pWwDQogICAgICAgIC8vIGJlZm9yZVJlbW92ZVJvdzogdGhpcy5iZWZvcmVSZW1vdmVSb3dNZSwNCiAgICAgICAgYWZ0ZXJDcmVhdGVSb3c6IHRoaXMuYWZ0ZXJDcmVhdGVSb3dNZSwNCiAgICAgICAgYWZ0ZXJDaGFuZ2U6IHRoaXMuYWZ0ZXJDaGFuZ2VNZSwNCiAgICAgICAgYWZ0ZXJTZWxlY3Rpb25FbmQ6IHRoaXMuYWZ0ZXJTZWxlY3Rpb25FbmRNZSwNCiAgICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXJNZSwNCiAgICAgICAgY2VsbHM6IHRoaXMuY2VsbHNNZSwNCiAgICAgICAgYWZ0ZXJMb2FkRGF0YTogdGhpcy5hZnRlckxvYWREYXRhTWUsDQogICAgICAgIG1lcmdlQ2VsbHM6IFsgICAvL+WQiOW5tg0KICAgICAgICAgICAgLy8ge3JvdzogMSwgY29sOiAxLCByb3dzcGFuOiAzLCBjb2xzcGFuOiAzfSwgIC8v5oyH5a6a5ZCI5bm277yM5LuO77yIMSwx77yJ5byA5aeL6KGMM+WIlzPlkIjlubbmiJDkuIDmoLwNCiAgICAgICAgICAgIC8vIHtyb3c6IDMsIGNvbDogNCwgcm93c3BhbjogMiwgY29sc3BhbjogMn0NCiAgICAgICAgXSwNCiAgICAgICAgY29sdW1uczogW10sDQogICAgICAgIGhpZGRlbkNvbHVtbnM6IHsNCiAgICAgICAgICBjb3B5UGFzdGVFbmFibGVkOiB0cnVlLA0KICAgICAgICAgIGluZGljYXRvcnM6IHRydWUsDQogICAgICAgICAgY29sdW1uczogW10NCiAgICAgICAgfSwNCiAgICAgICAgbmVzdGVkSGVhZGVyczogbnVsbCwNCiAgICAgICAgLy8gbmVzdGVkSGVhZGVyczogWw0KICAgICAgICAvLyAgIC8vIFt7bGFiZWw6ICdBJywgY29sc3BhbjogM30sIHtsYWJlbDogJ0InLCBjb2xzcGFuOiAzfV0sDQogICAgICAgIC8vICAgWydBJyx7bGFiZWw6ICdDJywgY29sc3BhbjogMn0sIHtsYWJlbDogJ0YnLCBjb2xzcGFuOiAyfV0sDQogICAgICAgIC8vICAgWydBJyx7bGFiZWw6ICdDJywgY29sc3BhbjogMn0sICdEJywgJ0UnXSwNCiAgICAgICAgLy8gICBbJ+S8muiuruWupOWQjeensCcsICfkvJrorq7lrqTlnLDlnYAnLCAn5aSH5rOoJywgJ+alvOWxgicsICfml6XmnJ8nXQ0KICAgICAgICAvLyBdLA0KICAgICAgICAvL+WQr+eUqOWFrOW8j+W6kw0KICAgICAgICBmb3JtdWxhczogZmFsc2UsLy/mmoLml7bov5jkuI3nn6XpgZPmgI7kuYjmlbDmja7mgI7kuYjkuI7phY3nva7nu5PlkIjvvIzlhYjkuI3lkK/nlKgNCiAgICAgICAgLyoqIA0KICAgICAgICDmlK/mjIHnmoTlhazlvI/vvJoNCiAgICAgICAg5Lu75L2V5pWw5a2X77yM6LSf5pWw5ZKM5q2j5pWw77yM5aaC5rWu54K55pWw5oiW5pW05pWwOw0KICAgICAgICDnrpfmnK/ov5DnrpfvvIzlpoLvvJor77yMLe+8jC/vvIwq77yMJe+8jF7vvIwNCiAgICAgICAg6YC76L6R5pON5L2c5aaC77yaQU5EKCnvvIxPUigp77yMTk9UKCnvvIxYT1IoKe+8jA0KICAgICAgICDmr5TovoPmk43kvZzvvIzlpoLvvJo977yMPu+8jD4977yMPO+8jDw977yMPD47DQogICAgICAgIOaJgOacieeahEphdmFTY3JpcHTmlbDlrabluLjph4/vvIzlpoLvvJpQSSgp77yMRSgp77yMTE4xMCgp77yMTE4yKCnvvIxMT0cxMEUoKe+8jExPRzJFKCnvvIxTUVJUMV8yKCnvvIxTUVJUMigp77yMDQogICAgICAgIOmUmeivr+WkhOeQhu+8miNESVYvMCHvvIwjRVJST1Ih77yMI1ZBTFVFIe+8jCNSRUYh77yMI05BTUU/77yMI04vQe+8jCNOVU0h77yMDQogICAgICAgIOWtl+espuS4suaTjeS9nOWmgjooICbov57mjqVlceOAgj0tKDImNSnlsIbov5Tlm54tMjXvvIk7DQogICAgICAgIOWFrOW8j+S4reWumuS5ieeahOaJgOaciWV4Y2VsIOWFrOW8jyA7DQogICAgICAgIOebuOWvueWSjOe7neWvueWNleWFg+agvOW8leeUqO+8jOWmgu+8mkEx77yMJEEx77yMQSQx77yMJEEkMe+8jA0KICAgICAgICDlhoXlu7rlj5jph4/vvIzlpoLvvJpUUlVF77yMRkFMU0XvvIxOVUxM77yMDQogICAgICAgIOiHquWumuS5ieWPmOmHjzsNCiAgICAgICAg5bWM5aWX5Ye95pWwOw0KICAgICAgICDliqjmgIHmm7TmlrDjgIINCiAgICAgICAgKiovDQogICAgICB9LA0KICAgICAgbWF0aEV4cE1hcDp7fSwNCiAgICAgIHJvd01hdGhFeHBNYXA6e30sDQogICAgICBtYXRoRXhwSXRlbU1hcDp7fSwNCiAgICAgIGluaXRDdXN0RGlhbG9nQ29uZjoge30sDQogICAgICBjdXN0b21EaWFsb2c6IHt9LA0KICAgICAgZmlsbE9yZzoge30sDQogICAgICByZWFkT25seUNvbHVtbk1hcDoge30sDQogICAgICBjZWxsU3R5bGVNYXA6IHt9LC8v5YiX5qC35byPDQogICAgICBtYXRoUm93Q2VsbE1hcDoge30sLy/orqHnrpfljZXlhYPmoLwNCiAgICAgIGFsbE1hdGhFeHBMaXN0OiB7fSwvL+aJgOacieS4juiuoeeul+ebuOWFs+eahOWIlw0KICAgICAgY3Jvc3NNYXBwaW5nczp7fSwvL+i3qOihqOWPluaVsOiuvue9rg0KICAgICAgY3Jvc3NNYXBwaW5nU3ViVGFibGVzOltdLC8v6KKr5Y+W5pWw55qE5a2Q6KGoDQogICAgICBtYWluRmllbGRNYXRoTWFwOiB7fSwvL+a2ieWPiuS4u+ihqOiuoeeul+WFrOW8jw0KICAgICAgaW5pdFJvd0RhdGE6e30sDQogICAgICBhbGxSb3dNYXRoTWFwOiB7fSwvL+i3qOihjOi/kOeul+WFrOW8jw0KICAgICAgZmlyc3RTdW1NYXA6e30sLy/pppbooYzmsYfmgLsNCiAgICAgIGluc3RJZDonJywvL+a1geeoi+WunuS+i0lEDQogICAgICBkZWZJZDonJywvL+a1geeoi+WumuS5iUlEDQogICAgICBpbml0RGF0YUJhY2s6W10sLy/liJ3lp4vljJbmlbDmja7lpIfku70NCiAgICAgIGluaXRTdW1Sb3dGaWVsZDonJywvL+e7n+iuoeihjOagh+etvuWtl+autQ0KICAgICAgaW5pdFN1bVJvd1ZhbHVlOicnLC8v57uf6K6h6KGM5qCH562+5a2X5q615YC8DQogICAgICBjcm9zc01hcHBpbmdGaWVsZHM6e30sLy/ot6jooajlj5bmlbDljZXlhYPmoLwNCiAgICAgIG1lcmdlQ2VsbEZpZWxkOicnLC8v5ZCI5bm25Y2V5YWD5qC85YiXDQogICAgICByZWFkT25seVJvd3NNYXA6IHt9LC8v5Y2V5YWD5qC85Y+q6K+76K6+572uDQogICAgICBjZWxsQ2FsY3M6IFtdLC8v5Y2V5YWD5qC86K6h566X5YWs5byPDQogICAgICByZXF1aXJlZFJvd3NNYXA6e30sLy/lv4Xloavorr7nva7vvIzmj5DkuqTml7bmoKHpqowNCiAgICAgIGZpZWxkTmFtZU1hcDp7fSwNCiAgICB9Ow0KICB9LA0KICBjb21wdXRlZDogew0KICAgIGhvdEluc3RhbmNlOiBmdW5jdGlvbigpIHsNCiAgICAgIHJldHVybiB0aGlzLiRyZWZzLmhvdHRhYmxlLmhvdEluc3RhbmNlOw0KICAgIH0NCiAgfSwNCiAgbW91bnRlZCgpIHsNCiAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICBpZihmb3JtSW5zdCAmJiBmb3JtSW5zdC4kcGFyZW50KXsNCiAgICAgIGxldCBjb2x1bW5Tb3J0ID0gdHJ1ZTsNCiAgICAgIGlmKGZvcm1JbnN0LiRwYXJlbnQuaW5zdElkKXsNCiAgICAgICAgdGhpcy5pbnN0SWQgPSBmb3JtSW5zdC4kcGFyZW50Lmluc3RJZDsNCiAgICAgICAgY29sdW1uU29ydCA9IGZhbHNlOw0KICAgICAgfQ0KICAgICAgaWYoZm9ybUluc3QuJHBhcmVudC5kZWZJZCl7DQogICAgICAgIHRoaXMuZGVmSWQgPSBmb3JtSW5zdC4kcGFyZW50LmRlZklkOw0KICAgICAgICBjb2x1bW5Tb3J0ID0gZmFsc2U7DQogICAgICB9DQogICAgICAvL+a1geeoi+S4reS4jeWFgeiuuOaOkuW6j++8jOWcqOWfuuehgOaVsOaNrue7tOaKpOS4reWFgeiuuOaOkuW6jw0KICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5Tb3J0aW5nID0gY29sdW1uU29ydDsNCiAgICB9DQogICAgaWYodGhpcy5vcHRpb25zKXsNCiAgICAgIGxldCBvcHRpb25zSm9uID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMpOw0KICAgICAgdGhpcy5zdWJUYWJsZVBhdGggPSBvcHRpb25zSm9uLnN1YlRhYmxlUGF0aDsNCiAgICAgIGxldCByZWxhdGlvbnMgPSBvcHRpb25zSm9uLmNvbEhlYWRlcnNSZWxhdGlvbnM7DQogICAgICBsZXQgaXNNYXRoRXhwID0gZmFsc2U7Ly/mmK/lkKbljIXlkKvorqHnrpflhazlvI8NCiAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICBpZihvcHRpb25zSm9uLmluaXRTdW1Sb3dGaWVsZCl7DQogICAgICAgIHRoaXMuaW5pdFN1bVJvd0ZpZWxkID0gb3B0aW9uc0pvbi5pbml0U3VtUm93RmllbGQ7DQogICAgICB9DQogICAgICBpZihvcHRpb25zSm9uLmluaXRTdW1Sb3dWYWx1ZSl7DQogICAgICAgIHRoaXMuaW5pdFN1bVJvd1ZhbHVlID0gb3B0aW9uc0pvbi5pbml0U3VtUm93VmFsdWU7DQogICAgICB9DQogICAgICAvL+iuvue9ruaOp+S7tumrmOW6pg0KICAgICAgaWYob3B0aW9uc0pvbi5oZWlnaHQpew0KICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmhlaWdodCA9IG9wdGlvbnNKb24uaGVpZ2h0ICsgJ3ZoJzsNCiAgICAgIH0NCiAgICAgIC8v5pS26ZuG5Y2V5YWD5qC86K6h566X5YWs5byPDQogICAgICBpZihvcHRpb25zSm9uLmNlbGxDYWxjcyAmJiBvcHRpb25zSm9uLmNlbGxDYWxjcy5sZW5ndGg+MCl7DQogICAgICAgIHRoaXMuY2VsbENhbGNzID0gWy4uLm9wdGlvbnNKb24uY2VsbENhbGNzXTsNCiAgICAgICAgLy/orqHnrpfljZXlhYPmoLzlj6ror7sNCiAgICAgICAgdGhpcy5jZWxsQ2FsY3MuZm9yRWFjaChjZWxsQ2FsYyA9PnsNCiAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBjZWxsQ2FsYy5jZWxsRmllbGQuc3BsaXQoJy4nKVsyXTsNCiAgICAgICAgICBfdGhpcy5yZWFkT25seVJvd3NNYXBbZmllbGROYW1lKydfJysoY2VsbENhbGMucm93SW5kZXgtMSldID0gdHJ1ZTsNCiAgICAgICAgfSkNCiAgICAgIH0NCiAgICAgIC8v5pS26ZuG6KGo5aS044CB5YiX5ZCI5bm25Y2V5YWD5qC844CB6K6h566X5YWs5byP44CB5a2X5q615p2D6ZmQ562JDQogICAgICBpZihyZWxhdGlvbnMgJiYgcmVsYXRpb25zLmxlbmd0aD4wKXsNCiAgICAgICAgICBsZXQgaG90RmllbGRQZXJtaXNzaW9uID0gdGhpcy5wZXJtaXNzaW9uP3RoaXMucGVybWlzc2lvblsnZmllbGRzJ11bb3B0aW9uc0pvbi5ib1N1YkVudGl0eV06W107DQogICAgICAgICAgbGV0IGhlYWRlcnMgPSBbXTsNCiAgICAgICAgICBsZXQgY29sdW1ucyA9IFtdOw0KICAgICAgICAgIGxldCBkYXRhTGlzdCA9IFtbXV07DQogICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHJlbGF0aW9ucy5sZW5ndGg7IGluZGV4KyspIHsNCiAgICAgICAgICAgIGxldCByZWxhdGlvbiA9IHJlbGF0aW9uc1tpbmRleF07DQogICAgICAgICAgICB0aGlzLmZpZWxkTmFtZU1hcFtyZWxhdGlvbi5uYW1lXSA9IHJlbGF0aW9uLmRlc2M7DQogICAgICAgICAgICBoZWFkZXJzLnB1c2gocmVsYXRpb24uZGVzYyk7DQogICAgICAgICAgICBfdGhpcy5pbml0Um93RGF0YVtyZWxhdGlvbi5uYW1lXSA9ICcnOw0KICAgICAgICAgICAgbGV0IGNvbHVtbiA9IHJlbGF0aW9uLmNvbHVtbjsNCiAgICAgICAgICAgIGNvbHVtbi5jbGFzc05hbWUgPSAnaHRMZWZ0JzsNCiAgICAgICAgICAgIGlmKGNvbHVtbi50eXBlID09ICdkcm9wZG93bicgJiYgQXJyYXkuaXNBcnJheShjb2x1bW4uc291cmNlKSAmJiBjb2x1bW4uc291cmNlLmxlbmd0aD4wKXsNCiAgICAgICAgICAgICAgbGV0IHNvdXJjZUFycmF5ID0gW107DQogICAgICAgICAgICAgIGNvbHVtbi5zb3VyY2UuZm9yRWFjaChpdGVtID0+IHsNCiAgICAgICAgICAgICAgICBpZihpdGVtLnZhbHVlIT0nJyYmaXRlbS52YWx1ZSE9J3VuZGVmaW5lZCcpew0KICAgICAgICAgICAgICAgICAgc291cmNlQXJyYXkucHVzaChpdGVtLnZhbHVlKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICBjb2x1bW4uc291cmNlID0gc291cmNlQXJyYXk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+aUtumbhuiuoeeul+WFrOW8jw0KICAgICAgICAgICAgaWYoY29sdW1uLm1hdGhFeHApew0KICAgICAgICAgICAgICB0aGlzLmluaXRNYXRoTWFwKGNvbHVtbik7DQogICAgICAgICAgICAgIGlzTWF0aEV4cCA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihjb2x1bW4ucm93TWF0aEV4cCAmJiBBcnJheS5pc0FycmF5KGNvbHVtbi5yb3dNYXRoRXhwKSAmJiBjb2x1bW4ucm93TWF0aEV4cC5sZW5ndGg+MCl7DQogICAgICAgICAgICAgIHRoaXMuaW5pdFJvd01hdGhNYXAoY29sdW1uKTsNCiAgICAgICAgICAgICAgaXNNYXRoRXhwID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIC8v5pS26ZuG5ZCI5bm25YiXDQogICAgICAgICAgICBpZihjb2x1bW4ubWVyZ2VDZWxsPT09dHJ1ZSl7DQogICAgICAgICAgICAgIGNvbnN0IGNlbGxGaWVsZCA9IHtmaWVsZDpjb2x1bW4uZGF0YSxpbmRleDppbmRleH07DQogICAgICAgICAgICAgIGlmKCF0aGlzLm1lcmdlQ2VsbEZpZWxkKXsNCiAgICAgICAgICAgICAgICB0aGlzLm1lcmdlQ2VsbEZpZWxkID0gey4uLmNlbGxGaWVsZH07DQogICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2VsbEZpZWxkQ2hpbGRyZW4odGhpcy5tZXJnZUNlbGxGaWVsZCxjZWxsRmllbGQpOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAvL+W6lOeUqOa1geeoi+ihqOWNleadg+mZkA0KICAgICAgICAgICAgaWYoaG90RmllbGRQZXJtaXNzaW9uW2NvbHVtbi5kYXRhXT09J3InKXsNCiAgICAgICAgICAgICAgY29sdW1uLnJlYWRPbmx5ID0gdHJ1ZTsNCiAgICAgICAgICAgIH1lbHNlIGlmKGhvdEZpZWxkUGVybWlzc2lvbltjb2x1bW4uZGF0YV09PSduJyl7DQogICAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuaGlkZGVuQ29sdW1ucy5jb2x1bW5zLnB1c2goaW5kZXgpOw0KICAgICAgICAgICAgfWVsc2UgaWYoaG90RmllbGRQZXJtaXNzaW9uW2NvbHVtbi5kYXRhXT09J2InKXsNCiAgICAgICAgICAgICAgY29sdW1uLnJlcXVpcmVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlZFJvd3NNYXBbY29sdW1uLmRhdGFdID0gdHJ1ZTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgLy/mlLbpm4blj6ror7sNCiAgICAgICAgICAgIGlmKGNvbHVtbi5yZWFkT25seSl7DQogICAgICAgICAgICAgIHRoaXMucmVhZE9ubHlDb2x1bW5NYXBbaW5kZXhdID0ge2ZpZWxkOmNvbHVtbi5kYXRhLGRlc2M6cmVsYXRpb24uZGVzY307DQogICAgICAgICAgICB9ZWxzZSBpZihjb2x1bW4ucmVhZE9ubHlSb3dzKXsvL+WNleWFg+agvOWPquivuw0KICAgICAgICAgICAgICBjb25zdCByZWFkT25seVJvd3MgPSBjb2x1bW4ucmVhZE9ubHlSb3dzLnNwbGl0KCcsJyk7DQogICAgICAgICAgICAgIHJlYWRPbmx5Um93cy5mb3JFYWNoKHJvd0luZGV4ID0+ew0KICAgICAgICAgICAgICAgIF90aGlzLnJlYWRPbmx5Um93c01hcFtjb2x1bW4uZGF0YSsnXycrKHJvd0luZGV4LTEpXSA9IHRydWU7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8v5pS26ZuG5b+F5aGrDQogICAgICAgICAgICBpZihjb2x1bW4ucmVxdWlyZWQpew0KICAgICAgICAgICAgICB0aGlzLnJlcXVpcmVkUm93c01hcFtjb2x1bW4uZGF0YV0gPSB7YWxsOnRydWV9Ow0KICAgICAgICAgICAgfWVsc2UgaWYoY29sdW1uLnJlcXVpcmVkUm93cyl7Ly/ljZXlhYPmoLzlv4XloasNCiAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZWRSb3dzID0gY29sdW1uLnJlcXVpcmVkUm93cy5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgICBfdGhpcy5yZXF1aXJlZFJvd3NNYXBbY29sdW1uLmRhdGFdID0ge2FsbDpmYWxzZSxyb3dzOnJlcXVpcmVkUm93c307DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIC8v5pS26ZuG5YiX5qC35byPDQogICAgICAgICAgICB0aGlzLmhhbmRDZWxsU3R5bGUoY29sdW1uKTsNCg0KICAgICAgICAgICAgLy/mlLbpm4bpppbooYzmsYfmgLsNCiAgICAgICAgICAgIGlmKHJlbGF0aW9uLmlzU3VtPT10cnVlKXsNCiAgICAgICAgICAgICAgdGhpcy5maXJzdFN1bU1hcFtyZWxhdGlvbi5uYW1lXSA9IHRydWU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW4pOw0KICAgICAgICAgIH0NCiAgICAgICAgICAvL+aUtumbhui3qOihqOWPluaVsOiuvue9rg0KICAgICAgICAgIGxldCBjcm9zc01hcHBpbmcgPSBvcHRpb25zSm9uLmNyb3NzTWFwcGluZzsNCiAgICAgICAgICBpZihjcm9zc01hcHBpbmcgICYmIEFycmF5LmlzQXJyYXkoY3Jvc3NNYXBwaW5nKSAmJiBjcm9zc01hcHBpbmcubGVuZ3RoPjApew0KICAgICAgICAgICAgbGV0IHN1YlRhYmxlTWFwID0ge307DQogICAgICAgICAgICBjcm9zc01hcHBpbmcuZm9yRWFjaChjcm9zc01hcCA9PnsNCiAgICAgICAgICAgICAgY29uc3QgY2Zyb21GaWVsZHMgPSBjcm9zc01hcC5mcm9tRmllbGRzOw0KICAgICAgICAgICAgICBpZihjcm9zc01hcC50b0ZpZWxkICYmIGNmcm9tRmllbGRzICYmIEFycmF5LmlzQXJyYXkoY2Zyb21GaWVsZHMpICYmIGNmcm9tRmllbGRzLmxlbmd0aD4wKXsNCiAgICAgICAgICAgICAgICAvL+aUtumbhui3qOihqOWPluaVsOWtl+auteWPiuS9jee9ru+8iOiuvue9ruWPquivu++8iQ0KICAgICAgICAgICAgICAgIGNvbnN0IGNyb3NzRmllbGQgPSBjcm9zc01hcC50b0ZpZWxkLnNwbGl0KCcuJylbMl07DQogICAgICAgICAgICAgICAgaWYoIV90aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1tjcm9zc0ZpZWxkXSl7DQogICAgICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbY3Jvc3NGaWVsZF0gPSB7fTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgX3RoaXMuY3Jvc3NNYXBwaW5nRmllbGRzW2Nyb3NzRmllbGRdW2Nyb3NzTWFwLnRvSW5kZXgtMV0gPSB0cnVlOw0KICAgICAgICAgICAgICAgIGxldCBzdWJUYWJsZU5hbWUgPSAnJzsNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGNmcm9tRmllbGRzLmxlbmd0aDsgaysrKSB7DQogICAgICAgICAgICAgICAgICBjb25zdCBtZnJvbUZpZWxkcyA9IGNmcm9tRmllbGRzW2tdLmZyb21GaWVsZC5zcGxpdCgnLicpOw0KICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViUGF0aCA9IG1mcm9tRmllbGRzWzBdKycuJyttZnJvbUZpZWxkc1sxXTsNCiAgICAgICAgICAgICAgICAgIGlmKCFfdGhpcy5jcm9zc01hcHBpbmdzW21mcm9tRmllbGRzWzFdXSl7DQogICAgICAgICAgICAgICAgICAgIF90aGlzLmNyb3NzTWFwcGluZ3NbbWZyb21GaWVsZHNbMV1dID0gW107DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBpZighc3ViVGFibGVNYXBbc3ViUGF0aF0pew0KICAgICAgICAgICAgICAgICAgICBfdGhpcy5jcm9zc01hcHBpbmdTdWJUYWJsZXMucHVzaChzdWJQYXRoKTsNCiAgICAgICAgICAgICAgICAgICAgc3ViVGFibGVNYXBbc3ViUGF0aF0gPSB0cnVlOw0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgc3ViVGFibGVOYW1lID0gbWZyb21GaWVsZHNbMV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIF90aGlzLmNyb3NzTWFwcGluZ3Nbc3ViVGFibGVOYW1lXS5wdXNoKGNyb3NzTWFwKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIC8v5pS26ZuG5Li76KGo6K6h566X6K6+572uDQogICAgICAgICAgdGhpcy5pbml0TWFpbk1hdGhNYXAob3B0aW9uc0pvbi5tYWluVGFibGVDYWxjcyk7DQoNCiAgICAgICAgICAvL+aUtumbhuaJgOacieiuoeeul+WFrOW8j+ebuOWFs+WNleWFg+agvOS/oeaBrw0KICAgICAgICAgIHRoaXMuaW5pdEFsbE1hdGhGaWVsZCgpOw0KICAgICAgICAgIC8v5Yid5aeL5YyW5bWM5aWX6KGo5aS0DQogICAgICAgICAgdGhpcy5pbml0TmVzdGVkSGVhZGVycyhvcHRpb25zSm9uLHJlbGF0aW9ucyk7DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb2xIZWFkZXJzID0gaGVhZGVyczsNCiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnMgPSBjb2x1bW5zOw0KICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGRhdGFMaXN0Ow0KICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MubWVyZ2VDZWxscyA9IHRoaXMuYnVpbGRNZXJnZUNlbGwoZGF0YUxpc3QpOw0KICAgICAgfQ0KICAgICAgLy/lpITnkIbmlrDlop7lkozliKDpmaTmnYPpmZANCiAgICAgIHRoaXMuaGFuZGxlck1lbnUob3B0aW9uc0pvbiwgaXNNYXRoRXhwKTsNCiAgICAgIC8v6I635Y+W5a2Q6KGo5a2X5q615bGe5oCnDQogICAgICAvLyB0aGlzLmluaXRGb3JtRmllbGRzKCk7DQogICAgfQ0KICAgIGlmKHRoaXMuaW5pdGNvbmYpew0KICAgICAgY29uc3QgaW5pdENvbmZKc29uID0gSlNPTi5wYXJzZSh0aGlzLmluaXRjb25mKTsNCiAgICAgIGlmKGluaXRDb25mSnNvbil7DQogICAgICAgICAgdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYgPSBpbml0Q29uZkpzb247DQogICAgICAgICAgaWYoKGluaXRDb25mSnNvbi5vcmdDb25maWcgJiYgKGluaXRDb25mSnNvbi5vcmdDb25maWcuaWQgfHwgDQogICAgICAgICAgICBpbml0Q29uZkpzb24ub3JnQ29uZmlnLm5hbWUgfHwgaW5pdENvbmZKc29uLm9yZ0NvbmZpZy5jb2RlIHx8IGluaXRDb25mSnNvbi5vcmdDb25maWcuaW5zdElkKSkpew0KICAgICAgICAgICAgLy/liJ3lp4vljJbpg6jpl6jloavliLbljZXkvY0NCiAgICAgICAgICAgIHRoaXMuaW5pdEZpbGxPcmcoKTsNCiAgICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9LA0KICBtZXRob2RzOiB7DQogICAgYWRkQ2VsbEZpZWxkQ2hpbGRyZW4oZmllbGQsY2hpbGRyZW4pew0KICAgICAgaWYoZmllbGQuY2hpbGRyZW4pew0KICAgICAgICByZXR1cm4gdGhpcy5hZGRDZWxsRmllbGRDaGlsZHJlbihmaWVsZC5jaGlsZHJlbixjaGlsZHJlbikNCiAgICAgIH1lbHNlew0KICAgICAgICBmaWVsZC5jaGlsZHJlbiA9IGNoaWxkcmVuOw0KICAgICAgfQ0KICAgIH0sDQogICAgaW5pdEZpbGxPcmcoKXsNCiAgICAgIGxldCBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmY7DQogICAgICBjb25zdCBjdXJyZW50VXNlciA9IEpTT04ucGFyc2Uoc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgiY3VycmVudFVzZXIiKSk7DQogICAgICBpZihjdXN0RGlhbG9nICYmIGN1c3REaWFsb2cub3JnQ29uZmlnICYmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCB8fGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIA0KICAgICAgJiYgIXRoaXMuZmlsbE9yZy5pZCl7DQogICAgICAgIGlmKCFsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iK2N1cnJlbnRVc2VyLmFjY291bnQpKXsNCiAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICAgIF90aGlzLiRodHRwLmdldCgnJHt1Y30vYXBpL29yZy92MS9vcmcvZ2V0RmlsbE9yZycpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgIGNvbnN0IHJlcCA9IHJlc3AuZGF0YTsNCiAgICAgICAgICAgICAgaWYocmVwLnN0YXRlKXsNCiAgICAgICAgICAgICAgICBfdGhpcy5maWxsT3JnID0gcmVwLnZhbHVlOw0KICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCJjdXJGaWxsT3JnXyIrY3VycmVudFVzZXIuYWNjb3VudCxKU09OLnN0cmluZ2lmeShyZXAudmFsdWUpKTsNCiAgICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVwLm1lc3NhZ2UsDQogICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyINCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sIGVycm9yID0+IHsNCiAgICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOw0KICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgbWVzc2FnZTogIuiOt+WPluW9k+WJjeeUqOaIt+Whq+WItuWNleS9jeWksei0pe+8gSIsDQogICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciDQogICAgICAgICAgICAgIH0pOw0KICAgICAgICAgIH0pDQogICAgICAgIH1lbHNlew0KICAgICAgICAgIHRoaXMuZmlsbE9yZyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oImN1ckZpbGxPcmdfIitjdXJyZW50VXNlci5hY2NvdW50KSk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgIH0sDQogICAgaW5pdE1hdGhNYXAoY29sdW1uKXsvL+aUtumbhuihjOWGheiuoeeul+WFrOW8jw0KICAgICAgaWYoY29sdW1uLm1hdGhFeHApew0KICAgICAgICAvL+aUtumbhuiuoeeul+WNleWFg+agvA0KICAgICAgICB0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXSA9IHt9Ow0KICAgICAgICB0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXVstMV0gPSB0cnVlOw0KDQogICAgICAgIHRoaXMubWF0aEV4cE1hcFtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsNCiAgICAgICAgdGhpcy5tYXRoRXhwSXRlbU1hcFtjb2x1bW4uZGF0YV0gPSB7fTsNCiAgICAgICAgdGhpcy5tYXRoRXhwSXRlbU1hcFtjb2x1bW4uZGF0YV1bY29sdW1uLmRhdGFdID0gY29sdW1uLm1hdGhFeHA7DQogICAgICAgIGNvbnN0IGZpZWxkcyA9IHRoaXMucGFyc2VGdW5jZXhwRmllbGQoY29sdW1uLm1hdGhFeHApOw0KICAgICAgICBpZihmaWVsZHMpew0KICAgICAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICAgICAgZmllbGRzLmZvckVhY2goZmllbGQgPT57DQogICAgICAgICAgICBjb25zdCBmaWVsZEFycmF5ID0gZmllbGQuc3BsaXQoJy4nKTsNCiAgICAgICAgICAgIGNvbnN0IG5hID0gZmllbGRBcnJheVsxXTsNCiAgICAgICAgICAgIGNvbnN0IHNhID0gZmllbGRBcnJheVszXTsNCiAgICAgICAgICAgIGlmKCFfdGhpcy5tYXRoRXhwSXRlbU1hcFtuYV0pew0KICAgICAgICAgICAgICBfdGhpcy5tYXRoRXhwSXRlbU1hcFtuYV0gPSB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW25hXVtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsNCiAgICAgICAgICAgIGlmKCFfdGhpcy5tYXRoRXhwSXRlbU1hcFtzYV0pew0KICAgICAgICAgICAgICBfdGhpcy5tYXRoRXhwSXRlbU1hcFtzYV0gPSB7fTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIF90aGlzLm1hdGhFeHBJdGVtTWFwW3NhXVtjb2x1bW4uZGF0YV0gPSBjb2x1bW4ubWF0aEV4cDsNCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICBpbml0Um93TWF0aE1hcChjb2x1bW4pey8v5pS26ZuG6Leo6KGM6K6h566X5YWs5byPDQogICAgICBpZihjb2x1bW4ucm93TWF0aEV4cCl7DQogICAgICAgIGNvbnN0IHJvd01hdGhFeHAgPSBjb2x1bW4ucm93TWF0aEV4cDsNCiAgICAgICAgdGhpcy5hbGxSb3dNYXRoTWFwW2NvbHVtbi5kYXRhXSA9IHJvd01hdGhFeHA7DQogICAgICAgIGlmKCF0aGlzLm1hdGhSb3dDZWxsTWFwW2NvbHVtbi5kYXRhXSl7DQogICAgICAgICAgdGhpcy5tYXRoUm93Q2VsbE1hcFtjb2x1bW4uZGF0YV0gPSB7fTsNCiAgICAgICAgfQ0KICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICByb3dNYXRoRXhwLmZvckVhY2goaXRlbSA9PnsNCiAgICAgICAgICAgLy/mlLbpm4borqHnrpfljZXlhYPmoLwNCiAgICAgICAgICBfdGhpcy5tYXRoUm93Q2VsbE1hcFtjb2x1bW4uZGF0YV1baXRlbS5zbi0xXSA9IHRydWU7DQogICAgICAgICAgdmFyIHN0YXRGdW4gPSBpdGVtLm1hdGhFeHA7DQogICAgICAgICAgdmFyIG15cmVnZXhwID0gL1xbKC4qPylcXS9nOw0KICAgICAgICAgIHZhciBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7DQogICAgICAgICAgdmFyIGFycnMgPSBbXTsNCiAgICAgICAgICB3aGlsZSAobWF0Y2ggIT0gbnVsbCkgew0KICAgICAgICAgICAgICB2YXIgaWR4ID0gbWF0Y2hbMV07DQogICAgICAgICAgICAgIGNvbnN0IGlkZXhWYWwgPSBpZHguaW5kZXhPZignOicpPT0tMT9fdGhpcy50b051bWJlcihpZHgpOmlkeDsNCiAgICAgICAgICAgICAgdmFyIGhhcyA9IGZhbHNlOw0KICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgdjsgdiA9IGFycnNbaSsrXTspIHsNCiAgICAgICAgICAgICAgICAgIGlmICh2ID09IGlkZXhWYWwpIGhhcyA9IHRydWU7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgaWYgKCFoYXMpew0KICAgICAgICAgICAgICAgIGFycnMucHVzaChpZGV4VmFsKTsNCiAgICAgICAgICAgICAgICBpZighX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV0pew0KICAgICAgICAgICAgICAgICAgX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV0gPSB7fTsNCiAgICAgICAgICAgICAgICAgIF90aGlzLnJvd01hdGhFeHBNYXBbY29sdW1uLmRhdGFdW2lkZXhWYWxdID0gW107DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGlmKCFfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXSl7DQogICAgICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXSA9IFtdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBfdGhpcy5yb3dNYXRoRXhwTWFwW2NvbHVtbi5kYXRhXVtpZGV4VmFsXS5wdXNoKGl0ZW0pOw0KICAgICAgICAgICAgICB9IA0KICAgICAgICAgICAgICBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgIH0NCiAgICB9LA0KICAgIGluaXRNYWluTWF0aE1hcChtYWluVGFibGVDYWxjcyl7Ly/mlLbpm4bkuLvooajorqHnrpflhazlvI8NCiAgICAgIGlmKG1haW5UYWJsZUNhbGNzICAmJiBBcnJheS5pc0FycmF5KG1haW5UYWJsZUNhbGNzKSAmJiBtYWluVGFibGVDYWxjcy5sZW5ndGg+MCl7DQogICAgICAgIGxldCBtYWluRmllbGRNYXRoTWFwID0ge307DQogICAgICAgIG1haW5UYWJsZUNhbGNzLmZvckVhY2goY2FsYyA9PnsNCiAgICAgICAgICBpZihjYWxjLnN1bUZpZWxkICYmIGNhbGMubWFpbkZpZWxkKXsNCiAgICAgICAgICAgIGNvbnN0IHN1bUZpZWxkUGF0aCA9IGNhbGMuc3VtRmllbGQuc3BsaXQoIi4iKTsNCiAgICAgICAgICAgIG1haW5GaWVsZE1hdGhNYXBbc3VtRmllbGRQYXRoWzJdXSA9IGNhbGM7DQogICAgICAgICAgfQ0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy5tYWluRmllbGRNYXRoTWFwID0gbWFpbkZpZWxkTWF0aE1hcDsNCiAgICAgIH0NCiAgICB9LA0KICAgIGluaXRBbGxNYXRoRmllbGQoKXsNCiAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICBsZXQgcm93TWF0aE1hcCA9IF90aGlzLnJvd01hdGhFeHBNYXA7DQogICAgICBsZXQgbWF0aE1hcCA9IF90aGlzLm1hdGhFeHBNYXA7DQogICAgICBsZXQgbWF0aEV4cEl0ZW1NYXAgPSBfdGhpcy5tYXRoRXhwSXRlbU1hcDsNCiAgICAgIGxldCByb3dFeGVjQXJyYXkgPSBbXTsNCiAgICAgIGlmKHJvd01hdGhNYXApew0KICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByb3dNYXRoTWFwKSB7DQogICAgICAgICAgaWYgKHJvd01hdGhNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KICAgICAgICAgICAgbGV0IHJvd01hdGggPSByb3dNYXRoTWFwW2tleV07DQogICAgICAgICAgICBsZXQgcm93SXRlbSA9IHtuYW1lOmtleSxpc0FsbDpmYWxzZSxpbmRleDpbXX07DQogICAgICAgICAgICBmb3IgKGNvbnN0IGlkeCBpbiByb3dNYXRoKSB7DQogICAgICAgICAgICAgIGlmIChyb3dNYXRoLmhhc093blByb3BlcnR5KGlkeCkpIHsNCiAgICAgICAgICAgICAgICBpZihpZHguaW5kZXhPZignOicpIT0tMSl7DQogICAgICAgICAgICAgICAgICBjb25zdCBmQXJyYXkgPSBpZHguc3BsaXQoIjoiKTsNCiAgICAgICAgICAgICAgICAgIGlmKGZBcnJheS5sZW5ndGg9PTIpew0KICAgICAgICAgICAgICAgICAgICBjb25zdCBhID0gX3RoaXMudG9OdW1iZXIoZkFycmF5WzBdKTsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IF90aGlzLnRvTnVtYmVyKGZBcnJheVsxXSk7DQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBhOyBpIDw9IGI7IGkrKykgew0KICAgICAgICAgICAgICAgICAgICAgIHJvd0l0ZW0uaW5kZXgucHVzaChpKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgcm93SXRlbS5pbmRleC5wdXNoKF90aGlzLnRvTnVtYmVyKF90aGlzLnRvTnVtYmVyKGlkeCkpKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJvd0V4ZWNBcnJheS5wdXNoKHJvd0l0ZW0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYobWF0aE1hcCl7DQogICAgICAgIGZvciAoY29uc3QgbWEgaW4gbWF0aE1hcCkgew0KICAgICAgICAgIGlmIChtYXRoTWFwLmhhc093blByb3BlcnR5KG1hKSl7DQogICAgICAgICAgICByb3dFeGVjQXJyYXkucHVzaCh7bmFtZTptYSxpc0FsbDp0cnVlfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZihyb3dFeGVjQXJyYXkgJiYgcm93RXhlY0FycmF5Lmxlbmd0aD4wKXsNCiAgICAgICAgX3RoaXMuYWxsTWF0aEV4cExpc3QgPSByb3dFeGVjQXJyYXk7DQogICAgICB9DQogICAgfSwNCiAgICAvL+WIneWni+WMluW1jOWll+ihqOWktA0KICAgIGluaXROZXN0ZWRIZWFkZXJzKG9wdGlvbnMsaGVhZGVycyl7DQogICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgbGV0IGdldFJvd0xhYmxlID0gZnVuY3Rpb24oY2VsbCl7DQogICAgICAgICBjb25zdCBzdGFydCA9IGNlbGwuc3RhcnRGaWVsZDsNCiAgICAgICAgIGNvbnN0IGVuZCA9IGNlbGwuZW5kRmllbGQ7DQogICAgICAgICBsZXQgY29sc3BhbiA9IDA7DQogICAgICAgICBsZXQgaXNFbmQgPSBmYWxzZTsNCiAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVycy5sZW5ndGg7IGkrKykgew0KICAgICAgICAgICBpZighaXNFbmQpew0KICAgICAgICAgICAgIGlmKHN0YXJ0PT1oZWFkZXJzW2ldLm5hbWUpew0KICAgICAgICAgICAgICAgIGNvbHNwYW4rKzsNCiAgICAgICAgICAgICAgfWVsc2UgaWYoZW5kPT1oZWFkZXJzW2ldLm5hbWUpew0KICAgICAgICAgICAgICAgIGNvbHNwYW4rKzsNCiAgICAgICAgICAgICAgICBpc0VuZCA9IHRydWU7DQogICAgICAgICAgICAgIH1lbHNlIGlmKGNvbHNwYW4+MCl7DQogICAgICAgICAgICAgICAgY29sc3BhbisrOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgIH0NCiAgICAgICAgIH0NCiAgICAgICAgIHJldHVybiB7bGFiZWw6IGNlbGwubmFtZSwgY29sc3BhbjogY29sc3Bhbn07DQogICAgICB9DQogICAgICBsZXQgZ2V0SXNJbk5lc3RlZCA9IGZ1bmN0aW9uKG5hbWUsaXRlbUhlYWRlcnMpew0KICAgICAgICBsZXQgcm93TGFibGUgPSBudWxsOw0KICAgICAgICBpdGVtSGVhZGVycy5mb3JFYWNoKGNlbGwgPT57DQogICAgICAgICAgaWYoIXJvd0xhYmxlICYmIG5hbWUgPT0gY2VsbC5zdGFydEZpZWxkKXsNCiAgICAgICAgICAgIHJvd0xhYmxlID0gZ2V0Um93TGFibGUoY2VsbCk7DQogICAgICAgICAgfQ0KICAgICAgICB9KQ0KICAgICAgICByZXR1cm4gcm93TGFibGU7DQogICAgICB9DQogICAgICBpZihvcHRpb25zICYmIHR5cGVvZihvcHRpb25zLm5lc3RlZEhlYWRlcnMpIT0ndW5kZWZpbmVkJyAmJiBvcHRpb25zLm5lc3RlZEhlYWRlcnMpew0KICAgICAgICBsZXQgbXlOZXN0ZWRIZWFkZXJzID0gW107DQogICAgICAgIG9wdGlvbnMubmVzdGVkSGVhZGVycy5mb3JFYWNoKHJvdyA9PnsNCiAgICAgICAgICBsZXQgbmVzdGVkSGVhZGVyID0gW107DQogICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICBsZXQgcm93TGFibGUgPSBnZXRJc0luTmVzdGVkKGhlYWRlcnNbaV0ubmFtZSxyb3cuaGVhZGVycyk7DQogICAgICAgICAgICBpZighcm93TGFibGUpew0KICAgICAgICAgICAgICBuZXN0ZWRIZWFkZXIucHVzaChoZWFkZXJzW2ldLmRlc2MpOw0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgIG5lc3RlZEhlYWRlci5wdXNoKHJvd0xhYmxlKTsNCiAgICAgICAgICAgICAgaSA9IGkgKyByb3dMYWJsZS5jb2xzcGFuIC0xOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZihKU09OLnN0cmluZ2lmeShuZXN0ZWRIZWFkZXIpIT09SlNPTi5zdHJpbmdpZnkoaGVhZGVycykpew0KICAgICAgICAgICAgbXlOZXN0ZWRIZWFkZXJzLnB1c2gobmVzdGVkSGVhZGVyKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pDQogICAgICAgIGlmKG15TmVzdGVkSGVhZGVycy5sZW5ndGg+MCl7DQogICAgICAgICAgbGV0IGhlYWRlckFycmF5ID0gW107DQogICAgICAgICAgaGVhZGVycy5mb3JFYWNoKG15SGVhZGVyID0+ew0KICAgICAgICAgICAgaGVhZGVyQXJyYXkucHVzaChteUhlYWRlci5kZXNjKTsNCiAgICAgICAgICB9KQ0KICAgICAgICAgIG15TmVzdGVkSGVhZGVycy5wdXNoKGhlYWRlckFycmF5KTsNCiAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm5lc3RlZEhlYWRlcnMgPSBteU5lc3RlZEhlYWRlcnM7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGluaXRGb3JtRmllbGRzKCl7DQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgIHRoaXMuZm9ybUlkID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcGFyZW50LiRwYXJlbnQuZm9ybUlkOw0KICAgICAgaWYodGhpcy5mb3JtSWQgJiYgdHlwZW9mKHRoaXMuZm9ybUlkKSE9J3VuZGVmaW5lZCcpew0KICAgICAgICAgIGNvbnN0IHBhdGhzID0gdGhpcy5zdWJUYWJsZVBhdGguc3BsaXQoJy4nKTsNCiAgICAgICAgICBjb25zdCBlbnROYW1lID0gcGF0aHNbMV0uc3BsaXQoJ3N1Yl8nKVsxXTsNCiAgICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICAgIHRoaXMuJGh0dHAuZ2V0KCcke2Zvcm19L2Zvcm0vZm9ybS92MS9nZXRGb3JtRmllbGRzP2Zvcm1JZD0nK3RoaXMuZm9ybUlkKycmZW50TmFtZT0nK2VudE5hbWUpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgIGlmKHJlc3AuZGF0YSl7DQogICAgICAgICAgICAgICAgX3RoaXMuZm9ybUZpZWxkcyA9IHJlc3AuZGF0YTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgIH0sIGVycm9yID0+IHt9KQ0KICAgICAgfQ0KICAgIH0sDQogICAgaGFuZGxlck1lbnUob3B0aW9uc0pvbixpc01hdGhFeHApew0KICAgICAgaWYodGhpcy5wZXJtaXNzaW9uICYmIHRoaXMucGVybWlzc2lvblsndGFibGUnXSl7DQogICAgICAgIGNvbnN0IHRhYlBlcm1pc3Npb24gPSB0aGlzLnBlcm1pc3Npb25bJ3RhYmxlJ11bb3B0aW9uc0pvbi5ib1N1YkVudGl0eV07DQogICAgICAgIGxldCBfX3RoaXMgPSB0aGlzOw0KICAgICAgICAvLyB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyb3dfZGV0YWlsIl0gPSB7bmFtZTon5piO57uGJyxjYWxsYmFjazpmdW5jdGlvbigpew0KICAgICAgICAvLyAgICAgICBsZXQgY2VsbCA9IHRoaXMuZ2V0U2VsZWN0ZWQoKVswXTsNCiAgICAgICAgLy8gICAgICAgY29uc3QgaW5kZXggPSBjZWxsWzBdOw0KICAgICAgICAvLyAgICAgICBjb25zdCBjdXJEYXRhID0gX190aGlzLmdldEhvdFRhYmxlRGF0YSgpOw0KICAgICAgICAvLyAgICAgICBfX3RoaXMuJHJlZnNbJ3N1YkRhdGFEZXRhaWwnXS5oYW5kbGVPcGVuKGN1ckRhdGFbaW5kZXhdLF9fdGhpcy5mb3JtRmllbGRzKTsNCiAgICAgICAgLy8gICAgIH0sDQogICAgICAgIC8vIH07DQogICAgICAgIGlmKHRhYlBlcm1pc3Npb24gJiYgdGFiUGVybWlzc2lvbi5hZGQgPT0gdHJ1ZSl7DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicm93X2Fib3ZlIl0gPSB7bmFtZTon5LiK5pa55o+S5YWl5LiA6KGMJ307DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicm93X2JlbG93Il0gPSB7bmFtZTon5LiL5pa55o+S5YWl5LiA6KGMJ307DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicm93X3VwIl0gPSB7bmFtZTon5LiK56e7JyxjYWxsYmFjazpmdW5jdGlvbigpew0KICAgICAgICAgICAgICBsZXQgY2VsbCA9IHRoaXMuZ2V0U2VsZWN0ZWQoKVswXTsNCiAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjZWxsWzBdOw0KICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHsNCiAgICAgICAgICAgICAgICAgIF9fdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLlt7Lnu4/mmK/liJfooajkuK3nrKzkuIDkvY0iLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyINCiAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICBsZXQgZGF0YUxpc3QgPSBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YTsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IHQgPSBkYXRhTGlzdFtpbmRleCAtIDFdOw0KICAgICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXggLSAxXSA9IGRhdGFMaXN0W2luZGV4XTsNCiAgICAgICAgICAgICAgICAgIGRhdGFMaXN0W2luZGV4XSA9IHQ7DQogICAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOw0KICAgICAgICAgICAgICAgICAgX190aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBkYXRhTGlzdDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9LA0KICAgICAgICAgIH07DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5jb250ZXh0TWVudS5pdGVtc1sicm93X2Rvd24iXSA9IHtuYW1lOifkuIvnp7snLGNhbGxiYWNrOmZ1bmN0aW9uKCl7DQogICAgICAgICAgICAgIGxldCBjZWxsID0gdGhpcy5nZXRTZWxlY3RlZCgpWzBdOw0KICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGNlbGxbMF07DQogICAgICAgICAgICAgIGxldCBkYXRhTGlzdCA9IF9fdGhpcy5ob3RTZXR0aW5ncy5kYXRhOw0KICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGRhdGFMaXN0Lmxlbmd0aCAtIDEpIHsNCiAgICAgICAgICAgICAgICAgIF9fdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLlt7Lnu4/mmK/liJfooajkuK3mnIDlkI7kuIDkvY0iLA0KICAgICAgICAgICAgICAgICAgICB0eXBlOiAid2FybmluZyINCiAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICB2YXIgdCA9IGRhdGFMaXN0W2luZGV4ICsgMV07DQogICAgICAgICAgICAgICAgICBkYXRhTGlzdFtpbmRleCArIDFdID0gZGF0YUxpc3RbaW5kZXhdOw0KICAgICAgICAgICAgICAgICAgZGF0YUxpc3RbaW5kZXhdID0gdDsNCiAgICAgICAgICAgICAgICAgIF9fdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gW107DQogICAgICAgICAgICAgICAgICBfX3RoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGRhdGFMaXN0Ow0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0sDQogICAgICAgIH07DQogICAgICAgIGlmKHRhYlBlcm1pc3Npb24gJiYgdGFiUGVybWlzc2lvbi5kZWwgPT0gdHJ1ZSl7DQogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmNvbnRleHRNZW51Lml0ZW1zWyJyZW1vdmVfcm93Il0gPSB7bmFtZTon5Yig6Zmk6KGMJ307DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgfQ0KICAgIH0sDQogICAgaGFuZENlbGxTdHlsZShjb2x1bW4pew0KICAgICAgaWYoY29sdW1uLnN0eWxlKXsNCiAgICAgICAgbGV0IGNzdHlsZSA9ICcnOw0KICAgICAgICBpZihjb2x1bW4uc3R5bGUuZGl5U3R5bGUpew0KICAgICAgICAgIGNzdHlsZSA9IGNvbHVtbi5zdHlsZS5kaXlTdHlsZTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgaWYoY29sdW1uLnN0eWxlLmJhY2tncm91bmQpew0KICAgICAgICAgICAgY3N0eWxlID0gJ2JhY2tncm91bmQtY29sb3I6Jytjb2x1bW4uc3R5bGUuYmFja2dyb3VuZCsnOyc7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKGNvbHVtbi5zdHlsZS5ib2xkKXsNCiAgICAgICAgICAgIGNzdHlsZSA9IGNzdHlsZSArJ2ZvbnQtd2VpZ2h0OiBib2xkOyc7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKGNvbHVtbi5zdHlsZS5zaXplKXsNCiAgICAgICAgICAgIGNzdHlsZSA9IGNzdHlsZSArJ2ZvbnQtc2l6ZTonK2NvbHVtbi5zdHlsZS5zaXplKydweDsnOw0KICAgICAgICAgIH0NCiAgICAgICAgICBpZihjb2x1bW4uc3R5bGUuY29sb3Ipew0KICAgICAgICAgICAgY3N0eWxlID0gY3N0eWxlICsnY29sb3I6Jytjb2x1bW4uc3R5bGUuY29sb3IrJzsnOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihjc3R5bGUpew0KICAgICAgICAgIHRoaXMuY2VsbFN0eWxlTWFwW2NvbHVtbi5kYXRhXSA9IGNzdHlsZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgY2VsbHNNZShyb3csIGNvbCwgcHJvcCl7DQogICAgICBsZXQgY2VsbFByb3BlcnRpZXMgPSB7cmVuZGVyZXI6dGhpcy5yZW5kZXJlck1lfTsNCiAgICAgIC8v6K6h566X5YWs5byP5Y2V5YWD5qC86K6+572u5Y+q6K+7DQogICAgICBpZih0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdICYmICh0aGlzLm1hdGhSb3dDZWxsTWFwW3Byb3BdWy0xXT09PXRydWUgfHwgdGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVtyb3ddPT09dHJ1ZSkpew0KICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7DQogICAgICB9ZWxzZSBpZih0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1twcm9wXSAmJiB0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1twcm9wXVtyb3ddPT09dHJ1ZSl7DQogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsNCiAgICAgIH1lbHNlIGlmKHRoaXMuZmlyc3RTdW1NYXBbcHJvcF0gJiYgcm93PT0wKXsNCiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOw0KICAgICAgfWVsc2UgaWYodGhpcy5yZWFkT25seVJvd3NNYXBbcHJvcCsnXycrcm93XSA9PT0gdHJ1ZSl7DQogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsNCiAgICAgIH0NCiAgICAgIHJldHVybiBjZWxsUHJvcGVydGllczsNCiAgICB9LA0KICAgIGFmdGVyTG9hZERhdGFNZSgpew0KICAgICAgLy8gaWYodGhpcy5pc0luaXRUZW1wbGF0ZURhdGEhPT0ndHJ1ZScgJiYgdGhpcy5ob3RTZXR0aW5ncy5kYXRhICYmIHRoaXMuaG90U2V0dGluZ3MuZGF0YS5sZW5ndGg9PTEgJiYgDQogICAgICAvLyAgIEFycmF5LmlzQXJyYXkodGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKSl7DQogICAgICAvLyAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSA9IHsuLi50aGlzLmluaXRSb3dEYXRhfTsNCiAgICAgIC8vIH0NCiAgICAgIC8vdGhpcy5ob3RJbnN0YW5jZS5yZW5kZXIoKTsNCiAgICB9LA0KICAgIHJlbmRlcmVyTWUoaW5zdGFuY2UsIHRkLCByb3csIGNvbCwgcHJvcCwgdmFsdWUsIGNlbGxQcm9wZXJ0aWVzKXsNCiAgICAgIEhhbmRzb250YWJsZS5yZW5kZXJlcnMuVGV4dFJlbmRlcmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgICANCiAgICAgIGlmICh0aGlzLmNlbGxTdHlsZU1hcFtwcm9wXSkgew0KICAgICAgICAgIHRkLnN0eWxlID0gdGhpcy5jZWxsU3R5bGVNYXBbcHJvcF07DQogICAgICB9DQogICAgICB0ZC5zdHlsZS5saW5lSGVpZ2h0ID0gJzIycHgnOw0KICAgICAgaWYodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXSAmJiAodGhpcy5tYXRoUm93Q2VsbE1hcFtwcm9wXVstMV09PT10cnVlIHx8IHRoaXMubWF0aFJvd0NlbGxNYXBbcHJvcF1bcm93XT09PXRydWUpKXsNCiAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOw0KICAgICAgICB0ZC5zdHlsZS5iYWNrZ3JvdW5kID0gJyNGNUY3RkEnOw0KICAgICAgfWVsc2UgaWYodGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbcHJvcF0gJiYgdGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbcHJvcF1bcm93XT09PXRydWUpew0KICAgICAgICBjZWxsUHJvcGVydGllc1sncmVhZE9ubHknXSA9IHRydWU7DQogICAgICAgIHRkLnN0eWxlLmJhY2tncm91bmQgPSAnI0Y1RjdGQSc7DQogICAgICB9ZWxzZSBpZih0aGlzLmZpcnN0U3VtTWFwW3Byb3BdICYmIHJvdz09MCl7DQogICAgICAgIGNlbGxQcm9wZXJ0aWVzWydyZWFkT25seSddID0gdHJ1ZTsNCiAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRjVGN0ZBJzsNCiAgICAgIH1lbHNlIGlmKHRoaXMucmVhZE9ubHlSb3dzTWFwW3Byb3ArJ18nK3Jvd10gPT09IHRydWUpew0KICAgICAgICAgY2VsbFByb3BlcnRpZXNbJ3JlYWRPbmx5J10gPSB0cnVlOw0KICAgICAgICAgdGQuc3R5bGUuYmFja2dyb3VuZCA9ICcjRjVGN0ZBJzsNCiAgICAgIH0NCiAgICB9LA0KICAgIGJ1aWxkTWVyZ2VDZWxsKGRhdGFMaXN0KXsNCiAgICAgIGlmKCFkYXRhTGlzdCl7DQogICAgICAgIGRhdGFMaXN0ID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsNCiAgICAgIH0NCiAgICAgIGlmKGRhdGFMaXN0ICYmIGRhdGFMaXN0Lmxlbmd0aCA9PSAxICYmIE9iamVjdC5rZXlzKGRhdGFMaXN0WzBdKS5sZW5ndGg9PTApew0KICAgICAgICByZXR1cm4gOw0KICAgICAgfQ0KICAgICAgbGV0IG1lcmdlQ2VsbHMgPSBbXTsNCiAgICAgIGNvbnN0IG1lcmdlZiA9IHtyb3c6MCwgY29sOjAsIHJvd3NwYW46IGRhdGFMaXN0Lmxlbmd0aCwgY29sc3BhbjoxfTsNCiAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5NZXJnZUNlbGwobWVyZ2VDZWxscywgZGF0YUxpc3QsIG1lcmdlZiwgdGhpcy5tZXJnZUNlbGxGaWVsZCk7DQogICAgICB0aGlzLm1lcmdlQ2VsbHMgPSBtZXJnZUNlbGxzOw0KICAgICAgcmV0dXJuIG1lcmdlQ2VsbHM7DQogICAgfSwNCiAgICBnZXRDaGlsZHJlbk1lcmdlQ2VsbChtZXJnZUNlbGxzLCBkYXRhTGlzdCwgbWVyZ2UsIGZpZWxkKXsNCiAgICAgIGxldCBtZmllbGQgPSBmaWVsZDsNCiAgICAgIGxldCBtZXJnZU1hcCA9IHt9Ow0KICAgICAgbGV0IGluZGV4TWFwID0ge307DQogICAgICBmb3IgKGxldCBpID0gbWVyZ2Uucm93OyBpIDwgbWVyZ2Uucm93K21lcmdlLnJvd3NwYW47IGkrKykgew0KICAgICAgICAgIGNvbnN0IGl0ZW0gPSBkYXRhTGlzdFtpXTsNCiAgICAgICAgICBpbmRleE1hcFttZmllbGQuZmllbGRdID0gbWZpZWxkLmluZGV4Ow0KICAgICAgICAgIGlmKCFtZXJnZU1hcFttZmllbGQuZmllbGRdKXsNCiAgICAgICAgICAgIG1lcmdlTWFwW21maWVsZC5maWVsZF0gPSB7dmFsdWU6aXRlbVttZmllbGQuZmllbGRdLHNpemU6MSxzdGFydFJvdzppfTsNCiAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgIGxldCBvbWZpZWxkID0gbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXTsNCiAgICAgICAgICAgIGlmKG9tZmllbGQudmFsdWU9PW51bGwgfHwgb21maWVsZC52YWx1ZT09ICdudWxsJyB8fCBvbWZpZWxkLnZhbHVlID09J3VuZGVmaW5lZCcgfHwgb21maWVsZC52YWx1ZT09PScnIHx8IG9tZmllbGQudmFsdWUhPWl0ZW1bbWZpZWxkLmZpZWxkXSl7DQogICAgICAgICAgICAgIGlmKG9tZmllbGQuc2l6ZT4xKXsNCiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWYgPSB7cm93Om9tZmllbGQuc3RhcnRSb3csIGNvbDptZmllbGQuaW5kZXgsIHJvd3NwYW46b21maWVsZC5zaXplLCBjb2xzcGFuOjF9Ow0KICAgICAgICAgICAgICAgIG1lcmdlQ2VsbHMucHVzaCh7Li4ubWVyZ2VmfSk7DQogICAgICAgICAgICAgICAgaWYobWZpZWxkLmNoaWxkcmVuKXsNCiAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2hpbGRyZW5NZXJnZUNlbGwobWVyZ2VDZWxscywgZGF0YUxpc3QsIG1lcmdlZiwgbWZpZWxkLmNoaWxkcmVuKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgZGVsZXRlIG1lcmdlTWFwW21maWVsZC5maWVsZF07DQogICAgICAgICAgICAgIG1lcmdlTWFwW21maWVsZC5maWVsZF0gPSB7dmFsdWU6aXRlbVttZmllbGQuZmllbGRdLHNpemU6MSxzdGFydFJvdzppfTsNCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICBvbWZpZWxkLnNpemUrKzsNCiAgICAgICAgICAgICAgbWVyZ2VNYXBbbWZpZWxkLmZpZWxkXSA9IG9tZmllbGQ7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWVyZ2VNYXApIHsNCiAgICAgICAgaWYgKG1lcmdlTWFwLmhhc093blByb3BlcnR5KGtleSkpIHsNCiAgICAgICAgICBjb25zdCBtZXJnZSA9IG1lcmdlTWFwW2tleV07DQogICAgICAgICAgaWYobWVyZ2Uuc2l6ZT4xKXsNCiAgICAgICAgICAgIGNvbnN0IG1lcmdlZiA9IHtyb3c6bWVyZ2Uuc3RhcnRSb3csIGNvbDppbmRleE1hcFtrZXldLCByb3dzcGFuOm1lcmdlLnNpemUsIGNvbHNwYW46MX07DQogICAgICAgICAgICBtZXJnZUNlbGxzLnB1c2goey4uLm1lcmdlZn0pOw0KICAgICAgICAgICAgaWYobWZpZWxkLmNoaWxkcmVuKXsNCiAgICAgICAgICAgICAgdGhpcy5nZXRDaGlsZHJlbk1lcmdlQ2VsbChtZXJnZUNlbGxzLCBkYXRhTGlzdCwgbWVyZ2VmLCBtZmllbGQuY2hpbGRyZW4pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgYmVmb3JlUmVtb3ZlUm93TWU6IGZ1bmN0aW9uIChjaGFuZ2VzLCBzb3VyY2UpIHsgLy8g5pWw5o2u5pS55Y+Y5pe26Kem5Y+R5q2k5pa55rOVDQogICAgICANCiAgICB9LA0KICAgIC8vIOa3u+WKoOihjA0KICAgIGFmdGVyQ3JlYXRlUm93TWU6IGZ1bmN0aW9uIChjaGFuZ2VzKSB7DQogICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbY2hhbmdlc10gPSB7Li4udGhpcy5pbml0Um93RGF0YX07DQogICAgICBpZihBcnJheS5pc0FycmF5KHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSkpew0KICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSB7Li4udGhpcy5pbml0Um93RGF0YX07DQogICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXSA9IHRoaXMuZmlsbE9yZ0RhdGFGaWVsZCh0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0pOw0KICAgICAgfQ0KICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhW2NoYW5nZXNdID0gdGhpcy5maWxsT3JnRGF0YUZpZWxkKHRoaXMuaG90U2V0dGluZ3MuZGF0YVtjaGFuZ2VzXSk7DQogICAgfSwNCiAgICAvLyDmlrDlop7ooYzml7bvvIzliqjmgIHmlLnlj5jlgLwNCiAgICBhZnRlckNoYW5nZU1lOiBmdW5jdGlvbiAoY2hhbmdlcywgc291cmNlKSB7DQogICAgICBpZihzb3VyY2UgPT0nZWRpdCcgfHwgc291cmNlID09ICdBdXRvZmlsbC5maWxsJyl7DQogICAgICAgICAgLy/miafooYzorqHnrpflhazlvI8NCiAgICAgICAgICAvL3RoaXMuZXhlY01hdGhFeHBTaW5nbGUoY2hhbmdlcyk7DQogICAgICAgICAgLy90aGlzLmV4ZWNNYXRoRXhwQWxsKGNoYW5nZXMpOw0KICAgICAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAobnVsbCxjaGFuZ2VzKTsNCiAgICAgIH1lbHNlIGlmKHNvdXJjZSA9PSAnQ29weVBhc3RlLnBhc3RlJyAmJiBjaGFuZ2VzICYmIGNoYW5nZXMubGVuZ3RoPjApew0KICAgICAgICBsZXQgaG90RGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOw0KICAgICAgICBsZXQgaXNDaGFuZ2UgPSBmYWxzZTsNCiAgICAgICAgaWYoaG90RGF0YSl7DQogICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PnsNCiAgICAgICAgICAgICAgbGV0IGNoYW5nZUluZGV4ID0gY2hhbmdlWzBdDQogICAgICAgICAgICAgIGxldCBjaGFuZ2VGaWVsZCA9IGNoYW5nZVsxXTsNCiAgICAgICAgICAgICAgbGV0IGNoYW5nZVZhbHVlID0gY2hhbmdlWzNdOw0KICAgICAgICAgICAgICBpZihjaGFuZ2VWYWx1ZT09PSfjgIAnKXsNCiAgICAgICAgICAgICAgICBob3REYXRhW2NoYW5nZUluZGV4XVtjaGFuZ2VGaWVsZF0gPSAnJzsNCiAgICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgICBpZihpc0NoYW5nZSl7DQogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbXTsNCiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IGhvdERhdGE7DQogICAgICAgICAgfQ0KICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICB0aGlzLmV4ZWNDcm9zc01hcHBpbmcoKTsvL+aJp+ihjOi3qOihqOWPluaVsA0KICAgICAgICAgICAgdGhpcy5leGVjQ2VsbE1hdGhFeHAoaG90RGF0YSk7Ly/miafooYzorqHnrpflhazlvI8gDQogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGV4ZWNNYXRoRXhwQWxsKGNoYW5nZXMpew0KICAgICAgaWYgKGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGg+MCkgew0KICAgICAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICAgICAgbGV0IGlzQ2hhbmdlID0gZmFsc2U7DQogICAgICAgICAgbGV0IGhvdERhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsNCiAgICAgICAgICBsZXQgZnN1bU1hcCA9IHRoaXMuZmlyc3RTdW1NYXA7DQogICAgICAgICAgbGV0IGNoYW5nZUZpZWxkcyA9IHt9Ow0KICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT57DQogICAgICAgICAgICAvL+aJp+ihjOi3qOihjOiuoeeul+WFrOW8jw0KICAgICAgICAgICAgbGV0IGNoYW5nZUluZGV4ID0gY2hhbmdlWzBdDQogICAgICAgICAgICBsZXQgY2hhbmdlRmllbGQgPSBjaGFuZ2VbMV07DQogICAgICAgICAgICBjaGFuZ2VGaWVsZHNbY2hhbmdlRmllbGRdID0gdHJ1ZTsNCiAgICAgICAgICAgIC8v5omn6KGM6KGM5YaF6K6h566X5YWs5byPDQogICAgICAgICAgICBjb25zdCBleGVNYXRoUmVzdWx0ID0gX3RoaXMuZXhlQWxsTWF0aEV4cChob3REYXRhLF90aGlzLGNoYW5nZUluZGV4LGlzQ2hhbmdlKTsNCiAgICAgICAgICAgIGhvdERhdGEgPSBleGVNYXRoUmVzdWx0LmRhdGE7DQogICAgICAgICAgICBpZihleGVNYXRoUmVzdWx0LmlzQ2hhbmdlKXsNCiAgICAgICAgICAgICAgaXNDaGFuZ2UgPSBleGVNYXRoUmVzdWx0LmlzQ2hhbmdlOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pDQogICAgICAgICAgDQogICAgICAgICAgLy/miafooYzot6jooYzorqHnrpflhazlvI8NCiAgICAgICAgICBjb25zdCBleGVSb3dSZXN1bHQgPSBfdGhpcy5leGVBbGxSb3dNYXRoRXhwKGhvdERhdGEsX3RoaXMsaXNDaGFuZ2UpOw0KICAgICAgICAgIGhvdERhdGEgPSBleGVSb3dSZXN1bHQuZGF0YTsNCiAgICAgICAgICBpZihleGVSb3dSZXN1bHQuaXNDaGFuZ2Upew0KICAgICAgICAgICAgaXNDaGFuZ2UgPSBleGVSb3dSZXN1bHQuaXNDaGFuZ2U7DQogICAgICAgICAgfQ0KDQogICAgICAgICAgLy/miafooYzljZXlhYPmoLzorqHnrpflhazlvI8NCiAgICAgICAgICBjb25zdCBleGVDZWxsUmVzdWx0ID0gX3RoaXMuZXhlQ2VsbE1hdGhFeHAoaG90RGF0YSxfdGhpcyxpc0NoYW5nZSk7DQogICAgICAgICAgaG90RGF0YSA9IGV4ZUNlbGxSZXN1bHQuZGF0YTsNCiAgICAgICAgICBpZihleGVDZWxsUmVzdWx0LmlzQ2hhbmdlKXsNCiAgICAgICAgICAgIGlzQ2hhbmdlID0gZXhlQ2VsbFJlc3VsdC5pc0NoYW5nZTsNCiAgICAgICAgICB9DQogICAgICAgICAgDQoNCiAgICAgICAgICAvL+aJp+ihjOmmluihjOaxh+aAuw0KICAgICAgICAgIGlmKCd7fSchPUpTT04uc3RyaW5naWZ5KGZzdW1NYXApKXsNCiAgICAgICAgICAgICAgZm9yIChsZXQgc3VtS2V5IGluIGZzdW1NYXApIHsNCiAgICAgICAgICAgICAgICBpZiAoZnN1bU1hcC5oYXNPd25Qcm9wZXJ0eShzdW1LZXkpKSB7DQogICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wUmVzdWx0ID0gX3RoaXMuZXhlRmlyc3RSb3dTdW0oaG90RGF0YSxzdW1LZXksX3RoaXMsaXNDaGFuZ2UsZnN1bU1hcCk7DQogICAgICAgICAgICAgICAgICBob3REYXRhID0gdGVtcFJlc3VsdC5kYXRhOw0KICAgICAgICAgICAgICAgICAgaWYodGVtcFJlc3VsdC5pc0NoYW5nZSl7DQogICAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdGVtcFJlc3VsdC5pc0NoYW5nZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgICAgDQogICAgICAgICAgLy/miafooYzkuLvooajnu5/orqHlhazlvI8NCiAgICAgICAgICBmb3IgKGxldCBjRmllbGQgaW4gY2hhbmdlRmllbGRzKSB7DQogICAgICAgICAgICBpZiAoY2hhbmdlRmllbGRzLmhhc093blByb3BlcnR5KGNGaWVsZCkpIHsNCiAgICAgICAgICAgICAgX3RoaXMuZXhlTWFpbkZpZWxkTWF0aEV4cChob3REYXRhLGNGaWVsZCxfdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICAgIA0KICAgICAgICAgIGlmKGlzQ2hhbmdlKXsNCiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtdOw0KICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gaG90RGF0YTsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYodGhpcy5tZXJnZUNlbGxzICYmIHRoaXMubWVyZ2VDZWxscy5sZW5ndGg+MCl7DQogICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm1lcmdlQ2VsbHMgPSB0aGlzLmJ1aWxkTWVyZ2VDZWxsKGhvdERhdGEpOw0KICAgICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGV4ZUFsbE1hdGhFeHAoaG90RGF0YSxfdGhpcyxmaWVsZEluZGV4LGlzQ2hhbmdlKXsvL+aJp+ihjOaJgOacieihjOWGhei/kOeulw0KICAgICAgaWYoX3RoaXMubWF0aEV4cE1hcCl7DQogICAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIGluIF90aGlzLm1hdGhFeHBNYXApIHsNCiAgICAgICAgICAvL+WmguaenOihjOWGhei/kOeul+WvueW6lOWNleWFg+agvOWMheWQq+i3qOihjOi/kOeul++8jOWImeS7pei3qOihjOi/kOeul+S4uuS4u++8jOS4jei/m+ihjOihjOWGhei/kOeulw0KICAgICAgICAgIGlmKF90aGlzLm1hdGhFeHBNYXAuaGFzT3duUHJvcGVydHkoZmllbGROYW1lKSAmJiAhdGhpcy5pc0luUm93TWF0aChmaWVsZE5hbWUsZmllbGRJbmRleCkpew0KICAgICAgICAgICAgY29uc3QgY3VyZXhwID0gIF90aGlzLm1hdGhFeHBNYXBbZmllbGROYW1lXTsNCiAgICAgICAgICAgIGxldCBjdXJ2YWx1ZSA9IHRoaXMuY2FsY0V4cFZhbHVlKGN1cmV4cCxob3REYXRhLGZpZWxkSW5kZXgpOw0KICAgICAgICAgICAgaWYoaG90RGF0YVtmaWVsZEluZGV4XSl7DQogICAgICAgICAgICAgIGhvdERhdGFbZmllbGRJbmRleF1bZmllbGROYW1lXSA9IGN1cnZhbHVlOw0KICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiB7ZGF0YTpob3REYXRhLGlzQ2hhbmdlOmlzQ2hhbmdlfTsNCiAgICAgIH0NCiAgICB9LA0KICAgIC8v5Yik5pat6KGM5YaF6L+Q566X55qE5Y2V5YWD5qC85piv5ZCm5YyF5ZCr6Leo6KGM6L+Q566XDQogICAgaXNJblJvd01hdGgoZmllbGQsZmllbGRJbmRleCl7DQogICAgICB2YXIgaXNJbiA9IGZhbHNlOw0KICAgICAgaWYodGhpcy5hbGxSb3dNYXRoTWFwICYmIHRoaXMuYWxsUm93TWF0aE1hcFtmaWVsZF0pew0KICAgICAgICBjb25zdCByb3dNYXRocyA9IHRoaXMuYWxsUm93TWF0aE1hcFtmaWVsZF07DQogICAgICAgIGlmKHJvd01hdGhzICYmIHJvd01hdGhzLmxlbmd0aD4wKXsNCiAgICAgICAgICByb3dNYXRocy5mb3JFYWNoKG1hdGhJdGVtID0+ew0KICAgICAgICAgICAgaWYoKG1hdGhJdGVtLnNuLTEpID09ZmllbGRJbmRleCl7DQogICAgICAgICAgICAgIGlzSW4gPSB0cnVlOw0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gaXNJbjsNCiAgICB9LA0KICAgIGV4ZUFsbFJvd01hdGhFeHAoaG90RGF0YSxfdGhpcyxpc0NoYW5nZSl7Ly/miafooYzmiYDmnInot6jooYzov5DnrpcNCiAgICAgIGlmKF90aGlzLmFsbFJvd01hdGhNYXApew0KICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBpbiBfdGhpcy5hbGxSb3dNYXRoTWFwKSB7DQogICAgICAgICAgaWYoX3RoaXMuYWxsUm93TWF0aE1hcC5oYXNPd25Qcm9wZXJ0eShmaWVsZE5hbWUpKXsNCiAgICAgICAgICAgIGxldCBmcm93TWF0aHMgPSBfdGhpcy5hbGxSb3dNYXRoTWFwW2ZpZWxkTmFtZV07DQogICAgICAgICAgICBpZihmcm93TWF0aHMgJiYgZnJvd01hdGhzLmxlbmd0aD4wKXsNCiAgICAgICAgICAgICAgZnJvd01hdGhzLmZvckVhY2gobWF0aEl0ZW0gPT57DQogICAgICAgICAgICAgICAgaWYoaG90RGF0YVttYXRoSXRlbS5zbi0xXSl7DQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IF90aGlzLmNhbGNSb3dzRXhwVmFsdWUobWF0aEl0ZW0ubWF0aEV4cCxob3REYXRhLGZpZWxkTmFtZSk7DQogICAgICAgICAgICAgICAgICBob3REYXRhW21hdGhJdGVtLnNuLTFdW2ZpZWxkTmFtZV0gPSB2YWx1ZTsNCiAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4ge2RhdGE6aG90RGF0YSxpc0NoYW5nZTppc0NoYW5nZX07DQogICAgfSwNCiAgICBleGVDZWxsTWF0aEV4cChob3REYXRhLF90aGlzLGlzQ2hhbmdlKXsvL+aJp+ihjOaJgOacieWNleWFg+agvOiuoeeul+WFrOW8jw0KICAgICAgaWYoX3RoaXMuY2VsbENhbGNzICYmIF90aGlzLmNlbGxDYWxjcy5sZW5ndGg+MCl7DQogICAgICAgIGNvbnN0IGZvcm1JbnN0ID0gdXRpbHMuZ2V0T25saW5lRm9ybUluc3RhbmNlKHRoaXMpOw0KICAgICAgICBfdGhpcy5jZWxsQ2FsY3MuZm9yRWFjaChpdGVtID0+ew0KICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IGl0ZW0uY2VsbEZpZWxkLnNwbGl0KCcuJylbMl07DQogICAgICAgICAgaWYoaG90RGF0YVtpdGVtLnJvd0luZGV4LTFdKXsNCiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gX3RoaXMuY2FsY0NlbGxFeHBWYWx1ZShpdGVtLm1hdGhFeHAsaG90RGF0YSxmb3JtSW5zdCk7DQogICAgICAgICAgICBob3REYXRhW2l0ZW0ucm93SW5kZXgtMV1bZmllbGROYW1lXSA9IHZhbHVlOw0KICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9DQogICAgICByZXR1cm4ge2RhdGE6aG90RGF0YSxpc0NoYW5nZTppc0NoYW5nZX07DQogICAgfSwNCiAgICBleGVGaXJzdFJvd1N1bShob3REYXRhLGZpZWxkTmFtZSxfdGhpcyxpc0NoYW5nZSxmc3VtTWFwKXsNCiAgICAgIGlmKGhvdERhdGEgJiYgaG90RGF0YS5sZW5ndGg+MCl7DQogICAgICAgIGlmKGZzdW1NYXBbZmllbGROYW1lXT09PXRydWUpew0KICAgICAgICAgIGxldCBleGVWYWx1ZSA9IF90aGlzLnN1bUNvbChob3REYXRhLCBmaWVsZE5hbWUsIHRydWUsIF90aGlzKTsNCiAgICAgICAgICBob3REYXRhWzBdW2ZpZWxkTmFtZV0gPSB0aGlzLnRvZml4ZWQoZXhlVmFsdWUsIDIpOw0KICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHtkYXRhOmhvdERhdGEsaXNDaGFuZ2U6aXNDaGFuZ2V9Ow0KICAgIH0sDQogICAgc3VtQ29sKGRhdGEsIGZpZWxkLCBvdXRGaXJzdCwgX3RoaXMpey8v5rGH5oC75p+Q5YiX5pWw5o2u77yMDQogICAgICBsZXQgc3VtID0gMDsNCiAgICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGg+MCl7DQogICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykgew0KICAgICAgICAgIGlmKCEob3V0Rmlyc3QgJiYgaW5kZXg9PTApKXsNCiAgICAgICAgICAgIGNvbnN0IGVsID0gZGF0YVtpbmRleF07DQogICAgICAgICAgICBzdW0gKz0gX3RoaXMudG9OdW1iZXIoZWxbZmllbGRdKTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIHJldHVybiBzdW07DQogICAgfSwNCiAgICAvL+aJp+ihjOi3qOihjOiuoeeul+WFrOW8jw0KICAgIGV4ZVJvd01hdGhFeHAoaG90RGF0YSxmaWVsZEluZGV4LGZpZWxkTmFtZSxfdGhpcyxpc0NoYW5nZSxpc1JlcGVhdCl7DQogICAgICAvL2NvbnN0IGZpZWxkSW5kZXggPSBmZmllbGRJbmRleCsxOy8vX3RoaXMucm93TWF0aEV4cE1hcFtjb2x1bW4uZGF0YV0NCiAgICAgIC8v5omn6KGM5b2T5YmN5a2X5q615raJ5Y+K55qE6K6h566X5YWs5byP77yI5Li65LqG5L+d6K+B5omn6KGM6aG65bqP77yM5YWI5omn6KGM5b2T5YmN57yW6L6R5a2X5q6155u45YWz6K6h566X5YWs5byP77yJDQogICAgICBmb3IgKGNvbnN0IHJtZSBpbiBfdGhpcy5yb3dNYXRoRXhwTWFwKSB7DQogICAgICAgIGlmKF90aGlzLnJvd01hdGhFeHBNYXAuaGFzT3duUHJvcGVydHkocm1lKSl7DQogICAgICAgICAgbGV0IGZyb3dNYXRocyA9IF90aGlzLnJvd01hdGhFeHBNYXBbcm1lXTsNCiAgICAgICAgICBsZXQgZXhwQXJyYXkgPSBbXTsNCiAgICAgICAgICBpZihmcm93TWF0aHMpew0KICAgICAgICAgICAgaWYoZnJvd01hdGhzW2ZpZWxkSW5kZXhdKXsNCiAgICAgICAgICAgICAgZXhwQXJyYXkucHVzaChmaWVsZEluZGV4KTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvciAoY29uc3QgZm0gaW4gZnJvd01hdGhzKSB7DQogICAgICAgICAgICAgIGlmIChmcm93TWF0aHMuaGFzT3duUHJvcGVydHkoZm0pKSB7DQogICAgICAgICAgICAgICAgaWYoZm0uaW5kZXhPZigiOiIpIT0tMSl7DQogICAgICAgICAgICAgICAgICBjb25zdCBmQXJyYXkgPSBmbS5zcGxpdCgiOiIpOw0KICAgICAgICAgICAgICAgICAgaWYoZkFycmF5Lmxlbmd0aD09Mil7DQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBfdGhpcy50b051bWJlcihmQXJyYXlbMF0pOw0KICAgICAgICAgICAgICAgICAgICBjb25zdCBiID0gX3RoaXMudG9OdW1iZXIoZkFycmF5WzFdKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoZmllbGRJbmRleD49YSAmJiBmaWVsZEluZGV4PD1iKXsNCiAgICAgICAgICAgICAgICAgICAgICBleHBBcnJheS5wdXNoKGZtKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgICBpZihleHBBcnJheS5sZW5ndGg+MCl7DQogICAgICAgICAgIC8v5YWI5omn6KGM55u05o6l5YWz6IGU55qE5Y2V5YWD5qC86K6h566XDQogICAgICAgICAgICBleHBBcnJheS5mb3JFYWNoKGV4cEtleSA9PnsNCiAgICAgICAgICAgICAgY29uc3QgZXhwSXRlbXMgPSBfdGhpcy5yb3dNYXRoRXhwTWFwW2ZpZWxkTmFtZV1bZXhwS2V5XTsNCiAgICAgICAgICAgICAgZXhwSXRlbXMuZm9yRWFjaChlSXRlbSA9PnsNCiAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IF90aGlzLmNhbGNSb3dzRXhwVmFsdWUoZUl0ZW0ubWF0aEV4cCxob3REYXRhLGZpZWxkTmFtZSk7DQogICAgICAgICAgICAgICAgICBpZihob3REYXRhW2VJdGVtLnNuLTFdKXsNCiAgICAgICAgICAgICAgICAgICAgaG90RGF0YVtlSXRlbS5zbi0xXVtmaWVsZE5hbWVdID0gdmFsdWU7DQogICAgICAgICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHtkYXRhOmhvdERhdGEsaXNDaGFuZ2U6aXNDaGFuZ2V9Ow0KICAgIH0sDQogICAgLy/miafooYzooYzlhoXorqHnrpflhazlvI8NCiAgICBleGVNYXRoRXhwKGhvdERhdGEsZmllbGRJbmRleCxmaWVsZE5hbWUsX3RoaXMsaXNDaGFuZ2UsaXNSZXBlYXQpew0KICAgICAgLy/miafooYzlvZPliY3lrZfmrrXmtonlj4rnmoTorqHnrpflhazlvI/vvIjkuLrkuobkv53or4HmiafooYzpobrluo/vvIzlhYjmiafooYzlvZPliY3nvJbovpHlrZfmrrXnm7jlhbPorqHnrpflhazlvI/vvIkNCiAgICAgIGNvbnN0IGN1ckV4cE1hcCA9IF90aGlzLm1hdGhFeHBJdGVtTWFwW2ZpZWxkTmFtZV07DQogICAgICBpZihjdXJFeHBNYXApew0KICAgICAgICBmb3IgKGNvbnN0IGN1cmtleSBpbiBjdXJFeHBNYXApIHsNCiAgICAgICAgICBpZiAoY3VyRXhwTWFwLmhhc093blByb3BlcnR5KGN1cmtleSkpIHsNCiAgICAgICAgICAgIGNvbnN0IGN1cmV4cCA9IGN1ckV4cE1hcFtjdXJrZXldOw0KICAgICAgICAgICAgbGV0IGN1cnZhbHVlID0gdGhpcy5jYWxjRXhwVmFsdWUoY3VyZXhwLGhvdERhdGEsZmllbGRJbmRleCk7DQogICAgICAgICAgICBpZihob3REYXRhW2ZpZWxkSW5kZXhdKXsNCiAgICAgICAgICAgICAgaG90RGF0YVtmaWVsZEluZGV4XVtjdXJrZXldID0gY3VydmFsdWU7DQogICAgICAgICAgICAgIGlzQ2hhbmdlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgLy/miafooYzkuLvooajnu5/orqHlhazlvI8NCiAgICAgICAgICAgICAgX3RoaXMuZXhlTWFpbkZpZWxkTWF0aEV4cChob3REYXRhLGN1cmtleSxfdGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIC8v5omn6KGM5YW25LuW5a2X5q615raJ5Y+K55qE6K6h566X5YWs5byP77yI6Ziy5q2i5pyJ5YWz6IGU6K6h566X77yJDQogICAgICAgIGZvciAoY29uc3QgaXRlbUtleSBpbiBfdGhpcy5tYXRoRXhwSXRlbU1hcCkgew0KICAgICAgICAgIGlmIChfdGhpcy5tYXRoRXhwSXRlbU1hcC5oYXNPd25Qcm9wZXJ0eShpdGVtS2V5KSAmJiBmaWVsZE5hbWUhPWl0ZW1LZXkpIHsNCiAgICAgICAgICAgIGNvbnN0IGV4cE1hcCA9IF90aGlzLm1hdGhFeHBJdGVtTWFwW2l0ZW1LZXldOw0KICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZXhwTWFwKSB7DQogICAgICAgICAgICAgIGlmIChleHBNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkgew0KICAgICAgICAgICAgICAgIGNvbnN0IGV4cCA9IGV4cE1hcFtrZXldOw0KICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2FsY0V4cFZhbHVlKGV4cCxob3REYXRhLGZpZWxkSW5kZXgpOw0KICAgICAgICAgICAgICAgIGlmKGhvdERhdGFbZmllbGRJbmRleF0pew0KICAgICAgICAgICAgICAgICAgaG90RGF0YVtmaWVsZEluZGV4XVtrZXldID0gdmFsdWU7DQogICAgICAgICAgICAgICAgICBpc0NoYW5nZSA9IHRydWU7DQogICAgICAgICAgICAgICAgICAvL+aJp+ihjOS4u+ihqOe7n+iuoeWFrOW8jw0KICAgICAgICAgICAgICAgICAgIF90aGlzLmV4ZU1haW5GaWVsZE1hdGhFeHAoaG90RGF0YSxrZXksX3RoaXMpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYoaXNSZXBlYXQpew0KICAgICAgICByZXR1cm4gX3RoaXMuZXhlTWF0aEV4cChob3REYXRhLGZpZWxkSW5kZXgsZmllbGROYW1lLF90aGlzLGlzQ2hhbmdlLGZhbHNlKTsNCiAgICAgIH1lbHNlew0KICAgICAgICByZXR1cm4ge2RhdGE6aG90RGF0YSxpc0NoYW5nZTppc0NoYW5nZX07DQogICAgICB9DQogICAgfSwNCiAgICAvL+aJp+ihjOS4u+ihqOWtl+autee7n+iuoeWFrOW8jw0KICAgIGV4ZU1haW5GaWVsZE1hdGhFeHAoaG90RGF0YSxmaWVsZE5hbWUsX3RoaXMpew0KICAgICAgY29uc3QgY2FsYyA9IHRoaXMubWFpbkZpZWxkTWF0aE1hcFtmaWVsZE5hbWVdOw0KICAgICAgaWYoY2FsYyl7DQogICAgICAgIGxldCBzdW1WYWx1ZSA9IDA7DQogICAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICAgIGlmKGNhbGMubWFpbkZpZWxkICYmIGhvdERhdGEgJiYgaG90RGF0YS5sZW5ndGg+MCl7DQogICAgICAgICAgaG90RGF0YS5mb3JFYWNoKGl0ZW0gPT57DQogICAgICAgICAgICBzdW1WYWx1ZSArPSBfdGhpcy50b051bWJlcihpdGVtW2ZpZWxkTmFtZV0pOw0KICAgICAgICAgIH0pDQogICAgICAgIH0NCiAgICAgICAgY29uc3QgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7DQogICAgICAgIGlmKGZvcm1JbnN0ICYmIGZvcm1JbnN0WydkYXRhJ10pew0KICAgICAgICAgIGNvbnN0IG1haW5GaWVsZFBhdGggPSBjYWxjLm1haW5GaWVsZC5zcGxpdCgiLiIpOw0KICAgICAgICAgIGZvcm1JbnN0WydkYXRhJ11bbWFpbkZpZWxkUGF0aFswXV1bbWFpbkZpZWxkUGF0aFsxXV0gPSBzdW1WYWx1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0sDQogICAgLy/ljZXlhYPmoLzooqvpgInkuK3vvIzlpoLmnpzmmK/lj6ror7vvvIzmj5DnpLrmnYPpmZDkv6Hmga8NCiAgICBhZnRlclNlbGVjdGlvbkVuZE1lKHIsIGMsIHIyLCBjMil7DQogICAgICBjb25zdCByZWFkT25seUZpZWxkID0gdGhpcy5yZWFkT25seUNvbHVtbk1hcFtjXTsNCiAgICAgIGlmKHI9PXIyICYmIGM9PWMyICYmIHJlYWRPbmx5RmllbGQpew0KICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICBtZXNzYWdlOiAi5a2X5q6144CQIityZWFkT25seUZpZWxkWydkZXNjJ10rIuOAkeS4jeWPr+Whq+WGme+8gSIsDQogICAgICAgICAgdHlwZTogIndhcm5pbmciDQogICAgICAgIH0pOw0KICAgICAgfWVsc2UgaWYodGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5zW2NdKXsNCiAgICAgICAgY29uc3QgZmllbGROYW1lID0gdGhpcy5ob3RTZXR0aW5ncy5jb2x1bW5zW2NdWydkYXRhJ107DQogICAgICAgIGlmKGZpZWxkTmFtZSAmJiB0aGlzLnJlYWRPbmx5Um93c01hcFtmaWVsZE5hbWUrJ18nK3JdID09PSB0cnVlKXsNCiAgICAgICAgICB0aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgIG1lc3NhZ2U6ICLlvZPliY3ljZXlhYPmoLzkuI3lj6/loavlhpnvvIEiLA0KICAgICAgICAgICAgdHlwZTogIndhcm5pbmciDQogICAgICAgICAgfSk7DQogICAgICAgIH1lbHNlIGlmKGZpZWxkTmFtZSAmJiB0aGlzLm1hdGhSb3dDZWxsTWFwW2ZpZWxkTmFtZV0gJiYgDQogICAgICAgICAgICAodGhpcy5tYXRoUm93Q2VsbE1hcFtmaWVsZE5hbWVdWy0xXT09PXRydWUgfHwgdGhpcy5tYXRoUm93Q2VsbE1hcFtmaWVsZE5hbWVdW3JdPT09dHJ1ZSkpew0KICAgICAgICAgIHRoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgbWVzc2FnZTogIuW9k+WJjeS4uuiuoeeul+WNleWFg+agvO+8jOS4jeWPr+Whq+WGme+8gSIsDQogICAgICAgICAgICB0eXBlOiAid2FybmluZyINCiAgICAgICAgICB9KTsNCiAgICAgICAgfWVsc2UgaWYodGhpcy5jcm9zc01hcHBpbmdGaWVsZHNbZmllbGROYW1lXSAmJiB0aGlzLmNyb3NzTWFwcGluZ0ZpZWxkc1tmaWVsZE5hbWVdW3JdPT09dHJ1ZSl7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICBtZXNzYWdlOiAi5b2T5YmN5Li66Leo6KGo5Y+W5pWw5Y2V5YWD5qC877yM5LiN5Y+v5aGr5YaZ77yBIiwNCiAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIg0KICAgICAgICAgIH0pOw0KICAgICAgICB9ZWxzZSBpZih0aGlzLmZpcnN0U3VtTWFwW2ZpZWxkTmFtZV0gJiYgcj09MCl7DQogICAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICBtZXNzYWdlOiAi5b2T5YmN5Li65rGH5oC75Y2V5YWD5qC877yM5LiN5Y+v5aGr5YaZ77yBIiwNCiAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIg0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICB9DQogICAgfSwNCiAgICB0b051bWJlcih4KSB7DQogICAgICAgIGlmICh0eXBlb2YoeCk9PSd1bmRlZmluZWQnIHx8IHggPT09IG51bGwgfHwgeCA9PT0gdW5kZWZpbmVkIHx8IHggPT09ICcnKQ0KICAgICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIGlmICh0eXBlb2YgeCA9PSAic3RyaW5nIikgew0KICAgICAgICAgICAgeCA9IHgucmVwbGFjZSgvLC9nLCAiIik7DQogICAgICAgIH0NCiAgICAgICAgdmFyIG1hdGNoID0geC50b1N0cmluZygpLm1hdGNoKC8oWyR877+lXSlcZCtcLj9cZCovKTsNCiAgICAgICAgaWYgKG1hdGNoKSB7DQogICAgICAgICAgICB4ID0geC5yZXBsYWNlKG1hdGNoWzFdLCAnJyk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIE51bWJlcih4KTsNCiAgICB9LA0KICAgIGNhbGNFeHBWYWx1ZShleHAsIHNjb3BlLCBzdWJJbmRleCkgew0KICAgICAgICBpZiAoIWV4cCkgcmV0dXJuIDA7DQogICAgICAgIHZhciByZWcgPSAvKFtcW3xce10pLio/XCgoLio/KVwpW1x9fFxdXS9nOw0KICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBhcmd1bWVudHNbMV0sDQogICAgICAgICAgICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXSwNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7DQogICAgICAgICAgICBpZiAoc2NvcGUpIHsNCiAgICAgICAgICAgICAgICAvL+WtkOihqOe7n+iuoeiuoeeul+aDheWGte+8jOWkmuihjOaVsOaNrg0KICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWxBcnJheSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgc3ViTXNnID0gbmFtZS5zcGxpdCgiLiIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTXNnLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGDlrZDooajnu5/orqHnmoTooajovr7lvI8ke25hbWV96ZSZ6K+vYDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJNc2dTaXplID0gc3ViTXNnLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZSA9IHN1Yk1zZ1tzdWJNc2dTaXplIC0gMV07DQogICAgICAgICAgICAgICAgICAgIHZhciBmdmFsdWUgPSAwOw0KICAgICAgICAgICAgICAgICAgICBpZihzY29wZVtzdWJJbmRleF0gJiYgc2NvcGVbc3ViSW5kZXhdW2ZpZWxkTmFtZV0pew0KICAgICAgICAgICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKHNjb3BlW3N1YkluZGV4XVtmaWVsZE5hbWVdKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWxBcnJheS5wdXNoKGZ2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYFske3ZhbEFycmF5LmpvaW4oJywnKX1gOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzdWJNc2cgPSBuYW1lLnNwbGl0KCIuIik7DQogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBzdWJNc2dbc3ViTXNnLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gc2NvcGVbc3ViSW5kZXhdP190aGlzLnRvTnVtYmVyKHNjb3BlW3N1YkluZGV4XVtmaWVsZE5hbWVdKTowOw0KICAgICAgICAgICAgICAgICAgICB2YWwgPSBfdGhpcy50b051bWJlcih2YWwpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKHZhbCkgJiYgIiIgIT0gdmFsKSB2YWx1ZSA9IHZhbDsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZiAoIXZhbHVlKSB7DQogICAgICAgICAgICAgICAgdmFsdWUgPSAwOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYodmFsdWU8MCl7DQogICAgICAgICAgICAgIHZhbHVlID0gJygnK3ZhbHVlKycpJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsNCiAgICAgICAgfSk7DQogICAgICAgIGV4cCA9IGV4cC5yZXBsYWNlKC9bfFxbfFxdXS9nLCIiKTsNCiAgICAgICAgaWYgKGV4cC5zdWJzdHJpbmcoMCwgMTYpICE9ICJGb3JtTWF0aC50b2ZpeGVkIikgew0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWx1ZSh0aGlzLnRvZml4ZWQoZXZhbChgKCR7ZXhwfSlgKSwgMCkpOw0KICAgICAgICB9DQogICAgICAgIHRyeSB7DQogICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsdWUoZXZhbChgKCR7ZXhwfSlgKSk7DQogICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7DQogICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICBtZXNzYWdlOiAi6K6h566X5YWs5byP5omn6KGM5aSx6LSl77yaIitlcnJvciwNCiAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgcmV0dXJuIDA7DQogICAgICAgIH0NCiAgICB9LA0KICAgIGNhbGNSb3dzRXhwVmFsdWUoZXhwLCBzY29wZSwgZk5hbWUpIHsNCiAgICAgICAgaWYgKCFleHApIHJldHVybiAwOw0KICAgICAgICB2YXIgcmVnID0gL1xbKC4qPylcXS9nOw0KICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBhcmd1bWVudHNbMV0sDQogICAgICAgICAgICAgICAgY2luZGV4ID0gYXJndW1lbnRzWzJdLA0KICAgICAgICAgICAgICAgIGV4cFN0ciA9IGFyZ3VtZW50c1szXSwNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7DQogICAgICAgICAgICBpZiAoc2NvcGUpIHsNCiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sLmluZGV4T2YoJzonKT4tMSkgew0KICAgICAgICAgICAgICAgICAgICB2YXIgc3VtU3RyID0gZXhwU3RyLnN1YnN0cmluZyhjaW5kZXgtMTMsIGNpbmRleC0xKTsNCiAgICAgICAgICAgICAgICAgICAgaWYoc3VtU3RyID09PSAnRm9ybU1hdGguc3VtJyl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGlkeEFycmF5ID0gc3ltYm9sLnNwbGl0KCc6Jyk7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGEgPSBfdGhpcy50b051bWJlcihpZHhBcnJheVswXSk7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGI9IF90aGlzLnRvTnVtYmVyKGlkeEFycmF5WzFdKTsNCiAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVtcFZhbHVlID0gW107DQogICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSBhOyBpbmRleCA8PSBiOyBpbmRleCsrKSB7DQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93SW5kZXggPSBpbmRleCAtMTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlW3Jvd0luZGV4XSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBWYWx1ZS5wdXNoKF90aGlzLnRvTnVtYmVyKHNjb3BlW3Jvd0luZGV4XVtmTmFtZV0pKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAiWyIrdGVtcFZhbHVlKyJdIjsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWwgPSAwOw0KICAgICAgICAgICAgICAgICAgICB2YXIgcm93SW5kZXggPSBfdGhpcy50b051bWJlcihzeW1ib2wpLTE7DQogICAgICAgICAgICAgICAgICAgIGlmKHNjb3BlW3Jvd0luZGV4XSl7DQogICAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMudG9OdW1iZXIoc2NvcGVbcm93SW5kZXhdW2ZOYW1lXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgdmFsID0gX3RoaXMudG9OdW1iZXIodmFsKTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWwpICYmICIiICE9IHZhbCkgdmFsdWUgPSB2YWw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgIHZhbHVlID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHZhbHVlPDApew0KICAgICAgICAgICAgICB2YWx1ZSA9ICcoJyt2YWx1ZSsnKSc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICAgIH0pOw0KICAgICAgICBpZiAoZXhwLnN1YnN0cmluZygwLCAxNikgIT0gIkZvcm1NYXRoLnRvZml4ZWQiKSB7DQogICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbHVlKHRoaXMudG9maXhlZChldmFsKGAoJHtleHB9KWApLCAwKSk7DQogICAgICAgIH0NCiAgICAgICAgbGV0IHJlc3VsdFZhbHVlID0gMDsNCiAgICAgICAgdHJ5IHsNCiAgICAgICAgICByZXN1bHRWYWx1ZSA9IHRoaXMuaXNWYWx1ZShldmFsKGAoJHtleHB9KWApKTsNCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgIG1lc3NhZ2U6ICLorqHnrpflhazlvI/miafooYzlpLHotKXvvJoiK2Vycm9yLA0KICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gcmVzdWx0VmFsdWU7DQogICAgfSwNCiAgICBjYWxjQ2VsbEV4cFZhbHVlKGV4cCwgc2NvcGUsIGZvcm1JbnN0KSB7DQogICAgICAgIGlmICghZXhwKSByZXR1cm4gMDsNCiAgICAgICAgdmFyIHJlZyA9IC8oW1xbfFx7XSkuKj9cKCguKj8pXClbXH18XF1dL2c7DQogICAgICAgIGxldCBfdGhpcyA9IHRoaXM7DQogICAgICAgIGxldCBzdWJEYXRhTWFwID0ge307DQogICAgICAgIHN1YkRhdGFNYXBbX3RoaXMuc3ViVGFibGVQYXRoXSA9IHNjb3BlOw0KICAgICAgICBleHAgPSBleHAucmVwbGFjZShyZWcsIGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBhcmd1bWVudHNbMV0sDQogICAgICAgICAgICAgICAgbmFtZSA9IGFyZ3VtZW50c1syXSwNCiAgICAgICAgICAgICAgICB2YWx1ZSA9IDA7DQogICAgICAgICAgICBpZiAoc2NvcGUpIHsNCiAgICAgICAgICAgICAgICAvL+WtkOihqOe7n+iuoeiuoeeul+aDheWGte+8jOWkmuihjOaVsOaNrg0KICAgICAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gJ1snKSB7DQogICAgICAgICAgICAgICAgICAgIHZhciB2YWxBcnJheSA9IFtdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgc3ViTXNnID0gbmFtZS5zcGxpdCgiLiIpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoc3ViTXNnLmxlbmd0aCA8IDEpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGDlrZDooajnu5/orqHnmoTooajovr7lvI8ke25hbWV96ZSZ6K+vYDsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJNc2dTaXplID0gc3ViTXNnLmxlbmd0aDsNCiAgICAgICAgICAgICAgICAgICAgdmFyIGZ2YWx1ZSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGlmKHN1Yk1zZ1NpemU+Myl7DQogICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkTmFtZVN0ciA9IHN1Yk1zZ1tzdWJNc2dTaXplIC0gMV07DQogICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhTdHIgPSBmaWVsZE5hbWVTdHIubWF0Y2goL1xbKC4rPylcXS9nKTsNCiAgICAgICAgICAgICAgICAgICAgICBsZXQgc3ViSW5kZXggPSBfdGhpcy50b051bWJlcihpbmRleFN0clswXS5yZXBsYWNlKC9cWyguKz8pXF0vZywnJDEnKSktMTsNCiAgICAgICAgICAgICAgICAgICAgICBsZXQgZk5hbWUgPSBmaWVsZE5hbWVTdHIucmVwbGFjZShpbmRleFN0clswXSwnJyk7DQogICAgICAgICAgICAgICAgICAgICAgbGV0IHN1YlBhdGggPSBzdWJNc2dbMV0rJy4nK3N1Yk1zZ1syXTsNCiAgICAgICAgICAgICAgICAgICAgICBpZighc3ViRGF0YU1hcFtzdWJQYXRoXSAmJiBfdGhpcy5zdWJUYWJsZVBhdGggIT0gc3ViUGF0aCl7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3RUYWJsZVJlZiA9ICdob3R0YWJsZS4nK3N1YlBhdGg7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3RUYWJsZU9iaiA9IGZvcm1JbnN0LiRyZWZzWyJvbmxpbmVGb3JtIl0uJHJlZnNbaG90VGFibGVSZWZdOw0KICAgICAgICAgICAgICAgICAgICAgICAgaWYoaG90VGFibGVPYmopew0KICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJEYXRhTWFwW3N1YlBhdGhdID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl0uZ2V0SG90VGFibGVEYXRhKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aHMgPSBzdWJQYXRoLnNwbGl0KCcuJyk7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dICYmIGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViRGF0YU1hcFtzdWJQYXRoXSA9IGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBpZihzdWJEYXRhTWFwW3N1YlBhdGhdKXsNCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdWJEYXRhICA9IFsuLi5zdWJEYXRhTWFwW3N1YlBhdGhdXTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN1YkRhdGFbc3ViSW5kZXhdICYmIHN1YkRhdGFbc3ViSW5kZXhdW2ZOYW1lXSl7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKHN1YkRhdGFbc3ViSW5kZXhdW2ZOYW1lXSk7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV0gJiYgZm9ybUluc3QuZGF0YVtzdWJNc2dbMV1dW3N1Yk1zZ1syXV0pew0KICAgICAgICAgICAgICAgICAgICAgIGZ2YWx1ZSA9IF90aGlzLnRvTnVtYmVyKGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXVtzdWJNc2dbMl1dKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICB2YWxBcnJheS5wdXNoKGZ2YWx1ZSk7DQogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gYFske3ZhbEFycmF5LmpvaW4oJywnKX1gOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIHZhciBzdWJNc2cgPSBuYW1lLnNwbGl0KCIuIik7DQogICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZE5hbWUgPSBzdWJNc2dbc3ViTXNnLmxlbmd0aCAtIDFdOw0KICAgICAgICAgICAgICAgICAgICB2YXIgdmFsID0gMDsNCiAgICAgICAgICAgICAgICAgICAgaWYoZm9ybUluc3QuZGF0YVtzdWJNc2dbMV1dICYmIGZvcm1JbnN0LmRhdGFbc3ViTXNnWzFdXVtzdWJNc2dbMl1dKXsNCiAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBfdGhpcy50b051bWJlcihmb3JtSW5zdC5kYXRhW3N1Yk1zZ1sxXV1bc3ViTXNnWzJdXSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTih2YWwpICYmICIiICE9IHZhbCkgdmFsdWUgPSB2YWw7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYgKCF2YWx1ZSkgew0KICAgICAgICAgICAgICAgIHZhbHVlID0gMDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHZhbHVlPDApew0KICAgICAgICAgICAgICB2YWx1ZSA9ICcoJyt2YWx1ZSsnKSc7DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gdmFsdWU7DQogICAgICAgIH0pOw0KICAgICAgICBleHAgPSBleHAucmVwbGFjZSgvW3xcW3xcXV0vZywiIik7DQogICAgICAgIGlmIChleHAuc3Vic3RyaW5nKDAsIDE2KSAhPSAiRm9ybU1hdGgudG9maXhlZCIpIHsNCiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsdWUodGhpcy50b2ZpeGVkKGV2YWwoYCgke2V4cH0pYCksIDApKTsNCiAgICAgICAgfQ0KICAgICAgICB0cnkgew0KICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbHVlKGV2YWwoYCgke2V4cH0pYCkpOw0KICAgICAgICB9IGNhdGNoIChlcnJvcikgew0KICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgbWVzc2FnZTogIuiuoeeul+WFrOW8j+aJp+ihjOWksei0pe+8miIrZXJyb3IsDQogICAgICAgICAgICAgIHR5cGU6ICJlcnJvciINCiAgICAgICAgICAgIH0pOw0KICAgICAgICAgIHJldHVybiAwOw0KICAgICAgICB9DQogICAgfSwNCiAgICBnZXRWYWx1ZUJ5UGF0aChwYXRoLHN1YkluZGV4KXsNCiAgICAgIGxldCBvYmogPSB0aGlzLmhvdFNldHRpbmdzLmRhdGE7DQogICAgICBpZiAoIW9iaiB8fCAhcGF0aCB8fCBwYXRoLmNvbnN0cnVjdG9yICE9IFN0cmluZykgew0KICAgICAgICAgICAgcmV0dXJuIG51bGw7DQogICAgICAgIH0NCiAgICAgICAgaWYgKCEvXlx3Py4qW1x3fFxdXSQvLnRlc3QocGF0aCkpIHsNCiAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICB9DQogICAgICAgIGxldCBwYXRoQXJ5ID0gcGF0aC5zcGxpdCgiLiIpOw0KICAgICAgICBpZiAocGF0aEFyeS5sZW5ndGggPT0gMSkgew0KICAgICAgICAgICAgcmV0dXJuIG9ialtwYXRoXTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmIChwYXRoQXJ5Lmxlbmd0aCA+IDEpIHsNCiAgICAgICAgICAgIGxldCByZXQgPSBvYmo7DQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGhBcnkubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICBpZiAocmV0ID09PSBudWxsIHx8IHJldCA9PT0gdW5kZWZpbmVkKSB7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBwYXRoQXJ5W2ldOw0KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gL14oXHcrKVxbKFxkKylcXSQvLmV4ZWMoa2V5KTsNCiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsNCiAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0W21hdGNoWzFdXVttYXRjaFsyXV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJldCAmJiByZXQuY29uc3RydWN0b3IgPT09IEFycmF5KSB7DQogICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IDA7DQogICAgICAgICAgICAgICAgICAgIGlmIChzdWJJbmRleCAhPSBudWxsICYmIHN1YkluZGV4ICE9IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZUluZGV4ID0gTnVtYmVyLnBhcnNlSW50KHN1YkluZGV4KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4ocHJlSW5kZXgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwcmVJbmRleDsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXRbaW5kZXhdW2tleV07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICByZXQgPSByZXRba2V5XTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICByZXR1cm4gcmV0Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiBudWxsOw0KICAgIH0sDQogICAgaXNWYWx1ZSh2YWx1ZSkgew0KICAgICAgICBpZiAoIXZhbHVlKSB7DQogICAgICAgICAgICByZXR1cm4gIiI7DQogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gIkluZmluaXR5Iikgew0KICAgICAgICAgICAgcmV0dXJuICIiOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlOw0KICAgICAgICB9DQogICAgfSwNCiAgICB0b2ZpeGVkKHgsIGIpIHsNCiAgICAgICAgdmFyIHRtcCA9IHRoaXMudG9OdW1iZXIoeCk7DQogICAgICAgIGIgPSB0aGlzLnRvTnVtYmVyKGIpOw0KICAgICAgICBpZiAoaXNOYU4odG1wKSB8fCB0bXAgPT09ICIiIHx8IGlzTmFOKGIpKSByZXR1cm4geDsNCiAgICAgICAgcmV0dXJuIHRtcC50b0ZpeGVkKGIpOw0KICAgIH0sDQogICAgcGFyc2VGdW5jZXhwRmllbGQoc3RhdEZ1bil7DQogICAgICB2YXIgbXlyZWdleHAgPSAvW3t8W10uKj9cKCguKj8pXClbfXxcXV0vZzsNCiAgICAgIHZhciBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7DQogICAgICB2YXIgYXJycyA9IFtdOw0KICAgICAgd2hpbGUgKG1hdGNoICE9IG51bGwpIHsNCiAgICAgICAgICB2YXIgc3RyID0gbWF0Y2hbMV07DQogICAgICAgICAgdmFyIGhhcyA9IGZhbHNlOw0KICAgICAgICAgIGZvciAodmFyIGkgPSAwLCB2OyB2ID0gYXJyc1tpKytdOykgew0KICAgICAgICAgICAgICBpZiAodiA9PSBzdHIpIGhhcyA9IHRydWU7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmICghaGFzKSBhcnJzLnB1c2goc3RyKTsNCiAgICAgICAgICBtYXRjaCA9IG15cmVnZXhwLmV4ZWMoc3RhdEZ1bik7DQogICAgICB9DQogICAgICByZXR1cm4gYXJyczsNCiAgICB9LA0KICAgIGZpbGxiYWNrSG90VGFibGVEYXRhKHN1YkRhdGEsbmVlZEV4ZWNDcm9zcyl7DQogICAgICBpZihzdWJEYXRhICYmIHN1YkRhdGEubGVuZ3RoPjApew0KICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN1YkRhdGEpKTsNCiAgICAgICAgY29uc3QgbWVyZ2VDZWxscyA9IHRoaXMuYnVpbGRNZXJnZUNlbGwoc3ViRGF0YSk7DQogICAgICAgIGlmKG1lcmdlQ2VsbHMgJiYgdHlwZW9mKG1lcmdlQ2VsbHMpIT0ndW5kZWZpbmVkJyl7DQogICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gbWVyZ2VDZWxsczsNCiAgICAgICAgfQ0KICAgICAgICBpZihuZWVkRXhlY0Nyb3NzIT09ZmFsc2Upew0KICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAvL3RoaXMuZXhlY0Nyb3NzTWFwcGluZygpOy8v5omn6KGM6Leo6KGo5Y+W5pWwDQogICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9DQogICAgICAgIH0NCiAgICAgICAgdGhpcy5leGVjSW5DZWxsTWF0aEV4cChzdWJEYXRhKTsNCiAgICAgIH1lbHNlew0KICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbW11dOw0KICAgICAgfQ0KICAgIH0sDQogICAgbWVyZ2VDZWxsUmVmcmVzaCgpey8v5omn6KGM5ZCI5bm25Y2V5YWD5qC8DQogICAgICBsZXQgZGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOw0KICAgICAgdGhpcy5ob3RTZXR0aW5ncy5tZXJnZUNlbGxzID0gdGhpcy5idWlsZE1lcmdlQ2VsbChkYXRhKTsNCiAgICB9LA0KICAgIGV4ZWNDZWxsTWF0aEV4cChkYXRhKXsNCiAgICAgIC8v6L+Z6YeM5omn6KGMM+mBjSDpmLLmraLljIXlkKvooYzlhoXorqHnrpflkozot6jooYzorqHnrpflhYjlkI7pobrluo/pg73mnInnmoTmg4XlhrUNCiAgICAgIHRoaXMuZXhlY0luQ2VsbE1hdGhFeHAoZGF0YSk7DQogICAgICB0aGlzLmV4ZWNJbkNlbGxNYXRoRXhwKCk7DQogICAgICB0aGlzLmV4ZWNJbkNlbGxNYXRoRXhwKCk7DQogICAgfSwNCiAgICBleGVjSW5DZWxsTWF0aEV4cChkYXRhLGNoYW5nZXMpey8v5omn6KGM6K6h566X5YWs5byPDQogICAgICBpZighZGF0YSl7DQogICAgICAgIGRhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoKTsNCiAgICAgIH0NCiAgICAgIGxldCBpc25lZWRGc3VtID0gZmFsc2U7DQogICAgICBpZighY2hhbmdlcyl7DQogICAgICAgIGNoYW5nZXMgPSBbXTsNCiAgICAgIH0NCiAgICAgIGlmKGNoYW5nZXMubGVuZ3RoPjAgfHwgKHRoaXMuYWxsTWF0aEV4cExpc3QgJiYgdGhpcy5hbGxNYXRoRXhwTGlzdC5sZW5ndGg+MCAmJiBkYXRhICYmIGRhdGEubGVuZ3RoPjApIHx8ICh0aGlzLmNlbGxDYWxjcyB8fCB0aGlzLmNlbGxDYWxjcy5sZW5ndGg+MCkpew0KICAgICAgICBsZXQgaXRlbXMgPSB0aGlzLmFsbE1hdGhFeHBMaXN0Ow0KICAgICAgICBpZihpdGVtcyAmJiBpdGVtcy5sZW5ndGg+MCl7DQogICAgICAgICAgY29uc3QgZGF0YVNpemUgPSBkYXRhLmxlbmd0aDsNCiAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT57DQogICAgICAgICAgICBpZihpdGVtLmlzQWxsKXsNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhU2l6ZTsgaSsrKSB7DQogICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKHswOmksMTppdGVtWyduYW1lJ119KTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAgIGlmKGl0ZW0uaW5kZXggJiYgaXRlbS5pbmRleC5sZW5ndGg+MCl7DQogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtLmluZGV4Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goezA6aXRlbS5pbmRleFtpXSwxOml0ZW1bJ25hbWUnXX0pOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0pOw0KICAgICAgICB9DQogICAgICAgIGNvbnN0IGNlbGxDYWxjcyA9IHRoaXMuY2VsbENhbGNzOw0KICAgICAgICBpZihjZWxsQ2FsY3MgJiYgY2VsbENhbGNzLmxlbmd0aD4wKXsNCiAgICAgICAgICBjb25zdCBjZWxsQ2FsYyA9IGNlbGxDYWxjc1swXTsNCiAgICAgICAgICBjaGFuZ2VzLnB1c2goezA6Y2VsbENhbGMucm93SW5kZXgsMTpjZWxsQ2FsYy5jZWxsRmllbGQuc3BsaXQoJy4nKVsyXX0pOw0KICAgICAgICB9DQogICAgICAgIGlmKGNoYW5nZXMgJiYgY2hhbmdlcy5sZW5ndGg+MCl7DQogICAgICAgICAgLy90aGlzLmV4ZWNNYXRoRXhwU2luZ2xlKGNoYW5nZXMpOw0KICAgICAgICAgIHRoaXMuZXhlY01hdGhFeHBBbGwoY2hhbmdlcyk7DQogICAgICAgIH1lbHNlew0KICAgICAgICAgIGlzbmVlZEZzdW0gPSB0cnVlOw0KICAgICAgICB9DQogICAgICB9ZWxzZXsNCiAgICAgICAgaXNuZWVkRnN1bSA9IHRydWU7DQogICAgICB9DQogICAgICBpZihpc25lZWRGc3VtKXsNCiAgICAgICAgLy/miafooYzpppbooYzmsYfmgLsNCiAgICAgICAgICBsZXQgZnN1bU1hcCA9IHRoaXMuZmlyc3RTdW1NYXA7DQogICAgICAgICAgaWYoJ3t9JyE9SlNPTi5zdHJpbmdpZnkoZnN1bU1hcCkpew0KICAgICAgICAgICAgbGV0IF90aGlzID0gdGhpczsNCiAgICAgICAgICAgIGxldCBpc0NoYW5nZSA9IGZhbHNlOw0KICAgICAgICAgICAgbGV0IGhvdERhdGEgPSB0aGlzLmdldEhvdFRhYmxlRGF0YSgpOw0KICAgICAgICAgICAgZm9yIChsZXQgc3VtS2V5IGluIGZzdW1NYXApIHsNCiAgICAgICAgICAgICAgaWYgKGZzdW1NYXAuaGFzT3duUHJvcGVydHkoc3VtS2V5KSkgew0KICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBSZXN1bHQgPSBfdGhpcy5leGVGaXJzdFJvd1N1bShob3REYXRhLHN1bUtleSxfdGhpcyxpc0NoYW5nZSxmc3VtTWFwKTsNCiAgICAgICAgICAgICAgICBob3REYXRhID0gdGVtcFJlc3VsdC5kYXRhOw0KICAgICAgICAgICAgICAgIGlmKHRlbXBSZXN1bHQuaXNDaGFuZ2Upew0KICAgICAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0ZW1wUmVzdWx0LmlzQ2hhbmdlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgaWYoaXNDaGFuZ2Upew0KICAgICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGEgPSBbXTsNCiAgICAgICAgICAgICAgdGhpcy5ob3RTZXR0aW5ncy5kYXRhID0gaG90RGF0YTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmKHRoaXMubWVyZ2VDZWxscyAmJiB0aGlzLm1lcmdlQ2VsbHMubGVuZ3RoPjApew0KICAgICAgICAgICAgICB0aGlzLmhvdFNldHRpbmdzLm1lcmdlQ2VsbHMgPSB0aGlzLmJ1aWxkTWVyZ2VDZWxsKGhvdERhdGEpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGV4ZWNDcm9zc01hcHBpbmcoKXsNCiAgICAgIGlmKHRoaXMuY3Jvc3NNYXBwaW5ncyAmJiB0aGlzLmNyb3NzTWFwcGluZ1N1YlRhYmxlcy5sZW5ndGg+MCl7DQogICAgICAgIGxldCBzdWJEYXRhID0ge307DQogICAgICAgIGxldCBjdXJEYXRhID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsNCiAgICAgICAgbGV0IF90aGlzID0gdGhpczsNCiAgICAgICAgY29uc3QgZm9ybUluc3QgPSB1dGlscy5nZXRPbmxpbmVGb3JtSW5zdGFuY2UodGhpcyk7DQogICAgICAgIHRoaXMuY3Jvc3NNYXBwaW5nU3ViVGFibGVzLmZvckVhY2goc3ViID0+ew0KICAgICAgICAgIGNvbnN0IGhvdFRhYmxlUmVmID0gJ2hvdHRhYmxlLicrc3ViOw0KICAgICAgICAgIGNvbnN0IGhvdFRhYmxlT2JqID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl07DQogICAgICAgICAgaWYoaG90VGFibGVPYmopew0KICAgICAgICAgICAgc3ViRGF0YVtzdWJdID0gZm9ybUluc3QuJHJlZnNbIm9ubGluZUZvcm0iXS4kcmVmc1tob3RUYWJsZVJlZl0uZ2V0SG90VGFibGVEYXRhKCk7DQogICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICBjb25zdCBwYXRocyA9IHN1Yi5zcGxpdCgnLicpOw0KICAgICAgICAgICAgaWYoZm9ybUluc3QuZGF0YVtwYXRoc1swXV0gJiYgZm9ybUluc3QuZGF0YVtwYXRoc1swXV1bcGF0aHNbMV1dKXsNCiAgICAgICAgICAgICAgIHN1YkRhdGFbc3ViXSA9IGZvcm1JbnN0LmRhdGFbcGF0aHNbMF1dW3BhdGhzWzFdXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBsZXQgaXNDaGFuZ2UgPSBmYWxzZTsNCiAgICAgICAgZm9yIChjb25zdCBzdWJUYWJsZVBhdGggaW4gX3RoaXMuY3Jvc3NNYXBwaW5ncykgew0KICAgICAgICAgIGlmIChfdGhpcy5jcm9zc01hcHBpbmdzLmhhc093blByb3BlcnR5KHN1YlRhYmxlUGF0aCkpIHsNCiAgICAgICAgICAgIGNvbnN0IHRvRkxpc3QgPSBfdGhpcy5jcm9zc01hcHBpbmdzW3N1YlRhYmxlUGF0aF07DQogICAgICAgICAgICB0b0ZMaXN0LmZvckVhY2gobWFwID0+ew0KICAgICAgICAgICAgICBjb25zdCBmcm9tRmllbGRzID0gbWFwWydmcm9tRmllbGRzJ107DQogICAgICAgICAgICAgIGNvbnN0IHRvSW5kZXggPSBfdGhpcy50b051bWJlcihtYXBbJ3RvSW5kZXgnXSktMTsNCiAgICAgICAgICAgICAgY29uc3QgdG9GaWVsZFBhdGggPSBtYXBbJ3RvRmllbGQnXS5zcGxpdCgnLicpOw0KICAgICAgICAgICAgICBpZihmcm9tRmllbGRzICYmIGZyb21GaWVsZHMubGVuZ3RoPjAgJiYgY3VyRGF0YVt0b0luZGV4XSl7DQogICAgICAgICAgICAgICAgbGV0IHN1bVZhbHVlID0gMDsNCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZyb21GaWVsZHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZnJvbUZpZWxkc1tpXTsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb21GaWVsZFBhdGggPSBmaWVsZC5mcm9tRmllbGQuc3BsaXQoJy4nKTsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb21JbmRleCA9IF90aGlzLnRvTnVtYmVyKGZpZWxkWydmcm9tSW5kZXgnXSktMTsNCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YlBhdGggPSBmcm9tRmllbGRQYXRoWzBdKycuJytmcm9tRmllbGRQYXRoWzFdOw0KICAgICAgICAgICAgICAgICAgaWYoc3ViRGF0YVtzdWJQYXRoXSAmJiBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF0gJiYgY3VyRGF0YVt0b0luZGV4XSl7DQogICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF1bZnJvbUZpZWxkUGF0aFsyXV0gIT0ndW5kZWZpbmVkJyl7DQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wVmFsdWUgPSBzdWJEYXRhW3N1YlBhdGhdW2Zyb21JbmRleF1bZnJvbUZpZWxkUGF0aFsyXV07DQogICAgICAgICAgICAgICAgICAgICAgICBzdW1WYWx1ZSArPSBfdGhpcy50b051bWJlcih0ZW1wVmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGN1ckRhdGFbdG9JbmRleF1bdG9GaWVsZFBhdGhbMl1dID0gc3VtVmFsdWU7DQogICAgICAgICAgICAgICAgaXNDaGFuZ2UgPSB0cnVlOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYoaXNDaGFuZ2Upew0KICAgICAgICAgIHRoaXMuZmlsbGJhY2tIb3RUYWJsZURhdGEoY3VyRGF0YSxmYWxzZSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGdldEJhY2tNZXJnZURhdGEoZXhlTWF0aCl7Ly/ojrflj5bmgaLlpI3lkIjlubbljZXlhYPmoLzlkI7nmoTmlbDmja4NCiAgICAgIC8v5Y+W5pWw5YmN5YWI5omn6KGM6Leo6KGo5Y+W5pWw5ZKM6K6h566X5YWs5byPDQogICAgICBpZihleGVNYXRoPT09dHJ1ZSl7DQogICAgICAgIHRyeSB7DQogICAgICAgICB0aGlzLmV4ZWNDcm9zc01hcHBpbmcoKTsvL+aJp+ihjOi3qOihqOWPluaVsA0KICAgICAgICAgdGhpcy5leGVjQ2VsbE1hdGhFeHAoKTsvL+aJp+ihjOiuoeeul+WFrOW8jyANCiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsNCiAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGxldCBkYXRhID0gdGhpcy5ob3RTZXR0aW5ncy5kYXRhOw0KICAgICAgbGV0IHJvdyA9IHRoaXMuaW5pdFJvd0RhdGE7DQogICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgLy/lpITnkIbliJ3lp4vljJbml7bnmoTnrKzkuIDooYzmlbDmja7nsbvlnovkuLrmlbDnu4Tovaxqc29u5Li656m66Zeu6aKYDQogICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoPjAgJiYgQXJyYXkuaXNBcnJheShkYXRhWzBdKSAmJiByb3cgJiYgSlNPTi5zdHJpbmdpZnkocm93KSE9J3t9Jyl7DQogICAgICAgIGxldCBuZXdSb3cgPSB7fTsNCiAgICAgICAgbGV0IG9sZFJvdyA9IHRoaXMuaG90U2V0dGluZ3MuZGF0YVswXTsNCiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcm93KSB7DQogICAgICAgICAgaWYgKHJvdy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICAgICAgICBuZXdSb3dba2V5XSA9IHR5cGVvZihvbGRSb3dba2V5XSk9PSd1bmRlZmluZWQnPycnOm9sZFJvd1trZXldOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBkYXRhWzBdID0gbmV3Um93Ow0KICAgICAgICB0aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSBuZXdSb3c7DQogICAgICB9DQogICAgICBpZihkYXRhICYmIGRhdGEubGVuZ3RoID09IDEgJiYgSlNPTi5zdHJpbmdpZnkoZGF0YVswXSk9PUpTT04uc3RyaW5naWZ5KHRoaXMuaW5pdFJvd0RhdGEpKXsNCiAgICAgICAgcmV0dXJuIFtdOw0KICAgICAgfQ0KICAgICAgbGV0IG1lcmdlQ2VsbHMgPSB0aGlzLm1lcmdlQ2VsbHM7DQogICAgICBpZihtZXJnZUNlbGxzICYmIG1lcmdlQ2VsbHMubGVuZ3RoPjAgJiYgZGF0YSAmJiBkYXRhLmxlbmd0aD4wKXsNCiAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLmhvdFNldHRpbmdzLmNvbHVtbnM7DQogICAgICAgIG1lcmdlQ2VsbHMuZm9yRWFjaChpdGVtID0+ew0KICAgICAgICAgIGNvbnN0IHJvd0luZGV4ID0gaXRlbS5yb3c7DQogICAgICAgICAgaWYoZGF0YVtyb3dJbmRleF0pew0KICAgICAgICAgICAgY29uc3Qgcm93c3BhbiA9IGl0ZW0ucm93c3BhbjsNCiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uc1tpdGVtWydjb2wnXV1bJ2RhdGEnXTsNCiAgICAgICAgICAgIGNvbnN0IGJhc2VWYWx1ZSA9IGRhdGFbcm93SW5kZXhdW2ZpZWxkXTsNCiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gcm93SW5kZXg7IGluZGV4IDwgcm93SW5kZXgrcm93c3BhbjsgaW5kZXgrKykgew0KICAgICAgICAgICAgICBpZihkYXRhW2luZGV4XSl7DQogICAgICAgICAgICAgICAgICBkYXRhW2luZGV4XVtmaWVsZF0gPSBiYXNlVmFsdWU7DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgICAgLy/lpITnkIbloavliLbljZXkvY3vvIjlpI3liLbnmoTml7blgJnvvIkNCiAgICAgIGxldCBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYNCiAgICAgIGlmKGRhdGEgJiYgZGF0YS5sZW5ndGg+MCAmJiBjdXN0RGlhbG9nICYmIGN1c3REaWFsb2cub3JnQ29uZmlnICYmICgoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQpfHxjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpKXsNCiAgICAgICAgY29uc3QgZmlsbEZpbGxPYmogPSB0aGlzLmdldE9yZ0ZpbGxGaWVsZE9iaihjdXN0RGlhbG9nKTsNCiAgICAgICAgaWYoZmlsbEZpbGxPYmoub3JnTmFtZUZpZWxkIHx8IGZpbGxGaWxsT2JqLm9yZ0lkRmllbGQgfHwgZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkIHx8IGZpbGxGaWxsT2JqLmluc3RJZEZpZWxkKXsNCiAgICAgICAgICBkYXRhLmZvckVhY2goaXRlbSA9PnsNCiAgICAgICAgICAgIGlmKGZpbGxGaWxsT2JqLm9yZ05hbWVGaWVsZCAmJiAhaXRlbVtmaWxsRmlsbE9iai5vcmdOYW1lRmllbGRdKXsNCiAgICAgICAgICAgICAgaXRlbVtmaWxsRmlsbE9iai5vcmdOYW1lRmllbGRdID0gX3RoaXMuZmlsbE9yZy5uYW1lOw0KICAgICAgICAgICAgfWlmKGZpbGxGaWxsT2JqLm9yZ0lkRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmoub3JnSWRGaWVsZF0pew0KICAgICAgICAgICAgICBpdGVtW2ZpbGxGaWxsT2JqLm9yZ0lkRmllbGRdID0gX3RoaXMuZmlsbE9yZy5pZDsNCiAgICAgICAgICAgIH1pZihmaWxsRmlsbE9iai5vcmdDb2RlRmllbGQgJiYgIWl0ZW1bZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkXSl7DQogICAgICAgICAgICAgIGl0ZW1bZmlsbEZpbGxPYmoub3JnQ29kZUZpZWxkXSA9IF90aGlzLmZpbGxPcmcuY29kZTsNCiAgICAgICAgICAgIH1pZihmaWxsRmlsbE9iai5pbnN0SWRGaWVsZCAmJiAhaXRlbVtmaWxsRmlsbE9iai5pbnN0SWRGaWVsZF0pew0KICAgICAgICAgICAgICBpdGVtW2ZpbGxGaWxsT2JqLmluc3RJZEZpZWxkXSA9IF90aGlzLmluc3RJZDsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGRhdGE7DQogICAgfSwNCiAgICBnZXRPcmdGaWxsRmllbGRPYmooY3VzdERpYWxvZyl7DQogICAgICAgIGxldCBvcmdGaWxsRmllbGRPYmogPSB7b3JnTmFtZUZpZWxkOicnLG9yZ0lkRmllbGQ6Jycsb3JnQ29kZUZpZWxkOicnLGluc3RJZEZpZWxkOicnfTsNCiAgICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSl7DQogICAgICAgICAgY29uc3QgbmFtZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lLnNwbGl0KCcuJyk7DQogICAgICAgICAgb3JnRmlsbEZpZWxkT2JqLm9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgfQ0KICAgICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCl7DQogICAgICAgICAgY29uc3QgaWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaWQuc3BsaXQoJy4nKTsNCiAgICAgICAgICBvcmdGaWxsRmllbGRPYmoub3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoLTFdOw0KICAgICAgICB9DQogICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpew0KICAgICAgICAgIGNvbnN0IGNvZGVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuY29kZS5zcGxpdCgnLicpOw0KICAgICAgICAgIG9yZ0ZpbGxGaWVsZE9iai5vcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGgtMV07DQogICAgICAgIH0NCiAgICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkKXsNCiAgICAgICAgICBjb25zdCBpbnN0SWRQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcuaW5zdElkLnNwbGl0KCcuJyk7DQogICAgICAgICAgb3JnRmlsbEZpZWxkT2JqLmluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gb3JnRmlsbEZpZWxkT2JqOw0KICAgIH0sDQogICAgZ2V0SG90VGFibGVEYXRhKGV4ZU1hdGgpew0KICAgICAgLy/lpoLmnpzmmK/kv53lrZjmiJbmj5DkuqTml7bpnIDov5vooYzlv4XloavmoKHpqowNCiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmdldEJhY2tNZXJnZURhdGEoZXhlTWF0aCk7DQogICAgICBpZihleGVNYXRoPT09dHJ1ZSl7DQogICAgICAgIGlmKCF0aGlzLnZhbGlkYXRlQ2VsbHMoZGF0YSkpew0KICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGRhdGE7DQogICAgfSwNCiAgICB2YWxpZGF0ZUNlbGxzKGRhdGEpew0KICAgICAgbGV0IF90aGlzID0gdGhpczsNCiAgICAgIGxldCBpc1RydWUgPSB0cnVlOw0KICAgICAgY29uc3QgcmVxdWlyZWRzID0gdGhpcy5yZXF1aXJlZFJvd3NNYXA7DQogICAgICBpZihyZXF1aXJlZHMgJiYgJ3t9JyE9PUpTT04uc3RyaW5naWZ5KHJlcXVpcmVkcykpew0KICAgICAgICBpZighZGF0YSB8fCBkYXRhLmxlbmd0aDwxKXsNCiAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICBtZXNzYWdlOiAi5a2Q6KGo44CQIitfdGhpcy5uYW1lKyLjgJHlrZjlnKjlv4XloavpobnmnKrloavlhpnvvIEiLA0KICAgICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgICB9KTsNCiAgICAgICAgICBpc1RydWUgPSBmYWxzZTsNCiAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgIH0NCiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBpbiByZXF1aXJlZHMpIHsNCiAgICAgICAgICBpZiAocmVxdWlyZWRzLmhhc093blByb3BlcnR5KGZpZWxkKSkgew0KICAgICAgICAgICAgY29uc3QgcmVxdWlyZWQgPSByZXF1aXJlZHNbZmllbGRdOw0KICAgICAgICAgICAgaWYocmVxdWlyZWQuYWxsID09PSB0cnVlKXsNCiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYoIWRhdGFbaV1bZmllbGRdICYmIGRhdGFbaV1bZmllbGRdIT09MCAgJiYgZGF0YVtpXVtmaWVsZF0hPT1mYWxzZSl7DQogICAgICAgICAgICAgICAgICBfdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLlrZDooajjgJAiK190aGlzLm5hbWUrIuOAkeS4reesrOOAkCIrKGkrMSkrIuOAkeihjOOAkCIrX3RoaXMuZmllbGROYW1lTWFwW2ZpZWxkXSsi44CR5b+F5aGr77yBIiwNCiAgICAgICAgICAgICAgICAgICAgdHlwZTogImVycm9yIg0KICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICBpc1RydWUgPSBmYWxzZTsNCiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlIGlmKHJlcXVpcmVkLnJvd3MgJiYgcmVxdWlyZWQucm93cy5sZW5ndGg+MCl7DQogICAgICAgICAgICAgIHJlcXVpcmVkLnJvd3MuZm9yRWFjaChpbmRleCA9PnsNCiAgICAgICAgICAgICAgICBpZighZGF0YVtpbmRleC0xXSB8fCAoIWRhdGFbaW5kZXgtMV1bZmllbGRdICYmIGRhdGFbaW5kZXgtMV1bZmllbGRdIT09MCAgJiYgZGF0YVtpbmRleC0xXVtmaWVsZF0hPT1mYWxzZSkpew0KICAgICAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAi5a2Q6KGo44CQIitfdGhpcy5uYW1lKyLjgJHkuK3nrKzjgJAiK2luZGV4KyLjgJHooYzjgJAiK190aGlzLmZpZWxkTmFtZU1hcFtmaWVsZF0rIuOAkeW/heWhq++8gSIsDQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciINCiAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgICAgaXNUcnVlID0gZmFsc2U7DQogICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIGlzVHJ1ZTsNCiAgICB9LA0KICAgIGluaXRUZW1wbGF0ZURhdGEoKXsNCiAgICAgICAgaWYodGhpcy5pc0luaXRUZW1wbGF0ZURhdGEgIT09J3RydWUnKXsNCiAgICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjA0KICAgICAgICAgIHRoaXMudG9BZGRJbml0U3VtUm93KCk7DQogICAgICAgICAgcmV0dXJuIDsNCiAgICAgICAgfQ0KICAgICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgICAvL+WmguaenOW3suacieaVsOaNruWImeS4jemcgOimgeWGjeasoeWIneWni+WMlg0KICAgICAgICBjb25zdCBjdXJEYXRhID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsNCiAgICAgICAgbGV0IGluaXRUeXBlID0gdGhpcy5pbml0RmlsbERhdGFUeXBlOw0KICAgICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShfdGhpcyk7DQogICAgICAgIGlmKCghaW5pdFR5cGUgfHwgaW5pdFR5cGU9PSdlbXB0eScpKXsNCiAgICAgICAgICBpZihjdXJEYXRhLmxlbmd0aD09MCB8fCAoY3VyRGF0YS5sZW5ndGg9PTEgJiYgKEFycmF5LmlzQXJyYXkoY3VyRGF0YVswXSkgfHwgSlNPTi5zdHJpbmdpZnkoY3VyRGF0YVswXSkgPT1KU09OLnN0cmluZ2lmeSh0aGlzLmluaXRSb3dEYXRhKSkpKXsNCiAgICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtbXV07DQogICAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjA0KICAgICAgICAgICAgdGhpcy50b0FkZEluaXRTdW1Sb3coKTsNCiAgICAgICAgICAgIHJldHVybiA7DQogICAgICAgICAgfQ0KICAgICAgICB9ZWxzZSBpZihpbml0VHlwZT09J2NvdmVyJyl7DQogICAgICAgICAgY29uc3QgcGF0aHMgPSB0aGlzLnN1YlRhYmxlUGF0aC5zcGxpdCgnLicpOw0KICAgICAgICAgIGZvcm1JbnN0WydkYXRhJ11bcGF0aHNbMF1dW3BhdGhzWzFdXSA9IFtdOw0KICAgICAgICAgIHRoaXMuaG90U2V0dGluZ3MuZGF0YSA9IFtbXV07DQogICAgICAgIH0NCiAgICAgICAgaWYoIXRoaXMuaW5pdEN1c3REaWFsb2dDb25mIHx8ICF0aGlzLmluaXRDdXN0RGlhbG9nQ29uZi5jdXN0RGlhbG9nIHx8ICF0aGlzLmluaXRDdXN0RGlhbG9nQ29uZi5jdXN0RGlhbG9nLmFsaWFzKXsNCiAgICAgICAgICAvL+WIneWni+WMlue7n+iuoeihjA0KICAgICAgICAgIHRoaXMudG9BZGRJbml0U3VtUm93KCk7DQogICAgICAgICAgcmV0dXJuIDsNCiAgICAgICAgfQ0KICAgICAgICBjb25zdCBsb2FkaW5nID0gdGhpcy4kbG9hZGluZyh7DQogICAgICAgICAgbG9jazogdHJ1ZSwNCiAgICAgICAgICB0ZXh0OiAn5q2j5Zyo5Yid5aeL5YyW5aGr5oql5qih5p2/Li4uJywNCiAgICAgICAgICBzcGlubmVyOiAnZWwtaWNvbi1sb2FkaW5nJywNCiAgICAgICAgICBiYWNrZ3JvdW5kOiAncmdiYSgwLCAwLCAwLCAwLjcpJw0KICAgICAgICB9KTsNCiAgICAgICAgdGhpcy4kaHR0cC5nZXQoJyR7Zm9ybX0vZm9ybS9jdXN0b21EaWFsb2cvdjEvZ2V0QnlBbGlhcz9hbGlhcz0nK3RoaXMuaW5pdEN1c3REaWFsb2dDb25mLmN1c3REaWFsb2cuYWxpYXMpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICBfdGhpcy5jdXN0b21EaWFsb2cgPSByZXNwLmRhdGE7DQogICAgICAgIH0sIGVycm9yID0+IHsNCiAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsNCiAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgbWVzc2FnZTogIuiOt+WPluiHquWumuS5ieWvueivneahhuWksei0pe+8gSIsDQogICAgICAgICAgICAgIHR5cGU6ICJlcnJvciINCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICBjb25zdCBjdXN0ZGlhbG9nID0gX3RoaXMuaW5pdEN1c3REaWFsb2dDb25mOw0KICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRVc2VyID0gSlNPTi5wYXJzZShzZXNzaW9uU3RvcmFnZS5nZXRJdGVtKCJjdXJyZW50VXNlciIpKTsNCiAgICAgICAgICAgICBpZighY3VzdGRpYWxvZy5vcmdDb25maWcuY29kZSAmJiAhY3VzdGRpYWxvZy5vcmdDb25maWcubmFtZSAmJiAhY3VzdGRpYWxvZy5vcmdDb25maWcuaWQpew0KICAgICAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsNCiAgICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcyk7DQogICAgICAgICAgICAgIH1lbHNlIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iK2N1cnJlbnRVc2VyLmFjY291bnQpKSB7DQogICAgICAgICAgICAgICBfdGhpcy5jbG9zZUxvYWRpbmcobG9hZGluZyk7DQogICAgICAgICAgICAgICBfdGhpcy5maWxsT3JnID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgiY3VyRmlsbE9yZ18iK2N1cnJlbnRVc2VyLmFjY291bnQpKTsNCiAgICAgICAgICAgICAgIF90aGlzLnRvRmlsbEluaXREYXRhKF90aGlzKTsNCiAgICAgICAgICAgICB9ZWxzZXsNCiAgICAgICAgICAgICAgIF90aGlzLiRodHRwLmdldCgnJHt1Y30vYXBpL29yZy92MS9vcmcvZ2V0RmlsbE9yZycpLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgICAgICAgICAgX3RoaXMuY2xvc2VMb2FkaW5nKGxvYWRpbmcpOw0KICAgICAgICAgICAgICAgICAgICBjb25zdCByZXAgPSByZXNwLmRhdGE7DQogICAgICAgICAgICAgICAgICAgIGlmKHJlcC5zdGF0ZSl7DQogICAgICAgICAgICAgICAgICAgICAgX3RoaXMuZmlsbE9yZyA9IHJlcC52YWx1ZTsNCiAgICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgiY3VyRmlsbE9yZ18iK2N1cnJlbnRVc2VyLmFjY291bnQsSlNPTi5zdHJpbmdpZnkocmVwLnZhbHVlKSkNCiAgICAgICAgICAgICAgICAgICAgICBfdGhpcy50b0ZpbGxJbml0RGF0YShfdGhpcyk7DQogICAgICAgICAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgICAgICAgIF90aGlzLiRtZXNzYWdlKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlcC5tZXNzYWdlLA0KICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogIndhcm5pbmciDQogICAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9LCBlcnJvciA9PiB7DQogICAgICAgICAgICAgICAgICAgIF90aGlzLmNsb3NlTG9hZGluZyhsb2FkaW5nKTsNCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICLojrflj5blvZPliY3nlKjmiLfloavliLbljZXkvY3lpLHotKXvvIEiLA0KICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIg0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9KQ0KICAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfSwNCiAgICBjbG9zZUxvYWRpbmcobG9hZGluZyl7DQogICAgICBsZXQgX3RoaXMgPSB0aGlzOw0KICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICBsb2FkaW5nLmNsb3NlKCk7DQogICAgICB9LDIwMDApOw0KICAgIH0sDQogICAgdG9GaWxsSW5pdERhdGEoX3RoaXMpew0KICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpew0KICAgICAgICBfdGhpcy5maWxsSW5pdERhdGEoX3RoaXMpOw0KICAgICAgfSwxMDAwKTsNCiAgICB9LA0KICAgIGZpbGxJbml0RGF0YShfdGhpcyl7DQogICAgICBjb25zdCBjdXN0RGlhbG9nID0gX3RoaXMuaW5pdEN1c3REaWFsb2dDb25mLmN1c3REaWFsb2c7DQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZShfdGhpcyk7DQogICAgICBjb25zdCBjdXJEYXRhID0gZm9ybUluc3RbJ2RhdGEnXTsNCiAgICAgIC8v5aSE55CG5a+56K+d5qGG55qE5Y+C5pWw5Lyg5YWlDQogICAgICBsZXQgcGFyYW1zID0gW107DQogICAgICBpZihjdXN0RGlhbG9nLmNvbmRpdGlvbnMpew0KICAgICAgICAvL+WvueivneahhuaMieihqOWNleWtl+auteafpeivou+8iOWPguaVsOS8oOWFpeeahO+8iQ0KICAgICAgICBsZXQgYmluZExpc3QgPSBjdXN0RGlhbG9nLmNvbmRpdGlvbnM7DQogICAgICAgIGlmKGJpbmRMaXN0Lmxlbmd0aD4wKXsNCiAgICAgICAgICBiaW5kTGlzdC5mb3JFYWNoKGVsZSA9PiB7DQogICAgICAgICAgICAvL+e7keWumuihqOWNleWtl+autQ0KICAgICAgICAgICAgaWYgKGVsZS5kZWZhdWx0VHlwZSA9PSAiMyIgJiYgZWxlLmJpbmQpIHsNCiAgICAgICAgICAgICAgbGV0IG9iaiA9IHt9Ow0KICAgICAgICAgICAgICBvYmouZmllbGQgPSBlbGUuZmllbGQ7DQogICAgICAgICAgICAgIGNvbnN0IGJpbmRBcnJheSA9IGVsZS5iaW5kLnNwbGl0KCcuJyk7DQogICAgICAgICAgICAgIGlmKGJpbmRBcnJheS5sZW5ndGg9PTMpew0KICAgICAgICAgICAgICAgIG9iai5iaW5kID0gY3VyRGF0YVtiaW5kQXJyYXlbMV1dW2JpbmRBcnJheVsyXV07DQogICAgICAgICAgICAgICAgcGFyYW1zLnB1c2gob2JqKTsNCiAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgbGV0IHVybCA9ICcke2Zvcm19L2Zvcm0vY3VzdG9tRGlhbG9nL3YxL2dldExpc3REYXRhP2FsaWFzPScrY3VzdERpYWxvZy5hbGlhczsNCiAgICAgIGlmKHBhcmFtcy5sZW5ndGg+MCl7DQogICAgICAgIGxldCBwYVN0ciA9ICcnOw0KICAgICAgICBwYXJhbXMuZm9yRWFjaChwYSA9PnsNCiAgICAgICAgICBpZihwYVN0cil7DQogICAgICAgICAgICBwYVN0ciArPSAnLCc7DQogICAgICAgICAgfQ0KICAgICAgICAgIHBhU3RyID0gcGFTdHIgKyAnIicrcGEuZmllbGQgKyciOiInK3BhLmJpbmQrJyInOw0KICAgICAgICB9KTsNCiAgICAgICAgdXJsID0gdXJsKycmbWFwUGFyYW09JytwYVN0cjsNCiAgICAgIH1lbHNlew0KICAgICAgICB1cmwgPSB1cmwrJyZtYXBQYXJhbT0nOw0KICAgICAgfQ0KICAgICAgY29uc3QgcGFyYW0gPSB7cGFnZUJlYW46IHtwYWdlOiAxLCBwYWdlU2l6ZTogMTAwMCwgc2hvd1RvdGFsOiB0cnVlfX07DQogICAgICBfdGhpcy4kaHR0cC5wb3N0KHVybCwgcGFyYW0pLnRoZW4ocmVzcCA9PiB7DQogICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXNwLmRhdGE7DQogICAgICAgICAgaWYocmVzcG9uc2Uucm93cyl7DQogICAgICAgICAgICAgX3RoaXMuc3luY0luaXRUYWJsZVZhbHVlKHJlc3BvbnNlLnJvd3MpOw0KICAgICAgICAgICAgIGlmKHJlc3BvbnNlLnJvd3MubGVuZ3RoPT0wKXsNCiAgICAgICAgICAgICAgIC8v5Yid5aeL5YyW57uf6K6h6KGMDQogICAgICAgICAgICAgICBfdGhpcy50b0FkZEluaXRTdW1Sb3coKTsNCiAgICAgICAgICAgICAgIF90aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0gPSBfdGhpcy5maWxsT3JnRGF0YUZpZWxkKF90aGlzLmhvdFNldHRpbmdzLmRhdGFbMF0pOw0KICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICB9LCBlcnJvciA9PiB7DQogICAgICAgICAgX3RoaXMuJG1lc3NhZ2Uoew0KICAgICAgICAgICAgbWVzc2FnZTogIuiOt+WPluWIneWni+WMluaVsOaNruWksei0pe+8gSIsDQogICAgICAgICAgICB0eXBlOiAiZXJyb3IiDQogICAgICAgICAgfSk7DQogICAgICB9KTsNCiAgICB9LA0KICAgIGdldEZpbGxPcmdPYmooY3VzdERpYWxvZyl7Ly/ojrflj5bloavliLbljZXkvY3jgIHlrp7kvovkv6Hmga8NCiAgICAgIGxldCBmaWxsT3JnID0gbnVsbDsNCiAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnICYmIChjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pZCB8fGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUgfHwgY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSB8fCBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQpIA0KICAgICAgJiYgdGhpcy5maWxsT3JnLmlkKXsNCiAgICAgICAgZmlsbE9yZyA9IHt9Ow0KICAgICAgICBjb25zdCBuYW1lUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLm5hbWUuc3BsaXQoJy4nKTsNCiAgICAgICAgY29uc3Qgb3JnTmFtZUZpZWxkID0gbmFtZVBhdGhbbmFtZVBhdGgubGVuZ3RoLTFdOw0KICAgICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZy5uYW1lICYmIG9yZ05hbWVGaWVsZCl7DQogICAgICAgICAgZmlsbE9yZ1tvcmdOYW1lRmllbGRdID0gdGhpcy5maWxsT3JnLm5hbWU7DQogICAgICAgIH0NCiAgICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcuaWQpew0KICAgICAgICAgIGNvbnN0IGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7DQogICAgICAgICAgY29uc3Qgb3JnSWRGaWVsZCA9IGlkUGF0aFtpZFBhdGgubGVuZ3RoLTFdOw0KICAgICAgICAgIGZpbGxPcmdbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7DQogICAgICAgIH0NCiAgICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcuY29kZSl7DQogICAgICAgICAgY29uc3QgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7DQogICAgICAgICAgY29uc3Qgb3JnQ29kZUZpZWxkID0gY29kZVBhdGhbY29kZVBhdGgubGVuZ3RoLTFdOw0KICAgICAgICAgIGZpbGxPcmdbb3JnQ29kZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5jb2RlOw0KICAgICAgICB9DQogICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZCl7DQogICAgICAgICAgY29uc3QgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOw0KICAgICAgICAgIGNvbnN0IGluc3RJZEZpZWxkID0gaW5zdElkUGF0aFtpbnN0SWRQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgICBmaWxsT3JnW2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gZmlsbE9yZzsNCiAgICB9LA0KICAgIC8vIOWQjOatpeWIneWni+WMluaVsOaNrue7k+aenA0KICAgIHN5bmNJbml0VGFibGVWYWx1ZShzKSB7DQogICAgICBsZXQgY3VzdERpYWxvZyA9IHRoaXMuaW5pdEN1c3REaWFsb2dDb25mOw0KICAgICAgdmFyIHJldHVyblN0ciA9IEpTT04ucGFyc2UodGhpcy5jdXN0b21EaWFsb2cucmVzdWx0ZmllbGQpOw0KICAgICAgLy/mi7/liLDov5Tlm57nmoTlrZfmrrUNCiAgICAgIHZhciBmaWVsZCA9IG5ldyBBcnJheShbcmV0dXJuU3RyLmxlbmd0aF0pOw0KICAgICAgdmFyIGNvbW1lbnQgPSBuZXcgQXJyYXkoW3JldHVyblN0ci5sZW5ndGhdKTsNCiAgICAgIHZhciBzdHIgPSBbXTsNCiAgICAgIHZhciBpZHMgPSBbXTsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmV0dXJuU3RyLmxlbmd0aDsgaSsrKSB7DQogICAgICAgIGZpZWxkW2ldID0NCiAgICAgICAgICB0aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gImRhdGFTb3VyY2UiDQogICAgICAgICAgICA/IHJldHVyblN0cltpXS5maWVsZC50b1VwcGVyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5maWVsZDsNCiAgICAgICAgY29tbWVudFtpXSA9DQogICAgICAgICAgdGhpcy5jdXN0b21EaWFsb2cuZHNUeXBlID09ICJkYXRhU291cmNlIg0KICAgICAgICAgICAgPyByZXR1cm5TdHJbaV0uY29tbWVudC50b1VwcGVyQ2FzZSgpDQogICAgICAgICAgICA6IHJldHVyblN0cltpXS5jb21tZW50Ow0KICAgICAgfQ0KICAgICAgaWYgKHRoaXMuY3VzdG9tRGlhbG9nLnNlbGVjdE51bSA9PT0gMSkgew0KICAgICAgICB2YXIgdGVtcCA9ICIiOw0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbW1lbnQubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICBjb25zdCB2YSA9IHNbMF1bZmllbGRbaV1dOw0KICAgICAgICAgIHZhID0gdHlwZW9mKHZhKT09J3VuZGVmaW5lZCc/Jyc6dmE7DQogICAgICAgICAgdGVtcCArPSAnIicgKyBjb21tZW50W2ldICsgJyI6IicgKyB2YSArICciLCc7DQogICAgICAgIH0NCiAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsNCiAgICAgICAgICB0ZW1wID0gInsiICsgdGVtcC5zdWJzdHJpbmcoMCwgdGVtcC5sZW5ndGggLSAxKSArICJ9IjsNCiAgICAgICAgfQ0KICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKTsNCiAgICAgICAgaWRzLnB1c2goc1swXS5pZCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgICB2YXIgdGVtcCA9ICIiOw0KICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY29tbWVudC5sZW5ndGg7IGorKykgew0KICAgICAgICAgICAgY29uc3QgdmEgPSBzW2ldW2ZpZWxkW2pdXTsNCiAgICAgICAgICAgIHZhID0gdHlwZW9mKHZhKT09J3VuZGVmaW5lZCc/Jyc6dmE7DQogICAgICAgICAgICB0ZW1wICs9ICciJyArIGNvbW1lbnRbal0gKyAnIjoiJyArIHZhICsgJyIsJzsNCiAgICAgICAgICB9DQogICAgICAgICAgaWYgKHRlbXAgIT0gIiIpIHsNCiAgICAgICAgICAgIHRlbXAgPSAieyIgKyB0ZW1wLnN1YnN0cmluZygwLCB0ZW1wLmxlbmd0aCAtIDEpICsgIn0iOw0KICAgICAgICAgIH0NCiAgICAgICAgICBzdHIucHVzaChKU09OLnBhcnNlKHRlbXApKTsNCiAgICAgICAgICBpZHMucHVzaChzW2ldLmlkKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgLy/lpITnkIbloavliLbpg6jpl6gNCiAgICAgIGxldCBmaWxsT3JnID0gdGhpcy5nZXRGaWxsT3JnT2JqKGN1c3REaWFsb2cpOw0KICAgICAgDQogICAgICAvL+WkhOeQhuWunuS+i2lk5Zue5aGrDQogICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZyAmJiBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQgJiYgdGhpcy5pbnN0SWQpew0KICAgICAgICAgIGlmKGZpbGxPcmcgPT0gbnVsbCl7DQogICAgICAgICAgICBmaWxsT3JnID0ge307DQogICAgICAgICAgfQ0KICAgICAgICAgIGNvbnN0IGluc3RJZFBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQuc3BsaXQoJy4nKTsNCiAgICAgICAgICBjb25zdCBpbnN0SWRGaWVsZCA9IGluc3RJZFBhdGhbaW5zdElkUGF0aC5sZW5ndGgtMV07DQogICAgICAgICAgZmlsbE9yZ1tpbnN0SWRGaWVsZF0gPSB0aGlzLmluc3RJZDsNCiAgICAgIH0NCiAgICAgIGNvbnN0IHJldHVybkRhdGEgPSBzdHI7DQogICAgICBjb25zdCBfdGhpcyA9IHRoaXM7DQogICAgICBjb25zdCBmb3JtSW5zdCA9IHV0aWxzLmdldE9ubGluZUZvcm1JbnN0YW5jZSh0aGlzKTsNCiAgICAgIGxldCBmaWxsZGF0YSA9IHRoaXMuaG90U2V0dGluZ3MuZGF0YTsNCiAgICAgIGlmKGZpbGxkYXRhICYmIGZpbGxkYXRhLmxlbmd0aD09MSl7DQogICAgICAgIGZpbGxkYXRhID0gW107DQogICAgICAgIC8vaWYoT2JqZWN0LmtleXModGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKS5sZW5ndGg9PTAgfHwgSlNPTi5zdHJpbmdpZnkodGhpcy5pbml0Um93RGF0YSkgPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5ob3RTZXR0aW5ncy5kYXRhWzBdKSl7DQogICAgICAgICAgY29uc3QgaW5pdFN1bVJvdyA9IHRoaXMuZ2V0SW5pdFN1bVJvdygpOw0KICAgICAgICAgIGlmKGluaXRTdW1Sb3cpew0KICAgICAgICAgICAgZmlsbGRhdGEucHVzaCh7Li4uaW5pdFN1bVJvdywuLi5maWxsT3JnfSk7DQogICAgICAgICAgfQ0KICAgICAgICAvL30NCiAgICAgIH0NCiAgICAgIGxldCBmaWxsSW5pdERhdGEgPSBbXTsNCiAgICAgIHJldHVybkRhdGEuZm9yRWFjaChyb3cgPT4gew0KICAgICAgICB2YXIgdGFyZ2V0QXJyYXkgPSBudWxsOw0KICAgICAgICB2YXIgc3ViTGluZURhdGEgPSBfdGhpcy5pbml0Um93RGF0YT9fdGhpcy5pbml0Um93RGF0YTp7fTsNCiAgICAgICAgY3VzdERpYWxvZy5jdXN0RGlhbG9nLm1hcHBpbmdDb25mLmZvckVhY2goY29uID0+IHsNCiAgICAgICAgICBpZiAoY29uLnRhcmdldFswXSkgew0KICAgICAgICAgICAgdGFyZ2V0QXJyYXkgPSBjb24udGFyZ2V0WzBdLnNwbGl0KCIuIik7DQogICAgICAgICAgICB2YXIgZnJvbSA9ICIiOw0KICAgICAgICAgICAgaWYgKF90aGlzLmN1c3RvbURpYWxvZy5kc1R5cGUgPT0gInJlc3RmdWwiKSB7DQogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGZyb20gPSBjb24uZnJvbS50b1VwcGVyQ2FzZSgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc3ViTGluZURhdGFbdGFyZ2V0QXJyYXlbdGFyZ2V0QXJyYXkubGVuZ3RoIC0gMV1dID0gcm93W2Zyb21dOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIGlmKGZpbGxPcmchPW51bGwpew0KICAgICAgICAgIHN1YkxpbmVEYXRhID0gey4uLnN1YkxpbmVEYXRhLC4uLmZpbGxPcmd9Ow0KICAgICAgICB9DQogICAgICAgIGZpbGxJbml0RGF0YS5wdXNoKHsuLi5zdWJMaW5lRGF0YX0pOw0KICAgICAgfSk7DQogICAgICBpZih0aGlzLmFkZEluaXRUZW1wbGF0ZURhdGE9PT0ndHJ1ZScpew0KICAgICAgICB0aGlzLmluaXREYXRhQmFjayA9IGZpbGxJbml0RGF0YTsNCiAgICAgIH0NCiAgICAgIGZpbGxkYXRhID0gWy4uLmZpbGxkYXRhLC4uLmZpbGxJbml0RGF0YV07DQogICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKGZpbGxkYXRhLGZhbHNlKTsNCiAgICB9LA0KICAgIGZpbGxPcmdEYXRhRmllbGQocm93KXsNCiAgICAgIGxldCBjdXN0RGlhbG9nID0gdGhpcy5pbml0Q3VzdERpYWxvZ0NvbmY7DQogICAgICBpZihjdXN0RGlhbG9nICYmIGN1c3REaWFsb2cub3JnQ29uZmlnKXsNCiAgICAgICAgaWYoY3VzdERpYWxvZy5vcmdDb25maWcubmFtZSAmJiB0aGlzLmZpbGxPcmcuaWQpew0KICAgICAgICAgIGNvbnN0IG5hbWVQYXRoID0gY3VzdERpYWxvZy5vcmdDb25maWcubmFtZS5zcGxpdCgnLicpOw0KICAgICAgICAgIGNvbnN0IG9yZ05hbWVGaWVsZCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aC0xXTsNCiAgICAgICAgICByb3dbb3JnTmFtZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5uYW1lOw0KICAgICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmlkKXsNCiAgICAgICAgICAgIGNvbnN0IGlkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmlkLnNwbGl0KCcuJyk7DQogICAgICAgICAgICBjb25zdCBvcmdJZEZpZWxkID0gaWRQYXRoW2lkUGF0aC5sZW5ndGgtMV07DQogICAgICAgICAgICByb3dbb3JnSWRGaWVsZF0gPSB0aGlzLmZpbGxPcmcuaWQ7DQogICAgICAgICAgfQ0KICAgICAgICAgIGlmKGN1c3REaWFsb2cub3JnQ29uZmlnLmNvZGUpew0KICAgICAgICAgICAgY29uc3QgY29kZVBhdGggPSBjdXN0RGlhbG9nLm9yZ0NvbmZpZy5jb2RlLnNwbGl0KCcuJyk7DQogICAgICAgICAgICBjb25zdCBvcmdDb2RlRmllbGQgPSBjb2RlUGF0aFtjb2RlUGF0aC5sZW5ndGgtMV07DQogICAgICAgICAgICByb3dbb3JnQ29kZUZpZWxkXSA9IHRoaXMuZmlsbE9yZy5jb2RlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZihjdXN0RGlhbG9nLm9yZ0NvbmZpZy5pbnN0SWQgJiYgdGhpcy5pbnN0SWQpew0KICAgICAgICAgICAgY29uc3QgaW5zdElkUGF0aCA9IGN1c3REaWFsb2cub3JnQ29uZmlnLmluc3RJZC5zcGxpdCgnLicpOw0KICAgICAgICAgICAgY29uc3QgaW5zdElkRmllbGQgPSBpbnN0SWRQYXRoW2luc3RJZFBhdGgubGVuZ3RoLTFdOw0KICAgICAgICAgICAgcm93W2luc3RJZEZpZWxkXSA9IHRoaXMuaW5zdElkOw0KICAgICAgICB9DQogICAgICB9DQogICAgICByZXR1cm4gcm93Ow0KICAgIH0sDQogICAgdG9BZGRJbml0U3VtUm93KCl7DQogICAgICBjb25zdCBkYXRhID0gdGhpcy5nZXRIb3RUYWJsZURhdGEoKTsNCiAgICAgIGlmKCFkYXRhIHx8IGRhdGEubGVuZ3RoPDEgfHwoZGF0YS5sZW5ndGg9PTEgJiYgDQogICAgICAgIEpTT04uc3RyaW5naWZ5KGRhdGFbMF0pPT09SlNPTi5zdHJpbmdpZnkodGhpcy5pbml0Um93RGF0YSkpKXsNCiAgICAgICAgICBjb25zdCBpbml0U3VtUm93ID0gdGhpcy5nZXRJbml0U3VtUm93KCk7DQogICAgICAgICAgaWYoaW5pdFN1bVJvdyl7DQogICAgICAgICAgICBsZXQgcm93cyA9IFtdOw0KICAgICAgICAgICAgcm93cy5wdXNoKHsuLi5pbml0U3VtUm93fSk7DQogICAgICAgICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKHJvd3MpOw0KICAgICAgICAgIH0NCiAgICAgIH0NCiAgICB9LA0KICAgIGdldEluaXRTdW1Sb3coKXsNCiAgICAgIGlmKHRoaXMuaW5pdFN1bVJvdz09PSd0cnVlJyl7DQogICAgICAgIGxldCBuZXdSb3cgPSB7Li4udGhpcy5pbml0Um93RGF0YX07DQogICAgICAgIGlmKHRoaXMuaW5pdFN1bVJvd0ZpZWxkICYmIHRoaXMuaW5pdFN1bVJvd1ZhbHVlKXsNCiAgICAgICAgICBuZXdSb3dbdGhpcy5pbml0U3VtUm93RmllbGRdID0gdGhpcy5pbml0U3VtUm93VmFsdWU7DQogICAgICAgIH0NCiAgICAgICAgbGV0IGZpbGxPcmcgPSB0aGlzLmdldEZpbGxPcmdPYmoodGhpcy5pbml0Q3VzdERpYWxvZ0NvbmYpOw0KICAgICAgICBpZihmaWxsT3JnID09IG51bGwpew0KICAgICAgICAgICAgZmlsbE9yZyA9IHt9Ow0KICAgICAgICB9DQogICAgICAgIHJldHVybiB7Li4ubmV3Um93LC4uLmZpbGxPcmd9Ow0KICAgICAgfQ0KICAgICAgcmV0dXJuICcnOw0KICAgIH0sDQogICAgdG9BZGRJbml0VGVtcGxhdGVEYXRhKCl7DQogICAgICBpZih0aGlzLmFkZEluaXRUZW1wbGF0ZURhdGE9PT0ndHJ1ZScgJiYgdGhpcy5pbml0RGF0YUJhY2sgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmluaXREYXRhQmFjaykgJiYgdGhpcy5pbml0RGF0YUJhY2subGVuZ3RoPjApew0KICAgICAgICBsZXQgY3VyRGF0YSA9IHRoaXMuZ2V0QmFja01lcmdlRGF0YSgpOw0KICAgICAgICBpZighKGN1ckRhdGEgJiYgQXJyYXkuaXNBcnJheSh0aGlzLmluaXREYXRhQmFjaykpKXsNCiAgICAgICAgICBjdXJEYXRhID0gW1tdXTsNCiAgICAgICAgfQ0KICAgICAgICBjdXJEYXRhID0gWy4uLmN1ckRhdGEsLi4udGhpcy5pbml0RGF0YUJhY2tdOw0KICAgICAgICB0aGlzLmZpbGxiYWNrSG90VGFibGVEYXRhKGN1ckRhdGEpOw0KICAgICAgfWVsc2UgaWYoIXRoaXMuaW5pdERhdGFCYWNrIHx8IHRoaXMuaW5pdERhdGFCYWNrLmxlbmd0aDwxKXsNCiAgICAgICAgdGhpcy4kbWVzc2FnZSh7DQogICAgICAgICAgbWVzc2FnZTogIuWIneWni+WMluaVsOaNruS4uuepuuOAgiIsDQogICAgICAgICAgdHlwZTogIndhcm5pbmciDQogICAgICAgIH0pOw0KICAgICAgfQ0KICAgIH0sDQogICAgZ2V0VGFibGVIZWFkZXJzKCl7DQogICAgICBjb25zdCBvcHRpb25zSm9uID0gSlNPTi5wYXJzZSh0aGlzLm9wdGlvbnMpOw0KICAgICAgY29uc3QgcmVsYXRpb25zID0gb3B0aW9uc0pvbi5jb2xIZWFkZXJzUmVsYXRpb25zOw0KICAgICAgbGV0IGhlYWRlcnMgPSB7bmVzdGVkOnRoaXMuaG90U2V0dGluZ3MubmVzdGVkSGVhZGVycz90cnVlOmZhbHNlLGhlYWRlcjpbXX07DQogICAgICByZWxhdGlvbnMuZm9yRWFjaChpdGVtID0+ew0KICAgICAgICBoZWFkZXJzLmhlYWRlci5wdXNoKHtuYW1lOml0ZW0ubmFtZSxkZXNjOml0ZW0uZGVzY30pOw0KICAgICAgfSkNCiAgICAgIHJldHVybiBoZWFkZXJzOw0KICAgIH0sDQogIH0sDQogIGNyZWF0ZWQoKSB7DQogICAgIA0KICB9DQp9Ow0K"},null]}