sonamu 0.7.51 → 0.7.53

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 (82) hide show
  1. package/dist/api/sonamu.js +3 -4
  2. package/dist/auth/auth-generator.d.ts +12 -1
  3. package/dist/auth/auth-generator.d.ts.map +1 -1
  4. package/dist/auth/auth-generator.js +134 -58
  5. package/dist/auth/better-auth-entities.d.ts +3 -3
  6. package/dist/auth/better-auth-entities.d.ts.map +1 -1
  7. package/dist/auth/better-auth-entities.js +4 -4
  8. package/dist/auth/index.d.ts +3 -1
  9. package/dist/auth/index.d.ts.map +1 -1
  10. package/dist/auth/index.js +4 -2
  11. package/dist/auth/plugins/entity-definitions/admin.d.ts +18 -0
  12. package/dist/auth/plugins/entity-definitions/admin.d.ts.map +1 -0
  13. package/dist/auth/plugins/entity-definitions/admin.js +59 -0
  14. package/dist/auth/plugins/entity-definitions/index.d.ts +20 -0
  15. package/dist/auth/plugins/entity-definitions/index.d.ts.map +1 -0
  16. package/dist/auth/plugins/entity-definitions/index.js +27 -0
  17. package/dist/auth/plugins/entity-definitions/phone-number.d.ts +11 -0
  18. package/dist/auth/plugins/entity-definitions/phone-number.d.ts.map +1 -0
  19. package/dist/auth/plugins/entity-definitions/phone-number.js +43 -0
  20. package/dist/auth/plugins/entity-definitions/two-factor.d.ts +10 -0
  21. package/dist/auth/plugins/entity-definitions/two-factor.d.ts.map +1 -0
  22. package/dist/auth/plugins/entity-definitions/two-factor.js +95 -0
  23. package/dist/auth/plugins/entity-definitions/types.d.ts +39 -0
  24. package/dist/auth/plugins/entity-definitions/types.d.ts.map +1 -0
  25. package/dist/auth/plugins/entity-definitions/types.js +10 -0
  26. package/dist/auth/plugins/entity-definitions/username.d.ts +11 -0
  27. package/dist/auth/plugins/entity-definitions/username.d.ts.map +1 -0
  28. package/dist/auth/plugins/entity-definitions/username.js +43 -0
  29. package/dist/auth/plugins/index.d.ts +2 -0
  30. package/dist/auth/plugins/index.d.ts.map +1 -0
  31. package/dist/auth/plugins/index.js +4 -0
  32. package/dist/auth/plugins/wrappers/admin.d.ts +807 -0
  33. package/dist/auth/plugins/wrappers/admin.d.ts.map +1 -0
  34. package/dist/auth/plugins/wrappers/admin.js +36 -0
  35. package/dist/auth/plugins/wrappers/index.d.ts +5 -0
  36. package/dist/auth/plugins/wrappers/index.d.ts.map +1 -0
  37. package/dist/auth/plugins/wrappers/index.js +6 -0
  38. package/dist/auth/plugins/wrappers/phone-number.d.ts +317 -0
  39. package/dist/auth/plugins/wrappers/phone-number.d.ts.map +1 -0
  40. package/dist/auth/plugins/wrappers/phone-number.js +29 -0
  41. package/dist/auth/plugins/wrappers/two-factor.d.ts +635 -0
  42. package/dist/auth/plugins/wrappers/two-factor.d.ts.map +1 -0
  43. package/dist/auth/plugins/wrappers/two-factor.js +35 -0
  44. package/dist/auth/plugins/wrappers/username.d.ts +190 -0
  45. package/dist/auth/plugins/wrappers/username.d.ts.map +1 -0
  46. package/dist/auth/plugins/wrappers/username.js +29 -0
  47. package/dist/bin/cli.js +54 -5
  48. package/dist/entity/entity-manager.d.ts +4 -4
  49. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  50. package/dist/syncer/syncer-actions.js +9 -4
  51. package/dist/syncer/syncer.d.ts.map +1 -1
  52. package/dist/syncer/syncer.js +6 -3
  53. package/dist/template/implementations/sd.template.d.ts.map +1 -1
  54. package/dist/template/implementations/sd.template.js +13 -8
  55. package/dist/types/types.d.ts +9 -9
  56. package/package.json +3 -2
  57. package/src/api/sonamu.ts +2 -2
  58. package/src/auth/auth-generator.ts +175 -68
  59. package/src/auth/better-auth-entities.ts +3 -3
  60. package/src/auth/index.ts +5 -1
  61. package/src/auth/plugins/entity-definitions/admin.ts +60 -0
  62. package/src/auth/plugins/entity-definitions/index.ts +36 -0
  63. package/src/auth/plugins/entity-definitions/phone-number.ts +40 -0
  64. package/src/auth/plugins/entity-definitions/two-factor.ts +53 -0
  65. package/src/auth/plugins/entity-definitions/types.ts +44 -0
  66. package/src/auth/plugins/entity-definitions/username.ts +40 -0
  67. package/src/auth/plugins/index.ts +2 -0
  68. package/src/auth/plugins/wrappers/admin.ts +40 -0
  69. package/src/auth/plugins/wrappers/index.ts +4 -0
  70. package/src/auth/plugins/wrappers/phone-number.ts +33 -0
  71. package/src/auth/plugins/wrappers/two-factor.ts +39 -0
  72. package/src/auth/plugins/wrappers/username.ts +33 -0
  73. package/src/bin/cli.ts +62 -4
  74. package/src/skills/sonamu/SKILL.md +3 -1
  75. package/src/skills/sonamu/auth-migration.md +693 -0
  76. package/src/skills/sonamu/auth.md +62 -1
  77. package/src/skills/sonamu/config.md +15 -3
  78. package/src/skills/sonamu/frontend.md +527 -24
  79. package/src/skills/sonamu/migration.md +82 -0
  80. package/src/syncer/syncer-actions.ts +5 -5
  81. package/src/syncer/syncer.ts +9 -2
  82. package/src/template/implementations/sd.template.ts +12 -7
@@ -5,8 +5,7 @@ import fs from "node:fs/promises";
5
5
  import mime, { lookup as mimeLookup } from "mime-types";
6
6
  import os from "os";
7
7
  import path from "path";
8
- import { convertFastifyHeadersToStandard, createMockSSEFactory, DB, isDaemonServer, merge } from "../index.js";
9
- import { SONAMU_FIELD_MAPPINGS } from "../auth/better-auth-entities.js";
8
+ import { BASE_FIELD_MAPPINGS, convertFastifyHeadersToStandard, createMockSSEFactory, DB, isDaemonServer, merge } from "../index.js";
10
9
  import { applyCacheHeaders, CachePresets } from "../cache-control/cache-control.js";
11
10
  import { toFastifyCompressOption } from "../compress/compress.js";
12
11
  import { Naite } from "../naite/naite.js";
@@ -865,7 +864,7 @@ class SonamuClass {
865
864
  if (!options) return;
866
865
  const basePath = options.basePath ?? "/api/auth";
867
866
  // 사용자 설정과 기본값을 merge
868
- const mergedFieldMappings = merge(SONAMU_FIELD_MAPPINGS, options);
867
+ const mergedFieldMappings = merge(BASE_FIELD_MAPPINGS, options);
869
868
  // better-auth 인스턴스 생성
870
869
  const { betterAuth } = await import("better-auth");
871
870
  const { Pool } = await import("pg");
@@ -1024,4 +1023,4 @@ export const Sonamu = new SonamuClass();
1024
1023
  return `uploads/${timestamp}-${random}.${ext}`;
1025
1024
  }
1026
1025
 
1027
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbn0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgeyBTT05BTVVfRklFTERfTUFQUElOR1MgfSBmcm9tIFwiLi4vYXV0aC9iZXR0ZXItYXV0aC1lbnRpdGllc1wiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbmZpZywgQ2FjaGVNYW5hZ2VyIH0gZnJvbSBcIi4uL2NhY2hlL3R5cGVzXCI7XG5pbXBvcnQgeyBhcHBseUNhY2hlSGVhZGVycywgQ2FjaGVQcmVzZXRzIH0gZnJvbSBcIi4uL2NhY2hlLWNvbnRyb2wvY2FjaGUtY29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBDYWNoZUNvbnRyb2xDb25maWcsIENhY2hlQ29udHJvbFJlcXVlc3QgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC90eXBlc1wiO1xuaW1wb3J0IHsgdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24gfSBmcm9tIFwiLi4vY29tcHJlc3MvY29tcHJlc3NcIjtcbmltcG9ydCB0eXBlIHsgQ29tcHJlc3NPcHRpb25zIH0gZnJvbSBcIi4uL2NvbXByZXNzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsaXplZFN0cmluZyB9IGZyb20gXCIuLi9kaWN0L3R5cGVzXCI7XG5pbXBvcnQgeyBOYWl0ZSB9IGZyb20gXCIuLi9uYWl0ZS9uYWl0ZVwiO1xuaW1wb3J0IHsgQnVmZmVyZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvYnVmZmVyZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlTWFuYWdlciB9IGZyb20gXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBLZXlHZW5lcmF0b3IgfSBmcm9tIFwiLi4vc3RvcmFnZS90eXBlc1wiO1xuaW1wb3J0IHsgVXBsb2FkZWRGaWxlIH0gZnJvbSBcIi4uL3N0b3JhZ2UvdXBsb2FkZWQtZmlsZVwiO1xuaW1wb3J0IHR5cGUgeyBTeW5jZXIgfSBmcm9tIFwiLi4vc3luY2VyL3N5bmNlclwiO1xuaW1wb3J0IHR5cGUgeyBXb3JrZmxvd01hbmFnZXIgfSBmcm9tIFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVGYXN0aWZ5Q29uZmlnIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBleGlzdHMsIGZpbGVFeGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11Q29uZmlnLCBTb25hbXVTZXJ2ZXJPcHRpb25zLCBTb25hbXVUYXNrT3B0aW9ucyB9IGZyb20gXCIuL2NvbmZpZ1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSBcIi4vY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBFeHRlbmRlZEFwaSB9IGZyb20gXCIuL2RlY29yYXRvcnNcIjtcbmltcG9ydCB7IGdldFNlY3JldHMsIHR5cGUgU29uYW11U2VjcmV0cyB9IGZyb20gXCIuL3NlY3JldFwiO1xuXG5jbGFzcyBTb25hbXVDbGFzcyB7XG4gIHB1YmxpYyBpc0luaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBhc3luY0xvY2FsU3RvcmFnZTogQXN5bmNMb2NhbFN0b3JhZ2U8e1xuICAgIGNvbnRleHQ6IENvbnRleHQ7XG4gIH0+ID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlKCk7XG5cbiAgcHVibGljIGdldENvbnRleHQoKTogQ29udGV4dCB7XG4gICAgY29uc3Qgc3RvcmUgPSB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLmdldFN0b3JlKCk7XG4gICAgaWYgKHN0b3JlPy5jb250ZXh0KSB7XG4gICAgICByZXR1cm4gc3RvcmUuY29udGV4dCBhcyBDb250ZXh0O1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIC8vIO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICByZXR1cm4ge1xuICAgICAgICByZXF1ZXN0OiBudWxsLFxuICAgICAgICByZXBseTogbnVsbCxcbiAgICAgICAgaGVhZGVyczoge30sXG4gICAgICAgIGNyZWF0ZVNTRTogKHNjaGVtYTogWm9kT2JqZWN0KSA9PiBjcmVhdGVNb2NrU1NFRmFjdG9yeShzY2hlbWEpLFxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IO2FjOyKpO2MhSDtmZjqsr3sl5DshJwg7Luo7YWN7Iqk7Yq46rCAIOyjvOyeheuQmOyngCDslYrsnYAg6rK97JqwIOu5iCDsu6jthY3siqTtirgg66as7YS0XG4gICAgICAgIG5haXRlU3RvcmU6IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCksXG4gICAgICB9IGFzIHVua25vd24gYXMgQ29udGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGNhbm5vdCBmaW5kIGNvbnRleHRcIik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCB8IG51bGwgPSBudWxsO1xuICBzZXQgYXBpUm9vdFBhdGgoYXBpUm9vdFBhdGg6IEFic29sdXRlUGF0aCkge1xuICAgIHRoaXMuX2FwaVJvb3RQYXRoID0gYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwaVJvb3RQYXRoKCk6IEFic29sdXRlUGF0aCB7XG4gICAgaWYgKHRoaXMuX2FwaVJvb3RQYXRoID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYXBpUm9vdFBhdGg7XG4gIH1cbiAgZ2V0IGFwcFJvb3RQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfVxuXG4gIHByaXZhdGUgX2RiQ29uZmlnOiBTb25hbXVEQkNvbmZpZyB8IG51bGwgPSBudWxsO1xuICBzZXQgZGJDb25maWcoZGJDb25maWc6IFNvbmFtdURCQ29uZmlnKSB7XG4gICAgdGhpcy5fZGJDb25maWcgPSBkYkNvbmZpZztcbiAgfVxuICBnZXQgZGJDb25maWcoKTogU29uYW11REJDb25maWcge1xuICAgIGlmICh0aGlzLl9kYkNvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2RiQ29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY2VyOiBTeW5jZXIgfCBudWxsID0gbnVsbDtcbiAgc2V0IHN5bmNlcihzeW5jZXI6IFN5bmNlcikge1xuICAgIHRoaXMuX3N5bmNlciA9IHN5bmNlcjtcbiAgfVxuICBnZXQgc3luY2VyKCk6IFN5bmNlciB7XG4gICAgaWYgKHRoaXMuX3N5bmNlciA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3N5bmNlcjtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbmZpZzogU29uYW11Q29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBjb25maWcoY29uZmlnOiBTb25hbXVDb25maWcpIHtcbiAgICB0aGlzLl9jb25maWcgPSBjb25maWc7XG4gIH1cbiAgZ2V0IGNvbmZpZygpOiBTb25hbXVDb25maWcge1xuICAgIGlmICh0aGlzLl9jb25maWcgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgc2VjcmV0czogU29uYW11U2VjcmV0cyA9IGdldFNlY3JldHMoKTtcblxuICBwcml2YXRlIF9zdG9yYWdlOiBTdG9yYWdlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogU3RvcmFnZU1hbmFnZXIg7J247Iqk7YS07IqkXG4gICAqL1xuICBnZXQgc3RvcmFnZSgpOiBTdG9yYWdlTWFuYWdlciB7XG4gICAgaWYgKCF0aGlzLl9zdG9yYWdlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdG9yYWdlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgc3RvcmFnZSBjb25maWcuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3RvcmFnZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhY2hlOiBDYWNoZU1hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgLyoqXG4gICAqIENhY2hlTWFuYWdlciDsnbjsiqTthLTsiqQgKEJlbnRvQ2FjaGUpXG4gICAqL1xuICBnZXQgY2FjaGUoKTogQ2FjaGVNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX2NhY2hlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQuIENoZWNrIGNhY2hlIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSBfd29ya2Zsb3dzOiBXb3JrZmxvd01hbmFnZXIgfCBudWxsID0gbnVsbDtcbiAgZ2V0IHdvcmtmbG93cygpOiBXb3JrZmxvd01hbmFnZXIge1xuICAgIGlmICh0aGlzLl93b3JrZmxvd3MgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtmbG93cztcbiAgfVxuXG4gIHByaXZhdGUgX2F1dGg6IEF1dGggfCBudWxsID0gbnVsbDtcbiAgZ2V0IGF1dGgoKTogQXV0aCB7XG4gICAgaWYgKCF0aGlzLl9hdXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdXRoIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgYXV0aCBjb25maWcgaW4gc29uYW11LmNvbmZpZy50cy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hdXRoO1xuICB9XG5cbiAgLy8gSE1SIOyymOumrFxuICBwdWJsaWMgd2F0Y2hlcjogRlNXYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcGVuZGluZ0ZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBwcml2YXRlIGhtclN0YXJ0VGltZTogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UgfCBudWxsID0gbnVsbDtcblxuICBhc3luYyBpbml0Rm9yVGVzdGluZygpIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBpbml0KFxuICAgIGRvU2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4gICAgZW5hYmxlU3luYzogYm9vbGVhbiA9IHRydWUsXG4gICAgYXBpUm9vdFBhdGg/OiBBYnNvbHV0ZVBhdGgsXG4gICAgZm9yVGVzdGluZzogYm9vbGVhbiA9IGZhbHNlLFxuICApIHtcbiAgICB0aGlzLmZvclRlc3RpbmcgPSBmb3JUZXN0aW5nO1xuXG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS50aW1lKGNoYWxrLmN5YW4oYFNvbmFtdS5pbml0JHtmb3JUZXN0aW5nID8gXCIgZm9yIHRlc3RpbmdcIiA6IFwiXCJ9YCkpO1xuICAgIH1cblxuICAgIC8vIEFQSSDro6jtirgg7Yyo7IqkXG4gICAgY29uc3QgeyBmaW5kQXBpUm9vdFBhdGggfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL3V0aWxzXCIpO1xuICAgIHRoaXMuYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aCA/PyBmaW5kQXBpUm9vdFBhdGgoKTtcblxuICAgIC8vIOyEpOygleydhCDroZzrlKntlZjripQg6rKD67aA7YSwIOyLnOyekVxuICAgIGNvbnN0IHsgbG9hZENvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb25maWdcIik7XG4gICAgdGhpcy5jb25maWcgPSBhd2FpdCBsb2FkQ29uZmlnKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIC8vIHNvbmFtdS5jb25maWcudHMg6riw67O46rCSIOyEpOyglVxuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuICAgIHRoaXMuY29uZmlnLmRhdGFiYXNlLmRlZmF1bHRPcHRpb25zLmNsaWVudCA9IHRoaXMuY29uZmlnLmRhdGFiYXNlLmRhdGFiYXNlID8/IFwicGdcIjtcblxuICAgIC8vIOuhnOq5hSDshKTsoJVcbiAgICBjb25zdCB7IGNvbmZpZ3VyZUxvZ1RhcGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL2xvZ2dlci9jb25maWd1cmVcIik7XG4gICAgaWYgKHRoaXMuY29uZmlnLmxvZ2dpbmcgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCBjb25maWd1cmVMb2dUYXBlKHtcbiAgICAgICAgLi4udGhpcy5jb25maWcubG9nZ2luZyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIERCIOuhnOuTnFxuICAgIGNvbnN0IHsgREIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2RiXCIpO1xuICAgIHRoaXMuZGJDb25maWcgPSBEQi5nZW5lcmF0ZURCQ29uZmlnKHRoaXMuY29uZmlnLmRhdGFiYXNlKTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKFwiREIgQ29uZmlnIExvYWRlZCFcIikpO1xuICAgIH1cblxuICAgIC8vIEVudGl0eSDroZzrk5xcbiAgICAvLyDthYzsiqTtirjsl5DshJzrj4QgRW50aXR5IOygleuztOuKlCDtlYTsmpTtlanri4jri6QuXG4gICAgLy8gdXBzZXJ06rCAIOygnOuMgOuhnCDsnpHrj5ntlZjroKTrqbQgZW50aXR57J2YIHVuaXF1ZSBpbmRleCDsoJXrs7TqsIAg7ZWE7JqU7ZWY6riwIOuVjOusuOyeheuLiOuLpC5cbiAgICBjb25zdCB7IEVudGl0eU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiKTtcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLmF1dG9sb2FkKGRvU2lsZW50KTtcblxuICAgIC8vIENhY2hlIOy0iOq4sO2ZlFxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUNhY2hlKHRoaXMuY29uZmlnLnNlcnZlci5jYWNoZSwgZm9yVGVzdGluZyk7XG5cbiAgICAvLyDthYzsiqTtjIXsnbgg6rK97JqwIOyLse2BrCDsl4bsnbQg7KSR64uoXG4gICAgaWYgKGZvclRlc3RpbmcpIHtcbiAgICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGFzayDrk7HroZ1cbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVXb3JrZmxvd3ModGhpcy5jb25maWcudGFza3MpO1xuXG4gICAgLy8gU3luY2VyXG4gICAgY29uc3QgeyBTeW5jZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N5bmNlci9zeW5jZXJcIik7XG4gICAgdGhpcy5zeW5jZXIgPSBuZXcgU3luY2VyKCk7XG5cbiAgICAvLyBBdXRvbG9hZDogTW9kZWxzIC8gVHlwZXMgLyBBUElzIC8gV29ya2Zsb3dzIC8gVGVtcGxhdGVzIC8gU1NSIFJvdXRlc1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkVHlwZXMoKTtcbiAgICBhd2FpdCB0aGlzLnN5bmNlci5hdXRvbG9hZE1vZGVscygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkQXBpcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkV29ya2Zsb3dzKCk7XG4gICAgY29uc3QgeyBUZW1wbGF0ZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3RlbXBsYXRlXCIpO1xuICAgIGF3YWl0IFRlbXBsYXRlTWFuYWdlci5hdXRvbG9hZCgpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkU1NSUm91dGVzKCk7XG5cbiAgICBjb25zdCB7IGlzTG9jYWwsIGlzVGVzdCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpKSB7XG4gICAgICAvLyDroZzsu6zsl5DshJzripQg7L2U65OcIOyDneyEseydhCDsnITtlbQgQmlvbWUg7IWL7JeF7J20IO2VhOyalO2VqCAo7ZiE7J6sIGFwaVJvb3RQYXRoIOyghOuLrO2VmOyXrCDsi6TtlokpXG4gICAgICAoYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvZm9ybWF0dGVyXCIpKS5zZXR1cEJpb21lKHRoaXMuYXBpUm9vdFBhdGgpO1xuICAgIH1cblxuICAgIGNvbnN0IHsgaXNIb3RSZWxvYWRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSAmJiAhaXNUZXN0KCkgJiYgaXNIb3RSZWxvYWRTZXJ2ZXIoKSAmJiBlbmFibGVTeW5jKSB7XG4gICAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jKCk7XG4gICAgICBhd2FpdCB0aGlzLnN0YXJ0V2F0Y2hlcigpO1xuICAgIH1cblxuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWVFbmQoY2hhbGsuY3lhbihcIlNvbmFtdS5pbml0XCIpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZXJ2ZXIoaW5pdE9wdGlvbnM/OiB7IGVuYWJsZVN5bmM/OiBib29sZWFuOyBkb1NpbGVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQoaW5pdE9wdGlvbnM/LmRvU2lsZW50LCBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY29uZmlnLnNlcnZlcjtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IGZhc3RpZnkgfSA9IGF3YWl0IGltcG9ydChcImZhc3RpZnlcIik7XG4gICAgY29uc3QgeyBnZXRMb2dUYXBlRmFzdGlmeUxvZ2dlciB9ID0gYXdhaXQgaW1wb3J0KFwiQGxvZ3RhcGUvZmFzdGlmeVwiKTtcbiAgICBjb25zdCBzZXJ2ZXIgPSBmYXN0aWZ5KHtcbiAgICAgIC4uLm9wdGlvbnMuZmFzdGlmeSxcbiAgICAgIGxvZ2dlcjpcbiAgICAgICAgdGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2VcbiAgICAgICAgICA/IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyKHtcbiAgICAgICAgICAgICAgY2F0ZWdvcnk6IHRoaXMuY29uZmlnLmxvZ2dpbmc/LmZhc3RpZnlDYXRlZ29yeSA/PyBbXCJmYXN0aWZ5XCJdLFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIFN0b3JhZ2Ug7ISk7KCVIOKGkiBTdG9yYWdlTWFuYWdlciDsg53shLFcbiAgICBpZiAob3B0aW9ucy5zdG9yYWdlKSB7XG4gICAgICBjb25zdCB7IFN0b3JhZ2VNYW5hZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdG9yYWdlL3N0b3JhZ2UtbWFuYWdlclwiKTtcbiAgICAgIHRoaXMuX3N0b3JhZ2UgPSBuZXcgU3RvcmFnZU1hbmFnZXIob3B0aW9ucy5zdG9yYWdlKTtcbiAgICB9XG5cbiAgICAvLyDtlIzrn6zqt7jsnbgg65Ox66GdXG4gICAgaWYgKG9wdGlvbnMucGx1Z2lucykge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlclBsdWdpbnMoc2VydmVyLCBvcHRpb25zLnBsdWdpbnMpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmF1dGgpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXJCZXR0ZXJBdXRoKHNlcnZlciwgb3B0aW9ucy5hdXRoKTtcbiAgICB9XG5cbiAgICAvLyBBUEkg65287Jqw7YyFIOyEpOyglVxuICAgIGF3YWl0IHRoaXMud2l0aEZhc3RpZnkoc2VydmVyLCBvcHRpb25zLmFwaUNvbmZpZywge1xuICAgICAgZW5hYmxlU3luYzogaW5pdE9wdGlvbnM/LmVuYWJsZVN5bmMsXG4gICAgICBkb1NpbGVudDogaW5pdE9wdGlvbnM/LmRvU2lsZW50LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyLnOyekVxuICAgIGF3YWl0IHRoaXMuYm9vdChzZXJ2ZXIsIG9wdGlvbnMpO1xuXG4gICAgcmV0dXJuIHNlcnZlcjtcbiAgfVxuXG4gIGFzeW5jIHdpdGhGYXN0aWZ5KFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIG9wdGlvbnM/OiB7XG4gICAgICBlbmFibGVTeW5jPzogYm9vbGVhbjtcbiAgICAgIGRvU2lsZW50PzogYm9vbGVhbjtcbiAgICB9LFxuICApIHtcbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkID09PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5pbml0KG9wdGlvbnM/LmRvU2lsZW50LCBvcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjtcblxuICAgIC8vIHRpbWV6b25lIOyEpOyglVxuICAgIGNvbnN0IHRpbWV6b25lID0gdGhpcy5jb25maWcuYXBpLnRpbWV6b25lO1xuICAgIGlmICh0aW1lem9uZSkge1xuICAgICAgLy8g7YOA7J6E7KG07JeQIOunnuqyjCDsnZHri7Ug64Kg7KecIOyKpO2KuOungeydhCDrs4DtmZjtlbTso7zslrTslbwg7ZWp64uI64ukLlxuICAgICAgLy8g6rCA66C5IHRpbWV6b25l7J20IFwiQXNpYS9TZW91bFwiIOydtOuptFxuICAgICAgLy8gXCIyMDI1LTExLTIxVDAwOjAwOjAwLjAwMFpcIiDrpbwgXCIyMDI1LTExLTIxVDA5OjAwOjAwKzA5OjAwXCIg7Jy866GcIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICBjb25zdCB7IGZvcm1hdEluVGltZVpvbmUgfSA9IGF3YWl0IGltcG9ydChcImRhdGUtZm5zLXR6XCIpO1xuXG4gICAgICAvLyBJU08gODYwMSDrgqDsp5wg7ZiV7IudIOygleq3nOyLnSAo7JiIOiAyMDI0LTAxLTE1VDA5OjMwOjAwLjAwMFopXG4gICAgICBjb25zdCBJU09fREFURV9SRUdFWCA9IC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn0oXFwuXFxkezN9KT9aJC87XG5cbiAgICAgIC8vIFTrpbwg65GY65+s7Iu8IOyekeydgOuUsOyYtO2RnOqwgCDsl4bri6TrqbQgXCIyMDI1LTExLTE5MTc2MzU0NjE4OTAwMDE4OjU2OjI5KzA5OjAwXCLsmYAg6rCZ7J2AIOqysOqzvOqwgCDrgpjsmLXri4jri6QuXG4gICAgICAvLyDsnbTripQgZGF0ZS1mbnMg7Yq57J6F64uI64ukLlxuICAgICAgLy8g7J2066CH6rKMIO2VtOuPhCDqtJzssK7sirXri4jri6QuIFwiMjAyNS0xMS0xOVQxODo1NjoyOSswOTowMFwiIOuqqOyWkeycvOuhnCDsnpgg64KY7Ji164uI64ukLlxuICAgICAgY29uc3QgREFURV9GT1JNQVQgPSBcInl5eXktTU0tZGQnVCdISDptbTpzc1hYWFwiO1xuXG4gICAgICBzZXJ2ZXIuc2V0UmVwbHlTZXJpYWxpemVyKChwYXlsb2FkKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXlsb2FkLCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIElTT19EQVRFX1JFR0VYLnRlc3QodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm9ybWF0SW5UaW1lWm9uZShcbiAgICAgICAgICAgICAgbmV3IERhdGUodmFsdWUpLFxuICAgICAgICAgICAgICB0aW1lem9uZSBhcyBgJHtzdHJpbmd9LyR7c3RyaW5nfWAsXG4gICAgICAgICAgICAgIERBVEVfRk9STUFULFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKCFvcHRpb25zPy5kb1NpbGVudCkge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYFRpbWV6b25lIHNldCB0byAke3RpbWV6b25lfWApKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDsoITssrQg65287Jqw7YyFIOumrOyKpO2KuFxuICAgIHNlcnZlci5nZXQoXG4gICAgICBgJHt0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4fS9yb3V0ZXNgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHR5cGVvZiB0aGlzLnN5bmNlci5hcGlzPiA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bmNlci5hcGlzO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gSGVhbHRoY2hlY2sgQVBJXG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L2hlYWx0aGNoZWNrYCxcbiAgICAgIGFzeW5jIChfcmVxdWVzdCwgX3JlcGx5KTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgcmV0dXJuIFwib2tcIjtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIFNvbmFtdSBVSSBBUEkgKOuhnOy7rCDtmZjqsr3sl5DshJzrp4wpXG4gICAgY29uc3QgeyBpc0xvY2FsIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIGNvbnN0IHsgc29uYW11VUlBcGlQbHVnaW4gfSA9IGF3YWl0IGltcG9ydChcIi4uL3VpL2FwaVwiKTtcbiAgICAgIHNlcnZlci5yZWdpc3Rlcihzb25hbXVVSUFwaVBsdWdpbik7XG4gICAgfVxuXG4gICAgLy8g66Gc7LusL+2UhOuhnOuNleyFmCDtmZjqsr0g67aE6riwXG4gICAgY29uc3Qgd2ViUGF0aCA9IHBhdGguam9pbih0aGlzLmFwcFJvb3RQYXRoLCBcIndlYlwiKTtcbiAgICBjb25zdCBoYXNXZWIgPSBhd2FpdCBleGlzdHMod2ViUGF0aCk7XG5cbiAgICAvLyDsoITsl60gY29tcHJlc3Mg7Ji17IWYIOqzhOyCsCAocm91dGUuY29tcHJlc3M6IHRydWXsnbwg65WMIOyCrOyaqSlcbiAgICBjb25zdCBwbHVnaW5Db21wcmVzcyA9IHRoaXMuY29uZmlnLnNlcnZlci5wbHVnaW5zPy5jb21wcmVzcztcbiAgICBjb25zdCBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCA9IHBsdWdpbkNvbXByZXNzXG4gICAgICA/IHBsdWdpbkNvbXByZXNzID09PSB0cnVlXG4gICAgICAgID8geyB0aHJlc2hvbGQ6IDEwMjQsIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSB9XG4gICAgICAgIDoge1xuICAgICAgICAgICAgdGhyZXNob2xkOiBwbHVnaW5Db21wcmVzcy50aHJlc2hvbGQsXG4gICAgICAgICAgICBlbmNvZGluZ3M6IHBsdWdpbkNvbXByZXNzLmVuY29kaW5ncyxcbiAgICAgICAgICAgIGN1c3RvbVR5cGVzOiBwbHVnaW5Db21wcmVzcy5jdXN0b21UeXBlcyxcbiAgICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rCDqsJzrsJwg7ZmY6rK9OiBWaXRlIERldiBTZXJ2ZXIgKyDthrXtlakg7ZW465Ok65+sXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBWaXRlRGV2U2VydmVyKHNlcnZlciwgd2ViUGF0aCwgY29uZmlnLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9OiDqsJzrs4QgQVBJIOudvOyasO2KuCArIOygleyggSDtjIzsnbwg7ISc67mZXG4gICAgICBmb3IgKGNvbnN0IGFwaSBvZiB0aGlzLnN5bmNlci5hcGlzKSB7XG4gICAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgICAgdXJsOiB0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4ICsgYXBpLnBhdGgsXG4gICAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaGFzV2ViKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBWaXRlRGV2U2VydmVyIO2DgOyeheydhCDrj5nsoIHsnLzroZwg66Gc65Oc7ZW07JW8IO2VqFxuICBwcml2YXRlIHZpdGVTZXJ2ZXI6IGFueSA9IG51bGw7XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXR1cFZpdGVEZXZTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICB3ZWJQYXRoOiBzdHJpbmcsXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIGdsb2JhbENvbXByZXNzT3B0aW9ucz86IENvbXByZXNzT3B0aW9ucyxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQGZhc3RpZnkvbWlkZGllIOuTseuhnSAoQ29ubmVjdC1zdHlsZSBtaWRkbGV3YXJlIOyngOybkClcbiAgICBhd2FpdCBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChcIkBmYXN0aWZ5L21pZGRpZVwiKSkuZGVmYXVsdCk7XG5cbiAgICBjb25zdCB2aXRlID0gYXdhaXQgaW1wb3J0KFwidml0ZVwiKTtcblxuICAgIHRoaXMudml0ZVNlcnZlciA9IGF3YWl0IHZpdGUuY3JlYXRlU2VydmVyKHtcbiAgICAgIHJvb3Q6IHdlYlBhdGgsXG4gICAgICBzZXJ2ZXI6IHtcbiAgICAgICAgbWlkZGxld2FyZU1vZGU6IHRydWUsXG4gICAgICAgIGhtcjoge1xuICAgICAgICAgIHNlcnZlcjogc2VydmVyLnNlcnZlcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcHBUeXBlOiBcImN1c3RvbVwiLFxuICAgIH0pO1xuXG4gICAgLy8gVml0ZSBtaWRkbGV3YXJlIOuTseuhnSAoVml0ZSDsl5DshYsg7LKY66asKVxuICAgIHNlcnZlci51c2UoKHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gICAgICAvLyBBUEnsmYAgU29uYW11IFVJ64qUIEZhc3RpZnkg65287Jqw7Yq46rCAIOyymOumrO2VmOuPhOuhnSBza2lwXG4gICAgICBpZiAocmVxLnVybD8uc3RhcnRzV2l0aCh0aGlzLmNvbmZpZy5hcGkucm91dGUucHJlZml4KSB8fCByZXEudXJsPy5zdGFydHNXaXRoKFwiL3NvbmFtdS11aVwiKSkge1xuICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgfVxuICAgICAgLy8g64KY66i47KeA64qUIFZpdGUgbWlkZGxld2FyZeuhnCDsoITri6xcbiAgICAgIHJldHVybiB0aGlzLnZpdGVTZXJ2ZXIubWlkZGxld2FyZXMocmVxLCByZXMsIG5leHQpO1xuICAgIH0pO1xuXG4gICAgLy8gQVBJIOuPmeyggSDrnbzsmrDtjIUgKGNhdGNoLWFsbCDsoITsl5Ag65Ox66GdKVxuICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgIGlmICh0aGlzLnN5bmNlci5tb2RlbHNbYXBpLm1vZGVsTmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOygleydmOuQmOyngCDslYrsnYAg66qo64247JeQIOygkeq3vCAke2FwaS5tb2RlbE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgIG1ldGhvZDogYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA/PyBcIkdFVFwiLFxuICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgaGFuZGxlcjogdGhpcy5jcmVhdGVBcGlIYW5kbGVyKGFwaSwgY29uZmlnKSxcbiAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKGFwaS5vcHRpb25zLmNvbXByZXNzLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU1NSIOudvOyasO2KuCDqsJzrs4Qg65Ox66GdIChjb21wcmVzcyDsmLXshZjsnbQg65287Jqw7Yq467OE66GcIOyggeyaqeuQmOuPhOuhnSlcbiAgICBjb25zdCB7IGdldFNTUlJvdXRlcywgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICBmb3IgKGNvbnN0IHJvdXRlIG9mIHNzclJvdXRlcykge1xuICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICB1cmw6IHJvdXRlLnBhdGgsXG4gICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSByZXF1ZXN0LnVybDtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgIGNvbnN0IGh0bWwgPSBhd2FpdCByZW5kZXJTU1IodXJsLCByb3V0ZSwgcGFyYW1zLCByZXF1ZXN0LCByZXBseSwgY29uZmlnLCB0aGlzLnZpdGVTZXJ2ZXIpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENTUiBmYWxsYmFjayAoU1NSIOudvOyasO2KuOyXkCDrp6Tsua3rkJjsp4Ag7JWK64qUIOuqqOuToCDsmpTssq0pXG4gICAgc2VydmVyLnJvdXRlKHtcbiAgICAgIG1ldGhvZDogW1wiR0VUXCIsIFwiSEVBRFwiXSxcbiAgICAgIHVybDogXCIvKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZnMgPSBhd2FpdCBpbXBvcnQoXCJub2RlOmZzL3Byb21pc2VzXCIpO1xuICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGF3YWl0IGZzLnJlYWRGaWxlKFxuICAgICAgICAgICAgcGF0aC5qb2luKHRoaXMudml0ZVNlcnZlci5jb25maWcucm9vdCwgXCJpbmRleC5odG1sXCIpLFxuICAgICAgICAgICAgXCJ1dGYtOFwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdGVtcGxhdGUgPSBhd2FpdCB0aGlzLnZpdGVTZXJ2ZXIudHJhbnNmb3JtSW5kZXhIdG1sKHVybCwgdGVtcGxhdGUpO1xuXG4gICAgICAgICAgcmVwbHkudHlwZShcInRleHQvaHRtbFwiKTtcbiAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0aGlzLnZpdGVTZXJ2ZXIuc3NyRml4U3RhY2t0cmFjZShlIGFzIEVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcGx5LnN0YXR1cyg1MDApO1xuICAgICAgICAgIHJldHVybiAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIOyEnOuyhCDsooXro4wg7IucIFZpdGXrj4Qg7KKF66OMXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHRoaXMudml0ZVNlcnZlci5jbG9zZSgpO1xuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coXCLinJMgVml0ZSBkZXYgc2VydmVyIGludGVncmF0ZWRcIik7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNldHVwU3RhdGljV2ViU2VydmVyKFxuICAgIHNlcnZlcjogRmFzdGlmeUluc3RhbmNlPFNlcnZlciwgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZT4sXG4gICAgX3dlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zOiBDb21wcmVzc09wdGlvbnMgfCB1bmRlZmluZWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOqyveuhnCDrqoXtmZXtmZQ6IGFwaS9wdWJsaWMvd2ViLCBhcGkvZGlzdC9zc3JcbiAgICBjb25zdCB3ZWJEaXN0UGF0aCA9IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInB1YmxpY1wiLCBcIndlYlwiKTtcbiAgICBjb25zdCBzc3JQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwiZGlzdFwiLCBcInNzclwiKTtcbiAgICBjb25zdCBzc3JFbnRyeVBhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJlbnRyeS1zZXJ2ZXIuZ2VuZXJhdGVkLmpzXCIpO1xuICAgIGNvbnN0IHNzclJvdXRlc1BhdGggPSBwYXRoLmpvaW4oc3NyUGF0aCwgXCJyb3V0ZXMuanNcIik7XG5cbiAgICBpZiAoIShhd2FpdCBleGlzdHMod2ViRGlzdFBhdGgpKSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgV2ViIGRpc3Qgbm90IGZvdW5kOiAke3dlYkRpc3RQYXRofWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNTUiBlbnRyeSDsobTsnqwg7Jes67aAIO2ZleyduFxuICAgIGNvbnN0IHNzckF2YWlsYWJsZSA9IGF3YWl0IGV4aXN0cyhzc3JFbnRyeVBhdGgpO1xuXG4gICAgaWYgKCFzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiBlbnRyeSBub3QgZm91bmQ6ICR7c3NyRW50cnlQYXRofWApO1xuICAgICAgY29uc29sZS53YXJuKFwiICBTU1Igd2lsbCBiZSBkaXNhYmxlZC4gT25seSBDU1Igd2lsbCB3b3JrLlwiKTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOuhnOuTnCAocHJvZHVjdGlvbuyXkOyEnOunjCwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOydmCBzc3Ivcm91dGVzLnRzKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoc3NyUm91dGVzUGF0aCkpIHtcbiAgICAgICAgLy8gdHMtbG9hZGVy652866m0IFwiZmlsZTovL1wi66GcIOyLnOyeke2VmOuKlCBmdWxseS1yZXNvbHZlZCBwYXRo66eMIOuwm+q4sOyXkCDsnbTrpbwg7LKY66as7ZW07KO864qUIGltcG9ydE1lbWJlcnPrpbwg7IKs7Jqp7ZW07JW8IO2WiOqyoOyngOunjCxcbiAgICAgICAgLy8g7Jes6riw64qUIO2UhOuhnOuNleyFmCDtmZjqsr3sl5DshJwgbG9hZGVyIOyXhuydtCDrj4zslYTqsIDquLAg65WM66y47JeQIFwi7KeE7KecIGpzIO2MjOydvFwi7J2YIFwi6re464OlXCIg7KCI64yA6rK966Gc66W8IOuwlOuhnCBpbXBvcnTtlbTrj4Qg65Cp64uI64ukLlxuICAgICAgICAvLyDsnbQg64K07Jqp7J2AIOydtCDtlajsiJgg64K07JeQ7IScIOyVhOuemOyXkCDrgpjsmKwg64uk66W4IGltcG9ydCDtmLjstpzsl5Drj4Qg64+Z7J287ZWY6rKMIOyggeyaqeuQqeuLiOuLpC5cbiAgICAgICAgYXdhaXQgaW1wb3J0KHNzclJvdXRlc1BhdGgpO1xuICAgICAgICBjb25zb2xlLmxvZyhcIuKckyBTU1Igcm91dGVzIGxvYWRlZFwiKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2Fybihg4pqgIFNTUiByb3V0ZXMgbm90IGZvdW5kOiAke3NzclJvdXRlc1BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g66Gk66eBIOyXheuNsOydtO2KuCDrjIDsnZE6IGFzc2V0IGhhc2gg67aI7J287LmYIOyLnCDtmITsnqwg67KE7KCEIOyngeygkSDshJzruZlcbiAgICBzZXJ2ZXIuZ2V0KFwiL2Fzc2V0cy86ZmlsZW5hbWVcIiwgYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICBjb25zdCByZXF1ZXN0ZWRGaWxlID0gKHJlcXVlc3QucGFyYW1zIGFzIHsgZmlsZW5hbWU6IHN0cmluZyB9KS5maWxlbmFtZTtcbiAgICAgIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJhc3NldHNcIik7XG4gICAgICBjb25zdCBhc3NldFBhdGggPSBgL2Fzc2V0cy8ke3JlcXVlc3RlZEZpbGV9YDtcblxuICAgICAgLy8gQ2FjaGUtQ29udHJvbCDtl6TrjZQg6rKw7KCVXG4gICAgICBjb25zdCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCA9ICgpOiBDYWNoZUNvbnRyb2xDb25maWcgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgICB0eXBlOiBcImFzc2V0c1wiLFxuICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgcGF0aDogYXNzZXRQYXRoLFxuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8g7IKs7Jqp7J6QIOygleydmCDtlbjrk6Trn6wg7Jqw7ISgXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g6riw67O46rCSOiBpbW11dGFibGVcbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5pbW11dGFibGU7XG4gICAgICB9O1xuXG4gICAgICAvLyBpbmRleC0qLmpzIOuYkOuKlCBpbmRleC0qLmNzcyDsmpTssq3snbgg6rK97JqwXG4gICAgICBpZiAoL15pbmRleC1bYS1mMC05XStcXC4oanN8Y3NzKSQvLnRlc3QocmVxdWVzdGVkRmlsZSkpIHtcbiAgICAgICAgY29uc3QgZXh0ID0gcmVxdWVzdGVkRmlsZS5zcGxpdChcIi5cIikucG9wKCk7XG4gICAgICAgIGNvbnN0IGZpbGVzID0gYXdhaXQgZnMucmVhZGRpcihhc3NldHNEaXIpO1xuICAgICAgICBjb25zdCBjdXJyZW50RmlsZSA9IGZpbGVzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChcImluZGV4LVwiKSAmJiBmLmVuZHNXaXRoKGAuJHtleHR9YCkpO1xuXG4gICAgICAgIGlmIChjdXJyZW50RmlsZSkge1xuICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgY3VycmVudEZpbGUpO1xuICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogXCJ0ZXh0L2Nzc1wiKTtcbiAgICAgICAgICBhcHBseUNhY2hlSGVhZGVycyhyZXBseSwgZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQoKSk7XG4gICAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIO2MjOydvCDshJzruZlcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGFzc2V0c0RpciwgcmVxdWVzdGVkRmlsZSk7XG4gICAgICBpZiAoYXdhaXQgZXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb25zdCBleHQgPSByZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgcmVwbHkudHlwZShleHQgPT09IFwianNcIiA/IFwiYXBwbGljYXRpb24vamF2YXNjcmlwdFwiIDogZXh0ID09PSBcImNzc1wiID8gXCJ0ZXh0L2Nzc1wiIDogXCJcIik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRGaWxlLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgIH1cblxuICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoXCJOb3QgZm91bmRcIik7XG4gICAgfSk7XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGlmIChzc3JBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3JcIik7XG4gICAgICBjb25zdCB7IHJlbmRlclNTUiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3NyL3JlbmRlcmVyXCIpO1xuICAgICAgY29uc3Qgc3NyUm91dGVzID0gZ2V0U1NSUm91dGVzKCk7XG5cbiAgICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24ocm91dGUuY29tcHJlc3MgPz8gdHJ1ZSwgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtTU1JdIE1hdGNoZWQgcm91dGU6ICR7cm91dGUucGF0aH1gKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5leHRyYWN0UGF0aFBhcmFtcyhyb3V0ZS5wYXRoLCB1cmwpO1xuICAgICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcpO1xuXG4gICAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgICAgcmV0dXJuIGh0bWw7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ1NSIG9yIFN0YXRpYyBGaWxlIEZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIipcIixcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAvLyAvYXBpLCAvc29uYW11LXVp64qUIDQwNCDqt7jrjIDroZxcbiAgICAgICAgaWYgKHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvYXBpXCIpIHx8IHJlcXVlc3QudXJsLnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgICAgcmVwbHkuY29kZSg0MDQpLnNlbmQoeyBlcnJvcjogXCJOb3QgRm91bmRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1LsmqkgQ2FjaGUtQ29udHJvbCDtl6TrjZQg7ISk7KCVXG4gICAgICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IGNzckNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgICAgdHlwZTogXCJjc3JcIixcbiAgICAgICAgICAgIHVybDogcmVxdWVzdC51cmwsXG4gICAgICAgICAgICBwYXRoOiByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgICAgICBtZXRob2Q6IHJlcXVlc3QubWV0aG9kLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVDb25maWcgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjc3JDYWNoZVJlcSk7XG5cbiAgICAgICAgICBpZiAoY3NyQ2FjaGVDb25maWcpIHtcbiAgICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBjc3JDYWNoZUNvbmZpZyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7KCV7KCBIO2MjOydvOydtCDsobTsnqztlaAg6rK97JqwLCDsoJXsoIEg7YyM7J287J2EIOuovOyggCDshJzruZntlbTslbztlahcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIHJlcXVlc3QudXJsKTtcbiAgICAgICAgaWYgKGF3YWl0IGZpbGVFeGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkudHlwZShtaW1lTG9va3VwKGZpbGVQYXRoKSB8fCBcImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbVwiKS5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ1NSIGZhbGxiYWNrOiBpbmRleC5odG1sIOyEnOu5mVxuICAgICAgICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4od2ViRGlzdFBhdGgsIFwiaW5kZXguaHRtbFwiKTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIikuc2VuZChhd2FpdCBmcy5yZWFkRmlsZShpbmRleFBhdGgsIFwidXRmLThcIikpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnNvbGUubG9nKGDinJMgU3RhdGljIHdlYiBzZXJ2ZXIgY29uZmlndXJlZCB3aXRoICR7c3NyQXZhaWxhYmxlID8gXCJTU1JcIiA6IFwiQ1NSIG9ubHlcIn0gc3VwcG9ydGApO1xuICB9XG5cbiAgY3JlYXRlQXBpSGFuZGxlcihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKTogKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiBQcm9taXNlPHVua25vd24+IHtcbiAgICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICAvLyBDb250ZXh0IOyDneyEsVxuICAgICAgY29uc3QgY29udGV4dDogQ29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAgIC8vIGd1YXJkcyDsspjrpqxcbiAgICAgICAgKGFwaS5vcHRpb25zLmd1YXJkcyA/PyBbXSkuZXZlcnkoKGd1YXJkKSA9PiBjb25maWcuZ3VhcmRIYW5kbGVyKGd1YXJkLCByZXF1ZXN0LCBhcGkpKTtcblxuICAgICAgICAvLyDtjIzrnbzrr7jthLAg7KCV67O066GcIHpvZCDsiqTtgqTrp4gg67mM65OcXG4gICAgICAgIGNvbnN0IHsgZ2V0Wm9kT2JqZWN0RnJvbUFwaSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jb2RlLWNvbnZlcnRlcnNcIik7XG4gICAgICAgIGNvbnN0IFJlcVR5cGUgPSBnZXRab2RPYmplY3RGcm9tQXBpKGFwaSwgdGhpcy5zeW5jZXIudHlwZXMpO1xuXG4gICAgICAgIC8vIHJlcXVlc3Qg7YyM7IuxXG4gICAgICAgIGNvbnN0IHdoaWNoID0gYXBpLm9wdGlvbnMuaHR0cE1ldGhvZCA9PT0gXCJHRVRcIiA/IFwicXVlcnlcIiA6IFwiYm9keVwiO1xuICAgICAgICBsZXQgcmVxQm9keToge1xuICAgICAgICAgIFtrZXk6IHN0cmluZ106IHVua25vd247XG4gICAgICAgIH07XG4gICAgICAgIC8vIO2MjOydvCDsl4XroZzrk5wg7J6I64qUIOqyveyasCDsnoTsi5wg642w7J207YSwXG4gICAgICAgIGNvbnN0IGZpbGVzOiB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogQnVmZmVyZWRGaWxlW107XG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogVXBsb2FkZWRGaWxlW107XG4gICAgICAgIH0gPSB7XG4gICAgICAgICAgYnVmZmVyZWRGaWxlczogW10sXG4gICAgICAgICAgdXBsb2FkZWRGaWxlczogW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBib2R5ID0gKHJlcXVlc3Rbd2hpY2hdID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gcmVxdWVzdC5wYXJ0cyh7XG4gICAgICAgICAgICAgIGxpbWl0czogYXBpLnVwbG9hZE9wdGlvbnMubGltaXRzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEZvcm1EYXRh7J2YIGZpZWxk65Ok7J2EIOyehOyLnOuhnCDsoIDsnqVcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJidWZmZXJcIiB8fCAhYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSkge1xuICAgICAgICAgICAgICAvLyBCdWZmZXIg66qo65OcOiDrqZTrqqjrpqzsl5Ag66Gc65OcXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAvLyBDUklUSUNBTDog7YyM7J28IOyKpO2KuOumvOydhCDsponsi5wgY29uc3VtZe2VtOyVvCDri6TsnYwgcGFydOuhnCDrhJjslrTqsIgg7IiYIOyeiOydjFxuICAgICAgICAgICAgICAgICAgLy8g7J20IO2YuOy2nOydtCDsl4bsnLzrqbQg7KKF7KKFIG11bHRpcGFydCDtjIzsi7HsnbQgcGVuZGluZyDsg4Htg5zroZwg7YOA7J6E7JWE7JuDIOuwnOyDnVxuICAgICAgICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcGFydC50b0J1ZmZlcigpO1xuICAgICAgICAgICAgICAgICAgZmlsZXMuYnVmZmVyZWRGaWxlcy5wdXNoKG5ldyBCdWZmZXJlZEZpbGUocGFydCwgYnVmZmVyKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0LnR5cGUgPT09IFwiZmllbGRcIikge1xuICAgICAgICAgICAgICAgICAgZmllbGRzW3BhcnQuZmllbGRuYW1lXSA9IFN0cmluZyhwYXJ0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgICAvLyBTdHJlYW0g66qo65OcOiDsponsi5wg7KCA7J6l7IaM66GcIOyKpO2KuOumrOuwjVxuICAgICAgICAgICAgICBjb25zdCBkaXNrTmFtZSA9IGFwaS51cGxvYWRPcHRpb25zLmRlc3RpbmF0aW9uO1xuICAgICAgICAgICAgICBjb25zdCBkaXNrID0gdGhpcy5zdG9yYWdlLnVzZShkaXNrTmFtZSk7XG5cbiAgICAgICAgICAgICAgLy8g7Jqw7ISg7Iic7JyEOiDrjbDsvZTroIjsnbTthLAgPiDsoITsl60g7ISk7KCVID4g6riw67O46rCSXG4gICAgICAgICAgICAgIGNvbnN0IGtleUdlbmVyYXRvcjogS2V5R2VuZXJhdG9yID1cbiAgICAgICAgICAgICAgICBhcGkudXBsb2FkT3B0aW9ucy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zZXJ2ZXIuc3RvcmFnZT8ua2V5R2VuZXJhdG9yID8/XG4gICAgICAgICAgICAgICAgZGVmYXVsdEtleUdlbmVyYXRvcjtcblxuICAgICAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFydC50eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gYXdhaXQga2V5R2VuZXJhdG9yKHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGF3YWl0IGRpc2sucHV0U3RyZWFtKGtleSwgcGFydC5maWxlLCB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGRpc2suZ2V0VXJsKGtleSk7XG4gICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWRVcmwgPSBhd2FpdCBkaXNrLmdldFNpZ25lZFVybChrZXkpO1xuXG4gICAgICAgICAgICAgICAgICBmaWxlcy51cGxvYWRlZEZpbGVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIG5ldyBVcGxvYWRlZEZpbGUoe1xuICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lOiBwYXJ0LmZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlOiBwYXJ0Lm1pbWV0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgIHNpemU6IHBhcnQuZmlsZS5ieXRlc1JlYWQsXG4gICAgICAgICAgICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgICAgICAgICAgIHNpZ25lZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgZGlza05hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBxc+uhnCDspJHssqkg6rWs7KGwIO2MjOyLsTogcGFyYW1zW2NhdGVnb3J5XSDihpIgeyBwYXJhbXM6IHsgY2F0ZWdvcnk6IFwidGVzdFwiIH0gfVxuICAgICAgICAgICAgY29uc3QgcXMgPSBhd2FpdCBpbXBvcnQoXCJxc1wiKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZCA9IHFzLmRlZmF1bHQucGFyc2UoZmllbGRzKTtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keSwgcGFyc2VkKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB7IGZhc3RpZnlDYXN0ZXIgfSA9IGF3YWl0IGltcG9ydChcIi4vY2FzdGVyXCIpO1xuICAgICAgICAgIHJlcUJvZHkgPSBmYXN0aWZ5Q2FzdGVyKFJlcVR5cGUpLnBhcnNlKGJvZHkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgY29uc3QgeyBab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiem9kXCIpO1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgWm9kRXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgaHVtYW5pemVab2RFcnJvciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvem9kLWVycm9yXCIpO1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBodW1hbml6ZVpvZEVycm9yKGUpXG4gICAgICAgICAgICAgIC5tYXAoKGlzc3VlKSA9PiBpc3N1ZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICAgICAgICBjb25zdCB7IEJhZFJlcXVlc3RFeGNlcHRpb24gfSA9IGF3YWl0IGltcG9ydChcIi4uL2V4Y2VwdGlvbnMvc28tZXhjZXB0aW9uc1wiKTtcbiAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1lc3NhZ2VzIGFzIExvY2FsaXplZFN0cmluZywge1xuICAgICAgICAgICAgICB6b2RFcnJvcjogZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnRlbnQtVHlwZVxuICAgICAgICByZXBseS50eXBlKGFwaS5vcHRpb25zLmNvbnRlbnRUeXBlID8/IFwiYXBwbGljYXRpb24vanNvblwiKTtcblxuICAgICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgY29uc3QgYXBpQ2FjaGVDb25maWcgPSB0aGlzLmdldEFwaUNhY2hlQ29udHJvbChhcGksIHJlcXVlc3QsIGNvbmZpZyk7XG4gICAgICAgIGlmIChhcGlDYWNoZUNvbmZpZykge1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBhcGlDYWNoZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsl4XroZzrk5wg7Ji17IWY7J20IOyeiOuKlCDqsr3smrAg7YyM7J28IOuNsOydtO2EsOulvCBDb250ZXh07JeQIOy2lOqwgFxuICAgICAgICBpZiAoYXBpLnVwbG9hZE9wdGlvbnMpIHtcbiAgICAgICAgICBjb25zdCBjb25zdW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuY29uc3VtZSA/PyBcImJ1ZmZlclwiO1xuICAgICAgICAgIGlmIChjb25zdW1lID09PSBcImJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LmJ1ZmZlcmVkRmlsZXMgPSBmaWxlcy5idWZmZXJlZEZpbGVzO1xuICAgICAgICAgIH0gZWxzZSBpZiAoY29uc3VtZSA9PT0gXCJzdHJlYW1cIikge1xuICAgICAgICAgICAgY29udGV4dC51cGxvYWRlZEZpbGVzID0gZmlsZXMudXBsb2FkZWRGaWxlcztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrqqjrjbgg66mU7IaM65OcIGFyZ3Mg7IOd7ISx7ZWY7JesIO2YuOy2nFxuICAgICAgICBjb25zdCB7IEFwaVBhcmFtVHlwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIik7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgICAgLy8gQ29udGV4dCDsnbjsoJ3shZhcbiAgICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXFCb2R5W3BhcmFtLm5hbWVdO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVSTOyXkOyEnCBwYXRoIHBhcmFtc+ulvCDstpTstpztlanri4jri6QuXG4gICAqIOyYiDogcGF0dGVybj1cIi9hZG1pbi9jb21wYW5pZXMvOmNvbXBhbnlJZFwiLCB1cmw9XCIvYWRtaW4vY29tcGFuaWVzLzEyM1wiIOKGkiB7IGNvbXBhbnlJZDogXCIxMjNcIiB9XG4gICAqL1xuICBwcml2YXRlIGV4dHJhY3RQYXRoUGFyYW1zKHBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBwYXR0ZXJuUGFydHMgPSBwYXR0ZXJuLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgdXJsUGFydHMgPSB1cmwuc3BsaXQoXCI/XCIpWzBdLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbik7XG4gICAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdHRlcm5QYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHBhdHRlcm5QYXJ0c1tpXS5zdGFydHNXaXRoKFwiOlwiKSkge1xuICAgICAgICBwYXJhbXNbcGF0dGVyblBhcnRzW2ldLnNsaWNlKDEpXSA9IHVybFBhcnRzW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEFQSSDsnZHri7Xsl5Ag7KCB7Jqp7ZWgIENhY2hlLUNvbnRyb2wg7ISk7KCV7J2EIOqysOygle2VqeuLiOuLpC5cbiAgICog7Jqw7ISg7Iic7JyEOiDqsJzrs4Qg7KeA7KCVID4gY2FjaGVDb250cm9sSGFuZGxlclxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBcGlDYWNoZUNvbnRyb2woXG4gICAgYXBpOiBFeHRlbmRlZEFwaSxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICkge1xuICAgIC8vIOuNsOy9lOugiOydtO2EsCDshKTsoJUg7Jqw7ISgXG4gICAgaWYgKGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbCkge1xuICAgICAgcmV0dXJuIGFwaS5vcHRpb25zLmNhY2hlQ29udHJvbDtcbiAgICB9XG5cbiAgICAvLyDsoITsl60g7ZW465Ok65+sXG4gICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICBjb25zdCBjYWNoZVJlcTogQ2FjaGVDb250cm9sUmVxdWVzdCA9IHtcbiAgICAgICAgdHlwZTogXCJhcGlcIixcbiAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgcGF0aDogcmVxdWVzdC5yb3V0ZU9wdGlvbnM/LnVybCA/PyByZXF1ZXN0LnVybC5zcGxpdChcIj9cIilbMF0sXG4gICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgIGFwaSxcbiAgICAgIH07XG4gICAgICBjb25zdCByZXN1bHQgPSBjb25maWcuY2FjaGVDb250cm9sSGFuZGxlcihjYWNoZVJlcSk7XG4gICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNTUuyaqSBBUEkg7Zi47LacIChIVFRQIOyYpOuyhO2XpOuTnCDsl4bsnbQg7KeB7KCRIO2YuOy2nClcbiAgICogY3JlYXRlQXBpSGFuZGxlcuydmCDroZzsp4HsnYQg7J6s7IKs7Jqp7ZWY65CYLCByZXF1ZXN0IO2MjOyLsSDrjIDsi6AgcGFyYW1zIOyngeygkSDsgqzsmqlcbiAgICovXG4gIGFzeW5jIGludm9rZUFwaUZvclNTUihcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogU1NS7JeQ7IScIOuLpOyWke2VnCDtg4DsnoXsnZggcGFyYW1z66W8IOuwm+yVhOyVvCDtlahcbiAgICBwYXJhbXM6IGFueVtdLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICByZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBDb250ZXh0IOyDneyEsSAo6riw7KG0IOuplOyGjOuTnCDsnqzsgqzsmqkpXG4gICAgY29uc3QgY29udGV4dCA9IGF3YWl0IHRoaXMuY3JlYXRlQ29udGV4dChjb25maWcsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIHJldHVybiB0aGlzLmFzeW5jTG9jYWxTdG9yYWdlLnJ1bih7IGNvbnRleHQgfSwgYXN5bmMgKCkgPT4ge1xuICAgICAgLy8gYXJncyDsg53shLE6IENvbnRleHQg7YyM652866+47YSw64qUIOyjvOyehSwg64KY66i47KeA64qUIHBhcmFtc+yXkOyEnCDqsIDsoLjsmKTquLBcbiAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgIGxldCBwYXJhbXNJbmRleCA9IDA7XG4gICAgICBjb25zdCBhcmdzID0gYXBpLnBhcmFtZXRlcnMubWFwKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAoQXBpUGFyYW1UeXBlLmlzQ29udGV4dChwYXJhbS50eXBlKSkge1xuICAgICAgICAgIHJldHVybiBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJhbXNbcGFyYW1zSW5kZXgrK107XG4gICAgICB9KTtcblxuICAgICAgLy8g66qo6424IOuplOyEnOuTnCDtmLjstpwgKOq4sOyhtCDrqZTshJzrk5wg7J6s7IKs7JqpKVxuICAgICAgcmV0dXJuIHRoaXMuaW52b2tlTW9kZWxNZXRob2QoYXBpLCBhcmdzLCByZXBseSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBpbnZva2VNb2RlbE1ldGhvZChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIGFyZ3M6IHVua25vd25bXSxcbiAgICByZXBseTogRmFzdGlmeVJlcGx5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBtb2RlbCA9IHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IG1vZGVs7J2AIOuqqOuNuCDsnbjsiqTthLTsiqTsnbTrr4DroZwg66mU7ISc65OcIO2YuOy2nCDqsIDriqVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCAobW9kZWwgYXMgYW55KVthcGkubWV0aG9kTmFtZV0uYXBwbHkobW9kZWwsIGFyZ3MpO1xuICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUNvbnRleHQoXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8Q29udGV4dD4ge1xuICAgIC8vIGNyZWF0ZVNTRUZhY3Rvcnkg7ZWo7IiY7JeQIOuvuOumrCByZXF1ZXN07J2YIHNvY2tldOqzvCByZXBseeulvCDrsJTsnbjrlKkuXG4gICAgY29uc3QgeyBjcmVhdGVTU0VGYWN0b3J5IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zdHJlYW0vc3NlXCIpO1xuICAgIGNvbnN0IGNyZWF0ZVNTRSA9ICg8VCBleHRlbmRzIFpvZE9iamVjdD4oXG4gICAgICBfcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgICBfcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgICAgIF9ldmVudHM6IFQsXG4gICAgKSA9PiBjcmVhdGVTU0VGYWN0b3J5KF9yZXF1ZXN0LnNvY2tldCwgX3JlcGx5LCBfZXZlbnRzKSkuYmluZChudWxsLCByZXF1ZXN0LCByZXBseSk7XG5cbiAgICAvLyBsb2NhbGUg6rCQ7KeAXG4gICAgY29uc3QgbG9jYWxlID1cbiAgICAgIHRoaXMuZGV0ZWN0TG9jYWxlKHJlcXVlc3QuaGVhZGVyc1tcImFjY2VwdC1sYW5ndWFnZVwiXSwgdGhpcy5jb25maWcuaTE4bi5zdXBwb3J0ZWRMb2NhbGVzKSA/P1xuICAgICAgdGhpcy5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlO1xuXG4gICAgLy8gYXV0aCBjb250ZXh0IOy2lOqwgFxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IChhd2FpdCB0aGlzLl9hdXRoPy5hcGkuZ2V0U2Vzc2lvbih7IGhlYWRlcnMgfSkpID8/IG51bGw7XG5cbiAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0ge1xuICAgICAgLi4uKGF3YWl0IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgY29uZmlnLmNvbnRleHRQcm92aWRlcihcbiAgICAgICAgICB7XG4gICAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgICAgcmVwbHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXF1ZXN0LmhlYWRlcnMsXG4gICAgICAgICAgICBjcmVhdGVTU0UsXG4gICAgICAgICAgICBuYWl0ZVN0b3JlOiBOYWl0ZS5jcmVhdGVTdG9yZSgpLFxuICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgLy8gYXV0aFxuICAgICAgICAgICAgdXNlcjogc2Vzc2lvbj8udXNlciA/PyBudWxsLFxuICAgICAgICAgICAgc2Vzc2lvbjogc2Vzc2lvbj8uc2Vzc2lvbiA/PyBudWxsLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXBseSxcbiAgICAgICAgKSxcbiAgICAgICkpLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0LUxhbmd1YWdlIO2XpOuNlOyXkOyEnCDsp4Dsm5DtlZjripQgbG9jYWxl7J2EIOywvuyKteuLiOuLpC5cbiAgICogQGV4YW1wbGUgXCJrby1LUixrbztxPTAuOSxlbjtxPTAuOFwiIOKGkiBcImtvXCJcbiAgICovXG4gIHByaXZhdGUgZGV0ZWN0TG9jYWxlKFxuICAgIGFjY2VwdExhbmd1YWdlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgc3VwcG9ydGVkOiBzdHJpbmdbXSxcbiAgKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIWFjY2VwdExhbmd1YWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gQWNjZXB0LUxhbmd1YWdlOiBrby1LUixrbztxPTAuOSxlbjtxPTAuOFxuICAgIGNvbnN0IGxhbmdzID0gYWNjZXB0TGFuZ3VhZ2Uuc3BsaXQoXCIsXCIpLm1hcCgobGFuZykgPT4ge1xuICAgICAgY29uc3QgW2NvZGVdID0gbGFuZy5zcGxpdChcIjtcIik7XG4gICAgICByZXR1cm4gY29kZS50cmltKCkuc3BsaXQoXCItXCIpWzBdOyAvLyBrby1LUiDihpIga29cbiAgICB9KTtcblxuICAgIHJldHVybiBsYW5ncy5maW5kKChsYW5nKSA9PiBzdXBwb3J0ZWQuaW5jbHVkZXMobGFuZykpO1xuICB9XG5cbiAgYXN5bmMgc3RhcnRXYXRjaGVyKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHdhdGNoUGF0aCA9IFtwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJzcmNcIildO1xuXG4gICAgY29uc3QgY2hva2lkYXIgPSAoYXdhaXQgaW1wb3J0KFwiY2hva2lkYXJcIikpLmRlZmF1bHQ7XG4gICAgdGhpcy53YXRjaGVyID0gY2hva2lkYXIud2F0Y2god2F0Y2hQYXRoLCB7XG4gICAgICBpZ25vcmVkOiAocGF0aCwgc3RhdHMpID0+XG4gICAgICAgICEhc3RhdHM/LmlzRmlsZSgpICYmICFwYXRoLmVuZHNXaXRoKFwiLnRzXCIpICYmICFwYXRoLmVuZHNXaXRoKFwiLmpzb25cIiksXG4gICAgICBwZXJzaXN0ZW50OiB0cnVlLFxuICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICB9KTtcblxuICAgIHRoaXMud2F0Y2hlci5vbihcImFsbFwiLCBhc3luYyAoZXZlbnQ6IHN0cmluZywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gZmlsZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICBhYnNvbHV0ZVBhdGguc3RhcnRzV2l0aCh0aGlzLmFwaVJvb3RQYXRoKSxcbiAgICAgICAgXCJGaWxlIHBhdGggaXMgbm90IHdpdGhpbiB0aGUgQVBJIHJvb3QgcGF0aFwiLFxuICAgICAgKTtcblxuICAgICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiICYmIGV2ZW50ICE9PSBcImFkZFwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gc29uYW11LmNvbmZpZy50cyDrs4Dqsr0g7IucIOyerOyLnOyekVxuICAgICAgICBjb25zdCBpc0NvbmZpZ1RzID0gZmlsZVBhdGggPT09IHBhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInNvbmFtdS5jb25maWcudHNcIik7XG5cbiAgICAgICAgaWYgKGlzQ29uZmlnVHMpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBmaWxlUGF0aC5yZXBsYWNlKHRoaXMuYXBpUm9vdFBhdGgsIFwiYXBpXCIpO1xuICAgICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX0gLSBSZXN0YXJ0aW5nLi4uYCksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwcm9jZXNzLmtpbGwocHJvY2Vzcy5waWQsIFwiU0lHVVNSMlwiKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZpbGVDaGFuZ2UoZXZlbnQsIGFic29sdXRlUGF0aCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKlxuICAgICBBIGZ1bmN0aW9uIHRoYXQgYXV0b21hdGljYWxseSBoYW5kbGVzIGluaXQgYW5kIGRlc3Ryb3kgd2hlbiB1c2luZyBTb25hbXUgdmlhIHNjcmlwdHMuICAgIFxuICAqL1xuICBhc3luYyBydW5TY3JpcHQoZm46ICgpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICBhd2FpdCB0aGlzLmluaXQodHJ1ZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBhd2FpdCB0aGlzLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgcGx1Z2luczogU29uYW11U2VydmVyT3B0aW9uc1tcInBsdWdpbnNcIl0pIHtcbiAgICBpZiAoIXBsdWdpbnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBjb21wcmVzcyDtlIzrn6zqt7jsnbjsnYAg64uk66W4IO2UjOufrOq3uOyduOuztOuLpCDrqLzsoIAg65Ox66Gd65CY7Ja07JW8IO2VqeuLiOuLpC5cbiAgICBpZiAocGx1Z2lucy5jb21wcmVzcykge1xuICAgICAgY29uc3QgY29tcHJlc3NQbHVnaW4gPSAoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvY29tcHJlc3NcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDI0LFxuICAgICAgICBlbmNvZGluZ3M6IFtcImJyXCIsIFwiZ3ppcFwiLCBcImRlZmxhdGVcIl0gYXMgKFwiYnJcIiB8IFwiZ3ppcFwiIHwgXCJkZWZsYXRlXCIpW10sXG4gICAgICB9O1xuXG4gICAgICBpZiAocGx1Z2lucy5jb21wcmVzcyA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoY29tcHJlc3NQbHVnaW4sIGRlZmF1bHRPcHRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwge1xuICAgICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAgIC4uLnBsdWdpbnMuY29tcHJlc3MsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBsdWdpbnNNb2R1bGVzID0ge1xuICAgICAgY29yczogXCJAZmFzdGlmeS9jb3JzXCIsXG4gICAgICBmb3JtYm9keTogXCJAZmFzdGlmeS9mb3JtYm9keVwiLFxuICAgICAgbXVsdGlwYXJ0OiBcIkBmYXN0aWZ5L211bHRpcGFydFwiLFxuICAgICAgcXM6IFwiZmFzdGlmeS1xc1wiLFxuICAgICAgc3NlOiBcImZhc3RpZnktc3NlLXYyXCIsXG4gICAgICBzdGF0aWM6IFwiQGZhc3RpZnkvc3RhdGljXCIsXG4gICAgfSBhcyBjb25zdDtcblxuICAgIGNvbnN0IHJlZ2lzdGVyUGx1Z2luID0gYXN5bmMgPEsgZXh0ZW5kcyBrZXlvZiBOb25OdWxsYWJsZTx0eXBlb2YgcGx1Z2lucz4+KFxuICAgICAga2V5OiBLLFxuICAgICAgcGx1Z2luTmFtZTogc3RyaW5nLFxuICAgICkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9uID0gcGx1Z2luc1trZXldO1xuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgaWYgKG9wdGlvbiA9PT0gdHJ1ZSkge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXJ2ZXIucmVnaXN0ZXIoKGF3YWl0IGltcG9ydChwbHVnaW5OYW1lKSkuZGVmYXVsdCwgb3B0aW9uKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBwbHVnaW5OYW1lXSBvZiBPYmplY3QuZW50cmllcyhwbHVnaW5zTW9kdWxlcykpIHtcbiAgICAgIGF3YWl0IHJlZ2lzdGVyUGx1Z2luKGtleSBhcyBrZXlvZiB0eXBlb2YgcGx1Z2lucywgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBsdWdpbnMuY3VzdG9tKSB7XG4gICAgICBwbHVnaW5zLmN1c3RvbShzZXJ2ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBiZXR0ZXItYXV0aCDrnbzsmrDtirjrpbwg65Ox66Gd7ZWp64uI64ukLlxuICAgKiAvYXBpL2F1dGgvKiDqsr3roZzroZwg7J247KadIEFQSeqwgCDsnpDrj5kg65Ox66Gd65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWdpc3RlckJldHRlckF1dGgoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2UsXG4gICAgb3B0aW9uczogTm9uTnVsbGFibGU8U29uYW11U2VydmVyT3B0aW9uc1tcImF1dGhcIl0+LFxuICApIHtcbiAgICBpZiAoIW9wdGlvbnMpIHJldHVybjtcblxuICAgIGNvbnN0IGJhc2VQYXRoID0gb3B0aW9ucy5iYXNlUGF0aCA/PyBcIi9hcGkvYXV0aFwiO1xuXG4gICAgLy8g7IKs7Jqp7J6QIOyEpOygleqzvCDquLDrs7jqsJLsnYQgbWVyZ2VcbiAgICBjb25zdCBtZXJnZWRGaWVsZE1hcHBpbmdzID0gbWVyZ2UoU09OQU1VX0ZJRUxEX01BUFBJTkdTLCBvcHRpb25zKTtcblxuICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgIGNvbnN0IHsgUG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwicGdcIik7XG5cbiAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aCh7XG4gICAgICBkYXRhYmFzZTogbmV3IFBvb2woREIuZ2V0REJDb25maWcoXCJ3XCIpLmNvbm5lY3Rpb24gYXMgUG9vbENvbmZpZyksXG4gICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgIH0pO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIC4uLihyZXF1ZXN0LmJvZHkgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgYmV0dGVyLWF1dGggcmVnaXN0ZXJlZCBhdCAke2Jhc2VQYXRofS8qYCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsIm1pbWUiLCJsb29rdXAiLCJtaW1lTG9va3VwIiwib3MiLCJwYXRoIiwiY29udmVydEZhc3RpZnlIZWFkZXJzVG9TdGFuZGFyZCIsImNyZWF0ZU1vY2tTU0VGYWN0b3J5IiwiREIiLCJpc0RhZW1vblNlcnZlciIsIm1lcmdlIiwiU09OQU1VX0ZJRUxEX01BUFBJTkdTIiwiYXBwbHlDYWNoZUhlYWRlcnMiLCJDYWNoZVByZXNldHMiLCJ0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiIsIk5haXRlIiwiQnVmZmVyZWRGaWxlIiwiVXBsb2FkZWRGaWxlIiwiZXhpc3RzIiwiZmlsZUV4aXN0cyIsImdldFNlY3JldHMiLCJTb25hbXVDbGFzcyIsImlzSW5pdGlhbGl6ZWQiLCJmb3JUZXN0aW5nIiwiYXN5bmNMb2NhbFN0b3JhZ2UiLCJnZXRDb250ZXh0Iiwic3RvcmUiLCJnZXRTdG9yZSIsImNvbnRleHQiLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJyZXF1ZXN0IiwicmVwbHkiLCJoZWFkZXJzIiwiY3JlYXRlU1NFIiwic2NoZW1hIiwibmFpdGVTdG9yZSIsIk1hcCIsIkVycm9yIiwiX2FwaVJvb3RQYXRoIiwiYXBpUm9vdFBhdGgiLCJhcHBSb290UGF0aCIsInNwbGl0Iiwic2VwIiwic2xpY2UiLCJqb2luIiwiX2RiQ29uZmlnIiwiZGJDb25maWciLCJfc3luY2VyIiwic3luY2VyIiwiX2NvbmZpZyIsImNvbmZpZyIsInNlY3JldHMiLCJfc3RvcmFnZSIsInN0b3JhZ2UiLCJfY2FjaGUiLCJjYWNoZSIsIl93b3JrZmxvd3MiLCJ3b3JrZmxvd3MiLCJfYXV0aCIsImF1dGgiLCJ3YXRjaGVyIiwicGVuZGluZ0ZpbGVzIiwiaG1yU3RhcnRUaW1lIiwic2VydmVyIiwiaW5pdEZvclRlc3RpbmciLCJpbml0IiwidW5kZWZpbmVkIiwiZG9TaWxlbnQiLCJlbmFibGVTeW5jIiwiY2hhbGsiLCJkZWZhdWx0IiwiY29uc29sZSIsInRpbWUiLCJjeWFuIiwiZmluZEFwaVJvb3RQYXRoIiwibG9hZENvbmZpZyIsImRhdGFiYXNlIiwiZGVmYXVsdE9wdGlvbnMiLCJjbGllbnQiLCJjb25maWd1cmVMb2dUYXBlIiwibG9nZ2luZyIsImdlbmVyYXRlREJDb25maWciLCJsb2ciLCJncmVlbiIsIkVudGl0eU1hbmFnZXIiLCJhdXRvbG9hZCIsImluaXRpYWxpemVDYWNoZSIsImluaXRpYWxpemVXb3JrZmxvd3MiLCJ0YXNrcyIsIlN5bmNlciIsImF1dG9sb2FkVHlwZXMiLCJhdXRvbG9hZE1vZGVscyIsImF1dG9sb2FkQXBpcyIsImF1dG9sb2FkV29ya2Zsb3dzIiwiVGVtcGxhdGVNYW5hZ2VyIiwiYXV0b2xvYWRTU1JSb3V0ZXMiLCJpc0xvY2FsIiwiaXNUZXN0Iiwic2V0dXBCaW9tZSIsImlzSG90UmVsb2FkU2VydmVyIiwic3luYyIsInN0YXJ0V2F0Y2hlciIsInRpbWVFbmQiLCJjcmVhdGVTZXJ2ZXIiLCJpbml0T3B0aW9ucyIsIm9wdGlvbnMiLCJmYXN0aWZ5IiwiZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIiLCJsb2dnZXIiLCJjYXRlZ29yeSIsImZhc3RpZnlDYXRlZ29yeSIsIlN0b3JhZ2VNYW5hZ2VyIiwicGx1Z2lucyIsInJlZ2lzdGVyUGx1Z2lucyIsInJlZ2lzdGVyQmV0dGVyQXV0aCIsIndpdGhGYXN0aWZ5IiwiYXBpQ29uZmlnIiwiYm9vdCIsInRpbWV6b25lIiwiYXBpIiwiZm9ybWF0SW5UaW1lWm9uZSIsIklTT19EQVRFX1JFR0VYIiwiREFURV9GT1JNQVQiLCJzZXRSZXBseVNlcmlhbGl6ZXIiLCJwYXlsb2FkIiwiSlNPTiIsInN0cmluZ2lmeSIsIl9rZXkiLCJ2YWx1ZSIsInRlc3QiLCJEYXRlIiwiZ2V0Iiwicm91dGUiLCJwcmVmaXgiLCJfcmVxdWVzdCIsIl9yZXBseSIsImFwaXMiLCJzb25hbXVVSUFwaVBsdWdpbiIsInJlZ2lzdGVyIiwid2ViUGF0aCIsImhhc1dlYiIsInBsdWdpbkNvbXByZXNzIiwiY29tcHJlc3MiLCJnbG9iYWxDb21wcmVzc09wdGlvbnMiLCJ0aHJlc2hvbGQiLCJlbmNvZGluZ3MiLCJjdXN0b21UeXBlcyIsInNldHVwVml0ZURldlNlcnZlciIsIm1vZGVscyIsIm1vZGVsTmFtZSIsIm1ldGhvZCIsImh0dHBNZXRob2QiLCJ1cmwiLCJoYW5kbGVyIiwiY3JlYXRlQXBpSGFuZGxlciIsInNldHVwU3RhdGljV2ViU2VydmVyIiwidml0ZVNlcnZlciIsInZpdGUiLCJyb290IiwibWlkZGxld2FyZU1vZGUiLCJobXIiLCJhcHBUeXBlIiwidXNlIiwicmVxIiwicmVzIiwibmV4dCIsInN0YXJ0c1dpdGgiLCJtaWRkbGV3YXJlcyIsImdldFNTUlJvdXRlcyIsInJlbmRlclNTUiIsInNzclJvdXRlcyIsInBhcmFtcyIsImV4dHJhY3RQYXRoUGFyYW1zIiwiaHRtbCIsInR5cGUiLCJ0ZW1wbGF0ZSIsInJlYWRGaWxlIiwidHJhbnNmb3JtSW5kZXhIdG1sIiwiZSIsInNzckZpeFN0YWNrdHJhY2UiLCJlcnJvciIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhZGRIb29rIiwiY2xvc2UiLCJfd2ViUGF0aCIsIndlYkRpc3RQYXRoIiwic3NyUGF0aCIsInNzckVudHJ5UGF0aCIsInNzclJvdXRlc1BhdGgiLCJ3YXJuIiwic3NyQXZhaWxhYmxlIiwicmVxdWVzdGVkRmlsZSIsImZpbGVuYW1lIiwiYXNzZXRzRGlyIiwiYXNzZXRQYXRoIiwiZ2V0Q2FjaGVDb250cm9sRm9yQXNzZXQiLCJjYWNoZVJlcSIsImNhY2hlQ29udHJvbEhhbmRsZXIiLCJyZXN1bHQiLCJpbW11dGFibGUiLCJleHQiLCJwb3AiLCJmaWxlcyIsInJlYWRkaXIiLCJjdXJyZW50RmlsZSIsImZpbmQiLCJmIiwiZW5kc1dpdGgiLCJmaWxlUGF0aCIsImNvbnRlbnQiLCJzZW5kIiwiaW5jbHVkZXMiLCJjb2RlIiwiY3NyQ2FjaGVSZXEiLCJjc3JDYWNoZUNvbmZpZyIsImluZGV4UGF0aCIsImNyZWF0ZUNvbnRleHQiLCJydW4iLCJndWFyZHMiLCJldmVyeSIsImd1YXJkIiwiZ3VhcmRIYW5kbGVyIiwiZ2V0Wm9kT2JqZWN0RnJvbUFwaSIsIlJlcVR5cGUiLCJ0eXBlcyIsIndoaWNoIiwicmVxQm9keSIsImJ1ZmZlcmVkRmlsZXMiLCJ1cGxvYWRlZEZpbGVzIiwiYm9keSIsInVwbG9hZE9wdGlvbnMiLCJwYXJ0cyIsImxpbWl0cyIsImZpZWxkcyIsImNvbnN1bWUiLCJwYXJ0IiwiYnVmZmVyIiwidG9CdWZmZXIiLCJwdXNoIiwiZmllbGRuYW1lIiwiU3RyaW5nIiwiZGlza05hbWUiLCJkZXN0aW5hdGlvbiIsImRpc2siLCJrZXlHZW5lcmF0b3IiLCJkZWZhdWx0S2V5R2VuZXJhdG9yIiwia2V5IiwibWltZXR5cGUiLCJwdXRTdHJlYW0iLCJmaWxlIiwiY29udGVudFR5cGUiLCJnZXRVcmwiLCJzaWduZWRVcmwiLCJnZXRTaWduZWRVcmwiLCJzaXplIiwiYnl0ZXNSZWFkIiwicXMiLCJwYXJzZWQiLCJwYXJzZSIsIk9iamVjdCIsImFzc2lnbiIsImZhc3RpZnlDYXN0ZXIiLCJab2RFcnJvciIsImh1bWFuaXplWm9kRXJyb3IiLCJtZXNzYWdlcyIsIm1hcCIsImlzc3VlIiwiQmFkUmVxdWVzdEV4Y2VwdGlvbiIsInpvZEVycm9yIiwiYXBpQ2FjaGVDb25maWciLCJnZXRBcGlDYWNoZUNvbnRyb2wiLCJBcGlQYXJhbVR5cGUiLCJhcmdzIiwicGFyYW1ldGVycyIsInBhcmFtIiwiaXNDb250ZXh0IiwibmFtZSIsImludm9rZU1vZGVsTWV0aG9kIiwicGF0dGVybiIsInBhdHRlcm5QYXJ0cyIsImZpbHRlciIsIkJvb2xlYW4iLCJ1cmxQYXJ0cyIsImkiLCJsZW5ndGgiLCJjYWNoZUNvbnRyb2wiLCJyb3V0ZU9wdGlvbnMiLCJpbnZva2VBcGlGb3JTU1IiLCJwYXJhbXNJbmRleCIsIm1vZGVsIiwibWV0aG9kTmFtZSIsImFwcGx5IiwiY3JlYXRlU1NFRmFjdG9yeSIsIl9ldmVudHMiLCJzb2NrZXQiLCJiaW5kIiwibG9jYWxlIiwiZGV0ZWN0TG9jYWxlIiwiaTE4biIsInN1cHBvcnRlZExvY2FsZXMiLCJkZWZhdWx0TG9jYWxlIiwic2Vzc2lvbiIsImdldFNlc3Npb24iLCJQcm9taXNlIiwicmVzb2x2ZSIsImNvbnRleHRQcm92aWRlciIsImNyZWF0ZVN0b3JlIiwidXNlciIsImFjY2VwdExhbmd1YWdlIiwic3VwcG9ydGVkIiwibGFuZ3MiLCJsYW5nIiwidHJpbSIsIndhdGNoUGF0aCIsImNob2tpZGFyIiwid2F0Y2giLCJpZ25vcmVkIiwic3RhdHMiLCJpc0ZpbGUiLCJwZXJzaXN0ZW50IiwiaWdub3JlSW5pdGlhbCIsIm9uIiwiZXZlbnQiLCJhYnNvbHV0ZVBhdGgiLCJpc0NvbmZpZ1RzIiwicmVsYXRpdmVQYXRoIiwicmVwbGFjZSIsImJvbGQiLCJibHVlIiwia2lsbCIsInBpZCIsImhhbmRsZUZpbGVDaGFuZ2UiLCJydW5TY3JpcHQiLCJmbiIsImRlc3Ryb3kiLCJjb21wcmVzc1BsdWdpbiIsInBsdWdpbnNNb2R1bGVzIiwiY29ycyIsImZvcm1ib2R5IiwibXVsdGlwYXJ0Iiwic3NlIiwic3RhdGljIiwicmVnaXN0ZXJQbHVnaW4iLCJwbHVnaW5OYW1lIiwib3B0aW9uIiwiZW50cmllcyIsImN1c3RvbSIsImJhc2VQYXRoIiwibWVyZ2VkRmllbGRNYXBwaW5ncyIsImJldHRlckF1dGgiLCJQb29sIiwiZ2V0REJDb25maWciLCJjb25uZWN0aW9uIiwiVVJMIiwiaG9zdCIsIlJlcXVlc3QiLCJ0b1N0cmluZyIsInJlc3BvbnNlIiwiZm9yRWFjaCIsImhlYWRlciIsInRleHQiLCJzZXRDYWNoZU1hbmFnZXJSZWYiLCJjcmVhdGVUZXN0Q2FjaGVNYW5hZ2VyIiwiY3JlYXRlQ2FjaGVNYW5hZ2VyIiwiV29ya2Zsb3dNYW5hZ2VyIiwiZW5hYmxlV29ya2VyIiwiZGVmYXVsdFdvcmtlck9wdGlvbnMiLCJjb25jdXJyZW5jeSIsImNwdXMiLCJ1c2VQdWJTdWIiLCJsaXN0ZW5EZWxheSIsInNldHVwV29ya2VyIiwid29ya2VyT3B0aW9ucyIsInBvcnQiLCJsaXN0ZW4iLCJsaWZlY3ljbGUiLCJvblNodXRkb3duIiwic2h1dGRvd24iLCJleGl0IiwiZXJyIiwib25FcnJvciIsInNldEVycm9ySGFuZGxlciIsInRoZW4iLCJzdGFydFdvcmtlciIsIm9uU3RhcnQiLCJjYXRjaCIsInJlZCIsIm5vdyIsInJlbGF0aXZlIiwic3luY0Zyb21XYXRjaGVyIiwiZmluaXNoSE1SIiwicmVuZXdDaGVja3N1bXMiLCJlbmRUaW1lIiwidG90YWxUaW1lIiwiY2VudGVyVGV4dCIsImFsbCIsIm1zZyIsIndoaXRlIiwiYmxhY2siLCJiZ0dyZWVuIiwiQmFzZU1vZGVsIiwiYWxsU2V0dGxlZCIsImRpc2Nvbm5lY3QiLCJTb25hbXUiLCJleHRlbnNpb24iLCJ0aW1lc3RhbXAiLCJyYW5kb20iLCJNYXRoIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXQyxjQUFjLFFBQVEsbUJBQW1CO0FBQzdELE9BQU9DLFlBQVksU0FBUztBQUM1QixTQUFTQyxpQkFBaUIsUUFBUSxjQUFjO0FBSWhELE9BQU9DLFFBQVEsbUJBQWM7QUFFN0IsT0FBT0MsUUFBUUMsVUFBVUMsVUFBVSxRQUFRLGFBQWE7QUFDeEQsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFVBQVUsT0FBTztBQUd4QixTQUNFQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssUUFDQSxjQUFLO0FBQ1osU0FBU0MscUJBQXFCLFFBQVEsa0NBQStCO0FBRXJFLFNBQVNDLGlCQUFpQixFQUFFQyxZQUFZLFFBQVEsb0NBQWlDO0FBRWpGLFNBQVNDLHVCQUF1QixRQUFRLDBCQUF1QjtBQUkvRCxTQUFTQyxLQUFLLFFBQVEsb0JBQWlCO0FBQ3ZDLFNBQVNDLFlBQVksUUFBUSw4QkFBMkI7QUFHeEQsU0FBU0MsWUFBWSxRQUFRLDhCQUEyQjtBQUl4RCxTQUFTQyxNQUFNLEVBQUVDLFVBQVUsUUFBUSx1QkFBb0I7QUFLdkQsU0FBU0MsVUFBVSxRQUE0QixjQUFXO0FBRTFELE1BQU1DO0lBQ0dDLGdCQUF5QixNQUFNO0lBQy9CQyxhQUFz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
1026
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hcGkvc29uYW11LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3Bvc2UgYXMgbG9ndGFwZURpc3Bvc2UgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCI7XG5pbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IHR5cGUgeyBBdXRoIH0gZnJvbSBcImJldHRlci1hdXRoXCI7XG5pbXBvcnQgdHlwZSB7IEZTV2F0Y2hlciB9IGZyb20gXCJjaG9raWRhclwiO1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5SW5zdGFuY2UsIEZhc3RpZnlSZXBseSwgRmFzdGlmeVJlcXVlc3QgfSBmcm9tIFwiZmFzdGlmeVwiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHR5cGUgeyBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlciwgU2VydmVyUmVzcG9uc2UgfSBmcm9tIFwiaHR0cFwiO1xuaW1wb3J0IG1pbWUsIHsgbG9va3VwIGFzIG1pbWVMb29rdXAgfSBmcm9tIFwibWltZS10eXBlc1wiO1xuaW1wb3J0IG9zIGZyb20gXCJvc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUG9vbENvbmZpZyB9IGZyb20gXCJwZ1wiO1xuaW1wb3J0IHR5cGUgeyBab2RPYmplY3QgfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICBCQVNFX0ZJRUxEX01BUFBJTkdTLFxuICBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkLFxuICBjcmVhdGVNb2NrU1NFRmFjdG9yeSxcbiAgREIsXG4gIGlzRGFlbW9uU2VydmVyLFxuICBtZXJnZSxcbn0gZnJvbSBcIi4uXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlQ29uZmlnLCBDYWNoZU1hbmFnZXIgfSBmcm9tIFwiLi4vY2FjaGUvdHlwZXNcIjtcbmltcG9ydCB7IGFwcGx5Q2FjaGVIZWFkZXJzLCBDYWNoZVByZXNldHMgfSBmcm9tIFwiLi4vY2FjaGUtY29udHJvbC9jYWNoZS1jb250cm9sXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlQ29udHJvbENvbmZpZywgQ2FjaGVDb250cm9sUmVxdWVzdCB9IGZyb20gXCIuLi9jYWNoZS1jb250cm9sL3R5cGVzXCI7XG5pbXBvcnQgeyB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbiB9IGZyb20gXCIuLi9jb21wcmVzcy9jb21wcmVzc1wiO1xuaW1wb3J0IHR5cGUgeyBDb21wcmVzc09wdGlvbnMgfSBmcm9tIFwiLi4vY29tcHJlc3MvdHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB0eXBlIHsgTG9jYWxpemVkU3RyaW5nIH0gZnJvbSBcIi4uL2RpY3QvdHlwZXNcIjtcbmltcG9ydCB7IE5haXRlIH0gZnJvbSBcIi4uL25haXRlL25haXRlXCI7XG5pbXBvcnQgeyBCdWZmZXJlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS9idWZmZXJlZC1maWxlXCI7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VNYW5hZ2VyIH0gZnJvbSBcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEtleUdlbmVyYXRvciB9IGZyb20gXCIuLi9zdG9yYWdlL3R5cGVzXCI7XG5pbXBvcnQgeyBVcGxvYWRlZEZpbGUgfSBmcm9tIFwiLi4vc3RvcmFnZS91cGxvYWRlZC1maWxlXCI7XG5pbXBvcnQgdHlwZSB7IFN5bmNlciB9IGZyb20gXCIuLi9zeW5jZXIvc3luY2VyXCI7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWFuYWdlciB9IGZyb20gXCIuLi90YXNrcy93b3JrZmxvdy1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdUZhc3RpZnlDb25maWcgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGV4aXN0cywgZmlsZUV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBBYnNvbHV0ZVBhdGggfSBmcm9tIFwiLi4vdXRpbHMvcGF0aC11dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBTb25hbXVDb25maWcsIFNvbmFtdVNlcnZlck9wdGlvbnMsIFNvbmFtdVRhc2tPcHRpb25zIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiLi9jb250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IEV4dGVuZGVkQXBpIH0gZnJvbSBcIi4vZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgZ2V0U2VjcmV0cywgdHlwZSBTb25hbXVTZWNyZXRzIH0gZnJvbSBcIi4vc2VjcmV0XCI7XG5cbmNsYXNzIFNvbmFtdUNsYXNzIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGZvclRlc3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHVibGljIGFzeW5jTG9jYWxTdG9yYWdlOiBBc3luY0xvY2FsU3RvcmFnZTx7XG4gICAgY29udGV4dDogQ29udGV4dDtcbiAgfT4gPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2UoKTtcblxuICBwdWJsaWMgZ2V0Q29udGV4dCgpOiBDb250ZXh0IHtcbiAgICBjb25zdCBzdG9yZSA9IHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UuZ2V0U3RvcmUoKTtcbiAgICBpZiAoc3RvcmU/LmNvbnRleHQpIHtcbiAgICAgIHJldHVybiBzdG9yZS5jb250ZXh0IGFzIENvbnRleHQ7XG4gICAgfVxuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgLy8g7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHJlcXVlc3Q6IG51bGwsXG4gICAgICAgIHJlcGx5OiBudWxsLFxuICAgICAgICBoZWFkZXJzOiB7fSxcbiAgICAgICAgY3JlYXRlU1NFOiAoc2NoZW1hOiBab2RPYmplY3QpID0+IGNyZWF0ZU1vY2tTU0VGYWN0b3J5KHNjaGVtYSksXG4gICAgICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTog7YWM7Iqk7YyFIO2ZmOqyveyXkOyEnCDsu6jthY3siqTtirjqsIAg7KO87J6F65CY7KeAIOyViuydgCDqsr3smrAg67mIIOy7qO2FjeyKpO2KuCDrpqzthLRcbiAgICAgICAgbmFpdGVTdG9yZTogbmV3IE1hcDxzdHJpbmcsIGFueT4oKSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBDb250ZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgY2Fubm90IGZpbmQgY29udGV4dFwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcGlSb290UGF0aDogQWJzb2x1dGVQYXRoIHwgbnVsbCA9IG51bGw7XG4gIHNldCBhcGlSb290UGF0aChhcGlSb290UGF0aDogQWJzb2x1dGVQYXRoKSB7XG4gICAgdGhpcy5fYXBpUm9vdFBhdGggPSBhcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgICBpZiAodGhpcy5fYXBpUm9vdFBhdGggPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlNvbmFtdSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWRcIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9hcGlSb290UGF0aDtcbiAgfVxuICBnZXQgYXBwUm9vdFBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5hcGlSb290UGF0aC5zcGxpdChwYXRoLnNlcCkuc2xpY2UoMCwgLTEpLmpvaW4ocGF0aC5zZXApO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGJDb25maWc6IFNvbmFtdURCQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHNldCBkYkNvbmZpZyhkYkNvbmZpZzogU29uYW11REJDb25maWcpIHtcbiAgICB0aGlzLl9kYkNvbmZpZyA9IGRiQ29uZmlnO1xuICB9XG4gIGdldCBkYkNvbmZpZygpOiBTb25hbXVEQkNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2RiQ29uZmlnID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZGJDb25maWc7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jZXI6IFN5bmNlciB8IG51bGwgPSBudWxsO1xuICBzZXQgc3luY2VyKHN5bmNlcjogU3luY2VyKSB7XG4gICAgdGhpcy5fc3luY2VyID0gc3luY2VyO1xuICB9XG4gIGdldCBzeW5jZXIoKTogU3luY2VyIHtcbiAgICBpZiAodGhpcy5fc3luY2VyID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTb25hbXUgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3luY2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uZmlnOiBTb25hbXVDb25maWcgfCBudWxsID0gbnVsbDtcbiAgc2V0IGNvbmZpZyhjb25maWc6IFNvbmFtdUNvbmZpZykge1xuICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcbiAgfVxuICBnZXQgY29uZmlnKCk6IFNvbmFtdUNvbmZpZyB7XG4gICAgaWYgKHRoaXMuX2NvbmZpZyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSBzZWNyZXRzOiBTb25hbXVTZWNyZXRzID0gZ2V0U2VjcmV0cygpO1xuXG4gIHByaXZhdGUgX3N0b3JhZ2U6IFN0b3JhZ2VNYW5hZ2VyIHwgbnVsbCA9IG51bGw7XG4gIC8qKlxuICAgKiBTdG9yYWdlTWFuYWdlciDsnbjsiqTthLTsiqRcbiAgICovXG4gIGdldCBzdG9yYWdlKCk6IFN0b3JhZ2VNYW5hZ2VyIHtcbiAgICBpZiAoIXRoaXMuX3N0b3JhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBzdG9yYWdlIGNvbmZpZy5cIik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zdG9yYWdlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IENhY2hlTWFuYWdlciB8IG51bGwgPSBudWxsO1xuICAvKipcbiAgICogQ2FjaGVNYW5hZ2VyIOyduOyKpO2EtOyKpCAoQmVudG9DYWNoZSlcbiAgICovXG4gIGdldCBjYWNoZSgpOiBDYWNoZU1hbmFnZXIge1xuICAgIGlmICghdGhpcy5fY2FjaGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhY2hlIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZC4gQ2hlY2sgY2FjaGUgY29uZmlnIGluIHNvbmFtdS5jb25maWcudHMuXCIpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY2FjaGU7XG4gIH1cblxuICBwcml2YXRlIF93b3JrZmxvd3M6IFdvcmtmbG93TWFuYWdlciB8IG51bGwgPSBudWxsO1xuICBnZXQgd29ya2Zsb3dzKCk6IFdvcmtmbG93TWFuYWdlciB7XG4gICAgaWYgKHRoaXMuX3dvcmtmbG93cyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU29uYW11IGhhcyBub3QgYmVlbiBpbml0aWFsaXplZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fd29ya2Zsb3dzO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXV0aDogQXV0aCB8IG51bGwgPSBudWxsO1xuICBnZXQgYXV0aCgpOiBBdXRoIHtcbiAgICBpZiAoIXRoaXMuX2F1dGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkF1dGggaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBDaGVjayBhdXRoIGNvbmZpZyBpbiBzb25hbXUuY29uZmlnLnRzLlwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2F1dGg7XG4gIH1cblxuICAvLyBITVIg7LKY66asXG4gIHB1YmxpYyB3YXRjaGVyOiBGU1dhdGNoZXIgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwZW5kaW5nRmlsZXM6IHN0cmluZ1tdID0gW107XG4gIHByaXZhdGUgaG1yU3RhcnRUaW1lOiBudW1iZXIgPSAwO1xuXG4gIHB1YmxpYyBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSB8IG51bGwgPSBudWxsO1xuXG4gIGFzeW5jIGluaXRGb3JUZXN0aW5nKCkge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoXG4gICAgZG9TaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICBlbmFibGVTeW5jOiBib29sZWFuID0gdHJ1ZSxcbiAgICBhcGlSb290UGF0aD86IEFic29sdXRlUGF0aCxcbiAgICBmb3JUZXN0aW5nOiBib29sZWFuID0gZmFsc2UsXG4gICkge1xuICAgIHRoaXMuZm9yVGVzdGluZyA9IGZvclRlc3Rpbmc7XG5cbiAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFkb1NpbGVudCkge1xuICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICBjb25zb2xlLnRpbWUoY2hhbGsuY3lhbihgU29uYW11LmluaXQke2ZvclRlc3RpbmcgPyBcIiBmb3IgdGVzdGluZ1wiIDogXCJcIn1gKSk7XG4gICAgfVxuXG4gICAgLy8gQVBJIOujqO2KuCDtjKjsiqRcbiAgICBjb25zdCB7IGZpbmRBcGlSb290UGF0aCB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvdXRpbHNcIik7XG4gICAgdGhpcy5hcGlSb290UGF0aCA9IGFwaVJvb3RQYXRoID8/IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ISk7KCV7J2EIOuhnOuUqe2VmOuKlCDqsoPrtoDthLAg7Iuc7J6RXG4gICAgY29uc3QgeyBsb2FkQ29uZmlnIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvbmZpZ1wiKTtcbiAgICB0aGlzLmNvbmZpZyA9IGF3YWl0IGxvYWRDb25maWcodGhpcy5hcGlSb290UGF0aCk7XG4gICAgLy8gc29uYW11LmNvbmZpZy50cyDquLDrs7jqsJIg7ISk7KCVXG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPSB0aGlzLmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSA/PyBcInBnXCI7XG4gICAgdGhpcy5jb25maWcuZGF0YWJhc2UuZGVmYXVsdE9wdGlvbnMuY2xpZW50ID0gdGhpcy5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UgPz8gXCJwZ1wiO1xuXG4gICAgLy8g66Gc6rmFIOyEpOyglVxuICAgIGNvbnN0IHsgY29uZmlndXJlTG9nVGFwZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vbG9nZ2VyL2NvbmZpZ3VyZVwiKTtcbiAgICBpZiAodGhpcy5jb25maWcubG9nZ2luZyAhPT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IGNvbmZpZ3VyZUxvZ1RhcGUoe1xuICAgICAgICAuLi50aGlzLmNvbmZpZy5sb2dnaW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gREIg66Gc65OcXG4gICAgY29uc3QgeyBEQiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZGF0YWJhc2UvZGJcIik7XG4gICAgdGhpcy5kYkNvbmZpZyA9IERCLmdlbmVyYXRlREJDb25maWcodGhpcy5jb25maWcuZGF0YWJhc2UpO1xuICAgIGlmICghZG9TaWxlbnQpIHtcbiAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oXCJEQiBDb25maWcgTG9hZGVkIVwiKSk7XG4gICAgfVxuXG4gICAgLy8gRW50aXR5IOuhnOuTnFxuICAgIC8vIO2FjOyKpO2KuOyXkOyEnOuPhCBFbnRpdHkg7KCV67O064qUIO2VhOyalO2VqeuLiOuLpC5cbiAgICAvLyB1cHNlcnTqsIAg7KCc64yA66GcIOyekeuPme2VmOugpOuptCBlbnRpdHnsnZggdW5pcXVlIGluZGV4IOygleuztOqwgCDtlYTsmpTtlZjquLAg65WM66y47J6F64uI64ukLlxuICAgIGNvbnN0IHsgRW50aXR5TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCIpO1xuICAgIGF3YWl0IEVudGl0eU1hbmFnZXIuYXV0b2xvYWQoZG9TaWxlbnQpO1xuXG4gICAgLy8gQ2FjaGUg7LSI6riw7ZmUXG4gICAgYXdhaXQgdGhpcy5pbml0aWFsaXplQ2FjaGUodGhpcy5jb25maWcuc2VydmVyLmNhY2hlLCBmb3JUZXN0aW5nKTtcblxuICAgIC8vIO2FjOyKpO2MheyduCDqsr3smrAg7Iux7YGsIOyXhuydtCDspJHri6hcbiAgICBpZiAoZm9yVGVzdGluZykge1xuICAgICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUYXNrIOuTseuhnVxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVdvcmtmbG93cyh0aGlzLmNvbmZpZy50YXNrcyk7XG5cbiAgICAvLyBTeW5jZXJcbiAgICBjb25zdCB7IFN5bmNlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vc3luY2VyL3N5bmNlclwiKTtcbiAgICB0aGlzLnN5bmNlciA9IG5ldyBTeW5jZXIoKTtcblxuICAgIC8vIEF1dG9sb2FkOiBNb2RlbHMgLyBUeXBlcyAvIEFQSXMgLyBXb3JrZmxvd3MgLyBUZW1wbGF0ZXMgLyBTU1IgUm91dGVzXG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRUeXBlcygpO1xuICAgIGF3YWl0IHRoaXMuc3luY2VyLmF1dG9sb2FkTW9kZWxzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRBcGlzKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRXb3JrZmxvd3MoKTtcbiAgICBjb25zdCB7IFRlbXBsYXRlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGVtcGxhdGVcIik7XG4gICAgYXdhaXQgVGVtcGxhdGVNYW5hZ2VyLmF1dG9sb2FkKCk7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIuYXV0b2xvYWRTU1JSb3V0ZXMoKTtcblxuICAgIGNvbnN0IHsgaXNMb2NhbCwgaXNUZXN0IH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9jb250cm9sbGVyXCIpO1xuICAgIGlmIChpc0xvY2FsKCkpIHtcbiAgICAgIC8vIOuhnOy7rOyXkOyEnOuKlCDsvZTrk5wg7IOd7ISx7J2EIOychO2VtCBCaW9tZSDshYvsl4XsnbQg7ZWE7JqU7ZWoICjtmITsnqwgYXBpUm9vdFBhdGgg7KCE64us7ZWY7JesIOyLpO2WiSlcbiAgICAgIChhd2FpdCBpbXBvcnQoXCIuLi91dGlscy9mb3JtYXR0ZXJcIikpLnNldHVwQmlvbWUodGhpcy5hcGlSb290UGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBpc0hvdFJlbG9hZFNlcnZlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdXRpbHMvY29udHJvbGxlclwiKTtcbiAgICBpZiAoaXNMb2NhbCgpICYmICFpc1Rlc3QoKSAmJiBpc0hvdFJlbG9hZFNlcnZlcigpICYmIGVuYWJsZVN5bmMpIHtcbiAgICAgIGF3YWl0IHRoaXMuc3luY2VyLnN5bmMoKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RhcnRXYXRjaGVyKCk7XG4gICAgfVxuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcbiAgICBpZiAoIWRvU2lsZW50KSB7XG4gICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnNvbGUudGltZUVuZChjaGFsay5jeWFuKFwiU29uYW11LmluaXRcIikpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVNlcnZlcihpbml0T3B0aW9ucz86IHsgZW5hYmxlU3luYz86IGJvb2xlYW47IGRvU2lsZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMuaXNJbml0aWFsaXplZCA9PT0gZmFsc2UpIHtcbiAgICAgIGF3YWl0IHRoaXMuaW5pdChpbml0T3B0aW9ucz8uZG9TaWxlbnQsIGluaXRPcHRpb25zPy5lbmFibGVTeW5jKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy5jb25maWcuc2VydmVyO1xuICAgIGNvbnN0IHsgZGVmYXVsdDogZmFzdGlmeSB9ID0gYXdhaXQgaW1wb3J0KFwiZmFzdGlmeVwiKTtcbiAgICBjb25zdCB7IGdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJAbG9ndGFwZS9mYXN0aWZ5XCIpO1xuICAgIGNvbnN0IHNlcnZlciA9IGZhc3RpZnkoe1xuICAgICAgLi4ub3B0aW9ucy5mYXN0aWZ5LFxuICAgICAgbG9nZ2VyOlxuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnaW5nICE9PSBmYWxzZVxuICAgICAgICAgID8gZ2V0TG9nVGFwZUZhc3RpZnlMb2dnZXIoe1xuICAgICAgICAgICAgICBjYXRlZ29yeTogdGhpcy5jb25maWcubG9nZ2luZz8uZmFzdGlmeUNhdGVnb3J5ID8/IFtcImZhc3RpZnlcIl0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gU3RvcmFnZSDshKTsoJUg4oaSIFN0b3JhZ2VNYW5hZ2VyIOyDneyEsVxuICAgIGlmIChvcHRpb25zLnN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IHsgU3RvcmFnZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0b3JhZ2Uvc3RvcmFnZS1tYW5hZ2VyXCIpO1xuICAgICAgdGhpcy5fc3RvcmFnZSA9IG5ldyBTdG9yYWdlTWFuYWdlcihvcHRpb25zLnN0b3JhZ2UpO1xuICAgIH1cblxuICAgIC8vIO2UjOufrOq3uOyduCDrk7HroZ1cbiAgICBpZiAob3B0aW9ucy5wbHVnaW5zKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlZ2lzdGVyUGx1Z2lucyhzZXJ2ZXIsIG9wdGlvbnMucGx1Z2lucyk7XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYXV0aCkge1xuICAgICAgYXdhaXQgdGhpcy5yZWdpc3RlckJldHRlckF1dGgoc2VydmVyLCBvcHRpb25zLmF1dGgpO1xuICAgIH1cblxuICAgIC8vIEFQSSDrnbzsmrDtjIUg7ISk7KCVXG4gICAgYXdhaXQgdGhpcy53aXRoRmFzdGlmeShzZXJ2ZXIsIG9wdGlvbnMuYXBpQ29uZmlnLCB7XG4gICAgICBlbmFibGVTeW5jOiBpbml0T3B0aW9ucz8uZW5hYmxlU3luYyxcbiAgICAgIGRvU2lsZW50OiBpbml0T3B0aW9ucz8uZG9TaWxlbnQsXG4gICAgfSk7XG5cbiAgICAvLyDshJzrsoQg7Iuc7J6RXG4gICAgYXdhaXQgdGhpcy5ib290KHNlcnZlciwgb3B0aW9ucyk7XG5cbiAgICByZXR1cm4gc2VydmVyO1xuICB9XG5cbiAgYXN5bmMgd2l0aEZhc3RpZnkoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGVuYWJsZVN5bmM/OiBib29sZWFuO1xuICAgICAgZG9TaWxlbnQ/OiBib29sZWFuO1xuICAgIH0sXG4gICkge1xuICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLmluaXQob3B0aW9ucz8uZG9TaWxlbnQsIG9wdGlvbnM/LmVuYWJsZVN5bmMpO1xuICAgIH1cblxuICAgIHRoaXMuc2VydmVyID0gc2VydmVyO1xuXG4gICAgLy8gdGltZXpvbmUg7ISk7KCVXG4gICAgY29uc3QgdGltZXpvbmUgPSB0aGlzLmNvbmZpZy5hcGkudGltZXpvbmU7XG4gICAgaWYgKHRpbWV6b25lKSB7XG4gICAgICAvLyDtg4DsnoTsobTsl5Ag66ee6rKMIOydkeuLtSDrgqDsp5wg7Iqk7Yq466eB7J2EIOuzgO2ZmO2VtOyjvOyWtOyVvCDtlanri4jri6QuXG4gICAgICAvLyDqsIDroLkgdGltZXpvbmXsnbQgXCJBc2lhL1Nlb3VsXCIg7J2066m0XG4gICAgICAvLyBcIjIwMjUtMTEtMjFUMDA6MDA6MDAuMDAwWlwiIOulvCBcIjIwMjUtMTEtMjFUMDk6MDA6MDArMDk6MDBcIiDsnLzroZwg67OA7ZmY7ZW07KO87Ja07JW8IO2VqeuLiOuLpC5cbiAgICAgIGNvbnN0IHsgZm9ybWF0SW5UaW1lWm9uZSB9ID0gYXdhaXQgaW1wb3J0KFwiZGF0ZS1mbnMtdHpcIik7XG5cbiAgICAgIC8vIElTTyA4NjAxIOuCoOynnCDtmJXsi50g7KCV6rec7IudICjsmIg6IDIwMjQtMDEtMTVUMDk6MzA6MDAuMDAwWilcbiAgICAgIGNvbnN0IElTT19EQVRFX1JFR0VYID0gL15cXGR7NH0tXFxkezJ9LVxcZHsyfVRcXGR7Mn06XFxkezJ9OlxcZHsyfShcXC5cXGR7M30pP1okLztcblxuICAgICAgLy8gVOulvCDrkZjrn6zsi7wg7J6R7J2A65Sw7Ji07ZGc6rCAIOyXhuuLpOuptCBcIjIwMjUtMTEtMTkxNzYzNTQ2MTg5MDAwMTg6NTY6MjkrMDk6MDBcIuyZgCDqsJnsnYAg6rKw6rO86rCAIOuCmOyYteuLiOuLpC5cbiAgICAgIC8vIOydtOuKlCBkYXRlLWZucyDtirnsnoXri4jri6QuXG4gICAgICAvLyDsnbTroIfqsowg7ZW064+EIOq0nOywruyKteuLiOuLpC4gXCIyMDI1LTExLTE5VDE4OjU2OjI5KzA5OjAwXCIg66qo7JaR7Jy866GcIOyemCDrgpjsmLXri4jri6QuXG4gICAgICBjb25zdCBEQVRFX0ZPUk1BVCA9IFwieXl5eS1NTS1kZCdUJ0hIOm1tOnNzWFhYXCI7XG5cbiAgICAgIHNlcnZlci5zZXRSZXBseVNlcmlhbGl6ZXIoKHBheWxvYWQpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBheWxvYWQsIChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgSVNPX0RBVEVfUkVHRVgudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmb3JtYXRJblRpbWVab25lKFxuICAgICAgICAgICAgICBuZXcgRGF0ZSh2YWx1ZSksXG4gICAgICAgICAgICAgIHRpbWV6b25lIGFzIGAke3N0cmluZ30vJHtzdHJpbmd9YCxcbiAgICAgICAgICAgICAgREFURV9GT1JNQVQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBpZiAoIW9wdGlvbnM/LmRvU2lsZW50KSB7XG4gICAgICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgVGltZXpvbmUgc2V0IHRvICR7dGltZXpvbmV9YCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOyghOyytCDrnbzsmrDtjIUg66as7Iqk7Yq4XG4gICAgc2VydmVyLmdldChcbiAgICAgIGAke3RoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXh9L3JvdXRlc2AsXG4gICAgICBhc3luYyAoX3JlcXVlc3QsIF9yZXBseSk6IFByb21pc2U8dHlwZW9mIHRoaXMuc3luY2VyLmFwaXM+ID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3luY2VyLmFwaXM7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICAvLyBIZWFsdGhjaGVjayBBUElcbiAgICBzZXJ2ZXIuZ2V0KFxuICAgICAgYCR7dGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeH0vaGVhbHRoY2hlY2tgLFxuICAgICAgYXN5bmMgKF9yZXF1ZXN0LCBfcmVwbHkpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICByZXR1cm4gXCJva1wiO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gU29uYW11IFVJIEFQSSAo66Gc7LusIO2ZmOqyveyXkOyEnOunjClcbiAgICBjb25zdCB7IGlzTG9jYWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIik7XG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgY29uc3QgeyBzb25hbXVVSUFwaVBsdWdpbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdWkvYXBpXCIpO1xuICAgICAgc2VydmVyLnJlZ2lzdGVyKHNvbmFtdVVJQXBpUGx1Z2luKTtcbiAgICB9XG5cbiAgICAvLyDroZzsu6wv7ZSE66Gc642V7IWYIO2ZmOqyvSDrtoTquLBcbiAgICBjb25zdCB3ZWJQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBwUm9vdFBhdGgsIFwid2ViXCIpO1xuICAgIGNvbnN0IGhhc1dlYiA9IGF3YWl0IGV4aXN0cyh3ZWJQYXRoKTtcblxuICAgIC8vIOyghOyXrSBjb21wcmVzcyDsmLXshZgg6rOE7IKwIChyb3V0ZS5jb21wcmVzczogdHJ1ZeydvCDrlYwg7IKs7JqpKVxuICAgIGNvbnN0IHBsdWdpbkNvbXByZXNzID0gdGhpcy5jb25maWcuc2VydmVyLnBsdWdpbnM/LmNvbXByZXNzO1xuICAgIGNvbnN0IGdsb2JhbENvbXByZXNzT3B0aW9uczogQ29tcHJlc3NPcHRpb25zIHwgdW5kZWZpbmVkID0gcGx1Z2luQ29tcHJlc3NcbiAgICAgID8gcGx1Z2luQ29tcHJlc3MgPT09IHRydWVcbiAgICAgICAgPyB7IHRocmVzaG9sZDogMTAyNCwgZW5jb2RpbmdzOiBbXCJiclwiLCBcImd6aXBcIiwgXCJkZWZsYXRlXCJdIH1cbiAgICAgICAgOiB7XG4gICAgICAgICAgICB0aHJlc2hvbGQ6IHBsdWdpbkNvbXByZXNzLnRocmVzaG9sZCxcbiAgICAgICAgICAgIGVuY29kaW5nczogcGx1Z2luQ29tcHJlc3MuZW5jb2RpbmdzLFxuICAgICAgICAgICAgY3VzdG9tVHlwZXM6IHBsdWdpbkNvbXByZXNzLmN1c3RvbVR5cGVzLFxuICAgICAgICAgIH1cbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGlzTG9jYWwoKSkge1xuICAgICAgLy8g66Gc7LusIOqwnOuwnCDtmZjqsr06IFZpdGUgRGV2IFNlcnZlciArIO2Gte2VqSDtlbjrk6Trn6xcbiAgICAgIGlmIChoYXNXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFZpdGVEZXZTZXJ2ZXIoc2VydmVyLCB3ZWJQYXRoLCBjb25maWcsIGdsb2JhbENvbXByZXNzT3B0aW9ucyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIO2UhOuhnOuNleyFmCDtmZjqsr06IOqwnOuzhCBBUEkg65287Jqw7Yq4ICsg7KCV7KCBIO2MjOydvCDshJzruZlcbiAgICAgIGZvciAoY29uc3QgYXBpIG9mIHRoaXMuc3luY2VyLmFwaXMpIHtcbiAgICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsoJXsnZjrkJjsp4Ag7JWK7J2AIOuqqOuNuOyXkCDsoJHqt7wgJHthcGkubW9kZWxOYW1lfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IGFwaS5vcHRpb25zLmh0dHBNZXRob2QgPz8gXCJHRVRcIixcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXggKyBhcGkucGF0aCxcbiAgICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihhcGkub3B0aW9ucy5jb21wcmVzcywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNXZWIpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5zZXR1cFN0YXRpY1dlYlNlcnZlcihzZXJ2ZXIsIHdlYlBhdGgsIGNvbmZpZywgZ2xvYmFsQ29tcHJlc3NPcHRpb25zKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IFZpdGVEZXZTZXJ2ZXIg7YOA7J6F7J2EIOuPmeyggeycvOuhnCDroZzrk5ztlbTslbwg7ZWoXG4gIHByaXZhdGUgdml0ZVNlcnZlcjogYW55ID0gbnVsbDtcblxuICBwcml2YXRlIGFzeW5jIHNldHVwVml0ZURldlNlcnZlcihcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZTxTZXJ2ZXIsIEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2U+LFxuICAgIHdlYlBhdGg6IHN0cmluZyxcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgZ2xvYmFsQ29tcHJlc3NPcHRpb25zPzogQ29tcHJlc3NPcHRpb25zLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBAZmFzdGlmeS9taWRkaWUg65Ox66GdIChDb25uZWN0LXN0eWxlIG1pZGRsZXdhcmUg7KeA7JuQKVxuICAgIGF3YWl0IHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KFwiQGZhc3RpZnkvbWlkZGllXCIpKS5kZWZhdWx0KTtcblxuICAgIGNvbnN0IHZpdGUgPSBhd2FpdCBpbXBvcnQoXCJ2aXRlXCIpO1xuXG4gICAgdGhpcy52aXRlU2VydmVyID0gYXdhaXQgdml0ZS5jcmVhdGVTZXJ2ZXIoe1xuICAgICAgcm9vdDogd2ViUGF0aCxcbiAgICAgIHNlcnZlcjoge1xuICAgICAgICBtaWRkbGV3YXJlTW9kZTogdHJ1ZSxcbiAgICAgICAgaG1yOiB7XG4gICAgICAgICAgc2VydmVyOiBzZXJ2ZXIuc2VydmVyLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFwcFR5cGU6IFwiY3VzdG9tXCIsXG4gICAgfSk7XG5cbiAgICAvLyBWaXRlIG1pZGRsZXdhcmUg65Ox66GdIChWaXRlIOyXkOyFiyDsspjrpqwpXG4gICAgc2VydmVyLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgIC8vIEFQSeyZgCBTb25hbXUgVUnripQgRmFzdGlmeSDrnbzsmrDtirjqsIAg7LKY66as7ZWY64+E66GdIHNraXBcbiAgICAgIGlmIChyZXEudXJsPy5zdGFydHNXaXRoKHRoaXMuY29uZmlnLmFwaS5yb3V0ZS5wcmVmaXgpIHx8IHJlcS51cmw/LnN0YXJ0c1dpdGgoXCIvc29uYW11LXVpXCIpKSB7XG4gICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICB9XG4gICAgICAvLyDrgpjrqLjsp4DripQgVml0ZSBtaWRkbGV3YXJl66GcIOyghOuLrFxuICAgICAgcmV0dXJuIHRoaXMudml0ZVNlcnZlci5taWRkbGV3YXJlcyhyZXEsIHJlcywgbmV4dCk7XG4gICAgfSk7XG5cbiAgICAvLyBBUEkg64+Z7KCBIOudvOyasO2MhSAoY2F0Y2gtYWxsIOyghOyXkCDrk7HroZ0pXG4gICAgZm9yIChjb25zdCBhcGkgb2YgdGhpcy5zeW5jZXIuYXBpcykge1xuICAgICAgaWYgKHRoaXMuc3luY2VyLm1vZGVsc1thcGkubW9kZWxOYW1lXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7KCV7J2Y65CY7KeAIOyViuydgCDrqqjrjbjsl5Ag7KCR6re8ICR7YXBpLm1vZGVsTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgbWV0aG9kOiBhcGkub3B0aW9ucy5odHRwTWV0aG9kID8/IFwiR0VUXCIsXG4gICAgICAgIHVybDogdGhpcy5jb25maWcuYXBpLnJvdXRlLnByZWZpeCArIGFwaS5wYXRoLFxuICAgICAgICBoYW5kbGVyOiB0aGlzLmNyZWF0ZUFwaUhhbmRsZXIoYXBpLCBjb25maWcpLFxuICAgICAgICBjb21wcmVzczogdG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24oYXBpLm9wdGlvbnMuY29tcHJlc3MsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTU1Ig65287Jqw7Yq4IOqwnOuzhCDrk7HroZ0gKGNvbXByZXNzIOyYteyFmOydtCDrnbzsmrDtirjrs4TroZwg7KCB7Jqp65CY64+E66GdKVxuICAgIGNvbnN0IHsgZ2V0U1NSUm91dGVzLCByZW5kZXJTU1IgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgIGZvciAoY29uc3Qgcm91dGUgb2Ygc3NyUm91dGVzKSB7XG4gICAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgIHVybDogcm91dGUucGF0aCxcbiAgICAgICAgY29tcHJlc3M6IHRvRmFzdGlmeUNvbXByZXNzT3B0aW9uKHJvdXRlLmNvbXByZXNzID8/IHRydWUsIGdsb2JhbENvbXByZXNzT3B0aW9ucyksXG4gICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVybCA9IHJlcXVlc3QudXJsO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbU1NSXSBNYXRjaGVkIHJvdXRlOiAke3JvdXRlLnBhdGh9YCk7XG5cbiAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgY29uc3QgaHRtbCA9IGF3YWl0IHJlbmRlclNTUih1cmwsIHJvdXRlLCBwYXJhbXMsIHJlcXVlc3QsIHJlcGx5LCBjb25maWcsIHRoaXMudml0ZVNlcnZlcik7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiBodG1sO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ1NSIGZhbGxiYWNrIChTU1Ig65287Jqw7Yq47JeQIOunpOy5reuQmOyngCDslYrripQg66qo65OgIOyalOyyrSlcbiAgICBzZXJ2ZXIucm91dGUoe1xuICAgICAgbWV0aG9kOiBbXCJHRVRcIiwgXCJIRUFEXCJdLFxuICAgICAgdXJsOiBcIi8qXCIsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBmcyA9IGF3YWl0IGltcG9ydChcIm5vZGU6ZnMvcHJvbWlzZXNcIik7XG4gICAgICAgICAgbGV0IHRlbXBsYXRlID0gYXdhaXQgZnMucmVhZEZpbGUoXG4gICAgICAgICAgICBwYXRoLmpvaW4odGhpcy52aXRlU2VydmVyLmNvbmZpZy5yb290LCBcImluZGV4Lmh0bWxcIiksXG4gICAgICAgICAgICBcInV0Zi04XCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICB0ZW1wbGF0ZSA9IGF3YWl0IHRoaXMudml0ZVNlcnZlci50cmFuc2Zvcm1JbmRleEh0bWwodXJsLCB0ZW1wbGF0ZSk7XG5cbiAgICAgICAgICByZXBseS50eXBlKFwidGV4dC9odG1sXCIpO1xuICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRoaXMudml0ZVNlcnZlci5zc3JGaXhTdGFja3RyYWNlKGUgYXMgRXJyb3IpO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVwbHkuc3RhdHVzKDUwMCk7XG4gICAgICAgICAgcmV0dXJuIChlIGFzIEVycm9yKS5tZXNzYWdlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g7ISc67KEIOyiheujjCDsi5wgVml0ZeuPhCDsooXro4xcbiAgICBzZXJ2ZXIuYWRkSG9vayhcIm9uQ2xvc2VcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy52aXRlU2VydmVyLmNsb3NlKCk7XG4gICAgfSk7XG5cbiAgICBjb25zb2xlLmxvZyhcIuKckyBWaXRlIGRldiBzZXJ2ZXIgaW50ZWdyYXRlZFwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2V0dXBTdGF0aWNXZWJTZXJ2ZXIoXG4gICAgc2VydmVyOiBGYXN0aWZ5SW5zdGFuY2U8U2VydmVyLCBJbmNvbWluZ01lc3NhZ2UsIFNlcnZlclJlc3BvbnNlPixcbiAgICBfd2ViUGF0aDogc3RyaW5nLFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgICBnbG9iYWxDb21wcmVzc09wdGlvbnM6IENvbXByZXNzT3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g6rK966GcIOuqhe2Zle2ZlDogYXBpL3B1YmxpYy93ZWIsIGFwaS9kaXN0L3NzclxuICAgIGNvbnN0IHdlYkRpc3RQYXRoID0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwicHVibGljXCIsIFwid2ViXCIpO1xuICAgIGNvbnN0IHNzclBhdGggPSBwYXRoLmpvaW4odGhpcy5hcGlSb290UGF0aCwgXCJkaXN0XCIsIFwic3NyXCIpO1xuICAgIGNvbnN0IHNzckVudHJ5UGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcImVudHJ5LXNlcnZlci5nZW5lcmF0ZWQuanNcIik7XG4gICAgY29uc3Qgc3NyUm91dGVzUGF0aCA9IHBhdGguam9pbihzc3JQYXRoLCBcInJvdXRlcy5qc1wiKTtcblxuICAgIGlmICghKGF3YWl0IGV4aXN0cyh3ZWJEaXN0UGF0aCkpKSB7XG4gICAgICBjb25zb2xlLndhcm4oYOKaoCBXZWIgZGlzdCBub3QgZm91bmQ6ICR7d2ViRGlzdFBhdGh9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU1NSIGVudHJ5IOyhtOyerCDsl6zrtoAg7ZmV7J24XG4gICAgY29uc3Qgc3NyQXZhaWxhYmxlID0gYXdhaXQgZXhpc3RzKHNzckVudHJ5UGF0aCk7XG5cbiAgICBpZiAoIXNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIGVudHJ5IG5vdCBmb3VuZDogJHtzc3JFbnRyeVBhdGh9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCIgIFNTUiB3aWxsIGJlIGRpc2FibGVkLiBPbmx5IENTUiB3aWxsIHdvcmsuXCIpO1xuICAgIH1cblxuICAgIC8vIFNTUiDrnbzsmrDtirgg66Gc65OcIChwcm9kdWN0aW9u7JeQ7ISc66eMLCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47J2YIHNzci9yb3V0ZXMudHMpXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgaWYgKGF3YWl0IGV4aXN0cyhzc3JSb3V0ZXNQYXRoKSkge1xuICAgICAgICAvLyB0cy1sb2FkZXLrnbzrqbQgXCJmaWxlOi8vXCLroZwg7Iuc7J6R7ZWY64qUIGZ1bGx5LXJlc29sdmVkIHBhdGjrp4wg67Cb6riw7JeQIOydtOulvCDsspjrpqztlbTso7zripQgaW1wb3J0TWVtYmVyc+ulvCDsgqzsmqntlbTslbwg7ZaI6rKg7KeA66eMLFxuICAgICAgICAvLyDsl6zquLDripQg7ZSE66Gc642V7IWYIO2ZmOqyveyXkOyEnCBsb2FkZXIg7JeG7J20IOuPjOyVhOqwgOq4sCDrlYzrrLjsl5AgXCLsp4Tsp5wganMg7YyM7J28XCLsnZggXCLqt7jrg6VcIiDsoIjrjIDqsr3roZzrpbwg67CU66GcIGltcG9ydO2VtOuPhCDrkKnri4jri6QuXG4gICAgICAgIC8vIOydtCDrgrTsmqnsnYAg7J20IO2VqOyImCDrgrTsl5DshJwg7JWE656Y7JeQIOuCmOyYrCDri6TrpbggaW1wb3J0IO2YuOy2nOyXkOuPhCDrj5nsnbztlZjqsowg7KCB7Jqp65Cp64uI64ukLlxuICAgICAgICBhd2FpdCBpbXBvcnQoc3NyUm91dGVzUGF0aCk7XG4gICAgICAgIGNvbnNvbGUubG9nKFwi4pyTIFNTUiByb3V0ZXMgbG9hZGVkXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGDimqAgU1NSIHJvdXRlcyBub3QgZm91bmQ6ICR7c3NyUm91dGVzUGF0aH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDroaTrp4Eg7JeF642w7J207Yq4IOuMgOydkTogYXNzZXQgaGFzaCDrtojsnbzsuZgg7IucIO2YhOyerCDrsoTsoIQg7KeB7KCRIOyEnOu5mVxuICAgIHNlcnZlci5nZXQoXCIvYXNzZXRzLzpmaWxlbmFtZVwiLCBhc3luYyAocmVxdWVzdCwgcmVwbHkpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RlZEZpbGUgPSAocmVxdWVzdC5wYXJhbXMgYXMgeyBmaWxlbmFtZTogc3RyaW5nIH0pLmZpbGVuYW1lO1xuICAgICAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5qb2luKHdlYkRpc3RQYXRoLCBcImFzc2V0c1wiKTtcbiAgICAgIGNvbnN0IGFzc2V0UGF0aCA9IGAvYXNzZXRzLyR7cmVxdWVzdGVkRmlsZX1gO1xuXG4gICAgICAvLyBDYWNoZS1Db250cm9sIO2XpOuNlCDqsrDsoJVcbiAgICAgIGNvbnN0IGdldENhY2hlQ29udHJvbEZvckFzc2V0ID0gKCk6IENhY2hlQ29udHJvbENvbmZpZyA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICAgIHR5cGU6IFwiYXNzZXRzXCIsXG4gICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICBwYXRoOiBhc3NldFBhdGgsXG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyDsgqzsmqnsnpAg7KCV7J2YIO2VuOuTpOufrCDsmrDshKBcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIoY2FjaGVSZXEpO1xuICAgICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDquLDrs7jqsJI6IGltbXV0YWJsZVxuICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGluZGV4LSouanMg65iQ64qUIGluZGV4LSouY3NzIOyalOyyreyduCDqsr3smrBcbiAgICAgIGlmICgvXmluZGV4LVthLWYwLTldK1xcLihqc3xjc3MpJC8udGVzdChyZXF1ZXN0ZWRGaWxlKSkge1xuICAgICAgICBjb25zdCBleHQgPSByZXF1ZXN0ZWRGaWxlLnNwbGl0KFwiLlwiKS5wb3AoKTtcbiAgICAgICAgY29uc3QgZmlsZXMgPSBhd2FpdCBmcy5yZWFkZGlyKGFzc2V0c0Rpcik7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRGaWxlID0gZmlsZXMuZmluZCgoZikgPT4gZi5zdGFydHNXaXRoKFwiaW5kZXgtXCIpICYmIGYuZW5kc1dpdGgoYC4ke2V4dH1gKSk7XG5cbiAgICAgICAgaWYgKGN1cnJlbnRGaWxlKSB7XG4gICAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCBjdXJyZW50RmlsZSk7XG4gICAgICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoKTtcbiAgICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBcInRleHQvY3NzXCIpO1xuICAgICAgICAgIGFwcGx5Q2FjaGVIZWFkZXJzKHJlcGx5LCBnZXRDYWNoZUNvbnRyb2xGb3JBc3NldCgpKTtcbiAgICAgICAgICByZXR1cm4gcmVwbHkuc2VuZChjb250ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJgg7YyM7J28IOyEnOu5mVxuICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCByZXF1ZXN0ZWRGaWxlKTtcbiAgICAgIGlmIChhd2FpdCBleGlzdHMoZmlsZVBhdGgpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IGV4dCA9IHJlcXVlc3RlZEZpbGUuc3BsaXQoXCIuXCIpLnBvcCgpO1xuICAgICAgICByZXBseS50eXBlKGV4dCA9PT0gXCJqc1wiID8gXCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0XCIgOiBleHQgPT09IFwiY3NzXCIgPyBcInRleHQvY3NzXCIgOiBcIlwiKTtcbiAgICAgICAgaWYgKHJlcXVlc3RlZEZpbGUuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGdldENhY2hlQ29udHJvbEZvckFzc2V0KCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXBseS5zZW5kKGNvbnRlbnQpO1xuICAgICAgfVxuXG4gICAgICByZXBseS5jb2RlKDQwNCkuc2VuZChcIk5vdCBmb3VuZFwiKTtcbiAgICB9KTtcblxuICAgIC8vIFNTUiDrnbzsmrDtirgg6rCc67OEIOuTseuhnSAoY29tcHJlc3Mg7Ji17IWY7J20IOudvOyasO2KuOuzhOuhnCDsoIHsmqnrkJjrj4TroZ0pXG4gICAgaWYgKHNzckF2YWlsYWJsZSkge1xuICAgICAgY29uc3QgeyBnZXRTU1JSb3V0ZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL3NzclwiKTtcbiAgICAgIGNvbnN0IHsgcmVuZGVyU1NSIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9zc3IvcmVuZGVyZXJcIik7XG4gICAgICBjb25zdCBzc3JSb3V0ZXMgPSBnZXRTU1JSb3V0ZXMoKTtcblxuICAgICAgZm9yIChjb25zdCByb3V0ZSBvZiBzc3JSb3V0ZXMpIHtcbiAgICAgICAgc2VydmVyLnJvdXRlKHtcbiAgICAgICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICAgICAgdXJsOiByb3V0ZS5wYXRoLFxuICAgICAgICAgIGNvbXByZXNzOiB0b0Zhc3RpZnlDb21wcmVzc09wdGlvbihyb3V0ZS5jb21wcmVzcyA/PyB0cnVlLCBnbG9iYWxDb21wcmVzc09wdGlvbnMpLFxuICAgICAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXJsID0gcmVxdWVzdC51cmw7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1NTUl0gTWF0Y2hlZCByb3V0ZTogJHtyb3V0ZS5wYXRofWApO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLmV4dHJhY3RQYXRoUGFyYW1zKHJvdXRlLnBhdGgsIHVybCk7XG4gICAgICAgICAgICBjb25zdCBodG1sID0gYXdhaXQgcmVuZGVyU1NSKHVybCwgcm91dGUsIHBhcmFtcywgcmVxdWVzdCwgcmVwbHksIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHJlcGx5LnR5cGUoXCJ0ZXh0L2h0bWxcIik7XG4gICAgICAgICAgICByZXR1cm4gaHRtbDtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDU1Igb3IgU3RhdGljIEZpbGUgRmFsbGJhY2sgKFNTUiDrnbzsmrDtirjsl5Ag66ek7Lmt65CY7KeAIOyViuuKlCDrqqjrk6Ag7JqU7LKtKVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIkhFQURcIl0sXG4gICAgICB1cmw6IFwiKlwiLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcXVlc3QsIHJlcGx5KSA9PiB7XG4gICAgICAgIC8vIC9hcGksIC9zb25hbXUtdWnripQgNDA0IOq3uOuMgOuhnFxuICAgICAgICBpZiAocmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9hcGlcIikgfHwgcmVxdWVzdC51cmwuc3RhcnRzV2l0aChcIi9zb25hbXUtdWlcIikpIHtcbiAgICAgICAgICByZXBseS5jb2RlKDQwNCkuc2VuZCh7IGVycm9yOiBcIk5vdCBGb3VuZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENTUuyaqSBDYWNoZS1Db250cm9sIO2XpOuNlCDshKTsoJVcbiAgICAgICAgaWYgKGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKSB7XG4gICAgICAgICAgY29uc3QgY3NyQ2FjaGVSZXE6IENhY2hlQ29udHJvbFJlcXVlc3QgPSB7XG4gICAgICAgICAgICB0eXBlOiBcImNzclwiLFxuICAgICAgICAgICAgdXJsOiByZXF1ZXN0LnVybCxcbiAgICAgICAgICAgIHBhdGg6IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBjc3JDYWNoZUNvbmZpZyA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNzckNhY2hlUmVxKTtcblxuICAgICAgICAgIGlmIChjc3JDYWNoZUNvbmZpZykge1xuICAgICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGNzckNhY2hlQ29uZmlnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDsoJXsoIEg7YyM7J287J20IOyhtOyerO2VoCDqsr3smrAsIOygleyggSDtjIzsnbzsnYQg66i87KCAIOyEnOu5me2VtOyVvO2VqFxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgcmVxdWVzdC51cmwpO1xuICAgICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiByZXBseS50eXBlKG1pbWVMb29rdXAoZmlsZVBhdGgpIHx8IFwiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtXCIpLnNlbmQoY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDU1IgZmFsbGJhY2s6IGluZGV4Lmh0bWwg7ISc67mZXG4gICAgICAgIGNvbnN0IGluZGV4UGF0aCA9IHBhdGguam9pbih3ZWJEaXN0UGF0aCwgXCJpbmRleC5odG1sXCIpO1xuICAgICAgICByZXR1cm4gcmVwbHkudHlwZShcInRleHQvaHRtbFwiKS5zZW5kKGF3YWl0IGZzLnJlYWRGaWxlKGluZGV4UGF0aCwgXCJ1dGYtOFwiKSk7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc29sZS5sb2coYOKckyBTdGF0aWMgd2ViIHNlcnZlciBjb25maWd1cmVkIHdpdGggJHtzc3JBdmFpbGFibGUgPyBcIlNTUlwiIDogXCJDU1Igb25seVwifSBzdXBwb3J0YCk7XG4gIH1cblxuICBjcmVhdGVBcGlIYW5kbGVyKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICApOiAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpID0+IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBhc3luYyAocmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIC8vIENvbnRleHQg7IOd7ISxXG4gICAgICBjb25zdCBjb250ZXh0OiBDb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgICByZXR1cm4gdGhpcy5hc3luY0xvY2FsU3RvcmFnZS5ydW4oeyBjb250ZXh0IH0sIGFzeW5jICgpID0+IHtcbiAgICAgICAgLy8gZ3VhcmRzIOyymOumrFxuICAgICAgICAoYXBpLm9wdGlvbnMuZ3VhcmRzID8/IFtdKS5ldmVyeSgoZ3VhcmQpID0+IGNvbmZpZy5ndWFyZEhhbmRsZXIoZ3VhcmQsIHJlcXVlc3QsIGFwaSkpO1xuXG4gICAgICAgIC8vIO2MjOudvOuvuO2EsCDsoJXrs7TroZwgem9kIOyKpO2CpOuniCDruYzrk5xcbiAgICAgICAgY29uc3QgeyBnZXRab2RPYmplY3RGcm9tQXBpIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2NvZGUtY29udmVydGVyc1wiKTtcbiAgICAgICAgY29uc3QgUmVxVHlwZSA9IGdldFpvZE9iamVjdEZyb21BcGkoYXBpLCB0aGlzLnN5bmNlci50eXBlcyk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCDtjIzsi7FcbiAgICAgICAgY29uc3Qgd2hpY2ggPSBhcGkub3B0aW9ucy5odHRwTWV0aG9kID09PSBcIkdFVFwiID8gXCJxdWVyeVwiIDogXCJib2R5XCI7XG4gICAgICAgIGxldCByZXFCb2R5OiB7XG4gICAgICAgICAgW2tleTogc3RyaW5nXTogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8g7YyM7J28IOyXheuhnOuTnCDsnojripQg6rK97JqwIOyehOyLnCDrjbDsnbTthLBcbiAgICAgICAgY29uc3QgZmlsZXM6IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBCdWZmZXJlZEZpbGVbXTtcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBVcGxvYWRlZEZpbGVbXTtcbiAgICAgICAgfSA9IHtcbiAgICAgICAgICBidWZmZXJlZEZpbGVzOiBbXSxcbiAgICAgICAgICB1cGxvYWRlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGJvZHkgPSAocmVxdWVzdFt3aGljaF0gPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcGFydHMgPSByZXF1ZXN0LnBhcnRzKHtcbiAgICAgICAgICAgICAgbGltaXRzOiBhcGkudXBsb2FkT3B0aW9ucy5saW1pdHMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gRm9ybURhdGHsnZggZmllbGTrk6TsnYQg7J6E7Iuc66GcIOyggOyepVxuICAgICAgICAgICAgY29uc3QgZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICAgICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcImJ1ZmZlclwiIHx8ICFhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lKSB7XG4gICAgICAgICAgICAgIC8vIEJ1ZmZlciDrqqjrk5w6IOuplOuqqOumrOyXkCDroZzrk5xcbiAgICAgICAgICAgICAgZm9yIGF3YWl0IChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWxlXCIpIHtcbiAgICAgICAgICAgICAgICAgIC8vIENSSVRJQ0FMOiDtjIzsnbwg7Iqk7Yq466a87J2EIOymieyLnCBjb25zdW1l7ZW07JW8IOuLpOydjCBwYXJ066GcIOuEmOyWtOqwiCDsiJgg7J6I7J2MXG4gICAgICAgICAgICAgICAgICAvLyDsnbQg7Zi47Lac7J20IOyXhuycvOuptCDsooXsooUgbXVsdGlwYXJ0IO2MjOyLseydtCBwZW5kaW5nIOyDge2DnOuhnCDtg4DsnoTslYTsm4Mg67Cc7IOdXG4gICAgICAgICAgICAgICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBwYXJ0LnRvQnVmZmVyKCk7XG4gICAgICAgICAgICAgICAgICBmaWxlcy5idWZmZXJlZEZpbGVzLnB1c2gobmV3IEJ1ZmZlcmVkRmlsZShwYXJ0LCBidWZmZXIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQudHlwZSA9PT0gXCJmaWVsZFwiKSB7XG4gICAgICAgICAgICAgICAgICBmaWVsZHNbcGFydC5maWVsZG5hbWVdID0gU3RyaW5nKHBhcnQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICAgIC8vIFN0cmVhbSDrqqjrk5w6IOymieyLnCDsoIDsnqXshozroZwg7Iqk7Yq466as67CNXG4gICAgICAgICAgICAgIGNvbnN0IGRpc2tOYW1lID0gYXBpLnVwbG9hZE9wdGlvbnMuZGVzdGluYXRpb247XG4gICAgICAgICAgICAgIGNvbnN0IGRpc2sgPSB0aGlzLnN0b3JhZ2UudXNlKGRpc2tOYW1lKTtcblxuICAgICAgICAgICAgICAvLyDsmrDshKDsiJzsnIQ6IOuNsOy9lOugiOydtO2EsCA+IOyghOyXrSDshKTsoJUgPiDquLDrs7jqsJJcbiAgICAgICAgICAgICAgY29uc3Qga2V5R2VuZXJhdG9yOiBLZXlHZW5lcmF0b3IgPVxuICAgICAgICAgICAgICAgIGFwaS51cGxvYWRPcHRpb25zLmtleUdlbmVyYXRvciA/P1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLnNlcnZlci5zdG9yYWdlPy5rZXlHZW5lcmF0b3IgPz9cbiAgICAgICAgICAgICAgICBkZWZhdWx0S2V5R2VuZXJhdG9yO1xuXG4gICAgICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0LnR5cGUgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhd2FpdCBrZXlHZW5lcmF0b3Ioe1xuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogcGFydC5maWxlbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgYXdhaXQgZGlzay5wdXRTdHJlYW0oa2V5LCBwYXJ0LmZpbGUsIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZGlzay5nZXRVcmwoa2V5KTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZFVybCA9IGF3YWl0IGRpc2suZ2V0U2lnbmVkVXJsKGtleSk7XG5cbiAgICAgICAgICAgICAgICAgIGZpbGVzLnVwbG9hZGVkRmlsZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgbmV3IFVwbG9hZGVkRmlsZSh7XG4gICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHBhcnQuZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgbWltZXR5cGU6IHBhcnQubWltZXR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgc2l6ZTogcGFydC5maWxlLmJ5dGVzUmVhZCxcbiAgICAgICAgICAgICAgICAgICAgICB1cmwsXG4gICAgICAgICAgICAgICAgICAgICAgc2lnbmVkVXJsLFxuICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICBkaXNrTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC50eXBlID09PSBcImZpZWxkXCIpIHtcbiAgICAgICAgICAgICAgICAgIGZpZWxkc1twYXJ0LmZpZWxkbmFtZV0gPSBTdHJpbmcocGFydC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIHFz66GcIOykkeyyqSDqtazsobAg7YyM7IuxOiBwYXJhbXNbY2F0ZWdvcnldIOKGkiB7IHBhcmFtczogeyBjYXRlZ29yeTogXCJ0ZXN0XCIgfSB9XG4gICAgICAgICAgICBjb25zdCBxcyA9IGF3YWl0IGltcG9ydChcInFzXCIpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcXMuZGVmYXVsdC5wYXJzZShmaWVsZHMpO1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihib2R5LCBwYXJzZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgZmFzdGlmeUNhc3RlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi9jYXN0ZXJcIik7XG4gICAgICAgICAgcmVxQm9keSA9IGZhc3RpZnlDYXN0ZXIoUmVxVHlwZSkucGFyc2UoYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zdCB7IFpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCJ6b2RcIik7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBab2RFcnJvcikge1xuICAgICAgICAgICAgY29uc3QgeyBodW1hbml6ZVpvZEVycm9yIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi91dGlscy96b2QtZXJyb3JcIik7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlcyA9IGh1bWFuaXplWm9kRXJyb3IoZSlcbiAgICAgICAgICAgICAgLm1hcCgoaXNzdWUpID0+IGlzc3VlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKFwiIFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHsgQmFkUmVxdWVzdEV4Y2VwdGlvbiB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vZXhjZXB0aW9ucy9zby1leGNlcHRpb25zXCIpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24obWVzc2FnZXMgYXMgTG9jYWxpemVkU3RyaW5nLCB7XG4gICAgICAgICAgICAgIHpvZEVycm9yOiBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29udGVudC1UeXBlXG4gICAgICAgIHJlcGx5LnR5cGUoYXBpLm9wdGlvbnMuY29udGVudFR5cGUgPz8gXCJhcHBsaWNhdGlvbi9qc29uXCIpO1xuXG4gICAgICAgIC8vIENhY2hlLUNvbnRyb2wg7Zek642UIOyEpOyglVxuICAgICAgICBjb25zdCBhcGlDYWNoZUNvbmZpZyA9IHRoaXMuZ2V0QXBpQ2FjaGVDb250cm9sKGFwaSwgcmVxdWVzdCwgY29uZmlnKTtcbiAgICAgICAgaWYgKGFwaUNhY2hlQ29uZmlnKSB7XG4gICAgICAgICAgYXBwbHlDYWNoZUhlYWRlcnMocmVwbHksIGFwaUNhY2hlQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOyXheuhnOuTnCDsmLXshZjsnbQg7J6I64qUIOqyveyasCDtjIzsnbwg642w7J207YSw66W8IENvbnRleHTsl5Ag7LaU6rCAXG4gICAgICAgIGlmIChhcGkudXBsb2FkT3B0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbnN1bWUgPSBhcGkudXBsb2FkT3B0aW9ucy5jb25zdW1lID8/IFwiYnVmZmVyXCI7XG4gICAgICAgICAgaWYgKGNvbnN1bWUgPT09IFwiYnVmZmVyXCIpIHtcbiAgICAgICAgICAgIGNvbnRleHQuYnVmZmVyZWRGaWxlcyA9IGZpbGVzLmJ1ZmZlcmVkRmlsZXM7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25zdW1lID09PSBcInN0cmVhbVwiKSB7XG4gICAgICAgICAgICBjb250ZXh0LnVwbG9hZGVkRmlsZXMgPSBmaWxlcy51cGxvYWRlZEZpbGVzO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuqqOuNuCDrqZTshozrk5wgYXJncyDsg53shLHtlZjsl6wg7Zi47LacXG4gICAgICAgIGNvbnN0IHsgQXBpUGFyYW1UeXBlIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKTtcbiAgICAgICAgY29uc3QgYXJncyA9IGFwaS5wYXJhbWV0ZXJzLm1hcCgocGFyYW0pID0+IHtcbiAgICAgICAgICAvLyBDb250ZXh0IOyduOygneyFmFxuICAgICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGV4dDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlcUJvZHlbcGFyYW0ubmFtZV07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVVJM7JeQ7IScIHBhdGggcGFyYW1z66W8IOy2lOy2nO2VqeuLiOuLpC5cbiAgICog7JiIOiBwYXR0ZXJuPVwiL2FkbWluL2NvbXBhbmllcy86Y29tcGFueUlkXCIsIHVybD1cIi9hZG1pbi9jb21wYW5pZXMvMTIzXCIg4oaSIHsgY29tcGFueUlkOiBcIjEyM1wiIH1cbiAgICovXG4gIHByaXZhdGUgZXh0cmFjdFBhdGhQYXJhbXMocGF0dGVybjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHBhdHRlcm5QYXJ0cyA9IHBhdHRlcm4uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCB1cmxQYXJ0cyA9IHVybC5zcGxpdChcIj9cIilbMF0uc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocGF0dGVyblBhcnRzW2ldLnN0YXJ0c1dpdGgoXCI6XCIpKSB7XG4gICAgICAgIHBhcmFtc1twYXR0ZXJuUGFydHNbaV0uc2xpY2UoMSldID0gdXJsUGFydHNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwYXJhbXM7XG4gIH1cblxuICAvKipcbiAgICogQVBJIOydkeuLteyXkCDsoIHsmqntlaAgQ2FjaGUtQ29udHJvbCDshKTsoJXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICAgKiDsmrDshKDsiJzsnIQ6IOqwnOuzhCDsp4DsoJUgPiBjYWNoZUNvbnRyb2xIYW5kbGVyXG4gICAqL1xuICBwcml2YXRlIGdldEFwaUNhY2hlQ29udHJvbChcbiAgICBhcGk6IEV4dGVuZGVkQXBpLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIGNvbmZpZzogU29uYW11RmFzdGlmeUNvbmZpZyxcbiAgKSB7XG4gICAgLy8g642w7L2U66CI7J207YSwIOyEpOyglSDsmrDshKBcbiAgICBpZiAoYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sKSB7XG4gICAgICByZXR1cm4gYXBpLm9wdGlvbnMuY2FjaGVDb250cm9sO1xuICAgIH1cblxuICAgIC8vIOyghOyXrSDtlbjrk6Trn6xcbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbEhhbmRsZXIpIHtcbiAgICAgIGNvbnN0IGNhY2hlUmVxOiBDYWNoZUNvbnRyb2xSZXF1ZXN0ID0ge1xuICAgICAgICB0eXBlOiBcImFwaVwiLFxuICAgICAgICB1cmw6IHJlcXVlc3QudXJsLFxuICAgICAgICBwYXRoOiByZXF1ZXN0LnJvdXRlT3B0aW9ucz8udXJsID8/IHJlcXVlc3QudXJsLnNwbGl0KFwiP1wiKVswXSxcbiAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgYXBpLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbmZpZy5jYWNoZUNvbnRyb2xIYW5kbGVyKGNhY2hlUmVxKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogU1NS7JqpIEFQSSDtmLjstpwgKEhUVFAg7Jik67KE7Zek65OcIOyXhuydtCDsp4HsoJEg7Zi47LacKVxuICAgKiBjcmVhdGVBcGlIYW5kbGVy7J2YIOuhnOyngeydhCDsnqzsgqzsmqntlZjrkJgsIHJlcXVlc3Qg7YyM7IuxIOuMgOyLoCBwYXJhbXMg7KeB7KCRIOyCrOyaqVxuICAgKi9cbiAgYXN5bmMgaW52b2tlQXBpRm9yU1NSKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBTU1Lsl5DshJwg64uk7JaR7ZWcIO2DgOyeheydmCBwYXJhbXPrpbwg67Cb7JWE7JW8IO2VqFxuICAgIHBhcmFtczogYW55W10sXG4gICAgY29uZmlnOiBTb25hbXVGYXN0aWZ5Q29uZmlnLFxuICAgIHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIC8vIENvbnRleHQg7IOd7ISxICjquLDsobQg66mU7IaM65OcIOyerOyCrOyaqSlcbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5jcmVhdGVDb250ZXh0KGNvbmZpZywgcmVxdWVzdCwgcmVwbHkpO1xuXG4gICAgcmV0dXJuIHRoaXMuYXN5bmNMb2NhbFN0b3JhZ2UucnVuKHsgY29udGV4dCB9LCBhc3luYyAoKSA9PiB7XG4gICAgICAvLyBhcmdzIOyDneyEsTogQ29udGV4dCDtjIzrnbzrr7jthLDripQg7KO87J6FLCDrgpjrqLjsp4DripQgcGFyYW1z7JeQ7IScIOqwgOyguOyYpOq4sFxuICAgICAgY29uc3QgeyBBcGlQYXJhbVR5cGUgfSA9IGF3YWl0IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpO1xuICAgICAgbGV0IHBhcmFtc0luZGV4ID0gMDtcbiAgICAgIGNvbnN0IGFyZ3MgPSBhcGkucGFyYW1ldGVycy5tYXAoKHBhcmFtKSA9PiB7XG4gICAgICAgIGlmIChBcGlQYXJhbVR5cGUuaXNDb250ZXh0KHBhcmFtLnR5cGUpKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcmFtc1twYXJhbXNJbmRleCsrXTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyDrqqjrjbgg66mU7ISc65OcIO2YuOy2nCAo6riw7KG0IOuplOyEnOuTnCDsnqzsgqzsmqkpXG4gICAgICByZXR1cm4gdGhpcy5pbnZva2VNb2RlbE1ldGhvZChhcGksIGFyZ3MsIHJlcGx5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGludm9rZU1vZGVsTWV0aG9kKFxuICAgIGFwaTogRXh0ZW5kZWRBcGksXG4gICAgYXJnczogdW5rbm93bltdLFxuICAgIHJlcGx5OiBGYXN0aWZ5UmVwbHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IG1vZGVsID0gdGhpcy5zeW5jZXIubW9kZWxzW2FwaS5tb2RlbE5hbWVdO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueTogbW9kZWzsnYAg66qo6424IOyduOyKpO2EtOyKpOydtOuvgOuhnCDrqZTshJzrk5wg7Zi47LacIOqwgOuKpVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChtb2RlbCBhcyBhbnkpW2FwaS5tZXRob2ROYW1lXS5hcHBseShtb2RlbCwgYXJncyk7XG4gICAgcmVwbHkudHlwZShhcGkub3B0aW9ucy5jb250ZW50VHlwZSA/PyBcImFwcGxpY2F0aW9uL2pzb25cIik7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlQ29udGV4dChcbiAgICBjb25maWc6IFNvbmFtdUZhc3RpZnlDb25maWcsXG4gICAgcmVxdWVzdDogRmFzdGlmeVJlcXVlc3QsXG4gICAgcmVwbHk6IEZhc3RpZnlSZXBseSxcbiAgKTogUHJvbWlzZTxDb250ZXh0PiB7XG4gICAgLy8gY3JlYXRlU1NFRmFjdG9yeSDtlajsiJjsl5Ag66+466asIHJlcXVlc3TsnZggc29ja2V06rO8IHJlcGx566W8IOuwlOyduOuUqS5cbiAgICBjb25zdCB7IGNyZWF0ZVNTRUZhY3RvcnkgfSA9IGF3YWl0IGltcG9ydChcIi4uL3N0cmVhbS9zc2VcIik7XG4gICAgY29uc3QgY3JlYXRlU1NFID0gKDxUIGV4dGVuZHMgWm9kT2JqZWN0PihcbiAgICAgIF9yZXF1ZXN0OiBGYXN0aWZ5UmVxdWVzdCxcbiAgICAgIF9yZXBseTogRmFzdGlmeVJlcGx5LFxuICAgICAgX2V2ZW50czogVCxcbiAgICApID0+IGNyZWF0ZVNTRUZhY3RvcnkoX3JlcXVlc3Quc29ja2V0LCBfcmVwbHksIF9ldmVudHMpKS5iaW5kKG51bGwsIHJlcXVlc3QsIHJlcGx5KTtcblxuICAgIC8vIGxvY2FsZSDqsJDsp4BcbiAgICBjb25zdCBsb2NhbGUgPVxuICAgICAgdGhpcy5kZXRlY3RMb2NhbGUocmVxdWVzdC5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdLCB0aGlzLmNvbmZpZy5pMThuLnN1cHBvcnRlZExvY2FsZXMpID8/XG4gICAgICB0aGlzLmNvbmZpZy5pMThuLmRlZmF1bHRMb2NhbGU7XG5cbiAgICAvLyBhdXRoIGNvbnRleHQg7LaU6rCAXG4gICAgY29uc3QgaGVhZGVycyA9IGNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQocmVxdWVzdC5oZWFkZXJzKTtcbiAgICBjb25zdCBzZXNzaW9uID0gKGF3YWl0IHRoaXMuX2F1dGg/LmFwaS5nZXRTZXNzaW9uKHsgaGVhZGVycyB9KSkgPz8gbnVsbDtcblxuICAgIGNvbnN0IGNvbnRleHQ6IENvbnRleHQgPSB7XG4gICAgICAuLi4oYXdhaXQgUHJvbWlzZS5yZXNvbHZlKFxuICAgICAgICBjb25maWcuY29udGV4dFByb3ZpZGVyKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJlcXVlc3QsXG4gICAgICAgICAgICByZXBseSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgICAgIGNyZWF0ZVNTRSxcbiAgICAgICAgICAgIG5haXRlU3RvcmU6IE5haXRlLmNyZWF0ZVN0b3JlKCksXG4gICAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgICAvLyBhdXRoXG4gICAgICAgICAgICB1c2VyOiBzZXNzaW9uPy51c2VyID8/IG51bGwsXG4gICAgICAgICAgICBzZXNzaW9uOiBzZXNzaW9uPy5zZXNzaW9uID8/IG51bGwsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0LFxuICAgICAgICAgIHJlcGx5LFxuICAgICAgICApLFxuICAgICAgKSksXG4gICAgfTtcbiAgICByZXR1cm4gY29udGV4dDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQtTGFuZ3VhZ2Ug7Zek642U7JeQ7IScIOyngOybkO2VmOuKlCBsb2NhbGXsnYQg7LC+7Iq164uI64ukLlxuICAgKiBAZXhhbXBsZSBcImtvLUtSLGtvO3E9MC45LGVuO3E9MC44XCIg4oaSIFwia29cIlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RMb2NhbGUoXG4gICAgYWNjZXB0TGFuZ3VhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBzdXBwb3J0ZWQ6IHN0cmluZ1tdLFxuICApOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghYWNjZXB0TGFuZ3VhZ2UpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAvLyBBY2NlcHQtTGFuZ3VhZ2U6IGtvLUtSLGtvO3E9MC45LGVuO3E9MC44XG4gICAgY29uc3QgbGFuZ3MgPSBhY2NlcHRMYW5ndWFnZS5zcGxpdChcIixcIikubWFwKChsYW5nKSA9PiB7XG4gICAgICBjb25zdCBbY29kZV0gPSBsYW5nLnNwbGl0KFwiO1wiKTtcbiAgICAgIHJldHVybiBjb2RlLnRyaW0oKS5zcGxpdChcIi1cIilbMF07IC8vIGtvLUtSIOKGkiBrb1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGxhbmdzLmZpbmQoKGxhbmcpID0+IHN1cHBvcnRlZC5pbmNsdWRlcyhsYW5nKSk7XG4gIH1cblxuICBhc3luYyBzdGFydFdhdGNoZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgd2F0Y2hQYXRoID0gW3BhdGguam9pbih0aGlzLmFwaVJvb3RQYXRoLCBcInNyY1wiKV07XG5cbiAgICBjb25zdCBjaG9raWRhciA9IChhd2FpdCBpbXBvcnQoXCJjaG9raWRhclwiKSkuZGVmYXVsdDtcbiAgICB0aGlzLndhdGNoZXIgPSBjaG9raWRhci53YXRjaCh3YXRjaFBhdGgsIHtcbiAgICAgIGlnbm9yZWQ6IChwYXRoLCBzdGF0cykgPT5cbiAgICAgICAgISFzdGF0cz8uaXNGaWxlKCkgJiYgIXBhdGguZW5kc1dpdGgoXCIudHNcIikgJiYgIXBhdGguZW5kc1dpdGgoXCIuanNvblwiKSxcbiAgICAgIHBlcnNpc3RlbnQ6IHRydWUsXG4gICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgdGhpcy53YXRjaGVyLm9uKFwiYWxsXCIsIGFzeW5jIChldmVudDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBhYnNvbHV0ZVBhdGggPSBmaWxlUGF0aCBhcyBBYnNvbHV0ZVBhdGg7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIGFic29sdXRlUGF0aC5zdGFydHNXaXRoKHRoaXMuYXBpUm9vdFBhdGgpLFxuICAgICAgICBcIkZpbGUgcGF0aCBpcyBub3Qgd2l0aGluIHRoZSBBUEkgcm9vdCBwYXRoXCIsXG4gICAgICApO1xuXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIgJiYgZXZlbnQgIT09IFwiYWRkXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyBzb25hbXUuY29uZmlnLnRzIOuzgOqyvSDsi5wg7J6s7Iuc7J6RXG4gICAgICAgIGNvbnN0IGlzQ29uZmlnVHMgPSBmaWxlUGF0aCA9PT0gcGF0aC5qb2luKHRoaXMuYXBpUm9vdFBhdGgsIFwic3JjXCIsIFwic29uYW11LmNvbmZpZy50c1wiKTtcblxuICAgICAgICBpZiAoaXNDb25maWdUcykge1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IGZpbGVQYXRoLnJlcGxhY2UodGhpcy5hcGlSb290UGF0aCwgXCJhcGlcIik7XG4gICAgICAgICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ib2xkKGBEZXRlY3RlZCgke2V2ZW50fSk6ICR7Y2hhbGsuYmx1ZShyZWxhdGl2ZVBhdGgpfSAtIFJlc3RhcnRpbmcuLi5gKSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHByb2Nlc3Mua2lsbChwcm9jZXNzLnBpZCwgXCJTSUdVU1IyXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHRoaXMuaGFuZGxlRmlsZUNoYW5nZShldmVudCwgYWJzb2x1dGVQYXRoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgIEEgZnVuY3Rpb24gdGhhdCBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgaW5pdCBhbmQgZGVzdHJveSB3aGVuIHVzaW5nIFNvbmFtdSB2aWEgc2NyaXB0cy4gICAgXG4gICovXG4gIGFzeW5jIHJ1blNjcmlwdChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgIGF3YWl0IHRoaXMuaW5pdCh0cnVlLCBmYWxzZSwgdW5kZWZpbmVkLCBmYWxzZSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZuKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVnaXN0ZXJQbHVnaW5zKHNlcnZlcjogRmFzdGlmeUluc3RhbmNlLCBwbHVnaW5zOiBTb25hbXVTZXJ2ZXJPcHRpb25zW1wicGx1Z2luc1wiXSkge1xuICAgIGlmICghcGx1Z2lucykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNvbXByZXNzIO2UjOufrOq3uOyduOydgCDri6Trpbgg7ZSM65+s6re47J2467O064ukIOuovOyggCDrk7HroZ3rkJjslrTslbwg7ZWp64uI64ukLlxuICAgIGlmIChwbHVnaW5zLmNvbXByZXNzKSB7XG4gICAgICBjb25zdCBjb21wcmVzc1BsdWdpbiA9IChhd2FpdCBpbXBvcnQoXCJAZmFzdGlmeS9jb21wcmVzc1wiKSkuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuICAgICAgICB0aHJlc2hvbGQ6IDEwMjQsXG4gICAgICAgIGVuY29kaW5nczogW1wiYnJcIiwgXCJnemlwXCIsIFwiZGVmbGF0ZVwiXSBhcyAoXCJiclwiIHwgXCJnemlwXCIgfCBcImRlZmxhdGVcIilbXSxcbiAgICAgIH07XG5cbiAgICAgIGlmIChwbHVnaW5zLmNvbXByZXNzID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3Rlcihjb21wcmVzc1BsdWdpbiwgZGVmYXVsdE9wdGlvbnMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2VydmVyLnJlZ2lzdGVyKGNvbXByZXNzUGx1Z2luLCB7XG4gICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgLi4ucGx1Z2lucy5jb21wcmVzcyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcGx1Z2luc01vZHVsZXMgPSB7XG4gICAgICBjb3JzOiBcIkBmYXN0aWZ5L2NvcnNcIixcbiAgICAgIGZvcm1ib2R5OiBcIkBmYXN0aWZ5L2Zvcm1ib2R5XCIsXG4gICAgICBtdWx0aXBhcnQ6IFwiQGZhc3RpZnkvbXVsdGlwYXJ0XCIsXG4gICAgICBxczogXCJmYXN0aWZ5LXFzXCIsXG4gICAgICBzc2U6IFwiZmFzdGlmeS1zc2UtdjJcIixcbiAgICAgIHN0YXRpYzogXCJAZmFzdGlmeS9zdGF0aWNcIixcbiAgICB9IGFzIGNvbnN0O1xuXG4gICAgY29uc3QgcmVnaXN0ZXJQbHVnaW4gPSBhc3luYyA8SyBleHRlbmRzIGtleW9mIE5vbk51bGxhYmxlPHR5cGVvZiBwbHVnaW5zPj4oXG4gICAgICBrZXk6IEssXG4gICAgICBwbHVnaW5OYW1lOiBzdHJpbmcsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvcHRpb24gPSBwbHVnaW5zW2tleV07XG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBpZiAob3B0aW9uID09PSB0cnVlKSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNlcnZlci5yZWdpc3RlcigoYXdhaXQgaW1wb3J0KHBsdWdpbk5hbWUpKS5kZWZhdWx0LCBvcHRpb24pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHBsdWdpbk5hbWVdIG9mIE9iamVjdC5lbnRyaWVzKHBsdWdpbnNNb2R1bGVzKSkge1xuICAgICAgYXdhaXQgcmVnaXN0ZXJQbHVnaW4oa2V5IGFzIGtleW9mIHR5cGVvZiBwbHVnaW5zLCBwbHVnaW5OYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGx1Z2lucy5jdXN0b20pIHtcbiAgICAgIHBsdWdpbnMuY3VzdG9tKHNlcnZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGJldHRlci1hdXRoIOudvOyasO2KuOulvCDrk7HroZ3tlanri4jri6QuXG4gICAqIC9hcGkvYXV0aC8qIOqyveuhnOuhnCDsnbjspp0gQVBJ6rCAIOyekOuPmSDrk7HroZ3rkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlZ2lzdGVyQmV0dGVyQXV0aChcbiAgICBzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSxcbiAgICBvcHRpb25zOiBOb25OdWxsYWJsZTxTb25hbXVTZXJ2ZXJPcHRpb25zW1wiYXV0aFwiXT4sXG4gICkge1xuICAgIGlmICghb3B0aW9ucykgcmV0dXJuO1xuXG4gICAgY29uc3QgYmFzZVBhdGggPSBvcHRpb25zLmJhc2VQYXRoID8/IFwiL2FwaS9hdXRoXCI7XG5cbiAgICAvLyDsgqzsmqnsnpAg7ISk7KCV6rO8IOq4sOuzuOqwkuydhCBtZXJnZVxuICAgIGNvbnN0IG1lcmdlZEZpZWxkTWFwcGluZ3MgPSBtZXJnZShCQVNFX0ZJRUxEX01BUFBJTkdTLCBvcHRpb25zKTtcblxuICAgIC8vIGJldHRlci1hdXRoIOyduOyKpO2EtOyKpCDsg53shLFcbiAgICBjb25zdCB7IGJldHRlckF1dGggfSA9IGF3YWl0IGltcG9ydChcImJldHRlci1hdXRoXCIpO1xuICAgIGNvbnN0IHsgUG9vbCB9ID0gYXdhaXQgaW1wb3J0KFwicGdcIik7XG5cbiAgICB0aGlzLl9hdXRoID0gYmV0dGVyQXV0aCh7XG4gICAgICBkYXRhYmFzZTogbmV3IFBvb2woREIuZ2V0REJDb25maWcoXCJ3XCIpLmNvbm5lY3Rpb24gYXMgUG9vbENvbmZpZyksXG4gICAgICAuLi5tZXJnZWRGaWVsZE1hcHBpbmdzLFxuICAgIH0pO1xuXG4gICAgLy8gYmV0dGVyLWF1dGgg65287Jqw7Yq4IOuTseuhnVxuICAgIHNlcnZlci5yb3V0ZSh7XG4gICAgICBtZXRob2Q6IFtcIkdFVFwiLCBcIlBPU1RcIl0sXG4gICAgICB1cmw6IGAke2Jhc2VQYXRofS8qYCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlcXVlc3QudXJsLCBgaHR0cDovLyR7cmVxdWVzdC5oZWFkZXJzLmhvc3R9YCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSBjb252ZXJ0RmFzdGlmeUhlYWRlcnNUb1N0YW5kYXJkKHJlcXVlc3QuaGVhZGVycyk7XG4gICAgICAgIGNvbnN0IHJlcSA9IG5ldyBSZXF1ZXN0KHVybC50b1N0cmluZygpLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIC4uLihyZXF1ZXN0LmJvZHkgPyB7IGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSkgfSA6IHt9KSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmF1dGguaGFuZGxlcihyZXEpO1xuXG4gICAgICAgIHJlcGx5LnN0YXR1cyhyZXNwb25zZS5zdGF0dXMpO1xuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmZvckVhY2goKHZhbHVlOiBzdHJpbmcsIGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgcmVwbHkuaGVhZGVyKGtleSwgdmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcGx5LnNlbmQocmVzcG9uc2UuYm9keSA/IGF3YWl0IHJlc3BvbnNlLnRleHQoKSA6IG51bGwpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNoYWxrID0gKGF3YWl0IGltcG9ydChcImNoYWxrXCIpKS5kZWZhdWx0O1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgYmV0dGVyLWF1dGggcmVnaXN0ZXJlZCBhdCAke2Jhc2VQYXRofS8qYCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplQ2FjaGUoY29uZmlnOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCwgZm9yVGVzdGluZzogYm9vbGVhbikge1xuICAgIGNvbnN0IHsgc2V0Q2FjaGVNYW5hZ2VyUmVmIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jYWNoZS9kZWNvcmF0b3JcIik7XG5cbiAgICAvLyDthYzsiqTtirgg7ZmY6rK97JeQ7IScIOuplOuqqOumrCDrk5zrnbzsnbTrsoQg7J6Q64+ZIOyCrOyaqVxuICAgIGlmIChmb3JUZXN0aW5nKSB7XG4gICAgICBjb25zdCB7IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NhY2hlL2NhY2hlLW1hbmFnZXJcIik7XG4gICAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZVRlc3RDYWNoZU1hbmFnZXIoKTtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8g7ISk7KCV7J20IOyXhuycvOuptCDsupDsi5wg67mE7Zmc7ISx7ZmUXG4gICAgaWYgKCFjb25maWcpIHtcbiAgICAgIHNldENhY2hlTWFuYWdlclJlZihudWxsKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyDshKTsoJXsl5Ag65Sw6528IENhY2hlTWFuYWdlciDsg53shLFcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlTWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vY2FjaGUvY2FjaGUtbWFuYWdlclwiKTtcbiAgICB0aGlzLl9jYWNoZSA9IGNyZWF0ZUNhY2hlTWFuYWdlcihjb25maWcpO1xuICAgIHNldENhY2hlTWFuYWdlclJlZih0aGlzLl9jYWNoZSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVXb3JrZmxvd3Mob3B0aW9uczogU29uYW11VGFza09wdGlvbnMgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCB7IFdvcmtmbG93TWFuYWdlciB9ID0gYXdhaXQgaW1wb3J0KFwiLi4vdGFza3Mvd29ya2Zsb3ctbWFuYWdlclwiKTtcbiAgICAvLyBOT1RFOiBAc29uYW11LWtpdC90YXNrcyDslYjsl5DshKAga25leCBjb25maWfrpbwg7IiY7KCV7ZWY6riwIOuVjOusuOyXkCBjb25uZWN0aW9u7J20IOyVhOuLjCBjb25maWcg7Ke466GcIOuztOuDheuLiOuLpC5cbiAgICB0aGlzLl93b3JrZmxvd3MgPSBuZXcgV29ya2Zsb3dNYW5hZ2VyKERCLmdldERCQ29uZmlnKFwid1wiKSk7XG4gICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZW5hYmxlV29ya2VyID0gb3B0aW9ucy5lbmFibGVXb3JrZXIgPz8gaXNEYWVtb25TZXJ2ZXIoKTtcbiAgICBjb25zdCBkZWZhdWx0V29ya2VyT3B0aW9ucyA9IHtcbiAgICAgIGNvbmN1cnJlbmN5OiBvcy5jcHVzKCkubGVuZ3RoIC0gMSxcbiAgICAgIHVzZVB1YlN1YjogdHJ1ZSxcbiAgICAgIGxpc3RlbkRlbGF5OiA1MDAsXG4gICAgfTtcblxuICAgIGlmIChlbmFibGVXb3JrZXIpIHtcbiAgICAgIHRoaXMud29ya2Zsb3dzLnNldHVwV29ya2VyKHtcbiAgICAgICAgLi4uZGVmYXVsdFdvcmtlck9wdGlvbnMsXG4gICAgICAgIC4uLm9wdGlvbnMud29ya2VyT3B0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYm9vdChzZXJ2ZXI6IEZhc3RpZnlJbnN0YW5jZSwgb3B0aW9uczogU29uYW11U2VydmVyT3B0aW9ucykge1xuICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLmxpc3Rlbj8ucG9ydCA/PyAzMDAwO1xuICAgIGNvbnN0IGhvc3QgPSBvcHRpb25zLmxpc3Rlbj8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuXG4gICAgc2VydmVyLmFkZEhvb2soXCJvbkNsb3NlXCIsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblNodXRkb3duPy4oc2VydmVyKTtcbiAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLmRlc3Ryb3koKTtcbiAgICAgIGF3YWl0IHRoaXMuZGVzdHJveSgpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc2h1dGRvd24gPSBhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkdXJpbmcgc2h1dGRvd246XCIsIGVycik7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCBzaHV0ZG93bik7XG4gICAgcHJvY2Vzcy5vbihcIlNJR1RFUk1cIiwgc2h1dGRvd24pO1xuXG4gICAgaWYgKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKSB7XG4gICAgICBzZXJ2ZXIuc2V0RXJyb3JIYW5kbGVyKG9wdGlvbnMubGlmZWN5Y2xlPy5vbkVycm9yKTtcbiAgICB9XG5cbiAgICBzZXJ2ZXJcbiAgICAgIC5saXN0ZW4oeyBwb3J0LCBob3N0IH0pXG4gICAgICAudGhlbihhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMud29ya2Zsb3dzLnN0YXJ0V29ya2VyKCk7XG4gICAgICAgIGF3YWl0IG9wdGlvbnMubGlmZWN5Y2xlPy5vblN0YXJ0Py4oc2VydmVyKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goYXN5bmMgKGVycikgPT4ge1xuICAgICAgICBjb25zdCBjaGFsayA9IChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdDtcbiAgICAgICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJGYWlsZWQgdG8gc3RhcnQgc2VydmVyOlwiLCBlcnIpKTtcbiAgICAgICAgYXdhaXQgc2h1dGRvd24oKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBoYW5kbGVGaWxlQ2hhbmdlKGV2ZW50OiBzdHJpbmcsIGZpbGVQYXRoOiBBYnNvbHV0ZVBhdGgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDssqsg67KI7Ke4IO2MjOydvOydtOuptCBITVIg7Iuc7J6RIOyLnOqwhCDquLDroZ1cbiAgICBpZiAodGhpcy5wZW5kaW5nRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmhtclN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgfVxuICAgIHRoaXMucGVuZGluZ0ZpbGVzLnB1c2goZmlsZVBhdGgpO1xuXG4gICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZSh0aGlzLmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG4gICAgY29uc3QgY2hhbGsgPSAoYXdhaXQgaW1wb3J0KFwiY2hhbGtcIikpLmRlZmF1bHQ7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZChgRGV0ZWN0ZWQoJHtldmVudH0pOiAke2NoYWxrLmJsdWUocmVsYXRpdmVQYXRoKX1gKSk7XG5cbiAgICBhd2FpdCB0aGlzLnN5bmNlci5zeW5jRnJvbVdhdGNoZXIoZXZlbnQsIGZpbGVQYXRoKTtcblxuICAgIC8vIOyymOumrCDsmYTro4zrkJwg7YyM7J287J2EIOuMgOq4sCDrqqnroZ3sl5DshJwg7KCc6rGwXG4gICAgdGhpcy5wZW5kaW5nRmlsZXMgPSB0aGlzLnBlbmRpbmdGaWxlcy5zbGljZSgxKTtcblxuICAgIC8vIOuqqOuToCDtjIzsnbwg7LKY66as6rCAIOyZhOujjOuQmOuptCDstZzsooUg66mU7Iuc7KeAIOy2nOugpVxuICAgIGlmICh0aGlzLnBlbmRpbmdGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGF3YWl0IHRoaXMuZmluaXNoSE1SKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5pc2hITVIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5zeW5jZXIucmVuZXdDaGVja3N1bXMoKTtcblxuICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHRvdGFsVGltZSA9IGVuZFRpbWUgLSB0aGlzLmhtclN0YXJ0VGltZTtcbiAgICBjb25zdCBbY2hhbGssIHsgY2VudGVyVGV4dCB9XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIChhd2FpdCBpbXBvcnQoXCJjaGFsa1wiKSkuZGVmYXVsdCxcbiAgICAgIGltcG9ydChcIi4uL3V0aWxzL2NvbnNvbGUtdXRpbFwiKSxcbiAgICBdKTtcbiAgICBjb25zdCBtc2cgPSBgSE1SIERvbmUhICR7Y2hhbGsuYm9sZC53aGl0ZShgJHt0b3RhbFRpbWV9bXNgKX1gO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuYmxhY2suYmdHcmVlbihjZW50ZXJUZXh0KG1zZykpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBCYXNlTW9kZWwgfSA9IGF3YWl0IGltcG9ydChcIi4uL2RhdGFiYXNlL2Jhc2UtbW9kZWxcIik7XG4gICAgLy8g66i87KCAIOyymOumrO2VtOyVvO2VqC5cbiAgICBhd2FpdCBCYXNlTW9kZWwuZGVzdHJveSgpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICB0aGlzLl93b3JrZmxvd3M/LmRlc3Ryb3koKSA/PyBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuX2NhY2hlPy5kaXNjb25uZWN0KCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICB0aGlzLndhdGNoZXI/LmNsb3NlKCkgPz8gUHJvbWlzZS5yZXNvbHZlKCksXG4gICAgICBsb2d0YXBlRGlzcG9zZSgpLFxuICAgIF0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBTb25hbXUgPSBuZXcgU29uYW11Q2xhc3MoKTtcblxuLyoqXG4gKiBzdHJlYW0g66qo65Oc7JeQ7IScIO2CpCDsg53shLEg7ZWo7IiY6rCAIOyngOygleuQmOyngCDslYrslZjsnYQg65WMIOyCrOyaqe2VmOuKlCDquLDrs7gg7ZWo7IiY7J6F64uI64ukLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0S2V5R2VuZXJhdG9yKGZpbGU6IHsgZmlsZW5hbWU6IHN0cmluZzsgbWltZXR5cGU6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgY29uc3QgZXh0ID0gbWltZS5leHRlbnNpb24oZmlsZS5taW1ldHlwZSkgfHwgXCJiaW5cIjtcbiAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcbiAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgOCk7XG4gIHJldHVybiBgdXBsb2Fkcy8ke3RpbWVzdGFtcH0tJHtyYW5kb219LiR7ZXh0fWA7XG59XG4iXSwibmFtZXMiOlsiZGlzcG9zZSIsImxvZ3RhcGVEaXNwb3NlIiwiYXNzZXJ0IiwiQXN5bmNMb2NhbFN0b3JhZ2UiLCJmcyIsIm1pbWUiLCJsb29rdXAiLCJtaW1lTG9va3VwIiwib3MiLCJwYXRoIiwiQkFTRV9GSUVMRF9NQVBQSU5HUyIsImNvbnZlcnRGYXN0aWZ5SGVhZGVyc1RvU3RhbmRhcmQiLCJjcmVhdGVNb2NrU1NFRmFjdG9yeSIsIkRCIiwiaXNEYWVtb25TZXJ2ZXIiLCJtZXJnZSIsImFwcGx5Q2FjaGVIZWFkZXJzIiwiQ2FjaGVQcmVzZXRzIiwidG9GYXN0aWZ5Q29tcHJlc3NPcHRpb24iLCJOYWl0ZSIsIkJ1ZmZlcmVkRmlsZSIsIlVwbG9hZGVkRmlsZSIsImV4aXN0cyIsImZpbGVFeGlzdHMiLCJnZXRTZWNyZXRzIiwiU29uYW11Q2xhc3MiLCJpc0luaXRpYWxpemVkIiwiZm9yVGVzdGluZyIsImFzeW5jTG9jYWxTdG9yYWdlIiwiZ2V0Q29udGV4dCIsInN0b3JlIiwiZ2V0U3RvcmUiLCJjb250ZXh0IiwicHJvY2VzcyIsImVudiIsIk5PREVfRU5WIiwicmVxdWVzdCIsInJlcGx5IiwiaGVhZGVycyIsImNyZWF0ZVNTRSIsInNjaGVtYSIsIm5haXRlU3RvcmUiLCJNYXAiLCJFcnJvciIsIl9hcGlSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiYXBwUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIl9kYkNvbmZpZyIsImRiQ29uZmlnIiwiX3N5bmNlciIsInN5bmNlciIsIl9jb25maWciLCJjb25maWciLCJzZWNyZXRzIiwiX3N0b3JhZ2UiLCJzdG9yYWdlIiwiX2NhY2hlIiwiY2FjaGUiLCJfd29ya2Zsb3dzIiwid29ya2Zsb3dzIiwiX2F1dGgiLCJhdXRoIiwid2F0Y2hlciIsInBlbmRpbmdGaWxlcyIsImhtclN0YXJ0VGltZSIsInNlcnZlciIsImluaXRGb3JUZXN0aW5nIiwiaW5pdCIsInVuZGVmaW5lZCIsImRvU2lsZW50IiwiZW5hYmxlU3luYyIsImNoYWxrIiwiZGVmYXVsdCIsImNvbnNvbGUiLCJ0aW1lIiwiY3lhbiIsImZpbmRBcGlSb290UGF0aCIsImxvYWRDb25maWciLCJkYXRhYmFzZSIsImRlZmF1bHRPcHRpb25zIiwiY2xpZW50IiwiY29uZmlndXJlTG9nVGFwZSIsImxvZ2dpbmciLCJnZW5lcmF0ZURCQ29uZmlnIiwibG9nIiwiZ3JlZW4iLCJFbnRpdHlNYW5hZ2VyIiwiYXV0b2xvYWQiLCJpbml0aWFsaXplQ2FjaGUiLCJpbml0aWFsaXplV29ya2Zsb3dzIiwidGFza3MiLCJTeW5jZXIiLCJhdXRvbG9hZFR5cGVzIiwiYXV0b2xvYWRNb2RlbHMiLCJhdXRvbG9hZEFwaXMiLCJhdXRvbG9hZFdvcmtmbG93cyIsIlRlbXBsYXRlTWFuYWdlciIsImF1dG9sb2FkU1NSUm91dGVzIiwiaXNMb2NhbCIsImlzVGVzdCIsInNldHVwQmlvbWUiLCJpc0hvdFJlbG9hZFNlcnZlciIsInN5bmMiLCJzdGFydFdhdGNoZXIiLCJ0aW1lRW5kIiwiY3JlYXRlU2VydmVyIiwiaW5pdE9wdGlvbnMiLCJvcHRpb25zIiwiZmFzdGlmeSIsImdldExvZ1RhcGVGYXN0aWZ5TG9nZ2VyIiwibG9nZ2VyIiwiY2F0ZWdvcnkiLCJmYXN0aWZ5Q2F0ZWdvcnkiLCJTdG9yYWdlTWFuYWdlciIsInBsdWdpbnMiLCJyZWdpc3RlclBsdWdpbnMiLCJyZWdpc3RlckJldHRlckF1dGgiLCJ3aXRoRmFzdGlmeSIsImFwaUNvbmZpZyIsImJvb3QiLCJ0aW1lem9uZSIsImFwaSIsImZvcm1hdEluVGltZVpvbmUiLCJJU09fREFURV9SRUdFWCIsIkRBVEVfRk9STUFUIiwic2V0UmVwbHlTZXJpYWxpemVyIiwicGF5bG9hZCIsIkpTT04iLCJzdHJpbmdpZnkiLCJfa2V5IiwidmFsdWUiLCJ0ZXN0IiwiRGF0ZSIsImdldCIsInJvdXRlIiwicHJlZml4IiwiX3JlcXVlc3QiLCJfcmVwbHkiLCJhcGlzIiwic29uYW11VUlBcGlQbHVnaW4iLCJyZWdpc3RlciIsIndlYlBhdGgiLCJoYXNXZWIiLCJwbHVnaW5Db21wcmVzcyIsImNvbXByZXNzIiwiZ2xvYmFsQ29tcHJlc3NPcHRpb25zIiwidGhyZXNob2xkIiwiZW5jb2RpbmdzIiwiY3VzdG9tVHlwZXMiLCJzZXR1cFZpdGVEZXZTZXJ2ZXIiLCJtb2RlbHMiLCJtb2RlbE5hbWUiLCJtZXRob2QiLCJodHRwTWV0aG9kIiwidXJsIiwiaGFuZGxlciIsImNyZWF0ZUFwaUhhbmRsZXIiLCJzZXR1cFN0YXRpY1dlYlNlcnZlciIsInZpdGVTZXJ2ZXIiLCJ2aXRlIiwicm9vdCIsIm1pZGRsZXdhcmVNb2RlIiwiaG1yIiwiYXBwVHlwZSIsInVzZSIsInJlcSIsInJlcyIsIm5leHQiLCJzdGFydHNXaXRoIiwibWlkZGxld2FyZXMiLCJnZXRTU1JSb3V0ZXMiLCJyZW5kZXJTU1IiLCJzc3JSb3V0ZXMiLCJwYXJhbXMiLCJleHRyYWN0UGF0aFBhcmFtcyIsImh0bWwiLCJ0eXBlIiwidGVtcGxhdGUiLCJyZWFkRmlsZSIsInRyYW5zZm9ybUluZGV4SHRtbCIsImUiLCJzc3JGaXhTdGFja3RyYWNlIiwiZXJyb3IiLCJzdGF0dXMiLCJtZXNzYWdlIiwiYWRkSG9vayIsImNsb3NlIiwiX3dlYlBhdGgiLCJ3ZWJEaXN0UGF0aCIsInNzclBhdGgiLCJzc3JFbnRyeVBhdGgiLCJzc3JSb3V0ZXNQYXRoIiwid2FybiIsInNzckF2YWlsYWJsZSIsInJlcXVlc3RlZEZpbGUiLCJmaWxlbmFtZSIsImFzc2V0c0RpciIsImFzc2V0UGF0aCIsImdldENhY2hlQ29udHJvbEZvckFzc2V0IiwiY2FjaGVSZXEiLCJjYWNoZUNvbnRyb2xIYW5kbGVyIiwicmVzdWx0IiwiaW1tdXRhYmxlIiwiZXh0IiwicG9wIiwiZmlsZXMiLCJyZWFkZGlyIiwiY3VycmVudEZpbGUiLCJmaW5kIiwiZiIsImVuZHNXaXRoIiwiZmlsZVBhdGgiLCJjb250ZW50Iiwic2VuZCIsImluY2x1ZGVzIiwiY29kZSIsImNzckNhY2hlUmVxIiwiY3NyQ2FjaGVDb25maWciLCJpbmRleFBhdGgiLCJjcmVhdGVDb250ZXh0IiwicnVuIiwiZ3VhcmRzIiwiZXZlcnkiLCJndWFyZCIsImd1YXJkSGFuZGxlciIsImdldFpvZE9iamVjdEZyb21BcGkiLCJSZXFUeXBlIiwidHlwZXMiLCJ3aGljaCIsInJlcUJvZHkiLCJidWZmZXJlZEZpbGVzIiwidXBsb2FkZWRGaWxlcyIsImJvZHkiLCJ1cGxvYWRPcHRpb25zIiwicGFydHMiLCJsaW1pdHMiLCJmaWVsZHMiLCJjb25zdW1lIiwicGFydCIsImJ1ZmZlciIsInRvQnVmZmVyIiwicHVzaCIsImZpZWxkbmFtZSIsIlN0cmluZyIsImRpc2tOYW1lIiwiZGVzdGluYXRpb24iLCJkaXNrIiwia2V5R2VuZXJhdG9yIiwiZGVmYXVsdEtleUdlbmVyYXRvciIsImtleSIsIm1pbWV0eXBlIiwicHV0U3RyZWFtIiwiZmlsZSIsImNvbnRlbnRUeXBlIiwiZ2V0VXJsIiwic2lnbmVkVXJsIiwiZ2V0U2lnbmVkVXJsIiwic2l6ZSIsImJ5dGVzUmVhZCIsInFzIiwicGFyc2VkIiwicGFyc2UiLCJPYmplY3QiLCJhc3NpZ24iLCJmYXN0aWZ5Q2FzdGVyIiwiWm9kRXJyb3IiLCJodW1hbml6ZVpvZEVycm9yIiwibWVzc2FnZXMiLCJtYXAiLCJpc3N1ZSIsIkJhZFJlcXVlc3RFeGNlcHRpb24iLCJ6b2RFcnJvciIsImFwaUNhY2hlQ29uZmlnIiwiZ2V0QXBpQ2FjaGVDb250cm9sIiwiQXBpUGFyYW1UeXBlIiwiYXJncyIsInBhcmFtZXRlcnMiLCJwYXJhbSIsImlzQ29udGV4dCIsIm5hbWUiLCJpbnZva2VNb2RlbE1ldGhvZCIsInBhdHRlcm4iLCJwYXR0ZXJuUGFydHMiLCJmaWx0ZXIiLCJCb29sZWFuIiwidXJsUGFydHMiLCJpIiwibGVuZ3RoIiwiY2FjaGVDb250cm9sIiwicm91dGVPcHRpb25zIiwiaW52b2tlQXBpRm9yU1NSIiwicGFyYW1zSW5kZXgiLCJtb2RlbCIsIm1ldGhvZE5hbWUiLCJhcHBseSIsImNyZWF0ZVNTRUZhY3RvcnkiLCJfZXZlbnRzIiwic29ja2V0IiwiYmluZCIsImxvY2FsZSIsImRldGVjdExvY2FsZSIsImkxOG4iLCJzdXBwb3J0ZWRMb2NhbGVzIiwiZGVmYXVsdExvY2FsZSIsInNlc3Npb24iLCJnZXRTZXNzaW9uIiwiUHJvbWlzZSIsInJlc29sdmUiLCJjb250ZXh0UHJvdmlkZXIiLCJjcmVhdGVTdG9yZSIsInVzZXIiLCJhY2NlcHRMYW5ndWFnZSIsInN1cHBvcnRlZCIsImxhbmdzIiwibGFuZyIsInRyaW0iLCJ3YXRjaFBhdGgiLCJjaG9raWRhciIsIndhdGNoIiwiaWdub3JlZCIsInN0YXRzIiwiaXNGaWxlIiwicGVyc2lzdGVudCIsImlnbm9yZUluaXRpYWwiLCJvbiIsImV2ZW50IiwiYWJzb2x1dGVQYXRoIiwiaXNDb25maWdUcyIsInJlbGF0aXZlUGF0aCIsInJlcGxhY2UiLCJib2xkIiwiYmx1ZSIsImtpbGwiLCJwaWQiLCJoYW5kbGVGaWxlQ2hhbmdlIiwicnVuU2NyaXB0IiwiZm4iLCJkZXN0cm95IiwiY29tcHJlc3NQbHVnaW4iLCJwbHVnaW5zTW9kdWxlcyIsImNvcnMiLCJmb3JtYm9keSIsIm11bHRpcGFydCIsInNzZSIsInN0YXRpYyIsInJlZ2lzdGVyUGx1Z2luIiwicGx1Z2luTmFtZSIsIm9wdGlvbiIsImVudHJpZXMiLCJjdXN0b20iLCJiYXNlUGF0aCIsIm1lcmdlZEZpZWxkTWFwcGluZ3MiLCJiZXR0ZXJBdXRoIiwiUG9vbCIsImdldERCQ29uZmlnIiwiY29ubmVjdGlvbiIsIlVSTCIsImhvc3QiLCJSZXF1ZXN0IiwidG9TdHJpbmciLCJyZXNwb25zZSIsImZvckVhY2giLCJoZWFkZXIiLCJ0ZXh0Iiwic2V0Q2FjaGVNYW5hZ2VyUmVmIiwiY3JlYXRlVGVzdENhY2hlTWFuYWdlciIsImNyZWF0ZUNhY2hlTWFuYWdlciIsIldvcmtmbG93TWFuYWdlciIsImVuYWJsZVdvcmtlciIsImRlZmF1bHRXb3JrZXJPcHRpb25zIiwiY29uY3VycmVuY3kiLCJjcHVzIiwidXNlUHViU3ViIiwibGlzdGVuRGVsYXkiLCJzZXR1cFdvcmtlciIsIndvcmtlck9wdGlvbnMiLCJwb3J0IiwibGlzdGVuIiwibGlmZWN5Y2xlIiwib25TaHV0ZG93biIsInNodXRkb3duIiwiZXhpdCIsImVyciIsIm9uRXJyb3IiLCJzZXRFcnJvckhhbmRsZXIiLCJ0aGVuIiwic3RhcnRXb3JrZXIiLCJvblN0YXJ0IiwiY2F0Y2giLCJyZWQiLCJub3ciLCJyZWxhdGl2ZSIsInN5bmNGcm9tV2F0Y2hlciIsImZpbmlzaEhNUiIsInJlbmV3Q2hlY2tzdW1zIiwiZW5kVGltZSIsInRvdGFsVGltZSIsImNlbnRlclRleHQiLCJhbGwiLCJtc2ciLCJ3aGl0ZSIsImJsYWNrIiwiYmdHcmVlbiIsIkJhc2VNb2RlbCIsImFsbFNldHRsZWQiLCJkaXNjb25uZWN0IiwiU29uYW11IiwiZXh0ZW5zaW9uIiwidGltZXN0YW1wIiwicmFuZG9tIiwiTWF0aCJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsV0FBV0MsY0FBYyxRQUFRLG1CQUFtQjtBQUM3RCxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsU0FBU0MsaUJBQWlCLFFBQVEsY0FBYztBQUloRCxPQUFPQyxRQUFRLG1CQUFjO0FBRTdCLE9BQU9DLFFBQVFDLFVBQVVDLFVBQVUsUUFBUSxhQUFhO0FBQ3hELE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87QUFHeEIsU0FDRUMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG9CQUFvQixFQUNwQkMsRUFBRSxFQUNGQyxjQUFjLEVBQ2RDLEtBQUssUUFDQSxjQUFLO0FBRVosU0FBU0MsaUJBQWlCLEVBQUVDLFlBQVksUUFBUSxvQ0FBaUM7QUFFakYsU0FBU0MsdUJBQXVCLFFBQVEsMEJBQXVCO0FBSS9ELFNBQVNDLEtBQUssUUFBUSxvQkFBaUI7QUFDdkMsU0FBU0MsWUFBWSxRQUFRLDhCQUEyQjtBQUd4RCxTQUFTQyxZQUFZLFFBQVEsOEJBQTJCO0FBSXhELFNBQVNDLE1BQU0sRUFBRUMsVUFBVSxRQUFRLHVCQUFvQjtBQUt2RCxTQUFTQyxVQUFVLFFBQTRCLGNBQVc7QUFFMUQsTUFBTUM7SUFDR0MsZ0JBQXlCLE1BQU07SUFDL0JDLGFBQXNCLE1BQU07SUFDNUJDLG9CQUVGLElBQUl6QixvQkFBb0I7SUFFdEIwQixhQUFzQjtRQUMzQixNQUFNQyxRQUFRLElBQUks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
@@ -1,5 +1,16 @@
1
+ import { type BetterAuthPluginId } from "./plugins/entity-definitions";
2
+ export interface GenerateBetterAuthEntitiesOptions {
3
+ /**
4
+ * 활성화할 플러그인 ID 목록
5
+ * 예: ["phone-number", "2fa"]
6
+ */
7
+ plugins?: BetterAuthPluginId[];
8
+ }
1
9
  /**
2
10
  * better-auth 엔티티들을 Sonamu에 생성/업데이트
11
+ *
12
+ * @param options 생성 옵션
13
+ * @param options.plugins 활성화할 플러그인 ID 목록
3
14
  */
4
- export declare function generateBetterAuthEntities(): Promise<void>;
15
+ export declare function generateBetterAuthEntities(options?: GenerateBetterAuthEntitiesOptions): Promise<void>;
5
16
  //# sourceMappingURL=auth-generator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../src/auth/auth-generator.ts"],"names":[],"mappings":"AAiEA;;GAEG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC,CA4EhE"}
1
+ {"version":3,"file":"auth-generator.d.ts","sourceRoot":"","sources":["../../src/auth/auth-generator.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAGxB,MAAM,8BAA8B,CAAC;AAwLtC,MAAM,WAAW,iCAAiC;IAChD;;;OAGG;IACH,OAAO,CAAC,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,OAAO,GAAE,iCAAsC,GAC9C,OAAO,CAAC,IAAI,CAAC,CA0Cf"}