@cartanova/qgrid-cli 2.5.6 → 2.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.ko.md +2 -3
  2. package/README.md +2 -3
  3. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +7 -7
  4. package/bundle/dist/application/qgrid/qgrid.frame.js +1 -8
  5. package/bundle/dist/application/qgrid/qgrid.types.js +2 -15
  6. package/bundle/dist/application/qgrid/tool-emulation-schema.js +39 -19
  7. package/bundle/dist/application/qgrid/tool-emulation.js +31 -44
  8. package/bundle/dist/utils/providers/openai/codex-worker.js +30 -16
  9. package/bundle/dist/utils/providers/openai/openai-worker-pool-config.js +2 -3
  10. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +22 -8
  11. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +8 -8
  12. package/bundle/src/application/qgrid/qgrid.frame.test.ts +2 -17
  13. package/bundle/src/application/qgrid/qgrid.frame.ts +0 -10
  14. package/bundle/src/application/qgrid/qgrid.types.ts +23 -45
  15. package/bundle/src/application/qgrid/tool-emulation-schema.test.ts +35 -15
  16. package/bundle/src/application/qgrid/tool-emulation-schema.ts +49 -32
  17. package/bundle/src/application/qgrid/tool-emulation.test.ts +92 -144
  18. package/bundle/src/application/qgrid/tool-emulation.ts +64 -76
  19. package/bundle/src/utils/providers/openai/codex-worker.test.ts +180 -0
  20. package/bundle/src/utils/providers/openai/codex-worker.ts +50 -18
  21. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +13 -4
  22. package/bundle/src/utils/providers/openai/openai-worker-pool-config.ts +1 -7
  23. package/bundle/web-dist/client/assets/index-B-cZKEyf.css +1 -0
  24. package/bundle/web-dist/client/assets/{index-DYwq7a0y.js → index-oLaOO8wP.js} +3 -3
  25. package/bundle/web-dist/client/assets/{logs-BRpHY7bH.js → logs-D8U3hI1f.js} +1 -1
  26. package/bundle/web-dist/client/assets/{monit-BBnFUnAg.js → monit-NKS90qFj.js} +1 -1
  27. package/bundle/web-dist/client/assets/{routes-DJDlOo-P.js → routes-BuxVmofi.js} +1 -1
  28. package/bundle/web-dist/client/assets/{show-Dn-exALi.js → show-C8Qv9_Ww.js} +1 -1
  29. package/bundle/web-dist/client/assets/{tokens-DaMfQeAo.js → tokens-ChWIXTeL.js} +1 -1
  30. package/bundle/web-dist/client/index.html +2 -2
  31. package/bundle/web-dist/server/entry-server.generated.js +1 -1
  32. package/package.json +1 -1
  33. package/skills/qgrid/SKILL.md +1 -1
  34. package/skills/qgrid/references/ai-sdk-provider-contract.md +1 -1
  35. package/skills/qgrid/references/cli-env-and-server-boot.md +2 -3
  36. package/skills/qgrid/references/decision-rationale.md +5 -4
  37. package/skills/qgrid/references/openai-codex-runtime.md +8 -3
  38. package/skills/qgrid/references/provider-runtime-differences.md +1 -1
  39. package/skills/qgrid/references/repo-map.md +1 -1
  40. package/skills/qgrid/references/request-log-run-lifecycle.md +1 -1
  41. package/skills/qgrid/references/tool-calling-and-multiturn.md +44 -26
  42. package/skills/qgrid/references/verification-and-debugging.md +2 -2
  43. package/bundle/web-dist/client/assets/index-yZcjDoV0.css +0 -1
package/README.ko.md CHANGED
@@ -97,9 +97,8 @@ CLI는 실행 시 npm의 최신 버전을 확인하고 patch를 포함해 설치
97
97
  |------|------|--------|
98
98
  | `NODE_ENV` | Sonamu 실행 프로필. 원격 비프로덕션 배포에는 `staging` 사용 | `production` |
99
99
  | `QGRID_OPENAI_AUTOSCALE` | OpenAI worker autoscaling. `false` 또는 `0`이면 고정 크기 pool 사용 | 활성 |
100
- | `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최소 worker 수 | `5` |
101
- | `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최대 worker 수 | `15` |
102
- | `QGRID_WORKERS_PER_TOKEN` | OpenAI 최소/고정 worker 수의 legacy fallback | `5` |
100
+ | `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최소 worker 수 | `1` |
101
+ | `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | autoscaling 중 OpenAI 토큰당 최대 worker 수 | `3` |
103
102
  | `QGRID_PUBLIC_BASE_URL` | Anthropic OAuth callback 공개 베이스 URL. 원격 접속 환경에서 설정 | 미설정 시 `http://localhost:<port>/callback` |
104
103
  | `QGRID_OPENAI_THREAD_REUSE` | `false`로 설정 시 OpenAI thread reuse(prompt cache) 비활성화 | 활성 |
105
104
 
package/README.md CHANGED
@@ -98,9 +98,8 @@ Server behavior variables:
98
98
  |------|------|--------|
99
99
  | `NODE_ENV` | Sonamu runtime profile. Set `staging` for a remote non-production deployment | `production` |
100
100
  | `QGRID_OPENAI_AUTOSCALE` | OpenAI worker autoscaling. Set to `false` or `0` to keep a fixed-size pool | enabled |
101
- | `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | Minimum OpenAI workers per token while autoscaling | `5` |
102
- | `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | Maximum OpenAI workers per token while autoscaling | `15` |
103
- | `QGRID_WORKERS_PER_TOKEN` | Legacy fallback for the OpenAI minimum/fixed worker count | `5` |
101
+ | `QGRID_OPENAI_MIN_WORKERS_PER_TOKEN` | Minimum OpenAI workers per token while autoscaling | `1` |
102
+ | `QGRID_OPENAI_MAX_WORKERS_PER_TOKEN` | Maximum OpenAI workers per token while autoscaling | `3` |
104
103
  | `QGRID_PUBLIC_BASE_URL` | Public base URL for the Anthropic OAuth callback. Set it when the server is accessed remotely | `http://localhost:<port>/callback` when unset |
105
104
  | `QGRID_OPENAI_THREAD_REUSE` | Set to `false` to disable OpenAI thread reuse (prompt caching) | enabled |
106
105
 
@@ -36,7 +36,7 @@ var QgridDispatcherClass = class {
36
36
  async query(input, abortSignal) {
37
37
  const route = parseProviderRoute(input.model);
38
38
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
39
- const answerMode = input.jsonSchema ? "structured" : "legacy";
39
+ const answerKind = input.jsonSchema ? "json" : "text";
40
40
  if (route.provider === "openai") {
41
41
  if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
42
42
  const decision = decideConvRouting(input);
@@ -60,7 +60,7 @@ var QgridDispatcherClass = class {
60
60
  return applyToolCallEmulation(toEmulationResult(result), input.tools, {
61
61
  threadCoord: coord,
62
62
  images: result.images,
63
- answerMode
63
+ answerKind
64
64
  });
65
65
  } else if (route.provider === "anthropic") {
66
66
  if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
@@ -79,7 +79,7 @@ var QgridDispatcherClass = class {
79
79
  });
80
80
  return applyToolCallEmulation(toEmulationResult(result), input.tools, {
81
81
  threadCoord: issueConvContext(result.threadCoord, decision),
82
- answerMode
82
+ answerKind
83
83
  });
84
84
  }
85
85
  throw directLlmApiFallbackNotImplemented(input);
@@ -87,7 +87,7 @@ var QgridDispatcherClass = class {
87
87
  async queryStream(input, cb, abortSignal) {
88
88
  const route = parseProviderRoute(input.model);
89
89
  const outputSchema = buildAndValidateStrictOutputSchema(input, route.provider);
90
- const answerMode = input.jsonSchema ? "structured" : "legacy";
90
+ const answerKind = input.jsonSchema ? "json" : "text";
91
91
  if (route.provider === "openai") {
92
92
  if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
93
93
  const decision = decideConvRouting(input);
@@ -113,7 +113,7 @@ var QgridDispatcherClass = class {
113
113
  onComplete: (turnResult) => {
114
114
  cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
115
115
  threadCoord: issueConvContext(turnResult.threadCoord, decision),
116
- answerMode
116
+ answerKind
117
117
  }));
118
118
  },
119
119
  onError: cb.onError
@@ -140,7 +140,7 @@ var QgridDispatcherClass = class {
140
140
  const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
141
141
  cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, {
142
142
  threadCoord: issuedCoord,
143
- answerMode
143
+ answerKind
144
144
  }));
145
145
  },
146
146
  onError: cb.onError
@@ -208,4 +208,4 @@ const QgridDispatcher = new QgridDispatcherClass();
208
208
  //#endregion
209
209
  export { QgridDispatcher, QgridDispatcherClass, buildAndValidateStrictOutputSchema, buildStrictOutputSchema };
210
210
 
211
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzLFxuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBUb2tlblN0YXRzIHNoYXBlIOuztOyhtOyaqS4g7Iuk7KCcIHByb3ZpZGVyIOyalOyyrSDsubTsmrTtjIXsnYAg6rCBIGRpc3BhdGNoZXIg66GcIOydtOuPme2WiOuLpC5cbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIHRvb2xzK2pzb25TY2hlbWEg7ZWp7ISxIOyLnCBzdHJ1Y3R1cmVkIGVudmVsb3BlIOuUlOy9lOuNlOulvCDsk7Tri6QuIDTqsJwg67Cp7LacIOyngOygkOydtCDqs7XsnKDtlZjripQg64uo7J28IO2MkOyglS5cbiAgICBjb25zdCBhbnN3ZXJNb2RlID0gaW5wdXQuanNvblNjaGVtYSA/IChcInN0cnVjdHVyZWRcIiBhcyBjb25zdCkgOiAoXCJsZWdhY3lcIiBhcyBjb25zdCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyTW9kZSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyTW9kZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyB0b29scytqc29uU2NoZW1hIO2VqeyEsSDsi5wgc3RydWN0dXJlZCBlbnZlbG9wZSDrlJTsvZTrjZTrpbwg7JO064ukLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17Jyg7ZWY64qUIOuLqOydvCDtjJDsoJUuXG4gICAgY29uc3QgYW5zd2VyTW9kZSA9IGlucHV0Lmpzb25TY2hlbWEgPyAoXCJzdHJ1Y3R1cmVkXCIgYXMgY29uc3QpIDogKFwibGVnYWN5XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgLy8g7J2066+47KeAIO2UjOuemOq3uOulvCDsoITri6ztlbTslbwgZ2VuZXJhdGVTdHJlYW0g7J2YIG5vbi1zdHJlYW0g7KCE7JqpIOqxsOu2gChSMinqsIAg67Cc64+Z7ZWc64ukLlxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25UdXJuSWQ6IGNiLm9uVHVybklkLFxuICAgICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgcHJvdmlkZXIg6rCAIOykgCDqsJLsnYQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IOqzte2GtSBjb3N0IO2VqOyImOulvCDsk7Tri6QuXG5mdW5jdGlvbiB0b0VtdWxhdGlvblJlc3VsdChcbiAgcmVzdWx0OiBHZW5lcmF0ZVJlc3VsdCxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7RUFDNUIsT0FBTyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7Q0FDekM7Q0FHQSxZQUFZLElBQVksS0FBeUI7RUFDL0MsS0FBSyxPQUFPLElBQUksSUFBSSxHQUFHO0NBQ3pCO0NBRUEsWUFBWSxJQUFrQjtFQUM1QixLQUFLLE9BQU8sT0FBTyxFQUFFO0NBQ3ZCO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7RUFDdkIsT0FBTyxDQUFDLEdBQUcsS0FBSyxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPO0dBQzNDLE9BQU8sVUFBVSxlQUFlLEVBQUUsV0FBVyxDQUFDO0dBQzlDLE1BQU0sRUFBRTtHQUNSLFVBQVUsRUFBRTtHQUNaLFVBQVUsS0FBSyxRQUFRLEVBQUUsSUFBSTtFQUMvQixFQUFFO0NBQ0o7Q0FFQSxNQUFNLE1BQU0sT0FBbUIsYUFBaUQ7RUFDOUUsTUFBTSxRQUFRLG1CQUFtQixNQUFNLEtBQUs7RUFDNUMsTUFBTSxlQUFlLG1DQUFtQyxPQUFPLE1BQU0sUUFBUTtFQUU3RSxNQUFNLGFBQWEsTUFBTSxhQUFjLGVBQTBCO0VBR2pFLElBQUksTUFBTSxhQUFhLFVBQVU7R0FDL0IsSUFBSSxDQUFDLEtBQUssa0JBQWtCLE1BQU0sSUFBSSxXQUFXLG1DQUFtQztHQUVwRixNQUFNLFdBQVcsa0JBQWtCLEtBQUs7R0FDeEMsTUFBTSxTQUFTLE1BQU0sS0FBSyxpQkFBaUIsU0FBUztJQUNsRCxPQUFPLE1BQU07SUFDYixjQUFjLE1BQU07SUFDcEI7SUFDQSxRQUFRLE1BQU07SUFDZCxXQUFXLE1BQU07SUFDakIsa0JBQWtCLE1BQU07SUFDeEIsYUFBYSxNQUFNO0lBQ25CLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdEIsT0FBTyxTQUFTO0lBQ2hCLFlBQVksU0FBUztJQUNyQjtJQUNBLGlCQUFpQixNQUFNO0lBQ3ZCLHdCQUF3QixNQUFNO0dBQ2hDLENBQUM7R0FJRCxNQUFNLFFBQVEsTUFBTSxrQkFDaEIsU0FDQSxpQkFBaUIsT0FBTyxhQUFhLFFBQVE7R0FFakQsT0FBTyx1QkFBdUIsa0JBQWtCLE1BQU0sR0FBRyxNQUFNLE9BQU87SUFDcEUsYUFBYTtJQUNiLFFBQVEsT0FBTztJQUNmO0dBQ0YsQ0FBQztFQUNILE9BQU8sSUFBSSxNQUFNLGFBQWEsYUFBYTtHQUN6QyxJQUFJLENBQUMsS0FBSyxxQkFBcUIsTUFBTSxJQUFJLFdBQVcsc0NBQXNDO0dBRTFGLE1BQU0sV0FBVyxrQkFBa0IsS0FBSztHQUN4QyxNQUFNLFNBQVMsTUFBTSxLQUFLLG9CQUFvQixTQUFTO0lBRXJELE9BQU8sTUFBTTtJQUNiLGNBQWMsTUFBTTtJQUNwQjtJQUNBLFFBQVEsTUFBTTtJQUNkLFdBQVcsTUFBTTtJQUNqQjtJQUNBLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdEIsaUJBQWlCLE1BQU07SUFDdkIsd0JBQXdCLE1BQU07R0FDaEMsQ0FBQztHQUVELE9BQU8sdUJBQXVCLGtCQUFrQixNQUFNLEdBQUcsTUFBTSxPQUFPO0lBQ3BFLGFBQWEsaUJBQWlCLE9BQU8sYUFBYSxRQUFRO0lBQzFEO0dBQ0YsQ0FBQztFQUNIO0VBRUEsTUFBTSxtQ0FBbUMsS0FBSztDQUNoRDtDQUVBLE1BQU0sWUFDSixPQUNBLElBQ0EsYUFDZTtFQUNmLE1BQU0sUUFBUSxtQkFBbUIsTUFBTSxLQUFLO0VBQzVDLE1BQU0sZUFBZSxtQ0FBbUMsT0FBTyxNQUFNLFFBQVE7RUFFN0UsTUFBTSxhQUFhLE1BQU0sYUFBYyxlQUEwQjtFQUVqRSxJQUFJLE1BQU0sYUFBYSxVQUFVO0dBQy9CLElBQUksQ0FBQyxLQUFLLGtCQUFrQixNQUFNLElBQUksV0FBVyxtQ0FBbUM7R0FFcEYsTUFBTSxXQUFXLGtCQUFrQixLQUFLO0dBQ3hDLE1BQU0sS0FBSyxpQkFBaUIsZUFDMUI7SUFDRSxPQUFPLE1BQU07SUFDYixjQUFjLE1BQU07SUFDcEI7SUFDQSxRQUFRLE1BQU07SUFDZCxXQUFXLE1BQU07SUFDakIsa0JBQWtCLE1BQU07SUFDeEIsYUFBYSxNQUFNO0lBQ25CLFdBQVcsU0FBUztJQUNwQixhQUFhLFNBQVM7SUFDdEIsT0FBTyxTQUFTO0lBQ2hCLFlBQVksU0FBUztJQUNyQjtJQUVBLGlCQUFpQixNQUFNO0lBQ3ZCLHdCQUF3QixNQUFNO0dBQ2hDLEdBQ0E7SUFDRSxTQUFTLEdBQUc7SUFDWixZQUFZLEdBQUc7SUFDZixVQUFVLEdBQUc7SUFDYixhQUFhLGVBQWU7S0FDMUIsR0FBRyxXQUNELHVCQUF1QixrQkFBa0IsVUFBVSxHQUFHLE1BQU0sT0FBTztNQUNqRSxhQUFhLGlCQUFpQixXQUFXLGFBQWEsUUFBUTtNQUM5RDtLQUNGLENBQUMsQ0FDSDtJQUNGO0lBQ0EsU0FBUyxHQUFHO0dBQ2QsQ0FDRjtHQUNBO0VBQ0YsT0FBTyxJQUFJLE1BQU0sYUFBYSxhQUFhO0dBQ3pDLElBQUksQ0FBQyxLQUFLLHFCQUFxQixNQUFNLElBQUksV0FBVyxzQ0FBc0M7R0FFMUYsTUFBTSxXQUFXLGtCQUFrQixLQUFLO0dBQ3hDLE1BQU0sS0FBSyxvQkFBb0IsZUFDN0I7SUFDRSxPQUFPLE1BQU07SUFDYixjQUFjLE1BQU07SUFDcEI7SUFDQSxRQUFRLE1BQU07SUFDZCxXQUFXLFNBQVM7SUFDcEIsYUFBYSxTQUFTO0lBQ3RCLFdBQVcsTUFBTTtJQUNqQjtJQUNBLGlCQUFpQixNQUFNO0lBQ3ZCLHdCQUF3QixNQUFNO0dBQ2hDLEdBQ0E7SUFDRSxTQUFTLEdBQUc7SUFDWixZQUFZLEdBQUc7SUFDZixhQUFhLGVBQWU7S0FDMUIsTUFBTSxjQUFjLGlCQUFpQixXQUFXLGFBQWEsUUFBUTtLQUNyRSxHQUFHLFdBQ0QsdUJBQXVCLGtCQUFrQixVQUFVLEdBQUcsTUFBTSxPQUFPO01BQ2pFLGFBQWE7TUFDYjtLQUNGLENBQUMsQ0FDSDtJQUNGO0lBQ0EsU0FBUyxHQUFHO0dBQ2QsQ0FDRjtHQUNBO0VBQ0Y7RUFFQSxNQUFNLG1DQUFtQyxLQUFLO0NBQ2hEO0FBQ0Y7QUFFQSxTQUFTLG1CQUFtQixPQUFpRTtDQUMzRixJQUFJLENBQUMsT0FBTyxTQUFTLEdBQUcsR0FDdEIsT0FBTyxFQUFFLE9BQU8sU0FBUyxHQUFHO0NBRzlCLE1BQU0sQ0FBQyxVQUFVLGVBQWUsTUFBTSxNQUFNLEtBQUssQ0FBQztDQUNsRCxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsTUFBTSxJQUFJLGFBQWEsZUFBZTtDQUNyRSxPQUFPO0VBQUU7RUFBVSxPQUFPO0NBQVk7QUFDeEM7QUFHQSxTQUFTLG1DQUFtQyxPQUFpQztDQUMzRSxPQUFPLElBQUksYUFDVCxzREFBc0QsTUFBTSxTQUFTLGFBQ3ZFO0FBQ0Y7QUFRQSxTQUFnQix3QkFDZCxPQUNBLFVBQ3VCO0NBQ3ZCLE1BQU0sZUFBZSxxQkFBcUIsS0FBSztDQUUvQyxPQUFPLGVBQ0YsVUFBVSxjQUFpRCxFQUFFLFNBQVMsQ0FBQyxJQUN4RTtBQUNOO0FBRUEsU0FBZ0IsbUNBQ2QsT0FDQSxXQUFXLG1CQUFtQixNQUFNLEtBQUssQ0FBQyxDQUFDLFVBQ3BCO0NBQ3ZCLE1BQU0sZUFBZSx3QkFBd0IsT0FBTyxRQUFRO0NBQzVELG1DQUFtQyxjQUFjLFFBQVE7Q0FDekQsT0FBTztBQUNUO0FBRUEsU0FBUyxxQkFDUCxPQUN1QjtDQUN2QixNQUFNLHFCQUFxQiw4QkFBOEIsS0FBSztDQUU5RCxPQUFPLE1BQU0sT0FBTyxTQUNoQixvQkFBb0IsTUFBTSxPQUFPLGtCQUFrQixJQUNuRDtBQUNOO0FBTUEsU0FBUyxrQkFDUCxRQUM4RDtDQUM5RCxNQUFNLGtCQUFrQixPQUFPLFlBQVksVUFBYSxPQUFPLFVBQVU7Q0FDekUsT0FBTztFQUNMLE1BQU0sT0FBTztFQUNiLFdBQVcsT0FBTztFQUNsQixPQUFPLE9BQU87RUFDZCxnQkFBZ0IsT0FBTztFQUN2QixnQkFBZ0IsT0FBTztFQUN2QixPQUFPO0dBQ0wsY0FBYyxPQUFPLE1BQU07R0FDM0IsZUFBZSxPQUFPLE1BQU07R0FDNUIsNkJBQTZCLE9BQU8sTUFBTSw0QkFBNEI7R0FDdEUsZ0NBQWdDLE9BQU8sTUFBTTtHQUM3QyxnQ0FBZ0MsT0FBTyxNQUFNO0dBQzdDLHlCQUF5QixPQUFPLE1BQU07RUFDeEM7RUFDQSxZQUFZLE9BQU87RUFDbkIsUUFBUSxPQUFPLFVBQVU7RUFDekIsU0FBUyxrQkFDTCxPQUFPLFVBQ1AsaUJBQWlCLE9BQU8sT0FBTztHQUM3QixhQUFhLE9BQU8sTUFBTTtHQUMxQixjQUFjLE9BQU8sTUFBTTtHQUMzQixtQkFBbUIsT0FBTyxNQUFNO0dBQ2hDLDBCQUEwQixPQUFPLE1BQU0sNEJBQTRCO0dBQ25FLDRCQUE0QixPQUFPLE1BQU07R0FDekMsNEJBQTRCLE9BQU8sTUFBTTtFQUMzQyxDQUFDO0VBQ0wsWUFBWSxrQkFBa0IsYUFBYTtDQUM3QztBQUNGO0FBRUEsTUFBYSxrQkFBa0IsSUFBSSxxQkFBcUIifQ==
211
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7XG4gIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzLFxuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hLFxufSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9zY2hlbWEtdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgc3RyaWN0aWZ5IH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc3RyaWN0aWZpZXJcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyB0eXBlIFRva2VuU3Vic2V0QSB9IGZyb20gXCIuLi9zb25hbXUuZ2VuZXJhdGVkXCI7XG5pbXBvcnQgeyBkZWNpZGVDb252Um91dGluZywgaXNzdWVDb252Q29udGV4dCB9IGZyb20gXCIuL2NvbnYtcm91dGluZ1wiO1xuaW1wb3J0IHsgdHlwZSBRdWVyeUlucHV0LCB0eXBlIFF1ZXJ5T3V0cHV0LCB0eXBlIFRva2VuU3RhdHMgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgbWFza1Rva2VuLCBQcm9jZXNzRXJyb3IsIFF1b3RhRXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcbmltcG9ydCB7IGJ1aWxkVG9vbENhbGxTY2hlbWEgfSBmcm9tIFwiLi90b29sLWVtdWxhdGlvbi1zY2hlbWFcIjtcblxuZXhwb3J0IGNsYXNzIFFncmlkRGlzcGF0Y2hlckNsYXNzIHtcbiAgdG9rZW5zID0gbmV3IE1hcDxudW1iZXIsIFRva2VuU3Vic2V0QT4oKTtcblxuICAvLyBUb2tlblN0YXRzIHNoYXBlIOuztOyhtOyaqS4g7Iuk7KCcIHByb3ZpZGVyIOyalOyyrSDsubTsmrTtjIXsnYAg6rCBIGRpc3BhdGNoZXIg66GcIOydtOuPme2WiOuLpC5cbiAgcmVxdWVzdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICBjb25zdCByb3V0ZSA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCk7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcm91dGUucHJvdmlkZXIpO1xuICAgIC8vIGFuc3dlciDsnbjsvZTrlKkg7YyQ7KCVOiBqc29uU2NoZW1hIOyeiOycvOuptCDsgqzsmqnsnpAg7Iqk7YKk66eIIEpTT04sIOyXhuycvOuptCDtj4nrrLggc3RyaW5nLiA06rCcIOuwqey2nCDsp4DsoJDsnbQg6rO17JygLlxuICAgIGNvbnN0IGFuc3dlcktpbmQgPSBpbnB1dC5qc29uU2NoZW1hID8gKFwianNvblwiIGFzIGNvbnN0KSA6IChcInRleHRcIiBhcyBjb25zdCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIHZlcmJvc2l0eTogaW5wdXQudmVyYm9zaXR5LFxuICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICBpbWFnZUdlbmVyYXRpb25PcHRpb25zOiBpbnB1dC5pbWFnZUdlbmVyYXRpb25PcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIOydtOuvuOyngCDsmpTssq3snYAgY29sZC1vbmx5KFI4KeudvCDsnqzsgqzsmqkg7KKM7ZGc66W8IOuwnOq4ie2VmOyngCDslYrripTri6QuIOyijO2RnOulvCDsi6TsnLzrqbRcbiAgICAgIC8vIHNlc3Npb25LZXkg7IaM67mE7J6Q7J2YIHdhcm0g7KKM7ZGc66W8IOyjveydgCDsooztkZzroZwg642u7Ja07I2oIOuLpOydjCDthY3siqTtirggdHVybiDsnbQgY29sZCDroZwg65ao7Ja07KeE64ukLlxuICAgICAgY29uc3QgY29vcmQgPSBpbnB1dC5pbWFnZUdlbmVyYXRpb25cbiAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgOiBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogY29vcmQsXG4gICAgICAgIGltYWdlczogcmVzdWx0LmltYWdlcyxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAocm91dGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIGlmICghdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIkFudGhyb3BpYyBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOuCtOu2gOyXkOyEnCDslYzslYTshJwgcHJvdmlkZXIgcHJlZml4IOulvCBjYW5vbmljYWwgbW9kZWwg66GcIOygleq3nO2ZlO2VqFxuICAgICAgICBtb2RlbDogaW5wdXQubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB0aW1lb3V0TXM6IGlucHV0LnRpbWVvdXQsXG4gICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICBpbWFnZUdlbmVyYXRpb246IGlucHV0LmltYWdlR2VuZXJhdGlvbixcbiAgICAgICAgaW1hZ2VHZW5lcmF0aW9uT3B0aW9uczogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucyxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICB0aHJlYWRDb29yZDogaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgYW5zd2VyS2luZCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQsIHJvdXRlLnByb3ZpZGVyKTtcbiAgICAvLyBhbnN3ZXIg7J247L2U65SpIO2MkOyglToganNvblNjaGVtYSDsnojsnLzrqbQg7IKs7Jqp7J6QIOyKpO2CpOuniCBKU09OLCDsl4bsnLzrqbQg7Y+J66y4IHN0cmluZy4gNOqwnCDrsKnstpwg7KeA7KCQ7J20IOqzteycoC5cbiAgICBjb25zdCBhbnN3ZXJLaW5kID0gaW5wdXQuanNvblNjaGVtYSA/IChcImpzb25cIiBhcyBjb25zdCkgOiAoXCJ0ZXh0XCIgYXMgY29uc3QpO1xuXG4gICAgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIXRoaXMub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJPcGVuQUkgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5vcGVuYWlEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IHJvdXRlLm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgICAgLy8g7J2066+47KeAIO2UjOuemOq3uOulvCDsoITri6ztlbTslbwgZ2VuZXJhdGVTdHJlYW0g7J2YIG5vbi1zdHJlYW0g7KCE7JqpIOqxsOu2gChSMinqsIAg67Cc64+Z7ZWc64ukLlxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25UdXJuSWQ6IGNiLm9uVHVybklkLFxuICAgICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgdGltZW91dE1zOiBpbnB1dC50aW1lb3V0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogaW5wdXQuaW1hZ2VHZW5lcmF0aW9uLFxuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbk9wdGlvbnM6IGlucHV0LmltYWdlR2VuZXJhdGlvbk9wdGlvbnMsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywge1xuICAgICAgICAgICAgICAgIHRocmVhZENvb3JkOiBpc3N1ZWRDb29yZCxcbiAgICAgICAgICAgICAgICBhbnN3ZXJLaW5kLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBkaXJlY3RMbG1BcGlGYWxsYmFja05vdEltcGxlbWVudGVkKGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBwYXJzZVByb3ZpZGVyUm91dGUobW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHsgcHJvdmlkZXI/OiBzdHJpbmc7IG1vZGVsOiBzdHJpbmcgfSB7XG4gIGlmICghbW9kZWw/LmluY2x1ZGVzKFwiL1wiKSkge1xuICAgIHJldHVybiB7IG1vZGVsOiBtb2RlbCA/PyBcIlwiIH07XG4gIH1cblxuICBjb25zdCBbcHJvdmlkZXIsIHJvdXRlZE1vZGVsXSA9IG1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgaWYgKCFwcm92aWRlciB8fCAhcm91dGVkTW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICByZXR1cm4geyBwcm92aWRlciwgbW9kZWw6IHJvdXRlZE1vZGVsIH07XG59XG5cbi8vIHFncmlkIHByb3ZpZGVyIGRpc3BhdGNoZXIg7JeQ7IScIOyymOumrO2VmOyngCDslYrripQg66qo64247J2AIO2Wpe2bhCDsp4HsoJEgTExNIEFQSSDtmLjstpwg7KeA7KCQ7Jy866GcIOuztOuCuOuLpC5cbmZ1bmN0aW9uIGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQ6IFF1ZXJ5SW5wdXQpOiBQcm9jZXNzRXJyb3Ige1xuICByZXR1cm4gbmV3IFByb2Nlc3NFcnJvcihcbiAgICBgRGlyZWN0IExMTSBBUEkgZmFsbGJhY2sgbm90IGltcGxlbWVudGVkIGZvciBtb2RlbDogJHtpbnB1dC5tb2RlbCA/PyBcIjxkZWZhdWx0PlwifWAsXG4gICk7XG59XG5cbi8vIOuqqOuToCBwcm92aWRlcihPcGVuQUkvQW50aHJvcGljKeqwgCDrj5nsnbztlZjqsowgc3RyaWN0IG91dHB1dCBzY2hlbWEg66W8IOyTtOuLpC5cbi8vXG4vLyBTT04tNDk1IOq1kO2biDog7ZWc65WMIEFudGhyb3BpYyByb3V0ZSDrp4wgcmVxdWlyZWQg66W8IOygnOqxsChvcHRpb25hbGl6ZSntlbQgcGFydGlhbC9yZWplY3RlZCBhdHRlbXB0IOqwgFxuLy8g7ISe7Jes64+EIO2GteqzvO2VmOqyjCDtlojsnLzrgpgsIOyLpOy4oSDqsrDqs7wg6re46rKMIOyYpO2eiOugpCBcIuuqqOuNuOydtCDruYTripQg7ZWE65Oc66W8IO2CpOynuCDsg53rnrVcIu2VmOuPhOuhnSDsnKDrj4Ttlojri6Rcbi8vIChyZXF1aXJlZCDsgrTrprAgc2NoZW1hIOuKlCDriITrnb0gMCwgbG9vc2Ug64qUIOuIhOudvSDri6TrsJwpLiBzdHJpY3Qg66GcIOuRkOuptCDrqqjrjbjsnbQg67mg7KeQ7JeG7J20IOyxhOyasOqzoCxcbi8vIOuTnOusvOqyjCDslrTqsqggcHJvdmlkZXIgcmV0cnkg7JiI7IKw7J2EIOyGjOynhO2VnCDruYTsoJXsg4Eg7KKF66OM64+EIOygleynge2VnCDsl5Drn6zroZwg67Cb7JWE7KSA64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRSYXdPdXRwdXRTY2hlbWEoaW5wdXQpO1xuXG4gIHJldHVybiBvdXRwdXRTY2hlbWFcbiAgICA/IChzdHJpY3RpZnkob3V0cHV0U2NoZW1hIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHN0cmljdGlmeT5bMF0sIHsgcHJvdmlkZXIgfSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJtb2RlbFwiIHwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuICBwcm92aWRlciA9IHBhcnNlUHJvdmlkZXJSb3V0ZShpbnB1dC5tb2RlbCkucHJvdmlkZXIsXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCwgcHJvdmlkZXIpO1xuICBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKG91dHB1dFNjaGVtYSwgcHJvdmlkZXIpO1xuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5mdW5jdGlvbiBidWlsZFJhd091dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2FsbGVyT3V0cHV0U2NoZW1hID0gcGFyc2VBbmRWYWxpZGF0ZUNhbGxlclNjaGVtYXMoaW5wdXQpO1xuXG4gIHJldHVybiBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzLCBjYWxsZXJPdXRwdXRTY2hlbWEpXG4gICAgOiBjYWxsZXJPdXRwdXRTY2hlbWE7XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgcHJvdmlkZXIg6rCAIOykgCDqsJLsnYQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IOqzte2GtSBjb3N0IO2VqOyImOulvCDsk7Tri6QuXG5mdW5jdGlvbiB0b0VtdWxhdGlvblJlc3VsdChcbiAgcmVzdWx0OiBHZW5lcmF0ZVJlc3VsdCxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIGNvbnN0IGhhc1Byb3ZpZGVyQ29zdCA9IHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwO1xuICByZXR1cm4ge1xuICAgIHRleHQ6IHJlc3VsdC50ZXh0LFxuICAgIHRva2VuTmFtZTogcmVzdWx0LnRva2VuTmFtZSxcbiAgICBtb2RlbDogcmVzdWx0Lm1vZGVsLFxuICAgIHJlcXVlc3RlZE1vZGVsOiByZXN1bHQucmVxdWVzdGVkTW9kZWwsXG4gICAgbW9kZWxGYWxsYmFja3M6IHJlc3VsdC5tb2RlbEZhbGxiYWNrcyxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIHR0ZnRNczogcmVzdWx0LnR0ZnRNcyA/PyAwLFxuICAgIGNvc3RVc2Q6IGhhc1Byb3ZpZGVyQ29zdFxuICAgICAgPyByZXN1bHQuY29zdFVzZCFcbiAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICBpbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSksXG4gICAgY29zdFNvdXJjZTogaGFzUHJvdmlkZXJDb3N0ID8gXCJwcm92aWRlclwiIDogXCJwcmljaW5nX3RhYmxlXCIsXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBOEJBLElBQWEsdUJBQWIsTUFBa0M7Q0FDaEMseUJBQVMsSUFBSSxJQUEwQjtDQUd2QyxnQ0FBZ0IsSUFBSSxJQUFvQjtDQUd4QyxhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELFFBQVEsTUFBc0I7RUFDNUIsT0FBTyxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUs7Q0FDekM7Q0FHQSxZQUFZLElBQVksS0FBeUI7RUFDL0MsS0FBSyxPQUFPLElBQUksSUFBSSxHQUFHO0NBQ3pCO0NBRUEsWUFBWSxJQUFrQjtFQUM1QixLQUFLLE9BQU8sT0FBTyxFQUFFO0NBQ3ZCO0NBRUEsYUFBYSxNQUE0QjtFQUN2QyxLQUFLLFNBQVMsSUFBSSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0NBQ2xEO0NBRUEsV0FBeUI7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
@@ -51,10 +51,6 @@ function rejectImageGenerationStream(args) {
51
51
  if (!args.imageGeneration) return;
52
52
  throw new BadRequestException("qgrid: imageGeneration is not supported with streaming; use query/generateText instead.");
53
53
  }
54
- function rejectLegacyLogMode(args) {
55
- if (!Object.hasOwn(args, "logMode")) return;
56
- throw new BadRequestException("qgrid: logMode is no longer supported; use logger: false to disable request logging.");
57
- }
58
54
  function rejectInvalidCallerSchemas(args) {
59
55
  if (args.jsonSchema === void 0 && !args.tools?.length) return;
60
56
  try {
@@ -96,7 +92,6 @@ var QgridFrameClass = class extends BaseFrameClass {
96
92
  super("Qgrid");
97
93
  }
98
94
  async query(args) {
99
- rejectLegacyLogMode(args);
100
95
  rejectInvalidCallerSchemas(args);
101
96
  const disconnect = createHttpDisconnectHandle();
102
97
  try {
@@ -133,7 +128,6 @@ var QgridFrameClass = class extends BaseFrameClass {
133
128
  }
134
129
  }
135
130
  async prepareStream(args) {
136
- rejectLegacyLogMode(args);
137
131
  rejectImageGenerationStream(args);
138
132
  rejectInvalidCallerSchemas(args);
139
133
  const streamId = crypto.randomUUID();
@@ -145,7 +139,6 @@ var QgridFrameClass = class extends BaseFrameClass {
145
139
  const args = pendingStreams.get(streamId);
146
140
  pendingStreams.delete(streamId);
147
141
  if (!args) throw new Error("invalid or expired streamId");
148
- rejectLegacyLogMode(args);
149
142
  rejectImageGenerationStream(args);
150
143
  const sse = Sonamu.getContext().createSSE(StreamEvents);
151
144
  let threadId;
@@ -660,4 +653,4 @@ function convertAnthropicUsage(raw) {
660
653
  //#endregion
661
654
  export { QgridFrame };
662
655
 
663
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNSUNST19VU0QsIFJlcXVlc3RMb2dNb2RlbCB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCwgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgVG9rZW5DcmVkZW50aWFscyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJRdWVyeSxcbiAgYmVmb3JlUXVlcnksXG4gIGZpbmlzaFJ1bkFib3J0ZWQsXG4gIGZpbmlzaFJ1bldpdGhFcnJvcixcbn0gZnJvbSBcIi4vcWdyaWQtcnVuLWxpZmVjeWNsZVwiO1xuaW1wb3J0IHsgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSwgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBRdWVyeUlucHV0LFxuICB0eXBlIEFwcGVuZFN0ZXBJbnB1dCxcbiAgdHlwZSBDcmVhdGVSdW5JbnB1dCxcbiAgdHlwZSBGaW5pc2hSdW5JbnB1dCxcbiAgdHlwZSBIZWFsdGhSZXNwb25zZSxcbiAgdHlwZSBPQXV0aFN0YXJ0UmVzdWx0LFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxuICB0eXBlIFFncmlkUnVuQ29udGV4dCxcbiAgU3RyZWFtRXZlbnRzLFxuICB0eXBlIFRva2VuU3RhdHMsXG4gIHR5cGUgVXNhZ2VSZXNwb25zZSxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJnczogUXVlcnlJbnB1dCk6IHZvaWQge1xuICBpZiAoIU9iamVjdC5oYXNPd24oYXJncywgXCJsb2dNb2RlXCIpKSByZXR1cm47XG4gIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgIFwicWdyaWQ6IGxvZ01vZGUgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZDsgdXNlIGxvZ2dlcjogZmFsc2UgdG8gZGlzYWJsZSByZXF1ZXN0IGxvZ2dpbmcuXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICApO1xufVxuXG5mdW5jdGlvbiByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmIChhcmdzLmpzb25TY2hlbWEgPT09IHVuZGVmaW5lZCAmJiAhYXJncy50b29scz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgdHJ5IHtcbiAgICBidWlsZEFuZFZhbGlkYXRlU3RyaWN0T3V0cHV0U2NoZW1hKGFyZ3MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIHx8XG4gICAgICBlcnJvciBpbnN0YW5jZW9mIFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihlcnJvci5tZXNzYWdlIGFzIExvY2FsaXplZFN0cmluZyk7XG4gICAgfVxuICAgIC8vIOyemOuqu+uQnCBrZXl3b3JkIO2Yle2DnChhbnlPZiDrpbwg6rCd7LK066GcIOuztOuCtOuKlCDrk7Ep64qUIO2MjOydtO2UhOudvOyduOyXkOyEnCB1bnR5cGVkIOyYpOulmOuhnCDrgpjsmKTrr4DroZwsXG4gICAgLy8g7YOA7J6FIOyige2eiOq4sCDrjIDsi6AgRXJyb3Ig7KCE7LK066W8IGNhbGxlci1mYXVsdCA0MDAg7Jy866GcIOunpO2Vke2VnOuLpCjqs4Tslb0g7YWM7Iqk7Yq466GcIOqzoOygleuQqCkuXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBgcWdyaWQ6IGNhbGxlciBzY2hlbWEgY2Fubm90IGJlIG5vcm1hbGl6ZWQ6ICR7ZXJyb3IubWVzc2FnZX1gIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk6IHtcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgZGlzcG9zZTogKCkgPT4gdm9pZDtcbn0ge1xuICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gIGxldCByZXF1ZXN0UmF3OiBGYXN0aWZ5UmVxdWVzdFtcInJhd1wiXSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc3BvbnNlUmF3OiBGYXN0aWZ5UmVwbHlbXCJyYXdcIl0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIHJlcXVlc3RSYXcgPSBjdHgucmVxdWVzdD8ucmF3O1xuICAgIGlmIChjdHgudHJhbnNwb3J0ID09PSBcImh0dHBcIikgcmVzcG9uc2VSYXcgPSBjdHgucmVwbHkucmF3O1xuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3QgZnJhbWUgY2FsbHMgKGZvciBleGFtcGxlIHVuaXQgdGVzdHMpIGRvIG5vdCBoYXZlIGFuIEhUVFAgY29udGV4dC5cbiAgfVxuXG4gIGNvbnN0IGFib3J0ID0gKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIGNvbnN0IGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSA9ICgpID0+IHtcbiAgICBpZiAoIXJlc3BvbnNlUmF3Py53cml0YWJsZUVuZGVkKSBhYm9ydCgpO1xuICB9O1xuXG4gIHJlcXVlc3RSYXc/Lm9uY2UoXCJhYm9ydGVkXCIsIGFib3J0KTtcbiAgcmVzcG9uc2VSYXc/Lm9uY2UoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuXG4gIGlmIChyZXF1ZXN0UmF3Py5hYm9ydGVkIHx8IChyZXNwb25zZVJhdz8uZGVzdHJveWVkICYmICFyZXNwb25zZVJhdy53cml0YWJsZUVuZGVkKSkge1xuICAgIGFib3J0KCk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICByZXF1ZXN0UmF3Py5yZW1vdmVMaXN0ZW5lcihcImFib3J0ZWRcIiwgYWJvcnQpO1xuICAgICAgcmVzcG9uc2VSYXc/LnJlbW92ZUxpc3RlbmVyKFwiY2xvc2VcIiwgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlKTtcbiAgICB9LFxuICB9O1xufVxuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIl0pO1xuY29uc3Qgb2F1dGhMb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvYXV0aFwiXSk7XG5cbmNsYXNzIFFncmlkRnJhbWVDbGFzcyBleHRlbmRzIEJhc2VGcmFtZUNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJRZ3JpZFwiKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBxdWVyeShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJncyk7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgZGlzY29ubmVjdCA9IGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhcmdzLmxvZ2dlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgbGV0IHJlc3VsdDogUXVlcnlPdXRwdXQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9vbC1jYWxsIHJlcXVlc3RMb2dJZOyZgCBwcm92aWRlciB0aHJlYWRDb29yZOuKlCDshJzroZwg64+F66a97KCB7Jy866GcIOycoOyngO2VnOuLpC5cbiAgICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICAgIGNvbnN0IHJ1bkNvbnRleHQgPVxuICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgcXVlcnkgYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm92aWRlciDsnZHri7XsnYAg7ISx6rO17ZaI7Jy866+A66GcIOuhnOq5hSDsnqXslaDqsIAg7IOd7ISxIOqysOqzvOulvCDrja7slrTsk7Dsp4Ag7JWK64qU64ukLlxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNjb25uZWN0LmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIHJlamVjdExlZ2FjeUxvZ01vZGUoYXJncyk7XG4gICAgcmVqZWN0SW1hZ2VHZW5lcmF0aW9uU3RyZWFtKGFyZ3MpO1xuICAgIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3MpO1xuICAgIGNvbnN0IHN0cmVhbUlkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5zZXQoc3RyZWFtSWQsIGFyZ3MpO1xuICAgIGNvbnN0IGV4cGlyeSA9IHNldFRpbWVvdXQoKCkgPT4gcGVuZGluZ1N0cmVhbXMuZGVsZXRlKHN0cmVhbUlkKSwgMzBfMDAwKTtcbiAgICBleHBpcnkudW5yZWY/LigpO1xuICAgIHJldHVybiB7IHN0cmVhbUlkIH07XG4gIH1cblxuICBAc3RyZWFtKHsgdHlwZTogXCJzc2VcIiwgZXZlbnRzOiBTdHJlYW1FdmVudHMgfSlcbiAgYXN5bmMgcXVlcnlTdHJlYW0oc3RyZWFtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFyZ3MgPSBwZW5kaW5nU3RyZWFtcy5nZXQoc3RyZWFtSWQpO1xuICAgIHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCk7XG4gICAgaWYgKCFhcmdzKSB0aHJvdyBuZXcgRXJyb3IoXCJpbnZhbGlkIG9yIGV4cGlyZWQgc3RyZWFtSWRcIik7XG4gICAgcmVqZWN0TGVnYWN5TG9nTW9kZShhcmdzKTtcbiAgICByZWplY3RJbWFnZUdlbmVyYXRpb25TdHJlYW0oYXJncyk7XG5cbiAgICBjb25zdCBjdHggPSBTb25hbXUuZ2V0Q29udGV4dCgpO1xuICAgIGNvbnN0IHNzZSA9IGN0eC5jcmVhdGVTU0UoU3RyZWFtRXZlbnRzKTtcbiAgICBsZXQgdGhyZWFkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgdHVybklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbVJlc3VsdDogUXVlcnlPdXRwdXQgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUVycm9yOiBFcnJvciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgY2xpZW50Q2xvc2VkID0gZmFsc2U7XG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgY29uc3QgaW50ZXJydXB0T3BlbkFJID0gKCkgPT4ge1xuICAgICAgaWYgKHRocmVhZElkICYmIHR1cm5JZCkge1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uaW50ZXJydXB0V29ya2VyVHVybih0aHJlYWRJZCwgdHVybklkKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHNzZS5vbkNsb3NlKCgpID0+IHtcbiAgICAgIGNsaWVudENsb3NlZCA9IHRydWU7XG4gICAgICBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgIH0pO1xuXG4gICAgbGV0IHJ1bkluZm86IHsgcmVxdWVzdExvZ0lkOiBudW1iZXI7IHN0ZXBJbmRleDogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGFyZ3MubG9nZ2VyICE9PSBmYWxzZSkge1xuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghCBydW5uaW5nIHJvdyDsg53shLHsl5Ag7Iuk7Yyo7ZWY66m0IGxvZ2dlZCDsmpTssq3snLzroZwg7KeE7ZaJ7ZWY7KeAIOyViuuKlOuLpC5cbiAgICAgIHJ1bkluZm8gPSBhd2FpdCBiZWZvcmVRdWVyeShhcmdzKTtcbiAgICB9XG5cbiAgICAvLyBiZWZvcmVRdWVyeSBEQiDsnpHsl4Ug7KSRIGNsb3Nl66W8IOuGk+y5mOyngCDslYrqs6AgcHJvdmlkZXIg7Iuk7ZaJIOyghOyXkCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeVN0cmVhbShcbiAgICAgICAgYXJncyxcbiAgICAgICAge1xuICAgICAgICAgIG9uRGVsdGE6ICh0ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkZWx0YVwiLCB7IHRleHQgfSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblRocmVhZElkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHRocmVhZElkID0gaWQ7XG4gICAgICAgICAgICBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiB0dXJuSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvblR1cm5JZDogKGlkKSA9PiB7XG4gICAgICAgICAgICB0dXJuSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHRocmVhZElkKSB7XG4gICAgICAgICAgICAgIGludGVycnVwdE9wZW5BSSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgc3RyZWFtUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25FcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgc3RyZWFtRXJyb3IgPSBlcnI7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RyZWFtRXJyb3IgPSBlIGFzIEVycm9yO1xuICAgIH1cblxuICAgIC8vIHByb3ZpZGVyIOqysOqzvOqwgCDsl4bripQgY2xvc2XripQg7KaJ7IucIGFib3J0ZWTroZwg66eI6rCQ7ZWc64ukLlxuICAgIGlmIChjbGllbnRDbG9zZWQgJiYgIXN0cmVhbVJlc3VsdCkge1xuICAgICAgaWYgKHJ1bkluZm8pIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGRpc3BhdGNoZXIg7JmE66OMIO2bhCBsaWZlY3ljbGUg7LKY66asIChhd2FpdCDslYjsoIQpXG4gICAgaWYgKHN0cmVhbVJlc3VsdCkge1xuICAgICAgLy8gZGlzcGF0Y2hlciDqsIAg7Iuk7J2AIHRocmVhZCDsnqzsgqzsmqkg7KKM7ZGc64qUIGxvZ2dlciDshKTsoJXqs7wg66y06rSA7ZWY6rKMIO2ajOyGoe2VnOuLpC5cbiAgICAgIGNvbnN0IHRocmVhZENvb3JkID0gc3RyZWFtUmVzdWx0LnJ1bkNvbnRleHQ/LnRocmVhZENvb3JkO1xuICAgICAgbGV0IHJ1bkNvbnRleHQ6IFFncmlkUnVuQ29udGV4dCB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRocmVhZENvb3JkICE9PSB1bmRlZmluZWQgPyB7IHRocmVhZENvb3JkIH0gOiB1bmRlZmluZWQ7XG4gICAgICBpZiAocnVuSW5mbykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIGNsb3NlIO2bhCDrj4TssKntlZwg6rKw6rO864+EIHN0ZXAvdXNhZ2XripQg64Ko6riw65CYLCDslYTrnpjsl5DshJwg7LWc7KKFIHN0YXR1c+ulvCBhYm9ydGVk66GcIOuNruyWtOyTtOuLpC5cbiAgICAgICAgICBjb25zdCBsaWZlY3ljbGUgPSBhd2FpdCBhZnRlclF1ZXJ5KFxuICAgICAgICAgICAgcnVuSW5mby5yZXF1ZXN0TG9nSWQsXG4gICAgICAgICAgICBydW5JbmZvLnN0ZXBJbmRleCxcbiAgICAgICAgICAgIGFyZ3MsXG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBydW5Db250ZXh0ID1cbiAgICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICAgID8geyAuLi5saWZlY3ljbGUucnVuQ29udGV4dCwgLi4uKHRocmVhZENvb3JkID8geyB0aHJlYWRDb29yZCB9IDoge30pIH1cbiAgICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAvLyBhZnRlclF1ZXJ56rCAIOynhO2WieuQmOuKlCDsgqzsnbQgY2xpZW506rCAIOuLq+2ejCDqsr3smrAg7JmE66OMIOyDge2DnOulvCBhYm9ydGVk66GcIOuQmOuPjOumsOuLpC5cbiAgICAgICAgICBpZiAoY2xpZW50Q2xvc2VkKSB7XG4gICAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYHN0cmVhbSBhZnRlclF1ZXJ5IGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcblxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZG9uZVwiLCB7IC4uLnN0cmVhbVJlc3VsdCwgcnVuQ29udGV4dCB9KTtcbiAgICB9IGVsc2UgaWYgKHN0cmVhbUVycm9yKSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuV2l0aEVycm9yKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBzdHJlYW1FcnJvci5tZXNzYWdlLCBhcmdzKTtcbiAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImVycm9yXCIsIHsgbWVzc2FnZTogc3RyZWFtRXJyb3IubWVzc2FnZSB9KTtcbiAgICB9IGVsc2UgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgcnVuSW5mbykge1xuICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgfVxuXG4gICAgYXdhaXQgc3NlLmVuZCgpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGNyZWF0ZVJ1bihpbnB1dDogQ3JlYXRlUnVuSW5wdXQpOiBQcm9taXNlPHsgcmVxdWVzdExvZ0lkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHJlcXVlc3RMb2dJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5jcmVhdGVSdW4oe1xuICAgICAgdXNlcl9wcm9tcHQ6IGlucHV0LnVzZXJQcm9tcHQsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICBwcm9qZWN0X25hbWU6IGlucHV0LnByb2plY3ROYW1lLFxuICAgICAgc3lzdGVtX3Byb21wdDogaW5wdXQuc3lzdGVtUHJvbXB0LFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcmVxdWVzdExvZ0lkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYXBwZW5kU3RlcChpbnB1dDogQXBwZW5kU3RlcElucHV0KTogUHJvbWlzZTx7IHN0ZXBJZDogbnVtYmVyIH0+IHtcbiAgICBjb25zdCBzdGVwSWQgPSBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwuYXBwZW5kU3RlcChpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0ZXBfaW5kZXg6IGlucHV0LnN0ZXBJbmRleCxcbiAgICAgIHR5cGU6IGlucHV0LnR5cGUsXG4gICAgICBtb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZTogaW5wdXQucmVxdWVzdGVkTW9kZWxOYW1lLFxuICAgICAgZmFsbGJhY2tfY291bnQ6IGlucHV0LmZhbGxiYWNrQ291bnQsXG4gICAgICBpbnB1dF90b2tlbnM6IGlucHV0LmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LmNhY2hlUmVhZFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQuY2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uMWhUb2tlbnMsXG4gICAgICBjb3N0X3VzZDogaW5wdXQuY29zdFVzZCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogTWF0aC5yb3VuZChpbnB1dC5jb3N0VXNkICogTUlDUk9fVVNEKSxcbiAgICAgIGNvc3Rfc291cmNlOiBpbnB1dC5jb3N0U291cmNlLFxuICAgICAgZHVyYXRpb25fbXM6IGlucHV0LmR1cmF0aW9uTXMsXG4gICAgICB0dGZ0X21zOiBpbnB1dC50dGZ0TXMgPz8gbnVsbCxcbiAgICAgIGZpbmlzaF9yZWFzb246IGlucHV0LmZpbmlzaFJlYXNvbixcbiAgICAgIHJlYXNvbmluZ190ZXh0OiBpbnB1dC5yZWFzb25pbmdUZXh0LFxuICAgICAgcmVhc29uaW5nX3Rva2VuczogaW5wdXQucmVhc29uaW5nVG9rZW5zLFxuICAgICAgdG9vbF9jYWxsX2luZGV4OiBpbnB1dC50b29sQ2FsbEluZGV4LFxuICAgICAgdG9vbF9jYWxsX2lkOiBpbnB1dC50b29sQ2FsbElkLFxuICAgICAgdG9vbF9uYW1lOiBpbnB1dC50b29sTmFtZSxcbiAgICAgIHRvb2xfYXJnczogaW5wdXQudG9vbEFyZ3MsXG4gICAgICB0b29sX3Jlc3VsdDogaW5wdXQudG9vbFJlc3VsdCxcbiAgICAgIHRvb2xfZHVyYXRpb25fbXM6IGlucHV0LnRvb2xEdXJhdGlvbk1zLFxuICAgICAgZXJyb3I6IGlucHV0LmVycm9yLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHN0ZXBJZCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIGZpbmlzaFJ1bihpbnB1dDogRmluaXNoUnVuSW5wdXQpOiBQcm9taXNlPHsgb2s6IGJvb2xlYW4gfT4ge1xuICAgIGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5maW5pc2hSdW4oaW5wdXQucmVxdWVzdExvZ0lkLCB7XG4gICAgICBzdGF0dXM6IGlucHV0LnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlOiBpbnB1dC5yZXNwb25zZSxcbiAgICAgIHRva2VuX25hbWU6IGlucHV0LnRva2VuTmFtZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQudG90YWxJbnB1dFRva2VucyxcbiAgICAgIG91dHB1dF90b2tlbnM6IGlucHV0LnRvdGFsT3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb25Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjVtVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBpbnB1dC50b3RhbENhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQudG90YWxEdXJhdGlvbk1zLFxuICAgICAgaGlzdG9yeTogaW5wdXQuaGlzdG9yeSA/IEpTT04ucGFyc2UoaW5wdXQuaGlzdG9yeSkgOiB1bmRlZmluZWQsXG4gICAgICBlcnJvcl9tZXNzYWdlOiBpbnB1dC5lcnJvck1lc3NhZ2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgb2s6IHRydWUgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHN0YXRzKCk6IFByb21pc2U8VG9rZW5TdGF0c1tdPiB7XG4gICAgcmV0dXJuIFFncmlkRGlzcGF0Y2hlci5nZXRTdGF0cygpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdG90YWxDb3N0KHRva2VuTmFtZT86IHN0cmluZyk6IFByb21pc2U8eyB1c2Q6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIHsgdXNkOiBhd2FpdCBSZXF1ZXN0TG9nTW9kZWwudG90YWxDb3N0KHsgdG9rZW5fbmFtZTogdG9rZW5OYW1lIH0pIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBwcm9qZWN0TmFtZXMoKTogUHJvbWlzZTx7IG5hbWVzOiBzdHJpbmdbXSB9PiB7XG4gICAgcmV0dXJuIHsgbmFtZXM6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5kaXN0aW5jdFByb2plY3ROYW1lcygpIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgYWRkVG9rZW4oXG4gICAgcHJvdmlkZXI6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogVG9rZW5DcmVkZW50aWFscyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8eyBhZGRlZDogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBuYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhZGRlZDogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiXSB9KVxuICBhc3luYyB1cGRhdGVUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU/OiBzdHJpbmcsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodD86IG51bWJlcixcbiAgKTogUHJvbWlzZTx7IHVwZGF0ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGlmIChcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHF1b3RhVGhyZXNob2xkICE9PSBudWxsICYmXG4gICAgICAoIU51bWJlci5pc0ludGVnZXIocXVvdGFUaHJlc2hvbGQpIHx8IHF1b3RhVGhyZXNob2xkIDwgMSB8fCBxdW90YVRocmVzaG9sZCA+IDEwMClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcInF1b3RhVGhyZXNob2xkIG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMCwgb3IgbnVsbFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCAmJiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkpIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFxuICAgICAgICBcIndlaWdodCBtdXN0IGJlIGFuIGludGVnZXIgYmV0d2VlbiAxIGFuZCAxMDBcIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGNoOiBUb2tlblVwZGF0ZUZpZWxkcyA9IHt9O1xuICAgIGlmIChuYW1lICE9PSB1bmRlZmluZWQpIHBhdGNoLm5hbWUgPSBuYW1lO1xuICAgIGlmIChxdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSBwYXRjaC5xdW90YV90aHJlc2hvbGQgPSBxdW90YVRocmVzaG9sZDtcbiAgICBpZiAod2VpZ2h0ICE9PSB1bmRlZmluZWQpIHBhdGNoLndlaWdodCA9IHdlaWdodDtcbiAgICBpZiAoT2JqZWN0LmtleXMocGF0Y2gpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgdXBkYXRlZDogZmFsc2UgfTtcblxuICAgIGNvbnN0IHVwZGF0ZWQgPSBhd2FpdCBUb2tlbk1vZGVsLnVwZGF0ZUZpZWxkcyhpZCwgcGF0Y2gpO1xuICAgIHJldHVybiB7IHVwZGF0ZWQ6IHVwZGF0ZWQgPiAwIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcmVtb3ZlVG9rZW4oaWQ6IG51bWJlcik6IFByb21pc2U8eyByZW1vdmVkOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyByZW1vdmVkOiBmYWxzZSB9O1xuICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKFtlbnRyeS5pZF0pO1xuICAgIHJldHVybiB7IHJlbW92ZWQ6IHRydWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiDthqDtgbAg7Zmc7ISx7ZmUL+u5hO2ZnOyEse2ZlCDthqDquIAgRELsnZggYWN0aXZlIO2VhOuTnCDsl4XrjbDsnbTtirhcbiAgICovXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyB0b2dnbGVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IGFjdGl2ZTogYm9vbGVhbiB9PiB7XG4gICAgY29uc3QgZW50cnkgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRPbmUoXCJBXCIsIHsgaWQgfSk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgYWN0aXZlOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgbmV3QWN0aXZlID0gIWVudHJ5LmFjdGl2ZTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZCxcbiAgICAgICAgcHJvdmlkZXI6IGVudHJ5LnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogZW50cnkuY3JlZGVudGlhbHMsXG4gICAgICAgIGFjdGl2ZTogbmV3QWN0aXZlLFxuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgfSxcbiAgICBdKTtcbiAgICByZXR1cm4geyBhY3RpdmU6IG5ld0FjdGl2ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgY29uc3QgeyBjb2RlVmVyaWZpZXIsIGNvZGVDaGFsbGVuZ2UsIHN0YXRlIH0gPSBnZW5lcmF0ZVBLQ0UoKTtcblxuICAgIGNvbnN0IHJlZGlyZWN0VXJpID0gZ2V0T0F1dGhSZWRpcmVjdFVyaSgpO1xuICAgIGNvbnN0IGF1dGhVcmwgPSBidWlsZEF1dGhVcmwoY29kZUNoYWxsZW5nZSwgc3RhdGUsIHJlZGlyZWN0VXJpKTtcblxuICAgIGF3YWl0IHNldE9BdXRoU3RhdGUoc3RhdGUsIHsgY29kZVZlcmlmaWVyLCBuYW1lLCByZWRpcmVjdFVyaSB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIGFzeW5jIGhhbmRsZU9BdXRoQ2FsbGJhY2soY29kZTogc3RyaW5nLCBzdGF0ZTogc3RyaW5nLCByZXBseTogRmFzdGlmeVJlcGx5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGVuZGluZyA9IGF3YWl0IGdldE9BdXRoU3RhdGUoc3RhdGUpO1xuICAgIGlmICghcGVuZGluZykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJvYXV0aCBjYWxsYmFjazogaW52YWxpZF9zdGF0ZVwiKTtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChcIi8/b2F1dGg9ZXJyb3ImcmVhc29uPWludmFsaWRfc3RhdGVcIik7XG4gICAgfVxuICAgIGF3YWl0IGRlbGV0ZU9BdXRoU3RhdGUoc3RhdGUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VucyA9IGF3YWl0IGV4Y2hhbmdlQ29kZUZvclRva2VucyhcbiAgICAgICAgY29kZSxcbiAgICAgICAgcGVuZGluZy5jb2RlVmVyaWZpZXIsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwZW5kaW5nLnJlZGlyZWN0VXJpLFxuICAgICAgKTtcblxuICAgICAgaWYgKHRva2Vucy5hY2NvdW50VXVpZCkge1xuICAgICAgICBjb25zdCBvbGRFbnRyaWVzID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kQnlBY2NvdW50SWRlbnRpZmllcihcbiAgICAgICAgICBcIkFcIixcbiAgICAgICAgICBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIHRva2Vucy5hY2NvdW50VXVpZCxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IFRva2VuTW9kZWwuZGVsKG9sZEVudHJpZXMubWFwKChvKSA9PiBvLmlkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgICAge1xuICAgICAgICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogdG9rZW5zLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgcmVmcmVzaFRva2VuOiB0b2tlbnMucmVmcmVzaFRva2VuLFxuICAgICAgICAgICAgZXhwaXJlc0F0OiB0b2tlbnMuZXhwaXJlc0F0ID8/IDAsXG4gICAgICAgICAgICBhY2NvdW50VXVpZDogdG9rZW5zLmFjY291bnRVdWlkID8/IFwiXCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuYW1lOiBwZW5kaW5nLm5hbWUsXG4gICAgICAgIH0sXG4gICAgICBdKTtcblxuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPXN1Y2Nlc3MmbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChwZW5kaW5nLm5hbWUpfWApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiByZXBseS5yZWRpcmVjdChgLz9vYXV0aD1lcnJvciZyZWFzb249JHtlbmNvZGVVUklDb21wb25lbnQoKGUgYXMgRXJyb3IpLm1lc3NhZ2UpfWApO1xuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBvYXV0aFN0YXJ0T3BlbkFJKG5hbWU6IHN0cmluZyk6IFByb21pc2U8T0F1dGhTdGFydFJlc3VsdD4ge1xuICAgIGlmICghUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICBjb25zdCB7IGF1dGhVcmwgfSA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyLnN0YXJ0QnJvd3NlckxvZ2luKG5hbWUpO1xuXG4gICAgLy8gZmlyZS1hbmQtZm9yZ2V0OiBjb2RleCBsb2dpbiDsmYTro4wg64yA6riwIOKGkiDthqDtgbAg7KCA7J6lXG4gICAgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXJcbiAgICAgIC5jb21wbGV0ZUJyb3dzZXJMb2dpbigpXG4gICAgICAudGhlbihhc3luYyAoY3JlZHMpID0+IHtcbiAgICAgICAgaWYgKGNyZWRzLmFjY291bnRJZCkge1xuICAgICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgICAgXCJBXCIsXG4gICAgICAgICAgICBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKG9sZEVudHJpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5zYXZlKFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBjcmVkcy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgICAgcmVmcmVzaFRva2VuOiBjcmVkcy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICAgIGlkVG9rZW46IGNyZWRzLmlkVG9rZW4sXG4gICAgICAgICAgICAgIGFjY2Vzc1Rva2VuRXhwaXJlc0F0OiBEYXRlLm5vdygpICsgMTAgKiAyNCAqIDM2MDAgKiAxMDAwLFxuICAgICAgICAgICAgICBhY2NvdW50SWQ6IGNyZWRzLmFjY291bnRJZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgICBsb2dnZXIuaW5mbyhgT3BlbkFJIHRva2VuIHNhdmVkIGZvciAke25hbWV9YCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGxvZ2dlci53YXJuKGBPcGVuQUkgYnJvd3NlciBsb2dpbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcblxuICAgIHJldHVybiB7IGF1dGhVcmwgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHVzYWdlKHRva2VuSWQ/OiBudW1iZXIpOiBQcm9taXNlPFVzYWdlUmVzcG9uc2U+IHtcbiAgICBjb25zdCB7IHJvd3M6IGFsbFRva2VucyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgY29uc3QgZW50cnkgPSB0b2tlbklkXG4gICAgICA/IGFsbFRva2Vucy5maW5kKChlKSA9PiBlLmlkID09PSB0b2tlbklkKVxuICAgICAgOiBhbGxUb2tlbnMuZmluZExhc3QoKGUpID0+IGUuYWN0aXZlICYmIGUucHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpO1xuXG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuIHsgZXJyb3I6IFwiTk9UX0ZPVU5EXCIgfTtcblxuICAgIGlmIChlbnRyeS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCFlbnRyeS5hY3RpdmUpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXI6IFwib3BlbmFpXCIsIGZpdmVIb3VyOiBudWxsLCBzZXZlbkRheTogbnVsbCB9O1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcj8uZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChlbnRyeS5pZCk7XG4gICAgICAgIGNvbnN0IHJsID0gcmF3Py5kYXRhLnJhdGVMaW1pdHM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgZml2ZUhvdXI6IHJsPy5wcmltYXJ5XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICB1dGlsaXphdGlvbjogcmwucHJpbWFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5wcmltYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnByaW1hcnkud2luZG93RHVyYXRpb25NaW5zLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgc2V2ZW5EYXk6IHJsPy5zZWNvbmRhcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5zZWNvbmRhcnkudXNlZFBlcmNlbnQsXG4gICAgICAgICAgICAgICAgcmVzZXRzQXQ6IHVuaXhTZWNvbmRzVG9Jc28ocmwuc2Vjb25kYXJ5LnJlc2V0c0F0KSxcbiAgICAgICAgICAgICAgICB3aW5kb3dEdXJhdGlvbk1pbnM6IHJsLnNlY29uZGFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IGBPcGVuQUkgdXNhZ2UgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkucHJvdmlkZXIgIT09IFwiYW50aHJvcGljXCIpIHtcbiAgICAgIHJldHVybiB7IGVycm9yOiBgdXNhZ2UgQVBJIG5vdCBzdXBwb3J0ZWQgZm9yIHByb3ZpZGVyOiAke2VudHJ5LnByb3ZpZGVyfWAgfTtcbiAgICB9XG5cbiAgICBsZXQgYWNjZXNzVG9rZW4gPSBnZXRBY2Nlc3NUb2tlbihlbnRyeS5jcmVkZW50aWFscyk7XG4gICAgY29uc3QgaXNFeHBpcmVkID0gZ2V0RXhwaXJlc0F0KGVudHJ5LmNyZWRlbnRpYWxzKSA8IERhdGUubm93KCk7XG5cbiAgICBpZiAoaXNFeHBpcmVkICYmIGdldFJlZnJlc2hUb2tlbihlbnRyeS5jcmVkZW50aWFscykpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFjY2Vzc1Rva2VuID0gYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oZW50cnkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBvYXV0aExvZ2dlci53YXJuKGByZWZyZXNoIGZhaWxlZCBmb3IgJHtlbnRyeS5uYW1lfTogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgICAgcmV0dXJuIHsgZXJyb3I6IFwicmUtbG9naW4gcmVxdWlyZWRcIiB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgIGlmIChyYXcuZXJyb3IgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICAgIGNvbnN0IHJldHJpZWQgPSBhd2FpdCBmZXRjaFVzYWdlKGFjY2Vzc1Rva2VuKTtcbiAgICAgICAgaWYgKHJldHJpZWQuZXJyb3IpIHJldHVybiB7IGVycm9yOiByZXRyaWVkLmVycm9yIH07XG4gICAgICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmV0cmllZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyYXcuZXJyb3IpIHJldHVybiB7IGVycm9yOiByYXcuZXJyb3IgfTtcbiAgICByZXR1cm4gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdyk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoVG9rZW4odG9rZW46IFRva2VuU3Vic2V0QSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgY3JlZHMgPSB0b2tlbi5jcmVkZW50aWFscztcbiAgICBjb25zdCBydCA9IGdldFJlZnJlc2hUb2tlbihjcmVkcyk7XG4gICAgaWYgKCFydCkgdGhyb3cgbmV3IEVycm9yKFwiTm8gcmVmcmVzaCB0b2tlblwiKTtcbiAgICBjb25zdCByZWZyZXNoZWQgPSBhd2FpdCByZWZyZXNoQWNjZXNzVG9rZW4ocnQpO1xuICAgIGNvbnN0IHVwZGF0ZWQgPSBUb2tlbkNyZWRlbnRpYWxzLnBhcnNlKHtcbiAgICAgIC4uLmNyZWRzLFxuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIHJlZnJlc2hUb2tlbjogcmVmcmVzaGVkLnJlZnJlc2hUb2tlbixcbiAgICAgIGV4cGlyZXNBdDogcmVmcmVzaGVkLmV4cGlyZXNBdCxcbiAgICB9KTtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBpZDogdG9rZW4uaWQsXG4gICAgICAgIHByb3ZpZGVyOiB0b2tlbi5wcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHM6IHVwZGF0ZWQsXG4gICAgICAgIG5hbWU6IHRva2VuLm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiByZWZyZXNoZWQuYWNjZXNzVG9rZW47XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyBoZWFsdGgoKTogUHJvbWlzZTxIZWFsdGhSZXNwb25zZT4ge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwib2tcIixcbiAgICAgIGFjdGl2ZVRva2VuczogUWdyaWREaXNwYXRjaGVyLnRva2Vucy5zaXplLFxuICAgICAgc3Vic2NyaWJlcjogUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnN0YXR1cygpID8/IG51bGwsXG4gICAgfTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUWdyaWRGcmFtZSA9IG5ldyBRZ3JpZEZyYW1lQ2xhc3MoKTtcblxuZnVuY3Rpb24gY29udmVydEFudGhyb3BpY1VzYWdlKHJhdzogQW50aHJvcGljVXNhZ2VSYXcpOiBVc2FnZVJlc3BvbnNlIHtcbiAgcmV0dXJuIHtcbiAgICBwcm92aWRlcjogXCJhbnRocm9waWNcIixcbiAgICBmaXZlSG91cjogcmF3LmZpdmVfaG91clxuICAgICAgPyB7IHV0aWxpemF0aW9uOiByYXcuZml2ZV9ob3VyLnV0aWxpemF0aW9uLCByZXNldHNBdDogcmF3LmZpdmVfaG91ci5yZXNldHNfYXQgfVxuICAgICAgOiBudWxsLFxuICAgIHNldmVuRGF5OiByYXcuc2V2ZW5fZGF5XG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5zZXZlbl9kYXkudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuc2V2ZW5fZGF5LnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLE1BQU0saUNBQWlCLElBQUksSUFBd0I7QUFHbkQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxrQkFBa0I7QUFFeEIsU0FBUyxpQkFBaUIsU0FBbUQ7Q0FDM0UsT0FBTyxPQUFPLFlBQVksNEJBQVcsSUFBSSxLQUFLLFVBQVUsR0FBSSxFQUFDLENBQUMsWUFBWSxJQUFJO0FBQ2hGO0FBRUEsZUFBZSxjQUFjLE9BQWUsTUFBbUM7Q0FDN0UsTUFBTSxRQUFRLG1CQUFtQjtDQUNqQyxJQUFJLENBQUMsT0FBTyxNQUFNLElBQUksTUFBTSw4QkFBOEI7Q0FDMUQsTUFBTSxNQUFNLElBQUk7RUFDZCxLQUFLLEdBQUcscUJBQXFCO0VBQzdCLE9BQU8sS0FBSyxVQUFVLElBQUk7RUFDMUIsS0FBSztDQUNQLENBQUM7QUFDSDtBQUVBLGVBQWUsY0FBYyxPQUFrRDtDQUM3RSxNQUFNLFFBQVEsbUJBQW1CO0NBQ2pDLElBQUksQ0FBQyxPQUFPLE1BQU0sSUFBSSxNQUFNLDhCQUE4QjtDQUMxRCxNQUFNLE1BQU0sTUFBTSxNQUFNLElBQVksRUFBRSxLQUFLLEdBQUcscUJBQXFCLFFBQVEsQ0FBQztDQUM1RSxJQUFJLENBQUMsS0FBSyxPQUFPO0NBQ2pCLE9BQU8sS0FB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
656
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZnJhbWUuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmZyYW1lLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBhcGksIEJhZFJlcXVlc3RFeGNlcHRpb24sIEJhc2VGcmFtZUNsYXNzLCBTb25hbXUsIHN0cmVhbSB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGdldENhY2hlTWFuYWdlclJlZiB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgdHlwZSBMb2NhbGl6ZWRTdHJpbmcgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7XG4gIGdldEFjY2Vzc1Rva2VuLFxuICBnZXRFeHBpcmVzQXQsXG4gIGdldFJlZnJlc2hUb2tlbixcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vY3JlZGVudGlhbHNcIjtcbmltcG9ydCB7IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3NjaGVtYS12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBNSUNST19VU0QsIFJlcXVlc3RMb2dNb2RlbCB9IGZyb20gXCIuLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy5tb2RlbFwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCwgdHlwZSBUb2tlblVwZGF0ZUZpZWxkcyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuaW1wb3J0IHsgVG9rZW5DcmVkZW50aWFscyB9IGZyb20gXCIuLi90b2tlbi90b2tlbi50eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBBbnRocm9waWNVc2FnZVJhdyxcbiAgYnVpbGRBdXRoVXJsLFxuICBleGNoYW5nZUNvZGVGb3JUb2tlbnMsXG4gIGZldGNoVXNhZ2UsXG4gIGdlbmVyYXRlUEtDRSxcbiAgcmVmcmVzaEFjY2Vzc1Rva2VuLFxufSBmcm9tIFwiLi9vYXV0aFwiO1xuaW1wb3J0IHtcbiAgYWZ0ZXJRdWVyeSxcbiAgYmVmb3JlUXVlcnksXG4gIGZpbmlzaFJ1bkFib3J0ZWQsXG4gIGZpbmlzaFJ1bldpdGhFcnJvcixcbn0gZnJvbSBcIi4vcWdyaWQtcnVuLWxpZmVjeWNsZVwiO1xuaW1wb3J0IHsgYnVpbGRBbmRWYWxpZGF0ZVN0cmljdE91dHB1dFNjaGVtYSwgUWdyaWREaXNwYXRjaGVyIH0gZnJvbSBcIi4vcWdyaWQuZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHtcbiAgdHlwZSBRdWVyeUlucHV0LFxuICB0eXBlIEFwcGVuZFN0ZXBJbnB1dCxcbiAgdHlwZSBDcmVhdGVSdW5JbnB1dCxcbiAgdHlwZSBGaW5pc2hSdW5JbnB1dCxcbiAgdHlwZSBIZWFsdGhSZXNwb25zZSxcbiAgdHlwZSBPQXV0aFN0YXJ0UmVzdWx0LFxuICB0eXBlIFF1ZXJ5T3V0cHV0LFxuICB0eXBlIFFncmlkUnVuQ29udGV4dCxcbiAgU3RyZWFtRXZlbnRzLFxuICB0eXBlIFRva2VuU3RhdHMsXG4gIHR5cGUgVXNhZ2VSZXNwb25zZSxcbn0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IFRvb2xTY2hlbWFDb21wb3NpdGlvbkVycm9yIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb24tc2NoZW1hXCI7XG5cbmNvbnN0IHBlbmRpbmdTdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIFF1ZXJ5SW5wdXQ+KCk7XG5cbnR5cGUgUGVuZGluZ09BdXRoID0geyBjb2RlVmVyaWZpZXI6IHN0cmluZzsgbmFtZTogc3RyaW5nOyByZWRpcmVjdFVyaTogc3RyaW5nIH07XG5jb25zdCBPQVVUSF9TVEFURV9QUkVGSVggPSBcIm9hdXRoOnN0YXRlOlwiO1xuY29uc3QgT0FVVEhfU1RBVEVfVFRMID0gXCI1bVwiO1xuXG5mdW5jdGlvbiB1bml4U2Vjb25kc1RvSXNvKHNlY29uZHM6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiBzZWNvbmRzID09PSBcIm51bWJlclwiID8gbmV3IERhdGUoc2Vjb25kcyAqIDEwMDApLnRvSVNPU3RyaW5nKCkgOiBudWxsO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcsIGRhdGE6IFBlbmRpbmdPQXV0aCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBhd2FpdCBjYWNoZS5zZXQoe1xuICAgIGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCxcbiAgICB2YWx1ZTogSlNPTi5zdHJpbmdpZnkoZGF0YSksXG4gICAgdHRsOiBPQVVUSF9TVEFURV9UVEwsXG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPFBlbmRpbmdPQXV0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjYWNoZSA9IGdldENhY2hlTWFuYWdlclJlZigpO1xuICBpZiAoIWNhY2hlKSB0aHJvdyBuZXcgRXJyb3IoXCJDYWNoZU1hbmFnZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICBjb25zdCByYXcgPSBhd2FpdCBjYWNoZS5nZXQ8c3RyaW5nPih7IGtleTogYCR7T0FVVEhfU1RBVEVfUFJFRklYfSR7c3RhdGV9YCB9KTtcbiAgaWYgKCFyYXcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgUGVuZGluZ09BdXRoO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZWxldGVPQXV0aFN0YXRlKHN0YXRlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY2FjaGUgPSBnZXRDYWNoZU1hbmFnZXJSZWYoKTtcbiAgaWYgKCFjYWNoZSkgcmV0dXJuO1xuICBhd2FpdCBjYWNoZS5kZWxldGUoeyBrZXk6IGAke09BVVRIX1NUQVRFX1BSRUZJWH0ke3N0YXRlfWAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldE9BdXRoUmVkaXJlY3RVcmkoKTogc3RyaW5nIHtcbiAgY29uc3QgcHVibGljQmFzZVVybCA9IHByb2Nlc3MuZW52LlFHUklEX1BVQkxJQ19CQVNFX1VSTD8ucmVwbGFjZSgvXFwvKyQvLCBcIlwiKTtcbiAgaWYgKHB1YmxpY0Jhc2VVcmwpIHJldHVybiBgJHtwdWJsaWNCYXNlVXJsfS9jYWxsYmFja2A7XG5cbiAgY29uc3Qgc2VydmVyUG9ydCA9IHByb2Nlc3MuZW52LlBPUlQgPz8gXCI0NDkwMFwiO1xuICByZXR1cm4gYGh0dHA6Ly9sb2NhbGhvc3Q6JHtzZXJ2ZXJQb3J0fS9jYWxsYmFja2A7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogdm9pZCB7XG4gIGlmICghYXJncy5pbWFnZUdlbmVyYXRpb24pIHJldHVybjtcbiAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgXCJxZ3JpZDogaW1hZ2VHZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBzdHJlYW1pbmc7IHVzZSBxdWVyeS9nZW5lcmF0ZVRleHQgaW5zdGVhZC5cIiBhcyBMb2NhbGl6ZWRTdHJpbmcsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlamVjdEludmFsaWRDYWxsZXJTY2hlbWFzKGFyZ3M6IFF1ZXJ5SW5wdXQpOiB2b2lkIHtcbiAgaWYgKGFyZ3MuanNvblNjaGVtYSA9PT0gdW5kZWZpbmVkICYmICFhcmdzLnRvb2xzPy5sZW5ndGgpIHJldHVybjtcblxuICB0cnkge1xuICAgIGJ1aWxkQW5kVmFsaWRhdGVTdHJpY3RPdXRwdXRTY2hlbWEoYXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IgfHxcbiAgICAgIGVycm9yIGluc3RhbmNlb2YgVG9vbFNjaGVtYUNvbXBvc2l0aW9uRXJyb3JcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGVycm9yLm1lc3NhZ2UgYXMgTG9jYWxpemVkU3RyaW5nKTtcbiAgICB9XG4gICAgLy8g7J6Y66q765CcIGtleXdvcmQg7ZiV7YOcKGFueU9mIOulvCDqsJ3ssrTroZwg67O064K064qUIOuTsSnripQg7YyM7J207ZSE65287J247JeQ7IScIHVudHlwZWQg7Jik66WY66GcIOuCmOyYpOuvgOuhnCxcbiAgICAvLyDtg4DsnoUg7KKB7Z6I6riwIOuMgOyLoCBFcnJvciDsoITssrTrpbwgY2FsbGVyLWZhdWx0IDQwMCDsnLzroZwg66ek7ZWR7ZWc64ukKOqzhOyVvSDthYzsiqTtirjroZwg6rOg7KCV65CoKS5cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIGBxZ3JpZDogY2FsbGVyIHNjaGVtYSBjYW5ub3QgYmUgbm9ybWFsaXplZDogJHtlcnJvci5tZXNzYWdlfWAgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn1cblxuZnVuY3Rpb24gY3JlYXRlSHR0cERpc2Nvbm5lY3RIYW5kbGUoKToge1xuICBzaWduYWw6IEFib3J0U2lnbmFsO1xuICBkaXNwb3NlOiAoKSA9PiB2b2lkO1xufSB7XG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgbGV0IHJlcXVlc3RSYXc6IEZhc3RpZnlSZXF1ZXN0W1wicmF3XCJdIHwgdW5kZWZpbmVkO1xuICBsZXQgcmVzcG9uc2VSYXc6IEZhc3RpZnlSZXBseVtcInJhd1wiXSB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmVxdWVzdFJhdyA9IGN0eC5yZXF1ZXN0Py5yYXc7XG4gICAgaWYgKGN0eC50cmFuc3BvcnQgPT09IFwiaHR0cFwiKSByZXNwb25zZVJhdyA9IGN0eC5yZXBseS5yYXc7XG4gIH0gY2F0Y2gge1xuICAgIC8vIERpcmVjdCBmcmFtZSBjYWxscyAoZm9yIGV4YW1wbGUgdW5pdCB0ZXN0cykgZG8gbm90IGhhdmUgYW4gSFRUUCBjb250ZXh0LlxuICB9XG5cbiAgY29uc3QgYWJvcnQgPSAoKSA9PiBhYm9ydENvbnRyb2xsZXIuYWJvcnQoKTtcbiAgY29uc3QgYWJvcnRPbkluY29tcGxldGVSZXNwb25zZUNsb3NlID0gKCkgPT4ge1xuICAgIGlmICghcmVzcG9uc2VSYXc/LndyaXRhYmxlRW5kZWQpIGFib3J0KCk7XG4gIH07XG5cbiAgcmVxdWVzdFJhdz8ub25jZShcImFib3J0ZWRcIiwgYWJvcnQpO1xuICByZXNwb25zZVJhdz8ub25jZShcImNsb3NlXCIsIGFib3J0T25JbmNvbXBsZXRlUmVzcG9uc2VDbG9zZSk7XG5cbiAgaWYgKHJlcXVlc3RSYXc/LmFib3J0ZWQgfHwgKHJlc3BvbnNlUmF3Py5kZXN0cm95ZWQgJiYgIXJlc3BvbnNlUmF3LndyaXRhYmxlRW5kZWQpKSB7XG4gICAgYWJvcnQoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgIHJlcXVlc3RSYXc/LnJlbW92ZUxpc3RlbmVyKFwiYWJvcnRlZFwiLCBhYm9ydCk7XG4gICAgICByZXNwb25zZVJhdz8ucmVtb3ZlTGlzdGVuZXIoXCJjbG9zZVwiLCBhYm9ydE9uSW5jb21wbGV0ZVJlc3BvbnNlQ2xvc2UpO1xuICAgIH0sXG4gIH07XG59XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiXSk7XG5jb25zdCBvYXV0aExvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuY2xhc3MgUWdyaWRGcmFtZUNsYXNzIGV4dGVuZHMgQmFzZUZyYW1lQ2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlFncmlkXCIpO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHF1ZXJ5KGFyZ3M6IFF1ZXJ5SW5wdXQpOiBQcm9taXNlPFF1ZXJ5T3V0cHV0PiB7XG4gICAgcmVqZWN0SW52YWxpZENhbGxlclNjaGVtYXMoYXJncyk7XG4gICAgY29uc3QgZGlzY29ubmVjdCA9IGNyZWF0ZUh0dHBEaXNjb25uZWN0SGFuZGxlKCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhcmdzLmxvZ2dlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5xdWVyeShhcmdzLCBkaXNjb25uZWN0LnNpZ25hbCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgcmVxdWVzdExvZ0lkLCBzdGVwSW5kZXggfSA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgICAgbGV0IHJlc3VsdDogUXVlcnlPdXRwdXQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBRZ3JpZERpc3BhdGNoZXIucXVlcnkoYXJncywgZGlzY29ubmVjdC5zaWduYWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZGlzY29ubmVjdC5zaWduYWwuYWJvcnRlZCkge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocmVxdWVzdExvZ0lkLCAoZSBhcyBFcnJvcikubWVzc2FnZSwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbGlmZWN5Y2xlID0gYXdhaXQgYWZ0ZXJRdWVyeShyZXF1ZXN0TG9nSWQsIHN0ZXBJbmRleCwgYXJncywgcmVzdWx0KTtcbiAgICAgICAgaWYgKGRpc2Nvbm5lY3Quc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdG9vbC1jYWxsIHJlcXVlc3RMb2dJZOyZgCBwcm92aWRlciB0aHJlYWRDb29yZOuKlCDshJzroZwg64+F66a97KCB7Jy866GcIOycoOyngO2VnOuLpC5cbiAgICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSByZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICAgIGNvbnN0IHJ1bkNvbnRleHQgPVxuICAgICAgICAgIGxpZmVjeWNsZS5ydW5Db250ZXh0IHx8IHRocmVhZENvb3JkXG4gICAgICAgICAgICA/IHsgLi4ubGlmZWN5Y2xlLnJ1bkNvbnRleHQsIC4uLih0aHJlYWRDb29yZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHt9KSB9XG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHsgLi4ucmVzdWx0LCBydW5Db250ZXh0IH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihgcXVlcnkgYWZ0ZXJRdWVyeSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIGlmIChkaXNjb25uZWN0LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChyZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihyZXF1ZXN0TG9nSWQsIChlIGFzIEVycm9yKS5tZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBwcm92aWRlciDsnZHri7XsnYAg7ISx6rO17ZaI7Jy866+A66GcIOuhnOq5hSDsnqXslaDqsIAg7IOd7ISxIOqysOqzvOulvCDrja7slrTsk7Dsp4Ag7JWK64qU64ukLlxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNjb25uZWN0LmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgcHJlcGFyZVN0cmVhbShhcmdzOiBRdWVyeUlucHV0KTogUHJvbWlzZTx7IHN0cmVhbUlkOiBzdHJpbmcgfT4ge1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcbiAgICByZWplY3RJbnZhbGlkQ2FsbGVyU2NoZW1hcyhhcmdzKTtcbiAgICBjb25zdCBzdHJlYW1JZCA9IGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgcGVuZGluZ1N0cmVhbXMuc2V0KHN0cmVhbUlkLCBhcmdzKTtcbiAgICBjb25zdCBleHBpcnkgPSBzZXRUaW1lb3V0KCgpID0+IHBlbmRpbmdTdHJlYW1zLmRlbGV0ZShzdHJlYW1JZCksIDMwXzAwMCk7XG4gICAgZXhwaXJ5LnVucmVmPy4oKTtcbiAgICByZXR1cm4geyBzdHJlYW1JZCB9O1xuICB9XG5cbiAgQHN0cmVhbSh7IHR5cGU6IFwic3NlXCIsIGV2ZW50czogU3RyZWFtRXZlbnRzIH0pXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKHN0cmVhbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhcmdzID0gcGVuZGluZ1N0cmVhbXMuZ2V0KHN0cmVhbUlkKTtcbiAgICBwZW5kaW5nU3RyZWFtcy5kZWxldGUoc3RyZWFtSWQpO1xuICAgIGlmICghYXJncykgdGhyb3cgbmV3IEVycm9yKFwiaW52YWxpZCBvciBleHBpcmVkIHN0cmVhbUlkXCIpO1xuICAgIHJlamVjdEltYWdlR2VuZXJhdGlvblN0cmVhbShhcmdzKTtcblxuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgY29uc3Qgc3NlID0gY3R4LmNyZWF0ZVNTRShTdHJlYW1FdmVudHMpO1xuICAgIGxldCB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0dXJuSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtUmVzdWx0OiBRdWVyeU91dHB1dCB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtRXJyb3I6IEVycm9yIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjbGllbnRDbG9zZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBjb25zdCBpbnRlcnJ1cHRPcGVuQUkgPSAoKSA9PiB7XG4gICAgICBpZiAodGhyZWFkSWQgJiYgdHVybklkKSB7XG4gICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5pbnRlcnJ1cHRXb3JrZXJUdXJuKHRocmVhZElkLCB0dXJuSWQpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgc3NlLm9uQ2xvc2UoKCkgPT4ge1xuICAgICAgY2xpZW50Q2xvc2VkID0gdHJ1ZTtcbiAgICAgIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgfSk7XG5cbiAgICBsZXQgcnVuSW5mbzogeyByZXF1ZXN0TG9nSWQ6IG51bWJlcjsgc3RlcEluZGV4OiBudW1iZXIgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoYXJncy5sb2dnZXIgIT09IGZhbHNlKSB7XG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCEIHJ1bm5pbmcgcm93IOyDneyEseyXkCDsi6TtjKjtlZjrqbQgbG9nZ2VkIOyalOyyreycvOuhnCDsp4TtlontlZjsp4Ag7JWK64qU64ukLlxuICAgICAgcnVuSW5mbyA9IGF3YWl0IGJlZm9yZVF1ZXJ5KGFyZ3MpO1xuICAgIH1cblxuICAgIC8vIGJlZm9yZVF1ZXJ5IERCIOyekeyXhSDspJEgY2xvc2Xrpbwg64aT7LmY7KeAIOyViuqzoCBwcm92aWRlciDsi6Ttlokg7KCE7JeQIOuniOqwkO2VnOuLpC5cbiAgICBpZiAoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICAgIGF3YWl0IHNzZS5lbmQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLnF1ZXJ5U3RyZWFtKFxuICAgICAgICBhcmdzLFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogKHRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghY2xpZW50Q2xvc2VkICYmICFzc2UuY2xvc2VkKSBzc2UucHVibGlzaChcImRlbHRhXCIsIHsgdGV4dCB9KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IChpZCkgPT4ge1xuICAgICAgICAgICAgdGhyZWFkSWQgPSBpZDtcbiAgICAgICAgICAgIGlmICgoY2xpZW50Q2xvc2VkIHx8IHNzZS5jbG9zZWQpICYmIHR1cm5JZCkge1xuICAgICAgICAgICAgICBpbnRlcnJ1cHRPcGVuQUkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVHVybklkOiAoaWQpID0+IHtcbiAgICAgICAgICAgIHR1cm5JZCA9IGlkO1xuICAgICAgICAgICAgaWYgKChjbGllbnRDbG9zZWQgfHwgc3NlLmNsb3NlZCkgJiYgdGhyZWFkSWQpIHtcbiAgICAgICAgICAgICAgaW50ZXJydXB0T3BlbkFJKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1SZXN1bHQgPSByZXN1bHQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiAoZXJyKSA9PiB7XG4gICAgICAgICAgICBzdHJlYW1FcnJvciA9IGVycjtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdHJlYW1FcnJvciA9IGUgYXMgRXJyb3I7XG4gICAgfVxuXG4gICAgLy8gcHJvdmlkZXIg6rKw6rO86rCAIOyXhuuKlCBjbG9zZeuKlCDsponsi5wgYWJvcnRlZOuhnCDrp4jqsJDtlZzri6QuXG4gICAgaWYgKGNsaWVudENsb3NlZCAmJiAhc3RyZWFtUmVzdWx0KSB7XG4gICAgICBpZiAocnVuSW5mbykgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gZGlzcGF0Y2hlciDsmYTro4wg7ZuEIGxpZmVjeWNsZSDsspjrpqwgKGF3YWl0IOyViOyghClcbiAgICBpZiAoc3RyZWFtUmVzdWx0KSB7XG4gICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsi6TsnYAgdGhyZWFkIOyerOyCrOyaqSDsooztkZzripQgbG9nZ2VyIOyEpOygleqzvCDrrLTqtIDtlZjqsowg7ZqM7Iah7ZWc64ukLlxuICAgICAgY29uc3QgdGhyZWFkQ29vcmQgPSBzdHJlYW1SZXN1bHQucnVuQ29udGV4dD8udGhyZWFkQ29vcmQ7XG4gICAgICBsZXQgcnVuQ29udGV4dDogUWdyaWRSdW5Db250ZXh0IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhyZWFkQ29vcmQgIT09IHVuZGVmaW5lZCA/IHsgdGhyZWFkQ29vcmQgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChydW5JbmZvKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gY2xvc2Ug7ZuEIOuPhOywqe2VnCDqsrDqs7zrj4Qgc3RlcC91c2FnZeuKlCDrgqjquLDrkJgsIOyVhOuemOyXkOyEnCDstZzsooUgc3RhdHVz66W8IGFib3J0ZWTroZwg642u7Ja07JO064ukLlxuICAgICAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IGF3YWl0IGFmdGVyUXVlcnkoXG4gICAgICAgICAgICBydW5JbmZvLnJlcXVlc3RMb2dJZCxcbiAgICAgICAgICAgIHJ1bkluZm8uc3RlcEluZGV4LFxuICAgICAgICAgICAgYXJncyxcbiAgICAgICAgICAgIHN0cmVhbVJlc3VsdCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJ1bkNvbnRleHQgPVxuICAgICAgICAgICAgbGlmZWN5Y2xlLnJ1bkNvbnRleHQgfHwgdGhyZWFkQ29vcmRcbiAgICAgICAgICAgICAgPyB7IC4uLmxpZmVjeWNsZS5ydW5Db250ZXh0LCAuLi4odGhyZWFkQ29vcmQgPyB7IHRocmVhZENvb3JkIH0gOiB7fSkgfVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgICAgIC8vIGFmdGVyUXVlcnnqsIAg7KeE7ZaJ65CY64qUIOyCrOydtCBjbGllbnTqsIAg64ur7Z6MIOqyveyasCDsmYTro4wg7IOB7YOc66W8IGFib3J0ZWTroZwg65CY64+M66aw64ukLlxuICAgICAgICAgIGlmIChjbGllbnRDbG9zZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bkFib3J0ZWQocnVuSW5mby5yZXF1ZXN0TG9nSWQsIGFyZ3MpO1xuICAgICAgICAgICAgYXdhaXQgc3NlLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihgc3RyZWFtIGFmdGVyUXVlcnkgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICAgIGF3YWl0IGZpbmlzaFJ1bldpdGhFcnJvcihydW5JbmZvLnJlcXVlc3RMb2dJZCwgKGUgYXMgRXJyb3IpLm1lc3NhZ2UsIGFyZ3MpO1xuXG4gICAgICAgICAgaWYgKGNsaWVudENsb3NlZCkge1xuICAgICAgICAgICAgYXdhaXQgZmluaXNoUnVuQWJvcnRlZChydW5JbmZvLnJlcXVlc3RMb2dJZCwgYXJncyk7XG4gICAgICAgICAgICBhd2FpdCBzc2UuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWNsaWVudENsb3NlZCAmJiAhc3NlLmNsb3NlZCkgc3NlLnB1Ymxpc2goXCJkb25lXCIsIHsgLi4uc3RyZWFtUmVzdWx0LCBydW5Db250ZXh0IH0pO1xuICAgIH0gZWxzZSBpZiAoc3RyZWFtRXJyb3IpIHtcbiAgICAgIGlmIChydW5JbmZvKSBhd2FpdCBmaW5pc2hSdW5XaXRoRXJyb3IocnVuSW5mby5yZXF1ZXN0TG9nSWQsIHN0cmVhbUVycm9yLm1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgaWYgKCFjbGllbnRDbG9zZWQgJiYgIXNzZS5jbG9zZWQpIHNzZS5wdWJsaXNoKFwiZXJyb3JcIiwgeyBtZXNzYWdlOiBzdHJlYW1FcnJvci5tZXNzYWdlIH0pO1xuICAgIH0gZWxzZSBpZiAoKGNsaWVudENsb3NlZCB8fCBzc2UuY2xvc2VkKSAmJiBydW5JbmZvKSB7XG4gICAgICBhd2FpdCBmaW5pc2hSdW5BYm9ydGVkKHJ1bkluZm8ucmVxdWVzdExvZ0lkLCBhcmdzKTtcbiAgICB9XG5cbiAgICBhd2FpdCBzc2UuZW5kKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgY3JlYXRlUnVuKGlucHV0OiBDcmVhdGVSdW5JbnB1dCk6IFByb21pc2U8eyByZXF1ZXN0TG9nSWQ6IG51bWJlciB9PiB7XG4gICAgY29uc3QgcmVxdWVzdExvZ0lkID0gYXdhaXQgUmVxdWVzdExvZ01vZGVsLmNyZWF0ZVJ1bih7XG4gICAgICB1c2VyX3Byb21wdDogaW5wdXQudXNlclByb21wdCxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5tb2RlbE5hbWUsXG4gICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgIHByb2plY3RfbmFtZTogaW5wdXQucHJvamVjdE5hbWUsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBpbnB1dC5zeXN0ZW1Qcm9tcHQsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgICByZXR1cm4geyByZXF1ZXN0TG9nSWQgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhcHBlbmRTdGVwKGlucHV0OiBBcHBlbmRTdGVwSW5wdXQpOiBQcm9taXNlPHsgc3RlcElkOiBudW1iZXIgfT4ge1xuICAgIGNvbnN0IHN0ZXBJZCA9IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC5hcHBlbmRTdGVwKGlucHV0LnJlcXVlc3RMb2dJZCwge1xuICAgICAgc3RlcF9pbmRleDogaW5wdXQuc3RlcEluZGV4LFxuICAgICAgdHlwZTogaW5wdXQudHlwZSxcbiAgICAgIG1vZGVsX25hbWU6IGlucHV0Lm1vZGVsTmFtZSxcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBpbnB1dC5yZXF1ZXN0ZWRNb2RlbE5hbWUsXG4gICAgICBmYWxsYmFja19jb3VudDogaW5wdXQuZmFsbGJhY2tDb3VudCxcbiAgICAgIGlucHV0X3Rva2VuczogaW5wdXQuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiBpbnB1dC5vdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQuY2FjaGVSZWFkVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uVG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBpbnB1dC5jYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LmNhY2hlQ3JlYXRpb24xaFRva2VucyxcbiAgICAgIGNvc3RfdXNkOiBpbnB1dC5jb3N0VXNkID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBNYXRoLnJvdW5kKGlucHV0LmNvc3RVc2QgKiBNSUNST19VU0QpLFxuICAgICAgY29zdF9zb3VyY2U6IGlucHV0LmNvc3RTb3VyY2UsXG4gICAgICBkdXJhdGlvbl9tczogaW5wdXQuZHVyYXRpb25NcyxcbiAgICAgIHR0ZnRfbXM6IGlucHV0LnR0ZnRNcyA/PyBudWxsLFxuICAgICAgZmluaXNoX3JlYXNvbjogaW5wdXQuZmluaXNoUmVhc29uLFxuICAgICAgcmVhc29uaW5nX3RleHQ6IGlucHV0LnJlYXNvbmluZ1RleHQsXG4gICAgICByZWFzb25pbmdfdG9rZW5zOiBpbnB1dC5yZWFzb25pbmdUb2tlbnMsXG4gICAgICB0b29sX2NhbGxfaW5kZXg6IGlucHV0LnRvb2xDYWxsSW5kZXgsXG4gICAgICB0b29sX2NhbGxfaWQ6IGlucHV0LnRvb2xDYWxsSWQsXG4gICAgICB0b29sX25hbWU6IGlucHV0LnRvb2xOYW1lLFxuICAgICAgdG9vbF9hcmdzOiBpbnB1dC50b29sQXJncyxcbiAgICAgIHRvb2xfcmVzdWx0OiBpbnB1dC50b29sUmVzdWx0LFxuICAgICAgdG9vbF9kdXJhdGlvbl9tczogaW5wdXQudG9vbER1cmF0aW9uTXMsXG4gICAgICBlcnJvcjogaW5wdXQuZXJyb3IsXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgc3RlcElkIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZmluaXNoUnVuKGlucHV0OiBGaW5pc2hSdW5JbnB1dCk6IFByb21pc2U8eyBvazogYm9vbGVhbiB9PiB7XG4gICAgYXdhaXQgUmVxdWVzdExvZ01vZGVsLmZpbmlzaFJ1bihpbnB1dC5yZXF1ZXN0TG9nSWQsIHtcbiAgICAgIHN0YXR1czogaW5wdXQuc3RhdHVzLFxuICAgICAgcmVzcG9uc2U6IGlucHV0LnJlc3BvbnNlLFxuICAgICAgdG9rZW5fbmFtZTogaW5wdXQudG9rZW5OYW1lLFxuICAgICAgbW9kZWxfbmFtZTogaW5wdXQubW9kZWxOYW1lLFxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IGlucHV0LnJlcXVlc3RlZE1vZGVsTmFtZSxcbiAgICAgIGZhbGxiYWNrX2NvdW50OiBpbnB1dC5mYWxsYmFja0NvdW50LFxuICAgICAgaW5wdXRfdG9rZW5zOiBpbnB1dC50b3RhbElucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogaW5wdXQudG90YWxPdXRwdXRUb2tlbnMsXG4gICAgICBjYWNoZV9yZWFkX3Rva2VuczogaW5wdXQudG90YWxDYWNoZVJlYWRUb2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvblRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2VuczogaW5wdXQudG90YWxDYWNoZUNyZWF0aW9uNW1Ub2tlbnMsXG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGlucHV0LnRvdGFsQ2FjaGVDcmVhdGlvbjFoVG9rZW5zLFxuICAgICAgY29zdF91c2Q6IGlucHV0LmNvc3RVc2QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IE1hdGgucm91bmQoaW5wdXQuY29zdFVzZCAqIE1JQ1JPX1VTRCksXG4gICAgICBjb3N0X3NvdXJjZTogaW5wdXQuY29zdFNvdXJjZSxcbiAgICAgIGR1cmF0aW9uX21zOiBpbnB1dC50b3RhbER1cmF0aW9uTXMsXG4gICAgICBoaXN0b3J5OiBpbnB1dC5oaXN0b3J5ID8gSlNPTi5wYXJzZShpbnB1dC5oaXN0b3J5KSA6IHVuZGVmaW5lZCxcbiAgICAgIGVycm9yX21lc3NhZ2U6IGlucHV0LmVycm9yTWVzc2FnZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyBvazogdHJ1ZSB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgc3RhdHMoKTogUHJvbWlzZTxUb2tlblN0YXRzW10+IHtcbiAgICByZXR1cm4gUWdyaWREaXNwYXRjaGVyLmdldFN0YXRzKCk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSB9KVxuICBhc3luYyB0b3RhbENvc3QodG9rZW5OYW1lPzogc3RyaW5nKTogUHJvbWlzZTx7IHVzZDogbnVtYmVyIH0+IHtcbiAgICByZXR1cm4geyB1c2Q6IGF3YWl0IFJlcXVlc3RMb2dNb2RlbC50b3RhbENvc3QoeyB0b2tlbl9uYW1lOiB0b2tlbk5hbWUgfSkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIHByb2plY3ROYW1lcygpOiBQcm9taXNlPHsgbmFtZXM6IHN0cmluZ1tdIH0+IHtcbiAgICByZXR1cm4geyBuYW1lczogYXdhaXQgUmVxdWVzdExvZ01vZGVsLmRpc3RpbmN0UHJvamVjdE5hbWVzKCkgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBhZGRUb2tlbihcbiAgICBwcm92aWRlcjogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBUb2tlbkNyZWRlbnRpYWxzLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTx7IGFkZGVkOiBib29sZWFuIH0+IHtcbiAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAge1xuICAgICAgICBwcm92aWRlcixcbiAgICAgICAgY3JlZGVudGlhbHMsXG4gICAgICAgIG5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFkZGVkOiB0cnVlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCJdIH0pXG4gIGFzeW5jIHVwZGF0ZVRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0PzogbnVtYmVyLFxuICApOiBQcm9taXNlPHsgdXBkYXRlZDogYm9vbGVhbiB9PiB7XG4gICAgaWYgKFxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiZcbiAgICAgICghTnVtYmVyLmlzSW50ZWdlcihxdW90YVRocmVzaG9sZCkgfHwgcXVvdGFUaHJlc2hvbGQgPCAxIHx8IHF1b3RhVGhyZXNob2xkID4gMTAwKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwicXVvdGFUaHJlc2hvbGQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwLCBvciBudWxsXCIgYXMgTG9jYWxpemVkU3RyaW5nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHdlaWdodCAhPT0gdW5kZWZpbmVkICYmICghTnVtYmVyLmlzSW50ZWdlcih3ZWlnaHQpIHx8IHdlaWdodCA8IDEgfHwgd2VpZ2h0ID4gMTAwKSkge1xuICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oXG4gICAgICAgIFwid2VpZ2h0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuIDEgYW5kIDEwMFwiIGFzIExvY2FsaXplZFN0cmluZyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0Y2g6IFRva2VuVXBkYXRlRmllbGRzID0ge307XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkgcGF0Y2gubmFtZSA9IG5hbWU7XG4gICAgaWYgKHF1b3RhVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHBhdGNoLnF1b3RhX3RocmVzaG9sZCA9IHF1b3RhVGhyZXNob2xkO1xuICAgIGlmICh3ZWlnaHQgIT09IHVuZGVmaW5lZCkgcGF0Y2gud2VpZ2h0ID0gd2VpZ2h0O1xuICAgIGlmIChPYmplY3Qua2V5cyhwYXRjaCkubGVuZ3RoID09PSAwKSByZXR1cm4geyB1cGRhdGVkOiBmYWxzZSB9O1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IFRva2VuTW9kZWwudXBkYXRlRmllbGRzKGlkLCBwYXRjaCk7XG4gICAgcmV0dXJuIHsgdXBkYXRlZDogdXBkYXRlZCA+IDAgfTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyByZW1vdmVUb2tlbihpZDogbnVtYmVyKTogUHJvbWlzZTx7IHJlbW92ZWQ6IGJvb2xlYW4gfT4ge1xuICAgIGNvbnN0IGVudHJ5ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kT25lKFwiQVwiLCB7IGlkIH0pO1xuICAgIGlmICghZW50cnkpIHJldHVybiB7IHJlbW92ZWQ6IGZhbHNlIH07XG4gICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwoW2VudHJ5LmlkXSk7XG4gICAgcmV0dXJuIHsgcmVtb3ZlZDogdHJ1ZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIO2GoO2BsCDtmZzshLHtmZQv67mE7Zmc7ISx7ZmUIO2GoOq4gCBEQuydmCBhY3RpdmUg7ZWE65OcIOyXheuNsOydtO2KuFxuICAgKi9cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHRvZ2dsZVRva2VuKGlkOiBudW1iZXIpOiBQcm9taXNlPHsgYWN0aXZlOiBib29sZWFuIH0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZCB9KTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBhY3RpdmU6IGZhbHNlIH07XG5cbiAgICBjb25zdCBuZXdBY3RpdmUgPSAhZW50cnkuYWN0aXZlO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkLFxuICAgICAgICBwcm92aWRlcjogZW50cnkucHJvdmlkZXIsXG4gICAgICAgIGNyZWRlbnRpYWxzOiBlbnRyeS5jcmVkZW50aWFscyxcbiAgICAgICAgYWN0aXZlOiBuZXdBY3RpdmUsXG4gICAgICAgIG5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIHJldHVybiB7IGFjdGl2ZTogbmV3QWN0aXZlIH07XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgb2F1dGhTdGFydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPE9BdXRoU3RhcnRSZXN1bHQ+IHtcbiAgICBjb25zdCB7IGNvZGVWZXJpZmllciwgY29kZUNoYWxsZW5nZSwgc3RhdGUgfSA9IGdlbmVyYXRlUEtDRSgpO1xuXG4gICAgY29uc3QgcmVkaXJlY3RVcmkgPSBnZXRPQXV0aFJlZGlyZWN0VXJpKCk7XG4gICAgY29uc3QgYXV0aFVybCA9IGJ1aWxkQXV0aFVybChjb2RlQ2hhbGxlbmdlLCBzdGF0ZSwgcmVkaXJlY3RVcmkpO1xuXG4gICAgYXdhaXQgc2V0T0F1dGhTdGF0ZShzdGF0ZSwgeyBjb2RlVmVyaWZpZXIsIG5hbWUsIHJlZGlyZWN0VXJpIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlT0F1dGhDYWxsYmFjayhjb2RlOiBzdHJpbmcsIHN0YXRlOiBzdHJpbmcsIHJlcGx5OiBGYXN0aWZ5UmVwbHkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwZW5kaW5nID0gYXdhaXQgZ2V0T0F1dGhTdGF0ZShzdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nKSB7XG4gICAgICBsb2dnZXIud2FybihcIm9hdXRoIGNhbGxiYWNrOiBpbnZhbGlkX3N0YXRlXCIpO1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249aW52YWxpZF9zdGF0ZVwiKTtcbiAgICB9XG4gICAgYXdhaXQgZGVsZXRlT0F1dGhTdGF0ZShzdGF0ZSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW5zID0gYXdhaXQgZXhjaGFuZ2VDb2RlRm9yVG9rZW5zKFxuICAgICAgICBjb2RlLFxuICAgICAgICBwZW5kaW5nLmNvZGVWZXJpZmllcixcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIHBlbmRpbmcucmVkaXJlY3RVcmksXG4gICAgICApO1xuXG4gICAgICBpZiAodG9rZW5zLmFjY291bnRVdWlkKSB7XG4gICAgICAgIGNvbnN0IG9sZEVudHJpZXMgPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRCeUFjY291bnRJZGVudGlmaWVyKFxuICAgICAgICAgIFwiQVwiLFxuICAgICAgICAgIFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgdG9rZW5zLmFjY291bnRVdWlkLFxuICAgICAgICApO1xuICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgVG9rZW5Nb2RlbC5kZWwob2xkRW50cmllcy5tYXAoKG8pID0+IG8uaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwiYW50aHJvcGljXCIsXG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiB0b2tlbnMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICByZWZyZXNoVG9rZW46IHRva2Vucy5yZWZyZXNoVG9rZW4sXG4gICAgICAgICAgICBleHBpcmVzQXQ6IHRva2Vucy5leHBpcmVzQXQgPz8gMCxcbiAgICAgICAgICAgIGFjY291bnRVdWlkOiB0b2tlbnMuYWNjb3VudFV1aWQgPz8gXCJcIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5hbWU6IHBlbmRpbmcubmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuXG4gICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoYC8/b2F1dGg9c3VjY2VzcyZuYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHBlbmRpbmcubmFtZSl9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KGAvP29hdXRoPWVycm9yJnJlYXNvbj0ke2VuY29kZVVSSUNvbXBvbmVudCgoZSBhcyBFcnJvcikubWVzc2FnZSl9YCk7XG4gICAgfVxuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIG9hdXRoU3RhcnRPcGVuQUkobmFtZTogc3RyaW5nKTogUHJvbWlzZTxPQXV0aFN0YXJ0UmVzdWx0PiB7XG4gICAgaWYgKCFRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlcikgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuICAgIGNvbnN0IHsgYXV0aFVybCB9ID0gYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RhcnRCcm93c2VyTG9naW4obmFtZSk7XG5cbiAgICAvLyBmaXJlLWFuZC1mb3JnZXQ6IGNvZGV4IGxvZ2luIOyZhOujjCDrjIDquLAg4oaSIO2GoO2BsCDsoIDsnqVcbiAgICBRZ3JpZERpc3BhdGNoZXIub3BlbmFpRGlzcGF0Y2hlclxuICAgICAgLmNvbXBsZXRlQnJvd3NlckxvZ2luKClcbiAgICAgIC50aGVuKGFzeW5jIChjcmVkcykgPT4ge1xuICAgICAgICBpZiAoY3JlZHMuYWNjb3VudElkKSB7XG4gICAgICAgICAgY29uc3Qgb2xkRW50cmllcyA9IGF3YWl0IFRva2VuTW9kZWwuZmluZEJ5QWNjb3VudElkZW50aWZpZXIoXG4gICAgICAgICAgICBcIkFcIixcbiAgICAgICAgICAgIFwib3BlbmFpXCIsXG4gICAgICAgICAgICBjcmVkcy5hY2NvdW50SWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAob2xkRW50cmllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLmRlbChvbGRFbnRyaWVzLm1hcCgobykgPT4gby5pZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBUb2tlbk1vZGVsLnNhdmUoW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBcIm9wZW5haVwiLFxuICAgICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW46IGNyZWRzLmFjY2Vzc1Rva2VuLFxuICAgICAgICAgICAgICByZWZyZXNoVG9rZW46IGNyZWRzLnJlZnJlc2hUb2tlbixcbiAgICAgICAgICAgICAgaWRUb2tlbjogY3JlZHMuaWRUb2tlbixcbiAgICAgICAgICAgICAgYWNjZXNzVG9rZW5FeHBpcmVzQXQ6IERhdGUubm93KCkgKyAxMCAqIDI0ICogMzYwMCAqIDEwMDAsXG4gICAgICAgICAgICAgIGFjY291bnRJZDogY3JlZHMuYWNjb3VudElkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKGBPcGVuQUkgdG9rZW4gc2F2ZWQgZm9yICR7bmFtZX1gKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYE9wZW5BSSBicm93c2VyIGxvZ2luIGZhaWxlZDogJHsoZSBhcyBFcnJvcikubWVzc2FnZX1gKTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgYXV0aFVybCB9O1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiR0VUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stcXVlcnlcIl0gfSlcbiAgYXN5bmMgdXNhZ2UodG9rZW5JZD86IG51bWJlcik6IFByb21pc2U8VXNhZ2VSZXNwb25zZT4ge1xuICAgIGNvbnN0IHsgcm93czogYWxsVG9rZW5zIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmZpbmRNYW55KFwiQVwiKTtcbiAgICBjb25zdCBlbnRyeSA9IHRva2VuSWRcbiAgICAgID8gYWxsVG9rZW5zLmZpbmQoKGUpID0+IGUuaWQgPT09IHRva2VuSWQpXG4gICAgICA6IGFsbFRva2Vucy5maW5kTGFzdCgoZSkgPT4gZS5hY3RpdmUgJiYgZS5wcm92aWRlciA9PT0gXCJhbnRocm9waWNcIik7XG5cbiAgICBpZiAoIWVudHJ5KSByZXR1cm4geyBlcnJvcjogXCJOT1RfRk9VTkRcIiB9O1xuXG4gICAgaWYgKGVudHJ5LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICBpZiAoIWVudHJ5LmFjdGl2ZSkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlcjogXCJvcGVuYWlcIiwgZml2ZUhvdXI6IG51bGwsIHNldmVuRGF5OiBudWxsIH07XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IGF3YWl0IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy5nZXRSYXRlTGltaXRzQnlUb2tlbklkKGVudHJ5LmlkKTtcbiAgICAgICAgY29uc3QgcmwgPSByYXc/LmRhdGEucmF0ZUxpbWl0cztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBmaXZlSG91cjogcmw/LnByaW1hcnlcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIHV0aWxpemF0aW9uOiBybC5wcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgICAgICAgICAgIHJlc2V0c0F0OiB1bml4U2Vjb25kc1RvSXNvKHJsLnByaW1hcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwucHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICBzZXZlbkRheTogcmw/LnNlY29uZGFyeVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgdXRpbGl6YXRpb246IHJsLnNlY29uZGFyeS51c2VkUGVyY2VudCxcbiAgICAgICAgICAgICAgICByZXNldHNBdDogdW5peFNlY29uZHNUb0lzbyhybC5zZWNvbmRhcnkucmVzZXRzQXQpLFxuICAgICAgICAgICAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcmwuc2Vjb25kYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4geyBlcnJvcjogYE9wZW5BSSB1c2FnZSBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlbnRyeS5wcm92aWRlciAhPT0gXCJhbnRocm9waWNcIikge1xuICAgICAgcmV0dXJuIHsgZXJyb3I6IGB1c2FnZSBBUEkgbm90IHN1cHBvcnRlZCBmb3IgcHJvdmlkZXI6ICR7ZW50cnkucHJvdmlkZXJ9YCB9O1xuICAgIH1cblxuICAgIGxldCBhY2Nlc3NUb2tlbiA9IGdldEFjY2Vzc1Rva2VuKGVudHJ5LmNyZWRlbnRpYWxzKTtcbiAgICBjb25zdCBpc0V4cGlyZWQgPSBnZXRFeHBpcmVzQXQoZW50cnkuY3JlZGVudGlhbHMpIDwgRGF0ZS5ub3coKTtcblxuICAgIGlmIChpc0V4cGlyZWQgJiYgZ2V0UmVmcmVzaFRva2VuKGVudHJ5LmNyZWRlbnRpYWxzKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbihlbnRyeSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIG9hdXRoTG9nZ2VyLndhcm4oYHJlZnJlc2ggZmFpbGVkIGZvciAke2VudHJ5Lm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICByZXR1cm4geyBlcnJvcjogXCJyZS1sb2dpbiByZXF1aXJlZFwiIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmF3ID0gYXdhaXQgZmV0Y2hVc2FnZShhY2Nlc3NUb2tlbik7XG4gICAgaWYgKHJhdy5lcnJvciAmJiBnZXRSZWZyZXNoVG9rZW4oZW50cnkuY3JlZGVudGlhbHMpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMucmVmcmVzaFRva2VuKGVudHJ5KTtcbiAgICAgICAgY29uc3QgcmV0cmllZCA9IGF3YWl0IGZldGNoVXNhZ2UoYWNjZXNzVG9rZW4pO1xuICAgICAgICBpZiAocmV0cmllZC5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJldHJpZWQuZXJyb3IgfTtcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRBbnRocm9waWNVc2FnZShyZXRyaWVkKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgb2F1dGhMb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZW50cnkubmFtZX06ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIHJldHVybiB7IGVycm9yOiBcInJlLWxvZ2luIHJlcXVpcmVkXCIgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJhdy5lcnJvcikgcmV0dXJuIHsgZXJyb3I6IHJhdy5lcnJvciB9O1xuICAgIHJldHVybiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3KTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hUb2tlbih0b2tlbjogVG9rZW5TdWJzZXRBKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBjcmVkcyA9IHRva2VuLmNyZWRlbnRpYWxzO1xuICAgIGNvbnN0IHJ0ID0gZ2V0UmVmcmVzaFRva2VuKGNyZWRzKTtcbiAgICBpZiAoIXJ0KSB0aHJvdyBuZXcgRXJyb3IoXCJObyByZWZyZXNoIHRva2VuXCIpO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHJlZnJlc2hBY2Nlc3NUb2tlbihydCk7XG4gICAgY29uc3QgdXBkYXRlZCA9IFRva2VuQ3JlZGVudGlhbHMucGFyc2Uoe1xuICAgICAgLi4uY3JlZHMsXG4gICAgICBhY2Nlc3NUb2tlbjogcmVmcmVzaGVkLmFjY2Vzc1Rva2VuLFxuICAgICAgcmVmcmVzaFRva2VuOiByZWZyZXNoZWQucmVmcmVzaFRva2VuLFxuICAgICAgZXhwaXJlc0F0OiByZWZyZXNoZWQuZXhwaXJlc0F0LFxuICAgIH0pO1xuICAgIGF3YWl0IFRva2VuTW9kZWwuc2F2ZShbXG4gICAgICB7XG4gICAgICAgIGlkOiB0b2tlbi5pZCxcbiAgICAgICAgcHJvdmlkZXI6IHRva2VuLnByb3ZpZGVyLFxuICAgICAgICBjcmVkZW50aWFsczogdXBkYXRlZCxcbiAgICAgICAgbmFtZTogdG9rZW4ubmFtZSxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgcmV0dXJuIHJlZnJlc2hlZC5hY2Nlc3NUb2tlbjtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdIH0pXG4gIGFzeW5jIGhlYWx0aCgpOiBQcm9taXNlPEhlYWx0aFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1czogXCJva1wiLFxuICAgICAgYWN0aXZlVG9rZW5zOiBRZ3JpZERpc3BhdGNoZXIudG9rZW5zLnNpemUsXG4gICAgICBzdWJzY3JpYmVyOiBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlcj8uc3RhdHVzKCkgPz8gbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZEZyYW1lID0gbmV3IFFncmlkRnJhbWVDbGFzcygpO1xuXG5mdW5jdGlvbiBjb252ZXJ0QW50aHJvcGljVXNhZ2UocmF3OiBBbnRocm9waWNVc2FnZVJhdyk6IFVzYWdlUmVzcG9uc2Uge1xuICByZXR1cm4ge1xuICAgIHByb3ZpZGVyOiBcImFudGhyb3BpY1wiLFxuICAgIGZpdmVIb3VyOiByYXcuZml2ZV9ob3VyXG4gICAgICA/IHsgdXRpbGl6YXRpb246IHJhdy5maXZlX2hvdXIudXRpbGl6YXRpb24sIHJlc2V0c0F0OiByYXcuZml2ZV9ob3VyLnJlc2V0c19hdCB9XG4gICAgICA6IG51bGwsXG4gICAgc2V2ZW5EYXk6IHJhdy5zZXZlbl9kYXlcbiAgICAgID8geyB1dGlsaXphdGlvbjogcmF3LnNldmVuX2RheS51dGlsaXphdGlvbiwgcmVzZXRzQXQ6IHJhdy5zZXZlbl9kYXkucmVzZXRzX2F0IH1cbiAgICAgIDogbnVsbCxcbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7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