@decaf-ts/integrations 0.3.12 → 0.4.1-0

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 (196) hide show
  1. package/README.md +11 -3
  2. package/dist/integrations.cjs +445 -7
  3. package/dist/integrations.js +479 -8
  4. package/jest.config.cjs +1 -1
  5. package/lib/cjs/feature-flags/constants.cjs +16 -0
  6. package/lib/cjs/feature-flags/decorators.cjs +65 -0
  7. package/lib/cjs/feature-flags/environment.cjs +26 -0
  8. package/lib/cjs/feature-flags/index.cjs +31 -0
  9. package/lib/cjs/feature-flags/models/FeatureFlag.model.cjs +81 -0
  10. package/lib/cjs/feature-flags/models/FeatureFlagAccess.model.cjs +78 -0
  11. package/lib/cjs/feature-flags/readers/FeatureFlagReader.cjs +25 -0
  12. package/lib/cjs/feature-flags/readers/index.cjs +19 -0
  13. package/lib/cjs/feature-flags/services/FeatureFlag.service.cjs +259 -0
  14. package/lib/cjs/feature-flags/types.cjs +4 -0
  15. package/lib/cjs/feature-flags/utils.cjs +141 -0
  16. package/lib/cjs/graph/engine/execution/SwitchGraphNodeExecutor.cjs +9 -9
  17. package/lib/cjs/graph/shared/nodes/flow-control.cjs +4 -3
  18. package/lib/cjs/graph/shared/types.cjs +2 -2
  19. package/lib/cjs/index.cjs +6 -5
  20. package/lib/cjs/kibana/builders/KibanaIndexBuilder.cjs +329 -0
  21. package/lib/cjs/kibana/builders/KibanaIndexBuilderCollection.cjs +37 -0
  22. package/lib/cjs/kibana/builders/index.cjs +20 -0
  23. package/lib/cjs/kibana/helpers.cjs +20 -16
  24. package/lib/cjs/kibana/index.cjs +3 -2
  25. package/lib/cjs/kibana/types.cjs +11 -2
  26. package/lib/cjs/loader/ObjectLoader.cjs +154 -0
  27. package/lib/cjs/loader/families.cjs +78 -0
  28. package/lib/cjs/loader/index.cjs +28 -0
  29. package/lib/cjs/loader/types.cjs +4 -0
  30. package/lib/cjs/nest/decorators.cjs +17 -0
  31. package/lib/cjs/nest/index.cjs +3 -3
  32. package/lib/cjs/nest/keycloakAuthHandler.cjs +74 -35
  33. package/lib/cjs/nest/keycloakModule.cjs +7 -10
  34. package/lib/cjs/nest/types.cjs +2 -2
  35. package/lib/cjs/nest/utils.cjs +58 -50
  36. package/lib/cjs/plugins/contract.cjs +76 -0
  37. package/lib/cjs/plugins/index.cjs +35 -0
  38. package/lib/cjs/plugins/kibana/host.cjs +24 -0
  39. package/lib/cjs/plugins/kibana/index.cjs +38 -0
  40. package/lib/cjs/plugins/kibana/installer.cjs +180 -0
  41. package/lib/cjs/plugins/kibana/manifest.cjs +33 -0
  42. package/lib/cjs/plugins/kibana/templates.cjs +503 -0
  43. package/lib/cjs/plugins/kibana/types.cjs +33 -0
  44. package/lib/cjs/plugins/superset/host.cjs +26 -0
  45. package/lib/cjs/plugins/superset/index.cjs +40 -0
  46. package/lib/cjs/plugins/superset/installer.cjs +232 -0
  47. package/lib/cjs/plugins/superset/manifest.cjs +35 -0
  48. package/lib/cjs/plugins/superset/templates.cjs +844 -0
  49. package/lib/cjs/plugins/superset/types.cjs +39 -0
  50. package/lib/esm/feature-flags/constants.js +12 -0
  51. package/lib/esm/feature-flags/decorators.js +49 -0
  52. package/lib/esm/feature-flags/environment.js +18 -0
  53. package/lib/esm/feature-flags/index.js +14 -0
  54. package/lib/esm/feature-flags/models/FeatureFlag.model.js +72 -0
  55. package/lib/esm/feature-flags/models/FeatureFlagAccess.model.js +69 -0
  56. package/lib/esm/feature-flags/readers/FeatureFlagReader.js +19 -0
  57. package/lib/esm/feature-flags/readers/index.js +2 -0
  58. package/lib/esm/feature-flags/services/FeatureFlag.service.js +250 -0
  59. package/lib/esm/feature-flags/types.js +2 -0
  60. package/lib/esm/feature-flags/utils.js +126 -0
  61. package/lib/esm/graph/engine/execution/SwitchGraphNodeExecutor.js +8 -8
  62. package/lib/esm/graph/shared/nodes/flow-control.js +3 -2
  63. package/lib/esm/graph/shared/types.js +1 -1
  64. package/lib/esm/index.js +5 -4
  65. package/lib/esm/kibana/builders/KibanaIndexBuilder.js +319 -0
  66. package/lib/esm/kibana/builders/KibanaIndexBuilderCollection.js +32 -0
  67. package/lib/esm/kibana/builders/index.js +3 -0
  68. package/lib/esm/kibana/helpers.js +19 -15
  69. package/lib/esm/kibana/index.js +2 -1
  70. package/lib/esm/kibana/types.js +13 -2
  71. package/lib/esm/loader/ObjectLoader.js +115 -0
  72. package/lib/esm/loader/families.js +66 -0
  73. package/lib/esm/loader/index.js +11 -0
  74. package/lib/esm/loader/types.js +2 -0
  75. package/lib/esm/nest/decorators.js +12 -0
  76. package/lib/esm/nest/index.js +2 -2
  77. package/lib/esm/nest/keycloakAuthHandler.js +67 -35
  78. package/lib/esm/nest/keycloakModule.js +7 -10
  79. package/lib/esm/nest/types.js +1 -1
  80. package/lib/esm/nest/utils.js +55 -46
  81. package/lib/esm/plugins/contract.js +68 -0
  82. package/lib/esm/plugins/index.js +18 -0
  83. package/lib/esm/plugins/kibana/host.js +19 -0
  84. package/lib/esm/plugins/kibana/index.js +14 -0
  85. package/lib/esm/plugins/kibana/installer.js +140 -0
  86. package/lib/esm/plugins/kibana/manifest.js +32 -0
  87. package/lib/esm/plugins/kibana/templates.js +499 -0
  88. package/lib/esm/plugins/kibana/types.js +10 -0
  89. package/lib/esm/plugins/superset/host.js +21 -0
  90. package/lib/esm/plugins/superset/index.js +16 -0
  91. package/lib/esm/plugins/superset/installer.js +192 -0
  92. package/lib/esm/plugins/superset/manifest.js +30 -0
  93. package/lib/esm/plugins/superset/templates.js +840 -0
  94. package/lib/esm/plugins/superset/types.js +11 -0
  95. package/lib/types/feature-flags/constants.d.cts +11 -0
  96. package/lib/types/feature-flags/constants.d.mts +11 -0
  97. package/lib/types/feature-flags/decorators.d.cts +11 -0
  98. package/lib/types/feature-flags/decorators.d.mts +11 -0
  99. package/lib/types/feature-flags/environment.d.cts +11 -0
  100. package/lib/types/feature-flags/environment.d.mts +11 -0
  101. package/lib/types/feature-flags/index.d.cts +13 -0
  102. package/lib/types/feature-flags/index.d.mts +13 -0
  103. package/lib/types/feature-flags/models/FeatureFlag.model.d.cts +16 -0
  104. package/lib/types/feature-flags/models/FeatureFlag.model.d.mts +16 -0
  105. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.cts +15 -0
  106. package/lib/types/feature-flags/models/FeatureFlagAccess.model.d.mts +15 -0
  107. package/lib/types/feature-flags/readers/FeatureFlagReader.d.cts +10 -0
  108. package/lib/types/feature-flags/readers/FeatureFlagReader.d.mts +10 -0
  109. package/lib/types/feature-flags/readers/index.d.cts +1 -0
  110. package/lib/types/feature-flags/readers/index.d.mts +1 -0
  111. package/lib/types/feature-flags/services/FeatureFlag.service.d.cts +43 -0
  112. package/lib/types/feature-flags/services/FeatureFlag.service.d.mts +43 -0
  113. package/lib/types/feature-flags/types.d.cts +39 -0
  114. package/lib/types/feature-flags/types.d.mts +39 -0
  115. package/lib/types/feature-flags/utils.d.cts +13 -0
  116. package/lib/types/feature-flags/utils.d.mts +13 -0
  117. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.cts +2 -2
  118. package/lib/types/graph/engine/execution/SwitchGraphNodeExecutor.d.mts +2 -2
  119. package/lib/types/graph/shared/types.d.cts +3 -3
  120. package/lib/types/graph/shared/types.d.mts +3 -3
  121. package/lib/types/index.d.cts +3 -2
  122. package/lib/types/index.d.mts +3 -2
  123. package/lib/types/kibana/builders/KibanaIndexBuilder.d.cts +67 -0
  124. package/lib/types/kibana/builders/KibanaIndexBuilder.d.mts +67 -0
  125. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.cts +17 -0
  126. package/lib/types/kibana/builders/KibanaIndexBuilderCollection.d.mts +17 -0
  127. package/lib/types/kibana/builders/index.d.cts +2 -0
  128. package/lib/types/kibana/builders/index.d.mts +2 -0
  129. package/lib/types/kibana/index.d.cts +1 -0
  130. package/lib/types/kibana/index.d.mts +1 -0
  131. package/lib/types/kibana/types.d.cts +11 -0
  132. package/lib/types/kibana/types.d.mts +11 -0
  133. package/lib/types/loader/ObjectLoader.d.cts +27 -0
  134. package/lib/types/loader/ObjectLoader.d.mts +27 -0
  135. package/lib/types/loader/families.d.cts +34 -0
  136. package/lib/types/loader/families.d.mts +34 -0
  137. package/lib/types/loader/index.d.cts +10 -0
  138. package/lib/types/loader/index.d.mts +10 -0
  139. package/lib/types/loader/types.d.cts +24 -0
  140. package/lib/types/loader/types.d.mts +24 -0
  141. package/lib/types/nest/decorators.d.cts +8 -0
  142. package/lib/types/nest/decorators.d.mts +8 -0
  143. package/lib/types/nest/index.d.cts +1 -1
  144. package/lib/types/nest/index.d.mts +1 -1
  145. package/lib/types/nest/keycloakAuthHandler.d.cts +19 -42
  146. package/lib/types/nest/keycloakAuthHandler.d.mts +19 -42
  147. package/lib/types/nest/keycloakModule.d.cts +3 -5
  148. package/lib/types/nest/keycloakModule.d.mts +3 -5
  149. package/lib/types/nest/types.d.cts +2 -0
  150. package/lib/types/nest/types.d.mts +2 -0
  151. package/lib/types/nest/utils.d.cts +3 -4
  152. package/lib/types/nest/utils.d.mts +3 -4
  153. package/lib/types/plugins/contract.d.cts +180 -0
  154. package/lib/types/plugins/contract.d.mts +180 -0
  155. package/lib/types/plugins/index.d.cts +17 -0
  156. package/lib/types/plugins/index.d.mts +17 -0
  157. package/lib/types/plugins/kibana/host.d.cts +18 -0
  158. package/lib/types/plugins/kibana/host.d.mts +18 -0
  159. package/lib/types/plugins/kibana/index.d.cts +13 -0
  160. package/lib/types/plugins/kibana/index.d.mts +13 -0
  161. package/lib/types/plugins/kibana/installer.d.cts +45 -0
  162. package/lib/types/plugins/kibana/installer.d.mts +45 -0
  163. package/lib/types/plugins/kibana/manifest.d.cts +31 -0
  164. package/lib/types/plugins/kibana/manifest.d.mts +31 -0
  165. package/lib/types/plugins/kibana/templates.d.cts +12 -0
  166. package/lib/types/plugins/kibana/templates.d.mts +12 -0
  167. package/lib/types/plugins/kibana/types.d.cts +9 -0
  168. package/lib/types/plugins/kibana/types.d.mts +9 -0
  169. package/lib/types/plugins/superset/host.d.cts +20 -0
  170. package/lib/types/plugins/superset/host.d.mts +20 -0
  171. package/lib/types/plugins/superset/index.d.cts +15 -0
  172. package/lib/types/plugins/superset/index.d.mts +15 -0
  173. package/lib/types/plugins/superset/installer.d.cts +70 -0
  174. package/lib/types/plugins/superset/installer.d.mts +70 -0
  175. package/lib/types/plugins/superset/manifest.d.cts +28 -0
  176. package/lib/types/plugins/superset/manifest.d.mts +28 -0
  177. package/lib/types/plugins/superset/templates.d.cts +12 -0
  178. package/lib/types/plugins/superset/templates.d.mts +12 -0
  179. package/lib/types/plugins/superset/types.d.cts +10 -0
  180. package/lib/types/plugins/superset/types.d.mts +10 -0
  181. package/package.json +62 -3
  182. package/plugins/kibana/.gitignore +16 -0
  183. package/plugins/kibana/Dockerfile +19 -0
  184. package/plugins/kibana/docker-compose.yml +50 -0
  185. package/plugins/kibana/host/index.html +101 -0
  186. package/plugins/kibana/setup-dashboards.sh +84 -0
  187. package/plugins/superset/.gitignore +17 -0
  188. package/plugins/superset/Dockerfile +79 -0
  189. package/plugins/superset/docker-compose.yml +62 -0
  190. package/plugins/superset/host/index.html +168 -0
  191. package/plugins/superset/setup-dashboards.sh +106 -0
  192. package/plugins/superset/superset_config.py +49 -0
  193. package/lib/cjs/nest/authService.cjs +0 -91
  194. package/lib/esm/nest/authService.js +0 -86
  195. package/lib/types/nest/authService.d.cts +0 -63
  196. package/lib/types/nest/authService.d.mts +0 -63
@@ -1,7 +1,7 @@
1
1
  (function(global, factory) {
2
- typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("child_process"), require("@decaf-ts/logging"), require("@decaf-ts/db-decorators"), require("@decaf-ts/core"), require("@decaf-ts/decorator-validation"), require("tslib")) : typeof define === "function" && define.amd ? define([ "exports", "child_process", "@decaf-ts/logging", "@decaf-ts/db-decorators", "@decaf-ts/core", "@decaf-ts/decorator-validation", "tslib" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self,
3
- factory(global.integrations = {}, global.childProcess, global.decafTsLogging, global.decafTsDbDecorators, global.decafTsCore, global.decafTsDecoratorValidation, global.tslib));
4
- })(this, function(exports, child_process, logging, dbDecorators, core, decoratorValidation, tslib) {
2
+ typeof exports === "object" && typeof module !== "undefined" ? factory(exports, require("child_process"), require("@decaf-ts/logging"), require("@decaf-ts/db-decorators"), require("@decaf-ts/core"), require("@decaf-ts/decorator-validation"), require("tslib"), require("@decaf-ts/decoration")) : typeof define === "function" && define.amd ? define([ "exports", "child_process", "@decaf-ts/logging", "@decaf-ts/db-decorators", "@decaf-ts/core", "@decaf-ts/decorator-validation", "tslib", "@decaf-ts/decoration" ], factory) : (global = typeof globalThis !== "undefined" ? globalThis : global || self,
3
+ factory(global.integrations = {}, global.childProcess, global.decafTsLogging, global.decafTsDbDecorators, global.decafTsCore, global.decafTsDecoratorValidation, global.tslib, global.decafTsDecoration));
4
+ })(this, function(exports, child_process, logging, dbDecorators, core, decoratorValidation, tslib, decoration) {
5
5
  "use strict";
6
6
  async function execWithLogging(command, options, log, level = logging.LogLevel.info) {
7
7
  log.debug(`Executing: ${command}`);
@@ -1575,9 +1575,414 @@
1575
1575
  });
1576
1576
  }
1577
1577
  }
1578
- const VERSION = "0.3.11";
1579
- const COMMIT = "e2c4409";
1580
- const FULL_VERSION = "0.3.11-e2c4409";
1578
+ const FEATURE_FLAG_ENV_ROOT = "featureFlag";
1579
+ const FEATURE_FLAG_ENV_PREFIX = "FEATURE_FLAG";
1580
+ const FEATURE_FLAG_MODEL_KEY = "feature-flags:model";
1581
+ const FEATURE_FLAG_AUTH_KEY = "feature-flags:auth";
1582
+ const FEATURE_FLAG_BLOCK_KEY = "feature-flags:block";
1583
+ const FEATURE_FLAG_RENDER_KEY = "feature-flags:render-if";
1584
+ const FEATURE_FLAG_HIDE_KEY = "feature-flags:hide-on";
1585
+ function normalizeFeatureName(name) {
1586
+ const trimmed = name.trim();
1587
+ if (!trimmed) return trimmed;
1588
+ if (/^[a-z][a-zA-Z0-9]*$/.test(trimmed)) return trimmed;
1589
+ const camelized = trimmed.toLowerCase().replace(/[_\-\s]+/g, " ").split(" ").filter(Boolean);
1590
+ if (camelized.length === 0) return trimmed;
1591
+ const [head, ...tail] = camelized;
1592
+ return [ head, ...tail.map(segment => segment ? segment.charAt(0).toUpperCase() + segment.slice(1) : segment) ].join("").replace(/[^a-zA-Z0-9]/g, "");
1593
+ }
1594
+ function parseRuntimeValue(value) {
1595
+ if (typeof value !== "string") return value;
1596
+ const trimmed = value.trim();
1597
+ if (trimmed === "true") return true;
1598
+ if (trimmed === "false") return false;
1599
+ if (/^-?\d+(\.\d+)?$/.test(trimmed)) return Number(trimmed);
1600
+ if (trimmed.startsWith("{") && trimmed.endsWith("}") || trimmed.startsWith("[") && trimmed.endsWith("]")) {
1601
+ try {
1602
+ return JSON.parse(trimmed);
1603
+ } catch {
1604
+ return value;
1605
+ }
1606
+ }
1607
+ return value;
1608
+ }
1609
+ function normalizeObjectKey(key) {
1610
+ if (!key) return key;
1611
+ if (/^[a-z][a-zA-Z0-9]*$/.test(key)) return key;
1612
+ const normalized = key.replace(/[\s-]+/g, "_").split("_").filter(Boolean);
1613
+ if (normalized.length === 0) return key;
1614
+ const [head, ...tail] = normalized;
1615
+ return [ head.toLowerCase(), ...tail.map(segment => segment.charAt(0).toUpperCase() + segment.slice(1).toLowerCase()) ].join("");
1616
+ }
1617
+ function normalizeFeatureConfig(value) {
1618
+ if (typeof value === "undefined") return undefined;
1619
+ if (value === true) return true;
1620
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
1621
+ return parseRuntimeValue(value);
1622
+ }
1623
+ const result = {};
1624
+ Object.entries(value).forEach(([key, raw]) => {
1625
+ const normalizedKey = normalizeObjectKey(key);
1626
+ if (typeof raw !== "undefined") {
1627
+ result[normalizedKey] = normalizeFeatureConfig(raw) ?? raw;
1628
+ }
1629
+ });
1630
+ return result;
1631
+ }
1632
+ function normalizeFeatureRegistry(value) {
1633
+ if (!value || typeof value !== "object" || Array.isArray(value)) return {};
1634
+ return Object.entries(value).reduce((acc, [key, raw]) => {
1635
+ const normalizedKey = normalizeFeatureName(key);
1636
+ const normalizedValue = normalizeFeatureConfig(raw);
1637
+ if (typeof normalizedValue !== "undefined") {
1638
+ acc[normalizedKey] = normalizedValue;
1639
+ }
1640
+ return acc;
1641
+ }, {});
1642
+ }
1643
+ function isFeatureFlagEnabled(value) {
1644
+ if (value === true) return true;
1645
+ return !!value && typeof value === "object";
1646
+ }
1647
+ function isFeatureFlagEnabledByName(registry, featureName) {
1648
+ return isFeatureFlagEnabled(registry?.[normalizeFeatureName(featureName)]);
1649
+ }
1650
+ function normalizeFeatureRule(features, match = "any") {
1651
+ return {
1652
+ features: [ ...new Set(features.map(normalizeFeatureName).filter(Boolean)) ],
1653
+ match: match
1654
+ };
1655
+ }
1656
+ function isFeatureRuleSatisfied(rule, registry) {
1657
+ if (!rule || rule.features.length === 0) return true;
1658
+ const enabled = rule.features.filter(feature => isFeatureFlagEnabledByName(registry, feature));
1659
+ if (rule.match === "all") return enabled.length === rule.features.length;
1660
+ return enabled.length > 0;
1661
+ }
1662
+ function isFeatureRuleBlocked(rule, registry) {
1663
+ if (!rule || rule.features.length === 0) return false;
1664
+ return rule.features.some(feature => isFeatureFlagEnabledByName(registry, feature));
1665
+ }
1666
+ function readMetadata(target, key) {
1667
+ return decoration.Metadata.get(target, key);
1668
+ }
1669
+ function normalizeFeatureSubjectType(subjectType) {
1670
+ return subjectType.trim().toLowerCase();
1671
+ }
1672
+ function normalizeFeatureSubjectKey(subjectKey) {
1673
+ return subjectKey.trim();
1674
+ }
1675
+ const FeatureFlagEnvironment = logging.LoggedEnvironment.accumulate({
1676
+ [FEATURE_FLAG_ENV_ROOT]: {}
1677
+ });
1678
+ async function loadFeatureFlagsFromEnvironment(source = FeatureFlagEnvironment) {
1679
+ return normalizeFeatureRegistry(source.featureFlag);
1680
+ }
1681
+ async function resolveFeatureFlagFromEnvironment(featureName, source = FeatureFlagEnvironment) {
1682
+ const registry = await loadFeatureFlagsFromEnvironment(source);
1683
+ return registry[normalizeFeatureName(featureName)];
1684
+ }
1685
+ async function hasFeatureFlagInEnvironment(featureName, source = FeatureFlagEnvironment) {
1686
+ return !!await resolveFeatureFlagFromEnvironment(featureName, source);
1687
+ }
1688
+ exports.FeatureFlag = class FeatureFlag extends core.BaseModel {
1689
+ constructor(data) {
1690
+ super(data);
1691
+ this.enabled = true;
1692
+ }
1693
+ };
1694
+ tslib.__decorate([ core.pk(), core.uuid(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "id", void 0);
1695
+ tslib.__decorate([ core.unique(), decoratorValidation.required(), core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "key", void 0);
1696
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Boolean) ], exports.FeatureFlag.prototype, "enabled", void 0);
1697
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "description", void 0);
1698
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "scope", void 0);
1699
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Object) ], exports.FeatureFlag.prototype, "metadata", void 0);
1700
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Object) ], exports.FeatureFlag.prototype, "config", void 0);
1701
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "createdBy", void 0);
1702
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlag.prototype, "updatedBy", void 0);
1703
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.FeatureFlag.prototype, "createdAt", void 0);
1704
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.FeatureFlag.prototype, "updatedAt", void 0);
1705
+ exports.FeatureFlag = tslib.__decorate([ core.table("feature_flags"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.FeatureFlag);
1706
+ exports.FeatureFlagAccess = class FeatureFlagAccess extends core.BaseModel {
1707
+ constructor(data) {
1708
+ super(data);
1709
+ this.enabled = true;
1710
+ }
1711
+ };
1712
+ tslib.__decorate([ core.pk(), core.uuid(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "id", void 0);
1713
+ tslib.__decorate([ decoratorValidation.required(), core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "featureKey", void 0);
1714
+ tslib.__decorate([ decoratorValidation.required(), core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "subjectType", void 0);
1715
+ tslib.__decorate([ decoratorValidation.required(), core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "subjectKey", void 0);
1716
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Boolean) ], exports.FeatureFlagAccess.prototype, "enabled", void 0);
1717
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", Object) ], exports.FeatureFlagAccess.prototype, "metadata", void 0);
1718
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "createdBy", void 0);
1719
+ tslib.__decorate([ core.column(), tslib.__metadata("design:type", String) ], exports.FeatureFlagAccess.prototype, "updatedBy", void 0);
1720
+ tslib.__decorate([ core.createdAt(), tslib.__metadata("design:type", Date) ], exports.FeatureFlagAccess.prototype, "createdAt", void 0);
1721
+ tslib.__decorate([ core.updatedAt(), tslib.__metadata("design:type", Date) ], exports.FeatureFlagAccess.prototype, "updatedAt", void 0);
1722
+ exports.FeatureFlagAccess = tslib.__decorate([ core.table("feature_flag_access"), decoratorValidation.model(), tslib.__metadata("design:paramtypes", [ Object ]) ], exports.FeatureFlagAccess);
1723
+ class FeatureFlagReader {
1724
+ async readOne(featureName, input) {
1725
+ const registry = await this.read(input);
1726
+ return registry[normalizeFeatureName(featureName)];
1727
+ }
1728
+ }
1729
+ class EnvironmeFlagReader extends FeatureFlagReader {
1730
+ async read(input = {}) {
1731
+ const environment = input.source ?? {
1732
+ [FEATURE_FLAG_ENV_ROOT]: {}
1733
+ };
1734
+ return loadFeatureFlagsFromEnvironment(environment);
1735
+ }
1736
+ }
1737
+ exports.FeatureFlagService = class FeatureFlagService extends core.ModelService {
1738
+ constructor() {
1739
+ super(exports.FeatureFlag);
1740
+ this.reader = new EnvironmeFlagReader;
1741
+ this.cachedRegistry = {};
1742
+ }
1743
+ async initialize(...args) {
1744
+ const config = args[0] ?? {};
1745
+ if (config.repository) {
1746
+ this._repository = config.repository;
1747
+ }
1748
+ this.reader = !config.reader ? new EnvironmeFlagReader : typeof config.reader === "function" ? new config.reader : config.reader;
1749
+ const readerConfig = {
1750
+ ...config.readerConfig ?? {},
1751
+ source: config.readerConfig?.source ?? FeatureFlagEnvironment
1752
+ };
1753
+ this.cachedRegistry = await this.refreshCachedRegistry(readerConfig, ...args);
1754
+ const effectiveConfig = {
1755
+ ...config,
1756
+ reader: this.reader,
1757
+ readerConfig: readerConfig
1758
+ };
1759
+ return {
1760
+ config: effectiveConfig,
1761
+ client: this.reader
1762
+ };
1763
+ }
1764
+ cloneRegistry(registry) {
1765
+ return Object.entries(registry).reduce((acc, [key, value]) => {
1766
+ acc[key] = value && typeof value === "object" && !Array.isArray(value) ? {
1767
+ ...value
1768
+ } : value;
1769
+ return acc;
1770
+ }, {});
1771
+ }
1772
+ async refreshCachedRegistry(options = {}, ...args) {
1773
+ const envRegistry = await this.reader.read({
1774
+ ...options,
1775
+ source: options.source ?? FeatureFlagEnvironment
1776
+ });
1777
+ let persisted = [];
1778
+ try {
1779
+ persisted = await this.repo.select().execute(...args);
1780
+ } catch {
1781
+ persisted = [];
1782
+ }
1783
+ const registry = this.cloneRegistry(envRegistry);
1784
+ for (const flag of persisted) {
1785
+ registry[flag.key] = flag.enabled ? flag.config ?? true : false;
1786
+ }
1787
+ return registry;
1788
+ }
1789
+ setCachedFlag(flag) {
1790
+ this.cachedRegistry[flag.key] = flag.enabled ? flag.config ?? true : false;
1791
+ }
1792
+ getAccessRepository() {
1793
+ return this.accessRepository ?? core.Repository.forModel(exports.FeatureFlagAccess);
1794
+ }
1795
+ assertInitialized() {
1796
+ void this.reader;
1797
+ }
1798
+ normalizeFeatureAccessInput(input) {
1799
+ return {
1800
+ ...input,
1801
+ featureKey: normalizeFeatureName(input.featureKey),
1802
+ subjectType: normalizeFeatureSubjectType(input.subjectType),
1803
+ subjectKey: normalizeFeatureSubjectKey(input.subjectKey)
1804
+ };
1805
+ }
1806
+ buildAccessCondition(query) {
1807
+ let condition = core.Condition.attr("subjectType").eq(normalizeFeatureSubjectType(query.subjectType));
1808
+ condition = condition.and(core.Condition.attr("subjectKey").eq(normalizeFeatureSubjectKey(query.subjectKey)));
1809
+ if (typeof query.enabled !== "undefined") {
1810
+ condition = condition.and(core.Condition.attr("enabled").eq(query.enabled));
1811
+ }
1812
+ if (query.featureKeys && query.featureKeys.length > 0) {
1813
+ condition = condition.and(core.Condition.attr("featureKey").in(query.featureKeys.map(normalizeFeatureName)));
1814
+ }
1815
+ return condition;
1816
+ }
1817
+ async create(model, ...args) {
1818
+ model.key = normalizeFeatureName(model.key);
1819
+ model.enabled ??= true;
1820
+ const created = await super.create(model, ...args);
1821
+ this.setCachedFlag(created);
1822
+ return created;
1823
+ }
1824
+ async update(model, ...args) {
1825
+ model.key = normalizeFeatureName(model.key);
1826
+ model.enabled ??= true;
1827
+ const updated = await super.update(model, ...args);
1828
+ this.setCachedFlag(updated);
1829
+ return updated;
1830
+ }
1831
+ async findOneBy(key, value, ...args) {
1832
+ const normalizedValue = key === "key" && typeof value === "string" ? normalizeFeatureName(value) : value;
1833
+ return this.repo.findOneBy(key, normalizedValue, ...args);
1834
+ }
1835
+ async readAll(keys, ...args) {
1836
+ const result = await this.repo.readAll(keys, ...args);
1837
+ for (const flag of result) this.setCachedFlag(flag);
1838
+ return result;
1839
+ }
1840
+ async listEnabled(...args) {
1841
+ return this.repo.select().where(core.Condition.attr("enabled").eq(true)).execute(...args);
1842
+ }
1843
+ async grantFeatureAccess(input, ...args) {
1844
+ const normalized = this.normalizeFeatureAccessInput(input);
1845
+ const existing = await this.findFeatureAccess(normalized, ...args).catch(() => undefined);
1846
+ if (!existing) {
1847
+ return this.getAccessRepository().create(new exports.FeatureFlagAccess(normalized), ...args);
1848
+ }
1849
+ return this.getAccessRepository().update(Object.assign(existing, normalized), ...args);
1850
+ }
1851
+ async revokeFeatureAccess(input, ...args) {
1852
+ const existing = await this.findFeatureAccess(input, ...args).catch(() => undefined);
1853
+ if (!existing) return undefined;
1854
+ return this.getAccessRepository().delete(existing.id, ...args);
1855
+ }
1856
+ async findFeatureAccess(query, ...args) {
1857
+ const condition = this.buildAccessCondition(query);
1858
+ const results = await this.getAccessRepository().select().where(condition).execute(...args);
1859
+ const existing = results[0];
1860
+ if (!existing) {
1861
+ throw new dbDecorators.NotFoundError(`Feature access for ${normalizeFeatureSubjectType(query.subjectType)}:${normalizeFeatureSubjectKey(query.subjectKey)} not found`);
1862
+ }
1863
+ return existing;
1864
+ }
1865
+ async listFeatureAccess(query, ...args) {
1866
+ return this.getAccessRepository().select().where(this.buildAccessCondition(query)).execute(...args);
1867
+ }
1868
+ async resolveFeatureFlagsForSubject(subject, ...args) {
1869
+ this.assertInitialized();
1870
+ const access = await this.listFeatureAccess({
1871
+ ...subject,
1872
+ enabled: true
1873
+ }, ...args);
1874
+ const featureKeys = [ ...new Set(access.map(item => item.featureKey)) ];
1875
+ if (featureKeys.length === 0) return {};
1876
+ const condition = core.Condition.attr("enabled").eq(true).and(core.Condition.attr("key").in(featureKeys.map(normalizeFeatureName)));
1877
+ const enabledFlags = await this.repo.select().where(condition).execute(...args);
1878
+ return enabledFlags.reduce((registry, flag) => {
1879
+ registry[flag.key] = flag.config ?? true;
1880
+ return registry;
1881
+ }, {});
1882
+ }
1883
+ async isEnabledForSubject(key, subject, ...args) {
1884
+ const registry = await this.resolveFeatureFlagsForSubject(subject, ...args);
1885
+ return isFeatureFlagEnabledByName(registry, key);
1886
+ }
1887
+ isEnabled(key) {
1888
+ this.assertInitialized();
1889
+ const normalizedKey = normalizeFeatureName(key);
1890
+ return isFeatureFlagEnabledByName(this.cachedRegistry, normalizedKey);
1891
+ }
1892
+ async resolveFeatureFlags() {
1893
+ this.assertInitialized();
1894
+ return this.cloneRegistry(this.cachedRegistry);
1895
+ }
1896
+ async syncFromEnvironment(options = {}, ...args) {
1897
+ this.assertInitialized();
1898
+ const registry = await this.reader.read({
1899
+ ...options,
1900
+ source: options.source ?? FeatureFlagEnvironment
1901
+ });
1902
+ const results = [];
1903
+ for (const [key, value] of Object.entries(registry)) {
1904
+ const config = value && typeof value === "object" && !Array.isArray(value) ? value : {
1905
+ enabled: Boolean(value)
1906
+ };
1907
+ const {enabled: _ignoredEnabled, ...restConfig} = config;
1908
+ const normalizedKey = normalizeFeatureName(key);
1909
+ const existing = await this.findOneBy("key", normalizedKey, ...args).catch(() => undefined);
1910
+ const model = existing ? Object.assign(existing, {
1911
+ enabled: isFeatureFlagEnabled(value),
1912
+ description: restConfig.description ?? existing.description,
1913
+ scope: restConfig.scope ?? existing.scope,
1914
+ metadata: restConfig.metadata ?? existing.metadata,
1915
+ config: {
1916
+ ...restConfig,
1917
+ enabled: isFeatureFlagEnabled(value)
1918
+ }
1919
+ }) : new exports.FeatureFlag({
1920
+ key: normalizedKey,
1921
+ enabled: isFeatureFlagEnabled(value),
1922
+ description: restConfig.description,
1923
+ scope: restConfig.scope,
1924
+ metadata: restConfig.metadata,
1925
+ config: {
1926
+ ...restConfig,
1927
+ enabled: isFeatureFlagEnabled(value)
1928
+ }
1929
+ });
1930
+ results.push(existing ? await this.update(model, ...args) : await this.create(model, ...args));
1931
+ }
1932
+ this.cachedRegistry = await this.refreshCachedRegistry({
1933
+ ...options,
1934
+ source: options.source ?? FeatureFlagEnvironment
1935
+ }, ...args);
1936
+ return results;
1937
+ }
1938
+ };
1939
+ tslib.__decorate([ core.repository(exports.FeatureFlagAccess), tslib.__metadata("design:type", Object) ], exports.FeatureFlagService.prototype, "accessRepository", void 0);
1940
+ exports.FeatureFlagService = tslib.__decorate([ core.service(exports.FeatureFlag), tslib.__metadata("design:paramtypes", []) ], exports.FeatureFlagService);
1941
+ function featureMetadataKey(key, propertyKey) {
1942
+ return typeof propertyKey === "undefined" ? key : decoration.Metadata.key(key, propertyKey.toString());
1943
+ }
1944
+ function applyFeatureDecorator(key, features, match = "any") {
1945
+ const rule = normalizeFeatureRule(features, match);
1946
+ return function featureDecorator(target, propertyKey, descriptor) {
1947
+ if (typeof propertyKey === "undefined") {
1948
+ return decoration.metadata(key, rule)(target);
1949
+ }
1950
+ const scopedKey = featureMetadataKey(key, propertyKey);
1951
+ if (descriptor) {
1952
+ return decoration.methodMetadata(scopedKey, rule)(target, propertyKey, descriptor);
1953
+ }
1954
+ return decoration.propMetadata(scopedKey, rule)(target, propertyKey);
1955
+ };
1956
+ }
1957
+ function featureFlags(...features) {
1958
+ return applyFeatureDecorator(FEATURE_FLAG_MODEL_KEY, features);
1959
+ }
1960
+ function featureAuth(...features) {
1961
+ return applyFeatureDecorator(FEATURE_FLAG_AUTH_KEY, features);
1962
+ }
1963
+ function blockFeatureOperations(...features) {
1964
+ return applyFeatureDecorator(FEATURE_FLAG_BLOCK_KEY, features);
1965
+ }
1966
+ function renderIfFeature(...features) {
1967
+ return applyFeatureDecorator(FEATURE_FLAG_RENDER_KEY, features);
1968
+ }
1969
+ function hideOnFeature(...features) {
1970
+ return applyFeatureDecorator(FEATURE_FLAG_HIDE_KEY, features);
1971
+ }
1972
+ function getFeatureGateMetadata(target, key, propertyKey) {
1973
+ return readMetadata(target, featureMetadataKey(key, propertyKey));
1974
+ }
1975
+ function shouldExposeForFeatures(target, enabledFeatures, key, propertyKey) {
1976
+ const rule = getFeatureGateMetadata(target, key, propertyKey);
1977
+ return isFeatureRuleSatisfied(rule, enabledFeatures);
1978
+ }
1979
+ function shouldHideForFeatures(target, enabledFeatures, key, propertyKey) {
1980
+ const rule = getFeatureGateMetadata(target, key, propertyKey);
1981
+ return isFeatureRuleBlocked(rule, enabledFeatures);
1982
+ }
1983
+ const VERSION = "0.4.0";
1984
+ const COMMIT = "7e1a5ac";
1985
+ const FULL_VERSION = "0.4.0-7e1a5ac";
1581
1986
  const PACKAGE_NAME = "@decaf-ts/integrations";
1582
1987
  Object.defineProperty(exports, "AuthorizationError", {
1583
1988
  enumerable: true,
@@ -1597,7 +2002,17 @@
1597
2002
  exports.BootstrapService = BootstrapService;
1598
2003
  exports.COMMIT = COMMIT;
1599
2004
  exports.EffectivePermissionService = EffectivePermissionService;
2005
+ exports.EnvironmeFlagReader = EnvironmeFlagReader;
2006
+ exports.FEATURE_FLAG_AUTH_KEY = FEATURE_FLAG_AUTH_KEY;
2007
+ exports.FEATURE_FLAG_BLOCK_KEY = FEATURE_FLAG_BLOCK_KEY;
2008
+ exports.FEATURE_FLAG_ENV_PREFIX = FEATURE_FLAG_ENV_PREFIX;
2009
+ exports.FEATURE_FLAG_ENV_ROOT = FEATURE_FLAG_ENV_ROOT;
2010
+ exports.FEATURE_FLAG_HIDE_KEY = FEATURE_FLAG_HIDE_KEY;
2011
+ exports.FEATURE_FLAG_MODEL_KEY = FEATURE_FLAG_MODEL_KEY;
2012
+ exports.FEATURE_FLAG_RENDER_KEY = FEATURE_FLAG_RENDER_KEY;
1600
2013
  exports.FULL_VERSION = FULL_VERSION;
2014
+ exports.FeatureFlagEnvironment = FeatureFlagEnvironment;
2015
+ exports.FeatureFlagReader = FeatureFlagReader;
1601
2016
  exports.GroupMembershipService = GroupMembershipService;
1602
2017
  exports.GroupService = GroupService;
1603
2018
  exports.InheritanceBlockService = InheritanceBlockService;
@@ -1634,16 +2049,39 @@
1634
2049
  exports.UserService = UserService;
1635
2050
  exports.VERSION = VERSION;
1636
2051
  exports.asArray = asArray;
2052
+ exports.blockFeatureOperations = blockFeatureOperations;
1637
2053
  exports.buildAccessContext = buildAccessContext;
1638
2054
  exports.buildArangoContext = buildArangoContext;
1639
2055
  exports.buildQdrantFilter = buildQdrantFilter;
1640
2056
  exports.execWithLogging = execWithLogging;
2057
+ exports.featureAuth = featureAuth;
2058
+ exports.featureFlags = featureFlags;
2059
+ exports.getFeatureGateMetadata = getFeatureGateMetadata;
2060
+ exports.hasFeatureFlagInEnvironment = hasFeatureFlagInEnvironment;
2061
+ exports.hideOnFeature = hideOnFeature;
1641
2062
  exports.id = id;
2063
+ exports.isFeatureFlagEnabled = isFeatureFlagEnabled;
2064
+ exports.isFeatureFlagEnabledByName = isFeatureFlagEnabledByName;
2065
+ exports.isFeatureRuleBlocked = isFeatureRuleBlocked;
2066
+ exports.isFeatureRuleSatisfied = isFeatureRuleSatisfied;
1642
2067
  exports.isTimeValid = isTimeValid;
2068
+ exports.loadFeatureFlagsFromEnvironment = loadFeatureFlagsFromEnvironment;
1643
2069
  exports.lowerSlug = lowerSlug;
2070
+ exports.normalizeFeatureConfig = normalizeFeatureConfig;
2071
+ exports.normalizeFeatureName = normalizeFeatureName;
2072
+ exports.normalizeFeatureRegistry = normalizeFeatureRegistry;
2073
+ exports.normalizeFeatureRule = normalizeFeatureRule;
2074
+ exports.normalizeFeatureSubjectKey = normalizeFeatureSubjectKey;
2075
+ exports.normalizeFeatureSubjectType = normalizeFeatureSubjectType;
1644
2076
  exports.nowIso = nowIso;
2077
+ exports.parseRuntimeValue = parseRuntimeValue;
2078
+ exports.readMetadata = readMetadata;
1645
2079
  exports.relationId = relationId;
1646
2080
  exports.relationMatch = relationMatch;
2081
+ exports.renderIfFeature = renderIfFeature;
2082
+ exports.resolveFeatureFlagFromEnvironment = resolveFeatureFlagFromEnvironment;
1647
2083
  exports.sameTenant = sameTenant;
2084
+ exports.shouldExposeForFeatures = shouldExposeForFeatures;
2085
+ exports.shouldHideForFeatures = shouldHideForFeatures;
1648
2086
  });
1649
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvdHlwZXMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy91dGlscy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9hdXRob3JpemF0aW9uLW1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3VzZXIubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Blcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1wZXJtaXNzaW9uLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3JvbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1hc3NpZ25tZW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Jlc291cmNlLWdyYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3ByaW5jaXBhbC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZWZmZWN0aXZlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3VzZXIuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3ByaW5jaXBhbC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Byb3RlY3RlZC1yZXNvdXJjZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtZ3JhbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Jlc291cmNlLWxpZmVjeWNsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3RvcmFnZS1iaW5kaW5nLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ib290c3RyYXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3N5c3RlbS1tYW5hZ2VtZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9hdXRoei5zZXJ2aWNlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnMvdXRpbHNcbiAqIEBzdW1tYXJ5IFNoYXJlZCBpbnRlZ3JhdGlvbiB1dGlsaXRpZXMuXG4gKiBAZGVzY3JpcHRpb24gVXRpbGl0eSBoZWxwZXJzIHVzZWQgYWNyb3NzIHRoZSBpbnRlZ3JhdGlvbnMgcGFja2FnZS5cbiAqL1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBMb2dnZXIsIExvZ0xldmVsIH0gZnJvbSBcIkBkZWNhZi10cy9sb2dnaW5nXCI7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjV2l0aExvZ2dpbmcoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZyB9LFxuICBsb2c6IExvZ2dlcixcbiAgbGV2ZWw6IExvZ0xldmVsID0gTG9nTGV2ZWwuaW5mb1xuKTogUHJvbWlzZTx7IHN0ZG91dDogc3RyaW5nOyBzdGRlcnI6IHN0cmluZyB9PiB7XG4gIGxvZy5kZWJ1ZyhgRXhlY3V0aW5nOiAke2NvbW1hbmR9YCk7XG5cbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IGV4ZWMoY29tbWFuZCwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBzdGRvdXQ6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3Qgc3RkZXJyOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGRhdGE6IHN0cmluZykgPT4ge1xuICAgICAgc3Rkb3V0LnB1c2goZGF0YSk7XG4gICAgICBsb2dbbGV2ZWxdKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHN0ZGVyci5wdXNoKGRhdGEpO1xuICAgICAgbG9nLmRlYnVnKGRhdGEudHJpbSgpKTtcbiAgICB9KTtcblxuICAgIGNoaWxkLm9uKFwiY2xvc2VcIiwgKGNvZGU6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgbG9nLnNpbGx5KGBDb21tYW5kIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHlgKTtcbiAgICAgICAgcmVzb2x2ZSh7IHN0ZG91dDogc3Rkb3V0LmpvaW4oXCJcXG5cIiksIHN0ZGVycjogc3RkZXJyLmpvaW4oXCJcXG5cIikgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2cuY3JpdGljYWwoXG4gICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OlxcbiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgKTtcbiAgICAgICAgcmVqZWN0KFxuICAgICAgICAgIG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICAgICAgYENvbW1hbmQgZmFpbGVkIHdpdGggY29kZSAke2NvZGV9OiAke3N0ZGVyci5qb2luKFwiXFxuXCIpfWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBsb2cuY3JpdGljYWwoYENvbW1hbmQgZXhlY3V0aW9uIGVycm9yYCwgZXJyKTtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH0pO1xuICB9KTtcbn1cbiIsImV4cG9ydCBlbnVtIElzb2xhdGlvblRpZXIge1xuICBQb29sZWQgPSBcInBvb2xlZFwiLFxuICBCcmlkZ2UgPSBcImJyaWRnZVwiLFxuICBTaWxvID0gXCJzaWxvXCIsXG59XG5cbmV4cG9ydCBlbnVtIE1lbWJlcnNoaXBTdGF0dXMge1xuICBJbnZpdGVkID0gXCJpbnZpdGVkXCIsXG4gIEFjdGl2ZSA9IFwiYWN0aXZlXCIsXG4gIFN1c3BlbmRlZCA9IFwic3VzcGVuZGVkXCIsXG4gIFJlbW92ZWQgPSBcInJlbW92ZWRcIixcbn1cblxuZXhwb3J0IGVudW0gUHJpbmNpcGFsS2luZCB7XG4gIFVzZXIgPSBcInVzZXJcIixcbiAgR3JvdXAgPSBcImdyb3VwXCIsXG4gIFNlcnZpY2VBY2NvdW50ID0gXCJzZXJ2aWNlX2FjY291bnRcIixcbiAgQWdlbnQgPSBcImFnZW50XCIsXG4gIEFwaUtleSA9IFwiYXBpX2tleVwiLFxufVxuXG5leHBvcnQgZW51bSBTY29wZUtpbmQge1xuICBUZW5hbnQgPSBcInRlbmFudFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBSZXNvdXJjZSA9IFwicmVzb3VyY2VcIixcbn1cblxuZXhwb3J0IGVudW0gUGVybWlzc2lvbkNhdGVnb3J5IHtcbiAgQWRtaW4gPSBcImFkbWluXCIsXG4gIENvbnRlbnRSZWFkID0gXCJjb250ZW50X3JlYWRcIixcbiAgQ29udGVudFdyaXRlID0gXCJjb250ZW50X3dyaXRlXCIsXG4gIE1lbW9yeSA9IFwibWVtb3J5XCIsXG4gIEdyYXBoID0gXCJncmFwaFwiLFxuICBWZWN0b3IgPSBcInZlY3RvclwiLFxuICBFeHBvcnQgPSBcImV4cG9ydFwiLFxuICBCaWxsaW5nID0gXCJiaWxsaW5nXCIsXG4gIEF1ZGl0ID0gXCJhdWRpdFwiLFxuICBTZWN1cml0eSA9IFwic2VjdXJpdHlcIixcbiAgRGF0YSA9IFwiZGF0YVwiLFxuICBBdXRvbWF0aW9uID0gXCJhdXRvbWF0aW9uXCIsXG59XG5cbmV4cG9ydCBlbnVtIFJlc291cmNlVmlzaWJpbGl0eSB7XG4gIFByaXZhdGUgPSBcInByaXZhdGVcIixcbiAgUmVzb3VyY2VBY2wgPSBcInJlc291cmNlX2FjbFwiLFxuICBPcmdVbml0ID0gXCJvcmdfdW5pdFwiLFxuICBPcmdTdWJ0cmVlID0gXCJvcmdfc3VidHJlZVwiLFxuICBUZW5hbnQgPSBcInRlbmFudFwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlS2luZCB7XG4gIFBvc3RncmVzID0gXCJwb3N0Z3Jlc1wiLFxuICBBcmFuZ28gPSBcImFyYW5nb1wiLFxuICBRZHJhbnQgPSBcInFkcmFudFwiLFxuICBPYmplY3RTdG9yYWdlID0gXCJvYmplY3Rfc3RvcmFnZVwiLFxufVxuXG5leHBvcnQgZW51bSBTdG9yYWdlQmluZGluZ0tpbmQge1xuICBTaGFyZWQgPSBcInNoYXJlZFwiLFxuICBEZWRpY2F0ZWQgPSBcImRlZGljYXRlZFwiLFxufVxuXG5leHBvcnQgY29uc3QgSXNvbGF0aW9uVGllck9wdGlvbnMgPSBPYmplY3QudmFsdWVzKElzb2xhdGlvblRpZXIpO1xuZXhwb3J0IGNvbnN0IE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhNZW1iZXJzaGlwU3RhdHVzKTtcbmV4cG9ydCBjb25zdCBQcmluY2lwYWxLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUHJpbmNpcGFsS2luZCk7XG5leHBvcnQgY29uc3QgU2NvcGVLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU2NvcGVLaW5kKTtcbmV4cG9ydCBjb25zdCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhQZXJtaXNzaW9uQ2F0ZWdvcnkpO1xuZXhwb3J0IGNvbnN0IFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFJlc291cmNlVmlzaWJpbGl0eSk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUtpbmRPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhTdG9yYWdlS2luZCk7XG5leHBvcnQgY29uc3QgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU3RvcmFnZUJpbmRpbmdLaW5kKTtcblxuZXhwb3J0IHR5cGUgVHhBcmdzID0gYW55W107XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGVuYW50SW5wdXQge1xuICBzbHVnOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgaXNvbGF0aW9uVGllcj86IElzb2xhdGlvblRpZXI7XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVVzZXJJbnB1dCB7XG4gIGVtYWlsPzogc3RyaW5nO1xuICBwaG9uZT86IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVPcmdVbml0SW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwYXJlbnRPcmdVbml0SWQ/OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ/OiBzdHJpbmc7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3NpZ25Sb2xlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICByb2xlSWQ6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgaW5oZXJpdERvd24/OiBib29sZWFuO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG4gIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RlclJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFJlc291cmNlSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbkFjY2Vzc0lucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICByZXNvdXJjZVByb3RlY3RlZElkPzogc3RyaW5nO1xuICBzY29wZUtpbmQ/OiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ/OiBzdHJpbmc7XG4gIGF0PzogRGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBY2Nlc3NDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIHJlc291cmNlR3JhbnRzOiBBcnJheTx7IHJlc291cmNlSWQ6IHN0cmluZzsgcGVybWlzc2lvbktleTogc3RyaW5nIH0+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUWRyYW50QXV0aEZpbHRlciB7XG4gIG11c3Q6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgbXVzdF9ub3Q/OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZDtcbiAgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgYmluZGluZ0tleTogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUGVybWlzc2lvbiB7XG4gIGtleTogc3RyaW5nO1xuICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBSb2xlIHtcbiAga2V5OiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBPcmdVbml0IHtcbiAgbmFtZTogc3RyaW5nO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjaGlsZHJlbj86IEJvb3RzdHJhcE9yZ1VuaXRbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCb290c3RyYXBUZW1wbGF0ZSB7XG4gIHRlbmFudDogQ3JlYXRlVGVuYW50SW5wdXQ7XG4gIHJvb3RPcmdVbml0OiBCb290c3RyYXBPcmdVbml0O1xuICBwZXJtaXNzaW9uczogQm9vdHN0cmFwUGVybWlzc2lvbltdO1xuICByb2xlczogQm9vdHN0cmFwUm9sZVtdO1xuICBvd25lclVzZXI6IENyZWF0ZVVzZXJJbnB1dDtcbiAgb3duZXJSb2xlS2V5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VTbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIG9yZ1VuaXRJZDogc3RyaW5nO1xuICByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIHNlbnNpdGl2aXR5Pzogc3RyaW5nO1xuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyYW50U25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNyZWF0ZWRCeVByaW5jaXBhbElkPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCB7XG4gIGlkOiBzdHJpbmc7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgc2NvcGVLaW5kOiBTY29wZUtpbmQ7XG4gIHNjb3BlSWQ6IHN0cmluZztcbiAgc291cmNlS2luZDogc3RyaW5nO1xuICBzb3VyY2VJZDogc3RyaW5nO1xuICBzdGFydHNBdD86IERhdGU7XG4gIGV4cGlyZXNBdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aHpEYXRhU291cmNlcyB7XG4gIGxvYWRSZXNvdXJjZT86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8UmVzb3VyY2VTbmFwc2hvdCB8IHVuZGVmaW5lZD47XG4gIGxpc3RSZXNvdXJjZUdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcpID0+IFByb21pc2U8R3JhbnRTbmFwc2hvdFtdPjtcbiAgbGlzdFByaW5jaXBhbEdyYW50cz86ICh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucz86IChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbiAgbGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmdcbiAgKSA9PiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdPjtcbn1cbiIsImltcG9ydCB7IENhc2NhZGUsIE1vZGVsU2VydmljZSwgUmVwb3NpdG9yeSB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBBY2Nlc3NDb250ZXh0LFxuICBBcmFuZ29BdXRoQ29udGV4dCxcbiAgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LFxuICBHcmFudFNuYXBzaG90LFxuICBRZHJhbnRBdXRoRmlsdGVyLFxuICBTY29wZUtpbmQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBSRUxfUkVTVFJJQ1QgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5OT05FLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9OVUxMSUZZID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiB0cnVlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0RFUEVOREVOVCA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUkVMX0NBU0NBREVfSU5TRVJUX1VQREFURSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLkNBU0NBREUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogZmFsc2UsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBcmFuZ29Db250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogQXJhbmdvQXV0aENvbnRleHQge1xuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25LZXk6IG9wdGlvbnMucGVybWlzc2lvbktleSxcbiAgICBhbGxvd2VkT3JnVW5pdElkczogWy4uLm9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHNdLFxuICAgIGFsbG93ZWRSZXNvdXJjZUlkczogWy4uLm9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzXSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUWRyYW50RmlsdGVyKG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbktleTogc3RyaW5nO1xuICBhbGxvd2VkT3JnVW5pdElkczogc3RyaW5nW107XG4gIGFsbG93ZWRSZXNvdXJjZUlkczogc3RyaW5nW107XG59KTogUWRyYW50QXV0aEZpbHRlciB7XG4gIHJldHVybiB7XG4gICAgbXVzdDogW1xuICAgICAge1xuICAgICAgICBrZXk6IFwidGVuYW50X2lkXCIsXG4gICAgICAgIG1hdGNoOiB7IHZhbHVlOiBvcHRpb25zLnRlbmFudElkIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBzaG91bGQ6IFtcbiAgICAgICAgICB7IGtleTogXCJvcmdfdW5pdF9pZFwiLCBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZE9yZ1VuaXRJZHMgfSB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGtleTogXCJwcm90ZWN0ZWRfcmVzb3VyY2VfaWRcIixcbiAgICAgICAgICAgIG1hdGNoOiB7IGFueTogb3B0aW9ucy5hbGxvd2VkUmVzb3VyY2VJZHMgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHsga2V5OiBcIm93bmVyX3ByaW5jaXBhbF9pZFwiLCBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy5wcmluY2lwYWxJZCB9IH0sXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNjb3BlS2V5KHNjb3BlS2luZDogU2NvcGVLaW5kLCBzY29wZUlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCR7c2NvcGVLaW5kfToke3Njb3BlSWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vd0lzbygpOiBEYXRlIHtcbiAgcmV0dXJuIG5ldyBEYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc0FycmF5PFQ+KHZhbHVlOiBUW10gfCB1bmRlZmluZWQpOiBUW10ge1xuICByZXR1cm4gdmFsdWUgPz8gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW1lVGVuYW50KHJvd1RlbmFudDogdW5rbm93biwgdGVuYW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVsYXRpb25JZChyb3dUZW5hbnQgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0ZW5hbnRJZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uTWF0Y2goXG4gIHZhbHVlOiB1bmtub3duLFxuICB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YXJnZXRcbiAgICA/IHJlbGF0aW9uSWQodmFsdWUgYXMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmcpID09PSB0YXJnZXRcbiAgICA6IGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG93ZXJTbHVnKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIHZhbHVlXG4gICAgICAudHJpbSgpXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG4gICAgICAucmVwbGFjZSgvXi0rfC0rJC9nLCBcIlwiKSB8fCBcIml0ZW1cIlxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUaW1lVmFsaWQoXG4gIGF0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICBzdGFydHNBdD86IERhdGUsXG4gIGV4cGlyZXNBdD86IERhdGVcbik6IGJvb2xlYW4ge1xuICBjb25zdCBpbnN0YW50ID0gYXQgPz8gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0c0F0ICYmIGluc3RhbnQgPCBzdGFydHNBdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZXhwaXJlc0F0ICYmIGluc3RhbnQgPiBleHBpcmVzQXQpIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEFjY2Vzc0NvbnRleHQob3B0aW9uczoge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uczogRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90W107XG4gIGdyYW50czogR3JhbnRTbmFwc2hvdFtdO1xufSk6IEFjY2Vzc0NvbnRleHQge1xuICBjb25zdCBwZXJtaXNzaW9uc0J5U2NvcGU6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICBjb25zdCBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIG9wdGlvbnMucGVybWlzc2lvbnMpIHtcbiAgICBjb25zdCBrZXkgPSBzY29wZUtleShwZXJtaXNzaW9uLnNjb3BlS2luZCwgcGVybWlzc2lvbi5zY29wZUlkKTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA9IHBlcm1pc3Npb25zQnlTY29wZVtrZXldID8/IFtdO1xuICAgIHBlcm1pc3Npb25zQnlTY29wZVtrZXldLnB1c2gocGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5KTtcbiAgICBpZiAocGVybWlzc2lvbi5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0KSB7XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldID1cbiAgICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0ucHVzaChcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUlkXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGVuYW50SWQ6IG9wdGlvbnMudGVuYW50SWQsXG4gICAgcHJpbmNpcGFsSWQ6IG9wdGlvbnMucHJpbmNpcGFsSWQsXG4gICAgcGVybWlzc2lvbnNCeVNjb3BlLFxuICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uLFxuICAgIHJlc291cmNlR3JhbnRzOiBvcHRpb25zLmdyYW50cy5tYXAoKGdyYW50KSA9PiAoe1xuICAgICAgcmVzb3VyY2VJZDogZ3JhbnQucmVzb3VyY2VJZCxcbiAgICAgIHBlcm1pc3Npb25LZXk6IGdyYW50LnBlcm1pc3Npb25LZXksXG4gICAgfSkpLFxuICB9O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU1vZGVsU2VydmljZTxcbiAgTSBleHRlbmRzIE1vZGVsPGJvb2xlYW4+ICYgeyBpZDogc3RyaW5nIH0sXG4+IGV4dGVuZHMgTW9kZWxTZXJ2aWNlPE0sIFJlcG9zaXRvcnk8TSwgYW55Pj4ge1xuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoY2xheno6IG5ldyAoKSA9PiBNKSB7XG4gICAgc3VwZXIoY2xhenopO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld01vZGVsPFQ+KGNsYXp6OiBuZXcgKCkgPT4gVCwgZGF0YTogUGFydGlhbDxUPik6IFQge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBjbGF6eigpIGFzIG9iamVjdCwgZGF0YSBhcyBvYmplY3QpIGFzIFQ7XG4gIH1cblxuICBhc3luYyBjcmVhdGUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9IGFzIE0sIGRhdGEgYXMgb2JqZWN0KSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVPbmUoZGF0YTogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoZGF0YSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBnZXRCeUlkKGlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU9uZShpZDogc3RyaW5nLCBwYXRjaDogUGFydGlhbDxNPiwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE0+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMucmVwby5yZWFkKGlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5yZXBvLnVwZGF0ZShPYmplY3QuYXNzaWduKGV4aXN0aW5nLCBwYXRjaCksIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlQnlJZChpZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMucmVwby5kZWxldGUoaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5maW5kT25lQnkoa2V5LCB2YWx1ZSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBmaW5kTWFueUJ5PEsgZXh0ZW5kcyBrZXlvZiBNICYgc3RyaW5nPihcbiAgICBrZXk6IEssXG4gICAgdmFsdWU6IE1bS10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxNW10+IHtcbiAgICByZXR1cm4gdGhpcy5yZXBvXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZSh7IFtrZXldOiB2YWx1ZSB9IGFzIGFueSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEFsbCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5zZWxlY3QoKS5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZCgpOiBzdHJpbmcge1xuICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbGF0aW9uSWQodmFsdWU6IHN0cmluZyB8IHsgaWQ6IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWUuaWQ7XG59XG5cbmV4cG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBdXRob3JpemF0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSBhcyBuZXZlcik7XG4gIH1cbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFVzZXIsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdXNlclwiKVxuICBAcmVxdWlyZWQoKVxuICB1c2VyITogVXNlciB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMpIEBjb2x1bW4oKSBzdGF0dXMhOiBNZW1iZXJzaGlwU3RhdHVzO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuQHRhYmxlKFwidXNlcnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVXNlciBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAdHlwZShTdHJpbmcpXG4gIEBjb2x1bW4oKVxuICBlbWFpbD86IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgcGhvbmU/OiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZGlzcGxheU5hbWUhOiBzdHJpbmc7XG5cbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICB0ZW5hbnRNZW1iZXJzaGlwcz86IFRlbmFudE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpXG4gIG9yZ1VuaXRNZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAY3JlYXRlZEF0KClcbiAgY3JlYXRlZEF0ITogRGF0ZTtcblxuICBAdXBkYXRlZEF0KClcbiAgdXBkYXRlZEF0ITogRGF0ZTtcblxuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCIuL3VzZXIubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9jbG9zdXJlXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRDbG9zdXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2FuY2VzdG9yXCIpXG4gIEByZXF1aXJlZCgpXG4gIGFuY2VzdG9yITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX2Nsb3N1cmVfZGVzY2VuZGFudFwiKVxuICBAcmVxdWlyZWQoKVxuICBkZXNjZW5kYW50ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihOdW1iZXIpIEBjb2x1bW4oKSBkZXB0aCE6IG51bWJlcjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1bmlxdWUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5AdGFibGUoXCJwZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAdW5pcXVlKCkgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMpIEBjb2x1bW4oKSBjYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlUGVybWlzc2lvbiwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZVBlcm1pc3Npb25zPzogUm9sZVBlcm1pc3Npb25bXSB8IHN0cmluZ1tdO1xufVxuIiwiaW1wb3J0IHsgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4vcm9sZS5tb2RlbFwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuL3Blcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFBlcm1pc3Npb24sIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX3Blcm1pc3Npb25zX3Blcm1pc3Npb25cIilcbiAgQHJlcXVpcmVkKClcbiAgcGVybWlzc2lvbiE6IFBlcm1pc3Npb24gfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJvbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlc190ZW5hbnRcIilcbiAgdGVuYW50PzogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGtleSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBuYW1lITogc3RyaW5nO1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBTY29wZUtpbmQsIFNjb3BlS2luZE9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcblxuQHRhYmxlKFwicm9sZV9hc3NpZ25tZW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlQXNzaWdubWVudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFJvbGUsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yb2xlX2Fzc2lnbm1lbnRzX3JvbGVcIilcbiAgQHJlcXVpcmVkKClcbiAgcm9sZSE6IFJvbGUgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihCb29sZWFuKSBAY29sdW1uKCkgaW5oZXJpdERvd24hOiBib29sZWFuO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5AdGFibGUoXCJyZXNvdXJjZV9ncmFudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VHcmFudCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19yZXNvdXJjZVwiKVxuICBAcmVxdWlyZWQoKVxuICByZXNvdXJjZSE6IFByb3RlY3RlZFJlc291cmNlIHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Jlc291cmNlX2dyYW50c19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEBjb2x1bW4oKSBzdGFydHNBdD86IERhdGU7XG4gIEBjb2x1bW4oKSBleHBpcmVzQXQ/OiBEYXRlO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmRpdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfY3JlYXRlZF9ieVwiKVxuICBjcmVhdGVkQnk/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQsIFByaW5jaXBhbEtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJwcmluY2lwYWxzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFByaW5jaXBhbCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcmluY2lwYWxzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFByaW5jaXBhbEtpbmRPcHRpb25zKSBAY29sdW1uKCkga2luZCE6IFByaW5jaXBhbEtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc3ViamVjdElkITogc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVBc3NpZ25tZW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlQXNzaWdubWVudHM/OiBSb2xlQXNzaWdubWVudFtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUmVzb3VyY2VHcmFudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VHcmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX05VTExJRlksIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5LCBSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJvdGVjdGVkX3Jlc291cmNlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVzb3VyY2VUeXBlITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMpIEBjb2x1bW4oKSB2aXNpYmlsaXR5ITogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc19vd25lclwiKVxuICBvd25lcj86IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGdyYW50cz86IFJlc291cmNlR3JhbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9OVUxMSUZZIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJpbmhlcml0YW5jZV9ibG9ja3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9jayBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19ibG9ja2VkX2FuY2VzdG9yXCIpXG4gIGJsb2NrZWRGcm9tQW5jZXN0b3I/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgcGVybWlzc2lvbkNhdGVnb3J5ITogUGVybWlzc2lvbkNhdGVnb3J5O1xuICBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlYXNvbj86IHN0cmluZztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2sgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfdW5pdHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3BhcmVudFwiKVxuICBwYXJlbnQ/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGNoaWxkcmVuPzogT3JnVW5pdFtdIHwgc3RyaW5nW107XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwYXRoITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzogT3JnVW5pdE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFByb3RlY3RlZFJlc291cmNlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByZXNvdXJjZXM/OiBQcm90ZWN0ZWRSZXNvdXJjZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gSW5oZXJpdGFuY2VCbG9jaywgUkVMX1JFU1RSSUNULCBmYWxzZSkgaW5oZXJpdGFuY2VCbG9ja3M/OiBJbmhlcml0YW5jZUJsb2NrW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgYW5jZXN0b3JMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0Q2xvc3VyZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgZGVzY2VuZGFudExpbmtzPzogT3JnVW5pdENsb3N1cmVbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zLCBTdG9yYWdlS2luZCwgU3RvcmFnZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJzdG9yYWdlX2JpbmRpbmdzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VCaW5kaW5nIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3N0b3JhZ2VfYmluZGluZ3NfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc3RvcmFnZUtpbmQhOiBTdG9yYWdlS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucykgQGNvbHVtbigpIGJpbmRpbmdLaW5kITogU3RvcmFnZUJpbmRpbmdLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIGJpbmRpbmdLZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcmVnaW9uITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQge1xuICBjb2x1bW4sXG4gIGNyZWF0ZWRBdCxcbiAgb25lVG9NYW55LFxuICBwayxcbiAgdGFibGUsXG4gIHVuaXF1ZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxufSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIG1vZGVsLFxuICBvcHRpb24sXG4gIHJlcXVpcmVkLFxuICB0eXBlIGFzIHR5cGVPZixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgSXNvbGF0aW9uVGllciwgSXNvbGF0aW9uVGllck9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi9zdG9yYWdlLWJpbmRpbmcubW9kZWxcIjtcblxuQHRhYmxlKFwidGVuYW50c1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEB1bmlxdWUoKSBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNsdWchOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKClcbiAgQHR5cGVPZihTdHJpbmcpXG4gIEBvcHRpb24oSXNvbGF0aW9uVGllck9wdGlvbnMpXG4gIEBjb2x1bW4oKVxuICBpc29sYXRpb25UaWVyITogSXNvbGF0aW9uVGllcjtcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBvcmdVbml0cz86XG4gICAgfCBPcmdVbml0W11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFRlbmFudE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnNoaXBzPzpcbiAgICB8IFRlbmFudE1lbWJlcnNoaXBbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBwcmluY2lwYWxzPzpcbiAgICB8IFByaW5jaXBhbFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBTdG9yYWdlQmluZGluZywgUkVMX1JFU1RSSUNULCBmYWxzZSkgc3RvcmFnZUJpbmRpbmdzPzpcbiAgICB8IFN0b3JhZ2VCaW5kaW5nW11cbiAgICB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBUZW5hbnRQcm9maWxlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3RlbmFudF9wcm9maWxlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHByb2ZpbGVLZXkhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuXG5AdGFibGUoXCJvcmdfdW5pdF9wcm9maWxlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRfcHJvZmlsZXNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcHJvZmlsZUtleSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi9ncm91cC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3VwX21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEdyb3VwTWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IEdyb3VwLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfZ3JvdXBcIilcbiAgQHJlcXVpcmVkKClcbiAgZ3JvdXAhOiBHcm91cCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cF9tZW1iZXJzaGlwc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgb25lVG9NYW55LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9ncm91cC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcImdyb3Vwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBHcm91cCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19ncm91cHNfb3JnX3VuaXRcIilcbiAgb3JnVW5pdD86IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IEdyb3VwTWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgbWVtYmVycz86IEdyb3VwTWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsIH0gZnJvbSBcIi4vcHJpbmNpcGFsLm1vZGVsXCI7XG5cbkB0YWJsZShcImVmZmVjdGl2ZV9wZXJtaXNzaW9uc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2VmZmVjdGl2ZV9wZXJtaXNzaW9uc19wcmluY2lwYWxcIilcbiAgQHJlcXVpcmVkKClcbiAgcHJpbmNpcGFsITogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHBlcm1pc3Npb25LZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFNjb3BlS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBzY29wZUtpbmQhOiBTY29wZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2NvcGVJZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzb3VyY2VLaW5kITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNvdXJjZUlkITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBUZW5hbnRQcm9maWxlIH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBwcm9maWxlS2V5LFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JUZW5hbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudFByb2ZpbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByb2ZpbGUpID0+XG4gICAgICBzYW1lVGVuYW50KHByb2ZpbGUudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yVGVuYW50KHRlbmFudElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtcHJvZmlsZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0UHJvZmlsZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0UHJvZmlsZSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9maWxlKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yT3JnVW5pdChcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PlxuICAgICAgcmVsYXRpb25NYXRjaChwcm9maWxlLm9yZ1VuaXQsIG9yZ1VuaXRJZClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBCYXNlTW9kZWxTZXJ2aWNlLFxuICByZWxhdGlvbklkLFxuICByZWxhdGlvbk1hdGNoLFxuICBzYW1lVGVuYW50LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRDbG9zdXJlKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3RvcnMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5kZXNjZW5kYW50LCBvcmdVbml0SWQpXG4gICAgICApXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQuZGVwdGggLSByaWdodC5kZXB0aCk7XG4gIH1cblxuICBhc3luYyBsaXN0RGVzY2VuZGFudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgIChyb3cpID0+XG4gICAgICAgICAgc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKHJvdy5hbmNlc3Rvciwgb3JnVW5pdElkKVxuICAgICAgKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgaXNBbmNlc3Rvck9mKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBkZXNjZW5kYW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGF3YWl0IHRoaXMubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgZGVzY2VuZGFudE9yZ1VuaXRJZCwgLi4uYXJncylcbiAgICApLnNvbWUoKHJvdykgPT4gcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVTZWxmTGluayhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdENsb3N1cmU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGFuY2VzdG9yOiBvcmdVbml0SWQsXG4gICAgICAgIGRlc2NlbmRhbnQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgZGVwdGg6IDAsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjaGlsZE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFuY2VzdG9yTGlua3MgPSBhd2FpdCB0aGlzLmxpc3RBbmNlc3RvcnMoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHBhcmVudE9yZ1VuaXRJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGZvciAoY29uc3QgbGluayBvZiBhbmNlc3RvckxpbmtzKSB7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgICAgYW5jZXN0b3I6IGxpbmsuYW5jZXN0b3IsXG4gICAgICAgICAgZGVzY2VuZGFudDogY2hpbGRPcmdVbml0SWQsXG4gICAgICAgICAgZGVwdGg6IGxpbmsuZGVwdGggKyAxLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUxpbmtzRm9yU3VidHJlZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHN1YnRyZWUgPSBhd2FpdCB0aGlzLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChbXG4gICAgICBvcmdVbml0SWQsXG4gICAgICAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSksXG4gICAgXSk7XG4gICAgY29uc3QgYW5jZXN0b3JJZHMgPSBuZXcgU2V0KFtcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIC4uLnN1YnRyZWUubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSksXG4gICAgXSk7XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChyb3cpID0+XG4gICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIChkZXNjZW5kYW50SWRzLmhhcyhyZWxhdGlvbklkKHJvdy5kZXNjZW5kYW50KSkgfHxcbiAgICAgICAgICBhbmNlc3Rvcklkcy5oYXMocmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSlcbiAgICApO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4uL21vZGVscy9pbmhlcml0YW5jZS1ibG9jay5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoSW5oZXJpdGFuY2VCbG9jayk7XG4gIH1cblxuICBhc3luYyBibG9ja0NhdGVnb3J5KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbkNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgYmxvY2tlZEZyb21BbmNlc3RvcklkPzogc3RyaW5nLFxuICAgIHJlYXNvbj86IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2s+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgYmxvY2tlZEZyb21BbmNlc3RvcjogYmxvY2tlZEZyb21BbmNlc3RvcklkLFxuICAgICAgICBwZXJtaXNzaW9uQ2F0ZWdvcnksXG4gICAgICAgIHJlYXNvbixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVuYmxvY2tDYXRlZ29yeShibG9ja0lkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGJsb2NrSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvck9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEluaGVyaXRhbmNlQmxvY2tbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoYmxvY2spID0+XG4gICAgICAgIHNhbWVUZW5hbnQoYmxvY2sudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChibG9jay5vcmdVbml0LCBvcmdVbml0SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgYW5jZXN0b3JPcmdVbml0SWQ6IHN0cmluZyxcbiAgICBjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0Rm9yT3JnVW5pdCh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChibG9jaykgPT5cbiAgICAgICAgYmxvY2sucGVybWlzc2lvbkNhdGVnb3J5ID09PSBjYXRlZ29yeSAmJlxuICAgICAgICAoIWJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IgfHxcbiAgICAgICAgICByZWxhdGlvbk1hdGNoKGJsb2NrLmJsb2NrZWRGcm9tQW5jZXN0b3IsIGFuY2VzdG9yT3JnVW5pdElkKSlcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBJc29sYXRpb25UaWVyLCBDcmVhdGVUZW5hbnRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4uL21vZGVscy90ZW5hbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFRlbmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnQpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVGVuYW50KGlucHV0OiBDcmVhdGVUZW5hbnRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgc2x1ZzogaW5wdXQuc2x1ZyxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgaXNvbGF0aW9uVGllcjogaW5wdXQuaXNvbGF0aW9uVGllciA/PyBJc29sYXRpb25UaWVyLlBvb2xlZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5U2x1ZyhzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kT25lQnkoXCJzbHVnXCIsIHNsdWcgYXMgbmV2ZXIsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgY2hhbmdlU2x1Zyh0ZW5hbnRJZDogc3RyaW5nLCBzbHVnOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgc2x1ZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldElzb2xhdGlvblRpZXIoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBpc29sYXRpb25UaWVyOiBJc29sYXRpb25UaWVyLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IGlzb2xhdGlvblRpZXIgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBkZWxldGVUZW5hbnRDb250cm9sbGVkKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHRlbmFudElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgbG93ZXJTbHVnLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IENyZWF0ZU9yZ1VuaXRJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgT3JnVW5pdCB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIH0gZnJvbSBcIi4vb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVJvd3NCeUlkKFxuICBzZXJ2aWNlOiBCYXNlTW9kZWxTZXJ2aWNlPGFueT4sXG4gIHJvd3M6IEFycmF5PHsgaWQ6IHN0cmluZyB9PixcbiAgLi4uYXJnczogYW55W11cbik6IFByb21pc2U8dm9pZD4ge1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgYXdhaXQgc2VydmljZS5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcmdVbml0UGF0aChwYXJlbnRQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc2VnbWVudCA9IGxvd2VyU2x1ZyhuYW1lKTtcbiAgICByZXR1cm4gcGFyZW50UGF0aCA/IGAke3BhcmVudFBhdGgucmVwbGFjZSgvXFwvKyQvLCBcIlwiKX0vJHtzZWdtZW50fWAgOiBgLyR7c2VnbWVudH1gO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVQcm9maWxlSWZOZWVkZWQoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcHJvZmlsZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIHByb2ZpbGVNZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFwcm9maWxlS2V5KSByZXR1cm47XG4gICAgYXdhaXQgbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpLmNyZWF0ZVByb2ZpbGUob3JnVW5pdElkLCBwcm9maWxlS2V5LCBwcm9maWxlTWV0YWRhdGEsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVSb290KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJvZmlsZUtleT86IHN0cmluZyxcbiAgICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBvcmdVbml0ID0gYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgodW5kZWZpbmVkLCBuYW1lKSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgcHJvZmlsZUtleSwgcHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkuY3JlYXRlU2VsZkxpbmsodGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBvcmdVbml0O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjcmVhdGVDaGlsZChpbnB1dDogQ3JlYXRlT3JnVW5pdElucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdD4ge1xuICAgIGNvbnN0IHBhcmVudCA9IGlucHV0LnBhcmVudE9yZ1VuaXRJZCA/IGF3YWl0IHRoaXMuZ2V0QnlJZChpbnB1dC5wYXJlbnRPcmdVbml0SWQsIC4uLmFyZ3MpIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yZ1VuaXQgPSBhd2FpdCB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcGFyZW50OiBwYXJlbnQ/LmlkID8/IGlucHV0LnBhcmVudE9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZTogaW5wdXQubmFtZSxcbiAgICAgICAgcGF0aDogdGhpcy5vcmdVbml0UGF0aChwYXJlbnQ/LnBhdGgsIGlucHV0Lm5hbWUpLFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5jcmVhdGVQcm9maWxlSWZOZWVkZWQob3JnVW5pdC5pZCwgaW5wdXQucHJvZmlsZUtleSwgaW5wdXQucHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5jcmVhdGVTZWxmTGluayhpbnB1dC50ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgaWYgKGlucHV0LnBhcmVudE9yZ1VuaXRJZCkge1xuICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucGFyZW50T3JnVW5pdElkLFxuICAgICAgICBvcmdVbml0LmlkLFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gb3JnVW5pdDtcbiAgfVxuXG4gIGFzeW5jIGxpc3RDaGlsZHJlbihwYXJlbnRPcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+IHJlbGF0aW9uTWF0Y2gob3JnVW5pdC5wYXJlbnQsIHBhcmVudE9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBzYW1lVGVuYW50KG9yZ1VuaXQudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRPcmdVbml0cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGluY2x1ZGVTZWxmID0gZmFsc2UsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgaWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbmNlc3Rvck9yZ1VuaXRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgaW5jbHVkZVNlbGYgPSBmYWxzZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRbXT4ge1xuICAgIGNvbnN0IGFuY2VzdG9ycyA9IGF3YWl0IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKS5saXN0QW5jZXN0b3JzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoYW5jZXN0b3JzLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpKTtcbiAgICBpZiAoaW5jbHVkZVNlbGYpIGlkcy5hZGQob3JnVW5pdElkKTtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiBpZHMuaGFzKG9yZ1VuaXQuaWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZU9yZ1VuaXQob3JnVW5pdElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHsgbmFtZSwgcGF0aDogdGhpcy5vcmdVbml0UGF0aChleGlzdGluZy5wYXRoLmluY2x1ZGVzKFwiL1wiKSA/IGV4aXN0aW5nLnBhdGgucmVwbGFjZSgvXFwvW14vXSskLywgXCJcIikgOiB1bmRlZmluZWQsIG5hbWUpIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgbW92ZU9yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBuZXdQYXJlbnRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBuZXdQYXJlbnQgPSBhd2FpdCB0aGlzLmdldEJ5SWQobmV3UGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZ2V0QnlJZChvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCB0aGlzLnVwZGF0ZU9uZShcbiAgICAgIG9yZ1VuaXRJZCxcbiAgICAgIHtcbiAgICAgICAgcGFyZW50OiBuZXdQYXJlbnQuaWQsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgobmV3UGFyZW50LnBhdGgsIGV4aXN0aW5nLm5hbWUpLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucmVidWlsZFRlbmFudENsb3N1cmUodGVuYW50SWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB1cGRhdGVkO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkVGVuYW50Q2xvc3VyZSh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGV4aXN0aW5nTGlua3MgPSBhd2FpdCBjbG9zdXJlU2VydmljZS5saXN0QWxsKC4uLmFyZ3MpO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKFxuICAgICAgY2xvc3VyZVNlcnZpY2UsXG4gICAgICBleGlzdGluZ0xpbmtzLmZpbHRlcigocm93KSA9PiBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSksXG4gICAgICAuLi5hcmdzXG4gICAgKTtcblxuICAgIGNvbnN0IG9yZ1VuaXRzID0gKGF3YWl0IHRoaXMubGlzdFRlbmFudE9yZ1VuaXRzKHRlbmFudElkLCAuLi5hcmdzKSkuc29ydCgobGVmdCwgcmlnaHQpID0+IHtcbiAgICAgIGNvbnN0IGxlZnREZXB0aCA9IGxlZnQucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIGNvbnN0IHJpZ2h0RGVwdGggPSByaWdodC5wYXRoLnNwbGl0KFwiL1wiKS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoO1xuICAgICAgcmV0dXJuIGxlZnREZXB0aCAtIHJpZ2h0RGVwdGg7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IG9yZ1VuaXQgb2Ygb3JnVW5pdHMpIHtcbiAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmNyZWF0ZVNlbGZMaW5rKHRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICAgIGlmIChvcmdVbml0LnBhcmVudCkge1xuICAgICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5pbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQoXG4gICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgcmVsYXRpb25JZChvcmdVbml0LnBhcmVudCksXG4gICAgICAgICAgb3JnVW5pdC5pZCxcbiAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBkZWxldGVPcmdVbml0VHJlZSh0ZW5hbnRJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IHRoaXMubGlzdERlc2NlbmRhbnRPcmdVbml0cyh0ZW5hbnRJZCwgb3JnVW5pdElkLCB0cnVlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBkZXNjZW5kYW50SWRzID0gbmV3IFNldChkZXNjZW5kYW50cy5tYXAoKG9yZ1VuaXQpID0+IG9yZ1VuaXQuaWQpKTtcbiAgICBjb25zdCBvcmdVbml0cyA9IChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT5cbiAgICAgIGRlc2NlbmRhbnRJZHMuaGFzKG9yZ1VuaXQuaWQpXG4gICAgKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZCh0aGlzLCBvcmdVbml0cywgLi4uYXJncyk7XG4gICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuZGVsZXRlTGlua3NGb3JTdWJ0cmVlKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVVc2VySW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi4vbW9kZWxzL3VzZXIubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFVzZXJTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxVc2VyPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFVzZXIpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlVXNlcihpbnB1dDogQ3JlYXRlVXNlcklucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgZW1haWw6IGlucHV0LmVtYWlsLFxuICAgICAgICBwaG9uZTogaW5wdXQucGhvbmUsXG4gICAgICAgIGRpc3BsYXlOYW1lOiBpbnB1dC5kaXNwbGF5TmFtZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEJ5RW1haWwoZW1haWw6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgodXNlcikgPT4gdXNlci5lbWFpbCA9PT0gZW1haWwpIGFzIFVzZXI7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEaXNwbGF5TmFtZSh1c2VySWQ6IHN0cmluZywgZGlzcGxheU5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IGRpc3BsYXlOYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRW1haWwodXNlcklkOiBzdHJpbmcsIGVtYWlsOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBlbWFpbCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVBob25lKHVzZXJJZDogc3RyaW5nLCBwaG9uZTogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgcGhvbmUgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFByaW5jaXBhbEtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuLi9tb2RlbHMvcHJpbmNpcGFsLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcmluY2lwYWxTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcmluY2lwYWw+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUHJpbmNpcGFsKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByaW5jaXBhbChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGtpbmQsXG4gICAgICAgIHN1YmplY3RJZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldEZvclN1YmplY3QoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAocHJpbmNpcGFsKSA9PlxuICAgICAgICBzYW1lVGVuYW50KHByaW5jaXBhbC50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICBwcmluY2lwYWwua2luZCA9PT0ga2luZCAmJlxuICAgICAgICBwcmluY2lwYWwuc3ViamVjdElkID09PSBzdWJqZWN0SWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5nZXRGb3JTdWJqZWN0KHRlbmFudElkLCBraW5kLCBzdWJqZWN0SWQsIC4uLmFyZ3MpKSA/PyAoYXdhaXQgdGhpcy5jcmVhdGVQcmluY2lwYWwodGVuYW50SWQsIGtpbmQsIHN1YmplY3RJZCwgLi4uYXJncykpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VXNlclByaW5jaXBhbCh0ZW5hbnRJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRm9yU3ViamVjdCh0ZW5hbnRJZCwgUHJpbmNpcGFsS2luZC5Vc2VyLCB1c2VySWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgZ3JvdXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JDcmVhdGVGb3JTdWJqZWN0KHRlbmFudElkLCBQcmluY2lwYWxLaW5kLkdyb3VwLCBncm91cElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50LW1lbWJlcnNoaXAubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkVXNlclRvVGVuYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzID0gTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN0YXR1cyhtZW1iZXJzaGlwSWQ6IHN0cmluZywgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJUZW5hbnRzKHVzZXJJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnVzZXIsIHVzZXJJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFVzZXJzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiBzYW1lVGVuYW50KG1lbWJlcnNoaXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlVXNlckZyb21UZW5hbnQobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKE9yZ1VuaXRNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFVzZXJUb09yZ1VuaXQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMgPSBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIHVzZXI6IHVzZXJJZCxcbiAgICAgICAgc3RhdHVzLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0U3RhdHVzKG1lbWJlcnNoaXBJZDogc3RyaW5nLCBzdGF0dXM6IE1lbWJlcnNoaXBTdGF0dXMsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShtZW1iZXJzaGlwSWQsIHsgc3RhdHVzIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFVzZXJPcmdVbml0cyh1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAudXNlciwgdXNlcklkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFVzZXJzKG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVVzZXJGcm9tT3JnVW5pdChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JvdXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBHcm91cFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEdyb3VwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUdyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZD86IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIG9yZ1VuaXQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZW5hbWVHcm91cChncm91cElkOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGdyb3VwSWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVHcm91cFRvT3JnVW5pdChncm91cElkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoZ3JvdXBJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50R3JvdXBzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoZ3JvdXApID0+IHNhbWVUZW5hbnQoZ3JvdXAudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8R3JvdXBNZW1iZXJzaGlwPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEdyb3VwTWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRQcmluY2lwYWxUb0dyb3VwKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgZ3JvdXBJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgZ3JvdXA6IGdyb3VwSWQsXG4gICAgICAgIHByaW5jaXBhbDogcHJpbmNpcGFsSWQsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEdyb3VwTWVtYmVycyhncm91cElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC5ncm91cCwgZ3JvdXBJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAucHJpbmNpcGFsLCBwcmluY2lwYWxJZCkpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwKG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsKHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG1lbWJlcnNoaXBzID0gYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JvdXBzKHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBtZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgY29uc3QgdGVuYW50SWQgPSByZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KTtcbiAgICAgICAgY29uc3QgZ3JvdXBJZCA9IHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCk7XG4gICAgICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwodGVuYW50SWQsIGdyb3VwSWQsIC4uLmFyZ3MpO1xuICAgICAgICByZXR1cm4gcHJpbmNpcGFsLmlkO1xuICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiBwcmluY2lwYWxzO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIENyZWF0ZVBlcm1pc3Npb25JbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvcGVybWlzc2lvbi5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQZXJtaXNzaW9uKGlucHV0OiBDcmVhdGVQZXJtaXNzaW9uSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBrZXk6IGlucHV0LmtleSxcbiAgICAgICAgY2F0ZWdvcnk6IGlucHV0LmNhdGVnb3J5LFxuICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQuZGVzY3JpcHRpb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeUtleShrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5rZXkgPT09IGtleSkgYXMgUGVybWlzc2lvbjtcbiAgfVxuXG4gIGFzeW5jIGxpc3RCeUNhdGVnb3J5KGNhdGVnb3J5OiBQZXJtaXNzaW9uQ2F0ZWdvcnksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVEZXNjcmlwdGlvbihwZXJtaXNzaW9uSWQ6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocGVybWlzc2lvbklkLCB7IGRlc2NyaXB0aW9uIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVSb2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJvbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUm9sZShpbnB1dDogQ3JlYXRlUm9sZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAga2V5OiBpbnB1dC5rZXksXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBpbnB1dC5kZXNjcmlwdGlvbixcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0U3lzdGVtUm9sZUJ5S2V5KGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKChjYW5kaWRhdGUpID0+ICFjYW5kaWRhdGUudGVuYW50ICYmIGNhbmRpZGF0ZS5rZXkgPT09IGtleSk7XG4gICAgaWYgKCFyb2xlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFJvbGUgXCIke2tleX1cIiBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyBnZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgY29uc3Qgcm9sZSA9IChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoXG4gICAgICAoY2FuZGlkYXRlKSA9PiBzYW1lVGVuYW50KGNhbmRpZGF0ZS50ZW5hbnQsIHRlbmFudElkKSAmJiBjYW5kaWRhdGUua2V5ID09PSBrZXlcbiAgICApO1xuICAgIGlmICghcm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb2xlIFwiJHtrZXl9XCIgbm90IGZvdW5kIGZvciB0ZW5hbnQgJHt0ZW5hbnRJZH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBhc3luYyByZW5hbWVSb2xlKHJvbGVJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHJvbGVJZCwgeyBuYW1lIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlUm9sZU1ldGFkYXRhKFxuICAgIHJvbGVJZDogc3RyaW5nLFxuICAgIG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocm9sZUlkLCB7IG1ldGFkYXRhIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudFJvbGVzKHRlbmFudElkOiBzdHJpbmcsIGluY2x1ZGVTeXN0ZW0gPSBmYWxzZSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGUpID0+XG4gICAgICBpbmNsdWRlU3lzdGVtID8gIXJvbGUudGVuYW50IHx8IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKSA6IHNhbWVUZW5hbnQocm9sZS50ZW5hbnQsIHRlbmFudElkKVxuICAgICk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2ggfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSb3dzQnlJZChcbiAgc2VydmljZTogQmFzZU1vZGVsU2VydmljZTxhbnk+LFxuICByb3dzOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4sXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb2xlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJvbGVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHJvbGU6IHJvbGVJZCxcbiAgICAgICAgcGVybWlzc2lvbjogcGVybWlzc2lvbklkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlSWQ6IHN0cmluZywgcGVybWlzc2lvbktleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb24+IHtcbiAgICBjb25zdCBwZXJtaXNzaW9uID0gYXdhaXQgbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCkuZ2V0QnlLZXkocGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuYWRkUGVybWlzc2lvblRvUm9sZShyb2xlSWQsIHBlcm1pc3Npb24uaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlUGVybWlzc2lvbkZyb21Sb2xlKHJvbGVQZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm9sZVBlcm1pc3Npb25JZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHJvbGVQZXJtaXNzaW9uKSA9PiByZWxhdGlvbk1hdGNoKHJvbGVQZXJtaXNzaW9uLnJvbGUsIHJvbGVJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFBlcm1pc3Npb25Sb2xlcyhwZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uLCBwZXJtaXNzaW9uSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VSb2xlUGVybWlzc2lvbnMocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25JZHM6IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZVBlcm1pc3Npb25bXT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5saXN0Um9sZVBlcm1pc3Npb25zKHJvbGVJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgZXhpc3RpbmcsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChwZXJtaXNzaW9uSWRzLm1hcCgocGVybWlzc2lvbklkKSA9PiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uSWQsIC4uLmFyZ3MpKSk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zKFxuICAgIGlucHV0OiBpbXBvcnQoXCIuLi90eXBlc1wiKS5DcmVhdGVSb2xlSW5wdXQsXG4gICAgcGVybWlzc2lvbktleXM6IHN0cmluZ1tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vbW9kZWxzL3JvbGUubW9kZWxcIikuUm9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCBuZXcgUm9sZVNlcnZpY2UoKS5jcmVhdGVSb2xlKGlucHV0LCAuLi5hcmdzKTtcbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2YgcGVybWlzc2lvbktleXMpIHtcbiAgICAgIGF3YWl0IHRoaXMuYWRkUGVybWlzc2lvbktleVRvUm9sZShyb2xlLmlkLCBwZXJtaXNzaW9uS2V5LCAuLi5hcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFzc2lnblJvbGVJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlQXNzaWdubWVudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlQXNzaWdubWVudCk7XG4gIH1cblxuICBhc3luYyBhc3NpZ25Sb2xlKFxuICAgIGlucHV0OiBBc3NpZ25Sb2xlSW5wdXQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsOiBpbnB1dC5wcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZTogaW5wdXQucm9sZUlkLFxuICAgICAgICBzY29wZUtpbmQ6IGlucHV0LnNjb3BlS2luZCxcbiAgICAgICAgc2NvcGVJZDogaW5wdXQuc2NvcGVJZCxcbiAgICAgICAgaW5oZXJpdERvd246IGlucHV0LmluaGVyaXREb3duID8/IGZhbHNlLFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlQXNzaWdubWVudChhc3NpZ25tZW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQoYXNzaWdubWVudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChhc3NpZ25tZW50KSA9PlxuICAgICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcmVsYXRpb25NYXRjaChhc3NpZ25tZW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSb2xlQXNzaWdubWVudHMoXG4gICAgcm9sZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigoYXNzaWdubWVudCkgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2goYXNzaWdubWVudC5yb2xlLCByb2xlSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRBc3NpZ25tZW50cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGFzc2lnbm1lbnQpID0+XG4gICAgICBzYW1lVGVuYW50KGFzc2lnbm1lbnQudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlQXNzaWdubWVudFdpbmRvdyhcbiAgICBhc3NpZ25tZW50SWQ6IHN0cmluZyxcbiAgICBzdGFydHNBdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgICBleHBpcmVzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlQXNzaWdubWVudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShhc3NpZ25tZW50SWQsIHsgc3RhcnRzQXQsIGV4cGlyZXNBdCB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCwgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNuYXBzaG90LCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vZ3JvdXAtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUuc2VydmljZVwiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UgfSBmcm9tIFwiLi9pbmhlcml0YW5jZS1ibG9jay5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8RWZmZWN0aXZlUGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihFZmZlY3RpdmVQZXJtaXNzaW9uKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2gocGVybWlzc2lvbi5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yU2NvcGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBzY29wZUtpbmQ6IFNjb3BlS2luZCxcbiAgICBzY29wZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZFxuICAgICk7XG4gIH1cblxuICBhc3luYyBoYXNQZXJtaXNzaW9uKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlS2luZCA9PT0gc2NvcGVLaW5kICYmXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVJZCA9PT0gc2NvcGVJZCAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uc3RhcnRzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghcGVybWlzc2lvbi5leHBpcmVzQXQgfHwgIWF0IHx8IHBlcm1pc3Npb24uZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yVGVuYW50KHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkpKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEVmZmVjdGl2ZVBlcm1pc3Npb25bXT4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG5cbiAgICBjb25zdCByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gICAgY29uc3Qgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFBlcm1pc3Npb25TZXJ2aWNlKCk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwU2VydmljZSA9IG5ldyBHcm91cE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gICAgY29uc3QgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gICAgY29uc3Qgb3JnVW5pdENsb3N1cmVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpO1xuICAgIGNvbnN0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlID0gbmV3IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlKCk7XG5cbiAgICBjb25zdCBtYXRlcmlhbGl6ZWQ6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdID0gW107XG4gICAgY29uc3Qgc291cmNlQXNzaWdubWVudHMgPSBhd2FpdCByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBNZW1iZXJzaGlwcyA9IGF3YWl0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UubGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZ3JvdXBBc3NpZ25tZW50cyA9IChcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBncm91cE1lbWJlcnNoaXBzLm1hcChhc3luYyAobWVtYmVyc2hpcCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGdyb3VwUHJpbmNpcGFsID0gYXdhaXQgcHJpbmNpcGFsU2VydmljZS5nZXRHcm91cFByaW5jaXBhbChyZWxhdGlvbklkKG1lbWJlcnNoaXAudGVuYW50KSwgcmVsYXRpb25JZChtZW1iZXJzaGlwLmdyb3VwKSwgLi4uYXJncyk7XG4gICAgICAgICAgcmV0dXJuIHJvbGVBc3NpZ25tZW50U2VydmljZS5saXN0UHJpbmNpcGFsQXNzaWdubWVudHModGVuYW50SWQsIGdyb3VwUHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApLmZsYXQoKTtcblxuICAgIGNvbnN0IGFzc2lnbm1lbnRzID0gWy4uLnNvdXJjZUFzc2lnbm1lbnRzLCAuLi5ncm91cEFzc2lnbm1lbnRzXTtcbiAgICBmb3IgKGNvbnN0IGFzc2lnbm1lbnQgb2YgYXNzaWdubWVudHMpIHtcbiAgICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9ucyA9IGF3YWl0IHJvbGVQZXJtaXNzaW9uU2VydmljZS5saXN0Um9sZVBlcm1pc3Npb25zKHJlbGF0aW9uSWQoYXNzaWdubWVudC5yb2xlKSwgLi4uYXJncyk7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICByb2xlUGVybWlzc2lvbnMubWFwKGFzeW5jIChyb2xlUGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uU2VydmljZS5maW5kT25lQnkoXCJpZFwiLCByZWxhdGlvbklkKHJvbGVQZXJtaXNzaW9uLnBlcm1pc3Npb24pIGFzIG5ldmVyLCAuLi5hcmdzKVxuICAgICAgICApXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHBlcm1pc3Npb25zKSB7XG4gICAgICAgIGlmICghcGVybWlzc2lvbikgY29udGludWU7XG4gICAgICAgIGNvbnN0IHNjb3BlS2luZCA9IGFzc2lnbm1lbnQuc2NvcGVLaW5kO1xuICAgICAgICBjb25zdCBzY29wZUlkID0gYXNzaWdubWVudC5zY29wZUlkO1xuICAgICAgICBjb25zdCBzY29wZXM6IEFycmF5PHsgc2NvcGVLaW5kOiBTY29wZUtpbmQ7IHNjb3BlSWQ6IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuVGVuYW50KSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHRlbmFudElkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlJlc291cmNlKSB7XG4gICAgICAgICAgc2NvcGVzLnB1c2goeyBzY29wZUtpbmQsIHNjb3BlSWQgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCAmJiAhYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgYXNzaWdubWVudC5pbmhlcml0RG93bikge1xuICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRzID0gYXdhaXQgb3JnVW5pdENsb3N1cmVTZXJ2aWNlLmxpc3REZXNjZW5kYW50cyh0ZW5hbnRJZCwgc2NvcGVJZCwgLi4uYXJncyk7XG4gICAgICAgICAgc2NvcGVzLnB1c2goLi4uZGVzY2VuZGFudHMubWFwKChyb3cpID0+ICh7IHNjb3BlS2luZCwgc2NvcGVJZDogcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkgfSkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3Qgc2NvcGVkIG9mIHNjb3Blcykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiZcbiAgICAgICAgICAgIGFzc2lnbm1lbnQuaW5oZXJpdERvd24gJiZcbiAgICAgICAgICAgIHNjb3BlZC5zY29wZUlkICE9PSBzY29wZUlkICYmXG4gICAgICAgICAgICAoYXdhaXQgaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UuY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IoXG4gICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgICAgc2NvcGVJZCxcbiAgICAgICAgICAgICAgcGVybWlzc2lvbi5jYXRlZ29yeSxcbiAgICAgICAgICAgICAgLi4uYXJnc1xuICAgICAgICAgICAgKSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtYXRlcmlhbGl6ZWQucHVzaCh7XG4gICAgICAgICAgICBpZDogXCJcIixcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAgICAgICBwZXJtaXNzaW9uS2V5OiBwZXJtaXNzaW9uLmtleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogc2NvcGVkLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHNjb3BlZC5zY29wZUlkLFxuICAgICAgICAgICAgc291cmNlS2luZDogXCJyb2xlX2Fzc2lnbm1lbnRcIixcbiAgICAgICAgICAgIHNvdXJjZUlkOiBhc3NpZ25tZW50LmlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IGFzc2lnbm1lbnQuc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IGFzc2lnbm1lbnQuZXhwaXJlc0F0LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWF0ZXJpYWxpemVkLm1hcCgocGVybWlzc2lvbikgPT5cbiAgICAgICAgdGhpcy5jcmVhdGUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGVuYW50OiBwZXJtaXNzaW9uLnRlbmFudElkLFxuICAgICAgICAgICAgcHJpbmNpcGFsOiBwZXJtaXNzaW9uLnByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5LFxuICAgICAgICAgICAgc2NvcGVLaW5kOiBwZXJtaXNzaW9uLnNjb3BlS2luZCxcbiAgICAgICAgICAgIHNjb3BlSWQ6IHBlcm1pc3Npb24uc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IHBlcm1pc3Npb24uc291cmNlS2luZCxcbiAgICAgICAgICAgIHNvdXJjZUlkOiBwZXJtaXNzaW9uLnNvdXJjZUlkLFxuICAgICAgICAgICAgc3RhcnRzQXQ6IHBlcm1pc3Npb24uc3RhcnRzQXQsXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHBlcm1pc3Npb24uZXhwaXJlc0F0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZEZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHByaW5jaXBhbHMgPSAoYXdhaXQgbmV3IFByaW5jaXBhbFNlcnZpY2UoKS5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKHByaW5jaXBhbCkgPT4gc2FtZVRlbmFudChwcmluY2lwYWwudGVuYW50LCB0ZW5hbnRJZCkpO1xuICAgIGZvciAoY29uc3QgcHJpbmNpcGFsIG9mIHByaW5jaXBhbHMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsLmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZSB9IGZyb20gXCIuLi9tb2RlbHMvcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByb3RlY3RlZFJlc291cmNlKTtcbiAgfVxuXG4gIGFzeW5jIHJlZ2lzdGVyUmVzb3VyY2UoaW5wdXQ6IFJlZ2lzdGVyUmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IGlucHV0LnRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBpbnB1dC5vcmdVbml0SWQsXG4gICAgICAgIHJlc291cmNlVHlwZTogaW5wdXQucmVzb3VyY2VUeXBlLFxuICAgICAgICByZXNvdXJjZUlkOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICB2aXNpYmlsaXR5OiBpbnB1dC52aXNpYmlsaXR5LFxuICAgICAgICBvd25lcjogaW5wdXQub3duZXJQcmluY2lwYWxJZCxcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGlucHV0LnNlbnNpdGl2aXR5LFxuICAgICAgICBtZXRhZGF0YTogaW5wdXQubWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeURvbWFpblJlc291cmNlKHRlbmFudElkOiBzdHJpbmcsIHJlc291cmNlVHlwZTogc3RyaW5nLCByZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZSB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKHJlc291cmNlKSA9PiBzYW1lVGVuYW50KHJlc291cmNlLnRlbmFudCwgdGVuYW50SWQpICYmIHJlc291cmNlLnJlc291cmNlVHlwZSA9PT0gcmVzb3VyY2VUeXBlICYmIHJlc291cmNlLnJlc291cmNlSWQgPT09IHJlc291cmNlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbW92ZVJlc291cmNlVG9PcmdVbml0KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG9yZ1VuaXQ6IG9yZ1VuaXRJZCB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFZpc2liaWxpdHkocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHksIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IHZpc2liaWxpdHkgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB0cmFuc2Zlck93bmVyc2hpcChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHByb3RlY3RlZFJlc291cmNlSWQsIHsgb3duZXI6IG93bmVyUHJpbmNpcGFsSWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0T3JnVW5pdFJlc291cmNlcyhvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gcmVsYXRpb25NYXRjaChyZXNvdXJjZS5vcmdVbml0LCBvcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRSZXNvdXJjZXModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByb3RlY3RlZFJlc291cmNlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyYW50UmVzb3VyY2VJbnB1dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuLi9tb2RlbHMvcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSZXNvdXJjZUdyYW50PiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFJlc291cmNlR3JhbnQpO1xuICB9XG5cbiAgYXN5bmMgZ3JhbnRSZXNvdXJjZShpbnB1dDogR3JhbnRSZXNvdXJjZUlucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgcmVzb3VyY2U6IGlucHV0LnJlc291cmNlSWQsXG4gICAgICAgIHByaW5jaXBhbDogaW5wdXQucHJpbmNpcGFsSWQsXG4gICAgICAgIHBlcm1pc3Npb25LZXk6IGlucHV0LnBlcm1pc3Npb25LZXksXG4gICAgICAgIHN0YXJ0c0F0OiBpbnB1dC5zdGFydHNBdCxcbiAgICAgICAgZXhwaXJlc0F0OiBpbnB1dC5leHBpcmVzQXQsXG4gICAgICAgIGNvbmRpdGlvbnM6IGlucHV0LmNvbmRpdGlvbnMsXG4gICAgICAgIGNyZWF0ZWRCeTogaW5wdXQuY3JlYXRlZEJ5UHJpbmNpcGFsSWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VHcmFudChncmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGdyYW50SWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJlc291cmNlR3JhbnRzKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGdyYW50KSA9PiByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PiBzYW1lVGVuYW50KGdyYW50LnRlbmFudCwgdGVuYW50SWQpICYmIHJlbGF0aW9uTWF0Y2goZ3JhbnQucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzR3JhbnQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgYXQ/OiBEYXRlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0UHJpbmNpcGFsR3JhbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIHJlbGF0aW9uTWF0Y2goZ3JhbnQucmVzb3VyY2UsIHByb3RlY3RlZFJlc291cmNlSWQpICYmXG4gICAgICAgIGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgKCFncmFudC5zdGFydHNBdCB8fCAhYXQgfHwgZ3JhbnQuc3RhcnRzQXQgPD0gYXQpICYmXG4gICAgICAgICghZ3JhbnQuZXhwaXJlc0F0IHx8ICFhdCB8fCBncmFudC5leHBpcmVzQXQgPj0gYXQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiBhd2FpdCB0aGlzLmxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkLCAuLi5hcmdzKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2Uuc2VydmljZVwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudFNlcnZpY2UgfSBmcm9tIFwiLi9yZXNvdXJjZS1ncmFudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZXNvdXJjZVZpc2liaWxpdHkgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFJlc291cmNlTGlmZWN5Y2xlU2VydmljZSB7XG4gIGFzeW5jIHVucmVnaXN0ZXJSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbmV3IFJlc291cmNlR3JhbnRTZXJ2aWNlKCkuZGVsZXRlQWxsRm9yUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmRlbGV0ZUJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlUmVzb3VyY2VTY29wZShcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICBvcmdVbml0SWQ6IHN0cmluZztcbiAgICB2aXNpYmlsaXR5OiBSZXNvdXJjZVZpc2liaWxpdHk7XG4gICAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgbmV3IFByb3RlY3RlZFJlc291cmNlU2VydmljZSgpLmdldEJ5SWQocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudElkOiByZWxhdGlvbklkKHJlc291cmNlLnRlbmFudCksXG4gICAgICBvcmdVbml0SWQ6IHJlbGF0aW9uSWQocmVzb3VyY2Uub3JnVW5pdCksXG4gICAgICB2aXNpYmlsaXR5OiByZXNvdXJjZS52aXNpYmlsaXR5LFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogcmVzb3VyY2Uub3duZXIgPyByZWxhdGlvbklkKHJlc291cmNlLm93bmVyKSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbklkIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCBTdG9yYWdlQmluZGluZ0tpbmQsIFN0b3JhZ2VLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTdG9yYWdlQmluZGluZyB9IGZyb20gXCIuLi9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZ1NlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFN0b3JhZ2VCaW5kaW5nKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZUJpbmRpbmcoaW5wdXQ6IENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgc3RvcmFnZUtpbmQ6IGlucHV0LnN0b3JhZ2VLaW5kLFxuICAgICAgICBiaW5kaW5nS2luZDogaW5wdXQuYmluZGluZ0tpbmQsXG4gICAgICAgIGJpbmRpbmdLZXk6IGlucHV0LmJpbmRpbmdLZXksXG4gICAgICAgIHJlZ2lvbjogaW5wdXQucmVnaW9uLFxuICAgICAgICBjb25maWc6IGlucHV0LmNvbmZpZyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmdbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGJpbmRpbmcpID0+IHJlbGF0aW9uSWQoYmluZGluZy50ZW5hbnQpID09PSB0ZW5hbnRJZCk7XG4gIH1cblxuICBhc3luYyBnZXRCaW5kaW5nKHRlbmFudElkOiBzdHJpbmcsIHN0b3JhZ2VLaW5kOiBTdG9yYWdlS2luZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRCaW5kaW5ncyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuc3RvcmFnZUtpbmQgPT09IHN0b3JhZ2VLaW5kKTtcbiAgfVxuXG4gIGFzeW5jIHNldEJpbmRpbmdDb25maWcoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBwcm9tb3RlVG9EZWRpY2F0ZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuRGVkaWNhdGVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHNldFNoYXJlZChcbiAgICBiaW5kaW5nSWQ6IHN0cmluZyxcbiAgICBiaW5kaW5nS2V5OiBzdHJpbmcsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgY29uZmlnPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgYmluZGluZ0tpbmQ6IFN0b3JhZ2VCaW5kaW5nS2luZC5TaGFyZWQsIGJpbmRpbmdLZXksIHJlZ2lvbiwgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyB0cmFuc2FjdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgdHlwZSB7IEJvb3RzdHJhcE9yZ1VuaXQsIEJvb3RzdHJhcFRlbXBsYXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzLCBTY29wZUtpbmQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0U2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRQcm9maWxlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgVXNlclNlcnZpY2UgfSBmcm9tIFwiLi91c2VyLnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudFNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLWFzc2lnbm1lbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9lZmZlY3RpdmUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5cbmV4cG9ydCBjbGFzcyBCb290c3RyYXBTZXJ2aWNlIHtcbiAgcHJpdmF0ZSB0ZW5hbnRTZXJ2aWNlID0gbmV3IFRlbmFudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB0ZW5hbnRQcm9maWxlU2VydmljZSA9IG5ldyBUZW5hbnRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRTZXJ2aWNlID0gbmV3IE9yZ1VuaXRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnVW5pdFByb2ZpbGVTZXJ2aWNlID0gbmV3IE9yZ1VuaXRQcm9maWxlU2VydmljZSgpO1xuICBwcml2YXRlIHVzZXJTZXJ2aWNlID0gbmV3IFVzZXJTZXJ2aWNlKCk7XG4gIHByaXZhdGUgbWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IFJvbGVQZXJtaXNzaW9uU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVBc3NpZ25tZW50U2VydmljZSA9IG5ldyBSb2xlQXNzaWdubWVudFNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSgpO1xuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgYm9vdHN0cmFwVGVuYW50RnJvbVRlbXBsYXRlKFxuICAgIHRlbXBsYXRlOiBCb290c3RyYXBUZW1wbGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHtcbiAgICB0ZW5hbnRJZDogc3RyaW5nO1xuICAgIHJvb3RPcmdVbml0SWQ6IHN0cmluZztcbiAgICBvd25lclVzZXJJZDogc3RyaW5nO1xuICAgIG93bmVyUHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IGF3YWl0IHRoaXMudGVuYW50U2VydmljZS5jcmVhdGVUZW5hbnQoXG4gICAgICB0ZW1wbGF0ZS50ZW5hbnQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBpZiAodGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXkpIHtcbiAgICAgIGF3YWl0IHRoaXMudGVuYW50UHJvZmlsZVNlcnZpY2UuY3JlYXRlUHJvZmlsZShcbiAgICAgICAgdGVuYW50LmlkLFxuICAgICAgICB0ZW1wbGF0ZS50ZW5hbnQucHJvZmlsZUtleSxcbiAgICAgICAgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVNZXRhZGF0YSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcmVhdGVPcmdUcmVlID0gYXN5bmMgKFxuICAgICAgcGFyZW50SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgIG9yZ1VuaXQ6IEJvb3RzdHJhcE9yZ1VuaXRcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IGNyZWF0ZWQgPVxuICAgICAgICBwYXJlbnRJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZVJvb3QoXG4gICAgICAgICAgICAgIHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgIG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMub3JnVW5pdFNlcnZpY2UuY3JlYXRlQ2hpbGQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudE9yZ1VuaXRJZDogcGFyZW50SWQsXG4gICAgICAgICAgICAgICAgbmFtZTogb3JnVW5pdC5uYW1lLFxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIHByb2ZpbGVLZXk6IG9yZ1VuaXQucHJvZmlsZUtleSxcbiAgICAgICAgICAgICAgICBwcm9maWxlTWV0YWRhdGE6IG9yZ1VuaXQubWV0YWRhdGEsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG9yZ1VuaXQuY2hpbGRyZW4gPz8gW10pIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlT3JnVHJlZShjcmVhdGVkLmlkLCBjaGlsZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY3JlYXRlZDtcbiAgICB9O1xuXG4gICAgY29uc3Qgcm9vdE9yZ1VuaXQgPSBhd2FpdCBjcmVhdGVPcmdUcmVlKHVuZGVmaW5lZCwgdGVtcGxhdGUucm9vdE9yZ1VuaXQpO1xuICAgIGNvbnN0IG93bmVyID0gYXdhaXQgdGhpcy51c2VyU2VydmljZS5jcmVhdGVVc2VyKFxuICAgICAgdGVtcGxhdGUub3duZXJVc2VyLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lci5pZCxcbiAgICAgIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3Qgb3duZXJQcmluY2lwYWwgPSBhd2FpdCB0aGlzLnByaW5jaXBhbFNlcnZpY2UuZ2V0VXNlclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb24gb2YgdGVtcGxhdGUucGVybWlzc2lvbnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucGVybWlzc2lvblNlcnZpY2UuY3JlYXRlUGVybWlzc2lvbihwZXJtaXNzaW9uLCAuLi5hcmdzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHRlbXBsYXRlLnJvbGVzKSB7XG4gICAgICBjb25zdCBjcmVhdGVkUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuY3JlYXRlUm9sZShcbiAgICAgICAge1xuICAgICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgICAga2V5OiByb2xlLmtleSxcbiAgICAgICAgICBuYW1lOiByb2xlLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHJvbGUuZGVzY3JpcHRpb24sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgICBmb3IgKGNvbnN0IHBlcm1pc3Npb25LZXkgb2Ygcm9sZS5wZXJtaXNzaW9uS2V5cykge1xuICAgICAgICBhd2FpdCB0aGlzLnJvbGVQZXJtaXNzaW9uU2VydmljZS5hZGRQZXJtaXNzaW9uS2V5VG9Sb2xlKFxuICAgICAgICAgIGNyZWF0ZWRSb2xlLmlkLFxuICAgICAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG93bmVyUm9sZSA9IGF3YWl0IHRoaXMucm9sZVNlcnZpY2UuZ2V0VGVuYW50Um9sZUJ5S2V5KFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgdGVtcGxhdGUub3duZXJSb2xlS2V5LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgcHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IG93bmVyUm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogcm9vdE9yZ1VuaXQuaWQsXG4gICAgICAgIGluaGVyaXREb3duOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbChcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIG93bmVyUHJpbmNpcGFsLmlkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgIHJvb3RPcmdVbml0SWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgb3duZXJVc2VySWQ6IG93bmVyLmlkLFxuICAgICAgb3duZXJQcmluY2lwYWxJZDogb3duZXJQcmluY2lwYWwuaWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlU2VydmljZSB9IGZyb20gXCIuL3JvbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgU3lzdGVtTWFuYWdlbWVudFNlcnZpY2Uge1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgb3JnTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZVNlcnZpY2UgPSBuZXcgUm9sZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIG9uYm9hcmRVc2VyVG9UZW5hbnRBbmRPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8eyBwcmluY2lwYWxJZDogc3RyaW5nIH0+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLmFkZFVzZXJUb1RlbmFudCh0ZW5hbnRJZCwgdXNlcklkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5vcmdNZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9PcmdVbml0KHRlbmFudElkLCBvcmdVbml0SWQsIHVzZXJJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHByaW5jaXBhbCA9IGF3YWl0IHRoaXMucHJpbmNpcGFsU2VydmljZS5nZXRVc2VyUHJpbmNpcGFsKHRlbmFudElkLCB1c2VySWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UuYXNzaWduUm9sZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBwcmluY2lwYWwuaWQsXG4gICAgICAgIHJvbGVJZDogcm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogb3JnVW5pdElkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHsgcHJpbmNpcGFsSWQ6IHByaW5jaXBhbC5pZCB9O1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBjaGFuZ2VVc2VyT3JnUm9sZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgcm9sZUtleTogc3RyaW5nLFxuICAgIGluaGVyaXREb3duOiBib29sZWFuLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleSh0ZW5hbnRJZCwgcm9sZUtleSwgLi4uYXJncyk7XG4gICAgY29uc3QgY3VycmVudEFzc2lnbm1lbnRzID0gYXdhaXQgdGhpcy5yb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGN1cnJlbnRBc3NpZ25tZW50cy5maWx0ZXIoKHJvdykgPT4gcm93LnNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgcm93LnNjb3BlSWQgPT09IG9yZ1VuaXRJZCkpIHtcbiAgICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLnJldm9rZUFzc2lnbm1lbnQoYXNzaWdubWVudC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWxJZCxcbiAgICAgICAgcm9sZUlkOiByb2xlLmlkLFxuICAgICAgICBzY29wZUtpbmQ6IFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICBzY29wZUlkOiBvcmdVbml0SWQsXG4gICAgICAgIGluaGVyaXREb3duLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBzdXNwZW5kVXNlckluVGVuYW50KHRlbmFudE1lbWJlcnNoaXBJZDogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2Uuc2V0U3RhdHVzKHRlbmFudE1lbWJlcnNoaXBJZCwgTWVtYmVyc2hpcFN0YXR1cy5TdXNwZW5kZWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UuZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYWN0aXZhdGVVc2VySW5UZW5hbnQodGVuYW50TWVtYmVyc2hpcElkOiBzdHJpbmcsIHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5zZXRTdGF0dXModGVuYW50TWVtYmVyc2hpcElkLCBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSwgLi4uYXJncyk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEF1dGhvcml6YXRpb25FcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgQXV0aHpEYXRhU291cmNlcyxcbiAgQ2FuQWNjZXNzSW5wdXQsXG4gIFJlc291cmNlVmlzaWJpbGl0eSxcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGFzQXJyYXksXG4gIGJ1aWxkQWNjZXNzQ29udGV4dCxcbiAgYnVpbGRBcmFuZ29Db250ZXh0LFxuICBidWlsZFFkcmFudEZpbHRlcixcbiAgaXNUaW1lVmFsaWQsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuXG5mdW5jdGlvbiBzY29wZUtleShzY29wZUtpbmQ6IFNjb3BlS2luZCwgc2NvcGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Njb3BlS2luZH06JHtzY29wZUlkfWA7XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoelNlcnZpY2Uge1xuICBwcml2YXRlIHJlYWRvbmx5IGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFTb3VyY2VzOiBBdXRoekRhdGFTb3VyY2VzID0ge30pIHtcbiAgICB0aGlzLmRhdGFTb3VyY2VzID0gZGF0YVNvdXJjZXM7XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFzeW5jIGNhbkFjY2VzcyhpbnB1dDogQ2FuQWNjZXNzSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgYXQgPSBpbnB1dC5hdCA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKGlucHV0LnNjb3BlS2luZCAmJiBpbnB1dC5zY29wZUlkKSB7XG4gICAgICBjb25zdCBwZXJtaXNzaW9ucyA9XG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBpbnB1dC5zY29wZUtpbmQsXG4gICAgICAgICAgaW5wdXQuc2NvcGVJZFxuICAgICAgICApO1xuICAgICAgcmV0dXJuIGFzQXJyYXkocGVybWlzc2lvbnMpLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubG9hZFJlc291cmNlPy4oXG4gICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgIGlucHV0LnJlc291cmNlUHJvdGVjdGVkSWRcbiAgICApO1xuICAgIGlmICghcmVzb3VyY2UpIHJldHVybiBmYWxzZTtcbiAgICBpZiAocmVzb3VyY2UudGVuYW50SWQgIT09IGlucHV0LnRlbmFudElkKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAocmVzb3VyY2Uub3duZXJQcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQpIHJldHVybiB0cnVlO1xuXG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFJlc291cmNlR3JhbnRzPy4oXG4gICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgICApXG4gICAgKS5maWx0ZXIoXG4gICAgICAoZ3JhbnQpID0+XG4gICAgICAgIGdyYW50LnByaW5jaXBhbElkID09PSBpbnB1dC5wcmluY2lwYWxJZCAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgIGlzVGltZVZhbGlkKGF0LCBncmFudC5zdGFydHNBdCwgZ3JhbnQuZXhwaXJlc0F0KVxuICAgICk7XG4gICAgaWYgKGdyYW50cy5sZW5ndGggPiAwKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IHZpc2liaWxpdHkgPSByZXNvdXJjZS52aXNpYmlsaXR5O1xuICAgIGlmIChcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5Qcml2YXRlIHx8XG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUmVzb3VyY2VBY2xcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuT3JnVW5pdCB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1N1YnRyZWVcbiAgICApIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5PcmdVbml0LFxuICAgICAgICAgIHJlc291cmNlLm9yZ1VuaXRJZFxuICAgICAgICApXG4gICAgICApO1xuICAgICAgcmV0dXJuIGVmZmVjdGl2ZVBlcm1pc3Npb25zLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICAgIHBlcm1pc3Npb24ucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICAgIGlzVGltZVZhbGlkKGF0LCBwZXJtaXNzaW9uLnN0YXJ0c0F0LCBwZXJtaXNzaW9uLmV4cGlyZXNBdClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5UZW5hbnQpIHtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZVBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZT8uKFxuICAgICAgICAgIGlucHV0LnRlbmFudElkLFxuICAgICAgICAgIFNjb3BlS2luZC5UZW5hbnQsXG4gICAgICAgICAgaW5wdXQudGVuYW50SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVpcmVBY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghKGF3YWl0IHRoaXMuY2FuQWNjZXNzKGlucHV0LCAuLi5hcmdzKSkpIHtcbiAgICAgIHRocm93IG5ldyBBdXRob3JpemF0aW9uRXJyb3IoXG4gICAgICAgIGBBY2Nlc3MgZGVuaWVkIGZvciAke2lucHV0LnBlcm1pc3Npb25LZXl9IG9uICR7aW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCA/PyBzY29wZUtleShpbnB1dC5zY29wZUtpbmQgPz8gU2NvcGVLaW5kLlJlc291cmNlLCBpbnB1dC5zY29wZUlkID8/IFwiXCIpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxpbXBvcnQoXCIuLi90eXBlc1wiKS5BY2Nlc3NDb250ZXh0PiB7XG4gICAgY29uc3QgcGVybWlzc2lvbnMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/Lih0ZW5hbnRJZCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgICBjb25zdCBncmFudHMgPSBhc0FycmF5KFxuICAgICAgYXdhaXQgdGhpcy5kYXRhU291cmNlcy5saXN0UHJpbmNpcGFsR3JhbnRzPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgcmV0dXJuIGJ1aWxkQWNjZXNzQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbnMsXG4gICAgICBncmFudHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZEFyYW5nb0NvbnRleHQoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9XG4gICAgICBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzXG4gICAgICAuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSlcbiAgICAgIC5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRBcmFuZ29Db250ZXh0KHtcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHMsXG4gICAgICBhbGxvd2VkUmVzb3VyY2VJZHMsXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZFFkcmFudEZpbHRlcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICkge1xuICAgIGNvbnN0IGFjY2VzcyA9IGF3YWl0IHRoaXMuYnVpbGRBY2Nlc3NDb250ZXh0KFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGFsbG93ZWRPcmdVbml0SWRzID1cbiAgICAgIGFjY2Vzcy5hbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uS2V5XSA/PyBbXTtcbiAgICBjb25zdCBhbGxvd2VkUmVzb3VyY2VJZHMgPSBhY2Nlc3MucmVzb3VyY2VHcmFudHNcbiAgICAgIC5maWx0ZXIoKGdyYW50KSA9PiBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5KVxuICAgICAgLm1hcCgoZ3JhbnQpID0+IGdyYW50LnJlc291cmNlSWQpO1xuICAgIHJldHVybiBidWlsZFFkcmFudEZpbHRlcih7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG59XG4iLCIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zXG4gKiBAc3VtbWFyeSBQYWNrYWdlIGVudHJ5IHBvaW50IGZvciBzaGFyZWQgaW50ZWdyYXRpb24gaGVscGVycy5cbiAqIEBkZXNjcmlwdGlvbiBFeHBvc2VzIHRoZSBwYWNrYWdlIHV0aWxpdGllcyBhbmQgYnVpbGQtdGltZSB2ZXJzaW9uIG1ldGFkYXRhIGZvciBgQGRlY2FmLXRzL2ludGVncmF0aW9uc2AuXG4gKi9cbmV4cG9ydCAqIGZyb20gXCIuL3V0aWxzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9uYW1lc3BhY2VzXCI7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OOiBzdHJpbmcgPSBcIiMjVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBDT01NSVQgPSBcIiMjQ09NTUlUIyNcIjtcblxuZXhwb3J0IGNvbnN0IEZVTExfVkVSU0lPTiA9IFwiIyNGVUxMX1ZFUlNJT04jI1wiO1xuXG5leHBvcnQgY29uc3QgUEFDS0FHRV9OQU1FOiBzdHJpbmcgPSBcIiMjUEFDS0FHRSMjXCI7XG4iXSwibmFtZXMiOlsiYXN5bmMiLCJleGVjV2l0aExvZ2dpbmciLCJjb21tYW5kIiwib3B0aW9ucyIsImxvZyIsImxldmVsIiwiTG9nTGV2ZWwiLCJpbmZvIiwiZGVidWciLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImNoaWxkIiwiZXhlYyIsInN0ZG91dCIsInN0ZGVyciIsIm9uIiwiZGF0YSIsInB1c2giLCJ0cmltIiwiY29kZSIsInNpbGx5Iiwiam9pbiIsImNyaXRpY2FsIiwiSW50ZXJuYWxFcnJvciIsImVyciIsIklzb2xhdGlvblRpZXIiLCJNZW1iZXJzaGlwU3RhdHVzIiwiUHJpbmNpcGFsS2luZCIsIlNjb3BlS2luZCIsIlBlcm1pc3Npb25DYXRlZ29yeSIsIlJlc291cmNlVmlzaWJpbGl0eSIsIlN0b3JhZ2VLaW5kIiwiU3RvcmFnZUJpbmRpbmdLaW5kIiwiSXNvbGF0aW9uVGllck9wdGlvbnMiLCJPYmplY3QiLCJ2YWx1ZXMiLCJNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyIsIlByaW5jaXBhbEtpbmRPcHRpb25zIiwiU2NvcGVLaW5kT3B0aW9ucyIsIlBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMiLCJSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zIiwiU3RvcmFnZUtpbmRPcHRpb25zIiwiU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucyIsIlJFTF9SRVNUUklDVCIsInVwZGF0ZSIsIkNhc2NhZGUiLCJOT05FIiwiZGVsZXRlIiwibnVsbGFibGUiLCJSRUxfTlVMTElGWSIsIlJFTF9DQVNDQURFX0RFUEVOREVOVCIsIkNBU0NBREUiLCJSRUxfQ0FTQ0FERV9JTlNFUlRfVVBEQVRFIiwiYnVpbGRBcmFuZ29Db250ZXh0IiwidGVuYW50SWQiLCJwcmluY2lwYWxJZCIsInBlcm1pc3Npb25LZXkiLCJhbGxvd2VkT3JnVW5pdElkcyIsImFsbG93ZWRSZXNvdXJjZUlkcyIsImJ1aWxkUWRyYW50RmlsdGVyIiwibXVzdCIsImtleSIsIm1hdGNoIiwidmFsdWUiLCJzaG91bGQiLCJhbnkiLCJzY29wZUtleSIsInNjb3BlS2luZCIsInNjb3BlSWQiLCJub3dJc28iLCJEYXRlIiwiYXNBcnJheSIsInNhbWVUZW5hbnQiLCJyb3dUZW5hbnQiLCJyZWxhdGlvbklkIiwicmVsYXRpb25NYXRjaCIsInRhcmdldCIsImxvd2VyU2x1ZyIsInRvTG93ZXJDYXNlIiwicmVwbGFjZSIsImlzVGltZVZhbGlkIiwiYXQiLCJzdGFydHNBdCIsImV4cGlyZXNBdCIsImluc3RhbnQiLCJidWlsZEFjY2Vzc0NvbnRleHQiLCJwZXJtaXNzaW9uc0J5U2NvcGUiLCJhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJwZXJtaXNzaW9ucyIsIk9yZ1VuaXQiLCJyZXNvdXJjZUdyYW50cyIsImdyYW50cyIsIm1hcCIsImdyYW50IiwicmVzb3VyY2VJZCIsIkJhc2VNb2RlbFNlcnZpY2UiLCJNb2RlbFNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsImNsYXp6Iiwic3VwZXIiLCJuZXdNb2RlbCIsImFzc2lnbiIsImNyZWF0ZSIsImFyZ3MiLCJ0aGlzIiwicmVwbyIsImNyZWF0ZU9uZSIsImdldEJ5SWQiLCJpZCIsInJlYWQiLCJ1cGRhdGVPbmUiLCJwYXRjaCIsImV4aXN0aW5nIiwiZGVsZXRlQnlJZCIsImZpbmRPbmVCeSIsImZpbmRNYW55QnkiLCJzZWxlY3QiLCJ3aGVyZSIsImV4ZWN1dGUiLCJsaXN0QWxsIiwiY3J5cHRvIiwicmFuZG9tVVVJRCIsIkF1dGhvcml6YXRpb25Nb2RlbCIsIk1vZGVsIiwiVGVuYW50TWVtYmVyc2hpcCIsIl9fZGVjb3JhdGUiLCJwayIsInR5cGUiLCJTdHJpbmciLCJ1dWlkIiwicHJvdG90eXBlIiwibWFueVRvT25lIiwiVGVuYW50IiwidW5kZWZpbmVkIiwicmVxdWlyZWQiLCJVc2VyIiwidHlwZU9mIiwib3B0aW9uIiwiY29sdW1uIiwiY3JlYXRlZEF0IiwidXBkYXRlZEF0IiwidGFibGUiLCJtb2RlbCIsInVuaXF1ZSIsIm9uZVRvTWFueSIsIk9yZ1VuaXRNZW1iZXJzaGlwIiwiT3JnVW5pdENsb3N1cmUiLCJOdW1iZXIiLCJQZXJtaXNzaW9uIiwiUm9sZVBlcm1pc3Npb24iLCJSb2xlIiwiUm9sZUFzc2lnbm1lbnQiLCJQcmluY2lwYWwiLCJCb29sZWFuIiwiUmVzb3VyY2VHcmFudCIsIlByb3RlY3RlZFJlc291cmNlIiwiSW5oZXJpdGFuY2VCbG9jayIsIlN0b3JhZ2VCaW5kaW5nIiwiVGVuYW50UHJvZmlsZSIsIk9yZ1VuaXRQcm9maWxlIiwiR3JvdXBNZW1iZXJzaGlwIiwiR3JvdXAiLCJFZmZlY3RpdmVQZXJtaXNzaW9uIiwiVGVuYW50UHJvZmlsZVNlcnZpY2UiLCJjcmVhdGVQcm9maWxlIiwicHJvZmlsZUtleSIsIm1ldGFkYXRhIiwidGVuYW50IiwibGlzdEZvclRlbmFudCIsImZpbHRlciIsInByb2ZpbGUiLCJkZWxldGVGb3JUZW5hbnQiLCJyb3ciLCJPcmdVbml0UHJvZmlsZVNlcnZpY2UiLCJvcmdVbml0SWQiLCJvcmdVbml0IiwibGlzdEZvck9yZ1VuaXQiLCJPcmdVbml0Q2xvc3VyZVNlcnZpY2UiLCJsaXN0QW5jZXN0b3JzIiwiZGVzY2VuZGFudCIsInNvcnQiLCJsZWZ0IiwicmlnaHQiLCJkZXB0aCIsImxpc3REZXNjZW5kYW50cyIsImFuY2VzdG9yIiwiaXNBbmNlc3Rvck9mIiwiYW5jZXN0b3JPcmdVbml0SWQiLCJkZXNjZW5kYW50T3JnVW5pdElkIiwic29tZSIsImNyZWF0ZVNlbGZMaW5rIiwiaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkIiwicGFyZW50T3JnVW5pdElkIiwiY2hpbGRPcmdVbml0SWQiLCJhbmNlc3RvckxpbmtzIiwibGluayIsImRlbGV0ZUxpbmtzRm9yU3VidHJlZSIsInN1YnRyZWUiLCJkZXNjZW5kYW50SWRzIiwiU2V0IiwiYW5jZXN0b3JJZHMiLCJyb3dzIiwiaGFzIiwiSW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UiLCJibG9ja0NhdGVnb3J5IiwicGVybWlzc2lvbkNhdGVnb3J5IiwiYmxvY2tlZEZyb21BbmNlc3RvcklkIiwicmVhc29uIiwiYmxvY2tlZEZyb21BbmNlc3RvciIsInVuYmxvY2tDYXRlZ29yeSIsImJsb2NrSWQiLCJibG9jayIsImNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yIiwiY2F0ZWdvcnkiLCJUZW5hbnRTZXJ2aWNlIiwiY3JlYXRlVGVuYW50IiwiaW5wdXQiLCJzbHVnIiwibmFtZSIsImlzb2xhdGlvblRpZXIiLCJQb29sZWQiLCJnZXRCeVNsdWciLCJyZW5hbWVUZW5hbnQiLCJjaGFuZ2VTbHVnIiwic2V0SXNvbGF0aW9uVGllciIsImRlbGV0ZVRlbmFudENvbnRyb2xsZWQiLCJkZWxldGVSb3dzQnlJZCIsInNlcnZpY2UiLCJPcmdVbml0U2VydmljZSIsIm9yZ1VuaXRQYXRoIiwicGFyZW50UGF0aCIsInNlZ21lbnQiLCJjcmVhdGVQcm9maWxlSWZOZWVkZWQiLCJwcm9maWxlTWV0YWRhdGEiLCJjcmVhdGVSb290IiwicGF0aCIsImNyZWF0ZUNoaWxkIiwicGFyZW50IiwiY2xvc3VyZVNlcnZpY2UiLCJsaXN0Q2hpbGRyZW4iLCJsaXN0VGVuYW50T3JnVW5pdHMiLCJsaXN0RGVzY2VuZGFudE9yZ1VuaXRzIiwiaW5jbHVkZVNlbGYiLCJkZXNjZW5kYW50cyIsImlkcyIsImFkZCIsImxpc3RBbmNlc3Rvck9yZ1VuaXRzIiwiYW5jZXN0b3JzIiwicmVuYW1lT3JnVW5pdCIsImluY2x1ZGVzIiwibW92ZU9yZ1VuaXQiLCJuZXdQYXJlbnRPcmdVbml0SWQiLCJuZXdQYXJlbnQiLCJ1cGRhdGVkIiwicmVidWlsZFRlbmFudENsb3N1cmUiLCJleGlzdGluZ0xpbmtzIiwib3JnVW5pdHMiLCJsZWZ0RGVwdGgiLCJzcGxpdCIsImxlbmd0aCIsInJpZ2h0RGVwdGgiLCJkZWxldGVPcmdVbml0VHJlZSIsInRyYW5zYWN0aW9uYWwiLCJVc2VyU2VydmljZSIsImNyZWF0ZVVzZXIiLCJlbWFpbCIsInBob25lIiwiZGlzcGxheU5hbWUiLCJnZXRCeUVtYWlsIiwiZmluZCIsInVzZXIiLCJ1cGRhdGVEaXNwbGF5TmFtZSIsInVzZXJJZCIsInVwZGF0ZUVtYWlsIiwidXBkYXRlUGhvbmUiLCJQcmluY2lwYWxTZXJ2aWNlIiwiY3JlYXRlUHJpbmNpcGFsIiwia2luZCIsInN1YmplY3RJZCIsImdldEZvclN1YmplY3QiLCJwcmluY2lwYWwiLCJnZXRPckNyZWF0ZUZvclN1YmplY3QiLCJnZXRVc2VyUHJpbmNpcGFsIiwiZ2V0R3JvdXBQcmluY2lwYWwiLCJncm91cElkIiwiVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRVc2VyVG9UZW5hbnQiLCJzdGF0dXMiLCJBY3RpdmUiLCJzZXRTdGF0dXMiLCJtZW1iZXJzaGlwSWQiLCJsaXN0VXNlclRlbmFudHMiLCJtZW1iZXJzaGlwIiwibGlzdFRlbmFudFVzZXJzIiwicmVtb3ZlVXNlckZyb21UZW5hbnQiLCJPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UiLCJhZGRVc2VyVG9PcmdVbml0IiwibGlzdFVzZXJPcmdVbml0cyIsImxpc3RPcmdVbml0VXNlcnMiLCJyZW1vdmVVc2VyRnJvbU9yZ1VuaXQiLCJHcm91cFNlcnZpY2UiLCJjcmVhdGVHcm91cCIsInJlbmFtZUdyb3VwIiwibW92ZUdyb3VwVG9PcmdVbml0IiwibGlzdFRlbmFudEdyb3VwcyIsImdyb3VwIiwiR3JvdXBNZW1iZXJzaGlwU2VydmljZSIsImFkZFByaW5jaXBhbFRvR3JvdXAiLCJsaXN0R3JvdXBNZW1iZXJzIiwibGlzdFByaW5jaXBhbEdyb3VwcyIsInJlbW92ZVByaW5jaXBhbEZyb21Hcm91cCIsInJlc29sdmVHcm91cFByaW5jaXBhbElkc0ZvclByaW5jaXBhbCIsInByaW5jaXBhbFNlcnZpY2UiLCJtZW1iZXJzaGlwcyIsInByaW5jaXBhbHMiLCJhbGwiLCJQZXJtaXNzaW9uU2VydmljZSIsImNyZWF0ZVBlcm1pc3Npb24iLCJkZXNjcmlwdGlvbiIsImdldEJ5S2V5IiwibGlzdEJ5Q2F0ZWdvcnkiLCJ1cGRhdGVEZXNjcmlwdGlvbiIsInBlcm1pc3Npb25JZCIsIlJvbGVTZXJ2aWNlIiwiY3JlYXRlUm9sZSIsImdldFN5c3RlbVJvbGVCeUtleSIsInJvbGUiLCJjYW5kaWRhdGUiLCJFcnJvciIsImdldFRlbmFudFJvbGVCeUtleSIsInJlbmFtZVJvbGUiLCJyb2xlSWQiLCJ1cGRhdGVSb2xlTWV0YWRhdGEiLCJsaXN0VGVuYW50Um9sZXMiLCJpbmNsdWRlU3lzdGVtIiwiUm9sZVBlcm1pc3Npb25TZXJ2aWNlIiwiYWRkUGVybWlzc2lvblRvUm9sZSIsImFkZFBlcm1pc3Npb25LZXlUb1JvbGUiLCJyZW1vdmVQZXJtaXNzaW9uRnJvbVJvbGUiLCJyb2xlUGVybWlzc2lvbklkIiwibGlzdFJvbGVQZXJtaXNzaW9ucyIsInJvbGVQZXJtaXNzaW9uIiwibGlzdFBlcm1pc3Npb25Sb2xlcyIsInJlcGxhY2VSb2xlUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uSWRzIiwiY3JlYXRlUm9sZVdpdGhQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25LZXlzIiwiUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIiwiYXNzaWduUm9sZSIsImluaGVyaXREb3duIiwiY29uZGl0aW9ucyIsInJldm9rZUFzc2lnbm1lbnQiLCJhc3NpZ25tZW50SWQiLCJsaXN0UHJpbmNpcGFsQXNzaWdubWVudHMiLCJhc3NpZ25tZW50IiwibGlzdFJvbGVBc3NpZ25tZW50cyIsImxpc3RUZW5hbnRBc3NpZ25tZW50cyIsInVwZGF0ZUFzc2lnbm1lbnRXaW5kb3ciLCJFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSIsImxpc3RGb3JQcmluY2lwYWwiLCJsaXN0Rm9yU2NvcGUiLCJoYXNQZXJtaXNzaW9uIiwiZGVsZXRlRm9yUHJpbmNpcGFsIiwicmVidWlsZEZvclByaW5jaXBhbCIsInJvbGVBc3NpZ25tZW50U2VydmljZSIsInJvbGVQZXJtaXNzaW9uU2VydmljZSIsInBlcm1pc3Npb25TZXJ2aWNlIiwiZ3JvdXBNZW1iZXJzaGlwU2VydmljZSIsIm9yZ1VuaXRDbG9zdXJlU2VydmljZSIsImluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIiwibWF0ZXJpYWxpemVkIiwic291cmNlQXNzaWdubWVudHMiLCJncm91cE1lbWJlcnNoaXBzIiwiZ3JvdXBBc3NpZ25tZW50cyIsImdyb3VwUHJpbmNpcGFsIiwiZmxhdCIsImFzc2lnbm1lbnRzIiwicm9sZVBlcm1pc3Npb25zIiwic2NvcGVzIiwiUmVzb3VyY2UiLCJzY29wZWQiLCJzb3VyY2VLaW5kIiwic291cmNlSWQiLCJjcmVhdGVkIiwicmVidWlsZEZvclRlbmFudCIsIlByb3RlY3RlZFJlc291cmNlU2VydmljZSIsInJlZ2lzdGVyUmVzb3VyY2UiLCJyZXNvdXJjZVR5cGUiLCJ2aXNpYmlsaXR5Iiwib3duZXIiLCJvd25lclByaW5jaXBhbElkIiwic2Vuc2l0aXZpdHkiLCJnZXRCeURvbWFpblJlc291cmNlIiwicmVzb3VyY2UiLCJtb3ZlUmVzb3VyY2VUb09yZ1VuaXQiLCJwcm90ZWN0ZWRSZXNvdXJjZUlkIiwic2V0VmlzaWJpbGl0eSIsInRyYW5zZmVyT3duZXJzaGlwIiwibGlzdE9yZ1VuaXRSZXNvdXJjZXMiLCJsaXN0VGVuYW50UmVzb3VyY2VzIiwiUmVzb3VyY2VHcmFudFNlcnZpY2UiLCJncmFudFJlc291cmNlIiwiY3JlYXRlZEJ5IiwiY3JlYXRlZEJ5UHJpbmNpcGFsSWQiLCJyZXZva2VHcmFudCIsImdyYW50SWQiLCJsaXN0UmVzb3VyY2VHcmFudHMiLCJsaXN0UHJpbmNpcGFsR3JhbnRzIiwiaGFzR3JhbnQiLCJkZWxldGVBbGxGb3JSZXNvdXJjZSIsIlJlc291cmNlTGlmZWN5Y2xlU2VydmljZSIsInVucmVnaXN0ZXJSZXNvdXJjZSIsInJlc29sdmVSZXNvdXJjZVNjb3BlIiwiU3RvcmFnZUJpbmRpbmdTZXJ2aWNlIiwiY3JlYXRlQmluZGluZyIsInN0b3JhZ2VLaW5kIiwiYmluZGluZ0tpbmQiLCJiaW5kaW5nS2V5IiwicmVnaW9uIiwiY29uZmlnIiwibGlzdFRlbmFudEJpbmRpbmdzIiwiYmluZGluZyIsImdldEJpbmRpbmciLCJzZXRCaW5kaW5nQ29uZmlnIiwiYmluZGluZ0lkIiwicHJvbW90ZVRvRGVkaWNhdGVkIiwiRGVkaWNhdGVkIiwic2V0U2hhcmVkIiwiU2hhcmVkIiwiQm9vdHN0cmFwU2VydmljZSIsInRlbmFudFNlcnZpY2UiLCJ0ZW5hbnRQcm9maWxlU2VydmljZSIsIm9yZ1VuaXRTZXJ2aWNlIiwib3JnVW5pdFByb2ZpbGVTZXJ2aWNlIiwidXNlclNlcnZpY2UiLCJtZW1iZXJzaGlwU2VydmljZSIsInJvbGVTZXJ2aWNlIiwiZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UiLCJib290c3RyYXBUZW5hbnRGcm9tVGVtcGxhdGUiLCJ0ZW1wbGF0ZSIsImNyZWF0ZU9yZ1RyZWUiLCJwYXJlbnRJZCIsImNoaWxkcmVuIiwicm9vdE9yZ1VuaXQiLCJvd25lclVzZXIiLCJvd25lclByaW5jaXBhbCIsInJvbGVzIiwiY3JlYXRlZFJvbGUiLCJvd25lclJvbGUiLCJvd25lclJvbGVLZXkiLCJyb290T3JnVW5pdElkIiwib3duZXJVc2VySWQiLCJTeXN0ZW1NYW5hZ2VtZW50U2VydmljZSIsIm9yZ01lbWJlcnNoaXBTZXJ2aWNlIiwib25ib2FyZFVzZXJUb1RlbmFudEFuZE9yZ1VuaXQiLCJyb2xlS2V5IiwiY2hhbmdlVXNlck9yZ1JvbGUiLCJjdXJyZW50QXNzaWdubWVudHMiLCJzdXNwZW5kVXNlckluVGVuYW50IiwidGVuYW50TWVtYmVyc2hpcElkIiwiU3VzcGVuZGVkIiwicmVhY3RpdmF0ZVVzZXJJblRlbmFudCIsIkF1dGh6U2VydmljZSIsImRhdGFTb3VyY2VzIiwiY2FuQWNjZXNzIiwibGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGUiLCJyZXNvdXJjZVByb3RlY3RlZElkIiwibG9hZFJlc291cmNlIiwiUHJpdmF0ZSIsIlJlc291cmNlQWNsIiwiT3JnU3VidHJlZSIsImVmZmVjdGl2ZVBlcm1pc3Npb25zIiwicmVxdWlyZUFjY2VzcyIsIkF1dGhvcml6YXRpb25FcnJvciIsImxpc3RFZmZlY3RpdmVQZXJtaXNzaW9ucyIsImFjY2VzcyIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiXSwibWFwcGluZ3MiOiI7Ozs7O0lBU09BLGVBQWVDLGdCQUNwQkMsU0FDQUMsU0FDQUMsS0FDQUMsUUFBa0JDLFFBQUFBLFNBQVNDO1FBRTNCSCxJQUFJSSxNQUFNLGNBQWNOO1FBRXhCLE9BQU8sSUFBSU8sUUFBUSxDQUFDQyxTQUFTQztZQUMzQixNQUFNQyxRQUFRQyxjQUFBQSxLQUFLWCxTQUFTQztZQUU1QixNQUFNVyxTQUFtQjtZQUN6QixNQUFNQyxTQUFtQjtZQUV6QkgsTUFBTUUsUUFBUUUsR0FBRyxRQUFTQztnQkFDeEJILE9BQU9JLEtBQUtEO2dCQUNaYixJQUFJQyxPQUFPWSxLQUFLRTs7WUFHbEJQLE1BQU1HLFFBQVFDLEdBQUcsUUFBU0M7Z0JBQ3hCRixPQUFPRyxLQUFLRDtnQkFDWmIsSUFBSUksTUFBTVMsS0FBS0U7O1lBR2pCUCxNQUFNSSxHQUFHLFNBQVVJO2dCQUNqQixJQUFJQSxTQUFTLEdBQUc7b0JBQ2RoQixJQUFJaUIsTUFBTTtvQkFDVlgsUUFBUTt3QkFBRUksUUFBUUEsT0FBT1EsS0FBSzt3QkFBT1AsUUFBUUEsT0FBT08sS0FBSzs7QUFDM0QsdUJBQU87b0JBQ0xsQixJQUFJbUIsU0FDRiw0QkFBNEJILFdBQVdMLE9BQU9PLEtBQUs7b0JBRXJEWCxPQUNFLElBQUlhLGFBQUFBLGNBQ0YsNEJBQTRCSixT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
2087
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb25zLmNqcyIsInNvdXJjZXMiOlsiLi4vc3JjL3V0aWxzLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvdHlwZXMudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy91dGlscy50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9hdXRob3JpemF0aW9uLW1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3VzZXIubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1jbG9zdXJlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Blcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1wZXJtaXNzaW9uLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3JvbGUubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvcm9sZS1hc3NpZ25tZW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3Jlc291cmNlLWdyYW50Lm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3ByaW5jaXBhbC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvb3JnLXVuaXQubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvc3RvcmFnZS1iaW5kaW5nLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL3RlbmFudC5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy90ZW5hbnQtcHJvZmlsZS5tb2RlbC50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL21vZGVscy9vcmctdW5pdC1wcm9maWxlLm1vZGVsLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvbW9kZWxzL2dyb3VwLW1lbWJlcnNoaXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZ3JvdXAubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9tb2RlbHMvZWZmZWN0aXZlLXBlcm1pc3Npb24ubW9kZWwudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy90ZW5hbnQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtcHJvZmlsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQtY2xvc3VyZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3RlbmFudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvb3JnLXVuaXQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3VzZXIuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3ByaW5jaXBhbC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvdGVuYW50LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL29yZy11bml0LW1lbWJlcnNoaXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL2dyb3VwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ncm91cC1tZW1iZXJzaGlwLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9wZXJtaXNzaW9uLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9yb2xlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Byb3RlY3RlZC1yZXNvdXJjZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvcmVzb3VyY2UtZ3JhbnQuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3Jlc291cmNlLWxpZmVjeWNsZS5zZXJ2aWNlLnRzIiwiLi4vc3JjL25hbWVzcGFjZXMvc2VydmljZXMvc3RvcmFnZS1iaW5kaW5nLnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9ib290c3RyYXAuc2VydmljZS50cyIsIi4uL3NyYy9uYW1lc3BhY2VzL3NlcnZpY2VzL3N5c3RlbS1tYW5hZ2VtZW50LnNlcnZpY2UudHMiLCIuLi9zcmMvbmFtZXNwYWNlcy9zZXJ2aWNlcy9hdXRoei5zZXJ2aWNlLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvY29uc3RhbnRzLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvdXRpbHMudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9lbnZpcm9ubWVudC50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL21vZGVscy9GZWF0dXJlRmxhZy5tb2RlbC50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL21vZGVscy9GZWF0dXJlRmxhZ0FjY2Vzcy5tb2RlbC50cyIsIi4uL3NyYy9mZWF0dXJlLWZsYWdzL3JlYWRlcnMvRmVhdHVyZUZsYWdSZWFkZXIudHMiLCIuLi9zcmMvZmVhdHVyZS1mbGFncy9zZXJ2aWNlcy9GZWF0dXJlRmxhZy5zZXJ2aWNlLnRzIiwiLi4vc3JjL2ZlYXR1cmUtZmxhZ3MvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBtb2R1bGUgaW50ZWdyYXRpb25zL3V0aWxzXG4gKiBAc3VtbWFyeSBTaGFyZWQgaW50ZWdyYXRpb24gdXRpbGl0aWVzLlxuICogQGRlc2NyaXB0aW9uIFV0aWxpdHkgaGVscGVycyB1c2VkIGFjcm9zcyB0aGUgaW50ZWdyYXRpb25zIHBhY2thZ2UuXG4gKi9cbmltcG9ydCB7IGV4ZWMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dMZXZlbCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHsgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY1dpdGhMb2dnaW5nKFxuICBjb21tYW5kOiBzdHJpbmcsXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmcgfSxcbiAgbG9nOiBMb2dnZXIsXG4gIGxldmVsOiBMb2dMZXZlbCA9IExvZ0xldmVsLmluZm9cbik6IFByb21pc2U8eyBzdGRvdXQ6IHN0cmluZzsgc3RkZXJyOiBzdHJpbmcgfT4ge1xuICBsb2cuZGVidWcoYEV4ZWN1dGluZzogJHtjb21tYW5kfWApO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBleGVjKGNvbW1hbmQsIG9wdGlvbnMpO1xuXG4gICAgY29uc3Qgc3Rkb3V0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHN0ZGVycjogc3RyaW5nW10gPSBbXTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgICAgIHN0ZG91dC5wdXNoKGRhdGEpO1xuICAgICAgbG9nW2xldmVsXShkYXRhLnRyaW0oKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5zdGRlcnI/Lm9uKFwiZGF0YVwiLCAoZGF0YTogc3RyaW5nKSA9PiB7XG4gICAgICBzdGRlcnIucHVzaChkYXRhKTtcbiAgICAgIGxvZy5kZWJ1ZyhkYXRhLnRyaW0oKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlOiBudW1iZXIpID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIGxvZy5zaWxseShgQ29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5YCk7XG4gICAgICAgIHJlc29sdmUoeyBzdGRvdXQ6IHN0ZG91dC5qb2luKFwiXFxuXCIpLCBzdGRlcnI6IHN0ZGVyci5qb2luKFwiXFxuXCIpIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nLmNyaXRpY2FsKFxuICAgICAgICAgIGBDb21tYW5kIGZhaWxlZCB3aXRoIGNvZGUgJHtjb2RlfTpcXG4gJHtzdGRlcnIuam9pbihcIlxcblwiKX1gXG4gICAgICAgICk7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgICAgIGBDb21tYW5kIGZhaWxlZCB3aXRoIGNvZGUgJHtjb2RlfTogJHtzdGRlcnIuam9pbihcIlxcblwiKX1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyOiBFcnJvcikgPT4ge1xuICAgICAgbG9nLmNyaXRpY2FsKGBDb21tYW5kIGV4ZWN1dGlvbiBlcnJvcmAsIGVycik7XG4gICAgICByZWplY3QoZXJyKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCJleHBvcnQgZW51bSBJc29sYXRpb25UaWVyIHtcbiAgUG9vbGVkID0gXCJwb29sZWRcIixcbiAgQnJpZGdlID0gXCJicmlkZ2VcIixcbiAgU2lsbyA9IFwic2lsb1wiLFxufVxuXG5leHBvcnQgZW51bSBNZW1iZXJzaGlwU3RhdHVzIHtcbiAgSW52aXRlZCA9IFwiaW52aXRlZFwiLFxuICBBY3RpdmUgPSBcImFjdGl2ZVwiLFxuICBTdXNwZW5kZWQgPSBcInN1c3BlbmRlZFwiLFxuICBSZW1vdmVkID0gXCJyZW1vdmVkXCIsXG59XG5cbmV4cG9ydCBlbnVtIFByaW5jaXBhbEtpbmQge1xuICBVc2VyID0gXCJ1c2VyXCIsXG4gIEdyb3VwID0gXCJncm91cFwiLFxuICBTZXJ2aWNlQWNjb3VudCA9IFwic2VydmljZV9hY2NvdW50XCIsXG4gIEFnZW50ID0gXCJhZ2VudFwiLFxuICBBcGlLZXkgPSBcImFwaV9rZXlcIixcbn1cblxuZXhwb3J0IGVudW0gU2NvcGVLaW5kIHtcbiAgVGVuYW50ID0gXCJ0ZW5hbnRcIixcbiAgT3JnVW5pdCA9IFwib3JnX3VuaXRcIixcbiAgUmVzb3VyY2UgPSBcInJlc291cmNlXCIsXG59XG5cbmV4cG9ydCBlbnVtIFBlcm1pc3Npb25DYXRlZ29yeSB7XG4gIEFkbWluID0gXCJhZG1pblwiLFxuICBDb250ZW50UmVhZCA9IFwiY29udGVudF9yZWFkXCIsXG4gIENvbnRlbnRXcml0ZSA9IFwiY29udGVudF93cml0ZVwiLFxuICBNZW1vcnkgPSBcIm1lbW9yeVwiLFxuICBHcmFwaCA9IFwiZ3JhcGhcIixcbiAgVmVjdG9yID0gXCJ2ZWN0b3JcIixcbiAgRXhwb3J0ID0gXCJleHBvcnRcIixcbiAgQmlsbGluZyA9IFwiYmlsbGluZ1wiLFxuICBBdWRpdCA9IFwiYXVkaXRcIixcbiAgU2VjdXJpdHkgPSBcInNlY3VyaXR5XCIsXG4gIERhdGEgPSBcImRhdGFcIixcbiAgQXV0b21hdGlvbiA9IFwiYXV0b21hdGlvblwiLFxufVxuXG5leHBvcnQgZW51bSBSZXNvdXJjZVZpc2liaWxpdHkge1xuICBQcml2YXRlID0gXCJwcml2YXRlXCIsXG4gIFJlc291cmNlQWNsID0gXCJyZXNvdXJjZV9hY2xcIixcbiAgT3JnVW5pdCA9IFwib3JnX3VuaXRcIixcbiAgT3JnU3VidHJlZSA9IFwib3JnX3N1YnRyZWVcIixcbiAgVGVuYW50ID0gXCJ0ZW5hbnRcIixcbn1cblxuZXhwb3J0IGVudW0gU3RvcmFnZUtpbmQge1xuICBQb3N0Z3JlcyA9IFwicG9zdGdyZXNcIixcbiAgQXJhbmdvID0gXCJhcmFuZ29cIixcbiAgUWRyYW50ID0gXCJxZHJhbnRcIixcbiAgT2JqZWN0U3RvcmFnZSA9IFwib2JqZWN0X3N0b3JhZ2VcIixcbn1cblxuZXhwb3J0IGVudW0gU3RvcmFnZUJpbmRpbmdLaW5kIHtcbiAgU2hhcmVkID0gXCJzaGFyZWRcIixcbiAgRGVkaWNhdGVkID0gXCJkZWRpY2F0ZWRcIixcbn1cblxuZXhwb3J0IGNvbnN0IElzb2xhdGlvblRpZXJPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhJc29sYXRpb25UaWVyKTtcbmV4cG9ydCBjb25zdCBNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoTWVtYmVyc2hpcFN0YXR1cyk7XG5leHBvcnQgY29uc3QgUHJpbmNpcGFsS2luZE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFByaW5jaXBhbEtpbmQpO1xuZXhwb3J0IGNvbnN0IFNjb3BlS2luZE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFNjb3BlS2luZCk7XG5leHBvcnQgY29uc3QgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoUGVybWlzc2lvbkNhdGVnb3J5KTtcbmV4cG9ydCBjb25zdCBSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zID0gT2JqZWN0LnZhbHVlcyhSZXNvdXJjZVZpc2liaWxpdHkpO1xuZXhwb3J0IGNvbnN0IFN0b3JhZ2VLaW5kT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoU3RvcmFnZUtpbmQpO1xuZXhwb3J0IGNvbnN0IFN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKFN0b3JhZ2VCaW5kaW5nS2luZCk7XG5cbmV4cG9ydCB0eXBlIFR4QXJncyA9IGFueVtdO1xuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVRlbmFudElucHV0IHtcbiAgc2x1Zzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzb2xhdGlvblRpZXI/OiBJc29sYXRpb25UaWVyO1xuICBwcm9maWxlS2V5Pzogc3RyaW5nO1xuICBwcm9maWxlTWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVVc2VySW5wdXQge1xuICBlbWFpbD86IHN0cmluZztcbiAgcGhvbmU/OiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlT3JnVW5pdElucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcGFyZW50T3JnVW5pdElkPzogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHByb2ZpbGVLZXk/OiBzdHJpbmc7XG4gIHByb2ZpbGVNZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVJvbGVJbnB1dCB7XG4gIHRlbmFudElkPzogc3RyaW5nO1xuICBrZXk6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQZXJtaXNzaW9uSW5wdXQge1xuICBrZXk6IHN0cmluZztcbiAgY2F0ZWdvcnk6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXNzaWduUm9sZUlucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcm9sZUlkOiBzdHJpbmc7XG4gIHNjb3BlS2luZDogU2NvcGVLaW5kO1xuICBzY29wZUlkOiBzdHJpbmc7XG4gIGluaGVyaXREb3duPzogYm9vbGVhbjtcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xuICBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJSZXNvdXJjZUlucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgb3JnVW5pdElkOiBzdHJpbmc7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICByZXNvdXJjZUlkOiBzdHJpbmc7XG4gIHZpc2liaWxpdHk6IFJlc291cmNlVmlzaWJpbGl0eTtcbiAgb3duZXJQcmluY2lwYWxJZD86IHN0cmluZztcbiAgc2Vuc2l0aXZpdHk/OiBzdHJpbmc7XG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JhbnRSZXNvdXJjZUlucHV0IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIHN0YXJ0c0F0PzogRGF0ZTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjcmVhdGVkQnlQcmluY2lwYWxJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYW5BY2Nlc3NJbnB1dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgcmVzb3VyY2VQcm90ZWN0ZWRJZD86IHN0cmluZztcbiAgc2NvcGVLaW5kPzogU2NvcGVLaW5kO1xuICBzY29wZUlkPzogc3RyaW5nO1xuICBhdD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWNjZXNzQ29udGV4dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25zQnlTY29wZTogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbjogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+O1xuICByZXNvdXJjZUdyYW50czogQXJyYXk8eyByZXNvdXJjZUlkOiBzdHJpbmc7IHBlcm1pc3Npb25LZXk6IHN0cmluZyB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcmFuZ29BdXRoQ29udGV4dCB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgYWxsb3dlZE9yZ1VuaXRJZHM6IHN0cmluZ1tdO1xuICBhbGxvd2VkUmVzb3VyY2VJZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFFkcmFudEF1dGhGaWx0ZXIge1xuICBtdXN0OiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gIG11c3Rfbm90PzogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVN0b3JhZ2VCaW5kaW5nSW5wdXQge1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBzdG9yYWdlS2luZDogU3RvcmFnZUtpbmQ7XG4gIGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQ7XG4gIGJpbmRpbmdLZXk6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvb3RzdHJhcFBlcm1pc3Npb24ge1xuICBrZXk6IHN0cmluZztcbiAgY2F0ZWdvcnk6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwUm9sZSB7XG4gIGtleTogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5czogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwT3JnVW5pdCB7XG4gIG5hbWU6IHN0cmluZztcbiAgcHJvZmlsZUtleT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY2hpbGRyZW4/OiBCb290c3RyYXBPcmdVbml0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9vdHN0cmFwVGVtcGxhdGUge1xuICB0ZW5hbnQ6IENyZWF0ZVRlbmFudElucHV0O1xuICByb290T3JnVW5pdDogQm9vdHN0cmFwT3JnVW5pdDtcbiAgcGVybWlzc2lvbnM6IEJvb3RzdHJhcFBlcm1pc3Npb25bXTtcbiAgcm9sZXM6IEJvb3RzdHJhcFJvbGVbXTtcbiAgb3duZXJVc2VyOiBDcmVhdGVVc2VySW5wdXQ7XG4gIG93bmVyUm9sZUtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc291cmNlU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBvcmdVbml0SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VUeXBlOiBzdHJpbmc7XG4gIHJlc291cmNlSWQ6IHN0cmluZztcbiAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICBvd25lclByaW5jaXBhbElkPzogc3RyaW5nO1xuICBzZW5zaXRpdml0eT86IHN0cmluZztcbiAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHcmFudFNuYXBzaG90IHtcbiAgaWQ6IHN0cmluZztcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcmVzb3VyY2VJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIHN0YXJ0c0F0PzogRGF0ZTtcbiAgZXhwaXJlc0F0PzogRGF0ZTtcbiAgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjcmVhdGVkQnlQcmluY2lwYWxJZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3Qge1xuICBpZDogc3RyaW5nO1xuICB0ZW5hbnRJZDogc3RyaW5nO1xuICBwcmluY2lwYWxJZDogc3RyaW5nO1xuICBwZXJtaXNzaW9uS2V5OiBzdHJpbmc7XG4gIHNjb3BlS2luZDogU2NvcGVLaW5kO1xuICBzY29wZUlkOiBzdHJpbmc7XG4gIHNvdXJjZUtpbmQ6IHN0cmluZztcbiAgc291cmNlSWQ6IHN0cmluZztcbiAgc3RhcnRzQXQ/OiBEYXRlO1xuICBleHBpcmVzQXQ/OiBEYXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGh6RGF0YVNvdXJjZXMge1xuICBsb2FkUmVzb3VyY2U/OiAodGVuYW50SWQ6IHN0cmluZywgcHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nKSA9PiBQcm9taXNlPFJlc291cmNlU25hcHNob3QgfCB1bmRlZmluZWQ+O1xuICBsaXN0UmVzb3VyY2VHcmFudHM/OiAodGVuYW50SWQ6IHN0cmluZywgcHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nKSA9PiBQcm9taXNlPEdyYW50U25hcHNob3RbXT47XG4gIGxpc3RQcmluY2lwYWxHcmFudHM/OiAodGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZykgPT4gUHJvbWlzZTxHcmFudFNuYXBzaG90W10+O1xuICBsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnM/OiAoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3RbXT47XG4gIGxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlPzogKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nXG4gICkgPT4gUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3RbXT47XG59XG4iLCJpbXBvcnQgeyBDYXNjYWRlLCBNb2RlbFNlcnZpY2UsIFJlcG9zaXRvcnkgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHtcbiAgQWNjZXNzQ29udGV4dCxcbiAgQXJhbmdvQXV0aENvbnRleHQsXG4gIEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCxcbiAgR3JhbnRTbmFwc2hvdCxcbiAgUWRyYW50QXV0aEZpbHRlcixcbiAgU2NvcGVLaW5kLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgUkVMX1JFU1RSSUNUID0ge1xuICB1cGRhdGU6IENhc2NhZGUuTk9ORSxcbiAgZGVsZXRlOiBDYXNjYWRlLk5PTkUsXG4gIG51bGxhYmxlOiBmYWxzZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfTlVMTElGWSA9IHtcbiAgdXBkYXRlOiBDYXNjYWRlLk5PTkUsXG4gIGRlbGV0ZTogQ2FzY2FkZS5OT05FLFxuICBudWxsYWJsZTogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuQ0FTQ0FERSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUgPSB7XG4gIHVwZGF0ZTogQ2FzY2FkZS5DQVNDQURFLFxuICBkZWxldGU6IENhc2NhZGUuTk9ORSxcbiAgbnVsbGFibGU6IGZhbHNlLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQXJhbmdvQ29udGV4dChvcHRpb25zOiB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgYWxsb3dlZE9yZ1VuaXRJZHM6IHN0cmluZ1tdO1xuICBhbGxvd2VkUmVzb3VyY2VJZHM6IHN0cmluZ1tdO1xufSk6IEFyYW5nb0F1dGhDb250ZXh0IHtcbiAgcmV0dXJuIHtcbiAgICB0ZW5hbnRJZDogb3B0aW9ucy50ZW5hbnRJZCxcbiAgICBwcmluY2lwYWxJZDogb3B0aW9ucy5wcmluY2lwYWxJZCxcbiAgICBwZXJtaXNzaW9uS2V5OiBvcHRpb25zLnBlcm1pc3Npb25LZXksXG4gICAgYWxsb3dlZE9yZ1VuaXRJZHM6IFsuLi5vcHRpb25zLmFsbG93ZWRPcmdVbml0SWRzXSxcbiAgICBhbGxvd2VkUmVzb3VyY2VJZHM6IFsuLi5vcHRpb25zLmFsbG93ZWRSZXNvdXJjZUlkc10sXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFFkcmFudEZpbHRlcihvcHRpb25zOiB7XG4gIHRlbmFudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbElkOiBzdHJpbmc7XG4gIHBlcm1pc3Npb25LZXk6IHN0cmluZztcbiAgYWxsb3dlZE9yZ1VuaXRJZHM6IHN0cmluZ1tdO1xuICBhbGxvd2VkUmVzb3VyY2VJZHM6IHN0cmluZ1tdO1xufSk6IFFkcmFudEF1dGhGaWx0ZXIge1xuICByZXR1cm4ge1xuICAgIG11c3Q6IFtcbiAgICAgIHtcbiAgICAgICAga2V5OiBcInRlbmFudF9pZFwiLFxuICAgICAgICBtYXRjaDogeyB2YWx1ZTogb3B0aW9ucy50ZW5hbnRJZCB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgc2hvdWxkOiBbXG4gICAgICAgICAgeyBrZXk6IFwib3JnX3VuaXRfaWRcIiwgbWF0Y2g6IHsgYW55OiBvcHRpb25zLmFsbG93ZWRPcmdVbml0SWRzIH0gfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IFwicHJvdGVjdGVkX3Jlc291cmNlX2lkXCIsXG4gICAgICAgICAgICBtYXRjaDogeyBhbnk6IG9wdGlvbnMuYWxsb3dlZFJlc291cmNlSWRzIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7IGtleTogXCJvd25lcl9wcmluY2lwYWxfaWRcIiwgbWF0Y2g6IHsgdmFsdWU6IG9wdGlvbnMucHJpbmNpcGFsSWQgfSB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzY29wZUtleShzY29wZUtpbmQ6IFNjb3BlS2luZCwgc2NvcGVJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3Njb3BlS2luZH06JHtzY29wZUlkfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3dJc28oKTogRGF0ZSB7XG4gIHJldHVybiBuZXcgRGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNBcnJheTxUPih2YWx1ZTogVFtdIHwgdW5kZWZpbmVkKTogVFtdIHtcbiAgcmV0dXJuIHZhbHVlID8/IFtdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FtZVRlbmFudChyb3dUZW5hbnQ6IHVua25vd24sIHRlbmFudElkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHJlbGF0aW9uSWQocm93VGVuYW50IGFzIHsgaWQ6IHN0cmluZyB9IHwgc3RyaW5nKSA9PT0gdGVuYW50SWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGlvbk1hdGNoKFxuICB2YWx1ZTogdW5rbm93bixcbiAgdGFyZ2V0OiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFyZ2V0XG4gICAgPyByZWxhdGlvbklkKHZhbHVlIGFzIHsgaWQ6IHN0cmluZyB9IHwgc3RyaW5nKSA9PT0gdGFyZ2V0XG4gICAgOiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyU2x1Zyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZVxuICAgICAgLnRyaW0oKVxuICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csIFwiLVwiKVxuICAgICAgLnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIikgfHwgXCJpdGVtXCJcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVGltZVZhbGlkKFxuICBhdDogRGF0ZSB8IHVuZGVmaW5lZCxcbiAgc3RhcnRzQXQ/OiBEYXRlLFxuICBleHBpcmVzQXQ/OiBEYXRlXG4pOiBib29sZWFuIHtcbiAgY29uc3QgaW5zdGFudCA9IGF0ID8/IG5ldyBEYXRlKCk7XG4gIGlmIChzdGFydHNBdCAmJiBpbnN0YW50IDwgc3RhcnRzQXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGV4cGlyZXNBdCAmJiBpbnN0YW50ID4gZXhwaXJlc0F0KSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBY2Nlc3NDb250ZXh0KG9wdGlvbnM6IHtcbiAgdGVuYW50SWQ6IHN0cmluZztcbiAgcHJpbmNpcGFsSWQ6IHN0cmluZztcbiAgcGVybWlzc2lvbnM6IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdFtdO1xuICBncmFudHM6IEdyYW50U25hcHNob3RbXTtcbn0pOiBBY2Nlc3NDb250ZXh0IHtcbiAgY29uc3QgcGVybWlzc2lvbnNCeVNjb3BlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3QgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb246IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBvcHRpb25zLnBlcm1pc3Npb25zKSB7XG4gICAgY29uc3Qga2V5ID0gc2NvcGVLZXkocGVybWlzc2lvbi5zY29wZUtpbmQsIHBlcm1pc3Npb24uc2NvcGVJZCk7XG4gICAgcGVybWlzc2lvbnNCeVNjb3BlW2tleV0gPSBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XSA/PyBbXTtcbiAgICBwZXJtaXNzaW9uc0J5U2NvcGVba2V5XS5wdXNoKHBlcm1pc3Npb24ucGVybWlzc2lvbktleSk7XG4gICAgaWYgKHBlcm1pc3Npb24uc2NvcGVLaW5kID09PSBTY29wZUtpbmQuT3JnVW5pdCkge1xuICAgICAgYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5XSA9XG4gICAgICAgIGFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb24ucGVybWlzc2lvbktleV0gPz8gW107XG4gICAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbltwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXldLnB1c2goXG4gICAgICAgIHBlcm1pc3Npb24uc2NvcGVJZFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRlbmFudElkOiBvcHRpb25zLnRlbmFudElkLFxuICAgIHByaW5jaXBhbElkOiBvcHRpb25zLnByaW5jaXBhbElkLFxuICAgIHBlcm1pc3Npb25zQnlTY29wZSxcbiAgICBhbGxvd2VkT3JnVW5pdElkc0J5UGVybWlzc2lvbixcbiAgICByZXNvdXJjZUdyYW50czogb3B0aW9ucy5ncmFudHMubWFwKChncmFudCkgPT4gKHtcbiAgICAgIHJlc291cmNlSWQ6IGdyYW50LnJlc291cmNlSWQsXG4gICAgICBwZXJtaXNzaW9uS2V5OiBncmFudC5wZXJtaXNzaW9uS2V5LFxuICAgIH0pKSxcbiAgfTtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNb2RlbFNlcnZpY2U8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPiAmIHsgaWQ6IHN0cmluZyB9LFxuPiBleHRlbmRzIE1vZGVsU2VydmljZTxNLCBSZXBvc2l0b3J5PE0sIGFueT4+IHtcbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKGNsYXp6OiBuZXcgKCkgPT4gTSkge1xuICAgIHN1cGVyKGNsYXp6KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdNb2RlbDxUPihjbGF6ejogbmV3ICgpID0+IFQsIGRhdGE6IFBhcnRpYWw8VD4pOiBUIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgY2xhenooKSBhcyBvYmplY3QsIGRhdGEgYXMgb2JqZWN0KSBhcyBUO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlKGRhdGE6IFBhcnRpYWw8TT4sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwby5jcmVhdGUoT2JqZWN0LmFzc2lnbih7fSBhcyBNLCBkYXRhIGFzIG9iamVjdCksIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlT25lKGRhdGE6IFBhcnRpYWw8TT4sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKGRhdGEsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlJZChpZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8ucmVhZChpZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVPbmUoaWQ6IHN0cmluZywgcGF0Y2g6IFBhcnRpYWw8TT4sIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxNPiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLnJlcG8ucmVhZChpZCwgLi4uYXJncyk7XG4gICAgcmV0dXJuIHRoaXMucmVwby51cGRhdGUoT2JqZWN0LmFzc2lnbihleGlzdGluZywgcGF0Y2gpLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUJ5SWQoaWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLnJlcG8uZGVsZXRlKGlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmVCeTxLIGV4dGVuZHMga2V5b2YgTSAmIHN0cmluZz4oXG4gICAga2V5OiBLLFxuICAgIHZhbHVlOiBNW0tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uZmluZE9uZUJ5KGtleSwgdmFsdWUsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZE1hbnlCeTxLIGV4dGVuZHMga2V5b2YgTSAmIHN0cmluZz4oXG4gICAga2V5OiBLLFxuICAgIHZhbHVlOiBNW0tdLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8TVtdPiB7XG4gICAgcmV0dXJuIHRoaXMucmVwb1xuICAgICAgLnNlbGVjdCgpXG4gICAgICAud2hlcmUoeyBba2V5XTogdmFsdWUgfSBhcyBhbnkpXG4gICAgICAuZXhlY3V0ZSguLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RBbGwoLi4uYXJnczogYW55W10pOiBQcm9taXNlPE1bXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG8uc2VsZWN0KCkuZXhlY3V0ZSguLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaWQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZWxhdGlvbklkKHZhbHVlOiBzdHJpbmcgfCB7IGlkOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlLmlkO1xufVxuXG5leHBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IsIHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aG9yaXphdGlvbk1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEgYXMgbmV2ZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgTWVtYmVyc2hpcFN0YXR1c09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4vdXNlci5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRfbWVtYmVyc2hpcHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVGVuYW50TWVtYmVyc2hpcCBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfbWVtYmVyc2hpcHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBVc2VyLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfdGVuYW50X21lbWJlcnNoaXBzX3VzZXJcIilcbiAgQHJlcXVpcmVkKClcbiAgdXNlciE6IFVzZXIgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zKSBAY29sdW1uKCkgc3RhdHVzITogTWVtYmVyc2hpcFN0YXR1cztcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHtcbiAgY29sdW1uLFxuICBjcmVhdGVkQXQsXG4gIG9uZVRvTWFueSxcbiAgcGssXG4gIHRhYmxlLFxuICB1bmlxdWUsXG4gIHVwZGF0ZWRBdCxcbiAgdXVpZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbkB0YWJsZShcInVzZXJzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFVzZXIgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSlcbiAgQHV1aWQoKVxuICBpZCE6IHN0cmluZztcblxuICBAdW5pcXVlKClcbiAgQHR5cGUoU3RyaW5nKVxuICBAY29sdW1uKClcbiAgZW1haWw/OiBzdHJpbmc7XG5cbiAgQHVuaXF1ZSgpXG4gIEB0eXBlKFN0cmluZylcbiAgQGNvbHVtbigpXG4gIHBob25lPzogc3RyaW5nO1xuXG4gIEByZXF1aXJlZCgpXG4gIEB0eXBlKFN0cmluZylcbiAgQGNvbHVtbigpXG4gIGRpc3BsYXlOYW1lITogc3RyaW5nO1xuXG4gIEBvbmVUb01hbnkoKCkgPT4gVGVuYW50TWVtYmVyc2hpcCwgUkVMX1JFU1RSSUNULCBmYWxzZSlcbiAgdGVuYW50TWVtYmVyc2hpcHM/OiBUZW5hbnRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcblxuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKVxuICBvcmdVbml0TWVtYmVyc2hpcHM/OiBPcmdVbml0TWVtYmVyc2hpcFtdIHwgc3RyaW5nW107XG5cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG5cbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIE1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFVzZXIgfSBmcm9tIFwiLi91c2VyLm1vZGVsXCI7XG5cbkB0YWJsZShcIm9yZ191bml0X21lbWJlcnNoaXBzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRNZW1iZXJzaGlwIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfbWVtYmVyc2hpcHNfb3JnX3VuaXRcIilcbiAgQHJlcXVpcmVkKClcbiAgb3JnVW5pdCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVXNlciwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19tZW1iZXJzaGlwc191c2VyXCIpXG4gIEByZXF1aXJlZCgpXG4gIHVzZXIhOiBVc2VyIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihNZW1iZXJzaGlwU3RhdHVzT3B0aW9ucykgQGNvbHVtbigpIHN0YXR1cyE6IE1lbWJlcnNoaXBTdGF0dXM7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfY2xvc3VyZVwiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBPcmdVbml0Q2xvc3VyZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfY2xvc3VyZV90ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19vcmdfY2xvc3VyZV9hbmNlc3RvclwiKVxuICBAcmVxdWlyZWQoKVxuICBhbmNlc3RvciE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ19jbG9zdXJlX2Rlc2NlbmRhbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgZGVzY2VuZGFudCE6IE9yZ1VuaXQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoTnVtYmVyKSBAY29sdW1uKCkgZGVwdGghOiBudW1iZXI7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdW5pcXVlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uQ2F0ZWdvcnksIFBlcm1pc3Npb25DYXRlZ29yeU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZVBlcm1pc3Npb24gfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24ubW9kZWxcIjtcblxuQHRhYmxlKFwicGVybWlzc2lvbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQHVuaXF1ZSgpIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkga2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQZXJtaXNzaW9uQ2F0ZWdvcnlPcHRpb25zKSBAY29sdW1uKCkgY2F0ZWdvcnkhOiBQZXJtaXNzaW9uQ2F0ZWdvcnk7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZVBlcm1pc3Npb24sIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJvbGVQZXJtaXNzaW9ucz86IFJvbGVQZXJtaXNzaW9uW10gfCBzdHJpbmdbXTtcbn1cbiIsImltcG9ydCB7IGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZSB9IGZyb20gXCIuL3JvbGUubW9kZWxcIjtcbmltcG9ydCB7IFBlcm1pc3Npb24gfSBmcm9tIFwiLi9wZXJtaXNzaW9uLm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVfcGVybWlzc2lvbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUm9sZVBlcm1pc3Npb24gZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUm9sZSwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfcGVybWlzc2lvbnNfcm9sZVwiKVxuICBAcmVxdWlyZWQoKVxuICByb2xlITogUm9sZSB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQZXJtaXNzaW9uLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9wZXJtaXNzaW9uc19wZXJtaXNzaW9uXCIpXG4gIEByZXF1aXJlZCgpXG4gIHBlcm1pc3Npb24hOiBQZXJtaXNzaW9uIHwgc3RyaW5nO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfTlVMTElGWSwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uIH0gZnJvbSBcIi4vcm9sZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBSb2xlQXNzaWdubWVudCB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJyb2xlc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBSb2xlIGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFRlbmFudCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZXNfdGVuYW50XCIpXG4gIHRlbmFudD86IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBrZXkhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgbmFtZSE6IHN0cmluZztcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IFJvbGVQZXJtaXNzaW9uLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSByb2xlUGVybWlzc2lvbnM/OiBSb2xlUGVybWlzc2lvbltdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gUm9sZUFzc2lnbm1lbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGFzc2lnbm1lbnRzPzogUm9sZUFzc2lnbm1lbnRbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIG9wdGlvbiwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgU2NvcGVLaW5kLCBTY29wZUtpbmRPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIFJFTF9SRVNUUklDVCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcbmltcG9ydCB7IFJvbGUgfSBmcm9tIFwiLi9yb2xlLm1vZGVsXCI7XG5cbkB0YWJsZShcInJvbGVfYXNzaWdubWVudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUm9sZUFzc2lnbm1lbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IFByaW5jaXBhbCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3JvbGVfYXNzaWdubWVudHNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBSb2xlLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcm9sZV9hc3NpZ25tZW50c19yb2xlXCIpXG4gIEByZXF1aXJlZCgpXG4gIHJvbGUhOiBSb2xlIHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihTY29wZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc2NvcGVLaW5kITogU2NvcGVLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNjb3BlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoQm9vbGVhbikgQGNvbHVtbigpIGluaGVyaXREb3duITogYm9vbGVhbjtcbiAgQGNvbHVtbigpIHN0YXJ0c0F0PzogRGF0ZTtcbiAgQGNvbHVtbigpIGV4cGlyZXNBdD86IERhdGU7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgY29uZGl0aW9ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9DQVNDQURFX0RFUEVOREVOVCwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi9wcm90ZWN0ZWQtcmVzb3VyY2UubW9kZWxcIjtcblxuQHRhYmxlKFwicmVzb3VyY2VfZ3JhbnRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIFJlc291cmNlR3JhbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJvdGVjdGVkUmVzb3VyY2UsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfcmVzb3VyY2VcIilcbiAgQHJlcXVpcmVkKClcbiAgcmVzb3VyY2UhOiBQcm90ZWN0ZWRSZXNvdXJjZSB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19yZXNvdXJjZV9ncmFudHNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwZXJtaXNzaW9uS2V5ITogc3RyaW5nO1xuICBAY29sdW1uKCkgc3RhcnRzQXQ/OiBEYXRlO1xuICBAY29sdW1uKCkgZXhwaXJlc0F0PzogRGF0ZTtcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25kaXRpb25zPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcmVzb3VyY2VfZ3JhbnRzX2NyZWF0ZWRfYnlcIilcbiAgY3JlYXRlZEJ5PzogUHJpbmNpcGFsIHwgc3RyaW5nO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBvbmVUb01hbnksIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgb3B0aW9uLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxLaW5kLCBQcmluY2lwYWxLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZUdyYW50IH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQubW9kZWxcIjtcblxuQHRhYmxlKFwicHJpbmNpcGFsc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBQcmluY2lwYWwgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJpbmNpcGFsc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihQcmluY2lwYWxLaW5kT3B0aW9ucykgQGNvbHVtbigpIGtpbmQhOiBQcmluY2lwYWxLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHN1YmplY3RJZCE6IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBSb2xlQXNzaWdubWVudCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcm9sZUFzc2lnbm1lbnRzPzogUm9sZUFzc2lnbm1lbnRbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFJlc291cmNlR3JhbnQsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHJlc291cmNlR3JhbnRzPzogUmVzb3VyY2VHcmFudFtdIHwgc3RyaW5nW107XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFJFTF9OVUxMSUZZLCBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFJlc291cmNlVmlzaWJpbGl0eSwgUmVzb3VyY2VWaXNpYmlsaXR5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuaW1wb3J0IHsgUmVzb3VyY2VHcmFudCB9IGZyb20gXCIuL3Jlc291cmNlLWdyYW50Lm1vZGVsXCI7XG5cbkB0YWJsZShcInByb3RlY3RlZF9yZXNvdXJjZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgUHJvdGVjdGVkUmVzb3VyY2UgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfcHJvdGVjdGVkX3Jlc291cmNlc190ZW5hbnRcIilcbiAgQHJlcXVpcmVkKClcbiAgdGVuYW50ITogVGVuYW50IHwgc3RyaW5nO1xuICBAbWFueVRvT25lKCgpID0+IE9yZ1VuaXQsIFJFTF9SRVNUUklDVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19wcm90ZWN0ZWRfcmVzb3VyY2VzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlc291cmNlVHlwZSE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZXNvdXJjZUlkITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihSZXNvdXJjZVZpc2liaWxpdHlPcHRpb25zKSBAY29sdW1uKCkgdmlzaWJpbGl0eSE6IFJlc291cmNlVmlzaWJpbGl0eTtcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9OVUxMSUZZLCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX3Byb3RlY3RlZF9yZXNvdXJjZXNfb3duZXJcIilcbiAgb3duZXI/OiBQcmluY2lwYWwgfCBzdHJpbmc7XG4gIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc2Vuc2l0aXZpdHk/OiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG9uZVRvTWFueSgoKSA9PiBSZXNvdXJjZUdyYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBncmFudHM/OiBSZXNvdXJjZUdyYW50W10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSwgUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBSRUxfTlVMTElGWSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXV0aG9yaXphdGlvbk1vZGVsIH0gZnJvbSBcIi4vYXV0aG9yaXphdGlvbi1tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50IH0gZnJvbSBcIi4vdGVuYW50Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcblxuQHRhYmxlKFwiaW5oZXJpdGFuY2VfYmxvY2tzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEluaGVyaXRhbmNlQmxvY2sgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfaW5oZXJpdGFuY2VfYmxvY2tzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2luaGVyaXRhbmNlX2Jsb2Nrc19vcmdfdW5pdFwiKVxuICBAcmVxdWlyZWQoKVxuICBvcmdVbml0ITogT3JnVW5pdCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBPcmdVbml0LCBSRUxfTlVMTElGWSwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19pbmhlcml0YW5jZV9ibG9ja3NfYmxvY2tlZF9hbmNlc3RvclwiKVxuICBibG9ja2VkRnJvbUFuY2VzdG9yPzogT3JnVW5pdCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBvcHRpb24oUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucykgQGNvbHVtbigpIHBlcm1pc3Npb25DYXRlZ29yeSE6IFBlcm1pc3Npb25DYXRlZ29yeTtcbiAgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSByZWFzb24/OiBzdHJpbmc7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuaW1wb3J0IHsgT3JnVW5pdE1lbWJlcnNoaXAgfSBmcm9tIFwiLi9vcmctdW5pdC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUubW9kZWxcIjtcbmltcG9ydCB7IFByb3RlY3RlZFJlc291cmNlIH0gZnJvbSBcIi4vcHJvdGVjdGVkLXJlc291cmNlLm1vZGVsXCI7XG5pbXBvcnQgeyBJbmhlcml0YW5jZUJsb2NrIH0gZnJvbSBcIi4vaW5oZXJpdGFuY2UtYmxvY2subW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIE9yZ1VuaXQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfb3JnX3VuaXRzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ191bml0c19wYXJlbnRcIilcbiAgcGFyZW50PzogT3JnVW5pdCB8IHN0cmluZztcbiAgQG9uZVRvTWFueSgoKSA9PiBPcmdVbml0LCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBjaGlsZHJlbj86IE9yZ1VuaXRbXSB8IHN0cmluZ1tdO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIG5hbWUhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgcGF0aCE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAb25lVG9NYW55KCgpID0+IE9yZ1VuaXRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBtZW1iZXJzaGlwcz86IE9yZ1VuaXRNZW1iZXJzaGlwW10gfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBQcm90ZWN0ZWRSZXNvdXJjZSwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcmVzb3VyY2VzPzogUHJvdGVjdGVkUmVzb3VyY2VbXSB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IEluaGVyaXRhbmNlQmxvY2ssIFJFTF9SRVNUUklDVCwgZmFsc2UpIGluaGVyaXRhbmNlQmxvY2tzPzogSW5oZXJpdGFuY2VCbG9ja1tdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdENsb3N1cmUsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGFuY2VzdG9yTGlua3M/OiBPcmdVbml0Q2xvc3VyZVtdIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdENsb3N1cmUsIFJFTF9SRVNUUklDVCwgZmFsc2UpIGRlc2NlbmRhbnRMaW5rcz86IE9yZ1VuaXRDbG9zdXJlW10gfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFN0b3JhZ2VCaW5kaW5nS2luZCwgU3RvcmFnZUJpbmRpbmdLaW5kT3B0aW9ucywgU3RvcmFnZUtpbmQsIFN0b3JhZ2VLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcblxuQHRhYmxlKFwic3RvcmFnZV9iaW5kaW5nc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBTdG9yYWdlQmluZGluZyBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19zdG9yYWdlX2JpbmRpbmdzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFN0b3JhZ2VLaW5kT3B0aW9ucykgQGNvbHVtbigpIHN0b3JhZ2VLaW5kITogU3RvcmFnZUtpbmQ7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAb3B0aW9uKFN0b3JhZ2VCaW5kaW5nS2luZE9wdGlvbnMpIEBjb2x1bW4oKSBiaW5kaW5nS2luZCE6IFN0b3JhZ2VCaW5kaW5nS2luZDtcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBiaW5kaW5nS2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHJlZ2lvbiE6IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHtcbiAgY29sdW1uLFxuICBjcmVhdGVkQXQsXG4gIG9uZVRvTWFueSxcbiAgcGssXG4gIHRhYmxlLFxuICB1bmlxdWUsXG4gIHVwZGF0ZWRBdCxcbiAgdXVpZCxcbn0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQge1xuICBtb2RlbCxcbiAgb3B0aW9uLFxuICByZXF1aXJlZCxcbiAgdHlwZSBhcyB0eXBlT2YsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IElzb2xhdGlvblRpZXIsIElzb2xhdGlvblRpZXJPcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSRUxfUkVTVFJJQ1QgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcCB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi9wcmluY2lwYWwubW9kZWxcIjtcbmltcG9ydCB7IFN0b3JhZ2VCaW5kaW5nIH0gZnJvbSBcIi4vc3RvcmFnZS1iaW5kaW5nLm1vZGVsXCI7XG5cbkB0YWJsZShcInRlbmFudHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVGVuYW50IGV4dGVuZHMgQXV0aG9yaXphdGlvbk1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IHVua25vd24pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwayh7IHR5cGU6IFN0cmluZyB9KSBAdXVpZCgpIGlkITogc3RyaW5nO1xuICBAdW5pcXVlKCkgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzbHVnITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIG5hbWUhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpXG4gIEB0eXBlT2YoU3RyaW5nKVxuICBAb3B0aW9uKElzb2xhdGlvblRpZXJPcHRpb25zKVxuICBAY29sdW1uKClcbiAgaXNvbGF0aW9uVGllciE6IElzb2xhdGlvblRpZXI7XG4gIEBvbmVUb01hbnkoKCkgPT4gT3JnVW5pdCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgb3JnVW5pdHM/OlxuICAgIHwgT3JnVW5pdFtdXG4gICAgfCBzdHJpbmdbXTtcbiAgQG9uZVRvTWFueSgoKSA9PiBUZW5hbnRNZW1iZXJzaGlwLCBSRUxfUkVTVFJJQ1QsIGZhbHNlKSBtZW1iZXJzaGlwcz86XG4gICAgfCBUZW5hbnRNZW1iZXJzaGlwW11cbiAgICB8IHN0cmluZ1tdO1xuICBAb25lVG9NYW55KCgpID0+IFByaW5jaXBhbCwgUkVMX1JFU1RSSUNULCBmYWxzZSkgcHJpbmNpcGFscz86XG4gICAgfCBQcmluY2lwYWxbXVxuICAgIHwgc3RyaW5nW107XG4gIEBvbmVUb01hbnkoKCkgPT4gU3RvcmFnZUJpbmRpbmcsIFJFTF9SRVNUUklDVCwgZmFsc2UpIHN0b3JhZ2VCaW5kaW5ncz86XG4gICAgfCBTdG9yYWdlQmluZGluZ1tdXG4gICAgfCBzdHJpbmdbXTtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEF1dGhvcml6YXRpb25Nb2RlbCB9IGZyb20gXCIuL2F1dGhvcml6YXRpb24tbW9kZWxcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuL3RlbmFudC5tb2RlbFwiO1xuXG5AdGFibGUoXCJ0ZW5hbnRfcHJvZmlsZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgVGVuYW50UHJvZmlsZSBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma190ZW5hbnRfcHJvZmlsZXNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwcm9maWxlS2V5ITogc3RyaW5nO1xuICBAdHlwZU9mKE9iamVjdCkgQGNvbHVtbigpIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xuICBAdXBkYXRlZEF0KCkgdXBkYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIHBrLCB0YWJsZSwgdXBkYXRlZEF0LCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0IH0gZnJvbSBcIi4vb3JnLXVuaXQubW9kZWxcIjtcblxuQHRhYmxlKFwib3JnX3VuaXRfcHJvZmlsZXNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgT3JnVW5pdFByb2ZpbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX29yZ191bml0X3Byb2ZpbGVzX29yZ191bml0XCIpXG4gIEByZXF1aXJlZCgpXG4gIG9yZ1VuaXQhOiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHByb2ZpbGVLZXkhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQGNyZWF0ZWRBdCgpIGNyZWF0ZWRBdCE6IERhdGU7XG4gIEB1cGRhdGVkQXQoKSB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgY29sdW1uLCBjcmVhdGVkQXQsIG1hbnlUb09uZSwgcGssIHRhYmxlLCB1dWlkIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBtb2RlbCwgcmVxdWlyZWQsIHR5cGUgYXMgdHlwZU9mIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4vZ3JvdXAubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuXG5AdGFibGUoXCJncm91cF9tZW1iZXJzaGlwc1wiKVxuQG1vZGVsKClcbmV4cG9ydCBjbGFzcyBHcm91cE1lbWJlcnNoaXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBHcm91cCwgUkVMX0NBU0NBREVfREVQRU5ERU5ULCBmYWxzZSwgdW5kZWZpbmVkLCBcImZrX2dyb3VwX21lbWJlcnNoaXBzX2dyb3VwXCIpXG4gIEByZXF1aXJlZCgpXG4gIGdyb3VwITogR3JvdXAgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gUHJpbmNpcGFsLCBSRUxfQ0FTQ0FERV9ERVBFTkRFTlQsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBfbWVtYmVyc2hpcHNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHR5cGVPZihPYmplY3QpIEBjb2x1bW4oKSBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbn1cbiIsImltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBtYW55VG9PbmUsIG9uZVRvTWFueSwgcGssIHRhYmxlLCB1cGRhdGVkQXQsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCByZXF1aXJlZCwgdHlwZSBhcyB0eXBlT2YgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSRUxfTlVMTElGWSwgUkVMX1JFU1RSSUNUIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi9vcmctdW5pdC5tb2RlbFwiO1xuaW1wb3J0IHsgR3JvdXBNZW1iZXJzaGlwIH0gZnJvbSBcIi4vZ3JvdXAtbWVtYmVyc2hpcC5tb2RlbFwiO1xuXG5AdGFibGUoXCJncm91cHNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgR3JvdXAgZXh0ZW5kcyBBdXRob3JpemF0aW9uTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogdW5rbm93bikge1xuICAgIHN1cGVyKGRhdGEpO1xuICB9XG5cbiAgQHBrKHsgdHlwZTogU3RyaW5nIH0pIEB1dWlkKCkgaWQhOiBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gVGVuYW50LCBSRUxfUkVTVFJJQ1QsIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBzX3RlbmFudFwiKVxuICBAcmVxdWlyZWQoKVxuICB0ZW5hbnQhOiBUZW5hbnQgfCBzdHJpbmc7XG4gIEBtYW55VG9PbmUoKCkgPT4gT3JnVW5pdCwgUkVMX05VTExJRlksIGZhbHNlLCB1bmRlZmluZWQsIFwiZmtfZ3JvdXBzX29yZ191bml0XCIpXG4gIG9yZ1VuaXQ/OiBPcmdVbml0IHwgc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIG5hbWUhOiBzdHJpbmc7XG4gIEB0eXBlT2YoT2JqZWN0KSBAY29sdW1uKCkgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgQG9uZVRvTWFueSgoKSA9PiBHcm91cE1lbWJlcnNoaXAsIFJFTF9SRVNUUklDVCwgZmFsc2UpIG1lbWJlcnM/OiBHcm91cE1lbWJlcnNoaXBbXSB8IHN0cmluZ1tdO1xuICBAY3JlYXRlZEF0KCkgY3JlYXRlZEF0ITogRGF0ZTtcbiAgQHVwZGF0ZWRBdCgpIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBjb2x1bW4sIGNyZWF0ZWRBdCwgbWFueVRvT25lLCBwaywgdGFibGUsIHV1aWQgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IG1vZGVsLCBvcHRpb24sIHJlcXVpcmVkLCB0eXBlIGFzIHR5cGVPZiB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFNjb3BlS2luZCwgU2NvcGVLaW5kT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUkVMX0NBU0NBREVfREVQRU5ERU5UIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBdXRob3JpemF0aW9uTW9kZWwgfSBmcm9tIFwiLi9hdXRob3JpemF0aW9uLW1vZGVsXCI7XG5pbXBvcnQgeyBUZW5hbnQgfSBmcm9tIFwiLi90ZW5hbnQubW9kZWxcIjtcbmltcG9ydCB7IFByaW5jaXBhbCB9IGZyb20gXCIuL3ByaW5jaXBhbC5tb2RlbFwiO1xuXG5AdGFibGUoXCJlZmZlY3RpdmVfcGVybWlzc2lvbnNcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRWZmZWN0aXZlUGVybWlzc2lvbiBleHRlbmRzIEF1dGhvcml6YXRpb25Nb2RlbCB7XG4gIGNvbnN0cnVjdG9yKGRhdGE/OiB1bmtub3duKSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoeyB0eXBlOiBTdHJpbmcgfSkgQHV1aWQoKSBpZCE6IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBUZW5hbnQsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19lZmZlY3RpdmVfcGVybWlzc2lvbnNfdGVuYW50XCIpXG4gIEByZXF1aXJlZCgpXG4gIHRlbmFudCE6IFRlbmFudCB8IHN0cmluZztcbiAgQG1hbnlUb09uZSgoKSA9PiBQcmluY2lwYWwsIFJFTF9DQVNDQURFX0RFUEVOREVOVCwgZmFsc2UsIHVuZGVmaW5lZCwgXCJma19lZmZlY3RpdmVfcGVybWlzc2lvbnNfcHJpbmNpcGFsXCIpXG4gIEByZXF1aXJlZCgpXG4gIHByaW5jaXBhbCE6IFByaW5jaXBhbCB8IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBwZXJtaXNzaW9uS2V5ITogc3RyaW5nO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQG9wdGlvbihTY29wZUtpbmRPcHRpb25zKSBAY29sdW1uKCkgc2NvcGVLaW5kITogU2NvcGVLaW5kO1xuICBAcmVxdWlyZWQoKSBAdHlwZU9mKFN0cmluZykgQGNvbHVtbigpIHNjb3BlSWQhOiBzdHJpbmc7XG4gIEByZXF1aXJlZCgpIEB0eXBlT2YoU3RyaW5nKSBAY29sdW1uKCkgc291cmNlS2luZCE6IHN0cmluZztcbiAgQHJlcXVpcmVkKCkgQHR5cGVPZihTdHJpbmcpIEBjb2x1bW4oKSBzb3VyY2VJZCE6IHN0cmluZztcbiAgQGNvbHVtbigpIHN0YXJ0c0F0PzogRGF0ZTtcbiAgQGNvbHVtbigpIGV4cGlyZXNBdD86IERhdGU7XG4gIEBjcmVhdGVkQXQoKSBjcmVhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgVGVuYW50UHJvZmlsZSB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50LXByb2ZpbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFRlbmFudFByb2ZpbGVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnRQcm9maWxlPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFRlbmFudFByb2ZpbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvZmlsZShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50UHJvZmlsZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgcHJvZmlsZUtleSxcbiAgICAgICAgbWV0YWRhdGEsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yVGVuYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxUZW5hbnRQcm9maWxlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcm9maWxlKSA9PlxuICAgICAgc2FtZVRlbmFudChwcm9maWxlLnRlbmFudCwgdGVuYW50SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGF3YWl0IHRoaXMubGlzdEZvclRlbmFudCh0ZW5hbnRJZCwgLi4uYXJncykpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25NYXRjaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgT3JnVW5pdFByb2ZpbGUgfSBmcm9tIFwiLi4vbW9kZWxzL29yZy11bml0LXByb2ZpbGUubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIE9yZ1VuaXRQcm9maWxlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8T3JnVW5pdFByb2ZpbGU+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoT3JnVW5pdFByb2ZpbGUpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUHJvZmlsZShcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBwcm9maWxlS2V5OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRQcm9maWxlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIHByb2ZpbGVLZXksXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvck9yZ1VuaXQoXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0UHJvZmlsZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocHJvZmlsZSkgPT5cbiAgICAgIHJlbGF0aW9uTWF0Y2gocHJvZmlsZS5vcmdVbml0LCBvcmdVbml0SWQpXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQmFzZU1vZGVsU2VydmljZSxcbiAgcmVsYXRpb25JZCxcbiAgcmVsYXRpb25NYXRjaCxcbiAgc2FtZVRlbmFudCxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZSB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtY2xvc3VyZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdENsb3N1cmVTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0Q2xvc3VyZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0Q2xvc3VyZSk7XG4gIH1cblxuICBhc3luYyBsaXN0QW5jZXN0b3JzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0Q2xvc3VyZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocm93KSA9PlxuICAgICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgICAgcmVsYXRpb25NYXRjaChyb3cuZGVzY2VuZGFudCwgb3JnVW5pdElkKVxuICAgICAgKVxuICAgICAgLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0LmRlcHRoIC0gcmlnaHQuZGVwdGgpO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc2NlbmRhbnRzKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0Q2xvc3VyZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpXG4gICAgICAuZmlsdGVyKFxuICAgICAgICAocm93KSA9PlxuICAgICAgICAgIHNhbWVUZW5hbnQocm93LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgICAgcmVsYXRpb25NYXRjaChyb3cuYW5jZXN0b3IsIG9yZ1VuaXRJZClcbiAgICAgIClcbiAgICAgIC5zb3J0KChsZWZ0LCByaWdodCkgPT4gbGVmdC5kZXB0aCAtIHJpZ2h0LmRlcHRoKTtcbiAgfVxuXG4gIGFzeW5jIGlzQW5jZXN0b3JPZihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGFuY2VzdG9yT3JnVW5pdElkOiBzdHJpbmcsXG4gICAgZGVzY2VuZGFudE9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHJldHVybiAoXG4gICAgICBhd2FpdCB0aGlzLmxpc3RBbmNlc3RvcnModGVuYW50SWQsIGRlc2NlbmRhbnRPcmdVbml0SWQsIC4uLmFyZ3MpXG4gICAgKS5zb21lKChyb3cpID0+IHJlbGF0aW9uTWF0Y2gocm93LmFuY2VzdG9yLCBhbmNlc3Rvck9yZ1VuaXRJZCkpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlU2VsZkxpbmsoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPE9yZ1VuaXRDbG9zdXJlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBhbmNlc3Rvcjogb3JnVW5pdElkLFxuICAgICAgICBkZXNjZW5kYW50OiBvcmdVbml0SWQsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcGFyZW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgY2hpbGRPcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhbmNlc3RvckxpbmtzID0gYXdhaXQgdGhpcy5saXN0QW5jZXN0b3JzKFxuICAgICAgdGVuYW50SWQsXG4gICAgICBwYXJlbnRPcmdVbml0SWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IGxpbmsgb2YgYW5jZXN0b3JMaW5rcykge1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICAgIGFuY2VzdG9yOiBsaW5rLmFuY2VzdG9yLFxuICAgICAgICAgIGRlc2NlbmRhbnQ6IGNoaWxkT3JnVW5pdElkLFxuICAgICAgICAgIGRlcHRoOiBsaW5rLmRlcHRoICsgMSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkZWxldGVMaW5rc0ZvclN1YnRyZWUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdWJ0cmVlID0gYXdhaXQgdGhpcy5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZGVzY2VuZGFudElkcyA9IG5ldyBTZXQoW1xuICAgICAgb3JnVW5pdElkLFxuICAgICAgLi4uc3VidHJlZS5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpLFxuICAgIF0pO1xuICAgIGNvbnN0IGFuY2VzdG9ySWRzID0gbmV3IFNldChbXG4gICAgICBvcmdVbml0SWQsXG4gICAgICAuLi5zdWJ0cmVlLm1hcCgocm93KSA9PiByZWxhdGlvbklkKHJvdy5hbmNlc3RvcikpLFxuICAgIF0pO1xuICAgIGNvbnN0IHJvd3MgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAocm93KSA9PlxuICAgICAgICBzYW1lVGVuYW50KHJvdy50ZW5hbnQsIHRlbmFudElkKSAmJlxuICAgICAgICAoZGVzY2VuZGFudElkcy5oYXMocmVsYXRpb25JZChyb3cuZGVzY2VuZGFudCkpIHx8XG4gICAgICAgICAgYW5jZXN0b3JJZHMuaGFzKHJlbGF0aW9uSWQocm93LmFuY2VzdG9yKSkpXG4gICAgKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb25DYXRlZ29yeSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgSW5oZXJpdGFuY2VCbG9jayB9IGZyb20gXCIuLi9tb2RlbHMvaW5oZXJpdGFuY2UtYmxvY2subW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKEluaGVyaXRhbmNlQmxvY2spO1xuICB9XG5cbiAgYXN5bmMgYmxvY2tDYXRlZ29yeShcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25DYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LFxuICAgIGJsb2NrZWRGcm9tQW5jZXN0b3JJZD86IHN0cmluZyxcbiAgICByZWFzb24/OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxJbmhlcml0YW5jZUJsb2NrPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIGJsb2NrZWRGcm9tQW5jZXN0b3I6IGJsb2NrZWRGcm9tQW5jZXN0b3JJZCxcbiAgICAgICAgcGVybWlzc2lvbkNhdGVnb3J5LFxuICAgICAgICByZWFzb24sXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyB1bmJsb2NrQ2F0ZWdvcnkoYmxvY2tJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChibG9ja0lkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RGb3JPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxJbmhlcml0YW5jZUJsb2NrW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKGJsb2NrKSA9PlxuICAgICAgICBzYW1lVGVuYW50KGJsb2NrLnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIHJlbGF0aW9uTWF0Y2goYmxvY2sub3JnVW5pdCwgb3JnVW5pdElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBjYXRlZ29yeUJsb2NrZWRGb3JBbmNlc3RvcihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGFuY2VzdG9yT3JnVW5pdElkOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk6IFBlcm1pc3Npb25DYXRlZ29yeSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEZvck9yZ1VuaXQodGVuYW50SWQsIG9yZ1VuaXRJZCwgLi4uYXJncykpLnNvbWUoXG4gICAgICAoYmxvY2spID0+XG4gICAgICAgIGJsb2NrLnBlcm1pc3Npb25DYXRlZ29yeSA9PT0gY2F0ZWdvcnkgJiZcbiAgICAgICAgKCFibG9jay5ibG9ja2VkRnJvbUFuY2VzdG9yIHx8XG4gICAgICAgICAgcmVsYXRpb25NYXRjaChibG9jay5ibG9ja2VkRnJvbUFuY2VzdG9yLCBhbmNlc3Rvck9yZ1VuaXRJZCkpXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgSXNvbGF0aW9uVGllciwgQ3JlYXRlVGVuYW50SW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudCB9IGZyb20gXCIuLi9tb2RlbHMvdGVuYW50Lm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW5hbnRTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxUZW5hbnQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoVGVuYW50KTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVRlbmFudChpbnB1dDogQ3JlYXRlVGVuYW50SW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHNsdWc6IGlucHV0LnNsdWcsXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIGlzb2xhdGlvblRpZXI6IGlucHV0Lmlzb2xhdGlvblRpZXIgPz8gSXNvbGF0aW9uVGllci5Qb29sZWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeVNsdWcoc2x1Zzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZE9uZUJ5KFwic2x1Z1wiLCBzbHVnIGFzIG5ldmVyLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHJlbmFtZVRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxUZW5hbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodGVuYW50SWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGNoYW5nZVNsdWcodGVuYW50SWQ6IHN0cmluZywgc2x1Zzogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50PiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHRlbmFudElkLCB7IHNsdWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBzZXRJc29sYXRpb25UaWVyKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgaXNvbGF0aW9uVGllcjogSXNvbGF0aW9uVGllcixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFRlbmFudD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh0ZW5hbnRJZCwgeyBpc29sYXRpb25UaWVyIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlVGVuYW50Q29udHJvbGxlZCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZCh0ZW5hbnRJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIGxvd2VyU2x1ZywgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBDcmVhdGVPcmdVbml0SW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IE9yZ1VuaXQgfSBmcm9tIFwiLi4vbW9kZWxzL29yZy11bml0Lm1vZGVsXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2VcIjtcbmltcG9ydCB7IE9yZ1VuaXRDbG9zdXJlU2VydmljZSB9IGZyb20gXCIuL29yZy11bml0LWNsb3N1cmUuc2VydmljZVwiO1xuaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVSb3dzQnlJZChcbiAgc2VydmljZTogQmFzZU1vZGVsU2VydmljZTxhbnk+LFxuICByb3dzOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4sXG4gIC4uLmFyZ3M6IGFueVtdXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xuICAgIGF3YWl0IHNlcnZpY2UuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBPcmdVbml0U2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8T3JnVW5pdD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0KTtcbiAgfVxuXG4gIHByaXZhdGUgb3JnVW5pdFBhdGgocGFyZW50UGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBsb3dlclNsdWcobmFtZSk7XG4gICAgcmV0dXJuIHBhcmVudFBhdGggPyBgJHtwYXJlbnRQYXRoLnJlcGxhY2UoL1xcLyskLywgXCJcIil9LyR7c2VnbWVudH1gIDogYC8ke3NlZ21lbnR9YDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlUHJvZmlsZUlmTmVlZGVkKFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHByb2ZpbGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwcm9maWxlTWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghcHJvZmlsZUtleSkgcmV0dXJuO1xuICAgIGF3YWl0IG5ldyBPcmdVbml0UHJvZmlsZVNlcnZpY2UoKS5jcmVhdGVQcm9maWxlKG9yZ1VuaXRJZCwgcHJvZmlsZUtleSwgcHJvZmlsZU1ldGFkYXRhLCAuLi5hcmdzKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgY3JlYXRlUm9vdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHByb2ZpbGVLZXk/OiBzdHJpbmcsXG4gICAgcHJvZmlsZU1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0PiB7XG4gICAgY29uc3Qgb3JnVW5pdCA9IGF3YWl0IHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBuYW1lLFxuICAgICAgICBwYXRoOiB0aGlzLm9yZ1VuaXRQYXRoKHVuZGVmaW5lZCwgbmFtZSksXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvZmlsZUlmTmVlZGVkKG9yZ1VuaXQuaWQsIHByb2ZpbGVLZXksIHByb2ZpbGVNZXRhZGF0YSwgLi4uYXJncyk7XG4gICAgYXdhaXQgbmV3IE9yZ1VuaXRDbG9zdXJlU2VydmljZSgpLmNyZWF0ZVNlbGZMaW5rKHRlbmFudElkLCBvcmdVbml0LmlkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gb3JnVW5pdDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgY3JlYXRlQ2hpbGQoaW5wdXQ6IENyZWF0ZU9yZ1VuaXRJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXQ+IHtcbiAgICBjb25zdCBwYXJlbnQgPSBpbnB1dC5wYXJlbnRPcmdVbml0SWQgPyBhd2FpdCB0aGlzLmdldEJ5SWQoaW5wdXQucGFyZW50T3JnVW5pdElkLCAuLi5hcmdzKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvcmdVbml0ID0gYXdhaXQgdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHBhcmVudDogcGFyZW50Py5pZCA/PyBpbnB1dC5wYXJlbnRPcmdVbml0SWQsXG4gICAgICAgIG5hbWU6IGlucHV0Lm5hbWUsXG4gICAgICAgIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgocGFyZW50Py5wYXRoLCBpbnB1dC5uYW1lKSxcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlUHJvZmlsZUlmTmVlZGVkKG9yZ1VuaXQuaWQsIGlucHV0LnByb2ZpbGVLZXksIGlucHV0LnByb2ZpbGVNZXRhZGF0YSwgLi4uYXJncyk7XG4gICAgY29uc3QgY2xvc3VyZVNlcnZpY2UgPSBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCk7XG4gICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuY3JlYXRlU2VsZkxpbmsoaW5wdXQudGVuYW50SWQsIG9yZ1VuaXQuaWQsIC4uLmFyZ3MpO1xuICAgIGlmIChpbnB1dC5wYXJlbnRPcmdVbml0SWQpIHtcbiAgICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmluc2VydEFuY2VzdG9yTGlua3NGb3JOZXdDaGlsZChcbiAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgIGlucHV0LnBhcmVudE9yZ1VuaXRJZCxcbiAgICAgICAgb3JnVW5pdC5pZCxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIG9yZ1VuaXQ7XG4gIH1cblxuICBhc3luYyBsaXN0Q2hpbGRyZW4ocGFyZW50T3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChvcmdVbml0KSA9PiByZWxhdGlvbk1hdGNoKG9yZ1VuaXQucGFyZW50LCBwYXJlbnRPcmdVbml0SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT4gc2FtZVRlbmFudChvcmdVbml0LnRlbmFudCwgdGVuYW50SWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3REZXNjZW5kYW50T3JnVW5pdHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ6IHN0cmluZyxcbiAgICBpbmNsdWRlU2VsZiA9IGZhbHNlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8T3JnVW5pdFtdPiB7XG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkubGlzdERlc2NlbmRhbnRzKHRlbmFudElkLCBvcmdVbml0SWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQoZGVzY2VuZGFudHMubWFwKChyb3cpID0+IHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpKSk7XG4gICAgaWYgKGluY2x1ZGVTZWxmKSBpZHMuYWRkKG9yZ1VuaXRJZCk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT4gaWRzLmhhcyhvcmdVbml0LmlkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0QW5jZXN0b3JPcmdVbml0cyhcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIGluY2x1ZGVTZWxmID0gZmFsc2UsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0W10+IHtcbiAgICBjb25zdCBhbmNlc3RvcnMgPSBhd2FpdCBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCkubGlzdEFuY2VzdG9ycyh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KGFuY2VzdG9ycy5tYXAoKHJvdykgPT4gcmVsYXRpb25JZChyb3cuYW5jZXN0b3IpKSk7XG4gICAgaWYgKGluY2x1ZGVTZWxmKSBpZHMuYWRkKG9yZ1VuaXRJZCk7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLmZpbHRlcigob3JnVW5pdCkgPT4gaWRzLmhhcyhvcmdVbml0LmlkKSk7XG4gIH1cblxuICBhc3luYyByZW5hbWVPcmdVbml0KG9yZ1VuaXRJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0PiB7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEJ5SWQob3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoXG4gICAgICBvcmdVbml0SWQsXG4gICAgICB7IG5hbWUsIHBhdGg6IHRoaXMub3JnVW5pdFBhdGgoZXhpc3RpbmcucGF0aC5pbmNsdWRlcyhcIi9cIikgPyBleGlzdGluZy5wYXRoLnJlcGxhY2UoL1xcL1teL10rJC8sIFwiXCIpIDogdW5kZWZpbmVkLCBuYW1lKSB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIG1vdmVPcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgbmV3UGFyZW50T3JnVW5pdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0PiB7XG4gICAgY29uc3QgbmV3UGFyZW50ID0gYXdhaXQgdGhpcy5nZXRCeUlkKG5ld1BhcmVudE9yZ1VuaXRJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSBhd2FpdCB0aGlzLmdldEJ5SWQob3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgdGhpcy51cGRhdGVPbmUoXG4gICAgICBvcmdVbml0SWQsXG4gICAgICB7XG4gICAgICAgIHBhcmVudDogbmV3UGFyZW50LmlkLFxuICAgICAgICBwYXRoOiB0aGlzLm9yZ1VuaXRQYXRoKG5ld1BhcmVudC5wYXRoLCBleGlzdGluZy5uYW1lKSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLnJlYnVpbGRUZW5hbnRDbG9zdXJlKHRlbmFudElkLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gdXBkYXRlZDtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgcmVidWlsZFRlbmFudENsb3N1cmUodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBleGlzdGluZ0xpbmtzID0gYXdhaXQgY2xvc3VyZVNlcnZpY2UubGlzdEFsbCguLi5hcmdzKTtcbiAgICBhd2FpdCBkZWxldGVSb3dzQnlJZChcbiAgICAgIGNsb3N1cmVTZXJ2aWNlLFxuICAgICAgZXhpc3RpbmdMaW5rcy5maWx0ZXIoKHJvdykgPT4gc2FtZVRlbmFudChyb3cudGVuYW50LCB0ZW5hbnRJZCkpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG5cbiAgICBjb25zdCBvcmdVbml0cyA9IChhd2FpdCB0aGlzLmxpc3RUZW5hbnRPcmdVbml0cyh0ZW5hbnRJZCwgLi4uYXJncykpLnNvcnQoKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgICBjb25zdCBsZWZ0RGVwdGggPSBsZWZ0LnBhdGguc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCByaWdodERlcHRoID0gcmlnaHQucGF0aC5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLmxlbmd0aDtcbiAgICAgIHJldHVybiBsZWZ0RGVwdGggLSByaWdodERlcHRoO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBvcmdVbml0IG9mIG9yZ1VuaXRzKSB7XG4gICAgICBhd2FpdCBjbG9zdXJlU2VydmljZS5jcmVhdGVTZWxmTGluayh0ZW5hbnRJZCwgb3JnVW5pdC5pZCwgLi4uYXJncyk7XG4gICAgICBpZiAob3JnVW5pdC5wYXJlbnQpIHtcbiAgICAgICAgYXdhaXQgY2xvc3VyZVNlcnZpY2UuaW5zZXJ0QW5jZXN0b3JMaW5rc0Zvck5ld0NoaWxkKFxuICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgIHJlbGF0aW9uSWQob3JnVW5pdC5wYXJlbnQpLFxuICAgICAgICAgIG9yZ1VuaXQuaWQsXG4gICAgICAgICAgLi4uYXJnc1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgZGVsZXRlT3JnVW5pdFRyZWUodGVuYW50SWQ6IHN0cmluZywgb3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2xvc3VyZVNlcnZpY2UgPSBuZXcgT3JnVW5pdENsb3N1cmVTZXJ2aWNlKCk7XG4gICAgY29uc3QgZGVzY2VuZGFudHMgPSBhd2FpdCB0aGlzLmxpc3REZXNjZW5kYW50T3JnVW5pdHModGVuYW50SWQsIG9yZ1VuaXRJZCwgdHJ1ZSwgLi4uYXJncyk7XG4gICAgY29uc3QgZGVzY2VuZGFudElkcyA9IG5ldyBTZXQoZGVzY2VuZGFudHMubWFwKChvcmdVbml0KSA9PiBvcmdVbml0LmlkKSk7XG4gICAgY29uc3Qgb3JnVW5pdHMgPSAoYXdhaXQgdGhpcy5saXN0VGVuYW50T3JnVW5pdHModGVuYW50SWQsIC4uLmFyZ3MpKS5maWx0ZXIoKG9yZ1VuaXQpID0+XG4gICAgICBkZXNjZW5kYW50SWRzLmhhcyhvcmdVbml0LmlkKVxuICAgICk7XG4gICAgYXdhaXQgZGVsZXRlUm93c0J5SWQodGhpcywgb3JnVW5pdHMsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IGNsb3N1cmVTZXJ2aWNlLmRlbGV0ZUxpbmtzRm9yU3VidHJlZSh0ZW5hbnRJZCwgb3JnVW5pdElkLCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ3JlYXRlVXNlcklucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSBcIi4uL21vZGVscy91c2VyLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBVc2VyU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8VXNlcj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihVc2VyKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVVzZXIoaW5wdXQ6IENyZWF0ZVVzZXJJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIGVtYWlsOiBpbnB1dC5lbWFpbCxcbiAgICAgICAgcGhvbmU6IGlucHV0LnBob25lLFxuICAgICAgICBkaXNwbGF5TmFtZTogaW5wdXQuZGlzcGxheU5hbWUsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRCeUVtYWlsKGVtYWlsOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoKHVzZXIpID0+IHVzZXIuZW1haWwgPT09IGVtYWlsKSBhcyBVc2VyO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGlzcGxheU5hbWUodXNlcklkOiBzdHJpbmcsIGRpc3BsYXlOYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxVc2VyPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHVzZXJJZCwgeyBkaXNwbGF5TmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUVtYWlsKHVzZXJJZDogc3RyaW5nLCBlbWFpbDogc3RyaW5nIHwgdW5kZWZpbmVkLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VXNlcj4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZSh1c2VySWQsIHsgZW1haWwgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVQaG9uZSh1c2VySWQ6IHN0cmluZywgcGhvbmU6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFVzZXI+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUodXNlcklkLCB7IHBob25lIH0sIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBQcmluY2lwYWwgfSBmcm9tIFwiLi4vbW9kZWxzL3ByaW5jaXBhbC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUHJpbmNpcGFsU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8UHJpbmNpcGFsPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFByaW5jaXBhbCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcmluY2lwYWwoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBraW5kOiBQcmluY2lwYWxLaW5kLFxuICAgIHN1YmplY3RJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8UHJpbmNpcGFsPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBraW5kLFxuICAgICAgICBzdWJqZWN0SWQsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXRGb3JTdWJqZWN0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAga2luZDogUHJpbmNpcGFsS2luZCxcbiAgICBzdWJqZWN0SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFByaW5jaXBhbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKHByaW5jaXBhbCkgPT5cbiAgICAgICAgc2FtZVRlbmFudChwcmluY2lwYWwudGVuYW50LCB0ZW5hbnRJZCkgJiZcbiAgICAgICAgcHJpbmNpcGFsLmtpbmQgPT09IGtpbmQgJiZcbiAgICAgICAgcHJpbmNpcGFsLnN1YmplY3RJZCA9PT0gc3ViamVjdElkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldE9yQ3JlYXRlRm9yU3ViamVjdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGtpbmQ6IFByaW5jaXBhbEtpbmQsXG4gICAgc3ViamVjdElkOiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuZ2V0Rm9yU3ViamVjdCh0ZW5hbnRJZCwga2luZCwgc3ViamVjdElkLCAuLi5hcmdzKSkgPz8gKGF3YWl0IHRoaXMuY3JlYXRlUHJpbmNpcGFsKHRlbmFudElkLCBraW5kLCBzdWJqZWN0SWQsIC4uLmFyZ3MpKTtcbiAgfVxuXG4gIGFzeW5jIGdldFVzZXJQcmluY2lwYWwodGVuYW50SWQ6IHN0cmluZywgdXNlcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcmluY2lwYWw+IHtcbiAgICByZXR1cm4gdGhpcy5nZXRPckNyZWF0ZUZvclN1YmplY3QodGVuYW50SWQsIFByaW5jaXBhbEtpbmQuVXNlciwgdXNlcklkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGdldEdyb3VwUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIGdyb3VwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFByaW5jaXBhbD4ge1xuICAgIHJldHVybiB0aGlzLmdldE9yQ3JlYXRlRm9yU3ViamVjdCh0ZW5hbnRJZCwgUHJpbmNpcGFsS2luZC5Hcm91cCwgZ3JvdXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFRlbmFudE1lbWJlcnNoaXAgfSBmcm9tIFwiLi4vbW9kZWxzL3RlbmFudC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihUZW5hbnRNZW1iZXJzaGlwKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFVzZXJUb1RlbmFudChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIHN0YXR1czogTWVtYmVyc2hpcFN0YXR1cyA9IE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgdXNlcjogdXNlcklkLFxuICAgICAgICBzdGF0dXMsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBzZXRTdGF0dXMobWVtYmVyc2hpcElkOiBzdHJpbmcsIHN0YXR1czogTWVtYmVyc2hpcFN0YXR1cywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudE1lbWJlcnNoaXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUobWVtYmVyc2hpcElkLCB7IHN0YXR1cyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RVc2VyVGVuYW50cyh1c2VySWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFRlbmFudE1lbWJlcnNoaXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKG1lbWJlcnNoaXApID0+IHJlbGF0aW9uTWF0Y2gobWVtYmVyc2hpcC51c2VyLCB1c2VySWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRVc2Vycyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VGVuYW50TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gc2FtZVRlbmFudChtZW1iZXJzaGlwLnRlbmFudCwgdGVuYW50SWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVVzZXJGcm9tVGVuYW50KG1lbWJlcnNoaXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChtZW1iZXJzaGlwSWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBNZW1iZXJzaGlwU3RhdHVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcCB9IGZyb20gXCIuLi9tb2RlbHMvb3JnLXVuaXQtbWVtYmVyc2hpcC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgT3JnVW5pdE1lbWJlcnNoaXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihPcmdVbml0TWVtYmVyc2hpcCk7XG4gIH1cblxuICBhc3luYyBhZGRVc2VyVG9PcmdVbml0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgb3JnVW5pdElkOiBzdHJpbmcsXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzID0gTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcD4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiB0ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogb3JnVW5pdElkLFxuICAgICAgICB1c2VyOiB1c2VySWQsXG4gICAgICAgIHN0YXR1cyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNldFN0YXR1cyhtZW1iZXJzaGlwSWQ6IHN0cmluZywgc3RhdHVzOiBNZW1iZXJzaGlwU3RhdHVzLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8T3JnVW5pdE1lbWJlcnNoaXA+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUobWVtYmVyc2hpcElkLCB7IHN0YXR1cyB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RVc2VyT3JnVW5pdHModXNlcklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxPcmdVbml0TWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnVzZXIsIHVzZXJJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdE9yZ1VuaXRVc2VycyhvcmdVbml0SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPE9yZ1VuaXRNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAub3JnVW5pdCwgb3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyByZW1vdmVVc2VyRnJvbU9yZ1VuaXQobWVtYmVyc2hpcElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKG1lbWJlcnNoaXBJZCwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHNhbWVUZW5hbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEdyb3VwIH0gZnJvbSBcIi4uL21vZGVscy9ncm91cC5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgR3JvdXBTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxHcm91cD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihHcm91cCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVHcm91cChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcmdVbml0SWQ/OiBzdHJpbmcsXG4gICAgbWV0YWRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnQ6IHRlbmFudElkLFxuICAgICAgICBvcmdVbml0OiBvcmdVbml0SWQsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIG1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lR3JvdXAoZ3JvdXBJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxHcm91cD4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShncm91cElkLCB7IG5hbWUgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBtb3ZlR3JvdXBUb09yZ1VuaXQoZ3JvdXBJZDogc3RyaW5nLCBvcmdVbml0SWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGdyb3VwSWQsIHsgb3JnVW5pdDogb3JnVW5pdElkIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFRlbmFudEdyb3Vwcyh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGdyb3VwKSA9PiBzYW1lVGVuYW50KGdyb3VwLnRlbmFudCwgdGVuYW50SWQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCwgcmVsYXRpb25NYXRjaCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgR3JvdXBNZW1iZXJzaGlwIH0gZnJvbSBcIi4uL21vZGVscy9ncm91cC1tZW1iZXJzaGlwLm1vZGVsXCI7XG5pbXBvcnQgeyBQcmluY2lwYWxTZXJ2aWNlIH0gZnJvbSBcIi4vcHJpbmNpcGFsLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIEdyb3VwTWVtYmVyc2hpcFNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEdyb3VwTWVtYmVyc2hpcD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihHcm91cE1lbWJlcnNoaXApO1xuICB9XG5cbiAgYXN5bmMgYWRkUHJpbmNpcGFsVG9Hcm91cChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIGdyb3VwSWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxHcm91cE1lbWJlcnNoaXA+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogdGVuYW50SWQsXG4gICAgICAgIGdyb3VwOiBncm91cElkLFxuICAgICAgICBwcmluY2lwYWw6IHByaW5jaXBhbElkLFxuICAgICAgICBtZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RHcm91cE1lbWJlcnMoZ3JvdXBJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8R3JvdXBNZW1iZXJzaGlwW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChtZW1iZXJzaGlwKSA9PiByZWxhdGlvbk1hdGNoKG1lbWJlcnNoaXAuZ3JvdXAsIGdyb3VwSWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQcmluY2lwYWxHcm91cHMocHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPEdyb3VwTWVtYmVyc2hpcFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigobWVtYmVyc2hpcCkgPT4gcmVsYXRpb25NYXRjaChtZW1iZXJzaGlwLnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVByaW5jaXBhbEZyb21Hcm91cChtZW1iZXJzaGlwSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUJ5SWQobWVtYmVyc2hpcElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHJlc29sdmVHcm91cFByaW5jaXBhbElkc0ZvclByaW5jaXBhbChwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCBwcmluY2lwYWxTZXJ2aWNlID0gbmV3IFByaW5jaXBhbFNlcnZpY2UoKTtcbiAgICBjb25zdCBtZW1iZXJzaGlwcyA9IGF3YWl0IHRoaXMubGlzdFByaW5jaXBhbEdyb3VwcyhwcmluY2lwYWxJZCwgLi4uYXJncyk7XG4gICAgY29uc3QgcHJpbmNpcGFscyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgbWVtYmVyc2hpcHMubWFwKGFzeW5jIChtZW1iZXJzaGlwKSA9PiB7XG4gICAgICAgIGNvbnN0IHRlbmFudElkID0gcmVsYXRpb25JZChtZW1iZXJzaGlwLnRlbmFudCk7XG4gICAgICAgIGNvbnN0IGdyb3VwSWQgPSByZWxhdGlvbklkKG1lbWJlcnNoaXAuZ3JvdXApO1xuICAgICAgICBjb25zdCBwcmluY2lwYWwgPSBhd2FpdCBwcmluY2lwYWxTZXJ2aWNlLmdldEdyb3VwUHJpbmNpcGFsKHRlbmFudElkLCBncm91cElkLCAuLi5hcmdzKTtcbiAgICAgICAgcmV0dXJuIHByaW5jaXBhbC5pZDtcbiAgICAgIH0pXG4gICAgKTtcbiAgICByZXR1cm4gcHJpbmNpcGFscztcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUGVybWlzc2lvbkNhdGVnb3J5LCBDcmVhdGVQZXJtaXNzaW9uSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFBlcm1pc3Npb24gfSBmcm9tIFwiLi4vbW9kZWxzL3Blcm1pc3Npb24ubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFBlcm1pc3Npb25TZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQZXJtaXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKFBlcm1pc3Npb24pO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUGVybWlzc2lvbihpbnB1dDogQ3JlYXRlUGVybWlzc2lvbklucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UGVybWlzc2lvbj4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAga2V5OiBpbnB1dC5rZXksXG4gICAgICAgIGNhdGVnb3J5OiBpbnB1dC5jYXRlZ29yeSxcbiAgICAgICAgZGVzY3JpcHRpb246IGlucHV0LmRlc2NyaXB0aW9uLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlLZXkoa2V5OiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbmQoKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ua2V5ID09PSBrZXkpIGFzIFBlcm1pc3Npb247XG4gIH1cblxuICBhc3luYyBsaXN0QnlDYXRlZ29yeShjYXRlZ29yeTogUGVybWlzc2lvbkNhdGVnb3J5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocGVybWlzc2lvbikgPT4gcGVybWlzc2lvbi5jYXRlZ29yeSA9PT0gY2F0ZWdvcnkpO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGVzY3JpcHRpb24ocGVybWlzc2lvbklkOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHBlcm1pc3Npb25JZCwgeyBkZXNjcmlwdGlvbiB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgc2FtZVRlbmFudCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ3JlYXRlUm9sZUlucHV0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBSb2xlIH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSb2xlU2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8Um9sZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVJvbGUoaW5wdXQ6IENyZWF0ZVJvbGVJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGU+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIGtleTogaW5wdXQua2V5LFxuICAgICAgICBuYW1lOiBpbnB1dC5uYW1lLFxuICAgICAgICBkZXNjcmlwdGlvbjogaW5wdXQuZGVzY3JpcHRpb24sXG4gICAgICAgIG1ldGFkYXRhOiBpbnB1dC5tZXRhZGF0YSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldFN5c3RlbVJvbGVCeUtleShrZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGU+IHtcbiAgICBjb25zdCByb2xlID0gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZCgoY2FuZGlkYXRlKSA9PiAhY2FuZGlkYXRlLnRlbmFudCAmJiBjYW5kaWRhdGUua2V5ID09PSBrZXkpO1xuICAgIGlmICghcm9sZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBSb2xlIFwiJHtrZXl9XCIgbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIHJldHVybiByb2xlO1xuICB9XG5cbiAgYXN5bmMgZ2V0VGVuYW50Um9sZUJ5S2V5KHRlbmFudElkOiBzdHJpbmcsIGtleTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIGNvbnN0IHJvbGUgPSAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT4gc2FtZVRlbmFudChjYW5kaWRhdGUudGVuYW50LCB0ZW5hbnRJZCkgJiYgY2FuZGlkYXRlLmtleSA9PT0ga2V5XG4gICAgKTtcbiAgICBpZiAoIXJvbGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgUm9sZSBcIiR7a2V5fVwiIG5vdCBmb3VuZCBmb3IgdGVuYW50ICR7dGVuYW50SWR9YCk7XG4gICAgfVxuICAgIHJldHVybiByb2xlO1xuICB9XG5cbiAgYXN5bmMgcmVuYW1lUm9sZShyb2xlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Um9sZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShyb2xlSWQsIHsgbmFtZSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZVJvbGVNZXRhZGF0YShcbiAgICByb2xlSWQ6IHN0cmluZyxcbiAgICBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxSb2xlPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKHJvbGVJZCwgeyBtZXRhZGF0YSB9LCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RUZW5hbnRSb2xlcyh0ZW5hbnRJZDogc3RyaW5nLCBpbmNsdWRlU3lzdGVtID0gZmFsc2UsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlKSA9PlxuICAgICAgaW5jbHVkZVN5c3RlbSA/ICFyb2xlLnRlbmFudCB8fCBzYW1lVGVuYW50KHJvbGUudGVuYW50LCB0ZW5hbnRJZCkgOiBzYW1lVGVuYW50KHJvbGUudGVuYW50LCB0ZW5hbnRJZClcbiAgICApO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvbiB9IGZyb20gXCIuLi9tb2RlbHMvcm9sZS1wZXJtaXNzaW9uLm1vZGVsXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlUm93c0J5SWQoXG4gIHNlcnZpY2U6IEJhc2VNb2RlbFNlcnZpY2U8YW55PixcbiAgcm93czogQXJyYXk8eyBpZDogc3RyaW5nIH0+LFxuICAuLi5hcmdzOiBhbnlbXVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICBhd2FpdCBzZXJ2aWNlLmRlbGV0ZUJ5SWQocm93LmlkLCAuLi5hcmdzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUm9sZVBlcm1pc3Npb25TZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxSb2xlUGVybWlzc2lvbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSb2xlUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBhZGRQZXJtaXNzaW9uVG9Sb2xlKHJvbGVJZDogc3RyaW5nLCBwZXJtaXNzaW9uSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlKFxuICAgICAge1xuICAgICAgICByb2xlOiByb2xlSWQsXG4gICAgICAgIHBlcm1pc3Npb246IHBlcm1pc3Npb25JZCxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFBlcm1pc3Npb25LZXlUb1JvbGUocm9sZUlkOiBzdHJpbmcsIHBlcm1pc3Npb25LZXk6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uPiB7XG4gICAgY29uc3QgcGVybWlzc2lvbiA9IGF3YWl0IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpLmdldEJ5S2V5KHBlcm1pc3Npb25LZXksIC4uLmFyZ3MpO1xuICAgIHJldHVybiB0aGlzLmFkZFBlcm1pc3Npb25Ub1JvbGUocm9sZUlkLCBwZXJtaXNzaW9uLmlkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIHJlbW92ZVBlcm1pc3Npb25Gcm9tUm9sZShyb2xlUGVybWlzc2lvbklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvbGVQZXJtaXNzaW9uSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFJvbGVQZXJtaXNzaW9ucyhyb2xlSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChyb2xlUGVybWlzc2lvbikgPT4gcmVsYXRpb25NYXRjaChyb2xlUGVybWlzc2lvbi5yb2xlLCByb2xlSWQpKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RQZXJtaXNzaW9uUm9sZXMocGVybWlzc2lvbklkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSb2xlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocm9sZVBlcm1pc3Npb24pID0+IHJlbGF0aW9uTWF0Y2gocm9sZVBlcm1pc3Npb24ucGVybWlzc2lvbiwgcGVybWlzc2lvbklkKSk7XG4gIH1cblxuICBhc3luYyByZXBsYWNlUm9sZVBlcm1pc3Npb25zKHJvbGVJZDogc3RyaW5nLCBwZXJtaXNzaW9uSWRzOiBzdHJpbmdbXSwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJvbGVQZXJtaXNzaW9uW10+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMubGlzdFJvbGVQZXJtaXNzaW9ucyhyb2xlSWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IGRlbGV0ZVJvd3NCeUlkKHRoaXMsIGV4aXN0aW5nLCAuLi5hcmdzKTtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwocGVybWlzc2lvbklkcy5tYXAoKHBlcm1pc3Npb25JZCkgPT4gdGhpcy5hZGRQZXJtaXNzaW9uVG9Sb2xlKHJvbGVJZCwgcGVybWlzc2lvbklkLCAuLi5hcmdzKSkpO1xuICB9XG5cbiAgYXN5bmMgY3JlYXRlUm9sZVdpdGhQZXJtaXNzaW9ucyhcbiAgICBpbnB1dDogaW1wb3J0KFwiLi4vdHlwZXNcIikuQ3JlYXRlUm9sZUlucHV0LFxuICAgIHBlcm1pc3Npb25LZXlzOiBzdHJpbmdbXSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGltcG9ydChcIi4uL21vZGVscy9yb2xlLm1vZGVsXCIpLlJvbGU+IHtcbiAgICBjb25zdCByb2xlID0gYXdhaXQgbmV3IFJvbGVTZXJ2aWNlKCkuY3JlYXRlUm9sZShpbnB1dCwgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uS2V5IG9mIHBlcm1pc3Npb25LZXlzKSB7XG4gICAgICBhd2FpdCB0aGlzLmFkZFBlcm1pc3Npb25LZXlUb1JvbGUocm9sZS5pZCwgcGVybWlzc2lvbktleSwgLi4uYXJncyk7XG4gICAgfVxuICAgIHJldHVybiByb2xlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBc3NpZ25Sb2xlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50IH0gZnJvbSBcIi4uL21vZGVscy9yb2xlLWFzc2lnbm1lbnQubW9kZWxcIjtcblxuZXhwb3J0IGNsYXNzIFJvbGVBc3NpZ25tZW50U2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8Um9sZUFzc2lnbm1lbnQ+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoUm9sZUFzc2lnbm1lbnQpO1xuICB9XG5cbiAgYXN5bmMgYXNzaWduUm9sZShcbiAgICBpbnB1dDogQXNzaWduUm9sZUlucHV0LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHByaW5jaXBhbDogaW5wdXQucHJpbmNpcGFsSWQsXG4gICAgICAgIHJvbGU6IGlucHV0LnJvbGVJZCxcbiAgICAgICAgc2NvcGVLaW5kOiBpbnB1dC5zY29wZUtpbmQsXG4gICAgICAgIHNjb3BlSWQ6IGlucHV0LnNjb3BlSWQsXG4gICAgICAgIGluaGVyaXREb3duOiBpbnB1dC5pbmhlcml0RG93biA/PyBmYWxzZSxcbiAgICAgICAgc3RhcnRzQXQ6IGlucHV0LnN0YXJ0c0F0LFxuICAgICAgICBleHBpcmVzQXQ6IGlucHV0LmV4cGlyZXNBdCxcbiAgICAgICAgY29uZGl0aW9uczogaW5wdXQuY29uZGl0aW9ucyxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJldm9rZUFzc2lnbm1lbnQoYXNzaWdubWVudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKGFzc2lnbm1lbnRJZCwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBsaXN0UHJpbmNpcGFsQXNzaWdubWVudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoXG4gICAgICAoYXNzaWdubWVudCkgPT5cbiAgICAgICAgc2FtZVRlbmFudChhc3NpZ25tZW50LnRlbmFudCwgdGVuYW50SWQpICYmXG4gICAgICAgIHJlbGF0aW9uTWF0Y2goYXNzaWdubWVudC5wcmluY2lwYWwsIHByaW5jaXBhbElkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0Um9sZUFzc2lnbm1lbnRzKFxuICAgIHJvbGVJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnRbXT4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0QWxsKC4uLmFyZ3MpKS5maWx0ZXIoKGFzc2lnbm1lbnQpID0+XG4gICAgICByZWxhdGlvbk1hdGNoKGFzc2lnbm1lbnQucm9sZSwgcm9sZUlkKVxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50QXNzaWdubWVudHMoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFJvbGVBc3NpZ25tZW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChhc3NpZ25tZW50KSA9PlxuICAgICAgc2FtZVRlbmFudChhc3NpZ25tZW50LnRlbmFudCwgdGVuYW50SWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUFzc2lnbm1lbnRXaW5kb3coXG4gICAgYXNzaWdubWVudElkOiBzdHJpbmcsXG4gICAgc3RhcnRzQXQ6IERhdGUgfCB1bmRlZmluZWQsXG4gICAgZXhwaXJlc0F0OiBEYXRlIHwgdW5kZWZpbmVkLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8Um9sZUFzc2lnbm1lbnQ+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYXNzaWdubWVudElkLCB7IHN0YXJ0c0F0LCBleHBpcmVzQXQgfSwgLi4uYXJncyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2VNb2RlbFNlcnZpY2UsIHJlbGF0aW9uSWQsIHJlbGF0aW9uTWF0Y2gsIHNhbWVUZW5hbnQsIHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TbmFwc2hvdCwgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uIH0gZnJvbSBcIi4uL21vZGVscy9lZmZlY3RpdmUtcGVybWlzc2lvbi5tb2RlbFwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3JvbGUtcGVybWlzc2lvbi5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL3Blcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgR3JvdXBNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL2dyb3VwLW1lbWJlcnNoaXAuc2VydmljZVwiO1xuaW1wb3J0IHsgUHJpbmNpcGFsU2VydmljZSB9IGZyb20gXCIuL3ByaW5jaXBhbC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1jbG9zdXJlLnNlcnZpY2VcIjtcbmltcG9ydCB7IEluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlIH0gZnJvbSBcIi4vaW5oZXJpdGFuY2UtYmxvY2suc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgZXh0ZW5kcyBCYXNlTW9kZWxTZXJ2aWNlPEVmZmVjdGl2ZVBlcm1pc3Npb24+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoRWZmZWN0aXZlUGVybWlzc2lvbik7XG4gIH1cblxuICBhc3luYyBsaXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKFxuICAgICAgKHBlcm1pc3Npb24pID0+IHNhbWVUZW5hbnQocGVybWlzc2lvbi50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKHBlcm1pc3Npb24ucHJpbmNpcGFsLCBwcmluY2lwYWxJZClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZvclNjb3BlKFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgc2NvcGVLaW5kOiBTY29wZUtpbmQsXG4gICAgc2NvcGVJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RWZmZWN0aXZlUGVybWlzc2lvbltdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChwZXJtaXNzaW9uKSA9PiBzYW1lVGVuYW50KHBlcm1pc3Npb24udGVuYW50LCB0ZW5hbnRJZCkgJiYgcGVybWlzc2lvbi5zY29wZUtpbmQgPT09IHNjb3BlS2luZCAmJiBwZXJtaXNzaW9uLnNjb3BlSWQgPT09IHNjb3BlSWRcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgaGFzUGVybWlzc2lvbihcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLFxuICAgIHNjb3BlSWQ6IHN0cmluZyxcbiAgICBhdD86IERhdGUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKSkuc29tZShcbiAgICAgIChwZXJtaXNzaW9uKSA9PlxuICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgcGVybWlzc2lvbi5zY29wZUtpbmQgPT09IHNjb3BlS2luZCAmJlxuICAgICAgICBwZXJtaXNzaW9uLnNjb3BlSWQgPT09IHNjb3BlSWQgJiZcbiAgICAgICAgKCFwZXJtaXNzaW9uLnN0YXJ0c0F0IHx8ICFhdCB8fCBwZXJtaXNzaW9uLnN0YXJ0c0F0IDw9IGF0KSAmJlxuICAgICAgICAoIXBlcm1pc3Npb24uZXhwaXJlc0F0IHx8ICFhdCB8fCBwZXJtaXNzaW9uLmV4cGlyZXNBdCA+PSBhdClcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0Rm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWxJZCwgLi4uYXJncykpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZUZvclRlbmFudCh0ZW5hbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3Qgcm93IG9mIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocGVybWlzc2lvbikgPT4gc2FtZVRlbmFudChwZXJtaXNzaW9uLnRlbmFudCwgdGVuYW50SWQpKSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWxldGVCeUlkKHJvdy5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkOiBzdHJpbmcsIHByaW5jaXBhbElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxFZmZlY3RpdmVQZXJtaXNzaW9uW10+IHtcbiAgICBhd2FpdCB0aGlzLmRlbGV0ZUZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuXG4gICAgY29uc3Qgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlID0gbmV3IFJvbGVBc3NpZ25tZW50U2VydmljZSgpO1xuICAgIGNvbnN0IHJvbGVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBSb2xlUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgICBjb25zdCBwZXJtaXNzaW9uU2VydmljZSA9IG5ldyBQZXJtaXNzaW9uU2VydmljZSgpO1xuICAgIGNvbnN0IGdyb3VwTWVtYmVyc2hpcFNlcnZpY2UgPSBuZXcgR3JvdXBNZW1iZXJzaGlwU2VydmljZSgpO1xuICAgIGNvbnN0IHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICAgIGNvbnN0IG9yZ1VuaXRDbG9zdXJlU2VydmljZSA9IG5ldyBPcmdVbml0Q2xvc3VyZVNlcnZpY2UoKTtcbiAgICBjb25zdCBpbmhlcml0YW5jZUJsb2NrU2VydmljZSA9IG5ldyBJbmhlcml0YW5jZUJsb2NrU2VydmljZSgpO1xuXG4gICAgY29uc3QgbWF0ZXJpYWxpemVkOiBFZmZlY3RpdmVQZXJtaXNzaW9uU25hcHNob3RbXSA9IFtdO1xuICAgIGNvbnN0IHNvdXJjZUFzc2lnbm1lbnRzID0gYXdhaXQgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGdyb3VwTWVtYmVyc2hpcHMgPSBhd2FpdCBncm91cE1lbWJlcnNoaXBTZXJ2aWNlLmxpc3RQcmluY2lwYWxHcm91cHMocHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGdyb3VwQXNzaWdubWVudHMgPSAoXG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgZ3JvdXBNZW1iZXJzaGlwcy5tYXAoYXN5bmMgKG1lbWJlcnNoaXApID0+IHtcbiAgICAgICAgICBjb25zdCBncm91cFByaW5jaXBhbCA9IGF3YWl0IHByaW5jaXBhbFNlcnZpY2UuZ2V0R3JvdXBQcmluY2lwYWwocmVsYXRpb25JZChtZW1iZXJzaGlwLnRlbmFudCksIHJlbGF0aW9uSWQobWVtYmVyc2hpcC5ncm91cCksIC4uLmFyZ3MpO1xuICAgICAgICAgIHJldHVybiByb2xlQXNzaWdubWVudFNlcnZpY2UubGlzdFByaW5jaXBhbEFzc2lnbm1lbnRzKHRlbmFudElkLCBncm91cFByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5mbGF0KCk7XG5cbiAgICBjb25zdCBhc3NpZ25tZW50cyA9IFsuLi5zb3VyY2VBc3NpZ25tZW50cywgLi4uZ3JvdXBBc3NpZ25tZW50c107XG4gICAgZm9yIChjb25zdCBhc3NpZ25tZW50IG9mIGFzc2lnbm1lbnRzKSB7XG4gICAgICBjb25zdCByb2xlUGVybWlzc2lvbnMgPSBhd2FpdCByb2xlUGVybWlzc2lvblNlcnZpY2UubGlzdFJvbGVQZXJtaXNzaW9ucyhyZWxhdGlvbklkKGFzc2lnbm1lbnQucm9sZSksIC4uLmFyZ3MpO1xuICAgICAgY29uc3QgcGVybWlzc2lvbnMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgcm9sZVBlcm1pc3Npb25zLm1hcChhc3luYyAocm9sZVBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvblNlcnZpY2UuZmluZE9uZUJ5KFwiaWRcIiwgcmVsYXRpb25JZChyb2xlUGVybWlzc2lvbi5wZXJtaXNzaW9uKSBhcyBuZXZlciwgLi4uYXJncylcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGZvciAoY29uc3QgcGVybWlzc2lvbiBvZiBwZXJtaXNzaW9ucykge1xuICAgICAgICBpZiAoIXBlcm1pc3Npb24pIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBzY29wZUtpbmQgPSBhc3NpZ25tZW50LnNjb3BlS2luZDtcbiAgICAgICAgY29uc3Qgc2NvcGVJZCA9IGFzc2lnbm1lbnQuc2NvcGVJZDtcbiAgICAgICAgY29uc3Qgc2NvcGVzOiBBcnJheTx7IHNjb3BlS2luZDogU2NvcGVLaW5kOyBzY29wZUlkOiBzdHJpbmcgfT4gPSBbXTtcbiAgICAgICAgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLlRlbmFudCkge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkOiB0ZW5hbnRJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5SZXNvdXJjZSkge1xuICAgICAgICAgIHNjb3Blcy5wdXNoKHsgc2NvcGVLaW5kLCBzY29wZUlkIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHNjb3BlS2luZCA9PT0gU2NvcGVLaW5kLk9yZ1VuaXQgJiYgIWFzc2lnbm1lbnQuaW5oZXJpdERvd24pIHtcbiAgICAgICAgICBzY29wZXMucHVzaCh7IHNjb3BlS2luZCwgc2NvcGVJZCB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmIGFzc2lnbm1lbnQuaW5oZXJpdERvd24pIHtcbiAgICAgICAgICBjb25zdCBkZXNjZW5kYW50cyA9IGF3YWl0IG9yZ1VuaXRDbG9zdXJlU2VydmljZS5saXN0RGVzY2VuZGFudHModGVuYW50SWQsIHNjb3BlSWQsIC4uLmFyZ3MpO1xuICAgICAgICAgIHNjb3Blcy5wdXNoKC4uLmRlc2NlbmRhbnRzLm1hcCgocm93KSA9PiAoeyBzY29wZUtpbmQsIHNjb3BlSWQ6IHJlbGF0aW9uSWQocm93LmRlc2NlbmRhbnQpIH0pKSk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHNjb3BlZCBvZiBzY29wZXMpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBzY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmXG4gICAgICAgICAgICBhc3NpZ25tZW50LmluaGVyaXREb3duICYmXG4gICAgICAgICAgICBzY29wZWQuc2NvcGVJZCAhPT0gc2NvcGVJZCAmJlxuICAgICAgICAgICAgKGF3YWl0IGluaGVyaXRhbmNlQmxvY2tTZXJ2aWNlLmNhdGVnb3J5QmxvY2tlZEZvckFuY2VzdG9yKFxuICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgc2NvcGVkLnNjb3BlSWQsXG4gICAgICAgICAgICAgIHNjb3BlSWQsXG4gICAgICAgICAgICAgIHBlcm1pc3Npb24uY2F0ZWdvcnksXG4gICAgICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgICAgICkpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0ZXJpYWxpemVkLnB1c2goe1xuICAgICAgICAgICAgaWQ6IFwiXCIsXG4gICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgIHByaW5jaXBhbElkLFxuICAgICAgICAgICAgcGVybWlzc2lvbktleTogcGVybWlzc2lvbi5rZXksXG4gICAgICAgICAgICBzY29wZUtpbmQ6IHNjb3BlZC5zY29wZUtpbmQsXG4gICAgICAgICAgICBzY29wZUlkOiBzY29wZWQuc2NvcGVJZCxcbiAgICAgICAgICAgIHNvdXJjZUtpbmQ6IFwicm9sZV9hc3NpZ25tZW50XCIsXG4gICAgICAgICAgICBzb3VyY2VJZDogYXNzaWdubWVudC5pZCxcbiAgICAgICAgICAgIHN0YXJ0c0F0OiBhc3NpZ25tZW50LnN0YXJ0c0F0LFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBhc3NpZ25tZW50LmV4cGlyZXNBdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIG1hdGVyaWFsaXplZC5tYXAoKHBlcm1pc3Npb24pID0+XG4gICAgICAgIHRoaXMuY3JlYXRlKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRlbmFudDogcGVybWlzc2lvbi50ZW5hbnRJZCxcbiAgICAgICAgICAgIHByaW5jaXBhbDogcGVybWlzc2lvbi5wcmluY2lwYWxJZCxcbiAgICAgICAgICAgIHBlcm1pc3Npb25LZXk6IHBlcm1pc3Npb24ucGVybWlzc2lvbktleSxcbiAgICAgICAgICAgIHNjb3BlS2luZDogcGVybWlzc2lvbi5zY29wZUtpbmQsXG4gICAgICAgICAgICBzY29wZUlkOiBwZXJtaXNzaW9uLnNjb3BlSWQsXG4gICAgICAgICAgICBzb3VyY2VLaW5kOiBwZXJtaXNzaW9uLnNvdXJjZUtpbmQsXG4gICAgICAgICAgICBzb3VyY2VJZDogcGVybWlzc2lvbi5zb3VyY2VJZCxcbiAgICAgICAgICAgIHN0YXJ0c0F0OiBwZXJtaXNzaW9uLnN0YXJ0c0F0LFxuICAgICAgICAgICAgZXhwaXJlc0F0OiBwZXJtaXNzaW9uLmV4cGlyZXNBdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgcmV0dXJuIGNyZWF0ZWQ7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIHJlYnVpbGRGb3JUZW5hbnQodGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcmluY2lwYWxzID0gKGF3YWl0IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCkubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChwcmluY2lwYWwpID0+IHNhbWVUZW5hbnQocHJpbmNpcGFsLnRlbmFudCwgdGVuYW50SWQpKTtcbiAgICBmb3IgKGNvbnN0IHByaW5jaXBhbCBvZiBwcmluY2lwYWxzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbC5pZCwgLi4uYXJncyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBSZWdpc3RlclJlc291cmNlSW5wdXQsIFJlc291cmNlVmlzaWJpbGl0eSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2UgfSBmcm9tIFwiLi4vbW9kZWxzL3Byb3RlY3RlZC1yZXNvdXJjZS5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihQcm90ZWN0ZWRSZXNvdXJjZSk7XG4gIH1cblxuICBhc3luYyByZWdpc3RlclJlc291cmNlKGlucHV0OiBSZWdpc3RlclJlc291cmNlSW5wdXQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLmNyZWF0ZShcbiAgICAgIHtcbiAgICAgICAgdGVuYW50OiBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgb3JnVW5pdDogaW5wdXQub3JnVW5pdElkLFxuICAgICAgICByZXNvdXJjZVR5cGU6IGlucHV0LnJlc291cmNlVHlwZSxcbiAgICAgICAgcmVzb3VyY2VJZDogaW5wdXQucmVzb3VyY2VJZCxcbiAgICAgICAgdmlzaWJpbGl0eTogaW5wdXQudmlzaWJpbGl0eSxcbiAgICAgICAgb3duZXI6IGlucHV0Lm93bmVyUHJpbmNpcGFsSWQsXG4gICAgICAgIHNlbnNpdGl2aXR5OiBpbnB1dC5zZW5zaXRpdml0eSxcbiAgICAgICAgbWV0YWRhdGE6IGlucHV0Lm1ldGFkYXRhLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QnlEb21haW5SZXNvdXJjZSh0ZW5hbnRJZDogc3RyaW5nLCByZXNvdXJjZVR5cGU6IHN0cmluZywgcmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2UgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmluZChcbiAgICAgIChyZXNvdXJjZSkgPT4gc2FtZVRlbmFudChyZXNvdXJjZS50ZW5hbnQsIHRlbmFudElkKSAmJiByZXNvdXJjZS5yZXNvdXJjZVR5cGUgPT09IHJlc291cmNlVHlwZSAmJiByZXNvdXJjZS5yZXNvdXJjZUlkID09PSByZXNvdXJjZUlkXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIG1vdmVSZXNvdXJjZVRvT3JnVW5pdChwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIG9yZ1VuaXRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocHJvdGVjdGVkUmVzb3VyY2VJZCwgeyBvcmdVbml0OiBvcmdVbml0SWQgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBzZXRWaXNpYmlsaXR5KHByb3RlY3RlZFJlc291cmNlSWQ6IHN0cmluZywgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UHJvdGVjdGVkUmVzb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUocHJvdGVjdGVkUmVzb3VyY2VJZCwgeyB2aXNpYmlsaXR5IH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgdHJhbnNmZXJPd25lcnNoaXAocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCBvd25lclByaW5jaXBhbElkOiBzdHJpbmcgfCB1bmRlZmluZWQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShwcm90ZWN0ZWRSZXNvdXJjZUlkLCB7IG93bmVyOiBvd25lclByaW5jaXBhbElkIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgbGlzdE9yZ1VuaXRSZXNvdXJjZXMob3JnVW5pdElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocmVzb3VyY2UpID0+IHJlbGF0aW9uTWF0Y2gocmVzb3VyY2Uub3JnVW5pdCwgb3JnVW5pdElkKSk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50UmVzb3VyY2VzKHRlbmFudElkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxQcm90ZWN0ZWRSZXNvdXJjZVtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcigocmVzb3VyY2UpID0+IHNhbWVUZW5hbnQocmVzb3VyY2UudGVuYW50LCB0ZW5hbnRJZCkpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWxTZXJ2aWNlLCByZWxhdGlvbk1hdGNoLCBzYW1lVGVuYW50IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBHcmFudFJlc291cmNlSW5wdXQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnQgfSBmcm9tIFwiLi4vbW9kZWxzL3Jlc291cmNlLWdyYW50Lm1vZGVsXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUdyYW50U2VydmljZSBleHRlbmRzIEJhc2VNb2RlbFNlcnZpY2U8UmVzb3VyY2VHcmFudD4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihSZXNvdXJjZUdyYW50KTtcbiAgfVxuXG4gIGFzeW5jIGdyYW50UmVzb3VyY2UoaW5wdXQ6IEdyYW50UmVzb3VyY2VJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFJlc291cmNlR3JhbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHJlc291cmNlOiBpbnB1dC5yZXNvdXJjZUlkLFxuICAgICAgICBwcmluY2lwYWw6IGlucHV0LnByaW5jaXBhbElkLFxuICAgICAgICBwZXJtaXNzaW9uS2V5OiBpbnB1dC5wZXJtaXNzaW9uS2V5LFxuICAgICAgICBzdGFydHNBdDogaW5wdXQuc3RhcnRzQXQsXG4gICAgICAgIGV4cGlyZXNBdDogaW5wdXQuZXhwaXJlc0F0LFxuICAgICAgICBjb25kaXRpb25zOiBpbnB1dC5jb25kaXRpb25zLFxuICAgICAgICBjcmVhdGVkQnk6IGlucHV0LmNyZWF0ZWRCeVByaW5jaXBhbElkLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmV2b2tlR3JhbnQoZ3JhbnRJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChncmFudElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3RSZXNvdXJjZUdyYW50cyhwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxSZXNvdXJjZUdyYW50W10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChncmFudCkgPT4gcmVsYXRpb25NYXRjaChncmFudC5yZXNvdXJjZSwgcHJvdGVjdGVkUmVzb3VyY2VJZCkpO1xuICB9XG5cbiAgYXN5bmMgbGlzdFByaW5jaXBhbEdyYW50cyh0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8UmVzb3VyY2VHcmFudFtdPiB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmxpc3RBbGwoLi4uYXJncykpLmZpbHRlcihcbiAgICAgIChncmFudCkgPT4gc2FtZVRlbmFudChncmFudC50ZW5hbnQsIHRlbmFudElkKSAmJiByZWxhdGlvbk1hdGNoKGdyYW50LnByaW5jaXBhbCwgcHJpbmNpcGFsSWQpXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGhhc0dyYW50KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsXG4gICAgcGVybWlzc2lvbktleTogc3RyaW5nLFxuICAgIGF0PzogRGF0ZSxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdFByaW5jaXBhbEdyYW50cyh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpKS5zb21lKFxuICAgICAgKGdyYW50KSA9PlxuICAgICAgICByZWxhdGlvbk1hdGNoKGdyYW50LnJlc291cmNlLCBwcm90ZWN0ZWRSZXNvdXJjZUlkKSAmJlxuICAgICAgICBncmFudC5wZXJtaXNzaW9uS2V5ID09PSBwZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICghZ3JhbnQuc3RhcnRzQXQgfHwgIWF0IHx8IGdyYW50LnN0YXJ0c0F0IDw9IGF0KSAmJlxuICAgICAgICAoIWdyYW50LmV4cGlyZXNBdCB8fCAhYXQgfHwgZ3JhbnQuZXhwaXJlc0F0ID49IGF0KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGVBbGxGb3JSZXNvdXJjZShwcm90ZWN0ZWRSZXNvdXJjZUlkOiBzdHJpbmcsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChjb25zdCByb3cgb2YgYXdhaXQgdGhpcy5saXN0UmVzb3VyY2VHcmFudHMocHJvdGVjdGVkUmVzb3VyY2VJZCwgLi4uYXJncykpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVsZXRlQnlJZChyb3cuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIH0gZnJvbSBcIi4vcHJvdGVjdGVkLXJlc291cmNlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJlc291cmNlR3JhbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcmVzb3VyY2UtZ3JhbnQuc2VydmljZVwiO1xuaW1wb3J0IHsgcmVsYXRpb25JZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgUmVzb3VyY2VWaXNpYmlsaXR5IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxpZmVjeWNsZVNlcnZpY2Uge1xuICBhc3luYyB1bnJlZ2lzdGVyUmVzb3VyY2UocHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IG5ldyBSZXNvdXJjZUdyYW50U2VydmljZSgpLmRlbGV0ZUFsbEZvclJlc291cmNlKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IG5ldyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UoKS5kZWxldGVCeUlkKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZVJlc291cmNlU2NvcGUoXG4gICAgcHJvdGVjdGVkUmVzb3VyY2VJZDogc3RyaW5nLFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8e1xuICAgIHRlbmFudElkOiBzdHJpbmc7XG4gICAgb3JnVW5pdElkOiBzdHJpbmc7XG4gICAgdmlzaWJpbGl0eTogUmVzb3VyY2VWaXNpYmlsaXR5O1xuICAgIG93bmVyUHJpbmNpcGFsSWQ/OiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCByZXNvdXJjZSA9IGF3YWl0IG5ldyBQcm90ZWN0ZWRSZXNvdXJjZVNlcnZpY2UoKS5nZXRCeUlkKHByb3RlY3RlZFJlc291cmNlSWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB7XG4gICAgICB0ZW5hbnRJZDogcmVsYXRpb25JZChyZXNvdXJjZS50ZW5hbnQpLFxuICAgICAgb3JnVW5pdElkOiByZWxhdGlvbklkKHJlc291cmNlLm9yZ1VuaXQpLFxuICAgICAgdmlzaWJpbGl0eTogcmVzb3VyY2UudmlzaWJpbGl0eSxcbiAgICAgIG93bmVyUHJpbmNpcGFsSWQ6IHJlc291cmNlLm93bmVyID8gcmVsYXRpb25JZChyZXNvdXJjZS5vd25lcikgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQmFzZU1vZGVsU2VydmljZSwgcmVsYXRpb25JZCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQ3JlYXRlU3RvcmFnZUJpbmRpbmdJbnB1dCwgU3RvcmFnZUJpbmRpbmdLaW5kLCBTdG9yYWdlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgU3RvcmFnZUJpbmRpbmcgfSBmcm9tIFwiLi4vbW9kZWxzL3N0b3JhZ2UtYmluZGluZy5tb2RlbFwiO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUJpbmRpbmdTZXJ2aWNlIGV4dGVuZHMgQmFzZU1vZGVsU2VydmljZTxTdG9yYWdlQmluZGluZz4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihTdG9yYWdlQmluZGluZyk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVCaW5kaW5nKGlucHV0OiBDcmVhdGVTdG9yYWdlQmluZGluZ0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudDogaW5wdXQudGVuYW50SWQsXG4gICAgICAgIHN0b3JhZ2VLaW5kOiBpbnB1dC5zdG9yYWdlS2luZCxcbiAgICAgICAgYmluZGluZ0tpbmQ6IGlucHV0LmJpbmRpbmdLaW5kLFxuICAgICAgICBiaW5kaW5nS2V5OiBpbnB1dC5iaW5kaW5nS2V5LFxuICAgICAgICByZWdpb246IGlucHV0LnJlZ2lvbixcbiAgICAgICAgY29uZmlnOiBpbnB1dC5jb25maWcsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0VGVuYW50QmluZGluZ3ModGVuYW50SWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nW10+IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMubGlzdEFsbCguLi5hcmdzKSkuZmlsdGVyKChiaW5kaW5nKSA9PiByZWxhdGlvbklkKGJpbmRpbmcudGVuYW50KSA9PT0gdGVuYW50SWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QmluZGluZyh0ZW5hbnRJZDogc3RyaW5nLCBzdG9yYWdlS2luZDogU3RvcmFnZUtpbmQsIC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZyB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5saXN0VGVuYW50QmluZGluZ3ModGVuYW50SWQsIC4uLmFyZ3MpKS5maW5kKChiaW5kaW5nKSA9PiBiaW5kaW5nLnN0b3JhZ2VLaW5kID09PSBzdG9yYWdlS2luZCk7XG4gIH1cblxuICBhc3luYyBzZXRCaW5kaW5nQ29uZmlnKFxuICAgIGJpbmRpbmdJZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxTdG9yYWdlQmluZGluZz4ge1xuICAgIHJldHVybiB0aGlzLnVwZGF0ZU9uZShiaW5kaW5nSWQsIHsgY29uZmlnIH0sIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcHJvbW90ZVRvRGVkaWNhdGVkKFxuICAgIGJpbmRpbmdJZDogc3RyaW5nLFxuICAgIGJpbmRpbmdLZXk6IHN0cmluZyxcbiAgICByZWdpb246IHN0cmluZyxcbiAgICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPFN0b3JhZ2VCaW5kaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMudXBkYXRlT25lKGJpbmRpbmdJZCwgeyBiaW5kaW5nS2luZDogU3RvcmFnZUJpbmRpbmdLaW5kLkRlZGljYXRlZCwgYmluZGluZ0tleSwgcmVnaW9uLCBjb25maWcgfSwgLi4uYXJncyk7XG4gIH1cblxuICBhc3luYyBzZXRTaGFyZWQoXG4gICAgYmluZGluZ0lkOiBzdHJpbmcsXG4gICAgYmluZGluZ0tleTogc3RyaW5nLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIGNvbmZpZz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8U3RvcmFnZUJpbmRpbmc+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVPbmUoYmluZGluZ0lkLCB7IGJpbmRpbmdLaW5kOiBTdG9yYWdlQmluZGluZ0tpbmQuU2hhcmVkLCBiaW5kaW5nS2V5LCByZWdpb24sIGNvbmZpZyB9LCAuLi5hcmdzKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgdHJhbnNhY3Rpb25hbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHR5cGUgeyBCb290c3RyYXBPcmdVbml0LCBCb290c3RyYXBUZW1wbGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTWVtYmVyc2hpcFN0YXR1cywgU2NvcGVLaW5kIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBUZW5hbnRTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IFRlbmFudFByb2ZpbGVTZXJ2aWNlIH0gZnJvbSBcIi4vdGVuYW50LXByb2ZpbGUuc2VydmljZVwiO1xuaW1wb3J0IHsgT3JnVW5pdFNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0UHJvZmlsZVNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1wcm9maWxlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFVzZXJTZXJ2aWNlIH0gZnJvbSBcIi4vdXNlci5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSB9IGZyb20gXCIuL3RlbmFudC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9wZXJtaXNzaW9uLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBSb2xlUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlIH0gZnJvbSBcIi4vcm9sZS1hc3NpZ25tZW50LnNlcnZpY2VcIjtcbmltcG9ydCB7IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSBcIi4vZWZmZWN0aXZlLXBlcm1pc3Npb24uc2VydmljZVwiO1xuXG5leHBvcnQgY2xhc3MgQm9vdHN0cmFwU2VydmljZSB7XG4gIHByaXZhdGUgdGVuYW50U2VydmljZSA9IG5ldyBUZW5hbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgdGVuYW50UHJvZmlsZVNlcnZpY2UgPSBuZXcgVGVuYW50UHJvZmlsZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSBvcmdVbml0U2VydmljZSA9IG5ldyBPcmdVbml0U2VydmljZSgpO1xuICBwcml2YXRlIG9yZ1VuaXRQcm9maWxlU2VydmljZSA9IG5ldyBPcmdVbml0UHJvZmlsZVNlcnZpY2UoKTtcbiAgcHJpdmF0ZSB1c2VyU2VydmljZSA9IG5ldyBVc2VyU2VydmljZSgpO1xuICBwcml2YXRlIG1lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IFRlbmFudE1lbWJlcnNoaXBTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcHJpbmNpcGFsU2VydmljZSA9IG5ldyBQcmluY2lwYWxTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcGVybWlzc2lvblNlcnZpY2UgPSBuZXcgUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlU2VydmljZSA9IG5ldyBSb2xlU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVQZXJtaXNzaW9uU2VydmljZSA9IG5ldyBSb2xlUGVybWlzc2lvblNlcnZpY2UoKTtcbiAgcHJpdmF0ZSByb2xlQXNzaWdubWVudFNlcnZpY2UgPSBuZXcgUm9sZUFzc2lnbm1lbnRTZXJ2aWNlKCk7XG4gIHByaXZhdGUgZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UgPSBuZXcgRWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UoKTtcblxuICBAdHJhbnNhY3Rpb25hbCgpXG4gIGFzeW5jIGJvb3RzdHJhcFRlbmFudEZyb21UZW1wbGF0ZShcbiAgICB0ZW1wbGF0ZTogQm9vdHN0cmFwVGVtcGxhdGUsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTx7XG4gICAgdGVuYW50SWQ6IHN0cmluZztcbiAgICByb290T3JnVW5pdElkOiBzdHJpbmc7XG4gICAgb3duZXJVc2VySWQ6IHN0cmluZztcbiAgICBvd25lclByaW5jaXBhbElkOiBzdHJpbmc7XG4gIH0+IHtcbiAgICBjb25zdCB0ZW5hbnQgPSBhd2FpdCB0aGlzLnRlbmFudFNlcnZpY2UuY3JlYXRlVGVuYW50KFxuICAgICAgdGVtcGxhdGUudGVuYW50LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgaWYgKHRlbXBsYXRlLnRlbmFudC5wcm9maWxlS2V5KSB7XG4gICAgICBhd2FpdCB0aGlzLnRlbmFudFByb2ZpbGVTZXJ2aWNlLmNyZWF0ZVByb2ZpbGUoXG4gICAgICAgIHRlbmFudC5pZCxcbiAgICAgICAgdGVtcGxhdGUudGVuYW50LnByb2ZpbGVLZXksXG4gICAgICAgIHRlbXBsYXRlLnRlbmFudC5wcm9maWxlTWV0YWRhdGEsXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlT3JnVHJlZSA9IGFzeW5jIChcbiAgICAgIHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICBvcmdVbml0OiBCb290c3RyYXBPcmdVbml0XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBjcmVhdGVkID1cbiAgICAgICAgcGFyZW50SWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYXdhaXQgdGhpcy5vcmdVbml0U2VydmljZS5jcmVhdGVSb290KFxuICAgICAgICAgICAgICB0ZW5hbnQuaWQsXG4gICAgICAgICAgICAgIG9yZ1VuaXQubmFtZSxcbiAgICAgICAgICAgICAgb3JnVW5pdC5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgb3JnVW5pdC5wcm9maWxlS2V5LFxuICAgICAgICAgICAgICBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApXG4gICAgICAgICAgOiBhd2FpdCB0aGlzLm9yZ1VuaXRTZXJ2aWNlLmNyZWF0ZUNoaWxkKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQ6IHRlbmFudC5pZCxcbiAgICAgICAgICAgICAgICBwYXJlbnRPcmdVbml0SWQ6IHBhcmVudElkLFxuICAgICAgICAgICAgICAgIG5hbWU6IG9yZ1VuaXQubmFtZSxcbiAgICAgICAgICAgICAgICBtZXRhZGF0YTogb3JnVW5pdC5tZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBwcm9maWxlS2V5OiBvcmdVbml0LnByb2ZpbGVLZXksXG4gICAgICAgICAgICAgICAgcHJvZmlsZU1ldGFkYXRhOiBvcmdVbml0Lm1ldGFkYXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAuLi5hcmdzXG4gICAgICAgICAgICApO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBvcmdVbml0LmNoaWxkcmVuID8/IFtdKSB7XG4gICAgICAgIGF3YWl0IGNyZWF0ZU9yZ1RyZWUoY3JlYXRlZC5pZCwgY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNyZWF0ZWQ7XG4gICAgfTtcblxuICAgIGNvbnN0IHJvb3RPcmdVbml0ID0gYXdhaXQgY3JlYXRlT3JnVHJlZSh1bmRlZmluZWQsIHRlbXBsYXRlLnJvb3RPcmdVbml0KTtcbiAgICBjb25zdCBvd25lciA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2UuY3JlYXRlVXNlcihcbiAgICAgIHRlbXBsYXRlLm93bmVyVXNlcixcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2UuYWRkVXNlclRvVGVuYW50KFxuICAgICAgdGVuYW50LmlkLFxuICAgICAgb3duZXIuaWQsXG4gICAgICBNZW1iZXJzaGlwU3RhdHVzLkFjdGl2ZSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IG93bmVyUHJpbmNpcGFsID0gYXdhaXQgdGhpcy5wcmluY2lwYWxTZXJ2aWNlLmdldFVzZXJQcmluY2lwYWwoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lci5pZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBwZXJtaXNzaW9uIG9mIHRlbXBsYXRlLnBlcm1pc3Npb25zKSB7XG4gICAgICBhd2FpdCB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlLmNyZWF0ZVBlcm1pc3Npb24ocGVybWlzc2lvbiwgLi4uYXJncyk7XG4gICAgfVxuICAgIGZvciAoY29uc3Qgcm9sZSBvZiB0ZW1wbGF0ZS5yb2xlcykge1xuICAgICAgY29uc3QgY3JlYXRlZFJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmNyZWF0ZVJvbGUoXG4gICAgICAgIHtcbiAgICAgICAgICB0ZW5hbnRJZDogdGVuYW50LmlkLFxuICAgICAgICAgIGtleTogcm9sZS5rZXksXG4gICAgICAgICAgbmFtZTogcm9sZS5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiByb2xlLmRlc2NyaXB0aW9uLFxuICAgICAgICB9LFxuICAgICAgICAuLi5hcmdzXG4gICAgICApO1xuICAgICAgZm9yIChjb25zdCBwZXJtaXNzaW9uS2V5IG9mIHJvbGUucGVybWlzc2lvbktleXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5yb2xlUGVybWlzc2lvblNlcnZpY2UuYWRkUGVybWlzc2lvbktleVRvUm9sZShcbiAgICAgICAgICBjcmVhdGVkUm9sZS5pZCxcbiAgICAgICAgICBwZXJtaXNzaW9uS2V5LFxuICAgICAgICAgIC4uLmFyZ3NcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvd25lclJvbGUgPSBhd2FpdCB0aGlzLnJvbGVTZXJ2aWNlLmdldFRlbmFudFJvbGVCeUtleShcbiAgICAgIHRlbmFudC5pZCxcbiAgICAgIHRlbXBsYXRlLm93bmVyUm9sZUtleSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICAgIHByaW5jaXBhbElkOiBvd25lclByaW5jaXBhbC5pZCxcbiAgICAgICAgcm9sZUlkOiBvd25lclJvbGUuaWQsXG4gICAgICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgIHNjb3BlSWQ6IHJvb3RPcmdVbml0LmlkLFxuICAgICAgICBpbmhlcml0RG93bjogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwoXG4gICAgICB0ZW5hbnQuaWQsXG4gICAgICBvd25lclByaW5jaXBhbC5pZCxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRlbmFudElkOiB0ZW5hbnQuaWQsXG4gICAgICByb290T3JnVW5pdElkOiByb290T3JnVW5pdC5pZCxcbiAgICAgIG93bmVyVXNlcklkOiBvd25lci5pZCxcbiAgICAgIG93bmVyUHJpbmNpcGFsSWQ6IG93bmVyUHJpbmNpcGFsLmlkLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCB7IHRyYW5zYWN0aW9uYWwgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE1lbWJlcnNoaXBTdGF0dXMsIFNjb3BlS2luZCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVGVuYW50TWVtYmVyc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi90ZW5hbnQtbWVtYmVyc2hpcC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBPcmdVbml0TWVtYmVyc2hpcFNlcnZpY2UgfSBmcm9tIFwiLi9vcmctdW5pdC1tZW1iZXJzaGlwLnNlcnZpY2VcIjtcbmltcG9ydCB7IFByaW5jaXBhbFNlcnZpY2UgfSBmcm9tIFwiLi9wcmluY2lwYWwuc2VydmljZVwiO1xuaW1wb3J0IHsgUm9sZVNlcnZpY2UgfSBmcm9tIFwiLi9yb2xlLnNlcnZpY2VcIjtcbmltcG9ydCB7IFJvbGVBc3NpZ25tZW50U2VydmljZSB9IGZyb20gXCIuL3JvbGUtYXNzaWdubWVudC5zZXJ2aWNlXCI7XG5pbXBvcnQgeyBFZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gXCIuL2VmZmVjdGl2ZS1wZXJtaXNzaW9uLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIFN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBtZW1iZXJzaGlwU2VydmljZSA9IG5ldyBUZW5hbnRNZW1iZXJzaGlwU2VydmljZSgpO1xuICBwcml2YXRlIG9yZ01lbWJlcnNoaXBTZXJ2aWNlID0gbmV3IE9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSgpO1xuICBwcml2YXRlIHByaW5jaXBhbFNlcnZpY2UgPSBuZXcgUHJpbmNpcGFsU2VydmljZSgpO1xuICBwcml2YXRlIHJvbGVTZXJ2aWNlID0gbmV3IFJvbGVTZXJ2aWNlKCk7XG4gIHByaXZhdGUgcm9sZUFzc2lnbm1lbnRTZXJ2aWNlID0gbmV3IFJvbGVBc3NpZ25tZW50U2VydmljZSgpO1xuICBwcml2YXRlIGVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlID0gbmV3IEVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlKCk7XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyBvbmJvYXJkVXNlclRvVGVuYW50QW5kT3JnVW5pdChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHVzZXJJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHJvbGVLZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHsgcHJpbmNpcGFsSWQ6IHN0cmluZyB9PiB7XG4gICAgYXdhaXQgdGhpcy5tZW1iZXJzaGlwU2VydmljZS5hZGRVc2VyVG9UZW5hbnQodGVuYW50SWQsIHVzZXJJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMub3JnTWVtYmVyc2hpcFNlcnZpY2UuYWRkVXNlclRvT3JnVW5pdCh0ZW5hbnRJZCwgb3JnVW5pdElkLCB1c2VySWQsIE1lbWJlcnNoaXBTdGF0dXMuQWN0aXZlLCAuLi5hcmdzKTtcbiAgICBjb25zdCBwcmluY2lwYWwgPSBhd2FpdCB0aGlzLnByaW5jaXBhbFNlcnZpY2UuZ2V0VXNlclByaW5jaXBhbCh0ZW5hbnRJZCwgdXNlcklkLCAuLi5hcmdzKTtcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5yb2xlU2VydmljZS5nZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQsIHJvbGVLZXksIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmFzc2lnblJvbGUoXG4gICAgICB7XG4gICAgICAgIHRlbmFudElkLFxuICAgICAgICBwcmluY2lwYWxJZDogcHJpbmNpcGFsLmlkLFxuICAgICAgICByb2xlSWQ6IHJvbGUuaWQsXG4gICAgICAgIHNjb3BlS2luZDogU2NvcGVLaW5kLk9yZ1VuaXQsXG4gICAgICAgIHNjb3BlSWQ6IG9yZ1VuaXRJZCxcbiAgICAgICAgaW5oZXJpdERvd246IHRydWUsXG4gICAgICB9LFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgYXdhaXQgdGhpcy5lZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZS5yZWJ1aWxkRm9yUHJpbmNpcGFsKHRlbmFudElkLCBwcmluY2lwYWwuaWQsIC4uLmFyZ3MpO1xuICAgIHJldHVybiB7IHByaW5jaXBhbElkOiBwcmluY2lwYWwuaWQgfTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgY2hhbmdlVXNlck9yZ1JvbGUoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIG9yZ1VuaXRJZDogc3RyaW5nLFxuICAgIHJvbGVLZXk6IHN0cmluZyxcbiAgICBpbmhlcml0RG93bjogYm9vbGVhbixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByb2xlID0gYXdhaXQgdGhpcy5yb2xlU2VydmljZS5nZXRUZW5hbnRSb2xlQnlLZXkodGVuYW50SWQsIHJvbGVLZXksIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGN1cnJlbnRBc3NpZ25tZW50cyA9IGF3YWl0IHRoaXMucm9sZUFzc2lnbm1lbnRTZXJ2aWNlLmxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICAgIGZvciAoY29uc3QgYXNzaWdubWVudCBvZiBjdXJyZW50QXNzaWdubWVudHMuZmlsdGVyKChyb3cpID0+IHJvdy5zY29wZUtpbmQgPT09IFNjb3BlS2luZC5PcmdVbml0ICYmIHJvdy5zY29wZUlkID09PSBvcmdVbml0SWQpKSB7XG4gICAgICBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5yZXZva2VBc3NpZ25tZW50KGFzc2lnbm1lbnQuaWQsIC4uLmFyZ3MpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnJvbGVBc3NpZ25tZW50U2VydmljZS5hc3NpZ25Sb2xlKFxuICAgICAge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAgIHJvbGVJZDogcm9sZS5pZCxcbiAgICAgICAgc2NvcGVLaW5kOiBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgc2NvcGVJZDogb3JnVW5pdElkLFxuICAgICAgICBpbmhlcml0RG93bixcbiAgICAgIH0sXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLnJlYnVpbGRGb3JQcmluY2lwYWwodGVuYW50SWQsIHByaW5jaXBhbElkLCAuLi5hcmdzKTtcbiAgfVxuXG4gIEB0cmFuc2FjdGlvbmFsKClcbiAgYXN5bmMgc3VzcGVuZFVzZXJJblRlbmFudCh0ZW5hbnRNZW1iZXJzaGlwSWQ6IHN0cmluZywgdGVuYW50SWQ6IHN0cmluZywgcHJpbmNpcGFsSWQ6IHN0cmluZywgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1lbWJlcnNoaXBTZXJ2aWNlLnNldFN0YXR1cyh0ZW5hbnRNZW1iZXJzaGlwSWQsIE1lbWJlcnNoaXBTdGF0dXMuU3VzcGVuZGVkLCAuLi5hcmdzKTtcbiAgICBhd2FpdCB0aGlzLmVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlLmRlbGV0ZUZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoKVxuICBhc3luYyByZWFjdGl2YXRlVXNlckluVGVuYW50KHRlbmFudE1lbWJlcnNoaXBJZDogc3RyaW5nLCB0ZW5hbnRJZDogc3RyaW5nLCBwcmluY2lwYWxJZDogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWVtYmVyc2hpcFNlcnZpY2Uuc2V0U3RhdHVzKHRlbmFudE1lbWJlcnNoaXBJZCwgTWVtYmVyc2hpcFN0YXR1cy5BY3RpdmUsIC4uLmFyZ3MpO1xuICAgIGF3YWl0IHRoaXMuZWZmZWN0aXZlUGVybWlzc2lvblNlcnZpY2UucmVidWlsZEZvclByaW5jaXBhbCh0ZW5hbnRJZCwgcHJpbmNpcGFsSWQsIC4uLmFyZ3MpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBdXRob3JpemF0aW9uRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7XG4gIEF1dGh6RGF0YVNvdXJjZXMsXG4gIENhbkFjY2Vzc0lucHV0LFxuICBSZXNvdXJjZVZpc2liaWxpdHksXG4gIFNjb3BlS2luZCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBhc0FycmF5LFxuICBidWlsZEFjY2Vzc0NvbnRleHQsXG4gIGJ1aWxkQXJhbmdvQ29udGV4dCxcbiAgYnVpbGRRZHJhbnRGaWx0ZXIsXG4gIGlzVGltZVZhbGlkLFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcblxuZnVuY3Rpb24gc2NvcGVLZXkoc2NvcGVLaW5kOiBTY29wZUtpbmQsIHNjb3BlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzY29wZUtpbmR9OiR7c2NvcGVJZH1gO1xufVxuXG5leHBvcnQgY2xhc3MgQXV0aHpTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBkYXRhU291cmNlczogQXV0aHpEYXRhU291cmNlcztcblxuICBjb25zdHJ1Y3RvcihkYXRhU291cmNlczogQXV0aHpEYXRhU291cmNlcyA9IHt9KSB7XG4gICAgdGhpcy5kYXRhU291cmNlcyA9IGRhdGFTb3VyY2VzO1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhc3luYyBjYW5BY2Nlc3MoaW5wdXQ6IENhbkFjY2Vzc0lucHV0LCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGF0ID0gaW5wdXQuYXQgPz8gbmV3IERhdGUoKTtcblxuICAgIGlmIChpbnB1dC5zY29wZUtpbmQgJiYgaW5wdXQuc2NvcGVJZCkge1xuICAgICAgY29uc3QgcGVybWlzc2lvbnMgPVxuICAgICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RFZmZlY3RpdmVQZXJtaXNzaW9uc0ZvclNjb3BlPy4oXG4gICAgICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICAgICAgaW5wdXQuc2NvcGVLaW5kLFxuICAgICAgICAgIGlucHV0LnNjb3BlSWRcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBhc0FycmF5KHBlcm1pc3Npb25zKS5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxvYWRSZXNvdXJjZT8uKFxuICAgICAgaW5wdXQudGVuYW50SWQsXG4gICAgICBpbnB1dC5yZXNvdXJjZVByb3RlY3RlZElkXG4gICAgKTtcbiAgICBpZiAoIXJlc291cmNlKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlc291cmNlLnRlbmFudElkICE9PSBpbnB1dC50ZW5hbnRJZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHJlc291cmNlLm93bmVyUHJpbmNpcGFsSWQgPT09IGlucHV0LnByaW5jaXBhbElkKSByZXR1cm4gdHJ1ZTtcblxuICAgIGNvbnN0IGdyYW50cyA9IGFzQXJyYXkoXG4gICAgICBhd2FpdCB0aGlzLmRhdGFTb3VyY2VzLmxpc3RSZXNvdXJjZUdyYW50cz8uKFxuICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgaW5wdXQucmVzb3VyY2VQcm90ZWN0ZWRJZFxuICAgICAgKVxuICAgICkuZmlsdGVyKFxuICAgICAgKGdyYW50KSA9PlxuICAgICAgICBncmFudC5wcmluY2lwYWxJZCA9PT0gaW5wdXQucHJpbmNpcGFsSWQgJiZcbiAgICAgICAgZ3JhbnQucGVybWlzc2lvbktleSA9PT0gaW5wdXQucGVybWlzc2lvbktleSAmJlxuICAgICAgICBpc1RpbWVWYWxpZChhdCwgZ3JhbnQuc3RhcnRzQXQsIGdyYW50LmV4cGlyZXNBdClcbiAgICApO1xuICAgIGlmIChncmFudHMubGVuZ3RoID4gMCkgcmV0dXJuIHRydWU7XG5cbiAgICBjb25zdCB2aXNpYmlsaXR5ID0gcmVzb3VyY2UudmlzaWJpbGl0eTtcbiAgICBpZiAoXG4gICAgICB2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuUHJpdmF0ZSB8fFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5LlJlc291cmNlQWNsXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdmlzaWJpbGl0eSA9PT0gUmVzb3VyY2VWaXNpYmlsaXR5Lk9yZ1VuaXQgfHxcbiAgICAgIHZpc2liaWxpdHkgPT09IFJlc291cmNlVmlzaWJpbGl0eS5PcmdTdWJ0cmVlXG4gICAgKSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IGFzQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBTY29wZUtpbmQuT3JnVW5pdCxcbiAgICAgICAgICByZXNvdXJjZS5vcmdVbml0SWRcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHJldHVybiBlZmZlY3RpdmVQZXJtaXNzaW9ucy5zb21lKFxuICAgICAgICAocGVybWlzc2lvbikgPT5cbiAgICAgICAgICBwZXJtaXNzaW9uLnBlcm1pc3Npb25LZXkgPT09IGlucHV0LnBlcm1pc3Npb25LZXkgJiZcbiAgICAgICAgICBpc1RpbWVWYWxpZChhdCwgcGVybWlzc2lvbi5zdGFydHNBdCwgcGVybWlzc2lvbi5leHBpcmVzQXQpXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICh2aXNpYmlsaXR5ID09PSBSZXNvdXJjZVZpc2liaWxpdHkuVGVuYW50KSB7XG4gICAgICBjb25zdCBlZmZlY3RpdmVQZXJtaXNzaW9ucyA9IGFzQXJyYXkoXG4gICAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zRm9yU2NvcGU/LihcbiAgICAgICAgICBpbnB1dC50ZW5hbnRJZCxcbiAgICAgICAgICBTY29wZUtpbmQuVGVuYW50LFxuICAgICAgICAgIGlucHV0LnRlbmFudElkXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gZWZmZWN0aXZlUGVybWlzc2lvbnMuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+XG4gICAgICAgICAgcGVybWlzc2lvbi5wZXJtaXNzaW9uS2V5ID09PSBpbnB1dC5wZXJtaXNzaW9uS2V5ICYmXG4gICAgICAgICAgaXNUaW1lVmFsaWQoYXQsIHBlcm1pc3Npb24uc3RhcnRzQXQsIHBlcm1pc3Npb24uZXhwaXJlc0F0KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBhc3luYyByZXF1aXJlQWNjZXNzKGlucHV0OiBDYW5BY2Nlc3NJbnB1dCwgLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIShhd2FpdCB0aGlzLmNhbkFjY2VzcyhpbnB1dCwgLi4uYXJncykpKSB7XG4gICAgICB0aHJvdyBuZXcgQXV0aG9yaXphdGlvbkVycm9yKFxuICAgICAgICBgQWNjZXNzIGRlbmllZCBmb3IgJHtpbnB1dC5wZXJtaXNzaW9uS2V5fSBvbiAke2lucHV0LnJlc291cmNlUHJvdGVjdGVkSWQgPz8gc2NvcGVLZXkoaW5wdXQuc2NvcGVLaW5kID8/IFNjb3BlS2luZC5SZXNvdXJjZSwgaW5wdXQuc2NvcGVJZCA/PyBcIlwiKX1gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICB0ZW5hbnRJZDogc3RyaW5nLFxuICAgIHByaW5jaXBhbElkOiBzdHJpbmcsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8aW1wb3J0KFwiLi4vdHlwZXNcIikuQWNjZXNzQ29udGV4dD4ge1xuICAgIGNvbnN0IHBlcm1pc3Npb25zID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zPy4odGVuYW50SWQsIHByaW5jaXBhbElkKVxuICAgICk7XG4gICAgY29uc3QgZ3JhbnRzID0gYXNBcnJheShcbiAgICAgIGF3YWl0IHRoaXMuZGF0YVNvdXJjZXMubGlzdFByaW5jaXBhbEdyYW50cz8uKHRlbmFudElkLCBwcmluY2lwYWxJZClcbiAgICApO1xuICAgIHJldHVybiBidWlsZEFjY2Vzc0NvbnRleHQoe1xuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgZ3JhbnRzLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRBcmFuZ29Db250ZXh0KFxuICAgIHRlbmFudElkOiBzdHJpbmcsXG4gICAgcHJpbmNpcGFsSWQ6IHN0cmluZyxcbiAgICBwZXJtaXNzaW9uS2V5OiBzdHJpbmcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKSB7XG4gICAgY29uc3QgYWNjZXNzID0gYXdhaXQgdGhpcy5idWlsZEFjY2Vzc0NvbnRleHQoXG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gICAgY29uc3QgYWxsb3dlZE9yZ1VuaXRJZHMgPVxuICAgICAgYWNjZXNzLmFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uW3Blcm1pc3Npb25LZXldID8/IFtdO1xuICAgIGNvbnN0IGFsbG93ZWRSZXNvdXJjZUlkcyA9IGFjY2Vzcy5yZXNvdXJjZUdyYW50c1xuICAgICAgLmZpbHRlcigoZ3JhbnQpID0+IGdyYW50LnBlcm1pc3Npb25LZXkgPT09IHBlcm1pc3Npb25LZXkpXG4gICAgICAubWFwKChncmFudCkgPT4gZ3JhbnQucmVzb3VyY2VJZCk7XG4gICAgcmV0dXJuIGJ1aWxkQXJhbmdvQ29udGV4dCh7XG4gICAgICB0ZW5hbnRJZCxcbiAgICAgIHByaW5jaXBhbElkLFxuICAgICAgcGVybWlzc2lvbktleSxcbiAgICAgIGFsbG93ZWRPcmdVbml0SWRzLFxuICAgICAgYWxsb3dlZFJlc291cmNlSWRzLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgYnVpbGRRZHJhbnRGaWx0ZXIoXG4gICAgdGVuYW50SWQ6IHN0cmluZyxcbiAgICBwcmluY2lwYWxJZDogc3RyaW5nLFxuICAgIHBlcm1pc3Npb25LZXk6IHN0cmluZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApIHtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmJ1aWxkQWNjZXNzQ29udGV4dChcbiAgICAgIHRlbmFudElkLFxuICAgICAgcHJpbmNpcGFsSWQsXG4gICAgICAuLi5hcmdzXG4gICAgKTtcbiAgICBjb25zdCBhbGxvd2VkT3JnVW5pdElkcyA9XG4gICAgICBhY2Nlc3MuYWxsb3dlZE9yZ1VuaXRJZHNCeVBlcm1pc3Npb25bcGVybWlzc2lvbktleV0gPz8gW107XG4gICAgY29uc3QgYWxsb3dlZFJlc291cmNlSWRzID0gYWNjZXNzLnJlc291cmNlR3JhbnRzXG4gICAgICAuZmlsdGVyKChncmFudCkgPT4gZ3JhbnQucGVybWlzc2lvbktleSA9PT0gcGVybWlzc2lvbktleSlcbiAgICAgIC5tYXAoKGdyYW50KSA9PiBncmFudC5yZXNvdXJjZUlkKTtcbiAgICByZXR1cm4gYnVpbGRRZHJhbnRGaWx0ZXIoe1xuICAgICAgdGVuYW50SWQsXG4gICAgICBwcmluY2lwYWxJZCxcbiAgICAgIHBlcm1pc3Npb25LZXksXG4gICAgICBhbGxvd2VkT3JnVW5pdElkcyxcbiAgICAgIGFsbG93ZWRSZXNvdXJjZUlkcyxcbiAgICB9KTtcbiAgfVxufVxuIiwiLyoqXG4gKiBAbW9kdWxlIGludGVncmF0aW9ucy9mZWF0dXJlLWZsYWdzXG4gKiBAc3VtbWFyeSBGZWF0dXJlIGZsYWcgY29uc3RhbnRzIGFuZCBtZXRhZGF0YSBrZXlzLlxuICovXG5cbmV4cG9ydCBjb25zdCBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QgPSBcImZlYXR1cmVGbGFnXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0VOVl9QUkVGSVggPSBcIkZFQVRVUkVfRkxBR1wiO1xuXG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX01PREVMX0tFWSA9IFwiZmVhdHVyZS1mbGFnczptb2RlbFwiO1xuZXhwb3J0IGNvbnN0IEZFQVRVUkVfRkxBR19BVVRIX0tFWSA9IFwiZmVhdHVyZS1mbGFnczphdXRoXCI7XG5leHBvcnQgY29uc3QgRkVBVFVSRV9GTEFHX0JMT0NLX0tFWSA9IFwiZmVhdHVyZS1mbGFnczpibG9ja1wiO1xuZXhwb3J0IGNvbnN0IEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZID0gXCJmZWF0dXJlLWZsYWdzOnJlbmRlci1pZlwiO1xuZXhwb3J0IGNvbnN0IEZFQVRVUkVfRkxBR19ISURFX0tFWSA9IFwiZmVhdHVyZS1mbGFnczpoaWRlLW9uXCI7XG5cbiIsImltcG9ydCB7IE1ldGFkYXRhIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0aW9uXCI7XG5pbXBvcnQge1xuICBGZWF0dXJlRmxhZ0NvbmZpZyxcbiAgRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0VHlwZSxcbiAgRmVhdHVyZUZsYWdNYXRjaE1vZGUsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG4gIEZlYXR1cmVGbGFnUnVsZSxcbiAgRmVhdHVyZUZsYWdWYWx1ZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVOYW1lKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHRyaW1tZWQgPSBuYW1lLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gdHJpbW1lZDtcbiAgaWYgKC9eW2Etel1bYS16QS1aMC05XSokLy50ZXN0KHRyaW1tZWQpKSByZXR1cm4gdHJpbW1lZDtcbiAgY29uc3QgY2FtZWxpemVkID0gdHJpbW1lZFxuICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgLnJlcGxhY2UoL1tfXFwtXFxzXSsvZywgXCIgXCIpXG4gICAgLnNwbGl0KFwiIFwiKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChjYW1lbGl6ZWQubGVuZ3RoID09PSAwKSByZXR1cm4gdHJpbW1lZDtcbiAgY29uc3QgW2hlYWQsIC4uLnRhaWxdID0gY2FtZWxpemVkO1xuICByZXR1cm4gW1xuICAgIGhlYWQsXG4gICAgLi4udGFpbC5tYXAoKHNlZ21lbnQpID0+XG4gICAgICBzZWdtZW50ID8gc2VnbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlZ21lbnQuc2xpY2UoMSkgOiBzZWdtZW50XG4gICAgKSxcbiAgXVxuICAgIC5qb2luKFwiXCIpXG4gICAgLnJlcGxhY2UoL1teYS16QS1aMC05XS9nLCBcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUnVudGltZVZhbHVlKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZTtcbiAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKTtcbiAgaWYgKHRyaW1tZWQgPT09IFwidHJ1ZVwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHRyaW1tZWQgPT09IFwiZmFsc2VcIikgcmV0dXJuIGZhbHNlO1xuICBpZiAoL14tP1xcZCsoXFwuXFxkKyk/JC8udGVzdCh0cmltbWVkKSkgcmV0dXJuIE51bWJlcih0cmltbWVkKTtcbiAgaWYgKFxuICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJ7XCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCJ9XCIpKSB8fFxuICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCJbXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCJdXCIpKVxuICApIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodHJpbW1lZCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplT2JqZWN0S2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFrZXkpIHJldHVybiBrZXk7XG4gIGlmICgvXlthLXpdW2EtekEtWjAtOV0qJC8udGVzdChrZXkpKSByZXR1cm4ga2V5O1xuICBjb25zdCBub3JtYWxpemVkID0ga2V5XG4gICAgLnJlcGxhY2UoL1tcXHMtXSsvZywgXCJfXCIpXG4gICAgLnNwbGl0KFwiX1wiKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIGlmIChub3JtYWxpemVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGtleTtcbiAgY29uc3QgW2hlYWQsIC4uLnRhaWxdID0gbm9ybWFsaXplZDtcbiAgcmV0dXJuIFtcbiAgICBoZWFkLnRvTG93ZXJDYXNlKCksXG4gICAgLi4udGFpbC5tYXAoXG4gICAgICAoc2VnbWVudCkgPT5cbiAgICAgICAgc2VnbWVudC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHNlZ21lbnQuc2xpY2UoMSkudG9Mb3dlckNhc2UoKVxuICAgICksXG4gIF0uam9pbihcIlwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUZlYXR1cmVDb25maWcoXG4gIHZhbHVlOiB1bmtub3duXG4pOiBGZWF0dXJlRmxhZ1ZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICByZXR1cm4gcGFyc2VSdW50aW1lVmFsdWUodmFsdWUpIGFzIEZlYXR1cmVGbGFnVmFsdWU7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IEZlYXR1cmVGbGFnQ29uZmlnID0ge307XG4gIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5mb3JFYWNoKChba2V5LCByYXddKSA9PiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IG5vcm1hbGl6ZU9iamVjdEtleShrZXkpO1xuICAgIGlmICh0eXBlb2YgcmF3ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXN1bHRbbm9ybWFsaXplZEtleV0gPSBub3JtYWxpemVGZWF0dXJlQ29uZmlnKHJhdykgPz8gcmF3O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGZWF0dXJlUmVnaXN0cnkoXG4gIHZhbHVlOiB1bmtub3duXG4pOiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB7fTtcbiAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5yZWR1Y2UoXG4gICAgKGFjYywgW2tleSwgcmF3XSkgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZEtleSA9IG5vcm1hbGl6ZUZlYXR1cmVOYW1lKGtleSk7XG4gICAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBub3JtYWxpemVGZWF0dXJlQ29uZmlnKHJhdyk7XG4gICAgICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRWYWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBhY2Nbbm9ybWFsaXplZEtleV0gPSBub3JtYWxpemVkVmFsdWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAge30gYXMgRmVhdHVyZUZsYWdSZWdpc3RyeVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGZWF0dXJlRmxhZ0VuYWJsZWQodmFsdWU6IEZlYXR1cmVGbGFnVmFsdWUgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gdHJ1ZTtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUoXG4gIHJlZ2lzdHJ5OiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHwgdW5kZWZpbmVkLFxuICBmZWF0dXJlTmFtZTogc3RyaW5nXG4pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRmVhdHVyZUZsYWdFbmFibGVkKHJlZ2lzdHJ5Py5bbm9ybWFsaXplRmVhdHVyZU5hbWUoZmVhdHVyZU5hbWUpXSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGZWF0dXJlUnVsZShcbiAgZmVhdHVyZXM6IHN0cmluZ1tdLFxuICBtYXRjaDogRmVhdHVyZUZsYWdNYXRjaE1vZGUgPSBcImFueVwiXG4pOiBGZWF0dXJlRmxhZ1J1bGUge1xuICByZXR1cm4ge1xuICAgIGZlYXR1cmVzOiBbLi4ubmV3IFNldChmZWF0dXJlcy5tYXAobm9ybWFsaXplRmVhdHVyZU5hbWUpLmZpbHRlcihCb29sZWFuKSldLFxuICAgIG1hdGNoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNGZWF0dXJlUnVsZVNhdGlzZmllZChcbiAgcnVsZTogRmVhdHVyZUZsYWdSdWxlIHwgdW5kZWZpbmVkLFxuICByZWdpc3RyeTogRmVhdHVyZUZsYWdSZWdpc3RyeSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghcnVsZSB8fCBydWxlLmZlYXR1cmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGVuYWJsZWQgPSBydWxlLmZlYXR1cmVzLmZpbHRlcigoZmVhdHVyZSkgPT5cbiAgICBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZShyZWdpc3RyeSwgZmVhdHVyZSlcbiAgKTtcbiAgaWYgKHJ1bGUubWF0Y2ggPT09IFwiYWxsXCIpIHJldHVybiBlbmFibGVkLmxlbmd0aCA9PT0gcnVsZS5mZWF0dXJlcy5sZW5ndGg7XG4gIHJldHVybiBlbmFibGVkLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0ZlYXR1cmVSdWxlQmxvY2tlZChcbiAgcnVsZTogRmVhdHVyZUZsYWdSdWxlIHwgdW5kZWZpbmVkLFxuICByZWdpc3RyeTogRmVhdHVyZUZsYWdSZWdpc3RyeSB8IHVuZGVmaW5lZFxuKTogYm9vbGVhbiB7XG4gIGlmICghcnVsZSB8fCBydWxlLmZlYXR1cmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gcnVsZS5mZWF0dXJlcy5zb21lKChmZWF0dXJlKSA9PiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZShyZWdpc3RyeSwgZmVhdHVyZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZE1ldGFkYXRhPFQgPSB1bmtub3duPihcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIGtleTogc3RyaW5nXG4pOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIE1ldGFkYXRhLmdldCh0YXJnZXQgYXMgYW55LCBrZXkpIGFzIFQgfCB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUoXG4gIHN1YmplY3RUeXBlOiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlIHwgc3RyaW5nXG4pOiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlIHtcbiAgcmV0dXJuIHN1YmplY3RUeXBlLnRyaW0oKS50b0xvd2VyQ2FzZSgpIGFzIEZlYXR1cmVGbGFnQWNjZXNzU3ViamVjdFR5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleShzdWJqZWN0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3ViamVjdEtleS50cmltKCk7XG59XG4iLCJpbXBvcnQgeyBMb2dnZWRFbnZpcm9ubWVudCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuaW1wb3J0IHtcbiAgRkVBVFVSRV9GTEFHX0VOVl9ST09ULFxuICBGRUFUVVJFX0ZMQUdfRU5WX1BSRUZJWCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVGZWF0dXJlTmFtZSwgbm9ybWFsaXplRmVhdHVyZVJlZ2lzdHJ5IH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlLFxuICBGZWF0dXJlRmxhZ1JlZ2lzdHJ5LFxuICBGZWF0dXJlRmxhZ1ZhbHVlLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgY29uc3QgRmVhdHVyZUZsYWdFbnZpcm9ubWVudCA9IExvZ2dlZEVudmlyb25tZW50LmFjY3VtdWxhdGUoe1xuICBbRkVBVFVSRV9GTEFHX0VOVl9ST09UXToge30sXG59IGFzIEZlYXR1cmVGbGFnRW52aXJvbm1lbnRTaGFwZSk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkRmVhdHVyZUZsYWdzRnJvbUVudmlyb25tZW50KFxuICBzb3VyY2U6IFBpY2s8RmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlLCBcImZlYXR1cmVGbGFnXCI+ID0gRmVhdHVyZUZsYWdFbnZpcm9ubWVudFxuKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1JlZ2lzdHJ5PiB7XG4gIHJldHVybiBub3JtYWxpemVGZWF0dXJlUmVnaXN0cnkoc291cmNlLmZlYXR1cmVGbGFnKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGZWF0dXJlRmxhZ0Zyb21FbnZpcm9ubWVudChcbiAgZmVhdHVyZU5hbWU6IHN0cmluZyxcbiAgc291cmNlOiBQaWNrPEZlYXR1cmVGbGFnRW52aXJvbm1lbnRTaGFwZSwgXCJmZWF0dXJlRmxhZ1wiPiA9IEZlYXR1cmVGbGFnRW52aXJvbm1lbnRcbik6IFByb21pc2U8RmVhdHVyZUZsYWdWYWx1ZSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IGxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQoc291cmNlKTtcbiAgcmV0dXJuIHJlZ2lzdHJ5W25vcm1hbGl6ZUZlYXR1cmVOYW1lKGZlYXR1cmVOYW1lKV07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYXNGZWF0dXJlRmxhZ0luRW52aXJvbm1lbnQoXG4gIGZlYXR1cmVOYW1lOiBzdHJpbmcsXG4gIHNvdXJjZTogUGljazxGZWF0dXJlRmxhZ0Vudmlyb25tZW50U2hhcGUsIFwiZmVhdHVyZUZsYWdcIj4gPSBGZWF0dXJlRmxhZ0Vudmlyb25tZW50XG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgcmV0dXJuICEhKGF3YWl0IHJlc29sdmVGZWF0dXJlRmxhZ0Zyb21FbnZpcm9ubWVudChmZWF0dXJlTmFtZSwgc291cmNlKSk7XG59XG5cbmV4cG9ydCB7IEZFQVRVUkVfRkxBR19FTlZfUFJFRklYLCBGRUFUVVJFX0ZMQUdfRU5WX1JPT1QgfTtcbiIsImltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHtcbiAgY29sdW1uLFxuICBjcmVhdGVkQXQsXG4gIHBrLFxuICB0YWJsZSxcbiAgdXBkYXRlZEF0LFxuICB1dWlkLFxuICB1bmlxdWUsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ0NvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5AdGFibGUoXCJmZWF0dXJlX2ZsYWdzXCIpXG5AbW9kZWwoKVxuZXhwb3J0IGNsYXNzIEZlYXR1cmVGbGFnIGV4dGVuZHMgQmFzZU1vZGVsIHtcbiAgY29uc3RydWN0b3IoZGF0YT86IFBhcnRpYWw8RmVhdHVyZUZsYWc+KSB7XG4gICAgc3VwZXIoZGF0YSk7XG4gIH1cblxuICBAcGsoKVxuICBAdXVpZCgpXG4gIGlkITogc3RyaW5nO1xuXG4gIEB1bmlxdWUoKVxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAga2V5ITogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBlbmFibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBAY29sdW1uKClcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgQGNvbHVtbigpXG4gIHNjb3BlPzogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICBtZXRhZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIEBjb2x1bW4oKVxuICBjb25maWc/OiBGZWF0dXJlRmxhZ0NvbmZpZztcblxuICBAY29sdW1uKClcbiAgY3JlYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIEBjb2x1bW4oKVxuICB1cGRhdGVkQnk/OiBzdHJpbmc7XG5cbiAgQGNyZWF0ZWRBdCgpXG4gIGNyZWF0ZWRBdCE6IERhdGU7XG5cbiAgQHVwZGF0ZWRBdCgpXG4gIHVwZGF0ZWRBdCE6IERhdGU7XG59XG4iLCJpbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2NvcmVcIjtcbmltcG9ydCB7IGNvbHVtbiwgY3JlYXRlZEF0LCBwaywgdGFibGUsIHVwZGF0ZWRBdCwgdXVpZCB9IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHJlcXVpcmVkIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHR5cGUgeyBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3RUeXBlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbkB0YWJsZShcImZlYXR1cmVfZmxhZ19hY2Nlc3NcIilcbkBtb2RlbCgpXG5leHBvcnQgY2xhc3MgRmVhdHVyZUZsYWdBY2Nlc3MgZXh0ZW5kcyBCYXNlTW9kZWwge1xuICBjb25zdHJ1Y3RvcihkYXRhPzogUGFydGlhbDxGZWF0dXJlRmxhZ0FjY2Vzcz4pIHtcbiAgICBzdXBlcihkYXRhKTtcbiAgfVxuXG4gIEBwaygpXG4gIEB1dWlkKClcbiAgaWQhOiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQGNvbHVtbigpXG4gIGZlYXR1cmVLZXkhOiBzdHJpbmc7XG5cbiAgQHJlcXVpcmVkKClcbiAgQGNvbHVtbigpXG4gIHN1YmplY3RUeXBlITogRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0VHlwZSB8IHN0cmluZztcblxuICBAcmVxdWlyZWQoKVxuICBAY29sdW1uKClcbiAgc3ViamVjdEtleSE6IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgZW5hYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgQGNvbHVtbigpXG4gIG1ldGFkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgQGNvbHVtbigpXG4gIGNyZWF0ZWRCeT86IHN0cmluZztcblxuICBAY29sdW1uKClcbiAgdXBkYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIEBjcmVhdGVkQXQoKVxuICBjcmVhdGVkQXQhOiBEYXRlO1xuXG4gIEB1cGRhdGVkQXQoKVxuICB1cGRhdGVkQXQhOiBEYXRlO1xufVxuIiwiaW1wb3J0IHtcbiAgRkVBVFVSRV9GTEFHX0VOVl9ST09ULFxufSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBsb2FkRmVhdHVyZUZsYWdzRnJvbUVudmlyb25tZW50LFxufSBmcm9tIFwiLi4vZW52aXJvbm1lbnRcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlLFxuICBGZWF0dXJlRmxhZ1JlYWRlcklucHV0LFxuICBGZWF0dXJlRmxhZ1JlZ2lzdHJ5LFxuICBGZWF0dXJlRmxhZ1ZhbHVlLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUZlYXR1cmVOYW1lIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGZWF0dXJlRmxhZ1JlYWRlciB7XG4gIGFic3RyYWN0IHJlYWQoXG4gICAgaW5wdXQ/OiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0XG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT47XG5cbiAgYXN5bmMgcmVhZE9uZShcbiAgICBmZWF0dXJlTmFtZTogc3RyaW5nLFxuICAgIGlucHV0PzogRmVhdHVyZUZsYWdSZWFkZXJJbnB1dFxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnVmFsdWUgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCByZWdpc3RyeSA9IGF3YWl0IHRoaXMucmVhZChpbnB1dCk7XG4gICAgcmV0dXJuIHJlZ2lzdHJ5W25vcm1hbGl6ZUZlYXR1cmVOYW1lKGZlYXR1cmVOYW1lKV07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVudmlyb25tZUZsYWdSZWFkZXIgZXh0ZW5kcyBGZWF0dXJlRmxhZ1JlYWRlciB7XG4gIGFzeW5jIHJlYWQoXG4gICAgaW5wdXQ6IEZlYXR1cmVGbGFnUmVhZGVySW5wdXQgPSB7fVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnUmVnaXN0cnk+IHtcbiAgICBjb25zdCBlbnZpcm9ubWVudCA9XG4gICAgICAoaW5wdXQuc291cmNlIGFzIEZlYXR1cmVGbGFnRW52aXJvbm1lbnRTaGFwZSB8IHVuZGVmaW5lZCkgPz9cbiAgICAgICh7XG4gICAgICAgIFtGRUFUVVJFX0ZMQUdfRU5WX1JPT1RdOiB7fSxcbiAgICAgIH0gYXMgRmVhdHVyZUZsYWdFbnZpcm9ubWVudFNoYXBlKTtcbiAgICByZXR1cm4gbG9hZEZlYXR1cmVGbGFnc0Zyb21FbnZpcm9ubWVudChlbnZpcm9ubWVudCk7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgRmVhdHVyZUZsYWdSZWFkZXJDb25zdHJ1Y3RvciA9IG5ldyAoKSA9PiBGZWF0dXJlRmxhZ1JlYWRlcjtcbmV4cG9ydCB0eXBlIEZlYXR1cmVGbGFnUmVhZGVyTGlrZSA9XG4gIHwgRmVhdHVyZUZsYWdSZWFkZXJcbiAgfCBGZWF0dXJlRmxhZ1JlYWRlckNvbnN0cnVjdG9yO1xuIiwiaW1wb3J0IHtcbiAgQ29uZGl0aW9uLFxuICBNb2RlbFNlcnZpY2UsXG4gIFJlcG9zaXRvcnksXG4gIHJlcG9zaXRvcnksXG4gIHNlcnZpY2UsXG59IGZyb20gXCJAZGVjYWYtdHMvY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBSZXBvIH0gZnJvbSBcIkBkZWNhZi10cy9jb3JlXCI7XG5pbXBvcnQgeyBOb3RGb3VuZEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50IH0gZnJvbSBcIi4uL2Vudmlyb25tZW50XCI7XG5pbXBvcnQgeyBGZWF0dXJlRmxhZ0FjY2VzcyB9IGZyb20gXCIuLi9tb2RlbHMvRmVhdHVyZUZsYWdBY2Nlc3MubW9kZWxcIjtcbmltcG9ydCB7IEZlYXR1cmVGbGFnIH0gZnJvbSBcIi4uL21vZGVscy9GZWF0dXJlRmxhZy5tb2RlbFwiO1xuaW1wb3J0IHtcbiAgRW52aXJvbm1lRmxhZ1JlYWRlcixcbiAgRmVhdHVyZUZsYWdSZWFkZXIsXG4gIEZlYXR1cmVGbGFnUmVhZGVyTGlrZSxcbn0gZnJvbSBcIi4uL3JlYWRlcnNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRmVhdHVyZUZsYWdBY2Nlc3NJbnB1dCxcbiAgRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeSxcbiAgRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0LFxuICBGZWF0dXJlRmxhZ0NvbmZpZyxcbiAgRmVhdHVyZUZsYWdSZWFkZXJDb25maWcsXG4gIEZlYXR1cmVGbGFnUmVhZGVySW5wdXQsXG4gIEZlYXR1cmVGbGFnUmVnaXN0cnksXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgaXNGZWF0dXJlRmxhZ0VuYWJsZWQsXG4gIGlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lLFxuICBub3JtYWxpemVGZWF0dXJlTmFtZSxcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleSwgbm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmVhdHVyZUZsYWdTZXJ2aWNlQ29uZmlnIGV4dGVuZHMgRmVhdHVyZUZsYWdSZWFkZXJDb25maWcge1xuICByZWFkZXI/OiBGZWF0dXJlRmxhZ1JlYWRlckxpa2U7XG4gIHJlcG9zaXRvcnk/OiBSZXBvc2l0b3J5PEZlYXR1cmVGbGFnLCBhbnk+O1xufVxuXG5Ac2VydmljZShGZWF0dXJlRmxhZylcbmV4cG9ydCBjbGFzcyBGZWF0dXJlRmxhZ1NlcnZpY2UgZXh0ZW5kcyBNb2RlbFNlcnZpY2U8RmVhdHVyZUZsYWc+IHtcbiAgcHJpdmF0ZSByZWFkZXI6IEZlYXR1cmVGbGFnUmVhZGVyID0gbmV3IEVudmlyb25tZUZsYWdSZWFkZXIoKTtcbiAgcHJpdmF0ZSBjYWNoZWRSZWdpc3RyeTogRmVhdHVyZUZsYWdSZWdpc3RyeSA9IHt9O1xuICBAcmVwb3NpdG9yeShGZWF0dXJlRmxhZ0FjY2VzcylcbiAgcHJvdGVjdGVkIGFjY2Vzc1JlcG9zaXRvcnkhOiBSZXBvPEZlYXR1cmVGbGFnQWNjZXNzPjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihGZWF0dXJlRmxhZyk7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplKFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8eyBjb25maWc6IEZlYXR1cmVGbGFnU2VydmljZUNvbmZpZzsgY2xpZW50OiBGZWF0dXJlRmxhZ1JlYWRlciB9PiB7XG4gICAgY29uc3QgY29uZmlnID0gKGFyZ3NbMF0gYXMgRmVhdHVyZUZsYWdTZXJ2aWNlQ29uZmlnIHwgdW5kZWZpbmVkKSA/PyB7fTtcbiAgICBpZiAoY29uZmlnLnJlcG9zaXRvcnkpIHtcbiAgICAgIHRoaXMuX3JlcG9zaXRvcnkgPSBjb25maWcucmVwb3NpdG9yeSBhcyBhbnk7XG4gICAgfVxuICAgIHRoaXMucmVhZGVyID0gIWNvbmZpZy5yZWFkZXJcbiAgICAgID8gbmV3IEVudmlyb25tZUZsYWdSZWFkZXIoKVxuICAgICAgOiB0eXBlb2YgY29uZmlnLnJlYWRlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gbmV3IGNvbmZpZy5yZWFkZXIoKVxuICAgICAgICA6IGNvbmZpZy5yZWFkZXI7XG4gICAgY29uc3QgcmVhZGVyQ29uZmlnID0ge1xuICAgICAgLi4uKGNvbmZpZy5yZWFkZXJDb25maWcgPz8ge30pLFxuICAgICAgc291cmNlOiBjb25maWcucmVhZGVyQ29uZmlnPy5zb3VyY2UgPz8gRmVhdHVyZUZsYWdFbnZpcm9ubWVudCxcbiAgICB9O1xuICAgIHRoaXMuY2FjaGVkUmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlZnJlc2hDYWNoZWRSZWdpc3RyeShyZWFkZXJDb25maWcsIC4uLmFyZ3MpO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUNvbmZpZzogRmVhdHVyZUZsYWdTZXJ2aWNlQ29uZmlnID0ge1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgcmVhZGVyOiB0aGlzLnJlYWRlcixcbiAgICAgIHJlYWRlckNvbmZpZyxcbiAgICB9O1xuICAgIHJldHVybiB7IGNvbmZpZzogZWZmZWN0aXZlQ29uZmlnLCBjbGllbnQ6IHRoaXMucmVhZGVyIH07XG4gIH1cblxuICBwcml2YXRlIGNsb25lUmVnaXN0cnkocmVnaXN0cnk6IEZlYXR1cmVGbGFnUmVnaXN0cnkpOiBGZWF0dXJlRmxhZ1JlZ2lzdHJ5IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVnaXN0cnkpLnJlZHVjZSgoYWNjLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGFjY1trZXldID1cbiAgICAgICAgdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKVxuICAgICAgICAgID8gKHsgLi4uKHZhbHVlIGFzIEZlYXR1cmVGbGFnQ29uZmlnKSB9IGFzIEZlYXR1cmVGbGFnQ29uZmlnKVxuICAgICAgICAgIDogdmFsdWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIEZlYXR1cmVGbGFnUmVnaXN0cnkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWZyZXNoQ2FjaGVkUmVnaXN0cnkoXG4gICAgb3B0aW9uczogRmVhdHVyZUZsYWdSZWFkZXJJbnB1dCA9IHt9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT4ge1xuICAgIGNvbnN0IGVudlJlZ2lzdHJ5ID0gYXdhaXQgdGhpcy5yZWFkZXIucmVhZCh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSA/PyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50LFxuICAgIH0pO1xuICAgIGxldCBwZXJzaXN0ZWQ6IEZlYXR1cmVGbGFnW10gPSBbXTtcbiAgICB0cnkge1xuICAgICAgcGVyc2lzdGVkID0gYXdhaXQgdGhpcy5yZXBvLnNlbGVjdCgpLmV4ZWN1dGUoLi4uYXJncyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwZXJzaXN0ZWQgPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyeSA9IHRoaXMuY2xvbmVSZWdpc3RyeShlbnZSZWdpc3RyeSk7XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIHBlcnNpc3RlZCkge1xuICAgICAgcmVnaXN0cnlbZmxhZy5rZXldID0gZmxhZy5lbmFibGVkID8gKGZsYWcuY29uZmlnID8/IHRydWUpIDogZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q2FjaGVkRmxhZyhmbGFnOiBGZWF0dXJlRmxhZyk6IHZvaWQge1xuICAgIHRoaXMuY2FjaGVkUmVnaXN0cnlbZmxhZy5rZXldID0gZmxhZy5lbmFibGVkXG4gICAgICA/IChmbGFnLmNvbmZpZyA/PyB0cnVlKVxuICAgICAgOiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWNjZXNzUmVwb3NpdG9yeSgpOiBSZXBvPEZlYXR1cmVGbGFnQWNjZXNzPiB7XG4gICAgcmV0dXJuIHRoaXMuYWNjZXNzUmVwb3NpdG9yeSA/PyBSZXBvc2l0b3J5LmZvck1vZGVsKEZlYXR1cmVGbGFnQWNjZXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0SW5pdGlhbGl6ZWQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLnJlYWRlcjtcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplRmVhdHVyZUFjY2Vzc0lucHV0KFxuICAgIGlucHV0OiBGZWF0dXJlRmxhZ0FjY2Vzc0lucHV0XG4gICk6IEZlYXR1cmVGbGFnQWNjZXNzSW5wdXQge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5pbnB1dCxcbiAgICAgIGZlYXR1cmVLZXk6IG5vcm1hbGl6ZUZlYXR1cmVOYW1lKGlucHV0LmZlYXR1cmVLZXkpLFxuICAgICAgc3ViamVjdFR5cGU6IG5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZShpbnB1dC5zdWJqZWN0VHlwZSksXG4gICAgICBzdWJqZWN0S2V5OiBub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleShpbnB1dC5zdWJqZWN0S2V5KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZEFjY2Vzc0NvbmRpdGlvbihcbiAgICBxdWVyeTogRmVhdHVyZUZsYWdBY2Nlc3NRdWVyeVxuICApOiBDb25kaXRpb248RmVhdHVyZUZsYWdBY2Nlc3M+IHtcbiAgICBsZXQgY29uZGl0aW9uID0gQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWdBY2Nlc3M+KFwic3ViamVjdFR5cGVcIikuZXEoXG4gICAgICBub3JtYWxpemVGZWF0dXJlU3ViamVjdFR5cGUocXVlcnkuc3ViamVjdFR5cGUpXG4gICAgKTtcbiAgICBjb25kaXRpb24gPSBjb25kaXRpb24uYW5kKFxuICAgICAgQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWdBY2Nlc3M+KFwic3ViamVjdEtleVwiKS5lcShcbiAgICAgICAgbm9ybWFsaXplRmVhdHVyZVN1YmplY3RLZXkocXVlcnkuc3ViamVjdEtleSlcbiAgICAgIClcbiAgICApO1xuICAgIGlmICh0eXBlb2YgcXVlcnkuZW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uZGl0aW9uID0gY29uZGl0aW9uLmFuZChcbiAgICAgICAgQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWdBY2Nlc3M+KFwiZW5hYmxlZFwiKS5lcShxdWVyeS5lbmFibGVkKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHF1ZXJ5LmZlYXR1cmVLZXlzICYmIHF1ZXJ5LmZlYXR1cmVLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbmRpdGlvbiA9IGNvbmRpdGlvbi5hbmQoXG4gICAgICAgIENvbmRpdGlvbi5hdHRyPEZlYXR1cmVGbGFnQWNjZXNzPihcImZlYXR1cmVLZXlcIikuaW4oXG4gICAgICAgICAgcXVlcnkuZmVhdHVyZUtleXMubWFwKG5vcm1hbGl6ZUZlYXR1cmVOYW1lKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gY29uZGl0aW9uO1xuICB9XG5cbiAgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlKFxuICAgIG1vZGVsOiBGZWF0dXJlRmxhZyxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnPiB7XG4gICAgbW9kZWwua2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUobW9kZWwua2V5KTtcbiAgICBtb2RlbC5lbmFibGVkID8/PSB0cnVlO1xuICAgIGNvbnN0IGNyZWF0ZWQgPSBhd2FpdCBzdXBlci5jcmVhdGUobW9kZWwsIC4uLmFyZ3MpO1xuICAgIHRoaXMuc2V0Q2FjaGVkRmxhZyhjcmVhdGVkKTtcbiAgICByZXR1cm4gY3JlYXRlZDtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHVwZGF0ZShcbiAgICBtb2RlbDogRmVhdHVyZUZsYWcsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZz4ge1xuICAgIG1vZGVsLmtleSA9IG5vcm1hbGl6ZUZlYXR1cmVOYW1lKG1vZGVsLmtleSk7XG4gICAgbW9kZWwuZW5hYmxlZCA/Pz0gdHJ1ZTtcbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgc3VwZXIudXBkYXRlKG1vZGVsLCAuLi5hcmdzKTtcbiAgICB0aGlzLnNldENhY2hlZEZsYWcodXBkYXRlZCk7XG4gICAgcmV0dXJuIHVwZGF0ZWQ7XG4gIH1cblxuICBvdmVycmlkZSBhc3luYyBmaW5kT25lQnkoXG4gICAga2V5OiBrZXlvZiBGZWF0dXJlRmxhZyxcbiAgICB2YWx1ZTogYW55LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWc+IHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPVxuICAgICAga2V5ID09PSBcImtleVwiICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IG5vcm1hbGl6ZUZlYXR1cmVOYW1lKHZhbHVlKVxuICAgICAgICA6IHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnJlcG8uZmluZE9uZUJ5KGtleSwgbm9ybWFsaXplZFZhbHVlLCAuLi5hcmdzKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGFzeW5jIHJlYWRBbGwoXG4gICAga2V5czogYW55W10sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1tdPiB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5yZXBvLnJlYWRBbGwoa2V5cywgLi4uYXJncyk7XG4gICAgZm9yIChjb25zdCBmbGFnIG9mIHJlc3VsdCkgdGhpcy5zZXRDYWNoZWRGbGFnKGZsYWcpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBsaXN0RW5hYmxlZCguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8RmVhdHVyZUZsYWdbXT4ge1xuICAgIHJldHVybiB0aGlzLnJlcG9cbiAgICAgIC5zZWxlY3QoKVxuICAgICAgLndoZXJlKENvbmRpdGlvbi5hdHRyPEZlYXR1cmVGbGFnPihcImVuYWJsZWRcIikuZXEodHJ1ZSkpXG4gICAgICAuZXhlY3V0ZSguLi5hcmdzKTtcbiAgfVxuXG4gIGFzeW5jIGdyYW50RmVhdHVyZUFjY2VzcyhcbiAgICBpbnB1dDogRmVhdHVyZUZsYWdBY2Nlc3NJbnB1dCxcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBQcm9taXNlPEZlYXR1cmVGbGFnQWNjZXNzPiB7XG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplRmVhdHVyZUFjY2Vzc0lucHV0KGlucHV0KTtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZmluZEZlYXR1cmVBY2Nlc3Mobm9ybWFsaXplZCwgLi4uYXJncykuY2F0Y2goXG4gICAgICAoKSA9PiB1bmRlZmluZWRcbiAgICApO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiB0aGlzLmdldEFjY2Vzc1JlcG9zaXRvcnkoKS5jcmVhdGUoXG4gICAgICAgIG5ldyBGZWF0dXJlRmxhZ0FjY2Vzcyhub3JtYWxpemVkKSxcbiAgICAgICAgLi4uYXJnc1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpLnVwZGF0ZShcbiAgICAgIE9iamVjdC5hc3NpZ24oZXhpc3RpbmcsIG5vcm1hbGl6ZWQpLFxuICAgICAgLi4uYXJnc1xuICAgICk7XG4gIH1cblxuICBhc3luYyByZXZva2VGZWF0dXJlQWNjZXNzKFxuICAgIGlucHV0OiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QgJiB7IGZlYXR1cmVLZXk6IHN0cmluZyB9LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdBY2Nlc3MgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHRoaXMuZmluZEZlYXR1cmVBY2Nlc3MoaW5wdXQsIC4uLmFyZ3MpLmNhdGNoKFxuICAgICAgKCkgPT4gdW5kZWZpbmVkXG4gICAgKTtcbiAgICBpZiAoIWV4aXN0aW5nKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmdldEFjY2Vzc1JlcG9zaXRvcnkoKS5kZWxldGUoZXhpc3RpbmcuaWQsIC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgZmluZEZlYXR1cmVBY2Nlc3MoXG4gICAgcXVlcnk6IEZlYXR1cmVGbGFnQWNjZXNzUXVlcnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ0FjY2Vzcz4ge1xuICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuYnVpbGRBY2Nlc3NDb25kaXRpb24ocXVlcnkpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLmdldEFjY2Vzc1JlcG9zaXRvcnkoKVxuICAgICAgLnNlbGVjdCgpXG4gICAgICAud2hlcmUoY29uZGl0aW9uKVxuICAgICAgLmV4ZWN1dGUoLi4uYXJncyk7XG4gICAgY29uc3QgZXhpc3RpbmcgPSByZXN1bHRzWzBdO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEVycm9yKFxuICAgICAgICBgRmVhdHVyZSBhY2Nlc3MgZm9yICR7bm9ybWFsaXplRmVhdHVyZVN1YmplY3RUeXBlKHF1ZXJ5LnN1YmplY3RUeXBlKX06JHtub3JtYWxpemVGZWF0dXJlU3ViamVjdEtleShxdWVyeS5zdWJqZWN0S2V5KX0gbm90IGZvdW5kYFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG5cbiAgYXN5bmMgbGlzdEZlYXR1cmVBY2Nlc3MoXG4gICAgcXVlcnk6IEZlYXR1cmVGbGFnQWNjZXNzUXVlcnksXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ0FjY2Vzc1tdPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0QWNjZXNzUmVwb3NpdG9yeSgpXG4gICAgICAuc2VsZWN0KClcbiAgICAgIC53aGVyZSh0aGlzLmJ1aWxkQWNjZXNzQ29uZGl0aW9uKHF1ZXJ5KSlcbiAgICAgIC5leGVjdXRlKC4uLmFyZ3MpO1xuICB9XG5cbiAgYXN5bmMgcmVzb2x2ZUZlYXR1cmVGbGFnc0ZvclN1YmplY3QoXG4gICAgc3ViamVjdDogRmVhdHVyZUZsYWdBY2Nlc3NTdWJqZWN0LFxuICAgIC4uLmFyZ3M6IGFueVtdXG4gICk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT4ge1xuICAgIHRoaXMuYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBhY2Nlc3MgPSBhd2FpdCB0aGlzLmxpc3RGZWF0dXJlQWNjZXNzKFxuICAgICAge1xuICAgICAgICAuLi5zdWJqZWN0LFxuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIGNvbnN0IGZlYXR1cmVLZXlzID0gWy4uLm5ldyBTZXQoYWNjZXNzLm1hcCgoaXRlbSkgPT4gaXRlbS5mZWF0dXJlS2V5KSldO1xuICAgIGlmIChmZWF0dXJlS2V5cy5sZW5ndGggPT09IDApIHJldHVybiB7fTtcblxuICAgIGNvbnN0IGNvbmRpdGlvbiA9IENvbmRpdGlvbi5hdHRyPEZlYXR1cmVGbGFnPihcImVuYWJsZWRcIikuZXEodHJ1ZSkuYW5kKFxuICAgICAgQ29uZGl0aW9uLmF0dHI8RmVhdHVyZUZsYWc+KFwia2V5XCIpLmluKFxuICAgICAgICBmZWF0dXJlS2V5cy5tYXAobm9ybWFsaXplRmVhdHVyZU5hbWUpXG4gICAgICApXG4gICAgKTtcblxuICAgIGNvbnN0IGVuYWJsZWRGbGFncyA9IGF3YWl0IHRoaXMucmVwby5zZWxlY3QoKS53aGVyZShjb25kaXRpb24pLmV4ZWN1dGUoLi4uYXJncyk7XG4gICAgcmV0dXJuIGVuYWJsZWRGbGFncy5yZWR1Y2UoKHJlZ2lzdHJ5LCBmbGFnKSA9PiB7XG4gICAgICByZWdpc3RyeVtmbGFnLmtleV0gPSBmbGFnLmNvbmZpZyA/PyB0cnVlO1xuICAgICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICAgIH0sIHt9IGFzIEZlYXR1cmVGbGFnUmVnaXN0cnkpO1xuICB9XG5cbiAgYXN5bmMgaXNFbmFibGVkRm9yU3ViamVjdChcbiAgICBrZXk6IHN0cmluZyxcbiAgICBzdWJqZWN0OiBGZWF0dXJlRmxhZ0FjY2Vzc1N1YmplY3QsXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgcmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlc29sdmVGZWF0dXJlRmxhZ3NGb3JTdWJqZWN0KHN1YmplY3QsIC4uLmFyZ3MpO1xuICAgIHJldHVybiBpc0ZlYXR1cmVGbGFnRW5hYmxlZEJ5TmFtZShyZWdpc3RyeSwga2V5KTtcbiAgfVxuXG4gIGlzRW5hYmxlZChrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRoaXMuYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUoa2V5KTtcbiAgICByZXR1cm4gaXNGZWF0dXJlRmxhZ0VuYWJsZWRCeU5hbWUodGhpcy5jYWNoZWRSZWdpc3RyeSwgbm9ybWFsaXplZEtleSk7XG4gIH1cblxuICBhc3luYyByZXNvbHZlRmVhdHVyZUZsYWdzKCk6IFByb21pc2U8RmVhdHVyZUZsYWdSZWdpc3RyeT4ge1xuICAgIHRoaXMuYXNzZXJ0SW5pdGlhbGl6ZWQoKTtcbiAgICByZXR1cm4gdGhpcy5jbG9uZVJlZ2lzdHJ5KHRoaXMuY2FjaGVkUmVnaXN0cnkpO1xuICB9XG5cbiAgYXN5bmMgc3luY0Zyb21FbnZpcm9ubWVudChcbiAgICBvcHRpb25zOiBGZWF0dXJlRmxhZ1JlYWRlcklucHV0ID0ge30sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUHJvbWlzZTxGZWF0dXJlRmxhZ1tdPiB7XG4gICAgdGhpcy5hc3NlcnRJbml0aWFsaXplZCgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5ID0gYXdhaXQgdGhpcy5yZWFkZXIucmVhZCh7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSA/PyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50LFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdHM6IEZlYXR1cmVGbGFnW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWdpc3RyeSkpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9XG4gICAgICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgICAgICA/ICh2YWx1ZSBhcyBGZWF0dXJlRmxhZ0NvbmZpZylcbiAgICAgICAgICA6IHsgZW5hYmxlZDogQm9vbGVhbih2YWx1ZSkgfTtcbiAgICAgIGNvbnN0IHsgZW5hYmxlZDogX2lnbm9yZWRFbmFibGVkLCAuLi5yZXN0Q29uZmlnIH0gPSBjb25maWc7XG4gICAgICBjb25zdCBub3JtYWxpemVkS2V5ID0gbm9ybWFsaXplRmVhdHVyZU5hbWUoa2V5KTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nID0gYXdhaXQgdGhpcy5maW5kT25lQnkoXG4gICAgICAgIFwia2V5XCIsXG4gICAgICAgIG5vcm1hbGl6ZWRLZXksXG4gICAgICAgIC4uLmFyZ3NcbiAgICAgICkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICAgIGNvbnN0IG1vZGVsID0gZXhpc3RpbmdcbiAgICAgICAgPyBPYmplY3QuYXNzaWduKGV4aXN0aW5nLCB7XG4gICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzdENvbmZpZy5kZXNjcmlwdGlvbiA/PyBleGlzdGluZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNjb3BlOiByZXN0Q29uZmlnLnNjb3BlID8/IGV4aXN0aW5nLnNjb3BlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlc3RDb25maWcubWV0YWRhdGEgPz8gZXhpc3RpbmcubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgLi4ucmVzdENvbmZpZyxcbiAgICAgICAgICAgICAgZW5hYmxlZDogaXNGZWF0dXJlRmxhZ0VuYWJsZWQodmFsdWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KVxuICAgICAgICA6IG5ldyBGZWF0dXJlRmxhZyh7XG4gICAgICAgICAgICBrZXk6IG5vcm1hbGl6ZWRLZXksXG4gICAgICAgICAgICBlbmFibGVkOiBpc0ZlYXR1cmVGbGFnRW5hYmxlZCh2YWx1ZSksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogcmVzdENvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNjb3BlOiByZXN0Q29uZmlnLnNjb3BlLFxuICAgICAgICAgICAgbWV0YWRhdGE6IHJlc3RDb25maWcubWV0YWRhdGEsXG4gICAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgICAgLi4ucmVzdENvbmZpZyxcbiAgICAgICAgICAgICAgZW5hYmxlZDogaXNGZWF0dXJlRmxhZ0VuYWJsZWQodmFsdWUpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgIHJlc3VsdHMucHVzaChleGlzdGluZyA/IGF3YWl0IHRoaXMudXBkYXRlKG1vZGVsLCAuLi5hcmdzKSA6IGF3YWl0IHRoaXMuY3JlYXRlKG1vZGVsLCAuLi5hcmdzKSk7XG4gICAgfVxuICAgIHRoaXMuY2FjaGVkUmVnaXN0cnkgPSBhd2FpdCB0aGlzLnJlZnJlc2hDYWNoZWRSZWdpc3RyeShcbiAgICAgIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc291cmNlOiBvcHRpb25zLnNvdXJjZSA/PyBGZWF0dXJlRmxhZ0Vudmlyb25tZW50LFxuICAgICAgfSxcbiAgICAgIC4uLmFyZ3NcbiAgICApO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBNZXRhZGF0YSxcbiAgbWV0YWRhdGEsXG4gIG1ldGhvZE1ldGFkYXRhLFxuICBwcm9wTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdGlvblwiO1xuaW1wb3J0IHtcbiAgRkVBVFVSRV9GTEFHX0FVVEhfS0VZLFxuICBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZLFxuICBGRUFUVVJFX0ZMQUdfSElERV9LRVksXG4gIEZFQVRVUkVfRkxBR19NT0RFTF9LRVksXG4gIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB0eXBlIHsgRmVhdHVyZUZsYWdSdWxlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZUZlYXR1cmVSdWxlLFxuICBpc0ZlYXR1cmVSdWxlQmxvY2tlZCxcbiAgaXNGZWF0dXJlUnVsZVNhdGlzZmllZCxcbiAgcmVhZE1ldGFkYXRhLFxufSBmcm9tIFwiLi91dGlsc1wiO1xuXG50eXBlIEZlYXR1cmVEZWNvcmF0b3JLZXkgPVxuICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZXG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19BVVRIX0tFWVxuICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZXG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZXG4gIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19ISURFX0tFWTtcblxuZnVuY3Rpb24gZmVhdHVyZU1ldGFkYXRhS2V5KFxuICBrZXk6IEZlYXR1cmVEZWNvcmF0b3JLZXksXG4gIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIHByb3BlcnR5S2V5ID09PSBcInVuZGVmaW5lZFwiXG4gICAgPyBrZXlcbiAgICA6IE1ldGFkYXRhLmtleShrZXksIHByb3BlcnR5S2V5LnRvU3RyaW5nKCkpO1xufVxuXG5mdW5jdGlvbiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoXG4gIGtleTogRmVhdHVyZURlY29yYXRvcktleSxcbiAgZmVhdHVyZXM6IHN0cmluZ1tdLFxuICBtYXRjaDogRmVhdHVyZUZsYWdSdWxlW1wibWF0Y2hcIl0gPSBcImFueVwiXG4pIHtcbiAgY29uc3QgcnVsZSA9IG5vcm1hbGl6ZUZlYXR1cmVSdWxlKGZlYXR1cmVzLCBtYXRjaCk7XG4gIHJldHVybiBmdW5jdGlvbiBmZWF0dXJlRGVjb3JhdG9yKFxuICAgIHRhcmdldDogYW55LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sLFxuICAgIGRlc2NyaXB0b3I/OiBQcm9wZXJ0eURlc2NyaXB0b3JcbiAgKSB7XG4gICAgaWYgKHR5cGVvZiBwcm9wZXJ0eUtleSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgcmV0dXJuIG1ldGFkYXRhKGtleSwgcnVsZSkodGFyZ2V0KTtcbiAgICB9XG4gICAgY29uc3Qgc2NvcGVkS2V5ID0gZmVhdHVyZU1ldGFkYXRhS2V5KGtleSwgcHJvcGVydHlLZXkpO1xuICAgIGlmIChkZXNjcmlwdG9yKSB7XG4gICAgICByZXR1cm4gbWV0aG9kTWV0YWRhdGEoc2NvcGVkS2V5LCBydWxlKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShzY29wZWRLZXksIHJ1bGUpKHRhcmdldCwgcHJvcGVydHlLZXkpO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmVhdHVyZUZsYWdzKC4uLmZlYXR1cmVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlGZWF0dXJlRGVjb3JhdG9yKEZFQVRVUkVfRkxBR19NT0RFTF9LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZlYXR1cmVBdXRoKC4uLmZlYXR1cmVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gYXBwbHlGZWF0dXJlRGVjb3JhdG9yKEZFQVRVUkVfRkxBR19BVVRIX0tFWSwgZmVhdHVyZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmxvY2tGZWF0dXJlT3BlcmF0aW9ucyguLi5mZWF0dXJlczogc3RyaW5nW10pIHtcbiAgcmV0dXJuIGFwcGx5RmVhdHVyZURlY29yYXRvcihGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZLCBmZWF0dXJlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJJZkZlYXR1cmUoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVksIGZlYXR1cmVzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGhpZGVPbkZlYXR1cmUoLi4uZmVhdHVyZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiBhcHBseUZlYXR1cmVEZWNvcmF0b3IoRkVBVFVSRV9GTEFHX0hJREVfS0VZLCBmZWF0dXJlcyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGZWF0dXJlR2F0ZU1ldGFkYXRhKFxuICB0YXJnZXQ6IG9iamVjdCxcbiAga2V5OlxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19NT0RFTF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQVVUSF9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX1JFTkRFUl9LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfSElERV9LRVksXG4gIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sXG4pOiBGZWF0dXJlRmxhZ1J1bGUgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVhZE1ldGFkYXRhPEZlYXR1cmVGbGFnUnVsZT4oXG4gICAgdGFyZ2V0LFxuICAgIGZlYXR1cmVNZXRhZGF0YUtleShrZXksIHByb3BlcnR5S2V5KVxuICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkRXhwb3NlRm9yRmVhdHVyZXMoXG4gIHRhcmdldDogb2JqZWN0LFxuICBlbmFibGVkRmVhdHVyZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBrZXk6XG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX01PREVMX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19BVVRIX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19CTE9DS19LRVlcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfUkVOREVSX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19ISURFX0tFWSxcbiAgcHJvcGVydHlLZXk/OiBzdHJpbmcgfCBzeW1ib2xcbikge1xuICBjb25zdCBydWxlID0gZ2V0RmVhdHVyZUdhdGVNZXRhZGF0YSh0YXJnZXQsIGtleSwgcHJvcGVydHlLZXkpO1xuICByZXR1cm4gaXNGZWF0dXJlUnVsZVNhdGlzZmllZChydWxlLCBlbmFibGVkRmVhdHVyZXMgYXMgYW55KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNob3VsZEhpZGVGb3JGZWF0dXJlcyhcbiAgdGFyZ2V0OiBvYmplY3QsXG4gIGVuYWJsZWRGZWF0dXJlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGtleTpcbiAgICB8IHR5cGVvZiBGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0FVVEhfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0JMT0NLX0tFWVxuICAgIHwgdHlwZW9mIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZXG4gICAgfCB0eXBlb2YgRkVBVFVSRV9GTEFHX0hJREVfS0VZLFxuICBwcm9wZXJ0eUtleT86IHN0cmluZyB8IHN5bWJvbFxuKSB7XG4gIGNvbnN0IHJ1bGUgPSBnZXRGZWF0dXJlR2F0ZU1ldGFkYXRhKHRhcmdldCwga2V5LCBwcm9wZXJ0eUtleSk7XG4gIHJldHVybiBpc0ZlYXR1cmVSdWxlQmxvY2tlZChydWxlLCBlbmFibGVkRmVhdHVyZXMgYXMgYW55KTtcbn1cblxuZXhwb3J0IHtcbiAgRkVBVFVSRV9GTEFHX0FVVEhfS0VZLFxuICBGRUFUVVJFX0ZMQUdfQkxPQ0tfS0VZLFxuICBGRUFUVVJFX0ZMQUdfSElERV9LRVksXG4gIEZFQVRVUkVfRkxBR19NT0RFTF9LRVksXG4gIEZFQVRVUkVfRkxBR19SRU5ERVJfS0VZLFxufTtcbiIsIi8qKlxuICogQG1vZHVsZSBpbnRlZ3JhdGlvbnNcbiAqIEBzdW1tYXJ5IFBhY2thZ2UgZW50cnkgcG9pbnQgZm9yIHNoYXJlZCBpbnRlZ3JhdGlvbiBoZWxwZXJzLlxuICogQGRlc2NyaXB0aW9uIEV4cG9zZXMgdGhlIHBhY2thZ2UgdXRpbGl0aWVzIGFuZCBidWlsZC10aW1lIHZlcnNpb24gbWV0YWRhdGEgZm9yIGBAZGVjYWYtdHMvaW50ZWdyYXRpb25zYC5cbiAqL1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL25hbWVzcGFjZXNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2ZlYXR1cmUtZmxhZ3NcIjtcblxuZXhwb3J0IGNvbnN0IFZFUlNJT046IHN0cmluZyA9IFwiIyNWRVJTSU9OIyNcIjtcblxuZXhwb3J0IGNvbnN0IENPTU1JVCA9IFwiIyNDT01NSVQjI1wiO1xuXG5leHBvcnQgY29uc3QgRlVMTF9WRVJTSU9OID0gXCIjI0ZVTExfVkVSU0lPTiMjXCI7XG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX05BTUU6IHN0cmluZyA9IFwiIyNQQUNLQUdFIyNcIjtcbiJdLCJuYW1lcyI6WyJhc3luYyIsImV4ZWNXaXRoTG9nZ2luZyIsImNvbW1hbmQiLCJvcHRpb25zIiwibG9nIiwibGV2ZWwiLCJMb2dMZXZlbCIsImluZm8iLCJkZWJ1ZyIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwiY2hpbGQiLCJleGVjIiwic3Rkb3V0Iiwic3RkZXJyIiwib24iLCJkYXRhIiwicHVzaCIsInRyaW0iLCJjb2RlIiwic2lsbHkiLCJqb2luIiwiY3JpdGljYWwiLCJJbnRlcm5hbEVycm9yIiwiZXJyIiwiSXNvbGF0aW9uVGllciIsIk1lbWJlcnNoaXBTdGF0dXMiLCJQcmluY2lwYWxLaW5kIiwiU2NvcGVLaW5kIiwiUGVybWlzc2lvbkNhdGVnb3J5IiwiUmVzb3VyY2VWaXNpYmlsaXR5IiwiU3RvcmFnZUtpbmQiLCJTdG9yYWdlQmluZGluZ0tpbmQiLCJJc29sYXRpb25UaWVyT3B0aW9ucyIsIk9iamVjdCIsInZhbHVlcyIsIk1lbWJlcnNoaXBTdGF0dXNPcHRpb25zIiwiUHJpbmNpcGFsS2luZE9wdGlvbnMiLCJTY29wZUtpbmRPcHRpb25zIiwiUGVybWlzc2lvbkNhdGVnb3J5T3B0aW9ucyIsIlJlc291cmNlVmlzaWJpbGl0eU9wdGlvbnMiLCJTdG9yYWdlS2luZE9wdGlvbnMiLCJTdG9yYWdlQmluZGluZ0tpbmRPcHRpb25zIiwiUkVMX1JFU1RSSUNUIiwidXBkYXRlIiwiQ2FzY2FkZSIsIk5PTkUiLCJkZWxldGUiLCJudWxsYWJsZSIsIlJFTF9OVUxMSUZZIiwiUkVMX0NBU0NBREVfREVQRU5ERU5UIiwiQ0FTQ0FERSIsIlJFTF9DQVNDQURFX0lOU0VSVF9VUERBVEUiLCJidWlsZEFyYW5nb0NvbnRleHQiLCJ0ZW5hbnRJZCIsInByaW5jaXBhbElkIiwicGVybWlzc2lvbktleSIsImFsbG93ZWRPcmdVbml0SWRzIiwiYWxsb3dlZFJlc291cmNlSWRzIiwiYnVpbGRRZHJhbnRGaWx0ZXIiLCJtdXN0Iiwia2V5IiwibWF0Y2giLCJ2YWx1ZSIsInNob3VsZCIsImFueSIsInNjb3BlS2V5Iiwic2NvcGVLaW5kIiwic2NvcGVJZCIsIm5vd0lzbyIsIkRhdGUiLCJhc0FycmF5Iiwic2FtZVRlbmFudCIsInJvd1RlbmFudCIsInJlbGF0aW9uSWQiLCJyZWxhdGlvbk1hdGNoIiwidGFyZ2V0IiwibG93ZXJTbHVnIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwiaXNUaW1lVmFsaWQiLCJhdCIsInN0YXJ0c0F0IiwiZXhwaXJlc0F0IiwiaW5zdGFudCIsImJ1aWxkQWNjZXNzQ29udGV4dCIsInBlcm1pc3Npb25zQnlTY29wZSIsImFsbG93ZWRPcmdVbml0SWRzQnlQZXJtaXNzaW9uIiwicGVybWlzc2lvbiIsInBlcm1pc3Npb25zIiwiT3JnVW5pdCIsInJlc291cmNlR3JhbnRzIiwiZ3JhbnRzIiwibWFwIiwiZ3JhbnQiLCJyZXNvdXJjZUlkIiwiQmFzZU1vZGVsU2VydmljZSIsIk1vZGVsU2VydmljZSIsImNvbnN0cnVjdG9yIiwiY2xhenoiLCJzdXBlciIsIm5ld01vZGVsIiwiYXNzaWduIiwiY3JlYXRlIiwiYXJncyIsInRoaXMiLCJyZXBvIiwiY3JlYXRlT25lIiwiZ2V0QnlJZCIsImlkIiwicmVhZCIsInVwZGF0ZU9uZSIsInBhdGNoIiwiZXhpc3RpbmciLCJkZWxldGVCeUlkIiwiZmluZE9uZUJ5IiwiZmluZE1hbnlCeSIsInNlbGVjdCIsIndoZXJlIiwiZXhlY3V0ZSIsImxpc3RBbGwiLCJjcnlwdG8iLCJyYW5kb21VVUlEIiwiQXV0aG9yaXphdGlvbk1vZGVsIiwiTW9kZWwiLCJUZW5hbnRNZW1iZXJzaGlwIiwiX19kZWNvcmF0ZSIsInBrIiwidHlwZSIsIlN0cmluZyIsInV1aWQiLCJwcm90b3R5cGUiLCJtYW55VG9PbmUiLCJUZW5hbnQiLCJ1bmRlZmluZWQiLCJyZXF1aXJlZCIsIlVzZXIiLCJ0eXBlT2YiLCJvcHRpb24iLCJjb2x1bW4iLCJjcmVhdGVkQXQiLCJ1cGRhdGVkQXQiLCJ0YWJsZSIsIm1vZGVsIiwidW5pcXVlIiwib25lVG9NYW55IiwiT3JnVW5pdE1lbWJlcnNoaXAiLCJPcmdVbml0Q2xvc3VyZSIsIk51bWJlciIsIlBlcm1pc3Npb24iLCJSb2xlUGVybWlzc2lvbiIsIlJvbGUiLCJSb2xlQXNzaWdubWVudCIsIlByaW5jaXBhbCIsIkJvb2xlYW4iLCJSZXNvdXJjZUdyYW50IiwiUHJvdGVjdGVkUmVzb3VyY2UiLCJJbmhlcml0YW5jZUJsb2NrIiwiU3RvcmFnZUJpbmRpbmciLCJUZW5hbnRQcm9maWxlIiwiT3JnVW5pdFByb2ZpbGUiLCJHcm91cE1lbWJlcnNoaXAiLCJHcm91cCIsIkVmZmVjdGl2ZVBlcm1pc3Npb24iLCJUZW5hbnRQcm9maWxlU2VydmljZSIsImNyZWF0ZVByb2ZpbGUiLCJwcm9maWxlS2V5IiwibWV0YWRhdGEiLCJ0ZW5hbnQiLCJsaXN0Rm9yVGVuYW50IiwiZmlsdGVyIiwicHJvZmlsZSIsImRlbGV0ZUZvclRlbmFudCIsInJvdyIsIk9yZ1VuaXRQcm9maWxlU2VydmljZSIsIm9yZ1VuaXRJZCIsIm9yZ1VuaXQiLCJsaXN0Rm9yT3JnVW5pdCIsIk9yZ1VuaXRDbG9zdXJlU2VydmljZSIsImxpc3RBbmNlc3RvcnMiLCJkZXNjZW5kYW50Iiwic29ydCIsImxlZnQiLCJyaWdodCIsImRlcHRoIiwibGlzdERlc2NlbmRhbnRzIiwiYW5jZXN0b3IiLCJpc0FuY2VzdG9yT2YiLCJhbmNlc3Rvck9yZ1VuaXRJZCIsImRlc2NlbmRhbnRPcmdVbml0SWQiLCJzb21lIiwiY3JlYXRlU2VsZkxpbmsiLCJpbnNlcnRBbmNlc3RvckxpbmtzRm9yTmV3Q2hpbGQiLCJwYXJlbnRPcmdVbml0SWQiLCJjaGlsZE9yZ1VuaXRJZCIsImFuY2VzdG9yTGlua3MiLCJsaW5rIiwiZGVsZXRlTGlua3NGb3JTdWJ0cmVlIiwic3VidHJlZSIsImRlc2NlbmRhbnRJZHMiLCJTZXQiLCJhbmNlc3RvcklkcyIsInJvd3MiLCJoYXMiLCJJbmhlcml0YW5jZUJsb2NrU2VydmljZSIsImJsb2NrQ2F0ZWdvcnkiLCJwZXJtaXNzaW9uQ2F0ZWdvcnkiLCJibG9ja2VkRnJvbUFuY2VzdG9ySWQiLCJyZWFzb24iLCJibG9ja2VkRnJvbUFuY2VzdG9yIiwidW5ibG9ja0NhdGVnb3J5IiwiYmxvY2tJZCIsImJsb2NrIiwiY2F0ZWdvcnlCbG9ja2VkRm9yQW5jZXN0b3IiLCJjYXRlZ29yeSIsIlRlbmFudFNlcnZpY2UiLCJjcmVhdGVUZW5hbnQiLCJpbnB1dCIsInNsdWciLCJuYW1lIiwiaXNvbGF0aW9uVGllciIsIlBvb2xlZCIsImdldEJ5U2x1ZyIsInJlbmFtZVRlbmFudCIsImNoYW5nZVNsdWciLCJzZXRJc29sYXRpb25UaWVyIiwiZGVsZXRlVGVuYW50Q29udHJvbGxlZCIsImRlbGV0ZVJvd3NCeUlkIiwic2VydmljZSIsIk9yZ1VuaXRTZXJ2aWNlIiwib3JnVW5pdFBhdGgiLCJwYXJlbnRQYXRoIiwic2VnbWVudCIsImNyZWF0ZVByb2ZpbGVJZk5lZWRlZCIsInByb2ZpbGVNZXRhZGF0YSIsImNyZWF0ZVJvb3QiLCJwYXRoIiwiY3JlYXRlQ2hpbGQiLCJwYXJlbnQiLCJjbG9zdXJlU2VydmljZSIsImxpc3RDaGlsZHJlbiIsImxpc3RUZW5hbnRPcmdVbml0cyIsImxpc3REZXNjZW5kYW50T3JnVW5pdHMiLCJpbmNsdWRlU2VsZiIsImRlc2NlbmRhbnRzIiwiaWRzIiwiYWRkIiwibGlzdEFuY2VzdG9yT3JnVW5pdHMiLCJhbmNlc3RvcnMiLCJyZW5hbWVPcmdVbml0IiwiaW5jbHVkZXMiLCJtb3ZlT3JnVW5pdCIsIm5ld1BhcmVudE9yZ1VuaXRJZCIsIm5ld1BhcmVudCIsInVwZGF0ZWQiLCJyZWJ1aWxkVGVuYW50Q2xvc3VyZSIsImV4aXN0aW5nTGlua3MiLCJvcmdVbml0cyIsImxlZnREZXB0aCIsInNwbGl0IiwibGVuZ3RoIiwicmlnaHREZXB0aCIsImRlbGV0ZU9yZ1VuaXRUcmVlIiwidHJhbnNhY3Rpb25hbCIsIlVzZXJTZXJ2aWNlIiwiY3JlYXRlVXNlciIsImVtYWlsIiwicGhvbmUiLCJkaXNwbGF5TmFtZSIsImdldEJ5RW1haWwiLCJmaW5kIiwidXNlciIsInVwZGF0ZURpc3BsYXlOYW1lIiwidXNlcklkIiwidXBkYXRlRW1haWwiLCJ1cGRhdGVQaG9uZSIsIlByaW5jaXBhbFNlcnZpY2UiLCJjcmVhdGVQcmluY2lwYWwiLCJraW5kIiwic3ViamVjdElkIiwiZ2V0Rm9yU3ViamVjdCIsInByaW5jaXBhbCIsImdldE9yQ3JlYXRlRm9yU3ViamVjdCIsImdldFVzZXJQcmluY2lwYWwiLCJnZXRHcm91cFByaW5jaXBhbCIsImdyb3VwSWQiLCJUZW5hbnRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb1RlbmFudCIsInN0YXR1cyIsIkFjdGl2ZSIsInNldFN0YXR1cyIsIm1lbWJlcnNoaXBJZCIsImxpc3RVc2VyVGVuYW50cyIsIm1lbWJlcnNoaXAiLCJsaXN0VGVuYW50VXNlcnMiLCJyZW1vdmVVc2VyRnJvbVRlbmFudCIsIk9yZ1VuaXRNZW1iZXJzaGlwU2VydmljZSIsImFkZFVzZXJUb09yZ1VuaXQiLCJsaXN0VXNlck9yZ1VuaXRzIiwibGlzdE9yZ1VuaXRVc2VycyIsInJlbW92ZVVzZXJGcm9tT3JnVW5pdCIsIkdyb3VwU2VydmljZSIsImNyZWF0ZUdyb3VwIiwicmVuYW1lR3JvdXAiLCJtb3ZlR3JvdXBUb09yZ1VuaXQiLCJsaXN0VGVuYW50R3JvdXBzIiwiZ3JvdXAiLCJHcm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwiYWRkUHJpbmNpcGFsVG9Hcm91cCIsImxpc3RHcm91cE1lbWJlcnMiLCJsaXN0UHJpbmNpcGFsR3JvdXBzIiwicmVtb3ZlUHJpbmNpcGFsRnJvbUdyb3VwIiwicmVzb2x2ZUdyb3VwUHJpbmNpcGFsSWRzRm9yUHJpbmNpcGFsIiwicHJpbmNpcGFsU2VydmljZSIsIm1lbWJlcnNoaXBzIiwicHJpbmNpcGFscyIsImFsbCIsIlBlcm1pc3Npb25TZXJ2aWNlIiwiY3JlYXRlUGVybWlzc2lvbiIsImRlc2NyaXB0aW9uIiwiZ2V0QnlLZXkiLCJsaXN0QnlDYXRlZ29yeSIsInVwZGF0ZURlc2NyaXB0aW9uIiwicGVybWlzc2lvbklkIiwiUm9sZVNlcnZpY2UiLCJjcmVhdGVSb2xlIiwiZ2V0U3lzdGVtUm9sZUJ5S2V5Iiwicm9sZSIsImNhbmRpZGF0ZSIsIkVycm9yIiwiZ2V0VGVuYW50Um9sZUJ5S2V5IiwicmVuYW1lUm9sZSIsInJvbGVJZCIsInVwZGF0ZVJvbGVNZXRhZGF0YSIsImxpc3RUZW5hbnRSb2xlcyIsImluY2x1ZGVTeXN0ZW0iLCJSb2xlUGVybWlzc2lvblNlcnZpY2UiLCJhZGRQZXJtaXNzaW9uVG9Sb2xlIiwiYWRkUGVybWlzc2lvbktleVRvUm9sZSIsInJlbW92ZVBlcm1pc3Npb25Gcm9tUm9sZSIsInJvbGVQZXJtaXNzaW9uSWQiLCJsaXN0Um9sZVBlcm1pc3Npb25zIiwicm9sZVBlcm1pc3Npb24iLCJsaXN0UGVybWlzc2lvblJvbGVzIiwicmVwbGFjZVJvbGVQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25JZHMiLCJjcmVhdGVSb2xlV2l0aFBlcm1pc3Npb25zIiwicGVybWlzc2lvbktleXMiLCJSb2xlQXNzaWdubWVudFNlcnZpY2UiLCJhc3NpZ25Sb2xlIiwiaW5oZXJpdERvd24iLCJjb25kaXRpb25zIiwicmV2b2tlQXNzaWdubWVudCIsImFzc2lnbm1lbnRJZCIsImxpc3RQcmluY2lwYWxBc3NpZ25tZW50cyIsImFzc2lnbm1lbnQiLCJsaXN0Um9sZUFzc2lnbm1lbnRzIiwibGlzdFRlbmFudEFzc2lnbm1lbnRzIiwidXBkYXRlQXNzaWdubWVudFdpbmRvdyIsIkVmZmVjdGl2ZVBlcm1pc3Npb25TZXJ2aWNlIiwibGlzdEZvclByaW5jaXBhbCIsImxpc3RGb3JTY29wZSIsImhhc1Blcm1pc3Npb24iLCJkZWxldGVGb3JQcmluY2lwYWwiLCJyZWJ1aWxkRm9yUHJpbmNpcGFsIiwicm9sZUFzc2lnbm1lbnRTZXJ2aWNlIiwicm9sZVBlcm1pc3Npb25TZXJ2aWNlIiwicGVybWlzc2lvblNlcnZpY2UiLCJncm91cE1lbWJlcnNoaXBTZXJ2aWNlIiwib3JnVW5pdENsb3N1cmVTZXJ2aWNlIiwiaW5oZXJpdGFuY2VCbG9ja1NlcnZpY2UiLCJtYXRlcmlhbGl6ZWQiLCJzb3VyY2VBc3NpZ25tZW50cyIsImdyb3VwTWVtYmVyc2hpcHMiLCJncm91cEFzc2lnbm1lbnRzIiwiZ3JvdXBQcmluY2lwYWwiLCJmbGF0IiwiYXNzaWdubWVudHMiLCJyb2xlUGVybWlzc2lvbnMiLCJzY29wZXMiLCJSZXNvdXJjZSIsInNjb3BlZCIsInNvdXJjZUtpbmQiLCJzb3VyY2VJZCIsImNyZWF0ZWQiLCJyZWJ1aWxkRm9yVGVuYW50IiwiUHJvdGVjdGVkUmVzb3VyY2VTZXJ2aWNlIiwicmVnaXN0ZXJSZXNvdXJjZSIsInJlc291cmNlVHlwZSIsInZpc2liaWxpdHkiLCJvd25lciIsIm93bmVyUHJpbmNpcGFsSWQiLCJzZW5zaXRpdml0eSIsImdldEJ5RG9tYWluUmVzb3VyY2UiLCJyZXNvdXJjZSIsIm1vdmVSZXNvdXJjZVRvT3JnVW5pdCIsInByb3RlY3RlZFJlc291cmNlSWQiLCJzZXRWaXNpYmlsaXR5IiwidHJhbnNmZXJPd25lcnNoaXAiLCJsaXN0T3JnVW5pdFJlc291cmNlcyIsImxpc3RUZW5hbnRSZXNvdXJjZXMiLCJSZXNvdXJjZUdyYW50U2VydmljZSIsImdyYW50UmVzb3VyY2UiLCJjcmVhdGVkQnkiLCJjcmVhdGVkQnlQcmluY2lwYWxJZCIsInJldm9rZUdyYW50IiwiZ3JhbnRJZCIsImxpc3RSZXNvdXJjZUdyYW50cyIsImxpc3RQcmluY2lwYWxHcmFudHMiLCJoYXNHcmFudCIsImRlbGV0ZUFsbEZvclJlc291cmNlIiwiUmVzb3VyY2VMaWZlY3ljbGVTZXJ2aWNlIiwidW5yZWdpc3RlclJlc291cmNlIiwicmVzb2x2ZVJlc291cmNlU2NvcGUiLCJTdG9yYWdlQmluZGluZ1NlcnZpY2UiLCJjcmVhdGVCaW5kaW5nIiwic3RvcmFnZUtpbmQiLCJiaW5kaW5nS2luZCIsImJpbmRpbmdLZXkiLCJyZWdpb24iLCJjb25maWciLCJsaXN0VGVuYW50QmluZGluZ3MiLCJiaW5kaW5nIiwiZ2V0QmluZGluZyIsInNldEJpbmRpbmdDb25maWciLCJiaW5kaW5nSWQiLCJwcm9tb3RlVG9EZWRpY2F0ZWQiLCJEZWRpY2F0ZWQiLCJzZXRTaGFyZWQiLCJTaGFyZWQiLCJCb290c3RyYXBTZXJ2aWNlIiwidGVuYW50U2VydmljZSIsInRlbmFudFByb2ZpbGVTZXJ2aWNlIiwib3JnVW5pdFNlcnZpY2UiLCJvcmdVbml0UHJvZmlsZVNlcnZpY2UiLCJ1c2VyU2VydmljZSIsIm1lbWJlcnNoaXBTZXJ2aWNlIiwicm9sZVNlcnZpY2UiLCJlZmZlY3RpdmVQZXJtaXNzaW9uU2VydmljZSIsImJvb3RzdHJhcFRlbmFudEZyb21UZW1wbGF0ZSIsInRlbXBsYXRlIiwiY3JlYXRlT3JnVHJlZSIsInBhcmVudElkIiwiY2hpbGRyZW4iLCJyb290T3JnVW5pdCIsIm93bmVyVXNlciIsIm93bmVyUHJpbmNpcGFsIiwicm9sZXMiLCJjcmVhdGVkUm9sZSIsIm93bmVyUm9sZSIsIm93bmVyUm9sZUtleSIsInJvb3RPcmdVbml0SWQiLCJvd25lclVzZXJJZCIsIlN5c3RlbU1hbmFnZW1lbnRTZXJ2aWNlIiwib3JnTWVtYmVyc2hpcFNlcnZpY2UiLCJvbmJvYXJkVXNlclRvVGVuYW50QW5kT3JnVW5pdCIsInJvbGVLZXkiLCJjaGFuZ2VVc2VyT3JnUm9sZSIsImN1cnJlbnRBc3NpZ25tZW50cyIsInN1c3BlbmRVc2VySW5UZW5hbnQiLCJ0ZW5hbnRNZW1iZXJzaGlwSWQiLCJTdXNwZW5kZWQiLCJyZWFjdGl2YXRlVXNlckluVGVuYW50IiwiQXV0aHpTZXJ2aWNlIiwiZGF0YVNvdXJjZXMiLCJjYW5BY2Nlc3MiLCJsaXN0RWZmZWN0aXZlUGVybWlzc2lvbnNGb3JTY29wZSIsInJlc291cmNlUHJvdGVjdGVkSWQiLCJsb2FkUmVzb3VyY2UiLCJQcml2YXRlIiwiUmVzb3VyY2VBY2wiLCJPcmdTdWJ0cmVlIiwiZWZmZWN0aXZlUGVybWlzc2lvbnMiLCJyZXF1aXJlQWNjZXNzIiwiQXV0aG9yaXphdGlvbkVycm9yIiwibGlzdEVmZmVjdGl2ZVBlcm1pc3Npb25zIiwiYWNjZXNzIiwiRkVBVFVSRV9GTEFHX0VOVl9ST09UIiwiRkVBVFVSRV9GTEFHX0VOVl9QUkVGSVgiLCJGRUFUVVJFX0ZMQUdfTU9ERUxfS0VZIiwiRkVBVFVSRV9GTEFHX0FVVEhfS0VZIiwiRkVBVFVSRV9GTEFHX0JMT0NLX0tFWSIsIkZFQVRVUkVfRkxBR19SRU5ERVJfS0VZIiwiRkVBVFVSRV9GTEFHX0hJREVfS0VZIiwibm9ybWFsaXplRmVhdHVyZU5hbWUiLCJ0cmltbWVkIiwidGVzdCIsImNhbWVsaXplZCIsImhlYWQiLCJ0YWlsIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJzbGljZSIsInBhcnNlUnVudGltZVZhbHVlIiwic3RhcnRzV2l0aCIsImVuZHNXaXRoIiwiSlNPTiIsInBhcnNlIiwibm9ybWFsaXplT2JqZWN0S2V5Iiwibm9ybWFsaXplZCIsIm5vcm1hbGl6ZUZlYXR1cmVDb25maWciLCJBcnJheSIsImlzQXJyYXkiLCJyZXN1bHQiLCJlbnRyaWVzIiwiZm9yRWFjaCIsInJhdyIsIm5vcm1hbGl6ZWRLZXkiLCJub3JtYWxpemVGZWF0dXJlUmVnaXN0cnkiLCJyZWR1Y2UiLCJhY2MiLCJub3JtYWxpemVkVmFsdWUiLCJpc0ZlYXR1cmVGbGFnRW5hYmxlZCIsImlzRmVhdHVyZUZsYWdFbmFibGVkQnlOYW1lIiwicmVnaXN0cnkiLCJmZWF0dXJlTmFtZSIsIm5vcm1hbGl6ZUZlYXR1cmVSdWxlIiwiZmVhdHVyZXMiLCJpc0ZlYXR1cmVSdWxlU2F0aXNmaWVkIiwicnVsZSIsImVuYWJsZWQiLCJmZWF0dXJlIiwiaXNGZWF0dXJlUnVsZUJsb2NrZWQiLCJyZWFkTWV0YWRhdGEiLCJNZXRhZGF0YSIsImdldCIsIm5vcm1hbGl6ZUZlYXR1cmVTdWJqZWN0VHlwZSIsInN1YmplY3RUeXBlIiwibm9ybWFsaXplRmVhdHVyZVN1YmplY3RLZXkiLCJzdWJqZWN0S2V5IiwiRmVhdHVyZUZsYWdFbnZpcm9ubWVudCIsIkxvZ2dlZEVudmlyb25tZW50IiwiYWNjdW11bGF0ZSIsImxvYWRGZWF0dXJlRmxhZ3NGcm9tRW52aXJvbm1lbnQiLCJzb3VyY2UiLCJmZWF0dXJlRmxhZyIsInJlc29sdmVGZWF0dXJlRmxhZ0Zyb21FbnZpcm9ubWVudCIsImhhc0ZlYXR1cmVGbGFnSW5FbnZpcm9ubWVudCIsIkZlYXR1cmVGbGFnIiwiQmFzZU1vZGVsIiwiRmVhdHVyZUZsYWdBY2Nlc3MiLCJGZWF0dXJlRmxhZ1JlYWRlciIsInJlYWRPbmUiLCJFbnZpcm9ubWVGbGFnUmVhZGVyIiwiZW52aXJvbm1lbnQiLCJGZWF0dXJlRmxhZ1NlcnZpY2UiLCJyZWFkZXIiLCJjYWNoZWRSZWdpc3RyeSIsImluaXRpYWxpemUiLCJyZXBvc2l0b3J5IiwiX3JlcG9zaXRvcnkiLCJyZWFkZXJDb25maWciLCJyZWZyZXNoQ2FjaGVkUmVnaXN0cnkiLCJlZmZlY3RpdmVDb25maWciLCJjbGllbnQiLCJjbG9uZVJlZ2lzdHJ5IiwiZW52UmVnaXN0cnkiLCJwZXJzaXN0ZWQiLCJmbGFnIiwic2V0Q2FjaGVkRmxhZyIsImdldEFjY2Vzc1JlcG9zaXRvcnkiLCJhY2Nlc3NSZXBvc2l0b3J5IiwiUmVwb3NpdG9yeSIsImZvck1vZGVsIiwiYXNzZXJ0SW5pdGlhbGl6ZWQiLCJub3JtYWxpemVGZWF0dXJlQWNjZXNzSW5wdXQiLCJmZWF0dXJlS2V5IiwiYnVpbGRBY2Nlc3NDb25kaXRpb24iLCJxdWVyeSIsImNvbmRpdGlvbiIsIkNvbmRpdGlvbiIsImF0dHIiLCJlcSIsImFuZCIsImZlYXR1cmVLZXlzIiwiaW4iLCJyZWFkQWxsIiwia2V5cyIsImxpc3RFbmFibGVkIiwiZ3JhbnRGZWF0dXJlQWNjZXNzIiwiZmluZEZlYXR1cmVBY2Nlc3MiLCJjYXRjaCIsInJldm9rZUZlYXR1cmVBY2Nlc3MiLCJyZXN1bHRzIiwiTm90Rm91bmRFcnJvciIsImxpc3RGZWF0dXJlQWNjZXNzIiwicmVzb2x2ZUZlYXR1cmVGbGFnc0ZvclN1YmplY3QiLCJzdWJqZWN0IiwiaXRlbSIsImVuYWJsZWRGbGFncyIsImlzRW5hYmxlZEZvclN1YmplY3QiLCJpc0VuYWJsZWQiLCJyZXNvbHZlRmVhdHVyZUZsYWdzIiwic3luY0Zyb21FbnZpcm9ubWVudCIsIl9pZ25vcmVkRW5hYmxlZCIsInJlc3RDb25maWciLCJzY29wZSIsImZlYXR1cmVNZXRhZGF0YUtleSIsInByb3BlcnR5S2V5IiwidG9TdHJpbmciLCJhcHBseUZlYXR1cmVEZWNvcmF0b3IiLCJmZWF0dXJlRGVjb3JhdG9yIiwiZGVzY3JpcHRvciIsInNjb3BlZEtleSIsIm1ldGhvZE1ldGFkYXRhIiwicHJvcE1ldGFkYXRhIiwiZmVhdHVyZUZsYWdzIiwiZmVhdHVyZUF1dGgiLCJibG9ja0ZlYXR1cmVPcGVyYXRpb25zIiwicmVuZGVySWZGZWF0dXJlIiwiaGlkZU9uRmVhdHVyZSIsImdldEZlYXR1cmVHYXRlTWV0YWRhdGEiLCJzaG91bGRFeHBvc2VGb3JGZWF0dXJlcyIsImVuYWJsZWRGZWF0dXJlcyIsInNob3VsZEhpZGVGb3JGZWF0dXJlcyIsIlZFUlNJT04iLCJDT01NSVQiLCJGVUxMX1ZFUlNJT04iLCJQQUNLQUdFX05BTUUiXSwibWFwcGluZ3MiOiI7Ozs7O0lBU09BLGVBQWVDLGdCQUNwQkMsU0FDQUMsU0FDQUMsS0FDQUMsUUFBa0JDLFFBQUFBLFNBQVNDO1FBRTNCSCxJQUFJSSxNQUFNLGNBQWNOO1FBRXhCLE9BQU8sSUFBSU8sUUFBUSxDQUFDQyxTQUFTQztZQUMzQixNQUFNQyxRQUFRQyxjQUFBQSxLQUFLWCxTQUFTQztZQUU1QixNQUFNVyxTQUFtQjtZQUN6QixNQUFNQyxTQUFtQjtZQUV6QkgsTUFBTUUsUUFBUUUsR0FBRyxRQUFTQztnQkFDeEJILE9BQU9JLEtBQUtEO2dCQUNaYixJQUFJQyxPQUFPWSxLQUFLRTs7WUFHbEJQLE1BQU1HLFFBQVFDLEdBQUcsUUFBU0M7Z0JBQ3hCRixPQUFPRyxLQUFLRDtnQkFDWmIsSUFBSUksTUFBTVMsS0FBS0U7O1lBR2pCUCxNQUFNSSxHQUFHLFNBQVVJO2dCQUNqQixJQUFJQSxTQUFTLEdBQUc7b0JBQ2RoQixJQUFJaUIsTUFBTTtvQkFDVlgsUUFBUTt3QkFBRUksUUFBUUEsT0FBT1EsS0FBSzt3QkFBT1AsUUFBUUEsT0FBT08sS0FBSzs7QUFDM0QsdUJBQU87b0JBQ0xsQixJQUFJbUIsU0FDRiw0QkFBNEJILFdBQVdMLE9BQU9PLEtBQUs7b0JBRXJEWCxPQUNFLElBQUlhLGFBQUFBLGNBQ0YsNEJBQTRCSixTQUFTTCxPQUFPTyxLQUFLO0FBR3ZEOztZQUdGVixNQUFNSSxH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