@cartanova/qgrid-cli 2.10.4 → 2.10.6

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 (81) hide show
  1. package/bundle/dist/application/monit/monit.frame.js +1 -1
  2. package/bundle/dist/application/qgrid/expired-token-reminder.js +1 -1
  3. package/bundle/dist/application/qgrid/oauth.js +1 -1
  4. package/bundle/dist/application/qgrid/qgrid-image-generation.js +6 -6
  5. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +24 -7
  6. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +8 -3
  7. package/bundle/dist/application/qgrid/qgrid.frame.js +25 -11
  8. package/bundle/dist/application/qgrid/qgrid.types.js +4 -8
  9. package/bundle/dist/application/qgrid/token-death.js +1 -1
  10. package/bundle/dist/application/qgrid/token-window-keepalive.js +1 -1
  11. package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
  12. package/bundle/dist/application/request-log/request-log.model.js +23 -17
  13. package/bundle/dist/i18n/sd.generated.js +3 -3
  14. package/bundle/dist/sonamu.config.js +2 -2
  15. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -1
  16. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  17. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +31 -9
  18. package/bundle/dist/utils/providers/openai/openai-direct-client.js +5 -4
  19. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +111 -57
  20. package/bundle/dist/utils/providers/openai/openai-image-generation.js +25 -17
  21. package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -1
  22. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +34 -5
  23. package/bundle/src/application/qgrid/qgrid-image-generation.ts +17 -13
  24. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +11 -0
  25. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +87 -9
  26. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +45 -5
  27. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +136 -2
  28. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +11 -1
  29. package/bundle/src/application/qgrid/qgrid.frame.test.ts +73 -0
  30. package/bundle/src/application/qgrid/qgrid.frame.ts +43 -6
  31. package/bundle/src/application/qgrid/qgrid.types.ts +14 -4
  32. package/bundle/src/application/request-log/request-log.entity.json +2 -2
  33. package/bundle/src/application/request-log/request-log.model.test.ts +17 -12
  34. package/bundle/src/application/request-log/request-log.model.ts +8 -2
  35. package/bundle/src/application/sonamu.generated.http +2 -2
  36. package/bundle/src/i18n/sd.generated.ts +2 -2
  37. package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +42 -2
  38. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +46 -2
  39. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +15 -0
  40. package/bundle/src/utils/providers/openai/openai-direct-client.ts +14 -4
  41. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +235 -32
  42. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +174 -72
  43. package/bundle/src/utils/providers/openai/openai-image-generation.test.ts +89 -0
  44. package/bundle/src/utils/providers/openai/openai-image-generation.ts +26 -15
  45. package/bundle/web-dist/client/assets/cost-DH2jZbrw.js +1 -0
  46. package/bundle/web-dist/client/assets/{index-reW8VvJF.js → index-D9ryIyL-.js} +4 -4
  47. package/bundle/web-dist/client/assets/logs-CLf2VNfk.js +1 -0
  48. package/bundle/web-dist/client/assets/{monit-DkABv7PG.js → monit-DojxOLj6.js} +1 -1
  49. package/bundle/web-dist/client/assets/{routes-BRmQ4M3-.js → routes-DXJhNvbI.js} +2 -2
  50. package/bundle/web-dist/client/assets/{services.generated-jnPHYMER.js → services.generated-DqFYgWsY.js} +1 -1
  51. package/bundle/web-dist/client/assets/{settings-BHvtycEZ.js → settings-bopyz9pa.js} +1 -1
  52. package/bundle/web-dist/client/assets/{show-qeTIzgDZ.js → show-DbLD3MzB.js} +1 -1
  53. package/bundle/web-dist/client/assets/{tokens-5Bep_G-w.js → tokens-2-AIi9sZ.js} +1 -1
  54. package/bundle/web-dist/client/assets/{use-oauth-login-flow-Cx-QO25M.js → use-oauth-login-flow-CnqTWs_H.js} +1 -1
  55. package/bundle/web-dist/client/assets/{use-update-token-mutation-DQCwCYfR.js → use-update-token-mutation-Cxb9K0fM.js} +1 -1
  56. package/bundle/web-dist/client/index.html +2 -2
  57. package/bundle/web-dist/server/assets/{cost-CSH_t17I.js → cost-eEHeTRT5.js} +5 -1
  58. package/bundle/web-dist/server/assets/{lazyRouteComponent-CUR-kWzI.js → lazyRouteComponent-Bi0fYGLs.js} +2 -2
  59. package/bundle/web-dist/server/assets/{logs-CagNGTBj.js → logs-CIVFxfoi.js} +11 -8
  60. package/bundle/web-dist/server/assets/{monit-DSxs4Jnl.js → monit-DBXezg7R.js} +4 -4
  61. package/bundle/web-dist/server/assets/{plus-Bvdj8Pwx.js → plus-BH-t4cm_.js} +1 -1
  62. package/bundle/web-dist/server/assets/{react-dom-CyuShs9K.js → react-dom-CZ2eynd8.js} +1 -1
  63. package/bundle/web-dist/server/assets/{refresh-cw-3QAiSWBd.js → refresh-cw-CosAdcz0.js} +1 -1
  64. package/bundle/web-dist/server/assets/{routes-i-sTqXMX.js → routes-COWYIvA-.js} +5 -6
  65. package/bundle/web-dist/server/assets/{services.generated-FPwsG9p3.js → services.generated-607iwhMI.js} +2 -2
  66. package/bundle/web-dist/server/assets/{settings-DeHNwoMv.js → settings-C_6dpK5p.js} +3 -3
  67. package/bundle/web-dist/server/assets/{show-C4jk1Hrp.js → show-DY396-LD.js} +8 -20
  68. package/bundle/web-dist/server/assets/{tokens-odgS2-9q.js → tokens-COvV7qUP.js} +4 -4
  69. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DTQKdYBO.js → use-oauth-login-flow-VYCYf3uv.js} +1 -1
  70. package/bundle/web-dist/server/assets/{use-update-token-mutation-xvXbPrCI.js → use-update-token-mutation-D8XYV5of.js} +1 -1
  71. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  72. package/package.json +3 -2
  73. package/skills/qgrid/SKILL.md +9 -8
  74. package/skills/qgrid/references/ai-sdk-provider-contract.md +25 -16
  75. package/skills/qgrid/references/decision-rationale.md +8 -8
  76. package/skills/qgrid/references/openai-codex-runtime.md +23 -11
  77. package/skills/qgrid/references/request-log-run-lifecycle.md +4 -2
  78. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -2
  79. package/skills/qgrid/references/verification-and-debugging.md +23 -9
  80. package/bundle/web-dist/client/assets/cost-CpjVoAqp.js +0 -1
  81. package/bundle/web-dist/client/assets/logs-DDIt97D1.js +0 -1
@@ -1,6 +1,6 @@
1
- import { canonicalAnthropicModel, usesAdaptiveThinking } from "./anthropic-constants.js";
2
1
  import { resolveAnthropicEffort } from "../common/effort.js";
3
2
  import { ThinkingValidationError } from "../common/thinking.js";
3
+ import { canonicalAnthropicModel, usesAdaptiveThinking } from "./anthropic-constants.js";
4
4
  import { execFileSync } from "node:child_process";
5
5
  //#region src/utils/providers/anthropic/anthropic-thinking.ts
6
6
  const THINKING_OFF_MODELS = /* @__PURE__ */ new Set([
@@ -1,3 +1,4 @@
1
+ import { ImageGenerationMetadata } from "../../../application/qgrid/qgrid.types.js";
1
2
  import os from "node:os";
2
3
  //#region src/utils/providers/openai/openai-backend-protocol.ts
3
4
  const CHATGPT_CODEX_RESPONSES_URL = "https://chatgpt.com/backend-api/codex/responses";
@@ -128,13 +129,24 @@ function normalizeOpenAIEvent(raw) {
128
129
  };
129
130
  if ((type === "response.output_item.added" || type === "response.output_item.done") && event.item && typeof event.item === "object") {
130
131
  const item = event.item;
131
- if (item.type === "image_generation_call" && typeof item.result === "string") return {
132
- type: "image",
133
- ...typeof item.id === "string" ? { id: item.id } : {},
134
- base64: item.result,
135
- mimeType: imageMimeType(item.result, item.output_format),
136
- ...typeof item.revised_prompt === "string" ? { revisedPrompt: item.revised_prompt } : typeof item.revisedPrompt === "string" ? { revisedPrompt: item.revisedPrompt } : {}
137
- };
132
+ if (item.type === "image_generation_call" && typeof item.result === "string") {
133
+ const header = Buffer.from(item.result.slice(0, 32), "base64");
134
+ const size = (header.length >= 24 && header.subarray(0, 8).equals(Buffer.from("89504e470d0a1a0a", "hex")) && header.readUInt32BE(16) > 0 && header.readUInt32BE(20) > 0 ? `${header.readUInt32BE(16)}x${header.readUInt32BE(20)}` : void 0) ?? (typeof item.size === "string" && /^[1-9]\d*x[1-9]\d*$/.test(item.size) ? item.size : void 0);
135
+ return {
136
+ type: "image",
137
+ ...typeof item.id === "string" ? { id: item.id } : {},
138
+ base64: item.result,
139
+ mimeType: imageMimeType(item.result, item.output_format),
140
+ generation: {
141
+ route: "codex-responses",
142
+ ...size ? { size } : {},
143
+ ...typeof item.model === "string" ? { model: item.model } : {},
144
+ ...typeof item.quality === "string" ? { quality: item.quality } : {},
145
+ ...typeof item.background === "string" ? { background: item.background } : {}
146
+ },
147
+ ...typeof item.revised_prompt === "string" ? { revisedPrompt: item.revised_prompt } : typeof item.revisedPrompt === "string" ? { revisedPrompt: item.revisedPrompt } : {}
148
+ };
149
+ }
138
150
  return {
139
151
  type: "output-item",
140
152
  item,
@@ -143,11 +155,21 @@ function normalizeOpenAIEvent(raw) {
143
155
  }
144
156
  if (type === "response.completed") {
145
157
  const response = event.response ?? {};
158
+ const toolUsage = response.tool_usage;
159
+ const parsedImageUsage = ImageGenerationMetadata.shape.usage.safeParse(toolUsage?.image_gen);
160
+ const imageUsage = parsedImageUsage.success ? parsedImageUsage.data : void 0;
161
+ const imageTool = Array.isArray(response.tools) ? response.tools.find((tool) => tool?.type === "image_generation") : void 0;
162
+ const imageModel = typeof imageTool?.model === "string" ? imageTool.model : void 0;
146
163
  return {
147
164
  type: "completed",
148
165
  responseId: String(response.id ?? ""),
149
166
  ...response.usage ? { usage: usageFrom(response.usage) } : {},
150
- ...typeof response.model === "string" ? { model: response.model } : {}
167
+ ...typeof response.model === "string" ? { model: response.model } : {},
168
+ ...imageUsage || imageModel ? { imageGeneration: {
169
+ route: "codex-responses",
170
+ ...imageModel ? { model: imageModel } : {},
171
+ ...imageUsage ? { usage: imageUsage } : {}
172
+ } } : {}
151
173
  };
152
174
  }
153
175
  if (type === "error" || type === "response.failed" || type === "response.incomplete") {
@@ -162,4 +184,4 @@ function normalizeOpenAIEvent(raw) {
162
184
  //#endregion
163
185
  export { CHATGPT_CODEX_RESPONSES_URL, CODEX_CLI_ORIGINATOR, CODEX_CLI_VERSION, OpenAIProtocolError, buildCodexIdentityHeaders, buildOpenAIResponsesRequest, codexCliUserAgent, imageMimeType, normalizeOpenAIEvent };
164
186
 
165
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IHR5cGUgSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGEgfSBmcm9tIFwiLi4vLi4vLi4vYXBwbGljYXRpb24vcWdyaWQvcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcblxuZXhwb3J0IGNvbnN0IENIQVRHUFRfQ09ERVhfUkVTUE9OU0VTX1VSTCA9XG4gIFwiaHR0cHM6Ly9jaGF0Z3B0LmNvbS9iYWNrZW5kLWFwaS9jb2RleC9yZXNwb25zZXNcIiBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IENPREVYX0NMSV9PUklHSU5BVE9SID0gXCJjb2RleF9jbGlfcnNcIiBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfVkVSU0lPTiA9IFwiMC4xNDcuMFwiIGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBvc1R5cGU6IHN0cmluZztcbiAgb3NWZXJzaW9uOiBzdHJpbmc7XG4gIGFyY2hpdGVjdHVyZTogc3RyaW5nO1xuICB0ZXJtaW5hbDogc3RyaW5nO1xufVxuXG5mdW5jdGlvbiBjb2RleFBsYXRmb3JtKCk6IENvZGV4VXNlckFnZW50UGxhdGZvcm0ge1xuICBjb25zdCBuYW1lczogUGFydGlhbDxSZWNvcmQ8Tm9kZUpTLlBsYXRmb3JtLCBzdHJpbmc+PiA9IHtcbiAgICBkYXJ3aW46IFwiTWFjIE9TXCIsXG4gICAgbGludXg6IFwiTGludXhcIixcbiAgICB3aW4zMjogXCJXaW5kb3dzXCIsXG4gIH07XG4gIGNvbnN0IHRlcm1pbmFsID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNO1xuICBjb25zdCB0ZXJtaW5hbFZlcnNpb24gPSBwcm9jZXNzLmVudi5URVJNX1BST0dSQU1fVkVSU0lPTjtcbiAgcmV0dXJuIHtcbiAgICBvc1R5cGU6IG5hbWVzW3Byb2Nlc3MucGxhdGZvcm1dID8/IHByb2Nlc3MucGxhdGZvcm0sXG4gICAgb3NWZXJzaW9uOiBvcy5yZWxlYXNlKCksXG4gICAgYXJjaGl0ZWN0dXJlOiBwcm9jZXNzLmFyY2gsXG4gICAgdGVybWluYWw6IHRlcm1pbmFsID8gYCR7dGVybWluYWx9JHt0ZXJtaW5hbFZlcnNpb24gPyBgLyR7dGVybWluYWxWZXJzaW9ufWAgOiBcIlwifWAgOiBcInVua25vd25cIixcbiAgfTtcbn1cblxuLyoqIE1hdGNoZXMgdGhlIHBsYXRmb3JtL3Rlcm1pbmFsIHN1ZmZpeCBlbWl0dGVkIGJ5IHRoZSBwaW5uZWQgUnVzdCBDb2RleCBDTEkuICovXG5leHBvcnQgZnVuY3Rpb24gY29kZXhDbGlVc2VyQWdlbnQocGxhdGZvcm06IENvZGV4VXNlckFnZW50UGxhdGZvcm0gPSBjb2RleFBsYXRmb3JtKCkpOiBzdHJpbmcge1xuICByZXR1cm4gYGNvZGV4X2NsaV9ycy8ke0NPREVYX0NMSV9WRVJTSU9OfSAoJHtwbGF0Zm9ybS5vc1R5cGV9ICR7cGxhdGZvcm0ub3NWZXJzaW9ufTsgJHtwbGF0Zm9ybS5hcmNoaXRlY3R1cmV9KSAke3BsYXRmb3JtLnRlcm1pbmFsfWA7XG59XG5cbmV4cG9ydCB0eXBlIEpzb25WYWx1ZSA9XG4gIHwgbnVsbFxuICB8IGJvb2xlYW5cbiAgfCBudW1iZXJcbiAgfCBzdHJpbmdcbiAgfCBKc29uVmFsdWVbXVxuICB8IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIH07XG5cbi8qKiBSYXcgUmVzcG9uc2VzIEFQSSBpdGVtcy4gS2VlcGluZyB0aGVzZSBvcGFxdWUgcHJlc2VydmVzIHRoZSBjb21wbGV0ZSBjb252ZXJzYXRpb24gaGlzdG9yeS4gKi9cbmV4cG9ydCB0eXBlIE9wZW5BSVJlc3BvbnNlSXRlbSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSU91dHB1dFNjaGVtYSB7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHNjaGVtYTogSnNvblZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGhpc3Rvcnk6IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IHJlYWRvbmx5IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sQ2hvaWNlPzogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbFRvb2xDYWxscz86IGJvb2xlYW47XG4gIHJlYXNvbmluZz86IHtcbiAgICBlZmZvcnQ/OiBPcGVuQUlFZmZvcnQgfCBcIm5vbmVcIjtcbiAgICBzdW1tYXJ5PzogXCJhdXRvXCIgfCBcImNvbmNpc2VcIiB8IFwiZGV0YWlsZWRcIjtcbiAgfTtcbiAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgc2VydmljZVRpZXI/OiBzdHJpbmc7XG4gIHByb21wdENhY2hlS2V5Pzogc3RyaW5nO1xuICBvdXRwdXRTY2hlbWE/OiBPcGVuQUlPdXRwdXRTY2hlbWE7XG4gIGltYWdlR2VuZXJhdGlvbj86IGJvb2xlYW4gfCBPcGVuQUlSZXNwb25zZUl0ZW07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIGluc3RydWN0aW9ucz86IHN0cmluZztcbiAgaW5wdXQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29scz86IE9wZW5BSVJlc3BvbnNlSXRlbVtdO1xuICB0b29sX2Nob2ljZTogc3RyaW5nIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICBwYXJhbGxlbF90b29sX2NhbGxzOiBib29sZWFuO1xuICByZWFzb25pbmc6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnNbXCJyZWFzb25pbmdcIl0gfCBudWxsO1xuICBzdG9yZTogZmFsc2U7XG4gIHN0cmVhbTogdHJ1ZTtcbiAgaW5jbHVkZTogc3RyaW5nW107XG4gIHNlcnZpY2VfdGllcj86IHN0cmluZztcbiAgcHJvbXB0X2NhY2hlX2tleT86IHN0cmluZztcbiAgdGV4dD86IHtcbiAgICB2ZXJib3NpdHk/OiBcImxvd1wiIHwgXCJtZWRpdW1cIiB8IFwiaGlnaFwiO1xuICAgIGZvcm1hdD86IHtcbiAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIjtcbiAgICAgIHN0cmljdDogdHJ1ZTtcbiAgICAgIHNjaGVtYTogSnNvblZhbHVlO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoXG4gIG9wdGlvbnM6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMsXG4pOiBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0IHtcbiAgY29uc3QgdG9vbHMgPSBvcHRpb25zLnRvb2xzID8gWy4uLm9wdGlvbnMudG9vbHNdIDogW107XG4gIGlmIChvcHRpb25zLmltYWdlR2VuZXJhdGlvbikge1xuICAgIHRvb2xzLnB1c2goXG4gICAgICBvcHRpb25zLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZVxuICAgICAgICA/IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIgfVxuICAgICAgICA6IHsgdHlwZTogXCJpbWFnZV9nZW5lcmF0aW9uXCIsIC4uLm9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uIH0sXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRleHQgPVxuICAgIG9wdGlvbnMudmVyYm9zaXR5IHx8IG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICA/IHtcbiAgICAgICAgICAuLi4ob3B0aW9ucy52ZXJib3NpdHkgPyB7IHZlcmJvc2l0eTogb3B0aW9ucy52ZXJib3NpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4ob3B0aW9ucy5vdXRwdXRTY2hlbWFcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIGZvcm1hdDoge1xuICAgICAgICAgICAgICAgICAgdHlwZTogXCJqc29uX3NjaGVtYVwiIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgc2NoZW1hOiBvcHRpb25zLm91dHB1dFNjaGVtYS5zY2hlbWEsXG4gICAgICAgICAgICAgICAgICBuYW1lOiBvcHRpb25zLm91dHB1dFNjaGVtYS5uYW1lID8/IFwiY29kZXhfb3V0cHV0X3NjaGVtYVwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4ge1xuICAgIG1vZGVsOiBvcHRpb25zLm1vZGVsLFxuICAgIC4uLihvcHRpb25zLmluc3RydWN0aW9ucyA/IHsgaW5zdHJ1Y3Rpb25zOiBvcHRpb25zLmluc3RydWN0aW9ucyB9IDoge30pLFxuICAgIC8vIENvcHkgdGhlIGFycmF5LCBub3QgaXRzIGl0ZW1zOiByYXcgaXRlbXMgbXVzdCBhcnJpdmUgYnl0ZS1mb3ItYnl0ZSBlcXVpdmFsZW50LlxuICAgIGlucHV0OiBbLi4ub3B0aW9ucy5oaXN0b3J5XSxcbiAgICAuLi4odG9vbHMubGVuZ3RoID8geyB0b29scyB9IDoge30pLFxuICAgIHRvb2xfY2hvaWNlOiBvcHRpb25zLnRvb2xDaG9pY2UgPz8gXCJhdXRvXCIsXG4gICAgcGFyYWxsZWxfdG9vbF9jYWxsczogb3B0aW9ucy5wYXJhbGxlbFRvb2xDYWxscyA/PyB0cnVlLFxuICAgIHJlYXNvbmluZzogb3B0aW9ucy5yZWFzb25pbmcgPz8gbnVsbCxcbiAgICBzdG9yZTogZmFsc2UsXG4gICAgc3RyZWFtOiB0cnVlLFxuICAgIGluY2x1ZGU6IFtcInJlYXNvbmluZy5lbmNyeXB0ZWRfY29udGVudFwiXSxcbiAgICAuLi4ob3B0aW9ucy5zZXJ2aWNlVGllciA/IHsgc2VydmljZV90aWVyOiBvcHRpb25zLnNlcnZpY2VUaWVyIH0gOiB7fSksXG4gICAgLi4uKG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgPyB7IHByb21wdF9jYWNoZV9rZXk6IG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgfSA6IHt9KSxcbiAgICAuLi4odGV4dCA/IHsgdGV4dCB9IDoge30pLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgYWNjZXNzVG9rZW46IHN0cmluZyxcbiAgYWNjb3VudElkOiBzdHJpbmcsXG4gIGNvcnJlbGF0aW9uPzogeyBzZXNzaW9uSWQ/OiBzdHJpbmc7IHRocmVhZElkPzogc3RyaW5nOyBjbGllbnRSZXF1ZXN0SWQ/OiBzdHJpbmcgfSxcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICByZXR1cm4ge1xuICAgIEFjY2VwdDogXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiLFxuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgIFwiQ2hhdEdQVC1BY2NvdW50LUlEXCI6IGFjY291bnRJZCxcbiAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICBvcmlnaW5hdG9yOiBDT0RFWF9DTElfT1JJR0lOQVRPUixcbiAgICBcIlVzZXItQWdlbnRcIjogY29kZXhDbGlVc2VyQWdlbnQoKSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnNlc3Npb25JZCA/IHsgXCJzZXNzaW9uLWlkXCI6IGNvcnJlbGF0aW9uLnNlc3Npb25JZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8udGhyZWFkSWQgPyB7IFwidGhyZWFkLWlkXCI6IGNvcnJlbGF0aW9uLnRocmVhZElkIH0gOiB7fSksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5jbGllbnRSZXF1ZXN0SWQgPyB7IFwieC1jbGllbnQtcmVxdWVzdC1pZFwiOiBjb3JyZWxhdGlvbi5jbGllbnRSZXF1ZXN0SWQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlVc2FnZSB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdUb2tlbnM6IG51bWJlcjtcbiAgdG90YWxUb2tlbnM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJTm9ybWFsaXplZEV2ZW50ID1cbiAgfCB7IHR5cGU6IFwiY3JlYXRlZFwiOyByZXNwb25zZUlkPzogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwidGV4dC1kZWx0YVwiOyB0ZXh0OiBzdHJpbmc7IGl0ZW1JZD86IHN0cmluZyB9XG4gIHwge1xuICAgICAgdHlwZTogXCJpbWFnZVwiO1xuICAgICAgaWQ/OiBzdHJpbmc7XG4gICAgICBiYXNlNjQ6IHN0cmluZztcbiAgICAgIG1pbWVUeXBlOiBcImltYWdlL3BuZ1wiIHwgXCJpbWFnZS9qcGVnXCIgfCBcImltYWdlL3dlYnBcIjtcbiAgICAgIHJldmlzZWRQcm9tcHQ/OiBzdHJpbmc7XG4gICAgICBnZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG4gICAgfVxuICB8IHsgdHlwZTogXCJvdXRwdXQtaXRlbVwiOyBpdGVtOiBPcGVuQUlSZXNwb25zZUl0ZW07IGNvbXBsZXRlZD86IGJvb2xlYW4gfVxuICB8IHsgdHlwZTogXCJjb21wbGV0ZWRcIjsgcmVzcG9uc2VJZDogc3RyaW5nOyB1c2FnZT86IE9wZW5BSVVzYWdlOyBtb2RlbD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcImVycm9yXCI7IGVycm9yOiBPcGVuQUlQcm90b2NvbEVycm9yIH07XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlQcm90b2NvbEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IHN0YXR1cz86IG51bWJlcixcbiAgICBwdWJsaWMgcmVhZG9ubHkgcmV0cnlBZnRlck1zPzogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIk9wZW5BSVByb3RvY29sRXJyb3JcIjtcbiAgfVxufVxuXG5mdW5jdGlvbiB1c2FnZUZyb20odmFsdWU6IHVua25vd24pOiBPcGVuQUlVc2FnZSB8IHVuZGVmaW5lZCB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB1c2FnZSA9IHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBpbnB1dERldGFpbHMgPSAodXNhZ2UuaW5wdXRfdG9rZW5zX2RldGFpbHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBvdXRwdXREZXRhaWxzID0gKHVzYWdlLm91dHB1dF90b2tlbnNfZGV0YWlscyA/PyB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7XG4gICAgaW5wdXRUb2tlbnM6IE51bWJlcih1c2FnZS5pbnB1dF90b2tlbnMgPz8gMCksXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IE51bWJlcihpbnB1dERldGFpbHMuY2FjaGVkX3Rva2VucyA/PyAwKSxcbiAgICBvdXRwdXRUb2tlbnM6IE51bWJlcih1c2FnZS5vdXRwdXRfdG9rZW5zID8/IDApLFxuICAgIHJlYXNvbmluZ1Rva2VuczogTnVtYmVyKG91dHB1dERldGFpbHMucmVhc29uaW5nX3Rva2VucyA/PyAwKSxcbiAgICB0b3RhbFRva2VuczogTnVtYmVyKHVzYWdlLnRvdGFsX3Rva2VucyA/PyAwKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGltYWdlTWltZVR5cGUoXG4gIGJhc2U2NDogc3RyaW5nLFxuICBvdXRwdXRGb3JtYXQ/OiB1bmtub3duLFxuKTogXCJpbWFnZS9wbmdcIiB8IFwiaW1hZ2UvanBlZ1wiIHwgXCJpbWFnZS93ZWJwXCIge1xuICAvLyBJbnNwZWN0IG9ubHkgdGhlIGhlYWRlciwgd2l0aG91dCBkZWNvZGluZyBhIHBvdGVudGlhbGx5IGxhcmdlIGltYWdlIHR3aWNlLlxuICBjb25zdCBoZWFkZXIgPSBCdWZmZXIuZnJvbShiYXNlNjQuc2xpY2UoMCwgMjQpLCBcImJhc2U2NFwiKTtcbiAgaWYgKGhlYWRlci5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oWzEzNywgODAsIDc4LCA3MSwgMTMsIDEwLCAyNiwgMTBdKSkpXG4gICAgcmV0dXJuIFwiaW1hZ2UvcG5nXCI7XG4gIGlmIChoZWFkZXJbMF0gPT09IDI1NSAmJiBoZWFkZXJbMV0gPT09IDIxNiAmJiBoZWFkZXJbMl0gPT09IDI1NSkgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAoaGVhZGVyLnRvU3RyaW5nKFwiYXNjaWlcIiwgMCwgNCkgPT09IFwiUklGRlwiICYmIGhlYWRlci50b1N0cmluZyhcImFzY2lpXCIsIDgsIDEyKSA9PT0gXCJXRUJQXCIpXG4gICAgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcImpwZWdcIikgcmV0dXJuIFwiaW1hZ2UvanBlZ1wiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSBcIndlYnBcIikgcmV0dXJuIFwiaW1hZ2Uvd2VicFwiO1xuICBpZiAob3V0cHV0Rm9ybWF0ID09PSB1bmRlZmluZWQgfHwgb3V0cHV0Rm9ybWF0ID09PSBcInBuZ1wiKSByZXR1cm4gXCJpbWFnZS9wbmdcIjtcbiAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoYFVuc3VwcG9ydGVkIGltYWdlIG91dHB1dCBmb3JtYXQ6ICR7U3RyaW5nKG91dHB1dEZvcm1hdCl9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcGVuQUlFdmVudChyYXc6IHVua25vd24pOiBPcGVuQUlOb3JtYWxpemVkRXZlbnQgfCB1bmRlZmluZWQge1xuICBpZiAoIXJhdyB8fCB0eXBlb2YgcmF3ICE9PSBcIm9iamVjdFwiKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBldmVudCA9IHJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdHlwZSA9IFN0cmluZyhldmVudC50eXBlID8/IFwiXCIpO1xuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jcmVhdGVkXCIpIHtcbiAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LnJlc3BvbnNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiB7IHR5cGU6IFwiY3JlYXRlZFwiLCAuLi4ocmVzcG9uc2U/LmlkID8geyByZXNwb25zZUlkOiBTdHJpbmcocmVzcG9uc2UuaWQpIH0gOiB7fSkgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfdGV4dC5kZWx0YVwiICYmIHR5cGVvZiBldmVudC5kZWx0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcInRleHQtZGVsdGFcIixcbiAgICAgIHRleHQ6IGV2ZW50LmRlbHRhLFxuICAgICAgLi4uKHR5cGVvZiBldmVudC5pdGVtX2lkID09PSBcInN0cmluZ1wiID8geyBpdGVtSWQ6IGV2ZW50Lml0ZW1faWQgfSA6IHt9KSxcbiAgICB9O1xuICB9XG4gIGlmIChcbiAgICAodHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5hZGRlZFwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uZG9uZVwiKSAmJlxuICAgIGV2ZW50Lml0ZW0gJiZcbiAgICB0eXBlb2YgZXZlbnQuaXRlbSA9PT0gXCJvYmplY3RcIlxuICApIHtcbiAgICBjb25zdCBpdGVtID0gZXZlbnQuaXRlbSBhcyBPcGVuQUlSZXNwb25zZUl0ZW07XG4gICAgaWYgKGl0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIiAmJiB0eXBlb2YgaXRlbS5yZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLmlkID09PSBcInN0cmluZ1wiID8geyBpZDogaXRlbS5pZCB9IDoge30pLFxuICAgICAgICBiYXNlNjQ6IGl0ZW0ucmVzdWx0LFxuICAgICAgICBtaW1lVHlwZTogaW1hZ2VNaW1lVHlwZShpdGVtLnJlc3VsdCwgaXRlbS5vdXRwdXRfZm9ybWF0KSxcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLnJldmlzZWRfcHJvbXB0ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZF9wcm9tcHQgfVxuICAgICAgICAgIDogdHlwZW9mIGl0ZW0ucmV2aXNlZFByb21wdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyB7IHJldmlzZWRQcm9tcHQ6IGl0ZW0ucmV2aXNlZFByb21wdCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiB7IHR5cGU6IFwib3V0cHV0LWl0ZW1cIiwgaXRlbSwgY29tcGxldGVkOiB0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcInJlc3BvbnNlLmNvbXBsZXRlZFwiKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSAoZXZlbnQucmVzcG9uc2UgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImNvbXBsZXRlZFwiLFxuICAgICAgcmVzcG9uc2VJZDogU3RyaW5nKHJlc3BvbnNlLmlkID8/IFwiXCIpLFxuICAgICAgLi4uKHJlc3BvbnNlLnVzYWdlID8geyB1c2FnZTogdXNhZ2VGcm9tKHJlc3BvbnNlLnVzYWdlKSB9IDoge30pLFxuICAgICAgLi4uKHR5cGVvZiByZXNwb25zZS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IHsgbW9kZWw6IHJlc3BvbnNlLm1vZGVsIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJlcnJvclwiIHx8IHR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5pbmNvbXBsZXRlXCIpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAoZXZlbnQuZXJyb3IgPz8gZXZlbnQucmVzcG9uc2UgPz8gZXZlbnQpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IG5lc3RlZCA9IChzb3VyY2UuZXJyb3IgPz8gc291cmNlKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJlcnJvclwiLFxuICAgICAgZXJyb3I6IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICBTdHJpbmcobmVzdGVkLm1lc3NhZ2UgPz8gYE9wZW5BSSBzdHJlYW0gZW5kZWQgd2l0aCAke3R5cGV9YCksXG4gICAgICAgIHR5cGVvZiBuZXN0ZWQuY29kZSA9PT0gXCJzdHJpbmdcIiA/IG5lc3RlZC5jb2RlIDogdW5kZWZpbmVkLFxuICAgICAgKSxcbiAgICB9O1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBS0EsTUFBYSw4QkFDWDtBQUVGLE1BQWEsdUJBQXVCO0FBQ3BDLE1BQWEsb0JBQW9CO0FBU2pDLFNBQVMsZ0JBQXdDO0NBQy9DLE1BQU0sUUFBa0Q7RUFDdEQsUUFBUTtFQUNSLE9BQU87RUFDUCxPQUFPO0NBQ1Q7Q0FDQSxNQUFNLFdBQVcsUUFBUSxJQUFJO0NBQzdCLE1BQU0sa0JBQWtCLFFBQVEsSUFBSTtDQUNwQyxPQUFPO0VB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
187
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2wudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9zIGZyb20gXCJub2RlOm9zXCI7XG5cbmltcG9ydCB7IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUVmZm9ydCB9IGZyb20gXCIuLi9jb21tb24vZWZmb3J0XCI7XG5cbmV4cG9ydCBjb25zdCBDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwgPVxuICBcImh0dHBzOi8vY2hhdGdwdC5jb20vYmFja2VuZC1hcGkvY29kZXgvcmVzcG9uc2VzXCIgYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBDT0RFWF9DTElfT1JJR0lOQVRPUiA9IFwiY29kZXhfY2xpX3JzXCIgYXMgY29uc3Q7XG5leHBvcnQgY29uc3QgQ09ERVhfQ0xJX1ZFUlNJT04gPSBcIjAuMTQ3LjBcIiBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBDb2RleFVzZXJBZ2VudFBsYXRmb3JtIHtcbiAgb3NUeXBlOiBzdHJpbmc7XG4gIG9zVmVyc2lvbjogc3RyaW5nO1xuICBhcmNoaXRlY3R1cmU6IHN0cmluZztcbiAgdGVybWluYWw6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gY29kZXhQbGF0Zm9ybSgpOiBDb2RleFVzZXJBZ2VudFBsYXRmb3JtIHtcbiAgY29uc3QgbmFtZXM6IFBhcnRpYWw8UmVjb3JkPE5vZGVKUy5QbGF0Zm9ybSwgc3RyaW5nPj4gPSB7XG4gICAgZGFyd2luOiBcIk1hYyBPU1wiLFxuICAgIGxpbnV4OiBcIkxpbnV4XCIsXG4gICAgd2luMzI6IFwiV2luZG93c1wiLFxuICB9O1xuICBjb25zdCB0ZXJtaW5hbCA9IHByb2Nlc3MuZW52LlRFUk1fUFJPR1JBTTtcbiAgY29uc3QgdGVybWluYWxWZXJzaW9uID0gcHJvY2Vzcy5lbnYuVEVSTV9QUk9HUkFNX1ZFUlNJT047XG4gIHJldHVybiB7XG4gICAgb3NUeXBlOiBuYW1lc1twcm9jZXNzLnBsYXRmb3JtXSA/PyBwcm9jZXNzLnBsYXRmb3JtLFxuICAgIG9zVmVyc2lvbjogb3MucmVsZWFzZSgpLFxuICAgIGFyY2hpdGVjdHVyZTogcHJvY2Vzcy5hcmNoLFxuICAgIHRlcm1pbmFsOiB0ZXJtaW5hbCA/IGAke3Rlcm1pbmFsfSR7dGVybWluYWxWZXJzaW9uID8gYC8ke3Rlcm1pbmFsVmVyc2lvbn1gIDogXCJcIn1gIDogXCJ1bmtub3duXCIsXG4gIH07XG59XG5cbi8qKiBNYXRjaGVzIHRoZSBwbGF0Zm9ybS90ZXJtaW5hbCBzdWZmaXggZW1pdHRlZCBieSB0aGUgcGlubmVkIFJ1c3QgQ29kZXggQ0xJLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvZGV4Q2xpVXNlckFnZW50KHBsYXRmb3JtOiBDb2RleFVzZXJBZ2VudFBsYXRmb3JtID0gY29kZXhQbGF0Zm9ybSgpKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBjb2RleF9jbGlfcnMvJHtDT0RFWF9DTElfVkVSU0lPTn0gKCR7cGxhdGZvcm0ub3NUeXBlfSAke3BsYXRmb3JtLm9zVmVyc2lvbn07ICR7cGxhdGZvcm0uYXJjaGl0ZWN0dXJlfSkgJHtwbGF0Zm9ybS50ZXJtaW5hbH1gO1xufVxuXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPVxuICB8IG51bGxcbiAgfCBib29sZWFuXG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgSnNvblZhbHVlW11cbiAgfCB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB9O1xuXG4vKiogUmF3IFJlc3BvbnNlcyBBUEkgaXRlbXMuIEtlZXBpbmcgdGhlc2Ugb3BhcXVlIHByZXNlcnZlcyB0aGUgY29tcGxldGUgY29udmVyc2F0aW9uIGhpc3RvcnkuICovXG5leHBvcnQgdHlwZSBPcGVuQUlSZXNwb25zZUl0ZW0gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlPdXRwdXRTY2hlbWEge1xuICBuYW1lPzogc3RyaW5nO1xuICBzY2hlbWE6IEpzb25WYWx1ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNPcHRpb25zIHtcbiAgbW9kZWw6IHN0cmluZztcbiAgaW5zdHJ1Y3Rpb25zPzogc3RyaW5nO1xuICBoaXN0b3J5OiByZWFkb25seSBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbHM/OiByZWFkb25seSBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbENob2ljZT86IHN0cmluZyB8IE9wZW5BSVJlc3BvbnNlSXRlbTtcbiAgcGFyYWxsZWxUb29sQ2FsbHM/OiBib29sZWFuO1xuICByZWFzb25pbmc/OiB7XG4gICAgZWZmb3J0PzogT3BlbkFJRWZmb3J0IHwgXCJub25lXCI7XG4gICAgc3VtbWFyeT86IFwiYXV0b1wiIHwgXCJjb25jaXNlXCIgfCBcImRldGFpbGVkXCI7XG4gIH07XG4gIHZlcmJvc2l0eT86IFwibG93XCIgfCBcIm1lZGl1bVwiIHwgXCJoaWdoXCI7XG4gIHNlcnZpY2VUaWVyPzogc3RyaW5nO1xuICBwcm9tcHRDYWNoZUtleT86IHN0cmluZztcbiAgb3V0cHV0U2NoZW1hPzogT3BlbkFJT3V0cHV0U2NoZW1hO1xuICBpbWFnZUdlbmVyYXRpb24/OiBib29sZWFuIHwgT3BlbkFJUmVzcG9uc2VJdGVtO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVJlc3BvbnNlc1JlcXVlc3Qge1xuICBtb2RlbDogc3RyaW5nO1xuICBpbnN0cnVjdGlvbnM/OiBzdHJpbmc7XG4gIGlucHV0OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbHM/OiBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgdG9vbF9jaG9pY2U6IHN0cmluZyB8IE9wZW5BSVJlc3BvbnNlSXRlbTtcbiAgcGFyYWxsZWxfdG9vbF9jYWxsczogYm9vbGVhbjtcbiAgcmVhc29uaW5nOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgbnVsbDtcbiAgc3RvcmU6IGZhbHNlO1xuICBzdHJlYW06IHRydWU7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBzZXJ2aWNlX3RpZXI/OiBzdHJpbmc7XG4gIHByb21wdF9jYWNoZV9rZXk/OiBzdHJpbmc7XG4gIHRleHQ/OiB7XG4gICAgdmVyYm9zaXR5PzogXCJsb3dcIiB8IFwibWVkaXVtXCIgfCBcImhpZ2hcIjtcbiAgICBmb3JtYXQ/OiB7XG4gICAgICB0eXBlOiBcImpzb25fc2NoZW1hXCI7XG4gICAgICBzdHJpY3Q6IHRydWU7XG4gICAgICBzY2hlbWE6IEpzb25WYWx1ZTtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICB9O1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRPcGVuQUlSZXNwb25zZXNSZXF1ZXN0KFxuICBvcHRpb25zOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zLFxuKTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCB7XG4gIGNvbnN0IHRvb2xzID0gb3B0aW9ucy50b29scyA/IFsuLi5vcHRpb25zLnRvb2xzXSA6IFtdO1xuICBpZiAob3B0aW9ucy5pbWFnZUdlbmVyYXRpb24pIHtcbiAgICB0b29scy5wdXNoKFxuICAgICAgb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IHRydWVcbiAgICAgICAgPyB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiIH1cbiAgICAgICAgOiB7IHR5cGU6IFwiaW1hZ2VfZ2VuZXJhdGlvblwiLCAuLi5vcHRpb25zLmltYWdlR2VuZXJhdGlvbiB9LFxuICAgICk7XG4gIH1cblxuICBjb25zdCB0ZXh0ID1cbiAgICBvcHRpb25zLnZlcmJvc2l0eSB8fCBvcHRpb25zLm91dHB1dFNjaGVtYVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uKG9wdGlvbnMudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IG9wdGlvbnMudmVyYm9zaXR5IH0gOiB7fSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMub3V0cHV0U2NoZW1hXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwianNvbl9zY2hlbWFcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICAgIHNjaGVtYTogb3B0aW9ucy5vdXRwdXRTY2hlbWEuc2NoZW1hLFxuICAgICAgICAgICAgICAgICAgbmFtZTogb3B0aW9ucy5vdXRwdXRTY2hlbWEubmFtZSA/PyBcImNvZGV4X291dHB1dF9zY2hlbWFcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAuLi4ob3B0aW9ucy5pbnN0cnVjdGlvbnMgPyB7IGluc3RydWN0aW9uczogb3B0aW9ucy5pbnN0cnVjdGlvbnMgfSA6IHt9KSxcbiAgICAvLyBDb3B5IHRoZSBhcnJheSwgbm90IGl0cyBpdGVtczogcmF3IGl0ZW1zIG11c3QgYXJyaXZlIGJ5dGUtZm9yLWJ5dGUgZXF1aXZhbGVudC5cbiAgICBpbnB1dDogWy4uLm9wdGlvbnMuaGlzdG9yeV0sXG4gICAgLi4uKHRvb2xzLmxlbmd0aCA/IHsgdG9vbHMgfSA6IHt9KSxcbiAgICB0b29sX2Nob2ljZTogb3B0aW9ucy50b29sQ2hvaWNlID8/IFwiYXV0b1wiLFxuICAgIHBhcmFsbGVsX3Rvb2xfY2FsbHM6IG9wdGlvbnMucGFyYWxsZWxUb29sQ2FsbHMgPz8gdHJ1ZSxcbiAgICByZWFzb25pbmc6IG9wdGlvbnMucmVhc29uaW5nID8/IG51bGwsXG4gICAgc3RvcmU6IGZhbHNlLFxuICAgIHN0cmVhbTogdHJ1ZSxcbiAgICBpbmNsdWRlOiBbXCJyZWFzb25pbmcuZW5jcnlwdGVkX2NvbnRlbnRcIl0sXG4gICAgLi4uKG9wdGlvbnMuc2VydmljZVRpZXIgPyB7IHNlcnZpY2VfdGllcjogb3B0aW9ucy5zZXJ2aWNlVGllciB9IDoge30pLFxuICAgIC4uLihvcHRpb25zLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRfY2FjaGVfa2V5OiBvcHRpb25zLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHRleHQgPyB7IHRleHQgfSA6IHt9KSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gIGFjY2Vzc1Rva2VuOiBzdHJpbmcsXG4gIGFjY291bnRJZDogc3RyaW5nLFxuICBjb3JyZWxhdGlvbj86IHsgc2Vzc2lvbklkPzogc3RyaW5nOyB0aHJlYWRJZD86IHN0cmluZzsgY2xpZW50UmVxdWVzdElkPzogc3RyaW5nIH0sXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgcmV0dXJuIHtcbiAgICBBY2NlcHQ6IFwidGV4dC9ldmVudC1zdHJlYW1cIixcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICBcIkNoYXRHUFQtQWNjb3VudC1JRFwiOiBhY2NvdW50SWQsXG4gICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgb3JpZ2luYXRvcjogQ09ERVhfQ0xJX09SSUdJTkFUT1IsXG4gICAgXCJVc2VyLUFnZW50XCI6IGNvZGV4Q2xpVXNlckFnZW50KCksXG4gICAgLi4uKGNvcnJlbGF0aW9uPy5zZXNzaW9uSWQgPyB7IFwic2Vzc2lvbi1pZFwiOiBjb3JyZWxhdGlvbi5zZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAuLi4oY29ycmVsYXRpb24/LnRocmVhZElkID8geyBcInRocmVhZC1pZFwiOiBjb3JyZWxhdGlvbi50aHJlYWRJZCB9IDoge30pLFxuICAgIC4uLihjb3JyZWxhdGlvbj8uY2xpZW50UmVxdWVzdElkID8geyBcIngtY2xpZW50LXJlcXVlc3QtaWRcIjogY29ycmVsYXRpb24uY2xpZW50UmVxdWVzdElkIH0gOiB7fSksXG4gIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJVXNhZ2Uge1xuICBpbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgcmVhc29uaW5nVG9rZW5zOiBudW1iZXI7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG59XG5cbmV4cG9ydCB0eXBlIE9wZW5BSU5vcm1hbGl6ZWRFdmVudCA9XG4gIHwgeyB0eXBlOiBcImNyZWF0ZWRcIjsgcmVzcG9uc2VJZD86IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcInRleHQtZGVsdGFcIjsgdGV4dDogc3RyaW5nOyBpdGVtSWQ/OiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwiaW1hZ2VcIjtcbiAgICAgIGlkPzogc3RyaW5nO1xuICAgICAgYmFzZTY0OiBzdHJpbmc7XG4gICAgICBtaW1lVHlwZTogXCJpbWFnZS9wbmdcIiB8IFwiaW1hZ2UvanBlZ1wiIHwgXCJpbWFnZS93ZWJwXCI7XG4gICAgICByZXZpc2VkUHJvbXB0Pzogc3RyaW5nO1xuICAgICAgZ2VuZXJhdGlvbj86IEltYWdlR2VuZXJhdGlvbk1ldGFkYXRhO1xuICAgIH1cbiAgfCB7IHR5cGU6IFwib3V0cHV0LWl0ZW1cIjsgaXRlbTogT3BlbkFJUmVzcG9uc2VJdGVtOyBjb21wbGV0ZWQ/OiBib29sZWFuIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImNvbXBsZXRlZFwiO1xuICAgICAgcmVzcG9uc2VJZDogc3RyaW5nO1xuICAgICAgdXNhZ2U/OiBPcGVuQUlVc2FnZTtcbiAgICAgIG1vZGVsPzogc3RyaW5nO1xuICAgICAgaW1hZ2VHZW5lcmF0aW9uPzogSW1hZ2VHZW5lcmF0aW9uTWV0YWRhdGE7XG4gICAgfVxuICB8IHsgdHlwZTogXCJlcnJvclwiOyBlcnJvcjogT3BlbkFJUHJvdG9jb2xFcnJvciB9O1xuXG5leHBvcnQgY2xhc3MgT3BlbkFJUHJvdG9jb2xFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjb2RlPzogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzdGF0dXM/OiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHJldHJ5QWZ0ZXJNcz86IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gXCJPcGVuQUlQcm90b2NvbEVycm9yXCI7XG4gIH1cbn1cblxuZnVuY3Rpb24gdXNhZ2VGcm9tKHZhbHVlOiB1bmtub3duKTogT3BlbkFJVXNhZ2UgfCB1bmRlZmluZWQge1xuICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdXNhZ2UgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgaW5wdXREZXRhaWxzID0gKHVzYWdlLmlucHV0X3Rva2Vuc19kZXRhaWxzID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3Qgb3V0cHV0RGV0YWlscyA9ICh1c2FnZS5vdXRwdXRfdG9rZW5zX2RldGFpbHMgPz8ge30pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiBOdW1iZXIodXNhZ2UuaW5wdXRfdG9rZW5zID8/IDApLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBOdW1iZXIoaW5wdXREZXRhaWxzLmNhY2hlZF90b2tlbnMgPz8gMCksXG4gICAgb3V0cHV0VG9rZW5zOiBOdW1iZXIodXNhZ2Uub3V0cHV0X3Rva2VucyA/PyAwKSxcbiAgICByZWFzb25pbmdUb2tlbnM6IE51bWJlcihvdXRwdXREZXRhaWxzLnJlYXNvbmluZ190b2tlbnMgPz8gMCksXG4gICAgdG90YWxUb2tlbnM6IE51bWJlcih1c2FnZS50b3RhbF90b2tlbnMgPz8gMCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZU1pbWVUeXBlKFxuICBiYXNlNjQ6IHN0cmluZyxcbiAgb3V0cHV0Rm9ybWF0PzogdW5rbm93bixcbik6IFwiaW1hZ2UvcG5nXCIgfCBcImltYWdlL2pwZWdcIiB8IFwiaW1hZ2Uvd2VicFwiIHtcbiAgLy8gSW5zcGVjdCBvbmx5IHRoZSBoZWFkZXIsIHdpdGhvdXQgZGVjb2RpbmcgYSBwb3RlbnRpYWxseSBsYXJnZSBpbWFnZSB0d2ljZS5cbiAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmZyb20oYmFzZTY0LnNsaWNlKDAsIDI0KSwgXCJiYXNlNjRcIik7XG4gIGlmIChoZWFkZXIuc3ViYXJyYXkoMCwgOCkuZXF1YWxzKEJ1ZmZlci5mcm9tKFsxMzcsIDgwLCA3OCwgNzEsIDEzLCAxMCwgMjYsIDEwXSkpKVxuICAgIHJldHVybiBcImltYWdlL3BuZ1wiO1xuICBpZiAoaGVhZGVyWzBdID09PSAyNTUgJiYgaGVhZGVyWzFdID09PSAyMTYgJiYgaGVhZGVyWzJdID09PSAyNTUpIHJldHVybiBcImltYWdlL2pwZWdcIjtcbiAgaWYgKGhlYWRlci50b1N0cmluZyhcImFzY2lpXCIsIDAsIDQpID09PSBcIlJJRkZcIiAmJiBoZWFkZXIudG9TdHJpbmcoXCJhc2NpaVwiLCA4LCAxMikgPT09IFwiV0VCUFwiKVxuICAgIHJldHVybiBcImltYWdlL3dlYnBcIjtcbiAgaWYgKG91dHB1dEZvcm1hdCA9PT0gXCJqcGVnXCIpIHJldHVybiBcImltYWdlL2pwZWdcIjtcbiAgaWYgKG91dHB1dEZvcm1hdCA9PT0gXCJ3ZWJwXCIpIHJldHVybiBcImltYWdlL3dlYnBcIjtcbiAgaWYgKG91dHB1dEZvcm1hdCA9PT0gdW5kZWZpbmVkIHx8IG91dHB1dEZvcm1hdCA9PT0gXCJwbmdcIikgcmV0dXJuIFwiaW1hZ2UvcG5nXCI7XG4gIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKGBVbnN1cHBvcnRlZCBpbWFnZSBvdXRwdXQgZm9ybWF0OiAke1N0cmluZyhvdXRwdXRGb3JtYXQpfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplT3BlbkFJRXZlbnQocmF3OiB1bmtub3duKTogT3BlbkFJTm9ybWFsaXplZEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXcgfHwgdHlwZW9mIHJhdyAhPT0gXCJvYmplY3RcIikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgZXZlbnQgPSByYXcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IHR5cGUgPSBTdHJpbmcoZXZlbnQudHlwZSA/PyBcIlwiKTtcbiAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2UuY3JlYXRlZFwiKSB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBldmVudC5yZXNwb25zZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4geyB0eXBlOiBcImNyZWF0ZWRcIiwgLi4uKHJlc3BvbnNlPy5pZCA/IHsgcmVzcG9uc2VJZDogU3RyaW5nKHJlc3BvbnNlLmlkKSB9IDoge30pIH07XG4gIH1cbiAgaWYgKHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X3RleHQuZGVsdGFcIiAmJiB0eXBlb2YgZXZlbnQuZGVsdGEgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogXCJ0ZXh0LWRlbHRhXCIsXG4gICAgICB0ZXh0OiBldmVudC5kZWx0YSxcbiAgICAgIC4uLih0eXBlb2YgZXZlbnQuaXRlbV9pZCA9PT0gXCJzdHJpbmdcIiA/IHsgaXRlbUlkOiBldmVudC5pdGVtX2lkIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuICBpZiAoXG4gICAgKHR5cGUgPT09IFwicmVzcG9uc2Uub3V0cHV0X2l0ZW0uYWRkZWRcIiB8fCB0eXBlID09PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIikgJiZcbiAgICBldmVudC5pdGVtICYmXG4gICAgdHlwZW9mIGV2ZW50Lml0ZW0gPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgY29uc3QgaXRlbSA9IGV2ZW50Lml0ZW0gYXMgT3BlbkFJUmVzcG9uc2VJdGVtO1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIgJiYgdHlwZW9mIGl0ZW0ucmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAvLyBQTkcgZXhwb3NlcyBkaW1lbnNpb25zIGluIGl0cyBmaXhlZCBoZWFkZXIuIE90aGVyIGZvcm1hdHMgcmV0YWluIHRoZVxuICAgICAgLy8gYmFja2VuZCdzIG9ic2VydmVkIHNpemU7IG5ldmVyIHN1YnN0aXR1dGUgcmVxdWVzdGVkIGltYWdlIGNvbnRyb2xzLlxuICAgICAgY29uc3QgaGVhZGVyID0gQnVmZmVyLmZyb20oaXRlbS5yZXN1bHQuc2xpY2UoMCwgMzIpLCBcImJhc2U2NFwiKTtcbiAgICAgIGNvbnN0IHBuZ1NpemUgPVxuICAgICAgICBoZWFkZXIubGVuZ3RoID49IDI0ICYmXG4gICAgICAgIGhlYWRlci5zdWJhcnJheSgwLCA4KS5lcXVhbHMoQnVmZmVyLmZyb20oXCI4OTUwNGU0NzBkMGExYTBhXCIsIFwiaGV4XCIpKSAmJlxuICAgICAgICBoZWFkZXIucmVhZFVJbnQzMkJFKDE2KSA+IDAgJiZcbiAgICAgICAgaGVhZGVyLnJlYWRVSW50MzJCRSgyMCkgPiAwXG4gICAgICAgICAgPyBgJHtoZWFkZXIucmVhZFVJbnQzMkJFKDE2KX14JHtoZWFkZXIucmVhZFVJbnQzMkJFKDIwKX1gXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBzaXplID1cbiAgICAgICAgcG5nU2l6ZSA/P1xuICAgICAgICAodHlwZW9mIGl0ZW0uc2l6ZSA9PT0gXCJzdHJpbmdcIiAmJiAvXlsxLTldXFxkKnhbMS05XVxcZCokLy50ZXN0KGl0ZW0uc2l6ZSlcbiAgICAgICAgICA/IGl0ZW0uc2l6ZVxuICAgICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiaW1hZ2VcIixcbiAgICAgICAgLi4uKHR5cGVvZiBpdGVtLmlkID09PSBcInN0cmluZ1wiID8geyBpZDogaXRlbS5pZCB9IDoge30pLFxuICAgICAgICBiYXNlNjQ6IGl0ZW0ucmVzdWx0LFxuICAgICAgICBtaW1lVHlwZTogaW1hZ2VNaW1lVHlwZShpdGVtLnJlc3VsdCwgaXRlbS5vdXRwdXRfZm9ybWF0KSxcbiAgICAgICAgZ2VuZXJhdGlvbjoge1xuICAgICAgICAgIHJvdXRlOiBcImNvZGV4LXJlc3BvbnNlc1wiLFxuICAgICAgICAgIC4uLihzaXplID8geyBzaXplIH0gOiB7fSksXG4gICAgICAgICAgLi4uKHR5cGVvZiBpdGVtLm1vZGVsID09PSBcInN0cmluZ1wiID8geyBtb2RlbDogaXRlbS5tb2RlbCB9IDoge30pLFxuICAgICAgICAgIC4uLih0eXBlb2YgaXRlbS5xdWFsaXR5ID09PSBcInN0cmluZ1wiID8geyBxdWFsaXR5OiBpdGVtLnF1YWxpdHkgfSA6IHt9KSxcbiAgICAgICAgICAuLi4odHlwZW9mIGl0ZW0uYmFja2dyb3VuZCA9PT0gXCJzdHJpbmdcIiA/IHsgYmFja2dyb3VuZDogaXRlbS5iYWNrZ3JvdW5kIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICAgIC4uLih0eXBlb2YgaXRlbS5yZXZpc2VkX3Byb21wdCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgID8geyByZXZpc2VkUHJvbXB0OiBpdGVtLnJldmlzZWRfcHJvbXB0IH1cbiAgICAgICAgICA6IHR5cGVvZiBpdGVtLnJldmlzZWRQcm9tcHQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICAgID8geyByZXZpc2VkUHJvbXB0OiBpdGVtLnJldmlzZWRQcm9tcHQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyB0eXBlOiBcIm91dHB1dC1pdGVtXCIsIGl0ZW0sIGNvbXBsZXRlZDogdHlwZSA9PT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIgfTtcbiAgfVxuICBpZiAodHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gKGV2ZW50LnJlc3BvbnNlID8/IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCB0b29sVXNhZ2UgPSByZXNwb25zZS50b29sX3VzYWdlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHBhcnNlZEltYWdlVXNhZ2UgPSBJbWFnZUdlbmVyYXRpb25NZXRhZGF0YS5zaGFwZS51c2FnZS5zYWZlUGFyc2UodG9vbFVzYWdlPy5pbWFnZV9nZW4pO1xuICAgIGNvbnN0IGltYWdlVXNhZ2UgPSBwYXJzZWRJbWFnZVVzYWdlLnN1Y2Nlc3MgPyBwYXJzZWRJbWFnZVVzYWdlLmRhdGEgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaW1hZ2VUb29sID0gQXJyYXkuaXNBcnJheShyZXNwb25zZS50b29scylcbiAgICAgID8gcmVzcG9uc2UudG9vbHMuZmluZCgodG9vbCkgPT4gdG9vbD8udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uXCIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbWFnZU1vZGVsID0gdHlwZW9mIGltYWdlVG9vbD8ubW9kZWwgPT09IFwic3RyaW5nXCIgPyBpbWFnZVRvb2wubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFwiY29tcGxldGVkXCIsXG4gICAgICByZXNwb25zZUlkOiBTdHJpbmcocmVzcG9uc2UuaWQgPz8gXCJcIiksXG4gICAgICAuLi4ocmVzcG9uc2UudXNhZ2UgPyB7IHVzYWdlOiB1c2FnZUZyb20ocmVzcG9uc2UudXNhZ2UpIH0gOiB7fSksXG4gICAgICAuLi4odHlwZW9mIHJlc3BvbnNlLm1vZGVsID09PSBcInN0cmluZ1wiID8geyBtb2RlbDogcmVzcG9uc2UubW9kZWwgfSA6IHt9KSxcbiAgICAgIC4uLihpbWFnZVVzYWdlIHx8IGltYWdlTW9kZWxcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbWFnZUdlbmVyYXRpb246IHtcbiAgICAgICAgICAgICAgcm91dGU6IFwiY29kZXgtcmVzcG9uc2VzXCIgYXMgY29uc3QsXG4gICAgICAgICAgICAgIC4uLihpbWFnZU1vZGVsID8geyBtb2RlbDogaW1hZ2VNb2RlbCB9IDoge30pLFxuICAgICAgICAgICAgICAuLi4oaW1hZ2VVc2FnZSA/IHsgdXNhZ2U6IGltYWdlVXNhZ2UgfSA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuICB9XG4gIGlmICh0eXBlID09PSBcImVycm9yXCIgfHwgdHlwZSA9PT0gXCJyZXNwb25zZS5mYWlsZWRcIiB8fCB0eXBlID09PSBcInJlc3BvbnNlLmluY29tcGxldGVcIikge1xuICAgIGNvbnN0IHNvdXJjZSA9IChldmVudC5lcnJvciA/PyBldmVudC5yZXNwb25zZSA/PyBldmVudCkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgbmVzdGVkID0gKHNvdXJjZS5lcnJvciA/PyBzb3VyY2UpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBcImVycm9yXCIsXG4gICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXG4gICAgICAgIFN0cmluZyhuZXN0ZWQubWVzc2FnZSA/PyBgT3BlbkFJIHN0cmVhbSBlbmRlZCB3aXRoICR7dHlwZX1gKSxcbiAgICAgICAgdHlwZW9mIG5lc3RlZC5jb2RlID09PSBcInN0cmluZ1wiID8gbmVzdGVkLmNvZGUgOiB1bmRlZmluZWQsXG4gICAgICApLFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBS0EsTUFBYSw4QkFD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
@@ -299,7 +299,7 @@ var OpenAIDirectClient = class {
299
299
  this.transport = options.transport ?? (options.transportKind === "websocket" ? new OpenAIWebSocketTransport(options) : new OpenAIHttpsTransport(options));
300
300
  }
301
301
  responses(options, signal) {
302
- if (typeof options.imageGeneration === "object" && options.imageGeneration.background === "transparent") return this.standaloneImages(options, signal);
302
+ if (options.model === "gpt-image-2" || typeof options.imageGeneration === "object" && options.imageGeneration.background === "transparent") return this.standaloneImages(options, signal);
303
303
  const clientRequestId = crypto.randomUUID();
304
304
  const affinityId = options.promptCacheKey ? cacheAffinityUuid(options.promptCacheKey) : clientRequestId;
305
305
  return this.transport.stream({
@@ -334,13 +334,14 @@ var OpenAIDirectClient = class {
334
334
  continue;
335
335
  }
336
336
  if (!response.ok) throw await responseError(response);
337
- const images = await readStandaloneImageResponse(response);
337
+ const images = await readStandaloneImageResponse(response, typeof options.imageGeneration === "object" && options.imageGeneration.background === "transparent");
338
338
  signal?.throwIfAborted();
339
339
  yield* images;
340
+ const firstImage = images[0];
340
341
  yield {
341
342
  type: "completed",
342
343
  responseId: requestId,
343
- model: "gpt-image-2"
344
+ model: firstImage?.type === "image" ? firstImage.generation?.model : "gpt-image-2"
344
345
  };
345
346
  return;
346
347
  }
@@ -352,4 +353,4 @@ var OpenAIDirectClient = class {
352
353
  //#endregion
353
354
  export { OpenAIDirectClient, OpenAIHttpsTransport, OpenAIWebSocketTransport };
354
355
 
355
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMsXG4gIGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCxcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBub3JtYWxpemVPcGVuQUlFdmVudCxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0LFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0LFxuICByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL29wZW5haS1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBub3JtYWxpemVPcGVuQUlTU0UsIHR5cGUgT3BlbkFJRXZlbnRTdHJlYW0gfSBmcm9tIFwiLi9vcGVuYWktc3NlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHMge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgYm9keTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBjbGllbnRSZXF1ZXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtO1xuICBjbG9zZT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRMaWtlIHtcbiAgb24oZXZlbnQ6IFwib3BlblwiLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcIm1lc3NhZ2VcIiwgbGlzdGVuZXI6IChkYXRhOiBSYXdEYXRhLCBpc0JpbmFyeTogYm9vbGVhbikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImNsb3NlXCIsIGxpc3RlbmVyOiAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImVycm9yXCIsIGxpc3RlbmVyOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdGhpcztcbiAgb24oXG4gICAgZXZlbnQ6IFwidW5leHBlY3RlZC1yZXNwb25zZVwiLFxuICAgIGxpc3RlbmVyOiAocmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PiB2b2lkLFxuICApOiB0aGlzO1xuICBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBuZXZlcltdKSA9PiB2b2lkKTogdGhpcztcbiAgc2VuZChkYXRhOiBzdHJpbmcsIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkO1xuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuICB0ZXJtaW5hdGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJV2ViU29ja2V0RmFjdG9yeSA9ICh1cmw6IHN0cmluZywgb3B0aW9uczogQ2xpZW50T3B0aW9ucykgPT4gT3BlbkFJV2ViU29ja2V0TGlrZTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbnR5cGUgU29ja2V0UmVjb3JkID1cbiAgfCB7IGtpbmQ6IFwib3BlblwiIH1cbiAgfCB7IGtpbmQ6IFwibWVzc2FnZVwiOyBkYXRhOiBSYXdEYXRhOyBpc0JpbmFyeTogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiBcImNsb3NlXCI7IGNvZGU6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfVxuICB8IHsga2luZDogXCJlcnJvclwiOyBlcnJvcjogRXJyb3IgfVxuICB8IHsga2luZDogXCJyZWplY3RlZFwiOyBzdGF0dXM/OiBudW1iZXIgfTtcblxuY29uc3QgTUFYX0JVRkZFUkVEX1NPQ0tFVF9SRUNPUkRTID0gMTYwMDtcblxuZnVuY3Rpb24gd2Vic29ja2V0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBhcnNlZDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihgSW52YWxpZCBPcGVuQUkgUmVzcG9uc2VzIFVSTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG4gIHBhcnNlZC5wcm90b2NvbCA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IFwid3NzOlwiIDogXCJ3czpcIjtcbiAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByYXdEYXRhVGV4dChkYXRhOiBSYXdEYXRhKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShkYXRhKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEV2ZW50cyhzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHJlY29yZHM6IFNvY2tldFJlY29yZFtdID0gW107XG4gIGNvbnN0IHdhaXRlcnM6IEFycmF5PChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4gdm9pZD4gPSBbXTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG4gIGNvbnN0IHB1c2ggPSAocmVjb3JkOiBTb2NrZXRSZWNvcmQpID0+IHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcbiAgICBpZiAod2FpdGVyKSB3YWl0ZXIocmVjb3JkKTtcbiAgICBlbHNlIGlmIChyZWNvcmRzLmxlbmd0aCA8IE1BWF9CVUZGRVJFRF9TT0NLRVRfUkVDT1JEUykgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgZWxzZSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBleGNlZWRlZCB0aGUgJHtNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFN9LXJlY29yZCByZWNlaXZlIGJ1ZmZlcmAsXG4gICAgICAgICAgXCJ3ZWJzb2NrZXRfYmFja3ByZXNzdXJlXCIsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3ZlcmZsb3dXYWl0ZXIgPSB3YWl0ZXJzLnNoaWZ0KCk7XG4gICAgICBpZiAob3ZlcmZsb3dXYWl0ZXIpIG92ZXJmbG93V2FpdGVyKG92ZXJmbG93KTtcbiAgICAgIGVsc2UgcmVjb3Jkcy5wdXNoKG92ZXJmbG93KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uT3BlbiA9ICgpID0+IHB1c2goeyBraW5kOiBcIm9wZW5cIiB9KTtcbiAgY29uc3Qgb25NZXNzYWdlID0gKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiBwdXNoKHsga2luZDogXCJtZXNzYWdlXCIsIGRhdGEsIGlzQmluYXJ5IH0pO1xuICBjb25zdCBvbkNsb3NlID0gKGNvZGU6IG51bWJlciwgcmVhc29uOiBCdWZmZXIpID0+XG4gICAgcHVzaCh7IGtpbmQ6IFwiY2xvc2VcIiwgY29kZSwgcmVhc29uOiByZWFzb24udG9TdHJpbmcoKSB9KTtcbiAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yIH0pO1xuICBjb25zdCBvblVuZXhwZWN0ZWRSZXNwb25zZSA9IChfcmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PlxuICAgIHB1c2goeyBraW5kOiBcInJlamVjdGVkXCIsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9KTtcbiAgc29ja2V0Lm9uKFwib3BlblwiLCBvbk9wZW4pO1xuICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gIHNvY2tldC5vbihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICBzb2NrZXQub24oXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgc29ja2V0Lm9uKFwidW5leHBlY3RlZC1yZXNwb25zZVwiLCBvblVuZXhwZWN0ZWRSZXNwb25zZSk7XG4gIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgIHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yOiBhYm9ydEVycm9yKHNpZ25hbCkgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiAoKSA9PlxuICAgICAgcmVjb3Jkcy5sZW5ndGhcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUocmVjb3Jkcy5zaGlmdCgpISlcbiAgICAgICAgOiBuZXcgUHJvbWlzZTxTb2NrZXRSZWNvcmQ+KChyZXNvbHZlKSA9PiB3YWl0ZXJzLnB1c2gocmVzb2x2ZSkpLFxuICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICBzb2NrZXQub2ZmKFwib3BlblwiLCBvbk9wZW4pO1xuICAgICAgc29ja2V0Lm9mZihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJjbG9zZVwiLCBvbkNsb3NlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgIHNvY2tldC5vZmYoXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsIG9uVW5leHBlY3RlZFJlc3BvbnNlKTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGNsb3NlZCA9IHtcbiAgICAgICAga2luZDogXCJlcnJvclwiIGFzIGNvbnN0LFxuICAgICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGV2ZW50IHN0cmVhbSB3YXMgY2xvc2VkXCIpLFxuICAgICAgfTtcbiAgICAgIHdhaXRlcnMuc3BsaWNlKDApLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKGNsb3NlZCkpO1xuICAgIH0sXG4gICAgZGV0YWNoQWJvcnQ6ICgpID0+IHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhYm9ydEVycm9yKHNpZ25hbD86IEFib3J0U2lnbmFsKTogRXJyb3Ige1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgID8gc2lnbmFsLnJlYXNvblxuICAgIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0UG9vbGVkUmVjb3JkKFxuICBldmVudHM6IFJldHVyblR5cGU8dHlwZW9mIHNvY2tldEV2ZW50cz4sXG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFNvY2tldFJlY29yZD4ge1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGV2ZW50cy5uZXh0KCk7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihzaWduYWwpO1xuICByZXR1cm4gbmV3IFByb21pc2U8U29ja2V0UmVjb3JkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIHJlamVjdChhYm9ydEVycm9yKHNpZ25hbCkpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgdm9pZCBldmVudHNcbiAgICAgIC5uZXh0KClcbiAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FjaGVBZmZpbml0eVV1aWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoZXggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoa2V5KS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMzIpLnNwbGl0KFwiXCIpO1xuICBoZXhbMTJdID0gXCI0XCI7XG4gIGhleFsxNl0gPSAoKE51bWJlci5wYXJzZUludChoZXhbMTZdISwgMTYpICYgMHgzKSB8IDB4OCkudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gYCR7aGV4LnNsaWNlKDAsIDgpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDgsIDEyKS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgxMiwgMTYpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDE2LCAyMCkuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMjApLmpvaW4oXCJcIil9YDtcbn1cblxudHlwZSBBZmZpbml0eUNvbm5lY3Rpb24gPSB7XG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZTtcbiAgZXZlbnRzOiBSZXR1cm5UeXBlPHR5cGVvZiBzb2NrZXRFdmVudHM+O1xuICBjbG9zZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHN0YXRpYyByZWFkb25seSBNQVhfQUZGSU5JVFlfQ09OTkVDVElPTlMgPSAxNjtcbiAgY3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuICByZWFkb25seSByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbiAgcmVhZG9ubHkgd2ViU29ja2V0RmFjdG9yeTogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbiAgcmVhZG9ubHkgYWZmaW5pdHlDb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBBZmZpbml0eUNvbm5lY3Rpb24+KCk7XG4gIHJlYWRvbmx5IGJ1c3lBZmZpbml0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzID0gb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHM7XG4gICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5ID1cbiAgICAgIG9wdGlvbnMud2ViU29ja2V0RmFjdG9yeSA/PyAoKHVybCwgd3NPcHRpb25zKSA9PiBuZXcgV3NDbGllbnQodXJsLCB3c09wdGlvbnMpKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5mb3JFYWNoKCh7IHNvY2tldCwgZXZlbnRzIH0pID0+IHtcbiAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwMCwgXCJ0cmFuc3BvcnQgY2xvc2VkXCIpO1xuICAgIH0pO1xuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnVzeUFmZmluaXRpZXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOycoO2ctCDsl7DqsrDrp4wg7LaV7Lac7ZWc64ukLiDsoITrtoAg7IKs7JqpIOykkeydtOuptCBmYWxzZeulvCDrsJjtmZjtlbQg7J287ZqM7ISxIOyGjOy8k+ycvOuhnCDsspjrpqztlZzri6QuXG4gIHJlbWVtYmVyQWZmaW5pdHlDb25uZWN0aW9uKHRocmVhZElkOiBzdHJpbmcsIGNvbm5lY3Rpb246IEFmZmluaXR5Q29ubmVjdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuaGFzKHRocmVhZElkKSAmJlxuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLnNpemUgPj0gT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0Lk1BWF9BRkZJTklUWV9DT05ORUNUSU9OU1xuICAgICkge1xuICAgICAgY29uc3QgaWRsZUtleSA9IFsuLi50aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMua2V5cygpXS5maW5kKFxuICAgICAgICAoa2V5KSA9PiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMoa2V5KSxcbiAgICAgICk7XG4gICAgICBpZiAoaWRsZUtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpZGxlID0gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChpZGxlS2V5KSE7XG4gICAgICBpZGxlLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBpZGxlLnNvY2tldC5jbG9zZSgxMDAwLCBcImFmZmluaXR5IGNhY2hlIGV2aWN0ZWRcIik7XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKGlkbGVLZXkpO1xuICAgIH1cbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuc2V0KHRocmVhZElkLCBjb25uZWN0aW9uKTtcbiAgICAvLyDsnKDtnLQg7IOB7YOc7JeQ7IScIGJhY2tlbmQg6rCAIOuBiuydgCDshozsvJPsnYQg64uk7J2MIOyalOyyreydtCDsp5HslrTrk6Tsp4Ag7JWK64+E66GdIOy6kOyLnOyXkOyEnCDsoJzqsbDtlZzri6QuXG4gICAgY29uc3QgZHJvcCA9ICgpID0+IHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyh0aHJlYWRJZCkpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KHRocmVhZElkKSAhPT0gY29ubmVjdGlvbikgcmV0dXJuO1xuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZSh0aHJlYWRJZCk7XG4gICAgICBjb25uZWN0aW9uLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLnNvY2tldC5vbihcImNsb3NlXCIsIGRyb3ApO1xuICAgIGNvbm5lY3Rpb24uc29ja2V0Lm9uKFwiZXJyb3JcIiwgZHJvcCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyAqc3RyZWFtKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBBc3luY0dlbmVyYXRvcjxPcGVuQUlOb3JtYWxpemVkRXZlbnQ+IHtcbiAgICBsZXQgcmVmcmVzaGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihyZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBjb25zdCBoYXNBZmZpbml0eSA9IHJlcXVlc3QuYm9keS5wcm9tcHRfY2FjaGVfa2V5ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRhaW5Db25uZWN0aW9uID0gaGFzQWZmaW5pdHkgJiYgIXRoaXMuYnVzeUFmZmluaXRpZXMuaGFzKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHRoaXMuYnVzeUFmZmluaXRpZXMuYWRkKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgY29uc3QgZW50cnkgPSByZXRhaW5Db25uZWN0aW9uID8gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChyZXF1ZXN0LnRocmVhZElkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbnRyeT8uY2xvc2VkKSB7XG4gICAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICAgIGVudHJ5LmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWQgPSBlbnRyeT8uY2xvc2VkID8gdW5kZWZpbmVkIDogZW50cnk7XG4gICAgICBsZXQgcmV0YWluZWQgPSByZXRhaW5Db25uZWN0aW9uO1xuICAgICAgY29uc3Qgc29ja2V0ID1cbiAgICAgICAgY2FjaGVkPy5zb2NrZXQgPz9cbiAgICAgICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5KHdlYnNvY2tldFVybChDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwpLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyh0aGlzLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLCB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCwge1xuICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0aHJlYWRJZDogcmVxdWVzdC50aHJlYWRJZCxcbiAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByZXF1ZXN0LmNsaWVudFJlcXVlc3RJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXCJPcGVuQUktQmV0YVwiOiBcInJlc3BvbnNlc193ZWJzb2NrZXRzPTIwMjYtMDItMDZcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGNhY2hlZD8uZXZlbnRzID8/IHNvY2tldEV2ZW50cyhzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gYXdhaXQgZXZlbnRzLm5leHQoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBoYW5kc2hha2Uua2luZCA9PT0gXCJyZWplY3RlZFwiICYmXG4gICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgICAgICAgICFyZWZyZXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzb2NrZXQudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMoKTtcbiAgICAgICAgICAgIHJlZnJlc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBoYW5kc2hha2UgcmVqZWN0ZWQke2hhbmRzaGFrZS5zdGF0dXMgPyBgIHdpdGggSFRUUCAke2hhbmRzaGFrZS5zdGF0dXN9YCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcImVycm9yXCIpIHRocm93IGhhbmRzaGFrZS5lcnJvcjtcbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgIT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSB0aGUgaGFuZHNoYWtlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldGFpbmVkID0gdGhpcy5yZW1lbWJlckFmZmluaXR5Q29ubmVjdGlvbihyZXF1ZXN0LnRocmVhZElkLCB7IHNvY2tldCwgZXZlbnRzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicmVzcG9uc2UuY3JlYXRlXCIsIC4uLnJlcXVlc3QuYm9keSB9KSwgKGVycm9yKSA9PlxuICAgICAgICAgICAgZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gY2FjaGVkXG4gICAgICAgICAgICA/IGF3YWl0IG5leHRQb29sZWRSZWNvcmQoZXZlbnRzLCBzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKVxuICAgICAgICAgICAgOiBhd2FpdCBldmVudHMubmV4dCgpO1xuICAgICAgICAgIGlmIChyZWNvcmQua2luZCA9PT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgYW4gdW5leHBlY3RlZCBiaW5hcnkgbWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYXc6IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByYXcgPSBKU09OLnBhcnNlKHJhd0RhdGFUZXh0KHJlY29yZC5kYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgaW52YWxpZCBKU09OXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBub3JtYWxpemVPcGVuQUlFdmVudChyYXcpO1xuICAgICAgICAgICAgaWYgKCFldmVudCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAocmV0YWluZWQpIGV2ZW50cy5kZXRhY2hBYm9ydCgpO1xuICAgICAgICAgICAgICBlbHNlIHNvY2tldC5jbG9zZSgxMDAwLCBcInJlc3BvbnNlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGV2ZW50O1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikgdGhyb3cgZXZlbnQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWNvcmQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJjbG9zZVwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICAgICAgYE9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSBhIHRlcm1pbmFsIHJlc3BvbnNlIGV2ZW50ICgke3JlY29yZC5jb2RlfSR7cmVjb3JkLnJlYXNvbiA/IGA6ICR7cmVjb3JkLnJlYXNvbn1gIDogXCJcIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIFdlYlNvY2tldCBlbWl0dGVkIGFuIHVuZXhwZWN0ZWQgaGFuZHNoYWtlIGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFjb21wbGV0ZWQgfHwgIXJldGFpbmVkKSB7XG4gICAgICAgICAgaWYgKHJldGFpbmVkKSB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikgdGhpcy5idXN5QWZmaW5pdGllcy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3BvbnNlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxPcGVuQUlQcm90b2NvbEVycm9yPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gIGxldCBtZXNzYWdlID0gdGV4dCB8fCByZXNwb25zZS5zdGF0dXNUZXh0IHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gIGxldCBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB7XG4gICAgICBlcnJvcj86IHsgbWVzc2FnZT86IHN0cmluZzsgY29kZT86IHN0cmluZyB9IHwgc3RyaW5nO1xuICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBlcnJvciA9IHBhcnNlZC5lcnJvcjtcbiAgICBtZXNzYWdlID1cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgPyBlcnJvci5tZXNzYWdlIDogdW5kZWZpbmVkKSA/P1xuICAgICAgcGFyc2VkLm1lc3NhZ2UgPz9cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIgPyBlcnJvciA6IG1lc3NhZ2UpO1xuICAgIGNvZGUgPSAodHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiID8gZXJyb3IuY29kZSA6IHVuZGVmaW5lZCkgPz8gcGFyc2VkLmNvZGU7XG4gIH0gY2F0Y2gge1xuICAgIGNvZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKG1lc3NhZ2UsIGNvZGUsIHJlc3BvbnNlLnN0YXR1cyk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlIdHRwc1RyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHJlYWRvbmx5IHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMuZmV0Y2hJbXBsID0gb3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICB9XG5cbiAgYXN5bmMgKnN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogQXN5bmNHZW5lcmF0b3I8T3BlbkFJTm9ybWFsaXplZEV2ZW50PiB7XG4gICAgbGV0IHJlZnJlc2hlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGwoQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3QudGhyZWFkSWQsXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHJlcXVlc3QuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmICFyZWZyZXNoZWQgJiYgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICByZWZyZXNoZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IGF3YWl0IHJlc3BvbnNlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSByZXNwb25zZSBoYWQgbm8gYm9keVwiKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBub3JtYWxpemVPcGVuQUlTU0UocmVzcG9uc2UuYm9keSkpIHtcbiAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucyBleHRlbmRzIE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucyB7XG4gIHRyYW5zcG9ydD86IE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydDtcbiAgdHJhbnNwb3J0S2luZD86IFwiaHR0cHNcIiB8IFwid2Vic29ja2V0XCI7XG4gIHdlYlNvY2tldEZhY3Rvcnk/OiBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5O1xufVxuXG5leHBvcnQgY2xhc3MgT3BlbkFJRGlyZWN0Q2xpZW50IHtcbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQ7XG4gIGltYWdlQ3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMpIHtcbiAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMudHJhbnNwb3J0ID1cbiAgICAgIG9wdGlvbnMudHJhbnNwb3J0ID8/XG4gICAgICAob3B0aW9ucy50cmFuc3BvcnRLaW5kID09PSBcIndlYnNvY2tldFwiXG4gICAgICAgID8gbmV3IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydChvcHRpb25zKVxuICAgICAgICA6IG5ldyBPcGVuQUlIdHRwc1RyYW5zcG9ydChvcHRpb25zKSk7XG4gIH1cblxuICByZXNwb25zZXMob3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBPcGVuQUlFdmVudFN0cmVhbSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uID09PSBcIm9iamVjdFwiICYmXG4gICAgICBvcHRpb25zLmltYWdlR2VuZXJhdGlvbi5iYWNrZ3JvdW5kID09PSBcInRyYW5zcGFyZW50XCJcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YW5kYWxvbmVJbWFnZXMob3B0aW9ucywgc2lnbmFsKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50UmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBhZmZpbml0eUlkID0gb3B0aW9ucy5wcm9tcHRDYWNoZUtleVxuICAgICAgPyBjYWNoZUFmZmluaXR5VXVpZChvcHRpb25zLnByb21wdENhY2hlS2V5KVxuICAgICAgOiBjbGllbnRSZXF1ZXN0SWQ7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0cmVhbSh7XG4gICAgICBib2R5OiBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoXG4gICAgICAgIG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgPyB7IC4uLm9wdGlvbnMsIHByb21wdENhY2hlS2V5OiBhZmZpbml0eUlkIH0gOiBvcHRpb25zLFxuICAgICAgKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHNlc3Npb25JZDogYWZmaW5pdHlJZCxcbiAgICAgIC8vIHByb21wdENhY2hlS2V5IGlzIGFscmVhZHkgYSBvbmUtd2F5IFNESyBhZmZpbml0eSB2YWx1ZSwgbmV2ZXIgYSByYXcgc2Vzc2lvbktleS5cbiAgICAgIHRocmVhZElkOiBhZmZpbml0eUlkLFxuICAgICAgY2xpZW50UmVxdWVzdElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgKnN0YW5kYWxvbmVJbWFnZXMoXG4gICAgb3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBidWlsZFN0YW5kYWxvbmVJbWFnZVJlcXVlc3Qob3B0aW9ucyk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAodGhpcy5vcHRpb25zLmZldGNoID8/IGZldGNoKShyZXF1ZXN0LnVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwieC1jb2RleC1pbWFnZS10dXJuLWlkXCI6IHJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgYXR0ZW1wdCA9PT0gMCAmJiB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG4gICAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgeWllbGQqIGltYWdlcztcbiAgICAgIHlpZWxkIHsgdHlwZTogXCJjb21wbGV0ZWRcIiwgcmVzcG9uc2VJZDogcmVxdWVzdElkLCBtb2RlbDogXCJncHQtaW1hZ2UtMlwiIH07XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy50cmFuc3BvcnQuY2xvc2U/LigpO1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQXdFQSxNQUFNLDhCQUE4QjtBQUVwQyxTQUFTLGFBQWEsS0FBcUI7Q0FDekMsSUFBSTtDQUNKLElBQUk7RUFDRixTQUFTLElBQUksSUFBSSxHQUFHO0NBQ3RCLFNBQVMsT0FBTztFQUNkLE1BQU0sSUFBSSxvQkFBb0IsaUNBQWlDLE9BQU8sS0FBSyxHQUFHO0NBQ2hGO0NBQ0EsT0FBTyxXQUFXLE9BQU8sYUFBYSxXQUFXLFNBQVM7Q0FDMUQsT0FBTyxPQUFPLFNBQVM7QUFDekI7QUFFQSxTQUFTLFlBQVksTUFBdUI7Q0FDMUMsSUFBSSxNQUFNLFFBQVEsSUFBSSxHQUFHLE9BQU8sT0FBTyxPQUFPLElBQUksQ0FBQyxDQUFDLFNBQVM7Q0FDN0QsSUFBSSxnQkFBZ0IsYUFBYSxPQUFPLE9BQU8sS0FBSyxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTO0NBQ25GLE9BQU8sT0FBTyxLQUFLLElBQUksQ0FBQyxDQUFDLFNBQVM7QUFDcEM7QUFFQSxTQUFTLGFBQWEsUUFBNkIsUUFBc0I7Q0FDdkUsTUFBTSxVQUEwQixDQUFDO0NBQ2pDLE1BQU0sVUFBaUQsQ0FBQztDQUN4RCxJQUFJLFNBQVM7Q0FDYixNQUFNLFFBQVEsV0FBeUI7RUFDckMsSUFBSSxDQUFDLFFBQVE7RUFDYixNQUFNLFNBQVMsUUFBUSxNQUFNO0VBQzdCLElBQUksUUFB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
356
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpcmVjdC1jbGllbnQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpcmVjdC1jbGllbnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tIFwibm9kZTpjcnlwdG9cIjtcblxuaW1wb3J0IFdzQ2xpZW50LCB7IHR5cGUgQ2xpZW50T3B0aW9ucywgdHlwZSBSYXdEYXRhIH0gZnJvbSBcIndzXCI7XG5cbmltcG9ydCB7XG4gIGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMsXG4gIGJ1aWxkT3BlbkFJUmVzcG9uc2VzUmVxdWVzdCxcbiAgQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLFxuICBub3JtYWxpemVPcGVuQUlFdmVudCxcbiAgT3BlbkFJUHJvdG9jb2xFcnJvcixcbiAgdHlwZSBPcGVuQUlOb3JtYWxpemVkRXZlbnQsXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZXNSZXF1ZXN0LFxufSBmcm9tIFwiLi9vcGVuYWktYmFja2VuZC1wcm90b2NvbFwiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdGFuZGFsb25lSW1hZ2VSZXF1ZXN0LFxuICByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UsXG59IGZyb20gXCIuL29wZW5haS1pbWFnZS1nZW5lcmF0aW9uXCI7XG5pbXBvcnQgeyBub3JtYWxpemVPcGVuQUlTU0UsIHR5cGUgT3BlbkFJRXZlbnRTdHJlYW0gfSBmcm9tIFwiLi9vcGVuYWktc3NlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHMge1xuICBhY2Nlc3NUb2tlbjogc3RyaW5nO1xuICBhY2NvdW50SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0IHtcbiAgYm9keTogT3BlbkFJUmVzcG9uc2VzUmVxdWVzdDtcbiAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICB0aHJlYWRJZDogc3RyaW5nO1xuICBjbGllbnRSZXF1ZXN0SWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQge1xuICBzdHJlYW0ocmVxdWVzdDogT3BlbkFJVHJhbnNwb3J0UmVxdWVzdCk6IE9wZW5BSUV2ZW50U3RyZWFtO1xuICBjbG9zZT8oKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlIdHRwc1RyYW5zcG9ydE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogT3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM7XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRMaWtlIHtcbiAgb24oZXZlbnQ6IFwib3BlblwiLCBsaXN0ZW5lcjogKCkgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcIm1lc3NhZ2VcIiwgbGlzdGVuZXI6IChkYXRhOiBSYXdEYXRhLCBpc0JpbmFyeTogYm9vbGVhbikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImNsb3NlXCIsIGxpc3RlbmVyOiAoY29kZTogbnVtYmVyLCByZWFzb246IEJ1ZmZlcikgPT4gdm9pZCk6IHRoaXM7XG4gIG9uKGV2ZW50OiBcImVycm9yXCIsIGxpc3RlbmVyOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkKTogdGhpcztcbiAgb24oXG4gICAgZXZlbnQ6IFwidW5leHBlY3RlZC1yZXNwb25zZVwiLFxuICAgIGxpc3RlbmVyOiAocmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PiB2b2lkLFxuICApOiB0aGlzO1xuICBvZmYoZXZlbnQ6IHN0cmluZywgbGlzdGVuZXI6ICguLi5hcmdzOiBuZXZlcltdKSA9PiB2b2lkKTogdGhpcztcbiAgc2VuZChkYXRhOiBzdHJpbmcsIGNhbGxiYWNrPzogKGVycm9yPzogRXJyb3IpID0+IHZvaWQpOiB2b2lkO1xuICBjbG9zZShjb2RlPzogbnVtYmVyLCByZWFzb24/OiBzdHJpbmcpOiB2b2lkO1xuICB0ZXJtaW5hdGUoKTogdm9pZDtcbn1cblxuZXhwb3J0IHR5cGUgT3BlbkFJV2ViU29ja2V0RmFjdG9yeSA9ICh1cmw6IHN0cmluZywgb3B0aW9uczogQ2xpZW50T3B0aW9ucykgPT4gT3BlbkFJV2ViU29ja2V0TGlrZTtcblxuZXhwb3J0IGludGVyZmFjZSBPcGVuQUlXZWJTb2NrZXRUcmFuc3BvcnRPcHRpb25zIGV4dGVuZHMgT3BlbkFJSHR0cHNUcmFuc3BvcnRPcHRpb25zIHtcbiAgd2ViU29ja2V0RmFjdG9yeT86IE9wZW5BSVdlYlNvY2tldEZhY3Rvcnk7XG59XG5cbnR5cGUgU29ja2V0UmVjb3JkID1cbiAgfCB7IGtpbmQ6IFwib3BlblwiIH1cbiAgfCB7IGtpbmQ6IFwibWVzc2FnZVwiOyBkYXRhOiBSYXdEYXRhOyBpc0JpbmFyeTogYm9vbGVhbiB9XG4gIHwgeyBraW5kOiBcImNsb3NlXCI7IGNvZGU6IG51bWJlcjsgcmVhc29uOiBzdHJpbmcgfVxuICB8IHsga2luZDogXCJlcnJvclwiOyBlcnJvcjogRXJyb3IgfVxuICB8IHsga2luZDogXCJyZWplY3RlZFwiOyBzdGF0dXM/OiBudW1iZXIgfTtcblxuY29uc3QgTUFYX0JVRkZFUkVEX1NPQ0tFVF9SRUNPUkRTID0gMTYwMDtcblxuZnVuY3Rpb24gd2Vic29ja2V0VXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHBhcnNlZDogVVJMO1xuICB0cnkge1xuICAgIHBhcnNlZCA9IG5ldyBVUkwodXJsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihgSW52YWxpZCBPcGVuQUkgUmVzcG9uc2VzIFVSTDogJHtTdHJpbmcoZXJyb3IpfWApO1xuICB9XG4gIHBhcnNlZC5wcm90b2NvbCA9IHBhcnNlZC5wcm90b2NvbCA9PT0gXCJodHRwczpcIiA/IFwid3NzOlwiIDogXCJ3czpcIjtcbiAgcmV0dXJuIHBhcnNlZC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiByYXdEYXRhVGV4dChkYXRhOiBSYXdEYXRhKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCk7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHJldHVybiBCdWZmZXIuZnJvbShuZXcgVWludDhBcnJheShkYXRhKSkudG9TdHJpbmcoKTtcbiAgcmV0dXJuIEJ1ZmZlci5mcm9tKGRhdGEpLnRvU3RyaW5nKCk7XG59XG5cbmZ1bmN0aW9uIHNvY2tldEV2ZW50cyhzb2NrZXQ6IE9wZW5BSVdlYlNvY2tldExpa2UsIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gIGNvbnN0IHJlY29yZHM6IFNvY2tldFJlY29yZFtdID0gW107XG4gIGNvbnN0IHdhaXRlcnM6IEFycmF5PChyZWNvcmQ6IFNvY2tldFJlY29yZCkgPT4gdm9pZD4gPSBbXTtcbiAgbGV0IGFjdGl2ZSA9IHRydWU7XG4gIGNvbnN0IHB1c2ggPSAocmVjb3JkOiBTb2NrZXRSZWNvcmQpID0+IHtcbiAgICBpZiAoIWFjdGl2ZSkgcmV0dXJuO1xuICAgIGNvbnN0IHdhaXRlciA9IHdhaXRlcnMuc2hpZnQoKTtcbiAgICBpZiAod2FpdGVyKSB3YWl0ZXIocmVjb3JkKTtcbiAgICBlbHNlIGlmIChyZWNvcmRzLmxlbmd0aCA8IE1BWF9CVUZGRVJFRF9TT0NLRVRfUkVDT1JEUykgcmVjb3Jkcy5wdXNoKHJlY29yZCk7XG4gICAgZWxzZSB7XG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIGNvbnN0IG92ZXJmbG93ID0ge1xuICAgICAgICBraW5kOiBcImVycm9yXCIgYXMgY29uc3QsXG4gICAgICAgIGVycm9yOiBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBleGNlZWRlZCB0aGUgJHtNQVhfQlVGRkVSRURfU09DS0VUX1JFQ09SRFN9LXJlY29yZCByZWNlaXZlIGJ1ZmZlcmAsXG4gICAgICAgICAgXCJ3ZWJzb2NrZXRfYmFja3ByZXNzdXJlXCIsXG4gICAgICAgICksXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3ZlcmZsb3dXYWl0ZXIgPSB3YWl0ZXJzLnNoaWZ0KCk7XG4gICAgICBpZiAob3ZlcmZsb3dXYWl0ZXIpIG92ZXJmbG93V2FpdGVyKG92ZXJmbG93KTtcbiAgICAgIGVsc2UgcmVjb3Jkcy5wdXNoKG92ZXJmbG93KTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uT3BlbiA9ICgpID0+IHB1c2goeyBraW5kOiBcIm9wZW5cIiB9KTtcbiAgY29uc3Qgb25NZXNzYWdlID0gKGRhdGE6IFJhd0RhdGEsIGlzQmluYXJ5OiBib29sZWFuKSA9PiBwdXNoKHsga2luZDogXCJtZXNzYWdlXCIsIGRhdGEsIGlzQmluYXJ5IH0pO1xuICBjb25zdCBvbkNsb3NlID0gKGNvZGU6IG51bWJlciwgcmVhc29uOiBCdWZmZXIpID0+XG4gICAgcHVzaCh7IGtpbmQ6IFwiY2xvc2VcIiwgY29kZSwgcmVhc29uOiByZWFzb24udG9TdHJpbmcoKSB9KTtcbiAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yIH0pO1xuICBjb25zdCBvblVuZXhwZWN0ZWRSZXNwb25zZSA9IChfcmVxdWVzdDogdW5rbm93biwgcmVzcG9uc2U6IHsgc3RhdHVzQ29kZT86IG51bWJlciB9KSA9PlxuICAgIHB1c2goeyBraW5kOiBcInJlamVjdGVkXCIsIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzQ29kZSB9KTtcbiAgc29ja2V0Lm9uKFwib3BlblwiLCBvbk9wZW4pO1xuICBzb2NrZXQub24oXCJtZXNzYWdlXCIsIG9uTWVzc2FnZSk7XG4gIHNvY2tldC5vbihcImNsb3NlXCIsIG9uQ2xvc2UpO1xuICBzb2NrZXQub24oXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgc29ja2V0Lm9uKFwidW5leHBlY3RlZC1yZXNwb25zZVwiLCBvblVuZXhwZWN0ZWRSZXNwb25zZSk7XG4gIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgc29ja2V0LnRlcm1pbmF0ZSgpO1xuICAgIHB1c2goeyBraW5kOiBcImVycm9yXCIsIGVycm9yOiBhYm9ydEVycm9yKHNpZ25hbCkgfSk7XG4gIH07XG4gIHNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0OiAoKSA9PlxuICAgICAgcmVjb3Jkcy5sZW5ndGhcbiAgICAgICAgPyBQcm9taXNlLnJlc29sdmUocmVjb3Jkcy5zaGlmdCgpISlcbiAgICAgICAgOiBuZXcgUHJvbWlzZTxTb2NrZXRSZWNvcmQ+KChyZXNvbHZlKSA9PiB3YWl0ZXJzLnB1c2gocmVzb2x2ZSkpLFxuICAgIGNsZWFudXA6ICgpID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgc2lnbmFsPy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgb25BYm9ydCk7XG4gICAgICBzb2NrZXQub2ZmKFwib3BlblwiLCBvbk9wZW4pO1xuICAgICAgc29ja2V0Lm9mZihcIm1lc3NhZ2VcIiwgb25NZXNzYWdlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJjbG9zZVwiLCBvbkNsb3NlKTtcbiAgICAgIHNvY2tldC5vZmYoXCJlcnJvclwiLCBvbkVycm9yKTtcbiAgICAgIHNvY2tldC5vZmYoXCJ1bmV4cGVjdGVkLXJlc3BvbnNlXCIsIG9uVW5leHBlY3RlZFJlc3BvbnNlKTtcbiAgICAgIHJlY29yZHMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGNsb3NlZCA9IHtcbiAgICAgICAga2luZDogXCJlcnJvclwiIGFzIGNvbnN0LFxuICAgICAgICBlcnJvcjogbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IGV2ZW50IHN0cmVhbSB3YXMgY2xvc2VkXCIpLFxuICAgICAgfTtcbiAgICAgIHdhaXRlcnMuc3BsaWNlKDApLmZvckVhY2goKHdhaXRlcikgPT4gd2FpdGVyKGNsb3NlZCkpO1xuICAgIH0sXG4gICAgZGV0YWNoQWJvcnQ6ICgpID0+IHNpZ25hbD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQpLFxuICB9O1xufVxuXG5mdW5jdGlvbiBhYm9ydEVycm9yKHNpZ25hbD86IEFib3J0U2lnbmFsKTogRXJyb3Ige1xuICByZXR1cm4gc2lnbmFsPy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgID8gc2lnbmFsLnJlYXNvblxuICAgIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBuZXh0UG9vbGVkUmVjb3JkKFxuICBldmVudHM6IFJldHVyblR5cGU8dHlwZW9mIHNvY2tldEV2ZW50cz4sXG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4pOiBQcm9taXNlPFNvY2tldFJlY29yZD4ge1xuICBpZiAoIXNpZ25hbCkgcmV0dXJuIGV2ZW50cy5uZXh0KCk7XG4gIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihzaWduYWwpO1xuICByZXR1cm4gbmV3IFByb21pc2U8U29ja2V0UmVjb3JkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3Qgb25BYm9ydCA9ICgpID0+IHtcbiAgICAgIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgIHJlamVjdChhYm9ydEVycm9yKHNpZ25hbCkpO1xuICAgIH07XG4gICAgc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0LCB7IG9uY2U6IHRydWUgfSk7XG4gICAgdm9pZCBldmVudHNcbiAgICAgIC5uZXh0KClcbiAgICAgIC50aGVuKHJlc29sdmUsIHJlamVjdClcbiAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gY2FjaGVBZmZpbml0eVV1aWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBoZXggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoa2V5KS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMzIpLnNwbGl0KFwiXCIpO1xuICBoZXhbMTJdID0gXCI0XCI7XG4gIGhleFsxNl0gPSAoKE51bWJlci5wYXJzZUludChoZXhbMTZdISwgMTYpICYgMHgzKSB8IDB4OCkudG9TdHJpbmcoMTYpO1xuICByZXR1cm4gYCR7aGV4LnNsaWNlKDAsIDgpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDgsIDEyKS5qb2luKFwiXCIpfS0ke2hleC5zbGljZSgxMiwgMTYpLmpvaW4oXCJcIil9LSR7aGV4LnNsaWNlKDE2LCAyMCkuam9pbihcIlwiKX0tJHtoZXguc2xpY2UoMjApLmpvaW4oXCJcIil9YDtcbn1cblxudHlwZSBBZmZpbml0eUNvbm5lY3Rpb24gPSB7XG4gIHNvY2tldDogT3BlbkFJV2ViU29ja2V0TGlrZTtcbiAgZXZlbnRzOiBSZXR1cm5UeXBlPHR5cGVvZiBzb2NrZXRFdmVudHM+O1xuICBjbG9zZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGNsYXNzIE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIHN0YXRpYyByZWFkb25seSBNQVhfQUZGSU5JVFlfQ09OTkVDVElPTlMgPSAxNjtcbiAgY3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuICByZWFkb25seSByZWZyZXNoQ3JlZGVudGlhbHM/OiAoKSA9PiBQcm9taXNlPE9wZW5BSURpcmVjdENyZWRlbnRpYWxzPjtcbiAgcmVhZG9ubHkgd2ViU29ja2V0RmFjdG9yeTogT3BlbkFJV2ViU29ja2V0RmFjdG9yeTtcbiAgcmVhZG9ubHkgYWZmaW5pdHlDb25uZWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBBZmZpbml0eUNvbm5lY3Rpb24+KCk7XG4gIHJlYWRvbmx5IGJ1c3lBZmZpbml0aWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzID0gb3B0aW9ucy5yZWZyZXNoQ3JlZGVudGlhbHM7XG4gICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5ID1cbiAgICAgIG9wdGlvbnMud2ViU29ja2V0RmFjdG9yeSA/PyAoKHVybCwgd3NPcHRpb25zKSA9PiBuZXcgV3NDbGllbnQodXJsLCB3c09wdGlvbnMpKTtcbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5mb3JFYWNoKCh7IHNvY2tldCwgZXZlbnRzIH0pID0+IHtcbiAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBzb2NrZXQuY2xvc2UoMTAwMCwgXCJ0cmFuc3BvcnQgY2xvc2VkXCIpO1xuICAgIH0pO1xuICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5jbGVhcigpO1xuICAgIHRoaXMuYnVzeUFmZmluaXRpZXMuY2xlYXIoKTtcbiAgfVxuXG4gIC8vIOycoO2ctCDsl7DqsrDrp4wg7LaV7Lac7ZWc64ukLiDsoITrtoAg7IKs7JqpIOykkeydtOuptCBmYWxzZeulvCDrsJjtmZjtlbQg7J287ZqM7ISxIOyGjOy8k+ycvOuhnCDsspjrpqztlZzri6QuXG4gIHJlbWVtYmVyQWZmaW5pdHlDb25uZWN0aW9uKHRocmVhZElkOiBzdHJpbmcsIGNvbm5lY3Rpb246IEFmZmluaXR5Q29ubmVjdGlvbik6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuaGFzKHRocmVhZElkKSAmJlxuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLnNpemUgPj0gT3BlbkFJV2ViU29ja2V0VHJhbnNwb3J0Lk1BWF9BRkZJTklUWV9DT05ORUNUSU9OU1xuICAgICkge1xuICAgICAgY29uc3QgaWRsZUtleSA9IFsuLi50aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMua2V5cygpXS5maW5kKFxuICAgICAgICAoa2V5KSA9PiAhdGhpcy5idXN5QWZmaW5pdGllcy5oYXMoa2V5KSxcbiAgICAgICk7XG4gICAgICBpZiAoaWRsZUtleSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgICBjb25zdCBpZGxlID0gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChpZGxlS2V5KSE7XG4gICAgICBpZGxlLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICBpZGxlLnNvY2tldC5jbG9zZSgxMDAwLCBcImFmZmluaXR5IGNhY2hlIGV2aWN0ZWRcIik7XG4gICAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKGlkbGVLZXkpO1xuICAgIH1cbiAgICB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuc2V0KHRocmVhZElkLCBjb25uZWN0aW9uKTtcbiAgICAvLyDsnKDtnLQg7IOB7YOc7JeQ7IScIGJhY2tlbmQg6rCAIOuBiuydgCDshozsvJPsnYQg64uk7J2MIOyalOyyreydtCDsp5HslrTrk6Tsp4Ag7JWK64+E66GdIOy6kOyLnOyXkOyEnCDsoJzqsbDtlZzri6QuXG4gICAgY29uc3QgZHJvcCA9ICgpID0+IHtcbiAgICAgIGNvbm5lY3Rpb24uY2xvc2VkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmJ1c3lBZmZpbml0aWVzLmhhcyh0aHJlYWRJZCkpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZ2V0KHRocmVhZElkKSAhPT0gY29ubmVjdGlvbikgcmV0dXJuO1xuICAgICAgdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmRlbGV0ZSh0aHJlYWRJZCk7XG4gICAgICBjb25uZWN0aW9uLmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLnNvY2tldC5vbihcImNsb3NlXCIsIGRyb3ApO1xuICAgIGNvbm5lY3Rpb24uc29ja2V0Lm9uKFwiZXJyb3JcIiwgZHJvcCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhc3luYyAqc3RyZWFtKHJlcXVlc3Q6IE9wZW5BSVRyYW5zcG9ydFJlcXVlc3QpOiBBc3luY0dlbmVyYXRvcjxPcGVuQUlOb3JtYWxpemVkRXZlbnQ+IHtcbiAgICBsZXQgcmVmcmVzaGVkID0gZmFsc2U7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChyZXF1ZXN0LnNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihyZXF1ZXN0LnNpZ25hbCk7XG4gICAgICBjb25zdCBoYXNBZmZpbml0eSA9IHJlcXVlc3QuYm9keS5wcm9tcHRfY2FjaGVfa2V5ICE9PSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCByZXRhaW5Db25uZWN0aW9uID0gaGFzQWZmaW5pdHkgJiYgIXRoaXMuYnVzeUFmZmluaXRpZXMuaGFzKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHRoaXMuYnVzeUFmZmluaXRpZXMuYWRkKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgY29uc3QgZW50cnkgPSByZXRhaW5Db25uZWN0aW9uID8gdGhpcy5hZmZpbml0eUNvbm5lY3Rpb25zLmdldChyZXF1ZXN0LnRocmVhZElkKSA6IHVuZGVmaW5lZDtcbiAgICAgIGlmIChlbnRyeT8uY2xvc2VkKSB7XG4gICAgICAgIHRoaXMuYWZmaW5pdHlDb25uZWN0aW9ucy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICAgIGVudHJ5LmV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBjYWNoZWQgPSBlbnRyeT8uY2xvc2VkID8gdW5kZWZpbmVkIDogZW50cnk7XG4gICAgICBsZXQgcmV0YWluZWQgPSByZXRhaW5Db25uZWN0aW9uO1xuICAgICAgY29uc3Qgc29ja2V0ID1cbiAgICAgICAgY2FjaGVkPy5zb2NrZXQgPz9cbiAgICAgICAgdGhpcy53ZWJTb2NrZXRGYWN0b3J5KHdlYnNvY2tldFVybChDSEFUR1BUX0NPREVYX1JFU1BPTlNFU19VUkwpLCB7XG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyh0aGlzLmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLCB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCwge1xuICAgICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0aHJlYWRJZDogcmVxdWVzdC50aHJlYWRJZCxcbiAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdElkOiByZXF1ZXN0LmNsaWVudFJlcXVlc3RJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgXCJPcGVuQUktQmV0YVwiOiBcInJlc3BvbnNlc193ZWJzb2NrZXRzPTIwMjYtMDItMDZcIixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIGNvbnN0IGV2ZW50cyA9IGNhY2hlZD8uZXZlbnRzID8/IHNvY2tldEV2ZW50cyhzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKTtcbiAgICAgIGxldCBjb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICghY2FjaGVkKSB7XG4gICAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gYXdhaXQgZXZlbnRzLm5leHQoKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBoYW5kc2hha2Uua2luZCA9PT0gXCJyZWplY3RlZFwiICYmXG4gICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzID09PSA0MDEgJiZcbiAgICAgICAgICAgICFyZWZyZXNoZWQgJiZcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENyZWRlbnRpYWxzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBzb2NrZXQudGVybWluYXRlKCk7XG4gICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gYXdhaXQgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMoKTtcbiAgICAgICAgICAgIHJlZnJlc2hlZCA9IHRydWU7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFxuICAgICAgICAgICAgICBgT3BlbkFJIFdlYlNvY2tldCBoYW5kc2hha2UgcmVqZWN0ZWQke2hhbmRzaGFrZS5zdGF0dXMgPyBgIHdpdGggSFRUUCAke2hhbmRzaGFrZS5zdGF0dXN9YCA6IFwiXCJ9YCxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoYW5kc2hha2Uuc3RhdHVzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGhhbmRzaGFrZS5raW5kID09PSBcImVycm9yXCIpIHRocm93IGhhbmRzaGFrZS5lcnJvcjtcbiAgICAgICAgICBpZiAoaGFuZHNoYWtlLmtpbmQgIT09IFwib3BlblwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSB0aGUgaGFuZHNoYWtlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJldGFpbkNvbm5lY3Rpb24pIHtcbiAgICAgICAgICAgIHJldGFpbmVkID0gdGhpcy5yZW1lbWJlckFmZmluaXR5Q29ubmVjdGlvbihyZXF1ZXN0LnRocmVhZElkLCB7IHNvY2tldCwgZXZlbnRzIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICBzb2NrZXQuc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6IFwicmVzcG9uc2UuY3JlYXRlXCIsIC4uLnJlcXVlc3QuYm9keSB9KSwgKGVycm9yKSA9PlxuICAgICAgICAgICAgZXJyb3IgPyByZWplY3QoZXJyb3IpIDogcmVzb2x2ZSgpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgICAgY29uc3QgcmVjb3JkID0gY2FjaGVkXG4gICAgICAgICAgICA/IGF3YWl0IG5leHRQb29sZWRSZWNvcmQoZXZlbnRzLCBzb2NrZXQsIHJlcXVlc3Quc2lnbmFsKVxuICAgICAgICAgICAgOiBhd2FpdCBldmVudHMubmV4dCgpO1xuICAgICAgICAgIGlmIChyZWNvcmQua2luZCA9PT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgIGlmIChyZWNvcmQuaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgYW4gdW5leHBlY3RlZCBiaW5hcnkgbWVzc2FnZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByYXc6IHVua25vd247XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByYXcgPSBKU09OLnBhcnNlKHJhd0RhdGFUZXh0KHJlY29yZC5kYXRhKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IE9wZW5BSVByb3RvY29sRXJyb3IoXCJPcGVuQUkgV2ViU29ja2V0IHNlbnQgaW52YWxpZCBKU09OXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBub3JtYWxpemVPcGVuQUlFdmVudChyYXcpO1xuICAgICAgICAgICAgaWYgKCFldmVudCkgY29udGludWU7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJjb21wbGV0ZWRcIikge1xuICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICBpZiAocmV0YWluZWQpIGV2ZW50cy5kZXRhY2hBYm9ydCgpO1xuICAgICAgICAgICAgICBlbHNlIHNvY2tldC5jbG9zZSgxMDAwLCBcInJlc3BvbnNlIGNvbXBsZXRlZFwiKTtcbiAgICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHlpZWxkIGV2ZW50O1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikgdGhyb3cgZXZlbnQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgICB0aHJvdyByZWNvcmQuZXJyb3I7XG4gICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQua2luZCA9PT0gXCJjbG9zZVwiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcbiAgICAgICAgICAgICAgYE9wZW5BSSBXZWJTb2NrZXQgY2xvc2VkIGJlZm9yZSBhIHRlcm1pbmFsIHJlc3BvbnNlIGV2ZW50ICgke3JlY29yZC5jb2RlfSR7cmVjb3JkLnJlYXNvbiA/IGA6ICR7cmVjb3JkLnJlYXNvbn1gIDogXCJcIn0pYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKFwiT3BlbkFJIFdlYlNvY2tldCBlbWl0dGVkIGFuIHVuZXhwZWN0ZWQgaGFuZHNoYWtlIGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFjb21wbGV0ZWQgfHwgIXJldGFpbmVkKSB7XG4gICAgICAgICAgaWYgKHJldGFpbmVkKSB0aGlzLmFmZmluaXR5Q29ubmVjdGlvbnMuZGVsZXRlKHJlcXVlc3QudGhyZWFkSWQpO1xuICAgICAgICAgIGV2ZW50cy5jbGVhbnVwKCk7XG4gICAgICAgICAgaWYgKCFjb21wbGV0ZWQpIHNvY2tldC50ZXJtaW5hdGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0YWluQ29ubmVjdGlvbikgdGhpcy5idXN5QWZmaW5pdGllcy5kZWxldGUocmVxdWVzdC50aHJlYWRJZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc3BvbnNlRXJyb3IocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxPcGVuQUlQcm90b2NvbEVycm9yPiB7XG4gIGNvbnN0IHRleHQgPSBhd2FpdCByZXNwb25zZS50ZXh0KCkuY2F0Y2goKCkgPT4gXCJcIik7XG4gIGxldCBtZXNzYWdlID0gdGV4dCB8fCByZXNwb25zZS5zdGF0dXNUZXh0IHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gIGxldCBjb2RlOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZSh0ZXh0KSBhcyB7XG4gICAgICBlcnJvcj86IHsgbWVzc2FnZT86IHN0cmluZzsgY29kZT86IHN0cmluZyB9IHwgc3RyaW5nO1xuICAgICAgbWVzc2FnZT86IHN0cmluZztcbiAgICAgIGNvZGU/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBlcnJvciA9IHBhcnNlZC5lcnJvcjtcbiAgICBtZXNzYWdlID1cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwib2JqZWN0XCIgPyBlcnJvci5tZXNzYWdlIDogdW5kZWZpbmVkKSA/P1xuICAgICAgcGFyc2VkLm1lc3NhZ2UgPz9cbiAgICAgICh0eXBlb2YgZXJyb3IgPT09IFwic3RyaW5nXCIgPyBlcnJvciA6IG1lc3NhZ2UpO1xuICAgIGNvZGUgPSAodHlwZW9mIGVycm9yID09PSBcIm9iamVjdFwiID8gZXJyb3IuY29kZSA6IHVuZGVmaW5lZCkgPz8gcGFyc2VkLmNvZGU7XG4gIH0gY2F0Y2gge1xuICAgIGNvZGUgPSB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBPcGVuQUlQcm90b2NvbEVycm9yKG1lc3NhZ2UsIGNvZGUsIHJlc3BvbnNlLnN0YXR1cyk7XG59XG5cbmV4cG9ydCBjbGFzcyBPcGVuQUlIdHRwc1RyYW5zcG9ydCBpbXBsZW1lbnRzIE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydCB7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlEaXJlY3RDcmVkZW50aWFscztcbiAgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHJlYWRvbmx5IHJlZnJlc2hDcmVkZW50aWFscz86ICgpID0+IFByb21pc2U8T3BlbkFJRGlyZWN0Q3JlZGVudGlhbHM+O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucykge1xuICAgIHRoaXMuY3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMuZmV0Y2hJbXBsID0gb3B0aW9ucy5mZXRjaCA/PyBmZXRjaDtcbiAgICB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyA9IG9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzO1xuICB9XG5cbiAgYXN5bmMgKnN0cmVhbShyZXF1ZXN0OiBPcGVuQUlUcmFuc3BvcnRSZXF1ZXN0KTogQXN5bmNHZW5lcmF0b3I8T3BlbkFJTm9ybWFsaXplZEV2ZW50PiB7XG4gICAgbGV0IHJlZnJlc2hlZCA9IGZhbHNlO1xuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5mZXRjaEltcGwoQ0hBVEdQVF9DT0RFWF9SRVNQT05TRVNfVVJMLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IGJ1aWxkQ29kZXhJZGVudGl0eUhlYWRlcnMoXG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzZXNzaW9uSWQ6IHJlcXVlc3Quc2Vzc2lvbklkLFxuICAgICAgICAgICAgdGhyZWFkSWQ6IHJlcXVlc3QudGhyZWFkSWQsXG4gICAgICAgICAgICBjbGllbnRSZXF1ZXN0SWQ6IHJlcXVlc3QuY2xpZW50UmVxdWVzdElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICksXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3QuYm9keSksXG4gICAgICAgIHNpZ25hbDogcmVxdWVzdC5zaWduYWwsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAxICYmICFyZWZyZXNoZWQgJiYgdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHMpIHtcbiAgICAgICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLnJlZnJlc2hDcmVkZW50aWFscygpO1xuICAgICAgICByZWZyZXNoZWQgPSB0cnVlO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IGF3YWl0IHJlc3BvbnNlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgaWYgKCFyZXNwb25zZS5ib2R5KSB0aHJvdyBuZXcgT3BlbkFJUHJvdG9jb2xFcnJvcihcIk9wZW5BSSByZXNwb25zZSBoYWQgbm8gYm9keVwiKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBub3JtYWxpemVPcGVuQUlTU0UocmVzcG9uc2UuYm9keSkpIHtcbiAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucyBleHRlbmRzIE9wZW5BSUh0dHBzVHJhbnNwb3J0T3B0aW9ucyB7XG4gIHRyYW5zcG9ydD86IE9wZW5BSVJlc3BvbnNlc1RyYW5zcG9ydDtcbiAgdHJhbnNwb3J0S2luZD86IFwiaHR0cHNcIiB8IFwid2Vic29ja2V0XCI7XG4gIHdlYlNvY2tldEZhY3Rvcnk/OiBPcGVuQUlXZWJTb2NrZXRGYWN0b3J5O1xufVxuXG5leHBvcnQgY2xhc3MgT3BlbkFJRGlyZWN0Q2xpZW50IHtcbiAgcmVhZG9ubHkgdHJhbnNwb3J0OiBPcGVuQUlSZXNwb25zZXNUcmFuc3BvcnQ7XG4gIGltYWdlQ3JlZGVudGlhbHM6IE9wZW5BSURpcmVjdENyZWRlbnRpYWxzO1xuXG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMpIHtcbiAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBvcHRpb25zLmNyZWRlbnRpYWxzO1xuICAgIHRoaXMudHJhbnNwb3J0ID1cbiAgICAgIG9wdGlvbnMudHJhbnNwb3J0ID8/XG4gICAgICAob3B0aW9ucy50cmFuc3BvcnRLaW5kID09PSBcIndlYnNvY2tldFwiXG4gICAgICAgID8gbmV3IE9wZW5BSVdlYlNvY2tldFRyYW5zcG9ydChvcHRpb25zKVxuICAgICAgICA6IG5ldyBPcGVuQUlIdHRwc1RyYW5zcG9ydChvcHRpb25zKSk7XG4gIH1cblxuICByZXNwb25zZXMob3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucywgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBPcGVuQUlFdmVudFN0cmVhbSB7XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucy5tb2RlbCA9PT0gXCJncHQtaW1hZ2UtMlwiIHx8XG4gICAgICAodHlwZW9mIG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgIG9wdGlvbnMuaW1hZ2VHZW5lcmF0aW9uLmJhY2tncm91bmQgPT09IFwidHJhbnNwYXJlbnRcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YW5kYWxvbmVJbWFnZXMob3B0aW9ucywgc2lnbmFsKTtcbiAgICB9XG4gICAgY29uc3QgY2xpZW50UmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBjb25zdCBhZmZpbml0eUlkID0gb3B0aW9ucy5wcm9tcHRDYWNoZUtleVxuICAgICAgPyBjYWNoZUFmZmluaXR5VXVpZChvcHRpb25zLnByb21wdENhY2hlS2V5KVxuICAgICAgOiBjbGllbnRSZXF1ZXN0SWQ7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNwb3J0LnN0cmVhbSh7XG4gICAgICBib2R5OiBidWlsZE9wZW5BSVJlc3BvbnNlc1JlcXVlc3QoXG4gICAgICAgIG9wdGlvbnMucHJvbXB0Q2FjaGVLZXkgPyB7IC4uLm9wdGlvbnMsIHByb21wdENhY2hlS2V5OiBhZmZpbml0eUlkIH0gOiBvcHRpb25zLFxuICAgICAgKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHNlc3Npb25JZDogYWZmaW5pdHlJZCxcbiAgICAgIC8vIHByb21wdENhY2hlS2V5IGlzIGFscmVhZHkgYSBvbmUtd2F5IFNESyBhZmZpbml0eSB2YWx1ZSwgbmV2ZXIgYSByYXcgc2Vzc2lvbktleS5cbiAgICAgIHRocmVhZElkOiBhZmZpbml0eUlkLFxuICAgICAgY2xpZW50UmVxdWVzdElkLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgKnN0YW5kYWxvbmVJbWFnZXMoXG4gICAgb3B0aW9uczogT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogT3BlbkFJRXZlbnRTdHJlYW0ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBidWlsZFN0YW5kYWxvbmVJbWFnZVJlcXVlc3Qob3B0aW9ucyk7XG4gICAgY29uc3QgcmVxdWVzdElkID0gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICBmb3IgKGxldCBhdHRlbXB0ID0gMDsgYXR0ZW1wdCA8IDI7IGF0dGVtcHQrKykge1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAodGhpcy5vcHRpb25zLmZldGNoID8/IGZldGNoKShyZXF1ZXN0LnVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyhcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIHRoaXMuaW1hZ2VDcmVkZW50aWFscy5hY2NvdW50SWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwieC1jb2RleC1pbWFnZS10dXJuLWlkXCI6IHJlcXVlc3RJZCxcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdC5ib2R5KSxcbiAgICAgICAgc2lnbmFsLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgYXR0ZW1wdCA9PT0gMCAmJiB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgICAgICB0aGlzLmltYWdlQ3JlZGVudGlhbHMgPSBhd2FpdCB0aGlzLm9wdGlvbnMucmVmcmVzaENyZWRlbnRpYWxzKCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgYXdhaXQgcmVzcG9uc2VFcnJvcihyZXNwb25zZSk7XG4gICAgICBjb25zdCBpbWFnZXMgPSBhd2FpdCByZWFkU3RhbmRhbG9uZUltYWdlUmVzcG9uc2UoXG4gICAgICAgIHJlc3BvbnNlLFxuICAgICAgICB0eXBlb2Ygb3B0aW9ucy5pbWFnZUdlbmVyYXRpb24gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICBvcHRpb25zLmltYWdlR2VuZXJhdGlvbi5iYWNrZ3JvdW5kID09PSBcInRyYW5zcGFyZW50XCIsXG4gICAgICApO1xuICAgICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgICAgeWllbGQqIGltYWdlcztcbiAgICAgIGNvbnN0IGZpcnN0SW1hZ2UgPSBpbWFnZXNbMF07XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHR5cGU6IFwiY29tcGxldGVkXCIsXG4gICAgICAgIHJlc3BvbnNlSWQ6IHJlcXVlc3RJZCxcbiAgICAgICAgbW9kZWw6IGZpcnN0SW1hZ2U/LnR5cGUgPT09IFwiaW1hZ2VcIiA/IGZpcnN0SW1hZ2UuZ2VuZXJhdGlvbj8ubW9kZWwgOiBcImdwdC1pbWFnZS0yXCIsXG4gICAgICB9O1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCk6IHZvaWQge1xuICAgIHRoaXMudHJhbnNwb3J0LmNsb3NlPy4oKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUF3RUEsTUFBTSw4QkFBOEI7QUFFcEMsU0FBUyxhQUFhLEtBQXFCO0NBQ3pDLElBQUk7Q0FDSixJQUFJO0VBQ0YsU0FBUyxJQUFJLElBQUksR0FBRztDQUN0QixTQUFTLE9BQU87RUFDZCxNQUFNLElBQUksb0JBQW9CLGlDQUFpQyxPQUFPLEtBQUssR0FBRztDQUNoRjtDQUNBLE9BQU8sV0FBVyxPQUFPLGFBQWEsV0FBVyxTQUFTO0NBQzFELE9BQU8sT0FBTyxTQUFTO0FBQ3pCO0FBRUEsU0FBUyxZQUFZLE1BQXVCO0NBQzFDLElBQUksTUFBTSxRQUFRLElBQUks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