@cartanova/qgrid-cli 2.3.2 → 2.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +94 -278
  2. package/bundle/dist/application/qgrid/qgrid.frame.js +15 -5
  3. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +33 -12
  4. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +42 -98
  5. package/bundle/dist/utils/providers/anthropic/claude-session.js +54 -32
  6. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +7 -37
  7. package/bundle/dist/utils/providers/common/model-cost.js +3 -2
  8. package/bundle/dist/utils/providers/openai/codex-worker.js +1 -2
  9. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +19 -12
  10. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +235 -7
  11. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +152 -364
  12. package/bundle/src/application/qgrid/qgrid.frame.ts +38 -23
  13. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +60 -0
  14. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +57 -16
  15. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +92 -340
  16. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +61 -188
  17. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +89 -62
  18. package/bundle/src/utils/providers/anthropic/claude-session.ts +71 -46
  19. package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +74 -30
  20. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +40 -102
  21. package/bundle/src/utils/providers/common/model-cost.test.ts +19 -1
  22. package/bundle/src/utils/providers/common/model-cost.ts +2 -1
  23. package/bundle/src/utils/providers/common/provider-dispatcher.ts +7 -4
  24. package/bundle/src/utils/providers/openai/codex-worker.ts +2 -8
  25. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +18 -11
  26. package/package.json +1 -1
@@ -1,35 +1,25 @@
1
1
  import "../../../_virtual/_rolldown/runtime.js";
2
- import { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, canonicalAnthropicModel } from "./anthropic-constants.js";
2
+ import { ANTHROPIC_CLAUDE_CWD, ANTHROPIC_DISALLOWED_TOOLS, anthropicConfigDir, assertSupportedOneMillionSuffix, canonicalAnthropicModel, needsCli1mSuffix, supports1MContext } from "./anthropic-constants.js";
3
3
  import { buildStreamJsonInput, handleStreamJsonLine } from "./stream-json-adapter.js";
4
- import { createHash, randomUUID } from "node:crypto";
4
+ import { randomUUID } from "node:crypto";
5
5
  import { spawn } from "node:child_process";
6
6
  import { mkdirSync, writeFileSync } from "node:fs";
7
7
  //#region src/utils/providers/anthropic/claude-session.ts
8
8
  /**
9
9
  * claude-session — Claude CLI 세션 spawn + QgridThreadCoord 매핑 + per-session 락.
10
10
  *
11
- * 멀티턴: 호출 `--session-id <uuid>`, 후속 `--resume <uuid>`. 입력은 U2 어댑터가 만든
12
- * JSONL 을 stdin 으로 흘리고(`--input-format stream-json`), 출력은 U3 파서로 처리한다.
11
+ * 멀티턴: 호출 fresh `--session-id <uuid>`로 실행한다. 입력은 어댑터가 만든 JSONL 을
12
+ * stdin 으로 흘리고(`--input-format stream-json`), 출력은 파서로 처리한다.
13
13
  *
14
14
  * 핵심 계약:
15
15
  * - coord 는 임의 저장이 아니라 기존 QgridThreadCoord{workerId,threadId,epoch,systemHash} 에
16
16
  * 매핑한다. threadId=세션 uuid, epoch=0 고정(worker restart 개념 없음), workerId=token 기반
17
17
  * 안정 합성, systemHash=요청 system 해시. issueConvContext/decideConvRouting 과 round-trip.
18
- * - resume eligibility systemHash 만으로 부족 확장 호환키(system+model+structured 모드)로
19
- * 판정. 불일치면 cold fallback.
20
- * - 같은 세션의 동시 turn 은 per-session 락(session-id 단위 직렬화)으로 transcript 오염 방지.
18
+ * - withSessionLock exported primitive 유지한다. 기본 경로에서는 호출 새 session-id 라
19
+ * 사실상 no-contention 이지만, 직접 호출자/테스트의 직렬화 보장은 보존한다.
21
20
  * - stream-json 직렬화 시 SDK envelope(uuid/session_id/parent_tool_use_id) decorate.
22
21
  * - structured output 일 때 출력 파서에 { structuredOutput: true } 전달(없으면 streamObject 깨짐).
23
- *
24
- * ⚠️ 첫 호출 동시성: resume 가 아닌 "첫 호출"은 여기서 새 랜덤 session-id 를 발급하므로, 같은
25
- * qgrid sessionKey 에 대한 두 동시 첫 호출은 서로 다른 id 로 둘 다 실행된다. 현재 IF/owner scope 는
26
- * LLM 호출을 순차 실행하고 sessionKey 를 서버로 보내지 않으므로, dispatcher 는 cold 락을 두지 않는다.
27
- * 병렬 첫 호출을 서버가 지원하게 되면 sessionKey 전달/락 설계부터 다시 잡아야 한다.
28
22
  */
29
- function compatibilityKey(opts) {
30
- const schemaPart = opts.outputSchema && opts.outputSchema.length > 0 ? opts.outputSchema : "text";
31
- return createHash("sha256").update(`${opts.system ?? ""}\0${opts.model}\0${schemaPart}`).digest("hex").slice(0, 16);
32
- }
33
23
  const sessionChains = /* @__PURE__ */ new Map();
34
24
  async function withSessionLock(sessionId, fn) {
35
25
  const next = (sessionChains.get(sessionId) ?? Promise.resolve()).then(fn, fn);
@@ -66,6 +56,19 @@ function ensureCwd() {
66
56
  writeFileSync(`${ANTHROPIC_CLAUDE_CWD}/.claude/settings.json`, "{}");
67
57
  cwdEnsured = true;
68
58
  }
59
+ function applyOneMillionSuffix(model, needsSuffix) {
60
+ const base = canonicalAnthropicModel(model);
61
+ return needsSuffix ? `${base}[1m]` : base;
62
+ }
63
+ function oneMillionEnv(supported) {
64
+ return supported ? {} : { CLAUDE_CODE_DISABLE_1M_CONTEXT: "1" };
65
+ }
66
+ function structuredOutputRetriesEnv(raw = process.env.MAX_STRUCTURED_OUTPUT_RETRIES) {
67
+ if (!raw) return { MAX_STRUCTURED_OUTPUT_RETRIES: "1" };
68
+ const parsed = Number.parseInt(raw, 10);
69
+ if (!Number.isFinite(parsed)) return { MAX_STRUCTURED_OUTPUT_RETRIES: "1" };
70
+ return { MAX_STRUCTURED_OUTPUT_RETRIES: String(Math.max(parsed, 1)) };
71
+ }
69
72
  function buildClaudeArgs(opts) {
70
73
  const useStructured = Boolean(opts.jsonSchema && opts.jsonSchema.length > 0);
71
74
  const args = [
@@ -83,22 +86,22 @@ function buildClaudeArgs(opts) {
83
86
  "--output-format",
84
87
  "stream-json",
85
88
  "--verbose",
86
- "--max-turns",
87
- useStructured ? "2" : "1",
89
+ ...opts.includePartialMessages ? ["--include-partial-messages"] : [],
88
90
  "--permission-mode",
89
91
  "bypassPermissions",
90
92
  "--setting-sources",
91
93
  "project",
92
94
  "--model",
93
- opts.model,
95
+ applyOneMillionSuffix(opts.model, opts.needsOneMillionSuffix ?? false),
94
96
  "--system-prompt",
95
97
  opts.system ?? "",
96
98
  "--thinking",
97
99
  "disabled",
98
100
  "--effort",
99
- opts.effort ?? "high",
101
+ opts.effort ?? "low",
100
102
  "--disable-slash-commands",
101
- ...opts.isResume ? ["--resume", opts.sessionId] : ["--session-id", opts.sessionId]
103
+ "--session-id",
104
+ opts.sessionId
102
105
  ];
103
106
  if (useStructured) args.push("--json-schema", opts.jsonSchema);
104
107
  return args;
@@ -108,9 +111,11 @@ function buildClaudeArgs(opts) {
108
111
  * @param onDelta 점진 텍스트 delta(streamText) 또는 structured 부분 JSON(streamObject).
109
112
  */
110
113
  function runClaudeSession(req, onDelta) {
114
+ assertSupportedOneMillionSuffix(req.model);
111
115
  const model = canonicalAnthropicModel(req.model);
112
- const isResume = Boolean(req.resumeSessionId);
113
- const sessionId = req.resumeSessionId ?? randomUUID();
116
+ const supportsOneMillion = supports1MContext(model);
117
+ const needsOneMillionSuffix = needsCli1mSuffix(model);
118
+ const sessionId = randomUUID();
114
119
  const useStructured = Boolean(req.jsonSchema && req.jsonSchema.length > 0);
115
120
  const workerId = makeAnthropicWorkerId(req.tokenId);
116
121
  return withSessionLock(sessionId, () => {
@@ -122,14 +127,18 @@ function runClaudeSession(req, onDelta) {
122
127
  effort: req.effort,
123
128
  jsonSchema: req.jsonSchema,
124
129
  sessionId,
125
- isResume
130
+ needsOneMillionSuffix,
131
+ includePartialMessages: req.includePartialMessages
126
132
  });
127
133
  const stdinPayload = decorateAndSerialize(buildStreamJsonInput({
128
134
  coldHistory: req.coldHistory,
129
- input: req.input,
130
- isResume
135
+ input: req.input
131
136
  }), sessionId);
132
137
  return new Promise((resolve, reject) => {
138
+ if (req.abortSignal?.aborted) {
139
+ reject(/* @__PURE__ */ new Error("aborted"));
140
+ return;
141
+ }
133
142
  const child = spawn("claude", args, {
134
143
  stdio: [
135
144
  "pipe",
@@ -144,9 +153,14 @@ function runClaudeSession(req, onDelta) {
144
153
  CLAUDE_CONFIG_DIR: configDir,
145
154
  CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
146
155
  CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: "1",
147
- CLAUDE_CODE_DISABLE_1M_CONTEXT: "1",
156
+ ...oneMillionEnv(supportsOneMillion),
148
157
  CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
149
- CLAUDE_CODE_ATTRIBUTION_HEADER: "0"
158
+ CLAUDE_CODE_DISABLE_TERMINAL_TITLE: "1",
159
+ CLAUDE_CODE_DISABLE_BUNDLED_SKILLS: "1",
160
+ CLAUDE_CODE_DISABLE_WORKFLOWS: "1",
161
+ CLAUDE_CODE_ATTRIBUTION_HEADER: "0",
162
+ MAX_THINKING_TOKENS: "0",
163
+ ...useStructured ? structuredOutputRetriesEnv() : {}
150
164
  }
151
165
  });
152
166
  let settled = false;
@@ -158,9 +172,11 @@ function runClaudeSession(req, onDelta) {
158
172
  stderrBuf = (stderrBuf + d.toString()).slice(-STDERR_CAP);
159
173
  });
160
174
  const stderrSuffix = () => stderrBuf.trim() ? ` — stderr: ${stderrBuf.trim()}` : "";
175
+ let cleanupAbort;
161
176
  const timer = setTimeout(() => {
162
177
  if (settled) return;
163
178
  settled = true;
179
+ cleanupAbort?.();
164
180
  child.kill();
165
181
  reject(/* @__PURE__ */ new Error(`Claude session timeout after ${req.timeoutMs / 1e3}s`));
166
182
  }, req.timeoutMs);
@@ -168,19 +184,23 @@ function runClaudeSession(req, onDelta) {
168
184
  if (settled) return;
169
185
  settled = true;
170
186
  clearTimeout(timer);
187
+ cleanupAbort?.();
171
188
  resolve({
172
189
  ...result,
173
190
  sessionId,
174
191
  workerId
175
192
  });
176
193
  };
177
- req.abortSignal?.addEventListener("abort", () => {
194
+ const onAbort = () => {
178
195
  if (settled) return;
179
196
  settled = true;
180
197
  clearTimeout(timer);
198
+ cleanupAbort?.();
181
199
  child.kill();
182
200
  reject(/* @__PURE__ */ new Error("aborted"));
183
- });
201
+ };
202
+ cleanupAbort = () => req.abortSignal?.removeEventListener("abort", onAbort);
203
+ req.abortSignal?.addEventListener("abort", onAbort, { once: true });
184
204
  child.stdout?.on("data", (d) => {
185
205
  if (settled) return;
186
206
  buffer += d.toString();
@@ -201,12 +221,14 @@ function runClaudeSession(req, onDelta) {
201
221
  if (settled) return;
202
222
  settled = true;
203
223
  clearTimeout(timer);
224
+ cleanupAbort?.();
204
225
  reject(/* @__PURE__ */ new Error(`Claude session closed without result${stderrSuffix()}`));
205
226
  });
206
227
  child.on("error", (err) => {
207
228
  if (settled) return;
208
229
  settled = true;
209
230
  clearTimeout(timer);
231
+ cleanupAbort?.();
210
232
  reject(/* @__PURE__ */ new Error(`Claude session spawn error: ${err.message}`));
211
233
  });
212
234
  child.stdin?.write(stdinPayload);
@@ -215,6 +237,6 @@ function runClaudeSession(req, onDelta) {
215
237
  });
216
238
  }
217
239
  //#endregion
218
- export { buildClaudeArgs, compatibilityKey, decorateAndSerialize, ensureConfigDir, makeAnthropicWorkerId, runClaudeSession, withSessionLock };
240
+ export { applyOneMillionSuffix, buildClaudeArgs, decorateAndSerialize, ensureConfigDir, makeAnthropicWorkerId, oneMillionEnv, runClaudeSession, structuredOutputRetriesEnv, withSessionLock };
219
241
 
220
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOyyqyDtmLjstpwgYC0tc2Vzc2lvbi1pZCA8dXVpZD5gLCDtm4Tsho0gYC0tcmVzdW1lIDx1dWlkPmAuIOyeheugpeydgCBVMiDslrTrjJHthLDqsIAg66eM65OgXG4gKiBKU09OTCDsnYQgc3RkaW4g7Jy866GcIO2dmOumrOqzoChgLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb25gKSwg7Lac66Cl7J2AIFUzIO2MjOyEnOuhnCDsspjrpqztlZzri6QuXG4gKlxuICog7ZW17IusIOqzhOyVvTpcbiAqICAtIGNvb3JkIOuKlCDsnoTsnZgg7KCA7J6l7J20IOyVhOuLiOudvCDquLDsobQgUWdyaWRUaHJlYWRDb29yZHt3b3JrZXJJZCx0aHJlYWRJZCxlcG9jaCxzeXN0ZW1IYXNofSDsl5BcbiAqICAgIOunpO2Vke2VnOuLpC4gdGhyZWFkSWQ97IS47IWYIHV1aWQsIGVwb2NoPTAg6rOg7KCVKHdvcmtlciByZXN0YXJ0IOqwnOuFkCDsl4bsnYwpLCB3b3JrZXJJZD10b2tlbiDquLDrsJhcbiAqICAgIOyViOyglSDtlanshLEsIHN5c3RlbUhhc2g97JqU7LKtIHN5c3RlbSDtlbTsi5wuIGlzc3VlQ29udkNvbnRleHQvZGVjaWRlQ29udlJvdXRpbmcg6rO8IHJvdW5kLXRyaXAuXG4gKiAgLSByZXN1bWUgZWxpZ2liaWxpdHkg64qUIHN5c3RlbUhhc2gg66eM7Jy866GcIOu2gOyhsSDihpIg7ZmV7J6lIO2YuO2ZmO2CpChzeXN0ZW0rbW9kZWwrc3RydWN0dXJlZCDrqqjrk5wp66GcXG4gKiAgICDtjJDsoJUuIOu2iOydvOy5mOuptCBjb2xkIGZhbGxiYWNrLlxuICogIC0g6rCZ7J2AIOyEuOyFmOydmCDrj5nsi5wgdHVybiDsnYAgcGVyLXNlc3Npb24g6529KHNlc3Npb24taWQg64uo7JyEIOyngeugrO2ZlCnsnLzroZwgdHJhbnNjcmlwdCDsmKTsl7wg67Cp7KeALlxuICogIC0gc3RyZWFtLWpzb24g7KeB66Cs7ZmUIOyLnCBTREsgZW52ZWxvcGUodXVpZC9zZXNzaW9uX2lkL3BhcmVudF90b29sX3VzZV9pZCkgZGVjb3JhdGUuXG4gKiAgLSBzdHJ1Y3R1cmVkIG91dHB1dCDsnbwg65WMIOy2nOugpSDtjIzshJzsl5AgeyBzdHJ1Y3R1cmVkT3V0cHV0OiB0cnVlIH0g7KCE64usKOyXhuycvOuptCBzdHJlYW1PYmplY3Qg6rmo7KeQKS5cbiAqXG4gKiDimqDvuI8g7LKrIO2YuOy2nCDrj5nsi5zshLE6IHJlc3VtZSDqsIAg7JWE64uMIFwi7LKrIO2YuOy2nFwi7J2AIOyXrOq4sOyEnCDsg4gg656c642kIHNlc3Npb24taWQg66W8IOuwnOq4ie2VmOuvgOuhnCwg6rCZ7J2AXG4gKiAgICBxZ3JpZCBzZXNzaW9uS2V5IOyXkCDrjIDtlZwg65GQIOuPmeyLnCDssqsg7Zi47Lac7J2AIOyEnOuhnCDri6TrpbggaWQg66GcIOuRmCDri6Qg7Iuk7ZaJ65Cc64ukLiDtmITsnqwgSUYvb3duZXIgc2NvcGUg64qUXG4gKiAgICBMTE0g7Zi47Lac7J2EIOyInOywqCDsi6TtlontlZjqs6Agc2Vzc2lvbktleSDrpbwg7ISc67KE66GcIOuztOuCtOyngCDslYrsnLzrr4DroZwsIGRpc3BhdGNoZXIg64qUIGNvbGQg65297J2EIOuRkOyngCDslYrripTri6QuXG4gKiAgICDrs5HroKwg7LKrIO2YuOy2nOydhCDshJzrsoTqsIAg7KeA7JuQ7ZWY6rKMIOuQmOuptCBzZXNzaW9uS2V5IOyghOuLrC/rnb0g7ISk6rOE67aA7YSwIOuLpOyLnCDsnqHslYTslbwg7ZWc64ukLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgY3JlYXRlSGFzaCwgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIEFOVEhST1BJQ19DTEFVREVfQ1dELFxuICBhbnRocm9waWNDb25maWdEaXIsXG4gIEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgQU5USFJPUElDX0RJU0FMTE9XRURfVE9PTFMsXG4gIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsLFxufSBmcm9tIFwiLi9hbnRocm9waWMtY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBidWlsZFN0cmVhbUpzb25JbnB1dCxcbiAgdHlwZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvbkxpbmUsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtUmVzdWx0LFxuICBoYW5kbGVTdHJlYW1Kc29uTGluZSxcbn0gZnJvbSBcIi4vc3RyZWFtLWpzb24tYWRhcHRlclwiO1xuXG4vLyDilIDilIAg7Zi47ZmY7YKkIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyByZXN1bWUg6rCA64qlIOyXrOu2gOulvCDqsIDrpbTripQg7YKkLiBzeXN0ZW1IYXNoIOunjOycvOuhnOuKlCDqsJnsnYAgc2Vzc2lvbktleSDrpbwg64uk66W4IG1vZGVsL3NjaGVtYSDroZxcbi8vIOyerOyCrOyaqe2VoCDrlYwgY29udGV4dCDsmKTsl7wg4oaSIHN5c3RlbSArIG1vZGVsICsgc3RydWN0dXJlZCDrqqjrk5zquYzsp4Ag66y264qU64ukLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBhdGliaWxpdHlLZXkob3B0czoge1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIG1vZGVsOiBzdHJpbmc7XG4gIC8vIHN0cnVjdHVyZWQgb3V0cHV0IHNjaGVtYSDrrLjsnpDsl7QuIOyXhuycvOuptCB0ZXh0IOuqqOuTnC4g64K07Jqp7J20IOuLpOultOuptCDri6Trpbgg7YKkLlxuICBvdXRwdXRTY2hlbWE/OiBzdHJpbmc7XG59KTogc3RyaW5nIHtcbiAgY29uc3Qgc2NoZW1hUGFydCA9IG9wdHMub3V0cHV0U2NoZW1hICYmIG9wdHMub3V0cHV0U2NoZW1hLmxlbmd0aCA+IDAgPyBvcHRzLm91dHB1dFNjaGVtYSA6IFwidGV4dFwiO1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoYCR7b3B0cy5zeXN0ZW0gPz8gXCJcIn1cXDAke29wdHMubW9kZWx9XFwwJHtzY2hlbWFQYXJ0fWApXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNik7XG59XG5cbi8vIOKUgOKUgCBwZXItc2Vzc2lvbiDrnb0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIHNlc3Npb24taWQg64uo7JyEIOyngeugrO2ZlC4g6rCZ7J2AIOyEuOyFmOydmCDrj5nsi5wgdHVybiDsnbQg6rCZ7J2AIHRyYW5zY3JpcHQg7JeQIOuPmeyLnCByZXN1bWXCt2FwcGVuZCDtlZjripQg6rKDIOuwqeyngC5cbmNvbnN0IHNlc3Npb25DaGFpbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhTZXNzaW9uTG9jazxUPihzZXNzaW9uSWQ6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIC8vIOydtOyghCB0dXJuIOydmCDshLHtjKjsmYAg66y06rSA7ZWY6rKMIOyngeugrCDssrTsnbjsnYQg7J6H64qU64ukLlxuICBjb25zdCBuZXh0ID0gcHJldi50aGVuKGZuLCBmbik7XG4gIC8vIHRhaWw6IOyEse2MqCDrrLTqtIAgc2V0dGxlIOuQmOuKlCDtlbjrk6QuIOydtOqxuCDrp7Xsl5Ag65GQ6rOgLCBmaW5hbGx5IOyXkOyEnCBcIuyXrOyghO2eiCDrgrTqsIAg64GdXCLsnbwg65WM66eMIOyCreygnC5cbiAgLy8gKHNldCDsp4Htm4QgdW5kZWZpbmVkIOqygOyCrOuhnCDtlZjrqbQg7KCI64yAIOyCreygnCDslYgg64+8IOyEuOyFmCBpZCDqsIAg64iE7IiY65CoIOKAlCB0YWlsIOydvOy5mCDqsoDsgqzroZwg7ZqM7ZS8LilcbiAgY29uc3QgdGFpbCA9IG5leHQudGhlbihcbiAgICAoKSA9PiB7fSxcbiAgICAoKSA9PiB7fSxcbiAgKTtcbiAgc2Vzc2lvbkNoYWlucy5zZXQoc2Vzc2lvbklkLCB0YWlsKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbmV4dDtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyDqt7gg7IKs7J20IOuLpOuluCB0dXJuIOydtCDssrTsnbjsnYQg7J207Ja067Cb7JWY7Jy866m0IHRhaWwg7J20IOq1kOyytOuPvCDsnojri6Qg4oCUIOq3uOuVjOuKlCDsgq3soJztlZjsp4Ag7JWK64qU64ukLlxuICAgIGlmIChzZXNzaW9uQ2hhaW5zLmdldChzZXNzaW9uSWQpID09PSB0YWlsKSBzZXNzaW9uQ2hhaW5zLmRlbGV0ZShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgCBjb29yZCDrp6TtlZEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIHRva2VuIOq4sOuwmCDslYjsoJUgd29ya2VySWQg7ZWp7ISxLiBBbnRocm9waWMg7J2AIHdvcmtlciBwb29sIOydtCDsl4bsnLzrr4DroZwgdG9rZW5JZCDrpbwg6re464yA66GcIOyTtOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW5JZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRva2VuSWQ7XG59XG5cbi8vIOKUgOKUgCBlbnZlbG9wZSBkZWNvcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gc3RyZWFtLWpzb24g7J6F66ClIOudvOyduOyXkCBTREsgZW52ZWxvcGUg67aA7LCpIO2bhCDsp4HroKztmZQuIHNlc3Npb24g7IaM7Jyg7J6Q7J24IOyXrOq4sOyEnCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVBbmRTZXJpYWxpemUobGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPiwgc2Vzc2lvbklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKFxuICAgIGxpbmVzXG4gICAgICAubWFwKChsaW5lKSA9PlxuICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgLi4ubGluZSxcbiAgICAgICAgICBzZXNzaW9uX2lkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgdXVpZDogcmFuZG9tVVVJRCgpLFxuICAgICAgICAgIHBhcmVudF90b29sX3VzZV9pZDogbnVsbCxcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgICAuam9pbihcIlxcblwiKSArIFwiXFxuXCJcbiAgKTtcbn1cblxuLy8g4pSA4pSAIHNwYXduICsgY29uc3VtZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVxdWVzdCB7XG4gIHRva2VuSWQ6IG51bWJlcjtcbiAgdG9rZW46IHN0cmluZzsgLy8gT0F1dGggYWNjZXNzIHRva2VuXG4gIG1vZGVsOiBzdHJpbmc7XG4gIHN5c3RlbT86IHN0cmluZztcbiAganNvblNjaGVtYT86IHN0cmluZzsgLy8g7J6I7Jy866m0IHN0cnVjdHVyZWQgb3V0cHV0XG4gIGVmZm9ydD86IHN0cmluZztcbiAgdGltZW91dE1zOiBudW1iZXI7XG4gIC8vIOyeheugpTogY29sZChjb2xkSGlzdG9yeStjb2xkSW5wdXQpIOuYkOuKlCByZXN1bWUocmV1c2VJbnB1dCkuXG4gIGNvbGRIaXN0b3J5PzogQXJyYXk8SnNvblZhbHVlPjtcbiAgaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD47XG4gIC8vIHJlc3VtZSDqsr3roZzrqbQg6riw7KG0IHNlc3Npb24taWQsIGNvbGQg66m0IHVuZGVmaW5lZCjsg4jroZwg67Cc6riJKS5cbiAgcmVzdW1lU2Vzc2lvbklkPzogc3RyaW5nO1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVNlc3Npb25SZXN1bHQgZXh0ZW5kcyBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgd29ya2VySWQ6IG51bWJlcjtcbn1cblxuLy8gcGVyLXRva2VuIENMQVVERV9DT05GSUdfRElSIOuztOyepSjqsqnrpqwpLiDqsr3roZwg6rec7LmZ7J2AIGFudGhyb3BpY0NvbmZpZ0RpcijsiJzsiJgg7ZWo7IiYKeydtCDshozsnKAg4oCUXG4vLyDsl6zquLDshKAg6re4IOqyveuhnOyXkCDruYggc2V0dGluZ3Mg66W8IOq5lOyVhCBjbGF1ZGUtbWVtIGhvb2sg65Ox7J2EIOywqOuLqO2VnOuLpC4gKFIxMCDqsqnrpqwpXG4vLyDsnbQgc2VlZCDtjIzsnbzsnYAgY2xhdWRlLW1lbSBob29rIC8g7IKs7Jqp7J6QIOyEpOyglSDsmKTsl7wg7LCo64uo7J2EIOychO2VnCDqsqnrpqwg6rK96rOE64ukLiDrp6Qg7Zi47Lac66eI64ukIOuLpOyLnCDsjajshJxcbi8vIOyZuOu2gCDrs4DsobDCt+yCreygnCDtm4Tsl5Drj4Qg64uk7J2MIOyLpO2WieyXkOyEnCBzZWxmLWhlYWxpbmcg65CY64+E66GdIOq4sOyhtCBzZW1hbnRpY3Mg66W8IOycoOyngO2VnOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVDb25maWdEaXIodG9rZW5JZDogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgZGlyID0gYW50aHJvcGljQ29uZmlnRGlyKHRva2VuSWQpO1xuICBta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhgJHtkaXJ9Ly5jbGF1ZGUuanNvbmAsIFwie31cIik7XG4gIHdyaXRlRmlsZVN5bmMoYCR7ZGlyfS9zZXR0aW5ncy5qc29uYCwgXCJ7fVwiKTtcbiAgcmV0dXJuIGRpcjtcbn1cblxubGV0IGN3ZEVuc3VyZWQgPSBmYWxzZTtcbmZ1bmN0aW9uIGVuc3VyZUN3ZCgpOiB2b2lkIHtcbiAgaWYgKGN3ZEVuc3VyZWQpIHJldHVybjtcbiAgbWtkaXJTeW5jKGAke0FOVEhST1BJQ19DTEFVREVfQ1dEfS8uY2xhdWRlYCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMoYCR7QU5USFJPUElDX0NMQVVERV9DV0R9Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbmAsIFwie31cIik7XG4gIGN3ZEVuc3VyZWQgPSB0cnVlO1xufVxuXG4vLyBzcGF3biBhcmdzIOq1rOyEsS4g66mA7Yuw7YS0L+qyqeumrC9zdHJ1Y3R1cmVkIOuqqOuTnCDrsJjsmIEuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDbGF1ZGVBcmdzKG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgc3lzdGVtPzogc3RyaW5nO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBpc1Jlc3VtZTogYm9vbGVhbjtcbn0pOiBBcnJheTxzdHJpbmc+IHtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ob3B0cy5qc29uU2NoZW1hICYmIG9wdHMuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgLy8gLS10b29scyBcIlwiIOuhnCDsoITssrQg7LCo64uoLCBzdHJ1Y3R1cmVkKGpzb25TY2hlbWEg7J6I7J2MKSDrqbQgU3RydWN0dXJlZE91dHB1dCDrp4wg7ZeI7JqpLlxuICBjb25zdCB0b29sQXJncyA9IHVzZVN0cnVjdHVyZWRcbiAgICA/IFtcIi0tdG9vbHNcIiwgXCJcIiwgXCItLWFsbG93ZWQtdG9vbHNcIiwgXCJTdHJ1Y3R1cmVkT3V0cHV0XCJdXG4gICAgOiBbXCItLXRvb2xzXCIsIFwiXCJdO1xuXG4gIGNvbnN0IGFyZ3M6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAuLi5BTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyxcbiAgICBcIi0taW5wdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgXCItLW1heC10dXJuc1wiLFxuICAgIHVzZVN0cnVjdHVyZWQgPyBcIjJcIiA6IFwiMVwiLFxuICAgIFwiLS1wZXJtaXNzaW9uLW1vZGVcIixcbiAgICBcImJ5cGFzc1Blcm1pc3Npb25zXCIsXG4gICAgXCItLXNldHRpbmctc291cmNlc1wiLFxuICAgIFwicHJvamVjdFwiLFxuICAgIFwiLS1tb2RlbFwiLFxuICAgIG9wdHMubW9kZWwsXG4gICAgLy8gaW5saW5lIFtTeXN0ZW1dIOq4iOyngCDigJQg7KCV7IudIOyxhOuEkOunjChSNykuIOyDneuetSDsi5wgQ0MgZGVmYXVsdCgyM2spIOyjvOyeheuQmOuvgOuhnCDrsJjrk5zsi5wg66qF7IucLlxuICAgIFwiLS1zeXN0ZW0tcHJvbXB0XCIsXG4gICAgb3B0cy5zeXN0ZW0gPz8gXCJcIixcbiAgICBcIi0tdGhpbmtpbmdcIixcbiAgICBcImRpc2FibGVkXCIsXG4gICAgXCItLWVmZm9ydFwiLFxuICAgIG9wdHMuZWZmb3J0ID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICAgIC8vIOupgO2LsO2EtDog7LKrIO2YuOy2nOydgCBzZXNzaW9uLWlkIOuwnOq4iSwg7ZuE7IaN7J2AIHJlc3VtZS4gLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlIOuKlCDsk7Dsp4Ag7JWK64qU64ukLlxuICAgIC4uLihvcHRzLmlzUmVzdW1lID8gW1wiLS1yZXN1bWVcIiwgb3B0cy5zZXNzaW9uSWRdIDogW1wiLS1zZXNzaW9uLWlkXCIsIG9wdHMuc2Vzc2lvbklkXSksXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkKSBhcmdzLnB1c2goXCItLWpzb24tc2NoZW1hXCIsIG9wdHMuanNvblNjaGVtYSEpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDbGF1ZGUg7IS47IWY7J2EIHNwYXduIO2VtCDtlZwgdHVybiDsnYQg7Iuk7ZaJ7ZWc64ukLiBwZXItc2Vzc2lvbiDrnb3snLzroZwg7KeB66Cs7ZmU65Cc64ukLlxuICogQHBhcmFtIG9uRGVsdGEg7KCQ7KeEIO2FjeyKpO2KuCBkZWx0YShzdHJlYW1UZXh0KSDrmJDripQgc3RydWN0dXJlZCDrtoDrtoQgSlNPTihzdHJlYW1PYmplY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2xhdWRlU2Vzc2lvbihcbiAgcmVxOiBDbGF1ZGVTZXNzaW9uUmVxdWVzdCxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbik6IFByb21pc2U8Q2xhdWRlU2Vzc2lvblJlc3VsdD4ge1xuICAvLyDsoJXqt5ztmZQg6rec7LmZ7J2AIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIOydtCDri6jrj4Ug7IaM7JygIOKAlCBkaXNwYXRjaGVyIOqwgCDsnbTrr7ggY2Fub25pY2FsIOydhCDrhJjquLDsp4Drp4wsXG4gIC8vIOyngeygkSDtmLjstpwo7YWM7Iqk7Yq4L+uvuOuemCBjYWxsZXIpIOuMgOu5hCDrsKnslrTsoIHsnLzroZwg7ZWcIOuyiCDrjZQg7Ya16rO87Iuc7YKo64ukKOydtOuvuCBjYW5vbmljYWwg7J2066m0IG5vLW9wKS5cbiAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChyZXEubW9kZWwpO1xuICBjb25zdCBpc1Jlc3VtZSA9IEJvb2xlYW4ocmVxLnJlc3VtZVNlc3Npb25JZCk7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHJlcS5yZXN1bWVTZXNzaW9uSWQgPz8gcmFuZG9tVVVJRCgpO1xuICBjb25zdCB1c2VTdHJ1Y3R1cmVkID0gQm9vbGVhbihyZXEuanNvblNjaGVtYSAmJiByZXEuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgY29uc3Qgd29ya2VySWQgPSBtYWtlQW50aHJvcGljV29ya2VySWQocmVxLnRva2VuSWQpO1xuXG4gIHJldHVybiB3aXRoU2Vzc2lvbkxvY2soc2Vzc2lvbklkLCAoKSA9PiB7XG4gICAgZW5zdXJlQ3dkKCk7XG4gICAgY29uc3QgY29uZmlnRGlyID0gZW5zdXJlQ29uZmlnRGlyKHJlcS50b2tlbklkKTtcblxuICAgIGNvbnN0IGFyZ3MgPSBidWlsZENsYXVkZUFyZ3Moe1xuICAgICAgbW9kZWwsXG4gICAgICBzeXN0ZW06IHJlcS5zeXN0ZW0sXG4gICAgICBlZmZvcnQ6IHJlcS5lZmZvcnQsXG4gICAgICBqc29uU2NoZW1hOiByZXEuanNvblNjaGVtYSxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGlzUmVzdW1lLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW5wdXRMaW5lcyA9IGJ1aWxkU3RyZWFtSnNvbklucHV0KHtcbiAgICAgIGNvbGRIaXN0b3J5OiByZXEuY29sZEhpc3RvcnksXG4gICAgICBpbnB1dDogcmVxLmlucHV0LFxuICAgICAgaXNSZXN1bWUsXG4gICAgfSk7XG4gICAgY29uc3Qgc3RkaW5QYXlsb2FkID0gZGVjb3JhdGVBbmRTZXJpYWxpemUoaW5wdXRMaW5lcywgc2Vzc2lvbklkKTtcblxuICAgIHJldHVybiBuZXcgUHJvbWlzZTxDbGF1ZGVTZXNzaW9uUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBjaGlsZCA9IHNwYXduKFwiY2xhdWRlXCIsIGFyZ3MsIHtcbiAgICAgICAgLy8gc3RkZXJyIOuPhCDsuqHsspg6IGludmFsaWQgT0F1dGggLyDsnpjrqrvrkJwg7ZSM656Y6re4IC8gQ0xJIOqygOymnSDsi6TtjKjqsIBcbiAgICAgICAgLy8gXCJjbG9zZWQgd2l0aG91dCByZXN1bHRcIiDroZwg662J6rCc7KeA7KeAIOyViuqyjCBjbG9zZS9lcnJvciDsl5Agc3RkZXJyIOulvCDsi6TslrQg67O064K464ukLlxuICAgICAgICBzdGRpbzogW1wicGlwZVwiLCBcInBpcGVcIiwgXCJwaXBlXCJdLFxuICAgICAgICBjd2Q6IEFOVEhST1BJQ19DTEFVREVfQ1dELFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICBQQVRIOiBwcm9jZXNzLmVudi5QQVRILFxuICAgICAgICAgIFRNUERJUjogcHJvY2Vzcy5lbnYuVE1QRElSLFxuICAgICAgICAgIENMQVVERV9DT0RFX09BVVRIX1RPS0VOOiByZXEudG9rZW4sXG4gICAgICAgICAgQ0xBVURFX0NPTkZJR19ESVI6IGNvbmZpZ0RpcixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FVVE9fTUVNT1JZOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0FEQVBUSVZFX1RISU5LSU5HOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFXzFNX0NPTlRFWFQ6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQ0xBVURFX01EUzogXCIxXCIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfQVRUUklCVVRJT05fSEVBREVSOiBcIjBcIixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgICAgbGV0IGJ1ZmZlciA9IFwiXCI7XG4gICAgICBjb25zdCBzdHJlYW1TdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlID0ge307XG4gICAgICAvLyBib3VuZGVkIHN0ZGVyciDrsoTtjbwo7LWc6re8IH40S0Lrp4wg7Jyg7KeAIOKAlCDrrLTtlZwg64iE7KCBIOuwqeyngCkuXG4gICAgICBsZXQgc3RkZXJyQnVmID0gXCJcIjtcbiAgICAgIGNvbnN0IFNUREVSUl9DQVAgPSA0MDk2O1xuICAgICAgY2hpbGQuc3RkZXJyPy5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBzdGRlcnJCdWYgPSAoc3RkZXJyQnVmICsgZC50b1N0cmluZygpKS5zbGljZSgtU1RERVJSX0NBUCk7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHN0ZGVyclN1ZmZpeCA9ICgpID0+IChzdGRlcnJCdWYudHJpbSgpID8gYCDigJQgc3RkZXJyOiAke3N0ZGVyckJ1Zi50cmltKCl9YCA6IFwiXCIpO1xuICAgICAgY29uc3QgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNoaWxkLmtpbGwoKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ2xhdWRlIHNlc3Npb24gdGltZW91dCBhZnRlciAke3JlcS50aW1lb3V0TXMgLyAxMDAwfXNgKSk7XG4gICAgICB9LCByZXEudGltZW91dE1zKTtcblxuICAgICAgY29uc3QgZmluaXNoID0gKHJlc3VsdDogQ2xhdWRlU3RyZWFtUmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICByZXNvbHZlKHsgLi4ucmVzdWx0LCBzZXNzaW9uSWQsIHdvcmtlcklkIH0pO1xuICAgICAgfTtcblxuICAgICAgcmVxLmFib3J0U2lnbmFsPy5hZGRFdmVudExpc3RlbmVyKFwiYWJvcnRcIiwgKCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2hpbGQua2lsbCgpO1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiYWJvcnRlZFwiKSk7XG4gICAgICB9KTtcblxuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgPz8gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlU3RyZWFtSnNvbkxpbmUobGluZSwgb25EZWx0YSwge1xuICAgICAgICAgICAgc3RydWN0dXJlZE91dHB1dDogdXNlU3RydWN0dXJlZCxcbiAgICAgICAgICAgIHN0YXRlOiBzdHJlYW1TdGF0ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBmaW5pc2gocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIGNsb3NlZCB3aXRob3V0IHJlc3VsdCR7c3RkZXJyU3VmZml4KCl9YCkpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIHNwYXduIGVycm9yOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzdGRpbiDsnLzroZwg7J6F66ClIEpTT05MIO2dmOumrOqzoCDri6vripTri6QuXG4gICAgICBjaGlsZC5zdGRpbj8ud3JpdGUoc3RkaW5QYXlsb2FkKTtcbiAgICAgIGNoaWxkLnN0ZGluPy5lbmQoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIHVzYWdlIOyerOuFuOy2nCjthYzsiqTtirgg7Y647J2YKS5cbmV4cG9ydCB0eXBlIHsgVG9rZW5Vc2FnZUJyZWFrZG93biB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBZ0RBLFNBQWdCLGlCQUFpQixNQUt0QjtDQUNULE1BQU0sYUFBYSxLQUFLLGdCQUFnQixLQUFLLGFBQWEsU0FBUyxJQUFJLEtBQUssZUFBZTtBQUMzRixRQUFPLFdBQVcsU0FBUyxDQUN4QixPQUFPLEdBQUcsS0FBSyxVQUFVLEdBQUcsSUFBSSxLQUFLLE1BQU0sSUFBSSxhQUFhLENBQzVELE9BQU8sTUFBTSxDQUNiLE1BQU0sR0FBRyxHQUFHOztBQU1qQixNQUFNLGdDQUFnQixJQUFJLEtBQStCO0FBRXpELGVBQXNCLGdCQUFtQixXQUFtQixJQUFrQztDQUc1RixNQUFNLFFBRk8sY0FBYyxJQUFJLFVBQVUsSUFBSSxRQUFRLFNBQVMsRUFFNUMsS0FBSyxJQUFJLEdBQUc7Q0FHOUIsTUFBTSxPQUFPLEtBQUssV0FDVixVQUNBLEdBQ1A7QUFDRCxlQUFjLElBQUksV0FBVyxLQUFLO0FBQ2xDLEtBQUk7QUFDRixTQUFPLE1BQU07V0FDTDtBQUVSLE1BQUksY0FBYyxJQUFJLFVBQVUsS0FBSyxLQUFNLGVBQWMsT0FBTyxVQUFVOzs7QUFPOUUsU0FBZ0Isc0JBQXNCLFNBQXlCO0FBQzdELFFBQU87O0FBTVQsU0FBZ0IscUJBQXFCLE9BQW9DLFdBQTJCO0FBQ2xHLFFBQ0UsTUFDRyxLQUFLLFNBQ0osS0FBSyxVQUFVO0VBQ2IsR0FBRztFQUNILFlBQVk7RUFDWixNQUFNLFlBQVk7RUFDbEIsb0JBQW9CO0VBQ3JCLENBQUMsQ0FDSCxDQUNBLEtBQUssS0FBSyxHQUFHOztBQStCcEIsU0FBZ0IsZ0JBQWdCLFNBQXlCO0NBQ3ZELE1BQU0sTUFBTSxtQkFBbUIsUUFBUTtBQUN2QyxXQUFVLEtBQUssRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUNuQyxlQUFjLEdBQUcsSUFBSSxnQkFBZ0IsS0FBSztBQUMxQyxlQUFjLEdBQUcsSUFBSSxpQkFBaUIsS0FBSztBQUMzQyxRQUFPOztBQUdULElBQUksYUFBYTtBQUNqQixTQUFTLFlBQWtCO0FBQ3pCLEtBQUksV0FBWTtBQUNoQixXQUFVLEdBQUcscUJBQXFCLFdBQVcsRUFBRSxXQUFXLE1BQU0sQ0FBQztBQUNqRSxlQUFjLEdBQUcscUJBQXFCLHlCQUF5QixLQUFLO0FBQ3BFLGNBQWE7O0FBSWYsU0FBZ0IsZ0JBQWdCLE1BT2Q7Q0FDaEIsTUFBTSxnQkFBZ0IsUUFBUSxLQUFLLGNBQWMsS0FBSyxXQUFXLFNBQVMsRUFBRTtDQU01RSxNQUFNLE9BQXNCO0VBQzFCO0VBQ0EsR0FOZSxnQkFDYjtHQUFDO0dBQVc7R0FBSTtHQUFtQjtHQUFtQixHQUN0RCxDQUFDLFdBQVcsR0FBRztFQUtqQjtFQUNBLEdBQUc7RUFDSDtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQSxnQkFBZ0IsTUFBTTtFQUN0QjtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EsS0FBSztFQUVMO0VBQ0EsS0FBSyxVQUFVO0VBQ2Y7RUFDQTtFQUNBO0VBQ0EsS0FBSyxVQUFBO0VBQ0w7RUFFQSxHQUFJLEtBQUssV0FBVyxDQUFDLFlBQVksS0FBSyxVQUFVLEdBQUcsQ0FBQyxnQkFBZ0IsS0FBSyxVQUFVO0VBQ3BGO0FBQ0QsS0FBSSxjQUFlLE1BQUssS0FBSyxpQkFBaUIsS0FBSyxXQUFZO0FBQy9ELFFBQU87Ozs7OztBQU9ULFNBQWdCLGlCQUNkLEtBQ0EsU0FDOEI7Q0FHOUIsTUFBTSxRQUFRLHdCQUF3QixJQUFJLE1BQU07Q0FDaEQsTUFBTSxXQUFXLFFBQVEsSUFBSSxnQkFBZ0I7Q0FDN0MsTUFBTSxZQUFZLElBQUksbUJBQW1CLFlBQVk7Q0FDckQsTUFBTSxnQkFBZ0IsUUFBUSxJQUFJLGNBQWMsSUFBSSxXQUFXLFNBQVMsRUFBRTtDQUMxRSxNQUFNLFdBQVcsc0JBQXNCLElBQUksUUFBUTtBQUVuRCxRQUFPLGdCQUFnQixpQkFBaUI7QUFDdEMsYUFBVztFQUNYLE1BQU0sWUFBWSxnQkFBZ0IsSUFBSSxRQUFRO0VBRTlDLE1BQU0sT0FBTyxnQkFBZ0I7R0FDM0I7R0FDQSxRQUFRLElBQUk7R0FDWixRQUFRLElBQUk7R0FDWixZQUFZLElBQUk7R0FDaEI7R0FDQTtHQUNELENBQUM7RUFPRixNQUFNLGVBQWUscUJBTEYscUJBQXFCO0dBQ3RDLGFBQWEsSUFBSTtHQUNqQixPQUFPLElBQUk7R0FDWDtHQUNELENBQUMsRUFDb0QsVUFBVTtBQUVoRSxTQUFPLElBQUksU0FBOEIsU0FBUyxXQUFXO0dBQzNELE1BQU0sUUFBUSxNQUFNLFVBQVUsTUFBTTtJQUdsQyxPQUFPO0tBQUM7S0FBUTtLQUFRO0tBQU87SUFDL0IsS0FBSztJQUNMLEtBQUs7S0FDSCxNQUFNLFFBQVEsSUFBSTtLQUNsQixRQUFRLFFBQVEsSUFBSTtLQUNwQix5QkFBeUIsSUFBSTtLQUM3QixtQkFBbUI7S0FDbkIsaUNBQWlDO0tBQ2pDLHVDQUF1QztLQUN2QyxnQ0FBZ0M7S0FDaEMsZ0NBQWdDO0tBQ2hDLGdDQUFnQztLQUNqQztJQUNGLENBQUM7R0FFRixJQUFJLFVBQVU7R0FDZCxJQUFJLFNBQVM7R0FDYixNQUFNLGNBQXFDLEVBQUU7R0FFN0MsSUFBSSxZQUFZO0dBQ2hCLE1BQU0sYUFBYTtBQUNuQixTQUFNLFFBQVEsR0FBRyxTQUFTLE1BQWM7QUFDdEMsaUJBQWEsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLENBQUMsV0FBVztLQUN6RDtHQUNGLE1BQU0scUJBQXNCLFVBQVUsTUFBTSxHQUFHLGNBQWMsVUFBVSxNQUFNLEtBQUs7R0FDbEYsTUFBTSxRQUFRLGlCQUFpQjtBQUM3QixRQUFJLFFBQVM7QUFDYixjQUFVO0FBQ1YsVUFBTSxNQUFNO0FBQ1osMkJBQU8sSUFBSSxNQUFNLGdDQUFnQyxJQUFJLFlBQVksSUFBSyxHQUFHLENBQUM7TUFDekUsSUFBSSxVQUFVO0dBRWpCLE1BQU0sVUFBVSxXQUErQjtBQUM3QyxRQUFJLFFBQVM7QUFDYixjQUFVO0FBQ1YsaUJBQWEsTUFBTTtBQUNuQixZQUFRO0tBQUUsR0FBRztLQUFRO0tBQVc7S0FBVSxDQUFDOztBQUc3QyxPQUFJLGFBQWEsaUJBQWlCLGVBQWU7QUFDL0MsUUFBSSxRQUFTO0FBQ2IsY0FBVTtBQUNWLGlCQUFhLE1BQU07QUFDbkIsVUFBTSxNQUFNO0FBQ1osMkJBQU8sSUFBSSxNQUFNLFVBQVUsQ0FBQztLQUM1QjtBQUVGLFNBQU0sUUFBUSxHQUFHLFNBQVMsTUFBYztBQUN0QyxRQUFJLFFBQVM7QUFDYixjQUFVLEVBQUUsVUFBVTtJQUN0QixNQUFNLFFBQVEsT0FBTyxNQUFNLEtBQUs7QUFDaEMsYUFBUyxNQUFNLEtBQUssSUFBSTtBQUN4QixTQUFLLE1BQU0sUUFBUSxPQUFPO0tBQ3hCLE1BQU0sU0FBUyxxQkFBcUIsTUFBTSxTQUFTO01BQ2pELGtCQUFrQjtNQUNsQixPQUFPO01BQ1IsQ0FBQztBQUNGLFNBQUksUUFBUTtBQUNWLGFBQU8sT0FBTztBQUNkOzs7S0FHSjtBQUVGLFNBQU0sR0FBRyxlQUFlO0FBQ3RCLFFBQUksUUFBUztBQUNiLGNBQVU7QUFDVixpQkFBYSxNQUFNO0FBQ25CLDJCQUFPLElBQUksTUFBTSx1Q0FBdUMsY0FBYyxHQUFHLENBQUM7S0FDMUU7QUFDRixTQUFNLEdBQUcsVUFBVSxRQUFRO0FBQ3pCLFFBQUksUUFBUztBQUNiLGNBQVU7QUFDVixpQkFBYSxNQUFNO0FBQ25CLDJCQUFPLElBQUksTUFBTSwrQkFBK0IsSUFBSSxVQUFVLENBQUM7S0FDL0Q7QUFHRixTQUFNLE9BQU8sTUFBTSxhQUFhO0FBQ2hDLFNBQU0sT0FBTyxLQUFLO0lBQ2xCO0dBQ0YifQ==
242
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhdWRlLXNlc3Npb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9hbnRocm9waWMvY2xhdWRlLXNlc3Npb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbGF1ZGUtc2Vzc2lvbiDigJQgQ2xhdWRlIENMSSDshLjshZggc3Bhd24gKyBRZ3JpZFRocmVhZENvb3JkIOunpO2VkSArIHBlci1zZXNzaW9uIOudvS5cbiAqXG4gKiDrqYDti7DthLQ6IOunpCDtmLjstpwgZnJlc2ggYC0tc2Vzc2lvbi1pZCA8dXVpZD5g66GcIOyLpO2Wie2VnOuLpC4g7J6F66Cl7J2AIOyWtOuMke2EsOqwgCDrp4zrk6AgSlNPTkwg7J2EXG4gKiBzdGRpbiDsnLzroZwg7Z2Y66as6rOgKGAtLWlucHV0LWZvcm1hdCBzdHJlYW0tanNvbmApLCDstpzroKXsnYAg7YyM7ISc66GcIOyymOumrO2VnOuLpC5cbiAqXG4gKiDtlbXsi6wg6rOE7JW9OlxuICogIC0gY29vcmQg64qUIOyehOydmCDsoIDsnqXsnbQg7JWE64uI6528IOq4sOyhtCBRZ3JpZFRocmVhZENvb3Jke3dvcmtlcklkLHRocmVhZElkLGVwb2NoLHN5c3RlbUhhc2h9IOyXkFxuICogICAg66ek7ZWR7ZWc64ukLiB0aHJlYWRJZD3shLjshZggdXVpZCwgZXBvY2g9MCDqs6DsoJUod29ya2VyIHJlc3RhcnQg6rCc64WQIOyXhuydjCksIHdvcmtlcklkPXRva2VuIOq4sOuwmFxuICogICAg7JWI7KCVIO2VqeyEsSwgc3lzdGVtSGFzaD3smpTssq0gc3lzdGVtIO2VtOyLnC4gaXNzdWVDb252Q29udGV4dC9kZWNpZGVDb252Um91dGluZyDqs7wgcm91bmQtdHJpcC5cbiAqICAtIHdpdGhTZXNzaW9uTG9jayDsnYAgZXhwb3J0ZWQgcHJpbWl0aXZlIOuhnCDsnKDsp4DtlZzri6QuIOq4sOuzuCDqsr3roZzsl5DshJzripQg66ekIO2YuOy2nCDsg4ggc2Vzc2lvbi1pZCDrnbxcbiAqICAgIOyCrOyLpOyDgSBuby1jb250ZW50aW9uIOydtOyngOunjCwg7KeB7KCRIO2YuOy2nOyekC/thYzsiqTtirjsnZgg7KeB66Cs7ZmUIOuztOyepeydgCDrs7TsobTtlZzri6QuXG4gKiAgLSBzdHJlYW0tanNvbiDsp4HroKztmZQg7IucIFNESyBlbnZlbG9wZSh1dWlkL3Nlc3Npb25faWQvcGFyZW50X3Rvb2xfdXNlX2lkKSBkZWNvcmF0ZS5cbiAqICAtIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwg7Lac66ClIO2MjOyEnOyXkCB7IHN0cnVjdHVyZWRPdXRwdXQ6IHRydWUgfSDsoITri6wo7JeG7Jy866m0IHN0cmVhbU9iamVjdCDquajsp5ApLlxuICovXG5cbmltcG9ydCB7IHNwYXduIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHsgcmFuZG9tVVVJRCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Ub2tlblVzYWdlQnJlYWtkb3duXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIEFOVEhST1BJQ19DTEFVREVfQ1dELFxuICBhbnRocm9waWNDb25maWdEaXIsXG4gIEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgQU5USFJPUElDX0RJU0FMTE9XRURfVE9PTFMsXG4gIGFzc2VydFN1cHBvcnRlZE9uZU1pbGxpb25TdWZmaXgsXG4gIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsLFxuICBuZWVkc0NsaTFtU3VmZml4LFxuICBzdXBwb3J0czFNQ29udGV4dCxcbn0gZnJvbSBcIi4vYW50aHJvcGljLWNvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgYnVpbGRTdHJlYW1Kc29uSW5wdXQsXG4gIHR5cGUgQ2xhdWRlU3RyZWFtSnNvblN0YXRlLFxuICB0eXBlIENsYXVkZVN0cmVhbUpzb25MaW5lLFxuICB0eXBlIENsYXVkZVN0cmVhbVJlc3VsdCxcbiAgaGFuZGxlU3RyZWFtSnNvbkxpbmUsXG59IGZyb20gXCIuL3N0cmVhbS1qc29uLWFkYXB0ZXJcIjtcblxuLy8g4pSA4pSAIHBlci1zZXNzaW9uIOudvSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gc2Vzc2lvbi1pZCDri6jsnIQg7KeB66Cs7ZmUIHByaW1pdGl2ZS4g6riw67O4IOqyveuhnOyXkOyEnOuKlCDrp6Qg7Zi47LacIOyDiCB1dWlkIOudvCDsgqzsi6Tsg4Egbm8tb3Ag7J207KeA66eMLFxuLy8g6rCZ7J2AIHNlc3Npb24taWQg66W8IOyngeygkSDsk7DripQg7Zi47Lac7J6Q64qUIOyXrOyghO2eiCDsp4HroKztmZQg67O07J6l7J2EIOuwm+uKlOuLpC5cbmNvbnN0IHNlc3Npb25DaGFpbnMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4oKTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdpdGhTZXNzaW9uTG9jazxUPihzZXNzaW9uSWQ6IHN0cmluZywgZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgcHJldiA9IHNlc3Npb25DaGFpbnMuZ2V0KHNlc3Npb25JZCkgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIC8vIOydtOyghCB0dXJuIOydmCDshLHtjKjsmYAg66y06rSA7ZWY6rKMIOyngeugrCDssrTsnbjsnYQg7J6H64qU64ukLlxuICBjb25zdCBuZXh0ID0gcHJldi50aGVuKGZuLCBmbik7XG4gIC8vIHRhaWw6IOyEse2MqCDrrLTqtIAgc2V0dGxlIOuQmOuKlCDtlbjrk6QuIOydtOqxuCDrp7Xsl5Ag65GQ6rOgLCBmaW5hbGx5IOyXkOyEnCBcIuyXrOyghO2eiCDrgrTqsIAg64GdXCLsnbwg65WM66eMIOyCreygnC5cbiAgLy8gKHNldCDsp4Htm4QgdW5kZWZpbmVkIOqygOyCrOuhnCDtlZjrqbQg7KCI64yAIOyCreygnCDslYgg64+8IOyEuOyFmCBpZCDqsIAg64iE7IiY65CoIOKAlCB0YWlsIOydvOy5mCDqsoDsgqzroZwg7ZqM7ZS8LilcbiAgY29uc3QgdGFpbCA9IG5leHQudGhlbihcbiAgICAoKSA9PiB7fSxcbiAgICAoKSA9PiB7fSxcbiAgKTtcbiAgc2Vzc2lvbkNoYWlucy5zZXQoc2Vzc2lvbklkLCB0YWlsKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgbmV4dDtcbiAgfSBmaW5hbGx5IHtcbiAgICAvLyDqt7gg7IKs7J20IOuLpOuluCB0dXJuIOydtCDssrTsnbjsnYQg7J207Ja067Cb7JWY7Jy866m0IHRhaWwg7J20IOq1kOyytOuPvCDsnojri6Qg4oCUIOq3uOuVjOuKlCDsgq3soJztlZjsp4Ag7JWK64qU64ukLlxuICAgIGlmIChzZXNzaW9uQ2hhaW5zLmdldChzZXNzaW9uSWQpID09PSB0YWlsKSBzZXNzaW9uQ2hhaW5zLmRlbGV0ZShzZXNzaW9uSWQpO1xuICB9XG59XG5cbi8vIOKUgOKUgCBjb29yZCDrp6TtlZEg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8vIHRva2VuIOq4sOuwmCDslYjsoJUgd29ya2VySWQg7ZWp7ISxLiBBbnRocm9waWMg7J2AIHdvcmtlciBwb29sIOydtCDsl4bsnLzrr4DroZwgdG9rZW5JZCDrpbwg6re464yA66GcIOyTtOuLpC5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQW50aHJvcGljV29ya2VySWQodG9rZW5JZDogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHRva2VuSWQ7XG59XG5cbi8vIOKUgOKUgCBlbnZlbG9wZSBkZWNvcmF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gc3RyZWFtLWpzb24g7J6F66ClIOudvOyduOyXkCBTREsgZW52ZWxvcGUg67aA7LCpIO2bhCDsp4HroKztmZQuIHNlc3Npb24g7IaM7Jyg7J6Q7J24IOyXrOq4sOyEnCDtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gZGVjb3JhdGVBbmRTZXJpYWxpemUoXG4gIGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4sXG4gIHNlc3Npb25JZDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIChcbiAgICBsaW5lc1xuICAgICAgLm1hcCgobGluZSkgPT5cbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgIC4uLmxpbmUsXG4gICAgICAgICAgc2Vzc2lvbl9pZDogc2Vzc2lvbklkLFxuICAgICAgICAgIHV1aWQ6IHJhbmRvbVVVSUQoKSxcbiAgICAgICAgICBwYXJlbnRfdG9vbF91c2VfaWQ6IG51bGwsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLmpvaW4oXCJcXG5cIikgKyBcIlxcblwiXG4gICk7XG59XG5cbi8vIOKUgOKUgCBzcGF3biArIGNvbnN1bWUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU2Vzc2lvblJlcXVlc3Qge1xuICB0b2tlbklkOiBudW1iZXI7XG4gIHRva2VuOiBzdHJpbmc7IC8vIE9BdXRoIGFjY2VzcyB0b2tlblxuICBtb2RlbDogc3RyaW5nO1xuICBzeXN0ZW0/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7IC8vIOyeiOycvOuptCBzdHJ1Y3R1cmVkIG91dHB1dFxuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIHRpbWVvdXRNczogbnVtYmVyO1xuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIGlucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xuICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTZXNzaW9uUmVzdWx0IGV4dGVuZHMgQ2xhdWRlU3RyZWFtUmVzdWx0IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHdvcmtlcklkOiBudW1iZXI7XG59XG5cbi8vIHBlci10b2tlbiBDTEFVREVfQ09ORklHX0RJUiDrs7TsnqUo6rKp66asKS4g6rK966GcIOq3nOy5meydgCBhbnRocm9waWNDb25maWdEaXIo7Iic7IiYIO2VqOyImCnsnbQg7IaM7JygIOKAlFxuLy8g7Jes6riw7ISgIOq3uCDqsr3roZzsl5Ag67mIIHNldHRpbmdzIOulvCDquZTslYQgY2xhdWRlLW1lbSBob29rIOuTseydhCDssKjri6jtlZzri6QuIChSMTAg6rKp66asKVxuLy8g7J20IHNlZWQg7YyM7J287J2AIGNsYXVkZS1tZW0gaG9vayAvIOyCrOyaqeyekCDshKTsoJUg7Jik7Je8IOywqOuLqOydhCDsnITtlZwg6rKp66asIOqyveqzhOuLpC4g66ekIO2YuOy2nOuniOuLpCDri6Tsi5wg7I2o7IScXG4vLyDsmbjrtoAg67OA7KGwwrfsgq3soJwg7ZuE7JeQ64+EIOuLpOydjCDsi6Ttlonsl5DshJwgc2VsZi1oZWFsaW5nIOuQmOuPhOuhnSDquLDsobQgc2VtYW50aWNzIOulvCDsnKDsp4DtlZzri6QuXG5leHBvcnQgZnVuY3Rpb24gZW5zdXJlQ29uZmlnRGlyKHRva2VuSWQ6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IGRpciA9IGFudGhyb3BpY0NvbmZpZ0Rpcih0b2tlbklkKTtcbiAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHdyaXRlRmlsZVN5bmMoYCR7ZGlyfS8uY2xhdWRlLmpzb25gLCBcInt9XCIpO1xuICB3cml0ZUZpbGVTeW5jKGAke2Rpcn0vc2V0dGluZ3MuanNvbmAsIFwie31cIik7XG4gIHJldHVybiBkaXI7XG59XG5cbmxldCBjd2RFbnN1cmVkID0gZmFsc2U7XG5mdW5jdGlvbiBlbnN1cmVDd2QoKTogdm9pZCB7XG4gIGlmIChjd2RFbnN1cmVkKSByZXR1cm47XG4gIG1rZGlyU3luYyhgJHtBTlRIUk9QSUNfQ0xBVURFX0NXRH0vLmNsYXVkZWAsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB3cml0ZUZpbGVTeW5jKGAke0FOVEhST1BJQ19DTEFVREVfQ1dEfS8uY2xhdWRlL3NldHRpbmdzLmpzb25gLCBcInt9XCIpO1xuICBjd2RFbnN1cmVkID0gdHJ1ZTtcbn1cblxuLy8gc3Bhd24gYXJncyDqtazshLEuIOupgO2LsO2EtC/qsqnrpqwvc3RydWN0dXJlZCDrqqjrk5wg67CY7JiBLlxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5T25lTWlsbGlvblN1ZmZpeChtb2RlbDogc3RyaW5nLCBuZWVkc1N1ZmZpeDogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBjYW5vbmljYWxBbnRocm9waWNNb2RlbChtb2RlbCk7XG4gIHJldHVybiBuZWVkc1N1ZmZpeCA/IGAke2Jhc2V9WzFtXWAgOiBiYXNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gb25lTWlsbGlvbkVudihzdXBwb3J0ZWQ6IGJvb2xlYW4pOiB7IENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVD86IFwiMVwiIH0ge1xuICByZXR1cm4gc3VwcG9ydGVkID8ge30gOiB7IENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIgfTtcbn1cblxuLy8gU09OLTQ5NTogc3RydWN0dXJlZCBvdXRwdXQgcmV0cnkg66W8IDEg66GcIOqzoOygle2VnOuLpC4gQ0Mg6rCAIGF0dGVtcHQg66W8IHJlamVjdCDtlZjqs6AgcmV0cnkg7ZWY66m0XG4vLyBge3JlamVjdGVkfXthY2NlcHRlZH1gIOuIhOyggeydtCBBSS1TREsg7J2YIEpTT04ucGFyc2Ug66W8IOq5qOucqOumrOuvgOuhnCwgcmV0cnkg7J6Q7LK066W8IOunieyVhCDqt7gg6rK966Gc66W8XG4vLyDsm5Dsspwg7LCo64uo7ZWc64ukLiBgMGAg7J2AIENDIHF1ZXJ5IGxvb3AoYGNhbGxzVGhpc1F1ZXJ5ID49IG1heFJldHJpZXNgKeqwgCDssqsgYXR0ZW1wdCBlbWl0IOyghOyXkFxuLy8g7Iuk7Yyo7Iuc7YKk66+A66GcKGBlcnJvcl9tYXhfc3RydWN0dXJlZF9vdXRwdXRfcmV0cmllc2ApIOyZuOu2gCDqsJLsnbQgMSDrr7jrp4zsnbTslrTrj4QgMSDroZwg7YG0656o7ZSE7ZWc64ukLlxuZXhwb3J0IGZ1bmN0aW9uIHN0cnVjdHVyZWRPdXRwdXRSZXRyaWVzRW52KHJhdyA9IHByb2Nlc3MuZW52Lk1BWF9TVFJVQ1RVUkVEX09VVFBVVF9SRVRSSUVTKToge1xuICBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogc3RyaW5nO1xufSB7XG4gIGlmICghcmF3KSByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogXCIxXCIgfTtcbiAgY29uc3QgcGFyc2VkID0gTnVtYmVyLnBhcnNlSW50KHJhdywgMTApO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZShwYXJzZWQpKSByZXR1cm4geyBNQVhfU1RSVUNUVVJFRF9PVVRQVVRfUkVUUklFUzogXCIxXCIgfTtcbiAgcmV0dXJuIHsgTUFYX1NUUlVDVFVSRURfT1VUUFVUX1JFVFJJRVM6IFN0cmluZyhNYXRoLm1heChwYXJzZWQsIDEpKSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRDbGF1ZGVBcmdzKG9wdHM6IHtcbiAgbW9kZWw6IHN0cmluZztcbiAgc3lzdGVtPzogc3RyaW5nO1xuICBlZmZvcnQ/OiBzdHJpbmc7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBuZWVkc09uZU1pbGxpb25TdWZmaXg/OiBib29sZWFuO1xuICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzPzogYm9vbGVhbjtcbn0pOiBBcnJheTxzdHJpbmc+IHtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ob3B0cy5qc29uU2NoZW1hICYmIG9wdHMuanNvblNjaGVtYS5sZW5ndGggPiAwKTtcbiAgLy8gLS10b29scyBcIlwiIOuhnCDsoITssrQg7LCo64uoLCBzdHJ1Y3R1cmVkKGpzb25TY2hlbWEg7J6I7J2MKSDrqbQgU3RydWN0dXJlZE91dHB1dCDrp4wg7ZeI7JqpLlxuICBjb25zdCB0b29sQXJncyA9IHVzZVN0cnVjdHVyZWRcbiAgICA/IFtcIi0tdG9vbHNcIiwgXCJcIiwgXCItLWFsbG93ZWQtdG9vbHNcIiwgXCJTdHJ1Y3R1cmVkT3V0cHV0XCJdXG4gICAgOiBbXCItLXRvb2xzXCIsIFwiXCJdO1xuXG4gIGNvbnN0IGFyZ3M6IEFycmF5PHN0cmluZz4gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAuLi5BTlRIUk9QSUNfRElTQUxMT1dFRF9UT09MUyxcbiAgICBcIi0taW5wdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS1vdXRwdXQtZm9ybWF0XCIsXG4gICAgXCJzdHJlYW0tanNvblwiLFxuICAgIFwiLS12ZXJib3NlXCIsXG4gICAgLi4uKG9wdHMuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyA/IFtcIi0taW5jbHVkZS1wYXJ0aWFsLW1lc3NhZ2VzXCJdIDogW10pLFxuICAgIFwiLS1wZXJtaXNzaW9uLW1vZGVcIixcbiAgICBcImJ5cGFzc1Blcm1pc3Npb25zXCIsXG4gICAgXCItLXNldHRpbmctc291cmNlc1wiLFxuICAgIFwicHJvamVjdFwiLFxuICAgIFwiLS1tb2RlbFwiLFxuICAgIGFwcGx5T25lTWlsbGlvblN1ZmZpeChvcHRzLm1vZGVsLCBvcHRzLm5lZWRzT25lTWlsbGlvblN1ZmZpeCA/PyBmYWxzZSksXG4gICAgLy8gaW5saW5lIFtTeXN0ZW1dIOq4iOyngCDigJQg7KCV7IudIOyxhOuEkOunjChSNykuIOyDneuetSDsi5wgQ0MgZGVmYXVsdCgyM2spIOyjvOyeheuQmOuvgOuhnCDrsJjrk5zsi5wg66qF7IucLlxuICAgIFwiLS1zeXN0ZW0tcHJvbXB0XCIsXG4gICAgb3B0cy5zeXN0ZW0gPz8gXCJcIixcbiAgICBcIi0tdGhpbmtpbmdcIixcbiAgICBcImRpc2FibGVkXCIsXG4gICAgXCItLWVmZm9ydFwiLFxuICAgIG9wdHMuZWZmb3J0ID8/IEFOVEhST1BJQ19ERUZBVUxUX0VGRk9SVCxcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICAgIFwiLS1zZXNzaW9uLWlkXCIsXG4gICAgb3B0cy5zZXNzaW9uSWQsXG4gIF07XG4gIGlmICh1c2VTdHJ1Y3R1cmVkKSBhcmdzLnB1c2goXCItLWpzb24tc2NoZW1hXCIsIG9wdHMuanNvblNjaGVtYSEpO1xuICByZXR1cm4gYXJncztcbn1cblxuLyoqXG4gKiBDbGF1ZGUg7IS47IWY7J2EIHNwYXduIO2VtCDtlZwgdHVybiDsnYQg7Iuk7ZaJ7ZWc64ukLiBwZXItc2Vzc2lvbiDrnb3snLzroZwg7KeB66Cs7ZmU65Cc64ukLlxuICogQHBhcmFtIG9uRGVsdGEg7KCQ7KeEIO2FjeyKpO2KuCBkZWx0YShzdHJlYW1UZXh0KSDrmJDripQgc3RydWN0dXJlZCDrtoDrtoQgSlNPTihzdHJlYW1PYmplY3QpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcnVuQ2xhdWRlU2Vzc2lvbihcbiAgcmVxOiBDbGF1ZGVTZXNzaW9uUmVxdWVzdCxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbik6IFByb21pc2U8Q2xhdWRlU2Vzc2lvblJlc3VsdD4ge1xuICAvLyDsoJXqt5ztmZQg6rec7LmZ7J2AIGNhbm9uaWNhbEFudGhyb3BpY01vZGVsIOydtCDri6jrj4Ug7IaM7JygIOKAlCBkaXNwYXRjaGVyIOqwgCDsnbTrr7ggY2Fub25pY2FsIOydhCDrhJjquLDsp4Drp4wsXG4gIC8vIOyngeygkSDtmLjstpwo7YWM7Iqk7Yq4L+uvuOuemCBjYWxsZXIpIOuMgOu5hCDrsKnslrTsoIHsnLzroZwg7ZWcIOuyiCDrjZQg7Ya16rO87Iuc7YKo64ukKOydtOuvuCBjYW5vbmljYWwg7J2066m0IG5vLW9wKS5cbiAgYXNzZXJ0U3VwcG9ydGVkT25lTWlsbGlvblN1ZmZpeChyZXEubW9kZWwpO1xuICBjb25zdCBtb2RlbCA9IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKHJlcS5tb2RlbCk7XG4gIGNvbnN0IHN1cHBvcnRzT25lTWlsbGlvbiA9IHN1cHBvcnRzMU1Db250ZXh0KG1vZGVsKTtcbiAgY29uc3QgbmVlZHNPbmVNaWxsaW9uU3VmZml4ID0gbmVlZHNDbGkxbVN1ZmZpeChtb2RlbCk7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHJhbmRvbVVVSUQoKTtcbiAgY29uc3QgdXNlU3RydWN0dXJlZCA9IEJvb2xlYW4ocmVxLmpzb25TY2hlbWEgJiYgcmVxLmpzb25TY2hlbWEubGVuZ3RoID4gMCk7XG4gIGNvbnN0IHdvcmtlcklkID0gbWFrZUFudGhyb3BpY1dvcmtlcklkKHJlcS50b2tlbklkKTtcblxuICByZXR1cm4gd2l0aFNlc3Npb25Mb2NrKHNlc3Npb25JZCwgKCkgPT4ge1xuICAgIGVuc3VyZUN3ZCgpO1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IGVuc3VyZUNvbmZpZ0RpcihyZXEudG9rZW5JZCk7XG5cbiAgICBjb25zdCBhcmdzID0gYnVpbGRDbGF1ZGVBcmdzKHtcbiAgICAgIG1vZGVsLFxuICAgICAgc3lzdGVtOiByZXEuc3lzdGVtLFxuICAgICAgZWZmb3J0OiByZXEuZWZmb3J0LFxuICAgICAganNvblNjaGVtYTogcmVxLmpzb25TY2hlbWEsXG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBuZWVkc09uZU1pbGxpb25TdWZmaXgsXG4gICAgICBpbmNsdWRlUGFydGlhbE1lc3NhZ2VzOiByZXEuaW5jbHVkZVBhcnRpYWxNZXNzYWdlcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0TGluZXMgPSBidWlsZFN0cmVhbUpzb25JbnB1dCh7XG4gICAgICBjb2xkSGlzdG9yeTogcmVxLmNvbGRIaXN0b3J5LFxuICAgICAgaW5wdXQ6IHJlcS5pbnB1dCxcbiAgICB9KTtcbiAgICBjb25zdCBzdGRpblBheWxvYWQgPSBkZWNvcmF0ZUFuZFNlcmlhbGl6ZShpbnB1dExpbmVzLCBzZXNzaW9uSWQpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPENsYXVkZVNlc3Npb25SZXN1bHQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChyZXEuYWJvcnRTaWduYWw/LmFib3J0ZWQpIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcImFib3J0ZWRcIikpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNoaWxkID0gc3Bhd24oXCJjbGF1ZGVcIiwgYXJncywge1xuICAgICAgICAvLyBzdGRlcnIg64+EIOy6oeyymDogaW52YWxpZCBPQXV0aCAvIOyemOuqu+uQnCDtlIzrnpjqt7ggLyBDTEkg6rKA7KadIOyLpO2MqOqwgFxuICAgICAgICAvLyBcImNsb3NlZCB3aXRob3V0IHJlc3VsdFwiIOuhnCDrrYnqsJzsp4Dsp4Ag7JWK6rKMIGNsb3NlL2Vycm9yIOyXkCBzdGRlcnIg66W8IOyLpOyWtCDrs7Trgrjri6QuXG4gICAgICAgIHN0ZGlvOiBbXCJwaXBlXCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIGN3ZDogQU5USFJPUElDX0NMQVVERV9DV0QsXG4gICAgICAgIGVudjoge1xuICAgICAgICAgIFBBVEg6IHByb2Nlc3MuZW52LlBBVEgsXG4gICAgICAgICAgVE1QRElSOiBwcm9jZXNzLmVudi5UTVBESVIsXG4gICAgICAgICAgQ0xBVURFX0NPREVfT0FVVEhfVE9LRU46IHJlcS50b2tlbixcbiAgICAgICAgICBDTEFVREVfQ09ORklHX0RJUjogY29uZmlnRGlyLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgICAgICAgIC4uLm9uZU1pbGxpb25FbnYoc3VwcG9ydHNPbmVNaWxsaW9uKSxcbiAgICAgICAgICBDTEFVREVfQ09ERV9ESVNBQkxFX0NMQVVERV9NRFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfVEVSTUlOQUxfVElUTEU6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQlVORExFRF9TS0lMTFM6IFwiMVwiLFxuICAgICAgICAgIENMQVVERV9DT0RFX0RJU0FCTEVfV09SS0ZMT1dTOiBcIjFcIixcbiAgICAgICAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICAgICAgICAgIE1BWF9USElOS0lOR19UT0tFTlM6IFwiMFwiLFxuICAgICAgICAgIC8vIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYzrp4wgcmV0cnkg66W8IOqzoOygle2VnOuLpChTT04tNDk1KS4gdGV4dCDrqqjrk5zripQg7JiB7ZalIOyXhuydjC5cbiAgICAgICAgICAuLi4odXNlU3RydWN0dXJlZCA/IHN0cnVjdHVyZWRPdXRwdXRSZXRyaWVzRW52KCkgOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgIGxldCBidWZmZXIgPSBcIlwiO1xuICAgICAgY29uc3Qgc3RyZWFtU3RhdGU6IENsYXVkZVN0cmVhbUpzb25TdGF0ZSA9IHt9O1xuICAgICAgLy8gYm91bmRlZCBzdGRlcnIg67KE7Y28KOy1nOq3vCB+NEtC66eMIOycoOyngCDigJQg66y07ZWcIOuIhOyggSDrsKnsp4ApLlxuICAgICAgbGV0IHN0ZGVyckJ1ZiA9IFwiXCI7XG4gICAgICBjb25zdCBTVERFUlJfQ0FQID0gNDA5NjtcbiAgICAgIGNoaWxkLnN0ZGVycj8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgICAgc3RkZXJyQnVmID0gKHN0ZGVyckJ1ZiArIGQudG9TdHJpbmcoKSkuc2xpY2UoLVNUREVSUl9DQVApO1xuICAgICAgfSk7XG4gICAgICBjb25zdCBzdGRlcnJTdWZmaXggPSAoKSA9PiAoc3RkZXJyQnVmLnRyaW0oKSA/IGAg4oCUIHN0ZGVycjogJHtzdGRlcnJCdWYudHJpbSgpfWAgOiBcIlwiKTtcbiAgICAgIGxldCBjbGVhbnVwQWJvcnQ6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjaGlsZC5raWxsKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIHRpbWVvdXQgYWZ0ZXIgJHtyZXEudGltZW91dE1zIC8gMTAwMH1zYCkpO1xuICAgICAgfSwgcmVxLnRpbWVvdXRNcyk7XG5cbiAgICAgIGNvbnN0IGZpbmlzaCA9IChyZXN1bHQ6IENsYXVkZVN0cmVhbVJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgY2xlYW51cEFib3J0Py4oKTtcbiAgICAgICAgcmVzb2x2ZSh7IC4uLnJlc3VsdCwgc2Vzc2lvbklkLCB3b3JrZXJJZCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG9uQWJvcnQgPSAoKSA9PiB7XG4gICAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICAgIHNldHRsZWQgPSB0cnVlO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICBjbGVhbnVwQWJvcnQ/LigpO1xuICAgICAgICBjaGlsZC5raWxsKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJhYm9ydGVkXCIpKTtcbiAgICAgIH07XG4gICAgICBjbGVhbnVwQWJvcnQgPSAoKSA9PiByZXEuYWJvcnRTaWduYWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJhYm9ydFwiLCBvbkFib3J0KTtcbiAgICAgIHJlcS5hYm9ydFNpZ25hbD8uYWRkRXZlbnRMaXN0ZW5lcihcImFib3J0XCIsIG9uQWJvcnQsIHsgb25jZTogdHJ1ZSB9KTtcblxuICAgICAgY2hpbGQuc3Rkb3V0Py5vbihcImRhdGFcIiwgKGQ6IEJ1ZmZlcikgPT4ge1xuICAgICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBsaW5lcyA9IGJ1ZmZlci5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgYnVmZmVyID0gbGluZXMucG9wKCkgPz8gXCJcIjtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gaGFuZGxlU3RyZWFtSnNvbkxpbmUobGluZSwgb25EZWx0YSwge1xuICAgICAgICAgICAgc3RydWN0dXJlZE91dHB1dDogdXNlU3RydWN0dXJlZCxcbiAgICAgICAgICAgIHN0YXRlOiBzdHJlYW1TdGF0ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICBmaW5pc2gocmVzdWx0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIGNsb3NlZCB3aXRob3V0IHJlc3VsdCR7c3RkZXJyU3VmZml4KCl9YCkpO1xuICAgICAgfSk7XG4gICAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgICAgaWYgKHNldHRsZWQpIHJldHVybjtcbiAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgIGNsZWFudXBBYm9ydD8uKCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENsYXVkZSBzZXNzaW9uIHNwYXduIGVycm9yOiAke2Vyci5tZXNzYWdlfWApKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBzdGRpbiDsnLzroZwg7J6F66ClIEpTT05MIO2dmOumrOqzoCDri6vripTri6QuXG4gICAgICBjaGlsZC5zdGRpbj8ud3JpdGUoc3RkaW5QYXlsb2FkKTtcbiAgICAgIGNoaWxkLnN0ZGluPy5lbmQoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8vIHVzYWdlIOyerOuFuOy2nCjthYzsiqTtirgg7Y647J2YKS5cbmV4cG9ydCB0eXBlIHsgVG9rZW5Vc2FnZUJyZWFrZG93biB9O1xuIl0s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
@@ -20,11 +20,6 @@ function responseItemText(item) {
20
20
  return obj && typeof obj.text === "string" ? obj.text : "";
21
21
  }).filter(Boolean).join("\n");
22
22
  }
23
- /**
24
- * cold history(codex ResponseItem[])를 **단일 평탄 텍스트**로 변환한다.
25
- * user/assistant/tool 모두 라벨 붙은 한 덩어리로 — 실행되지 않는 assistant context 로 들어간다.
26
- * (cold 의 user/tool-output 을 type:"user" 로 내보내면 새 prompt 로 재실행되므로 금지.)
27
- */
28
23
  function flattenColdHistory(coldHistory) {
29
24
  const parts = [];
30
25
  for (const raw of coldHistory) {
@@ -43,24 +38,9 @@ function flattenColdHistory(coldHistory) {
43
38
  }
44
39
  return parts.join("\n");
45
40
  }
46
- /**
47
- * 서버 GenerateRequest payload 를 Claude stream-json JSONL 라인 배열로 변환한다.
48
- *
49
- * @param opts.coldHistory cold 경로의 codex ResponseItem 배열(JsonValue[]). resume 경로면 미사용.
50
- * @param opts.input 실행할 input — cold 면 coldInput, resume 면 reuseInput.
51
- * @param opts.isResume resume 경로 여부. true 면 history 재주입 없이 input(delta)만.
52
- *
53
- * 출력 규칙:
54
- * - 실행 가능한 `type:"user"` 줄은 **항상 정확히 1개** — 마지막 input.
55
- * - resume: user(delta) 1줄만. thread 가 이전 turn 을 누적하므로 history 미포함.
56
- * - cold: coldHistory 전체를 **단일 assistant context 텍스트**로 평탄화(실행 안 됨) + user(input) 1줄.
57
- * user/assistant/tool 모두 평탄화되므로 과거 user/tool-output 이 재실행되지 않는다.
58
- * full-fidelity role replay 가 필요하면 session resume 또는 JSONL backstop(범위 밖).
59
- * - tool(function_call/output): native 블록 없이 평탄 텍스트로.
60
- */
61
41
  function buildStreamJsonInput(opts) {
62
42
  const lines = [];
63
- if (!opts.isResume && opts.coldHistory && opts.coldHistory.length > 0) {
43
+ if (opts.coldHistory && opts.coldHistory.length > 0) {
64
44
  const flattened = flattenColdHistory(opts.coldHistory);
65
45
  if (flattened) lines.push({
66
46
  type: "assistant",
@@ -109,19 +89,6 @@ function structuredOutputToolUseText(j) {
109
89
  if (block.type === "tool_use" && block.name === "StructuredOutput" && block.input !== void 0) return JSON.stringify(block.input);
110
90
  }
111
91
  }
112
- /**
113
- * stream-json 출력 라인 하나를 처리한다. 순수 함수 — side effect 는 onDelta 콜백뿐.
114
- *
115
- * @param opts.structuredOutput structured output(jsonSchema) 모드 여부.
116
- * structured 모드에서 Claude 는 자연어 text_delta 와 input_json_delta.partial_json 을
117
- * **함께** 흘릴 수 있다(PoC 확인). 이때 text_delta 를 그대로 onDelta 로 보내면 client 의
118
- * streamObject 파서가 prose 를 JSON 앞에서 만나 깨진다. 그래서:
119
- * - structured 모드: text_delta 무시, partial_json 만 onDelta.
120
- * - text 모드: text_delta 만 onDelta (partial_json 은 안 옴).
121
- *
122
- * @returns result 이벤트면 ClaudeStreamResult, 그 외(delta/system 등)면 null.
123
- * 호출부는 라인 스트림을 돌며 이 함수를 호출하고, non-null 이 나오면 종료.
124
- */
125
92
  function handleStreamJsonLine(line, onDelta, opts) {
126
93
  const structuredOutput = opts?.structuredOutput ?? false;
127
94
  const state = opts?.state;
@@ -159,14 +126,17 @@ function handleStreamJsonLine(line, onDelta, opts) {
159
126
  const usage = toUsageBreakdown(asObject(j.usage) ?? {});
160
127
  const quotaExhausted = text.startsWith("You've hit");
161
128
  const subtype = typeof j.subtype === "string" ? j.subtype : void 0;
162
- const isError = !(preservedStructuredOutput !== void 0 && (subtype === "error_max_turns" || j.terminal_reason === "max_turns")) && (j.is_error === true || j.terminal_reason === "model_error" || subtype !== void 0 && subtype !== "success");
129
+ const terminalReason = typeof j.terminal_reason === "string" ? j.terminal_reason : void 0;
130
+ const isError = j.is_error === true || j.terminal_reason === "model_error" || subtype !== void 0 && subtype !== "success";
163
131
  return {
164
132
  text,
165
133
  usage,
166
134
  durationMs: typeof j.duration_ms === "number" ? j.duration_ms : 0,
167
135
  costUsd: typeof j.total_cost_usd === "number" ? j.total_cost_usd : 0,
168
136
  quotaExhausted,
169
- isError
137
+ isError,
138
+ subtype,
139
+ terminalReason
170
140
  };
171
141
  }
172
142
  return null;
@@ -174,4 +144,4 @@ function handleStreamJsonLine(line, onDelta, opts) {
174
144
  //#endregion
175
145
  export { buildStreamJsonInput, handleStreamJsonLine, serializeStreamJsonInput };
176
146
 
177
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogc3RyZWFtLWpzb24g7Ja064yR7YSwIOKAlCBBbnRocm9waWMoQ2xhdWRlKSBwcm92aWRlciDsnZgg7J6F66ClL+y2nOugpSDrs4DtmZguXG4gKlxuICog7J20IOuqqOuTiOydgCDrtoDtmZzsnZgg7Jyg7J287ZWcIOuzuOyniOyggSDsi6Dqt5wg7L2U65Oc64ukLiDrkZAg67Cp7Zal7J2EIOu2hOumrOuQnCDsiJzsiJgg7ZWo7IiY66GcIOuRlOuLpDpcbiAqICAtIOyeheugpTog7ISc67KEIEdlbmVyYXRlUmVxdWVzdCBwYXlsb2FkKGNvbGRJbnB1dC9jb2xkSGlzdG9yeS9yZXVzZUlucHV0KVxuICogICAgICAgICAg4oaSIGBjbGF1ZGUgLXAgLS1pbnB1dC1mb3JtYXQgc3RyZWFtLWpzb25gIOydmCBKU09OTCDrnbzsnbguXG4gKiAgLSDstpzroKU6IGBjbGF1ZGUgLXAgLS1vdXRwdXQtZm9ybWF0IHN0cmVhbS1qc29uIC0tdmVyYm9zZWAg7J2YIEpTT05MIOudvOyduFxuICogICAgICAgICAg4oaSIHFncmlkIOyEnOuyhCBkZWx0YShvbkRlbHRhKSArIOy1nOyihSByZXN1bHQuIChVMywg6rCZ7J2AIO2MjOydvCDtlZjri6gpXG4gKlxuICog7KSR7JqU7ZWcIOqzhOyVvTpcbiAqICAtIOyeheugpeydgCBBSSBTREsgTGFuZ3VhZ2VNb2RlbFYzTWVzc2FnZVtdIOqwgCDslYTri4jrnbwgKirshJzrsoTsuKEgR2VuZXJhdGVSZXF1ZXN0Kiog64ukLlxuICogICAgYWktc2RrIOqwgCDsnbTrr7ggUXVlcnlJbnB1dC5oaXN0b3J5KEpzb25WYWx1ZVtdKSDroZwg67OA7ZmY7ZaI6rOgLCBkZWNpZGVDb252Um91dGluZyDsnbRcbiAqICAgIGNvbGRJbnB1dC9jb2xkSGlzdG9yeS9yZXVzZUlucHV0IOycvOuhnCDrp4zrk6Ag65KkIGRpc3BhdGNoZXIg7JeQIOuPhOuLrO2VnOuLpC5cbiAqICAtIGNvbnRlbnQg64qUIHVzZXIvYXNzaXN0YW50IOuqqOuRkCBibG9jayDrsLDsl7QgYFt7dHlwZTpcInRleHRcIix0ZXh0fV1gIOuhnCDsoJXqt5ztmZTtlZzri6QuXG4gKiAgICDrrLjsnpDsl7QgY29udGVudCDripQg7J2867aAIHVzZXIg64uo67Cc66eMIO2GteqzvO2VmOqzoCBoaXN0b3J5IHJlcGxheSDsl5DshJwg6rmo7KeE64ukXG4gKiAgICAoYFcgaXMgbm90IGFuIE9iamVjdCAoZXZhbHVhdGluZyAnXCJ0b29sX3VzZV9pZFwiIGluIFcnKWApLlxuICogIC0gc3RyZWFtLWpzb24g7J2YIHVzZXIvYXNzaXN0YW50IOuKlCDruYTrjIDsua3snbTri6Q6IGFzc2lzdGFudCDripQgaGlzdG9yeSBjb250ZXh0IOuhnCBwdXNoIOuQmOqzoFxuICogICAgKip1c2VyIOuKlCDsg4ggcHJvbXB0IOuhnCBlbnF1ZXVlKD3si6Ttlokp65Cc64ukLioqIOuUsOudvOyEnCBjb2xkIOqyveuhnOyXkOyEnCDqs7zqsbAg64yA7ZmUKHVzZXIvYXNzaXN0YW50L1xuICogICAgdG9vbCnrpbwg6re464yA66GcIOykhOuhnCDripjslrTrhpPsnLzrqbQg6rO86rGwIHVzZXIvdG9vbC1vdXRwdXQg7J20IOyLpO2WiSBwcm9tcHQg66GcIOyerOyLpO2WieuQnOuLpC4g7J2066W8IO2UvO2VmOugpFxuICogICAgY29sZCBoaXN0b3J5IOuKlCAqKuuLqOydvCBhc3Npc3RhbnQgY29udGV4dCDthY3siqTtirjroZwg7Y+J7YOE7ZmUKirtlZjqs6AsIOyLpO2WiSDqsIDriqXtlZwgYHR5cGU6XCJ1c2VyXCJgIOykhOydgFxuICogICAgKirrp4jsp4Drp4kgaW5wdXQg7ZWY64KY67+QKirsnbQg65CY64+E66GdIO2VnOuLpC4gZnVsbC1maWRlbGl0eSByb2xlIHJlcGxheSDqsIAg7ZWE7JqU7ZWY66m0IHNlc3Npb24gcmVzdW1lXG4gKiAgICAocmV1c2VJbnB1dCkg65iQ64qUIEpTT05MIGJhY2tzdG9wIOycvOuhnCDqsITri6QuXG4gKiAgLSB0b29sIOqysOqzvOuKlCBuYXRpdmUgQW50aHJvcGljIHRvb2xfcmVzdWx0IOu4lOuhneydhCDsg4jroZwg66eM65Ok7KeAIOyViuqzoCwg6riw7KG0IE9wZW5BSSDsmYBcbiAqICAgIOuPmeydvO2VmOqyjCDtj4ntg4TtmZTrkJwgdGV4dCDroZwg7LKY66as7ZWc64ukKGVtdWxhdGlvbiDqs7XthrUg6rOE7JW9KS5cbiAqL1xuXG5pbXBvcnQgeyB0eXBlIEpzb25WYWx1ZSB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC9zZXJkZV9qc29uL0pzb25WYWx1ZVwiO1xuaW1wb3J0IHsgdHlwZSBVc2VySW5wdXQgfSBmcm9tIFwiLi4vLi4vLi4vY29kZXgtcHJvdG9jb2wvdjIvVXNlcklucHV0XCI7XG5pbXBvcnQgeyB0eXBlIFByb3ZpZGVyVG9rZW5Vc2FnZUJyZWFrZG93biB9IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gY29udGVudCDripQg7ZWt7IOBIGJsb2NrIOuwsOyXtC5cbi8vXG4vLyBTREsgZW52ZWxvcGUg7ZWE65OcKHV1aWQgLyBzZXNzaW9uX2lkIC8gcGFyZW50X3Rvb2xfdXNlX2lkKeuKlCAqKuyXrOq4sOyEnCDrp4zrk6Tsp4Ag7JWK64qU64ukKiouXG4vLyDqt7gg6rCS65Ok7J2AIOyEuOyFmOydhCDrsJzquIkv7IaM7Jyg7ZWY64qUIGNsYXVkZS1zZXNzaW9uIOydmCDssYXsnoTsnbTri6QuIOydtCDrqqjrk4jsnYAgcm9sZS9jb250ZW50IOuzgO2ZmOunjCDtlZjripRcbi8vIOyInOyImCDtlajsiJjroZwg65GQ6rOgLCBjbGF1ZGUtc2Vzc2lvbiDsnbQg7KeB66Cs7ZmUIOyngeyghOyXkCBlbnZlbG9wZSDrpbwgZGVjb3JhdGUg7ZWc64ukLiDssYXsnoQg67aE66asLlxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uTGluZSB7XG4gIHR5cGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIjtcbiAgbWVzc2FnZToge1xuICAgIHJvbGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIjtcbiAgICBjb250ZW50OiBBcnJheTx7IHR5cGU6IFwidGV4dFwiOyB0ZXh0OiBzdHJpbmcgfT47XG4gIH07XG59XG5cbi8vIFVzZXJJbnB1dFtdIOyXkOyEnCB0ZXh0IOunjCDrvZHslYQg7ZWY64KY7J2YIOusuOyekOyXtOuhnC4gKGltYWdlL3NraWxsL21lbnRpb24g65Ox7J2AIO2YhOyerCDrspTsnIQg67CWIOKAlCB0ZXh0IOychOyjvClcbmZ1bmN0aW9uIHVzZXJJbnB1dFRvVGV4dChpbnB1dDogQXJyYXk8VXNlcklucHV0Pik6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dFxuICAgIC5maWx0ZXIoKGkpOiBpIGlzIEV4dHJhY3Q8VXNlcklucHV0LCB7IHR5cGU6IFwidGV4dFwiIH0+ID0+IGkudHlwZSA9PT0gXCJ0ZXh0XCIpXG4gICAgLm1hcCgoaSkgPT4gaS50ZXh0KVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG4vLyBjb250ZW50IOulvCDtla3sg4EgYmxvY2sg67Cw7Je066GcIOygleq3nO2ZlCjrrLjsnpDsl7QgY29udGVudCDripQgaGlzdG9yeSByZXBsYXkg7JeQ7IScIOq5qOynkCkuXG5mdW5jdGlvbiB0ZXh0QmxvY2sodGV4dDogc3RyaW5nKTogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dO1xufVxuXG4vLyBjb2RleCBSZXNwb25zZUl0ZW0oY29sZEhpc3Rvcnkg7J2YIO2VnCDtla3rqqkpIO2Yle2DnCDtjJDrs4Tsmqkg7LWc7IaMIHNoYXBlLlxuLy8gZXh0cmFjdFByb21wdEFuZEhpc3RvcnkoYWktc2RrL3V0aWxzLnRzKSDqsIAg66eM65Oc64qUIO2YleyLnTpcbi8vICAgeyB0eXBlOlwibWVzc2FnZVwiLCByb2xlOlwidXNlclwiLCBjb250ZW50Olt7dHlwZTpcImlucHV0X3RleHRcIiwgdGV4dH1dIH1cbi8vICAgeyB0eXBlOlwibWVzc2FnZVwiLCByb2xlOlwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6W3t0eXBlOlwib3V0cHV0X3RleHRcIiwgdGV4dH1dIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbFwiLCBuYW1lLCBhcmd1bWVudHMsIGNhbGxfaWQgfVxuLy8gICB7IHR5cGU6XCJmdW5jdGlvbl9jYWxsX291dHB1dFwiLCBjYWxsX2lkLCBvdXRwdXQgfVxudHlwZSBSZXNwb25zZUl0ZW0gPSB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuXG5mdW5jdGlvbiBhc09iamVjdCh2OiBKc29uVmFsdWUgfCB1bmRlZmluZWQpOiBSZXNwb25zZUl0ZW0gfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikgPyAodiBhcyBSZXNwb25zZUl0ZW0pIDogbnVsbDtcbn1cblxuLy8gY29kZXggbWVzc2FnZSBjb250ZW50KFt7dHlwZTppbnB1dF90ZXh0fG91dHB1dF90ZXh0LCB0ZXh0fV0pIOyXkOyEnCB0ZXh0IOy2lOy2nC5cbi8vIOyXrOufrCBjb250ZW50IOu4lOuhneydgCDspITrsJTqv4jsnLzroZwg6rWs67aEKHRva2VuLWFkamFjZW50IOu2meydjCDrsKnsp4ApLlxuZnVuY3Rpb24gcmVzcG9uc2VJdGVtVGV4dChpdGVtOiBSZXNwb25zZUl0ZW0pOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gaXRlbS5jb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiBcIlwiO1xuICByZXR1cm4gY29udGVudFxuICAgIC5tYXAoKGMpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IGFzT2JqZWN0KGMpO1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnRleHQgPT09IFwic3RyaW5nXCIgPyBvYmoudGV4dCA6IFwiXCI7XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG5cbi8qKlxuICogY29sZCBoaXN0b3J5KGNvZGV4IFJlc3BvbnNlSXRlbVtdKeulvCAqKuuLqOydvCDtj4ntg4Qg7YWN7Iqk7Yq4KirroZwg67OA7ZmY7ZWc64ukLlxuICogdXNlci9hc3Npc3RhbnQvdG9vbCDrqqjrkZAg652867KoIOu2meydgCDtlZwg642p7Ja066as66GcIOKAlCDsi6TtlonrkJjsp4Ag7JWK64qUIGFzc2lzdGFudCBjb250ZXh0IOuhnCDrk6TslrTqsITri6QuXG4gKiAoY29sZCDsnZggdXNlci90b29sLW91dHB1dCDsnYQgdHlwZTpcInVzZXJcIiDroZwg64K067O064K066m0IOyDiCBwcm9tcHQg66GcIOyerOyLpO2WieuQmOuvgOuhnCDquIjsp4AuKVxuICovXG5mdW5jdGlvbiBmbGF0dGVuQ29sZEhpc3RvcnkoY29sZEhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBjb2xkSGlzdG9yeSkge1xuICAgIGNvbnN0IGl0ZW0gPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0gdHlwZW9mIGl0ZW0ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ubmFtZSA6IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgdHlwZW9mIGl0ZW0uYXJndW1lbnRzID09PSBcInN0cmluZ1wiID8gaXRlbS5hcmd1bWVudHMgOiBKU09OLnN0cmluZ2lmeShpdGVtLmFyZ3VtZW50cyA/PyB7fSk7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICB0eXBlb2YgaXRlbS5vdXRwdXQgPT09IFwic3RyaW5nXCIgPyBpdGVtLm91dHB1dCA6IEpTT04uc3RyaW5naWZ5KGl0ZW0ub3V0cHV0ID8/IFwiXCIpO1xuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcbn1cblxuLyoqXG4gKiDshJzrsoQgR2VuZXJhdGVSZXF1ZXN0IHBheWxvYWQg66W8IENsYXVkZSBzdHJlYW0tanNvbiBKU09OTCDrnbzsnbgg67Cw7Je066GcIOuzgO2ZmO2VnOuLpC5cbiAqXG4gKiBAcGFyYW0gb3B0cy5jb2xkSGlzdG9yeSAgY29sZCDqsr3roZzsnZggY29kZXggUmVzcG9uc2VJdGVtIOuwsOyXtChKc29uVmFsdWVbXSkuIHJlc3VtZSDqsr3roZzrqbQg66+47IKs7JqpLlxuICogQHBhcmFtIG9wdHMuaW5wdXQgICAgICAgIOyLpO2Wie2VoCBpbnB1dCDigJQgY29sZCDrqbQgY29sZElucHV0LCByZXN1bWUg66m0IHJldXNlSW5wdXQuXG4gKiBAcGFyYW0gb3B0cy5pc1Jlc3VtZSAgICAgcmVzdW1lIOqyveuhnCDsl6zrtoAuIHRydWUg66m0IGhpc3Rvcnkg7J6s7KO87J6FIOyXhuydtCBpbnB1dChkZWx0YSnrp4wuXG4gKlxuICog7Lac66ClIOq3nOy5mTpcbiAqICAtIOyLpO2WiSDqsIDriqXtlZwgYHR5cGU6XCJ1c2VyXCJgIOykhOydgCAqKu2VreyDgSDsoJXtmZXtnoggMeqwnCoqIOKAlCDrp4jsp4Drp4kgaW5wdXQuXG4gKiAgLSByZXN1bWU6IHVzZXIoZGVsdGEpIDHspITrp4wuIHRocmVhZCDqsIAg7J207KCEIHR1cm4g7J2EIOuIhOygge2VmOuvgOuhnCBoaXN0b3J5IOuvuO2PrO2VqC5cbiAqICAtIGNvbGQ6IGNvbGRIaXN0b3J5IOyghOyytOulvCAqKuuLqOydvCBhc3Npc3RhbnQgY29udGV4dCDthY3siqTtirgqKuuhnCDtj4ntg4TtmZQo7Iuk7ZaJIOyViCDrkKgpICsgdXNlcihpbnB1dCkgMeykhC5cbiAqICAgICAgICAgIHVzZXIvYXNzaXN0YW50L3Rvb2wg66qo65GQIO2Pie2DhO2ZlOuQmOuvgOuhnCDqs7zqsbAgdXNlci90b29sLW91dHB1dCDsnbQg7J6s7Iuk7ZaJ65CY7KeAIOyViuuKlOuLpC5cbiAqICAgICAgICAgIGZ1bGwtZmlkZWxpdHkgcm9sZSByZXBsYXkg6rCAIO2VhOyalO2VmOuptCBzZXNzaW9uIHJlc3VtZSDrmJDripQgSlNPTkwgYmFja3N0b3Ao67KU7JyEIOuwlikuXG4gKiAgLSB0b29sKGZ1bmN0aW9uX2NhbGwvb3V0cHV0KTogbmF0aXZlIOu4lOuhnSDsl4bsnbQg7Y+J7YOEIO2FjeyKpO2KuOuhnC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyZWFtSnNvbklucHV0KG9wdHM6IHtcbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICBpbnB1dDogQXJyYXk8VXNlcklucHV0PjtcbiAgaXNSZXN1bWU6IGJvb2xlYW47XG59KTogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+IHtcbiAgY29uc3QgbGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPiA9IFtdO1xuXG4gIC8vIGNvbGQg6rK966GcOiBoaXN0b3J5IOulvCDri6jsnbwgYXNzaXN0YW50IGNvbnRleHQg66GcIO2Pie2DhO2ZlCjsi6Ttlokg7JWIIOuQqCkuXG4gIGlmICghb3B0cy5pc1Jlc3VtZSAmJiBvcHRzLmNvbGRIaXN0b3J5ICYmIG9wdHMuY29sZEhpc3RvcnkubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGZsYXR0ZW5lZCA9IGZsYXR0ZW5Db2xkSGlzdG9yeShvcHRzLmNvbGRIaXN0b3J5KTtcbiAgICBpZiAoZmxhdHRlbmVkKSB7XG4gICAgICBsaW5lcy5wdXNoKHtcbiAgICAgICAgdHlwZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgbWVzc2FnZToge1xuICAgICAgICAgIHJvbGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgICAgY29udGVudDogdGV4dEJsb2NrKGBQcmlvciBjb252ZXJzYXRpb24gY29udGV4dDpcXG4ke2ZsYXR0ZW5lZH1gKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIOyLpO2Wie2VoCBpbnB1dCDigJQgcmVzdW1lL2NvbGQg6rO17Ya1LCDtla3sg4Eg66eI7KeA66eJ7J2YIOuLqOydvCB1c2VyIOykhC5cbiAgbGluZXMucHVzaCh7XG4gICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgbWVzc2FnZTogeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogdGV4dEJsb2NrKHVzZXJJbnB1dFRvVGV4dChvcHRzLmlucHV0KSkgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vLyBKU09OTCDrrLjsnpDsl7QoY2xhdWRlIHN0ZGluIOycvOuhnCDtnZjrprQg7ZiV7YOcKeuhnCDsp4HroKztmZQuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtSnNvbklucHV0KGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4pOiBzdHJpbmcge1xuICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG59XG5cbi8vIOKUgOKUgCDstpzroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIGNsYXVkZSAtcCAtLW91dHB1dC1mb3JtYXQgc3RyZWFtLWpzb24gLS12ZXJib3NlIOydmCBzdGRvdXQoSlNPTkwp7J2EXG4vLyBxZ3JpZCDshJzrsoQgZGVsdGEob25EZWx0YSkgKyDstZzsooUgcmVzdWx0IOuhnCDrs4DtmZjtlZzri6QuXG4vL1xuLy8g6rOE7JW9OlxuLy8gIC0g7J20IOyWtOuMke2EsOuKlCBxZ3JpZCAqKuyEnOuyhCoqIOqzhOy4teydtOuLpC4gQUkgU0RLIHN0cmVhbSBwYXJ0KHRleHQtZGVsdGEg65OxKeuKlFxuLy8gICAgcGFja2FnZXMvYWktc2RrKGNsaWVudCBwcm92aWRlcinqsIAg66eM65Og64ukIOKAlCDsl6zquLDshJwg66eM65Ok7KeAIOyViuuKlOuLpC5cbi8vICAtIHRleHRfZGVsdGEg4oaSIG9uRGVsdGEodGV4dCkuIHN0cnVjdHVyZWQgb3V0cHV0IOydvCDrlYwgaW5wdXRfanNvbl9kZWx0YS5wYXJ0aWFsX2pzb25cbi8vICAgIOyhsOqwgeuPhCBvbkRlbHRhKHRleHQpIOuhnCDtnZjrprDri6QoY2xpZW50IHByb3ZpZGVyIOqwgCBwYXJ0aWFsT2JqZWN0U3RyZWFtIOycvOuhnCDriITsoIEpLlxuLy8gIC0g7LWc7KKFIHJlc3VsdCDihpIgc3RydWN0dXJlZF9vdXRwdXQo7Jqw7ISgKSDrmJDripQgcmVzdWx0KO2PtOuwsSwg7J6Q7Jew7Ja0IOqwgOuKpSkgKyB1c2FnZSArIOyiheujjC5cbi8vICAtIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkL291dHB1dCA0IOy5tO2FjOqzoOumrOulvCDrsJvslYQgVG9rZW5Vc2FnZUJyZWFrZG93biDsnLzroZwuXG4vLyAgICBwYXlsb2FkIO2BrOq4sCDruYTqtZDripQgMyDsubTthYzqs6Drpqwg7ZWp7Jy866GcKOqzvOqxsCDtlZnsirUg4oCUIGlucHV0IOuLqOuPhSDruYTqtZAg66y07J2Y66+4KS5cblxuLy8gY2xhdWRlIHN0cmVhbS1qc29uIOy2nOugpeyXkOyEnCDsmrDrpqzqsIAg67O064qUIHVzYWdlIHNoYXBlKOu2gOu2hCkuIEFudGhyb3BpYyDrhKTsnbTti7DruIwg7ZWE65OcLlxuaW50ZXJmYWNlIENsYXVkZVVzYWdlIHtcbiAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zPzogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xufVxuXG4vLyDstZzsooUgcmVzdWx0IO2MjOyLsSDsgrDstpzrrLwuIGRpc3BhdGNoZXIoVTEp6rCAIEdlbmVyYXRlUmVzdWx0IOyhsOumveyXkCDsk7Tri6QuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVN0cmVhbVJlc3VsdCB7XG4gIHRleHQ6IHN0cmluZztcbiAgdXNhZ2U6IFByb3ZpZGVyVG9rZW5Vc2FnZUJyZWFrZG93bjtcbiAgZHVyYXRpb25NczogbnVtYmVyO1xuICBjb3N0VXNkOiBudW1iZXI7XG4gIC8vIHF1b3RhIOyGjOynhChcIllvdSd2ZSBoaXQgLi4uXCIpIOqwkOyngC4gZGlzcGF0Y2hlciDqsIAgUXVvdGFFcnJvciDroZwg67OA7ZmYLlxuICBxdW90YUV4aGF1c3RlZDogYm9vbGVhbjtcbiAgLy8gcmVzdWx0LmlzX2Vycm9yIC8gdGVybWluYWwgbW9kZWxfZXJyb3Ig65OxLiBkaXNwYXRjaGVyIOqwgCDsl5Drn6zroZwg67OA7ZmYLlxuICBpc0Vycm9yOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENsYXVkZVN0cmVhbUpzb25TdGF0ZSB7XG4gIHN0cnVjdHVyZWRPdXRwdXRUZXh0Pzogc3RyaW5nO1xufVxuXG4vLyBBbnRocm9waWMgdXNhZ2UgNCDsubTthYzqs6Drpqwg4oaSIFRva2VuVXNhZ2VCcmVha2Rvd24uXG4vLyBBbnRocm9waWMgbmF0aXZlIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkIOulvCDshJzroZwg67Cw7YOA7KCB7J24IOy5tO2FjOqzoOumrOuhnCDspIDri6QuXG4vLyDrsJjrqbQgcWdyaWQg64K067aAIO2RnOykgChUb2tlblVzYWdlQnJlYWtkb3duKeqzvCBjb3N0IOqzhOyCsOydgCBpbnB1dFRva2VucyDrpbwgXCLsoITssrQg7J6F66ClXG4vLyAoPSBub24tY2FjaGUgaW5wdXQgKyBjYWNoZSBjcmVhdGlvbiArIGNhY2hlIHJlYWQpXCIg7Jy866GcIOy3qOq4ie2VmOqzoCBjYWNoZWRJbnB1dFRva2Vucy9jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnNcbi8vIOulvCDqt7jspJEg6rCBIOuqq+ycvOuhnCDri6Tsi5wg7ZGc7Iuc7ZWc64ukKE9wZW5BSS9Db2RleCB1c2FnZSDsmYAg6rCZ7J2AIOydmOuvuCkuIOuUsOudvOyEnCDsl6zquLDshJwg7ZWp7LOQIO2RnOykgO2ZlO2VnOuLpC5cbmZ1bmN0aW9uIHRvVXNhZ2VCcmVha2Rvd24odTogQ2xhdWRlVXNhZ2UpOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24ge1xuICBjb25zdCBpbnB1dCA9IHUuaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlID0gdS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVSZWFkID0gdS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBvdXRwdXQgPSB1Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgdG90YWxJbnB1dCA9IGlucHV0ICsgY2FjaGVDcmVhdGUgKyBjYWNoZVJlYWQ7XG4gIHJldHVybiB7XG4gICAgdG90YWxUb2tlbnM6IHRvdGFsSW5wdXQgKyBvdXRwdXQsXG4gICAgaW5wdXRUb2tlbnM6IHRvdGFsSW5wdXQsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IGNhY2hlUmVhZCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGNhY2hlQ3JlYXRlLFxuICAgIG91dHB1dFRva2Vuczogb3V0cHV0LFxuICAgIHJlYXNvbmluZ091dHB1dFRva2VuczogMCxcbiAgfTtcbn1cblxuLy8gcmVzdWx0LnJlc3VsdCDsnZgg7L2U65Oc7Y6c7IqkKGBgYGpzb24gLi4uIGBgYCkg7KCc6rGwLiBzdHJ1Y3R1cmVkX291dHB1dCDsnbQg7JeG7J2EIOuVjOunjCDsk7Tri6QuXG4vLyDslZ7rkqQg6rO167CxL+qwnO2WieydhCDrqLzsoIAgdHJpbSDtlbQgYFxcbmBgYGpzb25cXG4uLi5cXG5gYGBcXG5gIOqwmeydgCDtmJXtg5zrj4Qg6rmo64GX7J20IOygnOqxsC5cbmZ1bmN0aW9uIHN0cmlwQ29kZUZlbmNlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoajogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVzc2FnZSA9IGFzT2JqZWN0KGoubWVzc2FnZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBtZXNzYWdlPy5jb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCByYXcgb2YgY29udGVudCkge1xuICAgIGNvbnN0IGJsb2NrID0gYXNPYmplY3QocmF3KTtcbiAgICBpZiAoIWJsb2NrKSBjb250aW51ZTtcbiAgICBpZiAoYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiICYmIGJsb2NrLm5hbWUgPT09IFwiU3RydWN0dXJlZE91dHB1dFwiICYmIGJsb2NrLmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShibG9jay5pbnB1dCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogc3RyZWFtLWpzb24g7Lac66ClIOudvOyduCDtlZjrgpjrpbwg7LKY66as7ZWc64ukLiDsiJzsiJgg7ZWo7IiYIOKAlCBzaWRlIGVmZmVjdCDripQgb25EZWx0YSDsvZzrsLHrv5AuXG4gKlxuICogQHBhcmFtIG9wdHMuc3RydWN0dXJlZE91dHB1dCAgc3RydWN0dXJlZCBvdXRwdXQoanNvblNjaGVtYSkg66qo65OcIOyXrOu2gC5cbiAqICAgc3RydWN0dXJlZCDrqqjrk5zsl5DshJwgQ2xhdWRlIOuKlCDsnpDsl7DslrQgdGV4dF9kZWx0YSDsmYAgaW5wdXRfanNvbl9kZWx0YS5wYXJ0aWFsX2pzb24g7J2EXG4gKiAgICoq7ZWo6ruYKiog7Z2Y66a0IOyImCDsnojri6QoUG9DIO2ZleyduCkuIOydtOuVjCB0ZXh0X2RlbHRhIOulvCDqt7jrjIDroZwgb25EZWx0YSDroZwg67O064K066m0IGNsaWVudCDsnZhcbiAqICAgc3RyZWFtT2JqZWN0IO2MjOyEnOqwgCBwcm9zZSDrpbwgSlNPTiDslZ7sl5DshJwg66eM64KYIOq5qOynhOuLpC4g6re4656Y7IScOlxuICogICAgIC0gc3RydWN0dXJlZCDrqqjrk5w6IHRleHRfZGVsdGEg66y07IucLCBwYXJ0aWFsX2pzb24g66eMIG9uRGVsdGEuXG4gKiAgICAgLSB0ZXh0IOuqqOuTnDogdGV4dF9kZWx0YSDrp4wgb25EZWx0YSAocGFydGlhbF9qc29uIOydgCDslYgg7Ji0KS5cbiAqXG4gKiBAcmV0dXJucyByZXN1bHQg7J2067Kk7Yq466m0IENsYXVkZVN0cmVhbVJlc3VsdCwg6re4IOyZuChkZWx0YS9zeXN0ZW0g65OxKeuptCBudWxsLlxuICogICAgICAgICAg7Zi47Lac67aA64qUIOudvOyduCDsiqTtirjrprzsnYQg64+M66mwIOydtCDtlajsiJjrpbwg7Zi47Lac7ZWY6rOgLCBub24tbnVsbCDsnbQg64KY7Jik66m0IOyiheujjC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhbmRsZVN0cmVhbUpzb25MaW5lKFxuICBsaW5lOiBzdHJpbmcsXG4gIG9uRGVsdGE6ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQsXG4gIG9wdHM/OiB7IHN0cnVjdHVyZWRPdXRwdXQ/OiBib29sZWFuOyBzdGF0ZT86IENsYXVkZVN0cmVhbUpzb25TdGF0ZSB9LFxuKTogQ2xhdWRlU3RyZWFtUmVzdWx0IHwgbnVsbCB7XG4gIGNvbnN0IHN0cnVjdHVyZWRPdXRwdXQgPSBvcHRzPy5zdHJ1Y3R1cmVkT3V0cHV0ID8/IGZhbHNlO1xuICBjb25zdCBzdGF0ZSA9IG9wdHM/LnN0YXRlO1xuICBjb25zdCB0cmltbWVkID0gbGluZS50cmltKCk7XG4gIGlmICghdHJpbW1lZCkgcmV0dXJuIG51bGw7XG5cbiAgbGV0IGo6IHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIH07XG4gIHRyeSB7XG4gICAgaiA9IEpTT04ucGFyc2UodHJpbW1lZCkgYXMgeyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcbiAgfSBjYXRjaCB7XG4gICAgLy8g6rmo7KeEIEpTT04g65287J247J2AIGdyYWNlZnVsIHNraXAuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDsoJDsp4QgZGVsdGE6IHN0cmVhbV9ldmVudCA+IGNvbnRlbnRfYmxvY2tfZGVsdGEgPiB7dGV4dF9kZWx0YSB8IGlucHV0X2pzb25fZGVsdGF9LlxuICBpZiAoai50eXBlID09PSBcInN0cmVhbV9ldmVudFwiKSB7XG4gICAgY29uc3QgZXZlbnQgPSBhc09iamVjdChqLmV2ZW50KTtcbiAgICBpZiAoZXZlbnQgJiYgZXZlbnQudHlwZSA9PT0gXCJjb250ZW50X2Jsb2NrX2RlbHRhXCIpIHtcbiAgICAgIGNvbnN0IGRlbHRhID0gYXNPYmplY3QoZXZlbnQuZGVsdGEpO1xuICAgICAgaWYgKGRlbHRhKSB7XG4gICAgICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0KSB7XG4gICAgICAgICAgLy8gc3RydWN0dXJlZDogSlNPTiDsobDqsIHrp4wuIOyekOyXsOyWtCB0ZXh0X2RlbHRhIOuKlCDrsoTrprDri6Qoc3RyZWFtT2JqZWN0IO2MjOyEnCDrs7TtmLgpLlxuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcImlucHV0X2pzb25fZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEucGFydGlhbF9qc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvbkRlbHRhKGRlbHRhLnBhcnRpYWxfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRleHQ6IOyekOyXsOyWtCBkZWx0YSDrp4wuXG4gICAgICAgICAgaWYgKGRlbHRhLnR5cGUgPT09IFwidGV4dF9kZWx0YVwiICYmIHR5cGVvZiBkZWx0YS50ZXh0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvbkRlbHRhKGRlbHRhLnRleHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwiYXNzaXN0YW50XCIgJiYgc3RydWN0dXJlZE91dHB1dCAmJiBzdGF0ZSAmJiBzdGF0ZS5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgdGV4dCA9IHN0cnVjdHVyZWRPdXRwdXRUb29sVXNlVGV4dChqKTtcbiAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSBzdGF0ZS5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA9IHRleHQ7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyDstZzsooUgcmVzdWx0LlxuICBpZiAoai50eXBlID09PSBcInJlc3VsdFwiKSB7XG4gICAgbGV0IHRleHQ6IHN0cmluZztcbiAgICBjb25zdCBwcmVzZXJ2ZWRTdHJ1Y3R1cmVkT3V0cHV0ID0gc3RydWN0dXJlZE91dHB1dCA/IHN0YXRlPy5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA6IHVuZGVmaW5lZDtcbiAgICBpZiAocHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0ID0gcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dDtcbiAgICB9IGVsc2UgaWYgKGouc3RydWN0dXJlZF9vdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KGouc3RydWN0dXJlZF9vdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0ZXh0ID0gc3RyaXBDb2RlRmVuY2UodHlwZW9mIGoucmVzdWx0ID09PSBcInN0cmluZ1wiID8gai5yZXN1bHQgOiBcIlwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB1c2FnZSA9IHRvVXNhZ2VCcmVha2Rvd24oKGFzT2JqZWN0KGoudXNhZ2UpID8/IHt9KSBhcyBDbGF1ZGVVc2FnZSk7XG4gICAgY29uc3QgcXVvdGFFeGhhdXN0ZWQgPSB0ZXh0LnN0YXJ0c1dpdGgoXCJZb3UndmUgaGl0XCIpO1xuICAgIC8vIOyXkOufrCDtjJDsoJU6IGlzX2Vycm9yIHRydWUsIHRlcm1pbmFsIG1vZGVsX2Vycm9yLFxuICAgIC8vIOuYkOuKlCBzdWJ0eXBlIOydtCDsnojqs6AgXCJzdWNjZXNzXCIg6rCAIOyVhOuLiOuptChlcnJvcl9kdXJpbmdfZXhlY3V0aW9uIC8gZXJyb3JfbWF4X3R1cm5zIC9cbiAgICAvLyBlcnJvcl9tYXhfYnVkZ2V0X3VzZCAvIGVycm9yX21heF9zdHJ1Y3R1cmVkX291dHB1dF9yZXRyaWVzIOuTsSkg7JeQ65+s66GcIOuzuOuLpC5cbiAgICBjb25zdCBzdWJ0eXBlID0gdHlwZW9mIGouc3VidHlwZSA9PT0gXCJzdHJpbmdcIiA/IGouc3VidHlwZSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzdHJ1Y3R1cmVkTWF4VHVybnNDb21wbGV0ZWQgPVxuICAgICAgcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoc3VidHlwZSA9PT0gXCJlcnJvcl9tYXhfdHVybnNcIiB8fCBqLnRlcm1pbmFsX3JlYXNvbiA9PT0gXCJtYXhfdHVybnNcIik7XG4gICAgY29uc3QgaXNFcnJvciA9XG4gICAgICAhc3RydWN0dXJlZE1heFR1cm5zQ29tcGxldGVkICYmXG4gICAgICAoai5pc19lcnJvciA9PT0gdHJ1ZSB8fFxuICAgICAgICBqLnRlcm1pbmFsX3JlYXNvbiA9PT0gXCJtb2RlbF9lcnJvclwiIHx8XG4gICAgICAgIChzdWJ0eXBlICE9PSB1bmRlZmluZWQgJiYgc3VidHlwZSAhPT0gXCJzdWNjZXNzXCIpKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0LFxuICAgICAgdXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiB0eXBlb2Ygai5kdXJhdGlvbl9tcyA9PT0gXCJudW1iZXJcIiA/IGouZHVyYXRpb25fbXMgOiAwLFxuICAgICAgY29zdFVzZDogdHlwZW9mIGoudG90YWxfY29zdF91c2QgPT09IFwibnVtYmVyXCIgPyBqLnRvdGFsX2Nvc3RfdXNkIDogMCxcbiAgICAgIHF1b3RhRXhoYXVzdGVkLFxuICAgICAgaXNFcnJvcixcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBOENBLFNBQVMsZ0JBQWdCLE9BQWlDO0FBQ3hELFFBQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxPQUFPLENBQzNFLEtBQUssTUFBTSxFQUFFLEtBQUssQ0FDbEIsS0FBSyxLQUFLOztBQUlmLFNBQVMsVUFBVSxNQUFxRDtBQUN0RSxRQUFPLENBQUM7RUFBRSxNQUFNO0VBQVE7RUFBTSxDQUFDOztBQVdqQyxTQUFTLFNBQVMsR0FBK0M7QUFDL0QsUUFBTyxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsQ0FBQyxNQUFNLFFBQVEsRUFBRSxHQUFJLElBQXFCOztBQUsxRixTQUFTLGlCQUFpQixNQUE0QjtDQUNwRCxNQUFNLFVBQVUsS0FBSztBQUNyQixLQUFJLENBQUMsTUFBTSxRQUFRLFFBQVEsQ0FBRSxRQUFPO0FBQ3BDLFFBQU8sUUFDSixLQUFLLE1BQU07RUFDVixNQUFNLE1BQU0sU0FBUyxFQUFFO0FBQ3ZCLFNBQU8sT0FBTyxPQUFPLElBQUksU0FBUyxXQUFXLElBQUksT0FBTztHQUN4RCxDQUNELE9BQU8sUUFBUSxDQUNmLEtBQUssS0FBSzs7Ozs7OztBQVFmLFNBQVMsbUJBQW1CLGFBQXVDO0NBQ2pFLE1BQU0sUUFBdUIsRUFBRTtBQUMvQixNQUFLLE1BQU0sT0FBTyxhQUFhO0VBQzdCLE1BQU0sT0FBTyxTQUFTLElBQUk7QUFDMUIsTUFBSSxDQUFDLEtBQU07QUFFWCxNQUFJLEtBQUssU0FBUyxhQUFhLEtBQUssU0FBUyxZQUMzQyxPQUFNLEtBQUssY0FBYyxpQkFBaUIsS0FBSyxHQUFHO1dBQ3pDLEtBQUssU0FBUyxhQUFhLEtBQUssU0FBUyxPQUNsRCxPQUFNLEtBQUssU0FBUyxpQkFBaUIsS0FBSyxHQUFHO1dBQ3BDLEtBQUssU0FBUyxpQkFBaUI7R0FDeEMsTUFBTSxPQUFPLE9BQU8sS0FBSyxTQUFTLFdBQVcsS0FBSyxP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
147
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7IHR5cGUgUHJvdmlkZXJUb2tlblVzYWdlQnJlYWtkb3duIH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5cbi8vIOKUgOKUgCDsnoXroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vLyBDbGF1ZGUgc3RyZWFtLWpzb24g7J6F66ClIO2VnCDspIQoSlNPTkwpLiBFbnZlbG9wZSBmaWVsZHMgYXJlIGFkZGVkIGluIGNsYXVkZS1zZXNzaW9uLlxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uTGluZSB7XG4gIHR5cGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIjtcbiAgbWVzc2FnZToge1xuICAgIHJvbGU6IFwidXNlclwiIHwgXCJhc3Npc3RhbnRcIjtcbiAgICBjb250ZW50OiBBcnJheTx7IHR5cGU6IFwidGV4dFwiOyB0ZXh0OiBzdHJpbmcgfT47XG4gIH07XG59XG5cbmZ1bmN0aW9uIHVzZXJJbnB1dFRvVGV4dChpbnB1dDogQXJyYXk8VXNlcklucHV0Pik6IHN0cmluZyB7XG4gIHJldHVybiBpbnB1dFxuICAgIC5maWx0ZXIoKGkpOiBpIGlzIEV4dHJhY3Q8VXNlcklucHV0LCB7IHR5cGU6IFwidGV4dFwiIH0+ID0+IGkudHlwZSA9PT0gXCJ0ZXh0XCIpXG4gICAgLm1hcCgoaSkgPT4gaS50ZXh0KVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiB0ZXh0QmxvY2sodGV4dDogc3RyaW5nKTogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+IHtcbiAgcmV0dXJuIFt7IHR5cGU6IFwidGV4dFwiLCB0ZXh0IH1dO1xufVxuXG4vLyBjb2RleCBSZXNwb25zZUl0ZW0oY29sZEhpc3RvcnkgaXRlbSkg7LWc7IaMIHNoYXBlLlxuLy8gZXh0cmFjdFByb21wdEFuZEhpc3RvcnkoYWktc2RrL3V0aWxzLnRzKSDqsIAg66eM65Oc64qUIO2YleyLnTpcbi8vICAgeyB0eXBlOlwibWVzc2FnZVwiLCByb2xlOlwidXNlclwiLCBjb250ZW50Olt7dHlwZTpcImlucHV0X3RleHRcIiwgdGV4dH1dIH1cbi8vICAgeyB0eXBlOlwibWVzc2FnZVwiLCByb2xlOlwiYXNzaXN0YW50XCIsIGNvbnRlbnQ6W3t0eXBlOlwib3V0cHV0X3RleHRcIiwgdGV4dH1dIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbFwiLCBuYW1lLCBhcmd1bWVudHMsIGNhbGxfaWQgfVxuLy8gICB7IHR5cGU6XCJmdW5jdGlvbl9jYWxsX291dHB1dFwiLCBjYWxsX2lkLCBvdXRwdXQgfVxudHlwZSBSZXNwb25zZUl0ZW0gPSB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuXG5mdW5jdGlvbiBhc09iamVjdCh2OiBKc29uVmFsdWUgfCB1bmRlZmluZWQpOiBSZXNwb25zZUl0ZW0gfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodikgPyAodiBhcyBSZXNwb25zZUl0ZW0pIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gcmVzcG9uc2VJdGVtVGV4dChpdGVtOiBSZXNwb25zZUl0ZW0pOiBzdHJpbmcge1xuICBjb25zdCBjb250ZW50ID0gaXRlbS5jb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiBcIlwiO1xuICByZXR1cm4gY29udGVudFxuICAgIC5tYXAoKGMpID0+IHtcbiAgICAgIGNvbnN0IG9iaiA9IGFzT2JqZWN0KGMpO1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2Ygb2JqLnRleHQgPT09IFwic3RyaW5nXCIgPyBvYmoudGV4dCA6IFwiXCI7XG4gICAgfSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgLmpvaW4oXCJcXG5cIik7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5Db2xkSGlzdG9yeShjb2xkSGlzdG9yeTogQXJyYXk8SnNvblZhbHVlPik6IHN0cmluZyB7XG4gIGNvbnN0IHBhcnRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGZvciAoY29uc3QgcmF3IG9mIGNvbGRIaXN0b3J5KSB7XG4gICAgY29uc3QgaXRlbSA9IGFzT2JqZWN0KHJhdyk7XG4gICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgIGlmIChpdGVtLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGl0ZW0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIikge1xuICAgICAgcGFydHMucHVzaChgQXNzaXN0YW50OiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwibWVzc2FnZVwiICYmIGl0ZW0ucm9sZSA9PT0gXCJ1c2VyXCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYFVzZXI6ICR7cmVzcG9uc2VJdGVtVGV4dChpdGVtKX1gKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIpIHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0eXBlb2YgaXRlbS5uYW1lID09PSBcInN0cmluZ1wiID8gaXRlbS5uYW1lIDogXCJcIjtcbiAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICB0eXBlb2YgaXRlbS5hcmd1bWVudHMgPT09IFwic3RyaW5nXCIgPyBpdGVtLmFyZ3VtZW50cyA6IEpTT04uc3RyaW5naWZ5KGl0ZW0uYXJndW1lbnRzID8/IHt9KTtcbiAgICAgIHBhcnRzLnB1c2goYFRvb2wgY2FsbDogJHtuYW1lfSgke2FyZ3N9KWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcImZ1bmN0aW9uX2NhbGxfb3V0cHV0XCIpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgIHR5cGVvZiBpdGVtLm91dHB1dCA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ub3V0cHV0IDogSlNPTi5zdHJpbmdpZnkoaXRlbS5vdXRwdXQgPz8gXCJcIik7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIHJlc3VsdDogJHtvdXRwdXR9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwYXJ0cy5qb2luKFwiXFxuXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRTdHJlYW1Kc29uSW5wdXQob3B0czoge1xuICBjb2xkSGlzdG9yeT86IEFycmF5PEpzb25WYWx1ZT47XG4gIGlucHV0OiBBcnJheTxVc2VySW5wdXQ+O1xufSk6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPiB7XG4gIGNvbnN0IGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4gPSBbXTtcblxuICBpZiAob3B0cy5jb2xkSGlzdG9yeSAmJiBvcHRzLmNvbGRIaXN0b3J5Lmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBmbGF0dGVuZWQgPSBmbGF0dGVuQ29sZEhpc3Rvcnkob3B0cy5jb2xkSGlzdG9yeSk7XG4gICAgaWYgKGZsYXR0ZW5lZCkge1xuICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgIHR5cGU6IFwiYXNzaXN0YW50XCIsXG4gICAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgICByb2xlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICAgIGNvbnRlbnQ6IHRleHRCbG9jayhgUHJpb3IgY29udmVyc2F0aW9uIGNvbnRleHQ6XFxuJHtmbGF0dGVuZWR9YCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBsaW5lcy5wdXNoKHtcbiAgICB0eXBlOiBcInVzZXJcIixcbiAgICBtZXNzYWdlOiB7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiB0ZXh0QmxvY2sodXNlcklucHV0VG9UZXh0KG9wdHMuaW5wdXQpKSB9LFxuICB9KTtcblxuICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVTdHJlYW1Kc29uSW5wdXQobGluZXM6IEFycmF5PENsYXVkZVN0cmVhbUpzb25MaW5lPik6IHN0cmluZyB7XG4gIHJldHVybiBsaW5lcy5tYXAoKGwpID0+IEpTT04uc3RyaW5naWZ5KGwpKS5qb2luKFwiXFxuXCIpICsgXCJcXG5cIjtcbn1cblxuLy8g4pSA4pSAIOy2nOugpSDslrTrjJHthLAg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gQ2xhdWRlIHN0ZG91dChKU09OTCnsnYQgcWdyaWQgZGVsdGFzICsgZmluYWwgcmVzdWx0IOuhnCDrs4DtmZjtlZzri6QuXG5cbmludGVyZmFjZSBDbGF1ZGVVc2FnZSB7XG4gIGlucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICBjYWNoZV9yZWFkX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgY29zdFVzZDogbnVtYmVyO1xuICAvLyBxdW90YSDshozsp4QoXCJZb3UndmUgaGl0IC4uLlwiKSDqsJDsp4AuIGRpc3BhdGNoZXIg6rCAIFF1b3RhRXJyb3Ig66GcIOuzgO2ZmC5cbiAgcXVvdGFFeGhhdXN0ZWQ6IGJvb2xlYW47XG4gIC8vIHJlc3VsdC5pc19lcnJvciAvIHRlcm1pbmFsIG1vZGVsX2Vycm9yIOuTsS4gZGlzcGF0Y2hlciDqsIAg7JeQ65+s66GcIOuzgO2ZmC5cbiAgaXNFcnJvcjogYm9vbGVhbjtcbiAgLy8g7KeE64uo7JqpOiBDQyByZXN1bHQg65287J247J2YIHN1YnR5cGUoXCJzdWNjZXNzXCIgfCBcImVycm9yX21heF90dXJuc1wiIHwgLi4uKSDqs7wgdGVybWluYWxfcmVhc29uLlxuICAvLyBpc0Vycm9yIO2MkOyglSDsgqzsnKDrpbwg7JeQ65+sIOuplOyLnOyngOyXkCDrk5zrn6zrgrTquLAg7JyE7ZW0IOuztOyhtO2VnOuLpChTT04tNDk1KS5cbiAgc3VidHlwZT86IHN0cmluZztcbiAgdGVybWluYWxSZWFzb24/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHtcbiAgc3RydWN0dXJlZE91dHB1dFRleHQ/OiBzdHJpbmc7XG59XG5cbi8vIEFudGhyb3BpYyB1c2FnZSA0IOy5tO2FjOqzoOumrCDihpIgVG9rZW5Vc2FnZUJyZWFrZG93bi5cbi8vIEFudGhyb3BpYyBuYXRpdmUgdXNhZ2Ug64qUIGlucHV0L2NhY2hlX2NyZWF0aW9uL2NhY2hlX3JlYWQg66W8IOyEnOuhnCDrsLDtg4DsoIHsnbgg7Lm07YWM6rOg66as66GcIOykgOuLpC5cbi8vIOuwmOuptCBxZ3JpZCDrgrTrtoAg7ZGc7KSAKFRva2VuVXNhZ2VCcmVha2Rvd24p6rO8IGNvc3Qg6rOE7IKw7J2AIGlucHV0VG9rZW5zIOulvCBcIuyghOyytCDsnoXroKVcbi8vICg9IG5vbi1jYWNoZSBpbnB1dCArIGNhY2hlIGNyZWF0aW9uICsgY2FjaGUgcmVhZClcIiDsnLzroZwg7Leo6riJ7ZWY6rOgIGNhY2hlZElucHV0VG9rZW5zL2NhY2hlQ3JlYXRpb25JbnB1dFRva2Vuc1xuLy8g66W8IOq3uOykkSDqsIEg66qr7Jy866GcIOuLpOyLnCDtkZzsi5ztlZzri6QoT3BlbkFJL0NvZGV4IHVzYWdlIOyZgCDqsJnsnYAg7J2Y66+4KS4g65Sw65287IScIOyXrOq4sOyEnCDtlanss5Ag7ZGc7KSA7ZmU7ZWc64ukLlxuZnVuY3Rpb24gdG9Vc2FnZUJyZWFrZG93bih1OiBDbGF1ZGVVc2FnZSk6IFByb3ZpZGVyVG9rZW5Vc2FnZUJyZWFrZG93biB7XG4gIGNvbnN0IGlucHV0ID0gdS5pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGUgPSB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBjYWNoZVJlYWQgPSB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IG91dHB1dCA9IHUub3V0cHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCB0b3RhbElucHV0ID0gaW5wdXQgKyBjYWNoZUNyZWF0ZSArIGNhY2hlUmVhZDtcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFRva2VuczogdG90YWxJbnB1dCArIG91dHB1dCxcbiAgICBpbnB1dFRva2VuczogdG90YWxJbnB1dCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGUsXG4gICAgb3V0cHV0VG9rZW5zOiBvdXRwdXQsXG4gICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICB9O1xufVxuXG5mdW5jdGlvbiBzdHJpcENvZGVGZW5jZShzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc1xuICAgIC50cmltKClcbiAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gc3RydWN0dXJlZE91dHB1dFRvb2xVc2VUZXh0KGo6IFJlc3BvbnNlSXRlbSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1lc3NhZ2UgPSBhc09iamVjdChqLm1lc3NhZ2UpO1xuICBjb25zdCBjb250ZW50ID0gbWVzc2FnZT8uY29udGVudDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgcmF3IG9mIGNvbnRlbnQpIHtcbiAgICBjb25zdCBibG9jayA9IGFzT2JqZWN0KHJhdyk7XG4gICAgaWYgKCFibG9jaykgY29udGludWU7XG4gICAgaWYgKFxuICAgICAgYmxvY2sudHlwZSA9PT0gXCJ0b29sX3VzZVwiICYmXG4gICAgICBibG9jay5uYW1lID09PSBcIlN0cnVjdHVyZWRPdXRwdXRcIiAmJlxuICAgICAgYmxvY2suaW5wdXQgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGJsb2NrLmlucHV0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLy8gUHJvY2Vzc2VzIG9uZSBDbGF1ZGUgc3Rkb3V0IEpTT05MIGxpbmUuIFJldHVybnMgZmluYWwgcmVzdWx0IG9uIHJlc3VsdCBldmVudC5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVTdHJlYW1Kc29uTGluZShcbiAgbGluZTogc3RyaW5nLFxuICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICBvcHRzPzogeyBzdHJ1Y3R1cmVkT3V0cHV0PzogYm9vbGVhbjsgc3RhdGU/OiBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUgfSxcbik6IENsYXVkZVN0cmVhbVJlc3VsdCB8IG51bGwge1xuICBjb25zdCBzdHJ1Y3R1cmVkT3V0cHV0ID0gb3B0cz8uc3RydWN0dXJlZE91dHB1dCA/PyBmYWxzZTtcbiAgY29uc3Qgc3RhdGUgPSBvcHRzPy5zdGF0ZTtcbiAgY29uc3QgdHJpbW1lZCA9IGxpbmUudHJpbSgpO1xuICBpZiAoIXRyaW1tZWQpIHJldHVybiBudWxsO1xuXG4gIGxldCBqOiB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuICB0cnkge1xuICAgIGogPSBKU09OLnBhcnNlKHRyaW1tZWQpIGFzIHsgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJzdHJlYW1fZXZlbnRcIikge1xuICAgIGNvbnN0IGV2ZW50ID0gYXNPYmplY3Qoai5ldmVudCk7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnR5cGUgPT09IFwiY29udGVudF9ibG9ja19kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcbiAgICAgIGlmIChkZWx0YSkge1xuICAgICAgICBpZiAoc3RydWN0dXJlZE91dHB1dCkge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcImlucHV0X2pzb25fZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEucGFydGlhbF9qc29uID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBvbkRlbHRhKGRlbHRhLnBhcnRpYWxfanNvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChkZWx0YS50eXBlID09PSBcInRleHRfZGVsdGFcIiAmJiB0eXBlb2YgZGVsdGEudGV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb25EZWx0YShkZWx0YS50ZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoXG4gICAgai50eXBlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgc3RydWN0dXJlZE91dHB1dCAmJlxuICAgIHN0YXRlICYmXG4gICAgc3RhdGUuc3RydWN0dXJlZE91dHB1dFRleHQgPT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBjb25zdCB0ZXh0ID0gc3RydWN0dXJlZE91dHB1dFRvb2xVc2VUZXh0KGopO1xuICAgIGlmICh0ZXh0ICE9PSB1bmRlZmluZWQpIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID0gdGV4dDtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICBsZXQgdGV4dDogc3RyaW5nO1xuICAgIGNvbnN0IHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQgPSBzdHJ1Y3R1cmVkT3V0cHV0ID8gc3RhdGU/LnN0cnVjdHVyZWRPdXRwdXRUZXh0IDogdW5kZWZpbmVkO1xuICAgIGlmIChwcmVzZXJ2ZWRTdHJ1Y3R1cmVkT3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBwcmVzZXJ2ZWRTdHJ1Y3R1cmVkT3V0cHV0O1xuICAgIH0gZWxzZSBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0ZXh0ID0gSlNPTi5zdHJpbmdpZnkoai5zdHJ1Y3R1cmVkX291dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHQgPSBzdHJpcENvZGVGZW5jZSh0eXBlb2Ygai5yZXN1bHQgPT09IFwic3RyaW5nXCIgPyBqLnJlc3VsdCA6IFwiXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHVzYWdlID0gdG9Vc2FnZUJyZWFrZG93bigoYXNPYmplY3Qoai51c2FnZSkgPz8ge30pIGFzIENsYXVkZVVzYWdlKTtcbiAgICBjb25zdCBxdW90YUV4aGF1c3RlZCA9IHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIik7XG4gICAgY29uc3Qgc3VidHlwZSA9IHR5cGVvZiBqLnN1YnR5cGUgPT09IFwic3RyaW5nXCIgPyBqLnN1YnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGVybWluYWxSZWFzb24gPSB0eXBlb2Ygai50ZXJtaW5hbF9yZWFzb24gPT09IFwic3RyaW5nXCIgPyBqLnRlcm1pbmFsX3JlYXNvbiA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFNPTi00OTU6IOu5hOygleyDgSDsooXro4woZXJyb3JfbWF4X3N0cnVjdHVyZWRfb3V0cHV0X3JldHJpZXMg65OxKeuKlCDsoJXsp4HtlZjqsowg7JeQ65+s66GcIOyymOumrO2VnOuLpC5cbiAgICAvLyBDQyBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J20IOyVhOuLiOudvCBcInRvb2wgaW5wdXQg7IOd7ISxIO2bhCDsgqztm4QgQUpWIOqygOymnVwi7J206528XG4gICAgLy8g66qo64247J20IOqwgOuBlCBwbGFjZWhvbGRlcigkUEFSQU1FVEVSX05BTUUpwrfqsbDrtoAoXCJqdXN0IGtpZGRpbmdcIinCt+2VhOuTnCDriITrnb0oYWR2YW5jZSkg6rCZ7J2AIOuwnOyekS9cbiAgICAvLyDrtojsmYTsoIQg7Lac66Cl7J2EIOuCuOuLpC4g7J2066W8IFwi6rGw7J2YIOunnuyVmOycvOuLiCDsgrTrpqzsnpBcIuqzoCDtnZjrpqzrqbQg7YG065287J207Ja47Yq4IOqygOymneyXkOyEnCDquajsp4DqsbDrgpgo7ZWE65OcIOuIhOudvSlcbiAgICAvLyDsk7DroIjquLDqsIAg7IOI7Ja0IOuCmOqwhOuLpCjsi6TsuKEgMTE2NzQvMTE2NzUpLiDslYzroKTsp4QgYmVzdCBwcmFjdGljZShyZWZ1c2FsL2RlZ2VuZXJhdGUgb3V0cHV0IOydgCDsgrTrpqzsp4BcbiAgICAvLyDrp5Dqs6AgZ3JhY2VmdWwgZXJyb3Ip64yA66GcLCBzdWJ0eXBlICE9IHN1Y2Nlc3Mg64qUIOq3uOuMgOuhnCDsl5Drn6zroZwg65GU64ukLiDtgbTrnbzsnbTslrjtirjqsIAg6re4IO2EtOydhCDsi6TtjKjroZxcbiAgICAvLyDri6Tro6jqsowg7ZWc64ukKOyKpO2KuOumvOydtOudvCDsnpDrj5kg7J6s7Iuc64+EIOyXhuydjCDigJQg7Iuc6rCEIDLrsLAg67Cp7KeAKS5cbiAgICBjb25zdCBpc0Vycm9yID1cbiAgICAgIGouaXNfZXJyb3IgPT09IHRydWUgfHxcbiAgICAgIGoudGVybWluYWxfcmVhc29uID09PSBcIm1vZGVsX2Vycm9yXCIgfHxcbiAgICAgIChzdWJ0eXBlICE9PSB1bmRlZmluZWQgJiYgc3VidHlwZSAhPT0gXCJzdWNjZXNzXCIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQsXG4gICAgICB1c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IHR5cGVvZiBqLmR1cmF0aW9uX21zID09PSBcIm51bWJlclwiID8gai5kdXJhdGlvbl9tcyA6IDAsXG4gICAgICBjb3N0VXNkOiB0eXBlb2Ygai50b3RhbF9jb3N0X3VzZCA9PT0gXCJudW1iZXJcIiA/IGoudG90YWxfY29zdF91c2QgOiAwLFxuICAgICAgcXVvdGFFeGhhdXN0ZWQsXG4gICAgICBpc0Vycm9yLFxuICAgICAgc3VidHlwZSxcbiAgICAgIHRlcm1pbmFsUmVhc29uLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJd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
@@ -133,7 +133,8 @@ const DEFAULT_COSTS = {
133
133
  cachedInputTokens: .3
134
134
  };
135
135
  function getModelCosts(model) {
136
- return OPENAI_COSTS[model] ?? ANTHROPIC_COSTS[model] ?? DEFAULT_COSTS;
136
+ const normalizedModel = model.replace(/\[1m\]$/i, "");
137
+ return OPENAI_COSTS[normalizedModel] ?? ANTHROPIC_COSTS[normalizedModel] ?? DEFAULT_COSTS;
137
138
  }
138
139
  function calculateCostUsd(model, usage) {
139
140
  const costs = getModelCosts(model);
@@ -151,4 +152,4 @@ function calculateCostUsd(model, usage) {
151
152
  //#endregion
152
153
  export { calculateCostUsd, getModelCosts };
153
154
 
154
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBsb25nLWNvbnRleHQg7ZWg7KadLiDsoITssrQg7J6F66ClIO2GoO2BsChpbnB1dF90b2tlbnMsIGNhY2hlX3JlYWQg7Y+s7ZWoKeydtCB0aHJlc2hvbGQg7LSI6rO8IOyLnFxuICAgKiDstIjqs7zrtoTrp4zsnbQg7JWE64uI6528IOyalOyyrSDsoITssrQoZnVsbCBzZXNzaW9uKeyXkCDrsLDsnKgg7KCB7JqpLlxuICAgKi9cbiAgbG9uZ0NvbnRleHQ/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgaW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgb3V0cHV0TXVsdGlwbGllcjogbnVtYmVyO1xuICB9O1xufVxuXG4vLyDilIDilIAgT3BlbkFJIOKAlCBjb2RleCBhcHAtc2VydmVyIOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOuqqOuNuCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyDqsIDqsqkg7Lac7LKYOiBodHRwczovL29wZW5haS5jb20vYXBpL3ByaWNpbmcgKDIwMjYtMDYtMTEg7ZmV7J24KVxuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG5jb25zdCBPUEVOQUlfQ09TVFM6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29zdHM+ID0ge1xuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNS8gKDIwMjYtMDQg7Lac7IucKVxuICBcImdwdC01LjVcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMzAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS00LyAoMjAyNi0wMyDstpzsi5wpXG4gIFwiZ3B0LTUuNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDIuNSxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS40LW1pbmlcIjogeyBpbnB1dFRva2VuczogMC43NSwgb3V0cHV0VG9rZW5zOiA0LjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA3NSB9LFxuICAvLyBncHQtNS4y7JmAIOuPmeydvCDri6jqsIAgKGNhY2hlZCA9IGlucHV07J2YIDEwJSlcbiAgXCJncHQtNS4zLWNvZGV4XCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtMi8gKGNhY2hlZCBpbnB1dCA5MCUg7ZWg7J24IOuqheyLnClcbiAgXCJncHQtNS4yXCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxufTtcblxuLy8g4pSA4pSAIEFudGhyb3BpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgQU5USFJPUElDX0NPU1RTOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvc3RzPiA9IHtcbiAgLy8gQ2xhdWRlIENvZGUg64qUIOuzhOuPhCB0dGw6XCIxaFwiIOyYteyFmCDsl4bsnbQg7Iuk7ZaJ65CY66+A66GcIGZhbGxiYWNrIOqwgOqyqe2RnOuKlCA167aEIGNhY2hlIHdyaXRlKDEuMjV4KeulvCDquLDspIDsnLzroZwg65GU64ukLlxuICAvLyAx7Iuc6rCEIGNhY2hlIHdyaXRlIOuKlCBpbnB1dCAyeCDsnbTsp4Drp4wg7ZiE7J6sIHFncmlkIOyLpO2WiSDqsr3roZzsnZgg6riw67O46rCS7J20IOyVhOuLiOuLpC5cbiAgc29ubmV0OiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtMy01LWhhaWt1XCI6IHtcbiAgICBpbnB1dFRva2VuczogMC44LFxuICAgIG91dHB1dFRva2VuczogNCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wOCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDEsXG4gIH0sXG4gIFwiY2xhdWRlLWhhaWt1LTQtNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDEsXG4gICAgb3V0cHV0VG9rZW5zOiA1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxLjI1LFxuICB9LFxuICBcImNsYXVkZS0zLTUtc29ubmV0XCI6IHtcbiAgICBpbnB1dFRva2VuczogMyxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjMsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAzLjc1LFxuICB9LFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IHtcbiAgICBpbnB1dFRva2VuczogMyxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjMsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAzLjc1LFxuICB9LFxuICBcImNsYXVkZS1zb25uZXQtNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtN1wiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00XCI6IHtcbiAgICBpbnB1dFRva2VuczogMTUsXG4gICAgb3V0cHV0VG9rZW5zOiA3NSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMS41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMTguNzUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC0xXCI6IHtcbiAgICBpbnB1dFRva2VuczogMTUsXG4gICAgb3V0cHV0VG9rZW5zOiA3NSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMS41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMTguNzUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC01XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDI1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICB9LFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAyNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNi4yNSxcbiAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTdcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMjUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDYuMjUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC04XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDI1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICB9LFxufTtcblxuY29uc3QgREVGQVVMVF9DT1NUUzogTW9kZWxDb3N0cyA9IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZyk6IE1vZGVsQ29zdHMge1xuICByZXR1cm4gT1BFTkFJX0NPU1RTW21vZGVsXSA/PyBBTlRIUk9QSUNfQ09TVFNbbW9kZWxdID8/IERFRkFVTFRfQ09TVFM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZToge1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zPzogbnVtYmVyO1xuICB9LFxuKTogbnVtYmVyIHtcbiAgY29uc3QgY29zdHMgPSBnZXRNb2RlbENvc3RzKG1vZGVsKTtcbiAgY29uc3QgY2FjaGVkSW5wdXQgPSB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyA/PyAwO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQgPSB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3Qgbm9uQ2FjaGVkSW5wdXQgPSBNYXRoLm1heCh1c2FnZS5pbnB1dFRva2VucyAtIGNhY2hlZElucHV0IC0gY2FjaGVDcmVhdGlvbklucHV0LCAwKTtcblxuICAvLyBsb25nLWNvbnRleHQg7ZWg7KadOiDsoITssrQg7J6F66ClKGlucHV0X3Rva2VucywgY2FjaGUg7Y+s7ZWoKeydtCB0aHJlc2hvbGQg7LSI6rO8IOyLnCDsmpTssq0g7KCE7LK07JeQIOuwsOycqCDsoIHsmqlcbiAgY29uc3QgbGMgPSBjb3N0cy5sb25nQ29udGV4dDtcbiAgY29uc3QgaXNMb25nQ29udGV4dCA9IGxjICE9PSB1bmRlZmluZWQgJiYgdXNhZ2UuaW5wdXRUb2tlbnMgPiBsYy50aHJlc2hvbGQ7XG4gIGNvbnN0IGlucHV0UmF0ZSA9IGNvc3RzLmlucHV0VG9rZW5zICogKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVkUmF0ZSA9IGNvc3RzLmNhY2hlZElucHV0VG9rZW5zICogKGlzTG9uZ0NvbnRleHQgPyBsYy5jYWNoZWRJbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvblJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBvdXRwdXRSYXRlID0gY29zdHMub3V0cHV0VG9rZW5zICogKGlzTG9uZ0NvbnRleHQgPyBsYy5vdXRwdXRNdWx0aXBsaWVyIDogMSk7XG5cbiAgcmV0dXJuIChcbiAgICAobm9uQ2FjaGVkSW5wdXQgLyAxXzAwMF8wMDApICogaW5wdXRSYXRlICtcbiAgICAodXNhZ2Uub3V0cHV0VG9rZW5zIC8gMV8wMDBfMDAwKSAqIG91dHB1dFJhdGUgK1xuICAgIChjYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBjYWNoZWRSYXRlICtcbiAgICAoY2FjaGVDcmVhdGlvbklucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb25SYXRlXG4gICk7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBcUNBLE1BQU0sb0JBQTREO0NBQ2hFLFdBQVc7Q0FDWCxpQkFBaUI7Q0FDakIsdUJBQXVCO0NBQ3ZCLGtCQUFrQjtDQUNuQjtBQUVELE1BQU0sZUFBMkM7Q0FFL0MsV0FBVztFQUNULGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLGFBQWE7RUFDZDtDQUVELFdBQVc7RUFDVCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixhQUFhO0VBQ2Q7Q0FDRCxnQkFBZ0I7RUFBRSxh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
155
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBsb25nLWNvbnRleHQg7ZWg7KadLiDsoITssrQg7J6F66ClIO2GoO2BsChpbnB1dF90b2tlbnMsIGNhY2hlX3JlYWQg7Y+s7ZWoKeydtCB0aHJlc2hvbGQg7LSI6rO8IOyLnFxuICAgKiDstIjqs7zrtoTrp4zsnbQg7JWE64uI6528IOyalOyyrSDsoITssrQoZnVsbCBzZXNzaW9uKeyXkCDrsLDsnKgg7KCB7JqpLlxuICAgKi9cbiAgbG9uZ0NvbnRleHQ/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgaW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgb3V0cHV0TXVsdGlwbGllcjogbnVtYmVyO1xuICB9O1xufVxuXG4vLyDilIDilIAgT3BlbkFJIOKAlCBjb2RleCBhcHAtc2VydmVyIOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOuqqOuNuCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyDqsIDqsqkg7Lac7LKYOiBodHRwczovL29wZW5haS5jb20vYXBpL3ByaWNpbmcgKDIwMjYtMDYtMTEg7ZmV7J24KVxuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG5jb25zdCBPUEVOQUlfQ09TVFM6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29zdHM+ID0ge1xuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNS8gKDIwMjYtMDQg7Lac7IucKVxuICBcImdwdC01LjVcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMzAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS00LyAoMjAyNi0wMyDstpzsi5wpXG4gIFwiZ3B0LTUuNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDIuNSxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS40LW1pbmlcIjogeyBpbnB1dFRva2VuczogMC43NSwgb3V0cHV0VG9rZW5zOiA0LjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA3NSB9LFxuICAvLyBncHQtNS4y7JmAIOuPmeydvCDri6jqsIAgKGNhY2hlZCA9IGlucHV07J2YIDEwJSlcbiAgXCJncHQtNS4zLWNvZGV4XCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtMi8gKGNhY2hlZCBpbnB1dCA5MCUg7ZWg7J24IOuqheyLnClcbiAgXCJncHQtNS4yXCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxufTtcblxuLy8g4pSA4pSAIEFudGhyb3BpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgQU5USFJPUElDX0NPU1RTOiBSZWNvcmQ8c3RyaW5nLCBNb2RlbENvc3RzPiA9IHtcbiAgLy8gQ2xhdWRlIENvZGUg64qUIOuzhOuPhCB0dGw6XCIxaFwiIOyYteyFmCDsl4bsnbQg7Iuk7ZaJ65CY66+A66GcIGZhbGxiYWNrIOqwgOqyqe2RnOuKlCA167aEIGNhY2hlIHdyaXRlKDEuMjV4KeulvCDquLDspIDsnLzroZwg65GU64ukLlxuICAvLyAx7Iuc6rCEIGNhY2hlIHdyaXRlIOuKlCBpbnB1dCAyeCDsnbTsp4Drp4wg7ZiE7J6sIHFncmlkIOyLpO2WiSDqsr3roZzsnZgg6riw67O46rCS7J20IOyVhOuLiOuLpC5cbiAgc29ubmV0OiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtMy01LWhhaWt1XCI6IHtcbiAgICBpbnB1dFRva2VuczogMC44LFxuICAgIG91dHB1dFRva2VuczogNCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wOCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDEsXG4gIH0sXG4gIFwiY2xhdWRlLWhhaWt1LTQtNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDEsXG4gICAgb3V0cHV0VG9rZW5zOiA1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxLjI1LFxuICB9LFxuICBcImNsYXVkZS0zLTUtc29ubmV0XCI6IHtcbiAgICBpbnB1dFRva2VuczogMyxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjMsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAzLjc1LFxuICB9LFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IHtcbiAgICBpbnB1dFRva2VuczogMyxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjMsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAzLjc1LFxuICB9LFxuICBcImNsYXVkZS1zb25uZXQtNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtN1wiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00XCI6IHtcbiAgICBpbnB1dFRva2VuczogMTUsXG4gICAgb3V0cHV0VG9rZW5zOiA3NSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMS41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMTguNzUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC0xXCI6IHtcbiAgICBpbnB1dFRva2VuczogMTUsXG4gICAgb3V0cHV0VG9rZW5zOiA3NSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMS41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMTguNzUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC01XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDI1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICB9LFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAyNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNi4yNSxcbiAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTdcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMjUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDYuMjUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC04XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDI1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICB9LFxufTtcblxuY29uc3QgREVGQVVMVF9DT1NUUzogTW9kZWxDb3N0cyA9IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZyk6IE1vZGVsQ29zdHMge1xuICBjb25zdCBub3JtYWxpemVkTW9kZWwgPSBtb2RlbC5yZXBsYWNlKC9cXFsxbVxcXSQvaSwgXCJcIik7XG4gIHJldHVybiBPUEVOQUlfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBBTlRIUk9QSUNfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBERUZBVUxUX0NPU1RTO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FsY3VsYXRlQ29zdFVzZChcbiAgbW9kZWw6IHN0cmluZyxcbiAgdXNhZ2U6IHtcbiAgICBpbnB1dFRva2VuczogbnVtYmVyO1xuICAgIG91dHB1dFRva2VuczogbnVtYmVyO1xuICAgIGNhY2hlZElucHV0VG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2Vucz86IG51bWJlcjtcbiAgfSxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IGNhY2hlZElucHV0ID0gdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0ID0gdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDA7XG4gIGNvbnN0IG5vbkNhY2hlZElucHV0ID0gTWF0aC5tYXgodXNhZ2UuaW5wdXRUb2tlbnMgLSBjYWNoZWRJbnB1dCAtIGNhY2hlQ3JlYXRpb25JbnB1dCwgMCk7XG5cbiAgLy8gbG9uZy1jb250ZXh0IO2VoOymnTog7KCE7LK0IOyeheugpShpbnB1dF90b2tlbnMsIGNhY2hlIO2PrO2VqCnsnbQgdGhyZXNob2xkIOy0iOqzvCDsi5wg7JqU7LKtIOyghOyytOyXkCDrsLDsnKgg7KCB7JqpXG4gIGNvbnN0IGxjID0gY29zdHMubG9uZ0NvbnRleHQ7XG4gIGNvbnN0IGlzTG9uZ0NvbnRleHQgPSBsYyAhPT0gdW5kZWZpbmVkICYmIHVzYWdlLmlucHV0VG9rZW5zID4gbGMudGhyZXNob2xkO1xuICBjb25zdCBpbnB1dFJhdGUgPSBjb3N0cy5pbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlZFJhdGUgPSBjb3N0cy5jYWNoZWRJbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuY2FjaGVkSW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25SYXRlID1cbiAgICAoY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IGNvc3RzLmlucHV0VG9rZW5zKSAqXG4gICAgKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3Qgb3V0cHV0UmF0ZSA9IGNvc3RzLm91dHB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMub3V0cHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIHJldHVybiAoXG4gICAgKG5vbkNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGlucHV0UmF0ZSArXG4gICAgKHVzYWdlLm91dHB1dFRva2VucyAvIDFfMDAwXzAwMCkgKiBvdXRwdXRSYXRlICtcbiAgICAoY2FjaGVkSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVkUmF0ZSArXG4gICAgKGNhY2hlQ3JlYXRpb25JbnB1dCAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uUmF0ZVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQXFDQSxNQUFNLG9CQUE0RDtDQUNoRSxXQUFXO0NBQ1gsaUJBQWlCO0NBQ2pCLHVCQUF1QjtDQUN2QixrQkFBa0I7Q0FDbkI7QUFFRCxNQUFNLGVBQTJDO0NBRS9DLFdBQVc7RUFDVCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixhQUFh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