1 |
- {"remainingRequest":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\thread-loader\\dist\\cjs.js!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\babel-loader\\lib\\index.js!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js??ref--0-0!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\src\\views\\goods\\sale\\AddGoodsOneStore.vue?vue&type=script&lang=js&","dependencies":[{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\src\\views\\goods\\sale\\AddGoodsOneStore.vue","mtime":1655374732000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\babel.config.js","mtime":1655374732000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\thread-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\babel-loader\\lib\\index.js","mtime":315532800000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"E:\\item\\千鸟\\千鸟云商前端源代码\\源点计划\\jindouyunNewFront\\node_modules\\vue-loader\\lib\\index.js","mtime":1655715099000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:Ly8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KLy8KaW1wb3J0IEN1c3RvbWVyUHJpY2UgZnJvbSAiLi4vY29tcG9uZW50cy9DdXN0b21lclByaWNlIjsKaW1wb3J0IExhZGRlclByaWNlIGZyb20gIi4uL2NvbXBvbmVudHMvTGFkZGVyUHJpY2UiOwppbXBvcnQgQ3VzdG9tZXJUeXBlUHJpY2UgZnJvbSAiLi4vY29tcG9uZW50cy9DdXN0b21lclR5cGVQcmljZSI7IC8vIGltcG9ydCBHb29kc0NhdGVnb3J5IGZyb20gIkAvY29tcG9uZW50L2NvbW1vbi9Hb29kc0NhdGVnb3J5LnZ1ZSI7CgppbXBvcnQgQnJhbmRTZWxNb2RlbCBmcm9tICJAL2NvbXBvbmVudC9nb29kcy9CcmFuZFNlbE1vZGVsLnZ1ZSI7CmltcG9ydCBUaW55bWNlIGZyb20gIkAvY29tcG9uZW50L1RpbnltY2UiOwppbXBvcnQgVXBsb2FkUWluaXUgZnJvbSAiQC9jb21wb25lbnQvY29tbW9uL1VwbG9hZFFpbml1LnZ1ZSI7IC8vIOaWsOWinuWIhuexuwoKaW1wb3J0IEFkZENhdGUgZnJvbSAiQC9jb21wb25lbnQvZ29vZHMvQWRkQ2F0ZS52dWUiOwppbXBvcnQgQWRkQnJhbmQgZnJvbSAiLi4vbWFuYWdlRy9BZGRCcmFuZCI7CmltcG9ydCB7IGdldEFsbEV4cHJlc3NSdWxlLCBnZXRBbGxDdXN0b21lclNvdXJjZSB9IGZyb20gIkAvYXBpL1N5c3RlbSI7CmltcG9ydCB7IGdldEFsbFVuaXQsIGRlZmluZVNwZWMsIFNwZWNNYW5hZ2VnZXRBbGwsIGdldFF1aWNrR29vZHNJbmZvLCBlZGl0UXVpY2tHb29kcywgYWRkQmFzaWNBbmRQdWJsaXNoR29vZHMsIGdldEFsbENhdGVnb3J5UG9zdCB9IGZyb20gIkAvYXBpL2dvb2RzIjsKaW1wb3J0IHsgYWRkUGF1c2VTYXZlLCBkZWxQYXVzZVNhdmUsIGdldFBhdXNlU2F2ZSB9IGZyb20gIkAvYXBpL2NvbW1vbiI7CmNvbnN0IHByaWNlRGF0YUxpID0gewogIGVuYWJsZWRMYWRkZXI6IDAsCiAgbWFya2V0UHJpY2U6ICIiLAogIG1lbWJlclByaWNlOiAiIiwKICBzYWxlUHJpY2U6ICIiLAogIHNldE51bTogMSwKICBpc1NhbGU6IDUsCiAgc2FsZVByaWNlQXJlYVR5cGU6IDEsCiAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgY3VzdG9tZXJQcmljZTogW10sCiAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlLAogIGxhZGRlclByaWNlOiBbCiAgICAvKiB7CiAgICAgIGZyb206IDEsCiAgICAgIHByaWNlOiAwLjAxLAogICAgICB0bzogMgogICAgfSwgewogICAgICBmcm9tOiAzLAogICAgICBwcmljZTogMC4wMSwKICAgICAgdG86IDQKICAgIH0sCiAgICB7CiAgICAgIGZyb206IDUsCiAgICAgIHByaWNlOiAwLjAxLAogICAgICB0bzogOTk5OTk5OTk5CiAgICB9ICovCiAgXQp9OwppbXBvcnQgQ2xpZW50TGlzdE1vZGFsIGZyb20gIkAvY29tcG9uZW50L2NvbW1vbi9DbGllbnRMaXN0TW9kYWwiOwppbXBvcnQgUmVnaW9uVHJlZSBmcm9tICJAL2NvbXBvbmVudC9jb21tb24vUmVnaW9uVHJlZSI7CmltcG9ydCB7IG1hcEdldHRlcnMgfSBmcm9tICJ2dWV4IjsKaW1wb3J0IHsgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQsIGFkZEN1c3RvbWVyVHlwZVByaWNlQWRqdXN0bWVudCwgZ2V0Q3VzdG9tZXJQcmljZUJ5R29vZHNJZHMsIGdldEN1c3RvbWVyVHlwZVByaWNlQnlHb29kc0lkcyB9IGZyb20gIkAvYXBpL1ByaWNlIjsKaW1wb3J0IHsgZ2V0QWxsTWVyY2hhbnRMaXN0IH0gZnJvbSAiQC9hcGkvTWVyY2hhbnRzIjsKZXhwb3J0IGRlZmF1bHQgewogIG5hbWU6ICJBZGRCYXNlRGF0YSIsCiAgY29tcG9uZW50czogewogICAgLy8gR29vZHNDYXRlZ29yeSwKICAgIEJyYW5kU2VsTW9kZWwsCiAgICBUaW55bWNlLAogICAgVXBsb2FkUWluaXUsCiAgICBBZGRDYXRlLAogICAgQWRkQnJhbmQsCiAgICBSZWdpb25UcmVlLAogICAgQ2xpZW50TGlzdE1vZGFsLAogICAgQ3VzdG9tZXJQcmljZSwKICAgIEN1c3RvbWVyVHlwZVByaWNlLAogICAgTGFkZGVyUHJpY2UKICB9LAoKICBkYXRhKCkgewogICAgY29uc3QgdmFsaWRhdGVVbml0ID0gKHJ1bGUsIHZhbHVlLCBjYWxsYmFjaykgPT4gewogICAgICBpZiAodmFsdWUudW5pdE5hbWUgPT09ICIiKSB7CiAgICAgICAgY2FsbGJhY2sobmV3IEVycm9yKCLor7forr7nva7ln7rmnKzljZXkvY0iKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY2FsbGJhY2soKTsKICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gewogICAgICB1bml0aXNNYXN0ZXI6ICIiLAogICAgICB1bml0X2luZGV4OiAwLAogICAgICBza3VfaW5kZXg6IDAsCiAgICAgIGxhZGRlclByaWNlOiBbXSwKICAgICAgZW5hYmxlZExhZGRlcjogMCwKICAgICAgbGFkZGVyX3ByaWNlX3Nob3c6IGZhbHNlLAogICAgICAvLyDpmLbmoq/ku7flvLnnqpcKICAgICAgdHlwZV9wcmljZV9zaG93OiBmYWxzZSwKICAgICAgLy8g5a6i5oi357G75Z6L5Lu35by556qXCiAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgIC8vIOWuouaIt+exu+Wei+S7t+W8ueeql+W8gOWFswogICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgIC8vIOWuouaIt+exu+Wei+S7t+W8ueeql+aVsOaNrgogICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UsCiAgICAgIGN1c3RvbWVyUHJpY2U6IFtdLAogICAgICBhcHBvaW50X3ByaWNlX3Nob3c6IGZhbHNlLAogICAgICAvLyDlrqLmiLfmjIflrprku7flvLnnqpcKICAgICAgY3VzdG9tZXJfc2hvdzogZmFsc2UsCiAgICAgIC8vIOe7j+iQpeWxj+iUvS0+5a6i5oi35YiX6KGo5by556qX6YCJ5oupCiAgICAgIGN1c3RvbWVyX2xpc3Q6IFtdLAogICAgICAvLyDnu4/okKXlsY/olL0tPuWuouaIt+WIl+ihqAogICAgICBjdXN0b21lcl90eXBlX2NoZWNrOiBbXSwKICAgICAgLy8g57uP6JCl5bGP6JS9LT7lrqLmiLfnsbvlnovpgInmi6nmlbDnu4QKICAgICAgY3VzdG9tZXJfdHlwZV9saXN0OiBbXSwKICAgICAgLy8g57uP6JCl5bGP6JS9LT7lrqLmiLfnsbvlnovliJfooagKICAgICAgcmVnaW9uX2FycjogW10sCiAgICAgIC8vIOe7j+iQpeWxj+iUvS0+5b2T5YmN5ZWG5ZOB5bey6YCJ5oup6L+H55qE5Yy65Z+fCiAgICAgIHBhZ2VfdGFiczogIjEiLAogICAgICAvLyDpobXpnaJ0YWLliIfmjaIKICAgICAgZXhwcmVzc19saXN0OiBbXSwKICAgICAgLy8g6L+Q6LS55qih54mI5YiX6KGoCiAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgIC8vIDUg6KGo56S65q2k5ZWG5ZOB5LuO5pyq6YeH6LSt6L+H77yM5YWB6K6455So5oi36ZqP5oSP57yW6L6R5Y2V5L2N5ZKM5bGe5oCn77ybNCDooajnpLrllYblk4Hlt7Lnu4/ph4fotK3ov4fvvIzpmpDol4/mt7vliqDlsZ7mgKfmjInpkq7vvIzpgb/lhY1za3VpZOmHjee7hAogICAgICAvLyDorqHph4/ljZXkvY0KICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgIC8vIOiHquWumuS5ieWxnuaAp+WAvOi+k+WFpeahhgogICAgICBzcGVjX25hbWVfaW5kZXg6IDAsCiAgICAgIC8vIOWxnuaAp+WQjWluZGV4CiAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgIC8vIOaYvuekuuiHquWumuS5ieWxnuaAp+WAvOi+k+WFpeahhgogICAgICBzcGVjX21vZGVsOiBmYWxzZSwKICAgICAgLy8g6YCJ5oup5bGe5oCn5YC85by556qXCiAgICAgIHNwZWNfaXRlbV9jaGVjazogW10sCiAgICAgIC8vIOWxnuaAp+WAvOW8ueeql+WNlemAiXZhbHVlCiAgICAgIGlzX2luZGV0ZXJtaW5hdGVfc3BlYzogZmFsc2UsCiAgICAgIC8vIOaJuemHj+mAieaLqeWxnuaAp+WAvCDlhajpgInpgInmi6nmoYbnirbmgIEKICAgICAgc3BlY19jaGVja19hbGw6IGZhbHNlLAogICAgICAvLyDlsZ7mgKflgLwg5YWo6YCJ6YCJ5oup5qGGdmFsdWUKICAgICAgc3BlY19kYXRhOiBbXSwKICAgICAgLy8g5bGe5oCn5YiX6KGoCiAgICAgIHNwZWNfZGF0YV9jaGlsZDogW10sCiAgICAgIC8vIOWxnuaAp+WAvOWIl+ihqAogICAgICBzcGVjX3RhYmxlX0RhdGE6IFtdLAogICAgICAvLyDop4TmoLzmmI7nu4YKICAgICAgc2t1X2xpc3Q6IFsvLyDllYblk4HlsZ7mgKfliJfooagKICAgICAgewogICAgICAgIHNwZWNfZGF0YV9jaGlsZDogW10sCiAgICAgICAgZ3JvdXBTcGVjSWQ6ICIiLAogICAgICAgIHNlbGZfc3BlY192YWw6ICIiLAogICAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgcGFyYW1zOiBbXQogICAgICB9XSwKICAgICAgYWRkX21vZGVsOiBmYWxzZSwKICAgICAgLy8g5paw5bu65YiG57G7CiAgICAgIGRpYWxvZ1RpdGxlOiAi5paw5bu65YiG57G7IiwKICAgICAgcGlkX2FycjogW10sCiAgICAgIGFkZF9CcmFuZDogZmFsc2UsCiAgICAgIC8vIOaWsOWinuWTgeeJjAogICAgICBwYWdlTmFtZTogIiIsCiAgICAgIC8vIOaaguWtmOaVsOaNruWPguaVsAogICAgICBsb2FkaW5nOiBmYWxzZSwKICAgICAgaW1nX2xpc3Q6IFtdLAogICAgICAvLyDlhbPplK7or40KICAgICAgZHluYW1pY1RhZ3M6IFtdLAogICAgICBpbnB1dFZpc2libGU6IGZhbHNlLAogICAgICBpbnB1dFZhbHVlOiAiIiwKICAgICAgLy8g5YWz6ZSu6K+NIEVORAogICAgICBhc3Npc3RfbW9kZWw6IGZhbHNlLAogICAgICBlZGl0X2Fzc2lzdF9tb2RlbDogZmFsc2UsCiAgICAgIGFzc2lzdF9pbmRleDogMCwKICAgICAgdW5pdF9vcHRpb25zOiBbXSwKICAgICAgLy8g6K6h6YeP5Y2V5L2N5by556qXCiAgICAgIGFzc2lzdF9mb3JtOiB7CiAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgIGJhckNvZGU6ICIiLAogICAgICAgIGlzTWFzdGVyOiA0LAogICAgICAgIGlzRGVmYXVsdDogNCwKICAgICAgICBpc0VkaXRTcGVjOiA1LAogICAgICAgIHVuaXRJZDogIiIsCiAgICAgICAgY29udmVyc2lvbjogIiIKICAgICAgfSwKICAgICAgc2VsX2JyYW5kOiBmYWxzZSwKICAgICAgLy8g5omT5byA5ZOB54mM6YCJ5oup5by556qXCiAgICAgIHNlbF9zaG9wOiBmYWxzZSwKICAgICAgLy8g5omT5byA5bqX6ZO66YCJ5oup5by556qXCiAgICAgIG1hc3Rlcl91bml0X25hbWU6ICIiLAogICAgICBiYXNlX2Zvcm06IHsKICAgICAgICAvLyAg5Z+65pys5L+h5oGvCiAgICAgICAgZW5hYmxlU3RhdHVzOiA1LAogICAgICAgIC8vIOaYr+WQpuS4iuaetgogICAgICAgIGlzRGlzdHJpYnV0aW9uOiA0LAogICAgICAgIC8v6LSf5bqT5a2Y6ZSA5ZSuCiAgICAgICAgaXNTaGllbGQ6IDQsCiAgICAgICAgLy8g57uP6JCl5bGP6JS9IDTlhbPpl60gNeW8gOWQrwogICAgICAgIGlzRXE6IDQsCiAgICAgICAgLy8g5oqE56CB5ZWG5ZOBCiAgICAgICAgc3BlY1R5cGU6IDEsCiAgICAgICAgLy8g5piv5ZCm5aSa6KeE5qC8CiAgICAgICAgZGVsVW5pdElkczogW10sCiAgICAgICAgLy8g6L6F5Yqp5Y2V5L2N5Yig6ZmkZGVsVW5pdElkcyAodW5pdElkKQogICAgICAgIGRlbFNwZWNTa3VJZHM6IFtdLAogICAgICAgIC8vIOWxnuaAp+WIoOmZpGRlbFNwZWNTa3VJZHPvvIjov5nkuKrnlKhpZO+8iQogICAgICAgIGJyYW5jaFVuaXQ6IFtdLAogICAgICAgIGJyYW5kTmFtZTogIiIsCiAgICAgICAgY2F0ZWdvcnlJZDogIiIsCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlJZDogIiIsCiAgICAgICAgY2F0ZWdvcnlQYXRoOiBbXSwKICAgICAgICAvLyDliIbnsbvpgInmi6kKICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdLAogICAgICAgIC8vIOWIhuexu+mAieaLqQogICAgICAgIHVuaXREYXRhOiBbXSwKICAgICAgICBtYXN0ZXJVbml0OiB7CiAgICAgICAgICBiYXJDb2RlOiAiIiwKICAgICAgICAgIHdlaWdodDogIiIsCiAgICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICAgIGlzRGVmYXVsdDogNSwKICAgICAgICAgIHVuaXROYW1lOiAiIiwKICAgICAgICAgIHVuaXRJZDogIiIKICAgICAgICB9LAogICAgICAgIGRlc2NyaWJlOiAiIiwKICAgICAgICB0aXRsZTogIiIsCiAgICAgICAgc3RvcmFnZTogIiIsCiAgICAgICAgY29kZTogIiIsCiAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgLy8g5ZWG5ZOB5p2h56CBCiAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICAvLyDllYblk4Hph43ph48KICAgICAgICBleHBpcmVUaW1lOiAiIiwKICAgICAgICBicmFuZElkOiAiIiwKICAgICAgICB0YWc6ICIiLAogICAgICAgIGRlc2NyaXB0aW9uOiAiIiwKICAgICAgICBzYWxlc1Nob3A6ICIiLAogICAgICAgIGltYWdlczogW10sCiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IFsiMSIsICIyIl0sCiAgICAgICAgLy8g54mp5rWB5pSv5oyBIOWbuuWumuWAvCAxIOW/q+mAkiAyIOiHquaPkCDkvKDlj4LmoLzlvI/vvJoxLDIKICAgICAgICBleHByZXNzVHlwZTogMSwKICAgICAgICAvLyDlv6vpgJLov5DotLkgMSDljIXpgq4gMiDov5DotLnmqKHniYggMyDlm7rlrprotLnnlKgKICAgICAgICBleHByZXNzRmVlOiAiIiwKICAgICAgICAvLyDlm7rlrprotLnnlKgKICAgICAgICBzaG93RXhwcmVzczogNSwKICAgICAgICAvLyDmmK/lkKblsZXnpLrlv6vpgJIgNeWxleekuiA05LiN5bGV56S6CiAgICAgICAgcnVsZUlkOiAiIiwKICAgICAgICAvLyDov5DotLnmqKHniYhpZAogICAgICAgIG5vdEFyZWE6IFtdLAogICAgICAgIC8v57uP6JCl5bGP6JS95Zyw5Yy6CiAgICAgICAgbm90Q3VzdG9tZXJUeXBlOiAiIiwKICAgICAgICAvL+e7j+iQpeWxj+iUvSDlrqLmiLfnsbvlnovlsY/olL0KICAgICAgICBub3RDdXN0b21lcjogIiIsCiAgICAgICAgLy/nu4/okKXlsY/olL0g5a6i5oi35bGP6JS9CiAgICAgICAgbWVyY2hhbnRJZDogIiIgLy/llYbmiLdJRAoKICAgICAgfSwKICAgICAgc2VsX2NpdGllczogW10sCiAgICAgIC8vIOWVhuaIt+WIl+ihqAogICAgICBiYXNlX3J1bGVzOiB7CiAgICAgICAgLy8g5Z+65pys5L+h5oGv6aqM6K+BCiAgICAgICAgaW1hZ2VzOiBbewogICAgICAgICAgdHlwZTogImFycmF5IiwKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogIuivt+S4iuS8oOWVhuWTgeWbvueJhyIsCiAgICAgICAgICB0cmlnZ2VyOiAiY2hhbmdlIgogICAgICAgIH1dLAogICAgICAgIHRpdGxlOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36L6T5YWl5ZWG5ZOB5ZCN56ewIiwKICAgICAgICAgIHRyaWdnZXI6ICJibHVyIgogICAgICAgIH1dLAogICAgICAgIGNhdGVnb3J5SWQ6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIG1lc3NhZ2U6ICLor7fpgInmi6nllYblk4HliIbnsbsiLAogICAgICAgICAgdHJpZ2dlcjogImNoYW5nZSIKICAgICAgICB9XSwKICAgICAgICBleHBpcmVUaW1lOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36L6T5YWl5ZWG5ZOB5L+d6LSo5pyfIiwKICAgICAgICAgIHRyaWdnZXI6ICJibHVyIgogICAgICAgIH1dLAogICAgICAgIC8vIGJyYW5kSWQ6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36YCJ5oup5ZWG5ZOB5ZOB54mMJywgdHJpZ2dlcjogJ2NoYW5nZScgfV0sCiAgICAgICAgLy8gZGVzY3JpYmU6IFt7IHJlcXVpcmVkOiB0cnVlLCBtZXNzYWdlOiAn6K+36L6T5YWl5ZWG5ZOB5o+P6L+wJywgdHJpZ2dlcjogJ2JsdXInIH1dLAogICAgICAgIG1hc3RlclVuaXQ6IFt7CiAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkYXRlVW5pdCwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IFt7CiAgICAgICAgICByZXF1aXJlZDogdHJ1ZSwKICAgICAgICAgIHR5cGU6ICJhcnJheSIsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup54mp5rWB5pSv5oyBIiwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgcnVsZUlkOiBbewogICAgICAgICAgcmVxdWlyZWQ6IHRydWUsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup6L+Q6LS55qih5p2/IiwKICAgICAgICAgIHRyaWdnZXI6ICJjaGFuZ2UiCiAgICAgICAgfV0sCiAgICAgICAgZXhwcmVzc0ZlZTogW3sKICAgICAgICAgIHJlcXVpcmVkOiB0cnVlLAogICAgICAgICAgbWVzc2FnZTogIuivt+i+k+WFpei/kOi0uSIsCiAgICAgICAgICB0cmlnZ2VyOiAiYmx1ciIKICAgICAgICB9XSAvLyBicmFuY2hVbml0OiBbeyByZXF1aXJlZDogdHJ1ZSwgdHlwZTogJ2FycmF5JywgbWVzc2FnZTogJ+ivt+iuvue9rui+heWKqeWNleS9jScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dCiAgICAgICAgLy8gdGFnOiBbeyByZXF1aXJlZDogdHJ1ZSwgbWVzc2FnZTogJ+ivt+iuvue9ruWVhuWTgeWFs+mUruivjScsIHRyaWdnZXI6ICdjaGFuZ2UnIH1dCgogICAgICB9LAogICAgICBnb29kc19pZDogMCwKICAgICAgbGlzdF9wYWdlX2RhdGE6ICIxXzEwIiwKICAgICAgdW5pdF9kYXRhOiBbXSwKICAgICAgLy8g5Y2V5L2N5piO57uGCiAgICAgIHRhYnNfYWN0aXZlOiAiIiwKICAgICAgLy8g5aSa5bGe5oCn5Y2V5L2N5YiH5o2iCiAgICAgIGlzTmV3OiA1LAogICAgICAvLyA1IOagh+ekuui/meaYr+S4gOS4quacgOi/keaWsOWinueahOWVhuWTge+8jOWfuuacrOWNleS9jeS4uuacgOWwj+WNleS9je+8jDTmoIfnpLrov5nmmK/kuYvliY3nmoTogIHmlbDmja7vvIzln7rmnKzljZXkvY3kuLrmnIDlpKfljZXkvY0KICAgICAgY2F0ZWdvcnlfZGF0YTogW10sCiAgICAgIC8v5ZWG5ZOB5YiG57G75YiX6KGoCiAgICAgIGNhdGVfcHJvcHM6IHsKICAgICAgICBsYWJlbDogInRpdGxlIiwKICAgICAgICB2YWx1ZTogImlkIiwKICAgICAgICBjaGVja1N0cmljdGx5OiB0cnVlCiAgICAgIH0sCiAgICAgIGFzc2lzdF9jYXRlOiBbewogICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogW10KICAgICAgfV0sCiAgICAgIHNrdV9pZDogIiIKICAgIH07CiAgfSwKCiAgY29tcHV0ZWQ6IHsgLi4ubWFwR2V0dGVycyh7CiAgICAgIHNhbGVQcmljZVRpbWVzOiAiTVVzZXIvc2FsZVByaWNlVGltZXMiLAogICAgICBzeXN0ZW1UeXBlOiAiTVVzZXIvc3lzdGVtVHlwZSIgLy8g5b2T5YmN5ZCO5Y+wCgogICAgfSkKICB9LAoKICBhc3luYyBjcmVhdGVkKCkgewogICAgLy8g5ZWG5oi3566h55CGCiAgICBhd2FpdCB0aGlzLmdldEFsbE1lcmNoYW50TGlzdCgpOyAvLyDllYblk4HliIbnsbvliJfooagKCiAgICBhd2FpdCB0aGlzLmdldEFsbENhdGVnb3J5UG9zdCgpOwogICAgdGhpcy5wYWdlTmFtZSA9IHRoaXMuJHJvdXRlLm5hbWU7IC8vIOWxnuaAp+euoeeQhgoKICAgIGF3YWl0IHRoaXMuU3BlY01hbmFnZWdldEFsbCgpOwogICAgYXdhaXQgdGhpcy5nZXRBbGxVbml0KCk7IC8vIOWuouaIt+exu+WeiwoKICAgIGF3YWl0IHRoaXMuZ2V0QWxsQ3VzdG9tZXJTb3VyY2UoKTsKCiAgICBpZiAodGhpcy4kcm91dGUucGFyYW1zLmlkKSB7CiAgICAgIHRoaXMuZ29vZHNfaWQgPSB0aGlzLiRyb3V0ZS5wYXJhbXMuaWQ7CiAgICAgIHRoaXMubGlzdF9wYWdlX2RhdGEgPSB0aGlzLiRyb3V0ZS5wYXJhbXMucGFnZTsKICAgICAgYXdhaXQgdGhpcy5nZXRHb29kc0Jhc2ljSW5mb0J5SWQoKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIOiOt+WPluaaguWtmOS/oeaBrwogICAgICBhd2FpdCB0aGlzLmdldFBhdXNlU2F2ZSgpOwogICAgfQoKICAgIGF3YWl0IHRoaXMuZ2V0QWxsRXhwcmVzc1J1bGUoKTsKICB9LAoKICBtZXRob2RzOiB7CiAgICAvLyDojrflj5bov5DotLnmqKHniYgKICAgIGFzeW5jIGdldEFsbEV4cHJlc3NSdWxlKCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsRXhwcmVzc1J1bGUoKTsKICAgICAgdGhpcy5leHByZXNzX2xpc3QgPSBkYXRhOwogICAgfSwKCiAgICBpc0RlZmF1bHRDaGFuZ2UodmFsLCBpbmRleCwgc0luZGV4KSB7CiAgICAgIGlmICh2YWwgPT09IDUpIHsKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CgogICAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSA9PT0gMikgewogICAgICAgICAgdGFyZ2V0LmZvckVhY2goKGl0ZW0sIGluZGV4VSkgPT4gewogICAgICAgICAgICBpdGVtLnNwZWNfdGFibGVfRGF0YS5mb3JFYWNoKChpdGVtQiwgaW5kZXhCKSA9PiB7CiAgICAgICAgICAgICAgaWYgKGluZGV4VSAhPT0gc0luZGV4KSB7CiAgICAgICAgICAgICAgICBpdGVtQi5pc0RlZmF1bHQgPSA0OwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoaW5kZXhCICE9PSBpbmRleCkgewogICAgICAgICAgICAgICAgICBpdGVtQi5pc0RlZmF1bHQgPSA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0LmZvckVhY2goKGl0ZW0sIGluZGV4VSkgPT4gewogICAgICAgICAgICBpZiAoaW5kZXhVICE9PSBpbmRleCkgewogICAgICAgICAgICAgIGl0ZW0uaXNEZWZhdWx0ID0gNDsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRhcmdldDsKICAgICAgfQogICAgfSwKCiAgICAvLyDor7fmsYLln7rmnKzljZXkvY3mlbDmja4KICAgIGFzeW5jIGdldEFsbFVuaXQoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhCiAgICAgIH0gPSBhd2FpdCBnZXRBbGxVbml0KHsKICAgICAgICBwYWdlOiAxLAogICAgICAgIHBhZ2VTaXplOiA5OQogICAgICB9KTsKICAgICAgdGhpcy51bml0X29wdGlvbnMgPSBkYXRhOwogICAgfSwKCiAgICBtb2RlbENsb3NlKCkgewogICAgICB0aGlzLmFkZF9tb2RlbCA9IGZhbHNlOwogICAgfSwKCiAgICAvLyDmiZPlvIDmlrDlop7lvLnnqpcKICAgIG9wZW5Nb2RlbCh0aXRsZSwgcm93KSB7CiAgICAgIHRoaXMuYWRkX21vZGVsID0gdHJ1ZTsKICAgICAgdGhpcy5kaWFsb2dUaXRsZSA9IHRpdGxlOwoKICAgICAgaWYgKHRpdGxlID09PSAi5paw5bu65a2Q5YiG57G7IikgewogICAgICAgIGxldCBsaW5rID0gcm93LmxpbmsgPyByb3cubGluay5zcGxpdCgiLCIpLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChpdGVtKTsKICAgICAgICB9KSA6IFtdOwogICAgICAgIGxpbmsucHVzaChyb3cuaWQpOwogICAgICAgIHRoaXMucGlkX2FyciA9IGxpbms7CiAgICAgIH0KICAgIH0sCgogICAgLy8g5paw5aKeL+e8lui+keWIhuexuwogICAgYXN5bmMgc3ViQ2F0ZWdvcnkoKSB7CiAgICAgIHRoaXMuZ2V0QWxsQ2F0ZWdvcnlQb3N0KCk7CiAgICAgIHRoaXMuJG1lc3NhZ2UoIuaWsOW7uuWIhuexu+aIkOWKnyIpOwogICAgfSwKCiAgICAvLyDmlrDlu7rlk4HniYwKICAgIHN1Ym1pdEJyYW5kKCkgewogICAgICB0aGlzLmFkZF9CcmFuZCA9IGZhbHNlOwogICAgfSwKCiAgICAvLyDmt7vliqDmmoLlrZgKICAgIGFzeW5jIEFkZFRlbSgpIHsKICAgICAgY29uc3QgcGFyYW1zID0geyAuLi50aGlzLmJhc2VfZm9ybSwKICAgICAgICBzcGVjR3JvdXA6IHRoaXMuc2t1X2xpc3QsCiAgICAgICAgc3BlY011bHRpcGxlOiB0aGlzLnNwZWNfdGFibGVfRGF0YSwKICAgICAgICB0YWc6IHRoaXMuZHluYW1pY1RhZ3MsCiAgICAgICAgYXNzaXN0X2NhdGU6IHRoaXMuYXNzaXN0X2NhdGUKICAgICAgfTsKICAgICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTsKICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGFkZFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lLAogICAgICAgIGRhdGE6IHBhcmFtcwogICAgICB9KTsKICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7CiAgICAgIHRoaXMuJG1lc3NhZ2UoewogICAgICAgIHR5cGU6ICJzdWNjZXNzIiwKICAgICAgICBtZXNzYWdlOiAi5pqC5a2Y5oiQ5YqfIgogICAgICB9KTsKCiAgICAgIGlmICh0aGlzLnN5c3RlbVR5cGUgPT09IDMpIHsKICAgICAgICB0aGlzLiRjbG9zZUN1cnJlbnRHb0VkaXQoYC9nb29kcy9zYWxlL01lcmNoYW50c0dvb2RzYCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kY2xvc2VDdXJyZW50R29FZGl0KGAvZ29vZHMvc2FsZS9QdWJsaXNoR29vZHNgKTsKICAgICAgfQogICAgfSwKCiAgICAvLyDliKDpmaTmmoLlrZjkv6Hmga8KICAgIGFzeW5jIGRlbFBhdXNlU2F2ZSgpIHsKICAgICAgY29uc3QgZGF0YSA9IGRlbFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lCiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5bmmoLlrZjkv6Hmga8KICAgIGFzeW5jIGdldFBhdXNlU2F2ZSgpIHsKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGdldFBhdXNlU2F2ZSh7CiAgICAgICAga2V5OiB0aGlzLnBhZ2VOYW1lCiAgICAgIH0pOwogICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZGF0YSkgPT09ICJ7fSIpIHJldHVybjsKICAgICAgdGhpcy5iYXNlX2Zvcm0gPSB7IC4uLmRhdGEsCiAgICAgICAgY2F0ZWdvcnlQYXRoOiBBcnJheS5pc0FycmF5KGRhdGEuY2F0ZWdvcnlQYXRoKSA/IGRhdGEuY2F0ZWdvcnlQYXRoIDogW10sCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoOiBBcnJheS5pc0FycmF5KGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoKSA/IGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoIDogW10KICAgICAgfTsKICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IGRhdGEuYXNzaXN0X2NhdGUgfHwgW3sKICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdCiAgICAgIH1dOwogICAgICB0aGlzLnNrdV9saXN0ID0gZGF0YS5zcGVjR3JvdXAgfHwgW107CiAgICAgIHRoaXMuc3BlY190YWJsZV9EYXRhID0gZGF0YS5zcGVjTXVsdGlwbGUgfHwgW107CiAgICAgIHRoaXMuZHluYW1pY1RhZ3MgPSBkYXRhLnRhZyB8fCBbXTsKCiAgICAgIGlmIChkYXRhLmltYWdlcykgewogICAgICAgIHRoaXMuaW1nX2xpc3QgPSBkYXRhLmltYWdlcy5tYXAoaXRlbSA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBuYW1lOiAiIiwKICAgICAgICAgICAgdXJsOiBpdGVtCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOWbvueJhwogICAgdXBsb2FkU3BlY1N1Y2Nlc3ModmFsLCBpbmRleCwgaW5kZXhVKSB7CiAgICAgIGxldCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICB0YXJnZXRbaW5kZXhdLnNwZWNJbWFnZSA9IHsKICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgdXJsOiB2YWwKICAgICAgICB9OwogICAgICB9IGVsc2UgewogICAgICAgIHRhcmdldFtpbmRleFVdLnNwZWNfdGFibGVfRGF0YVtpbmRleF0uc3BlY0ltYWdlID0gewogICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICB1cmw6IHZhbAogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgfSwKCiAgICAvLyDmt7vliqDop4TmoLzpobnnm64KICAgIGFkZFNrdVAoKSB7CiAgICAgIGlmICghdGhpcy5nb29kc19pZCkgewogICAgICAgIHRoaXMuc2t1X2xpc3QucHVzaCh7CiAgICAgICAgICBzcGVjX2RhdGFfY2hpbGQ6IFtdLAogICAgICAgICAgc2VsZl9zcGVjX2lucHV0OiBmYWxzZSwKICAgICAgICAgIHNlbGZfc3BlY192YWw6ICIiLAogICAgICAgICAgZ3JvdXBTcGVjSWQ6ICIiLAogICAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgICBwYXJhbXM6IFtdCiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy4kY29uZmlybSgi5paw5aKe6KeE5qC85Lya5a+86Ie05Y6f5pyJ5bqT5a2Y6YeN572uLOivt+iwqOaFjuaTjeS9nCEg5piv5ZCm57un57utPyIsICLmj5DnpLoiLCB7CiAgICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIue7p+e7reaWsOWiniIsCiAgICAgICAgICBjYW5jZWxCdXR0b25UZXh0OiAi5Y+W5raIIiwKICAgICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICAgIH0pLnRoZW4oKCkgPT4gewogICAgICAgICAgdGhpcy5za3VfbGlzdC5wdXNoKHsKICAgICAgICAgICAgc3BlY19kYXRhX2NoaWxkOiBbXSwKICAgICAgICAgICAgc2VsZl9zcGVjX2lucHV0OiBmYWxzZSwKICAgICAgICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgICAgICAgIGdyb3VwU3BlY0lkOiAiIiwKICAgICAgICAgICAgZ3JvdXBTcGVjTmFtZTogIiIsCiAgICAgICAgICAgIHBhcmFtczogW10KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOaYjuWIh+aNogogICAgZ3JvdXBTcGVjSWRDaGFuZ2UodmFsLCBpbmRleFMpIHsKICAgICAgbGV0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMuc2t1X2xpc3QpOwogICAgICBjb25zdCBzcGVjRGF0YUl0ZW0gPSB0aGlzLnNwZWNfZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gdmFsKTsKICAgICAgdGFyZ2V0W2luZGV4U10uZ3JvdXBTcGVjTmFtZSA9IHNwZWNEYXRhSXRlbS5zcGVjTmFtZTsKICAgICAgdGFyZ2V0W2luZGV4U10uc3BlY19kYXRhX2NoaWxkID0gc3BlY0RhdGFJdGVtLmNoaWxkIHx8IFtdOwogICAgICB0YXJnZXRbaW5kZXhTXS5wYXJhbXMgPSBbXTsKICAgICAgdGhpcy5za3VfbGlzdCA9IHRhcmdldDsgLy8g6YeN5o6S6KeE5qC857uE5ZCICiAgICAgIC8vIHRoaXMuc3BlY0dyb3VwUmVzdCgpCiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc2t1X2xpc3QpCiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3BlY190YWJsZV9EYXRhKQogICAgfSwKCiAgICAvLyDph43mjpLop4TmoLznu4TlkIgKICAgIHNwZWNHcm91cFJlc3QoKSB7CiAgICAgIC8vIOe8lui+kemhtemdouWtmOWCqOivpuaDheaOpeWPo+i/lOWbnuinhOagvOe7hOWQiGlkCiAgICAgIC8vIHRoaXMuc3BlY190YWJsZV9EYXRhLmZvckVhY2goaXRlbSA9PiB7CiAgICAgIC8vICAgaWYgKGl0ZW0uc3BlY0dyb3VwSGFzaCAmJiB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLmluZGV4T2YoaXRlbS5zcGVjR3JvdXBIYXNoKSA9PT0gLTEpIHsKICAgICAgLy8gICAgIHRoaXMuYmFzZV9mb3JtLmRlbFNwZWNTa3VJZHMucHVzaChpdGVtLnNwZWNHcm91cEhhc2gpCiAgICAgIC8vICAgfQogICAgICAvLyB9KQogICAgICBjb25zdCBza3VBcnIgPSB0aGlzLnNrdV9saXN0Lm1hcChpdGVtID0+IHsKICAgICAgICBpdGVtLnBhcmFtcyA9IGl0ZW0ucGFyYW1zLm1hcChpdGVtUCA9PiB7CiAgICAgICAgICByZXR1cm4geyAuLi5pdGVtUCwKICAgICAgICAgICAgZ3JvdXBTcGVjTmFtZTogaXRlbS5ncm91cFNwZWNOYW1lCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpdGVtLnBhcmFtczsKICAgICAgfSk7CiAgICAgIGxldCBza3VBcnJEbyA9IFtdOwoKICAgICAgaWYgKHNrdUFyci5sZW5ndGgpIHsKICAgICAgICBza3VBcnJEbyA9IHRoaXMuZG9FeGNoYW5nZShza3VBcnIpOwogICAgICB9IC8vIOWkh+S7veS4gOS7veinhOagvOaYjue7hu+8jOeUqOadpeWhq+WFhemHjeaOkuinhOagvOe7hOS5i+WJjeeahOWbvueJhwoKCiAgICAgIGNvbnN0IGNsb25lVW5pdERhdGEgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgIHRoaXMudW5pdF9kYXRhID0gdGhpcy51bml0X2RhdGEubWFwKChpdGVtLCBpbmRleCkgPT4gewogICAgICAgIGNvbnN0IGNsb25lU3BlY0dyb3VwID0gY2xvbmVVbml0RGF0YVtpbmRleF0uc3BlY190YWJsZV9EYXRhIHx8IFtdOwogICAgICAgIHJldHVybiB7IC4uLml0ZW0sCiAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IHNrdUFyckRvLm1hcChpdGVtU3AgPT4gewogICAgICAgICAgICBjb25zdCBpbmRleFNTID0gY2xvbmVTcGVjR3JvdXAuZmluZEluZGV4KGl0ZW1DID0+IGl0ZW1DLmlkID09PSBpdGVtU3AuaWQpOwogICAgICAgICAgICByZXR1cm4geyAuLi5pdGVtU3AsCiAgICAgICAgICAgICAgYmFyQ29kZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uYmFyQ29kZSA6IGl0ZW1TcC5iYXJDb2RlLAogICAgICAgICAgICAgIHdlaWdodDogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10ud2VpZ2h0IDogaXRlbVNwLndlaWdodCwKICAgICAgICAgICAgICBpc0RlZmF1bHQ6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmlzRGVmYXVsdCA6IGl0ZW1TcC5pc0RlZmF1bHQsCiAgICAgICAgICAgICAgc3BlY0ltYWdlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5zcGVjSW1hZ2UgOiBpdGVtU3Auc3BlY0ltYWdlLAogICAgICAgICAgICAgIGludmVudG9yeTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uaW52ZW50b3J5IDogaXRlbVNwLmludmVudG9yeSB8fCAwLAogICAgICAgICAgICAgIGlzRWRpdFNwZWM6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmlzRWRpdFNwZWMgOiBpdGVtU3AuaXNFZGl0U3BlYyB8fCA1LAogICAgICAgICAgICAgIHNhbGVQcmljZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uc2FsZVByaWNlIDogaXRlbVNwLnNhbGVQcmljZSwKICAgICAgICAgICAgICBlbmFibGVkTGFkZGVyOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5lbmFibGVkTGFkZGVyIDogaXRlbVNwLmVuYWJsZWRMYWRkZXIsCiAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmxhZGRlclByaWNlIDogaXRlbVNwLmxhZGRlclByaWNlLAogICAgICAgICAgICAgIG1hcmtldFByaWNlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5tYXJrZXRQcmljZSA6IGl0ZW1TcC5tYXJrZXRQcmljZSwKICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10ubWVtYmVyUHJpY2UgOiBpdGVtU3AubWVtYmVyUHJpY2UsCiAgICAgICAgICAgICAgc2V0TnVtOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5zZXROdW0gOiBpdGVtU3Auc2V0TnVtIHx8IDEsCiAgICAgICAgICAgICAgaXNTYWxlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5pc1NhbGUgOiBpdGVtU3AuaXNTYWxlIHx8IDUsCiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmN1c3RvbWVyVHlwZVByaWNlIDogaXRlbVNwLmN1c3RvbWVyVHlwZVByaWNlIHx8IFtdLAogICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogaW5kZXhTUyA+IC0xID8gY2xvbmVTcGVjR3JvdXBbaW5kZXhTU10uY3VzdG9tZXJUeXBlUHJpY2VPcGVuIDogaXRlbVNwLmN1c3RvbWVyVHlwZVByaWNlT3BlbiB8fCBmYWxzZSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBpbmRleFNTID4gLTEgPyBjbG9uZVNwZWNHcm91cFtpbmRleFNTXS5jdXN0b21lclByaWNlIDogaXRlbVNwLmN1c3RvbWVyUHJpY2UgfHwgW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGluZGV4U1MgPiAtMSA/IGNsb25lU3BlY0dyb3VwW2luZGV4U1NdLmN1c3RvbWVyUHJpY2VPcGVuIDogaXRlbVNwLmN1c3RvbWVyUHJpY2VPcGVuIHx8IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KQogICAgICAgIH07CiAgICAgIH0pOyAvLyDliKTmlq3mmK/lkKbmmK/lpJrlsZ7mgKcKCiAgICAgIHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID0gdGhpcy51bml0X2RhdGEuc29tZShpdGVtID0+IGl0ZW0uc3BlY190YWJsZV9EYXRhICYmIGl0ZW0uc3BlY190YWJsZV9EYXRhLmxlbmd0aCA+IDApID8gMiA6IDE7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDIgJiYgIXRoaXMudGFic19hY3RpdmUpIHsKICAgICAgICB0aGlzLnRhYnNfYWN0aXZlID0gdGhpcy51bml0X2RhdGFbMF0udW5pdE5hbWU7CiAgICAgIH0KICAgIH0sCgogICAgLy8g6KeE5qC857uE5ZCICiAgICBkb0V4Y2hhbmdlKGRvdWJsZUFycmF5cykgewogICAgICBjb25zdCBsZW4gPSBkb3VibGVBcnJheXMubGVuZ3RoOwoKICAgICAgaWYgKGxlbiA+PSAyKSB7CiAgICAgICAgY29uc3QgbGVuMSA9IGRvdWJsZUFycmF5c1swXS5sZW5ndGg7CiAgICAgICAgY29uc3QgbGVuMiA9IGRvdWJsZUFycmF5c1sxXS5sZW5ndGg7CiAgICAgICAgY29uc3QgbmV3bGVuID0gbGVuMSAqIGxlbjI7CiAgICAgICAgY29uc3QgdGVtcCA9IG5ldyBBcnJheShuZXdsZW4pOwogICAgICAgIGxldCBpbmRleCA9IDA7CgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuMTsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxlbjI7IGorKykgewogICAgICAgICAgICB0ZW1wW2luZGV4XSA9IHsKICAgICAgICAgICAgICBncm91cFNwZWNJZDogZG91YmxlQXJyYXlzWzBdW2ldLmdyb3VwU3BlY0lkICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLmdyb3VwU3BlY0lkLAogICAgICAgICAgICAgIGdyb3VwU3BlY05hbWU6IGRvdWJsZUFycmF5c1swXVtpXS5ncm91cFNwZWNOYW1lICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLmdyb3VwU3BlY05hbWUsCiAgICAgICAgICAgICAgaWQ6IGRvdWJsZUFycmF5c1swXVtpXS5pZCArICJfIiArIGRvdWJsZUFycmF5c1sxXVtqXS5pZCwKICAgICAgICAgICAgICBzcGVjTmFtZTogZG91YmxlQXJyYXlzWzBdW2ldLnNwZWNOYW1lICsgIl8iICsgZG91YmxlQXJyYXlzWzFdW2pdLnNwZWNOYW1lLAogICAgICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgICAgICB1cmw6ICIiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBzZXROdW06IDEsCiAgICAgICAgICAgICAgaXNTYWxlOiA1LAogICAgICAgICAgICAgIHNhbGVQcmljZTogMC4wMSwKICAgICAgICAgICAgICBlbmFibGVkTGFkZGVyOiAwLAogICAgICAgICAgICAgIGxhZGRlclByaWNlOiBbXSwKICAgICAgICAgICAgICBtYXJrZXRQcmljZTogMC4wMSwKICAgICAgICAgICAgICBtZW1iZXJQcmljZTogIiIsCiAgICAgICAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICAgICAgICBpc0RlZmF1bHQ6IDQsCiAgICAgICAgICAgICAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZTogW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBsZXQgbmV3QXJyYXkgPSBuZXcgQXJyYXkobGVuIC0gMSk7CiAgICAgICAgbmV3QXJyYXlbMF0gPSB0ZW1wOwoKICAgICAgICBpZiAobGVuID4gMikgewogICAgICAgICAgbGV0IF9jb3VudCA9IDE7CgogICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICBuZXdBcnJheVtfY291bnRdID0gZG91YmxlQXJyYXlzW2ldOwogICAgICAgICAgICBfY291bnQrKzsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLmRvRXhjaGFuZ2UobmV3QXJyYXkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBkb3VibGVBcnJheXNbMF0ubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgc3BlY0ltYWdlOiB7CiAgICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICBzZXROdW06IDEsCiAgICAgICAgICAgIGlzU2FsZTogNSwKICAgICAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgICAgIHdlaWdodDogIiIsCiAgICAgICAgICAgIGlzRGVmYXVsdDogNCwKICAgICAgICAgICAgc2FsZVByaWNlOiAwLjAxLAogICAgICAgICAgICBlbmFibGVkTGFkZGVyOiAwLAogICAgICAgICAgICBsYWRkZXJQcmljZTogW10sCiAgICAgICAgICAgIG1hcmtldFByaWNlOiAwLjAxLAogICAgICAgICAgICBtZW1iZXJQcmljZTogIiIsCiAgICAgICAgICAgIC8vIOWuouaIt+exu+Wei+WSjOWuouaIt+W/q+mAn+iwg+S7twogICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3BlbjogZmFsc2UsCiAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IFtdLAogICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sCgogICAgLy8g6Ieq5a6a5LmJ5bGe5oCn5YC86L6T5YWl5qGG56Gu5a6aICDmt7vliqDoh6rlrprkuYnlsZ7mgKcKICAgIGFzeW5jIHNlbGZTcGVjQ29uZmlybShpbmRleCkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnNrdV9saXN0KTsKCiAgICAgIGlmICghdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfdmFsKSB7CiAgICAgICAgdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfaW5wdXQgPSBmYWxzZTsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGRlZmluZVNwZWMoewogICAgICAgIHNwZWNOYW1lOiB0YXJnZXRbaW5kZXhdLnNlbGZfc3BlY192YWwsCiAgICAgICAgcGlkOiB0YXJnZXRbaW5kZXhdLmdyb3VwU3BlY0lkLAogICAgICAgIGhpZGRlbjogNAogICAgICB9KTsKICAgICAgdGFyZ2V0W2luZGV4XS5zZWxmX3NwZWNfaW5wdXQgPSBmYWxzZTsKICAgICAgdGFyZ2V0W2luZGV4XS5wYXJhbXMucHVzaCh7CiAgICAgICAgc3BlY05hbWU6IGRhdGEuc3BlY05hbWUsCiAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgZ3JvdXBTcGVjSWQ6IHRhcmdldFtpbmRleF0uZ3JvdXBTcGVjSWQKICAgICAgfSk7CiAgICAgIHRhcmdldFtpbmRleF0uc2VsZl9zcGVjX3ZhbCA9ICIiOwogICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OyAvLyDph43mjpLop4TmoLznu4TlkIgKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwogICAgfSwKCiAgICAvLyDmlrDlop7op4TmoLzlgLwKICAgIGFkZFNwZWNWYWwoaW5kZXhTKSB7CiAgICAgIHRoaXMuc3BlY19tb2RlbCA9IHRydWU7CiAgICAgIHRoaXMuc3BlY19kYXRhX2NoaWxkID0gdGhpcy5za3VfbGlzdFtpbmRleFNdLnNwZWNfZGF0YV9jaGlsZDsKICAgICAgdGhpcy5zcGVjX25hbWVfaW5kZXggPSBpbmRleFM7CiAgICAgIHRoaXMuc3BlY19pdGVtX2NoZWNrID0gdGhpcy5za3VfbGlzdFtpbmRleFNdLnBhcmFtcy5tYXAoaXRlbSA9PiBpdGVtLmlkKTsgLy8g5L2/55So5bGe5oCn5YC85Y2V6YCJ5pa55rOV77yM5Li65LqG6K6+572u5YWo6YCJ6YCJ5oup5qGG54q25oCBCgogICAgICB0aGlzLnNwZWNJdGVtQ2hhbmdlKHRoaXMuc3BlY19pdGVtX2NoZWNrKTsKICAgIH0sCgogICAgLy8g6YCJ5oup5bGe5oCn5YC8CiAgICBzZWxTcGVjVmFsKCkgewogICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnNrdV9saXN0KTsKICAgICAgY29uc3Qgc3BlY3ZhbCA9IHRoaXMuc3BlY19kYXRhX2NoaWxkLmZpbHRlcihpdGVtID0+IHsKICAgICAgICByZXR1cm4gdGhpcy5zcGVjX2l0ZW1fY2hlY2suZmluZEluZGV4KGl0ZW1TID0+IGl0ZW1TID09PSBpdGVtLmlkKSA+IC0xOwogICAgICB9KS5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNwZWNOYW1lOiBpdGVtLnNwZWNOYW1lLAogICAgICAgICAgaWQ6IGl0ZW0uaWQsCiAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5waWQKICAgICAgICB9OwogICAgICB9KTsKICAgICAgdGFyZ2V0W3RoaXMuc3BlY19uYW1lX2luZGV4XS5wYXJhbXMgPSB0aGlzLiRfY29tbW9uLnVuaXF1ZSh0YXJnZXRbdGhpcy5zcGVjX25hbWVfaW5kZXhdLnBhcmFtcy5jb25jYXQoc3BlY3ZhbCksIFsiaWQiXSk7CiAgICAgIHRoaXMuc2t1X2xpc3QgPSB0YXJnZXQ7CiAgICAgIHRoaXMuc3BlY19tb2RlbCA9IGZhbHNlOyAvLyDph43mjpLop4TmoLznu4TlkIgKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwogICAgfSwKCiAgICAvLyDlsZ7mgKflgLzlhajpgIkKICAgIGNoZWNrQWxsU3BlY0NoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5pc19pbmRldGVybWluYXRlX3NwZWMgPSBmYWxzZTsKCiAgICAgIGlmICh2YWwpIHsKICAgICAgICB0aGlzLnNwZWNfaXRlbV9jaGVjayA9IHRoaXMuc3BlY19kYXRhX2NoaWxkLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBpdGVtLmlkOwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuc3BlY19pdGVtX2NoZWNrID0gW107CiAgICAgIH0KICAgIH0sCgogICAgLy8g5bGe5oCn5YC85Y2V6YCJCiAgICBzcGVjSXRlbUNoYW5nZSh2YWwpIHsKICAgICAgbGV0IGNoZWNrZWRDb3VudCA9IHZhbC5sZW5ndGg7CiAgICAgIHRoaXMuc3BlY19jaGVja19hbGwgPSBjaGVja2VkQ291bnQgPT09IHRoaXMuc3BlY19kYXRhX2NoaWxkLmxlbmd0aDsKICAgICAgdGhpcy5pc19pbmRldGVybWluYXRlX3NwZWMgPSBjaGVja2VkQ291bnQgPiAwICYmIGNoZWNrZWRDb3VudCA8IHRoaXMuc3BlY19kYXRhX2NoaWxkLmxlbmd0aDsKICAgIH0sCgogICAgLy8g5Yig6Zmk6KeE5qC85YC8CiAgICBkZWxTcGVjVmFsKGluZGV4QywgaW5kZXhTLCBpdGVtQykgewogICAgICB0aGlzLiRjb25maXJtKCLnoa7lrpropoHliKDpmaTor6Xop4TmoLzlgLzlkJc/IiwgIuaPkOekuiIsIHsKICAgICAgICBjb25maXJtQnV0dG9uVGV4dDogIuehruWumiIsCiAgICAgICAgY2FuY2VsQnV0dG9uVGV4dDogIuWPlua2iCIsCiAgICAgICAgdHlwZTogIndhcm5pbmciCiAgICAgIH0pLnRoZW4oYXN5bmMgKCkgPT4gewogICAgICAgIC8vIOe8lui+kemhtemdouinhOagvOaYjue7huaTjeS9nAogICAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgICB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzID0gdGhpcy5zcGVjX3RhYmxlX0RhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZS5pbmRleE9mKGl0ZW1DLnNwZWNOYW1lKSA+IC0xKS5tYXAoaXRlbU0gPT4gewogICAgICAgICAgICByZXR1cm4gaXRlbU0uc3BlY0dyb3VwSGFzaDsKICAgICAgICAgIH0pOwogICAgICAgIH0gLy8g5paw5aKe6aG16Z2i6KeE5qC85piO57uG5pON5L2cCgoKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtVSA9PiB7CiAgICAgICAgICByZXR1cm4geyAuLi5pdGVtVSwKICAgICAgICAgICAgc3BlY190YWJsZV9EYXRhOiBpdGVtVS5zcGVjX3RhYmxlX0RhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZS5pbmRleE9mKGl0ZW1DLnNwZWNOYW1lKSA9PT0gLTEpCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMuc2t1X2xpc3QpOwogICAgICAgIHRhcmdldFtpbmRleFNdLnBhcmFtcy5zcGxpY2UoaW5kZXhDLCAxKTsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gdGFyZ2V0OwogICAgICB9KTsKICAgIH0sCgogICAgLy8g5Yig6Zmk6KeE5qC857uECiAgICBkZWxHcm91cFNwZWNJZChpbmRleFMpIHsKICAgICAgdGhpcy4kY29uZmlybSgi56Gu5a6a6KaB5Yig6Zmk6K+l6KeE5qC857uE5ZCXPyIsICLmj5DnpLoiLCB7CiAgICAgICAgY29uZmlybUJ1dHRvblRleHQ6ICLnoa7lrpoiLAogICAgICAgIGNhbmNlbEJ1dHRvblRleHQ6ICLlj5bmtogiLAogICAgICAgIHR5cGU6ICJ3YXJuaW5nIgogICAgICB9KS50aGVuKGFzeW5jICgpID0+IHsKICAgICAgICB0aGlzLnNrdV9saXN0LnNwbGljZShpbmRleFMsIDEpOwoKICAgICAgICBpZiAodGhpcy5nb29kc19pZCkgewogICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsU3BlY1NrdUlkcyA9IHRoaXMuYmFzZV9mb3JtLnNwZWNNdWx0aXBsZS5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgIHJldHVybiBpdGVtLnNwZWNHcm91cEhhc2g7CiAgICAgICAgICB9KTsKICAgICAgICB9IC8vIOmHjeaOkuinhOagvOe7hOWQiAoKCiAgICAgICAgdGhpcy5zcGVjR3JvdXBSZXN0KCk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5blsZ7mgKfliJfooagKICAgIGFzeW5jIFNwZWNNYW5hZ2VnZXRBbGwoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhLAogICAgICAgIHBhZ2VUb3RhbAogICAgICB9ID0gYXdhaXQgU3BlY01hbmFnZWdldEFsbCh7CiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogNTAKICAgICAgfSk7CiAgICAgIHRoaXMuc3BlY19kYXRhID0gZGF0YS5maWx0ZXIoaXRlbSA9PiBpdGVtLnNwZWNOYW1lICE9PSAi6K6h6YeP5Y2V5L2NIik7IC8vIHRoaXMudW5pdF9vcHRpb25zID0gZGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5zcGVjTmFtZSA9PT0gJ+iuoemHj+WNleS9jScpLmNoaWxkCiAgICB9LAoKICAgIC8vIOmAieaLqeWbvueJhwogICAgdXBsb2FkU3VjY2Vzcyh2YWwsIHJlcywgZmlsZSwgZmlsZUxpc3QpIHsKICAgICAgY29uc3QgaW1nQXJyID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwoKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLmltYWdlcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5pbWFnZXMgPSB0aGlzLmJhc2VfZm9ybS5pbWFnZXMuY29uY2F0KGltZ0Fycik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gaW1nQXJyOwogICAgICB9CgogICAgICB0aGlzLmltZ19saXN0ID0gdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzLm1hcChpdGVtID0+IHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICBjb250ZW50OiBpdGVtCiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9LAoKICAgIGltZ1NvcnRDaGFuZ2UoZmlsZUxpc3QpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwogICAgfSwKCiAgICB1cGxvYWRSZW1vdmUoZmlsZSwgZmlsZUxpc3QpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzID0gZmlsZUxpc3QubWFwKGl0ZW0gPT4gewogICAgICAgIHJldHVybiBpdGVtLmNvbnRlbnQ7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDlhbPplK7or43liKDpmaQKICAgIGhhbmRsZUNsb3NlKHRhZykgewogICAgICB0aGlzLmR5bmFtaWNUYWdzLnNwbGljZSh0aGlzLmR5bmFtaWNUYWdzLmluZGV4T2YodGFnKSwgMSk7CiAgICB9LAoKICAgIC8vIOWFs+mUruivjeaYvuekuui+k+WFpeahhgogICAgc2hvd0lucHV0KCkgewogICAgICB0aGlzLmlucHV0VmlzaWJsZSA9IHRydWU7CiAgICAgIHRoaXMuJG5leHRUaWNrKF8gPT4gewogICAgICAgIHRoaXMuJHJlZnMuc2F2ZVRhZ0lucHV0LiRyZWZzLmlucHV0LmZvY3VzKCk7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDlhbPplK7or43mmL7npLrovpPlhaXnoa7lrpoKICAgIGhhbmRsZUlucHV0Q29uZmlybSgpIHsKICAgICAgbGV0IGlucHV0VmFsdWUgPSB0aGlzLmlucHV0VmFsdWU7CgogICAgICBpZiAoaW5wdXRWYWx1ZSkgewogICAgICAgIHRoaXMuZHluYW1pY1RhZ3MucHVzaChpbnB1dFZhbHVlKTsKICAgICAgfQoKICAgICAgdGhpcy5pbnB1dFZpc2libGUgPSBmYWxzZTsKICAgICAgdGhpcy5pbnB1dFZhbHVlID0gIiI7CiAgICB9LAoKICAgIC8vIOWFs+mUruivjUVORAogICAgLy8g6K6+572u6K6h6YeP5Y2V5L2NCiAgICAvLyDliKDpmaTovoXliqnljZXkvY0KICAgIGRlbEZ1VW5pdChyb3csIGl0KSB7CiAgICAgIHRoaXMuYmFzZV9mb3JtLmJyYW5jaFVuaXQuc3BsaWNlKGl0LCAxKTsKCiAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgaWYgKHJvdy51bml0SWQgJiYgdGhpcy5iYXNlX2Zvcm0uZGVsVW5pdElkcy5pbmRleE9mKHJvdy51bml0SWQpID09PSAtMSkgewogICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsVW5pdElkcy5wdXNoKHJvdy51bml0SWQpOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qgc3BlYyA9IHRoaXMudW5pdF9kYXRhLmZpbmQoaXRlbSA9PiBpdGVtLnVuaXROYW1lID09PSByb3cudW5pdE5hbWUpOwoKICAgICAgICBpZiAoc3BlYyAmJiBzcGVjLnNwZWNHcm91cEhhc2gpIHsKICAgICAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLmluZGV4T2Yoc3BlYy5zcGVjR3JvdXBIYXNoKSA9PT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5iYXNlX2Zvcm0uZGVsU3BlY1NrdUlkcy5wdXNoKHNwZWMuc3BlY0dyb3VwSGFzaCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLnVuaXRfZGF0YS5zcGxpY2UoaXQgKyAxLCAxKTsKICAgIH0sCgogICAgLy8g5paw5aKe6L6F5Yqp5Y2V5L2NCiAgICBhZGRGdVVuaXQoKSB7CiAgICAgIHRoaXMuYXNzaXN0X21vZGVsID0gdHJ1ZTsKICAgICAgdGhpcy5lZGl0X2Fzc2lzdF9tb2RlbCA9IGZhbHNlOwogICAgICB0aGlzLmFzc2lzdF9mb3JtID0gewogICAgICAgIHVuaXROYW1lOiAiIiwKICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICB1bml0SWQ6ICIiLAogICAgICAgIGNvbnZlcnNpb246ICIiCiAgICAgIH07CiAgICB9LAoKICAgIC8vIOS/ruaUuemZhOWNleS9jQogICAgRWRpdEZ1VW5pdChpdCkgewogICAgICB0aGlzLmFzc2lzdF9tb2RlbCA9IHRydWU7CiAgICAgIHRoaXMuZWRpdF9hc3Npc3RfbW9kZWwgPSB0cnVlOwogICAgICB0aGlzLmFzc2lzdF9mb3JtID0gdGhpcy5iYXNlX2Zvcm0uYnJhbmNoVW5pdFtpdF07CiAgICAgIHRoaXMuYXNzaXN0X2luZGV4ID0gaXQ7CiAgICB9LAoKICAgIC8vIOW8ueeql+aPkOS6pCDovoXliqnljZXkvY0KICAgIHN1YkFzc2lzdCgpIHsKICAgICAgaWYgKCF0aGlzLmFzc2lzdF9mb3JtLmNvbnZlcnNpb24pIHsKICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoIuivt+i+k+WFpeWNleS9jeaNoueul+WFs+ezuyIpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgaWYgKCF0aGlzLmFzc2lzdF9mb3JtLnVuaXROYW1lKSB7CiAgICAgICAgdGhpcy4kbWVzc2FnZS53YXJuaW5nKCLor7fpgInmi6novoXliqnljZXkvY0iKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHRoaXMuYmFzZV9mb3JtLmJyYW5jaFVuaXQucHVzaCh7IC4uLnRoaXMuYXNzaXN0X2Zvcm0sCiAgICAgICAgaXNFZGl0U3BlYzogNQogICAgICB9KTsKCiAgICAgIGlmICh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSA9PT0gMikgewogICAgICAgIGNvbnN0IHNwZWNUYWJsZURhdGEgPSB0aGlzLnVuaXRfZGF0YVswXSA/IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhWzBdLnNwZWNfdGFibGVfRGF0YSB8fCBbXSkgOiBbXTsKICAgICAgICB0aGlzLnVuaXRfZGF0YS5wdXNoKHsgLi4udGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy5hc3Npc3RfZm9ybSksCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgIH0sCiAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IHNwZWNUYWJsZURhdGEKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YS5wdXNoKHsgLi4udGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy5hc3Npc3RfZm9ybSksCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNCwKICAgICAgICAgIGlzRWRpdFNwZWM6IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgbmFtZTogIiIsCiAgICAgICAgICAgIHVybDogIiIKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSAvLyDph43mjpLop4TmoLznu4TlkIgKCgogICAgICB0aGlzLnNwZWNHcm91cFJlc3QoKTsKICAgICAgdGhpcy5hc3Npc3RfbW9kZWwgPSBmYWxzZTsKICAgIH0sCgogICAgLy8g5Z+65pys5Y2V5L2N5YiH5o2iCiAgICBtYXN0ZXJVbml0Q2hhbmdlKHZhbCkgewogICAgICB0aGlzLmJhc2VfZm9ybS5tYXN0ZXJVbml0LnVuaXROYW1lID0gdGhpcy51bml0X29wdGlvbnMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IHZhbCkudW5pdE5hbWU7CiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy51bml0X2RhdGEuZmluZEluZGV4KGl0ZW0gPT4gaXRlbS5pc01hc3RlciA9PT0gNSk7CgogICAgICBpZiAoaW5kZXggPT09IC0xKSB7CiAgICAgICAgdGhpcy51bml0X2RhdGEudW5zaGlmdCh7IC4uLnRoaXMuYmFzZV9mb3JtLm1hc3RlclVuaXQsCiAgICAgICAgICAuLi50aGlzLiRfY29tbW9uLmRlZXBDbG9uZShwcmljZURhdGFMaSksCiAgICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICBuYW1lOiAiIiwKICAgICAgICAgICAgdXJsOiAiIgogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMuJHNldCh0aGlzLnVuaXRfZGF0YSwgaW5kZXgsIHsgLi4udGhpcy51bml0X2RhdGFbaW5kZXhdLAogICAgICAgICAgLi4udGhpcy5iYXNlX2Zvcm0ubWFzdGVyVW5pdAogICAgICAgIH0pOwogICAgICB9IC8vIOmHjeaOkuinhOagvOe7hOWQiAoKCiAgICAgIHRoaXMuc3BlY0dyb3VwUmVzdCgpOwoKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAyKSB7CiAgICAgICAgdGhpcy50YWJzX2FjdGl2ZSA9IHRoaXMudW5pdF9kYXRhWzBdLnVuaXROYW1lOwogICAgICB9CiAgICB9LAoKICAgIC8vIOi+heWKqeWNleS9jeWIh+aNogogICAgYnJhbmNoVW5pdENoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5hc3Npc3RfZm9ybS51bml0TmFtZSA9IHRoaXMudW5pdF9vcHRpb25zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSB2YWwpLnVuaXROYW1lOwogICAgfSwKCiAgICAvLyDojrflj5bor6bmg4UKICAgIGFzeW5jIGdldEdvb2RzQmFzaWNJbmZvQnlJZCgpIHsKICAgICAgY29uc3QgewogICAgICAgIGRhdGEKICAgICAgfSA9IGF3YWl0IGdldFF1aWNrR29vZHNJbmZvKHRoaXMuZ29vZHNfaWQpOwogICAgICB0aGlzLnJlZ2lvbl9hcnIgPSBkYXRhLm5vdEFyZWE7CiAgICAgIHRoaXMuY3VzdG9tZXJfdHlwZV9jaGVjayA9IGRhdGEubm90Q3VzdG9tZXJUeXBlID8gZGF0YS5ub3RDdXN0b21lclR5cGUuc3BsaXQoIiwiKS5tYXAoaXRlbSA9PiBwYXJzZUludChpdGVtKSkgOiBbXTsKICAgICAgdGhpcy5jdXN0b21lcl9saXN0ID0gZGF0YS5ub3RDdXN0b21lckxpc3RzIHx8IFtdOwogICAgICB0aGlzLmlzRWRpdFNwZWMgPSBkYXRhLmlzRWRpdFNwZWM7IC8vIHJldHVybgoKICAgICAgbGV0IG1hc3RlclVuaXQgPSBkYXRhLnVuaXREYXRhLmZpbmQoaXRlbSA9PiBpdGVtLmlzTWFzdGVyID09PSA1KSB8fCB7CiAgICAgICAgYmFyQ29kZTogIiIsCiAgICAgICAgd2VpZ2h0OiAiIiwKICAgICAgICBpc01hc3RlcjogNSwKICAgICAgICBpc0RlZmF1bHQ6IDUsCiAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgIHVuaXRJZDogIiIKICAgICAgfTsKICAgICAgdGhpcy5pc05ldyA9IG1hc3RlclVuaXQgPyBtYXN0ZXJVbml0LmlzTmV3IHx8IDQgOiA0OwogICAgICBsZXQgYnJhbmNoVW5pdCA9IFtdOwoKICAgICAgaWYgKGRhdGEuc3BlY1R5cGUgPT09IDIpIHsKICAgICAgICBjb25zdCB1bml0RGF0YSA9IGRhdGEudW5pdERhdGEuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pc01hc3RlciA9PT0gNCk7CiAgICAgICAgYnJhbmNoVW5pdCA9ICh1bml0RGF0YSB8fCBbXSkubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgaXNFZGl0U3BlYzogZGF0YS5pc0VkaXRTcGVjCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgaWYgKGRhdGEuc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICBjb25zdCB1bml0RGF0YSA9IGRhdGEuc3BlY011bHRpcGxlLmZpbHRlcihpdGVtID0+IGl0ZW0uaXNNYXN0ZXIgPT09IDQpOwogICAgICAgIGJyYW5jaFVuaXQgPSAodW5pdERhdGEgfHwgW10pLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvbnZlcnNpb246IGl0ZW0uY29udmVyc2lvbiwKICAgICAgICAgICAgaWQ6IGl0ZW0uaWQsCiAgICAgICAgICAgIGlzTWFzdGVyOiBpdGVtLmlzTWFzdGVyLAogICAgICAgICAgICB1bml0SWQ6IGl0ZW0udW5pdElkLAogICAgICAgICAgICB1bml0TmFtZTogaXRlbS51bml0TmFtZSwKICAgICAgICAgICAgaXNFZGl0U3BlYzogaXRlbS5pc0VkaXRTcGVjCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CgogICAgICB0aGlzLmJhc2VfZm9ybSA9IHsgLi4uZGF0YSwKICAgICAgICBtYXN0ZXJVbml0OiBtYXN0ZXJVbml0LAogICAgICAgIHN0b3JhZ2U6IGRhdGEuc3RvcmFnZSwKICAgICAgICBkZWxVbml0SWRzOiBbXSwKICAgICAgICBkZWxTcGVjU2t1SWRzOiBbXSwKICAgICAgICBzcGVjVHlwZTogZGF0YS5zcGVjVHlwZSwKICAgICAgICBicmFuY2hVbml0OiBicmFuY2hVbml0LAogICAgICAgIGNhdGVnb3J5UGF0aDogZGF0YS5jYXRlZ29yeVBhdGggPyBkYXRhLmNhdGVnb3J5UGF0aC5zcGxpdCgiLCIpLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChpdGVtKTsKICAgICAgICB9KSA6IFtdLAogICAgICAgIGNhdGVnb3J5SWQ6IGRhdGEuY2F0ZWdvcnlJZCwKICAgICAgICBhc3Npc3RDYXRlZ29yeUlkOiBkYXRhLmFzc2lzdENhdGVnb3J5SWQsCiAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoOiBkYXRhLmFzc2lzdENhdGVnb3J5UGF0aCB8fCBbXSwKICAgICAgICBpc0VxOiBkYXRhLmlzRXEsCiAgICAgICAgLy8g5oqE56CB5ZWG5ZOBCiAgICAgICAgaXNEaXN0cmlidXRpb246IGRhdGEuaXNEaXN0cmlidXRpb24sCiAgICAgICAgLy8g6LSf5bqT5a2Y6ZSA5ZSuCiAgICAgICAgaXNTaGllbGQ6IGRhdGEuaXNTaGllbGQsCiAgICAgICAgLy8g57uP6JCl5bGP6JS9CiAgICAgICAgZGVsaXZlcnlTdXBJZHM6IGRhdGEuZGVsaXZlcnlTdXBJZHMuc3BsaXQoIiwiKSwKICAgICAgICAvLyDnianmtYHmlK/mjIEg5Zu65a6a5YC8IDEg5b+r6YCSIDIg6Ieq5o+QIOS8oOWPguagvOW8j++8mjEsMgogICAgICAgIGV4cHJlc3NUeXBlOiBkYXRhLmV4cHJlc3NUeXBlLAogICAgICAgIC8vIOW/q+mAkui/kOi0uSAxIOWMhemCriAyIOi/kOi0ueaooeeJiCAzIOWbuuWumui0ueeUqAogICAgICAgIGV4cHJlc3NGZWU6IGRhdGEuZXhwcmVzc0ZlZSwKICAgICAgICAvLyDlm7rlrprotLnnlKgKICAgICAgICBzaG93RXhwcmVzczogZGF0YS5zaG93RXhwcmVzcywKICAgICAgICAvLyDmmK/lkKblsZXnpLrlv6vpgJIgNeWxleekuiA05LiN5bGV56S6CiAgICAgICAgcnVsZUlkOiBkYXRhLnJ1bGVJZCAvLyDov5DotLnmqKHniYhpZAoKICAgICAgfTsgLy8g5Ymv5YiG57G7CgogICAgICBpZiAoZGF0YS5hc3Npc3RDYXRlZ29yeVBhdGggJiYgZGF0YS5hc3Npc3RDYXRlZ29yeVBhdGgubGVuZ3RoKSB7CiAgICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IGRhdGEuYXNzaXN0Q2F0ZWdvcnlQYXRoLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogaXRlbS5zcGxpdCgiLCIpLm1hcChpdGVtZSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGl0ZW1lKTsKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhpcy5hc3Npc3RfY2F0ZSA9IFt7CiAgICAgICAgICBhc3Npc3RDYXRlZ29yeVBhdGg6IFtdCiAgICAgICAgfV07CiAgICAgIH0KCiAgICAgIHRoaXMuaW1nX2xpc3QgPSBkYXRhLmltYWdlcy5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgdXJsOiBpdGVtCiAgICAgICAgfTsKICAgICAgfSk7CiAgICAgIHRoaXMuZHluYW1pY1RhZ3MgPSBkYXRhLnRhZy5maWx0ZXIoaXRlbSA9PiAhIWl0ZW0pOyAvLyDlpJrop4TmoLzmlbDmja4KCiAgICAgIGlmIChwYXJzZUludCh0aGlzLmJhc2VfZm9ybS5zcGVjVHlwZSkgPT09IDIpIHsKICAgICAgICB0aGlzLnNrdV9saXN0ID0gZGF0YS5zcGVjR3JvdXAubWFwKGl0ZW0gPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc3BlY19kYXRhX2NoaWxkOiB0aGlzLnNwZWNfZGF0YS5maW5kKGl0ZW1GID0+IGl0ZW1GLmlkID09PSBpdGVtLmdyb3VwU3BlYy5zcGVjSWQpLmNoaWxkLAogICAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5ncm91cFNwZWMuc3BlY0lkLAogICAgICAgICAgICBncm91cFNwZWNOYW1lOiBpdGVtLmdyb3VwU3BlYy5zcGVjTmFtZSwKICAgICAgICAgICAgc2VsZl9zcGVjX3ZhbDogIiIsCiAgICAgICAgICAgIHNlbGZfc3BlY19pbnB1dDogZmFsc2UsCiAgICAgICAgICAgIHBhcmFtczogaXRlbS5wYXJhbXMubWFwKGl0ZW1DID0+IHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IGl0ZW1DLnNwZWNWYWx1ZUlkLAogICAgICAgICAgICAgICAgc3BlY05hbWU6IGl0ZW1DLnNwZWNWYWx1ZU5hbWUsCiAgICAgICAgICAgICAgICBncm91cFNwZWNJZDogaXRlbS5ncm91cFNwZWMuc3BlY0lkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkKICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSBkYXRhLnVuaXREYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgIGNvbnN0IHNwZWNUYWJsZURhdGEgPSBkYXRhLnNwZWNNdWx0aXBsZS5maWx0ZXIoaXRlbVUgPT4gaXRlbVUudW5pdElkID09PSBpdGVtLnVuaXRJZCkubWFwKGl0ZW1TUCA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgaXNFZGl0U3BlYzogaXRlbVNQLmlzRWRpdFNwZWMsCiAgICAgICAgICAgICAgaW52ZW50b3J5OiBpdGVtU1AuaW52ZW50b3J5IC0gMCwKICAgICAgICAgICAgICBzcGVjR3JvdXBIYXNoOiBpdGVtU1Auc3BlY0dyb3VwSGFzaCwKICAgICAgICAgICAgICBpZF9EOiBpdGVtU1AuaWQsCiAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbVNQLmNvbnZlcnNpb24sCiAgICAgICAgICAgICAgdW5pdElkOiBpdGVtU1AudW5pdElkLAogICAgICAgICAgICAgIHNwZWNOYW1lOiAoaXRlbVNQLnNwZWNHcm91cCB8fCBbXSkubWFwKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtUC5zcGVjVmFsdWVOYW1lOwogICAgICAgICAgICAgIH0pLmpvaW4oIl8iKSwKICAgICAgICAgICAgICBpZDogKGl0ZW1TUC5zcGVjR3JvdXAgfHwgW10pLm1hcChpdGVtUCA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbVAuc3BlY1ZhbHVlSWQ7CiAgICAgICAgICAgICAgfSkuam9pbigiXyIpLAogICAgICAgICAgICAgIGdyb3VwU3BlY0lkOiAoaXRlbVNQLnNwZWNHcm91cCB8fCBbXSkubWFwKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtUC5zcGVjSWQ7CiAgICAgICAgICAgICAgfSkuam9pbigiXyIpLAogICAgICAgICAgICAgIGdyb3VwU3BlY05hbWU6IChpdGVtU1Auc3BlY0dyb3VwIHx8IFtdKS5tYXAoaXRlbVAgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1QLnNwZWNOYW1lOwogICAgICAgICAgICAgIH0pLmpvaW4oIl8iKSwKICAgICAgICAgICAgICBzcGVjSW1hZ2U6IHsKICAgICAgICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgICAgICAgdXJsOiBpdGVtU1Auc3BlY0ltYWdlIHx8ICIiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICBiYXJDb2RlOiBpdGVtU1AuYmFyQ29kZSwKICAgICAgICAgICAgICB3ZWlnaHQ6IGl0ZW1TUC53ZWlnaHQsCiAgICAgICAgICAgICAgaXNEZWZhdWx0OiBpdGVtU1AuaXNEZWZhdWx0LAogICAgICAgICAgICAgIHNhbGVQcmljZTogaXRlbVNQLnNhbGVQcmljZS5zYWxlUHJpY2UsCiAgICAgICAgICAgICAgZW5hYmxlZExhZGRlcjogaXRlbVNQLnNhbGVQcmljZS5lbmFibGVkTGFkZGVyLAogICAgICAgICAgICAgIGxhZGRlclByaWNlOiBpdGVtU1Auc2FsZVByaWNlLmxhZGRlclByaWNlLAogICAgICAgICAgICAgIG1hcmtldFByaWNlOiBpdGVtU1Auc2FsZVByaWNlLm1hcmtldFByaWNlLAogICAgICAgICAgICAgIG1lbWJlclByaWNlOiBpdGVtU1AubWVtYmVyUHJpY2UsCiAgICAgICAgICAgICAgc2V0TnVtOiBpdGVtU1Auc2FsZVByaWNlLnNldE51bSwKICAgICAgICAgICAgICBpc1NhbGU6IGl0ZW1TUC5pc1NhbGUgfHwgNSwKICAgICAgICAgICAgICAvLyDlrqLmiLfnsbvlnovlkozlrqLmiLflv6vpgJ/osIPku7cKICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogW10sCiAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2VPcGVuOiBmYWxzZSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBbXSwKICAgICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgc3BlY190YWJsZV9EYXRhOiBzcGVjVGFibGVEYXRhCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIHRoaXMudGFic19hY3RpdmUgPSB0aGlzLnVuaXRfZGF0YVswXS51bml0TmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IGRhdGEuc3BlY011bHRpcGxlLm1hcChpdGVtID0+IHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlzRWRpdFNwZWM6IGl0ZW0uaXNFZGl0U3BlYywKICAgICAgICAgICAgaW52ZW50b3J5OiBpdGVtLmludmVudG9yeSAtIDAsCiAgICAgICAgICAgIHNwZWNHcm91cEhhc2g6IGl0ZW0uc3BlY0dyb3VwSGFzaCwKICAgICAgICAgICAgaWRfRDogaXRlbS5pZCwKICAgICAgICAgICAgaXNNYXN0ZXI6IGl0ZW0uaXNNYXN0ZXIsCiAgICAgICAgICAgIGNvbnZlcnNpb246IGl0ZW0uY29udmVyc2lvbiwKICAgICAgICAgICAgdW5pdE5hbWU6IGl0ZW0udW5pdE5hbWUsCiAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgIHNwZWNJbWFnZTogewogICAgICAgICAgICAgIG5hbWU6ICIiLAogICAgICAgICAgICAgIHVybDogaXRlbS5zcGVjSW1hZ2UgfHwgIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYmFyQ29kZTogaXRlbS5iYXJDb2RlLAogICAgICAgICAgICB3ZWlnaHQ6IGl0ZW0ud2VpZ2h0LAogICAgICAgICAgICBpc0RlZmF1bHQ6IGl0ZW0uaXNEZWZhdWx0LAogICAgICAgICAgICBzYWxlUHJpY2U6IGl0ZW0uc2FsZVByaWNlLnNhbGVQcmljZSwKICAgICAgICAgICAgZW5hYmxlZExhZGRlcjogaXRlbS5zYWxlUHJpY2UuZW5hYmxlZExhZGRlciwKICAgICAgICAgICAgbGFkZGVyUHJpY2U6IGl0ZW0uc2FsZVByaWNlLmxhZGRlclByaWNlLAogICAgICAgICAgICBtYXJrZXRQcmljZTogaXRlbS5zYWxlUHJpY2UubWFya2V0UHJpY2UsCiAgICAgICAgICAgIG1lbWJlclByaWNlOiBpdGVtLm1lbWJlclByaWNlLAogICAgICAgICAgICBzZXROdW06IGl0ZW0uc2FsZVByaWNlLnNldE51bSwKICAgICAgICAgICAgaXNTYWxlOiBpdGVtLmlzU2FsZSB8fCA1LAogICAgICAgICAgICAvLyDlrqLmiLfnsbvlnovlkozlrqLmiLflv6vpgJ/osIPku7cKICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IFtdLAogICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZU9wZW46IGZhbHNlLAogICAgICAgICAgICBjdXN0b21lclByaWNlOiBbXSwKICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGZhbHNlCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IC8vIOiOt+WPluaMh+WumuWVhuWTgeeahOacgOWQjueUn+aViOeahOWuouaIt+iwg+S7t+WNleaVsOaNrgoKCiAgICAgIGF3YWl0IHRoaXMuZ2V0Q3VzdG9tZXJQcmljZUJ5R29vZHNJZHMoKTsgLy/ojrflj5bmjIflrprllYblk4HnmoTmnIDlkI7nlJ/mlYjnmoTlrqLmiLfnsbvlnovosIPku7fmlbDmja4KCiAgICAgIGF3YWl0IHRoaXMuZ2V0Q3VzdG9tZXJUeXBlUHJpY2VCeUdvb2RzSWRzKCk7CiAgICB9LAoKICAgIC8vIOWPkeW4g+WVhuWTgQogICAgYXN5bmMgc3VibWl0R29vZHMoKSB7CiAgICAgIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHRoaXMudW5pdF9kYXRhKSkKICAgICAgLy8gY29uc29sZS5sb2codGhpcy51bml0X2RhdGEpCiAgICAgIC8vIHJldHVybgogICAgICB0aGlzLiRyZWZzWyJiYXNlX2Zvcm0iXS52YWxpZGF0ZShhc3luYyB2YWxpZCA9PiB7CiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICBsZXQgc3BlY0dyb3VwID0gW107CiAgICAgICAgICBsZXQgc3BlY011bHRpcGxlID0gW107CgogICAgICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAyKSB7CiAgICAgICAgICAgIC8vIOWkmuinhOagvAogICAgICAgICAgICBzcGVjR3JvdXAgPSB0aGlzLnNrdV9saXN0Lm1hcChpdGVtID0+IHsKICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZ3JvdXBTcGVjOiB7CiAgICAgICAgICAgICAgICAgIHNwZWNOYW1lOiBpdGVtLmdyb3VwU3BlY05hbWUsCiAgICAgICAgICAgICAgICAgIHNwZWNJZDogaXRlbS5ncm91cFNwZWNJZAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHBhcmFtczogaXRlbS5wYXJhbXMubWFwKGl0ZW0gPT4gewogICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZUlkOiBpdGVtLmlkLAogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZU5hbWU6IGl0ZW0uc3BlY05hbWUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMudW5pdF9kYXRhLmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICAgICAgaXRlbS5zcGVjX3RhYmxlX0RhdGEuZm9yRWFjaChpdGVtU1AgPT4gewogICAgICAgICAgICAgICAgbGV0IHNwZWNJZEcgPSAoaXRlbVNQLmlkICsgIiIpLnNwbGl0KCJfIik7CiAgICAgICAgICAgICAgICBsZXQgc3BlY05hbWVHID0gaXRlbVNQLnNwZWNOYW1lLnNwbGl0KCJfIik7CiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBTcGVjTmFtZUcgPSBpdGVtU1AuZ3JvdXBTcGVjTmFtZS5zcGxpdCgiXyIpOwogICAgICAgICAgICAgICAgbGV0IGdyb3VwU3BlY0lkRyA9IChpdGVtU1AuZ3JvdXBTcGVjSWQgKyAiIikuc3BsaXQoIl8iKTsKICAgICAgICAgICAgICAgIGxldCBzcGVjR3JvdXBTID0gZ3JvdXBTcGVjSWRHLm1hcCgoaXRlbVVVLCBpbmRleFVVKSA9PiB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc3BlY0lkOiBncm91cFNwZWNJZEdbaW5kZXhVVV0sCiAgICAgICAgICAgICAgICAgICAgc3BlY05hbWU6IGdyb3VwU3BlY05hbWVHW2luZGV4VVVdLAogICAgICAgICAgICAgICAgICAgIHNwZWNWYWx1ZU5hbWU6IHNwZWNOYW1lR1tpbmRleFVVXSwKICAgICAgICAgICAgICAgICAgICBzcGVjVmFsdWVJZDogc3BlY0lkR1tpbmRleFVVXQogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsZXQgc2FsZVByaWNlUyA9IHsKICAgICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lICsgIl8iICsgaXRlbVNQLnNwZWNOYW1lLAogICAgICAgICAgICAgICAgICB1bml0SWQ6IGl0ZW0udW5pdElkLAogICAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgICAgZGVsZXRlU3RhdHVzOiBpdGVtU1AuZGVsZXRlU3RhdHVzIHx8IDQsCiAgICAgICAgICAgICAgICAgIGVuYWJsZWRMYWRkZXI6IGl0ZW1TUC5lbmFibGVkTGFkZGVyLAogICAgICAgICAgICAgICAgICBzYWxlUHJpY2VBcmVhVHlwZTogMSwKICAgICAgICAgICAgICAgICAgc2FsZVByaWNlOiBpdGVtU1Auc2FsZVByaWNlLAogICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVNQLmxhZGRlclByaWNlLAogICAgICAgICAgICAgICAgICBtYXJrZXRQcmljZTogaXRlbVNQLm1hcmtldFByaWNlLAogICAgICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaXRlbVNQLm1lbWJlclByaWNlLAogICAgICAgICAgICAgICAgICBzZXROdW06IGl0ZW1TUC5zZXROdW0sCiAgICAgICAgICAgICAgICAgIGlzU2FsZTogaXRlbVNQLmlzU2FsZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGxldCBjdXN0b21lclByaWNlID0gW107CiAgICAgICAgICAgICAgICBpdGVtU1AuY3VzdG9tZXJQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnByaWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IGl0ZW1QLnByaWNlLAogICAgICAgICAgICAgICAgICAgICAgdW5pdE5hbWU6IGl0ZW1QLnVuaXROYW1lLAogICAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJOYW1lOiBpdGVtUC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJJZDogaXRlbVAuaWQsCiAgICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgICAgICAgIGl0ZW1TUC5jdXN0b21lclR5cGVQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtLnByaWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgIHByaWNlOiBpdGVtUC5wcmljZSwKICAgICAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtUC51bml0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBpdGVtUC5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZTogaXRlbVAuaWQsCiAgICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBzcGVjTXVsdGlwbGUucHVzaCh7CiAgICAgICAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lLAogICAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICAgIHNwZWNJbWFnZTogaXRlbVNQLnNwZWNJbWFnZS51cmwsCiAgICAgICAgICAgICAgICAgIGlzRGVmYXVsdDogaXRlbVNQLmlzRGVmYXVsdCwKICAgICAgICAgICAgICAgICAgYmFyQ29kZTogaXRlbVNQLmJhckNvZGUsCiAgICAgICAgICAgICAgICAgIHdlaWdodDogaXRlbVNQLndlaWdodCwKICAgICAgICAgICAgICAgICAgc3BlY0dyb3VwOiBzcGVjR3JvdXBTLAogICAgICAgICAgICAgICAgICBzYWxlUHJpY2U6IHNhbGVQcmljZVMsCiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IGN1c3RvbWVyUHJpY2UsCiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8g5Y2V6KeE5qC8CiAgICAgICAgICAgIHNwZWNNdWx0aXBsZSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgICAgICBjb25zdCBzYWxlUHJpY2VTID0gewogICAgICAgICAgICAgICAgY29udmVyc2lvbjogaXRlbS5jb252ZXJzaW9uIHx8IDAsCiAgICAgICAgICAgICAgICB1bml0TmFtZTogaXRlbS51bml0TmFtZSwKICAgICAgICAgICAgICAgIHVuaXRJZDogaXRlbS51bml0SWQsCiAgICAgICAgICAgICAgICBpc01hc3RlcjogaXRlbS5pc01hc3RlciwKICAgICAgICAgICAgICAgIGRlbGV0ZVN0YXR1czogaXRlbS5kZWxldGVTdGF0dXMgfHwgNCwKICAgICAgICAgICAgICAgIGVuYWJsZWRMYWRkZXI6IGl0ZW0uZW5hYmxlZExhZGRlciwKICAgICAgICAgICAgICAgIHNhbGVQcmljZUFyZWFUeXBlOiAxLAogICAgICAgICAgICAgICAgc2FsZVByaWNlOiBpdGVtLnNhbGVQcmljZSwKICAgICAgICAgICAgICAgIGxhZGRlclByaWNlOiBpdGVtLmxhZGRlclByaWNlLAogICAgICAgICAgICAgICAgbWFya2V0UHJpY2U6IGl0ZW0ubWFya2V0UHJpY2UsCiAgICAgICAgICAgICAgICBtZW1iZXJQcmljZTogaXRlbS5tZW1iZXJQcmljZSwKICAgICAgICAgICAgICAgIHNldE51bTogaXRlbS5zZXROdW0sCiAgICAgICAgICAgICAgICBpc1NhbGU6IGl0ZW0uaXNTYWxlCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJQcmljZSA9IFtdOwogICAgICAgICAgICAgIGl0ZW0uY3VzdG9tZXJQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIGlmICghaXRlbVAucHJpY2VJZCkgewogICAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByaWNlOiBpdGVtUC5wcmljZSwKICAgICAgICAgICAgICAgICAgICB1bml0TmFtZTogaXRlbVAudW5pdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICBjdXN0b21lcklkOiBpdGVtUC5pZCwKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgbGV0IGN1c3RvbWVyVHlwZVByaWNlID0gW107CiAgICAgICAgICAgICAgaXRlbS5jdXN0b21lclR5cGVQcmljZS5mb3JFYWNoKGl0ZW1QID0+IHsKICAgICAgICAgICAgICAgIGlmICghaXRlbVAucHJpY2VJZCkgewogICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBwcmljZTogaXRlbVAucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgYWRqUHJpY2V0YWc6IGl0ZW1QLmFkalByaWNldGFnLAogICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyTmFtZTogaXRlbVAubmFtZSwKICAgICAgICAgICAgICAgICAgICBjdXN0b21lclR5cGU6IGl0ZW1QLmlkLAogICAgICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtUC51bml0TmFtZSwKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogaXRlbVAubGFkZGVyUHJpY2UKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGJhckNvZGU6IGl0ZW0uYmFyQ29kZSwKICAgICAgICAgICAgICAgIHdlaWdodDogaXRlbS53ZWlnaHQsCiAgICAgICAgICAgICAgICBpc0RlZmF1bHQ6IGl0ZW0uaXNEZWZhdWx0LAogICAgICAgICAgICAgICAgdW5pdElkOiBpdGVtLnVuaXRJZCwKICAgICAgICAgICAgICAgIHVuaXROYW1lOiBpdGVtLnVuaXROYW1lLAogICAgICAgICAgICAgICAgaXNNYXN0ZXI6IGl0ZW0uaXNNYXN0ZXIsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uOiBpdGVtLmNvbnZlcnNpb24gfHwgMCwKICAgICAgICAgICAgICAgIHNwZWNJbWFnZTogaXRlbS5zcGVjSW1hZ2UudXJsLAogICAgICAgICAgICAgICAgc3BlY0dyb3VwOiBbXSwKICAgICAgICAgICAgICAgIHNhbGVQcmljZTogc2FsZVByaWNlUywKICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IGN1c3RvbWVyUHJpY2UKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBpc0ZTYWxlID0gc3BlY011bHRpcGxlLmV2ZXJ5KGl0ZW0gPT4gaXRlbS5zYWxlUHJpY2UuaXNTYWxlID09PSA0KTsKCiAgICAgICAgICBpZiAoaXNGU2FsZSkgewogICAgICAgICAgICB0aGlzLiRtZXNzYWdlLndhcm5pbmcoIuiHs+WwkeS/neeVmeS4gOadoeinhOagvOeahOmUgOWUrueKtuaAgeS4uuOAkOWQr+eUqOOAkSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgY29uc3QgdW5pdERhdGEgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLmJhc2VfZm9ybS5icmFuY2hVbml0KTsKICAgICAgICAgIHVuaXREYXRhLnVuc2hpZnQodGhpcy5iYXNlX2Zvcm0ubWFzdGVyVW5pdCk7CiAgICAgICAgICBjb25zdCBub3RDdXN0b21lciA9IHRoaXMuY3VzdG9tZXJfbGlzdC5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgIHJldHVybiBpdGVtLmlkOwogICAgICAgICAgfSk7IC8vIOWJr+WIhuexu+aVsOaNrue7hOijhQoKICAgICAgICAgIGxldCBhc3Npc3RDYXRlZ29yeVBhdGggPSBbXTsKICAgICAgICAgIGxldCBhc3Npc3RDYXRlZ29yeUlkID0gW107IC8vIOi/h+a7pOWPquaciemAieaLqeWIhuexu+eahOaVsOaNrgoKICAgICAgICAgIGNvbnN0IGFzc2lzdENhdGUgPSB0aGlzLmFzc2lzdF9jYXRlLmZpbHRlcihpdGVtID0+ICEhaXRlbS5hc3Npc3RDYXRlZ29yeVBhdGgubGVuZ3RoKTsKICAgICAgICAgIGFzc2lzdENhdGUuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgYXNzaXN0Q2F0ZWdvcnlQYXRoLnB1c2goaXRlbS5hc3Npc3RDYXRlZ29yeVBhdGguam9pbigiLCIpKTsKICAgICAgICAgICAgYXNzaXN0Q2F0ZWdvcnlJZC5wdXNoKGl0ZW0uYXNzaXN0Q2F0ZWdvcnlQYXRoW2l0ZW0uYXNzaXN0Q2F0ZWdvcnlQYXRoLmxlbmd0aCAtIDFdKTsKICAgICAgICAgIH0pOwogICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICBtZXJjaGFudElkOiB0aGlzLmJhc2VfZm9ybS5tZXJjaGFudElkLAogICAgICAgICAgICBjYXRlZ29yeVBhdGg6IHRoaXMuYmFzZV9mb3JtLmNhdGVnb3J5UGF0aC5qb2luKCIsIiksCiAgICAgICAgICAgIGNhdGVnb3J5SWQ6IHRoaXMuYmFzZV9mb3JtLmNhdGVnb3J5SWQsCiAgICAgICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogYXNzaXN0Q2F0ZWdvcnlQYXRoLAogICAgICAgICAgICBhc3Npc3RDYXRlZ29yeUlkOiBhc3Npc3RDYXRlZ29yeUlkLmpvaW4oIiwiKSwKICAgICAgICAgICAgdGl0bGU6IHRoaXMuYmFzZV9mb3JtLnRpdGxlLAogICAgICAgICAgICBzdG9yYWdlOiB0aGlzLmJhc2VfZm9ybS5zdG9yYWdlLAogICAgICAgICAgICBkZWxVbml0SWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxVbml0SWRzLAogICAgICAgICAgICBkZWxTcGVjU2t1SWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLAogICAgICAgICAgICBzcGVjVHlwZTogdGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUsCiAgICAgICAgICAgIGNyZWF0ZVVzZXJOYW1lOiB0aGlzLnVzZXJOYW1lLAogICAgICAgICAgICBzcGVjR3JvdXA6IHNwZWNHcm91cCwKICAgICAgICAgICAgc3BlY011bHRpcGxlOiBzcGVjTXVsdGlwbGUsCiAgICAgICAgICAgIHVuaXREYXRhOiB1bml0RGF0YSwKICAgICAgICAgICAgZGVzY3JpYmU6IHRoaXMuYmFzZV9mb3JtLmRlc2NyaWJlLAogICAgICAgICAgICBjb2RlOiB0aGlzLmJhc2VfZm9ybS5jb2RlLAogICAgICAgICAgICBiYXJDb2RlOiB0aGlzLmJhc2VfZm9ybS5iYXJDb2RlLAogICAgICAgICAgICB3ZWlnaHQ6IHRoaXMuYmFzZV9mb3JtLndlaWdodCwKICAgICAgICAgICAgZXhwaXJlVGltZTogdGhpcy5iYXNlX2Zvcm0uZXhwaXJlVGltZSwKICAgICAgICAgICAgYnJhbmRJZDogdGhpcy5iYXNlX2Zvcm0uYnJhbmRJZCwKICAgICAgICAgICAgdGFnOiB0aGlzLmR5bmFtaWNUYWdzLmpvaW4oIiwiKSwKICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuYmFzZV9mb3JtLmRlc2NyaXB0aW9uLAogICAgICAgICAgICBub1NhbGVzU2hvcDogIiIsCiAgICAgICAgICAgIGltYWdlczogdGhpcy5iYXNlX2Zvcm0uaW1hZ2VzLAogICAgICAgICAgICBlbmFibGVTdGF0dXM6IHRoaXMuYmFzZV9mb3JtLmVuYWJsZVN0YXR1cywKICAgICAgICAgICAgaXNFcTogdGhpcy5iYXNlX2Zvcm0uaXNFcSwKICAgICAgICAgICAgLy/mioTnoIHllYblk4EKICAgICAgICAgICAgaXNEaXN0cmlidXRpb246IHRoaXMuYmFzZV9mb3JtLmlzRGlzdHJpYnV0aW9uLAogICAgICAgICAgICAvL+aYr+WQpui0n+W6k+WtmOmUgOWUrgogICAgICAgICAgICBpc1NoaWVsZDogdGhpcy5iYXNlX2Zvcm0uaXNTaGllbGQsCiAgICAgICAgICAgIC8v57uP6JCl5bGP6JS9CiAgICAgICAgICAgIGRlbGl2ZXJ5U3VwSWRzOiB0aGlzLmJhc2VfZm9ybS5kZWxpdmVyeVN1cElkcy5qb2luKCIsIiksCiAgICAgICAgICAgIC8vIOeJqea1geaUr+aMgSDlm7rlrprlgLwgMSDlv6vpgJIgMiDoh6rmj5Ag5Lyg5Y+C5qC85byP77yaMSwyCiAgICAgICAgICAgIGV4cHJlc3NUeXBlOiB0aGlzLmJhc2VfZm9ybS5leHByZXNzVHlwZSwKICAgICAgICAgICAgLy8g5b+r6YCS6L+Q6LS5IDEg5YyF6YKuIDIg6L+Q6LS55qih54mIIDMg5Zu65a6a6LS555SoCiAgICAgICAgICAgIGV4cHJlc3NGZWU6IHRoaXMuYmFzZV9mb3JtLmV4cHJlc3NGZWUsCiAgICAgICAgICAgIC8vIOWbuuWumui0ueeUqAogICAgICAgICAgICBzaG93RXhwcmVzczogdGhpcy5iYXNlX2Zvcm0uc2hvd0V4cHJlc3MsCiAgICAgICAgICAgIC8vIOaYr+WQpuWxleekuuW/q+mAkiA15bGV56S6IDTkuI3lsZXnpLoKICAgICAgICAgICAgcnVsZUlkOiB0aGlzLmJhc2VfZm9ybS5ydWxlSWQsCiAgICAgICAgICAgIC8vIOi/kOi0ueaooeeJiGlkCiAgICAgICAgICAgIG5vdEFyZWE6IHRoaXMuYmFzZV9mb3JtLmlzU2hpZWxkID09PSA1ID8gdGhpcy5iYXNlX2Zvcm0ubm90QXJlYSA6IFtdLAogICAgICAgICAgICAvLyDnu4/okKXlsY/olL3lnLDljLoKICAgICAgICAgICAgbm90Q3VzdG9tZXJUeXBlOiB0aGlzLmJhc2VfZm9ybS5pc1NoaWVsZCA9PT0gNSA/IHRoaXMuY3VzdG9tZXJfdHlwZV9jaGVjay5qb2luKCIsIikgOiAiIiwKICAgICAgICAgICAgLy/nu4/okKXlsY/olL0g5a6i5oi357G75Z6L5bGP6JS9CiAgICAgICAgICAgIG5vdEN1c3RvbWVyOiB0aGlzLmJhc2VfZm9ybS5pc1NoaWVsZCA9PT0gNSA/IG5vdEN1c3RvbWVyLmpvaW4oIiwiKSA6ICIiLAogICAgICAgICAgICAvL+e7j+iQpeWxj+iUvSDlrqLmiLflsY/olL0KICAgICAgICAgICAgaXNTdG9yZTogdGhpcy5zeXN0ZW1UeXBlID09PSAzCiAgICAgICAgICB9OyAvLyBjb25zb2xlLmxvZyhwYXJhbXMpCiAgICAgICAgICAvLyByZXR1cm4KCiAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlOwogICAgICAgICAgbGV0IHRhcmdldCA9IHt9OwoKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIGlmICh0aGlzLiRyb3V0ZS5wYXJhbXMuaWQpIHsKICAgICAgICAgICAgICB0YXJnZXQgPSBhd2FpdCBlZGl0UXVpY2tHb29kcyh7IC4uLnBhcmFtcywKICAgICAgICAgICAgICAgIGlkOiB0aGlzLmdvb2RzX2lkLAogICAgICAgICAgICAgICAgYmFzaWNHb29kc0lkOiB0aGlzLmJhc2VfZm9ybS5iYXNpY0dvb2RzSWQKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0YXJnZXQgPSBhd2FpdCBhZGRCYXNpY0FuZFB1Ymxpc2hHb29kcyhwYXJhbXMpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy4kbWVzc2FnZSh7CiAgICAgICAgICAgICAgdHlwZTogInN1Y2Nlc3MiLAogICAgICAgICAgICAgIG1lc3NhZ2U6ICLmj5DkuqTmiJDlip8iCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBhd2FpdCB0aGlzLmRlbFBhdXNlU2F2ZSgpOwoKICAgICAgICAgICAgaWYgKHRoaXMuc3lzdGVtVHlwZSA9PT0gMykgewogICAgICAgICAgICAgIGF3YWl0IHRoaXMuJGNsb3NlQ3VycmVudEdvRWRpdChgL2dvb2RzL3NhbGUvTWVyY2hhbnRzR29vZHNgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhd2FpdCB0aGlzLiRjbG9zZUN1cnJlbnRHb0VkaXQoYC9nb29kcy9zYWxlL1B1Ymxpc2hHb29kc2ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDllYblk4HliIbnsbvpgInmi6kKICAgIGNhdGVnb3J5Q2hhbmdlKHZhbCkgewogICAgICB0aGlzLmJhc2VfZm9ybS5jYXRlZ29yeUlkID0gdmFsW3ZhbC5sZW5ndGggLSAxXTsKICAgIH0sCgogICAgLy8g5ZWG5ZOB5Ymv5YiG57G76YCJ5oupCiAgICBjYXRlZ29yeUFzc2lzdENoYW5nZSh2YWwpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uYXNzaXN0Q2F0ZWdvcnlJZCA9IHZhbFt2YWwubGVuZ3RoIC0gMV07CiAgICB9LAoKICAgIC8vIOWTgeeJjOmAieaLqQogICAgYnJhbmRDb25maXJtKHZhbCkgewogICAgICBpZiAodmFsLmxlbmd0aCA+IDEpIHsKICAgICAgICB0aGlzLiRtZXNzYWdlKHsKICAgICAgICAgIHR5cGU6ICJlcnJvciIsCiAgICAgICAgICBtZXNzYWdlOiAi6K+36YCJ5oup5LiA5Liq5ZOB54mM77yBIgogICAgICAgIH0pOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgdGhpcy5iYXNlX2Zvcm0uYnJhbmROYW1lID0gdmFsWzBdLnRpdGxlOwogICAgICB0aGlzLmJhc2VfZm9ybS5icmFuZElkID0gdmFsWzBdLmlkOwogICAgfSwKCiAgICAvLyDorqHnrpfluILlnLrku7cKICAgIHNhbGVQcmljZUJsdXIoaW5kZXgsIGluZGV4VSkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgY29uc3QgbWFya2V0UHJpY2UgPSB0aGlzLiROUC50aW1lcyh0YXJnZXRbaW5kZXhdLnNhbGVQcmljZSwgdGhpcy5zYWxlUHJpY2VUaW1lcyk7CiAgICAgICAgdGFyZ2V0W2luZGV4XSA9IHsgLi4udGFyZ2V0W2luZGV4XSwKICAgICAgICAgIG1hcmtldFByaWNlOiBtYXJrZXRQcmljZQogICAgICAgIH07IC8vIOW9k+WJjeWkseWOu+eEpueCueeahOS4uuS4u+WNleS9jQoKICAgICAgICBpZiAodGFyZ2V0W2luZGV4XS5pc01hc3RlciA9PT0gNSkgewogICAgICAgICAgLy8g5Y2V5L2N5o2i566X5YWz57O75a2Y5Zyo5LiU6L+Z5Liq5Y2V5L2N5Li66L6F5Yqp5Y2V5L2N5LiU5b2T5YmN5Y2V5L2N5pyq6K6+572u6L+H5Lu35qC8CiAgICAgICAgICB0YXJnZXQuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0ICYmICFpdGVtLnNhbGVQcmljZSkgewogICAgICAgICAgICAgIGl0ZW0uc2FsZVByaWNlID0gdGhpcy4kTlAudGltZXModGFyZ2V0W2luZGV4XS5zYWxlUHJpY2UsIGl0ZW0uY29udmVyc2lvbik7CiAgICAgICAgICAgICAgaXRlbS5tYXJrZXRQcmljZSA9IHRoaXMuJE5QLnRpbWVzKG1hcmtldFByaWNlLCBpdGVtLmNvbnZlcnNpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudW5pdF9kYXRhW2luZGV4VV0uc3BlY190YWJsZV9EYXRhW2luZGV4XS5tYXJrZXRQcmljZSA9IHRoaXMuJE5QLnRpbWVzKHRoaXMudW5pdF9kYXRhW2luZGV4VV0uc3BlY190YWJsZV9EYXRhW2luZGV4XS5zYWxlUHJpY2UsIHRoaXMuc2FsZVByaWNlVGltZXMpOwogICAgICB9CiAgICB9LAoKICAgIC8vIOS8muWRmOS7t+WkseWOu+eEpueCuQogICAgbWVtYmVyUHJpY2VCbHVyKGluZGV4KSB7CiAgICAgIC8vIOagueaNruavlOS+i+iHquWKqOaNoueulyDkvJrlkZjku7cKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAxKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldC5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0KSB7CiAgICAgICAgICAgIGl0ZW0ubWVtYmVyUHJpY2UgPSB0aGlzLiROUC50aW1lcyh0YXJnZXRbaW5kZXhdLm1lbWJlclByaWNlLCBpdGVtLmNvbnZlcnNpb24pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIC8vIOinhOagvOaYjue7huWQjOatpeaVsOaNrgogICAgb3RoZXJTZXRQcmljZShyb3csIGluZGV4KSB7CiAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKICAgICAgdGFyZ2V0W2luZGV4XS5zcGVjX3RhYmxlX0RhdGEgPSB0YXJnZXRbaW5kZXhdLnNwZWNfdGFibGVfRGF0YS5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgIG1hcmtldFByaWNlOiByb3cubWFya2V0UHJpY2UsCiAgICAgICAgICBtZW1iZXJQcmljZTogcm93Lm1lbWJlclByaWNlLAogICAgICAgICAgc2FsZVByaWNlOiByb3cuc2FsZVByaWNlLAogICAgICAgICAgZW5hYmxlZExhZGRlcjogcm93LmVuYWJsZWRMYWRkZXIsCiAgICAgICAgICBsYWRkZXJQcmljZTogcm93LmxhZGRlclByaWNlLAogICAgICAgICAgc2V0TnVtOiByb3cuc2V0TnVtLAogICAgICAgICAgaXNTYWxlOiByb3cuaXNTYWxlIHx8IDUsCiAgICAgICAgICBzcGVjSW1hZ2U6IHJvdy5zcGVjSW1hZ2UsCiAgICAgICAgICBiYXJDb2RlOiByb3cuYmFyQ29kZSwKICAgICAgICAgIHdlaWdodDogcm93LndlaWdodCwKICAgICAgICAgIC8vIOWuouaIt+exu+Wei+WSjOWuouaIt+W/q+mAn+iwg+S7twogICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2U6IHJvdy5jdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlT3Blbjogcm93LmN1c3RvbWVyVHlwZVByaWNlT3BlbiwKICAgICAgICAgIGN1c3RvbWVyUHJpY2U6IHJvdy5jdXN0b21lclByaWNlLAogICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IHJvdy5jdXN0b21lclByaWNlT3BlbgogICAgICAgIH07CiAgICAgIH0pOwogICAgICB0aGlzLnVuaXRfZGF0YSA9IHRhcmdldDsKICAgIH0sCgogICAgLy8g6KeE5qC85piO57uG5Yig6ZmkCiAgICBzcGVjRGV0YWlsRGVsKHJvdywgaW5kZXgpIHsKICAgICAgbGV0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKCiAgICAgIGlmICh0aGlzLmdvb2RzX2lkKSB7CiAgICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLmRlbFNwZWNTa3VJZHMuaW5kZXhPZihyb3cuc3BlY0dyb3VwSGFzaCkgPT09IC0xKSB7CiAgICAgICAgICB0aGlzLmJhc2VfZm9ybS5kZWxTcGVjU2t1SWRzLnB1c2gocm93LnNwZWNHcm91cEhhc2gpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm1hcChpdGVtID0+IHsKICAgICAgICBpdGVtLnNwZWNfdGFibGVfRGF0YS5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIHJldHVybiBpdGVtOwogICAgICB9KTsgLy8gdGFyZ2V0WzBdLnNwZWNfdGFibGVfRGF0YS5zcGxpY2UoaW5kZXgsIDEpCgogICAgICBjb25zdCBzcGVjTmFtZUFyciA9IHJvdy5zcGVjTmFtZS5pbmRleE9mKCJfIikgPyByb3cuc3BlY05hbWUuc3BsaXQoIl8iKSA6IHJvdy5zcGVjTmFtZTsKICAgICAgbGV0IGlzRmFsc2VWYWwgPSAiIjsKCiAgICAgIGZvciAobGV0IGkgaW4gc3BlY05hbWVBcnIpIHsKICAgICAgICBsZXQgaXRlbVMgPSBzcGVjTmFtZUFycltpXTsKICAgICAgICBjb25zdCBpc0hhdmUgPSB0YXJnZXQuc29tZShpdGVtVSA9PiB7CiAgICAgICAgICByZXR1cm4gaXRlbVUuc3BlY190YWJsZV9EYXRhLmZpbmQoaXRlbSA9PiBpdGVtLnNwZWNOYW1lLmluZGV4T2YoaXRlbVMpID4gLTEpOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoIWlzSGF2ZSkgewogICAgICAgICAgaXNGYWxzZVZhbCA9IGl0ZW1TOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IC8vIGNvbnNvbGUubG9nKCJpc1N0YXksIiwgaXNGYWxzZVZhbCk7CgoKICAgICAgaWYgKGlzRmFsc2VWYWwpIHsKICAgICAgICB0aGlzLnNrdV9saXN0LmZvckVhY2goaXRlbSA9PiB7CiAgICAgICAgICBjb25zdCBpbmRleFAgPSBpdGVtLnBhcmFtcy5maW5kSW5kZXgoaXRlbVAgPT4gaXRlbVAuc3BlY05hbWUgPT09IGlzRmFsc2VWYWwpOwoKICAgICAgICAgIGlmIChpbmRleFAgPiAtMSkgewogICAgICAgICAgICBpdGVtLnBhcmFtcy5zcGxpY2UoaW5kZXhQLCAxKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICB9LAoKICAgIC8vIOmAieaLqeWVhumTugogICAgc2VsQ2hvc2UodmFsLCByb3cpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0uc2hvcElkID0gcm93WzBdLmlkOwogICAgICB0aGlzLmJhc2VfZm9ybS5zaG9wTmFtZSA9IHJvd1swXS5uYW1lOwogICAgfSwKCiAgICAvLyDlnLDljLrpgInmi6kKICAgIHNlbFJlZ2lvbihyb3cpIHsKICAgICAgdGhpcy5iYXNlX2Zvcm0ubm90QXJlYSA9IHJvdy5tYXAoaXRlbSA9PiB7CiAgICAgICAgcmV0dXJuIGl0ZW0uY29kZVBhdGg7CiAgICAgIH0pOwogICAgfSwKCiAgICAvLyDojrflj5blrqLmiLfnsbvlnosKICAgIGFzeW5jIGdldEFsbEN1c3RvbWVyU291cmNlKCkgewogICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0QWxsQ3VzdG9tZXJTb3VyY2UoewogICAgICAgIHBhZ2U6IDEsCiAgICAgICAgcGFnZVNpemU6IDUwCiAgICAgIH0pOwogICAgICB0aGlzLmN1c3RvbWVyX3R5cGVfbGlzdCA9IGRhdGEuZGF0YTsKICAgIH0sCgogICAgLy8g6YCJ5oup5a6i5oi3CiAgICBjdXN0b21lclNlbCh2YWwpIHsKICAgICAgdGhpcy5jdXN0b21lcl9saXN0ID0gdmFsOwogICAgfSwKCiAgICAvLyDliKDpmaTlrqLmiLcKICAgIGRlbGV0ZUN1c3RvbWVyKGluZGV4KSB7CiAgICAgIHRoaXMuY3VzdG9tZXJfbGlzdC5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKCiAgICAvLyDmiZPlvIDmjIflrprku7flvLnnqpcKICAgIG9wZW5Nb2RhbChpbmRleCwga2V5LCByb3csIGluZGV4VSkgewogICAgICAvLyDojrflj5bpmLbmoq/ku7fmlbDmja7vvIzlgZrpmLbmoq/ku7fosIPku7cKICAgICAgaWYgKHJvdykgewogICAgICAgIHRoaXMudW5pdGlzTWFzdGVyID0gcm93LmlzTWFzdGVyOwogICAgICAgIHRoaXMuc2t1X2lkID0gcm93LmlkOwogICAgICAgIHRoaXMubGFkZGVyUHJpY2UgPSByb3cubGFkZGVyUHJpY2U7CiAgICAgICAgdGhpcy5lbmFibGVkTGFkZGVyID0gcm93LmVuYWJsZWRMYWRkZXI7CgogICAgICAgIGlmIChrZXkgPT09ICJ0eXBlX3ByaWNlX3Nob3ciKSB7CiAgICAgICAgICAvLyDlrqLmiLfnsbvlnovmjIflrprku7fosIPku7fmlbDmja4KICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2VPcGVuID0gcm93LmN1c3RvbWVyVHlwZVByaWNlT3BlbjsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UgPSByb3cuY3VzdG9tZXJUeXBlUHJpY2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoa2V5ID09PSAiYXBwb2ludF9wcmljZV9zaG93IikgewogICAgICAgICAgLy8g5a6i5oi35oyH5a6a5Lu36LCD5Lu35pWw5o2uCiAgICAgICAgICB0aGlzLmN1c3RvbWVyUHJpY2VPcGVuID0gcm93LmN1c3RvbWVyUHJpY2VPcGVuOwogICAgICAgICAgdGhpcy5jdXN0b21lclByaWNlID0gcm93LmN1c3RvbWVyUHJpY2U7CiAgICAgICAgfQogICAgICB9CgogICAgICB0aGlzLnNrdV9pbmRleCA9IGluZGV4OwoKICAgICAgaWYgKGluZGV4VSA+IC0xKSB7CiAgICAgICAgdGhpcy51bml0X2luZGV4ID0gaW5kZXhVOwogICAgICB9CgogICAgICB0aGlzW2tleV0gPSB0cnVlOwogICAgfSwKCiAgICAvLyDmjIflrprku7fmlbDmja7noa7lrpoKICAgIGFwcG9pbnRQcmljZUNvbmZpcm0oY3VzdG9tZXJQcmljZU9wZW4sIGN1c3RvbWVyUHJpY2UpIHsKICAgICAgY29uc29sZS5sb2coY3VzdG9tZXJQcmljZSk7CgogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICAvLyDljZXop4TmoLwKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclByaWNlT3BlbiA9IGN1c3RvbWVyUHJpY2VPcGVuOwogICAgICAgIHRhcmdldFt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJQcmljZSA9IGN1c3RvbWVyUHJpY2VPcGVuID8gY3VzdG9tZXJQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9IGVsc2UgewogICAgICAgIC8vIOWkmuinhOagvAogICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuJF9jb21tb24uZGVlcENsb25lKHRoaXMudW5pdF9kYXRhKTsKICAgICAgICB0YXJnZXRbdGhpcy51bml0X2luZGV4XS5zcGVjX3RhYmxlX0RhdGFbdGhpcy5za3VfaW5kZXhdLmN1c3RvbWVyUHJpY2VPcGVuID0gY3VzdG9tZXJQcmljZU9wZW47CiAgICAgICAgdGFyZ2V0W3RoaXMudW5pdF9pbmRleF0uc3BlY190YWJsZV9EYXRhW3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclByaWNlID0gY3VzdG9tZXJQcmljZU9wZW4gPyBjdXN0b21lclByaWNlIDogW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0KICAgIH0sCgogICAgLy8g5oyH5a6a5Lu35pWw5o2u5Y+W5raICiAgICBhcHBvaW50UHJpY2VDYW5jZWwoKSB7CiAgICAgIHRoaXMuYXBwb2ludF9wcmljZV9zaG93ID0gZmFsc2U7CiAgICB9LAoKICAgIHR5cGVQcmljZUNvbmZpcm0oY3VzdG9tZXJUeXBlUHJpY2VPcGVuLCBjdXN0b21lclR5cGVQcmljZSkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICAvLyDljZXop4TmoLwKICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLiRfY29tbW9uLmRlZXBDbG9uZSh0aGlzLnVuaXRfZGF0YSk7CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclR5cGVQcmljZU9wZW4gPSBjdXN0b21lclR5cGVQcmljZU9wZW47CiAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5jdXN0b21lclR5cGVQcmljZSA9IGN1c3RvbWVyVHlwZVByaWNlT3BlbiA/IGN1c3RvbWVyVHlwZVByaWNlIDogW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8g5aSa6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJUeXBlUHJpY2VPcGVuID0gY3VzdG9tZXJUeXBlUHJpY2VPcGVuOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uY3VzdG9tZXJUeXBlUHJpY2UgPSBjdXN0b21lclR5cGVQcmljZU9wZW4gPyBjdXN0b21lclR5cGVQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIHR5cGVQcmljZUNhbmNlbCgpIHsKICAgICAgdGhpcy50eXBlX3ByaWNlX3Nob3cgPSBmYWxzZTsKICAgIH0sCgogICAgLy8g6Zi25qKv5Lu36K6+572uCiAgICBsYWRkZXJQcmljZUNvbmZpcm0oZW5hYmxlZExhZGRlciwgbGFkZGVyUHJpY2UpIHsKICAgICAgaWYgKHRoaXMuYmFzZV9mb3JtLnNwZWNUeXBlID09PSAxKSB7CiAgICAgICAgLy8g5Y2V6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwoKICAgICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uaXNFcSA9PT0gNSkgewogICAgICAgICAgLy8g5oqE56CB5ZWG5ZOB5qC55o2u5q+U5L6L6Ieq5Yqo5o2i566X6ZSA5ZSu5Lu3CiAgICAgICAgICB0YXJnZXQuZm9yRWFjaChpdGVtID0+IHsKICAgICAgICAgICAgaXRlbS5lbmFibGVkTGFkZGVyID0gZW5hYmxlZExhZGRlcjsKCiAgICAgICAgICAgIGlmIChlbmFibGVkTGFkZGVyKSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0uY29udmVyc2lvbiAmJiBpdGVtLmlzTWFzdGVyID09PSA0KSB7CiAgICAgICAgICAgICAgICBpdGVtLmxhZGRlclByaWNlID0gbGFkZGVyUHJpY2UubWFwKGxhZGRlciA9PiB7CiAgICAgICAgICAgICAgICAgIHJldHVybiB7IC4uLmxhZGRlciwKICAgICAgICAgICAgICAgICAgICBwcmljZTogdGhpcy4kTlAudGltZXMobGFkZGVyLnByaWNlLCBpdGVtLmNvbnZlcnNpb24pCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaXRlbS5sYWRkZXJQcmljZSA9IGxhZGRlclByaWNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpdGVtLmxhZGRlclByaWNlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0YXJnZXRbdGhpcy5za3VfaW5kZXhdLmVuYWJsZWRMYWRkZXIgPSBlbmFibGVkTGFkZGVyOwogICAgICAgICAgdGFyZ2V0W3RoaXMuc2t1X2luZGV4XS5sYWRkZXJQcmljZSA9IGVuYWJsZWRMYWRkZXIgPyBsYWRkZXJQcmljZSA6IFtdOwogICAgICAgIH0KCiAgICAgICAgdGhpcy51bml0X2RhdGEgPSB0YXJnZXQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8g5aSa6KeE5qC8CiAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy4kX2NvbW1vbi5kZWVwQ2xvbmUodGhpcy51bml0X2RhdGEpOwogICAgICAgIHRhcmdldFt0aGlzLnVuaXRfaW5kZXhdLnNwZWNfdGFibGVfRGF0YVt0aGlzLnNrdV9pbmRleF0uZW5hYmxlZExhZGRlciA9IGVuYWJsZWRMYWRkZXI7CiAgICAgICAgdGFyZ2V0W3RoaXMudW5pdF9pbmRleF0uc3BlY190YWJsZV9EYXRhW3RoaXMuc2t1X2luZGV4XS5sYWRkZXJQcmljZSA9IGVuYWJsZWRMYWRkZXIgPyBsYWRkZXJQcmljZSA6IFtdOwogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGFyZ2V0OwogICAgICB9CiAgICB9LAoKICAgIGxhZGRlclByaWNlQ2FuY2VsKCkgewogICAgICB0aGlzLmxhZGRlcl9wcmljZV9zaG93ID0gZmFsc2U7CiAgICB9LAoKICAgIC8vIOWuouaIt+iwg+S7t+WNlQogICAgYXN5bmMgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQocGFyYW1zKSB7CiAgICAgIGlmICghcGFyYW1zLmxlbmd0aCkgcmV0dXJuOwogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgQ3VzdG9tZXJQcmljZUFkanVzdG1lbnRBZGQocGFyYW1zKTsKICAgIH0sCgogICAgLy8g5a6i5oi357G75Z6L6LCD5Lu35Y2VCiAgICBhc3luYyBhZGRDdXN0b21lclR5cGVQcmljZUFkanVzdG1lbnQocGFyYW1zKSB7CiAgICAgIGlmICghcGFyYW1zLmxlbmd0aCkgcmV0dXJuOwogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgYWRkQ3VzdG9tZXJUeXBlUHJpY2VBZGp1c3RtZW50KHBhcmFtcyk7CiAgICB9LAoKICAgIC8vIOWVhuWTgeWIhuexu+WIl+ihqAogICAgYXN5bmMgZ2V0QWxsQ2F0ZWdvcnlQb3N0KCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsQ2F0ZWdvcnlQb3N0KHsKICAgICAgICBlbmFibGVTdGF0dXM6IDUKICAgICAgfSk7CgogICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoZGF0YSkgPT09ICJ7fSIpIHsKICAgICAgICB0aGlzLmNhdGVnb3J5X2RhdGEgPSBbXTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLmNhdGVnb3J5X2RhdGEgPSBkYXRhOwogICAgICB9CiAgICB9LAoKICAgIC8vIOiHquWumuS5iemAieaLqeWNs+aUueWPmAogICAgY2xpY2tDaGFuZ2UoZXZlbnQpIHsKICAgICAgZXZlbnQudGFyZ2V0LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5maXJzdENoaWxkLmNsaWNrKCk7CiAgICB9LAoKICAgIGRlbEFzc2lzdENhdGUoaW5kZXgpIHsKICAgICAgdGhpcy5hc3Npc3RfY2F0ZS5zcGxpY2UoaW5kZXgsIDEpOwogICAgfSwKCiAgICBhZGRBc3Npc3RDYXRlKCkgewogICAgICB0aGlzLmFzc2lzdF9jYXRlLnB1c2goewogICAgICAgIGFzc2lzdENhdGVnb3J5UGF0aDogW10KICAgICAgfSk7CiAgICB9LAoKICAgIC8vIOiOt+WPluWVhuaIt+WIl+ihqAogICAgYXN5bmMgZ2V0QWxsTWVyY2hhbnRMaXN0KCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YQogICAgICB9ID0gYXdhaXQgZ2V0QWxsTWVyY2hhbnRMaXN0KCk7CiAgICAgIHRoaXMuc2VsX2NpdGllcyA9IGRhdGE7CiAgICB9LAoKICAgIC8vIOaKhOeggeWVhuWTgeWIh+aNogogICAgaXNFcUNoYW5nZSh2YWwpIHsKICAgICAgaWYgKHRoaXMuaXNFZGl0U3BlYyAhPT0gNCAmJiB2YWwgPT09IDUpIHsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5tYXN0ZXJVbml0ID0gewogICAgICAgICAgaXNEZWZhdWx0OiA1LAogICAgICAgICAgaXNNYXN0ZXI6IDUsCiAgICAgICAgICB3ZWlnaHQ6ICIiLAogICAgICAgICAgdW5pdE5hbWU6ICIiLAogICAgICAgICAgdW5pdElkOiAiIiwKICAgICAgICAgIGJhckNvZGU6ICIiCiAgICAgICAgfTsKICAgICAgICB0aGlzLmJhc2VfZm9ybS5icmFuY2hVbml0ID0gW107CiAgICAgICAgdGhpcy51bml0X2RhdGEgPSBbXTsKICAgICAgfQogICAgfSwKCiAgICAvLyDojrflj5bmjIflrprllYblk4HnmoTmnIDlkI7nlJ/mlYjnmoTlrqLmiLfosIPku7fljZXmlbDmja4KICAgIGFzeW5jIGdldEN1c3RvbWVyUHJpY2VCeUdvb2RzSWRzKCkgewogICAgICBjb25zdCB7CiAgICAgICAgZGF0YSwKICAgICAgICBwYWdlVG90YWwKICAgICAgfSA9IGF3YWl0IGdldEN1c3RvbWVyUHJpY2VCeUdvb2RzSWRzKHsKICAgICAgICBnb29kc0lkOiB0aGlzLmdvb2RzX2lkLAogICAgICAgIHBhZ2U6IDEsCiAgICAgICAgcGFnZVNpemU6IDIwMAogICAgICB9KTsKICAgICAgdGhpcy5jdXN0b21lclByaWNlID0gZGF0YTsKICAgIH0sCgogICAgLy8g6I635Y+W5oyH5a6a5ZWG5ZOB55qE5pyA5ZCO55Sf5pWI55qE5a6i5oi357G75Z6L6LCD5Lu35pWw5o2uCiAgICBhc3luYyBnZXRDdXN0b21lclR5cGVQcmljZUJ5R29vZHNJZHMoKSB7CiAgICAgIGNvbnN0IHsKICAgICAgICBkYXRhCiAgICAgIH0gPSBhd2FpdCBnZXRDdXN0b21lclR5cGVQcmljZUJ5R29vZHNJZHMoewogICAgICAgIGdvb2RzSWQ6IHRoaXMuZ29vZHNfaWQsCiAgICAgICAgcGFnZTogMSwKICAgICAgICBwYWdlU2l6ZTogMjAKICAgICAgfSk7CiAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UgPSBkYXRhOwogICAgICB0aGlzLmFkanVzdG1lbnREYXRhKCk7CiAgICB9LAoKICAgIGFkanVzdG1lbnREYXRhKCkgewogICAgICBpZiAodGhpcy5iYXNlX2Zvcm0uc3BlY1R5cGUgPT09IDEpIHsKICAgICAgICB0aGlzLnVuaXRfZGF0YSA9IHRoaXMudW5pdF9kYXRhLm1hcChpdGVtID0+IHsKICAgICAgICAgIC8v5a6i5oi357G75Z6L5Lu3CiAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJUeXBlUHJpY2UuZm9yRWFjaCh0eXBlID0+IHsKICAgICAgICAgICAgaWYgKHR5cGUuc2FsZVByaWNlICYmIHR5cGUuc2FsZVByaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgIHR5cGUuc2FsZVByaWNlLmZvckVhY2gocGl0ZW0gPT4gewogICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KHBpdGVtLnNrdUlkKSA9PT0gaXRlbS5pZF9EKSB7CiAgICAgICAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlLnB1c2goewogICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICBsYWRkZXJQcmljZTogcGl0ZW0ubGFkZGVyUHJpY2UgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHBpdGVtLnByaWNlLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJUeXBlTmFtZSwKICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lclR5cGUsCiAgICAgICAgICAgICAgICAgICAgcHJpY2VJZDogdHlwZS5pZAogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7IC8v5a6i5oi35Lu3CgogICAgICAgICAgbGV0IGN1c3RvbWVyUHJpY2UgPSBbXTsKICAgICAgICAgIHRoaXMuY3VzdG9tZXJQcmljZS5mb3JFYWNoKHR5cGUgPT4gewogICAgICAgICAgICBpZiAodHlwZS5zYWxlUHJpY2UgJiYgdHlwZS5zYWxlUHJpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdHlwZS5zYWxlUHJpY2UuZm9yRWFjaChwaXRlbSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQocGl0ZW0uc2t1SWQpID09PSBpdGVtLmlkX0QpIHsKICAgICAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBhZGpQcmljZXRhZzogcGl0ZW0uYWRqUHJpY2V0YWcsCiAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgIHByaWNlOiBwaXRlbS5wcmljZSwKICAgICAgICAgICAgICAgICAgICBuYW1lOiB0eXBlLmN1c3RvbWVyTmFtZSwKICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lcklkLAogICAgICAgICAgICAgICAgICAgIHByaWNlSWQ6IHR5cGUuaWQKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwKICAgICAgICAgICAgLy8g5a6i5oi357G75Z6L5ZKM5a6i5oi35b+r6YCf6LCD5Lu3CiAgICAgICAgICAgIGN1c3RvbWVyVHlwZVByaWNlOiBjdXN0b21lclR5cGVQcmljZSwKICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2VPcGVuOiBjdXN0b21lclR5cGVQcmljZS5sZW5ndGggPiAwLAogICAgICAgICAgICBjdXN0b21lclByaWNlOiBjdXN0b21lclByaWNlLAogICAgICAgICAgICBjdXN0b21lclByaWNlT3BlbjogY3VzdG9tZXJQcmljZS5sZW5ndGggPiAwCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMudW5pdF9kYXRhID0gdGhpcy51bml0X2RhdGEubWFwKGl0ZW1VID0+IHsKICAgICAgICAgIHJldHVybiB7IC4uLml0ZW1VLAogICAgICAgICAgICBzcGVjX3RhYmxlX0RhdGE6IGl0ZW1VLnNwZWNfdGFibGVfRGF0YS5tYXAoaXRlbSA9PiB7CiAgICAgICAgICAgICAgLy/lrqLmiLfnsbvlnovku7cKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJUeXBlUHJpY2UgPSBbXTsKICAgICAgICAgICAgICB0aGlzLmN1c3RvbWVyVHlwZVByaWNlLmZvckVhY2godHlwZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodHlwZS5zYWxlUHJpY2UgJiYgdHlwZS5zYWxlUHJpY2UubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgIHR5cGUuc2FsZVByaWNlLmZvckVhY2gocGl0ZW0gPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUludChwaXRlbS5za3VJZCkgPT09IGl0ZW0uaWRfRCkgewogICAgICAgICAgICAgICAgICAgICAgY3VzdG9tZXJUeXBlUHJpY2UucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcGl0ZW0ucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJUeXBlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHR5cGUuY3VzdG9tZXJUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZUlkOiB0eXBlLmlkCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOyAvL+WuouaIt+S7twoKICAgICAgICAgICAgICBsZXQgY3VzdG9tZXJQcmljZSA9IFtdOwogICAgICAgICAgICAgIHRoaXMuY3VzdG9tZXJQcmljZS5mb3JFYWNoKHR5cGUgPT4gewogICAgICAgICAgICAgICAgaWYgKHR5cGUuc2FsZVByaWNlICYmIHR5cGUuc2FsZVByaWNlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICB0eXBlLnNhbGVQcmljZS5mb3JFYWNoKHBpdGVtID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQocGl0ZW0uc2t1SWQpID09PSBpdGVtLmlkX0QpIHsKICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWVyUHJpY2UucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkalByaWNldGFnOiBwaXRlbS5hZGpQcmljZXRhZywKICAgICAgICAgICAgICAgICAgICAgICAgbGFkZGVyUHJpY2U6IHBpdGVtLmxhZGRlclByaWNlIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZTogcGl0ZW0ucHJpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHR5cGUuY3VzdG9tZXJOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBpZDogdHlwZS5jdXN0b21lcklkLAogICAgICAgICAgICAgICAgICAgICAgICBwcmljZUlkOiB0eXBlLmlkCiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiB7IC4uLml0ZW0sCiAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZTogY3VzdG9tZXJUeXBlUHJpY2UsCiAgICAgICAgICAgICAgICBjdXN0b21lclR5cGVQcmljZU9wZW46IGN1c3RvbWVyVHlwZVByaWNlLmxlbmd0aCA+IDAsCiAgICAgICAgICAgICAgICBjdXN0b21lclByaWNlOiBjdXN0b21lclByaWNlLAogICAgICAgICAgICAgICAgY3VzdG9tZXJQcmljZU9wZW46IGN1c3RvbWVyUHJpY2UubGVuZ3RoID4gMAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9CgogICAgICBjb25zb2xlLmxvZygiIHRoaXMudW5pdF9kYXRhOiIsIHRoaXMudW5pdF9kYXRhKTsKICAgIH0KCiAgfQp9Ow=="},null]}
|