sonamu 0.8.2 → 0.8.4

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.
@@ -12,6 +12,7 @@ export class FixtureGenerator {
12
12
  locale;
13
13
  mappings;
14
14
  llmCache = new Map();
15
+ entityCache = new Map();
15
16
  options;
16
17
  constructor(sourceDb, // FixtureManager.insertFixtures가 dbName 문자열을 받기 때문에 직접 사용하지 않습니다
17
18
  // 미래 확장성을 위해 API 시그니처에는 포함시켰습니다
@@ -33,8 +34,15 @@ export class FixtureGenerator {
33
34
  * Fixture 생성 (단일)
34
35
  * @returns 생성된 fixture 데이터 (메모리 상)
35
36
  */ async generate(entityName, overrides = {}, context = this.createContext()) {
36
- const entity = this.entityManager.get(entityName);
37
+ // Entity 캐싱: 테스트에서 entity cone 수정이 반영되도록 보장
38
+ let entity = this.entityCache.get(entityName);
39
+ if (!entity) {
40
+ entity = this.entityManager.get(entityName);
41
+ this.entityCache.set(entityName, entity);
42
+ }
37
43
  const tempId = `${entityName}#temp#${Date.now()}`; // 임시 ID
44
+ // LLM row 단위 생성을 위한 고유 키 (같은 row의 필드들이 동일한 rowKey를 공유)
45
+ const rowKey = this.options.useLLM ? `${entityName}#row#${Date.now()}` : undefined;
38
46
  // 각 prop별 값 생성
39
47
  const fixture = {};
40
48
  for (const prop of entity.props){
@@ -42,6 +50,10 @@ export class FixtureGenerator {
42
50
  if ("virtual" in prop && prop.virtual) {
43
51
  continue;
44
52
  }
53
+ // DB sequence로 관리되는 PK는 생성하지 않음 (DB가 자동 할당)
54
+ if (prop.name === "id" && "cone" in prop && prop.cone?.fixtureStrategy === "sequence") {
55
+ continue;
56
+ }
45
57
  // override가 있으면 사용
46
58
  if (prop.name in overrides) {
47
59
  fixture[prop.name] = overrides[prop.name];
@@ -68,7 +80,7 @@ export class FixtureGenerator {
68
80
  // 2.5. cone.note + LLM 사용
69
81
  if (cone?.note && this.options.useLLM) {
70
82
  try {
71
- fixture[prop.name] = await this.generateWithLLM(cone.note, prop, entity);
83
+ fixture[prop.name] = await this.generateWithLLM(cone.note, prop, entity, rowKey);
72
84
  continue;
73
85
  } catch (error) {
74
86
  console.warn(`[FixtureGenerator] LLM generation failed for ${entity.id}.${prop.name}, falling back to default`, error instanceof Error ? error.message : error);
@@ -559,7 +571,53 @@ export class FixtureGenerator {
559
571
  *
560
572
  * ai 패키지는 dynamic import로 불러오므로, useLLM이 false인 경우
561
573
  * 의존성이 설치되지 않아도 fixture 생성이 정상 동작합니다.
562
- */ async generateWithLLM(fixtureHint, prop, entity) {
574
+ */ async generateWithLLM(fixtureHint, prop, entity, rowKey) {
575
+ // rowKey가 있으면 row 단위 생성 전략 사용
576
+ if (rowKey) {
577
+ const rowCacheKey = `${rowKey}:${prop.name}`;
578
+ // 이미 이 row에 대한 LLM 호출이 완료된 경우 캐시에서 바로 반환
579
+ if (this.llmCache.has(rowCacheKey)) {
580
+ return this.llmCache.get(rowCacheKey);
581
+ }
582
+ // 새 row: LLM 대상 prop 전체를 한 번에 생성
583
+ const llmProps = entity.props.filter((p)=>{
584
+ if (isRelationProp(p)) return false;
585
+ if (p.cone?.fixtureGenerator) return false;
586
+ if (p.name === "id" && p.cone?.fixtureStrategy === "sequence") return false;
587
+ return !!p.cone?.note;
588
+ });
589
+ // llmProps가 비어있으면 단일 필드 방식으로 fallback
590
+ if (llmProps.length === 0) {
591
+ !isTest() && console.log(`[FixtureGenerator] llmProps is empty for ${entity.id}.${prop.name}, using single field fallback`);
592
+ return this.generateSingleWithLLM(fixtureHint, prop, entity);
593
+ }
594
+ const apiKey = this.getApiKey();
595
+ const { createAnthropic } = await import("@ai-sdk/anthropic");
596
+ const { generateText } = await import("ai");
597
+ const { text } = await generateText({
598
+ model: createAnthropic({
599
+ apiKey
600
+ })(this.options.llmModel || "claude-sonnet-4-5"),
601
+ prompt: this.buildRowLLMPrompt(llmProps, entity)
602
+ });
603
+ // 응답을 파싱하여 각 필드에 대한 결과를 캐시에 저장
604
+ const rowResult = this.parseRowLLMResponse(text, llmProps);
605
+ for (const [fieldName, value] of Object.entries(rowResult)){
606
+ this.llmCache.set(`${rowKey}:${fieldName}`, value);
607
+ }
608
+ // 요청한 필드의 값 반환 (없으면 단일 필드 fallback)
609
+ if (this.llmCache.has(rowCacheKey)) {
610
+ return this.llmCache.get(rowCacheKey);
611
+ }
612
+ // 만약 row 응답에 이 필드가 누락된 경우 단일 필드 fallback
613
+ return this.generateSingleWithLLM(fixtureHint, prop, entity);
614
+ }
615
+ // rowKey가 없으면 기존 단일 필드 방식
616
+ return this.generateSingleWithLLM(fixtureHint, prop, entity);
617
+ }
618
+ /**
619
+ * 단일 필드를 LLM으로 생성합니다 (rowKey 없을 때 fallback용)
620
+ */ async generateSingleWithLLM(fixtureHint, prop, entity) {
563
621
  const cacheKey = `${entity.id}:${prop.name}:${fixtureHint}`;
564
622
  if (this.options.enableLLMCache && this.llmCache.has(cacheKey)) {
565
623
  return this.llmCache.get(cacheKey);
@@ -579,6 +637,58 @@ export class FixtureGenerator {
579
637
  }
580
638
  return value;
581
639
  }
640
+ /**
641
+ * row 전체를 한 번에 생성하는 LLM 프롬프트를 만듭니다.
642
+ */ buildRowLLMPrompt(props, entity) {
643
+ const locale = this.options.locale || "ko";
644
+ const language = locale === "ko" ? "Korean" : locale === "ja" ? "Japanese" : "English";
645
+ const fieldDescriptions = props.map((p)=>{
646
+ let desc = `- ${p.name} (${p.type}): ${p.cone?.note ?? ""}`;
647
+ if ((p.type === "enum" || p.type === "enum[]") && "id" in p && p.id && entity.enumLabels?.[p.id]) {
648
+ const values = Object.keys(entity.enumLabels[p.id]).join(", ");
649
+ desc += ` [allowed values: ${values}]`;
650
+ }
651
+ return desc;
652
+ }).join("\n");
653
+ const outputShape = props.map((p)=>` "${p.name}": <${p.type}>`).join(",\n");
654
+ return `Generate test fixture data for the ${entity.id} entity. All fields must be coherent and consistent with each other.
655
+
656
+ Entity: ${entity.id}
657
+ Locale: ${locale} (use ${language} for text fields)
658
+
659
+ Fields to generate:
660
+ ${fieldDescriptions}
661
+
662
+ Rules:
663
+ - All fields in a single row must be logically consistent (e.g. name/name_en/name_cn should represent the same person)
664
+ - Return ONLY valid JSON, no markdown or explanation
665
+ - Dates in ISO 8601 format
666
+ - Use ${language} for text unless field description says otherwise
667
+
668
+ Return exactly this JSON shape:
669
+ {
670
+ ${outputShape}
671
+ }`;
672
+ }
673
+ /**
674
+ * row LLM 응답을 파싱하여 필드별 값으로 변환합니다.
675
+ */ parseRowLLMResponse(text, props) {
676
+ const jsonText = text.trim().replace(/^```json\s*/i, "").replace(/```\s*$/, "").trim();
677
+ let parsed;
678
+ try {
679
+ parsed = JSON.parse(jsonText);
680
+ } catch {
681
+ !isTest() && console.warn("[FixtureGenerator] Failed to parse row LLM response:", text);
682
+ return {};
683
+ }
684
+ const result = {};
685
+ for (const prop of props){
686
+ if (prop.name in parsed) {
687
+ result[prop.name] = this.parseLLMResponse(String(parsed[prop.name] ?? ""), prop.type);
688
+ }
689
+ }
690
+ return result;
691
+ }
582
692
  buildLLMPrompt(hint, prop, entity) {
583
693
  const locale = this.options.locale || "ko";
584
694
  const language = locale === "ko" ? "Korean" : locale === "ja" ? "Japanese" : "English";
@@ -966,4 +1076,4 @@ Rules:
966
1076
  }
967
1077
  }
968
1078
 
969
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIGNvbnN0IGVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gb3ZlcnJpZGXqsIAg7J6I7Jy866m0IOyCrOyaqVxuICAgICAgaWYgKHByb3AubmFtZSBpbiBvdmVycmlkZXMpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gb3ZlcnJpZGVzW3Byb3AubmFtZV07XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25l7JeQ7IScIOyDneyEsSDsoITrnrUg7ZmV7J24XG4gICAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuXG4gICAgICAvLyAxLiBSZWxhdGlvbiBwcm9wIOyymOumrFxuICAgICAgaWYgKGlzUmVsYXRpb25Qcm9wKHByb3ApKSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aW9uVmFsdWUgPSBhd2FpdCB0aGlzLmdlbmVyYXRlUmVsYXRpb25WYWx1ZShlbnRpdHksIHByb3AsIGNvbnRleHQpO1xuICAgICAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p7J2YIOqyveyasCBmb3JlaWduIGtleSDsu6zrn7zrqoXsnLzroZwg7KCA7J6lXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSB8fFxuICAgICAgICAgIChpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICAgICAgKSB7XG4gICAgICAgICAgZml4dHVyZVtgJHtwcm9wLm5hbWV9X2lkYF0gPSByZWxhdGlvblZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuIGZpeHR1cmVHZW5lcmF0b3Ig7IKs7JqpXG4gICAgICBpZiAoY29uZT8uZml4dHVyZUdlbmVyYXRvcikge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgICAgICAgY29uZS5maXh0dXJlR2VuZXJhdG9yIGFzIHN0cmluZyxcbiAgICAgICAgICBwcm9wLFxuICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDIuNS4gY29uZS5ub3RlICsgTExNIOyCrOyaqVxuICAgICAgaWYgKGNvbmU/Lm5vdGUgJiYgdGhpcy5vcHRpb25zLnVzZUxMTSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVXaXRoTExNKGNvbmUubm90ZSwgcHJvcCwgZW50aXR5KTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIExMTSBnZW5lcmF0aW9uIGZhaWxlZCBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHRgLFxuICAgICAgICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vIGZhbGxiYWNrOiBmaXh0dXJlRGVmYXVsdCDrmJDripQg6riw67O46rCS7Jy866GcIOqzhOyGjVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIDMuIGZpeHR1cmVEZWZhdWx0IOyCrOyaqVxuICAgICAgaWYgKGNvbmU/LmZpeHR1cmVEZWZhdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gY29uZS5maXh0dXJlRGVmYXVsdDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIDQuIO2DgOyeheuzhCDquLDrs7gg7IOd7ISxXG4gICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBhd2FpdCB0aGlzLmdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gNS4gcGFzc3dvcmQg7ZWE65OcIOyVlO2YuO2ZlFxuICAgIGlmIChcInBhc3N3b3JkXCIgaW4gZml4dHVyZSAmJiBmaXh0dXJlLnBhc3N3b3JkICYmIHR5cGVvZiBmaXh0dXJlLnBhc3N3b3JkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBjb25zdCBiY3J5cHQgPSBhd2FpdCBpbXBvcnQoXCJiY3J5cHRcIik7XG4gICAgICBmaXh0dXJlLnBhc3N3b3JkID0gYXdhaXQgYmNyeXB0Lmhhc2goZml4dHVyZS5wYXNzd29yZCwgMTApO1xuICAgIH1cblxuICAgIGNvbnRleHQuZml4dHVyZXMuc2V0KHRlbXBJZCwgZml4dHVyZSk7XG4gICAgcmV0dXJuIGZpeHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmVsYXRpb24g6rCSIOyDneyEsSArIOyekOuPmSBJbXBvcnRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVSZWxhdGlvblZhbHVlKFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gICAgaWYgKCFpc1JlbGF0aW9uUHJvcChwcm9wKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9IGlzIG5vdCBhIHJlbGF0aW9uIHByb3BgKTtcbiAgICB9XG5cbiAgICAvLyBCZWxvbmdzVG9PbmUsIE9uZVRvT25lKGhhc0pvaW5Db2x1bW4p66eMIOyymOumrFxuICAgIGlmIChcbiAgICAgICFpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJlxuICAgICAgIShpc09uZVRvT25lUmVsYXRpb25Qcm9wKHByb3ApICYmIHByb3AuaGFzSm9pbkNvbHVtbilcbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG4gICAgY29uc3QgZGF0YVNvdXJjZSA9IGNvbmU/LmRhdGFTb3VyY2U7XG5cbiAgICAvLyBEYXRhRXhwbG9yZXLroZwg7LC47KGwIOuNsOydtO2EsCDsobDtmowgKHNvdXJjZURiKVxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBpZiAoZGF0YVNvdXJjZSkge1xuICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtwcm9wLndpdGh9OiR7SlNPTi5zdHJpbmdpZnkoZGF0YVNvdXJjZSl9YDtcblxuICAgICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgICAgY29uc3QgZXhwbG9yZVJlc3VsdCA9IGF3YWl0IHRoaXMuZGF0YUV4cGxvcmVyLmV4cGxvcmVXaXRoUmVsYXRpb25zKHByb3Aud2l0aCwge1xuICAgICAgICAgIHN0cmF0ZWd5OiBkYXRhU291cmNlLnN0cmF0ZWd5LFxuICAgICAgICAgIGxpbWl0OlxuICAgICAgICAgICAgKChkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk/LmxpbWl0IGFzXG4gICAgICAgICAgICAgIHwgbnVtYmVyXG4gICAgICAgICAgICAgIHwgdW5kZWZpbmVkKSB8fCAxMCxcbiAgICAgICAgICBpbmNsdWRlUmVsYXRpb25zOiB0cnVlLFxuICAgICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgICAgIC4uLihkYXRhU291cmNlLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChjYWNoZUtleSwgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChleHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGNhY2hlS2V5KTtcbiAgICAgIGlmIChjYW5kaWRhdGVzICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmlkIGFzIG51bWJlcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRhU291cmNl6rCAIOyXhuydhCDrlYwg7J6Q64+Z7Jy866GcIGZpeHR1cmUgRELsl5DshJwg7KGw7ZqMIOyLnOuPhFxuICAgIC8vIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCA6riwIOychO2VtCBleHBsb3JlV2l0aFJlbGF0aW9ucyDsgqzsmqlcbiAgICBjb25zdCBhdXRvS2V5ID0gYCR7cHJvcC53aXRofTphdXRvYDtcbiAgICBpZiAoIWNvbnRleHQucmVmZXJlbmNlQ2FjaGUuaGFzKGF1dG9LZXkpKSB7XG4gICAgICAvLyBmaXh0dXJlIERCKHNvdXJjZURiKeyXkOyEnCDsnpDrj5kg7KGw7ZqMICjqtIDqs4Qg7Y+s7ZWoKVxuICAgICAgY29uc3QgYXV0b0V4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgc3RyYXRlZ3k6IFwicmFuZG9tXCIsXG4gICAgICAgIGxpbWl0OiAxMCxcbiAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgbWF4RGVwdGg6IDMsXG4gICAgICB9KTtcbiAgICAgIGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuc2V0KGF1dG9LZXksIGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcyk7XG5cbiAgICAgIC8vIOyhsO2ajO2VnCDrjbDsnbTthLDsmYAg6rSA6rOE65CcIOuqqOuToCDsl5Tti7Dti7DrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAgICBpZiAoYXV0b0V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbXBvcnRFeHBsb3JlUmVzdWx0KGF1dG9FeHBsb3JlUmVzdWx0LCBjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhdXRvQ2FuZGlkYXRlcyA9IGNvbnRleHQucmVmZXJlbmNlQ2FjaGUuZ2V0KGF1dG9LZXkpO1xuICAgIGlmIChhdXRvQ2FuZGlkYXRlcyAmJiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyDrnpzrjaTtlZjqsowg7ZWY64KYIOyEoO2DnVxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBhdXRvQ2FuZGlkYXRlc1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBhdXRvQ2FuZGlkYXRlcy5sZW5ndGgpXTtcbiAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgfVxuXG4gICAgLy8g7LC47KGwIOuNsOydtO2EsOqwgCDsl4bsnLzrqbQgbnVsbCDrsJjtmZggKG51bGxhYmxl7J24IOqyveyasClcbiAgICBpZiAocHJvcC5udWxsYWJsZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gbnVsbGFibGXsnbQg7JWE64uI6rOgIOuNsOydtO2EsOuPhCDsl4bsnLzrqbQg7JeQ65+sXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZpeHR1cmVHZW5lcmF0b3I6ICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX3sl5Ag7ZWE7JqU7ZWcICR7cHJvcC53aXRofSDrjbDsnbTthLDqsIAg7JeG7Iq164uI64ukLiBgICtcbiAgICAgICAgYOuovOyggCAke3Byb3Aud2l0aH3rpbwg7IOd7ISx7ZWY6rGw64KYIGNvbmUuZGF0YVNvdXJjZeulvCDshKTsoJXtlZjshLjsmpQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGxvcmVXaXRoUmVsYXRpb25zIOqysOqzvOulvCB0YXJnZXREYuyXkCBpbXBvcnRcbiAgICpcbiAgICog6rSA6rOEIOyytOyduOydhCDrlLDrnbzqsIQg6rKw6rO8KG1haW4gKyByZWxhdGVkKeulvCDrqqjrkZAgaW1wb3J07ZWp64uI64ukLlxuICAgKiDsnZjsobTshLEg7Iic7ISc64qUIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVz6rCAIOyekOuPmeycvOuhnCDsspjrpqztlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGltcG9ydEV4cGxvcmVSZXN1bHQoXG4gICAgZXhwbG9yZVJlc3VsdDogRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG4gICAgY29udGV4dDogR2VuZXJhdG9yQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWxsRml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8gMS4gUmVsYXRlZCBlbnRpdGllcyBpbXBvcnQgKENvbXBhbnksIERlcGFydG1lbnQg65OxKVxuICAgIGZvciAoY29uc3QgW2VudGl0eUlkLCByZWNvcmRzXSBvZiBleHBsb3JlUmVzdWx0LnJlbGF0ZWQuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBlbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGVudGl0eUlkKTtcbiAgICAgIGNvbnN0IHJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuY3lhbihgSW1wb3J0aW5nIHJlbGF0ZWQgZW50aXR5OiAke2VudGl0eUlkfSAoJHtyZWNvcmRzLmxlbmd0aH0gcmVjb3JkcylgKSxcbiAgICAgICAgKTtcblxuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgcmVjb3Jkcykge1xuICAgICAgICBjb25zdCByZWNvcmRLZXkgPSBgJHtlbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICAgIHJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29yZHNUb0ltcG9ydC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgICAgYCAgLSBQcm9jZXNzaW5nICR7ZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgICAgZW50aXR5LFxuICAgICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICAgIHsgX2RiOiB0aGlzLnNvdXJjZURiLCBzaW5nbGVSZWNvcmQ6IHRydWUgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMi4gTWFpbiBlbnRpdHkgaW1wb3J0IChFbXBsb3llZSDrk7EpXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkKTtcbiAgICBjb25zdCBtYWluUmVjb3Jkc1RvSW1wb3J0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdID0gW107XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5jeWFuKFxuICAgICAgICAgIGBJbXBvcnRpbmcgbWFpbiBlbnRpdHk6ICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSAoJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiBleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcykge1xuICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSMke3JlY29yZC5pZH1gO1xuICAgICAgaWYgKCFjb250ZXh0LmltcG9ydGVkUmVjb3Jkcy5oYXMocmVjb3JkS2V5KSkge1xuICAgICAgICBtYWluUmVjb3Jkc1RvSW1wb3J0LnB1c2gocmVjb3JkKTtcbiAgICAgICAgY29udGV4dC5pbXBvcnRlZFJlY29yZHMuYWRkKHJlY29yZEtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG1haW5SZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgbWFpblJlY29yZHNUb0ltcG9ydCkge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLmdyYXkoXG4gICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gcmVjb3JkOmAsXG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHJlY29yZCkuc2xpY2UoMCwgMTAwKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgY29uc3QgZml4dHVyZVJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIG1haW5FbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFsbEZpeHR1cmVSZWNvcmRzLnB1c2goLi4uZml4dHVyZVJlY29yZHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDMuIOuqqOuToCBmaXh0dXJl66W8IO2VnCDrsojsl5Ag7IK97J6FICjsnZjsobTshLEg7Iic7IScIOyekOuPmSDsspjrpqwpXG4gICAgaWYgKGFsbEZpeHR1cmVSZWNvcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBhbGxGaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICAgIGBBdXRvLWltcG9ydGVkICR7ZXhwbG9yZVJlc3VsdC5tYWluLmVudGl0eUlkfSB3aXRoIHJlbGF0aW9uczogYCArXG4gICAgICAgICAgICAgIGAke2V4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gbWFpbiArICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICAgICksXG4gICAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZpeHR1cmVHZW5lcmF0b3Ig7Iuk7ZaJIChGYWtlci5qc+unjCDsp4Dsm5ApXG4gICAqXG4gICAqIGZha2VyLiog7ZiV7Iud7J2YIO2RnO2YhOyLneydhCDslYjsoITtlZjqsowg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICog7JiIOiBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIgZmFrZXIuaW50ZXJuZXQuZW1haWwoKVxuICAgKiDsmIg6IFwiZmFrZXIubG9yZW0ud29yZHMoMylcIiDihpIgZmFrZXIubG9yZW0ud29yZHMoMylcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUdlbmVyYXRvcihcbiAgICBnZW5lcmF0b3I6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBGYWtlci5qcyDtkZztmITsi53rp4wg7KeA7JuQXG4gICAgaWYgKGdlbmVyYXRvci5zdGFydHNXaXRoKFwiZmFrZXIuXCIpKSB7XG4gICAgICAvLyB1c2VybmFtZeydtOuCmCBuYW1lIO2VhOuTnOuKlCDtlZzqta3slrQgZmFrZXIg7IKs7JqpXG4gICAgICBjb25zdCBpc05hbWVGaWVsZCA9IHByb3AubmFtZSA9PT0gXCJ1c2VybmFtZVwiIHx8IHByb3AubmFtZSA9PT0gXCJuYW1lXCI7XG4gICAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICAgIGNvbnN0IGZha2VyID0gaXNOYW1lRmllbGQgPyBmYWtlck1vZHVsZS5mYWtlcktPIDogZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgICBjb25zdCBleHByID0gZ2VuZXJhdG9yLnNsaWNlKDYpOyAvLyBcImZha2VyLlwiIOygnOqxsFxuXG4gICAgICB0cnkge1xuICAgICAgICAvLyDtlajsiJgg6rK966Gc7JmAIOyduOyekCDtjIzsi7FcbiAgICAgICAgY29uc3QgbWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICAgICAgaWYgKCFtYXRjaCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgWywgcGF0aCwgYXJnc1N0cl0gPSBtYXRjaDtcbiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcblxuICAgICAgICAvLyBmYWtlciDqsJ3ssrTsl5DshJwg7ZWo7IiYIOywvuq4sFxuICAgICAgICBsZXQgZm46IHVua25vd24gPSBmYWtlcjtcbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgICAgICBmbiA9IChmbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06IGZha2VyLiR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyDtlajsiJjqsIAg7JWE64uI66m0IOyXkOufrFxuICAgICAgICBpZiAodHlwZW9mIGZuICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IGZha2VyLiR7cGF0aH0gaXMgbm90IGEgZnVuY3Rpb24gKGZvciAke3Byb3AubmFtZX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgICAgIGlmIChhcmdzU3RyPy50cmltKCkpIHtcbiAgICAgICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICBgRmFpbGVkIHRvIGV4ZWN1dGUgZ2VuZXJhdG9yIFwiJHtnZW5lcmF0b3J9XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrIHRvIGRlZmF1bHQ6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZha2VyIOydtOyZuOydmCDtkZztmITsi53snYAg7KeA7JuQ7ZWY7KeAIOyViuydjFxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgZ2VuZXJhdG9yIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtnZW5lcmF0b3J9LiBPbmx5IGZha2VyLiogZXhwcmVzc2lvbnMgYXJlIHN1cHBvcnRlZC4gVXNpbmcgZGVmYXVsdCB2YWx1ZS5gLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VhOuTnOydmCDtg4DsnoXqs7wg7J2066aE7J2EIOu2hOyEne2VmOyXrCDsoIHsoIjtlZwg6riw67O46rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7Jqw7ISg7Iic7JyEOlxuICAgKiAxLiDtlYTrk5zrqoUg7Yyo7YS0IOunpOy5rSAoc2FsYXJ5LCBidWRnZXQg65OxIOydmOuvuOyeiOuKlCDrjbDsnbTthLApXG4gICAqIDIuIO2KueyImCDsvIDsnbTsiqQgKERlcGFydG1lbnQgbmFtZSDrk7Eg64+E66mU7J24IOyngOyLnSlcbiAgICogMy4g67Cw7Je0IO2DgOyehSAoSlNPTiDrsLDsl7QpXG4gICAqIDQuIEVudW0g7YOA7J6FXG4gICAqIDUuIO2DgOyeheuzhCDquLDrs7jqsJJcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcDogRW50aXR5UHJvcCwgZW50aXR5PzogRW50aXR5KTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgY29uc3QgZmFrZXIgPSBmYWtlck1vZHVsZS5mYWtlcjtcbiAgICBjb25zdCBmYWtlcktPID0gZmFrZXJNb2R1bGUuZmFrZXJLTztcbiAgICBjb25zdCBmYWtlckpBID0gZmFrZXJNb2R1bGUuZmFrZXJKQTtcblxuICAgIGNvbnN0IGxvY2FsZUZha2VyID0gdGhpcy5sb2NhbGUgPT09IFwia29cIiA/IGZha2VyS08gOiB0aGlzLmxvY2FsZSA9PT0gXCJqYVwiID8gZmFrZXJKQSA6IGZha2VyO1xuXG4gICAgLyoqXG4gICAgICogMS4g7ZWE65Oc66qF7JeQ7IScIOydmOuvuOulvCDstpTroaDtlZjsl6wg7ZiE7Iuk7KCB7J24IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICog7JiIOiBzYWxhcnkg4oaSIDMwTX4xNTBNICjtlZzqta0g7Jew67SJIOuylOychClcbiAgICAgKiAgICAgYnVkZ2V0IOKGkiAxME1+NTAwTSAo7ZSE66Gc7KCd7Yq4IOyYiOyCsCDrspTsnIQpXG4gICAgICovXG4gICAgY29uc3QgbG9jYWxlTWFwcGluZ3MgPSB0aGlzLm1hcHBpbmdzW3RoaXMubG9jYWxlXSB8fCB0aGlzLm1hcHBpbmdzLmVuO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIlwiKTtcblxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMobG9jYWxlTWFwcGluZ3MuZmllbGRfcGF0dGVybnMpKSB7XG4gICAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMocGF0dGVybi50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVGYWtlckV4cHJlc3Npb24oY29uZmlnLmZha2VyLCBwcm9wKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGZpZWxkIHBhdHRlcm4gXCIke3BhdHRlcm59XCIgZm9yICR7cHJvcC5uYW1lfSwgZmFsbGluZyBiYWNrOmAsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDIuIERlcGFydG1lbnQgbmFtZeydgCDtlZzqta3slrQg67aA7ISc66qFIOuqqeuhneyXkOyEnCDshKDtg53tlanri4jri6QuXG4gICAgICog6rOg7Jyg7ISx7J2EIOychO2VtCA3MCUg7ZmV66Wg66GcIHByZWZpeC9zdWZmaXjrpbwg7LaU6rCA7ZWp64uI64ukLlxuICAgICAqL1xuICAgIGlmIChlbnRpdHk/LmlkID09PSBcIkRlcGFydG1lbnRcIiAmJiBwcm9wLm5hbWUgPT09IFwibmFtZVwiKSB7XG4gICAgICBjb25zdCBkZXBhcnRtZW50cyA9IFtcbiAgICAgICAgXCLqsJzrsJztjIBcIixcbiAgICAgICAgXCLquLDtmo3tjIBcIixcbiAgICAgICAgXCLrp4jsvIDtjIXtjIBcIixcbiAgICAgICAgXCLsmIHsl4XtjIBcIixcbiAgICAgICAgXCLsnbjsgqztjIBcIixcbiAgICAgICAgXCLstJ3rrLTtjIBcIixcbiAgICAgICAgXCLsnqzrrLTtjIBcIixcbiAgICAgICAgXCLtmozqs4TtjIBcIixcbiAgICAgICAgXCLrspXrrLTtjIBcIixcbiAgICAgICAgXCLrlJTsnpDsnbjtjIBcIixcbiAgICAgICAgXCJJVO2MgFwiLFxuICAgICAgICBcIuqzoOqwneyngOybkO2MgFwiLFxuICAgICAgICBcIu2SiOyniOq0gOumrO2MgFwiLFxuICAgICAgICBcIuyXsOq1rOqwnOuwnO2MgFwiLFxuICAgICAgICBcIuyDneyCsO2MgFwiLFxuICAgICAgICBcIuq1rOunpO2MgFwiLFxuICAgICAgICBcIuusvOulmO2MgFwiLFxuICAgICAgXTtcbiAgICAgIGNvbnN0IHByZWZpeGVzID0gW1wi7Iug6recXCIsIFwi7Ya17ZWpXCIsIFwi7KCE6561XCIsIFwi6riA66Gc67KMXCIsIFwi65SU7KeA7YS4XCIsIFwi7ZW17IusXCJdO1xuICAgICAgY29uc3Qgc3VmZml4ZXMgPSBbXCIx7YyAXCIsIFwiMu2MgFwiLCBcIjPtjIBcIiwgXCJB7YyAXCIsIFwiQu2MgFwiLCBcIuuzuOu2gFwiLCBcIuyEvO2EsFwiLCBcIuq3uOujuVwiXTtcblxuICAgICAgY29uc3QgZGVwdCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGRlcGFydG1lbnRzKTtcblxuICAgICAgY29uc3QgcmFuZG9tID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIGlmIChyYW5kb20gPiAwLjcpIHtcbiAgICAgICAgY29uc3QgcHJlZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQocHJlZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSAke2RlcHR9YDtcbiAgICAgIH1cbiAgICAgIGlmIChyYW5kb20gPiAwLjQpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoc3VmZml4ZXMpO1xuICAgICAgICByZXR1cm4gYCR7ZGVwdH0gJHtzdWZmaXh9YDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkZXB0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDMuIEpTT04g7YOA7J6F7J2066m07IScIOuwsOyXtOyduCDqsr3smrAgKFNvbmFtdUZpbGVbXSwgc3RyaW5nW10g65OxKVxuICAgICAqIO2VhOuTnOuqhSDtjKjthLTsnYQg67O06rOgIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcImpzb25cIiAmJiBcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkKSB7XG4gICAgICBpZiAocHJvcC5pZC5lbmRzV2l0aChcIltdXCIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQXJyYXlWYWx1ZShwcm9wLCBlbnRpdHksIGZha2VyLCBsb2NhbGVGYWtlcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDQuIEVudW0g7YOA7J6F7J2AIOygleydmOuQnCDqsJIg7KSRIO2VmOuCmOulvCDrnpzrjaQg7ISg7YOd7ZWp64uI64ukICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChlbnVtVmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wLm51bGxhYmxlID8gbnVsbCA6IFwiVU5LTk9XTlwiO1xuICAgIH1cblxuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVtdXCIpIHtcbiAgICAgIGxldCBlbnVtVmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBpZiAoXCJlbnVtXCIgaW4gcHJvcCAmJiBBcnJheS5pc0FycmF5KHByb3AuZW51bSkgJiYgcHJvcC5lbnVtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IHByb3AuZW51bTtcbiAgICAgIH0gZWxzZSBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCAmJiBlbnRpdHk/LmVudW1MYWJlbHM/Lltwcm9wLmlkXSkge1xuICAgICAgICBlbnVtVmFsdWVzID0gT2JqZWN0LmtleXMoZW50aXR5LmVudW1MYWJlbHNbcHJvcC5pZF0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZW51bVZhbHVlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBbZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyldO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDUuIFZlY3RvciDtg4DsnoXsnYAg7ZiE7J6sIOyngOybkO2VmOyngCDslYrsnLzrr4DroZwgbnVsbOydhCDrsJjtmZjtlanri4jri6QuXG4gICAgICog7Zal7ZuEIEFJIGVtYmVkZGluZyDsg53shLEg6riw64qlIOy2lOqwgCDsi5wg6rWs7ZiEIOyYiOygleyeheuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAocHJvcC50eXBlID09PSBcInZlY3RvclwiIHx8IHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JbXVwiIHx8IHByb3AudHlwZSA9PT0gXCJ0c3ZlY3RvclwiKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKiogNi4g7YOA7J6F67OEIOq4sOuzuCBGYWtlciDtkZztmITsi53snYQg7Iuk7ZaJ7ZWp64uI64ukICovXG4gICAgY29uc3QgdHlwZURlZmF1bHQgPSBsb2NhbGVNYXBwaW5ncy50eXBlX2RlZmF1bHRzW3Byb3AudHlwZV07XG4gICAgaWYgKHR5cGVEZWZhdWx0KSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKHR5cGVEZWZhdWx0LmZha2VyLCBwcm9wKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgY2hhbGsueWVsbG93KGBGYWlsZWQgdG8gZXhlY3V0ZSB0eXBlIGRlZmF1bHQgZm9yICR7cHJvcC50eXBlfSwgdXNpbmcgZmFsbGJhY2s6YCwgZXJyb3IpLFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIDcuIOunpO2VkeuQmOyngCDslYrsnYAg7YOA7J6F7J2AIOq4sOuzuCBGYWtlciDtlajsiJjroZwg7LKY66as7ZWp64uI64ukICovXG4gICAgc3dpdGNoIChwcm9wLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGNhc2UgXCJzdHJpbmdbXVwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubG9yZW0ud29yZHMoMyk7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcImludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KV07XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSk7XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlcltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmJpZ0ludCh7IG1pbjogMW4sIG1heDogMTAwMG4gfSldO1xuICAgICAgY2FzZSBcIm51bWJlclwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pO1xuICAgICAgY2FzZSBcIm51bWJlcltdXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1tdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIubnVtYmVyLmZsb2F0KHsgbWluOiAwLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGF0eXBlLmJvb2xlYW4oKTtcbiAgICAgIGNhc2UgXCJib29sZWFuW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5kYXRhdHlwZS5ib29sZWFuKCldO1xuICAgICAgY2FzZSBcImRhdGVcIjpcbiAgICAgIGNhc2UgXCJkYXRlW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmRhdGUucGFzdCgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJ1dWlkW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLnN0cmluZy51dWlkKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog67Cw7Je0IO2DgOyeheydmCDqsJLsnYQg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiDtg4DsnoUgSUTsmYAg7ZWE65Oc66qFIO2MqO2EtOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOuwsOyXtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKiDsmIg6IGltYWdlX3VybHMg4oaSIFt7dXJsLCBuYW1lLCBtaW1lX3R5cGV9LCAuLi5dXG4gICAqICAgICB0YWdfaWRzIOKGkiBbMSwgMjMsIDQ1XVxuICAgKi9cbiAgcHJpdmF0ZSBnZW5lcmF0ZUFycmF5VmFsdWUoXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBfZW50aXR5OiBFbnRpdHkgfCB1bmRlZmluZWQsXG4gICAgZmFrZXI6IHR5cGVvZiBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIikuZmFrZXIsXG4gICAgX2xvY2FsZUZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICApOiB1bmtub3duW10ge1xuICAgIGNvbnN0IGNvdW50ID0gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAzIH0pO1xuXG4gICAgLyoqIFNvbmFtdUZpbGVbXeydgCBTb25hbXUg64K07J6lIO2DgOyeheycvOuhnCDqtazsobDqsIAg7KCV7ZW07KC4IOyeiOyKteuLiOuLpCAqL1xuICAgIGlmIChcImlkXCIgaW4gcHJvcCAmJiBwcm9wLmlkID09PSBcIlNvbmFtdUZpbGVbXVwiKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gKHtcbiAgICAgICAgdXJsOiBmYWtlci5pbWFnZS51cmwoKSxcbiAgICAgICAgbmFtZTogZmFrZXIuc3lzdGVtLmZpbGVOYW1lKCksXG4gICAgICAgIG1pbWVfdHlwZTogZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoW1xuICAgICAgICAgIFwiaW1hZ2UvanBlZ1wiLFxuICAgICAgICAgIFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgICAgXCJpbWFnZS9naWZcIixcbiAgICAgICAgICBcImFwcGxpY2F0aW9uL3BkZlwiLFxuICAgICAgICBdKSxcbiAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKiog7ZWE65Oc66qF7JeQ7IScIOuwsOyXtOydmCDsmqnrj4Trpbwg7LaU66Gg7ZWp64uI64ukICovXG4gICAgY29uc3Qgbm9ybWFsaXplZE5hbWUgPSBwcm9wLm5hbWUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csIFwiXCIpO1xuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwidXJsXCIpIHx8IG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaW1hZ2VcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5pbnRlcm5ldC51cmwoKSk7XG4gICAgfVxuXG4gICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKFwiaWRcIikgJiYgbm9ybWFsaXplZE5hbWUuZW5kc1dpdGgoXCJzXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcInRhZ1wiKSB8fCBub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcIm5hbWVcIikpIHtcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBjb3VudCB9LCAoKSA9PiBmYWtlci5sb3JlbS53b3JkKCkpO1xuICAgIH1cblxuICAgIC8qKiDtjKjthLQg66ek7Lmt65CY7KeAIOyViuycvOuptCDruYgg67Cw7Je07J2EIOuwmO2ZmO2VqeuLiOuLpCAqL1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBKU09OIOunpO2VkeydmCBGYWtlciDtkZztmITsi53snYQg7YyM7Iux7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAgICpcbiAgICog7ZGc7ZiE7IudIOyYiOyLnDpcbiAgICogLSBcImZha2VyLmludGVybmV0LmVtYWlsKClcIiDihpIg7J247J6QIOyXhuydjFxuICAgKiAtIFwiZmFrZXIubnVtYmVyLmludCh7IG1pbjogMSwgbWF4OiAxMDAgfSlcIiDihpIgSlNPTiDsnbjsnpBcbiAgICogLSBcInt9XCIg4oaSIOumrO2EsOuftCDqsJIgKEpTT04ucGFyc2UpXG4gICAqXG4gICAqIGZha2VyS08sIGZha2VySkHrj4Qg7KeA7JuQ7ZWY7JesIOuLpOq1reyWtCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlRmFrZXJFeHByZXNzaW9uKGV4cHJlc3Npb246IHN0cmluZywgcHJvcDogRW50aXR5UHJvcCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICAvKiogRmFrZXIg7ZGc7ZiE7Iud7J20IOyVhOuLjCDrpqzthLDrn7Qg6rCS7J2AIEpTT07snLzroZwg7YyM7Iux7ZWp64uI64ukICovXG4gICAgaWYgKCFleHByZXNzaW9uLnN0YXJ0c1dpdGgoXCJmYWtlclwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZXhwcmVzc2lvbik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGV4cHJlc3Npb247XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqIO2RnO2YhOyLneyXkOyEnCBGYWtlciDqsJ3ssrTsmYAg6rK966Gc66W8IOy2lOy2nO2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IG1hdGNoID0gZXhwcmVzc2lvbi5tYXRjaCgvXihmYWtlcnxmYWtlcktPfGZha2VySkEpXFwuKC4qPykkLyk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb246ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBmYWtlck5hbWUsIGV4cHJdID0gbWF0Y2g7XG4gICAgY29uc3Qgc2VsZWN0ZWRGYWtlciA9XG4gICAgICBmYWtlck5hbWUgPT09IFwiZmFrZXJLT1wiID8gZmFrZXJLTyA6IGZha2VyTmFtZSA9PT0gXCJmYWtlckpBXCIgPyBmYWtlckpBIDogZmFrZXI7XG5cbiAgICBjb25zdCBmdW5jTWF0Y2ggPSBleHByLm1hdGNoKC9eKFtcXHcuXSspKD86XFwoKC4qPylcXCkpPyQvKTtcbiAgICBpZiAoIWZ1bmNNYXRjaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGZha2VyIGV4cHJlc3Npb24gZm9yICR7cHJvcC5uYW1lfTogJHtleHByZXNzaW9ufWApO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gZnVuY01hdGNoO1xuICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAvKiog7KCQIO2RnOq4sOuylShkb3Qgbm90YXRpb24p7Jy866GcIEZha2VyIO2VqOyImOulvCDssL7slYTqsJHri4jri6QgKi9cbiAgICBsZXQgZm46IHVua25vd24gPSBzZWxlY3RlZEZha2VyO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gXCJvYmplY3RcIiAmJiBmbiAhPT0gbnVsbCAmJiBwYXJ0IGluIGZuKSB7XG4gICAgICAgIGZuID0gKGZuIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBwYXRoIGZvciAke3Byb3AubmFtZX06ICR7ZmFrZXJOYW1lfS4ke3BhdGh9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZmFrZXJOYW1lfS4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgIH1cblxuICAgIGxldCBhcmdzOiB1bmtub3duW10gPSBbXTtcbiAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICBhcmdzID0gdGhpcy5wYXJzZUdlbmVyYXRvckFyZ3MoYXJnc1N0ciwgcHJvcC5uYW1lKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogZml4dHVyZUhpbnTrpbwgTExN7JeQ6rKMIOyghOuLrO2VmOyXrCDtmITsi6TsoIHsnbgg7YWM7Iqk7Yq4IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIGZha2VyLmpz66Gc64qUIOyDneyEse2VmOq4sCDslrTroKTsmrQg67O17J6h7ZWcIO2FjeyKpO2KuCjsnpDquLDshozqsJwsIOyEpOuqheusuCDrk7Ep66W8XG4gICAqIExMTeydhCDtmZzsmqntlZjsl6wg7IOd7ISx7ZWp64uI64ukLiDrj5nsnbztlZwgaGludOyXkCDrjIDtlZwg7KSR67O1IO2YuOy2nOydhCDrsKnsp4DtlZjquLAg7JyE7ZW0XG4gICAqIOy6kOyLseydhCDquLDrs7jsnLzroZwg7KeA7JuQ7ZWp64uI64ukIChMTE0gQVBJIOu5hOyaqSDsoIjqsJApLlxuICAgKlxuICAgKiBhaSDtjKjtgqTsp4DripQgZHluYW1pYyBpbXBvcnTroZwg67aI65+s7Jik66+A66GcLCB1c2VMTE3snbQgZmFsc2Xsnbgg6rK97JqwXG4gICAqIOydmOyhtOyEseydtCDshKTsuZjrkJjsp4Ag7JWK7JWE64+EIGZpeHR1cmUg7IOd7ISx7J20IOygleyDgSDrj5nsnpHtlanri4jri6QuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlV2l0aExMTShcbiAgICBmaXh0dXJlSGludDogc3RyaW5nLFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgZW50aXR5OiBFbnRpdHksXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7ZW50aXR5LmlkfToke3Byb3AubmFtZX06JHtmaXh0dXJlSGludH1gO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUgJiYgdGhpcy5sbG1DYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5sbG1DYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIH1cblxuICAgIGNvbnN0IGFwaUtleSA9IHRoaXMuZ2V0QXBpS2V5KCk7XG4gICAgY29uc3QgeyBjcmVhdGVBbnRocm9waWMgfSA9IGF3YWl0IGltcG9ydChcIkBhaS1zZGsvYW50aHJvcGljXCIpO1xuICAgIGNvbnN0IHsgZ2VuZXJhdGVUZXh0IH0gPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcblxuICAgIGNvbnN0IHsgdGV4dCB9ID0gYXdhaXQgZ2VuZXJhdGVUZXh0KHtcbiAgICAgIG1vZGVsOiBjcmVhdGVBbnRocm9waWMoeyBhcGlLZXkgfSkodGhpcy5vcHRpb25zLmxsbU1vZGVsIHx8IFwiY2xhdWRlLXNvbm5ldC00LTVcIiksXG4gICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRMTE1Qcm9tcHQoZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSksXG4gICAgfSk7XG5cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMucGFyc2VMTE1SZXNwb25zZSh0ZXh0LCBwcm9wLnR5cGUpO1xuICAgIGlmICh0aGlzLm9wdGlvbnMuZW5hYmxlTExNQ2FjaGUpIHtcbiAgICAgIHRoaXMubGxtQ2FjaGUuc2V0KGNhY2hlS2V5LCB2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExMTVByb21wdChoaW50OiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3AsIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBsZXQgcHJvbXB0ID0gYEdlbmVyYXRlIHRlc3QgZGF0YSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSAodHlwZTogJHtwcm9wLnR5cGV9KVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldD8uYW50aHJvcGljX2FwaV9rZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDtmZjqsr0g65OxKVxuICAgIH1cblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZC4gU2V0IGl0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBTb25hbXUuc2VjcmV0LmFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaXh0dXJlczogQXJyYXk8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gPSBbXTtcblxuICAgIC8vIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuY291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShzcGVjLmVudGl0eSwgc3BlYy5vdmVycmlkZXMgfHwge30sIGNvbnRleHQpO1xuICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICBlbnRpdHk6IHNwZWMuZW50aXR5LFxuICAgICAgICAgIGRhdGE6IGZpeHR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeyBlbnRpdHk6IGVudGl0eU5hbWUsIGRhdGEgfSBvZiBnZW5lcmF0ZWRGaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcblxuICAgICAgLy8g7J6E7IucIElEIOyDneyEsSAodGFyZ2V0RGLsl5AgSU5TRVJUIO2bhCDsi6TsoJwgSUTrpbwg67Cb7J2MKVxuICAgICAgY29uc3QgdGVtcElkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICB7IC4uLmRhdGEsIGlkOiB0ZW1wSWQgfSBhcyB7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgIHsgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCBhbmQgc2F2ZWQgJHtyZXN1bHRzLmxlbmd0aH0gZml4dHVyZXMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX1gKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIERCKHNvdXJjZURiKeyXkOyEnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIGZpeHR1cmUgREIodGFyZ2V0RGIp7JeQIGltcG9ydO2VqeuLiOuLpC5cbiAgICpcbiAgICogMS4gRGF0YUV4cGxvcmVy66GcIHNvdXJjZURi7JeQ7IScIOuNsOydtO2EsCDsobDtmowgKOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoKVxuICAgKiAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgKiAzLiB0YXJnZXREYuyXkCDsgr3snoVcbiAgICpcbiAgICogQHBhcmFtIGVudGl0eU5hbWUgLSDsobDtmoztlaAgZW50aXR5IOydtOumhFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOyhsO2ajCDsmLXshZggKHN0cmF0ZWd5LCBsaW1pdCwgaW5jbHVkZVJlbGF0aW9ucyDrk7EpXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8g7ZSE66Gc642V7IWYIERC7JeQ7IScIFVzZXIgMTDrqoUgKyDqtIDroKggRW1wbG95ZWUsIERlcGFydG1lbnQg6rCA7KC47Jik6riwXG4gICAqIGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKFwiVXNlclwiLCB7XG4gICAqICAgc3RyYXRlZ3k6IFwic2FtcGxlXCIsXG4gICAqICAgbGltaXQ6IDEwLFxuICAgKiAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAqICAgbWF4RGVwdGg6IDJcbiAgICogfSk7XG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tU291cmNlKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICBgSW1wb3J0aW5nICR7ZW50aXR5TmFtZX0gZnJvbSBzb3VyY2UgREIgd2l0aCBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KHsgc3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksIGxpbWl0OiBvcHRpb25zLmxpbWl0LCBpbmNsdWRlUmVsYXRpb25zOiBvcHRpb25zLmluY2x1ZGVSZWxhdGlvbnMsIG1heERlcHRoOiBvcHRpb25zLm1heERlcHRoIH0pfWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gMS4gRGF0YUV4cGxvcmVy66GcIHNvdXJjZURi7JeQ7IScIOuNsOydtO2EsCDsobDtmowgKOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoKVxuICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhlbnRpdHlOYW1lLCBvcHRpb25zKTtcblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEZvdW5kICR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSAke2VudGl0eU5hbWV9IHJlY29yZHMgYW5kICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8g66mU7J24IGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICByZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyDqtIDroKggZW50aXR57J2YIHJlY29yZHPrpbwgRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBmb3IgKGNvbnN0IFtyZWxhdGVkRW50aXR5TmFtZSwgcmVsYXRlZFJlY29yZHNdIG9mIGV4cGxvcmVSZXN1bHQucmVsYXRlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0ZWRFbnRpdHlOYW1lKTtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlbGF0ZWRSZWNvcmRzKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIHJlbGF0ZWRFbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIC0gJHtyZWxhdGVkRW50aXR5TmFtZX06ICR7cmVsYXRlZFJlY29yZHMubGVuZ3RofSByZWNvcmRzYCkpO1xuICAgIH1cblxuICAgIC8vIDMuIHRhcmdldERi7JeQIOyCveyehSAoRml4dHVyZU1hbmFnZXLqsIAg7J2Y7KG07ISxIOygleugrCDsspjrpqwpXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBmaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICBgU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICR7cmVzdWx0cy5sZW5ndGh9IHJlY29yZHMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSAke2VudGl0eU5hbWV9ICsgJHtyZXN1bHRzLmxlbmd0aCAtIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gcmVsYXRlZClgLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVGVzdCIsIkRhdGFFeHBsb3JlciIsImZha2VyTWFwcGluZ3MiLCJGaXh0dXJlTWFuYWdlciIsIkZpeHR1cmVHZW5lcmF0b3IiLCJkYXRhRXhwbG9yZXIiLCJsb2NhbGUiLCJtYXBwaW5ncyIsImxsbUNhY2hlIiwiTWFwIiwib3B0aW9ucyIsInNvdXJjZURiIiwiX3RhcmdldERiIiwidGFyZ2V0RGJOYW1lIiwiZW50aXR5TWFuYWdlciIsInVzZUxMTSIsImVuYWJsZUxMTUNhY2hlIiwibGxtTW9kZWwiLCJnZW5lcmF0ZSIsImVudGl0eU5hbWUiLCJvdmVycmlkZXMiLCJjb250ZXh0IiwiY3JlYXRlQ29udGV4dCIsImVudGl0eSIsImdldCIsInRlbXBJZCIsIkRhdGUiLCJub3ciLCJmaXh0dXJlIiwicHJvcCIsInByb3BzIiwidmlydHVhbCIsIm5hbWUiLCJjb25lIiwicmVsYXRpb25WYWx1ZSIsImdlbmVyYXRlUmVsYXRpb25WYWx1ZSIsImhhc0pvaW5Db2x1bW4iLCJmaXh0dXJlR2VuZXJhdG9yIiwiZXhlY3V0ZUdlbmVyYXRvciIsIm5vdGUiLCJnZW5lcmF0ZVdpdGhMTE0iLCJlcnJvciIsImNvbnNvbGUiLCJ3YXJuIiwiaWQiLCJFcnJvciIsIm1lc3NhZ2UiLCJmaXh0dXJlRGVmYXVsdCIsInVuZGVmaW5lZCIsImdlbmVyYXRlRGVmYXVsdFZhbHVlIiwicGFzc3dvcmQiLCJiY3J5cHQiLCJoYXNoIiwiZml4dHVyZXMiLCJzZXQiLCJkYXRhU291cmNlIiwiY2FjaGVLZXkiLCJ3aXRoIiwiSlNPTiIsInN0cmluZ2lmeSIsInJlZmVyZW5jZUNhY2hlIiwiaGFzIiwiZXhwbG9yZVJlc3VsdCIsImV4cGxvcmVXaXRoUmVsYXRpb25zIiwic3RyYXRlZ3kiLCJsaW1pdCIsImNvbmZpZyIsImluY2x1ZGVSZWxhdGlvbnMiLCJtYXhEZXB0aCIsIm1haW4iLCJyZWNvcmRzIiwiaW1wb3J0RXhwbG9yZVJlc3VsdCIsImNhbmRpZGF0ZXMiLCJsZW5ndGgiLCJzZWxlY3RlZCIsIk1hdGgiLCJmbG9vciIsInJhbmRvbSIsImF1dG9LZXkiLCJhdXRvRXhwbG9yZVJlc3VsdCIsImF1dG9DYW5kaWRhdGVzIiwibnVsbGFibGUiLCJhbGxGaXh0dXJlUmVjb3JkcyIsImVudGl0eUlkIiwicmVsYXRlZCIsImVudHJpZXMiLCJyZWNvcmRzVG9JbXBvcnQiLCJsb2ciLCJjeWFuIiwicmVjb3JkIiwicmVjb3JkS2V5IiwiaW1wb3J0ZWRSZWNvcmRzIiwicHVzaCIsImFkZCIsImdyYXkiLCJzbGljZSIsImZpeHR1cmVSZWNvcmRzIiwiY3JlYXRlRml4dHVyZVJlY29yZCIsIl9kYiIsInNpbmdsZVJlY29yZCIsIm1haW5FbnRpdHkiLCJtYWluUmVjb3Jkc1RvSW1wb3J0IiwiaW5zZXJ0Rml4dHVyZXMiLCJncmVlbiIsInNpemUiLCJnZW5lcmF0b3IiLCJzdGFydHNXaXRoIiwiaXNOYW1lRmllbGQiLCJmYWtlck1vZHVsZSIsImZha2VyIiwiZmFrZXJLTyIsImV4cHIiLCJtYXRjaCIsInBhdGgiLCJhcmdzU3RyIiwicGFydHMiLCJzcGxpdCIsImZuIiwicGFydCIsImFyZ3MiLCJ0cmltIiwicGFyc2VHZW5lcmF0b3JBcmdzIiwieWVsbG93IiwiZmFrZXJKQSIsImxvY2FsZUZha2VyIiwibG9jYWxlTWFwcGluZ3MiLCJlbiIsIm5vcm1hbGl6ZWROYW1lIiwidG9Mb3dlckNhc2UiLCJyZXBsYWNlIiwicGF0dGVybiIsIk9iamVjdCIsImZpZWxkX3BhdHRlcm5zIiwiaW5jbHVkZXMiLCJleGVjdXRlRmFrZXJFeHByZXNzaW9uIiwiZGVwYXJ0bWVudHMiLCJwcmVmaXhlcyIsInN1ZmZpeGVzIiwiZGVwdCIsImhlbHBlcnMiLCJhcnJheUVsZW1lbnQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0eXBlIiwiZW5kc1dpdGgiLCJnZW5lcmF0ZUFycmF5VmFsdWUiLCJlbnVtVmFsdWVzIiwiQXJyYXkiLCJpc0FycmF5IiwiZW51bSIsImVudW1MYWJlbHMiLCJrZXlzIiwidHlwZURlZmF1bHQiLCJ0eXBlX2RlZmF1bHRzIiwibG9yZW0iLCJ3b3JkcyIsIm51bWJlciIsImludCIsIm1pbiIsIm1heCIsImJpZ0ludCIsImZsb2F0IiwiZGF0YXR5cGUiLCJib29sZWFuIiwiZGF0ZSIsInBhc3QiLCJzdHJpbmciLCJ1dWlkIiwiX2VudGl0eSIsIl9sb2NhbGVGYWtlciIsImNvdW50IiwiZnJvbSIsInVybCIsImltYWdlIiwic3lzdGVtIiwiZmlsZU5hbWUiLCJtaW1lX3R5cGUiLCJpbnRlcm5ldCIsIndvcmQiLCJleHByZXNzaW9uIiwicGFyc2UiLCJmYWtlck5hbWUiLCJzZWxlY3RlZEZha2VyIiwiZnVuY01hdGNoIiwiZml4dHVyZUhpbnQiLCJhcGlLZXkiLCJnZXRBcGlLZXkiLCJjcmVhdGVBbnRocm9waWMiLCJnZW5lcmF0ZVRleHQiLCJ0ZXh0IiwibW9kZWwiLCJwcm9tcHQiLCJidWlsZExMTVByb21wdCIsInZhbHVlIiwicGFyc2VMTE1SZXNwb25zZSIsImhpbnQiLCJsYW5ndWFnZSIsImdldEV4cGVjdGVkRm9ybWF0Iiwiam9pbiIsImdldEV4YW1wbGVGb3JUeXBlIiwicHJvcFR5cGUiLCJjbGVhbmVkIiwicGFyc2VkIiwiYmFzZVR5cGUiLCJtYXAiLCJpdGVtIiwiZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZSIsInBhcnNlU2NhbGFyVmFsdWUiLCJTdHJpbmciLCJudW0iLCJwYXJzZUludCIsIk51bWJlciIsImlzTmFOIiwiQmlnSW50IiwicGFyc2VGbG9hdCIsImdldFRpbWUiLCJwcm9wTmFtZSIsImpzb25TdHIiLCJjb252ZXJ0SnNMaXRlcmFsVG9Kc29uIiwidHJpbW1lZCIsImlucHV0Iiwid2l0aERvdWJsZVF1b3RlcyIsIl8iLCJjb250ZW50IiwiU29uYW11IiwicmVxdWlyZSIsInNlY3JldCIsImFudGhyb3BpY19hcGlfa2V5IiwicHJvY2VzcyIsImVudiIsIkFOVEhST1BJQ19BUElfS0VZIiwiYmFzZUZvcm1hdCIsImdldFNjYWxhckZvcm1hdCIsImJhc2VFeGFtcGxlIiwiZ2V0U2NhbGFyRXhhbXBsZSIsImlzS29yZWFuIiwiZ2V0TExNQ2FjaGVTdGF0cyIsImVuYWJsZWQiLCJjbGVhckxMTUNhY2hlIiwiY2xlYXIiLCJTZXQiLCJnZW5lcmF0ZUJhdGNoIiwic3BlY3MiLCJnZW5lcmF0ZWRGaXh0dXJlcyIsInNwZWMiLCJpIiwiZGF0YSIsInJlc3VsdHMiLCJpbXBvcnRGcm9tU291cmNlIiwiYmx1ZSIsInJlbGF0ZWRFbnRpdHlOYW1lIiwicmVsYXRlZFJlY29yZHMiLCJyZWxhdGVkRW50aXR5Il0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFLMUIsU0FBU0MsMEJBQTBCLEVBQUVDLHNCQUFzQixFQUFFQyxjQUFjLFFBQVEsb0JBQWlCO0FBQ3BHLFNBQVNDLE1BQU0sUUFBUSx5QkFBc0I7QUFDN0MsU0FDRUMsWUFBWSxRQUdQLHFCQUFrQjtBQUN6QixTQUE2QkMsYUFBYSxRQUFRLHNCQUFtQjtBQUNyRSxTQUFTQyxjQUFjLFFBQVEsdUJBQW9CO0FBc0JuRCxPQUFPLE1BQU1DOzs7O0lBQ0hDLGFBQTJCO0lBQzNCQyxPQUFlO0lBQ2ZDLFNBQXdCO0lBQ3hCQyxXQUFpQyxJQUFJQyxNQUFNO0lBQzNDQyxRQUFpQztJQUV6QyxZQUNFLEFBQVFDLFFBQWMsRUFDdEIsaUVBQWlFO0lBQ2pFLGdDQUFnQztJQUNoQ0MsU0FBZSxFQUNmLEFBQVFDLFlBQXNELEVBQzlELEFBQVFDLGFBQW1DLEVBQzNDSixPQUFpQyxDQUNqQzthQVBRQyxXQUFBQTthQUlBRSxlQUFBQTthQUNBQyxnQkFBQUE7UUFHUixJQUFJ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
1079
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0aW5nL2ZpeHR1cmUtZ2VuZXJhdG9yLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlIHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eSB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5XCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgdHlwZSB7IEVudGl0eVByb3AsIEZpeHR1cmVJbXBvcnRSZXN1bHQsIEZpeHR1cmVSZWNvcmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wLCBpc09uZVRvT25lUmVsYXRpb25Qcm9wLCBpc1JlbGF0aW9uUHJvcCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXN0IH0gZnJvbSBcIi4uL3V0aWxzL2NvbnRyb2xsZXJcIjtcbmltcG9ydCB7XG4gIERhdGFFeHBsb3JlcixcbiAgdHlwZSBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gIHR5cGUgRXhwbG9yZVdpdGhSZWxhdGlvbnNSZXN1bHQsXG59IGZyb20gXCIuL2RhdGEtZXhwbG9yZXJcIjtcbmltcG9ydCB7IHR5cGUgRmFrZXJNYXBwaW5ncywgZmFrZXJNYXBwaW5ncyB9IGZyb20gXCIuL2Zha2VyLW1hcHBpbmdzXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuL2ZpeHR1cmUtbWFuYWdlclwiO1xuXG5leHBvcnQgdHlwZSBMb2NhbGUgPSBcImtvXCIgfCBcImVuXCIgfCBcImphXCI7XG5cbmV4cG9ydCB0eXBlIEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zID0ge1xuICBsb2NhbGU/OiBMb2NhbGU7XG4gIHVzZUxMTT86IGJvb2xlYW47XG4gIGVuYWJsZUxMTUNhY2hlPzogYm9vbGVhbjtcbiAgbGxtTW9kZWw/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBHZW5lcmF0b3JDb250ZXh0ID0ge1xuICAvKiog7IOd7ISxIOykkeyduCBmaXh0dXJl65OkICjrqZTrqqjrpqwg7IOBKSAqL1xuICBmaXh0dXJlczogTWFwPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXG4gIC8qKiDssLjsobAg642w7J207YSwIOy6kOyLnCAoRGF0YUV4cGxvcmVyIOqysOqzvCkgKi9cbiAgcmVmZXJlbmNlQ2FjaGU6IE1hcDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10+O1xuXG4gIC8qKiDsnbTrr7ggaW1wb3J065CcIOugiOy9lOuTnOulvCDstpTsoIHtlZjsl6wg7KSR67O1IGltcG9ydOulvCDrsKnsp4Dtlanri4jri6QgKi9cbiAgaW1wb3J0ZWRSZWNvcmRzOiBTZXQ8c3RyaW5nPjsgLy8gXCJVc2VyIzEyM1wiXG59O1xuXG5leHBvcnQgY2xhc3MgRml4dHVyZUdlbmVyYXRvciB7XG4gIHByaXZhdGUgZGF0YUV4cGxvcmVyOiBEYXRhRXhwbG9yZXI7XG4gIHByaXZhdGUgbG9jYWxlOiBMb2NhbGU7XG4gIHByaXZhdGUgbWFwcGluZ3M6IEZha2VyTWFwcGluZ3M7XG4gIHByaXZhdGUgbGxtQ2FjaGU6IE1hcDxzdHJpbmcsIHVua25vd24+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIGVudGl0eUNhY2hlOiBNYXA8c3RyaW5nLCBFbnRpdHk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIG9wdGlvbnM6IEZpeHR1cmVHZW5lcmF0b3JPcHRpb25zO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc291cmNlRGI6IEtuZXgsXG4gICAgLy8gRml4dHVyZU1hbmFnZXIuaW5zZXJ0Rml4dHVyZXPqsIAgZGJOYW1lIOusuOyekOyXtOydhCDrsJvquLAg65WM66y47JeQIOyngeygkSDsgqzsmqntlZjsp4Ag7JWK7Iq164uI64ukXG4gICAgLy8g66+4656YIO2ZleyepeyEseydhCDsnITtlbQgQVBJIOyLnOq3uOuLiOyymOyXkOuKlCDtj6ztlajsi5zsvLDsirXri4jri6RcbiAgICBfdGFyZ2V0RGI6IEtuZXgsXG4gICAgcHJpdmF0ZSB0YXJnZXREYk5hbWU6IFwiZml4dHVyZVwiIHwgXCJ0ZXN0XCIgfCBcInByb2R1Y3Rpb25fbWFzdGVyXCIsXG4gICAgcHJpdmF0ZSBlbnRpdHlNYW5hZ2VyOiB0eXBlb2YgRW50aXR5TWFuYWdlcixcbiAgICBvcHRpb25zPzogRml4dHVyZUdlbmVyYXRvck9wdGlvbnMsXG4gICkge1xuICAgIHRoaXMuZGF0YUV4cGxvcmVyID0gbmV3IERhdGFFeHBsb3Jlcihzb3VyY2VEYiwgZW50aXR5TWFuYWdlcik7XG4gICAgdGhpcy5sb2NhbGUgPSBvcHRpb25zPy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIHRoaXMubWFwcGluZ3MgPSBmYWtlck1hcHBpbmdzO1xuICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgIGxvY2FsZTogb3B0aW9ucz8ubG9jYWxlIHx8IFwia29cIixcbiAgICAgIHVzZUxMTTogb3B0aW9ucz8udXNlTExNIHx8IGZhbHNlLFxuICAgICAgZW5hYmxlTExNQ2FjaGU6IG9wdGlvbnM/LmVuYWJsZUxMTUNhY2hlICE9PSBmYWxzZSxcbiAgICAgIGxsbU1vZGVsOiBvcHRpb25zPy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaXh0dXJlIOyDneyEsSAo64uo7J28KVxuICAgKiBAcmV0dXJucyDsg53shLHrkJwgZml4dHVyZSDrjbDsnbTthLAgKOuplOuqqOumrCDsg4EpXG4gICAqL1xuICBhc3luYyBnZW5lcmF0ZShcbiAgICBlbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKSxcbiAgKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICAgIC8vIEVudGl0eSDsupDsi7E6IO2FjOyKpO2KuOyXkOyEnCBlbnRpdHkgY29uZSDsiJjsoJXsnbQg67CY7JiB65CY64+E66GdIOuztOyepVxuICAgIGxldCBlbnRpdHkgPSB0aGlzLmVudGl0eUNhY2hlLmdldChlbnRpdHlOYW1lKTtcbiAgICBpZiAoIWVudGl0eSkge1xuICAgICAgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcbiAgICAgIHRoaXMuZW50aXR5Q2FjaGUuc2V0KGVudGl0eU5hbWUsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVtcElkID0gYCR7ZW50aXR5TmFtZX0jdGVtcCMke0RhdGUubm93KCl9YDsgLy8g7J6E7IucIElEXG5cbiAgICAvLyBMTE0gcm93IOuLqOychCDsg53shLHsnYQg7JyE7ZWcIOqzoOycoCDtgqQgKOqwmeydgCByb3fsnZgg7ZWE65Oc65Ok7J20IOuPmeydvO2VnCByb3dLZXnrpbwg6rO17JygKVxuICAgIGNvbnN0IHJvd0tleSA9IHRoaXMub3B0aW9ucy51c2VMTE0gPyBgJHtlbnRpdHlOYW1lfSNyb3cjJHtEYXRlLm5vdygpfWAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyDqsIEgcHJvcOuzhCDqsJIg7IOd7ISxXG4gICAgY29uc3QgZml4dHVyZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgcHJvcCBvZiBlbnRpdHkucHJvcHMpIHtcbiAgICAgIC8vIFZpcnR1YWwgcHJvcOydgCDsiqTtgrVcbiAgICAgIGlmIChcInZpcnR1YWxcIiBpbiBwcm9wICYmIHByb3AudmlydHVhbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gREIgc2VxdWVuY2XroZwg6rSA66as65CY64qUIFBL64qUIOyDneyEse2VmOyngCDslYrsnYwgKERC6rCAIOyekOuPmSDtlaDri7kpXG4gICAgICBpZiAocHJvcC5uYW1lID09PSBcImlkXCIgJiYgXCJjb25lXCIgaW4gcHJvcCAmJiBwcm9wLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBvdmVycmlkZeqwgCDsnojsnLzrqbQg7IKs7JqpXG4gICAgICBpZiAocHJvcC5uYW1lIGluIG92ZXJyaWRlcykge1xuICAgICAgICBmaXh0dXJlW3Byb3AubmFtZV0gPSBvdmVycmlkZXNbcHJvcC5uYW1lXTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbmXsl5DshJwg7IOd7ISxIOyghOuetSDtmZXsnbhcbiAgICAgIGNvbnN0IGNvbmUgPSBwcm9wLmNvbmU7XG5cbiAgICAgIC8vIDEuIFJlbGF0aW9uIHByb3Ag7LKY66asXG4gICAgICBpZiAoaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpb25WYWx1ZSA9IGF3YWl0IHRoaXMuZ2VuZXJhdGVSZWxhdGlvblZhbHVlKGVudGl0eSwgcHJvcCwgY29udGV4dCk7XG4gICAgICAgIC8vIEJlbG9uZ3NUb09uZSwgT25lVG9PbmUoaGFzSm9pbkNvbHVtbinsnZgg6rK97JqwIGZvcmVpZ24ga2V5IOy7rOufvOuqheycvOuhnCDsoIDsnqVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzQmVsb25nc1RvT25lUmVsYXRpb25Qcm9wKHByb3ApIHx8XG4gICAgICAgICAgKGlzT25lVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiYgcHJvcC5oYXNKb2luQ29sdW1uKVxuICAgICAgICApIHtcbiAgICAgICAgICBmaXh0dXJlW2Ake3Byb3AubmFtZX1faWRgXSA9IHJlbGF0aW9uVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gcmVsYXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi4gZml4dHVyZUdlbmVyYXRvciDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlR2VuZXJhdG9yKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGF3YWl0IHRoaXMuZXhlY3V0ZUdlbmVyYXRvcihcbiAgICAgICAgICBjb25lLmZpeHR1cmVHZW5lcmF0b3IgYXMgc3RyaW5nLFxuICAgICAgICAgIHByb3AsXG4gICAgICAgICAgZW50aXR5LFxuICAgICAgICApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gMi41LiBjb25lLm5vdGUgKyBMTE0g7IKs7JqpXG4gICAgICBpZiAoY29uZT8ubm90ZSAmJiB0aGlzLm9wdGlvbnMudXNlTExNKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZVdpdGhMTE0oY29uZS5ub3RlLCBwcm9wLCBlbnRpdHksIHJvd0tleSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtGaXh0dXJlR2VuZXJhdG9yXSBMTE0gZ2VuZXJhdGlvbiBmYWlsZWQgZm9yICR7ZW50aXR5LmlkfS4ke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0YCxcbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBmYWxsYmFjazogZml4dHVyZURlZmF1bHQg65iQ64qUIOq4sOuzuOqwkuycvOuhnCDqs4Tsho1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyAzLiBmaXh0dXJlRGVmYXVsdCDsgqzsmqlcbiAgICAgIGlmIChjb25lPy5maXh0dXJlRGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGZpeHR1cmVbcHJvcC5uYW1lXSA9IGNvbmUuZml4dHVyZURlZmF1bHQ7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyA0LiDtg4DsnoXrs4Qg6riw67O4IOyDneyEsVxuICAgICAgZml4dHVyZVtwcm9wLm5hbWVdID0gYXdhaXQgdGhpcy5nZW5lcmF0ZURlZmF1bHRWYWx1ZShwcm9wLCBlbnRpdHkpO1xuICAgIH1cblxuICAgIC8vIDUuIHBhc3N3b3JkIO2VhOuTnCDslZTtmLjtmZRcbiAgICBpZiAoXCJwYXNzd29yZFwiIGluIGZpeHR1cmUgJiYgZml4dHVyZS5wYXNzd29yZCAmJiB0eXBlb2YgZml4dHVyZS5wYXNzd29yZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgYmNyeXB0ID0gYXdhaXQgaW1wb3J0KFwiYmNyeXB0XCIpO1xuICAgICAgZml4dHVyZS5wYXNzd29yZCA9IGF3YWl0IGJjcnlwdC5oYXNoKGZpeHR1cmUucGFzc3dvcmQsIDEwKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmZpeHR1cmVzLnNldCh0ZW1wSWQsIGZpeHR1cmUpO1xuICAgIHJldHVybiBmaXh0dXJlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGF0aW9uIOqwkiDsg53shLEgKyDsnpDrj5kgSW1wb3J0XG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlUmVsYXRpb25WYWx1ZShcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGlmICghaXNSZWxhdGlvblByb3AocHJvcCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRml4dHVyZUdlbmVyYXRvcjogJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSBpcyBub3QgYSByZWxhdGlvbiBwcm9wYCk7XG4gICAgfVxuXG4gICAgLy8gQmVsb25nc1RvT25lLCBPbmVUb09uZShoYXNKb2luQ29sdW1uKeunjCDsspjrpqxcbiAgICBpZiAoXG4gICAgICAhaXNCZWxvbmdzVG9PbmVSZWxhdGlvblByb3AocHJvcCkgJiZcbiAgICAgICEoaXNPbmVUb09uZVJlbGF0aW9uUHJvcChwcm9wKSAmJiBwcm9wLmhhc0pvaW5Db2x1bW4pXG4gICAgKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjb25lID0gcHJvcC5jb25lO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBjb25lPy5kYXRhU291cmNlO1xuXG4gICAgLy8gRGF0YUV4cGxvcmVy66GcIOywuOyhsCDrjbDsnbTthLAg7KGw7ZqMIChzb3VyY2VEYilcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgaWYgKGRhdGFTb3VyY2UpIHtcbiAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7cHJvcC53aXRofToke0pTT04uc3RyaW5naWZ5KGRhdGFTb3VyY2UpfWA7XG5cbiAgICAgIGlmICghY29udGV4dC5yZWZlcmVuY2VDYWNoZS5oYXMoY2FjaGVLZXkpKSB7XG4gICAgICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhwcm9wLndpdGgsIHtcbiAgICAgICAgICBzdHJhdGVneTogZGF0YVNvdXJjZS5zdHJhdGVneSxcbiAgICAgICAgICBsaW1pdDpcbiAgICAgICAgICAgICgoZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpPy5saW1pdCBhc1xuICAgICAgICAgICAgICB8IG51bWJlclxuICAgICAgICAgICAgICB8IHVuZGVmaW5lZCkgfHwgMTAsXG4gICAgICAgICAgaW5jbHVkZVJlbGF0aW9uczogdHJ1ZSxcbiAgICAgICAgICBtYXhEZXB0aDogMyxcbiAgICAgICAgICAuLi4oZGF0YVNvdXJjZS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udGV4dC5yZWZlcmVuY2VDYWNoZS5zZXQoY2FjaGVLZXksIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzKTtcblxuICAgICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgICBhd2FpdCB0aGlzLmltcG9ydEV4cGxvcmVSZXN1bHQoZXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjYW5kaWRhdGVzW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIGNhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICAgIHJldHVybiBzZWxlY3RlZC5pZCBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZGF0YVNvdXJjZeqwgCDsl4bsnYQg65WMIOyekOuPmeycvOuhnCBmaXh0dXJlIERC7JeQ7IScIOyhsO2ajCDsi5zrj4RcbiAgICAvLyDqtIDqs4Qg7LK07J247J2EIOuUsOudvOqwgOq4sCDsnITtlbQgZXhwbG9yZVdpdGhSZWxhdGlvbnMg7IKs7JqpXG4gICAgY29uc3QgYXV0b0tleSA9IGAke3Byb3Aud2l0aH06YXV0b2A7XG4gICAgaWYgKCFjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmhhcyhhdXRvS2V5KSkge1xuICAgICAgLy8gZml4dHVyZSBEQihzb3VyY2VEYinsl5DshJwg7J6Q64+ZIOyhsO2ajCAo6rSA6rOEIO2PrO2VqClcbiAgICAgIGNvbnN0IGF1dG9FeHBsb3JlUmVzdWx0ID0gYXdhaXQgdGhpcy5kYXRhRXhwbG9yZXIuZXhwbG9yZVdpdGhSZWxhdGlvbnMocHJvcC53aXRoLCB7XG4gICAgICAgIHN0cmF0ZWd5OiBcInJhbmRvbVwiLFxuICAgICAgICBsaW1pdDogMTAsXG4gICAgICAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAgICAgIG1heERlcHRoOiAzLFxuICAgICAgfSk7XG4gICAgICBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLnNldChhdXRvS2V5LCBhdXRvRXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpO1xuXG4gICAgICAvLyDsobDtmoztlZwg642w7J207YSw7JmAIOq0gOqzhOuQnCDrqqjrk6Ag7JeU7Yuw7Yuw66W8IHRhcmdldERi7JeQIGltcG9ydFxuICAgICAgaWYgKGF1dG9FeHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuaW1wb3J0RXhwbG9yZVJlc3VsdChhdXRvRXhwbG9yZVJlc3VsdCwgY29udGV4dCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b0NhbmRpZGF0ZXMgPSBjb250ZXh0LnJlZmVyZW5jZUNhY2hlLmdldChhdXRvS2V5KTtcbiAgICBpZiAoYXV0b0NhbmRpZGF0ZXMgJiYgYXV0b0NhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgLy8g656c642k7ZWY6rKMIO2VmOuCmCDshKDtg51cbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gYXV0b0NhbmRpZGF0ZXNbTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogYXV0b0NhbmRpZGF0ZXMubGVuZ3RoKV07XG4gICAgICByZXR1cm4gc2VsZWN0ZWQuaWQgYXMgbnVtYmVyO1xuICAgIH1cblxuICAgIC8vIOywuOyhsCDrjbDsnbTthLDqsIAg7JeG7Jy866m0IG51bGwg67CY7ZmYIChudWxsYWJsZeyduCDqsr3smrApXG4gICAgaWYgKHByb3AubnVsbGFibGUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIG51bGxhYmxl7J20IOyVhOuLiOqzoCDrjbDsnbTthLDrj4Qg7JeG7Jy866m0IOyXkOufrFxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBGaXh0dXJlR2VuZXJhdG9yOiAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV97JeQIO2VhOyalO2VnCAke3Byb3Aud2l0aH0g642w7J207YSw6rCAIOyXhuyKteuLiOuLpC4gYCArXG4gICAgICAgIGDrqLzsoIAgJHtwcm9wLndpdGh966W8IOyDneyEse2VmOqxsOuCmCBjb25lLmRhdGFTb3VyY2Xrpbwg7ISk7KCV7ZWY7IS47JqULmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBsb3JlV2l0aFJlbGF0aW9ucyDqsrDqs7zrpbwgdGFyZ2V0RGLsl5AgaW1wb3J0XG4gICAqXG4gICAqIOq0gOqzhCDssrTsnbjsnYQg65Sw65286rCEIOqysOqzvChtYWluICsgcmVsYXRlZCnrpbwg66qo65GQIGltcG9ydO2VqeuLiOuLpC5cbiAgICog7J2Y7KG07ISxIOyInOyEnOuKlCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlc+qwgCDsnpDrj5nsnLzroZwg7LKY66as7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbXBvcnRFeHBsb3JlUmVzdWx0KFxuICAgIGV4cGxvcmVSZXN1bHQ6IEV4cGxvcmVXaXRoUmVsYXRpb25zUmVzdWx0LFxuICAgIGNvbnRleHQ6IEdlbmVyYXRvckNvbnRleHQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFsbEZpeHR1cmVSZWNvcmRzOiBGaXh0dXJlUmVjb3JkW10gPSBbXTtcblxuICAgIC8vIDEuIFJlbGF0ZWQgZW50aXRpZXMgaW1wb3J0IChDb21wYW55LCBEZXBhcnRtZW50IOuTsSlcbiAgICBmb3IgKGNvbnN0IFtlbnRpdHlJZCwgcmVjb3Jkc10gb2YgZXhwbG9yZVJlc3VsdC5yZWxhdGVkLmVudHJpZXMoKSkge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlJZCk7XG4gICAgICBjb25zdCByZWNvcmRzVG9JbXBvcnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gPSBbXTtcblxuICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgIGNoYWxrLmN5YW4oYEltcG9ydGluZyByZWxhdGVkIGVudGl0eTogJHtlbnRpdHlJZH0gKCR7cmVjb3Jkcy5sZW5ndGh9IHJlY29yZHMpYCksXG4gICAgICAgICk7XG5cbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICAgICAgY29uc3QgcmVjb3JkS2V5ID0gYCR7ZW50aXR5SWR9IyR7cmVjb3JkLmlkfWA7XG4gICAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgICByZWNvcmRzVG9JbXBvcnQucHVzaChyZWNvcmQpO1xuICAgICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWNvcmRzVG9JbXBvcnQubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICAgIGAgIC0gUHJvY2Vzc2luZyAke2VudGl0eUlkfSByZWNvcmQ6YCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICAgIGVudGl0eSxcbiAgICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIE1haW4gZW50aXR5IGltcG9ydCAoRW1wbG95ZWUg65OxKVxuICAgIGNvbnN0IG1haW5FbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KGV4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZCk7XG4gICAgY29uc3QgbWFpblJlY29yZHNUb0ltcG9ydDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IFtdO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuY3lhbihcbiAgICAgICAgICBgSW1wb3J0aW5nIG1haW4gZW50aXR5OiAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSByZWNvcmRzKWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZEtleSA9IGAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0jJHtyZWNvcmQuaWR9YDtcbiAgICAgIGlmICghY29udGV4dC5pbXBvcnRlZFJlY29yZHMuaGFzKHJlY29yZEtleSkpIHtcbiAgICAgICAgbWFpblJlY29yZHNUb0ltcG9ydC5wdXNoKHJlY29yZCk7XG4gICAgICAgIGNvbnRleHQuaW1wb3J0ZWRSZWNvcmRzLmFkZChyZWNvcmRLZXkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYWluUmVjb3Jkc1RvSW1wb3J0Lmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIG1haW5SZWNvcmRzVG9JbXBvcnQpIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBjaGFsay5ncmF5KFxuICAgICAgICAgICAgICBgICAtIFByb2Nlc3NpbmcgJHtleHBsb3JlUmVzdWx0Lm1haW4uZW50aXR5SWR9IHJlY29yZDpgLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShyZWNvcmQpLnNsaWNlKDAsIDEwMCksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZpeHR1cmVSZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICAgIHJlY29yZCBhcyB7IGlkOiBudW1iZXIgfCBzdHJpbmc7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgICAgeyBfZGI6IHRoaXMuc291cmNlRGIsIHNpbmdsZVJlY29yZDogdHJ1ZSB9LFxuICAgICAgICApO1xuICAgICAgICBhbGxGaXh0dXJlUmVjb3Jkcy5wdXNoKC4uLmZpeHR1cmVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAzLiDrqqjrk6AgZml4dHVyZeulvCDtlZwg67KI7JeQIOyCveyehSAo7J2Y7KG07ISxIOyInOyEnCDsnpDrj5kg7LKY66asKVxuICAgIGlmIChhbGxGaXh0dXJlUmVjb3Jkcy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgYWxsRml4dHVyZVJlY29yZHMpO1xuXG4gICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgY2hhbGsuZ3JlZW4oXG4gICAgICAgICAgICBgQXV0by1pbXBvcnRlZCAke2V4cGxvcmVSZXN1bHQubWFpbi5lbnRpdHlJZH0gd2l0aCByZWxhdGlvbnM6IGAgK1xuICAgICAgICAgICAgICBgJHtleHBsb3JlUmVzdWx0Lm1haW4ucmVjb3Jkcy5sZW5ndGh9IG1haW4gKyAke2V4cGxvcmVSZXN1bHQucmVsYXRlZC5zaXplfSByZWxhdGVkIGVudGl0aWVzYCxcbiAgICAgICAgICApLFxuICAgICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBmaXh0dXJlR2VuZXJhdG9yIOyLpO2WiSAoRmFrZXIuanPrp4wg7KeA7JuQKVxuICAgKlxuICAgKiBmYWtlci4qIO2YleyLneydmCDtkZztmITsi53snYQg7JWI7KCE7ZWY6rKMIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqIOyYiDogXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIGZha2VyLmludGVybmV0LmVtYWlsKClcbiAgICog7JiIOiBcImZha2VyLmxvcmVtLndvcmRzKDMpXCIg4oaSIGZha2VyLmxvcmVtLndvcmRzKDMpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVHZW5lcmF0b3IoXG4gICAgZ2VuZXJhdG9yOiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gRmFrZXIuanMg7ZGc7ZiE7Iud66eMIOyngOybkFxuICAgIGlmIChnZW5lcmF0b3Iuc3RhcnRzV2l0aChcImZha2VyLlwiKSkge1xuICAgICAgLy8gdXNlcm5hbWXsnbTrgpggbmFtZSDtlYTrk5zripQg7ZWc6rWt7Ja0IGZha2VyIOyCrOyaqVxuICAgICAgY29uc3QgaXNOYW1lRmllbGQgPSBwcm9wLm5hbWUgPT09IFwidXNlcm5hbWVcIiB8fCBwcm9wLm5hbWUgPT09IFwibmFtZVwiO1xuICAgICAgY29uc3QgZmFrZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoXCJAZmFrZXItanMvZmFrZXJcIik7XG4gICAgICBjb25zdCBmYWtlciA9IGlzTmFtZUZpZWxkID8gZmFrZXJNb2R1bGUuZmFrZXJLTyA6IGZha2VyTW9kdWxlLmZha2VyO1xuICAgICAgY29uc3QgZXhwciA9IGdlbmVyYXRvci5zbGljZSg2KTsgLy8gXCJmYWtlci5cIiDsoJzqsbBcblxuICAgICAgdHJ5IHtcbiAgICAgICAgLy8g7ZWo7IiYIOqyveuhnOyZgCDsnbjsnpAg7YyM7IuxXG4gICAgICAgIGNvbnN0IG1hdGNoID0gZXhwci5tYXRjaCgvXihbXFx3Ll0rKSg/OlxcKCguKj8pXFwpKT8kLyk7XG4gICAgICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRml4dHVyZUdlbmVyYXRvcjogSW52YWxpZCBmYWtlciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IFssIHBhdGgsIGFyZ3NTdHJdID0gbWF0Y2g7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gcGF0aC5zcGxpdChcIi5cIik7XG5cbiAgICAgICAgLy8gZmFrZXIg6rCd7LK07JeQ7IScIO2VqOyImCDssL7quLBcbiAgICAgICAgbGV0IGZuOiB1bmtub3duID0gZmFrZXI7XG4gICAgICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwib2JqZWN0XCIgJiYgZm4gIT09IG51bGwgJiYgcGFydCBpbiBmbikge1xuICAgICAgICAgICAgZm4gPSAoZm4gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW3BhcnRdO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpeHR1cmVHZW5lcmF0b3I6IEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiBmYWtlci4ke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8g7ZWo7IiY6rCAIOyVhOuLiOuptCDsl5Drn6xcbiAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBmYWtlci4ke3BhdGh9IGlzIG5vdCBhIGZ1bmN0aW9uIChmb3IgJHtwcm9wLm5hbWV9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICAgICAgICBpZiAoYXJnc1N0cj8udHJpbSgpKSB7XG4gICAgICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm4oLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhcbiAgICAgICAgICAgICAgYEZhaWxlZCB0byBleGVjdXRlIGdlbmVyYXRvciBcIiR7Z2VuZXJhdG9yfVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjayB0byBkZWZhdWx0OmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmYWtlciDsnbTsmbjsnZgg7ZGc7ZiE7Iud7J2AIOyngOybkO2VmOyngCDslYrsnYxcbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay55ZWxsb3coXG4gICAgICAgICAgYFVuc3VwcG9ydGVkIGdlbmVyYXRvciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7Z2VuZXJhdG9yfS4gT25seSBmYWtlci4qIGV4cHJlc3Npb25zIGFyZSBzdXBwb3J0ZWQuIFVzaW5nIGRlZmF1bHQgdmFsdWUuYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0VmFsdWUocHJvcCwgZW50aXR5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDtlYTrk5zsnZgg7YOA7J6F6rO8IOydtOumhOydhCDrtoTshJ3tlZjsl6wg7KCB7KCI7ZWcIOq4sOuzuOqwkuydhCDsg53shLHtlanri4jri6QuXG4gICAqXG4gICAqIOyasOyEoOyInOychDpcbiAgICogMS4g7ZWE65Oc66qFIO2MqO2EtCDrp6Tsua0gKHNhbGFyeSwgYnVkZ2V0IOuTsSDsnZjrr7jsnojripQg642w7J207YSwKVxuICAgKiAyLiDtirnsiJgg7LyA7J207IqkIChEZXBhcnRtZW50IG5hbWUg65OxIOuPhOuplOyduCDsp4Dsi50pXG4gICAqIDMuIOuwsOyXtCDtg4DsnoUgKEpTT04g67Cw7Je0KVxuICAgKiA0LiBFbnVtIO2DgOyehVxuICAgKiA1LiDtg4DsnoXrs4Qg6riw67O46rCSXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGdlbmVyYXRlRGVmYXVsdFZhbHVlKHByb3A6IEVudGl0eVByb3AsIGVudGl0eT86IEVudGl0eSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGNvbnN0IGZha2VyTW9kdWxlID0gYXdhaXQgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpO1xuICAgIGNvbnN0IGZha2VyID0gZmFrZXJNb2R1bGUuZmFrZXI7XG4gICAgY29uc3QgZmFrZXJLTyA9IGZha2VyTW9kdWxlLmZha2VyS087XG4gICAgY29uc3QgZmFrZXJKQSA9IGZha2VyTW9kdWxlLmZha2VySkE7XG5cbiAgICBjb25zdCBsb2NhbGVGYWtlciA9IHRoaXMubG9jYWxlID09PSBcImtvXCIgPyBmYWtlcktPIDogdGhpcy5sb2NhbGUgPT09IFwiamFcIiA/IGZha2VySkEgOiBmYWtlcjtcblxuICAgIC8qKlxuICAgICAqIDEuIO2VhOuTnOuqheyXkOyEnCDsnZjrr7jrpbwg7LaU66Gg7ZWY7JesIO2YhOyLpOyggeyduCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgICAqIOyYiDogc2FsYXJ5IOKGkiAzME1+MTUwTSAo7ZWc6rWtIOyXsOu0iSDrspTsnIQpXG4gICAgICogICAgIGJ1ZGdldCDihpIgMTBNfjUwME0gKO2UhOuhnOygne2KuCDsmIjsgrAg67KU7JyEKVxuICAgICAqL1xuICAgIGNvbnN0IGxvY2FsZU1hcHBpbmdzID0gdGhpcy5tYXBwaW5nc1t0aGlzLmxvY2FsZV0gfHwgdGhpcy5tYXBwaW5ncy5lbjtcbiAgICBjb25zdCBub3JtYWxpemVkTmFtZSA9IHByb3AubmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL18vZywgXCJcIik7XG5cbiAgICBmb3IgKGNvbnN0IFtwYXR0ZXJuLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKGxvY2FsZU1hcHBpbmdzLmZpZWxkX3BhdHRlcm5zKSkge1xuICAgICAgaWYgKG5vcm1hbGl6ZWROYW1lLmluY2x1ZGVzKHBhdHRlcm4udG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlRmFrZXJFeHByZXNzaW9uKGNvbmZpZy5mYWtlciwgcHJvcCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgY2hhbGsueWVsbG93KFxuICAgICAgICAgICAgICAgIGBGYWlsZWQgdG8gZXhlY3V0ZSBmaWVsZCBwYXR0ZXJuIFwiJHtwYXR0ZXJufVwiIGZvciAke3Byb3AubmFtZX0sIGZhbGxpbmcgYmFjazpgLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAyLiBEZXBhcnRtZW50IG5hbWXsnYAg7ZWc6rWt7Ja0IOu2gOyEnOuqhSDrqqnroZ3sl5DshJwg7ISg7YOd7ZWp64uI64ukLlxuICAgICAqIOqzoOycoOyEseydhCDsnITtlbQgNzAlIO2ZleuloOuhnCBwcmVmaXgvc3VmZml466W8IOy2lOqwgO2VqeuLiOuLpC5cbiAgICAgKi9cbiAgICBpZiAoZW50aXR5Py5pZCA9PT0gXCJEZXBhcnRtZW50XCIgJiYgcHJvcC5uYW1lID09PSBcIm5hbWVcIikge1xuICAgICAgY29uc3QgZGVwYXJ0bWVudHMgPSBbXG4gICAgICAgIFwi6rCc67Cc7YyAXCIsXG4gICAgICAgIFwi6riw7ZqN7YyAXCIsXG4gICAgICAgIFwi66eI7LyA7YyF7YyAXCIsXG4gICAgICAgIFwi7JiB7JeF7YyAXCIsXG4gICAgICAgIFwi7J247IKs7YyAXCIsXG4gICAgICAgIFwi7LSd66y07YyAXCIsXG4gICAgICAgIFwi7J6s66y07YyAXCIsXG4gICAgICAgIFwi7ZqM6rOE7YyAXCIsXG4gICAgICAgIFwi67KV66y07YyAXCIsXG4gICAgICAgIFwi65SU7J6Q7J247YyAXCIsXG4gICAgICAgIFwiSVTtjIBcIixcbiAgICAgICAgXCLqs6DqsJ3sp4Dsm5DtjIBcIixcbiAgICAgICAgXCLtkojsp4jqtIDrpqztjIBcIixcbiAgICAgICAgXCLsl7DqtazqsJzrsJztjIBcIixcbiAgICAgICAgXCLsg53sgrDtjIBcIixcbiAgICAgICAgXCLqtazrp6TtjIBcIixcbiAgICAgICAgXCLrrLzrpZjtjIBcIixcbiAgICAgIF07XG4gICAgICBjb25zdCBwcmVmaXhlcyA9IFtcIuyLoOq3nFwiLCBcIu2Gte2VqVwiLCBcIuyghOuetVwiLCBcIuq4gOuhnOuyjFwiLCBcIuuUlOyngO2EuFwiLCBcIu2VteyLrFwiXTtcbiAgICAgIGNvbnN0IHN1ZmZpeGVzID0gW1wiMe2MgFwiLCBcIjLtjIBcIiwgXCIz7YyAXCIsIFwiQe2MgFwiLCBcIkLtjIBcIiwgXCLrs7jrtoBcIiwgXCLshLzthLBcIiwgXCLqt7jro7lcIl07XG5cbiAgICAgIGNvbnN0IGRlcHQgPSBmYWtlci5oZWxwZXJzLmFycmF5RWxlbWVudChkZXBhcnRtZW50cyk7XG5cbiAgICAgIGNvbnN0IHJhbmRvbSA9IE1hdGgucmFuZG9tKCk7XG4gICAgICBpZiAocmFuZG9tID4gMC43KSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHByZWZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0gJHtkZXB0fWA7XG4gICAgICB9XG4gICAgICBpZiAocmFuZG9tID4gMC40KSB7XG4gICAgICAgIGNvbnN0IHN1ZmZpeCA9IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KHN1ZmZpeGVzKTtcbiAgICAgICAgcmV0dXJuIGAke2RlcHR9ICR7c3VmZml4fWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAzLiBKU09OIO2DgOyeheydtOuptOyEnCDrsLDsl7Tsnbgg6rK97JqwIChTb25hbXVGaWxlW10sIHN0cmluZ1tdIOuTsSlcbiAgICAgKiDtlYTrk5zrqoUg7Yyo7YS07J2EIOuztOqzoCDsoIHsoIjtlZwg67Cw7Je0IOuNsOydtO2EsOulvCDsg53shLHtlanri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJqc29uXCIgJiYgXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCkge1xuICAgICAgaWYgKHByb3AuaWQuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUFycmF5VmFsdWUocHJvcCwgZW50aXR5LCBmYWtlciwgbG9jYWxlRmFrZXIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA0LiBFbnVtIO2DgOyeheydgCDsoJXsnZjrkJwg6rCSIOykkSDtlZjrgpjrpbwg656c642kIOyEoO2Dne2VqeuLiOuLpCAqL1xuICAgIGlmIChwcm9wLnR5cGUgPT09IFwiZW51bVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gZmFrZXIuaGVscGVycy5hcnJheUVsZW1lbnQoZW51bVZhbHVlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvcC5udWxsYWJsZSA/IG51bGwgOiBcIlVOS05PV05cIjtcbiAgICB9XG5cbiAgICBpZiAocHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gW2Zha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KGVudW1WYWx1ZXMpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA1LiBWZWN0b3Ig7YOA7J6F7J2AIO2YhOyerCDsp4Dsm5DtlZjsp4Ag7JWK7Jy866+A66GcIG51bGzsnYQg67CY7ZmY7ZWp64uI64ukLlxuICAgICAqIO2Wpe2bhCBBSSBlbWJlZGRpbmcg7IOd7ISxIOq4sOuKpSDstpTqsIAg7IucIOq1rO2YhCDsmIjsoJXsnoXri4jri6QuXG4gICAgICovXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJ2ZWN0b3JcIiB8fCBwcm9wLnR5cGUgPT09IFwidmVjdG9yW11cIiB8fCBwcm9wLnR5cGUgPT09IFwidHN2ZWN0b3JcIikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqIDYuIO2DgOyeheuzhCDquLDrs7ggRmFrZXIg7ZGc7ZiE7Iud7J2EIOyLpO2Wie2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IHR5cGVEZWZhdWx0ID0gbG9jYWxlTWFwcGluZ3MudHlwZV9kZWZhdWx0c1twcm9wLnR5cGVdO1xuICAgIGlmICh0eXBlRGVmYXVsdCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUZha2VyRXhwcmVzc2lvbih0eXBlRGVmYXVsdC5mYWtlciwgcHJvcCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAhaXNUZXN0KCkgJiZcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGNoYWxrLnllbGxvdyhgRmFpbGVkIHRvIGV4ZWN1dGUgdHlwZSBkZWZhdWx0IGZvciAke3Byb3AudHlwZX0sIHVzaW5nIGZhbGxiYWNrOmAsIGVycm9yKSxcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiA3LiDrp6TtlZHrkJjsp4Ag7JWK7J2AIO2DgOyeheydgCDquLDrs7ggRmFrZXIg7ZWo7IiY66GcIOyymOumrO2VqeuLiOuLpCAqL1xuICAgIHN3aXRjaCAocHJvcC50eXBlKSB7XG4gICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICBjYXNlIFwic3RyaW5nW11cIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLmxvcmVtLndvcmRzKDMpO1xuICAgICAgY2FzZSBcImludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyW11cIjpcbiAgICAgICAgcmV0dXJuIFtmYWtlci5udW1iZXIuaW50KHsgbWluOiAxLCBtYXg6IDEwMDAgfSldO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIGZha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5iaWdJbnQoeyBtaW46IDFuLCBtYXg6IDEwMDBuIH0pXTtcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5udW1iZXIuZmxvYXQoeyBtaW46IDAsIG1heDogMTAwMCB9KTtcbiAgICAgIGNhc2UgXCJudW1iZXJbXVwiOlxuICAgICAgY2FzZSBcIm51bWVyaWNbXVwiOlxuICAgICAgICByZXR1cm4gW2Zha2VyLm51bWJlci5mbG9hdCh7IG1pbjogMCwgbWF4OiAxMDAwIH0pXTtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRhdHlwZS5ib29sZWFuKCk7XG4gICAgICBjYXNlIFwiYm9vbGVhbltdXCI6XG4gICAgICAgIHJldHVybiBbZmFrZXIuZGF0YXR5cGUuYm9vbGVhbigpXTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICBjYXNlIFwiZGF0ZVtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5kYXRlLnBhc3QoKTtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiB7fTtcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICBjYXNlIFwidXVpZFtdXCI6XG4gICAgICAgIHJldHVybiBmYWtlci5zdHJpbmcudXVpZCgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOuwsOyXtCDtg4DsnoXsnZgg6rCS7J2EIOyDneyEse2VqeuLiOuLpC5cbiAgICpcbiAgICog7YOA7J6FIElE7JmAIO2VhOuTnOuqhSDtjKjthLTsnYQg67aE7ISd7ZWY7JesIOyggeygiO2VnCDrsLDsl7Qg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICog7JiIOiBpbWFnZV91cmxzIOKGkiBbe3VybCwgbmFtZSwgbWltZV90eXBlfSwgLi4uXVxuICAgKiAgICAgdGFnX2lkcyDihpIgWzEsIDIzLCA0NV1cbiAgICovXG4gIHByaXZhdGUgZ2VuZXJhdGVBcnJheVZhbHVlKFxuICAgIHByb3A6IEVudGl0eVByb3AsXG4gICAgX2VudGl0eTogRW50aXR5IHwgdW5kZWZpbmVkLFxuICAgIGZha2VyOiB0eXBlb2YgaW1wb3J0KFwiQGZha2VyLWpzL2Zha2VyXCIpLmZha2VyLFxuICAgIF9sb2NhbGVGYWtlcjogdHlwZW9mIGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKS5mYWtlcixcbiAgKTogdW5rbm93bltdIHtcbiAgICBjb25zdCBjb3VudCA9IGZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMyB9KTtcblxuICAgIC8qKiBTb25hbXVGaWxlW13snYAgU29uYW11IOuCtOyepSDtg4DsnoXsnLzroZwg6rWs7KGw6rCAIOygle2VtOyguCDsnojsirXri4jri6QgKi9cbiAgICBpZiAoXCJpZFwiIGluIHByb3AgJiYgcHJvcC5pZCA9PT0gXCJTb25hbXVGaWxlW11cIikge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+ICh7XG4gICAgICAgIHVybDogZmFrZXIuaW1hZ2UudXJsKCksXG4gICAgICAgIG5hbWU6IGZha2VyLnN5c3RlbS5maWxlTmFtZSgpLFxuICAgICAgICBtaW1lX3R5cGU6IGZha2VyLmhlbHBlcnMuYXJyYXlFbGVtZW50KFtcbiAgICAgICAgICBcImltYWdlL2pwZWdcIixcbiAgICAgICAgICBcImltYWdlL3BuZ1wiLFxuICAgICAgICAgIFwiaW1hZ2UvZ2lmXCIsXG4gICAgICAgICAgXCJhcHBsaWNhdGlvbi9wZGZcIixcbiAgICAgICAgXSksXG4gICAgICB9KSk7XG4gICAgfVxuXG4gICAgLyoqIO2VhOuTnOuqheyXkOyEnCDrsLDsl7TsnZgg7Jqp64+E66W8IOy2lOuhoO2VqeuLiOuLpCAqL1xuICAgIGNvbnN0IG5vcm1hbGl6ZWROYW1lID0gcHJvcC5uYW1lLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXy9nLCBcIlwiKTtcblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcInVybFwiKSB8fCBub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcImltYWdlXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIuaW50ZXJuZXQudXJsKCkpO1xuICAgIH1cblxuICAgIGlmIChub3JtYWxpemVkTmFtZS5pbmNsdWRlcyhcImlkXCIpICYmIG5vcm1hbGl6ZWROYW1lLmVuZHNXaXRoKFwic1wiKSkge1xuICAgICAgcmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sICgpID0+IGZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwIH0pKTtcbiAgICB9XG5cbiAgICBpZiAobm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJ0YWdcIikgfHwgbm9ybWFsaXplZE5hbWUuaW5jbHVkZXMoXCJuYW1lXCIpKSB7XG4gICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogY291bnQgfSwgKCkgPT4gZmFrZXIubG9yZW0ud29yZCgpKTtcbiAgICB9XG5cbiAgICAvKiog7Yyo7YS0IOunpOy5reuQmOyngCDslYrsnLzrqbQg67mIIOuwsOyXtOydhCDrsJjtmZjtlanri4jri6QgKi9cbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvKipcbiAgICogSlNPTiDrp6TtlZHsnZggRmFrZXIg7ZGc7ZiE7Iud7J2EIO2MjOyLse2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gICAqXG4gICAqIO2RnO2YhOyLnSDsmIjsi5w6XG4gICAqIC0gXCJmYWtlci5pbnRlcm5ldC5lbWFpbCgpXCIg4oaSIOyduOyekCDsl4bsnYxcbiAgICogLSBcImZha2VyLm51bWJlci5pbnQoeyBtaW46IDEsIG1heDogMTAwIH0pXCIg4oaSIEpTT04g7J247J6QXG4gICAqIC0gXCJ7fVwiIOKGkiDrpqzthLDrn7Qg6rCSIChKU09OLnBhcnNlKVxuICAgKlxuICAgKiBmYWtlcktPLCBmYWtlckpB64+EIOyngOybkO2VmOyXrCDri6Tqta3slrQg642w7J207YSw66W8IOyDneyEse2VqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUZha2VyRXhwcmVzc2lvbihleHByZXNzaW9uOiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3ApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBmYWtlck1vZHVsZSA9IGF3YWl0IGltcG9ydChcIkBmYWtlci1qcy9mYWtlclwiKTtcbiAgICBjb25zdCBmYWtlciA9IGZha2VyTW9kdWxlLmZha2VyO1xuICAgIGNvbnN0IGZha2VyS08gPSBmYWtlck1vZHVsZS5mYWtlcktPO1xuICAgIGNvbnN0IGZha2VySkEgPSBmYWtlck1vZHVsZS5mYWtlckpBO1xuXG4gICAgLyoqIEZha2VyIO2RnO2YhOyLneydtCDslYTri4wg66as7YSw65+0IOqwkuydgCBKU09O7Jy866GcIO2MjOyLse2VqeuLiOuLpCAqL1xuICAgIGlmICghZXhwcmVzc2lvbi5zdGFydHNXaXRoKFwiZmFrZXJcIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKGV4cHJlc3Npb24pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBleHByZXNzaW9uO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiDtkZztmITsi53sl5DshJwgRmFrZXIg6rCd7LK07JmAIOqyveuhnOulvCDstpTstpztlanri4jri6QgKi9cbiAgICBjb25zdCBtYXRjaCA9IGV4cHJlc3Npb24ubWF0Y2goL14oZmFrZXJ8ZmFrZXJLT3xmYWtlckpBKVxcLiguKj8pJC8pO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBleHByZXNzaW9uOiAke2V4cHJlc3Npb259YCk7XG4gICAgfVxuXG4gICAgY29uc3QgWywgZmFrZXJOYW1lLCBleHByXSA9IG1hdGNoO1xuICAgIGNvbnN0IHNlbGVjdGVkRmFrZXIgPVxuICAgICAgZmFrZXJOYW1lID09PSBcImZha2VyS09cIiA/IGZha2VyS08gOiBmYWtlck5hbWUgPT09IFwiZmFrZXJKQVwiID8gZmFrZXJKQSA6IGZha2VyO1xuXG4gICAgY29uc3QgZnVuY01hdGNoID0gZXhwci5tYXRjaCgvXihbXFx3Ll0rKSg/OlxcKCguKj8pXFwpKT8kLyk7XG4gICAgaWYgKCFmdW5jTWF0Y2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmYWtlciBleHByZXNzaW9uIGZvciAke3Byb3AubmFtZX06ICR7ZXhwcmVzc2lvbn1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBbLCBwYXRoLCBhcmdzU3RyXSA9IGZ1bmNNYXRjaDtcbiAgICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuXG4gICAgLyoqIOygkCDtkZzquLDrspUoZG90IG5vdGF0aW9uKeycvOuhnCBGYWtlciDtlajsiJjrpbwg7LC+7JWE6rCR64uI64ukICovXG4gICAgbGV0IGZuOiB1bmtub3duID0gc2VsZWN0ZWRGYWtlcjtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICh0eXBlb2YgZm4gPT09IFwib2JqZWN0XCIgJiYgZm4gIT09IG51bGwgJiYgcGFydCBpbiBmbikge1xuICAgICAgICBmbiA9IChmbiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbcGFydF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZmFrZXIgcGF0aCBmb3IgJHtwcm9wLm5hbWV9OiAke2Zha2VyTmFtZX0uJHtwYXRofWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlb2YgZm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2Zha2VyTmFtZX0uJHtwYXRofSBpcyBub3QgYSBmdW5jdGlvbiAoZm9yICR7cHJvcC5uYW1lfSlgKTtcbiAgICB9XG5cbiAgICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gICAgaWYgKGFyZ3NTdHI/LnRyaW0oKSkge1xuICAgICAgYXJncyA9IHRoaXMucGFyc2VHZW5lcmF0b3JBcmdzKGFyZ3NTdHIsIHByb3AubmFtZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIGZpeHR1cmVIaW5066W8IExMTeyXkOqyjCDsoITri6ztlZjsl6wg7ZiE7Iuk7KCB7J24IO2FjOyKpO2KuCDrjbDsnbTthLDrpbwg7IOd7ISx7ZWp64uI64ukLlxuICAgKlxuICAgKiBmYWtlci5qc+uhnOuKlCDsg53shLHtlZjquLAg7Ja066Ck7Jq0IOuzteyeoe2VnCDthY3siqTtirgo7J6Q6riw7IaM6rCcLCDshKTrqoXrrLgg65OxKeulvFxuICAgKiBMTE3snYQg7Zmc7Jqp7ZWY7JesIOyDneyEse2VqeuLiOuLpC4g64+Z7J287ZWcIGhpbnTsl5Ag64yA7ZWcIOykkeuztSDtmLjstpzsnYQg67Cp7KeA7ZWY6riwIOychO2VtFxuICAgKiDsupDsi7HsnYQg6riw67O47Jy866GcIOyngOybkO2VqeuLiOuLpCAoTExNIEFQSSDruYTsmqkg7KCI6rCQKS5cbiAgICpcbiAgICogYWkg7Yyo7YKk7KeA64qUIGR5bmFtaWMgaW1wb3J066GcIOu2iOufrOyYpOuvgOuhnCwgdXNlTExN7J20IGZhbHNl7J24IOqyveyasFxuICAgKiDsnZjsobTshLHsnbQg7ISk7LmY65CY7KeAIOyViuyVhOuPhCBmaXh0dXJlIOyDneyEseydtCDsoJXsg4Eg64+Z7J6R7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBnZW5lcmF0ZVdpdGhMTE0oXG4gICAgZml4dHVyZUhpbnQ6IHN0cmluZyxcbiAgICBwcm9wOiBFbnRpdHlQcm9wLFxuICAgIGVudGl0eTogRW50aXR5LFxuICAgIHJvd0tleT86IHN0cmluZyxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gcm93S2V56rCAIOyeiOycvOuptCByb3cg64uo7JyEIOyDneyEsSDsoITrnrUg7IKs7JqpXG4gICAgaWYgKHJvd0tleSkge1xuICAgICAgY29uc3Qgcm93Q2FjaGVLZXkgPSBgJHtyb3dLZXl9OiR7cHJvcC5uYW1lfWA7XG5cbiAgICAgIC8vIOydtOuvuCDsnbQgcm937JeQIOuMgO2VnCBMTE0g7Zi47Lac7J20IOyZhOujjOuQnCDqsr3smrAg7LqQ7Iuc7JeQ7IScIOuwlOuhnCDrsJjtmZhcbiAgICAgIGlmICh0aGlzLmxsbUNhY2hlLmhhcyhyb3dDYWNoZUtleSkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGxtQ2FjaGUuZ2V0KHJvd0NhY2hlS2V5KTtcbiAgICAgIH1cblxuICAgICAgLy8g7IOIIHJvdzogTExNIOuMgOyDgSBwcm9wIOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEsVxuICAgICAgY29uc3QgbGxtUHJvcHMgPSBlbnRpdHkucHJvcHMuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgIGlmIChpc1JlbGF0aW9uUHJvcChwKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAocC5jb25lPy5maXh0dXJlR2VuZXJhdG9yKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChwLm5hbWUgPT09IFwiaWRcIiAmJiBwLmNvbmU/LmZpeHR1cmVTdHJhdGVneSA9PT0gXCJzZXF1ZW5jZVwiKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiAhIXAuY29uZT8ubm90ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBsbG1Qcm9wc+qwgCDruYTslrTsnojsnLzrqbQg64uo7J28IO2VhOuTnCDrsKnsi53snLzroZwgZmFsbGJhY2tcbiAgICAgIGlmIChsbG1Qcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgIWlzVGVzdCgpICYmXG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgW0ZpeHR1cmVHZW5lcmF0b3JdIGxsbVByb3BzIGlzIGVtcHR5IGZvciAke2VudGl0eS5pZH0uJHtwcm9wLm5hbWV9LCB1c2luZyBzaW5nbGUgZmllbGQgZmFsbGJhY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLmdlbmVyYXRlU2luZ2xlV2l0aExMTShmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICAgIGNvbnN0IHsgY3JlYXRlQW50aHJvcGljIH0gPSBhd2FpdCBpbXBvcnQoXCJAYWktc2RrL2FudGhyb3BpY1wiKTtcbiAgICAgIGNvbnN0IHsgZ2VuZXJhdGVUZXh0IH0gPSBhd2FpdCBpbXBvcnQoXCJhaVwiKTtcblxuICAgICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCBnZW5lcmF0ZVRleHQoe1xuICAgICAgICBtb2RlbDogY3JlYXRlQW50aHJvcGljKHsgYXBpS2V5IH0pKHRoaXMub3B0aW9ucy5sbG1Nb2RlbCB8fCBcImNsYXVkZS1zb25uZXQtNC01XCIpLFxuICAgICAgICBwcm9tcHQ6IHRoaXMuYnVpbGRSb3dMTE1Qcm9tcHQobGxtUHJvcHMsIGVudGl0eSksXG4gICAgICB9KTtcblxuICAgICAgLy8g7J2R64u17J2EIO2MjOyLse2VmOyXrCDqsIEg7ZWE65Oc7JeQIOuMgO2VnCDqsrDqs7zrpbwg7LqQ7Iuc7JeQIOyggOyepVxuICAgICAgY29uc3Qgcm93UmVzdWx0ID0gdGhpcy5wYXJzZVJvd0xMTVJlc3BvbnNlKHRleHQsIGxsbVByb3BzKTtcbiAgICAgIGZvciAoY29uc3QgW2ZpZWxkTmFtZSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJvd1Jlc3VsdCkpIHtcbiAgICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoYCR7cm93S2V5fToke2ZpZWxkTmFtZX1gLCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOyalOyyre2VnCDtlYTrk5zsnZgg6rCSIOuwmO2ZmCAo7JeG7Jy866m0IOuLqOydvCDtlYTrk5wgZmFsbGJhY2spXG4gICAgICBpZiAodGhpcy5sbG1DYWNoZS5oYXMocm93Q2FjaGVLZXkpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChyb3dDYWNoZUtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIOunjOyVvSByb3cg7J2R64u17JeQIOydtCDtlYTrk5zqsIAg64iE652965CcIOqyveyasCDri6jsnbwg7ZWE65OcIGZhbGxiYWNrXG4gICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gICAgfVxuXG4gICAgLy8gcm93S2V56rCAIOyXhuycvOuptCDquLDsobQg64uo7J28IO2VhOuTnCDrsKnsi51cbiAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZVNpbmdsZVdpdGhMTE0oZml4dHVyZUhpbnQsIHByb3AsIGVudGl0eSk7XG4gIH1cblxuICAvKipcbiAgICog64uo7J28IO2VhOuTnOulvCBMTE3snLzroZwg7IOd7ISx7ZWp64uI64ukIChyb3dLZXkg7JeG7J2EIOuVjCBmYWxsYmFja+yaqSlcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2VuZXJhdGVTaW5nbGVXaXRoTExNKFxuICAgIGZpeHR1cmVIaW50OiBzdHJpbmcsXG4gICAgcHJvcDogRW50aXR5UHJvcCxcbiAgICBlbnRpdHk6IEVudGl0eSxcbiAgKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHtlbnRpdHkuaWR9OiR7cHJvcC5uYW1lfToke2ZpeHR1cmVIaW50fWA7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSAmJiB0aGlzLmxsbUNhY2hlLmhhcyhjYWNoZUtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmxsbUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBpS2V5ID0gdGhpcy5nZXRBcGlLZXkoKTtcbiAgICBjb25zdCB7IGNyZWF0ZUFudGhyb3BpYyB9ID0gYXdhaXQgaW1wb3J0KFwiQGFpLXNkay9hbnRocm9waWNcIik7XG4gICAgY29uc3QgeyBnZW5lcmF0ZVRleHQgfSA9IGF3YWl0IGltcG9ydChcImFpXCIpO1xuXG4gICAgY29uc3QgeyB0ZXh0IH0gPSBhd2FpdCBnZW5lcmF0ZVRleHQoe1xuICAgICAgbW9kZWw6IGNyZWF0ZUFudGhyb3BpYyh7IGFwaUtleSB9KSh0aGlzLm9wdGlvbnMubGxtTW9kZWwgfHwgXCJjbGF1ZGUtc29ubmV0LTQtNVwiKSxcbiAgICAgIHByb21wdDogdGhpcy5idWlsZExMTVByb21wdChmaXh0dXJlSGludCwgcHJvcCwgZW50aXR5KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5wYXJzZUxMTVJlc3BvbnNlKHRleHQsIHByb3AudHlwZSk7XG4gICAgaWYgKHRoaXMub3B0aW9ucy5lbmFibGVMTE1DYWNoZSkge1xuICAgICAgdGhpcy5sbG1DYWNoZS5zZXQoY2FjaGVLZXksIHZhbHVlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogcm93IOyghOyytOulvCDtlZwg67KI7JeQIOyDneyEse2VmOuKlCBMTE0g7ZSE66Gs7ZSE7Yq466W8IOunjOuTreuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRSb3dMTE1Qcm9tcHQocHJvcHM6IEVudGl0eVByb3BbXSwgZW50aXR5OiBFbnRpdHkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMub3B0aW9ucy5sb2NhbGUgfHwgXCJrb1wiO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbG9jYWxlID09PSBcImtvXCIgPyBcIktvcmVhblwiIDogbG9jYWxlID09PSBcImphXCIgPyBcIkphcGFuZXNlXCIgOiBcIkVuZ2xpc2hcIjtcblxuICAgIGNvbnN0IGZpZWxkRGVzY3JpcHRpb25zID0gcHJvcHNcbiAgICAgIC5tYXAoKHApID0+IHtcbiAgICAgICAgbGV0IGRlc2MgPSBgLSAke3AubmFtZX0gKCR7cC50eXBlfSk6ICR7cC5jb25lPy5ub3RlID8/IFwiXCJ9YDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwLnR5cGUgPT09IFwiZW51bVwiIHx8IHAudHlwZSA9PT0gXCJlbnVtW11cIikgJiZcbiAgICAgICAgICBcImlkXCIgaW4gcCAmJlxuICAgICAgICAgIHAuaWQgJiZcbiAgICAgICAgICBlbnRpdHkuZW51bUxhYmVscz8uW3AuaWRdXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3AuaWRdKS5qb2luKFwiLCBcIik7XG4gICAgICAgICAgZGVzYyArPSBgIFthbGxvd2VkIHZhbHVlczogJHt2YWx1ZXN9XWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHByb3BzLm1hcCgocCkgPT4gYCAgXCIke3AubmFtZX1cIjogPCR7cC50eXBlfT5gKS5qb2luKFwiLFxcblwiKTtcblxuICAgIHJldHVybiBgR2VuZXJhdGUgdGVzdCBmaXh0dXJlIGRhdGEgZm9yIHRoZSAke2VudGl0eS5pZH0gZW50aXR5LiBBbGwgZmllbGRzIG11c3QgYmUgY29oZXJlbnQgYW5kIGNvbnNpc3RlbnQgd2l0aCBlYWNoIG90aGVyLlxuXG5FbnRpdHk6ICR7ZW50aXR5LmlkfVxuTG9jYWxlOiAke2xvY2FsZX0gKHVzZSAke2xhbmd1YWdlfSBmb3IgdGV4dCBmaWVsZHMpXG5cbkZpZWxkcyB0byBnZW5lcmF0ZTpcbiR7ZmllbGREZXNjcmlwdGlvbnN9XG5cblJ1bGVzOlxuLSBBbGwgZmllbGRzIGluIGEgc2luZ2xlIHJvdyBtdXN0IGJlIGxvZ2ljYWxseSBjb25zaXN0ZW50IChlLmcuIG5hbWUvbmFtZV9lbi9uYW1lX2NuIHNob3VsZCByZXByZXNlbnQgdGhlIHNhbWUgcGVyc29uKVxuLSBSZXR1cm4gT05MWSB2YWxpZCBKU09OLCBubyBtYXJrZG93biBvciBleHBsYW5hdGlvblxuLSBEYXRlcyBpbiBJU08gODYwMSBmb3JtYXRcbi0gVXNlICR7bGFuZ3VhZ2V9IGZvciB0ZXh0IHVubGVzcyBmaWVsZCBkZXNjcmlwdGlvbiBzYXlzIG90aGVyd2lzZVxuXG5SZXR1cm4gZXhhY3RseSB0aGlzIEpTT04gc2hhcGU6XG57XG4ke291dHB1dFNoYXBlfVxufWA7XG4gIH1cblxuICAvKipcbiAgICogcm93IExMTSDsnZHri7XsnYQg7YyM7Iux7ZWY7JesIO2VhOuTnOuzhCDqsJLsnLzroZwg67OA7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVJvd0xMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcHM6IEVudGl0eVByb3BbXSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCBqc29uVGV4dCA9IHRleHRcbiAgICAgIC50cmltKClcbiAgICAgIC5yZXBsYWNlKC9eYGBganNvblxccyovaSwgXCJcIilcbiAgICAgIC5yZXBsYWNlKC9gYGBcXHMqJC8sIFwiXCIpXG4gICAgICAudHJpbSgpO1xuXG4gICAgbGV0IHBhcnNlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlZCA9IEpTT04ucGFyc2UoanNvblRleHQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgIWlzVGVzdCgpICYmIGNvbnNvbGUud2FybihcIltGaXh0dXJlR2VuZXJhdG9yXSBGYWlsZWQgdG8gcGFyc2Ugcm93IExMTSByZXNwb25zZTpcIiwgdGV4dCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgaWYgKHByb3AubmFtZSBpbiBwYXJzZWQpIHtcbiAgICAgICAgcmVzdWx0W3Byb3AubmFtZV0gPSB0aGlzLnBhcnNlTExNUmVzcG9uc2UoU3RyaW5nKHBhcnNlZFtwcm9wLm5hbWVdID8/IFwiXCIpLCBwcm9wLnR5cGUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZExMTVByb21wdChoaW50OiBzdHJpbmcsIHByb3A6IEVudGl0eVByb3AsIGVudGl0eTogRW50aXR5KTogc3RyaW5nIHtcbiAgICBjb25zdCBsb2NhbGUgPSB0aGlzLm9wdGlvbnMubG9jYWxlIHx8IFwia29cIjtcbiAgICBjb25zdCBsYW5ndWFnZSA9IGxvY2FsZSA9PT0gXCJrb1wiID8gXCJLb3JlYW5cIiA6IGxvY2FsZSA9PT0gXCJqYVwiID8gXCJKYXBhbmVzZVwiIDogXCJFbmdsaXNoXCI7XG5cbiAgICBsZXQgcHJvbXB0ID0gYEdlbmVyYXRlIHRlc3QgZGF0YSBmb3IgJHtlbnRpdHkuaWR9LiR7cHJvcC5uYW1lfSAodHlwZTogJHtwcm9wLnR5cGV9KVxuXG5SZXF1aXJlbWVudDogJHtoaW50fVxuXG5SdWxlczpcbi0gUmV0dXJuIE9OTFkgdGhlIHZhbHVlLCBubyBleHBsYW5hdGlvbiBvciBtYXJrZG93blxuLSBVc2UgJHtsYW5ndWFnZX0gbGFuZ3VhZ2UgaWYgYXBwbGljYWJsZVxuLSBGb3JtYXQ6ICR7dGhpcy5nZXRFeHBlY3RlZEZvcm1hdChwcm9wLnR5cGUpfWA7XG5cbiAgICAvLyBlbnVtIO2DgOyeheyduCDqsr3smrAg6rCA64ql7ZWcIOqwkiDrqqnroZ0g7LaU6rCAXG4gICAgaWYgKHByb3AudHlwZSA9PT0gXCJlbnVtXCIgfHwgcHJvcC50eXBlID09PSBcImVudW1bXVwiKSB7XG4gICAgICBsZXQgZW51bVZhbHVlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgaWYgKFwiZW51bVwiIGluIHByb3AgJiYgQXJyYXkuaXNBcnJheShwcm9wLmVudW0pICYmIHByb3AuZW51bS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGVudW1WYWx1ZXMgPSBwcm9wLmVudW07XG4gICAgICB9IGVsc2UgaWYgKFwiaWRcIiBpbiBwcm9wICYmIHByb3AuaWQgJiYgZW50aXR5Py5lbnVtTGFiZWxzPy5bcHJvcC5pZF0pIHtcbiAgICAgICAgZW51bVZhbHVlcyA9IE9iamVjdC5rZXlzKGVudGl0eS5lbnVtTGFiZWxzW3Byb3AuaWRdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVudW1WYWx1ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBwcm9tcHQgKz0gYFxcbi0gSU1QT1JUQU5UOiBDaG9vc2UgT05MWSBmcm9tIHRoZXNlIGFsbG93ZWQgdmFsdWVzOiAke2VudW1WYWx1ZXMuam9pbihcIiwgXCIpfWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvbXB0ICs9IGBcXG5cXG5FeGFtcGxlOiAke3RoaXMuZ2V0RXhhbXBsZUZvclR5cGUocHJvcC50eXBlLCBsb2NhbGUpfWA7XG5cbiAgICByZXR1cm4gcHJvbXB0O1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJzZUxMTVJlc3BvbnNlKHRleHQ6IHN0cmluZywgcHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIGNvbnN0IGNsZWFuZWQgPSB0ZXh0LnRyaW0oKTtcblxuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UoY2xlYW5lZCk7XG4gICAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpOyAvLyBcImludGVnZXJbXVwiIC0+IFwiaW50ZWdlclwiXG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFyc2VkKSkge1xuICAgICAgICAgIHJldHVybiBwYXJzZWQubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAvLyBudWxsL3VuZGVmaW5lZOuKlCDtg4DsnoXrs4Qg6riw67O46rCS7Jy866GcXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gbnVsbCB8fCBpdGVtID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RGVmYXVsdFZhbHVlRm9yVHlwZShiYXNlVHlwZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyDqsJ3ssrTripQgSlNPTi5zdHJpbmdpZnkg7ZuEIO2MjOyLsSAoanNvbiDtg4DsnoXsnbgg6rK97JqwKVxuICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICAgIHJldHVybiBiYXNlVHlwZSA9PT0gXCJqc29uXCJcbiAgICAgICAgICAgICAgICA/IGl0ZW1cbiAgICAgICAgICAgICAgICA6IHRoaXMucGFyc2VTY2FsYXJWYWx1ZShKU09OLnN0cmluZ2lmeShpdGVtKSwgYmFzZVR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcHJpbWl0aXZlIOqwkuydgCDrrLjsnpDsl7TroZwg67OA7ZmYIO2bhCDtjIzsi7FcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlU2NhbGFyVmFsdWUoU3RyaW5nKGl0ZW0pLCBiYXNlVHlwZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDri6jsnbwg6rCS7J20IOyYqCDqsr3smrAg67Cw7Je066GcIOqwkOyLuOq4sFxuICAgICAgICBpZiAocGFyc2VkID09PSBudWxsIHx8IHBhcnNlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIFt0aGlzLmdldERlZmF1bHRWYWx1ZUZvclR5cGUoYmFzZVR5cGUpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW3RoaXMucGFyc2VTY2FsYXJWYWx1ZShTdHJpbmcocGFyc2VkKSwgYmFzZVR5cGUpXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucGFyc2VTY2FsYXJWYWx1ZShjbGVhbmVkLCBwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldERlZmF1bHRWYWx1ZUZvclR5cGUocHJvcFR5cGU6IHN0cmluZyk6IHVua25vd24ge1xuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gMDtcbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIGNhc2UgXCJkYXRlXCI6XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSgpO1xuICAgICAgY2FzZSBcImpzb25cIjpcbiAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgICAgcmV0dXJuIFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBhcnNlU2NhbGFyVmFsdWUodGV4dDogc3RyaW5nLCBwcm9wVHlwZTogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgY2xlYW5lZCA9IHRleHQudHJpbSgpO1xuXG4gICAgc3dpdGNoIChwcm9wVHlwZSkge1xuICAgICAgY2FzZSBcImludGVnZXJcIjoge1xuICAgICAgICBjb25zdCBudW0gPSBwYXJzZUludChjbGVhbmVkLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4obnVtKSA/IDAgOiBudW07XG4gICAgICB9XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChjbGVhbmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIDBuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6IHtcbiAgICAgICAgY29uc3QgbnVtID0gcGFyc2VGbG9hdChjbGVhbmVkKTtcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc05hTihudW0pID8gMCA6IG51bTtcbiAgICAgIH1cbiAgICAgIGNhc2UgXCJib29sZWFuXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgY2FzZSBcImRhdGVcIjoge1xuICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoY2xlYW5lZCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gbmV3IERhdGUoKSA6IGRhdGU7XG4gICAgICB9XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGNsZWFuZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gY2xlYW5lZDtcbiAgICAgICAgfVxuICAgICAgY2FzZSBcInV1aWRcIjpcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBjbGVhbmVkO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGZha2VyIO2VqOyImCDsnbjsnpAg66y47J6Q7Je07J2EIO2MjOyLse2VmOyXrCDsnbjsnpAg67Cw7Je066GcIOuwmO2ZmO2VqeuLiOuLpC5cbiAgICpcbiAgICogM+uLqOqzhCDsoITrnrU6XG4gICAqIDEuIEpTT04g7KeB7KCRIO2MjOyLsSAo7ZGc7KSAIEpTT04g7ZGc7ZiE7IudKVxuICAgKiAyLiBKUyDqsJ3ssrQg66as7YSw65+0IOKGkiBKU09OIOuzgO2ZmCDtm4Qg7J6s7Iuc64+EIChzaW5nbGUgcXVvdGUsIHVucXVvdGVkIGtleSDsspjrpqwpXG4gICAqIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsSAo7Iir7J6QLCDrrLjsnpDsl7QpXG4gICAqL1xuICBwcml2YXRlIHBhcnNlR2VuZXJhdG9yQXJncyhhcmdzU3RyOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiB1bmtub3duW10ge1xuICAgIC8vIDEuIEpTT04g7KeB7KCRIO2MjOyLsVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGBbJHthcmdzU3RyfV1gKSBhcyB1bmtub3duO1xuICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyc2VkKSA/IHBhcnNlZCA6IFtwYXJzZWRdO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8g6rOE7IaNXG4gICAgfVxuXG4gICAgLy8gMi4gSlMg6rCd7LK0IOumrO2EsOuftCDihpIgSlNPTiDrs4DtmZgg7ZuEIOyerOyLnOuPhFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBqc29uU3RyID0gdGhpcy5jb252ZXJ0SnNMaXRlcmFsVG9Kc29uKGFyZ3NTdHIpO1xuICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShgWyR7anNvblN0cn1dYCkgYXMgdW5rbm93bjtcbiAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHBhcnNlZCkgPyBwYXJzZWQgOiBbcGFyc2VkXTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIOqzhOyGjVxuICAgIH1cblxuICAgIC8vIDMuIOuLqOyInCDri6jsnbwg7J247J6QIO2PtOuwsVxuICAgIGNvbnN0IHRyaW1tZWQgPSBhcmdzU3RyLnRyaW0oKTtcbiAgICBpZiAoIU51bWJlci5pc05hTihOdW1iZXIodHJpbW1lZCkpKSB7XG4gICAgICByZXR1cm4gW051bWJlcih0cmltbWVkKV07XG4gICAgfVxuICAgIGlmIChcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdHJpbW1lZC5lbmRzV2l0aCgnXCInKSkgfHxcbiAgICAgICh0cmltbWVkLnN0YXJ0c1dpdGgoXCInXCIpICYmIHRyaW1tZWQuZW5kc1dpdGgoXCInXCIpKVxuICAgICkge1xuICAgICAgcmV0dXJuIFt0cmltbWVkLnNsaWNlKDEsIC0xKV07XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKGBGaXh0dXJlR2VuZXJhdG9yOiBDYW5ub3QgcGFyc2UgYXJndW1lbnRzIGZvciAke3Byb3BOYW1lfTogJHthcmdzU3RyfWApO1xuICB9XG5cbiAgLyoqXG4gICAqIEpTIOqwneyytCDrpqzthLDrn7TsnYQgSlNPTuycvOuhnCDrs4DtmZjtlanri4jri6QuXG4gICAqXG4gICAqIOuRkCDqsIDsp4Ag67OA7ZmYOlxuICAgKiAxLiBTaW5nbGUtcXVvdGVkIOusuOyekOyXtCDihpIgZG91YmxlLXF1b3RlZCAo7J207Iqk7LyA7J207ZSEIOyymOumrCDtj6ztlagpXG4gICAqIDIuIFVucXVvdGVkIOqwneyytCDtgqQg4oaSIGRvdWJsZS1xdW90ZWRcbiAgICovXG4gIHByaXZhdGUgY29udmVydEpzTGl0ZXJhbFRvSnNvbihpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyAxLiAndmFsdWUnIOKGkiBcInZhbHVlXCIgKOuCtOu2gCBcIiDsnbTsiqTsvIDsnbTtlIQsIFxcJyDihpIgJylcbiAgICBjb25zdCB3aXRoRG91YmxlUXVvdGVzID0gaW5wdXQucmVwbGFjZShcbiAgICAgIC8nKFteJ1xcXFxdKig/OlxcXFwuW14nXFxcXF0qKSopJy9nLFxuICAgICAgKF8sIGNvbnRlbnQ6IHN0cmluZykgPT4gYFwiJHtjb250ZW50LnJlcGxhY2UoL1wiL2csICdcXFxcXCInKS5yZXBsYWNlKC9cXFxcJy9nLCBcIidcIil9XCJgLFxuICAgICk7XG5cbiAgICAvLyAyLiB7IGtleTog4oaSIHsgXCJrZXlcIjpcbiAgICByZXR1cm4gd2l0aERvdWJsZVF1b3Rlcy5yZXBsYWNlKC8oW3ssXVxccyopKFthLXpBLVpfJF1bXFx3JF0qKShcXHMqOikvZywgJyQxXCIkMlwiJDMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb25hbXUuc2VjcmV07J2EIOyasOyEoOycvOuhnCDtlZjqs6AsIOyXhuycvOuptCDtmZjqsr3rs4DsiJjsl5DshJwgQVBJIO2CpOulvCDsnb3sirXri4jri6QuXG4gICAqXG4gICAqIFNvbmFtdS5zZWNyZXTsnYAg7ZSE66Gc7KCd7Yq467OEIOyEpOyglShzb25hbXUuY29uZmlnLnRzKeydtOuvgOuhnCDrjZQg64aS7J2AIOyasOyEoOyInOychOulvCDqsIDsp4DrqbAsXG4gICAqIO2ZmOqyveuzgOyImOuKlCDqsJzrsJwg7ZmY6rK97J2064KYIENJL0NE7JeQ7IScIGZhbGxiYWNr7Jy866GcIOyCrOyaqeuQqeuLiOuLpC5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXBpS2V5KCk6IHN0cmluZyB7XG4gICAgbGV0IGFwaUtleTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgU29uYW11IH0gPSByZXF1aXJlKFwiLi4vYXBpXCIpO1xuICAgICAgYXBpS2V5ID0gU29uYW11LnNlY3JldD8uYW50aHJvcGljX2FwaV9rZXk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBTb25hbXXqsIAg7LSI6riw7ZmU65CY7KeAIOyViuydgCDqsr3smrAgKO2FjOyKpO2KuCDtmZjqsr0g65OxKVxuICAgIH1cblxuICAgIGlmICghYXBpS2V5KSB7XG4gICAgICBhcGlLZXkgPSBwcm9jZXNzLmVudi5BTlRIUk9QSUNfQVBJX0tFWTtcbiAgICB9XG5cbiAgICBpZiAoIWFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcIkFOVEhST1BJQ19BUElfS0VZIG5vdCBmb3VuZC4gU2V0IGl0IGluIGVudmlyb25tZW50IHZhcmlhYmxlcyBvciBTb25hbXUuc2VjcmV0LmFudGhyb3BpY19hcGlfa2V5XCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhcGlLZXk7XG4gIH1cblxuICBwcml2YXRlIGdldEV4cGVjdGVkRm9ybWF0KHByb3BUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIOuwsOyXtCDtg4DsnoUg7LKY66asXG4gICAgaWYgKHByb3BUeXBlLmVuZHNXaXRoKFwiW11cIikpIHtcbiAgICAgIGNvbnN0IGJhc2VUeXBlID0gcHJvcFR5cGUuc2xpY2UoMCwgLTIpO1xuICAgICAgY29uc3QgYmFzZUZvcm1hdCA9IHRoaXMuZ2V0U2NhbGFyRm9ybWF0KGJhc2VUeXBlKTtcbiAgICAgIHJldHVybiBgSlNPTiBhcnJheSBvZiAke2Jhc2VGb3JtYXR9IChlLmcuLCBbJHt0aGlzLmdldEV4YW1wbGVGb3JUeXBlKGJhc2VUeXBlLCBcImVuXCIpfSwgLi4uXSlgO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldFNjYWxhckZvcm1hdChwcm9wVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNjYWxhckZvcm1hdChwcm9wVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKHByb3BUeXBlKSB7XG4gICAgICBjYXNlIFwiaW50ZWdlclwiOlxuICAgICAgY2FzZSBcImJpZ0ludGVnZXJcIjpcbiAgICAgICAgcmV0dXJuIFwiaW50ZWdlciBudW1iZXJzXCI7XG4gICAgICBjYXNlIFwiZmxvYXRcIjpcbiAgICAgIGNhc2UgXCJudW1iZXJcIjpcbiAgICAgIGNhc2UgXCJudW1lcmljXCI6XG4gICAgICAgIHJldHVybiBcImRlY2ltYWwgbnVtYmVyc1wiO1xuICAgICAgY2FzZSBcImJvb2xlYW5cIjpcbiAgICAgICAgcmV0dXJuIFwiYm9vbGVhbnMgKHRydWUgb3IgZmFsc2UpXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCJJU08gODYwMSBkYXRlIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJqc29uXCI6XG4gICAgICAgIHJldHVybiBcInZhbGlkIEpTT04gb2JqZWN0IG9yIGFycmF5XCI7XG4gICAgICBjYXNlIFwidXVpZFwiOlxuICAgICAgICByZXR1cm4gXCJVVUlEIHN0cmluZ3NcIjtcbiAgICAgIGNhc2UgXCJlbnVtXCI6XG4gICAgICAgIHJldHVybiBcIm9uZSBvZiB0aGUgYWxsb3dlZCBlbnVtIHZhbHVlc1wiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIFwicGxhaW4gdGV4dCBzdHJpbmdzXCI7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRFeGFtcGxlRm9yVHlwZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgLy8g67Cw7Je0IO2DgOyehSDsspjrpqxcbiAgICBpZiAocHJvcFR5cGUuZW5kc1dpdGgoXCJbXVwiKSkge1xuICAgICAgY29uc3QgYmFzZVR5cGUgPSBwcm9wVHlwZS5zbGljZSgwLCAtMik7XG4gICAgICBjb25zdCBiYXNlRXhhbXBsZSA9IHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShiYXNlVHlwZSwgbG9jYWxlKTtcbiAgICAgIHJldHVybiBgWyR7YmFzZUV4YW1wbGV9XWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZSwgbG9jYWxlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2NhbGFyRXhhbXBsZShwcm9wVHlwZTogc3RyaW5nLCBsb2NhbGU6IExvY2FsZSk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNLb3JlYW4gPSBsb2NhbGUgPT09IFwia29cIjtcblxuICAgIHN3aXRjaCAocHJvcFR5cGUpIHtcbiAgICAgIGNhc2UgXCJpbnRlZ2VyXCI6XG4gICAgICBjYXNlIFwiYmlnSW50ZWdlclwiOlxuICAgICAgICByZXR1cm4gXCI0MlwiO1xuICAgICAgY2FzZSBcImZsb2F0XCI6XG4gICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICBjYXNlIFwibnVtZXJpY1wiOlxuICAgICAgICByZXR1cm4gXCIzLjE0XCI7XG4gICAgICBjYXNlIFwiYm9vbGVhblwiOlxuICAgICAgICByZXR1cm4gXCJ0cnVlXCI7XG4gICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICByZXR1cm4gXCIyMDI0LTAxLTAxXCI7XG4gICAgICBjYXNlIFwianNvblwiOlxuICAgICAgICByZXR1cm4gJ3tcImtleVwiOiBcInZhbHVlXCJ9JztcbiAgICAgIGNhc2UgXCJ1dWlkXCI6XG4gICAgICAgIHJldHVybiBcIjU1MGU4NDAwLWUyOWItNDFkNC1hNzE2LTQ0NjY1NTQ0MDAwMFwiO1xuICAgICAgY2FzZSBcImVudW1cIjpcbiAgICAgICAgcmV0dXJuIFwiRU5VTV9WQUxVRVwiO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGlzS29yZWFuID8gXCLslYjrhZXtlZjshLjsmpRcIiA6IFwiSGVsbG9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnCDthrXqs4Trpbwg67CY7ZmY7ZWp64uI64ukLlxuICAgKi9cbiAgZ2V0TExNQ2FjaGVTdGF0cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc2l6ZTogdGhpcy5sbG1DYWNoZS5zaXplLFxuICAgICAgZW5hYmxlZDogdGhpcy5vcHRpb25zLmVuYWJsZUxMTUNhY2hlLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTExNIOy6kOyLnOulvCDstIjquLDtmZTtlanri4jri6QuXG4gICAqL1xuICBjbGVhckxMTUNhY2hlKCkge1xuICAgIHRoaXMubGxtQ2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiDsu6jthY3siqTtirgg7IOd7ISxXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUNvbnRleHQoKTogR2VuZXJhdG9yQ29udGV4dCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpeHR1cmVzOiBuZXcgTWFwKCksXG4gICAgICByZWZlcmVuY2VDYWNoZTogbmV3IE1hcCgpLFxuICAgICAgaW1wb3J0ZWRSZWNvcmRzOiBuZXcgU2V0KCksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsLDsuZgg7IOd7ISxIOuwjyDsnpDrj5kg7KCA7J6lXG4gICAqXG4gICAqIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxICjrqZTrqqjrpqwpXG4gICAqIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAqIDMuIEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKCnroZwgdGFyZ2V0RGLsl5Ag7KCA7J6lXG4gICAqXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICovXG4gIGFzeW5jIGdlbmVyYXRlQmF0Y2goXG4gICAgc3BlY3M6IEFycmF5PHsgZW50aXR5OiBzdHJpbmc7IGNvdW50OiBudW1iZXI7IG92ZXJyaWRlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+LFxuICApOiBQcm9taXNlPEZpeHR1cmVJbXBvcnRSZXN1bHRbXT4ge1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLmNyZWF0ZUNvbnRleHQoKTtcbiAgICBjb25zdCBnZW5lcmF0ZWRGaXh0dXJlczogQXJyYXk8eyBlbnRpdHk6IHN0cmluZzsgZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gPSBbXTtcblxuICAgIC8vIDEuIOqwgSBzcGVj67OE66GcIGZpeHR1cmUg7IOd7ISxXG4gICAgZm9yIChjb25zdCBzcGVjIG9mIHNwZWNzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuY291bnQ7IGkrKykge1xuICAgICAgICBjb25zdCBmaXh0dXJlID0gYXdhaXQgdGhpcy5nZW5lcmF0ZShzcGVjLmVudGl0eSwgc3BlYy5vdmVycmlkZXMgfHwge30sIGNvbnRleHQpO1xuICAgICAgICBnZW5lcmF0ZWRGaXh0dXJlcy5wdXNoKHtcbiAgICAgICAgICBlbnRpdHk6IHNwZWMuZW50aXR5LFxuICAgICAgICAgIGRhdGE6IGZpeHR1cmUsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeyBlbnRpdHk6IGVudGl0eU5hbWUsIGRhdGEgfSBvZiBnZW5lcmF0ZWRGaXh0dXJlcykge1xuICAgICAgY29uc3QgZW50aXR5ID0gdGhpcy5lbnRpdHlNYW5hZ2VyLmdldChlbnRpdHlOYW1lKTtcblxuICAgICAgLy8g7J6E7IucIElEIOyDneyEsSAodGFyZ2V0RGLsl5AgSU5TRVJUIO2bhCDsi6TsoJwgSUTrpbwg67Cb7J2MKVxuICAgICAgY29uc3QgdGVtcElkID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDAwMCk7XG4gICAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgRml4dHVyZU1hbmFnZXIuY3JlYXRlRml4dHVyZVJlY29yZChcbiAgICAgICAgZW50aXR5LFxuICAgICAgICB7IC4uLmRhdGEsIGlkOiB0ZW1wSWQgfSBhcyB7IGlkOiBudW1iZXI7IFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsIH0sXG4gICAgICAgIHsgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyAzLiB0YXJnZXREYuyXkCDsgr3snoUgKEZpeHR1cmVNYW5hZ2Vy6rCAIOydmOyhtOyEsSDsoJXroKwg7LKY66asKVxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbnNlcnRGaXh0dXJlcyh0aGlzLnRhcmdldERiTmFtZSwgZml4dHVyZVJlY29yZHMpO1xuXG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuZ3JlZW4oYEdlbmVyYXRlZCBhbmQgc2F2ZWQgJHtyZXN1bHRzLmxlbmd0aH0gZml4dHVyZXMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX1gKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvKipcbiAgICog7Iuk7KCcIERCKHNvdXJjZURiKeyXkOyEnCDrjbDsnbTthLDrpbwg7KGw7ZqM7ZWY7JesIGZpeHR1cmUgREIodGFyZ2V0RGIp7JeQIGltcG9ydO2VqeuLiOuLpC5cbiAgICpcbiAgICogMS4gRGF0YUV4cGxvcmVy66GcIHNvdXJjZURi7JeQ7IScIOuNsOydtO2EsCDsobDtmowgKOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoKVxuICAgKiAyLiBGaXh0dXJlUmVjb3Jk66GcIOuzgO2ZmFxuICAgKiAzLiB0YXJnZXREYuyXkCDsgr3snoVcbiAgICpcbiAgICogQHBhcmFtIGVudGl0eU5hbWUgLSDsobDtmoztlaAgZW50aXR5IOydtOumhFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIOyhsO2ajCDsmLXshZggKHN0cmF0ZWd5LCBsaW1pdCwgaW5jbHVkZVJlbGF0aW9ucyDrk7EpXG4gICAqIEByZXR1cm5zIOyggOyepeuQnCBmaXh0dXJlIOuNsOydtO2EsCAo7Iuk7KCcIERCIElEIO2PrO2VqClcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8g7ZSE66Gc642V7IWYIERC7JeQ7IScIFVzZXIgMTDrqoUgKyDqtIDroKggRW1wbG95ZWUsIERlcGFydG1lbnQg6rCA7KC47Jik6riwXG4gICAqIGF3YWl0IGdlbmVyYXRvci5pbXBvcnRGcm9tU291cmNlKFwiVXNlclwiLCB7XG4gICAqICAgc3RyYXRlZ3k6IFwic2FtcGxlXCIsXG4gICAqICAgbGltaXQ6IDEwLFxuICAgKiAgIGluY2x1ZGVSZWxhdGlvbnM6IHRydWUsXG4gICAqICAgbWF4RGVwdGg6IDJcbiAgICogfSk7XG4gICAqL1xuICBhc3luYyBpbXBvcnRGcm9tU291cmNlKFxuICAgIGVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBFeHBsb3JlV2l0aFJlbGF0aW9uc09wdGlvbnMsXG4gICk6IFByb21pc2U8Rml4dHVyZUltcG9ydFJlc3VsdFtdPiB7XG4gICAgIWlzVGVzdCgpICYmXG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgY2hhbGsuYmx1ZShcbiAgICAgICAgICBgSW1wb3J0aW5nICR7ZW50aXR5TmFtZX0gZnJvbSBzb3VyY2UgREIgd2l0aCBvcHRpb25zOiAke0pTT04uc3RyaW5naWZ5KHsgc3RyYXRlZ3k6IG9wdGlvbnMuc3RyYXRlZ3ksIGxpbWl0OiBvcHRpb25zLmxpbWl0LCBpbmNsdWRlUmVsYXRpb25zOiBvcHRpb25zLmluY2x1ZGVSZWxhdGlvbnMsIG1heERlcHRoOiBvcHRpb25zLm1heERlcHRoIH0pfWAsXG4gICAgICAgICksXG4gICAgICApO1xuXG4gICAgLy8gMS4gRGF0YUV4cGxvcmVy66GcIHNvdXJjZURi7JeQ7IScIOuNsOydtO2EsCDsobDtmowgKOq0gOugqCDrjbDsnbTthLAg7Y+s7ZWoKVxuICAgIGNvbnN0IGV4cGxvcmVSZXN1bHQgPSBhd2FpdCB0aGlzLmRhdGFFeHBsb3Jlci5leHBsb3JlV2l0aFJlbGF0aW9ucyhlbnRpdHlOYW1lLCBvcHRpb25zKTtcblxuICAgICFpc1Rlc3QoKSAmJlxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGNoYWxrLmN5YW4oXG4gICAgICAgICAgYEZvdW5kICR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSAke2VudGl0eU5hbWV9IHJlY29yZHMgYW5kICR7ZXhwbG9yZVJlc3VsdC5yZWxhdGVkLnNpemV9IHJlbGF0ZWQgZW50aXRpZXNgLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIC8vIDIuIEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgZml4dHVyZVJlY29yZHM6IEZpeHR1cmVSZWNvcmRbXSA9IFtdO1xuXG4gICAgLy8g66mU7J24IGVudGl0eeydmCByZWNvcmRz66W8IEZpeHR1cmVSZWNvcmTroZwg67OA7ZmYXG4gICAgY29uc3QgbWFpbkVudGl0eSA9IHRoaXMuZW50aXR5TWFuYWdlci5nZXQoZW50aXR5TmFtZSk7XG4gICAgZm9yIChjb25zdCByZWNvcmQgb2YgZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMpIHtcbiAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICBtYWluRW50aXR5LFxuICAgICAgICByZWNvcmQgYXMgeyBpZDogbnVtYmVyIHwgc3RyaW5nOyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbCB9LFxuICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICApO1xuICAgICAgZml4dHVyZVJlY29yZHMucHVzaCguLi5yZWNvcmRzKTtcbiAgICB9XG5cbiAgICAvLyDqtIDroKggZW50aXR57J2YIHJlY29yZHPrpbwgRml4dHVyZVJlY29yZOuhnCDrs4DtmZhcbiAgICBmb3IgKGNvbnN0IFtyZWxhdGVkRW50aXR5TmFtZSwgcmVsYXRlZFJlY29yZHNdIG9mIGV4cGxvcmVSZXN1bHQucmVsYXRlZC5lbnRyaWVzKCkpIHtcbiAgICAgIGNvbnN0IHJlbGF0ZWRFbnRpdHkgPSB0aGlzLmVudGl0eU1hbmFnZXIuZ2V0KHJlbGF0ZWRFbnRpdHlOYW1lKTtcbiAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlbGF0ZWRSZWNvcmRzKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBGaXh0dXJlTWFuYWdlci5jcmVhdGVGaXh0dXJlUmVjb3JkKFxuICAgICAgICAgIHJlbGF0ZWRFbnRpdHksXG4gICAgICAgICAgcmVjb3JkIGFzIHsgaWQ6IG51bWJlciB8IHN0cmluZzsgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwgfSxcbiAgICAgICAgICB7IF9kYjogdGhpcy5zb3VyY2VEYiwgc2luZ2xlUmVjb3JkOiB0cnVlIH0sXG4gICAgICAgICk7XG4gICAgICAgIGZpeHR1cmVSZWNvcmRzLnB1c2goLi4ucmVjb3Jkcyk7XG4gICAgICB9XG5cbiAgICAgICFpc1Rlc3QoKSAmJlxuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIC0gJHtyZWxhdGVkRW50aXR5TmFtZX06ICR7cmVsYXRlZFJlY29yZHMubGVuZ3RofSByZWNvcmRzYCkpO1xuICAgIH1cblxuICAgIC8vIDMuIHRhcmdldERi7JeQIOyCveyehSAoRml4dHVyZU1hbmFnZXLqsIAg7J2Y7KG07ISxIOygleugrCDsspjrpqwpXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmluc2VydEZpeHR1cmVzKHRoaXMudGFyZ2V0RGJOYW1lLCBmaXh0dXJlUmVjb3Jkcyk7XG5cbiAgICAhaXNUZXN0KCkgJiZcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBjaGFsay5ncmVlbihcbiAgICAgICAgICBgU3VjY2Vzc2Z1bGx5IGltcG9ydGVkICR7cmVzdWx0cy5sZW5ndGh9IHJlY29yZHMgdG8gJHt0aGlzLnRhcmdldERiTmFtZX0gKCR7ZXhwbG9yZVJlc3VsdC5tYWluLnJlY29yZHMubGVuZ3RofSAke2VudGl0eU5hbWV9ICsgJHtyZXN1bHRzLmxlbmd0aCAtIGV4cGxvcmVSZXN1bHQubWFpbi5yZWNvcmRzLmxlbmd0aH0gcmVsYXRlZClgLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJpc0JlbG9uZ3NUb09uZVJlbGF0aW9uUHJvcCIsImlzT25lVG9PbmVSZWxhdGlvblByb3AiLCJpc1JlbGF0aW9uUHJvcCIsImlzVGVzdCIsIkRhdGFFeHBsb3JlciIsImZha2VyTWFwcGluZ3MiLCJGaXh0dXJlTWFuYWdlciIsIkZpeHR1cmVHZW5lcmF0b3IiLCJkYXRhRXhwbG9yZXIiLCJsb2NhbGUiLCJtYXBwaW5ncyIsImxsbUNhY2hlIiwiTWFwIiwiZW50aXR5Q2FjaGUiLCJvcHRpb25zIiwic291cmNlRGIiLCJfdGFyZ2V0RGIiLCJ0YXJnZXREYk5hbWUiLCJlbnRpdHlNYW5hZ2VyIiwidXNlTExNIiwiZW5hYmxlTExNQ2FjaGUiLCJsbG1Nb2RlbCIsImdlbmVyYXRlIiwiZW50aXR5TmFtZSIsIm92ZXJyaWRlcyIsImNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwiZW50aXR5IiwiZ2V0Iiwic2V0IiwidGVtcElkIiwiRGF0ZSIsIm5vdyIsInJvd0tleSIsInVuZGVmaW5lZCIsImZpeHR1cmUiLCJwcm9wIiwicHJvcHMiLCJ2aXJ0dWFsIiwibmFtZSIsImNvbmUiLCJmaXh0dXJlU3RyYXRlZ3kiLCJyZWxhdGlvblZhbHVlIiwiZ2VuZXJhdGVSZWxhdGlvblZhbHVlIiwiaGFzSm9pbkNvbHVtbiIsImZpeHR1cmVHZW5lcmF0b3IiLCJleGVjdXRlR2VuZXJhdG9yIiwibm90ZSIsImdlbmVyYXRlV2l0aExMTSIsImVycm9yIiwiY29uc29sZSIsIndhcm4iLCJpZCIsIkVycm9yIiwibWVzc2FnZSIsImZpeHR1cmVEZWZhdWx0IiwiZ2VuZXJhdGVEZWZhdWx0VmFsdWUiLCJwYXNzd29yZCIsImJjcnlwdCIsImhhc2giLCJmaXh0dXJlcyIsImRhdGFTb3VyY2UiLCJjYWNoZUtleSIsIndpdGgiLCJKU09OIiwic3RyaW5naWZ5IiwicmVmZXJlbmNlQ2FjaGUiLCJoYXMiLCJleHBsb3JlUmVzdWx0IiwiZXhwbG9yZVdpdGhSZWxhdGlvbnMiLCJzdHJhdGVneSIsImxpbWl0IiwiY29uZmlnIiwiaW5jbHVkZVJlbGF0aW9ucyIsIm1heERlcHRoIiwibWFpbiIsInJlY29yZHMiLCJpbXBvcnRFeHBsb3JlUmVzdWx0IiwiY2FuZGlkYXRlcyIsImxlbmd0aCIsInNlbGVjdGVkIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwiYXV0b0tleSIsImF1dG9FeHBsb3JlUmVzdWx0IiwiYXV0b0NhbmRpZGF0ZXMiLCJudWxsYWJsZSIsImFsbEZpeHR1cmVSZWNvcmRzIiwiZW50aXR5SWQiLCJyZWxhdGVkIiwiZW50cmllcyIsInJlY29yZHNUb0ltcG9ydCIsImxvZyIsImN5YW4iLCJyZWNvcmQiLCJyZWNvcmRLZXkiLCJpbXBvcnRlZFJlY29yZHMiLCJwdXNoIiwiYWRkIiwiZ3JheSIsInNsaWNlIiwiZml4dHVyZVJlY29yZHMiLCJjcmVhdGVGaXh0dXJlUmVjb3JkIiwiX2RiIiwic2luZ2xlUmVjb3JkIiwibWFpbkVudGl0eSIsIm1haW5SZWNvcmRzVG9JbXBvcnQiLCJpbnNlcnRGaXh0dXJlcyIsImdyZWVuIiwic2l6ZSIsImdlbmVyYXRvciIsInN0YXJ0c1dpdGgiLCJpc05hbWVGaWVsZCIsImZha2VyTW9kdWxlIiwiZmFrZXIiLCJmYWtlcktPIiwiZXhwciIsIm1hdGNoIiwicGF0aCIsImFyZ3NTdHIiLCJwYXJ0cyIsInNwbGl0IiwiZm4iLCJwYXJ0IiwiYXJncyIsInRyaW0iLCJwYXJzZUdlbmVyYXRvckFyZ3MiLCJ5ZWxsb3ciLCJmYWtlckpBIiwibG9jYWxlRmFrZXIiLCJsb2NhbGVNYXBwaW5ncyIsImVuIiwibm9ybWFsaXplZE5hbWUiLCJ0b0xvd2VyQ2FzZSIsInJlcGxhY2UiLCJwYXR0ZXJuIiwiT2JqZWN0IiwiZmllbGRfcGF0dGVybnMiLCJpbmNsdWRlcyIsImV4ZWN1dGVGYWtlckV4cHJlc3Npb24iLCJkZXBhcnRtZW50cyIsInByZWZpeGVzIiwic3VmZml4ZXMiLCJkZXB0IiwiaGVscGVycyIsImFycmF5RWxlbWVudCIsInByZWZpeCIsInN1ZmZpeCIsInR5cGUiLCJlbmRzV2l0aCIsImdlbmVyYXRlQXJyYXlWYWx1ZSIsImVudW1WYWx1ZXMiLCJBcnJheSIsImlzQXJyYXkiLCJlbnVtIiwiZW51bUxhYmVscyIsImtleXMiLCJ0eXBlRGVmYXVsdCIsInR5cGVfZGVmYXVsdHMiLCJsb3JlbSIsIndvcmRzIiwibnVtYmVyIiwiaW50IiwibWluIiwibWF4IiwiYmlnSW50IiwiZmxvYXQiLCJkYXRhdHlwZSIsImJvb2xlYW4iLCJkYXRlIiwicGFzdCIsInN0cmluZyIsInV1aWQiLCJfZW50aXR5IiwiX2xvY2FsZUZha2VyIiwiY291bnQiLCJmcm9tIiwidXJsIiwiaW1hZ2UiLCJzeXN0ZW0iLCJmaWxlTmFtZSIsIm1pbWVfdHlwZSIsImludGVybmV0Iiwid29yZCIsImV4cHJlc3Npb24iLCJwYXJzZSIsImZha2VyTmFtZSIsInNlbGVjdGVkRmFrZXIiLCJmdW5jTWF0Y2giLCJmaXh0dXJlSGludCIsInJvd0NhY2hlS2V5IiwibGxtUHJvcHMiLCJmaWx0ZXIiLCJwIiwiZ2VuZXJhdGVTaW5nbGVXaXRoTExNIiwiYXBpS2V5IiwiZ2V0QXBpS2V5IiwiY3JlYXRlQW50aHJvcGljIiwiZ2VuZXJhdGVUZXh0IiwidGV4dCIsIm1vZGVsIiwicHJvbXB0IiwiYnVpbGRSb3dMTE1Qcm9tcHQiLCJyb3dSZXN1bHQiLCJwYXJzZVJvd0xMTVJlc3BvbnNlIiwiZmllbGROYW1lIiwidmFsdWUiLCJidWlsZExMTVByb21wdCIsInBhcnNlTExNUmVzcG9uc2UiLCJsYW5ndWFnZSIsImZpZWxkRGVzY3JpcHRpb25zIiwibWFwIiwiZGVzYyIsInZhbHVlcyIsImpvaW4iLCJvdXRwdXRTaGFwZSIsImpzb25UZXh0IiwicGFyc2VkIiwicmVzdWx0IiwiU3RyaW5nIiwiaGludCIsImdldEV4cGVjdGVkRm9ybWF0IiwiZ2V0RXhhbXBsZUZvclR5cGUiLCJwcm9wVHlwZSIsImNsZWFuZWQiLCJiYXNlVHlwZSIsIml0ZW0iLCJnZXREZWZhdWx0VmFsdWVGb3JUeXBlIiwicGFyc2VTY2FsYXJWYWx1ZSIsIm51bSIsInBhcnNlSW50IiwiTnVtYmVyIiwiaXNOYU4iLCJCaWdJbnQiLCJwYXJzZUZsb2F0IiwiZ2V0VGltZSIsInByb3BOYW1lIiwianNvblN0ciIsImNvbnZlcnRKc0xpdGVyYWxUb0pzb24iLCJ0cmltbWVkIiwiaW5wdXQiLCJ3aXRoRG91YmxlUXVvdGVzIiwiXyIsImNvbnRlbnQiLCJTb25hbXUiLCJyZXF1aXJlIiwic2VjcmV0IiwiYW50aHJvcGljX2FwaV9rZXkiLCJwcm9jZXNzIiwiZW52IiwiQU5USFJPUElDX0FQSV9LRVkiLCJiYXNlRm9ybWF0IiwiZ2V0U2NhbGFyRm9ybWF0IiwiYmFzZUV4YW1wbGUiLCJnZXRTY2FsYXJFeGFtcGxlIiwiaXNLb3JlYW4iLCJnZXRMTE1DYWNoZVN0YXRzIiwiZW5hYmxlZCIsImNsZWFyTExNQ2FjaGUiLCJjbGVhciIsIlNldCIsImdlbmVyYXRlQmF0Y2giLCJzcGVjcyIsImdlbmVyYXRlZEZpeHR1cmVzIiwic3BlYyIsImkiLCJkYXRhIiwicmVzdWx0cyIsImltcG9ydEZyb21Tb3VyY2UiLCJibHVlIiwicmVsYXRlZEVudGl0eU5hbWUiLCJyZWxhdGVkUmVjb3JkcyIsInJlbGF0ZWRFbnRpdHkiXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLFdBQVcsUUFBUTtBQUsxQixTQUFTQywwQkFBMEIsRUFBRUMsc0JBQXNCLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFDcEcsU0FBU0MsTUFBTSxRQUFRLHlCQUFzQjtBQUM3QyxTQUNFQyxZQUFZLFFBR1AscUJBQWtCO0FBQ3pCLFNBQTZCQyxhQUFhLFFBQVEsc0JBQW1CO0FBQ3JF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
@@ -1 +1 @@
1
- {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAIxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CACX;IAEZ,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAyCV;;;OAGG;YACW,cAAc;IAmC5B,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAmFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAwF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA4MjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAsFvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAiFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}
1
+ {"version":3,"file":"fixture-manager.d.ts","sourceRoot":"","sources":["../../src/testing/fixture-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAIL,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAS1B,MAAM,gBAAgB,CAAC;AAIxB,sCAAsC;AACtC,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE;QACR,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IAED,OAAO,CAAC,IAAI,CAAqB;IACjC,IAAI,GAAG,CAAC,GAAG,EAAE,IAAI,EAEhB;IACD,IAAI,GAAG,IAAI,IAAI,CAKd;IACD,gBAAgB,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAEzC,OAAO,CAAC,aAAa,CAAuB;IAG5C,OAAO,CAAC,OAAO,CAAsC;IACrD,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,eAAe,CACX;IAEZ,IAAI;IAuBJ;;;MAGE;IACI,IAAI;IAyCV;;;OAGG;YACW,cAAc;IAyC5B,OAAO,CAAC,cAAc,CAAqB;IACrC,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE;IAoB7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAyEhF,OAAO;IAYP,WAAW,CACf,YAAY,EAAE,MAAM,cAAc,EAClC,YAAY,EAAE,MAAM,cAAc,EAClC,aAAa,EAAE,oBAAoB,EACnC,cAAc,CAAC,EAAE,qBAAqB;IAmFlC,mBAAmB,CACvB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE;QACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;QACpB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;KACjD,EACD,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,GAAG,CAAC,EAAE,IAAI,CAAC;KACZ,GACA,OAAO,CAAC,aAAa,EAAE,CAAC;IAwF3B;;;;;;;;;OASG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,cAAc,EAC5B,SAAS,EAAE,aAAa,EAAE,GACzB,OAAO,CAAC,mBAAmB,EAAE,CAAC;IA6NjC;;;OAGG;IACH,OAAO,CAAC,eAAe;IAsFvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;YAqBZ,0BAA0B;IAiFxC;;;;;;;;;OASG;IACH,OAAO,CAAC,oBAAoB;YA+Dd,oBAAoB;YA6CpB,uBAAuB;IA8B/B,gBAAgB,CAAC,IAAI,EAAE,MAAM;CAepC;AAED,eAAO,MAAM,cAAc,qBAA4B,CAAC"}