sonamu 0.13.6 → 0.13.8

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.
@@ -194,5 +194,10 @@ export declare class Entity {
194
194
  * LoaderQuery의 fromIds 타입으로 사용됩니다.
195
195
  */
196
196
  getPkArrayType(): string;
197
+ /**
198
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
199
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
200
+ */
201
+ getColumnArrayType(column: string): string;
197
202
  }
198
203
  //# sourceMappingURL=entity.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,7 @@ import { init_runtime_value, isStringValue } from "../utils/runtime-value.js";
3
3
  import { assertDefined, init_utils, nonNullable } from "../utils/utils.js";
4
4
  import { formatCode, init_code_formatting } from "../code-formatting/index.js";
5
5
  import { exists, init_fs_utils } from "../utils/fs-utils.js";
6
- import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isInternalSubsetField, isManyToManyRelationProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
6
+ import { getEnumDefValues, getSubsetFields, init_types, isBelongsToOneRelationProp, isEnumProp, isHasManyRelationProp, isIntegerSingleProp, isInternalSubsetField, isManyToManyRelationProp, isNumberSingleProp, isOneToOneRelationProp, isRelationProp, isVirtualCodeProp, isVirtualProp, normalizeSubsetField } from "../types/types.js";
7
7
  import { Sonamu, init_sonamu } from "../api/sonamu.js";
8
8
  import { importMembers, init_esm_utils } from "../utils/esm-utils.js";
9
9
  import { init_path_utils, runtimePath } from "../utils/path-utils.js";
@@ -188,8 +188,8 @@ var init_entity = __esmMin((() => {
188
188
  const generateLoaderCode = (nestedLoaders) => {
189
189
  const loaderLines = [];
190
190
  for (const loader of nestedLoaders) {
191
- const { toTable, toCol, through, fromTable } = loader.manyJoin;
192
- const fromIdsType = EntityManager.getByTable(fromTable).getPkArrayType();
191
+ const { toTable, toCol, through, fromTable, fromCol } = loader.manyJoin;
192
+ const fromIdsType = EntityManager.getByTable(fromTable).getColumnArrayType(fromCol);
193
193
  loaderLines.push("{", `as: "${loader.as}",`, `refId: "${loader.manyJoin.idField}",`, `qb: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>, fromIds: number[] | string[]) => {`);
194
194
  if (through === void 0) {
195
195
  loaderLines.push("return qbWrapper", `.from("${toTable}")`);
@@ -806,9 +806,19 @@ var init_entity = __esmMin((() => {
806
806
  getPkArrayType() {
807
807
  return this.getPkType() === "integer" ? "number[]" : "string[]";
808
808
  }
809
+ /**
810
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
811
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
812
+ */
813
+ getColumnArrayType(column) {
814
+ if (column === "id") return this.getPkArrayType();
815
+ const prop = this.propsDict[column] ?? this.props.find((p) => (isBelongsToOneRelationProp(p) || isOneToOneRelationProp(p) && p.hasJoinColumn) && `${p.name}_id` === column);
816
+ if (isRelationProp(prop)) return EntityManager.get(prop.with).getPkArrayType();
817
+ return isIntegerSingleProp(prop) || isNumberSingleProp(prop) ? "number[]" : "string[]";
818
+ }
809
819
  };
810
820
  }));
811
821
  init_entity();
812
822
  export { Entity, init_entity };
813
823
 
814
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1ZpcnR1YWxDb2RlUHJvcCxcbiAgaXNWaXJ0dWFsUHJvcCxcbiAgbm9ybWFsaXplU3Vic2V0RmllbGQsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBDb25lLFxuICB0eXBlIEVudGl0eUN1c3RvbSxcbiAgdHlwZSBFbnRpdHlJbmRleCxcbiAgdHlwZSBFbnRpdHlKc29uLFxuICB0eXBlIEVudGl0eVByb3AsXG4gIHR5cGUgRW50aXR5UHJvcE5vZGUsXG4gIHR5cGUgRW50aXR5U3Vic2V0Um93LFxuICB0eXBlIFJlbGF0aW9uUHJvcCxcbiAgdHlwZSBTdWJzZXRGaWVsZCxcbiAgdHlwZSBTdWJzZXRRdWVyeSxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgeyBpbXBvcnRNZW1iZXJzIH0gZnJvbSBcIi4uL3V0aWxzL2VzbS11dGlsc1wiO1xuaW1wb3J0IHsgZXhpc3RzIH0gZnJvbSBcIi4uL3V0aWxzL2ZzLXV0aWxzXCI7XG5pbXBvcnQgeyBydW50aW1lUGF0aCB9IGZyb20gXCIuLi91dGlscy9wYXRoLXV0aWxzXCI7XG5pbXBvcnQgeyBpc1N0cmluZ1ZhbHVlIH0gZnJvbSBcIi4uL3V0aWxzL3J1bnRpbWUtdmFsdWVcIjtcbmltcG9ydCB7IGFzc2VydERlZmluZWQsIG5vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5cbnR5cGUgTmVzdGVkU2VsZWN0ID0geyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBOZXN0ZWRTZWxlY3QgfTtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi9lbnRpdHktbWFuYWdlclwiO1xuXG5leHBvcnQgY2xhc3MgRW50aXR5IHtcbiAgaWQ6IHN0cmluZztcbiAgcGFyZW50SWQ/OiBzdHJpbmc7XG4gIHRhYmxlOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGN1c3RvbT86IEVudGl0eUN1c3RvbTtcbiAgY29uZT86IENvbmU7XG4gIG5hbWVzOiB7XG4gICAgcGFyZW50RnM6IHN0cmluZztcbiAgICBmczogc3RyaW5nO1xuICAgIG1vZHVsZTogc3RyaW5nO1xuICB9O1xuICBwcm9wczogRW50aXR5UHJvcFtdO1xuICBwcm9wc0RpY3Q6IHtcbiAgICBba2V5OiBzdHJpbmddOiBFbnRpdHlQcm9wO1xuICB9O1xuICByZWxhdGlvbnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBSZWxhdGlvblByb3A7XG4gIH07XG4gIGluZGV4ZXM6IEVudGl0eUluZGV4W107XG4gIHN1YnNldHM6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgc3Vic2V0c0ludGVybmFsOiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nW107XG4gIH07XG4gIHR5cGVzOiB7XG4gICAgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueTtcbiAgfSA9IHt9O1xuICBlbnVtczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHouWm9kRW51bTxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pj47XG4gIH0gPSB7fTtcbiAgZW51bUxhYmVsczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IHtcbiAgICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgICB9O1xuICB9ID0ge307XG4gIGVudW1Db25lczoge1xuICAgIFtlbnVtSWQ6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcbiAgc3Vic2V0Q29uZXM6IHtcbiAgICBbc3Vic2V0S2V5OiBzdHJpbmddOiBDb25lO1xuICB9ID0ge307XG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIGlkLFxuICAgIHBhcmVudElkLFxuICAgIHRhYmxlLFxuICAgIHRpdGxlLFxuICAgIGN1c3RvbSxcbiAgICBjb25lLFxuICAgIHByb3BzLFxuICAgIGluZGV4ZXMsXG4gICAgc3Vic2V0cyxcbiAgICBlbnVtcyxcbiAgfTogRW50aXR5SnNvbikge1xuICAgIC8vIGlkXG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucGFyZW50SWQgPSBwYXJlbnRJZDtcbiAgICB0aGlzLnRpdGxlID0gdGl0bGUgPz8gdGhpcy5pZDtcbiAgICB0aGlzLnRhYmxlID0gdGFibGUgPz8gaW5mbGVjdGlvbi51bmRlcnNjb3JlKGluZmxlY3Rpb24ucGx1cmFsaXplKGlkKSk7XG4gICAgdGhpcy5jdXN0b20gPSBjdXN0b207XG4gICAgdGhpcy5jb25lID0gY29uZTtcblxuICAgIC8vIHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICB0aGlzLnByb3BzID0gcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChpc0VudW1Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKHByb3AuaWQuaW5jbHVkZXMoXCIkTW9kZWxcIikpIHtcbiAgICAgICAgICAgIHByb3AuaWQgPSBwcm9wLmlkLnJlcGxhY2UoXCIkTW9kZWxcIiwgaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcDtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICAgIHJldHVybiBbcHJvcC5uYW1lLCBwcm9wXTtcbiAgICAgICAgfSksXG4gICAgICApO1xuXG4gICAgICAvLyByZWxhdGlvbnNcbiAgICAgIHRoaXMucmVsYXRpb25zID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBwcm9wcy5maWx0ZXIoKHByb3ApID0+IGlzUmVsYXRpb25Qcm9wKHByb3ApKS5tYXAoKHByb3ApID0+IFtwcm9wLm5hbWUsIHByb3BdKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMgPSBbXTtcbiAgICAgIHRoaXMucHJvcHNEaWN0ID0ge307XG4gICAgICB0aGlzLnJlbGF0aW9ucyA9IHt9O1xuICAgIH1cblxuICAgIC8vIGluZGV4ZXNcbiAgICB0aGlzLmluZGV4ZXMgPSBpbmRleGVzID8/IFtdO1xuXG4gICAgLy8gc3Vic2V0czogU3Vic2V0RGVm7JeQ7IScIFN1YnNldEZpZWxkW13rpbwg7LaU7Lac7ZWY7JesIHN1YnNldHMo7J2867CYKeyZgCBzdWJzZXRzSW50ZXJuYWwoaW50ZXJuYWwp66GcIOu2hOumrFxuICAgIHRoaXMuc3Vic2V0cyA9IHt9O1xuICAgIHRoaXMuc3Vic2V0c0ludGVybmFsID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBzdWJzZXREZWZdIG9mIE9iamVjdC5lbnRyaWVzKHN1YnNldHMgPz8ge30pKSB7XG4gICAgICBjb25zdCBmaWVsZHMgPSBnZXRTdWJzZXRGaWVsZHMoc3Vic2V0RGVmKTtcbiAgICAgIHRoaXMuc3Vic2V0c1trZXldID0gZmllbGRzLmZpbHRlcigoZikgPT4gIWlzSW50ZXJuYWxTdWJzZXRGaWVsZChmKSkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcbiAgICAgIHRoaXMuc3Vic2V0c0ludGVybmFsW2tleV0gPSBmaWVsZHMuZmlsdGVyKGlzSW50ZXJuYWxTdWJzZXRGaWVsZCkubWFwKG5vcm1hbGl6ZVN1YnNldEZpZWxkKTtcblxuICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdWJzZXREZWYpICYmIFwiY29uZVwiIGluIHN1YnNldERlZiAmJiBzdWJzZXREZWYuY29uZSkge1xuICAgICAgICB0aGlzLnN1YnNldENvbmVzW2tleV0gPSBzdWJzZXREZWYuY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtczogRW51bURlZuyXkOyEnCB2YWx1ZXPsmYAgY29uZeulvCDstpTstpztlZjsl6wg7LKY66asXG4gICAgdGhpcy5lbnVtTGFiZWxzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoZW51bXMgPz8ge30pLm1hcCgoW2tleSwgZW51bURlZl0pID0+IHtcbiAgICAgICAgLy8gY29uZSDstpTstpxcbiAgICAgICAgaWYgKFwidmFsdWVzXCIgaW4gZW51bURlZiAmJiBcImNvbmVcIiBpbiBlbnVtRGVmICYmIGVudW1EZWYuY29uZSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHRoaXMuZW51bUNvbmVzW2tleV0gPSBlbnVtRGVmLmNvbmUgYXMgQ29uZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2tleSwgZ2V0RW51bURlZlZhbHVlcyhlbnVtRGVmKV07XG4gICAgICB9KSxcbiAgICApO1xuICAgIHRoaXMuZW51bXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpLm1hcCgoW2tleSwgZW51bUxhYmVsXSkgPT4ge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgcmV0dXJuIFtrZXksIHouZW51bShPYmplY3Qua2V5cyhlbnVtTGFiZWwpKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gbmFtZXNcbiAgICB0aGlzLm5hbWVzID0ge1xuICAgICAgcGFyZW50RnM6IGluZmxlY3Rpb24uZGFzaGVyaXplKGluZmxlY3Rpb24udW5kZXJzY29yZShwYXJlbnRJZCA/PyBpZCkpLnRvTG93ZXJDYXNlKCksXG4gICAgICBmczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIG1vZHVsZTogaWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsv7zrpqzsmqkg7ISc67iM7IWLIO2VhOuTnOulvCDrsJjtmZjtlanri4jri6QgKHN1YnNldHMgKyBzdWJzZXRzSW50ZXJuYWwg7ZWp7LmoKVxuICAgKi9cbiAgZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIFsuLi4odGhpcy5zdWJzZXRzW3N1YnNldEtleV0gPz8gW10pLCAuLi4odGhpcy5zdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXSldO1xuICB9XG5cbiAgLyoqXG4gICAqIOyjvOyWtOynhCDsnbTrpoQoc3Vic2V0S2V5KeydmCBzdWJzZXTsnYQg7Iuk7KCc66GcIOqwgOyguOyYpOuKlCBQdXJpIOy9lOuTnCDqtaztmITssrQgc3RyaW5n7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFB1cmlTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3Vic2V0ID0gdGhpcy5nZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXkpO1xuICAgIGNvbnN0IHN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcblxuICAgIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgLy8gZnJvbVxuICAgIGxpbmVzLnB1c2goYHJldHVybiBxYldyYXBwZXJgKTtcbiAgICBsaW5lcy5wdXNoKGAuZnJvbShcIiR7dGhpcy50YWJsZX1cIilgKTtcblxuICAgIC8vIGpvaW5cbiAgICBmb3IgKGNvbnN0IGpvaW4gb2Ygc3Vic2V0UXVlcnkuam9pbnMpIHtcbiAgICAgIC8vIGpvaW4g66mU7ISc65OcIOqysOyglTogaW5uZXIg4oaSIGpvaW4sIG91dGVyIOKGkiBsZWZ0Sm9pblxuICAgICAgLy8gRksgbnVsbGFibGUg7Jes67aA64qUIGxlZnRKb2luIO2DgOyehSDsi5zqt7jri4jsspjsl5DshJwg7J6Q64+Z7Jy866GcIO2MkOuLqOuQqFxuICAgICAgY29uc3Qgam9pbk1ldGhvZCA9IGpvaW4uam9pbiA9PT0gXCJpbm5lclwiID8gXCJqb2luXCIgOiBcImxlZnRKb2luXCI7XG5cbiAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIHJhdyDsgqzsmqlcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBxYldyYXBwZXIua25leC5yYXcoXFxgJHtqb2luLmN1c3RvbX1cXGApKWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaW5lcy5wdXNoKGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIFwiJHtqb2luLmZyb219XCIsIFwiJHtqb2luLnRvfVwiKWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNlbGVjdCAtIOyeheyytOyggSDqtazsobDroZwg7IOd7ISxXG4gICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChzdWJzZXRRdWVyeS5zZWxlY3QpO1xuICAgIGxpbmVzLnB1c2goYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiAqLmVudGl0eS5qc29u7J2YIHN1YnNldOyXkCDrk6TslrTsnojripQg7ZWE65OcIOuwsOyXtOydhCDrsJvslYTshJwsXG4gICAqIFB1cmnsnZggU2VsZWN0T2JqZWN0IO2DgOyeheycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOyYiDogW1widXNlcnMuaWRcIiwgXCJwYXJlbnQuaWRcIiwgXCJwYXJlbnQubmFtZVwiXVxuICAgKiAgIOKGkiB7IGlkOiBcInVzZXJzLmlkXCIsIHBhcmVudDogeyBpZDogXCJwYXJlbnQuaWRcIiwgbmFtZTogXCJwYXJlbnQubmFtZVwiIH0gfVxuICAgKlxuICAgKiDslrjrjZTrsJTqsIAg7JWE64uMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWo7JeQIOycoOydmO2VmOyEuOyalC5cbiAgICog7J2066CH6rKMIOykkeyyqSDqsJ3ssrTroZwg67OA7ZmY7ZWY7JesIHNlbGVjdOyXkCDrhJjqsqjso7zrqbQgUGFyc2VTZWxlY3RPYmplY3Qg7YOA7J6F7J20IGpvaW7rkJwg6rCd7LK07J2YIO2DgOyeheydhCDsnpgg7J6h7JWE7KSEIOyImCDsnojsirXri4jri6QuXG4gICAqIOymiSwgZW5oYW5jZXLsl5DshJwgcm9366W8IOuwm+yVmOydhCDrlYwgaHlkcmF0ZeuQnCDqsJ3ssrQg7J6Q7LK07J2YIG51bGxpdHnsmYAg6re4IOyViOyqvSDtlYTrk5zsnZggbnVsbGl0eeqwgCBmayBudWxsYWJsZSDsl6zrtoDsl5Ag65Sw6528IOyemCDstpTroaDrkKnri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdEl0ZW1zOiBzdHJpbmdbXSk6IE5lc3RlZFNlbGVjdCB7XG4gICAgY29uc3QgcmVzdWx0OiBOZXN0ZWRTZWxlY3QgPSB7fTtcblxuICAgIGZvciAoY29uc3Qgc2VsZWN0SXRlbSBvZiBzZWxlY3RJdGVtcykge1xuICAgICAgLy8gXCJ1c2Vycy5pZFwiIOuYkOuKlCBcInVzZXJzLmlkIGFzIHVzZXJfX2lkXCIg7ZiV7YOcIO2MjOyLsVxuICAgICAgY29uc3QgbWF0Y2ggPSBzZWxlY3RJdGVtLm1hdGNoKC9eKC4rPykoPzogYXMgKC4rKSk/JC8pO1xuICAgICAgaWYgKCFtYXRjaCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IFssIGNvbHVtbiwgYWxpYXNdID0gbWF0Y2g7XG4gICAgICBjb25zdCBjb2x1bW5WYWx1ZSA9IGBcIiR7Y29sdW1uLnRyaW0oKX1cImA7XG5cbiAgICAgIGlmICghYWxpYXMgfHwgIWFsaWFzLmluY2x1ZGVzKFwiX19cIikpIHtcbiAgICAgICAgLy8gYWxpYXPqsIAg7JeG6rGw64KYIF9f66W8IO2PrO2VqO2VmOyngCDslYrsnLzrqbQg7LWc7IOB7JyEIO2VhOuTnFxuICAgICAgICBjb25zdCBrZXkgPSBhbGlhcyA/PyBhc3NlcnREZWZpbmVkKGNvbHVtbi5zcGxpdChcIi5cIikucG9wKCkpO1xuICAgICAgICByZXN1bHRba2V5XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWxpYXPqsIAgX1/rpbwg7Y+s7ZWo7ZWY66m0IOyeheyytCDqtazsobDroZwg6re466O57ZmUXG4gICAgICAgIGNvbnN0IHBhcnRzID0gYWxpYXMuc3BsaXQoXCJfX1wiKTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSByZXN1bHQ7XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuCDsoITquYzsp4Ag7KSR7LKpIOqwneyytCDsg53shLFcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgICAgICAgaWYgKHBhcnQgaW4gY3VycmVudCkge1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUoY3VycmVudFtwYXJ0XSkpIHtcbiAgICAgICAgICAgICAgLy8g7J6F66Cl7J20IFtcInVzZXJcIiwgXCJ1c2VyX19pZFwiXSDqsJnsnYAg6rK97JqwIVxuICAgICAgICAgICAgICAvLyDslaDstIjsl5Ag66eQ64+EIOyViCDrkJjsp4Drp4wg7JWI7KCE7ZWY6rKMIOyYiOyZuOulvCDrjZjsp5Hri4jri6QuXG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBgQ29uZmxpY3QgZGV0ZWN0ZWQgaW4gc2VsZWN0IGl0ZW1zOiBwYXJlbnQgcGF0aCBcIiR7cGFydHMuc2xpY2UoMCwgaSArIDEpLmpvaW4oXCJfX1wiKX1cIiBpcyBhbHJlYWR5IHNldCBhcyBhIGZpZWxkLCBjYW5ub3QgbmVzdCBcIiR7YWxpYXN9XCIgdW5kZXIgaXQuYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOuniOyngOuniSDtjIztirjsl5Ag6rCSIOyEpOyglVxuICAgICAgICBjb25zdCBsYXN0UGFydCA9IHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdO1xuICAgICAgICBjdXJyZW50W2xhc3RQYXJ0XSA9IGNvbHVtblZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMocmVzdWx0KSk7XG4gIH1cblxuICAvKipcbiAgICogSlNPTi5zdHJpbmdpZnnsmYAg7Jyg7IKs7ZWcIOydvOydhCDtlanri4jri6QuXG4gICAqIOuLpOunjCDso7zslrTsp4Qg6rCd7LK066W8IEpTT07snbQg7JWE64uMIFR5cGVTY3JpcHQg6rCd7LK0IOumrO2EsOuftCDsiqTtirjrp4HsnLzroZwg66eM65Ok7Ja07KSN64uI64ukLlxuICAgKiBrZXnsl5Ag65Sw7Ji07ZGc6rCAIOyXhuyWtOyalC5cbiAgICog7Lac66ClIOyYiOyLnDpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB7XG4gICAqICAgaWQ6IFwidXNlcnMuaWRcIixcbiAgICogICBwYXJlbnQ6IHtcbiAgICogICAgIGlkOiBcInBhcmVudC5pZFwiLFxuICAgKiAgICAgbmFtZTogXCJwYXJlbnQubmFtZVwiLFxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqIEBwYXJhbSBvYmog67OA7ZmY7ZWgIOqwneyytFxuICAgKiBAcGFyYW0gaW5kZW50IOuTpOyXrOyTsOq4sCDroIjrsqhcbiAgICogQHBhcmFtIHdpdGhCcmFjZXMgdHJ1ZeuptCDspJHqtITtmLgg7Y+s7ZWoLCBmYWxzZeuptCDrgrTsmqnrp4wg67CY7ZmYXG4gICAqL1xuICBwcml2YXRlIHN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChcbiAgICBvYmo6IE5lc3RlZFNlbGVjdCxcbiAgICBpbmRlbnQ6IG51bWJlciA9IDAsXG4gICAgd2l0aEJyYWNlczogYm9vbGVhbiA9IHRydWUsXG4gICk6IHN0cmluZyB7XG4gICAgY29uc3Qgc3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQpO1xuICAgIGNvbnN0IGlubmVyU3BhY2VzID0gXCIgIFwiLnJlcGVhdChpbmRlbnQgKyAxKTtcblxuICAgIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhvYmopO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHdpdGhCcmFjZXMgPyBcInt9XCIgOiBcIlwiO1xuXG4gICAgY29uc3QgbGluZXMgPSBlbnRyaWVzLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgLy8g7Lus65+8IOqyveuhnCAo7J2066+4IOuUsOyYtO2RnCDtj6ztlagpXG4gICAgICAgIHJldHVybiBgJHtpbm5lclNwYWNlc30ke2tleX06ICR7dmFsdWV9LGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyDspJHssqkg6rCd7LK0ICjtla3sg4Eg7KSR6rSE7Zi4IO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdCh2YWx1ZSwgaW5kZW50ICsgMSwgdHJ1ZSl9LGA7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAod2l0aEJyYWNlcykge1xuICAgICAgcmV0dXJuIGB7XFxuJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbiR7c3BhY2VzfX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDspJHqtITtmLgg7JeG7J20IOuCtOyaqeunjCDrsJjtmZggKOyVnuuSpCDqsJztlokg7KCc7Jm4KVxuICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHVyaUxvYWRlclF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3QgeyBsb2FkZXJzIH0gPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW2BbYF07XG5cbiAgICAvLyDsnqzqt4DsoIHsnLzroZwgbG9hZGVyIOyDneyEse2VmOuKlCDtl6ztjbwg7ZWo7IiYXG4gICAgY29uc3QgZ2VuZXJhdGVMb2FkZXJDb2RlID0gKG5lc3RlZExvYWRlcnM6IFN1YnNldFF1ZXJ5W1wibG9hZGVyc1wiXSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGNvbnN0IGxvYWRlckxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGxvYWRlciBvZiBuZXN0ZWRMb2FkZXJzKSB7XG4gICAgICAgIGNvbnN0IHsgdG9UYWJsZSwgdG9Db2wsIHRocm91Z2gsIGZyb21UYWJsZSB9ID0gbG9hZGVyLm1hbnlKb2luO1xuXG4gICAgICAgIC8vIGZyb21UYWJsZeydmCBFbnRpdHnrpbwg6rCA7KC47JmA7IScIFBLIO2DgOyehSDtmZXsnbhcbiAgICAgICAgY29uc3QgZnJvbUVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0QnlUYWJsZShmcm9tVGFibGUpO1xuICAgICAgICBjb25zdCBmcm9tSWRzVHlwZSA9IGZyb21FbnRpdHkuZ2V0UGtBcnJheVR5cGUoKTtcblxuICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgIFwie1wiLFxuICAgICAgICAgIGBhczogXCIke2xvYWRlci5hc31cIixgLFxuICAgICAgICAgIGByZWZJZDogXCIke2xvYWRlci5tYW55Sm9pbi5pZEZpZWxkfVwiLGAsXG4gICAgICAgICAgYHFiOiAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sIGZyb21JZHM6IG51bWJlcltdIHwgc3RyaW5nW10pID0+IHtgLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh0aHJvdWdoID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBIYXNNYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dG9UYWJsZX1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiLCBmcm9tSWRzIGFzICR7ZnJvbUlkc1R5cGV9KWAsXG4gICAgICAgICAgICBgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTWFueVRvTWFueVxuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBcInJldHVybiBxYldyYXBwZXJcIixcbiAgICAgICAgICAgIGAuZnJvbShcIiR7dGhyb3VnaC50YWJsZX1cIilgLFxuICAgICAgICAgICAgYC5qb2luKFwiJHt0b1RhYmxlfVwiLCBcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLnRvQ29sfVwiLCBcIiR7dG9UYWJsZX0uJHt0b0NvbH1cIilgLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsb2FkZXIub25lSm9pbnMuZm9yRWFjaCgoam9pbjogU3Vic2V0UXVlcnlbXCJqb2luc1wiXVtudW1iZXJdKSA9PiB7XG4gICAgICAgICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICAgICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcbiAgICAgICAgICAgIGlmIChcImN1c3RvbVwiIGluIGpvaW4pIHtcbiAgICAgICAgICAgICAgLy8gY3VzdG9tIGpvaW4gY2xhdXNl64qUIGNhbGxiYWNrIO2Yle2DnOydmCBvbiDrqZTshJzrk5zroZwg7LKY66as7ZWp64uI64ukLlxuICAgICAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIChqKSA9PiB7YCxcbiAgICAgICAgICAgICAgICBgai5vbihQdXJpLnJhd1N0cmluZyhcIiR7am9pbi5jdXN0b219XCIpKTtgLFxuICAgICAgICAgICAgICAgIFwifSlcIixcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIOyeheyytOyggSBzZWxlY3Qg6rWs7KGwIOyDneyEsSAocmVmSWQg7Y+s7ZWoKVxuICAgICAgICAgIGNvbnN0IHNlbGVjdE9iaiA9IHRoaXMuYnVpbGROZXN0ZWRTZWxlY3RPYmplY3QobG9hZGVyLnNlbGVjdCk7XG4gICAgICAgICAgc2VsZWN0T2JqLnJlZklkID0gYFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cImA7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIGAud2hlcmVJbihcIiR7dGhyb3VnaC50YWJsZX0uJHt0aHJvdWdoLmZyb21Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goYH0sYCk7XG5cbiAgICAgICAgLy8g7KSR7LKpIGxvYWRlcnMg7LKY66asXG4gICAgICAgIGlmIChsb2FkZXIubG9hZGVycyAmJiBsb2FkZXIubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcImxvYWRlcnM6IFtcIiwgLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlci5sb2FkZXJzKSwgXCJdLFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXCJ9LFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGxvYWRlckxpbmVzO1xuICAgIH07XG5cbiAgICBsaW5lcy5wdXNoKC4uLmdlbmVyYXRlTG9hZGVyQ29kZShsb2FkZXJzKSk7XG4gICAgbGluZXMucHVzaChgXWApO1xuXG4gICAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICAvKlxuICAgIHN1YnNldCBTRUxFQ1QvSk9JTi9MT0FERVIg6rKw6rO8IOumrO2EtFxuICAqL1xuICBnZXRTdWJzZXRRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IFN1YnNldFF1ZXJ5IHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG5cbiAgICBjb25zdCByZXN1bHQ6IFN1YnNldFF1ZXJ5ID0gdGhpcy5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgc3Vic2V0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLypcbiAgICovXG4gIHJlc29sdmVTdWJzZXRRdWVyeShcbiAgICBwcmVmaXg6IHN0cmluZyxcbiAgICBmaWVsZHM6IHN0cmluZ1tdLFxuICAgIGlzQWxyZWFkeU91dGVySm9pbmVkOiBib29sZWFuID0gZmFsc2UsXG4gICk6IFN1YnNldFF1ZXJ5IHtcbiAgICAvLyBwcmVmaXgg7LmY7ZmYIChwcmVmaXjripQgVG9PbmVSZWxhdGlvbuydtCDrs7XsiJjroZwg67aZ7J2AIOqyveyasCDrqqjrkZAgX1/roZwg67OA6rK965CoKVxuICAgIHByZWZpeCA9IHByZWZpeC5yZXBsYWNlKC9cXC4vZywgXCJfX1wiKTtcblxuICAgIC8vIOyEnOu4jOyFi+ydhCAx646B7Iqk66eMIOu2hOumrO2VmOyXrCDqt7jro7ntlZFcbiAgICBjb25zdCBzdWJzZXRHcm91cCA9IGdyb3VwKGZpZWxkcywgKGZpZWxkKSA9PiB7XG4gICAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgIGNvbnN0IFtyZWxdID0gZmllbGQuc3BsaXQoXCIuXCIpO1xuICAgICAgICByZXR1cm4gcmVsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBPYmplY3Qua2V5cyhzdWJzZXRHcm91cCkucmVkdWNlKFxuICAgICAgKHIsIGdyb3VwS2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGdyb3VwZWRGaWVsZHMgPSBzdWJzZXRHcm91cFtncm91cEtleV07XG4gICAgICAgIGFzc2VydChncm91cGVkRmllbGRzICE9PSB1bmRlZmluZWQsIFwiZmllbGRzIGlzIHVuZGVmaW5lZFwiKTtcblxuICAgICAgICAvLyDtmITsnqwg7YWM7J2067iUIO2VhOuTnOyFi+ydgCBzZWxlY3QsIHZpcnR1YWzsl5Ag7LaU6rCA7ZWY6rOgIOumrO2EtFxuICAgICAgICBpZiAoZ3JvdXBLZXkgPT09IFwiXCIpIHtcbiAgICAgICAgICBjb25zdCByZWFsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PiAhaXNWaXJ0dWFsUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pKTtcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJjb2RlXCIgKOuYkOuKlCB1bmRlZmluZWQp7J24IHZpcnR1YWwgcHJvcOunjCByLnZpcnR1YWzsl5Ag7LaU6rCAXG4gICAgICAgICAgLy8gdmlydHVhbFR5cGU6IFwicXVlcnlcIuyduCDqsr3smrAg7IKs7Jqp7J6Q6rCAIGFwcGVuZFNlbGVjdOuhnCDsp4HsoJEg7LaU6rCA7ZWY66+A66GcIOygnOyZuFxuICAgICAgICAgIGNvbnN0IHZpcnR1YWxDb2RlRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5maWx0ZXIoKGZpZWxkKSA9PlxuICAgICAgICAgICAgaXNWaXJ0dWFsQ29kZVByb3AodGhpcy5wcm9wc0RpY3RbZmllbGRdKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8g7ZiE7J6sIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlYWxGaWVsZHMubWFwKChmaWVsZCkgPT4gdGhpcy5nZXRGdWxsRmllbGROYW1lKGZpZWxkKSkpO1xuICAgICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdCh2aXJ0dWFsQ29kZUZpZWxkcyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIOuEmOyWtOyYqCDthYzsnbTruJTsnbgg6rK97JqwXG4gICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChcbiAgICAgICAgICAgICAgcmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBgJHtwcmVmaXh9LiR7ZmllbGR9IGFzICR7cHJlZml4fV9fJHtmaWVsZH1gKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZWxhdGlvbiA9IHRoaXMucmVsYXRpb25zW2dyb3VwS2V5XTtcbiAgICAgICAgaWYgKHJlbGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyhtOyerO2VmOyngCDslYrripQgcmVsYXRpb24g7LC47KGwICR7Z3JvdXBLZXl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsYXRpb24ud2l0aCk7XG5cbiAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pIHx8IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb246IEpPSU4g7Jy866GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcblxuICAgICAgICAgIC8vIC1PbmUgUmVsYXRpb27sl5DshJwgaWQg7ZWE65Oc66eMIOywuOyhsO2VmOuKlCDqsr3smrAg66a066CI7J207IWYIOuEmOq4sOyngCDslYrqs6Ag66as7YS0XG4gICAgICAgICAgaWYgKHJlbEZpZWxkcy5sZW5ndGggPT09IDEgJiYgcmVsRmllbGRzWzBdID09PSBcImlkXCIpIHtcbiAgICAgICAgICAgIGlmIChwcmVmaXggPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7dGhpcy50YWJsZX0uJHtncm91cEtleX1faWRgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KGAke3ByZWZpeH0uJHtncm91cEtleX1faWQgYXMgJHtwcmVmaXh9X18ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gaW5uZXJPck91dGVyXG4gICAgICAgICAgY29uc3QgaW5uZXJPck91dGVyID0gKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChpc0FscmVhZHlPdXRlckpvaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gXCJvdXRlclwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLmhhc0pvaW5Db2x1bW4gJiYgIShyZWxhdGlvbi5udWxsYWJsZSA/PyBmYWxzZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5udWxsYWJsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiaW5uZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pKCk7XG4gICAgICAgICAgY29uc3QgcmVsU3Vic2V0UXVlcnkgPSByZWxFbnRpdHkucmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgICAgICAgICAgYCR7cHJlZml4ICE9PSBcIlwiID8gYCR7cHJlZml4fS5gIDogXCJcIn0ke2dyb3VwS2V5fWAsXG4gICAgICAgICAgICByZWxGaWVsZHMsXG4gICAgICAgICAgICBpbm5lck9yT3V0ZXIgPT09IFwib3V0ZXJcIixcbiAgICAgICAgICApO1xuICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgICAgICAgci52aXJ0dWFsID0gci52aXJ0dWFsLmNvbmNhdChyZWxTdWJzZXRRdWVyeS52aXJ0dWFsKTtcblxuICAgICAgICAgIGNvbnN0IGpvaW5BcyA9IHByZWZpeCA9PT0gXCJcIiA/IGdyb3VwS2V5IDogYCR7cHJlZml4fV9fJHtncm91cEtleX1gO1xuICAgICAgICAgIGNvbnN0IGZyb21UYWJsZSA9IHByZWZpeCA9PT0gXCJcIiA/IHRoaXMudGFibGUgOiBwcmVmaXg7XG5cbiAgICAgICAgICBsZXQgam9pbkNsYXVzZTpcbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGZyb206IHN0cmluZztcbiAgICAgICAgICAgICAgICB0bzogc3RyaW5nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB8IHtcbiAgICAgICAgICAgICAgICBjdXN0b206IHN0cmluZztcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICBpZiAocmVsYXRpb24uY3VzdG9tSm9pbkNsYXVzZSkge1xuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgY3VzdG9tOiByZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGZyb206IHN0cmluZywgdG86IHN0cmluZztcbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbikge1xuICAgICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS5pZGA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uaWRgO1xuICAgICAgICAgICAgICAgIHRvID0gYCR7am9pbkFzfS4ke2luZmxlY3Rpb24udW5kZXJzY29yZSh0aGlzLm5hbWVzLmZzLnJlcGxhY2UoLy0vZywgXCJfXCIpKX1faWRgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS4ke3JlbGF0aW9uLm5hbWV9X2lkYDtcbiAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGpvaW5DbGF1c2UgPSB7XG4gICAgICAgICAgICAgIGZyb20sXG4gICAgICAgICAgICAgIHRvLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zLnB1c2goe1xuICAgICAgICAgICAgYXM6IGpvaW5BcyxcbiAgICAgICAgICAgIGpvaW46IGlubmVyT3JPdXRlcixcbiAgICAgICAgICAgIHRhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAuLi5qb2luQ2xhdXNlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQmVsb25nc1RvT25lIOuwkeyXkCBIYXNNYW556rCAIOu2meydgCDqsr3smrBcbiAgICAgICAgICBpZiAocmVsU3Vic2V0UXVlcnkubG9hZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjb252ZXJ0ZWRMb2FkZXJzID0gcmVsU3Vic2V0UXVlcnkubG9hZGVycy5tYXAoKGxvYWRlcikgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBuZXdBcyA9IFtncm91cEtleSwgbG9hZGVyLmFzXS5qb2luKFwiX19cIik7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYXM6IG5ld0FzLFxuICAgICAgICAgICAgICAgIHRhYmxlOiBsb2FkZXIudGFibGUsXG4gICAgICAgICAgICAgICAgbWFueUpvaW46IGxvYWRlci5tYW55Sm9pbixcbiAgICAgICAgICAgICAgICBvbmVKb2luczogbG9hZGVyLm9uZUpvaW5zLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogbG9hZGVyLnNlbGVjdCxcbiAgICAgICAgICAgICAgICBsb2FkZXJzOiBsb2FkZXIubG9hZGVycyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByLmxvYWRlcnMgPSBbLi4uci5sb2FkZXJzLCAuLi5jb252ZXJ0ZWRMb2FkZXJzXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmpvaW5zID0gci5qb2lucy5jb25jYXQocmVsU3Vic2V0UXVlcnkuam9pbnMpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzSGFzTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgIC8vIC1NYW55IFJlbGF0aW9uOiBMb2FkZXIg66GcIOyymOumrFxuICAgICAgICAgIGNvbnN0IHJlbEZpZWxkcyA9IGdyb3VwZWRGaWVsZHMubWFwKChmaWVsZCkgPT4gZmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDEpLmpvaW4oXCIuXCIpKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXCJcIiwgcmVsRmllbGRzKTtcblxuICAgICAgICAgIGxldCBtYW55Sm9pbjogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdW251bWJlcl1bXCJtYW55Sm9pblwiXTtcbiAgICAgICAgICBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgY29uc3QgZnJvbUNvbCA9IHJlbGF0aW9uPy5mcm9tQ29sdW1uID8/IFwiaWRcIjtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2wsXG4gICAgICAgICAgICAgIGlkRmllbGQ6IHByZWZpeCA9PT0gXCJcIiA/IGAke2Zyb21Db2x9YCA6IGAke3ByZWZpeH1fXyR7ZnJvbUNvbH1gLFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiByZWxhdGlvbi5qb2luQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlzTWFueVRvTWFueVJlbGF0aW9uUHJvcChyZWxhdGlvbikpIHtcbiAgICAgICAgICAgIG1hbnlKb2luID0ge1xuICAgICAgICAgICAgICBmcm9tVGFibGU6IHRoaXMudGFibGUsXG4gICAgICAgICAgICAgIGZyb21Db2w6IFwiaWRcIixcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYGlkYCA6IGAke3ByZWZpeH1fX2lkYCxcbiAgICAgICAgICAgICAgdGhyb3VnaDoge1xuICAgICAgICAgICAgICAgIHRhYmxlOiByZWxhdGlvbi5qb2luVGFibGUsXG4gICAgICAgICAgICAgICAgZnJvbUNvbDogYCR7aW5mbGVjdGlvbi5zaW5ndWxhcml6ZSh0aGlzLnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICAgIHRvQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHJlbEVudGl0eS50YWJsZSl9X2lkYCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdG9UYWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgICB0b0NvbDogXCJpZFwiLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgci5sb2FkZXJzLnB1c2goe1xuICAgICAgICAgICAgYXM6IGdyb3VwS2V5LFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIG1hbnlKb2luLFxuICAgICAgICAgICAgb25lSm9pbnM6IHJlbFN1YnNldFF1ZXJ5LmpvaW5zLFxuICAgICAgICAgICAgc2VsZWN0OiByZWxTdWJzZXRRdWVyeS5zZWxlY3QsXG4gICAgICAgICAgICBsb2FkZXJzOiByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9LFxuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB7XG4gICAgICAgIHNlbGVjdDogW10sXG4gICAgICAgIHZpcnR1YWw6IFtdLFxuICAgICAgICBqb2luczogW10sXG4gICAgICAgIGxvYWRlcnM6IFtdLFxuICAgICAgfSBhcyBTdWJzZXRRdWVyeSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgIEZpZWxkRXhwcltdIOydhCBFbnRpdHlQcm9wTm9kZVtdIOuhnCDrs4DtmZhcbiAgKi9cbiAgZmllbGRFeHByc1RvUHJvcE5vZGVzKGZpZWxkRXhwcnM6IHN0cmluZ1tdLCBlbnRpdHk6IEVudGl0eSA9IHRoaXMpOiBFbnRpdHlQcm9wTm9kZVtdIHtcbiAgICBjb25zdCBncm91cHMgPSBmaWVsZEV4cHJzLnJlZHVjZShcbiAgICAgIChyZXN1bHQsIGZpZWxkRXhwcikgPT4ge1xuICAgICAgICBsZXQga2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGVsc2VFeHByOiBzdHJpbmdbXTtcbiAgICAgICAgaWYgKGZpZWxkRXhwci5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgICBba2V5LCAuLi5lbHNlRXhwcl0gPSBmaWVsZEV4cHIuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgIHZhbHVlID0gZWxzZUV4cHIuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAga2V5ID0gXCJcIjtcbiAgICAgICAgICB2YWx1ZSA9IGZpZWxkRXhwcjtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHRba2V5XSA9IChyZXN1bHRba2V5XSA/PyBbXSkuY29uY2F0KHZhbHVlKTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSxcbiAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAge30gYXMge1xuICAgICAgICBbazogc3RyaW5nXTogc3RyaW5nW107XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZ3JvdXBzKS5mbGF0TWFwPEVudGl0eVByb3BOb2RlLCBFbnRpdHlQcm9wTm9kZVtdPigoa2V5KSA9PiB7XG4gICAgICBjb25zdCBncm91cGVkRmllbGRFeHBycyA9IGdyb3Vwc1trZXldO1xuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIGlmIChrZXkgPT09IFwiXCIpIHtcbiAgICAgICAgcmV0dXJuIGdyb3VwZWRGaWVsZEV4cHJzLm1hcCgocHJvcE5hbWUpID0+IHtcbiAgICAgICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgICAgIGlmIChwcm9wID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZW50aXR5LmlkfSAtLSDsnpjrqrvrkJwgRmllbGRFeHByICcke3Byb3BOYW1lfScgKOyCrOyaqSDqsIDriqXtlZwgcHJvcHM6ICR7ZW50aXR5LnByb3BzLm1hcCgocCkgPT4gcC5uYW1lKS5qb2luKFwiLCBcIil9KWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbm9kZVR5cGU6IFwicGxhaW5cIiBhcyBjb25zdCxcbiAgICAgICAgICAgIHByb3AsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIHJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBjb25zdCBwcm9wID0gZW50aXR5LnByb3BzRGljdFtrZXldO1xuICAgICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCBGaWVsZEV4cHIgJHtrZXl9LiR7Z3JvdXBlZEZpZWxkRXhwcnNbMF19YCk7XG4gICAgICB9XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuXG4gICAgICAvLyByZWxhdGlvbiAtT25lIOyXkCBpZCDtlYTrk5wg7ZWY64KY7J24IOqyveyasFxuICAgICAgaWYgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGdyb3VwZWRGaWVsZEV4cHJzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgIChncm91cGVkRmllbGRFeHByc1swXSA9PT0gXCJpZFwiIHx8IGdyb3VwZWRGaWVsZEV4cHJzWzBdID09PSBcImlkP1wiKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBpZCDtlZjrgpjrp4wg7J6I64qU7KeAIOyytO2BrO2VtOyEnCwg7ZWY64KY66eMIOyeiOycvOuptCDsg4HsnIQgcHJvcOycvOuhnCBpZOulvCDrpqzthLRcbiAgICAgICAgICBjb25zdCBpZFByb3AgPSByZWxFbnRpdHkucHJvcHNEaWN0LmlkO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcDoge1xuICAgICAgICAgICAgICAuLi5pZFByb3AsXG4gICAgICAgICAgICAgIG5hbWU6IGAke2tleX1faWRgLFxuICAgICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAtT25lIOq3uOyZuOydmCDqsr3smrAgb2JqZWN066GcIOumrO2EtFxuICAgICAgLy8gLU1hbnnsnZgg6rK97JqwIGFycmF566GcIOumrO2EtFxuICAgICAgLy8gUmVjdXJzaXZlIOuhnCDrjoHsiqQg7LKY66asXG4gICAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMuZmllbGRFeHByc1RvUHJvcE5vZGVzKGdyb3VwZWRGaWVsZEV4cHJzLCByZWxFbnRpdHkpO1xuICAgICAgY29uc3Qgbm9kZVR5cGUgPVxuICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCBpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApXG4gICAgICAgICAgPyAoXCJvYmplY3RcIiBhcyBjb25zdClcbiAgICAgICAgICA6IChcImFycmF5XCIgYXMgY29uc3QpO1xuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBub2RlVHlwZSxcbiAgICAgICAgcHJvcCxcbiAgICAgICAgY2hpbGRyZW4sXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RmllbGRFeHBycyhwcmVmaXggPSBcIlwiLCBtYXhEZXB0aDogbnVtYmVyID0gMywgZnJvbXM6IHN0cmluZ1tdID0gW10pOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHNcbiAgICAgIC5mbGF0TWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BOYW1lID0gW3ByZWZpeCwgcHJvcC5uYW1lXS5maWx0ZXIoKHYpID0+IHYgIT09IFwiXCIpLmpvaW4oXCIuXCIpO1xuICAgICAgICBpZiAocHJvcE5hbWUgPT09IHByZWZpeCkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICAgIGlmIChtYXhEZXB0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZnJvbXMuaW5jbHVkZXMocHJvcC53aXRoKSkge1xuICAgICAgICAgICAgLy8g7Jet67Cp7ZalIHJlbGF0aW9u7J24IOqyveyasCDsoJzsmbhcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyDsoJXrsKntlqUgcmVsYXRpb27snbgg6rK97JqwIHJlY3Vyc2l2ZSDsvZxcbiAgICAgICAgICBjb25zdCByZWxNZCA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgICAgcmV0dXJuIHJlbE1kLmdldEZpZWxkRXhwcnMocHJvcE5hbWUsIG1heERlcHRoIC0gMSwgWy4uLmZyb21zLCB0aGlzLmlkXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb3BOYW1lO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKGYpID0+IGYgIT09IG51bGwpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIHByb3DsnbQg7ZiE7J6sIO2FjOydtOu4lOyXkCBGSyDsu6zrn7zsnYQg7IOd7ISx7ZWY64qU7KeAIO2ZleyduFxuICAgKihCZWxvbmdzVG9PbmUg65iQ64qUIE9uZVRvT25lKGhhc0pvaW5Db2x1bW49dHJ1ZSnsnbgg6rK97JqwIEZLIOyDneyEsSlcbiAgICovXG4gIHByaXZhdGUgaGFzRm9yZWlnbktleShwcm9wOiBSZWxhdGlvblByb3ApOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgcHJvcC5yZWxhdGlvblR5cGUgPT09IFwiQmVsb25nc1RvT25lXCIgfHxcbiAgICAgIChwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJPbmVUb09uZVwiICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApO1xuICB9XG5cbiAgZ2V0VGFibGVDb2x1bW5zKCk6IHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfVtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLm1hcCgocHJvcCkgPT4ge1xuICAgICAgICBpZiAocHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIpIHtcbiAgICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCwgdHlwZTogXCJpbnRfdW5zaWduZWRcIiB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbmFtZTogcHJvcC5uYW1lLCB0eXBlOiBwcm9wLnR5cGUgfTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnsl5Ag7KCV7J2Y65CcIOuqqOuToCB2ZWN0b3Ig7YOA7J6FIOy7rOufvCDrsJjtmZhcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbnMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJ2ZWN0b3JcIik7XG4gIH1cblxuICAvKipcbiAgICog7Yq57KCVIHZlY3RvciDsu6zrn7wg67CY7ZmYXG4gICAqIEBwYXJhbSBjb2x1bW5OYW1lIC0g7Lus65+866qFICjsg53rnrUg7IucIOyyqyDrsojsp7ggdmVjdG9yIOy7rOufvClcbiAgICovXG4gIGdldFZlY3RvckNvbHVtbihjb2x1bW5OYW1lPzogc3RyaW5nKTogRW50aXR5UHJvcCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgdmVjdG9yUHJvcHMgPSB0aGlzLmdldFZlY3RvckNvbHVtbnMoKTtcbiAgICBpZiAoY29sdW1uTmFtZSkge1xuICAgICAgcmV0dXJuIHZlY3RvclByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gY29sdW1uTmFtZSk7XG4gICAgfVxuICAgIHJldHVybiB2ZWN0b3JQcm9wc1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTthLDrp4Eg6rCA64ql7ZWcIHByb3BzIOuwmO2ZmFxuICAgKlxuICAgKiAtIOydvOuwmCBwcm9wXG4gICAqIC0gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9uIChCZWxvbmdzVG9PbmUsIE9uZVRvT25lIHdpdGggaGFzSm9pbkNvbHVtbilcbiAgICogICDihpIge25hbWV9X2lkIO2Yle2DnOydmCDqsIDsg4EgaW50ZWdlciBwcm9w7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RmlsdGVyYWJsZVByb3BzKCk6IEVudGl0eVByb3BbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuZmxhdE1hcCgocHJvcCk6IEVudGl0eVByb3AgfCBFbnRpdHlQcm9wW10gPT4ge1xuICAgICAgLy8gVmlydHVhbCBwcm9wIOygnOyZuFxuICAgICAgaWYgKGlzVmlydHVhbFByb3AocHJvcCkpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIC8vIEZL66W8IOyDneyEse2VmOuKlCByZWxhdGlvbuunjCDtj6ztlahcbiAgICAgICAgaWYgKHRoaXMuaGFzRm9yZWlnbktleShwcm9wKSkge1xuICAgICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lOiBgJHtwcm9wLm5hbWV9X2lkYCxcbiAgICAgICAgICAgIHR5cGU6IFwiaW50ZWdlclwiLFxuICAgICAgICAgICAgbnVsbGFibGU6IHByb3AubnVsbGFibGUsXG4gICAgICAgICAgfSBhcyBFbnRpdHlQcm9wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgLy8g7J2867CYIHByb3Ag7LKY66asXG4gICAgICByZXR1cm4gcHJvcDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRpdHnqsIAg64W47Lac7ZWY64qUIO2DgOyehSDsnbTrpoTqs7wg66qo65OIIOqyveuhnOulvCBFbnRpdHlNYW5hZ2Vy7JeQIOuTseuhne2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGV4cGxpY2l0QXBpUm9vdFBhdGggLSBTb25hbXUg7LSI6riw7ZmUIOyXhuydtCDrk7HroZ3tlaAg65WMIOyCrOyaqe2VoCBBUEkg66Oo7Yq4IOqyveuhnFxuICAgKi9cbiAgYXN5bmMgcmVnaXN0ZXJNb2R1bGVQYXRocyhleHBsaWNpdEFwaVJvb3RQYXRoPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVBhdGggPSBgJHt0aGlzLm5hbWVzLnBhcmVudEZzfWA7XG5cbiAgICAvLyBiYXNlLXNjaGVtZVxuICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfUJhc2VTY2hlbWFgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuXG4gICAgLy8gc3Vic2V0XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykubGVuZ3RoID4gMCkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0S2V5YCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChgJHt0aGlzLmlkfVN1YnNldE1hcHBpbmdgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoXG4gICAgICAgICAgYCR7dGhpcy5pZH1TdWJzZXQke3N1YnNldEtleS50b1VwcGVyQ2FzZSgpfWAsXG4gICAgICAgICAgYHNvbmFtdS5nZW5lcmF0ZWRgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zXG4gICAgZm9yIChjb25zdCBlbnVtSWQgb2YgT2JqZWN0LmtleXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGVudW1JZCwgYHNvbmFtdS5nZW5lcmF0ZWRgKTtcbiAgICB9XG5cbiAgICAvLyB0eXBlc1xuICAgIGNvbnN0IHR5cGVzTW9kdWxlUGF0aCA9IGAke2Jhc2VQYXRofS8ke3RoaXMubmFtZXMucGFyZW50RnN9LnR5cGVzYDtcbiAgICBjb25zdCB0eXBlc0ZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgZXhwbGljaXRBcGlSb290UGF0aCA/PyBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBydW50aW1lUGF0aChgZGlzdC9hcHBsaWNhdGlvbi8ke3R5cGVzTW9kdWxlUGF0aH0uanNgKSxcbiAgICApO1xuXG4gICAgaWYgKGF3YWl0IGV4aXN0cyh0eXBlc0ZpbGVQYXRoKSkge1xuICAgICAgY29uc3QgaW1wb3J0ZWRNZW1iZXJzID0gYXdhaXQgaW1wb3J0TWVtYmVyczx6LlpvZFR5cGVBbnk+KHR5cGVzRmlsZVBhdGgpO1xuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB0aGlzLnR5cGVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBpbXBvcnRlZE1lbWJlcnMubWFwKCh7IG5hbWUsIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgobmFtZSwgdHlwZXNNb2R1bGVQYXRoKTtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIHZhbHVlXTtcbiAgICAgICAgfSksXG4gICAgICApIGFzIHsgW25hbWU6IHN0cmluZ106IHouWm9kVHlwZUFueSB9O1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyVGFibGVTcGVjcygpOiB2b2lkIHtcbiAgICAvLyDsobDsnbgg7YWM7J2067iUIOyduOuNseyKpCDsoJzsmbggKOy7rOufvCDsnbTrpoTsl5AgJy4n7J20IO2PrO2VqOuQnCDqsr3smrApXG4gICAgY29uc3QgdW5pcXVlSW5kZXhlcyA9IHRoaXMuaW5kZXhlc1xuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHgudHlwZSA9PT0gXCJ1bmlxdWVcIilcbiAgICAgIC5maWx0ZXIoKGlkeCkgPT4gaWR4LmNvbHVtbnMuZXZlcnkoKGNvbCkgPT4gIWNvbC5uYW1lLmluY2x1ZGVzKFwiLlwiKSkpO1xuXG4gICAgRW50aXR5TWFuYWdlci5zZXRUYWJsZVNwZWMoe1xuICAgICAgbmFtZTogdGhpcy50YWJsZSxcbiAgICAgIHVuaXF1ZUluZGV4ZXMsXG4gICAgICBqc29uQ29sdW1uczogdGhpcy5wcm9wcy5maWx0ZXIoKHApID0+IHAudHlwZSA9PT0gXCJqc29uXCIpLm1hcCgocCkgPT4gcC5uYW1lKSxcbiAgICB9KTtcbiAgfVxuXG4gIHRvSnNvbigpOiBFbnRpdHlKc29uIHtcbiAgICAvLyBzdWJzZXRz7JmAIHN1YnNldHNJbnRlcm5hbOydhCBTdWJzZXREZWYg7ZiV7YOc66GcIOuzteybkCAoY29uZSDtj6ztlagpXG4gICAgY29uc3Qgc3Vic2V0czogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5TdWJzZXREZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3Vic2V0cykpIHtcbiAgICAgIGNvbnN0IG5vcm1hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9IHRoaXMuc3Vic2V0c1trZXldO1xuICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHM6IFN1YnNldEZpZWxkW10gPSAodGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA/PyBbXSkubWFwKChmaWVsZCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgfSkpO1xuICAgICAgY29uc3QgZmllbGRzID0gWy4uLm5vcm1hbEZpZWxkcywgLi4uaW50ZXJuYWxGaWVsZHNdO1xuXG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IOuwsOyXtCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLnN1YnNldENvbmVzW2tleV0pIHtcbiAgICAgICAgc3Vic2V0c1trZXldID0ge1xuICAgICAgICAgIGZpZWxkcyxcbiAgICAgICAgICBjb25lOiB0aGlzLnN1YnNldENvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSBmaWVsZHM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXPrpbwgRW51bURlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBlbnVtczogeyBba2V5OiBzdHJpbmddOiBpbXBvcnQoXCIuLi90eXBlcy90eXBlc1wiKS5FbnVtRGVmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtTGFiZWxzKSkge1xuICAgICAgLy8gY29uZeydtCDsnojsnLzrqbQg7IOI66Gc7Jq0IOqwneyytCDtmJXtg5zroZwsIOyXhuycvOuptCBSZWNvcmQg7ZiV7YOc66GcXG4gICAgICBpZiAodGhpcy5lbnVtQ29uZXNba2V5XSkge1xuICAgICAgICBlbnVtc1trZXldID0ge1xuICAgICAgICAgIHZhbHVlcyxcbiAgICAgICAgICBjb25lOiB0aGlzLmVudW1Db25lc1trZXldLFxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW51bXNba2V5XSA9IHZhbHVlcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICBwYXJlbnRJZDogdGhpcy5wYXJlbnRJZCxcbiAgICAgIHRhYmxlOiB0aGlzLnRhYmxlLFxuICAgICAgdGl0bGU6IHRoaXMudGl0bGUsXG4gICAgICBjdXN0b206IHRoaXMuY3VzdG9tLFxuICAgICAgY29uZTogdGhpcy5jb25lLFxuICAgICAgcHJvcHM6IHRoaXMucHJvcHMsXG4gICAgICBpbmRleGVzOiB0aGlzLmluZGV4ZXMsXG4gICAgICBzdWJzZXRzLFxuICAgICAgZW51bXMsXG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jIHNhdmUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gc29ydDogc3Vic2V0c1xuICAgIGNvbnN0IHN1YnNldFJvd3MgPSB0aGlzLmdldFN1YnNldFJvd3MoKTtcbiAgICB0aGlzLnN1YnNldHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHMpLm1hcCgoW3N1YnNldEtleV0pID0+IHtcbiAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvd3MsIHN1YnNldEtleSwgZmFsc2UpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldHNJbnRlcm5hbCkubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCB0cnVlKV07XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gc2F2ZVxuICAgIGNvbnN0IGpzb25QYXRoID0gcGF0aC5qb2luKFxuICAgICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgICAgYHNyYy9hcHBsaWNhdGlvbi8ke3RoaXMubmFtZXMucGFyZW50RnN9LyR7dGhpcy5uYW1lcy5mc30uZW50aXR5Lmpzb25gLFxuICAgICk7XG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKGpzb25QYXRoLCBhd2FpdCBmb3JtYXRDb2RlKEpTT04uc3RyaW5naWZ5KGpzb24pLCBqc29uUGF0aCkpO1xuXG4gICAgLy8gcmVsb2FkXG4gICAgYXdhaXQgRW50aXR5TWFuYWdlci5yZWdpc3Rlcihqc29uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthZztlIzrpr8gY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBMTE3snYQg7IKs7Jqp7ZWY7KeAIOyViuqzoCBmYWtlci1tYXBwaW5ncy50c+ulvCDtmZzsmqntlZjsl6wg6riw67O4IGNvbmXsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKiBzdHViIGVudGl0eSDsg53shLEg7IucIOyekOuPmeycvOuhnCDtmLjstpzrkJjslrQg7LWc7IaM7ZWc7J2YIGNvbmUg66mU7YOA642w7J207YSw66W8IOygnOqzte2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIGxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBTb25hbXUuY29uZmlnLmkxOG4uZGVmYXVsdExvY2FsZSDrmJDripQgXCJrb1wiKVxuICAgKi9cbiAgYXN5bmMgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuL2VudGl0eS10ZW1wbGF0ZS1jb25lXCIpO1xuICAgIGNvbnN0IGNvbmZpZ0xvY2FsZSA9IFNvbmFtdS5jb25maWcuaTE4bj8uZGVmYXVsdExvY2FsZTtcbiAgICBjb25zdCBlZmZlY3RpdmVMb2NhbGUgPVxuICAgICAgbG9jYWxlIHx8XG4gICAgICAoY29uZmlnTG9jYWxlID09PSBcImtvXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImVuXCIgfHwgY29uZmlnTG9jYWxlID09PSBcImphXCJcbiAgICAgICAgPyBjb25maWdMb2NhbGVcbiAgICAgICAgOiBcImtvXCIpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdlbmVyYXRlVGVtcGxhdGVDb25lcyh0aGlzLnRvSnNvbigpLCBlZmZlY3RpdmVMb2NhbGUpO1xuXG4gICAgLy8g6rKw6rO866W8IEVudGl0eeyXkCDsoIHsmqkgKGFwcGx5Q29uZXPsmYAg64+Z7J287ZWcIOuwqeyLnSlcbiAgICBpZiAocmVzdWx0LmVudGl0eUNvbmUpIHtcbiAgICAgIHRoaXMuY29uZSA9IHJlc3VsdC5lbnRpdHlDb25lO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3Byb3BOYW1lLCBjb25lXSBvZiBPYmplY3QuZW50cmllcyhyZXN1bHQucHJvcENvbmVzKSkge1xuICAgICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAocHJvcCkge1xuICAgICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgICAgKHByb3AgYXMgeyBjb25lPzogQ29uZSB9KS5jb25lID0gY29uZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmVudW1Db25lcyA9IHsgLi4udGhpcy5lbnVtQ29uZXMsIC4uLnJlc3VsdC5lbnVtQ29uZXMgfTtcbiAgICB0aGlzLnN1YnNldENvbmVzID0geyAuLi50aGlzLnN1YnNldENvbmVzLCAuLi5yZXN1bHQuc3Vic2V0Q29uZXMgfTtcblxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIExMTeydhCDsgqzsmqntlZjsl6wgY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5wcmVzZXJ2ZUV4aXN0aW5nIC0g6riw7KG0IGNvbmUg67O07KG0IOyXrOu2gCAo6riw67O46rCSOiB0cnVlKVxuICAgKiBAcGFyYW0gb3B0aW9ucy5vbmx5RW1wdHkgLSBmaXh0dXJlSGludOqwgCDsl4bripQgY29uZeunjCDsg53shLEgKOq4sOuzuOqwkjogZmFsc2UpXG4gICAqIEBwYXJhbSBvcHRpb25zLmxvY2FsZSAtIOyDneyEsSDsi5wg7IKs7Jqp7ZWgIGxvY2FsZSAo6riw67O46rCSOiBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZUNvbmVzKG9wdGlvbnM/OiB7XG4gICAgcHJlc2VydmVFeGlzdGluZz86IGJvb2xlYW47XG4gICAgb25seUVtcHR5PzogYm9vbGVhbjtcbiAgICBsb2NhbGU/OiBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG4gICAgLyoqIO2FjOyKpO2KuOuCmCDrjIDssrQgTExNIOqzteq4ieyekOulvCDsnITtlZwg7YWN7Iqk7Yq4IOyDneyEsSDqtaztmIQgKi9cbiAgICBnZW5lcmF0ZVRleHQ/OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVUZXh0R2VuZXJhdG9yO1xuICAgIC8qKiBmYWxzZeydtOuptCDsg53shLEg6rKw6rO866W8IOuplOuqqOumrOyXkOunjCDsoIHsmqntlZjqs6AgZW50aXR5IO2MjOydvOydgCDsoIDsnqXtlZjsp4Ag7JWK7Iq164uI64ukLiAqL1xuICAgIHBlcnNpc3Q/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0PiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZUNvbmVzIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpO1xuICAgIGNvbnN0IGNvbnRleHQ6IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25Db250ZXh0ID0ge1xuICAgICAgZW50aXR5OiB0aGlzLnRvSnNvbigpLFxuICAgICAgbG9jYWxlOiBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiLFxuICAgICAgZXhpc3RpbmdDb25lczogb3B0aW9ucz8ucHJlc2VydmVFeGlzdGluZyAhPT0gZmFsc2UgPyB0aGlzLmNvbGxlY3RFeGlzdGluZ0NvbmVzKCkgOiB1bmRlZmluZWQsXG4gICAgICBvbmx5RW1wdHk6IG9wdGlvbnM/Lm9ubHlFbXB0eSA/PyBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2VuZXJhdGVDb25lcyhjb250ZXh0LCB7IGdlbmVyYXRlVGV4dDogb3B0aW9ucz8uZ2VuZXJhdGVUZXh0IH0pO1xuICAgIHRoaXMuYXBwbHlDb25lcyhyZXN1bHQpO1xuICAgIGlmIChvcHRpb25zPy5wZXJzaXN0ICE9PSBmYWxzZSkge1xuICAgICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICog6riw7KG0IGNvbmXrk6TsnYQg7IiY7KeR7ZWp64uI64ukIChlbnRpdHksIHByb3BzLCBlbnVtcywgc3Vic2V0cykuXG4gICAqXG4gICAqIEByZXR1cm5zIO2CpOqwgCBcImVudGl0eTppZFwiLCBcInByb3A6bmFtZVwiLCBcImVudW06ZW51bUlkXCIsIFwic3Vic2V0OmtleVwiIO2YleyLneyduCBjb25lIOuntVxuICAgKi9cbiAgY29sbGVjdEV4aXN0aW5nQ29uZXMoKTogUmVjb3JkPHN0cmluZywgQ29uZT4ge1xuICAgIGNvbnN0IGNvbmVFbnRyaWVzOiBbc3RyaW5nLCBDb25lXVtdID0gW107XG5cbiAgICBpZiAodGhpcy5jb25lKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW50aXR5OiR7dGhpcy5pZH1gLCB0aGlzLmNvbmVdKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHByb3Agb2YgdGhpcy5wcm9wcykge1xuICAgICAgaWYgKHByb3AuY29uZSkge1xuICAgICAgICBjb25lRW50cmllcy5wdXNoKFtgcHJvcDoke3Byb3AubmFtZX1gLCBwcm9wLmNvbmVdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtlbnVtSWQsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUNvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYGVudW06JHtlbnVtSWR9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3N1YnNldEtleSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zdWJzZXRDb25lcykpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BzdWJzZXQ6JHtzdWJzZXRLZXl9YCwgY29uZV0pO1xuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoY29uZUVudHJpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyDneyEseuQnCBjb25l65Ok7J2EIEVudGl0eeyXkCDsoIHsmqntlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSByZXN1bHQgLSBMTE3snLzroZwg7IOd7ISx65CcIGNvbmUg6rKw6rO8XG4gICAqL1xuICBhcHBseUNvbmVzKHJlc3VsdDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvblJlc3VsdCk6IHZvaWQge1xuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuICB9XG5cbiAgZ2V0U3Vic2V0Um93cyhcbiAgICBfc3Vic2V0cz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nW10gfSxcbiAgICBfc3Vic2V0c0ludGVybmFsPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIHByZWZpeGVzOiBzdHJpbmdbXSA9IFtdLFxuICApOiBFbnRpdHlTdWJzZXRSb3dbXSB7XG4gICAgaWYgKHByZWZpeGVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2V0cyA9IF9zdWJzZXRzID8/IHRoaXMuc3Vic2V0cztcbiAgICBjb25zdCBzdWJzZXRzSW50ZXJuYWwgPSBfc3Vic2V0c0ludGVybmFsID8/IHRoaXMuc3Vic2V0c0ludGVybmFsO1xuICAgIGNvbnN0IHN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhzdWJzZXRzKTtcbiAgICBjb25zdCBhbGxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNba2V5XSkpO1xuICAgIC8vIGludGVybmFsIO2VhOuTnOuPhCBhbGxGaWVsZHPsl5Ag7Y+s7ZWoIChyZWxhdGlvbiDtg5Dsg4nsmqkpXG4gICAgY29uc3QgYWxsSW50ZXJuYWxGaWVsZHMgPSB1bmlxdWUoc3Vic2V0S2V5cy5mbGF0TWFwKChrZXkpID0+IHN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKSk7XG4gICAgY29uc3QgY29tYmluZWRGaWVsZHMgPSB1bmlxdWUoWy4uLmFsbEZpZWxkcywgLi4uYWxsSW50ZXJuYWxGaWVsZHNdKTtcblxuICAgIHJldHVybiB0aGlzLnByb3BzLm1hcCgocHJvcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIiAmJlxuICAgICAgICBjb21iaW5lZEZpZWxkcy5maW5kKChmKSA9PiBmLnN0YXJ0c1dpdGgoYCR7Wy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpfS5gKSlcbiAgICAgICkge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IHJlbEVudGl0eS5nZXRTdWJzZXRSb3dzKHN1YnNldHMsIHN1YnNldHNJbnRlcm5hbCwgW1xuICAgICAgICAgIC4uLnByZWZpeGVzLFxuICAgICAgICAgIGAke3Byb3AubmFtZX1gLFxuICAgICAgICBdKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgICAgY2hpbGRyZW4sXG4gICAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3Aud2l0aCxcbiAgICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgICBpc09wZW46IGNoaWxkcmVuLmxlbmd0aCA+IDAsXG4gICAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBjaGlsZHJlbi5ldmVyeSgoY2hpbGQpID0+IGNoaWxkLmhhc1tzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaXNJbnRlcm5hbFtzdWJzZXRLZXldKV07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWVsZCA9IFsuLi5wcmVmaXhlcywgcHJvcC5uYW1lXS5qb2luKFwiLlwiKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGZpZWxkOiBwcm9wLm5hbWUsXG4gICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgcmVsYXRpb25FbnRpdHk6IHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiID8gcHJvcC53aXRoIDogdW5kZWZpbmVkLFxuICAgICAgICBwcmVmaXhlcyxcbiAgICAgICAgaGFzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3Vic2V0RmllbGRzID0gc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAgICAgY29uc3QgaGFzID0gc3Vic2V0RmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBoYXNdO1xuICAgICAgICAgIH0pLFxuICAgICAgICApLFxuICAgICAgICBpc0ludGVybmFsOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW50ZXJuYWxGaWVsZHMgPSBzdWJzZXRzSW50ZXJuYWxbc3Vic2V0S2V5XSA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW50ZXJuYWwgPSBpbnRlcm5hbEZpZWxkcy5zb21lKChmKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBmID09PSBmaWVsZCB8fCBmLnN0YXJ0c1dpdGgoYCR7ZmllbGR9LmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgaXNJbnRlcm5hbF07XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKFxuICAgIHN1YnNldFJvd3M6IEVudGl0eVN1YnNldFJvd1tdLFxuICAgIHN1YnNldEtleTogc3RyaW5nLFxuICAgIGludGVybmFsOiBib29sZWFuID0gZmFsc2UsXG4gICk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBoYXNLZXkgPSBpbnRlcm5hbCA/IFwiaXNJbnRlcm5hbFwiIDogXCJoYXNcIjtcbiAgICByZXR1cm4gc3Vic2V0Um93c1xuICAgICAgLm1hcCgoc3Vic2V0Um93KSA9PiB7XG4gICAgICAgIGlmIChzdWJzZXRSb3cuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3cuY2hpbGRyZW4sIHN1YnNldEtleSwgaW50ZXJuYWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnNldFJvd1toYXNLZXldW3N1YnNldEtleV0pIHtcbiAgICAgICAgICByZXR1cm4gc3Vic2V0Um93LnByZWZpeGVzLmNvbmNhdChzdWJzZXRSb3cuZmllbGQpLmpvaW4oXCIuXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmZpbHRlcihub25OdWxsYWJsZSlcbiAgICAgIC5mbGF0KCk7XG4gIH1cblxuICBhc3luYyBjcmVhdGVQcm9wKHByb3A6IEVudGl0eVByb3AsIGF0PzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFhdCkge1xuICAgICAgdGhpcy5wcm9wcy5wdXNoKHByb3ApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb3BzLnNwbGljZShhdCwgMCwgcHJvcCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMuc2F2ZSgpO1xuICB9XG5cbiAgYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiB7XG4gICAgZW50aXR5SWQ6IHN0cmluZztcbiAgICBwcm9wTmFtZTogc3RyaW5nO1xuICB9W10ge1xuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKTtcblxuICAgIGxldCBlbnRpdHlJZCA9IHRoaXMuaWQ7XG4gICAgY29uc3QgcmVzdWx0OiB7XG4gICAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgICAgcHJvcE5hbWU6IHN0cmluZztcbiAgICB9W10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgcHJvcE5hbWUgPSBhcnJbaV07XG4gICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgIGVudGl0eUlkLFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBwcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKCFwcm9wKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRpdHlJZH3snZgg7J6Y66q765CcIOyEnOu4jOyFi+2CpCAke3N1YnNldEZpZWxkfWApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGVudGl0eUlkID0gcHJvcC53aXRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgYXN5bmMgbW9kaWZ5UHJvcChuZXdQcm9wOiBFbnRpdHlQcm9wLCBhdDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8g7J207KCEIO2UhOuhrSDsnbTrpoQg7KCA7J6lXG4gICAgY29uc3Qgb2xkTmFtZSA9IHRoaXMucHJvcHNbYXRdLm5hbWU7XG5cbiAgICAvLyDsoIDsnqXtlaAg7JeU7Yuw7YuwXG4gICAgY29uc3QgZW50aXRpZXM6IEVudGl0eVtdID0gW3RoaXNdO1xuXG4gICAgLy8g7J2066aE7J20IOuwlOuAkCDqsr3smrBcbiAgICBpZiAob2xkTmFtZSAhPT0gbmV3UHJvcC5uYW1lKSB7XG4gICAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsiJjsoJXrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7IiY7KCVXG4gICAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgICAgZm9yIChjb25zdCByZWxFbnRpdHlJZCBvZiBhbGxFbnRpdHlJZHMpIHtcbiAgICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiByZWxFbnRpdHlTdWJzZXRLZXlzKSB7XG4gICAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcblxuICAgICAgICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg7Iic7ZqM7ZWY66mwLCDsl5Tti7Dti7At7ZSE66GtIOuLqOychOuhnCDrtoTshJ3tlZwg7ZuEIO2YhOyerCDsl5Tti7Dti7At7ZSE66Gt6rO8IOydvOy5mO2VmOuKlCDqsr3smrAg7IiY7KCVIOyymOumrFxuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0Lm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IGFuYWx5emVkLm1hcCgoYSkgPT5cbiAgICAgICAgICAgICAgYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmEsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBuZXdQcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgOiBhLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIOu2hOyEne2VnCDtlYTrk5zrpbwg64uk7IucIOyEnOu4jOyFiyDtlYTrk5zroZwg67O16rWsXG4gICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQubWFwKChhKSA9PiBhLnByb3BOYW1lKS5qb2luKFwiLlwiKTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgICByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldID0gbW9kaWZpZWRTdWJzZXRGaWVsZHM7XG4gICAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyImOyglVxuICAgIHRoaXMucHJvcHNbYXRdID0gbmV3UHJvcDtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBhc3luYyBkZWxQcm9wKGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsoITssrQg7JeU7Yuw7Yuw7JeQ7IScIO2YhOyerCDsgq3soJzrkJwg7ZSE66Gt7J2EIOywuOyhsO2VmOqzoCDsnojripQg66qo65OgIOyEnOu4jOyFi+2VhOuTnCDssL7slYTshJwg7KCc7Jm4XG4gICAgY29uc3QgYWxsRW50aXR5SWRzID0gRW50aXR5TWFuYWdlci5nZXRBbGxJZHMoKTtcbiAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocmVsRW50aXR5SWQpO1xuICAgICAgY29uc3QgcmVsRW50aXR5U3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHJlbEVudGl0eS5zdWJzZXRzKTtcbiAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgY29uc3Qgc3Vic2V0ID0gcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XTtcbiAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsnbTtm4TsnZgg7ZWE65Oc66W8IOygnOyZuFxuICAgICAgICBjb25zdCBtb2RpZmllZFN1YnNldEZpZWxkcyA9IHN1YnNldFxuICAgICAgICAgIC5tYXAoKHN1YnNldEZpZWxkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhbmFseXplZCA9IHJlbEVudGl0eS5hbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQpO1xuICAgICAgICAgICAgaWYgKGFuYWx5emVkLmZpbmQoKGEpID0+IGEucHJvcE5hbWUgPT09IG9sZE5hbWUgJiYgYS5lbnRpdHlJZCA9PT0gdGhpcy5pZCkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gc3Vic2V0RmllbGQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcblxuICAgICAgICBpZiAoc3Vic2V0LmpvaW4oXCIsXCIpICE9PSBtb2RpZmllZFN1YnNldEZpZWxkcy5qb2luKFwiLFwiKSkge1xuICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICBlbnRpdGllcy5wdXNoKHJlbEVudGl0eSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtmITsnqwg7JeU7Yuw7Yuw7J2YIOyduOuNseyKpOyXkOyEnCDsoJzsmbhcbiAgICBmb3IgKGNvbnN0IGluZGV4IG9mIEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMuaWQpLmluZGV4ZXMpIHtcbiAgICAgIGluZGV4LmNvbHVtbnMgPSBpbmRleC5jb2x1bW5zLmZpbHRlcigoY29sKSA9PiBjb2wubmFtZSAhPT0gb2xkTmFtZSk7XG4gICAgfVxuXG4gICAgLy8g7ZSE66GtIOyCreygnFxuICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAxKTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKGVudGl0aWVzLm1hcChhc3luYyAoZW50aXR5KSA9PiBlbnRpdHkuc2F2ZSgpKSk7XG4gIH1cblxuICBnZXRFbnRpdHlJZEZyb21TdWJzZXRGaWVsZChzdWJzZXRGaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXN1YnNldEZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaWQ7XG4gICAgfVxuXG4gICAgLy8g7ISc67iM7IWLIO2VhOuTnOydmCDrp4jsp4Drp4nsnYAg7ZSE66Gt7J2066+A66GcIOygnOyZuFxuICAgIGNvbnN0IGFyciA9IHN1YnNldEZpZWxkLnNwbGl0KFwiLlwiKS5zbGljZSgwLCAtMSk7XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOuCtOugpOqwgOuptOyEnCDrp4jsp4Drp4nsnLzroZwgcmVsYXRpb27rkJwg7JeU7Yuw7Yuw66W8IOywvuydjFxuICAgIGNvbnN0IGxhc3RFbnRpdHlJZCA9IGFyci5yZWR1Y2UoKGVudGl0eUlkLCBmaWVsZCkgPT4ge1xuICAgICAgY29uc3QgcmVsUHJvcCA9IEVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKS5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IGZpZWxkKTtcbiAgICAgIGlmICghcmVsUHJvcCB8fCByZWxQcm9wLnR5cGUgIT09IFwicmVsYXRpb25cIikge1xuICAgICAgICBjb25zb2xlLmRlYnVnKHsgYXJyLCB0aGlzSWQ6IHRoaXMuaWQsIGVudGl0eUlkLCBmaWVsZCB9KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVsUHJvcC53aXRoO1xuICAgIH0sIHRoaXMuaWQpO1xuICAgIHJldHVybiBsYXN0RW50aXR5SWQ7XG4gIH1cblxuICBhc3luYyBtb3ZlUHJvcChhdDogbnVtYmVyLCB0bzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHJvcCA9IHRoaXMucHJvcHNbYXRdO1xuICAgIGNvbnN0IG5ld1Byb3BzID0gWy4uLnRoaXMucHJvcHNdO1xuICAgIG5ld1Byb3BzLnNwbGljZSh0bywgMCwgcHJvcCk7XG4gICAgbmV3UHJvcHMuc3BsaWNlKGF0IDwgdG8gPyBhdCA6IGF0ICsgMSwgMSk7XG4gICAgdGhpcy5wcm9wcyA9IG5ld1Byb3BzO1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICog7ZWE65Oc66qF7J2EIFwi7YWM7J2067iU66qFLu2VhOuTnOuqhVwiIO2YleyLneycvOuhnCDrs4DtmZhcbiAgICovXG4gIGdldEZ1bGxGaWVsZE5hbWUoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGZpZWxkLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy50YWJsZX0uJHtmaWVsZH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBpZCDtlYTrk5zsnZgg7YOA7J6F7J2EIOq4sOykgOycvOuhnCBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIuulvCDrsJjtmZjtlanri4jri6QuXG4gICAqL1xuICBnZXRQa1R5cGUoKTogXCJpbnRlZ2VyXCIgfCBcInN0cmluZ1wiIHwgXCJ1dWlkXCIge1xuICAgIGNvbnN0IGlkUHJvcCA9IHRoaXMucHJvcHNEaWN0LmlkO1xuICAgIGlmICghaWRQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVudGl0eSAke3RoaXMuaWR97JeQIGlkIO2VhOuTnOqwgCDsl4bsirXri4jri6RgKTtcbiAgICB9XG4gICAgaWYgKGlkUHJvcC50eXBlID09PSBcInN0cmluZ1wiIHx8IGlkUHJvcC50eXBlID09PSBcInV1aWRcIikge1xuICAgICAgcmV0dXJuIGlkUHJvcC50eXBlO1xuICAgIH1cbiAgICByZXR1cm4gXCJpbnRlZ2VyXCI7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIHByb3DsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBsZW5ndGgg65OxIOyEuOu2gCDsoJXrs7Tsl5Ag7KCR6re87ZWgIOuVjCDsgqzsmqntlanri4jri6QuXG4gICAqL1xuICBnZXRQa1Byb3AoKTogRW50aXR5UHJvcCB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICByZXR1cm4gaWRQcm9wO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXlO2LsO2LsOydmCBQSyDrsLDsl7Qg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogTG9hZGVyUXVlcnnsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLlxuICAgKi9cbiAgZ2V0UGtBcnJheVR5cGUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa1R5cGUgPSB0aGlzLmdldFBrVHlwZSgpO1xuICAgIHJldHVybiBwa1R5cGUgPT09IFwiaW50ZWdlclwiID8gXCJudW1iZXJbXVwiIDogXCJzdHJpbmdbXVwiO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FRc0MsWUFBQTtDQUNTLHFCQUFBO0NBY3hCLFdBQUE7Q0FhMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLENBQUM7RUFDTCxRQUVJLENBQUM7RUFDTCxhQUlJLENBQUM7RUFDTCxZQUVJLENBQUM7RUFDTCxjQUVJLENBQUM7RUFFTCxZQUFZLEVBQ1YsSUFDQSxVQUNBLE9BQ0EsT0FDQSxRQUNBLE1BQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDYTtHQUViLEtBQUssS0FBSztHQUNWLEtBQUssV0FBVztHQUNoQixLQUFLLFFBQVEsU0FBUyxLQUFLO0dBQzNCLEtBQUssUUFBUSxTQUFTLFdBQVcsV0FBVyxXQUFXLFVBQVUsRUFBRSxDQUFDO0dBQ3BFLEtBQUssU0FBUztHQUNkLEtBQUssT0FBTztHQUdaLElBQUksT0FBTztJQUNULEtBQUssUUFBUSxNQUFNLEtBQUssU0FBUztLQUMvQixJQUFJLFdBQVcsSUFBSSxHQUNqQjtVQUFJLEtBQUssR0FBRyxT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
824
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbnRpdHkvZW50aXR5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgd3JpdGVGaWxlIH0gZnJvbSBcImZzL3Byb21pc2VzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgZ3JvdXAsIHVuaXF1ZSB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuaW1wb3J0IHsgZm9ybWF0Q29kZSB9IGZyb20gXCIuLi9jb2RlLWZvcm1hdHRpbmdcIjtcbmltcG9ydCB7XG4gIGdldEVudW1EZWZWYWx1ZXMsXG4gIGdldFN1YnNldEZpZWxkcyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzRW51bVByb3AsXG4gIGlzSGFzTWFueVJlbGF0aW9uUHJvcCxcbiAgaXNJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNJbnRlcm5hbFN1YnNldEZpZWxkLFxuICBpc01hbnlUb01hbnlSZWxhdGlvblByb3AsXG4gIGlzTnVtYmVyU2luZ2xlUHJvcCxcbiAgaXNPbmVUb09uZVJlbGF0aW9uUHJvcCxcbiAgaXNSZWxhdGlvblByb3AsXG4gIGlzVmlydHVhbENvZGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBub3JtYWxpemVTdWJzZXRGaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQge1xuICB0eXBlIENvbmUsXG4gIHR5cGUgRW50aXR5Q3VzdG9tLFxuICB0eXBlIEVudGl0eUluZGV4LFxuICB0eXBlIEVudGl0eUpzb24sXG4gIHR5cGUgRW50aXR5UHJvcCxcbiAgdHlwZSBFbnRpdHlQcm9wTm9kZSxcbiAgdHlwZSBFbnRpdHlTdWJzZXRSb3csXG4gIHR5cGUgUmVsYXRpb25Qcm9wLFxuICB0eXBlIFN1YnNldEZpZWxkLFxuICB0eXBlIFN1YnNldFF1ZXJ5LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGltcG9ydE1lbWJlcnMgfSBmcm9tIFwiLi4vdXRpbHMvZXNtLXV0aWxzXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuaW1wb3J0IHsgYXNzZXJ0RGVmaW5lZCwgbm9uTnVsbGFibGUgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcblxudHlwZSBOZXN0ZWRTZWxlY3QgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IE5lc3RlZFNlbGVjdCB9O1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuL2VudGl0eS1tYW5hZ2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHkge1xuICBpZDogc3RyaW5nO1xuICBwYXJlbnRJZD86IHN0cmluZztcbiAgdGFibGU6IHN0cmluZztcbiAgdGl0bGU6IHN0cmluZztcbiAgY3VzdG9tPzogRW50aXR5Q3VzdG9tO1xuICBjb25lPzogQ29uZTtcbiAgbmFtZXM6IHtcbiAgICBwYXJlbnRGczogc3RyaW5nO1xuICAgIGZzOiBzdHJpbmc7XG4gICAgbW9kdWxlOiBzdHJpbmc7XG4gIH07XG4gIHByb3BzOiBFbnRpdHlQcm9wW107XG4gIHByb3BzRGljdDoge1xuICAgIFtrZXk6IHN0cmluZ106IEVudGl0eVByb3A7XG4gIH07XG4gIHJlbGF0aW9uczoge1xuICAgIFtrZXk6IHN0cmluZ106IFJlbGF0aW9uUHJvcDtcbiAgfTtcbiAgaW5kZXhlczogRW50aXR5SW5kZXhbXTtcbiAgc3Vic2V0czoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZ1tdO1xuICB9O1xuICBzdWJzZXRzSW50ZXJuYWw6IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgfTtcbiAgdHlwZXM6IHtcbiAgICBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55O1xuICB9ID0ge307XG4gIGVudW1zOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogei5ab2RFbnVtPFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+PjtcbiAgfSA9IHt9O1xuICBlbnVtTGFiZWxzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXToge1xuICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gIH0gPSB7fTtcbiAgZW51bUNvbmVzOiB7XG4gICAgW2VudW1JZDogc3RyaW5nXTogQ29uZTtcbiAgfSA9IHt9O1xuICBzdWJzZXRDb25lczoge1xuICAgIFtzdWJzZXRLZXk6IHN0cmluZ106IENvbmU7XG4gIH0gPSB7fTtcblxuICBjb25zdHJ1Y3Rvcih7XG4gICAgaWQsXG4gICAgcGFyZW50SWQsXG4gICAgdGFibGUsXG4gICAgdGl0bGUsXG4gICAgY3VzdG9tLFxuICAgIGNvbmUsXG4gICAgcHJvcHMsXG4gICAgaW5kZXhlcyxcbiAgICBzdWJzZXRzLFxuICAgIGVudW1zLFxuICB9OiBFbnRpdHlKc29uKSB7XG4gICAgLy8gaWRcbiAgICB0aGlzLmlkID0gaWQ7XG4gICAgdGhpcy5wYXJlbnRJZCA9IHBhcmVudElkO1xuICAgIHRoaXMudGl0bGUgPSB0aXRsZSA/PyB0aGlzLmlkO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZSA/PyBpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaW5mbGVjdGlvbi5wbHVyYWxpemUoaWQpKTtcbiAgICB0aGlzLmN1c3RvbSA9IGN1c3RvbTtcbiAgICB0aGlzLmNvbmUgPSBjb25lO1xuXG4gICAgLy8gcHJvcHNcbiAgICBpZiAocHJvcHMpIHtcbiAgICAgIHRoaXMucHJvcHMgPSBwcm9wcy5tYXAoKHByb3ApID0+IHtcbiAgICAgICAgaWYgKGlzRW51bVByb3AocHJvcCkpIHtcbiAgICAgICAgICBpZiAocHJvcC5pZC5pbmNsdWRlcyhcIiRNb2RlbFwiKSkge1xuICAgICAgICAgICAgcHJvcC5pZCA9IHByb3AuaWQucmVwbGFjZShcIiRNb2RlbFwiLCBpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnByb3BzRGljdCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgcHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtwcm9wLm5hbWUsIHByb3BdO1xuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8vIHJlbGF0aW9uc1xuICAgICAgdGhpcy5yZWxhdGlvbnMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIHByb3BzLmZpbHRlcigocHJvcCkgPT4gaXNSZWxhdGlvblByb3AocHJvcCkpLm1hcCgocHJvcCkgPT4gW3Byb3AubmFtZSwgcHJvcF0pLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wcyA9IFtdO1xuICAgICAgdGhpcy5wcm9wc0RpY3QgPSB7fTtcbiAgICAgIHRoaXMucmVsYXRpb25zID0ge307XG4gICAgfVxuXG4gICAgLy8gaW5kZXhlc1xuICAgIHRoaXMuaW5kZXhlcyA9IGluZGV4ZXMgPz8gW107XG5cbiAgICAvLyBzdWJzZXRzOiBTdWJzZXREZWbsl5DshJwgU3Vic2V0RmllbGRbXeulvCDstpTstpztlZjsl6wgc3Vic2V0cyjsnbzrsJgp7JmAIHN1YnNldHNJbnRlcm5hbChpbnRlcm5hbCnroZwg67aE66asXG4gICAgdGhpcy5zdWJzZXRzID0ge307XG4gICAgdGhpcy5zdWJzZXRzSW50ZXJuYWwgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHN1YnNldERlZl0gb2YgT2JqZWN0LmVudHJpZXMoc3Vic2V0cyA/PyB7fSkpIHtcbiAgICAgIGNvbnN0IGZpZWxkcyA9IGdldFN1YnNldEZpZWxkcyhzdWJzZXREZWYpO1xuICAgICAgdGhpcy5zdWJzZXRzW2tleV0gPSBmaWVsZHMuZmlsdGVyKChmKSA9PiAhaXNJbnRlcm5hbFN1YnNldEZpZWxkKGYpKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuICAgICAgdGhpcy5zdWJzZXRzSW50ZXJuYWxba2V5XSA9IGZpZWxkcy5maWx0ZXIoaXNJbnRlcm5hbFN1YnNldEZpZWxkKS5tYXAobm9ybWFsaXplU3Vic2V0RmllbGQpO1xuXG4gICAgICAvLyBjb25lIOy2lOy2nFxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN1YnNldERlZikgJiYgXCJjb25lXCIgaW4gc3Vic2V0RGVmICYmIHN1YnNldERlZi5jb25lKSB7XG4gICAgICAgIHRoaXMuc3Vic2V0Q29uZXNba2V5XSA9IHN1YnNldERlZi5jb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVudW1zOiBFbnVtRGVm7JeQ7IScIHZhbHVlc+yZgCBjb25l66W8IOy2lOy2nO2VmOyXrCDsspjrpqxcbiAgICB0aGlzLmVudW1MYWJlbHMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBPYmplY3QuZW50cmllcyhlbnVtcyA/PyB7fSkubWFwKChba2V5LCBlbnVtRGVmXSkgPT4ge1xuICAgICAgICAvLyBjb25lIOy2lOy2nFxuICAgICAgICBpZiAoXCJ2YWx1ZXNcIiBpbiBlbnVtRGVmICYmIFwiY29uZVwiIGluIGVudW1EZWYgJiYgZW51bURlZi5jb25lKSB7XG4gICAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgICAgdGhpcy5lbnVtQ29uZXNba2V5XSA9IGVudW1EZWYuY29uZSBhcyBDb25lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5LCBnZXRFbnVtRGVmVmFsdWVzKGVudW1EZWYpXTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgdGhpcy5lbnVtcyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuZW51bUxhYmVscykubWFwKChba2V5LCBlbnVtTGFiZWxdKSA9PiB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICByZXR1cm4gW2tleSwgei5lbnVtKE9iamVjdC5rZXlzKGVudW1MYWJlbCkpXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBuYW1lc1xuICAgIHRoaXMubmFtZXMgPSB7XG4gICAgICBwYXJlbnRGczogaW5mbGVjdGlvbi5kYXNoZXJpemUoaW5mbGVjdGlvbi51bmRlcnNjb3JlKHBhcmVudElkID8/IGlkKSkudG9Mb3dlckNhc2UoKSxcbiAgICAgIGZzOiBpbmZsZWN0aW9uLmRhc2hlcml6ZShpbmZsZWN0aW9uLnVuZGVyc2NvcmUoaWQpKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgbW9kdWxlOiBpZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIOy/vOumrOyaqSDshJzruIzshYsg7ZWE65Oc66W8IOuwmO2ZmO2VqeuLiOuLpCAoc3Vic2V0cyArIHN1YnNldHNJbnRlcm5hbCDtlansuagpXG4gICAqL1xuICBnZXRTdWJzZXRGaWVsZHNGb3JRdWVyeShzdWJzZXRLZXk6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWy4uLih0aGlzLnN1YnNldHNbc3Vic2V0S2V5XSA/PyBbXSksIC4uLih0aGlzLnN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdKV07XG4gIH1cblxuICAvKipcbiAgICog7KO87Ja07KeEIOydtOumhChzdWJzZXRLZXkp7J2YIHN1YnNldOydhCDsi6TsoJzroZwg6rCA7KC47Jik64qUIFB1cmkg7L2U65OcIOq1rO2YhOyytCBzdHJpbmfsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0UHVyaVN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdWJzZXQgPSB0aGlzLmdldFN1YnNldEZpZWxkc0ZvclF1ZXJ5KHN1YnNldEtleSk7XG4gICAgY29uc3Qgc3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAvLyBmcm9tXG4gICAgbGluZXMucHVzaChgcmV0dXJuIHFiV3JhcHBlcmApO1xuICAgIGxpbmVzLnB1c2goYC5mcm9tKFwiJHt0aGlzLnRhYmxlfVwiKWApO1xuXG4gICAgLy8gam9pblxuICAgIGZvciAoY29uc3Qgam9pbiBvZiBzdWJzZXRRdWVyeS5qb2lucykge1xuICAgICAgLy8gam9pbiDrqZTshJzrk5wg6rKw7KCVOiBpbm5lciDihpIgam9pbiwgb3V0ZXIg4oaSIGxlZnRKb2luXG4gICAgICAvLyBGSyBudWxsYWJsZSDsl6zrtoDripQgbGVmdEpvaW4g7YOA7J6FIOyLnOq3uOuLiOyymOyXkOyEnCDsnpDrj5nsnLzroZwg7YyQ64uo65CoXG4gICAgICBjb25zdCBqb2luTWV0aG9kID0gam9pbi5qb2luID09PSBcImlubmVyXCIgPyBcImpvaW5cIiA6IFwibGVmdEpvaW5cIjtcblxuICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgcmF3IOyCrOyaqVxuICAgICAgICBsaW5lcy5wdXNoKFxuICAgICAgICAgIGAuJHtqb2luTWV0aG9kfSh7ICR7am9pbi5hc306IFwiJHtqb2luLnRhYmxlfVwiIH0sIHFiV3JhcHBlci5rbmV4LnJhdyhcXGAke2pvaW4uY3VzdG9tfVxcYCkpYCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxpbmVzLnB1c2goYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgXCIke2pvaW4uZnJvbX1cIiwgXCIke2pvaW4udG99XCIpYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2VsZWN0IC0g7J6F7LK07KCBIOq1rOyhsOuhnCDsg53shLFcbiAgICBjb25zdCBzZWxlY3RPYmogPSB0aGlzLmJ1aWxkTmVzdGVkU2VsZWN0T2JqZWN0KHN1YnNldFF1ZXJ5LnNlbGVjdCk7XG4gICAgbGluZXMucHVzaChgLnNlbGVjdCgke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHNlbGVjdE9iail9KTtgKTtcblxuICAgIHJldHVybiBsaW5lcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgLyoqXG4gICAqICouZW50aXR5Lmpzb27snZggc3Vic2V07JeQIOuTpOyWtOyeiOuKlCDtlYTrk5wg67Cw7Je07J2EIOuwm+yVhOyEnCxcbiAgICogUHVyaeydmCBTZWxlY3RPYmplY3Qg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICog7JiIOiBbXCJ1c2Vycy5pZFwiLCBcInBhcmVudC5pZFwiLCBcInBhcmVudC5uYW1lXCJdXG4gICAqICAg4oaSIHsgaWQ6IFwidXNlcnMuaWRcIiwgcGFyZW50OiB7IGlkOiBcInBhcmVudC5pZFwiLCBuYW1lOiBcInBhcmVudC5uYW1lXCIgfSB9XG4gICAqXG4gICAqIOyWuOuNlOuwlOqwgCDslYTri4wg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlajsl5Ag7Jyg7J2Y7ZWY7IS47JqULlxuICAgKiDsnbTroIfqsowg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZjsl6wgc2VsZWN07JeQIOuEmOqyqOyjvOuptCBQYXJzZVNlbGVjdE9iamVjdCDtg4DsnoXsnbQgam9pbuuQnCDqsJ3ssrTsnZgg7YOA7J6F7J2EIOyemCDsnqHslYTspIQg7IiYIOyeiOyKteuLiOuLpC5cbiAgICog7KaJLCBlbmhhbmNlcuyXkOyEnCByb3frpbwg67Cb7JWY7J2EIOuVjCBoeWRyYXRl65CcIOqwneyytCDsnpDssrTsnZggbnVsbGl0eeyZgCDqt7gg7JWI7Kq9IO2VhOuTnOydmCBudWxsaXR56rCAIGZrIG51bGxhYmxlIOyXrOu2gOyXkCDrlLDrnbwg7J6YIOy2lOuhoOuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGROZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0SXRlbXM6IHN0cmluZ1tdKTogTmVzdGVkU2VsZWN0IHtcbiAgICBjb25zdCByZXN1bHQ6IE5lc3RlZFNlbGVjdCA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBzZWxlY3RJdGVtIG9mIHNlbGVjdEl0ZW1zKSB7XG4gICAgICAvLyBcInVzZXJzLmlkXCIg65iQ64qUIFwidXNlcnMuaWQgYXMgdXNlcl9faWRcIiDtmJXtg5wg7YyM7IuxXG4gICAgICBjb25zdCBtYXRjaCA9IHNlbGVjdEl0ZW0ubWF0Y2goL14oLis/KSg/OiBhcyAoLispKT8kLyk7XG4gICAgICBpZiAoIW1hdGNoKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgWywgY29sdW1uLCBhbGlhc10gPSBtYXRjaDtcbiAgICAgIGNvbnN0IGNvbHVtblZhbHVlID0gYFwiJHtjb2x1bW4udHJpbSgpfVwiYDtcblxuICAgICAgaWYgKCFhbGlhcyB8fCAhYWxpYXMuaW5jbHVkZXMoXCJfX1wiKSkge1xuICAgICAgICAvLyBhbGlhc+qwgCDsl4bqsbDrgpggX1/rpbwg7Y+s7ZWo7ZWY7KeAIOyViuycvOuptCDstZzsg4HsnIQg7ZWE65OcXG4gICAgICAgIGNvbnN0IGtleSA9IGFsaWFzID8/IGFzc2VydERlZmluZWQoY29sdW1uLnNwbGl0KFwiLlwiKS5wb3AoKSk7XG4gICAgICAgIHJlc3VsdFtrZXldID0gY29sdW1uVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhbGlhc+qwgCBfX+ulvCDtj6ztlajtlZjrqbQg7J6F7LK0IOq1rOyhsOuhnCDqt7jro7ntmZRcbiAgICAgICAgY29uc3QgcGFydHMgPSBhbGlhcy5zcGxpdChcIl9fXCIpO1xuICAgICAgICBsZXQgY3VycmVudCA9IHJlc3VsdDtcblxuICAgICAgICAvLyDrp4jsp4Drp4kg7YyM7Yq4IOyghOq5jOyngCDspJHssqkg6rCd7LK0IOyDneyEsVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0c1tpXTtcbiAgICAgICAgICBpZiAocGFydCBpbiBjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShjdXJyZW50W3BhcnRdKSkge1xuICAgICAgICAgICAgICAvLyDsnoXroKXsnbQgW1widXNlclwiLCBcInVzZXJfX2lkXCJdIOqwmeydgCDqsr3smrAhXG4gICAgICAgICAgICAgIC8vIOyVoOy0iOyXkCDrp5Drj4Qg7JWIIOuQmOyngOunjCDslYjsoITtlZjqsowg7JiI7Jm466W8IOuNmOynkeuLiOuLpC5cbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBDb25mbGljdCBkZXRlY3RlZCBpbiBzZWxlY3QgaXRlbXM6IHBhcmVudCBwYXRoIFwiJHtwYXJ0cy5zbGljZSgwLCBpICsgMSkuam9pbihcIl9fXCIpfVwiIGlzIGFscmVhZHkgc2V0IGFzIGEgZmllbGQsIGNhbm5vdCBuZXN0IFwiJHthbGlhc31cIiB1bmRlciBpdC5gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50W3BhcnRdID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhcnRdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g66eI7KeA66eJIO2MjO2KuOyXkCDqsJIg7ISk7KCVXG4gICAgICAgIGNvbnN0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07XG4gICAgICAgIGN1cnJlbnRbbGFzdFBhcnRdID0gY29sdW1uVmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhyZXN1bHQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OLnN0cmluZ2lmeeyZgCDsnKDsgqztlZwg7J287J2EIO2VqeuLiOuLpC5cbiAgICog64uk66eMIOyjvOyWtOynhCDqsJ3ssrTrpbwgSlNPTuydtCDslYTri4wgVHlwZVNjcmlwdCDqsJ3ssrQg66as7YSw65+0IOyKpO2KuOungeycvOuhnCDrp4zrk6TslrTspI3ri4jri6QuXG4gICAqIGtleeyXkCDrlLDsmLTtkZzqsIAg7JeG7Ja07JqULlxuICAgKiDstpzroKUg7JiI7IucOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHtcbiAgICogICBpZDogXCJ1c2Vycy5pZFwiLFxuICAgKiAgIHBhcmVudDoge1xuICAgKiAgICAgaWQ6IFwicGFyZW50LmlkXCIsXG4gICAqICAgICBuYW1lOiBcInBhcmVudC5uYW1lXCIsXG4gICAqICAgfSxcbiAgICogfVxuICAgKiBgYGBcbiAgICogQHBhcmFtIG9iaiDrs4DtmZjtlaAg6rCd7LK0XG4gICAqIEBwYXJhbSBpbmRlbnQg65Ok7Jes7JOw6riwIOugiOuyqFxuICAgKiBAcGFyYW0gd2l0aEJyYWNlcyB0cnVl66m0IOykkeq0hO2YuCDtj6ztlagsIGZhbHNl66m0IOuCtOyaqeunjCDrsJjtmZhcbiAgICovXG4gIHByaXZhdGUgc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KFxuICAgIG9iajogTmVzdGVkU2VsZWN0LFxuICAgIGluZGVudDogbnVtYmVyID0gMCxcbiAgICB3aXRoQnJhY2VzOiBib29sZWFuID0gdHJ1ZSxcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBzcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCk7XG4gICAgY29uc3QgaW5uZXJTcGFjZXMgPSBcIiAgXCIucmVwZWF0KGluZGVudCArIDEpO1xuXG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKG9iaik7XG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID09PSAwKSByZXR1cm4gd2l0aEJyYWNlcyA/IFwie31cIiA6IFwiXCI7XG5cbiAgICBjb25zdCBsaW5lcyA9IGVudHJpZXMubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAvLyDsu6zrn7wg6rK966GcICjsnbTrr7gg65Sw7Ji07ZGcIO2PrO2VqClcbiAgICAgICAgcmV0dXJuIGAke2lubmVyU3BhY2VzfSR7a2V5fTogJHt2YWx1ZX0sYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIOykkeyyqSDqsJ3ssrQgKO2VreyDgSDspJHqtITtmLgg7Y+s7ZWoKVxuICAgICAgICByZXR1cm4gYCR7aW5uZXJTcGFjZXN9JHtrZXl9OiAke3RoaXMuc3RyaW5naWZ5TmVzdGVkU2VsZWN0T2JqZWN0KHZhbHVlLCBpbmRlbnQgKyAxLCB0cnVlKX0sYDtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICh3aXRoQnJhY2VzKSB7XG4gICAgICByZXR1cm4gYHtcXG4ke2xpbmVzLmpvaW4oXCJcXG5cIil9XFxuJHtzcGFjZXN9fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOykkeq0hO2YuCDsl4bsnbQg64K07Jqp66eMIOuwmO2ZmCAo7JWe65KkIOqwnO2WiSDsoJzsmbgpXG4gICAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgICB9XG4gIH1cblxuICBnZXRQdXJpTG9hZGVyUXVlcnkoc3Vic2V0S2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcbiAgICBjb25zdCB7IGxvYWRlcnMgfSA9IHRoaXMucmVzb2x2ZVN1YnNldFF1ZXJ5KFwiXCIsIHN1YnNldCk7XG5cbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbYFtgXTtcblxuICAgIC8vIOyerOq3gOyggeycvOuhnCBsb2FkZXIg7IOd7ISx7ZWY64qUIO2XrO2NvCDtlajsiJhcbiAgICBjb25zdCBnZW5lcmF0ZUxvYWRlckNvZGUgPSAobmVzdGVkTG9hZGVyczogU3Vic2V0UXVlcnlbXCJsb2FkZXJzXCJdKTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3QgbG9hZGVyTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgIGZvciAoY29uc3QgbG9hZGVyIG9mIG5lc3RlZExvYWRlcnMpIHtcbiAgICAgICAgY29uc3QgeyB0b1RhYmxlLCB0b0NvbCwgdGhyb3VnaCwgZnJvbVRhYmxlLCBmcm9tQ29sIH0gPSBsb2FkZXIubWFueUpvaW47XG5cbiAgICAgICAgLy8gZnJvbUlkc+uKlCDrtoDrqqgg7ZaJ7JeQ7IScIOq6vOuCuCBmcm9tQ29sIOqwkuydtOuvgOuhnCDqt7gg7Lm47J2YIO2DgOyeheydhCDrlLDrpbjri6QoZnJvbUNvbHVtbuydtCBQS+qwgCDslYTri5Ag7IiYIOyeiOydjCkuXG4gICAgICAgIGNvbnN0IGZyb21JZHNUeXBlID0gRW50aXR5TWFuYWdlci5nZXRCeVRhYmxlKGZyb21UYWJsZSkuZ2V0Q29sdW1uQXJyYXlUeXBlKGZyb21Db2wpO1xuXG4gICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgXCJ7XCIsXG4gICAgICAgICAgYGFzOiBcIiR7bG9hZGVyLmFzfVwiLGAsXG4gICAgICAgICAgYHJlZklkOiBcIiR7bG9hZGVyLm1hbnlKb2luLmlkRmllbGR9XCIsYCxcbiAgICAgICAgICBgcWI6IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPiwgZnJvbUlkczogbnVtYmVyW10gfCBzdHJpbmdbXSkgPT4ge2AsXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRocm91Z2ggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIEhhc01hbnlcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0b1RhYmxlfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3RvVGFibGV9LiR7dG9Db2x9XCJgO1xuICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICBgLndoZXJlSW4oXCIke3RvVGFibGV9LiR7dG9Db2x9XCIsIGZyb21JZHMgYXMgJHtmcm9tSWRzVHlwZX0pYCxcbiAgICAgICAgICAgIGAuc2VsZWN0KCR7dGhpcy5zdHJpbmdpZnlOZXN0ZWRTZWxlY3RPYmplY3Qoc2VsZWN0T2JqKX0pO2AsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBNYW55VG9NYW55XG4gICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgIFwicmV0dXJuIHFiV3JhcHBlclwiLFxuICAgICAgICAgICAgYC5mcm9tKFwiJHt0aHJvdWdoLnRhYmxlfVwiKWAsXG4gICAgICAgICAgICBgLmpvaW4oXCIke3RvVGFibGV9XCIsIFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2gudG9Db2x9XCIsIFwiJHt0b1RhYmxlfS4ke3RvQ29sfVwiKWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGxvYWRlci5vbmVKb2lucy5mb3JFYWNoKChqb2luOiBTdWJzZXRRdWVyeVtcImpvaW5zXCJdW251bWJlcl0pID0+IHtcbiAgICAgICAgICAgIC8vIEZLIG51bGxhYmxlIOyXrOu2gOuKlCBsZWZ0Sm9pbiDtg4DsnoUg7Iuc6re464uI7LKY7JeQ7IScIOyekOuPmeycvOuhnCDtjJDri6jrkKhcbiAgICAgICAgICAgIGNvbnN0IGpvaW5NZXRob2QgPSBqb2luLmpvaW4gPT09IFwiaW5uZXJcIiA/IFwiam9pblwiIDogXCJsZWZ0Sm9pblwiO1xuICAgICAgICAgICAgaWYgKFwiY3VzdG9tXCIgaW4gam9pbikge1xuICAgICAgICAgICAgICAvLyBjdXN0b20gam9pbiBjbGF1c2XripQgY2FsbGJhY2sg7ZiV7YOc7J2YIG9uIOuplOyEnOuTnOuhnCDsspjrpqztlanri4jri6QuXG4gICAgICAgICAgICAgIGxvYWRlckxpbmVzLnB1c2goXG4gICAgICAgICAgICAgICAgYC4ke2pvaW5NZXRob2R9KHsgJHtqb2luLmFzfTogXCIke2pvaW4udGFibGV9XCIgfSwgKGopID0+IHtgLFxuICAgICAgICAgICAgICAgIGBqLm9uKFB1cmkucmF3U3RyaW5nKFwiJHtqb2luLmN1c3RvbX1cIikpO2AsXG4gICAgICAgICAgICAgICAgXCJ9KVwiLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9hZGVyTGluZXMucHVzaChcbiAgICAgICAgICAgICAgICBgLiR7am9pbk1ldGhvZH0oeyAke2pvaW4uYXN9OiBcIiR7am9pbi50YWJsZX1cIiB9LCBcIiR7am9pbi5mcm9tfVwiLCBcIiR7am9pbi50b31cIilgLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8g7J6F7LK07KCBIHNlbGVjdCDqtazsobAg7IOd7ISxIChyZWZJZCDtj6ztlagpXG4gICAgICAgICAgY29uc3Qgc2VsZWN0T2JqID0gdGhpcy5idWlsZE5lc3RlZFNlbGVjdE9iamVjdChsb2FkZXIuc2VsZWN0KTtcbiAgICAgICAgICBzZWxlY3RPYmoucmVmSWQgPSBgXCIke3Rocm91Z2gudGFibGV9LiR7dGhyb3VnaC5mcm9tQ29sfVwiYDtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFxuICAgICAgICAgICAgYC53aGVyZUluKFwiJHt0aHJvdWdoLnRhYmxlfS4ke3Rocm91Z2guZnJvbUNvbH1cIiwgZnJvbUlkcyBhcyAke2Zyb21JZHNUeXBlfSlgLFxuICAgICAgICAgICAgYC5zZWxlY3QoJHt0aGlzLnN0cmluZ2lmeU5lc3RlZFNlbGVjdE9iamVjdChzZWxlY3RPYmopfSk7YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChgfSxgKTtcblxuICAgICAgICAvLyDspJHssqkgbG9hZGVycyDsspjrpqxcbiAgICAgICAgaWYgKGxvYWRlci5sb2FkZXJzICYmIGxvYWRlci5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBsb2FkZXJMaW5lcy5wdXNoKFwibG9hZGVyczogW1wiLCAuLi5nZW5lcmF0ZUxvYWRlckNvZGUobG9hZGVyLmxvYWRlcnMpLCBcIl0sXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9hZGVyTGluZXMucHVzaChcIn0sXCIpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbG9hZGVyTGluZXM7XG4gICAgfTtcblxuICAgIGxpbmVzLnB1c2goLi4uZ2VuZXJhdGVMb2FkZXJDb2RlKGxvYWRlcnMpKTtcbiAgICBsaW5lcy5wdXNoKGBdYCk7XG5cbiAgICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qXG4gICAgc3Vic2V0IFNFTEVDVC9KT0lOL0xPQURFUiDqsrDqs7wg66as7YS0XG4gICovXG4gIGdldFN1YnNldFF1ZXJ5KHN1YnNldEtleTogc3RyaW5nKTogU3Vic2V0UXVlcnkge1xuICAgIGNvbnN0IHN1YnNldCA9IHRoaXMuZ2V0U3Vic2V0RmllbGRzRm9yUXVlcnkoc3Vic2V0S2V5KTtcblxuICAgIGNvbnN0IHJlc3VsdDogU3Vic2V0UXVlcnkgPSB0aGlzLnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCBzdWJzZXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuICAgKi9cbiAgcmVzb2x2ZVN1YnNldFF1ZXJ5KFxuICAgIHByZWZpeDogc3RyaW5nLFxuICAgIGZpZWxkczogc3RyaW5nW10sXG4gICAgaXNBbHJlYWR5T3V0ZXJKb2luZWQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogU3Vic2V0UXVlcnkge1xuICAgIC8vIHByZWZpeCDsuZjtmZggKHByZWZpeOuKlCBUb09uZVJlbGF0aW9u7J20IOuzteyImOuhnCDrtpnsnYAg6rK97JqwIOuqqOuRkCBfX+uhnCDrs4Dqsr3rkKgpXG4gICAgcHJlZml4ID0gcHJlZml4LnJlcGxhY2UoL1xcLi9nLCBcIl9fXCIpO1xuXG4gICAgLy8g7ISc67iM7IWL7J2EIDHrjoHsiqTrp4wg67aE66as7ZWY7JesIOq3uOujue2VkVxuICAgIGNvbnN0IHN1YnNldEdyb3VwID0gZ3JvdXAoZmllbGRzLCAoZmllbGQpID0+IHtcbiAgICAgIGlmIChmaWVsZC5pbmNsdWRlcyhcIi5cIikpIHtcbiAgICAgICAgY29uc3QgW3JlbF0gPSBmaWVsZC5zcGxpdChcIi5cIik7XG4gICAgICAgIHJldHVybiByZWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5rZXlzKHN1YnNldEdyb3VwKS5yZWR1Y2UoXG4gICAgICAociwgZ3JvdXBLZXkpID0+IHtcbiAgICAgICAgY29uc3QgZ3JvdXBlZEZpZWxkcyA9IHN1YnNldEdyb3VwW2dyb3VwS2V5XTtcbiAgICAgICAgYXNzZXJ0KGdyb3VwZWRGaWVsZHMgIT09IHVuZGVmaW5lZCwgXCJmaWVsZHMgaXMgdW5kZWZpbmVkXCIpO1xuXG4gICAgICAgIC8vIO2YhOyerCDthYzsnbTruJQg7ZWE65Oc7IWL7J2AIHNlbGVjdCwgdmlydHVhbOyXkCDstpTqsIDtlZjqs6Ag66as7YS0XG4gICAgICAgIGlmIChncm91cEtleSA9PT0gXCJcIikge1xuICAgICAgICAgIGNvbnN0IHJlYWxGaWVsZHMgPSBncm91cGVkRmllbGRzLmZpbHRlcigoZmllbGQpID0+ICFpc1ZpcnR1YWxQcm9wKHRoaXMucHJvcHNEaWN0W2ZpZWxkXSkpO1xuICAgICAgICAgIC8vIHZpcnR1YWxUeXBlOiBcImNvZGVcIiAo65iQ64qUIHVuZGVmaW5lZCnsnbggdmlydHVhbCBwcm9w66eMIHIudmlydHVhbOyXkCDstpTqsIBcbiAgICAgICAgICAvLyB2aXJ0dWFsVHlwZTogXCJxdWVyeVwi7J24IOqyveyasCDsgqzsmqnsnpDqsIAgYXBwZW5kU2VsZWN066GcIOyngeygkSDstpTqsIDtlZjrr4DroZwg7KCc7Jm4XG4gICAgICAgICAgY29uc3QgdmlydHVhbENvZGVGaWVsZHMgPSBncm91cGVkRmllbGRzLmZpbHRlcigoZmllbGQpID0+XG4gICAgICAgICAgICBpc1ZpcnR1YWxDb2RlUHJvcCh0aGlzLnByb3BzRGljdFtmaWVsZF0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAocHJlZml4ID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyDtmITsnqwg7YWM7J2067iU7J24IOqyveyasFxuICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVhbEZpZWxkcy5tYXAoKGZpZWxkKSA9PiB0aGlzLmdldEZ1bGxGaWVsZE5hbWUoZmllbGQpKSk7XG4gICAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHZpcnR1YWxDb2RlRmllbGRzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8g64SY7Ja07JioIO2FjOydtOu4lOyduCDqsr3smrBcbiAgICAgICAgICAgIHIuc2VsZWN0ID0gci5zZWxlY3QuY29uY2F0KFxuICAgICAgICAgICAgICByZWFsRmllbGRzLm1hcCgoZmllbGQpID0+IGAke3ByZWZpeH0uJHtmaWVsZH0gYXMgJHtwcmVmaXh9X18ke2ZpZWxkfWApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlbGF0aW9uID0gdGhpcy5yZWxhdGlvbnNbZ3JvdXBLZXldO1xuICAgICAgICBpZiAocmVsYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCByZWxhdGlvbiDssLjsobAgJHtncm91cEtleX1gKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxhdGlvbi53aXRoKTtcblxuICAgICAgICBpZiAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChyZWxhdGlvbikgfHwgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbjogSk9JTiDsnLzroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuXG4gICAgICAgICAgLy8gLU9uZSBSZWxhdGlvbuyXkOyEnCBpZCDtlYTrk5zrp4wg7LC47KGw7ZWY64qUIOqyveyasCDrprTroIjsnbTshZgg64SY6riw7KeAIOyViuqzoCDrpqzthLRcbiAgICAgICAgICBpZiAocmVsRmllbGRzLmxlbmd0aCA9PT0gMSAmJiByZWxGaWVsZHNbMF0gPT09IFwiaWRcIikge1xuICAgICAgICAgICAgaWYgKHByZWZpeCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICByLnNlbGVjdCA9IHIuc2VsZWN0LmNvbmNhdChgJHt0aGlzLnRhYmxlfS4ke2dyb3VwS2V5fV9pZGApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQoYCR7cHJlZml4fS4ke2dyb3VwS2V5fV9pZCBhcyAke3ByZWZpeH1fXyR7Z3JvdXBLZXl9X2lkYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpbm5lck9yT3V0ZXJcbiAgICAgICAgICBjb25zdCBpbm5lck9yT3V0ZXIgPSAoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzQWxyZWFkeU91dGVySm9pbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBcIm91dGVyXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgICBpZiAocmVsYXRpb24uaGFzSm9pbkNvbHVtbiAmJiAhKHJlbGF0aW9uLm51bGxhYmxlID8/IGZhbHNlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcImlubmVyXCI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgaWYgKHJlbGF0aW9uLm51bGxhYmxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFwib3V0ZXJcIjtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJpbm5lclwiO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkoKTtcbiAgICAgICAgICBjb25zdCByZWxTdWJzZXRRdWVyeSA9IHJlbEVudGl0eS5yZXNvbHZlU3Vic2V0UXVlcnkoXG4gICAgICAgICAgICBgJHtwcmVmaXggIT09IFwiXCIgPyBgJHtwcmVmaXh9LmAgOiBcIlwifSR7Z3JvdXBLZXl9YCxcbiAgICAgICAgICAgIHJlbEZpZWxkcyxcbiAgICAgICAgICAgIGlubmVyT3JPdXRlciA9PT0gXCJvdXRlclwiLFxuICAgICAgICAgICk7XG4gICAgICAgICAgci5zZWxlY3QgPSByLnNlbGVjdC5jb25jYXQocmVsU3Vic2V0UXVlcnkuc2VsZWN0KTtcbiAgICAgICAgICByLnZpcnR1YWwgPSByLnZpcnR1YWwuY29uY2F0KHJlbFN1YnNldFF1ZXJ5LnZpcnR1YWwpO1xuXG4gICAgICAgICAgY29uc3Qgam9pbkFzID0gcHJlZml4ID09PSBcIlwiID8gZ3JvdXBLZXkgOiBgJHtwcmVmaXh9X18ke2dyb3VwS2V5fWA7XG4gICAgICAgICAgY29uc3QgZnJvbVRhYmxlID0gcHJlZml4ID09PSBcIlwiID8gdGhpcy50YWJsZSA6IHByZWZpeDtcblxuICAgICAgICAgIGxldCBqb2luQ2xhdXNlOlxuICAgICAgICAgICAgfCB7XG4gICAgICAgICAgICAgICAgZnJvbTogc3RyaW5nO1xuICAgICAgICAgICAgICAgIHRvOiBzdHJpbmc7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHwge1xuICAgICAgICAgICAgICAgIGN1c3RvbTogc3RyaW5nO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChyZWxhdGlvbi5jdXN0b21Kb2luQ2xhdXNlKSB7XG4gICAgICAgICAgICBqb2luQ2xhdXNlID0ge1xuICAgICAgICAgICAgICBjdXN0b206IHJlbGF0aW9uLmN1c3RvbUpvaW5DbGF1c2UsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICAgIGlmIChyZWxhdGlvbi5oYXNKb2luQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgZnJvbSA9IGAke2Zyb21UYWJsZX0uJHtyZWxhdGlvbi5uYW1lfV9pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LmlkYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gYCR7ZnJvbVRhYmxlfS5pZGA7XG4gICAgICAgICAgICAgICAgdG8gPSBgJHtqb2luQXN9LiR7aW5mbGVjdGlvbi51bmRlcnNjb3JlKHRoaXMubmFtZXMuZnMucmVwbGFjZSgvLS9nLCBcIl9cIikpfV9pZGA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBgJHtmcm9tVGFibGV9LiR7cmVsYXRpb24ubmFtZX1faWRgO1xuICAgICAgICAgICAgICB0byA9IGAke2pvaW5Bc30uaWRgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgam9pbkNsYXVzZSA9IHtcbiAgICAgICAgICAgICAgZnJvbSxcbiAgICAgICAgICAgICAgdG8sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMucHVzaCh7XG4gICAgICAgICAgICBhczogam9pbkFzLFxuICAgICAgICAgICAgam9pbjogaW5uZXJPck91dGVyLFxuICAgICAgICAgICAgdGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgIC4uLmpvaW5DbGF1c2UsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBCZWxvbmdzVG9PbmUg67CR7JeQIEhhc01hbnnqsIAg67aZ7J2AIOqyveyasFxuICAgICAgICAgIGlmIChyZWxTdWJzZXRRdWVyeS5sb2FkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZExvYWRlcnMgPSByZWxTdWJzZXRRdWVyeS5sb2FkZXJzLm1hcCgobG9hZGVyKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG5ld0FzID0gW2dyb3VwS2V5LCBsb2FkZXIuYXNdLmpvaW4oXCJfX1wiKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhczogbmV3QXMsXG4gICAgICAgICAgICAgICAgdGFibGU6IGxvYWRlci50YWJsZSxcbiAgICAgICAgICAgICAgICBtYW55Sm9pbjogbG9hZGVyLm1hbnlKb2luLFxuICAgICAgICAgICAgICAgIG9uZUpvaW5zOiBsb2FkZXIub25lSm9pbnMsXG4gICAgICAgICAgICAgICAgc2VsZWN0OiBsb2FkZXIuc2VsZWN0LFxuICAgICAgICAgICAgICAgIGxvYWRlcnM6IGxvYWRlci5sb2FkZXJzLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHIubG9hZGVycyA9IFsuLi5yLmxvYWRlcnMsIC4uLmNvbnZlcnRlZExvYWRlcnNdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHIuam9pbnMgPSByLmpvaW5zLmNvbmNhdChyZWxTdWJzZXRRdWVyeS5qb2lucyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNIYXNNYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSB8fCBpc01hbnlUb01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgLy8gLU1hbnkgUmVsYXRpb246IExvYWRlciDroZwg7LKY66asXG4gICAgICAgICAgY29uc3QgcmVsRmllbGRzID0gZ3JvdXBlZEZpZWxkcy5tYXAoKGZpZWxkKSA9PiBmaWVsZC5zcGxpdChcIi5cIikuc2xpY2UoMSkuam9pbihcIi5cIikpO1xuICAgICAgICAgIGNvbnN0IHJlbFN1YnNldFF1ZXJ5ID0gcmVsRW50aXR5LnJlc29sdmVTdWJzZXRRdWVyeShcIlwiLCByZWxGaWVsZHMpO1xuXG4gICAgICAgICAgbGV0IG1hbnlKb2luOiBTdWJzZXRRdWVyeVtcImxvYWRlcnNcIl1bbnVtYmVyXVtcIm1hbnlKb2luXCJdO1xuICAgICAgICAgIGlmIChpc0hhc01hbnlSZWxhdGlvblByb3AocmVsYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBmcm9tQ29sID0gcmVsYXRpb24/LmZyb21Db2x1bW4gPz8gXCJpZFwiO1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbCxcbiAgICAgICAgICAgICAgaWRGaWVsZDogcHJlZml4ID09PSBcIlwiID8gYCR7ZnJvbUNvbH1gIDogYCR7cHJlZml4fV9fJHtmcm9tQ29sfWAsXG4gICAgICAgICAgICAgIHRvVGFibGU6IHJlbEVudGl0eS50YWJsZSxcbiAgICAgICAgICAgICAgdG9Db2w6IHJlbGF0aW9uLmpvaW5Db2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSBpZiAoaXNNYW55VG9NYW55UmVsYXRpb25Qcm9wKHJlbGF0aW9uKSkge1xuICAgICAgICAgICAgbWFueUpvaW4gPSB7XG4gICAgICAgICAgICAgIGZyb21UYWJsZTogdGhpcy50YWJsZSxcbiAgICAgICAgICAgICAgZnJvbUNvbDogXCJpZFwiLFxuICAgICAgICAgICAgICBpZEZpZWxkOiBwcmVmaXggPT09IFwiXCIgPyBgaWRgIDogYCR7cHJlZml4fV9faWRgLFxuICAgICAgICAgICAgICB0aHJvdWdoOiB7XG4gICAgICAgICAgICAgICAgdGFibGU6IHJlbGF0aW9uLmpvaW5UYWJsZSxcbiAgICAgICAgICAgICAgICBmcm9tQ29sOiBgJHtpbmZsZWN0aW9uLnNpbmd1bGFyaXplKHRoaXMudGFibGUpfV9pZGAsXG4gICAgICAgICAgICAgICAgdG9Db2w6IGAke2luZmxlY3Rpb24uc2luZ3VsYXJpemUocmVsRW50aXR5LnRhYmxlKX1faWRgLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0b1RhYmxlOiByZWxFbnRpdHkudGFibGUsXG4gICAgICAgICAgICAgIHRvQ29sOiBcImlkXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByLmxvYWRlcnMucHVzaCh7XG4gICAgICAgICAgICBhczogZ3JvdXBLZXksXG4gICAgICAgICAgICB0YWJsZTogcmVsRW50aXR5LnRhYmxlLFxuICAgICAgICAgICAgbWFueUpvaW4sXG4gICAgICAgICAgICBvbmVKb2luczogcmVsU3Vic2V0UXVlcnkuam9pbnMsXG4gICAgICAgICAgICBzZWxlY3Q6IHJlbFN1YnNldFF1ZXJ5LnNlbGVjdCxcbiAgICAgICAgICAgIGxvYWRlcnM6IHJlbFN1YnNldFF1ZXJ5LmxvYWRlcnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sXG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHtcbiAgICAgICAgc2VsZWN0OiBbXSxcbiAgICAgICAgdmlydHVhbDogW10sXG4gICAgICAgIGpvaW5zOiBbXSxcbiAgICAgICAgbG9hZGVyczogW10sXG4gICAgICB9IGFzIFN1YnNldFF1ZXJ5LFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG4gICAgRmllbGRFeHByW10g7J2EIEVudGl0eVByb3BOb2RlW10g66GcIOuzgO2ZmFxuICAqL1xuICBmaWVsZEV4cHJzVG9Qcm9wTm9kZXMoZmllbGRFeHByczogc3RyaW5nW10sIGVudGl0eTogRW50aXR5ID0gdGhpcyk6IEVudGl0eVByb3BOb2RlW10ge1xuICAgIGNvbnN0IGdyb3VwcyA9IGZpZWxkRXhwcnMucmVkdWNlKFxuICAgICAgKHJlc3VsdCwgZmllbGRFeHByKSA9PiB7XG4gICAgICAgIGxldCBrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZywgZWxzZUV4cHI6IHN0cmluZ1tdO1xuICAgICAgICBpZiAoZmllbGRFeHByLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgICAgIFtrZXksIC4uLmVsc2VFeHByXSA9IGZpZWxkRXhwci5zcGxpdChcIi5cIik7XG4gICAgICAgICAgdmFsdWUgPSBlbHNlRXhwci5qb2luKFwiLlwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBcIlwiO1xuICAgICAgICAgIHZhbHVlID0gZmllbGRFeHByO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdFtrZXldID0gKHJlc3VsdFtrZXldID8/IFtdKS5jb25jYXQodmFsdWUpO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICB7fSBhcyB7XG4gICAgICAgIFtrOiBzdHJpbmddOiBzdHJpbmdbXTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBPYmplY3Qua2V5cyhncm91cHMpLmZsYXRNYXA8RW50aXR5UHJvcE5vZGUsIEVudGl0eVByb3BOb2RlW10+KChrZXkpID0+IHtcbiAgICAgIGNvbnN0IGdyb3VwZWRGaWVsZEV4cHJzID0gZ3JvdXBzW2tleV07XG5cbiAgICAgIC8vIOydvOuwmCBwcm9wIOyymOumrFxuICAgICAgaWYgKGtleSA9PT0gXCJcIikge1xuICAgICAgICByZXR1cm4gZ3JvdXBlZEZpZWxkRXhwcnMubWFwKChwcm9wTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICAgICAgaWYgKHByb3AgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgJHtlbnRpdHkuaWR9IC0tIOyemOuqu+uQnCBGaWVsZEV4cHIgJyR7cHJvcE5hbWV9JyAo7IKs7JqpIOqwgOuKpe2VnCBwcm9wczogJHtlbnRpdHkucHJvcHMubWFwKChwKSA9PiBwLm5hbWUpLmpvaW4oXCIsIFwiKX0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBub2RlVHlwZTogXCJwbGFpblwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgcHJvcCxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gcmVsYXRpb24gcHJvcCDsspjrpqxcbiAgICAgIGNvbnN0IHByb3AgPSBlbnRpdHkucHJvcHNEaWN0W2tleV07XG4gICAgICBpZiAoIWlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihg7J6Y66q765CcIEZpZWxkRXhwciAke2tleX0uJHtncm91cGVkRmllbGRFeHByc1swXX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG5cbiAgICAgIC8vIHJlbGF0aW9uIC1PbmUg7JeQIGlkIO2VhOuTnCDtlZjrgpjsnbgg6rK97JqwXG4gICAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZ3JvdXBlZEZpZWxkRXhwcnMubGVuZ3RoID09PSAxICYmXG4gICAgICAgICAgKGdyb3VwZWRGaWVsZEV4cHJzWzBdID09PSBcImlkXCIgfHwgZ3JvdXBlZEZpZWxkRXhwcnNbMF0gPT09IFwiaWQ/XCIpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGlkIO2VmOuCmOunjCDsnojripTsp4Ag7LK07YGs7ZW07IScLCDtlZjrgpjrp4wg7J6I7Jy866m0IOyDgeychCBwcm9w7Jy866GcIGlk66W8IOumrO2EtFxuICAgICAgICAgIGNvbnN0IGlkUHJvcCA9IHJlbEVudGl0eS5wcm9wc0RpY3QuaWQ7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5vZGVUeXBlOiBcInBsYWluXCIgYXMgY29uc3QsXG4gICAgICAgICAgICBwcm9wOiB7XG4gICAgICAgICAgICAgIC4uLmlkUHJvcCxcbiAgICAgICAgICAgICAgbmFtZTogYCR7a2V5fV9pZGAsXG4gICAgICAgICAgICAgIG51bGxhYmxlOiBwcm9wLm51bGxhYmxlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIC1PbmUg6re47Jm47J2YIOqyveyasCBvYmplY3TroZwg66as7YS0XG4gICAgICAvLyAtTWFueeydmCDqsr3smrAgYXJyYXnroZwg66as7YS0XG4gICAgICAvLyBSZWN1cnNpdmUg66GcIOuOgeyKpCDsspjrpqxcbiAgICAgIGNvbnN0IGNoaWxkcmVuID0gdGhpcy5maWVsZEV4cHJzVG9Qcm9wTm9kZXMoZ3JvdXBlZEZpZWxkRXhwcnMsIHJlbEVudGl0eSk7XG4gICAgICBjb25zdCBub2RlVHlwZSA9XG4gICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8IGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcClcbiAgICAgICAgICA/IChcIm9iamVjdFwiIGFzIGNvbnN0KVxuICAgICAgICAgIDogKFwiYXJyYXlcIiBhcyBjb25zdCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5vZGVUeXBlLFxuICAgICAgICBwcm9wLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWVsZEV4cHJzKHByZWZpeCA9IFwiXCIsIG1heERlcHRoOiBudW1iZXIgPSAzLCBmcm9tczogc3RyaW5nW10gPSBbXSk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wc1xuICAgICAgLmZsYXRNYXAoKHByb3ApID0+IHtcbiAgICAgICAgY29uc3QgcHJvcE5hbWUgPSBbcHJlZml4LCBwcm9wLm5hbWVdLmZpbHRlcigodikgPT4gdiAhPT0gXCJcIikuam9pbihcIi5cIik7XG4gICAgICAgIGlmIChwcm9wTmFtZSA9PT0gcHJlZml4KSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgICAgaWYgKG1heERlcHRoIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmcm9tcy5pbmNsdWRlcyhwcm9wLndpdGgpKSB7XG4gICAgICAgICAgICAvLyDsl63rsKntlqUgcmVsYXRpb27snbgg6rK97JqwIOygnOyZuFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIOygleuwqe2WpSByZWxhdGlvbuyduCDqsr3smrAgcmVjdXJzaXZlIOy9nFxuICAgICAgICAgIGNvbnN0IHJlbE1kID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgICAgICByZXR1cm4gcmVsTWQuZ2V0RmllbGRFeHBycyhwcm9wTmFtZSwgbWF4RGVwdGggLSAxLCBbLi4uZnJvbXMsIHRoaXMuaWRdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcHJvcE5hbWU7XG4gICAgICB9KVxuICAgICAgLmZpbHRlcigoZikgPT4gZiAhPT0gbnVsbCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24gcHJvcOydtCDtmITsnqwg7YWM7J2067iU7JeQIEZLIOy7rOufvOydhCDsg53shLHtlZjripTsp4Ag7ZmV7J24XG4gICAqKEJlbG9uZ3NUb09uZSDrmJDripQgT25lVG9PbmUoaGFzSm9pbkNvbHVtbj10cnVlKeyduCDqsr3smrAgRksg7IOd7ISxKVxuICAgKi9cbiAgcHJpdmF0ZSBoYXNGb3JlaWduS2V5KHByb3A6IFJlbGF0aW9uUHJvcCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBwcm9wLnJlbGF0aW9uVHlwZSA9PT0gXCJCZWxvbmdzVG9PbmVcIiB8fFxuICAgICAgKHByb3AucmVsYXRpb25UeXBlID09PSBcIk9uZVRvT25lXCIgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICk7XG4gIH1cblxuICBnZXRUYWJsZUNvbHVtbnMoKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9W10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzXG4gICAgICAubWFwKChwcm9wKSA9PiB7XG4gICAgICAgIGlmIChwcm9wLnR5cGUgPT09IFwicmVsYXRpb25cIikge1xuICAgICAgICAgIGlmICh0aGlzLmhhc0ZvcmVpZ25LZXkocHJvcCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGAke3Byb3AubmFtZX1faWRgLCB0eXBlOiBcImludF91bnNpZ25lZFwiIH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBuYW1lOiBwcm9wLm5hbWUsIHR5cGU6IHByb3AudHlwZSB9O1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeyXkCDsoJXsnZjrkJwg66qo65OgIHZlY3RvciDtg4DsnoUg7Lus65+8IOuwmO2ZmFxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1ucygpOiBFbnRpdHlQcm9wW10ge1xuICAgIHJldHVybiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcInZlY3RvclwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUgdmVjdG9yIOy7rOufvCDrsJjtmZhcbiAgICogQHBhcmFtIGNvbHVtbk5hbWUgLSDsu6zrn7zrqoUgKOyDneuetSDsi5wg7LKrIOuyiOynuCB2ZWN0b3Ig7Lus65+8KVxuICAgKi9cbiAgZ2V0VmVjdG9yQ29sdW1uKGNvbHVtbk5hbWU/OiBzdHJpbmcpOiBFbnRpdHlQcm9wIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB2ZWN0b3JQcm9wcyA9IHRoaXMuZ2V0VmVjdG9yQ29sdW1ucygpO1xuICAgIGlmIChjb2x1bW5OYW1lKSB7XG4gICAgICByZXR1cm4gdmVjdG9yUHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBjb2x1bW5OYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHZlY3RvclByb3BzWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhO2EsOungSDqsIDriqXtlZwgcHJvcHMg67CY7ZmYXG4gICAqXG4gICAqIC0g7J2867CYIHByb3BcbiAgICogLSBGS+ulvCDsg53shLHtlZjripQgcmVsYXRpb24gKEJlbG9uZ3NUb09uZSwgT25lVG9PbmUgd2l0aCBoYXNKb2luQ29sdW1uKVxuICAgKiAgIOKGkiB7bmFtZX1faWQg7ZiV7YOc7J2YIOqwgOyDgSBpbnRlZ2VyIHByb3DsnLzroZwg67OA7ZmYXG4gICAqL1xuICBnZXRGaWx0ZXJhYmxlUHJvcHMoKTogRW50aXR5UHJvcFtdIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5mbGF0TWFwKChwcm9wKTogRW50aXR5UHJvcCB8IEVudGl0eVByb3BbXSA9PiB7XG4gICAgICAvLyBWaXJ0dWFsIHByb3Ag7KCc7Jm4XG4gICAgICBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgLy8gRkvrpbwg7IOd7ISx7ZWY64qUIHJlbGF0aW9u66eMIO2PrO2VqFxuICAgICAgICBpZiAodGhpcy5oYXNGb3JlaWduS2V5KHByb3ApKSB7XG4gICAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5hbWU6IGAke3Byb3AubmFtZX1faWRgLFxuICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCIsXG4gICAgICAgICAgICBudWxsYWJsZTogcHJvcC5udWxsYWJsZSxcbiAgICAgICAgICB9IGFzIEVudGl0eVByb3A7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuXG4gICAgICAvLyDsnbzrsJggcHJvcCDsspjrpqxcbiAgICAgIHJldHVybiBwcm9wO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEVudGl0eeqwgCDrhbjstpztlZjripQg7YOA7J6FIOydtOumhOqzvCDrqqjrk4gg6rK966Gc66W8IEVudGl0eU1hbmFnZXLsl5Ag65Ox66Gd7ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gZXhwbGljaXRBcGlSb290UGF0aCAtIFNvbmFtdSDstIjquLDtmZQg7JeG7J20IOuTseuhne2VoCDrlYwg7IKs7Jqp7ZWgIEFQSSDro6jtirgg6rK966GcXG4gICAqL1xuICBhc3luYyByZWdpc3Rlck1vZHVsZVBhdGhzKGV4cGxpY2l0QXBpUm9vdFBhdGg/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlUGF0aCA9IGAke3RoaXMubmFtZXMucGFyZW50RnN9YDtcblxuICAgIC8vIGJhc2Utc2NoZW1lXG4gICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9QmFzZVNjaGVtYWAsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG5cbiAgICAvLyBzdWJzZXRcbiAgICBpZiAoT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKS5sZW5ndGggPiAwKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoYCR7dGhpcy5pZH1TdWJzZXRLZXlgLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgICAgRW50aXR5TWFuYWdlci5zZXRNb2R1bGVQYXRoKGAke3RoaXMuaWR9U3Vic2V0TWFwcGluZ2AsIGBzb25hbXUuZ2VuZXJhdGVkYCk7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNldEtleSBvZiBPYmplY3Qua2V5cyh0aGlzLnN1YnNldHMpKSB7XG4gICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChcbiAgICAgICAgICBgJHt0aGlzLmlkfVN1YnNldCR7c3Vic2V0S2V5LnRvVXBwZXJDYXNlKCl9YCxcbiAgICAgICAgICBgc29uYW11LmdlbmVyYXRlZGAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZW51bXNcbiAgICBmb3IgKGNvbnN0IGVudW1JZCBvZiBPYmplY3Qua2V5cyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICBFbnRpdHlNYW5hZ2VyLnNldE1vZHVsZVBhdGgoZW51bUlkLCBgc29uYW11LmdlbmVyYXRlZGApO1xuICAgIH1cblxuICAgIC8vIHR5cGVzXG4gICAgY29uc3QgdHlwZXNNb2R1bGVQYXRoID0gYCR7YmFzZVBhdGh9LyR7dGhpcy5uYW1lcy5wYXJlbnRGc30udHlwZXNgO1xuICAgIGNvbnN0IHR5cGVzRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBleHBsaWNpdEFwaVJvb3RQYXRoID8/IFNvbmFtdS5hcGlSb290UGF0aCxcbiAgICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7dHlwZXNNb2R1bGVQYXRofS5qc2ApLFxuICAgICk7XG5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHR5cGVzRmlsZVBhdGgpKSB7XG4gICAgICBjb25zdCBpbXBvcnRlZE1lbWJlcnMgPSBhd2FpdCBpbXBvcnRNZW1iZXJzPHouWm9kVHlwZUFueT4odHlwZXNGaWxlUGF0aCk7XG4gICAgICAvLyBTQUZFVFk6IOyKpO2CpOuniCDqsoDspp3qs7wg66mU7YOA642w7J207YSwIOqzhOyVveydtCDsnbQg7YOA7J6F7J2EIOuztOyepe2VqeuLiOuLpC5cbiAgICAgIHRoaXMudHlwZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIGltcG9ydGVkTWVtYmVycy5tYXAoKHsgbmFtZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgIEVudGl0eU1hbmFnZXIuc2V0TW9kdWxlUGF0aChuYW1lLCB0eXBlc01vZHVsZVBhdGgpO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgdmFsdWVdO1xuICAgICAgICB9KSxcbiAgICAgICkgYXMgeyBbbmFtZTogc3RyaW5nXTogei5ab2RUeXBlQW55IH07XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJUYWJsZVNwZWNzKCk6IHZvaWQge1xuICAgIC8vIOyhsOyduCDthYzsnbTruJQg7J24642x7IqkIOygnOyZuCAo7Lus65+8IOydtOumhOyXkCAnLifsnbQg7Y+s7ZWo65CcIOqyveyasClcbiAgICBjb25zdCB1bmlxdWVJbmRleGVzID0gdGhpcy5pbmRleGVzXG4gICAgICAuZmlsdGVyKChpZHgpID0+IGlkeC50eXBlID09PSBcInVuaXF1ZVwiKVxuICAgICAgLmZpbHRlcigoaWR4KSA9PiBpZHguY29sdW1ucy5ldmVyeSgoY29sKSA9PiAhY29sLm5hbWUuaW5jbHVkZXMoXCIuXCIpKSk7XG5cbiAgICBFbnRpdHlNYW5hZ2VyLnNldFRhYmxlU3BlYyh7XG4gICAgICBuYW1lOiB0aGlzLnRhYmxlLFxuICAgICAgdW5pcXVlSW5kZXhlcyxcbiAgICAgIGpzb25Db2x1bW5zOiB0aGlzLnByb3BzLmZpbHRlcigocCkgPT4gcC50eXBlID09PSBcImpzb25cIikubWFwKChwKSA9PiBwLm5hbWUpLFxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IEVudGl0eUpzb24ge1xuICAgIC8vIHN1YnNldHPsmYAgc3Vic2V0c0ludGVybmFs7J2EIFN1YnNldERlZiDtmJXtg5zroZwg67O17JuQIChjb25lIO2PrO2VqClcbiAgICBjb25zdCBzdWJzZXRzOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLlN1YnNldERlZiB9ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5zdWJzZXRzKSkge1xuICAgICAgY29uc3Qgbm9ybWFsRmllbGRzOiBTdWJzZXRGaWVsZFtdID0gdGhpcy5zdWJzZXRzW2tleV07XG4gICAgICBjb25zdCBpbnRlcm5hbEZpZWxkczogU3Vic2V0RmllbGRbXSA9ICh0aGlzLnN1YnNldHNJbnRlcm5hbFtrZXldID8/IFtdKS5tYXAoKGZpZWxkKSA9PiAoe1xuICAgICAgICBmaWVsZCxcbiAgICAgICAgaW50ZXJuYWw6IHRydWUsXG4gICAgICB9KSk7XG4gICAgICBjb25zdCBmaWVsZHMgPSBbLi4ubm9ybWFsRmllbGRzLCAuLi5pbnRlcm5hbEZpZWxkc107XG5cbiAgICAgIC8vIGNvbmXsnbQg7J6I7Jy866m0IOyDiOuhnOyatCDqsJ3ssrQg7ZiV7YOc66GcLCDsl4bsnLzrqbQg67Cw7Je0IO2Yle2DnOuhnFxuICAgICAgaWYgKHRoaXMuc3Vic2V0Q29uZXNba2V5XSkge1xuICAgICAgICBzdWJzZXRzW2tleV0gPSB7XG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuc3Vic2V0Q29uZXNba2V5XSxcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnNldHNba2V5XSA9IGZpZWxkcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlbnVtc+ulvCBFbnVtRGVmIO2Yle2DnOuhnCDrs7Xsm5AgKGNvbmUg7Y+s7ZWoKVxuICAgIGNvbnN0IGVudW1zOiB7IFtrZXk6IHN0cmluZ106IGltcG9ydChcIi4uL3R5cGVzL3R5cGVzXCIpLkVudW1EZWYgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudW1MYWJlbHMpKSB7XG4gICAgICAvLyBjb25l7J20IOyeiOycvOuptCDsg4jroZzsmrQg6rCd7LK0IO2Yle2DnOuhnCwg7JeG7Jy866m0IFJlY29yZCDtmJXtg5zroZxcbiAgICAgIGlmICh0aGlzLmVudW1Db25lc1trZXldKSB7XG4gICAgICAgIGVudW1zW2tleV0gPSB7XG4gICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgIGNvbmU6IHRoaXMuZW51bUNvbmVzW2tleV0sXG4gICAgICAgIH07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbnVtc1trZXldID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHBhcmVudElkOiB0aGlzLnBhcmVudElkLFxuICAgICAgdGFibGU6IHRoaXMudGFibGUsXG4gICAgICB0aXRsZTogdGhpcy50aXRsZSxcbiAgICAgIGN1c3RvbTogdGhpcy5jdXN0b20sXG4gICAgICBjb25lOiB0aGlzLmNvbmUsXG4gICAgICBwcm9wczogdGhpcy5wcm9wcyxcbiAgICAgIGluZGV4ZXM6IHRoaXMuaW5kZXhlcyxcbiAgICAgIHN1YnNldHMsXG4gICAgICBlbnVtcyxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBzb3J0OiBzdWJzZXRzXG4gICAgY29uc3Qgc3Vic2V0Um93cyA9IHRoaXMuZ2V0U3Vic2V0Um93cygpO1xuICAgIHRoaXMuc3Vic2V0cyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0cykubWFwKChbc3Vic2V0S2V5XSkgPT4ge1xuICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgdGhpcy5zdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoc3Vic2V0Um93cywgc3Vic2V0S2V5LCBmYWxzZSldO1xuICAgICAgfSksXG4gICAgKTtcbiAgICB0aGlzLnN1YnNldHNJbnRlcm5hbCA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMuc3Vic2V0c0ludGVybmFsKS5tYXAoKFtzdWJzZXRLZXldKSA9PiB7XG4gICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCB0aGlzLnN1YnNldFJvd3NUb1N1YnNldEZpZWxkcyhzdWJzZXRSb3dzLCBzdWJzZXRLZXksIHRydWUpXTtcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBzYXZlXG4gICAgY29uc3QganNvblBhdGggPSBwYXRoLmpvaW4oXG4gICAgICBTb25hbXUuYXBpUm9vdFBhdGgsXG4gICAgICBgc3JjL2FwcGxpY2F0aW9uLyR7dGhpcy5uYW1lcy5wYXJlbnRGc30vJHt0aGlzLm5hbWVzLmZzfS5lbnRpdHkuanNvbmAsXG4gICAgKTtcbiAgICBjb25zdCBqc29uID0gdGhpcy50b0pzb24oKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoanNvblBhdGgsIGF3YWl0IGZvcm1hdENvZGUoSlNPTi5zdHJpbmdpZnkoanNvbiksIGpzb25QYXRoKSk7XG5cbiAgICAvLyByZWxvYWRcbiAgICBhd2FpdCBFbnRpdHlNYW5hZ2VyLnJlZ2lzdGVyKGpzb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2FnO2UjOumvyBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIExMTeydhCDsgqzsmqntlZjsp4Ag7JWK6rOgIGZha2VyLW1hcHBpbmdzLnRz66W8IO2ZnOyaqe2VmOyXrCDquLDrs7ggY29uZeydhCDsg53shLHtlanri4jri6QuXG4gICAqIHN0dWIgZW50aXR5IOyDneyEsSDsi5wg7J6Q64+Z7Jy866GcIO2YuOy2nOuQmOyWtCDstZzshoztlZzsnZggY29uZSDrqZTtg4DrjbDsnbTthLDrpbwg7KCc6rO17ZWp64uI64ukLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFNvbmFtdS5jb25maWcuaTE4bi5kZWZhdWx0TG9jYWxlIOuYkOuKlCBcImtvXCIpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMobG9jYWxlPzogXCJrb1wiIHwgXCJlblwiIHwgXCJqYVwiKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRlbXBsYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4vZW50aXR5LXRlbXBsYXRlLWNvbmVcIik7XG4gICAgY29uc3QgY29uZmlnTG9jYWxlID0gU29uYW11LmNvbmZpZy5pMThuPy5kZWZhdWx0TG9jYWxlO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUxvY2FsZSA9XG4gICAgICBsb2NhbGUgfHxcbiAgICAgIChjb25maWdMb2NhbGUgPT09IFwia29cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiZW5cIiB8fCBjb25maWdMb2NhbGUgPT09IFwiamFcIlxuICAgICAgICA/IGNvbmZpZ0xvY2FsZVxuICAgICAgICA6IFwia29cIik7XG4gICAgY29uc3QgcmVzdWx0ID0gZ2VuZXJhdGVUZW1wbGF0ZUNvbmVzKHRoaXMudG9Kc29uKCksIGVmZmVjdGl2ZUxvY2FsZSk7XG5cbiAgICAvLyDqsrDqs7zrpbwgRW50aXR57JeQIOyggeyaqSAoYXBwbHlDb25lc+yZgCDrj5nsnbztlZwg67Cp7IudKVxuICAgIGlmIChyZXN1bHQuZW50aXR5Q29uZSkge1xuICAgICAgdGhpcy5jb25lID0gcmVzdWx0LmVudGl0eUNvbmU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbcHJvcE5hbWUsIGNvbmVdIG9mIE9iamVjdC5lbnRyaWVzKHJlc3VsdC5wcm9wQ29uZXMpKSB7XG4gICAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wcy5maW5kKChwKSA9PiBwLm5hbWUgPT09IHByb3BOYW1lKTtcbiAgICAgIGlmIChwcm9wKSB7XG4gICAgICAgIC8vIFNBRkVUWTog7Iqk7YKk66eIIOqygOymneqzvCDrqZTtg4DrjbDsnbTthLAg6rOE7JW97J20IOydtCDtg4DsnoXsnYQg67O07J6l7ZWp64uI64ukLlxuICAgICAgICAocHJvcCBhcyB7IGNvbmU/OiBDb25lIH0pLmNvbmUgPSBjb25lO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuZW51bUNvbmVzID0geyAuLi50aGlzLmVudW1Db25lcywgLi4ucmVzdWx0LmVudW1Db25lcyB9O1xuICAgIHRoaXMuc3Vic2V0Q29uZXMgPSB7IC4uLnRoaXMuc3Vic2V0Q29uZXMsIC4uLnJlc3VsdC5zdWJzZXRDb25lcyB9O1xuXG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICAvKipcbiAgICogTExN7J2EIOyCrOyaqe2VmOyXrCBjb25lIOuplO2DgOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnByZXNlcnZlRXhpc3RpbmcgLSDquLDsobQgY29uZSDrs7TsobQg7Jes67aAICjquLDrs7jqsJI6IHRydWUpXG4gICAqIEBwYXJhbSBvcHRpb25zLm9ubHlFbXB0eSAtIGZpeHR1cmVIaW506rCAIOyXhuuKlCBjb25l66eMIOyDneyEsSAo6riw67O46rCSOiBmYWxzZSlcbiAgICogQHBhcmFtIG9wdGlvbnMubG9jYWxlIC0g7IOd7ISxIOyLnCDsgqzsmqntlaAgbG9jYWxlICjquLDrs7jqsJI6IFwia29cIilcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQ29uZXMob3B0aW9ucz86IHtcbiAgICBwcmVzZXJ2ZUV4aXN0aW5nPzogYm9vbGVhbjtcbiAgICBvbmx5RW1wdHk/OiBib29sZWFuO1xuICAgIGxvY2FsZT86IFwia29cIiB8IFwiZW5cIiB8IFwiamFcIjtcbiAgICAvKiog7YWM7Iqk7Yq464KYIOuMgOyytCBMTE0g6rO16riJ7J6Q66W8IOychO2VnCDthY3siqTtirgg7IOd7ISxIOq1rO2YhCAqL1xuICAgIGdlbmVyYXRlVGV4dD86IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZVRleHRHZW5lcmF0b3I7XG4gICAgLyoqIGZhbHNl7J2066m0IOyDneyEsSDqsrDqs7zrpbwg66mU66qo66as7JeQ66eMIOyggeyaqe2VmOqzoCBlbnRpdHkg7YyM7J287J2AIOyggOyepe2VmOyngCDslYrsirXri4jri6QuICovXG4gICAgcGVyc2lzdD86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIikuQ29uZUdlbmVyYXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCB7IGdlbmVyYXRlQ29uZXMgfSA9IGF3YWl0IGltcG9ydChcIi4uL2NvbmUvY29uZS1nZW5lcmF0b3JcIik7XG4gICAgY29uc3QgY29udGV4dDogaW1wb3J0KFwiLi4vY29uZS9jb25lLWdlbmVyYXRvclwiKS5Db25lR2VuZXJhdGlvbkNvbnRleHQgPSB7XG4gICAgICBlbnRpdHk6IHRoaXMudG9Kc29uKCksXG4gICAgICBsb2NhbGU6IG9wdGlvbnM/LmxvY2FsZSB8fCBcImtvXCIsXG4gICAgICBleGlzdGluZ0NvbmVzOiBvcHRpb25zPy5wcmVzZXJ2ZUV4aXN0aW5nICE9PSBmYWxzZSA/IHRoaXMuY29sbGVjdEV4aXN0aW5nQ29uZXMoKSA6IHVuZGVmaW5lZCxcbiAgICAgIG9ubHlFbXB0eTogb3B0aW9ucz8ub25seUVtcHR5ID8/IGZhbHNlLFxuICAgIH07XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZW5lcmF0ZUNvbmVzKGNvbnRleHQsIHsgZ2VuZXJhdGVUZXh0OiBvcHRpb25zPy5nZW5lcmF0ZVRleHQgfSk7XG4gICAgdGhpcy5hcHBseUNvbmVzKHJlc3VsdCk7XG4gICAgaWYgKG9wdGlvbnM/LnBlcnNpc3QgIT09IGZhbHNlKSB7XG4gICAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiDquLDsobQgY29uZeuTpOydhCDsiJjsp5Htlanri4jri6QgKGVudGl0eSwgcHJvcHMsIGVudW1zLCBzdWJzZXRzKS5cbiAgICpcbiAgICogQHJldHVybnMg7YKk6rCAIFwiZW50aXR5OmlkXCIsIFwicHJvcDpuYW1lXCIsIFwiZW51bTplbnVtSWRcIiwgXCJzdWJzZXQ6a2V5XCIg7ZiV7Iud7J24IGNvbmUg66e1XG4gICAqL1xuICBjb2xsZWN0RXhpc3RpbmdDb25lcygpOiBSZWNvcmQ8c3RyaW5nLCBDb25lPiB7XG4gICAgY29uc3QgY29uZUVudHJpZXM6IFtzdHJpbmcsIENvbmVdW10gPSBbXTtcblxuICAgIGlmICh0aGlzLmNvbmUpIHtcbiAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2BlbnRpdHk6JHt0aGlzLmlkfWAsIHRoaXMuY29uZV0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiB0aGlzLnByb3BzKSB7XG4gICAgICBpZiAocHJvcC5jb25lKSB7XG4gICAgICAgIGNvbmVFbnRyaWVzLnB1c2goW2Bwcm9wOiR7cHJvcC5uYW1lfWAsIHByb3AuY29uZV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2VudW1JZCwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnVtQ29uZXMpKSB7XG4gICAgICBjb25lRW50cmllcy5wdXNoKFtgZW51bToke2VudW1JZH1gLCBjb25lXSk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3Vic2V0S2V5LCBjb25lXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnN1YnNldENvbmVzKSkge1xuICAgICAgY29uZUVudHJpZXMucHVzaChbYHN1YnNldDoke3N1YnNldEtleX1gLCBjb25lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhjb25lRW50cmllcyk7XG4gIH1cblxuICAvKipcbiAgICog7IOd7ISx65CcIGNvbmXrk6TsnYQgRW50aXR57JeQIOyggeyaqe2VqeuLiOuLpC5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCAtIExMTeycvOuhnCDsg53shLHrkJwgY29uZSDqsrDqs7xcbiAgICovXG4gIGFwcGx5Q29uZXMocmVzdWx0OiBpbXBvcnQoXCIuLi9jb25lL2NvbmUtZ2VuZXJhdG9yXCIpLkNvbmVHZW5lcmF0aW9uUmVzdWx0KTogdm9pZCB7XG4gICAgaWYgKHJlc3VsdC5lbnRpdHlDb25lKSB7XG4gICAgICB0aGlzLmNvbmUgPSByZXN1bHQuZW50aXR5Q29uZTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtwcm9wTmFtZSwgY29uZV0gb2YgT2JqZWN0LmVudHJpZXMocmVzdWx0LnByb3BDb25lcykpIHtcbiAgICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gcHJvcE5hbWUpO1xuICAgICAgaWYgKHByb3ApIHtcbiAgICAgICAgLy8gU0FGRVRZOiDsiqTtgqTrp4gg6rKA7Kad6rO8IOuplO2DgOuNsOydtO2EsCDqs4Tslb3snbQg7J20IO2DgOyeheydhCDrs7TsnqXtlanri4jri6QuXG4gICAgICAgIChwcm9wIGFzIHsgY29uZT86IENvbmUgfSkuY29uZSA9IGNvbmU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnVtQ29uZXMgPSB7IC4uLnRoaXMuZW51bUNvbmVzLCAuLi5yZXN1bHQuZW51bUNvbmVzIH07XG4gICAgdGhpcy5zdWJzZXRDb25lcyA9IHsgLi4udGhpcy5zdWJzZXRDb25lcywgLi4ucmVzdWx0LnN1YnNldENvbmVzIH07XG4gIH1cblxuICBnZXRTdWJzZXRSb3dzKFxuICAgIF9zdWJzZXRzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9LFxuICAgIF9zdWJzZXRzSW50ZXJuYWw/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0sXG4gICAgcHJlZml4ZXM6IHN0cmluZ1tdID0gW10sXG4gICk6IEVudGl0eVN1YnNldFJvd1tdIHtcbiAgICBpZiAocHJlZml4ZXMubGVuZ3RoID4gMTApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBzdWJzZXRzID0gX3N1YnNldHMgPz8gdGhpcy5zdWJzZXRzO1xuICAgIGNvbnN0IHN1YnNldHNJbnRlcm5hbCA9IF9zdWJzZXRzSW50ZXJuYWwgPz8gdGhpcy5zdWJzZXRzSW50ZXJuYWw7XG4gICAgY29uc3Qgc3Vic2V0S2V5cyA9IE9iamVjdC5rZXlzKHN1YnNldHMpO1xuICAgIGNvbnN0IGFsbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c1trZXldKSk7XG4gICAgLy8gaW50ZXJuYWwg7ZWE65Oc64+EIGFsbEZpZWxkc+yXkCDtj6ztlaggKHJlbGF0aW9uIO2DkOyDieyaqSlcbiAgICBjb25zdCBhbGxJbnRlcm5hbEZpZWxkcyA9IHVuaXF1ZShzdWJzZXRLZXlzLmZsYXRNYXAoKGtleSkgPT4gc3Vic2V0c0ludGVybmFsW2tleV0gPz8gW10pKTtcbiAgICBjb25zdCBjb21iaW5lZEZpZWxkcyA9IHVuaXF1ZShbLi4uYWxsRmllbGRzLCAuLi5hbGxJbnRlcm5hbEZpZWxkc10pO1xuXG4gICAgcmV0dXJuIHRoaXMucHJvcHMubWFwKChwcm9wKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHByb3AudHlwZSA9PT0gXCJyZWxhdGlvblwiICYmXG4gICAgICAgIGNvbWJpbmVkRmllbGRzLmZpbmQoKGYpID0+IGYuc3RhcnRzV2l0aChgJHtbLi4ucHJlZml4ZXMsIHByb3AubmFtZV0uam9pbihcIi5cIil9LmApKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHByb3Aud2l0aCk7XG4gICAgICAgIGNvbnN0IGNoaWxkcmVuID0gcmVsRW50aXR5LmdldFN1YnNldFJvd3Moc3Vic2V0cywgc3Vic2V0c0ludGVybmFsLCBbXG4gICAgICAgICAgLi4ucHJlZml4ZXMsXG4gICAgICAgICAgYCR7cHJvcC5uYW1lfWAsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgICBjaGlsZHJlbixcbiAgICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC53aXRoLFxuICAgICAgICAgIHByZWZpeGVzLFxuICAgICAgICAgIGlzT3BlbjogY2hpbGRyZW4ubGVuZ3RoID4gMCxcbiAgICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgIHN1YnNldEtleXMubWFwKChzdWJzZXRLZXkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGNoaWxkcmVuLmV2ZXJ5KChjaGlsZCkgPT4gY2hpbGQuaGFzW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgICAgaXNJbnRlcm5hbDogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgc3Vic2V0S2V5cy5tYXAoKHN1YnNldEtleSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gW3N1YnNldEtleSwgY2hpbGRyZW4uZXZlcnkoKGNoaWxkKSA9PiBjaGlsZC5pc0ludGVybmFsW3N1YnNldEtleV0pXTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gWy4uLnByZWZpeGVzLCBwcm9wLm5hbWVdLmpvaW4oXCIuXCIpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmllbGQ6IHByb3AubmFtZSxcbiAgICAgICAgY2hpbGRyZW46IFtdLFxuICAgICAgICByZWxhdGlvbkVudGl0eTogcHJvcC50eXBlID09PSBcInJlbGF0aW9uXCIgPyBwcm9wLndpdGggOiB1bmRlZmluZWQsXG4gICAgICAgIHByZWZpeGVzLFxuICAgICAgICBoYXM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdWJzZXRGaWVsZHMgPSBzdWJzZXRzW3N1YnNldEtleV07XG4gICAgICAgICAgICBjb25zdCBoYXMgPSBzdWJzZXRGaWVsZHMuc29tZSgoZikgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gZiA9PT0gZmllbGQgfHwgZi5zdGFydHNXaXRoKGAke2ZpZWxkfS5gKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtzdWJzZXRLZXksIGhhc107XG4gICAgICAgICAgfSksXG4gICAgICAgICksXG4gICAgICAgIGlzSW50ZXJuYWw6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICBzdWJzZXRLZXlzLm1hcCgoc3Vic2V0S2V5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpbnRlcm5hbEZpZWxkcyA9IHN1YnNldHNJbnRlcm5hbFtzdWJzZXRLZXldID8/IFtdO1xuICAgICAgICAgICAgY29uc3QgaXNJbnRlcm5hbCA9IGludGVybmFsRmllbGRzLnNvbWUoKGYpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGYgPT09IGZpZWxkIHx8IGYuc3RhcnRzV2l0aChgJHtmaWVsZH0uYCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBbc3Vic2V0S2V5LCBpc0ludGVybmFsXTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzdWJzZXRSb3dzVG9TdWJzZXRGaWVsZHMoXG4gICAgc3Vic2V0Um93czogRW50aXR5U3Vic2V0Um93W10sXG4gICAgc3Vic2V0S2V5OiBzdHJpbmcsXG4gICAgaW50ZXJuYWw6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGhhc0tleSA9IGludGVybmFsID8gXCJpc0ludGVybmFsXCIgOiBcImhhc1wiO1xuICAgIHJldHVybiBzdWJzZXRSb3dzXG4gICAgICAubWFwKChzdWJzZXRSb3cpID0+IHtcbiAgICAgICAgaWYgKHN1YnNldFJvdy5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2V0Um93c1RvU3Vic2V0RmllbGRzKHN1YnNldFJvdy5jaGlsZHJlbiwgc3Vic2V0S2V5LCBpbnRlcm5hbCk7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic2V0Um93W2hhc0tleV1bc3Vic2V0S2V5XSkge1xuICAgICAgICAgIHJldHVybiBzdWJzZXRSb3cucHJlZml4ZXMuY29uY2F0KHN1YnNldFJvdy5maWVsZCkuam9pbihcIi5cIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKVxuICAgICAgLmZsYXQoKTtcbiAgfVxuXG4gIGFzeW5jIGNyZWF0ZVByb3AocHJvcDogRW50aXR5UHJvcCwgYXQ/OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWF0KSB7XG4gICAgICB0aGlzLnByb3BzLnB1c2gocHJvcCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucHJvcHMuc3BsaWNlKGF0LCAwLCBwcm9wKTtcbiAgICB9XG4gICAgYXdhaXQgdGhpcy5zYXZlKCk7XG4gIH1cblxuICBhbmFseXplU3Vic2V0RmllbGQoc3Vic2V0RmllbGQ6IHN0cmluZyk6IHtcbiAgICBlbnRpdHlJZDogc3RyaW5nO1xuICAgIHByb3BOYW1lOiBzdHJpbmc7XG4gIH1bXSB7XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpO1xuXG4gICAgbGV0IGVudGl0eUlkID0gdGhpcy5pZDtcbiAgICBjb25zdCByZXN1bHQ6IHtcbiAgICAgIGVudGl0eUlkOiBzdHJpbmc7XG4gICAgICBwcm9wTmFtZTogc3RyaW5nO1xuICAgIH1bXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBwcm9wTmFtZSA9IGFycltpXTtcbiAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgZW50aXR5SWQsXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHByb3AgPSBFbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCkucHJvcHMuZmluZCgocCkgPT4gcC5uYW1lID09PSBwcm9wTmFtZSk7XG4gICAgICBpZiAoIXByb3ApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2VudGl0eUlkfeydmCDsnpjrqrvrkJwg7ISc67iM7IWL7YKkICR7c3Vic2V0RmllbGR9YCk7XG4gICAgICB9XG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgZW50aXR5SWQgPSBwcm9wLndpdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBhc3luYyBtb2RpZnlQcm9wKG5ld1Byb3A6IEVudGl0eVByb3AsIGF0OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyDsnbTsoIQg7ZSE66GtIOydtOumhCDsoIDsnqVcbiAgICBjb25zdCBvbGROYW1lID0gdGhpcy5wcm9wc1thdF0ubmFtZTtcblxuICAgIC8vIOyggOyepe2VoCDsl5Tti7Dti7BcbiAgICBjb25zdCBlbnRpdGllczogRW50aXR5W10gPSBbdGhpc107XG5cbiAgICAvLyDsnbTrpoTsnbQg67CU64CQIOqyveyasFxuICAgIGlmIChvbGROYW1lICE9PSBuZXdQcm9wLm5hbWUpIHtcbiAgICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyImOygleuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsiJjsoJVcbiAgICAgIGNvbnN0IGFsbEVudGl0eUlkcyA9IEVudGl0eU1hbmFnZXIuZ2V0QWxsSWRzKCk7XG4gICAgICBmb3IgKGNvbnN0IHJlbEVudGl0eUlkIG9mIGFsbEVudGl0eUlkcykge1xuICAgICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICAgIGNvbnN0IHJlbEVudGl0eVN1YnNldEtleXMgPSBPYmplY3Qua2V5cyhyZWxFbnRpdHkuc3Vic2V0cyk7XG4gICAgICAgIGZvciAoY29uc3Qgc3Vic2V0S2V5IG9mIHJlbEVudGl0eVN1YnNldEtleXMpIHtcbiAgICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuXG4gICAgICAgICAgLy8g7ISc67iM7IWLIO2VhOuTnOulvCDsiJztmoztlZjrqbAsIOyXlO2LsO2LsC3tlITroa0g64uo7JyE66GcIOu2hOyEne2VnCDtm4Qg7ZiE7J6sIOyXlO2LsO2LsC3tlITroa3qs7wg7J287LmY7ZWY64qUIOqyveyasCDsiJjsoJUg7LKY66asXG4gICAgICAgICAgY29uc3QgbW9kaWZpZWRTdWJzZXRGaWVsZHMgPSBzdWJzZXQubWFwKChzdWJzZXRGaWVsZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYW5hbHl6ZWQgPSByZWxFbnRpdHkuYW5hbHl6ZVN1YnNldEZpZWxkKHN1YnNldEZpZWxkKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkID0gYW5hbHl6ZWQubWFwKChhKSA9PlxuICAgICAgICAgICAgICBhLnByb3BOYW1lID09PSBvbGROYW1lICYmIGEuZW50aXR5SWQgPT09IHRoaXMuaWRcbiAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uYSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcE5hbWU6IG5ld1Byb3AubmFtZSxcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IGEsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy8g67aE7ISd7ZWcIO2VhOuTnOulvCDri6Tsi5wg7ISc67iM7IWLIO2VhOuTnOuhnCDrs7XqtaxcbiAgICAgICAgICAgIHJldHVybiBtb2RpZmllZC5tYXAoKGEpID0+IGEucHJvcE5hbWUpLmpvaW4oXCIuXCIpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHN1YnNldC5qb2luKFwiLFwiKSAhPT0gbW9kaWZpZWRTdWJzZXRGaWVsZHMuam9pbihcIixcIikpIHtcbiAgICAgICAgICAgIHJlbEVudGl0eS5zdWJzZXRzW3N1YnNldEtleV0gPSBtb2RpZmllZFN1YnNldEZpZWxkcztcbiAgICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IiY7KCVXG4gICAgdGhpcy5wcm9wc1thdF0gPSBuZXdQcm9wO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGFzeW5jIGRlbFByb3AoYXQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIOydtOyghCDtlITroa0g7J2066aEIOyggOyepVxuICAgIGNvbnN0IG9sZE5hbWUgPSB0aGlzLnByb3BzW2F0XS5uYW1lO1xuXG4gICAgLy8g7KCA7J6l7ZWgIOyXlO2LsO2LsFxuICAgIGNvbnN0IGVudGl0aWVzOiBFbnRpdHlbXSA9IFt0aGlzXTtcblxuICAgIC8vIOyghOyytCDsl5Tti7Dti7Dsl5DshJwg7ZiE7J6sIOyCreygnOuQnCDtlITroa3snYQg7LC47KGw7ZWY6rOgIOyeiOuKlCDrqqjrk6Ag7ISc67iM7IWL7ZWE65OcIOywvuyVhOyEnCDsoJzsmbhcbiAgICBjb25zdCBhbGxFbnRpdHlJZHMgPSBFbnRpdHlNYW5hZ2VyLmdldEFsbElkcygpO1xuICAgIGZvciAoY29uc3QgcmVsRW50aXR5SWQgb2YgYWxsRW50aXR5SWRzKSB7XG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChyZWxFbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWxFbnRpdHlTdWJzZXRLZXlzID0gT2JqZWN0LmtleXMocmVsRW50aXR5LnN1YnNldHMpO1xuICAgICAgZm9yIChjb25zdCBzdWJzZXRLZXkgb2YgcmVsRW50aXR5U3Vic2V0S2V5cykge1xuICAgICAgICBjb25zdCBzdWJzZXQgPSByZWxFbnRpdHkuc3Vic2V0c1tzdWJzZXRLZXldO1xuICAgICAgICAvLyDshJzruIzshYsg7ZWE65Oc66W8IOyInO2ajO2VmOupsCwg7JeU7Yuw7YuwLe2UhOuhrSDri6jsnITroZwg67aE7ISd7ZWcIO2bhCDtmITsnqwg7JeU7Yuw7YuwLe2UhOuhreqzvCDsnbzsuZjtlZjripQg6rK97JqwIOydtO2bhOydmCDtlYTrk5zrpbwg7KCc7Jm4XG4gICAgICAgIGNvbnN0IG1vZGlmaWVkU3Vic2V0RmllbGRzID0gc3Vic2V0XG4gICAgICAgICAgLm1hcCgoc3Vic2V0RmllbGQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFuYWx5emVkID0gcmVsRW50aXR5LmFuYWx5emVTdWJzZXRGaWVsZChzdWJzZXRGaWVsZCk7XG4gICAgICAgICAgICBpZiAoYW5hbHl6ZWQuZmluZCgoYSkgPT4gYS5wcm9wTmFtZSA9PT0gb2xkTmFtZSAmJiBhLmVudGl0eUlkID09PSB0aGlzLmlkKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJldHVybiBzdWJzZXRGaWVsZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIobm9uTnVsbGFibGUpO1xuXG4gICAgICAgIGlmIChzdWJzZXQuam9pbihcIixcIikgIT09IG1vZGlmaWVkU3Vic2V0RmllbGRzLmpvaW4oXCIsXCIpKSB7XG4gICAgICAgICAgcmVsRW50aXR5LnN1YnNldHNbc3Vic2V0S2V5XSA9IG1vZGlmaWVkU3Vic2V0RmllbGRzO1xuICAgICAgICAgIGVudGl0aWVzLnB1c2gocmVsRW50aXR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIO2YhOyerCDsl5Tti7Dti7DsnZgg7J24642x7Iqk7JeQ7IScIOygnOyZuFxuICAgIGZvciAoY29uc3QgaW5kZXggb2YgRW50aXR5TWFuYWdlci5nZXQodGhpcy5pZCkuaW5kZXhlcykge1xuICAgICAgaW5kZXguY29sdW1ucyA9IGluZGV4LmNvbHVtbnMuZmlsdGVyKChjb2wpID0+IGNvbC5uYW1lICE9PSBvbGROYW1lKTtcbiAgICB9XG5cbiAgICAvLyDtlITroa0g7IKt7KCcXG4gICAgdGhpcy5wcm9wcy5zcGxpY2UoYXQsIDEpO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoZW50aXRpZXMubWFwKGFzeW5jIChlbnRpdHkpID0+IGVudGl0eS5zYXZlKCkpKTtcbiAgfVxuXG4gIGdldEVudGl0eUlkRnJvbVN1YnNldEZpZWxkKHN1YnNldEZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghc3Vic2V0RmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gdGhpcy5pZDtcbiAgICB9XG5cbiAgICAvLyDshJzruIzshYsg7ZWE65Oc7J2YIOuniOyngOunieydgCDtlITroa3snbTrr4DroZwg7KCc7Jm4XG4gICAgY29uc3QgYXJyID0gc3Vic2V0RmllbGQuc3BsaXQoXCIuXCIpLnNsaWNlKDAsIC0xKTtcblxuICAgIC8vIOyEnOu4jOyFiyDtlYTrk5zrpbwg64K066Ck6rCA66m07IScIOuniOyngOunieycvOuhnCByZWxhdGlvbuuQnCDsl5Tti7Dti7Drpbwg7LC+7J2MXG4gICAgY29uc3QgbGFzdEVudGl0eUlkID0gYXJyLnJlZHVjZSgoZW50aXR5SWQsIGZpZWxkKSA9PiB7XG4gICAgICBjb25zdCByZWxQcm9wID0gRW50aXR5TWFuYWdlci5nZXQoZW50aXR5SWQpLnByb3BzLmZpbmQoKHApID0+IHAubmFtZSA9PT0gZmllbGQpO1xuICAgICAgaWYgKCFyZWxQcm9wIHx8IHJlbFByb3AudHlwZSAhPT0gXCJyZWxhdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoeyBhcnIsIHRoaXNJZDogdGhpcy5pZCwgZW50aXR5SWQsIGZpZWxkIH0pO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYOyemOuqu+uQnCDshJzruIzshYvtgqQgJHtzdWJzZXRGaWVsZH1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWxQcm9wLndpdGg7XG4gICAgfSwgdGhpcy5pZCk7XG4gICAgcmV0dXJuIGxhc3RFbnRpdHlJZDtcbiAgfVxuXG4gIGFzeW5jIG1vdmVQcm9wKGF0OiBudW1iZXIsIHRvOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwcm9wID0gdGhpcy5wcm9wc1thdF07XG4gICAgY29uc3QgbmV3UHJvcHMgPSBbLi4udGhpcy5wcm9wc107XG4gICAgbmV3UHJvcHMuc3BsaWNlKHRvLCAwLCBwcm9wKTtcbiAgICBuZXdQcm9wcy5zcGxpY2UoYXQgPCB0byA/IGF0IDogYXQgKyAxLCAxKTtcbiAgICB0aGlzLnByb3BzID0gbmV3UHJvcHM7XG5cbiAgICBhd2FpdCB0aGlzLnNhdmUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zrqoXsnYQgXCLthYzsnbTruJTrqoUu7ZWE65Oc66qFXCIg7ZiV7Iud7Jy866GcIOuzgO2ZmFxuICAgKi9cbiAgZ2V0RnVsbEZpZWxkTmFtZShmaWVsZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoZmllbGQuaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuICAgIHJldHVybiBgJHt0aGlzLnRhYmxlfS4ke2ZpZWxkfWA7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIO2DgOyeheydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGlkIO2VhOuTnOydmCDtg4DsnoXsnYQg6riw7KSA7Jy866GcIFwiaW50ZWdlclwiIHwgXCJzdHJpbmdcIiB8IFwidXVpZFwi66W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrVHlwZSgpOiBcImludGVnZXJcIiB8IFwic3RyaW5nXCIgfCBcInV1aWRcIiB7XG4gICAgY29uc3QgaWRQcm9wID0gdGhpcy5wcm9wc0RpY3QuaWQ7XG4gICAgaWYgKCFpZFByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRW50aXR5ICR7dGhpcy5pZH3sl5AgaWQg7ZWE65Oc6rCAIOyXhuyKteuLiOuLpGApO1xuICAgIH1cbiAgICBpZiAoaWRQcm9wLnR5cGUgPT09IFwic3RyaW5nXCIgfHwgaWRQcm9wLnR5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICByZXR1cm4gaWRQcm9wLnR5cGU7XG4gICAgfVxuICAgIHJldHVybiBcImludGVnZXJcIjtcbiAgfVxuXG4gIC8qKlxuICAgKiDsl5Tti7Dti7DsnZggUEsgcHJvcOydhCDrsJjtmZjtlanri4jri6QuXG4gICAqIGxlbmd0aCDrk7Eg7IS467aAIOygleuztOyXkCDsoJHqt7ztlaAg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAgICovXG4gIGdldFBrUHJvcCgpOiBFbnRpdHlQcm9wIHtcbiAgICBjb25zdCBpZFByb3AgPSB0aGlzLnByb3BzRGljdC5pZDtcbiAgICBpZiAoIWlkUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFbnRpdHkgJHt0aGlzLmlkfeyXkCBpZCDtlYTrk5zqsIAg7JeG7Iq164uI64ukYCk7XG4gICAgfVxuICAgIHJldHVybiBpZFByb3A7XG4gIH1cblxuICAvKipcbiAgICog7JeU7Yuw7Yuw7J2YIFBLIOuwsOyXtCDtg4DsnoXsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgKiBMb2FkZXJRdWVyeeydmCBmcm9tSWRzIO2DgOyeheycvOuhnCDsgqzsmqnrkKnri4jri6QuXG4gICAqL1xuICBnZXRQa0FycmF5VHlwZSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBrVHlwZSA9IHRoaXMuZ2V0UGtUeXBlKCk7XG4gICAgcmV0dXJuIHBrVHlwZSA9PT0gXCJpbnRlZ2VyXCIgPyBcIm51bWJlcltdXCIgOiBcInN0cmluZ1tdXCI7XG4gIH1cblxuICAvKipcbiAgICog7Lus65+8IOqwkiDrsLDsl7TsnZggVFMg7YOA7J6F7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICogSGFzTWFueSDroZzrjZTsnZggZnJvbUlkcyDtg4DsnoXsnLzroZwg7IKs7Jqp65Cp64uI64ukLiDroZzrjZTripQg67aA66qoIO2WieyXkOyEnCBmcm9tQ29sdW1uKOq4sOuzuCBpZCkg6rCS7J2EIOq6vOuDheuLiOuLpC5cbiAgICovXG4gIGdldENvbHVtbkFycmF5VHlwZShjb2x1bW46IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGNvbHVtbiA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRQa0FycmF5VHlwZSgpO1xuICAgIH1cbiAgICBjb25zdCBwcm9wID1cbiAgICAgIHRoaXMucHJvcHNEaWN0W2NvbHVtbl0gPz9cbiAgICAgIHRoaXMucHJvcHMuZmluZChcbiAgICAgICAgKHApID0+XG4gICAgICAgICAgKGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHApIHx8IChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHApICYmIHAuaGFzSm9pbkNvbHVtbikpICYmXG4gICAgICAgICAgYCR7cC5uYW1lfV9pZGAgPT09IGNvbHVtbixcbiAgICAgICk7XG4gICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICByZXR1cm4gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKS5nZXRQa0FycmF5VHlwZSgpO1xuICAgIH1cbiAgICByZXR1cm4gaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSB8fCBpc051bWJlclNpbmdsZVByb3AocHJvcCkgPyBcIm51bWJlcltdXCIgOiBcInN0cmluZ1tdXCI7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQVFzQyxZQUFBO0NBQ1MscUJBQUE7Q0FnQnhCLFdBQUE7Q0FhMkIsZUFBQTtDQUNSLGNBQUE7Q0FDTyxnQkFBQTtDQUNLLG1CQUFBO0NBQ0ssV0FBQTtDQUdYLG9CQUFBO0NBRW5DLFNBQWIsTUFBb0I7RUFDbEI7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFLQTtFQUNBO0VBR0E7RUFHQTtFQUNBO0VBR0E7RUFHQSxRQUVJLENBQUM7RUFDTCxRQUVJLENBQUM7RUFDTCxhQUlJLENBQUM7RUFDTCxZQUVJLENBQUM7RUFDTCxjQUVJLENBQUM7RUFFTCxZQUFZLEVBQ1YsSUFDQSxVQUNBLE9BQ0EsT0FDQSxRQUNBLE1BQ0EsT0FDQSxTQUNBLFNBQ0EsU0FDYTtHQUViLEtBQUssS0FBSztHQUNWLEtBQUssV0FBVztHQUNoQixLQUFLLFFBQVEsU0FBUyxLQUFLO0dBQzNCLEtBQUssUUFBUSxTQUFTLFdBQVcsV0FBVyxXQUFXLFVBQVUsRUFBRSxDQUFDO0dBQ3BFLEtBQUssU0FBUztHQUNkLEtBQUssT0FBTztHQUdaLElBQUksT0FBTztJQUNULEtBQUssUUFBUSxNQUFNLEtBQUssU0FBUztLQUMvQixJQUFJLFdBQVcsSUFBSSxHQUNqQjtVQUFJLEtBQUssR0FBRyxTQUFTLFFBQVEsR0FDM0IsS0FBSyxLQUFLLEtBQUssR0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAmHxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,MAAM,CAuJvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAiGf"}
1
+ {"version":3,"file":"zod-converter.d.ts","sourceRoot":"","sources":["../../src/template/zod-converter.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoCxB,OAAO,EACL,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,aAAa,EAEnB,MAAM,gBAAgB,CAAC;AAexB;;GAEG;AACH,eAAO,MAAM,cAAc;aACzB,UAAU;iBACR,MAAM;iBACN,UAAU,EAAE,iBAAiB;iBAC7B,UAAU,EAAE,kBAAkB;;aAEhC,cAAc;iBACZ,MAAM;iBACN,UAAU,EAAE,uBAAuB;iBACnC,UAAU,EAAE,uBAAuB;;CAE7B,CAAC;AAqGX;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CA8B7E;AAED;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAsG3E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0HrF;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,MAAM,CA0BjG;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,GAAG,MAAM,CAwHxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,MAAM,CAwJvF;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,CAAC,CAAC,UAAU,EACrB,OAAO,GAAE,MAAe,GACvB,aAAa,CAiGf"}
@@ -259,7 +259,10 @@ function zodTypeToTsTypeDef(zt) {
259
259
  case "default": return zodTypeToTsTypeDef(zt.def.innerType);
260
260
  case "record": {
261
261
  const recordType = zt;
262
- return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
262
+ const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
263
+ const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
264
+ if (recordType.def.partial) return `Partial<Record<${keyType}, ${valueType}>>`;
265
+ return `{ [ key: ${keyType} ]: ${valueType}}`;
263
266
  }
264
267
  case "literal": return Array.from(zt.values).map((value) => {
265
268
  if (isStringValue(value)) return `"${value}"`;
@@ -322,7 +325,7 @@ function zodTypeToZodCode(zt, injectImportKeys = []) {
322
325
  }
323
326
  case "record": {
324
327
  const zRecordDef = zt.def;
325
- return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
328
+ return `z.${zRecordDef.partial ? "partialRecord" : "record"}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(zRecordDef.valueType, injectImportKeys)})`;
326
329
  }
327
330
  case "literal": {
328
331
  const items = Array.from(zt.values).map((value) => {
@@ -479,4 +482,4 @@ var init_zod_converter = __esmMin((() => {
479
482
  init_zod_converter();
480
483
  export { BUILT_IN_TYPES, getZodTypeById, init_zod_converter, propNodeToZodTypeDef, propToZodType, propToZodTypeDef, zodTypeToRenderingNode, zodTypeToTsTypeDef, zodTypeToZodCode };
481
484
 
482
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIHJldHVybiBgeyBbIGtleTogJHt6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSl9IF06ICR7em9kVHlwZVRvVHNUeXBlRGVmKHJlY29yZFR5cGUuZGVmLnZhbHVlVHlwZSl9fWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsXG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgICB9KVxuICAgICAgICAuam9pbihcIiB8IFwiKTtcbiAgICBjYXNlIFwidW5pb25cIjpcbiAgICAgIHJldHVybiBgJHtcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kVW5pb25cbiAgICAgICAgKS5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiB6b2RUeXBlVG9Uc1R5cGVEZWYob3B0aW9uKSlcbiAgICAgICAgICAuam9pbihcIiB8IFwiKVxuICAgICAgfWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIHJldHVybiBgJHsvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEVudW0pLm9wdGlvbnMubWFwKCh2YWwpID0+IGBcIiR7dmFsfVwiYCkuam9pbihcIiB8IFwiKX1gO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RBcnJheSkuZWxlbWVudCl9W11gO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKChrZXkpID0+IHtcbiAgICAgICAgICBpZiAob2JqZWN0RmllbGRzW2tleV0uZGVmLnR5cGUgPT09IFwib3B0aW9uYWxcIikge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX0/OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XS5kZWYuaW5uZXJUeXBlKX0sYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGAke2tleX06ICR7em9kVHlwZVRvVHNUeXBlRGVmKG9iamVjdEZpZWxkc1trZXldKX0sYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBcIn1cIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvVHNUeXBlRGVmKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE9wdGlvbmFsKS5kZWYuaW5uZXJUeXBlKX0gfCB1bmRlZmluZWRgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbOydgCBzdHJpbmfsnLzroZwg7Y+067CxXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInN0cmluZ1wiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBUeXBlU2NyaXB0IO2DgOyehSDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66as7YSw65+0IOqwkiAoc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4sIG51bGwsIHVuZGVmaW5lZClcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUocGFydCkpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cGFydH1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVRvVHNUeXBlRGVmKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBgJFxceyR7aW5uZXJUeXBlfX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBgXFwke3N0cmluZ31gO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBgXFxgJHtwYXJ0cy5qb2luKFwiXCIpfVxcYGA7XG4gICAgfVxuICAgIGNhc2UgXCJmaWxlXCI6XG4gICAgICByZXR1cm4gXCJGaWxlXCI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIOyduOyKpO2EtOyKpOulvCDtlbTri7ntlZjripQgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvWm9kQ29kZSh6dDogei5ab2RUeXBlLCBpbmplY3RJbXBvcnRLZXlzOiBzdHJpbmdbXSA9IFtdKTogc3RyaW5nIHtcbiAgY29uc3QgYnVpbHRJblNjaGVtYU5hbWUgPSBnZXRCdWlsdEluU2NoZW1hTmFtZSh6dCk7XG4gIGlmIChidWlsdEluU2NoZW1hTmFtZSkge1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChidWlsdEluU2NoZW1hTmFtZSk7XG4gICAgcmV0dXJuIGJ1aWx0SW5TY2hlbWFOYW1lO1xuICB9XG5cbiAgc3dpdGNoICh6dC5kZWYudHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bWJlcigpXCI7XG4gICAgY2FzZSBcImJpZ2ludFwiOlxuICAgICAgcmV0dXJuIFwiei5iaWdpbnQoKVwiO1xuICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICByZXR1cm4gXCJ6LmJvb2xlYW4oKVwiO1xuICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6LmRhdGUoKVwiO1xuICAgIGNhc2UgXCJudWxsXCI6XG4gICAgICByZXR1cm4gXCJ6Lm51bGwoKVwiO1xuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICAgIHJldHVybiBcInoudW5kZWZpbmVkKClcIjtcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgICByZXR1cm4gXCJ6LmFueSgpXCI7XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICAgIHJldHVybiBcInoudW5rbm93bigpXCI7XG4gICAgY2FzZSBcIm5ldmVyXCI6XG4gICAgICByZXR1cm4gXCJ6Lm5ldmVyKClcIjtcbiAgICBjYXNlIFwibnVsbGFibGVcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIEFueVpvZE51bGxhYmxlKS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ubnVsbGFibGUoKWA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjoge1xuICAgICAgY29uc3QgekRlZmF1bHREZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2REZWZhdWx0XG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoekRlZmF1bHREZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0uZGVmYXVsdCgke3pEZWZhdWx0RGVmLmRlZmF1bHRWYWx1ZX0pYDtcbiAgICB9XG4gICAgY2FzZSBcInJlY29yZFwiOiB7XG4gICAgICBjb25zdCB6UmVjb3JkRGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kUmVjb3JkXG4gICAgICAgICkuZGVmO1xuICAgICAgcmV0dXJuIGB6LnJlY29yZCgke3pvZFR5cGVUb1pvZENvZGUoelJlY29yZERlZi5rZXlUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0sICR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgelJlY29yZERlZi52YWx1ZVR5cGUsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSlgO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbDxzdHJpbmcgfCBudW1iZXI+XG4gICAgICAgICkudmFsdWVzLFxuICAgICAgKS5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHZhbHVlKSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoJHtpdGVtc1swXX0pYDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBgei5saXRlcmFsKFske2l0ZW1zLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJ1bmlvblwiOlxuICAgICAgcmV0dXJuIGB6LnVuaW9uKFske1xuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyBBbnlab2RVbmlvblxuICAgICAgICApLmRlZi5vcHRpb25zXG4gICAgICAgICAgLm1hcCgob3B0aW9uOiB6LlpvZFR5cGUpID0+IHpvZFR5cGVUb1pvZENvZGUob3B0aW9uLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgICAuam9pbihcIixcIilcbiAgICAgIH1dKWA7XG4gICAgY2FzZSBcImVudW1cIjpcbiAgICAgIC8vIE5PVEU6IHouZW51bShbXCJBXCIsIFwiQlwiXSnrj4Qgei5lbnVtKHsgQTogXCJBXCIsIEI6IFwiQlwiIH0p66GcIOyymOumrOuQqC5cbiAgICAgIHJldHVybiBgei5lbnVtKHske09iamVjdC5lbnRyaWVzKFxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEVudW1cbiAgICAgICAgKS5kZWYuZW50cmllcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgoW2tleSwgdmFsXSkgPT4gKGlzU3RyaW5nVmFsdWUodmFsKSA/IGAke2tleX06IFwiJHt2YWx9XCJgIDogYCR7a2V5fTogJHt2YWx9YCkpXG4gICAgICAgIC5qb2luKFwiLCBcIil9fSlgO1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgcmV0dXJuIGB6LmFycmF5KCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZEFycmF5PHouWm9kVHlwZT4pLmRlZi5lbGVtZW50LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcChcbiAgICAgICAgICAoa2V5KSA9PiBgJHtrZXl9OiAke3pvZFR5cGVUb1pvZENvZGUob2JqZWN0RmllbGRzW2tleV0sIGluamVjdEltcG9ydEtleXMpfSxgLFxuICAgICAgICApLFxuICAgICAgICBcIn0pXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1pvZENvZGUoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+KS5kZWYuaW5uZXJUeXBlLCBpbmplY3RJbXBvcnRLZXlzKX0ub3B0aW9uYWwoKWA7XG4gICAgY2FzZSBcImZpbGVcIjpcbiAgICAgIHJldHVybiBgei5maWxlKClgO1xuICAgIGNhc2UgXCJ0ZW1wbGF0ZV9saXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGRlZiA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RUZW1wbGF0ZUxpdGVyYWxcbiAgICAgICkuZGVmO1xuXG4gICAgICAvLyDruYggdGVtcGxhdGUgbGl0ZXJhbFxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJ6LnRlbXBsYXRlTGl0ZXJhbChbXSlcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgWm9kIOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmYXG4gICAgICBjb25zdCBwYXJ0cyA9IGRlZi5wYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgLy8g66y47J6Q7Je0IOumrO2EsOuftFxuICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZShwYXJ0KSkge1xuICAgICAgICAgIHJldHVybiBgXCIke3BhcnR9XCJgO1xuICAgICAgICB9XG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIHJldHVybiB6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyBwYXJ0IGFzIHouWm9kVHlwZSxcbiAgICAgICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGB6LnRlbXBsYXRlTGl0ZXJhbChbJHtwYXJ0cy5qb2luKFwiLCBcIil9XSlgO1xuICAgIH1cbiAgICBjYXNlIFwiaW50ZXJzZWN0aW9uXCI6IHtcbiAgICAgIGNvbnN0IHpJbnRlcnNlY3Rpb25EZWYgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgICB6dCBhcyB6LlpvZEludGVyc2VjdGlvbjx6LlpvZFR5cGUsIHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWY7XG4gICAgICByZXR1cm4gYHouaW50ZXJzZWN0aW9uKCR7em9kVHlwZVRvWm9kQ29kZShcbiAgICAgICAgekludGVyc2VjdGlvbkRlZi5sZWZ0LFxuICAgICAgICBpbmplY3RJbXBvcnRLZXlzLFxuICAgICAgKX0sICR7em9kVHlwZVRvWm9kQ29kZSh6SW50ZXJzZWN0aW9uRGVmLnJpZ2h0LCBpbmplY3RJbXBvcnRLZXlzKX0pYDtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihg7LKY66as65CY7KeAIOyViuydgCBab2RUeXBlICR7enQuZGVmLnR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIOyerOq3gOyggeycvOuhnCDspJHssqnrkJwg7YOA7J6F65Ok7J2EIOyymOumrO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gIHpvZFR5cGU6IHouWm9kVHlwZUFueSxcbiAgYmFzZUtleTogc3RyaW5nID0gXCJyb290XCIsXG4pOiBSZW5kZXJpbmdOb2RlIHtcbiAgY29uc3QgZGVmID0ge1xuICAgIG5hbWU6IGJhc2VLZXksXG4gICAgbGFiZWw6IGluZmxlY3Rpb24uY2FtZWxpemUoYmFzZUtleSwgZmFsc2UpLFxuICAgIHpvZFR5cGUsXG4gIH07XG5cbiAgLyoqXG4gICAqIOy8gOydtOyKpCDsspjrpqwg7Iic7IScXG4gICAqXG4gICAqIDEuIO2KueyImCDsvIDsnbTsiqQgKGRlc2NyaXB0aW9uIOq4sOuwmClcbiAgICogICAgLSBTb25hbXVGaWxlL1NvbmFtdUZpbGVbXSA6IHoub2JqZWN0L3ouYXJyYXnsnbTsp4Drp4wg7YyM7J28IOyXheuhnOuTnOyaqSDrgrTsnqUg7YOA7J6FXG4gICAqXG4gICAqIDIuIOydvOuwmCDsvIDsnbTsiqQgKGluc3RhbmNlb2Yg6riw67CYKVxuICAgKiAgICAtIHouWm9kT2JqZWN0IDog7J2867CYIOqwneyytFxuICAgKiAgICAtIHouWm9kQXJyYXkgOiDsnbzrsJgg67Cw7Je0XG4gICAqICAgICAgLSB2ZWN0b3IgOiB6LmFycmF5KHoubnVtYmVyKeydtOyngOunjCDrhKTsnbTrsI0g6riw67CY7Jy866GcIOuyoe2EsCDsnoTrsqDrlKlcbiAgICogICAgICAtIOydvOuwmCDrsLDsl7QgOiDqt7gg7Jm4XG4gICAqICAgIC0gei5ab2RVbmlvbiwgei5ab2RPcHRpb25hbCwgei5ab2ROdWxsYWJsZSA6IOycoO2LuOumrO2LsCDtg4DsnoVcbiAgICogICAgLSDquLDtg4AgOiByZXNvbHZlUmVuZGVyVHlwZSgp7Jy866GcIOyymOumrFxuICAgKi9cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlW10g7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGUtYXJyYXlcIiB9O1xuICB9XG5cbiAgLy8g7Yq57IiYIOy8gOydtOyKpDogU29uYW11RmlsZSDri6jsnbwg7YOA7J6FIOqwkOyngFxuICBpZiAoem9kVHlwZS5kZXNjcmlwdGlvbiA9PT0gXCJTb25hbXVGaWxlXCIpIHtcbiAgICByZXR1cm4geyAuLi5kZWYsIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIgfTtcbiAgfVxuXG4gIC8vIOydvOuwmCDsvIDsnbTsiqQ6IFpvZE9iamVjdCDssrTtgaxcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9iamVjdCkge1xuICAgIGNvbnN0IGNvbHVtbktleXMgPSBPYmplY3Qua2V5cyh6b2RUeXBlW1wic2hhcGVcIl0pO1xuICAgIGNvbnN0IGNoaWxkcmVuID0gY29sdW1uS2V5cy5tYXAoKGtleSkgPT4ge1xuICAgICAgY29uc3QgaW5uZXJUeXBlID0gem9kVHlwZVtcInNoYXBlXCJdW2tleV07XG4gICAgICByZXR1cm4gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShpbm5lclR5cGUsIGtleSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwib2JqZWN0XCIsXG4gICAgICBjaGlsZHJlbixcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEFycmF5KSB7XG4gICAgY29uc3QgaW5uZXJUeXBlID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlQW55PlxuICAgICAgKS5kZWYuZWxlbWVudDtcbiAgICAvLyB2ZWN0b3Ig7YOA7J6FIO2MkOuzhDogbnVtYmVyIOuwsOyXtOydtOuptOyEnCBlbWJlZGRpbmcsIHZlY3RvciDrk7HsnZgg7J2066aE7J2EIOqwgOynhCDqsr3smrBcbiAgICBpZiAoXG4gICAgICBpbm5lclR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlciAmJlxuICAgICAgKGJhc2VLZXkuaW5jbHVkZXMoXCJlbWJlZGRpbmdcIikgfHwgYmFzZUtleS5pbmNsdWRlcyhcInZlY3RvclwiKSlcbiAgICApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmRlZixcbiAgICAgICAgcmVuZGVyVHlwZTogXCJ2ZWN0b3JcIixcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiBcImFycmF5XCIsXG4gICAgICBlbGVtZW50OiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwgYmFzZUtleSksXG4gICAgfTtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIGNvbnN0IG9wdGlvbk5vZGVzID1cbiAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6b2RUeXBlIGFzIHouWm9kVW5pb248ei5ab2RUeXBlW10+XG4gICAgICApLmRlZi5vcHRpb25zLm1hcCgob3B0KSA9PiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKG9wdCwgYmFzZUtleSkpO1xuICAgIC8vIFRPRE86IFpvZFVuaW9u7J20IOuTpOyWtOyeiOuKlCDqsr3smrAg7ZW465Ok66eBXG4gICAgcmV0dXJuIG9wdGlvbk5vZGVzWzBdO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE9wdGlvbmFsKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RPcHRpb25hbDx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bGxhYmxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnpvZFR5cGVUb1JlbmRlcmluZ05vZGUoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2ROdWxsYWJsZTx6LlpvZFR5cGU+XG4gICAgICAgICkuZGVmLmlubmVyVHlwZSxcbiAgICAgICAgYmFzZUtleSxcbiAgICAgICksXG4gICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5kZWYsXG4gICAgICByZW5kZXJUeXBlOiByZXNvbHZlUmVuZGVyVHlwZShiYXNlS2V5LCB6b2RUeXBlKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyeheqzvCDtgqQg7J2066aE7Jy866Gc67aA7YSwIOyggeygiO2VnCBSZW5kZXJUeXBl7J2EIOqysOygle2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlbmRlclR5cGUoa2V5OiBzdHJpbmcsIHpvZFR5cGU6IHouWm9kVHlwZUFueSk6IFJlbmRlcmluZ05vZGVbXCJyZW5kZXJUeXBlXCJdIHtcbiAgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZERhdGUpIHtcbiAgICByZXR1cm4gXCJkYXRldGltZVwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LmNvcmUuJFpvZFN0cmluZykge1xuICAgIC8vIE5PVEU6IHouWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VmOuptCB6LnVybCgpLCB6LmVtYWlsKCkg65Ox7J2YIO2DgOyeheyXkOyEnCDrrLjsoJzqsIAg7IOd6riw66+A66GcIHouY29yZS4kWm9kU3RyaW5n7Jy866GcIOu5hOq1kO2VqFxuICAgIC8vIEZJWE1FOiBlbWFpbOydtOuCmCB1cmwg7YOA7J6FIOuTseyXkCDrjIDtlZwg7LKY66as6rCAIO2VhOyalO2VqFxuICAgIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNRTERhdGVUaW1lU3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1kYXRldGltZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiZGF0ZVwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGVcIjtcbiAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJpZFwiKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctaWRcIjtcbiAgICB9IGVsc2UgaWYgKGtleS5lbmRzV2l0aChcIl9pZFwiKSkge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWZrX2lkXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICAgIH1cbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2ROdW1iZXIpIHtcbiAgICBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZEJvb2xlYW4pIHtcbiAgICByZXR1cm4gXCJib29sZWFuXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRW51bSkge1xuICAgIHJldHVybiBcImVudW1zXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kUmVjb3JkKSB7XG4gICAgcmV0dXJuIFwicmVjb3JkXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQW55IHx8IHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVua25vd24pIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RVbmlvbikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZExpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RUZW1wbGF0ZUxpdGVyYWwpIHtcbiAgICByZXR1cm4gXCJzdHJpbmctcGxhaW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlLmRlZi50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIFwib2JqZWN0XCI7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtg4DsnoUg7YyM7IuxIOu2iOqwgCAke2tleX0gJHt6b2RUeXBlLmRlZi50eXBlfWApO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThGQSxTQUFTLHFCQUFxQixTQUF3QztDQUVwRSxPQURnQixPQUFPLFFBQVEsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksUUFBUSxnQkFBZ0IsTUFDbkYsQ0FBQSxHQUFVLEVBQUUsQ0FBQztBQUN0Qjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFpQztDQUN4RCxRQUFRLFFBQVI7RUFDRSxLQUFLLFdBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxlQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxTQUNFLE9BQU8sS0FBSyxPQUFPO0NBQ3ZCO0FBQ0Y7Ozs7O0FBTUEsU0FBUyxnQkFBZ0IsUUFBb0M7Q0FDM0QsUUFBUSxRQUFSO0VBQ0UsS0FBSyxTQUNILE9BQU8sRUFBRSxNQUFNO0VBQ2pCLEtBQUssUUFDSCxPQUFPLEVBQUUsS0FBSztFQUNoQixLQUFLLE9BQ0gsT0FBTyxFQUFFLElBQUk7RUFDZixLQUFLLFdBQ0gsT0FBTyxFQUFFLFFBQVE7RUFDbkIsS0FBSyxZQUNILE9BQU8sRUFBRSxTQUFTO0VBQ3BCLEtBQUssU0FDSCxPQUFPLEVBQUUsTUFBTTtFQUNqQixLQUFLLFVBQ0gsT0FBTyxFQUFFLE9BQU87RUFDbEIsS0FBSyxhQUNILE9BQU8sRUFBRSxVQUFVO0VBQ3JCLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssVUFDSCxPQUFPLEVBQUUsT0FBTztFQUNsQixLQUFLLFFBQ0gsT0FBTyxFQUFFLEtBQUs7RUFDaEIsS0FBSyxTQUNILE9BQU8sRUFBRSxNQUFNO0VBQ2pCLEtBQUssUUFDSCxPQUFPLEVBQUUsS0FBSztFQUNoQixLQUFLLFFBQ0gsT0FBTyxFQUFFLEtBQUs7RUFDaEIsS0FBSyxRQUNILE9BQU8sRUFBRSxLQUFLO0VBQ2hCLEtBQUssT0FDSCxPQUFPLEVBQUUsSUFBSTtFQUNmLEtBQUssVUFDSCxPQUFPLEVBQUUsT0FBTztFQUNsQixLQUFLLFVBQ0gsT0FBTyxFQUFFLE9BQU87RUFDbEIsS0FBSyxXQUNILE9BQU8sRUFBRSxJQUFJLEtBQUs7RUFDcEIsS0FBSyxXQUNILE9BQU8sRUFBRSxJQUFJLEtBQUs7RUFDcEIsS0FBSyxlQUNILE9BQU8sRUFBRSxJQUFJLFNBQVM7RUFDeEIsS0FBSyxlQUNILE9BQU8sRUFBRSxJQUFJLFNBQVM7RUFDeEIsS0FBSyxXQUNILE9BQU8sRUFBRSxLQUFLLEtBQUs7RUFDckIsS0FBSyxZQUNILE9BQU8sRUFBRSxLQUFLLE1BQU07RUFDdEIsS0FBSyxjQUNILE9BQU8sRUFBRSxLQUFLLFFBQVE7RUFDeEIsS0FBSyxjQUNILE9BQU8sRUFBRSxLQUFLLFFBQVE7RUFDeEIsS0FBSyxjQUNILE9BQU8sRUFBRSxLQUFLLFFBQVE7Q0FDMUI7QUFDRjs7Ozs7O0FBT0EsZUFBc0IsZUFBZSxXQUEwQztDQUU3RSxJQUVJLGtCQUNBLFNBQVMsU0FBUyxHQUNwQjtFQUNBLE1BQU0sY0FDSixlQUN3RDtFQUUxRCxJQUFJLENBQUMsYUFDSCxNQUFNLElBQUksTUFBTSxTQUFTLFVBQVUsa0JBQWtCO0VBRXZELE9BQU8sWUFBWSxPQUFPLFNBQVMsU0FBUztDQUM5QztDQUdBLE1BQU0sYUFBYSxjQUFjLGNBQWMsU0FBUztDQUN4RCxNQUFNLGdCQUFnQixLQUFLLEtBQ3pCLE9BQU8sYUFDUCxZQUFZLG9CQUFvQixXQUFXLElBQUksQ0FDakQ7Q0FFQSxNQUFNLFdBQVcsTUFBTSxPQURMLGdCQUFnQixhQUNKO0NBRTlCLElBQUksQ0FBQyxTQUFTLFlBQ1osTUFBTSxJQUFJLE1BQU0scUJBQXFCLFdBQVc7Q0FFbEQsT0FBTyxTQUFTLFVBQVUsQ0FBQyxTQUFTLFNBQVM7QUFDL0M7Ozs7O0FBTUEsZUFBc0IsY0FBYyxNQUF5QztDQUMzRSxJQUFJLFVBQXdCLEVBQUUsUUFBUTtDQUN0QyxJQUFJLG9CQUFvQixJQUFJLEdBQzFCLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJO01BQ3BCLElBQUksbUJBQW1CLElBQUksR0FDaEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU07TUFDNUIsSUFBSSx1QkFBdUIsSUFBSSxHQUNwQyxVQUFVLEVBQUUsT0FBTztNQUNkLElBQUksc0JBQXNCLElBQUksR0FDbkMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU07TUFDdEIsSUFBSSxpQkFBaUIsSUFBSSxHQUM5QixVQUFVLE1BQU0sZUFBZSxLQUFLLEVBQUU7TUFDakMsSUFBSSxnQkFBZ0IsSUFBSSxHQUM3QixXQUFXLE1BQU0sZUFBZSxLQUFLLEVBQUUsRUFBQSxDQUFHLE1BQU07TUFDM0MsSUFBSSxtQkFBbUIsSUFBSSxHQUFHO0VBQ25DLElBQUksS0FBSyxXQUFXO0dBQ2xCLFVBQVUsZ0JBQWdCLEtBQUssU0FBUztHQUN4QyxJQUFJLEtBQUssVUFBVSxTQUFTLFNBQzFCLFVBQ0UsUUFDQSxJQUFJLEtBQUssTUFBTTtFQUVyQixPQUFPLElBQUksS0FBSyxRQUNkLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEtBQUssTUFBTTtPQUVwQyxVQUFVLEVBQUUsT0FBTztDQUV2QixPQUFPLElBQUksa0JBQWtCLElBQUksR0FBRztFQUNsQyxJQUFJO0VBQ0osSUFBSSxLQUFLLFdBQVc7R0FDbEIsY0FBYyxnQkFBZ0IsS0FBSyxTQUFTO0dBQzVDLElBQUksS0FBSyxVQUFVLFNBQVMsYUFDMUIsY0FFSSxZQUNBLElBQUksS0FBSyxNQUFNO0VBRXZCLE9BQU8sSUFBSSxLQUFLLFFBQ2QsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksS0FBSyxNQUFNO09BRXhDLGNBQWMsRUFBRSxPQUFPO0VBRXpCLFVBQVUsWUFBWSxNQUFNO0NBQzlCLE9BQU8sSUFBSSxtQkFBbUIsSUFBSSxHQUNoQyxVQUFVLEVBQUUsT0FBTztNQUNkLElBQUksa0JBQWtCLElBQUksR0FDL0IsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU07TUFDdEIsSUFBSSxvQkFBb0IsSUFBSSxHQUNqQyxVQUFVLEVBQUUsT0FBTztNQUNkLElBQUksbUJBQW1CLElBQUksR0FDaEMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLE1BQU07TUFDdEIsSUFBSSxvQkFBb0IsSUFBSSxHQUNqQyxVQUFVLEVBQUUsUUFBUTtNQUNmLElBQUksbUJBQW1CLElBQUksR0FDaEMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDLE1BQU07TUFDdkIsSUFBSSxpQkFBaUIsSUFBSSxHQUM5QixVQUFVLEVBQUUsS0FBSztNQUNaLElBQUksZ0JBQWdCLElBQUksR0FDN0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU07TUFDcEIsSUFBSSxpQkFBaUIsSUFBSSxHQUM5QixVQUFVLEVBQUUsS0FBSztNQUNaLElBQUksZ0JBQWdCLElBQUksR0FDN0IsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLE1BQU07TUFDcEIsSUFBSSxXQUFXLElBQUksR0FDeEIsVUFBVSxNQUFNLGVBQWUsS0FBSyxFQUFFO01BQ2pDLElBQUksaUJBQWlCLElBQUksR0FDOUIsVUFBVSxFQUFFLE9BQU87TUFDZCxJQUFJLG1CQUFtQixJQUFJLEdBQ2hDLFVBQVUsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDO01BQ3ZCLElBQUksa0JBQWtCLElBQUksR0FDL0IsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7TUFDaEMsSUFBSSxjQUFjLElBQUksR0FDM0IsVUFBVSxNQUFNLGVBQWUsS0FBSyxFQUFFO01BQ2pDLElBQUksZUFBZSxJQUFJLEdBQzVCO01BQUksMkJBQTJCLElBQUksS0FBTSx1QkFBdUIsSUFBSSxLQUFLLEtBQUssZUFBZ0I7R0FHNUYsTUFBTSxTQURZLGNBQWMsSUFBSSxLQUFLLElBQzFCLENBQUEsQ0FBVSxVQUFVO0dBQ25DLElBQUksV0FBVyxZQUFZLFdBQVcsUUFDcEMsVUFBVSxFQUFFLE9BQU87UUFFbkIsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUk7RUFFN0I7UUFFQSxNQUFNLElBQUksTUFBTSw0QkFBNEIsS0FBSyxFQUFFO0NBR3JELElBRUksS0FDQSxVQUVGLFVBQ0UsUUFDQSxZQUFZO0NBRWhCLElBQUksS0FBSyxVQUNQLFVBQVUsUUFBUSxTQUFTO0NBRzdCLE9BQU87QUFDVDs7OztBQUtBLFNBQWdCLGlCQUFpQixNQUFrQixrQkFBb0M7Q0FDckYsSUFBSTtDQUNKLElBQUksb0JBQW9CLElBQUksR0FDMUIsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksbUJBQW1CLElBQUksR0FDaEMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksdUJBQXVCLElBQUksR0FDcEMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksc0JBQXNCLElBQUksR0FDbkMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksaUJBQWlCLElBQUksR0FBRztFQUNqQyxPQUFPLEdBQUcsS0FBSyxLQUFLLElBQUksS0FBSztFQUM3QixpQkFBaUIsS0FBSyxLQUFLLEVBQUU7Q0FDL0IsT0FBTyxJQUFJLGdCQUFnQixJQUFJLEdBQUc7RUFDaEMsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssR0FBRztFQUNoQyxpQkFBaUIsS0FBSyxLQUFLLEVBQUU7Q0FDL0IsT0FBTyxJQUFJLG1CQUFtQixJQUFJLEdBQUc7RUFDbkMsSUFBSSxLQUFLLFdBQVc7R0FDbEIsTUFBTSxPQUFPLGdCQUFnQixLQUFLLFNBQVM7R0FDM0MsSUFBSSxLQUFLLFFBQ1AsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxLQUFLLE9BQU87UUFFaEQsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJO0VBRTVCLE9BQU8sSUFBSSxLQUFLLFFBQ2QsT0FBTyxHQUFHLEtBQUssS0FBSyxtQkFBbUIsS0FBSyxPQUFPO09BRW5ELE9BQU8sR0FBRyxLQUFLLEtBQUs7Q0FFeEIsT0FBTyxJQUFJLGtCQUFrQixJQUFJLEdBQUc7RUFDbEMsSUFBSSxLQUFLLFdBQVc7R0FDbEIsTUFBTSxPQUFPLGdCQUFnQixLQUFLLFNBQVM7R0FDM0MsSUFBSSxLQUFLLFFBQ1AsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUssT0FBTyxLQUFLLE9BQU87UUFFaEQsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUs7RUFFakMsT0FBTyxJQUFJLEtBQUssUUFDZCxPQUFPLEdBQUcsS0FBSyxLQUFLLG1CQUFtQixLQUFLLE9BQU87T0FFbkQsT0FBTyxHQUFHLEtBQUssS0FBSztDQUV4QixPQUFPLElBQUksbUJBQW1CLElBQUksR0FDaEMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksa0JBQWtCLElBQUksR0FDL0IsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksb0JBQW9CLElBQUksR0FDakMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksbUJBQW1CLElBQUksR0FDaEMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksaUJBQWlCLElBQUksR0FDOUIsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksZ0JBQWdCLElBQUksR0FDN0IsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksb0JBQW9CLElBQUksR0FDakMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksbUJBQW1CLElBQUksR0FDaEMsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksaUJBQWlCLElBQUksR0FDOUIsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksZ0JBQWdCLElBQUksR0FDN0IsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksV0FBVyxJQUFJLEdBQUc7RUFFM0IsSUFFSSxrQkFDQSxTQUFTLEtBQUssRUFBRSxHQUNsQjtHQUNBLE1BQU0sYUFBYSxLQUFLLE9BQU8sZUFBZSxxQkFBcUI7R0FDbkUsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJO0dBQ3hCLGlCQUFpQixLQUFLLFVBQVU7RUFDbEMsT0FBTztHQUNMLE9BQU8sR0FBRyxLQUFLLEtBQUssSUFBSSxLQUFLO0dBQzdCLGlCQUFpQixLQUFLLEtBQUssRUFBRTtFQUMvQjtDQUNGLE9BQU8sSUFBSSxpQkFBaUIsSUFBSSxHQUM5QixPQUFPLEdBQUcsS0FBSyxLQUFLO01BQ2YsSUFBSSxtQkFBbUIsSUFBSSxHQUNoQyxPQUFPLEdBQUcsS0FBSyxLQUFLO01BQ2YsSUFBSSxrQkFBa0IsSUFBSSxHQUMvQixPQUFPLEdBQUcsS0FBSyxLQUFLO01BQ2YsSUFBSSxlQUFlLElBQUksR0FDNUIsT0FBTyxHQUFHLEtBQUssS0FBSztNQUNmLElBQUksY0FBYyxJQUFJLEdBQUc7RUFDOUIsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLEtBQUs7RUFDN0IsaUJBQWlCLEtBQUssS0FBSyxFQUFFO0NBQy9CLE9BQU8sSUFBSSxlQUFlLElBQUksR0FBRztFQUMvQixJQUFJLDJCQUEyQixJQUFJLEtBQU0sdUJBQXVCLElBQUksS0FBSyxLQUFLLGVBQWdCO0dBRzVGLE1BQU0sU0FEWSxjQUFjLElBQUksS0FBSyxJQUMxQixDQUFBLENBQVUsVUFBVTtHQUNuQyxJQUFJLFdBQVcsWUFBWSxXQUFXLFFBQ3BDLE9BQU8sR0FBRyxLQUFLLEtBQUs7UUFFcEIsT0FBTyxHQUFHLEtBQUssS0FBSztFQUV4QixPQUVFLE9BQU8sTUFBTSxLQUFLLEtBQUssSUFBSSxLQUFLLGFBQWEsR0FBRyxLQUFLO0NBRXpELE9BQ0UsT0FBTztDQUdULElBRUksS0FDQSxVQUVGLFFBQVE7Q0FFVixJQUFJLEtBQUssVUFDUCxRQUFRO0NBSVYsSUFBSSxvQkFBb0IsSUFBSSxLQUFLLG1CQUFtQixJQUFJLEdBQ3RELFFBQVE7Q0FHVixPQUFPLEdBQUcsS0FBSztBQUNqQjs7Ozs7QUFNQSxTQUFnQixxQkFBcUIsVUFBMEIsa0JBQW9DO0NBQ2pHLElBQUksU0FBUyxhQUFhLFNBQ3hCLE9BQU8saUJBQWlCLFNBQVMsTUFBTSxnQkFBZ0I7TUFDbEQsSUFBSSxTQUFTLGFBQWEsU0FDL0IsT0FBTztFQUNMLFNBQVMsT0FBTyxHQUFHLFNBQVMsS0FBSyxLQUFLLE1BQU07RUFDNUM7RUFDQSxTQUFTLFNBQ04sS0FBSyxrQkFBa0IscUJBQXFCLGVBQWUsZ0JBQWdCLENBQUMsQ0FBQyxDQUM3RSxLQUFLLElBQUk7RUFDWjtFQUNBO0NBQ0YsQ0FBQyxDQUFDLEtBQUssSUFBSTtNQUNOLElBQUksU0FBUyxhQUFhLFVBQy9CLE9BQU87RUFDTCxTQUFTLE9BQU8sR0FBRyxTQUFTLEtBQUssS0FBSyxNQUFNO0VBQzVDO0VBQ0EsU0FBUyxTQUNOLEtBQUssa0JBQWtCLHFCQUFxQixlQUFlLGdCQUFnQixDQUFDLENBQUMsQ0FDN0UsS0FBSyxJQUFJO0VBQ1o7RUFDQSxLQUFLLFNBQVMsTUFBTSxXQUFXLGdCQUFnQixHQUFHO0NBQ3BELENBQUMsQ0FBQyxLQUFLLElBQUk7TUFFWCxNQUFNO0FBRVY7QUFFQSxTQUFnQixtQkFBbUIsSUFBdUI7Q0FDeEQsUUFBUSxHQUFHLElBQUksTUFBZjtFQUNFLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSztFQUNMLEtBQUs7RUFDTCxLQUFLO0VBQ0wsS0FBSyxTQUNILE9BQU8sR0FBRyxJQUFJO0VBQ2hCLEtBQUssUUFDSCxPQUFPO0VBQ1QsS0FBSyxZQUNILE9BQU8sR0FBRyxtQkFBMEUsR0FBc0IsSUFBSSxTQUFTLEVBQUU7RUFDM0gsS0FBSyxXQUNILE9BQU8sbUJBRUgsR0FDQSxJQUFJLFNBQ1I7RUFDRixLQUFLLFVBQVU7R0FDYixNQUFNLGFBQ2tEO0dBQ3hELE9BQU8sWUFBWSxtQkFBbUIsV0FBVyxJQUFJLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixXQUFXLElBQUksU0FBUyxFQUFFO0VBQ25IO0VBQ0EsS0FBSyxXQUNILE9BQU8sTUFBTSxLQUVULEdBQ0EsTUFDSixDQUFDLENBQ0UsS0FBSyxVQUFVO0dBQ2QsSUFBSSxjQUFjLEtBQUssR0FDckIsT0FBTyxJQUFJLE1BQU07R0FHbkIsSUFBSSxVQUFVLE1BQ1osT0FBTztHQUdULElBQUksVUFBVSxRQUNaLE9BQU87R0FHVCxPQUFPLEdBQUc7RUFDWixDQUFDLENBQUMsQ0FDRCxLQUFLLEtBQUs7RUFDZixLQUFLLFNBQ0gsT0FBTyxHQUVILEdBQ0EsUUFDQyxLQUFLLFdBQVcsbUJBQW1CLE1BQU0sQ0FBQyxDQUFDLENBQzNDLEtBQUssS0FBSztFQUVqQixLQUFLLFFBQ0gsT0FBTyxHQUEwRCxHQUFpQixRQUFRLEtBQUssUUFBUSxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLO0VBQy9ILEtBQUssU0FDSCxPQUFPLEdBQUcsbUJBQTBFLEdBQW1CLE9BQU8sRUFBRTtFQUNsSCxLQUFLLFVBQVU7R0FDYixNQUFNLGVBQ0osR0FDQTtHQUNGLE9BQU87SUFDTDtJQUNBLEdBQUcsT0FBTyxLQUFLLFlBQVksQ0FBQyxDQUFDLEtBQUssUUFBUTtLQUN4QyxJQUFJLGFBQWEsSUFBSSxDQUFDLElBQUksU0FBUyxZQUNqQyxPQUFPLEdBQUcsSUFBSSxLQUFLLG1CQUFtQixhQUFhLElBQUksQ0FBQyxJQUFJLFNBQVMsRUFBRTtVQUV2RSxPQUFPLEdBQUcsSUFBSSxJQUFJLG1CQUFtQixhQUFhLElBQUksRUFBRTtJQUU1RCxDQUFDO0lBQ0Q7R0FDRixDQUFDLENBQUMsS0FBSyxJQUFJO0VBQ2I7RUFDQSxLQUFLLFlBQ0gsT0FBTyxHQUFHLG1CQUEwRSxHQUFzQixJQUFJLFNBQVMsRUFBRTtFQUMzSCxLQUFLLG9CQUFvQjtHQUN2QixNQUFNLE1BQ0osR0FDQTtHQUdGLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxNQUFNLFdBQVcsR0FDckMsT0FBTztHQXNCVCxPQUFPLEtBbEJPLElBQUksTUFBTSxLQUFLLFNBQVM7SUFFcEMsSUFBSSxjQUFjLElBQUksR0FDcEIsT0FBTyxHQUFHO0lBSVosSUFBSSxRQUFRLGNBQWMsSUFBSSxLQUFLLGdCQUFnQixFQUFFLFNBSW5ELE9BQU8sTUFIVyxtQkFDc0MsSUFFM0MsRUFBVTtJQUl6QixPQUFPO0dBQ1QsQ0FFWSxDQUFBLENBQU0sS0FBSyxFQUFFLEVBQUU7RUFDN0I7RUFDQSxLQUFLLFFBQ0gsT0FBTztFQUNULFNBQ0UsTUFBTSxJQUFJLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxNQUFNO0NBQ3BEO0FBQ0Y7Ozs7QUFLQSxTQUFnQixpQkFBaUIsSUFBZSxtQkFBNkIsQ0FBQyxHQUFXO0NBQ3ZGLE1BQU0sb0JBQW9CLHFCQUFxQixFQUFFO0NBQ2pELElBQUksbUJBQW1CO0VBQ3JCLGlCQUFpQixLQUFLLGlCQUFpQjtFQUN2QyxPQUFPO0NBQ1Q7Q0FFQSxRQUFRLEdBQUcsSUFBSSxNQUFmO0VBQ0UsS0FBSyxVQUNILE9BQU87RUFDVCxLQUFLLFVBQ0gsT0FBTztFQUNULEtBQUssVUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFFBQ0gsT0FBTztFQUNULEtBQUssUUFDSCxPQUFPO0VBQ1QsS0FBSyxhQUNILE9BQU87RUFDVCxLQUFLLE9BQ0gsT0FBTztFQUNULEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxTQUNILE9BQU87RUFDVCxLQUFLLFlBQ0gsT0FBTyxHQUFHLGlCQUF3RSxHQUFzQixJQUFJLFdBQVcsZ0JBQWdCLEVBQUU7RUFDM0ksS0FBSyxXQUFXO0dBQ2QsTUFBTSxjQUVGLEdBQ0E7R0FDSixPQUFPLEdBQUcsaUJBQWlCLFlBQVksV0FBVyxnQkFBZ0IsRUFBRSxXQUFXLFlBQVksYUFBYTtFQUMxRztFQUNBLEtBQUssVUFBVTtHQUNiLE1BQU0sYUFFRixHQUNBO0dBQ0osT0FBTyxZQUFZLGlCQUFpQixXQUFXLFNBQVMsZ0JBQWdCLEVBQUUsSUFBSSxpQkFDNUUsV0FBVyxXQUNYLGdCQUNGLEVBQUU7RUFDSjtFQUNBLEtBQUssV0FBVztHQUNkLE1BQU0sUUFBUSxNQUFNLEtBRWhCLEdBQ0EsTUFDSixDQUFDLENBQUMsS0FBSyxVQUFVO0lBQ2YsSUFBSSxjQUFjLEtBQUssR0FDckIsT0FBTyxJQUFJLE1BQU07SUFHbkIsSUFBSSxVQUFVLE1BQ1osT0FBTztJQUdULElBQUksVUFBVSxRQUNaLE9BQU87SUFHVCxPQUFPLEdBQUc7R0FDWixDQUFDO0dBRUQsSUFBSSxNQUFNLFdBQVcsR0FDbkIsT0FBTyxhQUFhLE1BQU0sR0FBRztHQUUvQixPQUFPLGNBQWMsTUFBTSxLQUFLLElBQUksRUFBRTtFQUN4QztFQUNBLEtBQUssU0FDSCxPQUFPLFlBRUgsR0FDQSxJQUFJLFFBQ0gsS0FBSyxXQUFzQixpQkFBaUIsUUFBUSxnQkFBZ0IsQ0FBQyxDQUFDLENBQ3RFLEtBQUssR0FBRyxFQUNaO0VBQ0gsS0FBSyxRQUVILE9BQU8sV0FBVyxPQUFPLFFBRXJCLEdBQ0EsSUFBSSxPQUNSLENBQUMsQ0FDRSxLQUFLLENBQUMsS0FBSyxTQUFVLGNBQWMsR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLElBQUksS0FBSyxHQUFHLElBQUksSUFBSSxLQUFNLENBQUMsQ0FDakYsS0FBSyxJQUFJLEVBQUU7RUFDaEIsS0FBSyxTQUNILE9BQU8sV0FBVyxpQkFBd0UsR0FBNkIsSUFBSSxTQUFTLGdCQUFnQixFQUFFO0VBQ3hKLEtBQUssVUFBVTtHQUNiLE1BQU0sZUFDSixHQUNBO0dBQ0YsT0FBTztJQUNMO0lBQ0EsR0FBRyxPQUFPLEtBQUssWUFBWSxDQUFDLENBQUMsS0FDMUIsUUFBUSxHQUFHLElBQUksSUFBSSxpQkFBaUIsYUFBYSxNQUFNLGdCQUFnQixFQUFFLEVBQzVFO0lBQ0E7R0FDRixDQUFDLENBQUMsS0FBSyxJQUFJO0VBQ2I7RUFDQSxLQUFLLFlBQ0gsT0FBTyxHQUFHLGlCQUF3RSxHQUFnQyxJQUFJLFdBQVcsZ0JBQWdCLEVBQUU7RUFDckosS0FBSyxRQUNILE9BQU87RUFDVCxLQUFLLG9CQUFvQjtHQUN2QixNQUFNLE1BQ0osR0FDQTtHQUdGLElBQUksQ0FBQyxJQUFJLFNBQVMsSUFBSSxNQUFNLFdBQVcsR0FDckMsT0FBTztHQXFCVCxPQUFPLHNCQWpCTyxJQUFJLE1BQU0sS0FBSyxTQUFTO0lBRXBDLElBQUksY0FBYyxJQUFJLEdBQ3BCLE9BQU8sSUFBSSxLQUFLO0lBR2xCLElBQUksUUFBUSxjQUFjLElBQUksS0FBSyxnQkFBZ0IsRUFBRSxTQUNuRCxPQUFPLGlCQUNpRCxNQUN0RCxnQkFDRjtJQUlGLE9BQU87R0FDVCxDQUU2QixDQUFBLENBQU0sS0FBSyxJQUFJLEVBQUU7RUFDaEQ7RUFDQSxLQUFLLGdCQUFnQjtHQUNuQixNQUFNLG1CQUVGLEdBQ0E7R0FDSixPQUFPLGtCQUFrQixpQkFDdkIsaUJBQWlCLE1BQ2pCLGdCQUNGLEVBQUUsSUFBSSxpQkFBaUIsaUJBQWlCLE9BQU8sZ0JBQWdCLEVBQUU7RUFDbkU7RUFDQSxTQUNFLE1BQU0sSUFBSSxNQUFNLG1CQUFtQixHQUFHLElBQUksTUFBTTtDQUNwRDtBQUNGOzs7OztBQU1BLFNBQWdCLHVCQUNkLFNBQ0EsVUFBa0IsUUFDSDtDQUNmLE1BQU0sTUFBTTtFQUNWLE1BQU07RUFDTixPQUFPLFdBQVcsU0FBUyxTQUFTLEtBQUs7RUFDekM7Q0FDRjs7Ozs7Ozs7Ozs7Ozs7O0NBa0JBLElBQUksUUFBUSxnQkFBZ0IsZ0JBQzFCLE9BQU87RUFBRSxHQUFHO0VBQUssWUFBWTtDQUF3QjtDQUl2RCxJQUFJLFFBQVEsZ0JBQWdCLGNBQzFCLE9BQU87RUFBRSxHQUFHO0VBQUssWUFBWTtDQUFrQjtDQUlqRCxJQUFJLG1CQUFtQixFQUFFLFdBQVc7RUFFbEMsTUFBTSxXQURhLE9BQU8sS0FBSyxRQUFRLFFBQ3RCLENBQUEsQ0FBVyxLQUFLLFFBQVE7R0FDdkMsTUFBTSxZQUFZLFFBQVEsUUFBUSxDQUFDO0dBQ25DLE9BQU8sdUJBQXVCLFdBQVcsR0FBRztFQUM5QyxDQUFDO0VBQ0QsT0FBTztHQUNMLEdBQUc7R0FDSCxZQUFZO0dBQ1o7RUFDRjtDQUNGLE9BQU8sSUFBSSxtQkFBbUIsRUFBRSxVQUFVO0VBQ3hDLE1BQU0sWUFFRixRQUNBLElBQUk7RUFFUixJQUNFLHFCQUFxQixFQUFFLGNBQ3RCLFFBQVEsU0FBUyxXQUFXLEtBQUssUUFBUSxTQUFTLFFBQVEsSUFFM0QsT0FBTztHQUNMLEdBQUc7R0FDSCxZQUFZO0VBQ2Q7RUFFRixPQUFPO0dBQ0wsR0FBRztHQUNILFlBQVk7R0FDWixTQUFTLHVCQUF1QixXQUFXLE9BQU87RUFDcEQ7Q0FDRixPQUFPLElBQUksbUJBQW1CLEVBQUUsVUFNOUIsT0FISSxRQUNBLElBQUksUUFBUSxLQUFLLFFBQVEsdUJBQXVCLEtBQUssT0FBTyxDQUV6RCxDQUFBLENBQVk7TUFDZCxJQUFJLG1CQUFtQixFQUFFLGFBQzlCLE9BQU87RUFDTCxHQUFHLHVCQUVDLFFBQ0EsSUFBSSxXQUNOLE9BQ0Y7RUFDQSxVQUFVO0NBQ1o7TUFDSyxJQUFJLG1CQUFtQixFQUFFLGFBQzlCLE9BQU87RUFDTCxHQUFHLHVCQUVDLFFBQ0EsSUFBSSxXQUNOLE9BQ0Y7RUFDQSxVQUFVO0NBQ1o7TUFFQSxPQUFPO0VBQ0wsR0FBRztFQUNILFlBQVksa0JBQWtCLFNBQVMsT0FBTztDQUNoRDtBQUVKOzs7O0FBS0EsU0FBUyxrQkFBa0IsS0FBYSxTQUFvRDtDQUMxRixJQUFJLG1CQUFtQixFQUFFLFNBQ3ZCLE9BQU87TUFDRixJQUFJLG1CQUFtQixFQUFFLEtBQUssWUFBWTtFQUcvQyxJQUFJLFFBQVEsZ0JBQWdCLHFCQUMxQixPQUFPO09BQ0YsSUFBSSxJQUFJLFNBQVMsTUFBTSxHQUM1QixPQUFPO09BQ0YsSUFBSSxRQUFRLE1BQ2pCLE9BQU87T0FDRixJQUFJLElBQUksU0FBUyxLQUFLLEdBQzNCLE9BQU87T0FFUCxPQUFPO0NBRVgsT0FBTyxJQUFJLG1CQUFtQixFQUFFLFdBQVc7RUFDekMsSUFBSSxRQUFRLE1BQ1YsT0FBTztPQUNGLElBQUksSUFBSSxTQUFTLEtBQUssR0FDM0IsT0FBTztPQUVQLE9BQU87Q0FFWCxPQUFPLElBQUksbUJBQW1CLEVBQUUsWUFDOUIsT0FBTztNQUNGLElBQUksbUJBQW1CLEVBQUUsU0FDOUIsT0FBTztNQUNGLElBQUksbUJBQW1CLEVBQUUsV0FDOUIsT0FBTztNQUNGLElBQUksbUJBQW1CLEVBQUUsVUFBVSxtQkFBbUIsRUFBRSxZQUM3RCxPQUFPO01BQ0YsSUFBSSxtQkFBbUIsRUFBRSxVQUM5QixPQUFPO01BQ0YsSUFBSSxtQkFBbUIsRUFBRSxZQUM5QixPQUFPO01BQ0YsSUFBSSxtQkFBbUIsRUFBRSxvQkFDOUIsT0FBTztNQUNGLElBQUksUUFBUSxJQUFJLFNBQVMsVUFDOUIsT0FBTztNQUVQLE1BQU0sSUFBSSxNQUFNLFlBQVksSUFBSSxHQUFHLFFBQVEsSUFBSSxNQUFNO0FBRXpEOzs7Q0FuNEJzQyxZQUFBO0NBQ2tCLG9CQUFBO0NBZ0NqQyxXQUFBO0NBTzZCLGVBQUE7Q0FDSCxnQkFBQTtDQUNvQixtQkFBQTtDQWV4RCxpQkFBaUI7RUFDNUIsWUFBWTtHQUNWLFFBQVE7R0FDUixZQUFZO0dBQ1osWUFBWTtFQUNkO0VBQ0EsZ0JBQWdCO0dBQ2QsUUFBUTtHQUNSLFlBQVk7R0FDWixZQUFZO0VBQ2Q7Q0FDRiJ9
485
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kLWNvbnZlcnRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVtcGxhdGUvem9kLWNvbnZlcnRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuLyoqXG4gKiB6b2QtY29udmVydGVyIOq1rOyEsVxuICogMS4g7Jyg7Yu466as7YuwXG4gKiAgLSBnZXRab2RUeXBlQnlJZFxuICpcbiAqIDIuIFpvZCDtg4DsnoUg67OA7ZmYIChFbnRpdHlQcm9wIC0+IFpvZFR5cGUpXG4gKiAgLSBwcm9wVG9ab2RUeXBlXG4gKlxuICogMy4gRW50aXR5UHJvcC9Ob2RlIC0+IFpvZCDsvZTrk5wg66y47J6Q7Je0XG4gKiAgLSBwcm9wVG9ab2RUeXBlRGVmXG4gKiAgLSBwcm9wTm9kZVRvWm9kVHlwZURlZlxuICpcbiAqIDQuIFpvZCDtg4DsnoUg7J247Iqk7YS07Iqk66W8IO2VtOuLue2VmOuKlCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZggKFpvZFR5cGUgLT4gWm9kQ29kZSlcbiAqICAtIHpvZFR5cGVUb1pvZENvZGVcbiAqXG4gKiA1LiBab2Qg7YOA7J6F7J2EIFVJIOugjOuNlOungeyXkCDsgqzsmqntlaAg7IiYIOyeiOuKlCBSZW5kZXJpbmdOb2Rl66GcIOuzgO2ZmCAoWm9kVHlwZSAtPiBSZW5kZXJpbmdOb2RlKVxuICogIC0gem9kVHlwZVRvUmVuZGVyaW5nTm9kZVxuICogIC0gcmVzb2x2ZVJlbmRlclR5cGVcbiAqL1xuXG5pbXBvcnQgaW5mbGVjdGlvbiBmcm9tIFwiaW5mbGVjdGlvblwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBCVUlMVF9JTl9UWVBFX0lEUyxcbiAgaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzQmlnSW50ZWdlckFycmF5UHJvcCxcbiAgaXNCaWdJbnRlZ2VyU2luZ2xlUHJvcCxcbiAgaXNCb29sZWFuQXJyYXlQcm9wLFxuICBpc0Jvb2xlYW5TaW5nbGVQcm9wLFxuICBpc0RhdGVBcnJheVByb3AsXG4gIGlzRGF0ZVNpbmdsZVByb3AsXG4gIGlzRW51bUFycmF5UHJvcCxcbiAgaXNFbnVtU2luZ2xlUHJvcCxcbiAgaXNJbnRlZ2VyQXJyYXlQcm9wLFxuICBpc0ludGVnZXJTaW5nbGVQcm9wLFxuICBpc0pzb25Qcm9wLFxuICBpc051bWJlckFycmF5UHJvcCxcbiAgaXNOdW1iZXJTaW5nbGVQcm9wLFxuICBpc051bWVyaWNBcnJheVByb3AsXG4gIGlzTnVtZXJpY1NpbmdsZVByb3AsXG4gIGlzT25lVG9PbmVSZWxhdGlvblByb3AsXG4gIGlzUmVsYXRpb25Qcm9wLFxuICBpc1NlYXJjaFRleHRQcm9wLFxuICBpc1N0cmluZ0FycmF5UHJvcCxcbiAgaXNTdHJpbmdTaW5nbGVQcm9wLFxuICBpc1RzVmVjdG9yUHJvcCxcbiAgaXNVdWlkQXJyYXlQcm9wLFxuICBpc1V1aWRTaW5nbGVQcm9wLFxuICBpc1ZlY3RvckFycmF5UHJvcCxcbiAgaXNWZWN0b3JTaW5nbGVQcm9wLFxuICBpc1ZpcnR1YWxQcm9wLFxuICBTb25hbXVGaWxlQXJyYXlTY2hlbWEsXG4gIFNvbmFtdUZpbGVTY2hlbWEsXG59IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBFbnRpdHlQcm9wLFxuICB0eXBlIEVudGl0eVByb3BOb2RlLFxuICB0eXBlIFJlbmRlcmluZ05vZGUsXG4gIHR5cGUgWm9kU3RyaW5nRm9ybWF0LFxufSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUltcG9ydFVybCB9IGZyb20gXCIuLi91dGlscy9lc20tdXRpbHNcIjtcbmltcG9ydCB7IHJ1bnRpbWVQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3BhdGgtdXRpbHNcIjtcbmltcG9ydCB7IGlzT2JqZWN0VmFsdWUsIGlzU3RyaW5nVmFsdWUgfSBmcm9tIFwiLi4vdXRpbHMvcnVudGltZS12YWx1ZVwiO1xuXG4vLyA8YW55PuulvCDsnpDsoJztlZjqs6AsIFpvZOyXkOyEnCDsoJzslb3tlZjripQg6riw67O47KCB7J24IEdlbmVyaWMgVHlwZSBQYXJhbWV0ZXLrpbwg7IKs7Jqp7ZWoLlxudHlwZSBBbnlab2RSZWNvcmQgPSB6LlpvZFJlY29yZDx6LlpvZFN0cmluZyB8IHouWm9kTnVtYmVyIHwgei5ab2RTeW1ib2wsIHouWm9kVHlwZT47XG50eXBlIEFueVpvZE9iamVjdCA9IHouWm9kT2JqZWN0O1xudHlwZSBBbnlab2ROdWxsYWJsZSA9IHouWm9kTnVsbGFibGU8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kRGVmYXVsdCA9IHouWm9kRGVmYXVsdDx6LlpvZFR5cGU+O1xudHlwZSBBbnlab2RVbmlvbiA9IHouWm9kVW5pb248ei5ab2RUeXBlW10+O1xudHlwZSBBbnlab2RBcnJheSA9IHouWm9kQXJyYXk8ei5ab2RUeXBlPjtcbnR5cGUgQW55Wm9kT3B0aW9uYWwgPSB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT47XG50eXBlIEFueVpvZFRlbXBsYXRlTGl0ZXJhbCA9IHouWm9kVGVtcGxhdGVMaXRlcmFsO1xuXG4vKipcbiAqIOuCtOyepSDtg4DsnoUg7KCV7J2YIChab2Qg7Iqk7YKk66eIICsgVUkg66CM642U66eBIO2DgOyehSlcbiAqL1xuZXhwb3J0IGNvbnN0IEJVSUxUX0lOX1RZUEVTID0ge1xuICBTb25hbXVGaWxlOiB7XG4gICAgc2NoZW1hOiBTb25hbXVGaWxlU2NoZW1hLFxuICAgIHJlbmRlclR5cGU6IFwianNvbi1zb25hbXVmaWxlXCIsXG4gICAgc2NoZW1hTmFtZTogXCJTb25hbXVGaWxlU2NoZW1hXCIsXG4gIH0sXG4gIFwiU29uYW11RmlsZVtdXCI6IHtcbiAgICBzY2hlbWE6IFNvbmFtdUZpbGVBcnJheVNjaGVtYSxcbiAgICByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiLFxuICAgIHNjaGVtYU5hbWU6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCIsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBnZXRCdWlsdEluU2NoZW1hTmFtZSh6b2RUeXBlOiB6LlpvZFR5cGUpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBtYXRjaGVkID0gT2JqZWN0LmVudHJpZXMoQlVJTFRfSU5fVFlQRVMpLmZpbmQoKFt0eXBlSWRdKSA9PiB6b2RUeXBlLmRlc2NyaXB0aW9uID09PSB0eXBlSWQpO1xuICByZXR1cm4gbWF0Y2hlZD8uWzFdLnNjaGVtYU5hbWU7XG59XG5cbi8qKlxuICogem9kRm9ybWF07J2EIFpvZCA0IOy9lOuTnCDrrLjsnpDsl7TroZwg67OA7ZmY7ZWp64uI64ukLlxuICogWm9kIDTsl5DshJzripQgei5lbWFpbCgpLCB6LnV1aWQoKSDrk7Eg64+F66a97KCB7J24IO2VqOyImCDtmJXtg5zrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiB6b2RGb3JtYXRUb0NvZGUoZm9ybWF0OiBab2RTdHJpbmdGb3JtYXQpOiBzdHJpbmcge1xuICBzd2l0Y2ggKGZvcm1hdCkge1xuICAgIGNhc2UgXCJpc29EYXRlXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRlKClcIjtcbiAgICBjYXNlIFwiaXNvVGltZVwiOlxuICAgICAgcmV0dXJuIFwiei5pc28udGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kYXRldGltZSgpXCI7XG4gICAgY2FzZSBcImlzb0R1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gXCJ6Lmlzby5kdXJhdGlvbigpXCI7XG4gICAgY2FzZSBcImhhc2hNZDVcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwibWQ1XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTFcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMVwiKSc7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiAnei5oYXNoKFwic2hhMjU2XCIpJztcbiAgICBjYXNlIFwiaGFzaFNoYTM4NFwiOlxuICAgICAgcmV0dXJuICd6Lmhhc2goXCJzaGEzODRcIiknO1xuICAgIGNhc2UgXCJoYXNoU2hhNTEyXCI6XG4gICAgICByZXR1cm4gJ3ouaGFzaChcInNoYTUxMlwiKSc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgei4ke2Zvcm1hdH0oKWA7XG4gIH1cbn1cblxuLyoqXG4gKiB6b2RGb3JtYXTsnYQgWm9kIDQg7YOA7J6F7Jy866GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqIFpvZCA07JeQ7ISc64qUIHouZW1haWwoKSwgei51dWlkKCkg65OxIOuPheumveyggeyduCDtlajsiJgg7ZiV7YOc66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqL1xuZnVuY3Rpb24gem9kRm9ybWF0VG9UeXBlKGZvcm1hdDogWm9kU3RyaW5nRm9ybWF0KTogei5ab2RUeXBlIHtcbiAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgIHJldHVybiB6LmVtYWlsKCk7XG4gICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIHJldHVybiB6LnV1aWQoKTtcbiAgICBjYXNlIFwidXJsXCI6XG4gICAgICByZXR1cm4gei51cmwoKTtcbiAgICBjYXNlIFwiaHR0cFVybFwiOlxuICAgICAgcmV0dXJuIHouaHR0cFVybCgpO1xuICAgIGNhc2UgXCJob3N0bmFtZVwiOlxuICAgICAgcmV0dXJuIHouaG9zdG5hbWUoKTtcbiAgICBjYXNlIFwiZW1vamlcIjpcbiAgICAgIHJldHVybiB6LmVtb2ppKCk7XG4gICAgY2FzZSBcImJhc2U2NFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0KCk7XG4gICAgY2FzZSBcImJhc2U2NHVybFwiOlxuICAgICAgcmV0dXJuIHouYmFzZTY0dXJsKCk7XG4gICAgY2FzZSBcImhleFwiOlxuICAgICAgcmV0dXJuIHouaGV4KCk7XG4gICAgY2FzZSBcImp3dFwiOlxuICAgICAgcmV0dXJuIHouand0KCk7XG4gICAgY2FzZSBcIm5hbm9pZFwiOlxuICAgICAgcmV0dXJuIHoubmFub2lkKCk7XG4gICAgY2FzZSBcImN1aWRcIjpcbiAgICAgIHJldHVybiB6LmN1aWQoKTtcbiAgICBjYXNlIFwiY3VpZDJcIjpcbiAgICAgIHJldHVybiB6LmN1aWQyKCk7XG4gICAgY2FzZSBcInVsaWRcIjpcbiAgICAgIHJldHVybiB6LnVsaWQoKTtcbiAgICBjYXNlIFwiaXB2NFwiOlxuICAgICAgcmV0dXJuIHouaXB2NCgpO1xuICAgIGNhc2UgXCJpcHY2XCI6XG4gICAgICByZXR1cm4gei5pcHY2KCk7XG4gICAgY2FzZSBcIm1hY1wiOlxuICAgICAgcmV0dXJuIHoubWFjKCk7XG4gICAgY2FzZSBcImNpZHJ2NFwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY0KCk7XG4gICAgY2FzZSBcImNpZHJ2NlwiOlxuICAgICAgcmV0dXJuIHouY2lkcnY2KCk7XG4gICAgY2FzZSBcImlzb0RhdGVcIjpcbiAgICAgIHJldHVybiB6Lmlzby5kYXRlKCk7XG4gICAgY2FzZSBcImlzb1RpbWVcIjpcbiAgICAgIHJldHVybiB6Lmlzby50aW1lKCk7XG4gICAgY2FzZSBcImlzb0RhdGV0aW1lXCI6XG4gICAgICByZXR1cm4gei5pc28uZGF0ZXRpbWUoKTtcbiAgICBjYXNlIFwiaXNvRHVyYXRpb25cIjpcbiAgICAgIHJldHVybiB6Lmlzby5kdXJhdGlvbigpO1xuICAgIGNhc2UgXCJoYXNoTWQ1XCI6XG4gICAgICByZXR1cm4gei5oYXNoKFwibWQ1XCIpO1xuICAgIGNhc2UgXCJoYXNoU2hhMVwiOlxuICAgICAgcmV0dXJuIHouaGFzaChcInNoYTFcIik7XG4gICAgY2FzZSBcImhhc2hTaGEyNTZcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEyNTZcIik7XG4gICAgY2FzZSBcImhhc2hTaGEzODRcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGEzODRcIik7XG4gICAgY2FzZSBcImhhc2hTaGE1MTJcIjpcbiAgICAgIHJldHVybiB6Lmhhc2goXCJzaGE1MTJcIik7XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6FIElE66Gc67aA7YSwIOuPmeyggeycvOuhnCBab2Qg7Iqk7YKk66eI66W8IOuhnOuTnO2VqeuLiOuLpC5cbiAqIOuCtOyepSDtg4DsnoUoQlVJTFRfSU5fVFlQRV9JRFMp7J2AIOuwlOuhnCDrsJjtmZjtlZjqs6AsXG4gKiDqt7gg7Jm464qUIGRpc3Qg65SU66CJ7Yag66as7JeQ7IScIEVTTeycvOuhnCBpbXBvcnTtlZjsl6wg6rCA7KC47Ji164uI64ukLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0Wm9kVHlwZUJ5SWQoem9kVHlwZUlkOiBzdHJpbmcpOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICAvLyDrgrTsnqUg7YOA7J6FIOyymOumrFxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBCVUlMVF9JTl9UWVBFX0lEUyBhcyByZWFkb25seSBzdHJpbmdbXVxuICAgICkuaW5jbHVkZXMoem9kVHlwZUlkKVxuICApIHtcbiAgICBjb25zdCBidWlsdEluVHlwZSA9XG4gICAgICBCVUlMVF9JTl9UWVBFU1tcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyB6b2RUeXBlSWQgYXMga2V5b2YgdHlwZW9mIEJVSUxUX0lOX1RZUEVTXG4gICAgICBdO1xuICAgIGlmICghYnVpbHRJblR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihg64K07J6lIO2DgOyehSAke3pvZFR5cGVJZH3snZgg7Iqk7YKk66eI6rCAIOygleydmOuQmOyngCDslYrslZjsirXri4jri6RgKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1aWx0SW5UeXBlLnNjaGVtYS5kZXNjcmliZSh6b2RUeXBlSWQpO1xuICB9XG5cbiAgLy8g7ZSE66Gc7KCd7Yq47JeQ7IScIOygleydmO2VnCDtg4DsnoUg64+Z7KCBIOuhnOuTnFxuICBjb25zdCBtb2R1bGVQYXRoID0gRW50aXR5TWFuYWdlci5nZXRNb2R1bGVQYXRoKHpvZFR5cGVJZCk7XG4gIGNvbnN0IG1vZHVsZUFic1BhdGggPSBwYXRoLmpvaW4oXG4gICAgU29uYW11LmFwaVJvb3RQYXRoLFxuICAgIHJ1bnRpbWVQYXRoKGBkaXN0L2FwcGxpY2F0aW9uLyR7bW9kdWxlUGF0aH0uanNgKSxcbiAgKTtcbiAgY29uc3QgaW1wb3J0VXJsID0gY3JlYXRlSW1wb3J0VXJsKG1vZHVsZUFic1BhdGgpO1xuICBjb25zdCBpbXBvcnRlZCA9IGF3YWl0IGltcG9ydChpbXBvcnRVcmwpO1xuXG4gIGlmICghaW1wb3J0ZWRbem9kVHlwZUlkXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7KG07J6s7ZWY7KeAIOyViuuKlCB6b2RUeXBlSWQgJHt6b2RUeXBlSWR9YCk7XG4gIH1cbiAgcmV0dXJuIGltcG9ydGVkW3pvZFR5cGVJZF0uZGVzY3JpYmUoem9kVHlwZUlkKTtcbn1cblxuLyoqXG4gKiBFbnRpdHlQcm9w7J2EIFpvZCDtg4DsnoXsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICog6rCBIHByb3DsnZgg7YOA7J6F7JeQIOuUsOudvCDsoIHsoIjtlZwgWm9kIHZhbGlkYXRvcuulvCDsg53shLHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBwcm9wVG9ab2RUeXBlKHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHouWm9kVHlwZUFueT4ge1xuICBsZXQgem9kVHlwZTogei5ab2RUeXBlQW55ID0gei51bmtub3duKCk7XG4gIGlmIChpc0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCkuaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCk7XG4gIH0gZWxzZSBpZiAoaXNCaWdJbnRlZ2VyQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYmlnaW50KCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc0VudW1TaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IGF3YWl0IGdldFpvZFR5cGVCeUlkKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSAoYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCkpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmdTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICB6b2RUeXBlID0gem9kRm9ybWF0VG9UeXBlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCAmJiBcIm1heFwiIGluIHpvZFR5cGUpIHtcbiAgICAgICAgem9kVHlwZSA9IC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHpvZFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgKS5tYXgocHJvcC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc1N0cmluZ0FycmF5UHJvcChwcm9wKSkge1xuICAgIGxldCBlbGVtZW50VHlwZTogei5ab2RUeXBlO1xuICAgIGlmIChwcm9wLnpvZEZvcm1hdCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6b2RGb3JtYXRUb1R5cGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoICYmIFwibWF4XCIgaW4gZWxlbWVudFR5cGUpIHtcbiAgICAgICAgZWxlbWVudFR5cGUgPVxuICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgICAgZWxlbWVudFR5cGUgYXMgei5ab2RTdHJpbmdcbiAgICAgICAgICApLm1heChwcm9wLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgZWxlbWVudFR5cGUgPSB6LnN0cmluZygpLm1heChwcm9wLmxlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1lbnRUeXBlID0gei5zdHJpbmcoKTtcbiAgICB9XG4gICAgem9kVHlwZSA9IGVsZW1lbnRUeXBlLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoubnVtYmVyKCk7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5udW1iZXIoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgfSBlbHNlIGlmIChpc051bWVyaWNBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5zdHJpbmcoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5ib29sZWFuKCk7XG4gIH0gZWxzZSBpZiAoaXNCb29sZWFuQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYm9vbGVhbigpLmFycmF5KCk7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmRhdGUoKTtcbiAgfSBlbHNlIGlmIChpc0RhdGVBcnJheVByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gei5kYXRlKCkuYXJyYXkoKTtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHoudXVpZCgpO1xuICB9IGVsc2UgaWYgKGlzVXVpZEFycmF5UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnV1aWQoKS5hcnJheSgpO1xuICB9IGVsc2UgaWYgKGlzSnNvblByb3AocHJvcCkpIHtcbiAgICB6b2RUeXBlID0gYXdhaXQgZ2V0Wm9kVHlwZUJ5SWQocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LnN0cmluZygpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSB6LmFycmF5KHoubnVtYmVyKCkpO1xuICB9IGVsc2UgaWYgKGlzVmVjdG9yQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgem9kVHlwZSA9IHouYXJyYXkoei5hcnJheSh6Lm51bWJlcigpKSk7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHpvZFR5cGUgPSBhd2FpdCBnZXRab2RUeXBlQnlJZChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgIGlmIChpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fCAoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pKSB7XG4gICAgICAvLyBGSyDtg4DsnoXsnYQg7LC47KGwIOyXlO2LsO2LsCBQSyDtg4DsnoXsl5Ag65Sw6528IOqysOyglVxuICAgICAgY29uc3QgcmVsRW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQocHJvcC53aXRoKTtcbiAgICAgIGNvbnN0IHBrVHlwZSA9IHJlbEVudGl0eS5nZXRQa1R5cGUoKTtcbiAgICAgIGlmIChwa1R5cGUgPT09IFwic3RyaW5nXCIgfHwgcGtUeXBlID09PSBcInV1aWRcIikge1xuICAgICAgICB6b2RUeXBlID0gei5zdHJpbmcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHpvZFR5cGUgPSB6Lm51bWJlcigpLmludCgpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHByb3DsnYQgem9kVHlwZeycvOuhnCDrs4DtmZjtlZjripTrjbAg7Iuk7YyoICR7cHJvcH19YCk7XG4gIH1cblxuICBpZiAoXG4gICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICBwcm9wIGFzIHsgdW5zaWduZWQ/OiBib29sZWFuIH1cbiAgICApLnVuc2lnbmVkXG4gICkge1xuICAgIHpvZFR5cGUgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgIHpvZFR5cGUgYXMgei5ab2ROdW1iZXJcbiAgICApLm5vbm5lZ2F0aXZlKCk7XG4gIH1cbiAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICB6b2RUeXBlID0gem9kVHlwZS5udWxsYWJsZSgpO1xuICB9XG5cbiAgcmV0dXJuIHpvZFR5cGU7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcOydhCBab2Qg7YOA7J6FIOygleydmCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb3BUb1pvZFR5cGVEZWYocHJvcDogRW50aXR5UHJvcCwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICBsZXQgc3RtdDogc3RyaW5nO1xuICBpZiAoaXNJbnRlZ2VyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmludCgpYDtcbiAgfSBlbHNlIGlmIChpc0ludGVnZXJBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5pbnQoKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc0JpZ0ludGVnZXJTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouYmlnaW50KClgO1xuICB9IGVsc2UgaWYgKGlzQmlnSW50ZWdlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJpZ2ludCgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzRW51bVNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtwcm9wLmlkfWA7XG4gICAgaW5qZWN0SW1wb3J0S2V5cy5wdXNoKHByb3AuaWQpO1xuICB9IGVsc2UgaWYgKGlzRW51bUFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9LmFycmF5KClgO1xuICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgfSBlbHNlIGlmIChpc1N0cmluZ1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBpZiAocHJvcC56b2RGb3JtYXQpIHtcbiAgICAgIGNvbnN0IGJhc2UgPSB6b2RGb3JtYXRUb0NvZGUocHJvcC56b2RGb3JtYXQpO1xuICAgICAgaWYgKHByb3AubGVuZ3RoKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke2Jhc2V9Lm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHJvcC5sZW5ndGgpIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpLm1heCgke3Byb3AubGVuZ3RofSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzU3RyaW5nQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgaWYgKHByb3Auem9kRm9ybWF0KSB7XG4gICAgICBjb25zdCBiYXNlID0gem9kRm9ybWF0VG9Db2RlKHByb3Auem9kRm9ybWF0KTtcbiAgICAgIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtiYXNlfS5tYXgoJHtwcm9wLmxlbmd0aH0pLmFycmF5KClgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06ICR7YmFzZX0uYXJyYXkoKWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9wLmxlbmd0aCkge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkubWF4KCR7cHJvcC5sZW5ndGh9KS5hcnJheSgpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzTnVtYmVyU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpYDtcbiAgfSBlbHNlIGlmIChpc051bWJlckFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6Lm51bWJlcigpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouc3RyaW5nKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlU2luZ2xlUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmRhdGUoKWA7XG4gIH0gZWxzZSBpZiAoaXNEYXRlQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHouZGF0ZSgpLmFycmF5KClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhblNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5ib29sZWFuKClgO1xuICB9IGVsc2UgaWYgKGlzQm9vbGVhbkFycmF5UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LmJvb2xlYW4oKS5hcnJheSgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRTaW5nbGVQcm9wKHByb3ApKSB7XG4gICAgc3RtdCA9IGAke3Byb3AubmFtZX06IHoudXVpZCgpYDtcbiAgfSBlbHNlIGlmIChpc1V1aWRBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei51dWlkKCkuYXJyYXkoKWA7XG4gIH0gZWxzZSBpZiAoaXNKc29uUHJvcChwcm9wKSkge1xuICAgIC8vIOuCtOyepSDtg4DsnoXsnbgg6rK97JqwIOyKpO2CpOuniCDsnbTrpoTsnLzroZwg67OA7ZmYXG4gICAgaWYgKFxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIEJVSUxUX0lOX1RZUEVfSURTIGFzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgICApLmluY2x1ZGVzKHByb3AuaWQpXG4gICAgKSB7XG4gICAgICBjb25zdCBzY2hlbWFOYW1lID0gcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlXCIgPyBcIlNvbmFtdUZpbGVTY2hlbWFcIiA6IFwiU29uYW11RmlsZUFycmF5U2NoZW1hXCI7XG4gICAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogJHtzY2hlbWFOYW1lfWA7XG4gICAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goc2NoZW1hTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICAgIGluamVjdEltcG9ydEtleXMucHVzaChwcm9wLmlkKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNTZWFyY2hUZXh0UHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiB6LnN0cmluZygpYDtcbiAgfSBlbHNlIGlmIChpc1ZlY3RvclNpbmdsZVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6Lm51bWJlcigpKWA7XG4gIH0gZWxzZSBpZiAoaXNWZWN0b3JBcnJheVByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5hcnJheSh6LmFycmF5KHoubnVtYmVyKCkpKWA7XG4gIH0gZWxzZSBpZiAoaXNUc1ZlY3RvclByb3AocHJvcCkpIHtcbiAgICBzdG10ID0gYCR7cHJvcC5uYW1lfTogei5zdHJpbmcoKWA7XG4gIH0gZWxzZSBpZiAoaXNWaXJ0dWFsUHJvcChwcm9wKSkge1xuICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9OiAke3Byb3AuaWR9YDtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2gocHJvcC5pZCk7XG4gIH0gZWxzZSBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICBpZiAoaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgfHwgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKSkge1xuICAgICAgLy8gRksgWm9kIO2DgOyeheydhCDssLjsobAg7JeU7Yuw7YuwIFBLIO2DgOyeheyXkCDrlLDrnbwg6rKw7KCVXG4gICAgICBjb25zdCByZWxFbnRpdHkgPSBFbnRpdHlNYW5hZ2VyLmdldChwcm9wLndpdGgpO1xuICAgICAgY29uc3QgcGtUeXBlID0gcmVsRW50aXR5LmdldFBrVHlwZSgpO1xuICAgICAgaWYgKHBrVHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBwa1R5cGUgPT09IFwidXVpZFwiKSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LnN0cmluZygpYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0bXQgPSBgJHtwcm9wLm5hbWV9X2lkOiB6LmludCgpYDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8g6re47Jm4IHJlbGF0aW9uIOy8gOydtOyKpCDsoJzsmbhcbiAgICAgIHJldHVybiBgLy8gJHtwcm9wLm5hbWV9OiAke3Byb3AucmVsYXRpb25UeXBlfSAke3Byb3Aud2l0aH1gO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gXCIvLyB1bmFibGUgdG8gcmVzb2x2ZVwiO1xuICB9XG5cbiAgaWYgKFxuICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgcHJvcCBhcyB7IHVuc2lnbmVkPzogYm9vbGVhbiB9XG4gICAgKS51bnNpZ25lZFxuICApIHtcbiAgICBzdG10ICs9IFwiLm5vbm5lZ2F0aXZlKClcIjtcbiAgfVxuICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgIHN0bXQgKz0gXCIubnVsbGFibGUoKVwiO1xuICB9XG5cbiAgLy8gbnVtZXJpYyDtg4DsnoXsnZgg6rK97JqwIG51bGxhYmxlIOydtO2bhOyXkCBtZXRhIOy2lOqwgCAo66mU7YOA642w7J207YSw6rCAIOy1nOyDgeychCDroIjrsqjsl5Ag7J6I7Ja07JW8IO2VqClcbiAgaWYgKGlzTnVtZXJpY1NpbmdsZVByb3AocHJvcCkgfHwgaXNOdW1lcmljQXJyYXlQcm9wKHByb3ApKSB7XG4gICAgc3RtdCArPSAnLm1ldGEoeyBTb25hbXVQcm9wVHlwZTogXCJudW1lcmljXCIgfSknO1xuICB9XG5cbiAgcmV0dXJuIGAke3N0bXR9LGA7XG59XG5cbi8qKlxuICogRW50aXR5UHJvcE5vZGXrpbwgWm9kIO2DgOyehSDsoJXsnZgg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZjtlanri4jri6QuXG4gKiBwbGFpbiwgYXJyYXksIG9iamVjdCDrhbjrk5wg7YOA7J6F7J2EIOyerOq3gOyggeycvOuhnCDsspjrpqztlZjsl6wg7KSR7LKpIOq1rOyhsOulvCDsp4Dsm5Dtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wTm9kZVRvWm9kVHlwZURlZihwcm9wTm9kZTogRW50aXR5UHJvcE5vZGUsIGluamVjdEltcG9ydEtleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcInBsYWluXCIpIHtcbiAgICByZXR1cm4gcHJvcFRvWm9kVHlwZURlZihwcm9wTm9kZS5wcm9wLCBpbmplY3RJbXBvcnRLZXlzKTtcbiAgfSBlbHNlIGlmIChwcm9wTm9kZS5ub2RlVHlwZSA9PT0gXCJhcnJheVwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5hcnJheSh6Lm9iamVjdCh7XCIsXG4gICAgICBwcm9wTm9kZS5jaGlsZHJlblxuICAgICAgICAubWFwKChjaGlsZFByb3BOb2RlKSA9PiBwcm9wTm9kZVRvWm9kVHlwZURlZihjaGlsZFByb3BOb2RlLCBpbmplY3RJbXBvcnRLZXlzKSlcbiAgICAgICAgLmpvaW4oXCJcXG5cIiksXG4gICAgICBcIlwiLFxuICAgICAgXCJ9KSksXCIsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuICB9IGVsc2UgaWYgKHByb3BOb2RlLm5vZGVUeXBlID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHByb3BOb2RlLnByb3AgPyBgJHtwcm9wTm9kZS5wcm9wLm5hbWV9OiBgIDogXCJcIixcbiAgICAgIFwiei5vYmplY3Qoe1wiLFxuICAgICAgcHJvcE5vZGUuY2hpbGRyZW5cbiAgICAgICAgLm1hcCgoY2hpbGRQcm9wTm9kZSkgPT4gcHJvcE5vZGVUb1pvZFR5cGVEZWYoY2hpbGRQcm9wTm9kZSwgaW5qZWN0SW1wb3J0S2V5cykpXG4gICAgICAgIC5qb2luKFwiXFxuXCIpLFxuICAgICAgXCJcIixcbiAgICAgIGB9KSR7cHJvcE5vZGUucHJvcD8ubnVsbGFibGUgPyBcIi5udWxsYWJsZSgpXCIgOiBcIlwifSxgLFxuICAgIF0uam9pbihcIlxcblwiKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvVHNUeXBlRGVmKHp0OiB6LlpvZFR5cGUpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHp0LmRlZi50eXBlKSB7XG4gICAgY2FzZSBcInN0cmluZ1wiOlxuICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgIGNhc2UgXCJ1bmRlZmluZWRcIjpcbiAgICBjYXNlIFwiYW55XCI6XG4gICAgY2FzZSBcInVua25vd25cIjpcbiAgICBjYXNlIFwibmV2ZXJcIjpcbiAgICAgIHJldHVybiB6dC5kZWYudHlwZTtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiRGF0ZVwiO1xuICAgIGNhc2UgXCJudWxsYWJsZVwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSl9IHwgbnVsbGA7XG4gICAgY2FzZSBcImRlZmF1bHRcIjpcbiAgICAgIHJldHVybiB6b2RUeXBlVG9Uc1R5cGVEZWYoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZERlZmF1bHRcbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgKTtcbiAgICBjYXNlIFwicmVjb3JkXCI6IHtcbiAgICAgIGNvbnN0IHJlY29yZFR5cGUgPVxuICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHp0IGFzIEFueVpvZFJlY29yZDtcbiAgICAgIGNvbnN0IGtleVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYua2V5VHlwZSk7XG4gICAgICBjb25zdCB2YWx1ZVR5cGUgPSB6b2RUeXBlVG9Uc1R5cGVEZWYocmVjb3JkVHlwZS5kZWYudmFsdWVUeXBlKTtcbiAgICAgIGlmIChyZWNvcmRUeXBlLmRlZi5wYXJ0aWFsKSB7XG4gICAgICAgIHJldHVybiBgUGFydGlhbDxSZWNvcmQ8JHtrZXlUeXBlfSwgJHt2YWx1ZVR5cGV9Pj5gO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB7IFsga2V5OiAke2tleVR5cGV9IF06ICR7dmFsdWVUeXBlfX1gO1xuICAgIH1cbiAgICBjYXNlIFwibGl0ZXJhbFwiOlxuICAgICAgcmV0dXJuIEFycmF5LmZyb20oXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kTGl0ZXJhbFxuICAgICAgICApLnZhbHVlcyxcbiAgICAgIClcbiAgICAgICAgLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgICBpZiAoaXNTdHJpbmdWYWx1ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgXCIke3ZhbHVlfVwiYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBgbnVsbGA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBgdW5kZWZpbmVkYDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCIgfCBcIik7XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYCR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkub3B0aW9uc1xuICAgICAgICAgIC5tYXAoKG9wdGlvbikgPT4gem9kVHlwZVRvVHNUeXBlRGVmKG9wdGlvbikpXG4gICAgICAgICAgLmpvaW4oXCIgfCBcIilcbiAgICAgIH1gO1xuICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICByZXR1cm4gYCR7LyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgei5ab2RFbnVtKS5vcHRpb25zLm1hcCgodmFsKSA9PiBgXCIke3ZhbH1cImApLmpvaW4oXCIgfCBcIil9YDtcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9Uc1R5cGVEZWYoLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoenQgYXMgQW55Wm9kQXJyYXkpLmVsZW1lbnQpfVtdYDtcbiAgICBjYXNlIFwib2JqZWN0XCI6IHtcbiAgICAgIGNvbnN0IG9iamVjdEZpZWxkcyA9IC8qIFNBRkVUWTogWm9k7J2YIG9iamVjdCDtjJDrs4Qg67aE6riw6rCAIOqwneyytCDtlYTrk5wg6rOE7JW97J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICB6dCBhcyBBbnlab2RPYmplY3RcbiAgICAgIClbXCJzaGFwZVwiXTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIFwie1wiLFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhvYmplY3RGaWVsZHMpLm1hcCgoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKG9iamVjdEZpZWxkc1trZXldLmRlZi50eXBlID09PSBcIm9wdGlvbmFsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PzogJHt6b2RUeXBlVG9Uc1R5cGVEZWYob2JqZWN0RmllbGRzW2tleV0uZGVmLmlubmVyVHlwZSl9LGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgJHtrZXl9OiAke3pvZFR5cGVUb1RzVHlwZURlZihvYmplY3RGaWVsZHNba2V5XSl9LGA7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXCJ9XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuICAgIGNhc2UgXCJvcHRpb25hbFwiOlxuICAgICAgcmV0dXJuIGAke3pvZFR5cGVUb1RzVHlwZURlZigvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2RPcHRpb25hbCkuZGVmLmlubmVyVHlwZSl9IHwgdW5kZWZpbmVkYDtcbiAgICBjYXNlIFwidGVtcGxhdGVfbGl0ZXJhbFwiOiB7XG4gICAgICBjb25zdCBkZWYgPSAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIChcbiAgICAgICAgenQgYXMgQW55Wm9kVGVtcGxhdGVMaXRlcmFsXG4gICAgICApLmRlZjtcblxuICAgICAgLy8g67mIIHRlbXBsYXRlIGxpdGVyYWzsnYAgc3RyaW5n7Jy866GcIO2PtOuwsVxuICAgICAgaWYgKCFkZWYucGFydHMgfHwgZGVmLnBhcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICAgIH1cblxuICAgICAgLy8g6rCBIHBhcnTrpbwgVHlwZVNjcmlwdCDtg4DsnoUg66y47J6Q7Je066GcIOuzgO2ZmFxuICAgICAgY29uc3QgcGFydHMgPSBkZWYucGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgIC8vIOumrO2EsOuftCDqsJIgKHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBudWxsLCB1bmRlZmluZWQpXG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3BhcnR9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFpvZFR5cGUgLSDsnqzqt4DsoIHsnLzroZwg67OA7ZmYXG4gICAgICAgIGlmIChwYXJ0ICYmIGlzT2JqZWN0VmFsdWUocGFydCkgJiYgcGFydCBpbnN0YW5jZW9mIHouWm9kVHlwZSkge1xuICAgICAgICAgIGNvbnN0IGlubmVyVHlwZSA9IHpvZFR5cGVUb1RzVHlwZURlZihcbiAgICAgICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gcGFydCBhcyB6LlpvZFR5cGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gYCRcXHske2lubmVyVHlwZX19YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIO2PtOuwsVxuICAgICAgICByZXR1cm4gYFxcJHtzdHJpbmd9YDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYFxcYCR7cGFydHMuam9pbihcIlwiKX1cXGBgO1xuICAgIH1cbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIFwiRmlsZVwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYOyymOumrOuQmOyngCDslYrsnYAgWm9kVHlwZSAke3p0LmRlZi50eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogWm9kIO2DgOyehSDsnbjsiqTthLTsiqTrpbwg7ZW064u57ZWY64qUIFpvZCDsvZTrk5wg66y47J6Q7Je066GcIOuzgO2ZmO2VqeuLiOuLpC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHpvZFR5cGVUb1pvZENvZGUoenQ6IHouWm9kVHlwZSwgaW5qZWN0SW1wb3J0S2V5czogc3RyaW5nW10gPSBbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGJ1aWx0SW5TY2hlbWFOYW1lID0gZ2V0QnVpbHRJblNjaGVtYU5hbWUoenQpO1xuICBpZiAoYnVpbHRJblNjaGVtYU5hbWUpIHtcbiAgICBpbmplY3RJbXBvcnRLZXlzLnB1c2goYnVpbHRJblNjaGVtYU5hbWUpO1xuICAgIHJldHVybiBidWlsdEluU2NoZW1hTmFtZTtcbiAgfVxuXG4gIHN3aXRjaCAoenQuZGVmLnR5cGUpIHtcbiAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICByZXR1cm4gXCJ6LnN0cmluZygpXCI7XG4gICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgcmV0dXJuIFwiei5udW1iZXIoKVwiO1xuICAgIGNhc2UgXCJiaWdpbnRcIjpcbiAgICAgIHJldHVybiBcInouYmlnaW50KClcIjtcbiAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgcmV0dXJuIFwiei5ib29sZWFuKClcIjtcbiAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgcmV0dXJuIFwiei5kYXRlKClcIjtcbiAgICBjYXNlIFwibnVsbFwiOlxuICAgICAgcmV0dXJuIFwiei5udWxsKClcIjtcbiAgICBjYXNlIFwidW5kZWZpbmVkXCI6XG4gICAgICByZXR1cm4gXCJ6LnVuZGVmaW5lZCgpXCI7XG4gICAgY2FzZSBcImFueVwiOlxuICAgICAgcmV0dXJuIFwiei5hbnkoKVwiO1xuICAgIGNhc2UgXCJ1bmtub3duXCI6XG4gICAgICByZXR1cm4gXCJ6LnVua25vd24oKVwiO1xuICAgIGNhc2UgXCJuZXZlclwiOlxuICAgICAgcmV0dXJuIFwiei5uZXZlcigpXCI7XG4gICAgY2FzZSBcIm51bGxhYmxlXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyBBbnlab2ROdWxsYWJsZSkuZGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9Lm51bGxhYmxlKClgO1xuICAgIGNhc2UgXCJkZWZhdWx0XCI6IHtcbiAgICAgIGNvbnN0IHpEZWZhdWx0RGVmID1cbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgQW55Wm9kRGVmYXVsdFxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgJHt6b2RUeXBlVG9ab2RDb2RlKHpEZWZhdWx0RGVmLmlubmVyVHlwZSwgaW5qZWN0SW1wb3J0S2V5cyl9LmRlZmF1bHQoJHt6RGVmYXVsdERlZi5kZWZhdWx0VmFsdWV9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJyZWNvcmRcIjoge1xuICAgICAgY29uc3QgelJlY29yZERlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFJlY29yZFxuICAgICAgICApLmRlZjtcbiAgICAgIGNvbnN0IHJlY29yZEZuID0gelJlY29yZERlZi5wYXJ0aWFsID8gXCJwYXJ0aWFsUmVjb3JkXCIgOiBcInJlY29yZFwiO1xuICAgICAgcmV0dXJuIGB6LiR7cmVjb3JkRm59KCR7em9kVHlwZVRvWm9kQ29kZSh6UmVjb3JkRGVmLmtleVR5cGUsIGluamVjdEltcG9ydEtleXMpfSwgJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6UmVjb3JkRGVmLnZhbHVlVHlwZSxcbiAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICl9KWA7XG4gICAgfVxuICAgIGNhc2UgXCJsaXRlcmFsXCI6IHtcbiAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgenQgYXMgei5ab2RMaXRlcmFsPHN0cmluZyB8IG51bWJlcj5cbiAgICAgICAgKS52YWx1ZXMsXG4gICAgICApLm1hcCgodmFsdWUpID0+IHtcbiAgICAgICAgaWYgKGlzU3RyaW5nVmFsdWUodmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGBudWxsYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGB1bmRlZmluZWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gYHoubGl0ZXJhbCgke2l0ZW1zWzBdfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGB6LmxpdGVyYWwoWyR7aXRlbXMuam9pbihcIiwgXCIpfV0pYDtcbiAgICB9XG4gICAgY2FzZSBcInVuaW9uXCI6XG4gICAgICByZXR1cm4gYHoudW5pb24oWyR7XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIEFueVpvZFVuaW9uXG4gICAgICAgICkuZGVmLm9wdGlvbnNcbiAgICAgICAgICAubWFwKChvcHRpb246IHouWm9kVHlwZSkgPT4gem9kVHlwZVRvWm9kQ29kZShvcHRpb24sIGluamVjdEltcG9ydEtleXMpKVxuICAgICAgICAgIC5qb2luKFwiLFwiKVxuICAgICAgfV0pYDtcbiAgICBjYXNlIFwiZW51bVwiOlxuICAgICAgLy8gTk9URTogei5lbnVtKFtcIkFcIiwgXCJCXCJdKeuPhCB6LmVudW0oeyBBOiBcIkFcIiwgQjogXCJCXCIgfSnroZwg7LKY66as65CoLlxuICAgICAgcmV0dXJuIGB6LmVudW0oeyR7T2JqZWN0LmVudHJpZXMoXG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kRW51bVxuICAgICAgICApLmRlZi5lbnRyaWVzLFxuICAgICAgKVxuICAgICAgICAubWFwKChba2V5LCB2YWxdKSA9PiAoaXNTdHJpbmdWYWx1ZSh2YWwpID8gYCR7a2V5fTogXCIke3ZhbH1cImAgOiBgJHtrZXl9OiAke3ZhbH1gKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKX19KWA7XG4gICAgY2FzZSBcImFycmF5XCI6XG4gICAgICByZXR1cm4gYHouYXJyYXkoJHt6b2RUeXBlVG9ab2RDb2RlKC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKHp0IGFzIHouWm9kQXJyYXk8ei5ab2RUeXBlPikuZGVmLmVsZW1lbnQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIGNhc2UgXCJvYmplY3RcIjoge1xuICAgICAgY29uc3Qgb2JqZWN0RmllbGRzID0gLyogU0FGRVRZOiBab2TsnZggb2JqZWN0IO2MkOuzhCDrtoTquLDqsIAg6rCd7LK0IO2VhOuTnCDqs4Tslb3snYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZE9iamVjdFxuICAgICAgKVtcInNoYXBlXCJdO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgXCJ6Lm9iamVjdCh7XCIsXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKG9iamVjdEZpZWxkcykubWFwKFxuICAgICAgICAgIChrZXkpID0+IGAke2tleX06ICR7em9kVHlwZVRvWm9kQ29kZShvYmplY3RGaWVsZHNba2V5XSwgaW5qZWN0SW1wb3J0S2V5cyl9LGAsXG4gICAgICAgICksXG4gICAgICAgIFwifSlcIixcbiAgICAgIF0uam9pbihcIlxcblwiKTtcbiAgICB9XG4gICAgY2FzZSBcIm9wdGlvbmFsXCI6XG4gICAgICByZXR1cm4gYCR7em9kVHlwZVRvWm9kQ29kZSgvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovICh6dCBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT4pLmRlZi5pbm5lclR5cGUsIGluamVjdEltcG9ydEtleXMpfS5vcHRpb25hbCgpYDtcbiAgICBjYXNlIFwiZmlsZVwiOlxuICAgICAgcmV0dXJuIGB6LmZpbGUoKWA7XG4gICAgY2FzZSBcInRlbXBsYXRlX2xpdGVyYWxcIjoge1xuICAgICAgY29uc3QgZGVmID0gLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHp0IGFzIEFueVpvZFRlbXBsYXRlTGl0ZXJhbFxuICAgICAgKS5kZWY7XG5cbiAgICAgIC8vIOu5iCB0ZW1wbGF0ZSBsaXRlcmFsXG4gICAgICBpZiAoIWRlZi5wYXJ0cyB8fCBkZWYucGFydHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBcInoudGVtcGxhdGVMaXRlcmFsKFtdKVwiO1xuICAgICAgfVxuXG4gICAgICAvLyDqsIEgcGFydOulvCBab2Qg7L2U65OcIOusuOyekOyXtOuhnCDrs4DtmZhcbiAgICAgIGNvbnN0IHBhcnRzID0gZGVmLnBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAvLyDrrLjsnpDsl7Qg66as7YSw65+0XG4gICAgICAgIGlmIChpc1N0cmluZ1ZhbHVlKHBhcnQpKSB7XG4gICAgICAgICAgcmV0dXJuIGBcIiR7cGFydH1cImA7XG4gICAgICAgIH1cbiAgICAgICAgLy8gWm9kVHlwZSAtIOyerOq3gOyggeycvOuhnCDrs4DtmZhcbiAgICAgICAgaWYgKHBhcnQgJiYgaXNPYmplY3RWYWx1ZShwYXJ0KSAmJiBwYXJ0IGluc3RhbmNlb2Ygei5ab2RUeXBlKSB7XG4gICAgICAgICAgcmV0dXJuIHpvZFR5cGVUb1pvZENvZGUoXG4gICAgICAgICAgICAvKiBTQUZFVFk6IOyEoO2WiSBab2Qg7KKF66WYIOu2hOq4sOyZgCDthZztlIzrpr8g7J6F66ClIOqzhOyVveydtCDsnbQg6rCS7J2YIO2DgOyeheydhCDrs7TsnqXtlZzri6QuICovIHBhcnQgYXMgei5ab2RUeXBlLFxuICAgICAgICAgICAgaW5qZWN0SW1wb3J0S2V5cyxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8g7Y+067CxXG4gICAgICAgIHJldHVybiBcInouc3RyaW5nKClcIjtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYHoudGVtcGxhdGVMaXRlcmFsKFske3BhcnRzLmpvaW4oXCIsIFwiKX1dKWA7XG4gICAgfVxuICAgIGNhc2UgXCJpbnRlcnNlY3Rpb25cIjoge1xuICAgICAgY29uc3QgekludGVyc2VjdGlvbkRlZiA9XG4gICAgICAgIC8qIFNBRkVUWTog7ISg7ZaJIFpvZCDsooXrpZgg67aE6riw7JmAIO2FnO2UjOumvyDsnoXroKUg6rOE7JW97J20IOydtCDqsJLsnZgg7YOA7J6F7J2EIOuztOyepe2VnOuLpC4gKi8gKFxuICAgICAgICAgIHp0IGFzIHouWm9kSW50ZXJzZWN0aW9uPHouWm9kVHlwZSwgei5ab2RUeXBlPlxuICAgICAgICApLmRlZjtcbiAgICAgIHJldHVybiBgei5pbnRlcnNlY3Rpb24oJHt6b2RUeXBlVG9ab2RDb2RlKFxuICAgICAgICB6SW50ZXJzZWN0aW9uRGVmLmxlZnQsXG4gICAgICAgIGluamVjdEltcG9ydEtleXMsXG4gICAgICApfSwgJHt6b2RUeXBlVG9ab2RDb2RlKHpJbnRlcnNlY3Rpb25EZWYucmlnaHQsIGluamVjdEltcG9ydEtleXMpfSlgO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGDsspjrpqzrkJjsp4Ag7JWK7J2AIFpvZFR5cGUgJHt6dC5kZWYudHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFpvZCDtg4DsnoXsnYQgVUkg66CM642U66eB7JeQIOyCrOyaqe2VoCDsiJgg7J6I64qUIFJlbmRlcmluZ05vZGXroZwg67OA7ZmY7ZWp64uI64ukLlxuICog7J6s6reA7KCB7Jy866GcIOykkeyyqeuQnCDtg4DsnoXrk6TsnYQg7LKY66as7ZWp64uI64ukLlxuICovXG5leHBvcnQgZnVuY3Rpb24gem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgem9kVHlwZTogei5ab2RUeXBlQW55LFxuICBiYXNlS2V5OiBzdHJpbmcgPSBcInJvb3RcIixcbik6IFJlbmRlcmluZ05vZGUge1xuICBjb25zdCBkZWYgPSB7XG4gICAgbmFtZTogYmFzZUtleSxcbiAgICBsYWJlbDogaW5mbGVjdGlvbi5jYW1lbGl6ZShiYXNlS2V5LCBmYWxzZSksXG4gICAgem9kVHlwZSxcbiAgfTtcblxuICAvKipcbiAgICog7LyA7J207IqkIOyymOumrCDsiJzshJxcbiAgICpcbiAgICogMS4g7Yq57IiYIOy8gOydtOyKpCAoZGVzY3JpcHRpb24g6riw67CYKVxuICAgKiAgICAtIFNvbmFtdUZpbGUvU29uYW11RmlsZVtdIDogei5vYmplY3Qvei5hcnJheeydtOyngOunjCDtjIzsnbwg7JeF66Gc65Oc7JqpIOuCtOyepSDtg4DsnoVcbiAgICpcbiAgICogMi4g7J2867CYIOy8gOydtOyKpCAoaW5zdGFuY2VvZiDquLDrsJgpXG4gICAqICAgIC0gei5ab2RPYmplY3QgOiDsnbzrsJgg6rCd7LK0XG4gICAqICAgIC0gei5ab2RBcnJheSA6IOydvOuwmCDrsLDsl7RcbiAgICogICAgICAtIHZlY3RvciA6IHouYXJyYXkoei5udW1iZXIp7J207KeA66eMIOuEpOydtOuwjSDquLDrsJjsnLzroZwg67Kh7YSwIOyehOuyoOuUqVxuICAgKiAgICAgIC0g7J2867CYIOuwsOyXtCA6IOq3uCDsmbhcbiAgICogICAgLSB6LlpvZFVuaW9uLCB6LlpvZE9wdGlvbmFsLCB6LlpvZE51bGxhYmxlIDog7Jyg7Yu466as7YuwIO2DgOyehVxuICAgKiAgICAtIOq4sO2DgCA6IHJlc29sdmVSZW5kZXJUeXBlKCnsnLzroZwg7LKY66asXG4gICAqL1xuXG4gIC8vIO2KueyImCDsvIDsnbTsiqQ6IFNvbmFtdUZpbGVbXSDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgcmV0dXJuIHsgLi4uZGVmLCByZW5kZXJUeXBlOiBcImpzb24tc29uYW11ZmlsZS1hcnJheVwiIH07XG4gIH1cblxuICAvLyDtirnsiJgg7LyA7J207IqkOiBTb25hbXVGaWxlIOuLqOydvCDtg4DsnoUg6rCQ7KeAXG4gIGlmICh6b2RUeXBlLmRlc2NyaXB0aW9uID09PSBcIlNvbmFtdUZpbGVcIikge1xuICAgIHJldHVybiB7IC4uLmRlZiwgcmVuZGVyVHlwZTogXCJqc29uLXNvbmFtdWZpbGVcIiB9O1xuICB9XG5cbiAgLy8g7J2867CYIOy8gOydtOyKpDogWm9kT2JqZWN0IOyytO2BrFxuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT2JqZWN0KSB7XG4gICAgY29uc3QgY29sdW1uS2V5cyA9IE9iamVjdC5rZXlzKHpvZFR5cGVbXCJzaGFwZVwiXSk7XG4gICAgY29uc3QgY2hpbGRyZW4gPSBjb2x1bW5LZXlzLm1hcCgoa2V5KSA9PiB7XG4gICAgICBjb25zdCBpbm5lclR5cGUgPSB6b2RUeXBlW1wic2hhcGVcIl1ba2V5XTtcbiAgICAgIHJldHVybiB6b2RUeXBlVG9SZW5kZXJpbmdOb2RlKGlubmVyVHlwZSwga2V5KTtcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uZGVmLFxuICAgICAgcmVuZGVyVHlwZTogXCJvYmplY3RcIixcbiAgICAgIGNoaWxkcmVuLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQXJyYXkpIHtcbiAgICBjb25zdCBpbm5lclR5cGUgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RBcnJheTx6LlpvZFR5cGVBbnk+XG4gICAgICApLmRlZi5lbGVtZW50O1xuICAgIC8vIHZlY3RvciDtg4DsnoUg7YyQ67OEOiBudW1iZXIg67Cw7Je07J2066m07IScIGVtYmVkZGluZywgdmVjdG9yIOuTseydmCDsnbTrpoTsnYQg6rCA7KeEIOqyveyasFxuICAgIGlmIChcbiAgICAgIGlubmVyVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVtYmVyICYmXG4gICAgICAoYmFzZUtleS5pbmNsdWRlcyhcImVtYmVkZGluZ1wiKSB8fCBiYXNlS2V5LmluY2x1ZGVzKFwidmVjdG9yXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICByZW5kZXJUeXBlOiBcInZlY3RvclwiLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGVsZW1lbnQ6IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUoaW5uZXJUeXBlLCBiYXNlS2V5KSxcbiAgICB9O1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgY29uc3Qgb3B0aW9uTm9kZXMgPVxuICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgIHpvZFR5cGUgYXMgei5ab2RVbmlvbjx6LlpvZFR5cGVbXT5cbiAgICAgICkuZGVmLm9wdGlvbnMubWFwKChvcHQpID0+IHpvZFR5cGVUb1JlbmRlcmluZ05vZGUob3B0LCBiYXNlS2V5KSk7XG4gICAgLy8gVE9ETzogWm9kVW5pb27snbQg65Ok7Ja07J6I64qUIOqyveyasCDtlbjrk6Trp4FcbiAgICByZXR1cm4gb3B0aW9uTm9kZXNbMF07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kT3B0aW9uYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE9wdGlvbmFsPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTnVsbGFibGUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uem9kVHlwZVRvUmVuZGVyaW5nTm9kZShcbiAgICAgICAgLyogU0FGRVRZOiDshKDtlokgWm9kIOyiheulmCDrtoTquLDsmYAg7YWc7ZSM66a/IOyeheugpSDqs4Tslb3snbQg7J20IOqwkuydmCDtg4DsnoXsnYQg67O07J6l7ZWc64ukLiAqLyAoXG4gICAgICAgICAgem9kVHlwZSBhcyB6LlpvZE51bGxhYmxlPHouWm9kVHlwZT5cbiAgICAgICAgKS5kZWYuaW5uZXJUeXBlLFxuICAgICAgICBiYXNlS2V5LFxuICAgICAgKSxcbiAgICAgIG51bGxhYmxlOiB0cnVlLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmRlZixcbiAgICAgIHJlbmRlclR5cGU6IHJlc29sdmVSZW5kZXJUeXBlKGJhc2VLZXksIHpvZFR5cGUpLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBab2Qg7YOA7J6F6rO8IO2CpCDsnbTrpoTsnLzroZzrtoDthLAg7KCB7KCI7ZWcIFJlbmRlclR5cGXsnYQg6rKw7KCV7ZWp64uI64ukLlxuICovXG5mdW5jdGlvbiByZXNvbHZlUmVuZGVyVHlwZShrZXk6IHN0cmluZywgem9kVHlwZTogei5ab2RUeXBlQW55KTogUmVuZGVyaW5nTm9kZVtcInJlbmRlclR5cGVcIl0ge1xuICBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kRGF0ZSkge1xuICAgIHJldHVybiBcImRhdGV0aW1lXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouY29yZS4kWm9kU3RyaW5nKSB7XG4gICAgLy8gTk9URTogei5ab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWY66m0IHoudXJsKCksIHouZW1haWwoKSDrk7HsnZgg7YOA7J6F7JeQ7IScIOusuOygnOqwgCDsg53quLDrr4DroZwgei5jb3JlLiRab2RTdHJpbmfsnLzroZwg67mE6rWQ7ZWoXG4gICAgLy8gRklYTUU6IGVtYWls7J2064KYIHVybCDtg4DsnoUg65Ox7JeQIOuMgO2VnCDsspjrpqzqsIAg7ZWE7JqU7ZWoXG4gICAgaWYgKHpvZFR5cGUuZGVzY3JpcHRpb24gPT09IFwiU1FMRGF0ZVRpbWVTdHJpbmdcIikge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLWRhdGV0aW1lXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJkYXRlXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZGF0ZVwiO1xuICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImlkXCIpIHtcbiAgICAgIHJldHVybiBcInN0cmluZy1pZFwiO1xuICAgIH0gZWxzZSBpZiAoa2V5LmVuZHNXaXRoKFwiX2lkXCIpKSB7XG4gICAgICByZXR1cm4gXCJzdHJpbmctZmtfaWRcIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZE51bWJlcikge1xuICAgIGlmIChrZXkgPT09IFwiaWRcIikge1xuICAgICAgcmV0dXJuIFwibnVtYmVyLWlkXCI7XG4gICAgfSBlbHNlIGlmIChrZXkuZW5kc1dpdGgoXCJfaWRcIikpIHtcbiAgICAgIHJldHVybiBcIm51bWJlci1ma19pZFwiO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gXCJudW1iZXItcGxhaW5cIjtcbiAgICB9XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kQm9vbGVhbikge1xuICAgIHJldHVybiBcImJvb2xlYW5cIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RFbnVtKSB7XG4gICAgcmV0dXJuIFwiZW51bXNcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RSZWNvcmQpIHtcbiAgICByZXR1cm4gXCJyZWNvcmRcIjtcbiAgfSBlbHNlIGlmICh6b2RUeXBlIGluc3RhbmNlb2Ygei5ab2RBbnkgfHwgem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kVW5rbm93bikge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFVuaW9uKSB7XG4gICAgcmV0dXJuIFwic3RyaW5nLXBsYWluXCI7XG4gIH0gZWxzZSBpZiAoem9kVHlwZSBpbnN0YW5jZW9mIHouWm9kTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUgaW5zdGFuY2VvZiB6LlpvZFRlbXBsYXRlTGl0ZXJhbCkge1xuICAgIHJldHVybiBcInN0cmluZy1wbGFpblwiO1xuICB9IGVsc2UgaWYgKHpvZFR5cGUuZGVmLnR5cGUgPT09IFwiY3VzdG9tXCIpIHtcbiAgICByZXR1cm4gXCJvYmplY3RcIjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYO2DgOyehSDtjIzsi7Eg67aI6rCAICR7a2V5fSAke3pvZFR5cGUuZGVmLnR5cGV9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEZBLFNBQVMscUJBQXFCLFNBQXdDO0NBRXBFLE9BRGdCLE9BQU8sUUFBUSxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxRQUFRLGdCQUFnQixNQUNuRixDQUFBLEdBQVUsRUFBRSxDQUFDO0FBQ3RCOzs7OztBQU1BLFNBQVMsZ0JBQWdCLFFBQWlDO0NBQ3hELFFBQVEsUUFBUjtFQUNFLEtBQUssV0FDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLGVBQ0gsT0FBTztFQUNULEtBQUssZUFDSCxPQUFPO0VBQ1QsS0FBSyxXQUNILE9BQU87RUFDVCxLQUFLLFlBQ0gsT0FBTztFQUNULEtBQUssY0FDSCxPQUFPO0VBQ1QsS0FBSyxjQUNILE9BQU87RUFDVCxLQUFLLGNBQ0gsT0FBTztFQUNULFNBQ0UsT0FBTyxLQUFLLE9BQU87Q0FDdkI7QUFDRjs7Ozs7QUFNQSxTQUFTLGdCQUFnQixRQUFvQztDQUMzRCxRQUFRLFFBQVI7RUFDRSxLQUFLLFNBQ0gsT0FBTyxFQUFFLE1BQU07RUFDakIsS0FBSyxRQUNILE9BQU8sRUFBRSxLQUFLO0VBQ2hC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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.13.6",
3
+ "version": "0.13.8",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "framework",
@@ -14,8 +14,10 @@ import {
14
14
  isBelongsToOneRelationProp,
15
15
  isEnumProp,
16
16
  isHasManyRelationProp,
17
+ isIntegerSingleProp,
17
18
  isInternalSubsetField,
18
19
  isManyToManyRelationProp,
20
+ isNumberSingleProp,
19
21
  isOneToOneRelationProp,
20
22
  isRelationProp,
21
23
  isVirtualCodeProp,
@@ -334,11 +336,10 @@ export class Entity {
334
336
  const loaderLines: string[] = [];
335
337
 
336
338
  for (const loader of nestedLoaders) {
337
- const { toTable, toCol, through, fromTable } = loader.manyJoin;
339
+ const { toTable, toCol, through, fromTable, fromCol } = loader.manyJoin;
338
340
 
339
- // fromTable의 Entity를 가져와서 PK 타입 확인
340
- const fromEntity = EntityManager.getByTable(fromTable);
341
- const fromIdsType = fromEntity.getPkArrayType();
341
+ // fromIds는 부모 행에서 꺼낸 fromCol 값이므로 그 칸의 타입을 따른다(fromColumn이 PK가 아닐 수 있음).
342
+ const fromIdsType = EntityManager.getByTable(fromTable).getColumnArrayType(fromCol);
342
343
 
343
344
  loaderLines.push(
344
345
  "{",
@@ -1395,4 +1396,25 @@ export class Entity {
1395
1396
  const pkType = this.getPkType();
1396
1397
  return pkType === "integer" ? "number[]" : "string[]";
1397
1398
  }
1399
+
1400
+ /**
1401
+ * 컬럼 값 배열의 TS 타입을 반환합니다.
1402
+ * HasMany 로더의 fromIds 타입으로 사용됩니다. 로더는 부모 행에서 fromColumn(기본 id) 값을 꺼냅니다.
1403
+ */
1404
+ getColumnArrayType(column: string): string {
1405
+ if (column === "id") {
1406
+ return this.getPkArrayType();
1407
+ }
1408
+ const prop =
1409
+ this.propsDict[column] ??
1410
+ this.props.find(
1411
+ (p) =>
1412
+ (isBelongsToOneRelationProp(p) || (isOneToOneRelationProp(p) && p.hasJoinColumn)) &&
1413
+ `${p.name}_id` === column,
1414
+ );
1415
+ if (isRelationProp(prop)) {
1416
+ return EntityManager.get(prop.with).getPkArrayType();
1417
+ }
1418
+ return isIntegerSingleProp(prop) || isNumberSingleProp(prop) ? "number[]" : "string[]";
1419
+ }
1398
1420
  }
@@ -520,7 +520,12 @@ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
520
520
  case "record": {
521
521
  const recordType =
522
522
  /* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ zt as AnyZodRecord;
523
- return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
523
+ const keyType = zodTypeToTsTypeDef(recordType.def.keyType);
524
+ const valueType = zodTypeToTsTypeDef(recordType.def.valueType);
525
+ if (recordType.def.partial) {
526
+ return `Partial<Record<${keyType}, ${valueType}>>`;
527
+ }
528
+ return `{ [ key: ${keyType} ]: ${valueType}}`;
524
529
  }
525
530
  case "literal":
526
531
  return Array.from(
@@ -657,7 +662,8 @@ export function zodTypeToZodCode(zt: z.ZodType, injectImportKeys: string[] = [])
657
662
  /* SAFETY: 선행 Zod 종류 분기와 템플릿 입력 계약이 이 값의 타입을 보장한다. */ (
658
663
  zt as AnyZodRecord
659
664
  ).def;
660
- return `z.record(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
665
+ const recordFn = zRecordDef.partial ? "partialRecord" : "record";
666
+ return `z.${recordFn}(${zodTypeToZodCode(zRecordDef.keyType, injectImportKeys)}, ${zodTypeToZodCode(
661
667
  zRecordDef.valueType,
662
668
  injectImportKeys,
663
669
  )})`;