sonamu 0.7.1 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/ai/agents/types.d.ts +4 -3
  2. package/dist/ai/agents/types.d.ts.map +1 -1
  3. package/dist/ai/agents/types.js +1 -1
  4. package/dist/api/config.d.ts +4 -2
  5. package/dist/api/config.d.ts.map +1 -1
  6. package/dist/api/config.js +5 -2
  7. package/dist/api/decorators.d.ts.map +1 -1
  8. package/dist/api/decorators.js +3 -2
  9. package/dist/bin/cli.js +13 -13
  10. package/dist/bin/{hot-hook-register.d.ts → hmr-hook-register.d.ts} +3 -3
  11. package/dist/bin/hmr-hook-register.d.ts.map +1 -0
  12. package/dist/bin/{hot-hook-register.js → hmr-hook-register.js} +5 -5
  13. package/dist/bin/ts-loader-register.d.ts +2 -0
  14. package/dist/bin/ts-loader-register.d.ts.map +1 -0
  15. package/dist/bin/ts-loader-register.js +34 -0
  16. package/dist/database/base-model.d.ts +2 -34
  17. package/dist/database/base-model.d.ts.map +1 -1
  18. package/dist/database/base-model.js +3 -170
  19. package/dist/syncer/syncer.js +3 -3
  20. package/dist/template/zod-converter.js +4 -2
  21. package/dist/types/types.d.ts +2 -2
  22. package/package.json +8 -8
  23. package/src/ai/agents/types.ts +6 -3
  24. package/src/api/config.ts +16 -5
  25. package/src/api/decorators.ts +2 -1
  26. package/src/bin/cli.ts +13 -13
  27. package/src/bin/{hot-hook-register.ts → hmr-hook-register.ts} +4 -4
  28. package/src/bin/{loader-register.ts → ts-loader-register.ts} +2 -2
  29. package/src/database/base-model.ts +5 -236
  30. package/src/syncer/syncer.ts +2 -2
  31. package/src/template/zod-converter.ts +3 -1
  32. package/dist/bin/hot-hook-register.d.ts.map +0 -1
  33. package/dist/bin/loader-register.d.ts +0 -2
  34. package/dist/bin/loader-register.d.ts.map +0 -1
  35. package/dist/bin/loader-register.js +0 -34
@@ -1,4 +1,4 @@
1
- import { hot } from "@sonamu-kit/hot-hook";
1
+ import { hot } from "@sonamu-kit/hmr-hook";
2
2
  import assert from "assert";
3
3
  import chalk from "chalk";
4
4
  import { mkdir, readFile, writeFile } from "node:fs/promises";
@@ -90,7 +90,7 @@ export class Syncer {
90
90
  ]);
91
91
  }
92
92
  // 싱크 작업이 끝나면 모든 모듈을 로드합니다.
93
- // hot-hook에 의해 invalidate된 부분들이 아니라면 캐시 그대로 유지합니다.
93
+ // hmr-hook에 의해 invalidate된 부분들이 아니라면 캐시 그대로 유지합니다.
94
94
  await this.autoloadTypes();
95
95
  await this.autoloadModels();
96
96
  await this.autoloadApis();
@@ -419,4 +419,4 @@ export class Syncer {
419
419
  }
420
420
  }
421
421
 
422
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9ob3QtaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICBpc1N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhvdC1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCkpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8g7Yq466as6rGwOiBlbnRpdHksIHR5cGVzXG4gICAgLy8g7JWh7IWYOiDsiqTtgqTrp4gg7IOd7ISxXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkIOuzgOqyveyLnFxuICAgIC8vIOyVoeyFmDog7YyM7J28IOyLse2BrCB0eXBlcywgZW51bXMsIGdlbmVyYXRlZFxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcInR5cGVzXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmdW5jdGlvbnNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImdlbmVyYXRlZFwiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBtb2RlbFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBjb25maWdcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAocikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHIubWF0Y2goL1xcLihtb2RlbHx0eXBlc3xmdW5jdGlvbnN8ZW50aXR5fGdlbmVyYXRlZHxmcmFtZXxjb25maWcpXFwuW3RqXXMvKTtcbiAgICAgIHJldHVybiBtYXRjaGVkPy5bMV0gPz8gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMsIGRpZmZUeXBlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlRW50aXR5Q2hhbmdlXCIsIHsgZGlmZkdyb3VwcywgZGlmZlR5cGVzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGRpZmZHcm91cHMuZW50aXR5Py5bMF0pO1xuXG4gICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKTtcbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICBkaWZmR3JvdXBzLmdlbmVyYXRlZCA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50c1wiKSBhcyBBYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gICAgZGlmZlR5cGVzLnB1c2goXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8RmlsZVR5cGVbXT4ge1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMudHlwZXMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgdHlwZXMvZnVuY3Rpb25zL2dlbmVyYXRlZCBjaGFuZ2VzOiAke3RzUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgbW9kZWwvZnJhbWUgY2hhbmdlczogJHttZXJnZWRHcm91cC5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcImZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lLmpzJC8pID8/IFtdO1xuICAgICAgICBhc3NlcnQoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZU5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICB9XG5cbiAgLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuICBhc3luYyBhY3Rpb25TeW5jQ29uZmlnKCkge1xuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIE5haXRlLnQoXCJhY3Rpb25TeW5jQ29uZmlnXCIsIHsgY29udGVudCB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNvbmFtdS5jb25maWcuc3luYy50YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLnNvbmFtdS5lbnZcIiksIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICouc2VydmljZS50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcGFyYW1zQXJyYXkubWFwKGFzeW5jIChwYXJhbXMpID0+XG4gICAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcInNlcnZpY2VcIiwgcGFyYW1zIGFzIFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0sIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiLi9zb25hbXUuc2hhcmVkXCJgKTtcbiAgICAgIHJldHVybiBuZmM7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW08UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4+O1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoXCI6dGFyZ2V0XCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmModGFyZ2V0cywgYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke3R9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldC5yZXBsYWNlKFwiOnRhcmdldFwiLCB0KSwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4sXG4gICAgKTtcbiAgfVxuXG4gIHN5bmNVSSgpIHtcbiAgICBjb25zdCB1aVBvcnQgPSBTb25hbXUuY29uZmlnLnVpPy5wb3J0ID8/IDU3MDAwO1xuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6JHt1aVBvcnR9L2FwaS9yZWxvYWRgLCB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIH0pLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhjaGFsay5kaW0oYEZhaWxlZCB0byByZWxvYWQgU29uYW11IFVJOiAke2UubWVzc2FnZX1gKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVudGl0eShmb3JtOiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pIHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlRW50aXR5KGZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZGVsRW50aXR5KGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsUGF0aHM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGU8VCBleHRlbmRzIFRlbXBsYXRlS2V5PihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICAgX2dlbmVyYXRlT3B0aW9ucz86IEdlbmVyYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zLCBfZ2VuZXJhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaG90IiwiYXNzZXJ0IiwiY2hhbGsiLCJta2RpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiVGVtcGxhdGVLZXkiLCJtYXBBc3luYyIsInJlZHVjZUFzeW5jIiwiY2VudGVyVGV4dCIsImlzVGVzdCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwic3luY1VJIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImluY2x1ZGVzIiwiaGFuZGxlRW50aXR5Q2hhbmdlIiwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlIiwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlIiwiYWN0aW9uU3luY0NvbmZpZyIsImRpZmZGaWxlcyIsInIiLCJtYXRjaGVkIiwibWF0Y2giLCJ0IiwicmVsb2FkIiwiZW50aXR5IiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJob3N0IiwicG9ydCIsInNlcnZlciIsImxpc3RlbiIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwib3ZlcndyaXRlIiwiZmxhdCIsInBhcmFtc0FycmF5IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0Iiwia2V5IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsInVpUG9ydCIsInVpIiwiZmV0Y2giLCJtZXRob2QiLCJjYXRjaCIsImUiLCJkaW0iLCJtZXNzYWdlIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3pELFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFDLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLFNBQVNDLEtBQUssRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFFeEMsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLGFBQWEsUUFBZ0MsOEJBQTJCO0FBQ2pGLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FB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
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zeW5jZXIvc3luY2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGhvdCB9IGZyb20gXCJAc29uYW11LWtpdC9obXItaG9va1wiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgY2hhbGsgZnJvbSBcImNoYWxrXCI7XG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgbWluaW1hdGNoIH0gZnJvbSBcIm1pbmltYXRjaFwiO1xuaW1wb3J0IHBhdGgsIHsgZGlybmFtZSB9IGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBncm91cCwgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IHJlZ2lzdGVyZWRBcGlzIH0gZnJvbSBcIi4uL2FwaS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciwgdHlwZSBFbnRpdHlOYW1lc1JlY29yZCB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZU1hbmFnZXIgfSBmcm9tIFwiLi4vdGVtcGxhdGUvdGVtcGxhdGUtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU9wdGlvbnMsIFBhdGhBbmRDb2RlIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW1wbGF0ZUtleSwgdHlwZSBUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IG1hcEFzeW5jLCByZWR1Y2VBc3luYyB9IGZyb20gXCIuLi91dGlscy9hc3luYy11dGlsc1wiO1xuaW1wb3J0IHsgY2VudGVyVGV4dCB9IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGlzVGVzdCB9IGZyb20gXCIuLi91dGlscy9jb250cm9sbGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIH0gZnJvbSBcIi4uL3V0aWxzL3Byb2Nlc3MtdXRpbHNcIjtcbmltcG9ydCB7IGFyZUZpbGVzU2FtZSwgZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zLCByZW5ld0NoZWNrc3VtcyB9IGZyb20gXCIuL2NoZWNrc3VtXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZVRlbXBsYXRlLCByZW5kZXJUZW1wbGF0ZSB9IGZyb20gXCIuL2NvZGUtZ2VuZXJhdG9yXCI7XG5pbXBvcnQgeyBjcmVhdGVFbnRpdHksIGRlbEVudGl0eSB9IGZyb20gXCIuL2VudGl0eS1vcGVyYXRpb25zXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVUeXBlLCBnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vZmlsZS1wYXR0ZXJuc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBMb2FkZWRBcGlzLFxuICB0eXBlIExvYWRlZE1vZGVscyxcbiAgdHlwZSBMb2FkZWRUeXBlcyxcbiAgbG9hZEFwaXMsXG4gIGxvYWRNb2RlbHMsXG4gIGxvYWRUeXBlcyxcbn0gZnJvbSBcIi4vbW9kdWxlLWxvYWRlclwiO1xuXG50eXBlIERpZmZHcm91cHMgPSB7XG4gIFtrZXkgaW4gRmlsZVR5cGVdOiBBYnNvbHV0ZVBhdGhbXTtcbn07XG5cbmV4cG9ydCBjbGFzcyBTeW5jZXIge1xuICBhcGlzOiBMb2FkZWRBcGlzID0gW107XG4gIHR5cGVzOiBMb2FkZWRUeXBlcyA9IHt9O1xuICBtb2RlbHM6IExvYWRlZE1vZGVscyA9IHt9O1xuICBpc1N5bmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICog7LK07YGs7ISs7J20IOuzgOqyveuQnCDrtoDrtoTsl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOuLpOunjCBzb25hbXUuc2hhcmVkLnRz64qUIOyytO2BrOyErCDruYTqtZAg7JeG7J20IOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICogQHJldHVybnNcbiAgICovXG4gIGFzeW5jIHN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG5cbiAgICAvLyBzb25hbXUuc2hhcmVkLnRz64qUIOustOyhsOqxtCDsi7Htgawo67O17IKsKe2VqeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmNvcHlTaGFyZWRUb1RhcmdldHModGFyZ2V0cyk7XG5cbiAgICAvLyDqt7gg64uk7J2M67aA7YSw64qUIOuzgOqyveuQnCDtjIzsnbzsnYQg7LC+7JWE7IScIOuPmeq4sO2ZlCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IGF3YWl0IGZpbmRDaGFuZ2VkRmlsZXNVc2luZ0NoZWNrc3VtcygpO1xuICAgIGlmIChjaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ibGFjay5iZ0dyZWVuKGNlbnRlclRleHQoXCJBbGwgZmlsZXMgYXJlIHN5bmNlZCFcIikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDrp4zslb0g7Iux7YGsIOykkeyXkCDtlITroZzshLjsiqTqsIAg7KO97Jy866m0IOq8rOyXrOuyhOumrOq4sCDrlYzrrLjsl5AsXG4gICAgLy8g7Iuc6re464SQ7JeQ64+EIOyeoOyLnCDrsoTti7gg7IiYIOyeiOuKlCDtmZjqsr0g7IaN7JeQ7IScIOyLse2BrOulvCDsi6Ttlontlanri4jri6QuXG4gICAgYXdhaXQgcnVuV2l0aEdyYWNlZnVsU2h1dGRvd24oXG4gICAgICBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIOyWmOqwgCDsi7Htgawg7J6R7JeFIOyImO2Wie2VmOuKlCDrs7jssrTsnoXri4jri6QuXG4gICAgICAgIGF3YWl0IHRoaXMuZG9TeW5jQWN0aW9ucyhjaGFuZ2VkRmlsZXMpO1xuXG4gICAgICAgIC8vIOyLse2BrCDslaHshZjsnbQg64Gd64KY66m0IO2VreyDgSDssrTtgazshKzsnYQg64uk7IucIOqwseyLoO2VqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgcmVuZXdDaGVja3N1bXMoKTtcbiAgICAgIH0sXG4gICAgICB7IHdoZW5UaGlzSGFwcGVuczogXCJTSUdVU1IyXCIsIHdhaXRGb3JVcFRvOiAyMDAwMCB9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2F0Y2hlcuqwgCDqsJDsp4DtlZwg7YyM7J28IOuzgOqyvSDsgqztla3sl5Ag64yA7ZW0IOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyjvOyWtOynhCDrs4Dqsr0g7YyM7J2865OkIOykkSDssrTtgazshKwg6rSA66asIOuMgOyDgeyduCDqsoPrk6Trp4wg6rCA7KC464uk6rCAIOyLse2BrOulvCDsp4Ttlontlanri4jri6QuXG4gICAqIOyytO2BrOyErCDtjIzsnbwg7JeF642w7J207Yq464qUIOyXrOq4sOyXkOyEnCDtlZjsp4Ag7JWK7Iq164uI64ukLiDtmLjstpzsnpDqsIAg7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gZGlmZkZpbGVQYXRoIC0g67OA6rK9IO2MjOydvOuTpC4g7ZSE66Gc7KCd7Yq4IOujqO2KuOu2gO2EsCBcInNyYy9cIiDrmJDripQgXCJkaXN0L1wi66GcIOyLnOyeke2VmOuKlCDsg4HrjIAg6rK966Gc7J6F64uI64ukLiDsmIjsi5w6IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gICAqL1xuICBhc3luYyBzeW5jRnJvbVdhdGNoZXIoZXZlbnQ6IHN0cmluZywgZGlmZkZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIgJiYgZXZlbnQgIT09IFwidW5saW5rXCIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDsnbzri6gg67OA6rK965CcIO2MjOydvOqzvCBkZXBlbmRlbnQg7YyM7J2865Ok7J2EIGludmFsaWRhdGUg7ZWp64uI64ukLlxuICAgIC8vIO2VnCDrsogg7J207IOBIGltcG9ydOuQnCDsuZzqtazrk6Tsl5Ag64yA7ZW07ISc66eMIOyLpOygnCDsnpHsl4XsnbQg7J287Ja064Kp64uI64ukLlxuICAgIC8vIOq3uOufrOuLiCDslYjsi6ztlZjqs6AgaW52YWxpZGF0ZSDtlbTrj4Qg65Cp64uI64ukLlxuICAgIC8vIO2FjOyKpO2KuCDtmZjqsr3sl5DshJzripQgaG90LmludmFsaWRhdGVGaWxl7IucIOy0iOq4sCDsl5Drn6zqsIAg67Cc7IOd7ZWY6riwIOuVjOusuOyXkCBpbnZhbGlkYXRlIO2VmOyngCDslYrsirXri4jri6QuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgY29uc3QgaW52YWxpZGF0ZWRQYXRocyA9IChhd2FpdCBob3QuaW52YWxpZGF0ZUZpbGUoZGlmZkZpbGVQYXRoLCBldmVudCkpIGFzIEFic29sdXRlUGF0aFtdO1xuXG4gICAgICBpZiAoaW52YWxpZGF0ZWRQYXRocy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYPCflIQgSW52YWxpZGF0ZWQ6YCkpO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW52YWxpZGF0ZWRQYXRoIG9mIGludmFsaWRhdGVkUGF0aHMpIHtcbiAgICAgICAgICAvLyDrp4zslb0gbW9kZWwudHMg7YyM7J287J20IOuzgOqyvShpbnZhbGlkYXRlKeuQmOyXiOuLpD8g6re465+s66m0IHJlZ2lzdGVyZWRBcGlzIOykkeyXkOyEnCDsnbQg66qo64247JeQIO2VtOuLue2VmOuKlCBhcGnrk6TsnYAg7KeA7JuM7KSY7JqULlxuICAgICAgICAgIC8vIHJlZ2lzdGVyZWRBcGlz64qUIO2GteycvOuhnCDri6Qg64Kg66Ck67KE66a0IOyImCDsl4bsirXri4jri6QuIHJlZ2lzdGVyZWRBcGlz7JeQIOyYrOudvOyYpOuKlCDsuZzqtazrk6TsnYAg7LSI6riwIOuhnOuTnOyLnCDrmJDripQgSE1S7Iuc7JeQ66eMIOuTseuhneuQmOq4sCDrlYzrrLjsnoXri4jri6QuXG4gICAgICAgICAgLy8g65Sw65287IScIG1vZGVsLnRzIO2MjOydvOydmCDrs4Dqsr3snLzroZwg64uk7J2M67KIIOyDiOuhnOyatCBldmFs7J20IOyYiOyDgeuQmOuKlCDsnbQg7Iuc7KCQ7JeQ7ISc66eMLCDsnbQg66qo64247JeQ7IScIOuCmOyYqCByZWdpc3RlcmVkQXBpc+uTpOydhCDsp4Dsm4zspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICAgICAgICBjb25zdCByZW1vdmVkQXBpcyA9IHRoaXMucmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhpbnZhbGlkYXRlZFBhdGgpO1xuICAgICAgICAgIGlmIChyZW1vdmVkQXBpcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsuYmx1ZShgLSAke3BhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBpbnZhbGlkYXRlZFBhdGgpfWApLFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KGAod2l0aCAke3JlbW92ZWRBcGlzLmxlbmd0aH0gQVBJcylgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmJsdWUoYC0gJHtwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgaW52YWxpZGF0ZWRQYXRoKX1gKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNJbkNoZWNrUGF0dGVybkdyb3VwID0gT2JqZWN0LnZhbHVlcyhnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoKCkpLnNvbWUoXG4gICAgICAocGF0dGVybikgPT4gbWluaW1hdGNoKGRpZmZGaWxlUGF0aCwgcGF0dGVybiksXG4gICAgKTtcblxuICAgIC8vIO2VoCDsnbwoc3luYynsnbQg7J6I7Jy866m0IO2VqeuLiOuLpC5cbiAgICBpZiAoaXNJbkNoZWNrUGF0dGVybkdyb3VwKSB7XG4gICAgICBhd2FpdCB0aGlzLmRvU3luY0FjdGlvbnMoW2RpZmZGaWxlUGF0aF0pO1xuICAgIH1cblxuICAgIC8vIOyLse2BrCDsnpHsl4XsnbQg64Gd64KY66m0IOuqqOuToCDrqqjrk4jsnYQg66Gc65Oc7ZWp64uI64ukLlxuICAgIC8vIGhtci1ob29r7JeQIOydmO2VtCBpbnZhbGlkYXRl65CcIOu2gOu2hOuTpOydtCDslYTri4jrnbzrqbQg7LqQ7IucIOq3uOuMgOuhnCDsnKDsp4Dtlanri4jri6QuXG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuYXV0b2xvYWRBcGlzKCk7XG5cbiAgICB0aGlzLnN5bmNVSSgpO1xuICB9XG5cbiAgcmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyhcbiAgICBpbnZhbGlkYXRlZFBhdGg6IEFic29sdXRlUGF0aCxcbiAgKTogKHR5cGVvZiByZWdpc3RlcmVkQXBpcylbbnVtYmVyXVtdIHtcbiAgICBpZiAoIWludmFsaWRhdGVkUGF0aC5lbmRzV2l0aChcIi5tb2RlbC50c1wiIC8q7IaM7IqkIOy9lOuTnOulvCDri6Tro6jripQg7IOB7Zmp7J2064uIIC50cyDqsr3roZzroZwg67SF64uI64ukLiovKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGludmFsaWRhdGVkUGF0aCk7XG4gICAgY29uc3QgdG9SZW1vdmUgPSByZWdpc3RlcmVkQXBpcy5maWx0ZXIoKGFwaSkgPT4gYXBpLm1vZGVsTmFtZSA9PT0gYCR7ZW50aXR5SWR9TW9kZWxgKTtcbiAgICBmb3IgKGNvbnN0IGFwaSBvZiB0b1JlbW92ZSkge1xuICAgICAgcmVnaXN0ZXJlZEFwaXMuc3BsaWNlKHJlZ2lzdGVyZWRBcGlzLmluZGV4T2YoYXBpKSwgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRvUmVtb3ZlO1xuICB9XG5cbiAgYXN5bmMgY29weVNoYXJlZFRvVGFyZ2V0cyh0YXJnZXRzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICAgIC8vIOyngOq4iCDqsIDsoLjqsIDroKTripQg7J20IO2MjOydvOydgCBTb25hbXUg7L2U65Oc67Kg7J207Iqk7J2YIOydvOu2gOyeheuLiOuLpC5cbiAgICAgIC8vIOq3uOufsOuNsCBkaXN0IOyGjSDruYzrk5zrkJwg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnbQg7ZWE7JqU7ZWcIOqyg+ydtCDslYTri4jqs6AsIHNyY+yXkOunjCDsnojripQg7YWN7Iqk7Yq4IO2MjOydvOydtCDtlYTsmpTtlanri4jri6QuXG4gICAgICAvLyDrlLDrnbzshJwgL3NyYy/sl5DshJwg7LC+7Iq164uI64ukLlxuICAgICAgY29uc3Qgc3JjUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgaW1wb3J0Lm1ldGEuZGlybmFtZS5yZXBsYWNlKFwiL2Rpc3QvXCIsIFwiL3NyYy9cIiksXG4gICAgICAgIGAuLi9zaGFyZWQvJHt0YXJnZXR9LnNoYXJlZC50cy50eHRgLFxuICAgICAgKTtcbiAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhzcmNQYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCkpKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRyaWVkIHRvIGNvcHkgc29uYW11LnNoYXJlZC50cyB0byB0YXJnZXQgJyR7dGFyZ2V0fScgYnV0IHRoZSB0YXJnZXQgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiBQbGVhc2UgY2hlY2sgeW91ciBwcm9qZWN0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8g7J206rG0IO2UhOuhnOygne2KuOyXkCAudHMg7IaM7IqkIOy9lOuTnCDtjIzsnbzsnYQg7IOd7ISx7ZWY64qUIOqyg+ydtOuvgOuhnCBzcmPsnZggLnRzIOqyveuhnOuhnCDqsJHri4jri6QuXG4gICAgICBjb25zdCBkZXN0UGF0aCA9IHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgXCIuL3NvbmFtdS5zaGFyZWQudHNcIik7XG5cbiAgICAgIC8vIOygleunkCDtmLnsi5zrgpjsp4Drp4wgdGFyZ2V0IOuUlOugie2GoOumrOuKlCDsnojslrTrj4Qgc3JjL3NlcnZpY2VzIOuUlOugie2GoOumrOuKlCDsl4bsnYQg7IiYIOyeiOycvOuvgOuhnCDrr7jrpqwg7IOd7ISx7ZW07KSN64uI64ukLlxuICAgICAgaWYgKCEoYXdhaXQgZXhpc3RzKHBhdGguZGlybmFtZShkZXN0UGF0aCkpKSkge1xuICAgICAgICBhd2FpdCBta2RpcihwYXRoLmRpcm5hbWUoZGVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgY29uc29sZS53YXJuKGBDcmVhdGVkIGRpcmVjdG9yeSAnJHtwYXRoLmRpcm5hbWUoZGVzdFBhdGgpfScgYmVjYXVzZSBpdCBkaWQgbm90IGV4aXN0LmApO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgYXJlRmlsZXNTYW1lKHNyY1BhdGgsIGRlc3RQYXRoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShkZXN0UGF0aCwgYXdhaXQgcmVhZEZpbGUoc3JjUGF0aCkpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuYm9sZChcIkNvcGllZDogXCIpICsgY2hhbGsuYmx1ZShwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcHBSb290UGF0aCwgZGVzdFBhdGgpKSxcbiAgICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBhdXRvbG9hZFR5cGVzKCkge1xuICAgIHRoaXMudHlwZXMgPSBhd2FpdCBsb2FkVHlwZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGF1dG9sb2FkTW9kZWxzKCkge1xuICAgIHRoaXMubW9kZWxzID0gYXdhaXQgbG9hZE1vZGVscygpO1xuICB9XG5cbiAgYXN5bmMgYXV0b2xvYWRBcGlzKCkge1xuICAgIHRoaXMuYXBpcyA9IGF3YWl0IGxvYWRBcGlzKCk7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIOyLse2BrOulvCDsiJjtlontlZjripQg67O47LK07J6F64uI64ukLlxuICAgKiDrs4Dqsr3rkJwg7YyM7J2865Ok7J2EIO2DgOyeheuzhOuhnCDrtoTrpZjtlZjqs6Ag6rCBIO2DgOyeheyXkCDrp57ripQg7JWh7IWY7J2EIOyLpO2Wie2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGRpZmZGaWxlUGF0aHMgLSDrs4Dqsr3rkJwg7YyM7J2865Ok7J2YIOygiOuMgCDqsr3roZwg66qp66GdXG4gICAqIEByZXR1cm5zIGRpZmZUeXBlcyAtIOuzgOqyveuQnCDtjIzsnbzsnZgg7YOA7J6FIOuqqeuhnSAoZW50aXR5LCB0eXBlcywgbW9kZWwg65OxKVxuICAgKi9cbiAgYXN5bmMgZG9TeW5jQWN0aW9ucyhkaWZmRmlsZVBhdGhzOiBBYnNvbHV0ZVBhdGhbXSk6IFByb21pc2U8eyBkaWZmVHlwZXM6IHN0cmluZ1tdIH0+IHtcbiAgICBjb25zdCBkaWZmR3JvdXBzID0gdGhpcy5jYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlUGF0aHMpO1xuICAgIGNvbnN0IGRpZmZUeXBlcyA9IE9iamVjdC5rZXlzKGRpZmZHcm91cHMpO1xuXG4gICAgLy8g7Yq466as6rGwOiBlbnRpdHksIHR5cGVzXG4gICAgLy8g7JWh7IWYOiDsiqTtgqTrp4gg7IOd7ISxXG4gICAgaWYgKGRpZmZUeXBlcy5pbmNsdWRlcyhcImVudGl0eVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVFbnRpdHlDaGFuZ2UoZGlmZkdyb3VwcywgZGlmZlR5cGVzKTtcbiAgICB9XG5cbiAgICAvLyDtirjrpqzqsbA6IHR5cGVzLCBlbnVtcywgZ2VuZXJhdGVkIOuzgOqyveyLnFxuICAgIC8vIOyVoeyFmDog7YyM7J28IOyLse2BrCB0eXBlcywgZW51bXMsIGdlbmVyYXRlZFxuICAgIGlmIChcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcInR5cGVzXCIpIHx8XG4gICAgICBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmdW5jdGlvbnNcIikgfHxcbiAgICAgIGRpZmZUeXBlcy5pbmNsdWRlcyhcImdlbmVyYXRlZFwiKVxuICAgICkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBtb2RlbFxuICAgIGlmIChkaWZmVHlwZXMuaW5jbHVkZXMoXCJtb2RlbFwiKSB8fCBkaWZmVHlwZXMuaW5jbHVkZXMoXCJmcmFtZVwiKSkge1xuICAgICAgYXdhaXQgdGhpcy5oYW5kbGVNb2RlbE9yRnJhbWVDaGFuZ2UoZGlmZkdyb3Vwcyk7XG4gICAgfVxuXG4gICAgLy8g7Yq466as6rGwOiBjb25maWdcbiAgICBpZiAoZGlmZlR5cGVzLmluY2x1ZGVzKFwiY29uZmlnXCIpKSB7XG4gICAgICBhd2FpdCB0aGlzLmFjdGlvblN5bmNDb25maWcoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlmZlR5cGVzLFxuICAgIH07XG4gIH1cblxuICBjYWxjdWxhdGVEaWZmR3JvdXBzKGRpZmZGaWxlczogQWJzb2x1dGVQYXRoW10pOiBEaWZmR3JvdXBzIHtcbiAgICByZXR1cm4gZ3JvdXAoZGlmZkZpbGVzLCAocikgPT4ge1xuICAgICAgY29uc3QgbWF0Y2hlZCA9IHIubWF0Y2goL1xcLihtb2RlbHx0eXBlc3xmdW5jdGlvbnN8ZW50aXR5fGdlbmVyYXRlZHxmcmFtZXxjb25maWcpXFwuW3RqXXMvKTtcbiAgICAgIHJldHVybiBtYXRjaGVkPy5bMV0gPz8gXCJ1bmtub3duXCI7XG4gICAgfSkgYXMgdW5rbm93biBhcyBEaWZmR3JvdXBzO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRW50aXR5Q2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMsIGRpZmZUeXBlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlRW50aXR5Q2hhbmdlXCIsIHsgZGlmZkdyb3VwcywgZGlmZlR5cGVzIH0pO1xuXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWxvYWQoKTtcblxuICAgIC8vIHR5cGVzIOyDneyEsShlbnRpdHkg7IOI66GcIOy2lOqwgOuQnCDqsr3smrApXG4gICAgLy8gcGFyZW50SWTqsIAg7JeG6rOgLCB0eXBlc+qwgCDsl4bripQg6rK97Jqw7JeQ66eMIOyDneyEsVxuICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKGRpZmZHcm91cHMuZW50aXR5Py5bMF0pO1xuXG4gICAgaWYgKGVudGl0eUlkKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICAvLyDtlITroZzsoJ3tirjsl5Ag7IOd7ISx65CY7Ja07JW8IO2VmOuKlCAudHMg7YyM7J287J2YIOqyveuhnOyeheuLiOuLpC5cbiAgICAgIGNvbnN0IHR5cGVGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7ZW50aXR5Lm5hbWVzLmZzfS8ke2VudGl0eS5uYW1lcy5mc30udHlwZXMudHNgLFxuICAgICAgKTtcbiAgICAgIGlmIChlbnRpdHkucGFyZW50SWQgPT09IHVuZGVmaW5lZCAmJiAhKGF3YWl0IGV4aXN0cyh0eXBlRmlsZVBhdGgpKSkge1xuICAgICAgICBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKFwiaW5pdF90eXBlc1wiLCB7IGVudGl0eUlkIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk7XG5cbiAgICBkaWZmR3JvdXBzLmdlbmVyYXRlZCA9IHVuaXF1ZShbXG4gICAgICAuLi4oZGlmZkdyb3Vwcy5nZW5lcmF0ZWQgPz8gW10pLFxuICAgICAgcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmMvYXBwbGljYXRpb24vc29uYW11LmdlbmVyYXRlZC50c1wiKSBhcyBBYnNvbHV0ZVBhdGgsXG4gICAgXSk7XG4gICAgZGlmZlR5cGVzLnB1c2goXCJnZW5lcmF0ZWRcIik7XG4gIH1cblxuICBhc3luYyBoYW5kbGVUeXBlc09yRnVuY3Rpb25zT3JHZW5lcmF0ZWRDaGFuZ2UoZGlmZkdyb3VwczogRGlmZkdyb3Vwcyk6IFByb21pc2U8RmlsZVR5cGVbXT4ge1xuICAgIGNvbnN0IHRzUGF0aHMgPSB1bmlxdWUoW1xuICAgICAgLi4uKGRpZmZHcm91cHMudHlwZXMgPz8gW10pLFxuICAgICAgLi4uKGRpZmZHcm91cHMuZnVuY3Rpb25zID8/IFtdKSxcbiAgICAgIC4uLihkaWZmR3JvdXBzLmdlbmVyYXRlZCA/PyBbXSksXG4gICAgXSk7XG4gICAgTmFpdGUudChcImhhbmRsZVR5cGVzT3JGdW5jdGlvbnNPckdlbmVyYXRlZENoYW5nZVwiLCB7IGRpZmZHcm91cHMgfSk7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgdHlwZXMvZnVuY3Rpb25zL2dlbmVyYXRlZCBjaGFuZ2VzOiAke3RzUGF0aHMubWFwKChwKSA9PiBwYXRoLnJlbGF0aXZlKFNvbmFtdS5hcGlSb290UGF0aCwgcCkpLmpvaW4oXCIsIFwiKX1gXG4gICAgLy8gICApXG4gICAgLy8gKTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uU3luY0ZpbGVzVG9UYXJnZXRzKHRzUGF0aHMpO1xuXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlKGRpZmZHcm91cHM6IERpZmZHcm91cHMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBOYWl0ZS50KFwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlXCIsIHsgZGlmZkdyb3VwcyB9KTtcbiAgICBjb25zdCBtZXJnZWRHcm91cCA9IFsuLi4oZGlmZkdyb3Vwcy5tb2RlbCA/PyBbXSksIC4uLihkaWZmR3JvdXBzLmZyYW1lID8/IFtdKV07XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAvLyAgIGNoYWxrLmdyYXkoXG4gICAgLy8gICAgIGBbUHJvY2Vzc2luZ10gSGFuZGxpbmcgbW9kZWwvZnJhbWUgY2hhbmdlczogJHttZXJnZWRHcm91cC5tYXAoKHApID0+IHBhdGgucmVsYXRpdmUoU29uYW11LmFwaVJvb3RQYXRoLCBwKSkuam9pbihcIiwgXCIpfWBcbiAgICAvLyAgIClcbiAgICAvLyApO1xuXG4gICAgLy8gZ2VuZXJhdGVkX2h0dHAudGVtcGxhdGUudHPsl5DshJwgc3luY2VyLnR5cGVz66W8IOyUgeuLiOuLpC5cbiAgICAvLyBzZXJ2aWNlLnRlbXBsYXRlLnRz7JeQ7IScIHN5bmNlci5hcGlz66W8IOyUgeuLiOuLpC5cbiAgICBhd2FpdCB0aGlzLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZFR5cGVzKCk7XG4gICAgYXdhaXQgdGhpcy5hdXRvbG9hZEFwaXMoKTtcblxuICAgIGNvbnN0IHBhcmFtczoge1xuICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU5hbWVzUmVjb3JkO1xuICAgIH1bXSA9IG1lcmdlZEdyb3VwLm1hcCgobW9kZWxQYXRoKSA9PiB7XG4gICAgICBpZiAobW9kZWxQYXRoLmVuZHNXaXRoKFwiLm1vZGVsLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IGVudGl0eUlkID0gRW50aXR5TWFuYWdlci5nZXRFbnRpdHlJZEZyb21QYXRoKG1vZGVsUGF0aCk7XG4gICAgICAgIGFzc2VydChlbnRpdHlJZCk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZXNSZWNvcmQ6IEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKG1vZGVsUGF0aC5lbmRzV2l0aChcImZyYW1lLnRzXCIpKSB7XG4gICAgICAgIGNvbnN0IFssIGZyYW1lTmFtZV0gPSBtb2RlbFBhdGgubWF0Y2goLy4rXFwvKC4rKVxcLmZyYW1lLmpzJC8pID8/IFtdO1xuICAgICAgICBhc3NlcnQoZnJhbWVOYW1lKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lc1JlY29yZDogRW50aXR5TWFuYWdlci5nZXROYW1lc0Zyb21JZChmcmFtZU5hbWUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHJlYWNoYWJsZVwiKTtcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyhwYXJhbXMpO1xuICAgIGF3YWl0IHRoaXMuYWN0aW9uR2VuZXJhdGVIdHRwcygpO1xuICB9XG5cbiAgLy8gd2ViLy5zb25hbXUuZW52IOyXkCDtmITsnqwg7ISk7KCV6rCSIOyggOyepVxuICBhc3luYyBhY3Rpb25TeW5jQ29uZmlnKCkge1xuICAgIGNvbnN0IHsgaG9zdCwgcG9ydCB9ID0gU29uYW11LmNvbmZpZy5zZXJ2ZXIubGlzdGVuID8/IHt9O1xuICAgIGNvbnN0IGNvbnRlbnQgPSBgQVBJX0hPU1Q9JHtob3N0ID8/IFwibG9jYWxob3N0XCJ9XFxuQVBJX1BPUlQ9JHtwb3J0ID8/IDMwMDB9YDtcblxuICAgIE5haXRlLnQoXCJhY3Rpb25TeW5jQ29uZmlnXCIsIHsgY29udGVudCB9KTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFNvbmFtdS5jb25maWcuc3luYy50YXJnZXRzLm1hcChhc3luYyAodGFyZ2V0KSA9PiB7XG4gICAgICAgIGF3YWl0IHdyaXRlRmlsZShwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIFwiLnNvbmFtdS5lbnZcIiksIGNvbnRlbnQpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBzb25hbXUuZ2VuZXJhdGVkLnRz7JmAIHNvbmFtdS5nZW5lcmF0ZWQuc3NvLnRz66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICogQHJldHVybnMg7IOd7ISx65CcIO2MjOydvCDqsr3roZwg67Cw7Je0LlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVTY2hlbWFzKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoW10+IHtcbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBnZW5lcmF0ZVRlbXBsYXRlKFwiZ2VuZXJhdGVkX3Nzb1wiLCB7fSwgeyBvdmVyd3JpdGU6IHRydWUgfSksXG4gICAgICAgIGdlbmVyYXRlVGVtcGxhdGUoXCJnZW5lcmF0ZWRcIiwge30sIHsgb3ZlcndyaXRlOiB0cnVlIH0pLFxuICAgICAgXSlcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqICouc2VydmljZS50c+ulvCDsg53shLHtlanri4jri6QuXG4gICAqIEBwYXJhbSBwYXJhbXNBcnJheVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25HZW5lcmF0ZVNlcnZpY2VzKFxuICAgIHBhcmFtc0FycmF5OiB7XG4gICAgICBuYW1lc1JlY29yZDogRW50aXR5TmFtZXNSZWNvcmQ7XG4gICAgfVtdLFxuICApOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgTmFpdGUudChcImFjdGlvbkdlbmVyYXRlU2VydmljZXNcIiwgcGFyYW1zQXJyYXkpO1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcGFyYW1zQXJyYXkubWFwKGFzeW5jIChwYXJhbXMpID0+XG4gICAgICAgICAgZ2VuZXJhdGVUZW1wbGF0ZShcInNlcnZpY2VcIiwgcGFyYW1zIGFzIFRlbXBsYXRlT3B0aW9uc1tcInNlcnZpY2VcIl0sIHtcbiAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApXG4gICAgICAuZmxhdCgpXG4gICAgICAuZmxhdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIHNvbmFtdS5nZW5lcmF0ZWQuaHR0cOulvCDsg53shLHtlanri4jri6QuXG4gICAqIEByZXR1cm5zIOyDneyEseuQnCDtjIzsnbwg6rK966GcLlxuICAgKi9cbiAgYXN5bmMgYWN0aW9uR2VuZXJhdGVIdHRwcygpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICAgIGNvbnN0IFtyZXNdID0gYXdhaXQgZ2VuZXJhdGVUZW1wbGF0ZShcbiAgICAgIFwiZ2VuZXJhdGVkX2h0dHBcIixcbiAgICAgIHsgZW50aXR5SWQ6IFwiZHVtbXlcIiB9LFxuICAgICAgeyBvdmVyd3JpdGU6IHRydWUgfSxcbiAgICApO1xuICAgIGFzc2VydChyZXMpO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKipcbiAgICogKi50eXBlcy50cywgKi5mdW5jdGlvbnMudHMsICouZ2VuZXJhdGVkLnRz66W8IO2DgOqynyDrlJTroInthqDrpqzsl5Ag67O17IKs7ZWp64uI64ukLlxuICAgKiBAcGFyYW0gdHNQYXRoc1xuICAgKiBAcmV0dXJucyDrs7XsgqzrkJwg7YyM7J28IOqyveuhnCDrsLDsl7QuXG4gICAqL1xuICBhc3luYyBhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHModHNQYXRoczogQWJzb2x1dGVQYXRoW10pOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgY29uc3QgeyBkaXI6IGFwaURpciB9ID0gU29uYW11LmNvbmZpZy5hcGk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRhcmdldHMubWFwKGFzeW5jICh0YXJnZXQpID0+XG4gICAgICAgICAgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICB0c1BhdGhzLm1hcChhc3luYyAocmVhbFNyYykgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBkc3QgPSByZWFsU3JjXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoYC8ke2FwaURpcn0vYCwgYC8ke3RhcmdldH0vYClcbiAgICAgICAgICAgICAgICAucmVwbGFjZShcIi9hcHBsaWNhdGlvbi9cIiwgXCIvc2VydmljZXMvXCIpO1xuICAgICAgICAgICAgICBjb25zdCBkaXIgPSBkaXJuYW1lKGRzdCk7XG4gICAgICAgICAgICAgIGlmICghKGF3YWl0IGV4aXN0cyhkaXIpKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBjaGFsay5ib2xkKFwiQ29waWVkOiBcIikgKyBjaGFsay5ibHVlKGRzdC5yZXBsYWNlKGAke1NvbmFtdS5hcHBSb290UGF0aH0vYCwgXCJcIikpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChyZWFsU3JjLCBkc3QpO1xuICAgICAgICAgICAgICByZXR1cm4gZHN0O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKSxcbiAgICAgICAgKSxcbiAgICAgIClcbiAgICApLmZsYXQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY29weUZpbGVXaXRoUmVwbGFjZUNvcmVUb1NoYXJlZChmcm9tUGF0aDogc3RyaW5nLCB0b1BhdGg6IHN0cmluZykge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhmcm9tUGF0aCkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb2xkRmlsZUNvbnRlbnQgPSAoYXdhaXQgcmVhZEZpbGUoZnJvbVBhdGgpKS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbmV3RmlsZUNvbnRlbnQgPSAoKCkgPT4ge1xuICAgICAgY29uc3QgbmZjID0gb2xkRmlsZUNvbnRlbnQucmVwbGFjZSgvZnJvbSBcInNvbmFtdVwiL2csIGBmcm9tIFwiLi9zb25hbXUuc2hhcmVkXCJgKTtcbiAgICAgIHJldHVybiBuZmM7XG4gICAgfSkoKTtcbiAgICByZXR1cm4gd3JpdGVGaWxlKHRvUGF0aCwgbmV3RmlsZUNvbnRlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsl5Tti7Dti7DsmYAg7YWc7ZSM66a/IO2CpOyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gdGVtcGxhdGVLZXkg7YWc7ZSM66a/IO2CpFxuICAgKiBAcGFyYW0gZW51bUlkIOyXtOqxsO2YlSBJRFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzR2VuQ29kZShcbiAgICBlbnRpdHlJZDogc3RyaW5nLFxuICAgIHRlbXBsYXRlS2V5OiBUZW1wbGF0ZUtleSxcbiAgICBlbnVtSWQ/OiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBzdWJQYXRoOiBzdHJpbmc7IGZ1bGxQYXRoOiBzdHJpbmc7IGlzRXhpc3RzOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogZ2VuUGF0aCB9ID0gVGVtcGxhdGVNYW5hZ2VyLmdldCh0ZW1wbGF0ZUtleSkuZ2V0VGFyZ2V0QW5kUGF0aChcbiAgICAgIEVudGl0eU1hbmFnZXIuZ2V0TmFtZXNGcm9tSWQoZW50aXR5SWQpLFxuICAgICAgZW51bUlkLFxuICAgICk7XG5cbiAgICBjb25zdCBzdWJQYXRoID0gcGF0aC5qb2luKHRhcmdldCwgZ2VuUGF0aCk7XG4gICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCBzdWJQYXRoKTtcbiAgICByZXR1cm4ge1xuICAgICAgc3ViUGF0aCxcbiAgICAgIGZ1bGxQYXRoLFxuICAgICAgaXNFeGlzdHM6IGF3YWl0IGV4aXN0cyhmdWxsUGF0aCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7JeU7Yuw7Yuw7JmAIOyXtOqxsO2YleyXkCDrjIDtlbQsIOyDneyEseuQnCDsvZTrk5zqsIAg7KG07J6s7ZWY64qU7KeAIO2ZleyduO2VqeuLiOuLpC5cbiAgICogQHBhcmFtIGVudGl0eUlkIOyXlO2LsO2LsCBJRFxuICAgKiBAcGFyYW0gZW51bXMg7Je06rGw7ZiVIOugiOydtOu4lFxuICAgKiBAcmV0dXJucyDsg53shLHrkJwg7L2U65Oc6rCAIOyhtOyerO2VmOuKlOyngCDsl6zrtoBcbiAgICovXG4gIGFzeW5jIGNoZWNrRXhpc3RzKFxuICAgIGVudGl0eUlkOiBzdHJpbmcsXG4gICAgZW51bXM6IHtcbiAgICAgIFtuYW1lOiBzdHJpbmddOiB6LlpvZEVudW08UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyPj4+O1xuICAgIH0sXG4gICk6IFByb21pc2U8UmVjb3JkPGAke1RlbXBsYXRlS2V5fSR7c3RyaW5nfWAsIGJvb2xlYW4+PiB7XG4gICAgY29uc3Qga2V5czogVGVtcGxhdGVLZXlbXSA9IFRlbXBsYXRlS2V5Lm9wdGlvbnM7XG4gICAgY29uc3QgbmFtZXMgPSBFbnRpdHlNYW5hZ2VyLmdldE5hbWVzRnJvbUlkKGVudGl0eUlkKTtcbiAgICBjb25zdCBlbnVtc0tleXMgPSBPYmplY3Qua2V5cyhlbnVtcykuZmlsdGVyKChuYW1lKSA9PiBuYW1lICE9PSBuYW1lcy5jb25zdGFudCk7XG5cbiAgICByZXR1cm4gYXdhaXQgcmVkdWNlQXN5bmMoXG4gICAgICBrZXlzLFxuICAgICAgYXN5bmMgKHJlc3VsdCwga2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IHRwbCA9IFRlbXBsYXRlTWFuYWdlci5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKFwidmlld19lbnVtc1wiKSkge1xuICAgICAgICAgIGF3YWl0IG1hcEFzeW5jKGVudW1zS2V5cywgYXN5bmMgKGNvbXBvbmVudElkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHRhcmdldCwgcGF0aDogcCB9ID0gdHBsLmdldFRhcmdldEFuZFBhdGgobmFtZXMsIGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke2NvbXBvbmVudElkfWBdID0gYXdhaXQgZXhpc3RzKFxuICAgICAgICAgICAgICBwYXRoLmpvaW4oU29uYW11LmFwcFJvb3RQYXRoLCB0YXJnZXQsIHApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyB0YXJnZXQsIHBhdGg6IHAgfSA9IHRwbC5nZXRUYXJnZXRBbmRQYXRoKG5hbWVzKTtcbiAgICAgICAgY29uc3QgeyB0YXJnZXRzIH0gPSBTb25hbXUuY29uZmlnLnN5bmM7XG4gICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoXCI6dGFyZ2V0XCIpKSB7XG4gICAgICAgICAgYXdhaXQgbWFwQXN5bmModGFyZ2V0cywgYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICAgIHJlc3VsdFtgJHtrZXl9X18ke3R9YF0gPSBhd2FpdCBleGlzdHMoXG4gICAgICAgICAgICAgIHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldC5yZXBsYWNlKFwiOnRhcmdldFwiLCB0KSwgcCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdFtrZXldID0gYXdhaXQgZXhpc3RzKHBhdGguam9pbihTb25hbXUuYXBwUm9vdFBhdGgsIHRhcmdldCwgcCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7fSBhcyBSZWNvcmQ8YCR7VGVtcGxhdGVLZXl9JHtzdHJpbmd9YCwgYm9vbGVhbj4sXG4gICAgKTtcbiAgfVxuXG4gIHN5bmNVSSgpIHtcbiAgICBjb25zdCB1aVBvcnQgPSBTb25hbXUuY29uZmlnLnVpPy5wb3J0ID8/IDU3MDAwO1xuXG4gICAgaWYgKCFpc1Rlc3QoKSkge1xuICAgICAgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6JHt1aVBvcnR9L2FwaS9yZWxvYWRgLCB7XG4gICAgICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICAgIH0pLmNhdGNoKChlKSA9PiBjb25zb2xlLmxvZyhjaGFsay5kaW0oYEZhaWxlZCB0byByZWxvYWQgU29uYW11IFVJOiAke2UubWVzc2FnZX1gKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGNyZWF0ZUVudGl0eShmb3JtOiBUZW1wbGF0ZU9wdGlvbnNbXCJlbnRpdHlcIl0pIHtcbiAgICByZXR1cm4gYXdhaXQgY3JlYXRlRW50aXR5KGZvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOychO2YuO2ZmOyaqSDtlITroZ3si5wg66mU7IaM65Oc7J6F64uI64ukLlxuICAgKi9cbiAgYXN5bmMgZGVsRW50aXR5KGVudGl0eUlkOiBzdHJpbmcpOiBQcm9taXNlPHsgZGVsUGF0aHM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4gYXdhaXQgZGVsRW50aXR5KGVudGl0eUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlVGVtcGxhdGU8VCBleHRlbmRzIFRlbXBsYXRlS2V5PihcbiAgICBrZXk6IFQsXG4gICAgdGVtcGxhdGVPcHRpb25zOiBUZW1wbGF0ZU9wdGlvbnNbVF0sXG4gICAgX2dlbmVyYXRlT3B0aW9ucz86IEdlbmVyYXRlT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxBYnNvbHV0ZVBhdGhbXT4ge1xuICAgIHJldHVybiBhd2FpdCBnZW5lcmF0ZVRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zLCBfZ2VuZXJhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmRlclRlbXBsYXRlPFQgZXh0ZW5kcyBrZXlvZiBUZW1wbGF0ZU9wdGlvbnM+KFxuICAgIGtleTogVCxcbiAgICB0ZW1wbGF0ZU9wdGlvbnM6IFRlbXBsYXRlT3B0aW9uc1tUXSxcbiAgKTogUHJvbWlzZTxQYXRoQW5kQ29kZVtdPiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlbmRlclRlbXBsYXRlKGtleSwgdGVtcGxhdGVPcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlZjsnITtmLjtmZjsmqkg7ZSE66Gd7IucIOuplOyGjOuTnOyeheuLiOuLpC5cbiAgICovXG4gIGFzeW5jIHJlbmV3Q2hlY2tzdW1zKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBhd2FpdCByZW5ld0NoZWNrc3VtcygpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaG90IiwiYXNzZXJ0IiwiY2hhbGsiLCJta2RpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwibWluaW1hdGNoIiwicGF0aCIsImRpcm5hbWUiLCJncm91cCIsInVuaXF1ZSIsInJlZ2lzdGVyZWRBcGlzIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk5haXRlIiwiVGVtcGxhdGVNYW5hZ2VyIiwiVGVtcGxhdGVLZXkiLCJtYXBBc3luYyIsInJlZHVjZUFzeW5jIiwiY2VudGVyVGV4dCIsImlzVGVzdCIsImV4aXN0cyIsInJ1bldpdGhHcmFjZWZ1bFNodXRkb3duIiwiYXJlRmlsZXNTYW1lIiwiZmluZENoYW5nZWRGaWxlc1VzaW5nQ2hlY2tzdW1zIiwicmVuZXdDaGVja3N1bXMiLCJnZW5lcmF0ZVRlbXBsYXRlIiwicmVuZGVyVGVtcGxhdGUiLCJjcmVhdGVFbnRpdHkiLCJkZWxFbnRpdHkiLCJnZXRDaGVja3N1bVBhdHRlcm5Hcm91cEluQWJzb2x1dGVQYXRoIiwibG9hZEFwaXMiLCJsb2FkTW9kZWxzIiwibG9hZFR5cGVzIiwiU3luY2VyIiwiYXBpcyIsInR5cGVzIiwibW9kZWxzIiwiaXNTeW5jaW5nIiwic3luYyIsInRhcmdldHMiLCJjb25maWciLCJjb3B5U2hhcmVkVG9UYXJnZXRzIiwiY2hhbmdlZEZpbGVzIiwibGVuZ3RoIiwiY29uc29sZSIsImxvZyIsImJsYWNrIiwiYmdHcmVlbiIsImRvU3luY0FjdGlvbnMiLCJ3aGVuVGhpc0hhcHBlbnMiLCJ3YWl0Rm9yVXBUbyIsInN5bmNGcm9tV2F0Y2hlciIsImV2ZW50IiwiZGlmZkZpbGVQYXRoIiwiaW52YWxpZGF0ZWRQYXRocyIsImludmFsaWRhdGVGaWxlIiwiYm9sZCIsImludmFsaWRhdGVkUGF0aCIsInJlbW92ZWRBcGlzIiwicmVtb3ZlSW52YWxpZGF0ZWRSZWdpc3RlcmVkQXBpcyIsImJsdWUiLCJyZWxhdGl2ZSIsImFwaVJvb3RQYXRoIiwiZ3JheSIsImlzSW5DaGVja1BhdHRlcm5Hcm91cCIsIk9iamVjdCIsInZhbHVlcyIsInNvbWUiLCJwYXR0ZXJuIiwiYXV0b2xvYWRUeXBlcyIsImF1dG9sb2FkTW9kZWxzIiwiYXV0b2xvYWRBcGlzIiwic3luY1VJIiwiZW5kc1dpdGgiLCJlbnRpdHlJZCIsImdldEVudGl0eUlkRnJvbVBhdGgiLCJ0b1JlbW92ZSIsImZpbHRlciIsImFwaSIsIm1vZGVsTmFtZSIsInNwbGljZSIsImluZGV4T2YiLCJ0YXJnZXQiLCJzcmNQYXRoIiwiam9pbiIsInJlcGxhY2UiLCJhcHBSb290UGF0aCIsIkVycm9yIiwiZGVzdFBhdGgiLCJyZWN1cnNpdmUiLCJ3YXJuIiwiZGlmZkZpbGVQYXRocyIsImRpZmZHcm91cHMiLCJjYWxjdWxhdGVEaWZmR3JvdXBzIiwiZGlmZlR5cGVzIiwia2V5cyIsImluY2x1ZGVzIiwiaGFuZGxlRW50aXR5Q2hhbmdlIiwiaGFuZGxlVHlwZXNPckZ1bmN0aW9uc09yR2VuZXJhdGVkQ2hhbmdlIiwiaGFuZGxlTW9kZWxPckZyYW1lQ2hhbmdlIiwiYWN0aW9uU3luY0NvbmZpZyIsImRpZmZGaWxlcyIsInIiLCJtYXRjaGVkIiwibWF0Y2giLCJ0IiwicmVsb2FkIiwiZW50aXR5IiwiZ2V0IiwidHlwZUZpbGVQYXRoIiwibmFtZXMiLCJmcyIsInBhcmVudElkIiwidW5kZWZpbmVkIiwiYWN0aW9uR2VuZXJhdGVTY2hlbWFzIiwiZ2VuZXJhdGVkIiwicHVzaCIsInRzUGF0aHMiLCJmdW5jdGlvbnMiLCJhY3Rpb25TeW5jRmlsZXNUb1RhcmdldHMiLCJtZXJnZWRHcm91cCIsIm1vZGVsIiwiZnJhbWUiLCJwYXJhbXMiLCJtYXAiLCJtb2RlbFBhdGgiLCJuYW1lc1JlY29yZCIsImdldE5hbWVzRnJvbUlkIiwiZnJhbWVOYW1lIiwiYWN0aW9uR2VuZXJhdGVTZXJ2aWNlcyIsImFjdGlvbkdlbmVyYXRlSHR0cHMiLCJob3N0IiwicG9ydCIsInNlcnZlciIsImxpc3RlbiIsImNvbnRlbnQiLCJQcm9taXNlIiwiYWxsIiwib3ZlcndyaXRlIiwiZmxhdCIsInBhcmFtc0FycmF5IiwicmVzIiwiZGlyIiwiYXBpRGlyIiwicmVhbFNyYyIsImRzdCIsImNvcHlGaWxlV2l0aFJlcGxhY2VDb3JlVG9TaGFyZWQiLCJmcm9tUGF0aCIsInRvUGF0aCIsIm9sZEZpbGVDb250ZW50IiwidG9TdHJpbmciLCJuZXdGaWxlQ29udGVudCIsIm5mYyIsImNoZWNrRXhpc3RzR2VuQ29kZSIsInRlbXBsYXRlS2V5IiwiZW51bUlkIiwiZ2VuUGF0aCIsImdldFRhcmdldEFuZFBhdGgiLCJzdWJQYXRoIiwiZnVsbFBhdGgiLCJpc0V4aXN0cyIsImNoZWNrRXhpc3RzIiwiZW51bXMiLCJvcHRpb25zIiwiZW51bXNLZXlzIiwibmFtZSIsImNvbnN0YW50IiwicmVzdWx0Iiwia2V5IiwidHBsIiwic3RhcnRzV2l0aCIsImNvbXBvbmVudElkIiwicCIsInVpUG9ydCIsInVpIiwiZmV0Y2giLCJtZXRob2QiLCJjYXRjaCIsImUiLCJkaW0iLCJtZXNzYWdlIiwiZm9ybSIsInRlbXBsYXRlT3B0aW9ucyIsIl9nZW5lcmF0ZU9wdGlvbnMiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLEdBQUcsUUFBUSx1QkFBdUI7QUFDM0MsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixTQUFTQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3pELFNBQVNDLFNBQVMsUUFBUSxZQUFZO0FBQ3RDLE9BQU9DLFFBQVFDLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLFNBQVNDLEtBQUssRUFBRUMsTUFBTSxRQUFRLFVBQVU7QUFFeEMsU0FBU0MsY0FBYyxRQUFRLHVCQUFvQjtBQUNuRCxTQUFTQyxNQUFNLFFBQVEsbUJBQWdCO0FBQ3ZDLFNBQVNDLGFBQWEsUUFBZ0MsOEJBQTJCO0FBQ2pGLFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FB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
@@ -278,7 +278,7 @@ export function zodTypeToTsTypeDef(zt) {
278
278
  // ZodType - 재귀적으로 변환
279
279
  if (part && typeof part === "object" && part._zod) {
280
280
  const innerType = zodTypeToTsTypeDef(part);
281
- return `\${${innerType}}`;
281
+ return `$\{${innerType}}`;
282
282
  }
283
283
  // 폴백
284
284
  return `\${string}`;
@@ -486,9 +486,11 @@ export function zodTypeToTsTypeDef(zt) {
486
486
  return "string-plain";
487
487
  } else if (zodType instanceof z.ZodLiteral) {
488
488
  return "string-plain";
489
+ } else if (zodType instanceof z.ZodTemplateLiteral) {
490
+ return "string-plain";
489
491
  } else {
490
492
  throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
491
493
  }
492
494
  }
493
495
 
494
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDxzdHJpbmc+O1xuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJhcHBsaWNhdGlvblwiLCBgJHttb2R1bGVQYXRofS5qc2ApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKS5hcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGBcXCR7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50KX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSl9Lm9wdGlvbmFsKClgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0RhdGVBcnJheVByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNFbnVtQXJyYXlQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJpc0pzb25Qcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1V1aWRBcnJheVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImNyZWF0ZUltcG9ydFVybCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ6b2RUeXBlIiwidW5rbm93biIsIm51bWJlciIsImludCIsImFycmF5IiwiYmlnaW50IiwiaWQiLCJsZW5ndGgiLCJzdHJpbmciLCJtYXgiLCJib29sZWFuIiwiZGF0ZSIsInV1aWQiLCJoYXNKb2luQ29sdW1uIiwidW5zaWduZWQiLCJub25uZWdhdGl2ZSIsIm51bGxhYmxlIiwicHJvcFRvWm9kVHlwZURlZiIsImluamVjdEltcG9ydEtleXMiLCJzdG10IiwibmFtZSIsInB1c2giLCJyZWxhdGlvblR5cGUiLCJ3aXRoIiwicHJvcE5vZGVUb1pvZFR5cGVEZWYiLCJwcm9wTm9kZSIsIm5vZGVUeXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZFByb3BOb2RlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwienQiLCJkZWYiLCJ0eXBlIiwiaW5uZXJUeXBlIiwicmVjb3JkVHlwZSIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWwiLCJlbGVtZW50Iiwic2hhcGUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFydHMiLCJwYXJ0IiwiX3pvZCIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUIsRUFDbkJDLHNCQUFzQixFQUN0QkMsY0FBYyxFQUNkQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGFBQWEsUUFFUixvQkFBaUI7QUFDeEIsU0FBU0Ms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
496
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZW1wbGF0ZS96b2QtY29udmVydGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogem9kLWNvbnZlcnRlciDqtazshLFcbiAqIDEuIOycoO2LuOumrO2LsFxuICogIC0gZ2V0Wm9kVHlwZUJ5SWRcbiAqXG4gKiAyLiBab2Qg7YOA7J6FIOuzgO2ZmCAoRW50aXR5UHJvcCAtPiBab2RUeXBlKVxuICogIC0gcHJvcFRvWm9kVHlwZVxuICpcbiAqIDMuIEVudGl0eVByb3AvTm9kZSAtPiBab2Qg7L2U65OcIOusuOyekOyXtFxuICogIC0gcHJvcFRvWm9kVHlwZURlZlxuICogIC0gcHJvcE5vZGVUb1pvZFR5cGVEZWZcbiAqXG4gKiA0LiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYIChab2RUeXBlIC0+IFpvZENvZGUpXG4gKiAgLSB6b2RUeXBlVG9ab2RDb2RlXG4gKlxuICogNS4gWm9kIO2DgOyeheydhCBVSSDroIzrjZTrp4Hsl5Ag7IKs7Jqp7ZWgIOyImCDsnojripQgUmVuZGVyaW5nTm9kZeuhnCDrs4DtmZggKFpvZFR5cGUgLT4gUmVuZGVyaW5nTm9kZSlcbiAqICAtIHpvZFR5cGVUb1JlbmRlcmluZ05vZGVcbiAqICAtIHJlc29sdmVSZW5kZXJUeXBlXG4gKi9cblxuaW1wb3J0IGluZmxlY3Rpb24gZnJvbSBcImluZmxlY3Rpb25cIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyAkWm9kTG9vc2VTaGFwZSB9IGZyb20gXCJ6b2QvdjQvY29yZVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLFxuICBpc0JpZ0ludGVnZXJBcnJheVByb3AsXG4gIGlzQmlnSW50ZWdlclNpbmdsZVByb3AsXG4gIGlzQm9vbGVhbkFycmF5UHJvcCxcbiAgaXNCb29sZWFuU2luZ2xlUHJvcCxcbiAgaXNEYXRlQXJyYXlQcm9wLFxuICBpc0RhdGVTaW5nbGVQcm9wLFxuICBpc0VudW1BcnJheVByb3AsXG4gIGlzRW51bVNpbmdsZVByb3AsXG4gIGlzSW50ZWdlckFycmF5UHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNKc29uUHJvcCxcbiAgaXNOdW1iZXJBcnJheVByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNOdW1lcmljQXJyYXlQcm9wLFxuICBpc051bWVyaWNTaW5nbGVQcm9wLFxuICBpc09uZVRvT25lUmVsYXRpb25Qcm9wLFxuICBpc1JlbGF0aW9uUHJvcCxcbiAgaXNTdHJpbmdBcnJheVByb3AsXG4gIGlzU3RyaW5nU2luZ2xlUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlSW1wb3J0VXJsIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0PCRab2RMb29zZVNoYXBlPjtcbnR5cGUgQW55Wm9kTnVsbGFibGUgPSB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT47XG50eXBlIEFueVpvZERlZmF1bHQgPSB6LlpvZERlZmF1bHQ8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kVW5pb24gPSB6LlpvZFVuaW9uPHouWm9kVHlwZVtdPjtcbnR5cGUgQW55Wm9kQXJyYXkgPSB6LlpvZEFycmF5PHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9wdGlvbmFsID0gei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RUZW1wbGF0ZUxpdGVyYWwgPSB6LlpvZFRlbXBsYXRlTGl0ZXJhbDxzdHJpbmc+O1xuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcImRpc3RcIiwgXCJhcHBsaWNhdGlvblwiLCBgJHttb2R1bGVQYXRofS5qc2ApO1xuICBjb25zdCBpbXBvcnRVcmwgPSBjcmVhdGVJbXBvcnRVcmwobW9kdWxlQWJzUGF0aCk7XG4gIGNvbnN0IGltcG9ydGVkID0gYXdhaXQgaW1wb3J0KGltcG9ydFVybCk7XG5cbiAgaWYgKCFpbXBvcnRlZFt6b2RUeXBlSWRdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHpvZFR5cGVJZCAke3pvZFR5cGVJZH1gKTtcbiAgfVxuICByZXR1cm4gaW1wb3J0ZWRbem9kVHlwZUlkXS5kZXNjcmliZSh6b2RUeXBlSWQpO1xufVxuXG4vKipcbiAqIEVudGl0eVByb3DsnYQgWm9kIO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiDqsIEgcHJvcOydmCDtg4DsnoXsl5Ag65Sw6528IOyggeygiO2VnCBab2QgdmFsaWRhdG9y66W8IOyDneyEse2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3BUb1pvZFR5cGUocHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8ei5ab2RUeXBlQW55PiB7XG4gIGxldCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkgPSB6LnVua25vd24oKTtcbiAgaWYgKGlzSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKTtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5pbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5iaWdpbnQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNFbnVtQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IChhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKSkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgem9kVHlwZSA9IHouc3RyaW5nKCkubWF4KHByb3AubGVuZ3RoKS5hcnJheSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc051bWJlclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKTtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY0FycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmJvb2xlYW4oKTtcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW5BcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouZGF0ZSgpO1xuICB9IGVsc2UgaWYgKGlzRGF0ZUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei51dWlkKCk7XG4gIH0gZWxzZSBpZiAoaXNVdWlkQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbikpIHtcbiAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoKHByb3AgYXMgeyB1bnNpZ25lZD86IGJvb2xlYW4gfSkudW5zaWduZWQpIHtcbiAgICB6b2RUeXBlID0gKHpvZFR5cGUgYXMgei5ab2ROdW1iZXIpLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKClgO1xuICB9IGVsc2UgaWYgKGlzTnVtYmVyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoubnVtYmVyKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpYDtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5kYXRlKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKWA7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYm9vbGVhbigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZFNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKClgO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnV1aWQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0pzb25Qcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7cHJvcC5pZH1gO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfV9pZDogei5pbnQoKWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOq3uOyZuCByZWxhdGlvbiDsvIDsnbTsiqQg7KCc7Jm4XG4gICAgICByZXR1cm4gYC8vICR7cHJvcC5uYW1lfTogJHtwcm9wLnJlbGF0aW9uVHlwZX0gJHtwcm9wLndpdGh9YDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFwiLy8gdW5hYmxlIHRvIHJlc29sdmVcIjtcbiAgfVxuXG4gIGlmICgocHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9KS51bnNpZ25lZCkge1xuICAgIHN0bXQgKz0gXCIubm9ubmVnYXRpdmUoKVwiO1xuICB9XG4gIGlmIChwcm9wLm51bGxhYmxlKSB7XG4gICAgc3RtdCArPSBcIi5udWxsYWJsZSgpXCI7XG4gIH1cblxuICByZXR1cm4gYCR7c3RtdH0sYDtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9wTm9kZeulvCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIHBsYWluLCBhcnJheSwgb2JqZWN0IOuFuOuTnCDtg4DsnoXsnYQg7J6s6reA7KCB7Jy866GcIOyymOumrO2VmOyXrCDspJHssqkg6rWs7KGw66W8IOyngOybkO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BOb2RlVG9ab2RUeXBlRGVmKHByb3BOb2RlOiBFbnRpdHlQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwicGxhaW5cIikge1xuICAgIHJldHVybiBwcm9wVG9ab2RUeXBlRGVmKHByb3BOb2RlLnByb3AsIGluamVjdEltcG9ydEtleXMpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcImFycmF5XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6LmFycmF5KHoub2JqZWN0KHtcIixcbiAgICAgIHByb3BOb2RlLmNoaWxkcmVuXG4gICAgICAgIC5tYXAoKGNoaWxkUHJvcE5vZGUpID0+IHByb3BOb2RlVG9ab2RUeXBlRGVmKGNoaWxkUHJvcE5vZGUsIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAuam9pbihcIlxcblwiKSxcbiAgICAgIFwiXCIsXG4gICAgICBcIn0pKSxcIixcbiAgICBdLmpvaW4oXCJcXG5cIik7XG4gIH0gZWxzZSBpZiAocHJvcE5vZGUubm9kZVR5cGUgPT09IFwib2JqZWN0XCIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgcHJvcE5vZGUucHJvcCA/IGAke3Byb3BOb2RlLnByb3AubmFtZX06IGAgOiBcIlwiLFxuICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgYH0pJHtwcm9wTm9kZS5wcm9wPy5udWxsYWJsZSA/IFwiLm51bGxhYmxlKClcIiA6IFwiXCJ9LGAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9Uc1R5cGVEZWYoenQ6IHouWm9kVHlwZSk6IHN0cmluZyB7XG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgY2FzZSBcImFueVwiOlxuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4genQuZGVmLnR5cGU7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKCh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoKHp0IGFzIEFueVpvZERlZmF1bHQpLmRlZi5pbm5lclR5cGUpO1xuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgcmVjb3JkVHlwZSA9IHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSgoenQgYXMgei5ab2RMaXRlcmFsKS52YWx1ZXMpXG4gICAgICAgIC5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHsoenQgYXMgQW55Wm9kVW5pb24pLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgcmV0dXJuIGAkeyh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcIntcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKHNoYXBlW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihzaGFwZVtrZXldLmRlZi5pbm5lclR5cGUpfSxgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7a2V5fTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYoc2hhcGVba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigoenQgYXMgQW55Wm9kT3B0aW9uYWwpLmRlZi5pbm5lclR5cGUpfSB8IHVuZGVmaW5lZGA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gKHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQ6IHVua25vd24pID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKHR5cGVvZiBwYXJ0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihwYXJ0IGFzIHouWm9kVHlwZSk7XG4gICAgICAgICAgcmV0dXJuIGAkXFx7JHtpbm5lclR5cGV9fWA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtj7TrsLFcbiAgICAgICAgcmV0dXJuIGBcXCR7c3RyaW5nfWA7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGBcXGAke3BhcnRzLmpvaW4oXCJcIil9XFxgYDtcbiAgICB9XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBcIkZpbGVcIjtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6b2RUeXBlVG9ab2RDb2RlKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgICAgcmV0dXJuIFwiei5zdHJpbmcoKVwiO1xuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIHJldHVybiBcInoubnVtYmVyKClcIjtcbiAgICBjYXNlIFwiYmlnaW50XCI6XG4gICAgICByZXR1cm4gXCJ6LmJpZ2ludCgpXCI7XG4gICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgIHJldHVybiBcInouYm9vbGVhbigpXCI7XG4gICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIHJldHVybiBcInouZGF0ZSgpXCI7XG4gICAgY2FzZSBcIm51bGxcIjpcbiAgICAgIHJldHVybiBcInoubnVsbCgpXCI7XG4gICAgY2FzZSBcInVuZGVmaW5lZFwiOlxuICAgICAgcmV0dXJuIFwiei51bmRlZmluZWQoKVwiO1xuICAgIGNhc2UgXCJhbnlcIjpcbiAgICAgIHJldHVybiBcInouYW55KClcIjtcbiAgICBjYXNlIFwidW5rbm93blwiOlxuICAgICAgcmV0dXJuIFwiei51bmtub3duKClcIjtcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiBcInoubmV2ZXIoKVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPSAoenQgYXMgQW55Wm9kRGVmYXVsdCkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID0gKHp0IGFzIEFueVpvZFJlY29yZCkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oKHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+KS52YWx1ZXMpLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFskeyh6dCBhcyBBbnlab2RVbmlvbikuZGVmLm9wdGlvbnNcbiAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uKSlcbiAgICAgICAgLmpvaW4oXCIsXCIpfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoKHp0IGFzIHouWm9kRW51bSkuZGVmLmVudHJpZXMpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbF0pID0+ICh0eXBlb2YgdmFsID09PSBcInN0cmluZ1wiID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKCh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50KX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IHNoYXBlID0gKHp0IGFzIEFueVpvZE9iamVjdCkuc2hhcGU7XG4gICAgICByZXR1cm4gW1xuICAgICAgICBcInoub2JqZWN0KHtcIixcbiAgICAgICAgLi4uT2JqZWN0LmtleXMoc2hhcGUpLm1hcCgoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUoc2hhcGVba2V5XSl9LGApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoKHp0IGFzIHouWm9kT3B0aW9uYWw8ei5ab2RUeXBlPikuZGVmLmlubmVyVHlwZSl9Lm9wdGlvbmFsKClgO1xuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gYHouZmlsZSgpYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAoenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydDogdW5rbm93bikgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmICh0eXBlb2YgcGFydCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIHR5cGVvZiBwYXJ0ID09PSBcIm9iamVjdFwiICYmIChwYXJ0IGFzIHouWm9kVHlwZSkuX3pvZCkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKHBhcnQgYXMgei5ab2RUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPSAoenQgYXMgei5ab2RJbnRlcnNlY3Rpb248ei5ab2RUeXBlLCB6LlpvZFR5cGU+KS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLmxlZnQpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlLnNoYXBlKTtcbiAgICBjb25zdCBjaGlsZHJlbiA9IGNvbHVtbktleXMubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGUuc2hhcGVba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPSAoem9kVHlwZSBhcyB6LlpvZEFycmF5PHouWm9kVHlwZUFueT4pLmRlZi5lbGVtZW50O1xuICAgIGlmIChpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZFN0cmluZyAmJiBiYXNlS2V5LmluY2x1ZGVzKFwiaW1hZ2VzXCIpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5kZWYsXG4gICAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXktaW1hZ2VzXCIsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJhcnJheVwiLFxuICAgICAgZWxlbWVudDogem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICBjb25zdCBvcHRpb25Ob2RlcyA9ICh6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+KS5kZWYub3B0aW9ucy5tYXAoKG9wdCkgPT5cbiAgICAgIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSxcbiAgICApO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoKHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZSgoem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGJhc2VLZXkpLFxuICAgICAgbnVsbGFibGU6IHRydWUsXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogcmVzb2x2ZVJlbmRlclR5cGUoYmFzZUtleSwgem9kVHlwZSksXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXqs7wg7YKkIOydtOumhOycvOuhnOu2gO2EsCDsoIHsoIjtlZwgUmVuZGVyVHlwZeydhCDqsrDsoJXtlanri4jri6QuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVSZW5kZXJUeXBlKGtleTogc3RyaW5nLCB6b2RUeXBlOiB6LlpvZFR5cGVBbnkpOiBSZW5kZXJpbmdOb2RlW1wicmVuZGVyVHlwZVwiXSB7XG4gIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2REYXRlKSB7XG4gICAgcmV0dXJuIFwiZGF0ZXRpbWVcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RTdHJpbmcpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiaW1nXCIpIHx8IGtleS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaW1hZ2VcIjtcbiAgICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyKSB7XG4gICAgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RCb29sZWFuKSB7XG4gICAgcmV0dXJuIFwiYm9vbGVhblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEVudW0pIHtcbiAgICByZXR1cm4gXCJlbnVtc1wiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFJlY29yZCkge1xuICAgIHJldHVybiBcInJlY29yZFwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFueSB8fCB6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmtub3duKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5pb24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVGVtcGxhdGVMaXRlcmFsKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaW5mbGVjdGlvbiIsInBhdGgiLCJ6IiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsImlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wIiwiaXNCaWdJbnRlZ2VyQXJyYXlQcm9wIiwiaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCIsImlzQm9vbGVhbkFycmF5UHJvcCIsImlzQm9vbGVhblNpbmdsZVByb3AiLCJpc0RhdGVBcnJheVByb3AiLCJpc0RhdGVTaW5nbGVQcm9wIiwiaXNFbnVtQXJyYXlQcm9wIiwiaXNFbnVtU2luZ2xlUHJvcCIsImlzSW50ZWdlckFycmF5UHJvcCIsImlzSW50ZWdlclNpbmdsZVByb3AiLCJpc0pzb25Qcm9wIiwiaXNOdW1iZXJBcnJheVByb3AiLCJpc051bWJlclNpbmdsZVByb3AiLCJpc051bWVyaWNBcnJheVByb3AiLCJpc051bWVyaWNTaW5nbGVQcm9wIiwiaXNPbmVUb09uZVJlbGF0aW9uUHJvcCIsImlzUmVsYXRpb25Qcm9wIiwiaXNTdHJpbmdBcnJheVByb3AiLCJpc1N0cmluZ1NpbmdsZVByb3AiLCJpc1V1aWRBcnJheVByb3AiLCJpc1V1aWRTaW5nbGVQcm9wIiwiaXNWaXJ0dWFsUHJvcCIsImNyZWF0ZUltcG9ydFVybCIsImdldFpvZFR5cGVCeUlkIiwiem9kVHlwZUlkIiwibW9kdWxlUGF0aCIsImdldE1vZHVsZVBhdGgiLCJtb2R1bGVBYnNQYXRoIiwiam9pbiIsImFwaVJvb3RQYXRoIiwiaW1wb3J0VXJsIiwiaW1wb3J0ZWQiLCJFcnJvciIsImRlc2NyaWJlIiwicHJvcFRvWm9kVHlwZSIsInByb3AiLCJ6b2RUeXBlIiwidW5rbm93biIsIm51bWJlciIsImludCIsImFycmF5IiwiYmlnaW50IiwiaWQiLCJsZW5ndGgiLCJzdHJpbmciLCJtYXgiLCJib29sZWFuIiwiZGF0ZSIsInV1aWQiLCJoYXNKb2luQ29sdW1uIiwidW5zaWduZWQiLCJub25uZWdhdGl2ZSIsIm51bGxhYmxlIiwicHJvcFRvWm9kVHlwZURlZiIsImluamVjdEltcG9ydEtleXMiLCJzdG10IiwibmFtZSIsInB1c2giLCJyZWxhdGlvblR5cGUiLCJ3aXRoIiwicHJvcE5vZGVUb1pvZFR5cGVEZWYiLCJwcm9wTm9kZSIsIm5vZGVUeXBlIiwiY2hpbGRyZW4iLCJtYXAiLCJjaGlsZFByb3BOb2RlIiwiem9kVHlwZVRvVHNUeXBlRGVmIiwienQiLCJkZWYiLCJ0eXBlIiwiaW5uZXJUeXBlIiwicmVjb3JkVHlwZSIsImtleVR5cGUiLCJ2YWx1ZVR5cGUiLCJBcnJheSIsImZyb20iLCJ2YWx1ZXMiLCJ2YWx1ZSIsInVuZGVmaW5lZCIsIm9wdGlvbnMiLCJvcHRpb24iLCJ2YWwiLCJlbGVtZW50Iiwic2hhcGUiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwicGFydHMiLCJwYXJ0IiwiX3pvZCIsInpvZFR5cGVUb1pvZENvZGUiLCJ6RGVmYXVsdERlZiIsImRlZmF1bHRWYWx1ZSIsInpSZWNvcmREZWYiLCJpdGVtcyIsImVudHJpZXMiLCJ6SW50ZXJzZWN0aW9uRGVmIiwibGVmdCIsInJpZ2h0Iiwiem9kVHlwZVRvUmVuZGVyaW5nTm9kZSIsImJhc2VLZXkiLCJsYWJlbCIsImNhbWVsaXplIiwiWm9kT2JqZWN0IiwiY29sdW1uS2V5cyIsInJlbmRlclR5cGUiLCJab2RBcnJheSIsIlpvZFN0cmluZyIsImluY2x1ZGVzIiwiWm9kVW5pb24iLCJvcHRpb25Ob2RlcyIsIm9wdCIsIlpvZE9wdGlvbmFsIiwib3B0aW9uYWwiLCJab2ROdWxsYWJsZSIsInJlc29sdmVSZW5kZXJUeXBlIiwiWm9kRGF0ZSIsImRlc2NyaXB0aW9uIiwiZW5kc1dpdGgiLCJab2ROdW1iZXIiLCJab2RCb29sZWFuIiwiWm9kRW51bSIsIlpvZFJlY29yZCIsIlpvZEFueSIsIlpvZFVua25vd24iLCJab2RMaXRlcmFsIiwiWm9kVGVtcGxhdGVMaXRlcmFsIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0JDLEdBRUQsT0FBT0EsZ0JBQWdCLGFBQWE7QUFDcEMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLENBQUMsUUFBUSxNQUFNO0FBRXhCLFNBQVNDLE1BQU0sUUFBUSxtQkFBZ0I7QUFDdkMsU0FBU0MsYUFBYSxRQUFRLDhCQUEyQjtBQUN6RCxTQUdFQywwQkFBMEIsRUFDMUJDLHFCQUFxQixFQUNyQkMsc0JBQXNCLEVBQ3RCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsZUFBZSxFQUNmQyxnQkFBZ0IsRUFDaEJDLGVBQWUsRUFDZkMsZ0JBQWdCLEVBQ2hCQyxrQkFBa0IsRUFDbEJDLG1CQUFtQixFQUNuQkMsVUFBVSxFQUNWQyxpQkFBaUIsRUFDakJDLGtCQUFrQixFQUNsQkMsa0JBQWtCLEVBQ2xCQyxtQkFBbUIsRUFDbkJD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
@@ -263,9 +263,9 @@ export type SubsetQuery = {
263
263
  loaders: SubsetLoader[];
264
264
  };
265
265
  export declare const SonamuQueryMode: z.ZodEnum<{
266
- list: "list";
267
- count: "count";
268
266
  both: "both";
267
+ count: "count";
268
+ list: "list";
269
269
  }>;
270
270
  export type SonamuQueryMode = z.infer<typeof SonamuQueryMode>;
271
271
  export type KnexError = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.7.1",
3
+ "version": "0.7.2",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -21,11 +21,11 @@
21
21
  "import": "./dist/ai/providers/rtzr/index.js",
22
22
  "types": "./dist/ai/providers/rtzr/index.d.ts"
23
23
  },
24
- "./loader-register": {
25
- "default": "./dist/bin/loader-register.js"
24
+ "./ts-loader-register": {
25
+ "default": "./dist/bin/ts-loader-register.js"
26
26
  },
27
- "./hot-hook-register": {
28
- "default": "./dist/bin/hot-hook-register.js"
27
+ "./hmr-hook-register": {
28
+ "default": "./dist/bin/hmr-hook-register.js"
29
29
  }
30
30
  },
31
31
  "license": "MIT",
@@ -77,9 +77,9 @@
77
77
  "tsicli": "^1.0.5",
78
78
  "vitest": "^4.0.10",
79
79
  "zod": "^4.1.12",
80
- "@sonamu-kit/hot-hook": "^0.4.1",
81
- "@sonamu-kit/hot-runner": "^0.1.1",
82
- "@sonamu-kit/loader": "^2.1.3"
80
+ "@sonamu-kit/hmr-hook": "^0.4.1",
81
+ "@sonamu-kit/hmr-runner": "^0.1.1",
82
+ "@sonamu-kit/ts-loader": "^2.1.3"
83
83
  },
84
84
  "devDependencies": {
85
85
  "@biomejs/biome": "^2.3.7",
@@ -1,11 +1,14 @@
1
- import type { ProviderOptions, Schema, Tool } from "@ai-sdk/provider-utils";
1
+ import type { ProviderOptions, Tool } from "@ai-sdk/provider-utils";
2
2
  import type { LanguageModel, StopCondition, ToolSet } from "ai";
3
+ import type * as z4 from "zod/v4";
3
4
 
4
5
  export type ToolChoiceLimited = "auto" | "none" | "required";
5
6
 
6
7
  export interface ToolDecoratorSchema<INPUT, OUTPUT = unknown> {
7
- input: Schema<INPUT>;
8
- output?: Schema<OUTPUT>;
8
+ // biome-ignore lint/suspicious/noExplicitAny: zod type의 타입 추론에 필요
9
+ input: z4.core.$ZodType<INPUT, any>;
10
+ // biome-ignore lint/suspicious/noExplicitAny: zod type의 타입 추론에 필요
11
+ output?: z4.core.$ZodType<OUTPUT, any>;
9
12
  }
10
13
 
11
14
  export interface ToolDecoratorOptions<INPUT, OUTPUT = unknown> {
package/src/api/config.ts CHANGED
@@ -90,12 +90,23 @@ export type SonamuServerOptions = {
90
90
  };
91
91
  };
92
92
 
93
- export type SonamuConfigExport = SonamuConfig | Promise<SonamuConfig>;
94
-
95
- export function defineConfig(config: SonamuConfig): SonamuConfig;
93
+ // NOTE(Haze, 251209): config에는 T, Promise<T>, () => T, () => Promise<T>가 모두 올 수 있어야 함.
94
+ export type SonamuConfigExport =
95
+ | SonamuConfig
96
+ | Promise<SonamuConfig>
97
+ | (() => SonamuConfig)
98
+ | (() => Promise<SonamuConfig>);
99
+
100
+ export function defineConfig(config: SonamuConfig): Promise<SonamuConfig>;
96
101
  export function defineConfig(config: Promise<SonamuConfig>): Promise<SonamuConfig>;
97
- export function defineConfig(config: SonamuConfigExport): SonamuConfigExport {
98
- return config;
102
+ export function defineConfig(config: () => SonamuConfig): Promise<SonamuConfig>;
103
+ export function defineConfig(config: () => Promise<SonamuConfig>): Promise<SonamuConfig>;
104
+ export function defineConfig(config: SonamuConfigExport): Promise<SonamuConfig> {
105
+ if (typeof config === "function") {
106
+ return Promise.resolve(config());
107
+ }
108
+
109
+ return Promise.resolve(config);
99
110
  }
100
111
 
101
112
  /**
@@ -13,6 +13,7 @@ import {
13
13
  import type { ApiParam, ApiParamType } from "../types/types";
14
14
  import type { UploadContext } from "./context";
15
15
  import { Sonamu } from "./sonamu";
16
+ import { UpsertBuilder } from "../database/upsert-builder";
16
17
 
17
18
  export interface GuardKeys {
18
19
  query: true;
@@ -218,7 +219,7 @@ export function transactional(options: TransactionalOptions = {}) {
218
219
 
219
220
  return puri.knex.transaction(
220
221
  async (trx) => {
221
- const trxWrapper = new PuriTransactionWrapper(trx, this.getUpsertBuilder());
222
+ const trxWrapper = new PuriTransactionWrapper(trx, new UpsertBuilder());
222
223
  // TransactionContext에 트랜잭션 저장
223
224
  DB.getTransactionContext().setTransaction(dbPreset, trxWrapper);
224
225