sonamu 0.11.11 → 0.11.13

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 (44) hide show
  1. package/dist/code-formatting/index.d.ts +8 -0
  2. package/dist/code-formatting/index.d.ts.map +1 -0
  3. package/dist/code-formatting/index.js +27 -0
  4. package/dist/code-formatting/oxfmt.d.ts +5 -0
  5. package/dist/code-formatting/oxfmt.d.ts.map +1 -0
  6. package/dist/code-formatting/oxfmt.js +61 -0
  7. package/dist/code-formatting/oxlint.d.ts +30 -0
  8. package/dist/code-formatting/oxlint.d.ts.map +1 -0
  9. package/dist/code-formatting/oxlint.js +130 -0
  10. package/dist/cone/cone-generator.js +1 -1
  11. package/dist/dict/sonamu-dictionary.js +3 -3
  12. package/dist/entity/entity.d.ts.map +1 -1
  13. package/dist/entity/entity.js +3 -3
  14. package/dist/migration/code-generation.d.ts.map +1 -1
  15. package/dist/migration/code-generation.js +3 -3
  16. package/dist/syncer/code-generator.d.ts.map +1 -1
  17. package/dist/syncer/code-generator.js +3 -3
  18. package/dist/syncer/file-copy.js +3 -3
  19. package/dist/syncer/filesystem-dependencies.js +1 -1
  20. package/dist/syncer/syncer-actions.d.ts.map +1 -1
  21. package/dist/syncer/syncer-actions.js +3 -3
  22. package/dist/template/implementations/sd.template.js +1 -1
  23. package/dist/tooling/cdd-service.js +1 -1
  24. package/dist/ui-web/assets/index-BMdIyKXS.css +1 -0
  25. package/dist/ui-web/assets/{index-C_RUxOdN.js → index-ClxAM2Lk.js} +37 -37
  26. package/dist/ui-web/index.html +2 -2
  27. package/dist/utils/fs-utils.js +3 -3
  28. package/package.json +3 -3
  29. package/src/code-formatting/__tests__/formatter-batching.test.ts +210 -0
  30. package/src/{utils → code-formatting}/__tests__/formatter-bin.test.ts +2 -2
  31. package/src/code-formatting/index.ts +29 -0
  32. package/src/code-formatting/oxfmt.ts +63 -0
  33. package/src/{utils/formatter.ts → code-formatting/oxlint.ts} +67 -95
  34. package/src/dict/sonamu-dictionary.ts +1 -1
  35. package/src/entity/entity.ts +1 -1
  36. package/src/migration/code-generation.ts +1 -1
  37. package/src/syncer/code-generator.ts +1 -1
  38. package/src/syncer/file-copy.ts +1 -1
  39. package/src/syncer/syncer-actions.ts +1 -1
  40. package/src/utils/fs-utils.ts +1 -1
  41. package/dist/ui-web/assets/index-5i4uZVES.css +0 -1
  42. package/dist/utils/formatter.d.ts +0 -14
  43. package/dist/utils/formatter.d.ts.map +0 -1
  44. package/dist/utils/formatter.js +0 -147
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../_virtual/_rolldown/runtime.js";
2
2
  import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
3
3
  import { assertDefined, init_utils, nonNullable } from "../utils/utils.js";
4
- import { formatCode, init_formatter } from "../utils/formatter.js";
4
+ import { formatCode, init_code_formatting } from "../code-formatting/index.js";
5
5
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
6
6
  import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
7
7
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
@@ -18,9 +18,9 @@ import { writeFile } from "fs/promises";
18
18
  var Entity;
19
19
  var init_entity = __esmMin((() => {
20
20
  init_sonamu();
21
+ init_code_formatting();
21
22
  init_types();
22
23
  init_esm_utils();
23
- init_formatter();
24
24
  init_fs_utils();
25
25
  init_path_utils();
26
26
  init_runtime_value();
@@ -805,4 +805,4 @@ var init_entity = __esmMin((() => {
805
805
  init_entity();
806
806
  export { Entity, init_entity };
807
807
 
808
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHtcbiAgZ2V0RW51bURlZlZhbHVlcyxcbiAgZ2V0U3Vic2V0RmllbGRzLFxuICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNFbnVtUHJvcCxcbiAgaXNIYXNNYW55UmVsYXRpb25Qcm9wLFxuICBpc0ludGVybmFsU3Vic2V0RmllbGQsXG4gIGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5SW5kZXgsXG4gIHR5cGUgRW50aXR5SnNvbixcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIEVudGl0eVN1YnNldFJvdyxcbiAgdHlwZSBSZWxhdGlvblByb3AsXG4gIHR5cGUgU3Vic2V0RmllbGQsXG4gIHR5cGUgU3Vic2V0UXVlcnksXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaW1wb3J0TWVtYmVycyB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IGZvcm1hdENvZGUgfSBmcm9tIFwiLi4vdXRpbHMvZm9ybWF0dGVyXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR56rCAIOuFuOy2nO2VmOuKlCDtg4DsnoUg7J2066aE6rO8IOuqqOuTiCDqsr3roZzrpbwgRW50aXR5TWFuYWdlcuyXkCDrk7HroZ3tlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsaWNpdEFwaVJvb3RQYXRoIC0gU29uYW11IOy0iOq4sO2ZlCDsl4bsnbQg65Ox66Gd7ZWgIOuVjCDsgqzsmqntlaAgQVBJIOujqO2KuCDqsr3roZxcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoZXhwbGljaXRBcGlSb290UGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFRc0M7WUFjZjtnQkFZMkI7Z0JBQ0g7ZUFDTDtpQkFDTztvQkFDSztZQUNLO3FCQUdYO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBS0E7RUFDQTtFQUdBO0VBR0E7RUFDQTtFQUdBO0VBR0EsUUFFSSxDQUFDO0VBQ0wsUUFFSSxDQUFDO0VBQ0wsYUFJSSxDQUFDO0VBQ0wsWUFFSSxDQUFDO0VBQ0wsY0FFSSxDQUFDO0VBRUwsWUFBWSxFQUFFLElBQUksVUFBVSxPQUFPLE9BQU8sTUFBTSxPQUFPLFNBQVMsU0FBUyxTQUFxQjtHQUU1RixLQUFLLEtBQUs7R0FDVixLQUFLLFdBQVc7R0FDaEIsS0FBSyxRQUFRLFNBQVMsS0FBSztHQUMzQixLQUFLLFFBQVEsU0FBUyxXQUFXLFdBQVcsV0FBVyxVQUFVLEVBQUUsQ0FBQztHQUNwRSxLQUFLLE9BQU87R0FHWixJQUFJLE9BQU87SUFDVCxLQUFLLFFBQVEsTUFBTSxLQUFLLFNBQVM7S0FDL0IsSUFBSSxXQUFXLElBQUksR0FDakI7VUFBSSxLQUFLLEdBQUcsU0FBUyxRQUFRLEdBQzNCLEtBQUssS0FBSyxLQUFLLEdBQUcsUUFBUSxVQUFVLEVBQUU7S0FDeEM7S0FFRixPQUFPO0lBQ1QsQ0FBQztJQUNELEtBQUssWUFBWSxPQUFPLFlBQ3RCLE1BQU0sS0FBSyxTQUFTO0tBQ2xCLE9BQU8sQ0FBQyxLQUFLLE1BQU0sSUFBSTtJQUN6QixDQUFDLENBQ0g7SUFHQSxLQUFLLFlBQVksT0FBTyxZQUN0QixNQUFNLFFBQVEsU0FBUyxlQUFlLElBQUksQ0FBQyxDQUFDLENBQUMsS0FB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
808
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxDb2RlUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgbm9ybWFsaXplU3Vic2V0RmllbGQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgUmVsYXRpb25Qcm9wLFxuICB0eXBlIFN1YnNldEZpZWxkLFxuICB0eXBlIFN1YnNldFF1ZXJ5LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3IoeyBpZCwgcGFyZW50SWQsIHRhYmxlLCB0aXRsZSwgY29uZSwgcHJvcHMsIGluZGV4ZXMsIHN1YnNldHMsIGVudW1zIH06IEVudGl0eUpzb24pIHtcbiAgICAvLyBpZFxuICAgIHRoaXMuaWQgPSBpZDtcbiAgICB0aGlzLnBhcmVudElkID0gcGFyZW50SWQ7XG4gICAgdGhpcy50aXRsZSA9IHRpdGxlID8/IHRoaXMuaWQ7XG4gICAgdGhpcy50YWJsZSA9IHRhYmxlID8/IGluZmxlY3Rpb24udW5kZXJzY29yZShpbmZsZWN0aW9uLnBsdXJhbGl6ZShpZCkpO1xuICAgIHRoaXMuY29uZSA9IGNvbmU7XG5cbiAgICAvLyBwcm9wc1xuICAgIGlmIChwcm9wcykge1xuICAgICAgdGhpcy5wcm9wcyA9IHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAoaXNFbnVtUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChwcm9wLmlkLmluY2x1ZGVzKFwiJE1vZGVsXCIpKSB7XG4gICAgICAgICAgICBwcm9wLmlkID0gcHJvcC5pZC5yZXBsYWNlKFwiJE1vZGVsXCIsIGlkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICB9KTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgICByZXR1cm4gW3Byb3AubmFtZSwgcHJvcF07XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgICAgLy8gcmVsYXRpb25zXG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMuZmlsdGVyKChwcm9wKSA9PiBpc1JlbGF0aW9uUHJvcChwcm9wKSkubWFwKChwcm9wKSA9PiBbcHJvcC5uYW1lLCBwcm9wXSksXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzID0gW107XG4gICAgICB0aGlzLnByb3BzRGljdCA9IHt9O1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSB7fTtcbiAgICB9XG5cbiAgICAvLyBpbmRleGVzXG4gICAgdGhpcy5pbmRleGVzID0gaW5kZXhlcyA/PyBbXTtcblxuICAgIC8vIHN1YnNldHM6IFN1YnNldERlZuyXkOyEnCBTdWJzZXRGaWVsZFtd66W8IOy2lOy2nO2VmOyXrCBzdWJzZXRzKOydvOuwmCnsmYAgc3Vic2V0c0ludGVybmFsKGludGVybmFsKeuhnCDrtoTrpqxcbiAgICB0aGlzLnN1YnNldHMgPSB7fTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgc3Vic2V0RGVmXSBvZiBPYmplY3QuZW50cmllcyhzdWJzZXRzID8/IHt9KSkge1xuICAgICAgY29uc3QgZmllbGRzID0gZ2V0U3Vic2V0RmllbGRzKHN1YnNldERlZik7XG4gICAgICB0aGlzLnN1YnNldHNba2V5XSA9IGZpZWxkcy5maWx0ZXIoKGYpID0+ICFpc0ludGVybmFsU3Vic2V0RmllbGQoZikpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG4gICAgICB0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID0gZmllbGRzLmZpbHRlcihpc0ludGVybmFsU3Vic2V0RmllbGQpLm1hcChub3JtYWxpemVTdWJzZXRGaWVsZCk7XG5cbiAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoc3Vic2V0RGVmKSAmJiBcImNvbmVcIiBpbiBzdWJzZXREZWYgJiYgc3Vic2V0RGVmLmNvbmUpIHtcbiAgICAgICAgdGhpcy5zdWJzZXRDb25lc1trZXldID0gc3Vic2V0RGVmLmNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXM6IEVudW1EZWbsl5DshJwgdmFsdWVz7JmAIGNvbmXrpbwg7LaU7Lac7ZWY7JesIOyymOumrFxuICAgIHRoaXMuZW51bUxhYmVscyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGVudW1zID8/IHt9KS5tYXAoKFtrZXksIGVudW1EZWZdKSA9PiB7XG4gICAgICAgIC8vIGNvbmUg7LaU7LacXG4gICAgICAgIGlmIChcInZhbHVlc1wiIGluIGVudW1EZWYgJiYgXCJjb25lXCIgaW4gZW51bURlZiAmJiBlbnVtRGVmLmNvbmUpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICB0aGlzLmVudW1Db25lc1trZXldID0gZW51bURlZi5jb25lIGFzIENvbmU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtrZXksIGdldEVudW1EZWZWYWx1ZXMoZW51bURlZildO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLmVudW1zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKS5tYXAoKFtrZXksIGVudW1MYWJlbF0pID0+IHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIHJldHVybiBba2V5LCB6LmVudW0oT2JqZWN0LmtleXMoZW51bUxhYmVsKSldO1xuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIG5hbWVzXG4gICAgdGhpcy5uYW1lcyA9IHtcbiAgICAgIHBhcmVudEZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUocGFyZW50SWQgPz8gaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgZnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBtb2R1bGU6IGlkLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICog7L+866as7JqpIOyEnOu4jOyFiyDtlYTrk5zrpbwg67CY7ZmY7ZWp64uI64ukIChzdWJzZXRzICsgc3Vic2V0c0ludGVybmFsIO2Vqey5qClcbiAgICovXG4gIGdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBbLi4uKHRoaXMuc3Vic2V0c1tzdWJzZXRLZXldID8/IFtdKSwgLi4uKHRoaXMuc3Vic2V0c0ludGVybmFsW3N1YnNldEtleV0gPz8gW10pXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDso7zslrTsp4Qg7J2066aEKHN1YnNldEtleSnsnZggc3Vic2V07J2EIOyLpOygnOuhnCDqsIDsoLjsmKTripQgUHVyaSDsvZTrk5wg6rWs7ZiE7LK0IHN0cmluZ+ydhCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQdXJpU3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCBzdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIGZyb21cbiAgICBsaW5lcy5wdXNoKGByZXR1cm4gcWJXcmFwcGVyYCk7XG4gICAgbGluZXMucHVzaChgLmZyb20oXCIke3RoaXMudGFibGV9XCIpYCk7XG5cbiAgICAvLyBqb2luXG4gICAgZm9yIChjb25zdCBqb2luIG9mIHN1YnNldFF1ZXJ5LmpvaW5zKSB7XG4gICAgICAvLyBqb2luIOuplOyEnOuTnCDqsrDsoJU6IGlubmVyIOKGkiBqb2luLCBvdXRlciDihpIgbGVmdEpvaW5cbiAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuXG4gICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCByYXcg7IKs7JqpXG4gICAgICAgIGxpbmVzLnB1c2goXG4gICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgcWJXcmFwcGVyLmtuZXgucmF3KFxcYCR7am9pbi5jdXN0b219XFxgKSlgLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGluZXMucHVzaChgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBzZWxlY3QgLSDsnoXssrTsoIEg6rWs7KGw66GcIOyDneyEsVxuICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICBsaW5lcy5wdXNoKGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2ApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKipcbiAgICogKi5lbnRpdHkuanNvbuydmCBzdWJzZXTsl5Ag65Ok7Ja07J6I64qUIO2VhOuTnCDrsLDsl7TsnYQg67Cb7JWE7IScLFxuICAgKiBQdXJp7J2YIFNlbGVjdE9iamVjdCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKlxuICAgKiDsmIg6IFtcInVzZXJzLmlkXCIsIFwicGFyZW50LmlkXCIsIFwicGFyZW50Lm5hbWVcIl1cbiAgICogICDihpIgeyBpZDogXCJ1c2Vycy5pZFwiLCBwYXJlbnQ6IHsgaWQ6IFwicGFyZW50LmlkXCIsIG5hbWU6IFwicGFyZW50Lm5hbWVcIiB9IH1cbiAgICpcbiAgICog7Ja4642U67CU6rCAIOyVhOuLjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VqOyXkCDsnKDsnZjtlZjshLjsmpQuXG4gICAqIOydtOugh+qyjCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VmOyXrCBzZWxlY3Tsl5Ag64SY6rKo7KO866m0IFBhcnNlU2VsZWN0T2JqZWN0IO2DgOyeheydtCBqb2lu65CcIOqwneyytOydmCDtg4DsnoXsnYQg7J6YIOyeoeyVhOykhCDsiJgg7J6I7Iq164uI64ukLlxuICAgKiDspoksIGVuaGFuY2Vy7JeQ7IScIHJvd+ulvCDrsJvslZjsnYQg65WMIGh5ZHJhdGXrkJwg6rCd7LK0IOyekOyytOydmCBudWxsaXR57JmAIOq3uCDslYjsqr0g7ZWE65Oc7J2YIG51bGxpdHnqsIAgZmsgbnVsbGFibGUg7Jes67aA7JeQIOuUsOudvCDsnpgg7LaU66Gg65Cp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZE5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RJdGVtczogc3RyaW5nW10pOiBOZXN0ZWRTZWxlY3Qge1xuICAgIGNvbnN0IHJlc3VsdDogTmVzdGVkU2VsZWN0ID0ge307XG5cbiAgICBmb3IgKGNvbnN0IHNlbGVjdEl0ZW0gb2Ygc2VsZWN0SXRlbXMpIHtcbiAgICAgIC8vIFwidXNlcnMuaWRcIiDrmJDripQgXCJ1c2Vycy5pZCBhcyB1c2VyX19pZFwiIO2Yle2DnCDtjIzsi7FcbiAgICAgIGNvbnN0IG1hdGNoID0gc2VsZWN0SXRlbS5tYXRjaCgvXiguKz8pKD86IGFzICguKykpPyQvKTtcbiAgICAgIGlmICghbWF0Y2gpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCBbLCBjb2x1bW4sIGFsaWFzXSA9IG1hdGNoO1xuICAgICAgY29uc3QgY29sdW1uVmFsdWUgPSBgXCIke2NvbHVtbi50cmltKCl9XCJgO1xuXG4gICAgICBpZiAoIWFsaWFzIHx8ICFhbGlhcy5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIOyXhuqxsOuCmCBfX+ulvCDtj6ztlajtlZjsp4Ag7JWK7Jy866m0IOy1nOyDgeychCDtlYTrk5xcbiAgICAgICAgY29uc3Qga2V5ID0gYWxpYXMgPz8gYXNzZXJ0RGVmaW5lZChjb2x1bW4uc3BsaXQoXCIuXCIpLnBvcCgpKTtcbiAgICAgICAgcmVzdWx0W2tleV0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFsaWFz6rCAIF9f66W8IO2PrO2VqO2VmOuptCDsnoXssrQg6rWs7KGw66GcIOq3uOujue2ZlFxuICAgICAgICBjb25zdCBwYXJ0cyA9IGFsaWFzLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGxldCBjdXJyZW50ID0gcmVzdWx0O1xuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirgg7KCE6rmM7KeAIOykkeyyqSDqsJ3ssrQg7IOd7ISxXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChwYXJ0IGluIGN1cnJlbnQpIHtcbiAgICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKGN1cnJlbnRbcGFydF0pKSB7XG4gICAgICAgICAgICAgIC8vIOyeheugpeydtCBbXCJ1c2VyXCIsIFwidXNlcl9faWRcIl0g6rCZ7J2AIOqyveyasCFcbiAgICAgICAgICAgICAgLy8g7JWg7LSI7JeQIOunkOuPhCDslYgg65CY7KeA66eMIOyViOyghO2VmOqyjCDsmIjsmbjrpbwg642Y7KeR64uI64ukLlxuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENvbmZsaWN0IGRldGVjdGVkIGluIHNlbGVjdCBpdGVtczogcGFyZW50IHBhdGggXCIke3BhcnRzLnNsaWNlKDAsIGkgKyAxKS5qb2luKFwiX19cIil9XCIgaXMgYWxyZWFkeSBzZXQgYXMgYSBmaWVsZCwgY2Fubm90IG5lc3QgXCIke2FsaWFzfVwiIHVuZGVyIGl0LmAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGN1cnJlbnRbcGFydF0gPSB7fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq47JeQIOqwkiDshKTsoJVcbiAgICAgICAgY29uc3QgbGFzdFBhcnQgPSBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXTtcbiAgICAgICAgY3VycmVudFtsYXN0UGFydF0gPSBjb2x1bW5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHJlc3VsdCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTT04uc3RyaW5naWZ57JmAIOycoOyCrO2VnCDsnbzsnYQg7ZWp64uI64ukLlxuICAgKiDri6Trp4wg7KO87Ja07KeEIOqwneyytOulvCBKU09O7J20IOyVhOuLjCBUeXBlU2NyaXB0IOqwneyytCDrpqzthLDrn7Qg7Iqk7Yq466eB7Jy866GcIOunjOuTpOyWtOykjeuLiOuLpC5cbiAgICoga2V57JeQIOuUsOyYtO2RnOqwgCDsl4bslrTsmpQuXG4gICAqIOy2nOugpSDsmIjsi5w6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICoge1xuICAgKiAgIGlkOiBcInVzZXJzLmlkXCIsXG4gICAqICAgcGFyZW50OiB7XG4gICAqICAgICBpZDogXCJwYXJlbnQuaWRcIixcbiAgICogICAgIG5hbWU6IFwicGFyZW50Lm5hbWVcIixcbiAgICogICB9LFxuICAgKiB9XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gb2JqIOuzgO2ZmO2VoCDqsJ3ssrRcbiAgICogQHBhcmFtIGluZGVudCDrk6Tsl6zsk7DquLAg66CI67KoXG4gICAqIEBwYXJhbSB3aXRoQnJhY2VzIHRydWXrqbQg7KSR6rSE7Zi4IO2PrO2VqCwgZmFsc2XrqbQg64K07Jqp66eMIOuwmO2ZmFxuICAgKi9cbiAgcHJpdmF0ZSBzdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QoXG4gICAgb2JqOiBOZXN0ZWRTZWxlY3QsXG4gICAgaW5kZW50OiBudW1iZXIgPSAwLFxuICAgIHdpdGhCcmFjZXM6IGJvb2xlYW4gPSB0cnVlLFxuICApOiBzdHJpbmcge1xuICAgIGNvbnN0IHNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50KTtcbiAgICBjb25zdCBpbm5lclNwYWNlcyA9IFwiICBcIi5yZXBlYXQoaW5kZW50ICsgMSk7XG5cbiAgICBjb25zdCBlbnRyaWVzID0gT2JqZWN0LmVudHJpZXMob2JqKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHJldHVybiB3aXRoQnJhY2VzID8gXCJ7fVwiIDogXCJcIjtcblxuICAgIGNvbnN0IGxpbmVzID0gZW50cmllcy5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgIC8vIOy7rOufvCDqsr3roZwgKOydtOuvuCDrlLDsmLTtkZwg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3ZhbHVlfSxgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8g7KSR7LKpIOqwneyytCAo7ZWt7IOBIOykkeq0hO2YuCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3QodmFsdWUsIGluZGVudCArIDEsIHRydWUpfSxgO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHdpdGhCcmFjZXMpIHtcbiAgICAgIHJldHVybiBge1xcbiR7bGluZXMuam9pbihcIlxcblwiKX1cXG4ke3NwYWNlc319YDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8g7KSR6rSE7Zi4IOyXhuydtCDrgrTsmqnrp4wg67CY7ZmYICjslZ7rkqQg6rCc7ZaJIOygnOyZuClcbiAgICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICAgIH1cbiAgfVxuXG4gIGdldFB1cmlMb2FkZXJRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHsgbG9hZGVycyB9ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtgW2BdO1xuXG4gICAgLy8g7J6s6reA7KCB7Jy866GcIGxvYWRlciDsg53shLHtlZjripQg7Zes7Y28IO2VqOyImFxuICAgIGNvbnN0IGdlbmVyYXRlTG9hZGVyQ29kZSA9IChuZXN0ZWRMb2FkZXJzOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBsb2FkZXJMaW5lczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCBsb2FkZXIgb2YgbmVzdGVkTG9hZGVycykge1xuICAgICAgICBjb25zdCB7IHRvVGFibGUsIHRvQ29sLCB0aHJvdWdoLCBmcm9tVGFibGUgfSA9IGxvYWRlci5tYW55Sm9pbjtcblxuICAgICAgICAvLyBmcm9tVGFibGXsnZggRW50aXR566W8IOqwgOyguOyZgOyEnCBQSyDtg4DsnoUg7ZmV7J24XG4gICAgICAgIGNvbnN0IGZyb21FbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldEJ5VGFibGUoZnJvbVRhYmxlKTtcbiAgICAgICAgY29uc3QgZnJvbUlkc1R5cGUgPSBmcm9tRW50aXR5LmdldFBrQXJyYXlUeXBlKCk7XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICBcIntcIixcbiAgICAgICAgICBgYXM6IFwiJHtsb2FkZXIuYXN9XCIsYCxcbiAgICAgICAgICBgcmVmSWQ6IFwiJHtsb2FkZXIubWFueUpvaW4uaWRGaWVsZH1cIixgLFxuICAgICAgICAgIGBxYjogKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LCBmcm9tSWRzOiBudW1iZXJbXSB8IHN0cmluZ1tdKSA9PiB7YCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAodGhyb3VnaCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gSGFzTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3RvVGFibGV9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE1hbnlUb01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgXCJyZXR1cm4gcWJXcmFwcGVyXCIsXG4gICAgICAgICAgICBgLmZyb20oXCIke3Rocm91Z2gudGFibGV9XCIpYCxcbiAgICAgICAgICAgIGAuam9pbihcIiR7dG9UYWJsZX1cIiwgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC50b0NvbH1cIiwgXCIke3RvVGFibGV9LiR7dG9Db2x9XCIpYCxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgbG9hZGVyLm9uZUpvaW5zLmZvckVhY2goKGpvaW46IFN1YnNldFF1ZXJ5W1wiam9pbnNcIl1bbnVtYmVyXSkgPT4ge1xuICAgICAgICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG4gICAgICAgICAgICBpZiAoXCJjdXN0b21cIiBpbiBqb2luKSB7XG4gICAgICAgICAgICAgIC8vIGN1c3RvbSBqb2luIGNsYXVzZeuKlCBjYWxsYmFjayDtmJXtg5zsnZggb24g66mU7ISc65Oc66GcIOyymOumrO2VqeuLiOuLpC5cbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCAoaikgPT4ge2AsXG4gICAgICAgICAgICAgICAgYGoub24oUHVyaS5yYXdTdHJpbmcoXCIke2pvaW4uY3VzdG9tfVwiKSk7YCxcbiAgICAgICAgICAgICAgICBcIn0pXCIsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWAsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyDsnoXssrTsoIEgc2VsZWN0IOq1rOyhsCDsg53shLEgKHJlZklkIO2PrO2VqClcbiAgICAgICAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KGxvYWRlci5zZWxlY3QpO1xuICAgICAgICAgIHNlbGVjdE9iai5yZWZJZCA9IGBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKGB9LGApO1xuXG4gICAgICAgIC8vIOykkeyyqSBsb2FkZXJzIOyymOumrFxuICAgICAgICBpZiAobG9hZGVyLmxvYWRlcnMgJiYgbG9hZGVyLmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJsb2FkZXJzOiBbXCIsIC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXIubG9hZGVycyksIFwiXSxcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwifSxcIik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBsb2FkZXJMaW5lcztcbiAgICB9O1xuXG4gICAgbGluZXMucHVzaCguLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVycykpO1xuICAgIGxpbmVzLnB1c2goYF1gKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLypcbiAgICBzdWJzZXQgU0VMRUNUL0pPSU4vTE9BREVSIOqysOqzvCDrpqzthLRcbiAgKi9cbiAgZ2V0U3Vic2V0UXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBTdWJzZXRRdWVyeSB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBTdWJzZXRRdWVyeSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAqL1xuICByZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgZmllbGRzOiBzdHJpbmdbXSxcbiAgICBpc0FscmVhZHlPdXRlckpvaW5lZDogYm9vbGVhbiA9IGZhbHNlLFxuICApOiBTdWJzZXRRdWVyeSB7XG4gICAgLy8gcHJlZml4IOy5mO2ZmCAocHJlZml464qUIFRvT25lUmVsYXRpb27snbQg67O17IiY66GcIOu2meydgCDqsr3smrAg66qo65GQIF9f66GcIOuzgOqyveuQqClcbiAgICBwcmVmaXggPSBwcmVmaXgucmVwbGFjZSgvXFwuL2csIFwiX19cIik7XG5cbiAgICAvLyDshJzruIzshYvsnYQgMeuOgeyKpOunjCDrtoTrpqztlZjsl6wg6re466O57ZWRXG4gICAgY29uc3Qgc3Vic2V0R3JvdXAgPSBncm91cChmaWVsZHMsIChmaWVsZCkgPT4ge1xuICAgICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICBjb25zdCBbcmVsXSA9IGZpZWxkLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgcmV0dXJuIHJlbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmtleXMoc3Vic2V0R3JvdXApLnJlZHVjZShcbiAgICAgIChyLCBncm91cEtleSkgPT4ge1xuICAgICAgICBjb25zdCBncm91cGVkRmllbGRzID0gc3Vic2V0R3JvdXBbZ3JvdXBLZXldO1xuICAgICAgICBhc3NlcnQoZ3JvdXBlZEZpZWxkcyAhPT0gdW5kZWZpbmVkLCBcImZpZWxkcyBpcyB1bmRlZmluZWRcIik7XG5cbiAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lCDtlYTrk5zshYvsnYAgc2VsZWN0LCB2aXJ0dWFs7JeQIOy2lOqwgO2VmOqzoCDrpqzthLRcbiAgICAgICAgaWYgKGdyb3VwS2V5ID09PSBcIlwiKSB7XG4gICAgICAgICAgY29uc3QgcmVhbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT4gIWlzVmlydHVhbFByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSk7XG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwiY29kZVwiICjrmJDripQgdW5kZWZpbmVkKeyduCB2aXJ0dWFsIHByb3Drp4wgci52aXJ0dWFs7JeQIOy2lOqwgFxuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcInF1ZXJ5XCLsnbgg6rK97JqwIOyCrOyaqeyekOqwgCBhcHBlbmRTZWxlY3TroZwg7KeB7KCRIOy2lOqwgO2VmOuvgOuhnCDsoJzsmbhcbiAgICAgICAgICBjb25zdCB2aXJ0dWFsQ29kZUZpZWxkcyA9IGdyb3VwZWRGaWVsZHMuZmlsdGVyKChmaWVsZCkgPT5cbiAgICAgICAgICAgIGlzVmlydHVhbENvZGVQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIO2YhOyerCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IHRoaXMuZ2V0RnVsbEZpZWxkTmFtZShmaWVsZCkpKTtcbiAgICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQodmlydHVhbENvZGVGaWVsZHMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyDrhJjslrTsmKgg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoXG4gICAgICAgICAgICAgIHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fS4ke2ZpZWxkfSBhcyAke3ByZWZpeH1fXyR7ZmllbGR9YCksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiByO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVsYXRpb24gPSB0aGlzLnJlbGF0aW9uc1tncm91cEtleV07XG4gICAgICAgIGlmIChyZWxhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsobTsnqztlZjsp4Ag7JWK64qUIHJlbGF0aW9uIOywuOyhsCAke2dyb3VwS2V5fWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0aW9uLndpdGgpO1xuXG4gICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9uOiBKT0lOIOycvOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG5cbiAgICAgICAgICAvLyAtT25lIFJlbGF0aW9u7JeQ7IScIGlkIO2VhOuTnOunjCDssLjsobDtlZjripQg6rK97JqwIOumtOugiOydtOyFmCDrhJjquLDsp4Ag7JWK6rOgIOumrO2EtFxuICAgICAgICAgIGlmIChyZWxGaWVsZHMubGVuZ3RoID09PSAxICYmIHJlbEZpZWxkc1swXSA9PT0gXCJpZFwiKSB7XG4gICAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3RoaXMudGFibGV9LiR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHtwcmVmaXh9LiR7Z3JvdXBLZXl9X2lkIGFzICR7cHJlZml4fV9fJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIGlubmVyT3JPdXRlclxuICAgICAgICAgIGNvbnN0IGlubmVyT3JPdXRlciA9ICgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNBbHJlYWR5T3V0ZXJKb2luZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uICYmICEocmVsYXRpb24ubnVsbGFibGUgPz8gZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24ubnVsbGFibGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSgpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcbiAgICAgICAgICAgIGAke3ByZWZpeCAhPT0gXCJcIiA/IGAke3ByZWZpeH0uYCA6IFwiXCJ9JHtncm91cEtleX1gLFxuICAgICAgICAgICAgcmVsRmllbGRzLFxuICAgICAgICAgICAgaW5uZXJPck91dGVyID09PSBcIm91dGVyXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChyZWxTdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgICAgICAgIHIudmlydHVhbCA9IHIudmlydHVhbC5jb25jYXQocmVsU3Vic2V0UXVlcnkudmlydHVhbCk7XG5cbiAgICAgICAgICBjb25zdCBqb2luQXMgPSBwcmVmaXggPT09IFwiXCIgPyBncm91cEtleSA6IGAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9YDtcbiAgICAgICAgICBjb25zdCBmcm9tVGFibGUgPSBwcmVmaXggPT09IFwiXCIgPyB0aGlzLnRhYmxlIDogcHJlZml4O1xuXG4gICAgICAgICAgbGV0IGpvaW5DbGF1c2U6XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBmcm9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgdG86IHN0cmluZztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgY3VzdG9tOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UpIHtcbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGN1c3RvbTogcmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmcm9tOiBzdHJpbmcsIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4pIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LmlkYDtcbiAgICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uJHtpbmZsZWN0aW9uLnVuZGVyc2NvcmUodGhpcy5uYW1lcy5mcy5yZXBsYWNlKC8tL2csIFwiX1wiKSl9X2lkYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBmcm9tLFxuICAgICAgICAgICAgICB0byxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBqb2luQXMsXG4gICAgICAgICAgICBqb2luOiBpbm5lck9yT3V0ZXIsXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgLi4uam9pbkNsYXVzZSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEJlbG9uZ3NUb09uZSDrsJHsl5AgSGFzTWFueeqwgCDrtpnsnYAg6rK97JqwXG4gICAgICAgICAgaWYgKHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgY29udmVydGVkTG9hZGVycyA9IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMubWFwKChsb2FkZXIpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgbmV3QXMgPSBbZ3JvdXBLZXksIGxvYWRlci5hc10uam9pbihcIl9fXCIpO1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFzOiBuZXdBcyxcbiAgICAgICAgICAgICAgICB0YWJsZTogbG9hZGVyLnRhYmxlLFxuICAgICAgICAgICAgICAgIG1hbnlKb2luOiBsb2FkZXIubWFueUpvaW4sXG4gICAgICAgICAgICAgICAgb25lSm9pbnM6IGxvYWRlci5vbmVKb2lucyxcbiAgICAgICAgICAgICAgICBzZWxlY3Q6IGxvYWRlci5zZWxlY3QsXG4gICAgICAgICAgICAgICAgbG9hZGVyczogbG9hZGVyLmxvYWRlcnMsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgci5sb2FkZXJzID0gWy4uLnIubG9hZGVycywgLi4uY29udmVydGVkTG9hZGVyc107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5qb2lucyA9IHIuam9pbnMuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LmpvaW5zKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAvLyAtTWFueSBSZWxhdGlvbjogTG9hZGVyIOuhnCDsspjrpqxcbiAgICAgICAgICBjb25zdCByZWxGaWVsZHMgPSBncm91cGVkRmllbGRzLm1hcCgoZmllbGQpID0+IGZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgxKS5qb2luKFwiLlwiKSk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHJlbEZpZWxkcyk7XG5cbiAgICAgICAgICBsZXQgbWFueUpvaW46IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXVtudW1iZXJdW1wibWFueUpvaW5cIl07XG4gICAgICAgICAgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGZyb21Db2wgPSByZWxhdGlvbj8uZnJvbUNvbHVtbiA/PyBcImlkXCI7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgJHtmcm9tQ29sfWAgOiBgJHtwcmVmaXh9X18ke2Zyb21Db2x9YCxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogcmVsYXRpb24uam9pbkNvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIGlmIChpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBtYW55Sm9pbiA9IHtcbiAgICAgICAgICAgICAgZnJvbVRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgICAgICAgICBmcm9tQ29sOiBcImlkXCIsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGBpZGAgOiBgJHtwcmVmaXh9X19pZGAsXG4gICAgICAgICAgICAgIHRocm91Z2g6IHtcbiAgICAgICAgICAgICAgICB0YWJsZTogcmVsYXRpb24uam9pblRhYmxlLFxuICAgICAgICAgICAgICAgIGZyb21Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUodGhpcy50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgICB0b0NvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZShyZWxFbnRpdHkudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IFwiaWRcIixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIubG9hZGVycy5wdXNoKHtcbiAgICAgICAgICAgIGFzOiBncm91cEtleSxcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICBtYW55Sm9pbixcbiAgICAgICAgICAgIG9uZUpvaW5zOiByZWxTdWJzZXRRdWVyeS5qb2lucyxcbiAgICAgICAgICAgIHNlbGVjdDogcmVsU3Vic2V0UXVlcnkuc2VsZWN0LFxuICAgICAgICAgICAgbG9hZGVyczogcmVsU3Vic2V0UXVlcnkubG9hZGVycyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByO1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge1xuICAgICAgICBzZWxlY3Q6IFtdLFxuICAgICAgICB2aXJ0dWFsOiBbXSxcbiAgICAgICAgam9pbnM6IFtdLFxuICAgICAgICBsb2FkZXJzOiBbXSxcbiAgICAgIH0gYXMgU3Vic2V0UXVlcnksXG4gICAgKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICBGaWVsZEV4cHJbXSDsnYQgRW50aXR5UHJvcE5vZGVbXSDroZwg67OA7ZmYXG4gICovXG4gIGZpZWxkRXhwcnNUb1Byb3BOb2RlcyhmaWVsZEV4cHJzOiBzdHJpbmdbXSwgZW50aXR5OiBFbnRpdHkgPSB0aGlzKTogRW50aXR5UHJvcE5vZGVbXSB7XG4gICAgY29uc3QgZ3JvdXBzID0gZmllbGRFeHBycy5yZWR1Y2UoXG4gICAgICAocmVzdWx0LCBmaWVsZEV4cHIpID0+IHtcbiAgICAgICAgbGV0IGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBlbHNlRXhwcjogc3RyaW5nW107XG4gICAgICAgIGlmIChmaWVsZEV4cHIuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgW2tleSwgLi4uZWxzZUV4cHJdID0gZmllbGRFeHByLnNwbGl0KFwiLlwiKTtcbiAgICAgICAgICB2YWx1ZSA9IGVsc2VFeHByLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGtleSA9IFwiXCI7XG4gICAgICAgICAgdmFsdWUgPSBmaWVsZEV4cHI7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0W2tleV0gPSAocmVzdWx0W2tleV0gPz8gW10pLmNvbmNhdCh2YWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHt9IGFzIHtcbiAgICAgICAgW2s6IHN0cmluZ106IHN0cmluZ1tdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKGdyb3VwcykuZmxhdE1hcDxFbnRpdHlQcm9wTm9kZSwgRW50aXR5UHJvcE5vZGVbXT4oKGtleSkgPT4ge1xuICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkRXhwcnMgPSBncm91cHNba2V5XTtcblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICBpZiAoa2V5ID09PSBcIlwiKSB7XG4gICAgICAgIHJldHVybiBncm91cGVkRmllbGRFeHBycy5tYXAoKHByb3BOYW1lKSA9PiB7XG4gICAgICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgICAgICBpZiAocHJvcCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGAke2VudGl0eS5pZH0gLS0g7J6Y66q765CcIEZpZWxkRXhwciAnJHtwcm9wTmFtZX0nICjsgqzsmqkg6rCA64ql7ZWcIHByb3BzOiAke2VudGl0eS5wcm9wcy5tYXAoKHApID0+IHAubmFtZSkuam9pbihcIiwgXCIpfSlgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wLFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyByZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgY29uc3QgcHJvcCA9IGVudGl0eS5wcm9wc0RpY3Rba2V5XTtcbiAgICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwgRmllbGRFeHByICR7a2V5fS4ke2dyb3VwZWRGaWVsZEV4cHJzWzBdfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcblxuICAgICAgLy8gcmVsYXRpb24gLU9uZSDsl5AgaWQg7ZWE65OcIO2VmOuCmOyduCDqsr3smrBcbiAgICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBncm91cGVkRmllbGRFeHBycy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICAoZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWRcIiB8fCBncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZD9cIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gaWQg7ZWY64KY66eMIOyeiOuKlOyngCDssrTtgaztlbTshJwsIO2VmOuCmOunjCDsnojsnLzrqbQg7IOB7JyEIHByb3DsnLzroZwgaWTrpbwg66as7YS0XG4gICAgICAgICAgY29uc3QgaWRQcm9wID0gcmVsRW50aXR5LnByb3BzRGljdC5pZDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3A6IHtcbiAgICAgICAgICAgICAgLi4uaWRQcm9wLFxuICAgICAgICAgICAgICBuYW1lOiBgJHtrZXl9X2lkYCxcbiAgICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gLU9uZSDqt7jsmbjsnZgg6rK97JqwIG9iamVjdOuhnCDrpqzthLRcbiAgICAgIC8vIC1NYW557J2YIOqyveyasCBhcnJheeuhnCDrpqzthLRcbiAgICAgIC8vIFJlY3Vyc2l2ZSDroZwg646B7IqkIOyymOumrFxuICAgICAgY29uc3QgY2hpbGRyZW4gPSB0aGlzLmZpZWxkRXhwcnNUb1Byb3BOb2Rlcyhncm91cGVkRmllbGRFeHBycywgcmVsRW50aXR5KTtcbiAgICAgIGNvbnN0IG5vZGVUeXBlID1cbiAgICAgICAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKVxuICAgICAgICAgID8gKFwib2JqZWN0XCIgYXMgY29uc3QpXG4gICAgICAgICAgOiAoXCJhcnJheVwiIGFzIGNvbnN0KTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbm9kZVR5cGUsXG4gICAgICAgIHByb3AsXG4gICAgICAgIGNoaWxkcmVuLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEZpZWxkRXhwcnMocHJlZml4ID0gXCJcIiwgbWF4RGVwdGg6IG51bWJlciA9IDMsIGZyb21zOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAuZmxhdE1hcCgocHJvcCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wTmFtZSA9IFtwcmVmaXgsIHByb3AubmFtZV0uZmlsdGVyKCh2KSA9PiB2ICE9PSBcIlwiKS5qb2luKFwiLlwiKTtcbiAgICAgICAgaWYgKHByb3BOYW1lID09PSBwcmVmaXgpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAobWF4RGVwdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGZyb21zLmluY2x1ZGVzKHByb3Aud2l0aCkpIHtcbiAgICAgICAgICAgIC8vIOyXreuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAg7KCc7Jm4XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8g7KCV67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCByZWN1cnNpdmUg7L2cXG4gICAgICAgICAgY29uc3QgcmVsTWQgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICAgIHJldHVybiByZWxNZC5nZXRGaWVsZEV4cHJzKHByb3BOYW1lLCBtYXhEZXB0aCAtIDEsIFsuLi5mcm9tcywgdGhpcy5pZF0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wTmFtZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKChmKSA9PiBmICE9PSBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxhdGlvbiBwcm9w7J20IO2YhOyerCDthYzsnbTruJTsl5AgRksg7Lus65+87J2EIOyDneyEse2VmOuKlOyngCDtmZXsnbhcbiAgICooQmVsb25nc1RvT25lIOuYkOuKlCBPbmVUb09uZShoYXNKb2luQ29sdW1uPXRydWUp7J24IOqyveyasCBGSyDsg53shLEpXG4gICAqL1xuICBwcml2YXRlIGhhc0ZvcmVpZ25LZXkocHJvcDogUmVsYXRpb25Qcm9wKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHByb3AucmVsYXRpb25UeXBlID09PSBcIkJlbG9uZ3NUb09uZVwiIHx8XG4gICAgICAocHJvcC5yZWxhdGlvblR5cGUgPT09IFwiT25lVG9PbmVcIiAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKTtcbiAgfVxuXG4gIGdldFRhYmxlQ29sdW1ucygpOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH1bXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsIHR5cGU6IFwiaW50X3Vuc2lnbmVkXCIgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IG5hbWU6IHByb3AubmFtZSwgdHlwZTogcHJvcC50eXBlIH07XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR57JeQIOygleydmOuQnCDrqqjrk6AgdmVjdG9yIO2DgOyehSDsu6zrn7wg67CY7ZmYXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW5zKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwidmVjdG9yXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSB2ZWN0b3Ig7Lus65+8IOuwmO2ZmFxuICAgKiBAcGFyYW0gY29sdW1uTmFtZSAtIOy7rOufvOuqhSAo7IOd6561IOyLnCDssqsg67KI7Ke4IHZlY3RvciDsu6zrn7wpXG4gICAqL1xuICBnZXRWZWN0b3JDb2x1bW4oY29sdW1uTmFtZT86IHN0cmluZyk6IEVudGl0eVByb3AgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHZlY3RvclByb3BzID0gdGhpcy5nZXRWZWN0b3JDb2x1bW5zKCk7XG4gICAgaWYgKGNvbHVtbk5hbWUpIHtcbiAgICAgIHJldHVybiB2ZWN0b3JQcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGNvbHVtbk5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmVjdG9yUHJvcHNbMF07XG4gIH1cblxuICAvKipcbiAgICog7ZWE7YSw66eBIOqwgOuKpe2VnCBwcm9wcyDrsJjtmZhcbiAgICpcbiAgICogLSDsnbzrsJggcHJvcFxuICAgKiAtIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbiAoQmVsb25nc1RvT25lLCBPbmVUb09uZSB3aXRoIGhhc0pvaW5Db2x1bW4pXG4gICAqICAg4oaSIHtuYW1lfV9pZCDtmJXtg5zsnZgg6rCA7IOBIGludGVnZXIgcHJvcOycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZpbHRlcmFibGVQcm9wcygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZsYXRNYXAoKHByb3ApOiBFbnRpdHlQcm9wIHwgRW50aXR5UHJvcFtdID0+IHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcCDsoJzsmbhcbiAgICAgIGlmIChpc1ZpcnR1YWxQcm9wKHByb3ApKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAvLyBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb27rp4wg7Y+s7ZWoXG4gICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbmFtZTogYCR7cHJvcC5uYW1lfV9pZGAsXG4gICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIixcbiAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgIH0gYXMgRW50aXR5UHJvcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgcmV0dXJuIHByb3A7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW50aXR56rCAIOuFuOy2nO2VmOuKlCDtg4DsnoUg7J2066aE6rO8IOuqqOuTiCDqsr3roZzrpbwgRW50aXR5TWFuYWdlcuyXkCDrk7HroZ3tlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBleHBsaWNpdEFwaVJvb3RQYXRoIC0gU29uYW11IOy0iOq4sO2ZlCDsl4bsnbQg65Ox66Gd7ZWgIOuVjCDsgqzsmqntlaAgQVBJIOujqO2KuCDqsr3roZxcbiAgICovXG4gIGFzeW5jIHJlZ2lzdGVyTW9kdWxlUGF0aHMoZXhwbGljaXRBcGlSb290UGF0aD86IHN0cmluZykge1xuICAgIGNvbnN0IGJhc2VQYXRoID0gYCR7dGhpcy5uYW1lcy5wYXJlbnRGc31gO1xuXG4gICAgLy8gYmFzZS1zY2hlbWVcbiAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1CYXNlU2NoZW1hYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcblxuICAgIC8vIHN1YnNldFxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpLmxlbmd0aCA+IDApIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldEtleWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRNYXBwaW5nYCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKFxuICAgICAgICAgIGAke3RoaXMuaWR9U3Vic2V0JHtzdWJzZXRLZXkudG9VcHBlckNhc2UoKX1gLFxuICAgICAgICAgIGBzb25hbXUuZ2VuZXJhdGVkYCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc1xuICAgIGZvciAoY29uc3QgZW51bUlkIG9mIE9iamVjdC5rZXlzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChlbnVtSWQsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgfVxuXG4gICAgLy8gdHlwZXNcbiAgICBjb25zdCB0eXBlc01vZHVsZVBhdGggPSBgJHtiYXNlUGF0aH0vJHt0aGlzLm5hbWVzLnBhcmVudEZzfS50eXBlc2A7XG4gICAgY29uc3QgdHlwZXNGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgIGV4cGxpY2l0QXBpUm9vdFBhdGggPz8gU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgcnVudGltZVBhdGgoYGRpc3QvYXBwbGljYXRpb24vJHt0eXBlc01vZHVsZVBhdGh9LmpzYCksXG4gICAgKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModHlwZXNGaWxlUGF0aCkpIHtcbiAgICAgIGNvbnN0IGltcG9ydGVkTWVtYmVycyA9IGF3YWl0IGltcG9ydE1lbWJlcnM8ei5ab2RUeXBlQW55Pih0eXBlc0ZpbGVQYXRoKTtcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgdGhpcy50eXBlcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgaW1wb3J0ZWRNZW1iZXJzLm1hcCgoeyBuYW1lLCB2YWx1ZSB9KSA9PiB7XG4gICAgICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKG5hbWUsIHR5cGVzTW9kdWxlUGF0aCk7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCB2YWx1ZV07XG4gICAgICAgIH0pLFxuICAgICAgKSBhcyB7IFtuYW1lOiBzdHJpbmddOiB6LlpvZFR5cGVBbnkgfTtcbiAgICB9XG4gIH1cblxuICByZWdpc3RlclRhYmxlU3BlY3MoKTogdm9pZCB7XG4gICAgLy8g7KGw7J24IO2FjOydtOu4lCDsnbjrjbHsiqQg7KCc7Jm4ICjsu6zrn7wg7J2066aE7JeQICcuJ+ydtCDtj6ztlajrkJwg6rK97JqwKVxuICAgIGNvbnN0IHVuaXF1ZUluZGV4ZXMgPSB0aGlzLmluZGV4ZXNcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LnR5cGUgPT09IFwidW5pcXVlXCIpXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC5jb2x1bW5zLmV2ZXJ5KChjb2wpID0+ICFjb2wubmFtZS5pbmNsdWRlcyhcIi5cIikpKTtcblxuICAgIEVudGl0eU1hbmFnZXIuc2V0VGFibGVTcGVjKHtcbiAgICAgIG5hbWU6IHRoaXMudGFibGUsXG4gICAgICB1bmlxdWVJbmRleGVzLFxuICAgICAganNvbkNvbHVtbnM6IHRoaXMucHJvcHMuZmlsdGVyKChwKSA9PiBwLnR5cGUgPT09IFwianNvblwiKS5tYXAoKHApID0+IHAubmFtZSksXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKTogRW50aXR5SnNvbiB7XG4gICAgLy8gc3Vic2V0c+yZgCBzdWJzZXRzSW50ZXJuYWzsnYQgU3Vic2V0RGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IHN1YnNldHM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuU3Vic2V0RGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICBjb25zdCBub3JtYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSB0aGlzLnN1YnNldHNba2V5XTtcbiAgICAgIGNvbnN0IGludGVybmFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gKHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pLm1hcCgoZmllbGQpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IFsuLi5ub3JtYWxGaWVsZHMsIC4uLmludGVybmFsRmllbGRzXTtcblxuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCDrsLDsl7Qg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5zdWJzZXRDb25lc1trZXldKSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IHtcbiAgICAgICAgICBmaWVsZHMsXG4gICAgICAgICAgY29uZTogdGhpcy5zdWJzZXRDb25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0gZmllbGRzO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1z66W8IEVudW1EZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3QgZW51bXM6IHsgW2tleTogc3RyaW5nXTogaW1wb3J0KFwiLi4vdHlwZXMvdHlwZXNcIikuRW51bURlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykpIHtcbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQgUmVjb3JkIO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuZW51bUNvbmVzW2tleV0pIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHtcbiAgICAgICAgICB2YWx1ZXMsXG4gICAgICAgICAgY29uZTogdGhpcy5lbnVtQ29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgcGFyZW50SWQ6IHRoaXMucGFyZW50SWQsXG4gICAgICB0YWJsZTogdGhpcy50YWJsZSxcbiAgICAgIHRpdGxlOiB0aGlzLnRpdGxlLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7YUFRc0M7c0JBQ1M7WUFjeEI7Z0JBWTJCO2VBQ1I7aUJBQ087b0JBQ0s7WUFDSztxQkFHWDtDQUVuQyxTQUFiLE1BQW9CO0VBQ2xCO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUtBO0VBQ0E7RUFHQTtFQUdBO0VBQ0E7RUFHQTtFQUdBLFFBRUksQ0FBQztFQUNMLFFBRUksQ0FBQztFQUNMLGFBSUksQ0FBQztFQUNMLFlBRUksQ0FBQztFQUNMLGNBRUksQ0FBQztFQUVMLFlBQVksRUFBRSxJQUFJLFVBQVUsT0FBTyxPQUFPLE1BQU0sT0FBTyxTQUFTLFNBQVMsU0FBcUI7R0FFNUYsS0FBSyxLQUFLO0dBQ1YsS0FBSyxXQUFXO0dBQ2hCLEtBQUssUUFBUSxTQUFTLEtBQUs7R0FDM0IsS0FBSyxRQUFRLFNBQVMsV0FBVyxXQUFXLFdBQVcsVUFBVSxFQUFFLENBQUM7R0FDcEUsS0FBSyxPQUFPO0dBR1osSUFBSSxPQUFPO0lBQ1QsS0FBSyxRQUFRLE1BQU0sS0FBSyxTQUFTO0tBQy9CLElBQUksV0FBVyxJQUFJLEdBQ2pCO1VBQUksS0FBSyxHQUFHLFNBQVMsUUFBUSxHQUMzQixLQUFLLEtBQUssS0FBSyxHQUFHLFFBQVEsVUFBVSxFQUFFO0tBQ3hDO0tBRUYsT0FBTztJQUNULENBQUM7SUFDRCxLQUFLLFlBQVksT0FBTyxZQUN0QixNQUFNLEtBQUssU0FBUztLQUNsQixPQUFPLENBQUMsS0FBSyxNQUFNLElBQUk7SUFDekIsQ0FBQyxDQUNIO0lBR0EsS0FBSyxZQUFZLE9BQU8sWUFDdEIsTUFBTSxRQUFRLFNBQVMsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtB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
@@ -1 +1 @@
1
- {"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AA2nDxB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAGtB,cAAc,EAAE;UACf,cAAc,EAAE;EA8BxF;AAWD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAE/E;AAiKD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS7F;AAiBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0E7B"}
1
+ {"version":3,"file":"code-generation.d.ts","sourceRoot":"","sources":["../../src/migration/code-generation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAMjC,OAAO,EAEL,KAAK,gBAAgB,EAGrB,KAAK,cAAc,EACnB,KAAK,YAAY,EAClB,MAAM,gBAAgB,CAAC;AA0nDxB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;SAGtB,cAAc,EAAE;UACf,cAAc,EAAE;EA8BxF;AAWD;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,cAAc,GAAG,cAAc,CAE/E;AAiKD;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAS7F;AAiBD;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,YAAY,EACvB,KAAK,EAAE,YAAY,EACnB,SAAS,CAAC,EAAE,IAAI,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0E7B"}