@cartanova/qgrid-cli 2.3.2 → 2.3.3
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.
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +91 -278
- package/bundle/dist/application/qgrid/qgrid.frame.js +15 -5
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +33 -12
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +39 -96
- package/bundle/dist/utils/providers/anthropic/claude-session.js +47 -32
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +3 -36
- package/bundle/dist/utils/providers/common/model-cost.js +3 -2
- package/bundle/dist/utils/providers/openai/codex-worker.js +1 -2
- package/bundle/dist/utils/providers/openai/openai-dispatcher.js +19 -12
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +193 -6
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +140 -364
- package/bundle/src/application/qgrid/qgrid.frame.ts +38 -23
- package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +60 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +57 -16
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.test.ts +92 -340
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +50 -185
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +71 -62
- package/bundle/src/utils/providers/anthropic/claude-session.ts +56 -46
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +19 -30
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +24 -101
- package/bundle/src/utils/providers/common/model-cost.test.ts +19 -1
- package/bundle/src/utils/providers/common/model-cost.ts +2 -1
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +7 -4
- package/bundle/src/utils/providers/openai/codex-worker.ts +2 -8
- package/bundle/src/utils/providers/openai/openai-dispatcher.ts +18 -11
- package/package.json +1 -1
|
@@ -1,59 +1,17 @@
|
|
|
1
1
|
import "../../_virtual/_rolldown/runtime.js";
|
|
2
2
|
import { decideConvRouting, issueConvContext } from "./conv-routing.js";
|
|
3
3
|
import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
|
|
4
|
-
import {
|
|
5
|
-
import { getAccessToken, getExpiresAt, getRefreshToken } from "../../utils/providers/common/credentials.js";
|
|
4
|
+
import { getAccessToken } from "../../utils/providers/common/credentials.js";
|
|
6
5
|
import { strictify } from "../../utils/providers/common/strictifier.js";
|
|
7
|
-
import { ProcessError, QuotaError,
|
|
6
|
+
import { ProcessError, QuotaError, maskToken } from "./qgrid.types.js";
|
|
8
7
|
import { applyToolCallEmulation, buildToolCallSchema } from "./tool-emulation.js";
|
|
9
|
-
import { getLogger } from "@logtape/logtape";
|
|
10
|
-
import assert from "node:assert";
|
|
11
|
-
import { spawn } from "node:child_process";
|
|
12
|
-
import { mkdirSync, writeFileSync } from "node:fs";
|
|
13
8
|
//#region src/application/qgrid/qgrid.dispatcher.ts
|
|
14
|
-
/**
|
|
15
|
-
* QgridDispatcher — OAuth 토큰 선택 + claude CLI fresh spawn 디스패처 싱글턴.
|
|
16
|
-
*
|
|
17
|
-
* - 매 요청마다 새 claude CLI 프로세스 spawn → 응답 후 종료
|
|
18
|
-
* - least-used round-robin 으로 토큰 선택
|
|
19
|
-
* - 메모리 캐시 (Map<id, TokenSubsetA>) 는 TokenSubscriber 가 pg LISTEN/NOTIFY 로 갱신
|
|
20
|
-
* - query 시 expires_at 비교 → 임박 시 preemptive refresh
|
|
21
|
-
* - QuotaError 는 그대로 상위 전파 (자동 failover 없음, UI 에서 수동 토글)
|
|
22
|
-
*
|
|
23
|
-
* env allowlist: PATH, TMPDIR, CLAUDE_CODE_OAUTH_TOKEN, CLAUDE_CONFIG_DIR
|
|
24
|
-
* + CLAUDE_CODE_DISABLE_* + CLAUDE_CODE_ATTRIBUTION_HEADER
|
|
25
|
-
*/
|
|
26
|
-
const logger = getLogger(["qgrid"]);
|
|
27
|
-
const DEFAULT_MODEL = "sonnet";
|
|
28
|
-
const DEFAULT_TIMEOUT_MS = 6e5;
|
|
29
|
-
const DEFAULT_EFFORT = "high";
|
|
30
|
-
const CLAUDE_CWD = "/tmp/qgrid";
|
|
31
|
-
const CLAUDE_CONFIG_DIR = "/tmp/qgrid-config";
|
|
32
|
-
const QGRID_CLAUDE_SETTINGS = {
|
|
33
|
-
alwaysThinkingEnabled: false,
|
|
34
|
-
includeGitInstructions: false,
|
|
35
|
-
cleanupPeriodDays: 1
|
|
36
|
-
};
|
|
37
|
-
const REFRESH_SAFETY_MS = 6e4;
|
|
38
|
-
function buildStrictOutputSchema(input) {
|
|
39
|
-
const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
|
|
40
|
-
return outputSchema ? strictify(outputSchema) : void 0;
|
|
41
|
-
}
|
|
42
9
|
var QgridDispatcherClass = class {
|
|
43
10
|
tokens = /* @__PURE__ */ new Map();
|
|
44
11
|
requestCounts = /* @__PURE__ */ new Map();
|
|
45
|
-
rrIndex = 0;
|
|
46
12
|
subscriber = null;
|
|
47
13
|
openaiDispatcher = null;
|
|
48
14
|
anthropicDispatcher = null;
|
|
49
|
-
constructor() {
|
|
50
|
-
const settingsJson = JSON.stringify(QGRID_CLAUDE_SETTINGS, null, 2);
|
|
51
|
-
mkdirSync(`${CLAUDE_CWD}/.claude`, { recursive: true });
|
|
52
|
-
writeFileSync(`${CLAUDE_CWD}/.claude/settings.json`, settingsJson);
|
|
53
|
-
mkdirSync(CLAUDE_CONFIG_DIR, { recursive: true });
|
|
54
|
-
writeFileSync(`${CLAUDE_CONFIG_DIR}/.claude.json`, "{}");
|
|
55
|
-
writeFileSync(`${CLAUDE_CONFIG_DIR}/settings.json`, settingsJson);
|
|
56
|
-
}
|
|
57
15
|
countOf(name) {
|
|
58
16
|
return this.requestCounts.get(name) ?? 0;
|
|
59
17
|
}
|
|
@@ -74,136 +32,112 @@ var QgridDispatcherClass = class {
|
|
|
74
32
|
requests: this.countOf(r.name)
|
|
75
33
|
}));
|
|
76
34
|
}
|
|
77
|
-
selectToken(provider = "anthropic") {
|
|
78
|
-
const rows = [...this.tokens.values()].filter((r) => r.provider === provider);
|
|
79
|
-
if (rows.length === 0) return null;
|
|
80
|
-
const minCount = Math.min(...rows.map((r) => this.countOf(r.name)));
|
|
81
|
-
const idle = rows.filter((r) => this.countOf(r.name) === minCount);
|
|
82
|
-
const picked = idle[this.rrIndex % idle.length];
|
|
83
|
-
this.rrIndex++;
|
|
84
|
-
return picked;
|
|
85
|
-
}
|
|
86
35
|
async query(input, timeoutMs) {
|
|
87
36
|
if (input.tools?.length && input.jsonSchema) throw new ProcessError("tools and jsonSchema cannot be used together");
|
|
88
37
|
const outputSchema = buildStrictOutputSchema(input);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
if (provider === "openai") {
|
|
93
|
-
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
94
|
-
const decision = decideConvRouting(input);
|
|
95
|
-
const result = await this.openaiDispatcher.generate({
|
|
96
|
-
model,
|
|
97
|
-
systemPrompt: input.system,
|
|
98
|
-
outputSchema,
|
|
99
|
-
effort: input.effort,
|
|
100
|
-
verbosity: input.verbosity,
|
|
101
|
-
reasoningSummary: input.reasoningSummary,
|
|
102
|
-
serviceTier: input.serviceTier,
|
|
103
|
-
coldInput: decision.coldInput,
|
|
104
|
-
coldHistory: decision.coldHistory,
|
|
105
|
-
reuse: decision.reuse,
|
|
106
|
-
reuseInput: decision.reuseInput
|
|
107
|
-
});
|
|
108
|
-
const issuedCoord = issueConvContext(result.threadCoord, decision);
|
|
109
|
-
return applyToolCallEmulation(toEmulationResult(result), input.tools, issuedCoord);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (this.anthropicDispatcher) {
|
|
38
|
+
const route = parseProviderRoute(input.model);
|
|
39
|
+
if (route.provider === "openai") {
|
|
40
|
+
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
113
41
|
const decision = decideConvRouting(input);
|
|
114
|
-
const result = await this.
|
|
115
|
-
model:
|
|
42
|
+
const result = await this.openaiDispatcher.generate({
|
|
43
|
+
model: route.model,
|
|
116
44
|
systemPrompt: input.system,
|
|
117
45
|
outputSchema,
|
|
118
46
|
effort: input.effort,
|
|
47
|
+
verbosity: input.verbosity,
|
|
48
|
+
reasoningSummary: input.reasoningSummary,
|
|
49
|
+
serviceTier: input.serviceTier,
|
|
119
50
|
coldInput: decision.coldInput,
|
|
120
51
|
coldHistory: decision.coldHistory,
|
|
121
52
|
reuse: decision.reuse,
|
|
122
53
|
reuseInput: decision.reuseInput
|
|
123
54
|
});
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const { QgridFrame } = await import("./qgrid.frame.js");
|
|
138
|
-
token = await QgridFrame.refreshToken(electedToken);
|
|
139
|
-
} catch (e) {
|
|
140
|
-
logger.warn(`refresh failed for ${electedToken.name}: ${e.message}`);
|
|
55
|
+
return applyToolCallEmulation(toEmulationResult(result), input.tools, issueConvContext(result.threadCoord, decision));
|
|
56
|
+
} else if (route.provider === "anthropic") {
|
|
57
|
+
if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
|
|
58
|
+
const decision = decideConvRouting(input);
|
|
59
|
+
const result = await this.anthropicDispatcher.generate({
|
|
60
|
+
model: input.model,
|
|
61
|
+
systemPrompt: input.system,
|
|
62
|
+
outputSchema,
|
|
63
|
+
effort: input.effort,
|
|
64
|
+
coldInput: decision.coldInput,
|
|
65
|
+
coldHistory: decision.coldHistory
|
|
66
|
+
});
|
|
67
|
+
return applyToolCallEmulation(toEmulationResult(result), input.tools, issueConvContext(result.threadCoord, decision));
|
|
141
68
|
}
|
|
142
|
-
|
|
143
|
-
return applyToolCallEmulation({
|
|
144
|
-
...await executeClaude(executionInput, token, timeoutMs ?? DEFAULT_TIMEOUT_MS),
|
|
145
|
-
tokenName: electedToken.name,
|
|
146
|
-
model: canonicalAnthropicModel(input.model)
|
|
147
|
-
}, input.tools);
|
|
69
|
+
throw directLlmApiFallbackNotImplemented(input);
|
|
148
70
|
}
|
|
149
|
-
async queryStream(input, cb) {
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
71
|
+
async queryStream(input, cb, abortSignal) {
|
|
72
|
+
const outputSchema = buildStrictOutputSchema(input);
|
|
73
|
+
const route = parseProviderRoute(input.model);
|
|
74
|
+
if (route.provider === "openai") {
|
|
75
|
+
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
76
|
+
const decision = decideConvRouting(input);
|
|
77
|
+
await this.openaiDispatcher.generateStream({
|
|
78
|
+
model: route.model,
|
|
79
|
+
systemPrompt: input.system,
|
|
80
|
+
outputSchema,
|
|
81
|
+
effort: input.effort,
|
|
82
|
+
verbosity: input.verbosity,
|
|
83
|
+
reasoningSummary: input.reasoningSummary,
|
|
84
|
+
serviceTier: input.serviceTier,
|
|
85
|
+
coldInput: decision.coldInput,
|
|
86
|
+
coldHistory: decision.coldHistory,
|
|
87
|
+
reuse: decision.reuse,
|
|
88
|
+
reuseInput: decision.reuseInput,
|
|
89
|
+
abortSignal
|
|
90
|
+
}, {
|
|
91
|
+
onDelta: cb.onDelta,
|
|
92
|
+
onThreadId: cb.onThreadId,
|
|
93
|
+
onTurnId: cb.onTurnId,
|
|
94
|
+
onComplete: (turnResult) => {
|
|
95
|
+
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, issueConvContext(turnResult.threadCoord, decision)));
|
|
96
|
+
},
|
|
97
|
+
onError: cb.onError
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
} else if (route.provider === "anthropic") {
|
|
101
|
+
if (!this.anthropicDispatcher) throw new QuotaError("Anthropic dispatcher not initialized");
|
|
102
|
+
const decision = decideConvRouting(input);
|
|
103
|
+
await this.anthropicDispatcher.generateStream({
|
|
104
|
+
model: input.model,
|
|
105
|
+
systemPrompt: input.system,
|
|
106
|
+
outputSchema,
|
|
107
|
+
effort: input.effort,
|
|
108
|
+
coldInput: decision.coldInput,
|
|
109
|
+
coldHistory: decision.coldHistory,
|
|
110
|
+
abortSignal
|
|
111
|
+
}, {
|
|
112
|
+
onDelta: cb.onDelta,
|
|
113
|
+
onThreadId: cb.onThreadId,
|
|
114
|
+
onComplete: (turnResult) => {
|
|
115
|
+
const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
|
|
116
|
+
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, issuedCoord));
|
|
117
|
+
},
|
|
118
|
+
onError: cb.onError
|
|
119
|
+
});
|
|
176
120
|
return;
|
|
177
121
|
}
|
|
178
|
-
|
|
179
|
-
if (!model) throw new ProcessError("unknown model");
|
|
180
|
-
if (!this.openaiDispatcher) throw new QuotaError("OpenAI dispatcher not initialized");
|
|
181
|
-
const outputSchema = buildStrictOutputSchema(input);
|
|
182
|
-
const decision = decideConvRouting(input);
|
|
183
|
-
await this.openaiDispatcher.generateStream({
|
|
184
|
-
model,
|
|
185
|
-
systemPrompt: input.system,
|
|
186
|
-
outputSchema,
|
|
187
|
-
effort: input.effort,
|
|
188
|
-
verbosity: input.verbosity,
|
|
189
|
-
reasoningSummary: input.reasoningSummary,
|
|
190
|
-
serviceTier: input.serviceTier,
|
|
191
|
-
coldInput: decision.coldInput,
|
|
192
|
-
coldHistory: decision.coldHistory,
|
|
193
|
-
reuse: decision.reuse,
|
|
194
|
-
reuseInput: decision.reuseInput
|
|
195
|
-
}, {
|
|
196
|
-
onDelta: cb.onDelta,
|
|
197
|
-
onThreadId: cb.onThreadId,
|
|
198
|
-
onTurnId: cb.onTurnId,
|
|
199
|
-
onComplete: (turnResult) => {
|
|
200
|
-
const issuedCoord = issueConvContext(turnResult.threadCoord, decision);
|
|
201
|
-
cb.onComplete(applyToolCallEmulation(toEmulationResult(turnResult), input.tools, issuedCoord));
|
|
202
|
-
},
|
|
203
|
-
onError: cb.onError
|
|
204
|
-
});
|
|
122
|
+
throw directLlmApiFallbackNotImplemented(input);
|
|
205
123
|
}
|
|
206
124
|
};
|
|
125
|
+
function parseProviderRoute(model) {
|
|
126
|
+
if (!model?.includes("/")) return { model: model ?? "" };
|
|
127
|
+
const [provider, routedModel] = model.split("/", 2);
|
|
128
|
+
if (!provider || !routedModel) throw new ProcessError("unknown model");
|
|
129
|
+
return {
|
|
130
|
+
provider,
|
|
131
|
+
model: routedModel
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function directLlmApiFallbackNotImplemented(input) {
|
|
135
|
+
return new ProcessError(`Direct LLM API fallback not implemented for model: ${input.model ?? "<default>"}`);
|
|
136
|
+
}
|
|
137
|
+
function buildStrictOutputSchema(input) {
|
|
138
|
+
const outputSchema = input.tools?.length ? buildToolCallSchema(input.tools) : input.jsonSchema ? JSON.parse(input.jsonSchema) : void 0;
|
|
139
|
+
return outputSchema ? strictify(outputSchema) : void 0;
|
|
140
|
+
}
|
|
207
141
|
function toEmulationResult(result) {
|
|
208
142
|
return {
|
|
209
143
|
text: result.text,
|
|
@@ -224,129 +158,8 @@ function toEmulationResult(result) {
|
|
|
224
158
|
})
|
|
225
159
|
};
|
|
226
160
|
}
|
|
227
|
-
async function executeClaude(input, token, timeoutMs) {
|
|
228
|
-
const rawModel = input.model ?? DEFAULT_MODEL;
|
|
229
|
-
const model = rawModel.includes("/") ? rawModel.split("/").pop() : rawModel;
|
|
230
|
-
const timeout = input.timeout ?? timeoutMs;
|
|
231
|
-
const useStructuredOutput = input.jsonSchema && input.jsonSchema.length > 0;
|
|
232
|
-
const args = [
|
|
233
|
-
"-p",
|
|
234
|
-
...useStructuredOutput ? [
|
|
235
|
-
"--tools",
|
|
236
|
-
"",
|
|
237
|
-
"--allowed-tools",
|
|
238
|
-
"StructuredOutput"
|
|
239
|
-
] : ["--tools", ""],
|
|
240
|
-
"--disallowedTools",
|
|
241
|
-
...[
|
|
242
|
-
"Monitor",
|
|
243
|
-
"PushNotification",
|
|
244
|
-
"RemoteTrigger"
|
|
245
|
-
],
|
|
246
|
-
"--output-format",
|
|
247
|
-
"stream-json",
|
|
248
|
-
"--verbose",
|
|
249
|
-
"--max-turns",
|
|
250
|
-
useStructuredOutput ? "2" : "1",
|
|
251
|
-
"--permission-mode",
|
|
252
|
-
"bypassPermissions",
|
|
253
|
-
"--setting-sources",
|
|
254
|
-
"project",
|
|
255
|
-
"--model",
|
|
256
|
-
model,
|
|
257
|
-
"--system-prompt",
|
|
258
|
-
input.system ?? "",
|
|
259
|
-
"--thinking",
|
|
260
|
-
"disabled",
|
|
261
|
-
"--effort",
|
|
262
|
-
input.effort ?? DEFAULT_EFFORT,
|
|
263
|
-
"--no-session-persistence",
|
|
264
|
-
"--disable-slash-commands"
|
|
265
|
-
];
|
|
266
|
-
if (useStructuredOutput) args.push("--json-schema", input.jsonSchema);
|
|
267
|
-
args.push(input.prompt);
|
|
268
|
-
const env = {
|
|
269
|
-
PATH: process.env.PATH,
|
|
270
|
-
TMPDIR: process.env.TMPDIR,
|
|
271
|
-
CLAUDE_CODE_OAUTH_TOKEN: token,
|
|
272
|
-
CLAUDE_CONFIG_DIR,
|
|
273
|
-
CLAUDE_CODE_DISABLE_AUTO_MEMORY: "1",
|
|
274
|
-
CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING: "1",
|
|
275
|
-
CLAUDE_CODE_DISABLE_1M_CONTEXT: "1",
|
|
276
|
-
CLAUDE_CODE_DISABLE_CLAUDE_MDS: "1",
|
|
277
|
-
CLAUDE_CODE_ATTRIBUTION_HEADER: "0"
|
|
278
|
-
};
|
|
279
|
-
return new Promise((resolve, reject) => {
|
|
280
|
-
const child = spawn("claude", args, {
|
|
281
|
-
stdio: [
|
|
282
|
-
"ignore",
|
|
283
|
-
"pipe",
|
|
284
|
-
"ignore"
|
|
285
|
-
],
|
|
286
|
-
env,
|
|
287
|
-
cwd: CLAUDE_CWD
|
|
288
|
-
});
|
|
289
|
-
let buffer = "";
|
|
290
|
-
let settled = false;
|
|
291
|
-
const timer = setTimeout(() => {
|
|
292
|
-
if (settled) return;
|
|
293
|
-
settled = true;
|
|
294
|
-
child.kill();
|
|
295
|
-
reject(new TimeoutError(`Timeout after ${timeout / 1e3}s (token: ${maskToken(token)})`));
|
|
296
|
-
}, timeout);
|
|
297
|
-
child.stdout?.on("data", (d) => {
|
|
298
|
-
if (settled) return;
|
|
299
|
-
buffer += d.toString();
|
|
300
|
-
const lines = buffer.split("\n");
|
|
301
|
-
buffer = lines.pop() ?? "";
|
|
302
|
-
for (const line of lines) {
|
|
303
|
-
if (!line.trim()) continue;
|
|
304
|
-
try {
|
|
305
|
-
const j = JSON.parse(line);
|
|
306
|
-
if (j.type === "result" && !settled) {
|
|
307
|
-
let text;
|
|
308
|
-
if (j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
|
|
309
|
-
else text = (j.result ?? "").replace(/^```(?:json)?\s*\n?/i, "").replace(/\n?```\s*$/i, "");
|
|
310
|
-
if (text.startsWith("You've hit")) {
|
|
311
|
-
settled = true;
|
|
312
|
-
clearTimeout(timer);
|
|
313
|
-
reject(new QuotaError(`Quota exhausted (token: ${maskToken(token)})`));
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
const u = j.usage ?? {};
|
|
317
|
-
settled = true;
|
|
318
|
-
clearTimeout(timer);
|
|
319
|
-
resolve({
|
|
320
|
-
text,
|
|
321
|
-
usage: {
|
|
322
|
-
input_tokens: u.input_tokens ?? 0,
|
|
323
|
-
output_tokens: u.output_tokens ?? 0,
|
|
324
|
-
cache_creation_input_tokens: u.cache_creation_input_tokens ?? 0,
|
|
325
|
-
cache_read_input_tokens: u.cache_read_input_tokens ?? 0
|
|
326
|
-
},
|
|
327
|
-
durationMs: j.duration_ms ?? 0,
|
|
328
|
-
costUsd: j.total_cost_usd ?? 0
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
} catch {}
|
|
332
|
-
}
|
|
333
|
-
});
|
|
334
|
-
child.on("close", () => {
|
|
335
|
-
if (settled) return;
|
|
336
|
-
settled = true;
|
|
337
|
-
clearTimeout(timer);
|
|
338
|
-
reject(new ProcessError(`CLI process closed without result (token: ${maskToken(token)})`));
|
|
339
|
-
});
|
|
340
|
-
child.on("error", (err) => {
|
|
341
|
-
if (settled) return;
|
|
342
|
-
settled = true;
|
|
343
|
-
clearTimeout(timer);
|
|
344
|
-
reject(new ProcessError(`CLI process error: ${err.message} (token: ${maskToken(token)})`));
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
161
|
const QgridDispatcher = new QgridDispatcherClass();
|
|
349
162
|
//#endregion
|
|
350
163
|
export { QgridDispatcher, QgridDispatcherClass, buildStrictOutputSchema };
|
|
351
164
|
|
|
352
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJub2RlOmFzc2VydFwiO1xuLyoqXG4gKiBRZ3JpZERpc3BhdGNoZXIg4oCUIE9BdXRoIO2GoO2BsCDshKDtg50gKyBjbGF1ZGUgQ0xJIGZyZXNoIHNwYXduIOuUlOyKpO2MqOyymCDsi7HquIDthLQuXG4gKlxuICogLSDrp6Qg7JqU7LKt66eI64ukIOyDiCBjbGF1ZGUgQ0xJIO2UhOuhnOyEuOyKpCBzcGF3biDihpIg7J2R64u1IO2bhCDsooXro4xcbiAqIC0gbGVhc3QtdXNlZCByb3VuZC1yb2JpbiDsnLzroZwg7Yag7YGwIOyEoO2DnVxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBxdWVyeSDsi5wgZXhwaXJlc19hdCDruYTqtZAg4oaSIOyehOuwlSDsi5wgcHJlZW1wdGl2ZSByZWZyZXNoXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMICjsnpDrj5kgZmFpbG92ZXIg7JeG7J2MLCBVSSDsl5DshJwg7IiY64+ZIO2GoOq4gClcbiAqXG4gKiBlbnYgYWxsb3dsaXN0OiBQQVRILCBUTVBESVIsIENMQVVERV9DT0RFX09BVVRIX1RPS0VOLCBDTEFVREVfQ09ORklHX0RJUlxuICogICArIENMQVVERV9DT0RFX0RJU0FCTEVfKiArIENMQVVERV9DT0RFX0FUVFJJQlVUSU9OX0hFQURFUlxuICovXG5pbXBvcnQgeyBzcGF3biB9IGZyb20gXCJub2RlOmNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyBjYW5vbmljYWxBbnRocm9waWNNb2RlbCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQge1xuICBnZXRBY2Nlc3NUb2tlbixcbiAgZ2V0RXhwaXJlc0F0LFxuICBnZXRSZWZyZXNoVG9rZW4sXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHsgdHlwZSBHZW5lcmF0ZVJlc3VsdCB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yLCBUaW1lb3V0RXJyb3IgfSBmcm9tIFwiLi9xZ3JpZC50eXBlc1wiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNjcmliZXIgfSBmcm9tIFwiLi90b2tlbi1zdWJzY3JpYmVyXCI7XG5pbXBvcnQgeyBhcHBseVRvb2xDYWxsRW11bGF0aW9uLCBidWlsZFRvb2xDYWxsU2NoZW1hIH0gZnJvbSBcIi4vdG9vbC1lbXVsYXRpb25cIjtcblxuY29uc3QgbG9nZ2VyID0gZ2V0TG9nZ2VyKFtcInFncmlkXCJdKTtcblxuY29uc3QgREVGQVVMVF9NT0RFTCA9IFwic29ubmV0XCI7XG5jb25zdCBERUZBVUxUX1RJTUVPVVRfTVMgPSA2MDBfMDAwO1xuY29uc3QgREVGQVVMVF9FRkZPUlQgPSBcImhpZ2hcIjtcblxuLy8gY2xhdWRlIENMSSDsnZggY3dkLiDsnbQg6rK966Gc7J2YIC5jbGF1ZGUvc2V0dGluZ3MuanNvbiDsnbQgcHJvamVjdCBzY29wZSDroZwg66Gc65Oc65CY7Ja0XG4vLyDtmLnsi5zrnbzrj4Qg7J6I7J2EIHVzZXIgc2NvcGUgKH4vLmNsYXVkZS9zZXR0aW5ncy5qc29uKeulvCDrja7slrTslIAgKC0tc2V0dGluZy1zb3VyY2VzIHByb2plY3Qg7JmAIO2VqOq7mCkuXG5jb25zdCBDTEFVREVfQ1dEID0gXCIvdG1wL3FncmlkXCI7XG5cbi8vIOq4gOuhnOuyjCB1c2VyIGNvbmZpZyDqsqnrpqwg6rK966GcLiAoQ0Psl5DshJwg7ZmY6rK967OA7IiY66GcIOydveuKlOuzgOyImClcbmNvbnN0IENMQVVERV9DT05GSUdfRElSID0gXCIvdG1wL3FncmlkLWNvbmZpZ1wiO1xuXG4vLyBxZ3JpZCDsoITsmqkgcHJvamVjdC9nbG9iYWwgc2V0dGluZ3Mg4oCUIHVzZXIgc2NvcGUg6rKp66as7JqpXG5jb25zdCBRR1JJRF9DTEFVREVfU0VUVElOR1MgPSB7XG4gIGFsd2F5c1RoaW5raW5nRW5hYmxlZDogZmFsc2UsIC8vIHRoaW5raW5nIGJsb2NrIOywqOuLqFxuICBpbmNsdWRlR2l0SW5zdHJ1Y3Rpb25zOiBmYWxzZSwgLy8gc3lzdGVtIHByb21wdCDsnZggZ2l0IOqwgOydtOuTnCDsoJzqsbBcbiAgY2xlYW51cFBlcmlvZERheXM6IDEsXG59O1xuXG4vLyDthqDtgbAg66eM66OMIOyehOuwlSDsnoTqs4TqsJIg4oCUIHRva2VuLmV4cGlyZWRBdOydtCAx67aEIOyViOyXkCDrp4zro4zrkJzri6TrqbQgcXVlcnkg7IucIOyytO2BrO2VmOqzoCByZWZyZXNoLlxuY29uc3QgUkVGUkVTSF9TQUZFVFlfTVMgPSA2MF8wMDA7XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFN0cmljdE91dHB1dFNjaGVtYShcbiAgaW5wdXQ6IFBpY2s8UXVlcnlJbnB1dCwgXCJ0b29sc1wiIHwgXCJqc29uU2NoZW1hXCI+LFxuKTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgb3V0cHV0U2NoZW1hID0gaW5wdXQudG9vbHM/Lmxlbmd0aFxuICAgID8gYnVpbGRUb29sQ2FsbFNjaGVtYShpbnB1dC50b29scylcbiAgICA6IGlucHV0Lmpzb25TY2hlbWFcbiAgICAgID8gKEpTT04ucGFyc2UoaW5wdXQuanNvblNjaGVtYSkgYXMgSnNvblZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIG91dHB1dFNjaGVtYVxuICAgID8gKHN0cmljdGlmeShvdXRwdXRTY2hlbWEgYXMgUGFyYW1ldGVyczx0eXBlb2Ygc3RyaWN0aWZ5PlswXSkgYXMgSnNvblZhbHVlKVxuICAgIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgY2xhc3MgUWdyaWREaXNwYXRjaGVyQ2xhc3Mge1xuICB0b2tlbnMgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5TdWJzZXRBPigpO1xuXG4gIC8vIGtleeq4sOuwmCh0b2tlbk5hbWUpIOuIhOyggSDsubTsmrTthLAuIHRva2VuIOydtCBPQXV0aCByZWZyZXNoIOuhnCDroZzthYzsnbTtirjrkJjrj4QgdG9rZW5OYW1lIOydgCDrtojrs4DsnbTrnbwg7Lm07Jq07YSwIOycoOyngOuQqFxuICByZXF1ZXN0Q291bnRzID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgcnJJbmRleCA9IDA7XG5cbiAgLy8gc29uYW11LmNvbmZpZyBvblN0YXJ0IOyXkOyEnCDsspjrpqztlZjripQg67OA7IiYXG4gIHN1YnNjcmliZXI6IFRva2VuU3Vic2NyaWJlciB8IG51bGwgPSBudWxsO1xuICBvcGVuYWlEaXNwYXRjaGVyOiBPcGVuQUlEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG4gIGFudGhyb3BpY0Rpc3BhdGNoZXI6IEFudGhyb3BpY0Rpc3BhdGNoZXIgfCBudWxsID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBjb25zdCBzZXR0aW5nc0pzb24gPSBKU09OLnN0cmluZ2lmeShRR1JJRF9DTEFVREVfU0VUVElOR1MsIG51bGwsIDIpO1xuXG4gICAgbWtkaXJTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGVgLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3cml0ZUZpbGVTeW5jKGAke0NMQVVERV9DV0R9Ly5jbGF1ZGUvc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG5cbiAgICBta2RpclN5bmMoQ0xBVURFX0NPTkZJR19ESVIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdyaXRlRmlsZVN5bmMoYCR7Q0xBVURFX0NPTkZJR19ESVJ9Ly5jbGF1ZGUuanNvbmAsIFwie31cIik7XG4gICAgd3JpdGVGaWxlU3luYyhgJHtDTEFVREVfQ09ORklHX0RJUn0vc2V0dGluZ3MuanNvbmAsIHNldHRpbmdzSnNvbik7XG4gIH1cblxuICBjb3VudE9mKG5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdENvdW50cy5nZXQobmFtZSkgPz8gMDtcbiAgfVxuXG4gIC8vIFRva2VuU3Vic2NyaWJlciDsvZzrsLEg4oCUIOy6kOyLnCBtdXRhdGlvblxuICB1cHNlcnRDYWNoZShpZDogbnVtYmVyLCByb3c6IFRva2VuU3Vic2V0QSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zLnNldChpZCwgcm93KTtcbiAgfVxuXG4gIHJlbW92ZUNhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5kZWxldGUoaWQpO1xuICB9XG5cbiAgcmVwbGFjZUNhY2hlKHJvd3M6IFRva2VuU3Vic2V0QVtdKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMgPSBuZXcgTWFwKHJvd3MubWFwKChyKSA9PiBbci5pZCwgcl0pKTtcbiAgfVxuXG4gIGdldFN0YXRzKCk6IFRva2VuU3RhdHNbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2Vucy52YWx1ZXMoKV0ubWFwKChyKSA9PiAoe1xuICAgICAgdG9rZW46IG1hc2tUb2tlbihnZXRBY2Nlc3NUb2tlbihyLmNyZWRlbnRpYWxzKSksXG4gICAgICBuYW1lOiByLm5hbWUsXG4gICAgICBwcm92aWRlcjogci5wcm92aWRlcixcbiAgICAgIHJlcXVlc3RzOiB0aGlzLmNvdW50T2Yoci5uYW1lKSxcbiAgICB9KSk7XG4gIH1cblxuICBzZWxlY3RUb2tlbihwcm92aWRlciA9IFwiYW50aHJvcGljXCIpOiBUb2tlblN1YnNldEEgfCBudWxsIHtcbiAgICBjb25zdCByb3dzID0gWy4uLnRoaXMudG9rZW5zLnZhbHVlcygpXS5maWx0ZXIoKHIpID0+IHIucHJvdmlkZXIgPT09IHByb3ZpZGVyKTtcbiAgICBpZiAocm93cy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgbWluQ291bnQgPSBNYXRoLm1pbiguLi5yb3dzLm1hcCgocikgPT4gdGhpcy5jb3VudE9mKHIubmFtZSkpKTtcbiAgICBjb25zdCBpZGxlID0gcm93cy5maWx0ZXIoKHIpID0+IHRoaXMuY291bnRPZihyLm5hbWUpID09PSBtaW5Db3VudCk7XG4gICAgY29uc3QgcGlja2VkID0gaWRsZVt0aGlzLnJySW5kZXggJSBpZGxlLmxlbmd0aF0hO1xuICAgIHRoaXMucnJJbmRleCsrO1xuICAgIHJldHVybiBwaWNrZWQ7XG4gIH1cblxuICBhc3luYyBxdWVyeShpbnB1dDogUXVlcnlJbnB1dCwgdGltZW91dE1zPzogbnVtYmVyKTogUHJvbWlzZTxRdWVyeU91dHB1dD4ge1xuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG5cbiAgICAvLyBwcm92aWRlciBwcmVmaXggcm91dGluZzogJ29wZW5haS9ncHQtNS40JyDihpIgT3BlbkFJRGlzcGF0Y2hlclxuICAgIGlmIChpbnB1dC5tb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgICBjb25zdCBbcHJvdmlkZXIsIG1vZGVsXSA9IGlucHV0Lm1vZGVsLnNwbGl0KFwiL1wiLCAyKTtcbiAgICAgIGFzc2VydChtb2RlbCwgXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgICAgaWYgKHByb3ZpZGVyID09PSBcIm9wZW5haVwiKSB7XG4gICAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcbiAgICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZSh7XG4gICAgICAgICAgbW9kZWw6IG1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgICByZWFzb25pbmdTdW1tYXJ5OiBpbnB1dC5yZWFzb25pbmdTdW1tYXJ5LFxuICAgICAgICAgIHNlcnZpY2VUaWVyOiBpbnB1dC5zZXJ2aWNlVGllcixcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dChyZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24odG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbnRocm9waWMg4oCUIEFudGhyb3BpY0Rpc3BhdGNoZXIo66mA7Yuw7YS0IHNlc3Npb24gcmVzdW1lKSDqsr3roZwuIE9wZW5BSSDqsr3roZzsmYAg64+Z7ZiVLlxuICAgIGlmICh0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIpIHtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgLy8gbW9kZWwg66+47KeA7KCV7J2066m0IEFudGhyb3BpY0Rpc3BhdGNoZXIg6rCAIEFOVEhST1BJQ19ERUZBVUxUX01PREVMIOyggeyaqSDigJQgXCJzb25uZXRcIiDrs4Tsua3snYRcbiAgICAgICAgLy8g6rCV7KCc66GcIOuBvOybjCBkaXNwYXRjaGVyIGRlZmF1bHQg66W8IOyjveydtOyngCDslYrripTri6QuIHByZWZpeCDsoJXqt5ztmZTrj4QgZGlzcGF0Y2hlciDrgrTrtoDsl5DshJwuXG4gICAgICAgIG1vZGVsOiBpbnB1dC5tb2RlbCxcbiAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBpc3N1ZWRDb29yZCA9IGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdChyZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpO1xuICAgIH1cblxuICAgIC8vIO2PtOuwsTogQW50aHJvcGljRGlzcGF0Y2hlciDrr7jstIjquLDtmZQg7IucIOq4sOyhtCBzdGF0ZWxlc3MgY2xhdWRlIC1wIOqyveuhnCjrqYDti7DthLQg7JeG7J2MKS5cbiAgICBjb25zdCBleGVjdXRpb25JbnB1dCA9IG91dHB1dFNjaGVtYVxuICAgICAgPyB7IC4uLmlucHV0LCBqc29uU2NoZW1hOiBKU09OLnN0cmluZ2lmeShvdXRwdXRTY2hlbWEpIH1cbiAgICAgIDogaW5wdXQ7XG5cbiAgICBjb25zdCBlbGVjdGVkVG9rZW4gPSB0aGlzLnNlbGVjdFRva2VuKCk7XG4gICAgaWYgKCFlbGVjdGVkVG9rZW4pIHRocm93IG5ldyBRdW90YUVycm9yKFwiTm8gdG9rZW5zIGF2YWlsYWJsZVwiKTtcblxuICAgIC8vIGF3YWl0IOyghOyXkCBjb3VudCDshKDrsJjsmIEuIOuzkeugrCDsmpTssq3snbQg64+Z7Iuc7JeQIOuPhOywqe2VtOuPhCDqsIHsnpAg64uk66W4IO2GoO2BsOydhCDqs6DrpbTrj4TroZ0uXG4gICAgdGhpcy5yZXF1ZXN0Q291bnRzLnNldChlbGVjdGVkVG9rZW4ubmFtZSwgdGhpcy5jb3VudE9mKGVsZWN0ZWRUb2tlbi5uYW1lKSArIDEpO1xuXG4gICAgbGV0IHRva2VuID0gZ2V0QWNjZXNzVG9rZW4oZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICAvLyBleHBpcmVzX2F0IOyehOuwleydtOuptCBwcmVlbXB0aXZlIHJlZnJlc2hcbiAgICBjb25zdCBleHBpcmVzQXQgPSBnZXRFeHBpcmVzQXQoZWxlY3RlZFRva2VuLmNyZWRlbnRpYWxzKTtcbiAgICBpZiAoXG4gICAgICBleHBpcmVzQXQgJiZcbiAgICAgIGV4cGlyZXNBdCAtIERhdGUubm93KCkgPCBSRUZSRVNIX1NBRkVUWV9NUyAmJlxuICAgICAgZ2V0UmVmcmVzaFRva2VuKGVsZWN0ZWRUb2tlbi5jcmVkZW50aWFscylcbiAgICApIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHsgUWdyaWRGcmFtZSB9ID0gYXdhaXQgaW1wb3J0KFwiLi9xZ3JpZC5mcmFtZVwiKTtcbiAgICAgICAgdG9rZW4gPSBhd2FpdCBRZ3JpZEZyYW1lLnJlZnJlc2hUb2tlbihlbGVjdGVkVG9rZW4pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihgcmVmcmVzaCBmYWlsZWQgZm9yICR7ZWxlY3RlZFRva2VuLm5hbWV9OiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZ2dlci5pbmZvKGDihpIgJHtlbGVjdGVkVG9rZW4ubmFtZX0gKG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IERFRkFVTFRfTU9ERUx9KWApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUNsYXVkZShleGVjdXRpb25JbnB1dCwgdG9rZW4sIHRpbWVvdXRNcyA/PyBERUZBVUxUX1RJTUVPVVRfTVMpO1xuICAgIHJldHVybiBhcHBseVRvb2xDYWxsRW11bGF0aW9uKFxuICAgICAgLy8gbW9kZWwg64+EIGNhbm9uaWNhbCDroZwg4oCUIGZhbGxiYWNrIOuPhCBjb3N0L+2RnOq4sOqwgCBtYWluIOqyveuhnOyZgCDsnbzsuZjtlZjqsowuXG4gICAgICB7IC4uLnJlc3VsdCwgdG9rZW5OYW1lOiBlbGVjdGVkVG9rZW4ubmFtZSwgbW9kZWw6IGNhbm9uaWNhbEFudGhyb3BpY01vZGVsKGlucHV0Lm1vZGVsKSB9LFxuICAgICAgaW5wdXQudG9vbHMsXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHF1ZXJ5U3RyZWFtKFxuICAgIGlucHV0OiBRdWVyeUlucHV0LFxuICAgIGNiOiB7XG4gICAgICBvbkRlbHRhOiAodGV4dDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25Db21wbGV0ZTogKHJlc3VsdDogUXVlcnlPdXRwdXQpID0+IHZvaWQ7XG4gICAgICBvbkVycm9yOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xuICAgICAgb25UaHJlYWRJZD86ICh0aHJlYWRJZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgICAgb25UdXJuSWQ/OiAodHVybklkOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgfSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gQW50aHJvcGljIOyKpO2KuOumrOuwjTogb3BlbmFpLyBwcmVmaXgg6rCAIOyVhOuLiOuptCBhbnRocm9waWMg6rK966GcLlxuICAgIGlmICghaW5wdXQubW9kZWw/LnN0YXJ0c1dpdGgoXCJvcGVuYWkvXCIpKSB7XG4gICAgICAvLyBBbnRocm9waWNEaXNwYXRjaGVyIOqwgCDsnojsnLzrqbQg7Iuk7KCcIGRlbHRhIOyKpO2KuOumrOuwjS4g7JeG7Jy866m0IOq4sOyhtCBxdWVyeSgpIO2PtOuwsShkZWx0YSDsl4bsnYwpLlxuICAgICAgaWYgKHRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG4gICAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgICBhd2FpdCB0aGlzLmFudGhyb3BpY0Rpc3BhdGNoZXIuZ2VuZXJhdGVTdHJlYW0oXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gbW9kZWwg66+47KeA7KCVIOyLnCBkaXNwYXRjaGVyIOqwgCBBTlRIUk9QSUNfREVGQVVMVF9NT0RFTCDsoIHsmqkuIHByZWZpeCDsoJXqt5ztmZTrj4Qg64K067aA7JeQ7IScLlxuICAgICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgICAgc3lzdGVtUHJvbXB0OiBpbnB1dC5zeXN0ZW0sXG4gICAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICAgIGNvbGRJbnB1dDogZGVjaXNpb24uY29sZElucHV0LFxuICAgICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgICAgcmV1c2U6IGRlY2lzaW9uLnJldXNlLFxuICAgICAgICAgICAgcmV1c2VJbnB1dDogZGVjaXNpb24ucmV1c2VJbnB1dCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG9uRGVsdGE6IGNiLm9uRGVsdGEsXG4gICAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5xdWVyeShpbnB1dCk7XG4gICAgICBjYi5vbkNvbXBsZXRlKHJlc3VsdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgWywgbW9kZWxdID0gaW5wdXQubW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICAgIGlmICghbW9kZWwpIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ1bmtub3duIG1vZGVsXCIpO1xuICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgIGNvbnN0IG91dHB1dFNjaGVtYSA9IGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKGlucHV0KTtcblxuICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgIHtcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICBvblR1cm5JZDogY2Iub25UdXJuSWQsXG4gICAgICAgIG9uQ29tcGxldGU6ICh0dXJuUmVzdWx0KSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNzdWVkQ29vcmQgPSBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKTtcbiAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbih0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSwgaW5wdXQudG9vbHMsIGlzc3VlZENvb3JkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgfSxcbiAgICApO1xuICB9XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgQ2xhdWRlIENvZGUg6rCAIOykgCB0b3RhbF9jb3N0X3VzZCDrpbwg7Jqw7ISgIOyCrOyaqe2VmOqzoCBmYWxsYmFjayDqs4TsgrDrp4wg6rO17Ya1IGNvc3Qg7ZWo7IiY66W8IOyTtOuLpC5cbmZ1bmN0aW9uIHRvRW11bGF0aW9uUmVzdWx0KFxuICByZXN1bHQ6IEdlbmVyYXRlUmVzdWx0LFxuKTogT21pdDxRdWVyeU91dHB1dCwgXCJjb250ZW50XCIgfCBcImZpbmlzaFJlYXNvblwiIHwgXCJydW5Db250ZXh0XCI+IHtcbiAgcmV0dXJuIHtcbiAgICB0ZXh0OiByZXN1bHQudGV4dCxcbiAgICB0b2tlbk5hbWU6IHJlc3VsdC50b2tlbk5hbWUsXG4gICAgbW9kZWw6IHJlc3VsdC5tb2RlbCxcbiAgICB1c2FnZToge1xuICAgICAgaW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICBvdXRwdXRfdG9rZW5zOiByZXN1bHQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICBjYWNoZV9yZWFkX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgIH0sXG4gICAgZHVyYXRpb25NczogcmVzdWx0LmR1cmF0aW9uTXMsXG4gICAgY29zdFVzZDpcbiAgICAgIHJlc3VsdC5jb3N0VXNkICE9PSB1bmRlZmluZWQgJiYgcmVzdWx0LmNvc3RVc2QgPiAwXG4gICAgICAgID8gcmVzdWx0LmNvc3RVc2RcbiAgICAgICAgOiBjYWxjdWxhdGVDb3N0VXNkKHJlc3VsdC5tb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICAgICAgICB9KSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNsYXVkZShcbiAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gIHRva2VuOiBzdHJpbmcsXG4gIHRpbWVvdXRNczogbnVtYmVyLFxuKTogUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PiB7XG4gIGNvbnN0IHJhd01vZGVsID0gaW5wdXQubW9kZWwgPz8gREVGQVVMVF9NT0RFTDtcbiAgY29uc3QgbW9kZWwgPSByYXdNb2RlbC5pbmNsdWRlcyhcIi9cIikgPyByYXdNb2RlbC5zcGxpdChcIi9cIikucG9wKCkhIDogcmF3TW9kZWw7XG4gIGNvbnN0IHRpbWVvdXQgPSBpbnB1dC50aW1lb3V0ID8/IHRpbWVvdXRNcztcbiAgY29uc3QgdXNlU3RydWN0dXJlZE91dHB1dCA9IGlucHV0Lmpzb25TY2hlbWEgJiYgaW5wdXQuanNvblNjaGVtYS5sZW5ndGggPiAwO1xuXG4gIC8vIC0tdG9vbHMgXCJcIiDroZwg66qo65OgIHRvb2wg7J2EIOq4sOuzuCDssKjri6guIHN0cnVjdHVyZWQgb3V0cHV0IOyTsOuptCBTdHJ1Y3R1cmVkT3V0cHV0IOunjCDtmZTsnbTtirjrpqzsiqTtirguXG4gIC8vIC0tdG9vbHMgXCJcIiDripQg67CY65Oc7IucIOuSpOyXkCDri6Trpbgg7ZSM656Y6re46rCAIOyZgOyVvCBDTEkg7YyM7Iux7J20IOu5iCDrrLjsnpDsl7TroZwg7J247IudXG4gIGNvbnN0IHRvb2xBcmdzID0gdXNlU3RydWN0dXJlZE91dHB1dFxuICAgID8gW1wiLS10b29sc1wiLCBcIlwiLCBcIi0tYWxsb3dlZC10b29sc1wiLCBcIlN0cnVjdHVyZWRPdXRwdXRcIl1cbiAgICA6IFtcIi0tdG9vbHNcIiwgXCJcIl07XG5cbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXG4gICAgXCItcFwiLFxuICAgIC4uLnRvb2xBcmdzLFxuICAgIFwiLS1kaXNhbGxvd2VkVG9vbHNcIixcbiAgICAvLyBDQ+yXkOyEnCDsnpDrj5kg7Zmc7ISx7ZmU65CY64qUIGRlZmVycmVkIOuPhOq1rC4g7Yag7YGwIOy1nOygge2ZlOulvOychO2VtCDssKjri6hcbiAgICAuLi4oW1wiTW9uaXRvclwiLCBcIlB1c2hOb3RpZmljYXRpb25cIiwgXCJSZW1vdGVUcmlnZ2VyXCJdIGFzIGNvbnN0KSxcbiAgICBcIi0tb3V0cHV0LWZvcm1hdFwiLFxuICAgIFwic3RyZWFtLWpzb25cIixcbiAgICBcIi0tdmVyYm9zZVwiLFxuICAgIC8vIC0tbWF4LXR1cm5zOiBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgdG9vbF91c2UgKyB0b29sX3Jlc3VsdCDroZwgMu2EtCDshozruYRcbiAgICBcIi0tbWF4LXR1cm5zXCIsXG4gICAgdXNlU3RydWN0dXJlZE91dHB1dCA/IFwiMlwiIDogXCIxXCIsXG4gICAgXCItLXBlcm1pc3Npb24tbW9kZVwiLFxuICAgIFwiYnlwYXNzUGVybWlzc2lvbnNcIixcbiAgICBcIi0tc2V0dGluZy1zb3VyY2VzXCIsXG4gICAgXCJwcm9qZWN0XCIsXG4gICAgXCItLW1vZGVsXCIsXG4gICAgbW9kZWwsXG4gICAgLy8gLS1zeXN0ZW0tcHJvbXB064qUIOuwmOuTnOyLnCDrqoXsi5ztlbTslbztlaguIOyYteyFmCDsg53rnrUg7IucIEND6rCAIGRlZmF1bHQgc3lzdGVtIHByb21wdOulvCDsnpDrj5nsnLzroZwg7KO87J6F7ZWoKDIzaylcbiAgICBcIi0tc3lzdGVtLXByb21wdFwiLFxuICAgIGlucHV0LnN5c3RlbSA/PyBcIlwiLFxuICAgIFwiLS10aGlua2luZ1wiLFxuICAgIFwiZGlzYWJsZWRcIixcbiAgICBcIi0tZWZmb3J0XCIsXG4gICAgaW5wdXQuZWZmb3J0ID8/IERFRkFVTFRfRUZGT1JULFxuICAgIFwiLS1uby1zZXNzaW9uLXBlcnNpc3RlbmNlXCIsXG4gICAgLy8g66qo65OgIHNraWxscyDruYTtmZzshLHtmZRcbiAgICBcIi0tZGlzYWJsZS1zbGFzaC1jb21tYW5kc1wiLFxuICBdO1xuICBpZiAodXNlU3RydWN0dXJlZE91dHB1dCkge1xuICAgIGFyZ3MucHVzaChcIi0tanNvbi1zY2hlbWFcIiwgaW5wdXQuanNvblNjaGVtYSEpO1xuICB9XG4gIGFyZ3MucHVzaChpbnB1dC5wcm9tcHQpO1xuXG4gIGNvbnN0IGVudjogTm9kZUpTLlByb2Nlc3NFbnYgPSB7XG4gICAgUEFUSDogcHJvY2Vzcy5lbnYuUEFUSCxcbiAgICBUTVBESVI6IHByb2Nlc3MuZW52LlRNUERJUixcbiAgICBDTEFVREVfQ09ERV9PQVVUSF9UT0tFTjogdG9rZW4sXG4gICAgLy8gQ0xBVURFX0NPTkZJR19ESVIg7ZmY6rK967OA7IiY66GcIOyjvOyehVxuICAgIENMQVVERV9DT05GSUdfRElSLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQVVUT19NRU1PUlk6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfQURBUFRJVkVfVEhJTktJTkc6IFwiMVwiLFxuICAgIENMQVVERV9DT0RFX0RJU0FCTEVfMU1fQ09OVEVYVDogXCIxXCIsXG4gICAgQ0xBVURFX0NPREVfRElTQUJMRV9DTEFVREVfTURTOiBcIjFcIixcbiAgICBDTEFVREVfQ09ERV9BVFRSSUJVVElPTl9IRUFERVI6IFwiMFwiLFxuICB9O1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTxPbWl0PFF1ZXJ5T3V0cHV0LCBcImNvbnRlbnRcIiB8IFwiZmluaXNoUmVhc29uXCI+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihcImNsYXVkZVwiLCBhcmdzLCB7XG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwicGlwZVwiLCBcImlnbm9yZVwiXSxcbiAgICAgIGVudixcbiAgICAgIC8vIOqyqeumrCAo65GQIOuLqOqzhCk6XG4gICAgICAvLyAxLiBDTEFVREVfQ1dEIOKAlCBwcm9qZWN0IHNjb3BlIOqyqeumrCAoY3dkIOydmCAuY2xhdWRlL3NldHRpbmdzLmpzb24pXG4gICAgICAvLyAyLiBDTEFVREVfQ09ORklHX0RJUiDigJQgdXNlciBzY29wZSDqsqnrpqwgY3dkIOqyqeumrOunjOycvOuhoCDrtoDsobEuXG4gICAgICBjd2Q6IENMQVVERV9DV0QsXG4gICAgfSk7XG5cbiAgICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoc2V0dGxlZCkgcmV0dXJuO1xuICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICBjaGlsZC5raWxsKCk7XG4gICAgICByZWplY3QobmV3IFRpbWVvdXRFcnJvcihgVGltZW91dCBhZnRlciAke3RpbWVvdXQgLyAxMDAwfXMgKHRva2VuOiAke21hc2tUb2tlbih0b2tlbil9KWApKTtcbiAgICB9LCB0aW1lb3V0KTtcblxuICAgIGNoaWxkLnN0ZG91dD8ub24oXCJkYXRhXCIsIChkOiBCdWZmZXIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBidWZmZXIgKz0gZC50b1N0cmluZygpO1xuICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoXCJcXG5cIik7XG4gICAgICBidWZmZXIgPSBsaW5lcy5wb3AoKSA/PyBcIlwiO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgIGlmICghbGluZS50cmltKCkpIGNvbnRpbnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGogPSBKU09OLnBhcnNlKGxpbmUpO1xuICAgICAgICAgIGlmIChqLnR5cGUgPT09IFwicmVzdWx0XCIgJiYgIXNldHRsZWQpIHtcbiAgICAgICAgICAgIC8vIC0tanNvbi1zY2hlbWEg7IKs7JqpIOyLnCBzdHJ1Y3R1cmVkX291dHB1dCDsl5Ag7YyM7Iux65CcIOqwneyytOqwgCDsmKjri6Qg4oaSIOyasOyEoCDsgqzsmqlcbiAgICAgICAgICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgICAgICAgICBpZiAoai5zdHJ1Y3R1cmVkX291dHB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRleHQgPSAoai5yZXN1bHQgPz8gXCJcIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXmBgYCg/Ompzb24pP1xccypcXG4/L2ksIFwiXCIpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcbj9gYGBcXHMqJC9pLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIikpIHtcbiAgICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgUXVvdGFFcnJvcihgUXVvdGEgZXhoYXVzdGVkICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgdSA9IGoudXNhZ2UgPz8ge307XG4gICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICByZXNvbHZlKHtcbiAgICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgICAgdXNhZ2U6IHtcbiAgICAgICAgICAgICAgICBpbnB1dF90b2tlbnM6IHUuaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgb3V0cHV0X3Rva2VuczogdS5vdXRwdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgICAgY2FjaGVfY3JlYXRpb25faW5wdXRfdG9rZW5zOiB1LmNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VucyA/PyAwLFxuICAgICAgICAgICAgICAgIGNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zOiB1LmNhY2hlX3JlYWRfaW5wdXRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGR1cmF0aW9uTXM6IGouZHVyYXRpb25fbXMgPz8gMCxcbiAgICAgICAgICAgICAgY29zdFVzZDogai50b3RhbF9jb3N0X3VzZCA/PyAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsICgpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgY2xvc2VkIHdpdGhvdXQgcmVzdWx0ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIGlmIChzZXR0bGVkKSByZXR1cm47XG4gICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICByZWplY3QobmV3IFByb2Nlc3NFcnJvcihgQ0xJIHByb2Nlc3MgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9ICh0b2tlbjogJHttYXNrVG9rZW4odG9rZW4pfSlgKSk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgUWdyaWREaXNwYXRjaGVyID0gbmV3IFFncmlkRGlzcGF0Y2hlckNsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFxQ0EsTUFBTSxTQUFTLFVBQVUsQ0FBQyxRQUFRLENBQUM7QUFFbkMsTUFBTSxnQkFBZ0I7QUFDdEIsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxpQkFBaUI7QUFJdkIsTUFBTSxhQUFhO0FBR25CLE1BQU0sb0JBQW9CO0FBRzFCLE1BQU0sd0JBQXdCO0NBQzVCLHVCQUF1QjtDQUN2Qix3QkFBd0I7Q0FDeEIsbUJBQW1CO0NBQ3BCO0FBR0QsTUFBTSxvQkFBb0I7QUFFMUIsU0FBZ0Isd0JBQ2QsT0FDdUI7Q0FDdkIsTUFBTSxlQUFlLE1BQU0sT0FBTyxTQUM5QixvQkFBb0IsTUFBTSxNQUFNLEdBQ2hDLE1BQU0sYUFDSCxLQUFLLE1BQU0sTUFBTSxXQUFXLEdBQzdCO0FBRU4sUUFBTyxlQUNGLFVBQVUsYUFBZ0QsR0FDM0Q7O0FBR04sSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLEtBQTJCO0NBR3hDLGdDQUFnQixJQUFJLEtBQXFCO0NBQ3pDLFVBQVU7Q0FHVixhQUFxQztDQUNyQyxtQkFBNEM7Q0FDNUMsc0JBQWtEO0NBRWxELGNBQWM7RUFDWixNQUFNLGVBQWUsS0FBSyxVQUFVLHVCQUF1QixNQUFNLEVBQUU7QUFFbkUsWUFBVSxHQUFHLFdBQVcsV0FBVyxFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ3ZELGdCQUFjLEdBQUcsV0FBVyx5QkFBeUIsYUFBYTtBQUVsRSxZQUFVLG1CQUFtQixFQUFFLFdBQVcsTUFBTSxDQUFDO0FBQ2pELGdCQUFjLEdBQUcsa0JBQWtCLGdCQUFnQixLQUFLO0FBQ3hELGdC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
|
|
165
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicWdyaWQuZGlzcGF0Y2hlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXBwbGljYXRpb24vcWdyaWQvcWdyaWQuZGlzcGF0Y2hlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFFncmlkRGlzcGF0Y2hlciDigJQgcHJvdmlkZXIgZGlzcGF0Y2hlciDrnbzsmrDtjIUgKyDthqDtgbAg7LqQ7IucL+2GteqzhCDsi7HquIDthLQuXG4gKlxuICogLSDrqZTrqqjrpqwg7LqQ7IucIChNYXA8aWQsIFRva2VuU3Vic2V0QT4pIOuKlCBUb2tlblN1YnNjcmliZXIg6rCAIHBnIExJU1RFTi9OT1RJRlkg66GcIOqwseyLoFxuICogLSBPcGVuQUkvQW50aHJvcGljIOyalOyyreydgCDqsIEgcHJvdmlkZXIgZGlzcGF0Y2hlciDroZzrp4wg7Iuk7ZaJXG4gKiAtIFF1b3RhRXJyb3Ig64qUIOq3uOuMgOuhnCDsg4HsnIQg7KCE7YyMXG4gKi9cblxuaW1wb3J0IHsgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi4vLi4vY29kZXgtcHJvdG9jb2wvc2VyZGVfanNvbi9Kc29uVmFsdWVcIjtcbmltcG9ydCB7IHR5cGUgQW50aHJvcGljRGlzcGF0Y2hlciB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvYW50aHJvcGljL2FudGhyb3BpYy1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBnZXRBY2Nlc3NUb2tlbiB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL2NyZWRlbnRpYWxzXCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVDb3N0VXNkIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vbW9kZWwtY29zdFwiO1xuaW1wb3J0IHtcbiAgdHlwZSBHZW5lcmF0ZVJlc3VsdCxcbiAgdHlwZSBTdHJlYW1DYWxsYmFja3MsXG59IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3Byb3ZpZGVyLWRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHN0cmljdGlmeSB9IGZyb20gXCIuLi8uLi91dGlscy9wcm92aWRlcnMvY29tbW9uL3N0cmljdGlmaWVyXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSURpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL29wZW5haS9vcGVuYWktZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgdHlwZSBUb2tlblN1YnNldEEgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgZGVjaWRlQ29udlJvdXRpbmcsIGlzc3VlQ29udkNvbnRleHQgfSBmcm9tIFwiLi9jb252LXJvdXRpbmdcIjtcbmltcG9ydCB7IHR5cGUgUXVlcnlJbnB1dCwgdHlwZSBRdWVyeU91dHB1dCwgdHlwZSBUb2tlblN0YXRzIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IG1hc2tUb2tlbiwgUHJvY2Vzc0Vycm9yLCBRdW90YUVycm9yIH0gZnJvbSBcIi4vcWdyaWQudHlwZXNcIjtcbmltcG9ydCB7IHR5cGUgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbiwgYnVpbGRUb29sQ2FsbFNjaGVtYSB9IGZyb20gXCIuL3Rvb2wtZW11bGF0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBRZ3JpZERpc3BhdGNoZXJDbGFzcyB7XG4gIHRva2VucyA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlblN1YnNldEE+KCk7XG5cbiAgLy8gVG9rZW5TdGF0cyBzaGFwZSDrs7TsobTsmqkuIOyLpOygnCBwcm92aWRlciDsmpTssq0g7Lm07Jq07YyF7J2AIOqwgSBkaXNwYXRjaGVyIOuhnCDsnbTrj5ntlojri6QuXG4gIHJlcXVlc3RDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4gIC8vIHNvbmFtdS5jb25maWcgb25TdGFydCDsl5DshJwg7LKY66as7ZWY64qUIOuzgOyImFxuICBzdWJzY3JpYmVyOiBUb2tlblN1YnNjcmliZXIgfCBudWxsID0gbnVsbDtcbiAgb3BlbmFpRGlzcGF0Y2hlcjogT3BlbkFJRGlzcGF0Y2hlciB8IG51bGwgPSBudWxsO1xuICBhbnRocm9waWNEaXNwYXRjaGVyOiBBbnRocm9waWNEaXNwYXRjaGVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY291bnRPZihuYW1lOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb3VudHMuZ2V0KG5hbWUpID8/IDA7XG4gIH1cblxuICAvLyBUb2tlblN1YnNjcmliZXIg7L2c67CxIOKAlCDsupDsi5wgbXV0YXRpb25cbiAgdXBzZXJ0Q2FjaGUoaWQ6IG51bWJlciwgcm93OiBUb2tlblN1YnNldEEpOiB2b2lkIHtcbiAgICB0aGlzLnRva2Vucy5zZXQoaWQsIHJvdyk7XG4gIH1cblxuICByZW1vdmVDYWNoZShpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy50b2tlbnMuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIHJlcGxhY2VDYWNoZShyb3dzOiBUb2tlblN1YnNldEFbXSk6IHZvaWQge1xuICAgIHRoaXMudG9rZW5zID0gbmV3IE1hcChyb3dzLm1hcCgocikgPT4gW3IuaWQsIHJdKSk7XG4gIH1cblxuICBnZXRTdGF0cygpOiBUb2tlblN0YXRzW10ge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbnMudmFsdWVzKCldLm1hcCgocikgPT4gKHtcbiAgICAgIHRva2VuOiBtYXNrVG9rZW4oZ2V0QWNjZXNzVG9rZW4oci5jcmVkZW50aWFscykpLFxuICAgICAgbmFtZTogci5uYW1lLFxuICAgICAgcHJvdmlkZXI6IHIucHJvdmlkZXIsXG4gICAgICByZXF1ZXN0czogdGhpcy5jb3VudE9mKHIubmFtZSksXG4gICAgfSkpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnkoaW5wdXQ6IFF1ZXJ5SW5wdXQsIHRpbWVvdXRNcz86IG51bWJlcik6IFByb21pc2U8UXVlcnlPdXRwdXQ+IHtcbiAgICB2b2lkIHRpbWVvdXRNcztcblxuICAgIGlmIChpbnB1dC50b29scz8ubGVuZ3RoICYmIGlucHV0Lmpzb25TY2hlbWEpIHtcbiAgICAgIHRocm93IG5ldyBQcm9jZXNzRXJyb3IoXCJ0b29scyBhbmQganNvblNjaGVtYSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlclwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRTY2hlbWEgPSBidWlsZFN0cmljdE91dHB1dFNjaGVtYShpbnB1dCk7XG4gICAgY29uc3Qgcm91dGUgPSBwYXJzZVByb3ZpZGVyUm91dGUoaW5wdXQubW9kZWwpO1xuXG4gICAgLy8gcHJvdmlkZXIgcHJlZml4IHJvdXRpbmc6ICdvcGVuYWkvZ3B0LTUuNCcg4oaSIE9wZW5BSURpc3BhdGNoZXJcbiAgICBpZiAocm91dGUucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpIHtcbiAgICAgIGlmICghdGhpcy5vcGVuYWlEaXNwYXRjaGVyKSB0aHJvdyBuZXcgUXVvdGFFcnJvcihcIk9wZW5BSSBkaXNwYXRjaGVyIG5vdCBpbml0aWFsaXplZFwiKTtcblxuICAgICAgY29uc3QgZGVjaXNpb24gPSBkZWNpZGVDb252Um91dGluZyhpbnB1dCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm9wZW5haURpc3BhdGNoZXIuZ2VuZXJhdGUoe1xuICAgICAgICBtb2RlbDogcm91dGUubW9kZWwsXG4gICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgIGVmZm9ydDogaW5wdXQuZWZmb3J0LFxuICAgICAgICB2ZXJib3NpdHk6IGlucHV0LnZlcmJvc2l0eSxcbiAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgc2VydmljZVRpZXI6IGlucHV0LnNlcnZpY2VUaWVyLFxuICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICByZXVzZTogZGVjaXNpb24ucmV1c2UsXG4gICAgICAgIHJldXNlSW5wdXQ6IGRlY2lzaW9uLnJldXNlSW5wdXQsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFwcGx5VG9vbENhbGxFbXVsYXRpb24oXG4gICAgICAgIHRvRW11bGF0aW9uUmVzdWx0KHJlc3VsdCksXG4gICAgICAgIGlucHV0LnRvb2xzLFxuICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHJlc3VsdC50aHJlYWRDb29yZCwgZGVjaXNpb24pLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlKHtcbiAgICAgICAgLy8gQW50aHJvcGljRGlzcGF0Y2hlciDrgrTrtoDsl5DshJwg7JWM7JWE7IScIHByb3ZpZGVyIHByZWZpeCDrpbwgY2Fub25pY2FsIG1vZGVsIOuhnCDsoJXqt5ztmZTtlahcbiAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgb3V0cHV0U2NoZW1hLFxuICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgIGNvbGRIaXN0b3J5OiBkZWNpc2lvbi5jb2xkSGlzdG9yeSxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgdG9FbXVsYXRpb25SZXN1bHQocmVzdWx0KSxcbiAgICAgICAgaW5wdXQudG9vbHMsXG4gICAgICAgIGlzc3VlQ29udkNvbnRleHQocmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbiksXG4gICAgICApO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG5cbiAgYXN5bmMgcXVlcnlTdHJlYW0oXG4gICAgaW5wdXQ6IFF1ZXJ5SW5wdXQsXG4gICAgY2I6IFN0cmVhbUNhbGxiYWNrczxRdWVyeU91dHB1dD4sXG4gICAgYWJvcnRTaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgb3V0cHV0U2NoZW1hID0gYnVpbGRTdHJpY3RPdXRwdXRTY2hlbWEoaW5wdXQpO1xuICAgIGNvbnN0IHJvdXRlID0gcGFyc2VQcm92aWRlclJvdXRlKGlucHV0Lm1vZGVsKTtcblxuICAgIGlmIChyb3V0ZS5wcm92aWRlciA9PT0gXCJvcGVuYWlcIikge1xuICAgICAgaWYgKCF0aGlzLm9wZW5haURpc3BhdGNoZXIpIHRocm93IG5ldyBRdW90YUVycm9yKFwiT3BlbkFJIGRpc3BhdGNoZXIgbm90IGluaXRpYWxpemVkXCIpO1xuXG4gICAgICBjb25zdCBkZWNpc2lvbiA9IGRlY2lkZUNvbnZSb3V0aW5nKGlucHV0KTtcbiAgICAgIGF3YWl0IHRoaXMub3BlbmFpRGlzcGF0Y2hlci5nZW5lcmF0ZVN0cmVhbShcbiAgICAgICAge1xuICAgICAgICAgIG1vZGVsOiByb3V0ZS5tb2RlbCxcbiAgICAgICAgICBzeXN0ZW1Qcm9tcHQ6IGlucHV0LnN5c3RlbSxcbiAgICAgICAgICBvdXRwdXRTY2hlbWEsXG4gICAgICAgICAgZWZmb3J0OiBpbnB1dC5lZmZvcnQsXG4gICAgICAgICAgdmVyYm9zaXR5OiBpbnB1dC52ZXJib3NpdHksXG4gICAgICAgICAgcmVhc29uaW5nU3VtbWFyeTogaW5wdXQucmVhc29uaW5nU3VtbWFyeSxcbiAgICAgICAgICBzZXJ2aWNlVGllcjogaW5wdXQuc2VydmljZVRpZXIsXG4gICAgICAgICAgY29sZElucHV0OiBkZWNpc2lvbi5jb2xkSW5wdXQsXG4gICAgICAgICAgY29sZEhpc3Rvcnk6IGRlY2lzaW9uLmNvbGRIaXN0b3J5LFxuICAgICAgICAgIHJldXNlOiBkZWNpc2lvbi5yZXVzZSxcbiAgICAgICAgICByZXVzZUlucHV0OiBkZWNpc2lvbi5yZXVzZUlucHV0LFxuICAgICAgICAgIGFib3J0U2lnbmFsLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgb25EZWx0YTogY2Iub25EZWx0YSxcbiAgICAgICAgICBvblRocmVhZElkOiBjYi5vblRocmVhZElkLFxuICAgICAgICAgIG9uVHVybklkOiBjYi5vblR1cm5JZCxcbiAgICAgICAgICBvbkNvbXBsZXRlOiAodHVyblJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY2Iub25Db21wbGV0ZShcbiAgICAgICAgICAgICAgYXBwbHlUb29sQ2FsbEVtdWxhdGlvbihcbiAgICAgICAgICAgICAgICB0b0VtdWxhdGlvblJlc3VsdCh0dXJuUmVzdWx0KSxcbiAgICAgICAgICAgICAgICBpbnB1dC50b29scyxcbiAgICAgICAgICAgICAgICBpc3N1ZUNvbnZDb250ZXh0KHR1cm5SZXN1bHQudGhyZWFkQ29vcmQsIGRlY2lzaW9uKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBvbkVycm9yOiBjYi5vbkVycm9yLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKHJvdXRlLnByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgICBpZiAoIXRoaXMuYW50aHJvcGljRGlzcGF0Y2hlcikgdGhyb3cgbmV3IFF1b3RhRXJyb3IoXCJBbnRocm9waWMgZGlzcGF0Y2hlciBub3QgaW5pdGlhbGl6ZWRcIik7XG5cbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZGVjaWRlQ29udlJvdXRpbmcoaW5wdXQpO1xuICAgICAgYXdhaXQgdGhpcy5hbnRocm9waWNEaXNwYXRjaGVyLmdlbmVyYXRlU3RyZWFtKFxuICAgICAgICB7XG4gICAgICAgICAgbW9kZWw6IGlucHV0Lm1vZGVsLFxuICAgICAgICAgIHN5c3RlbVByb21wdDogaW5wdXQuc3lzdGVtLFxuICAgICAgICAgIG91dHB1dFNjaGVtYSxcbiAgICAgICAgICBlZmZvcnQ6IGlucHV0LmVmZm9ydCxcbiAgICAgICAgICBjb2xkSW5wdXQ6IGRlY2lzaW9uLmNvbGRJbnB1dCxcbiAgICAgICAgICBjb2xkSGlzdG9yeTogZGVjaXNpb24uY29sZEhpc3RvcnksXG4gICAgICAgICAgYWJvcnRTaWduYWwsXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBvbkRlbHRhOiBjYi5vbkRlbHRhLFxuICAgICAgICAgIG9uVGhyZWFkSWQ6IGNiLm9uVGhyZWFkSWQsXG4gICAgICAgICAgb25Db21wbGV0ZTogKHR1cm5SZXN1bHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzc3VlZENvb3JkID0gaXNzdWVDb252Q29udGV4dCh0dXJuUmVzdWx0LnRocmVhZENvb3JkLCBkZWNpc2lvbik7XG4gICAgICAgICAgICBjYi5vbkNvbXBsZXRlKFxuICAgICAgICAgICAgICBhcHBseVRvb2xDYWxsRW11bGF0aW9uKHRvRW11bGF0aW9uUmVzdWx0KHR1cm5SZXN1bHQpLCBpbnB1dC50b29scywgaXNzdWVkQ29vcmQpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uRXJyb3I6IGNiLm9uRXJyb3IsXG4gICAgICAgIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IGRpcmVjdExsbUFwaUZhbGxiYWNrTm90SW1wbGVtZW50ZWQoaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHBhcnNlUHJvdmlkZXJSb3V0ZShtb2RlbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogeyBwcm92aWRlcj86IHN0cmluZzsgbW9kZWw6IHN0cmluZyB9IHtcbiAgaWYgKCFtb2RlbD8uaW5jbHVkZXMoXCIvXCIpKSB7XG4gICAgcmV0dXJuIHsgbW9kZWw6IG1vZGVsID8/IFwiXCIgfTtcbiAgfVxuXG4gIGNvbnN0IFtwcm92aWRlciwgcm91dGVkTW9kZWxdID0gbW9kZWwuc3BsaXQoXCIvXCIsIDIpO1xuICBpZiAoIXByb3ZpZGVyIHx8ICFyb3V0ZWRNb2RlbCkgdGhyb3cgbmV3IFByb2Nlc3NFcnJvcihcInVua25vd24gbW9kZWxcIik7XG4gIHJldHVybiB7IHByb3ZpZGVyLCBtb2RlbDogcm91dGVkTW9kZWwgfTtcbn1cblxuLy8gcWdyaWQgcHJvdmlkZXIgZGlzcGF0Y2hlciDsl5DshJwg7LKY66as7ZWY7KeAIOyViuuKlCDrqqjrjbjsnYAg7Zal7ZuEIOyngeygkSBMTE0gQVBJIO2YuOy2nCDsp4DsoJDsnLzroZwg67O064K464ukLlxuZnVuY3Rpb24gZGlyZWN0TGxtQXBpRmFsbGJhY2tOb3RJbXBsZW1lbnRlZChpbnB1dDogUXVlcnlJbnB1dCk6IFByb2Nlc3NFcnJvciB7XG4gIHJldHVybiBuZXcgUHJvY2Vzc0Vycm9yKFxuICAgIGBEaXJlY3QgTExNIEFQSSBmYWxsYmFjayBub3QgaW1wbGVtZW50ZWQgZm9yIG1vZGVsOiAke2lucHV0Lm1vZGVsID8/IFwiPGRlZmF1bHQ+XCJ9YCxcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyaWN0T3V0cHV0U2NoZW1hKFxuICBpbnB1dDogUGljazxRdWVyeUlucHV0LCBcInRvb2xzXCIgfCBcImpzb25TY2hlbWFcIj4sXG4pOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBvdXRwdXRTY2hlbWEgPSBpbnB1dC50b29scz8ubGVuZ3RoXG4gICAgPyBidWlsZFRvb2xDYWxsU2NoZW1hKGlucHV0LnRvb2xzKVxuICAgIDogaW5wdXQuanNvblNjaGVtYVxuICAgICAgPyAoSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKSBhcyBKc29uVmFsdWUpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICByZXR1cm4gb3V0cHV0U2NoZW1hXG4gICAgPyAoc3RyaWN0aWZ5KG91dHB1dFNjaGVtYSBhcyBQYXJhbWV0ZXJzPHR5cGVvZiBzdHJpY3RpZnk+WzBdKSBhcyBKc29uVmFsdWUpXG4gICAgOiB1bmRlZmluZWQ7XG59XG5cbi8vIEdlbmVyYXRlUmVzdWx0KHByb3ZpZGVyIGRpc3BhdGNoZXIg7J2R64u1KeulvCBhcHBseVRvb2xDYWxsRW11bGF0aW9uIOyeheugpSBzaGFwZSDroZwg66ek7ZWR7ZWc64ukLlxuLy8gT3BlbkFJL0FudGhyb3BpYywgcXVlcnkvcXVlcnlTdHJlYW0gNCDqsr3roZzqsIAg64+Z7J287ZWY6rKMIOyTtOuLpC5cbi8vIEFudGhyb3BpYyBhZGFwdGVyIOuKlCBjYWNoZSBjcmVhdGlvbiDsnYQgaW5wdXRUb2tlbnMg7JeQIO2PrO2VqO2VtCDtkZzspIDtmZTtlZjqs6AsIOuzhOuPhCDtlYTrk5zsl5Drj4Qg67O07KG07ZWc64ukLlxuLy8gcGVyLXJlcXVlc3QgY29zdCDripQgcHJvdmlkZXIg6rCAIOykgCDqsJLsnYQg7Jqw7ISgIOyCrOyaqe2VmOqzoCwg7JeG7Jy866m0IOqzte2GtSBjb3N0IO2VqOyImOulvCDsk7Tri6QuXG5mdW5jdGlvbiB0b0VtdWxhdGlvblJlc3VsdChcbiAgcmVzdWx0OiBHZW5lcmF0ZVJlc3VsdCxcbik6IE9taXQ8UXVlcnlPdXRwdXQsIFwiY29udGVudFwiIHwgXCJmaW5pc2hSZWFzb25cIiB8IFwicnVuQ29udGV4dFwiPiB7XG4gIHJldHVybiB7XG4gICAgdGV4dDogcmVzdWx0LnRleHQsXG4gICAgdG9rZW5OYW1lOiByZXN1bHQudG9rZW5OYW1lLFxuICAgIG1vZGVsOiByZXN1bHQubW9kZWwsXG4gICAgdXNhZ2U6IHtcbiAgICAgIGlucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgb3V0cHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwLFxuICAgICAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM6IHJlc3VsdC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICB9LFxuICAgIGR1cmF0aW9uTXM6IHJlc3VsdC5kdXJhdGlvbk1zLFxuICAgIGNvc3RVc2Q6XG4gICAgICByZXN1bHQuY29zdFVzZCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdC5jb3N0VXNkID4gMFxuICAgICAgICA/IHJlc3VsdC5jb3N0VXNkXG4gICAgICAgIDogY2FsY3VsYXRlQ29zdFVzZChyZXN1bHQubW9kZWwsIHtcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHJlc3VsdC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogcmVzdWx0LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiByZXN1bHQudXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgICAgICAgfSksXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBRZ3JpZERpc3BhdGNoZXIgPSBuZXcgUWdyaWREaXNwYXRjaGVyQ2xhc3MoKTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUF5QkEsSUFBYSx1QkFBYixNQUFrQztDQUNoQyx5QkFBUyxJQUFJLEtBQTJCO0NBR3hDLGdDQUFnQixJQUFJLEtBQXFCO0NBR3pDLGFBQXFDO0NBQ3JDLG1CQUE0QztDQUM1QyxzQkFBa0Q7Q0FFbEQsUUFBUSxNQUFzQjtBQUM1QixTQUFPLEtBQUssY0FBYyxJQUFJ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
|