@cartanova/qgrid-cli 2.4.6 → 2.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +15 -1
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -4
- package/bundle/dist/application/qgrid/qgrid.frame.js +20 -1
- package/bundle/dist/application/qgrid/qgrid.types.js +38 -2
- package/bundle/dist/application/request-log/request-log.model.js +49 -22
- package/bundle/dist/application/request-log-step/request-log-step.types.js +8 -1
- package/bundle/dist/application/sonamu.generated.js +37 -1
- package/bundle/dist/application/sonamu.generated.sso.js +25 -1
- package/bundle/dist/i18n/sd.generated.js +13 -1
- package/bundle/dist/migrations/20260718180824_alter_request_logs_add5_alter1.js +20 -0
- package/bundle/dist/migrations/20260718180825_alter_request_log_steps_add7_alter1.js +22 -0
- package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +8 -2
- package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +6 -3
- package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -7
- package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +117 -7
- package/bundle/dist/utils/providers/common/model-cost.js +45 -98
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +68 -0
- package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +14 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +81 -0
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +16 -9
- package/bundle/src/application/qgrid/qgrid.frame.ts +19 -0
- package/bundle/src/application/qgrid/qgrid.types.ts +36 -0
- package/bundle/src/application/qgrid/tool-emulation.test.ts +1 -0
- package/bundle/src/application/request-log/request-log.entity.json +42 -0
- package/bundle/src/application/request-log/request-log.model.test.ts +58 -0
- package/bundle/src/application/request-log/request-log.model.ts +107 -18
- package/bundle/src/application/request-log-step/request-log-step.entity.json +54 -0
- package/bundle/src/application/request-log-step/request-log-step.types.ts +7 -0
- package/bundle/src/application/sonamu.generated.http +26 -0
- package/bundle/src/application/sonamu.generated.sso.ts +24 -0
- package/bundle/src/application/sonamu.generated.ts +48 -0
- package/bundle/src/i18n/sd.generated.ts +12 -0
- package/bundle/src/migrations/20260718180824_alter_request_logs_add5_alter1.ts +25 -0
- package/bundle/src/migrations/20260718180825_alter_request_log_steps_add7_alter1.ts +29 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +15 -0
- package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +11 -2
- package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +7 -2
- package/bundle/src/utils/providers/anthropic/claude-session.test.ts +26 -0
- package/bundle/src/utils/providers/anthropic/claude-session.ts +16 -4
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +131 -0
- package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +194 -11
- package/bundle/src/utils/providers/common/model-cost.test.ts +136 -2
- package/bundle/src/utils/providers/common/model-cost.ts +76 -99
- package/bundle/src/utils/providers/common/provider-dispatcher.ts +18 -0
- package/bundle/web-dist/client/assets/{index-BOXhNo0k.js → index-CmuPjbCl.js} +3 -3
- package/bundle/web-dist/client/assets/{logs-BShH_sut.js → logs-cXOsDli3.js} +1 -1
- package/bundle/web-dist/client/assets/{monit-CoEAp5S0.js → monit-B5Edhvy-.js} +1 -1
- package/bundle/web-dist/client/assets/{routes-Dr3cGnV3.js → routes-UPWScORY.js} +1 -1
- package/bundle/web-dist/client/assets/{sd.generated-D2Y9QeiN.js → sd.generated-DYuKzBY6.js} +1 -1
- package/bundle/web-dist/client/assets/{services.generated-CmxXl220.js → services.generated-D_SkWOo-.js} +1 -1
- package/bundle/web-dist/client/assets/show-pRp-eZIK.js +30 -0
- package/bundle/web-dist/client/assets/{tokens-hP1NecIg.js → tokens-DJlttxCM.js} +1 -1
- package/bundle/web-dist/client/assets/{use-update-token-mutation-6J1T9U2-.js → use-update-token-mutation-CpFGLWUl.js} +1 -1
- package/bundle/web-dist/client/index.html +2 -2
- package/bundle/web-dist/server/assets/{lazyRouteComponent-BlfOh9S3.js → lazyRouteComponent-Cu6IkL8A.js} +1 -1
- package/bundle/web-dist/server/assets/{logs-DYly4ipQ.js → logs-Dx2knN2T.js} +10 -7
- package/bundle/web-dist/server/assets/{monit-CYyY2S2f.js → monit-DU6PLatf.js} +2 -2
- package/bundle/web-dist/server/assets/{routes-Dqu3osXt.js → routes-CTco1oJZ.js} +3 -3
- package/bundle/web-dist/server/assets/{sd.generated-CE6D5clm.js → sd.generated-qzuRe35X.js} +12 -0
- package/bundle/web-dist/server/assets/{services.generated-DyZUzXiq.js → services.generated-C8q1M41a.js} +1 -1
- package/bundle/web-dist/server/assets/{show-BDul8xLb.js → show-B3q8_GDh.js} +47 -4
- package/bundle/web-dist/server/assets/{tokens-fzMW4G74.js → tokens-Bvjn15h9.js} +3 -3
- package/bundle/web-dist/server/assets/{use-update-token-mutation-BejUW5sw.js → use-update-token-mutation-BlZo6swF.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +8 -8
- package/package.json +2 -2
- package/skills/qgrid/SKILL.md +4 -0
- package/skills/qgrid/references/ai-sdk-provider-contract.md +30 -2
- package/skills/qgrid/references/anthropic-claude-code-runtime.md +43 -5
- package/skills/qgrid/references/decision-rationale.md +2 -0
- package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
- package/skills/qgrid/references/request-log-run-lifecycle.md +6 -2
- package/skills/qgrid/references/sonamu-api-web-flow.md +13 -0
- package/bundle/web-dist/client/assets/show-CXII6Iy7.js +0 -30
|
@@ -68,11 +68,15 @@ function toUsageBreakdown(u) {
|
|
|
68
68
|
const cacheRead = u.cache_read_input_tokens ?? 0;
|
|
69
69
|
const output = u.output_tokens ?? 0;
|
|
70
70
|
const totalInput = input + cacheCreate + cacheRead;
|
|
71
|
+
const cacheCreate5m = u.cache_creation?.ephemeral_5m_input_tokens;
|
|
72
|
+
const cacheCreate1h = u.cache_creation?.ephemeral_1h_input_tokens;
|
|
71
73
|
return {
|
|
72
74
|
totalTokens: totalInput + output,
|
|
73
75
|
inputTokens: totalInput,
|
|
74
76
|
cachedInputTokens: cacheRead,
|
|
75
77
|
cacheCreationInputTokens: cacheCreate,
|
|
78
|
+
...typeof cacheCreate5m === "number" ? { cacheCreationInputTokens5m: cacheCreate5m } : {},
|
|
79
|
+
...typeof cacheCreate1h === "number" ? { cacheCreationInputTokens1h: cacheCreate1h } : {},
|
|
76
80
|
outputTokens: output,
|
|
77
81
|
reasoningOutputTokens: 0
|
|
78
82
|
};
|
|
@@ -89,6 +93,64 @@ function structuredOutputToolUseText(j) {
|
|
|
89
93
|
if (block.type === "tool_use" && block.name === "StructuredOutput" && block.input !== void 0) return JSON.stringify(block.input);
|
|
90
94
|
}
|
|
91
95
|
}
|
|
96
|
+
function canonicalEventModel(model) {
|
|
97
|
+
return (model.startsWith("anthropic/") ? model.slice(10) : model).replace(/\[1m\]$/, "");
|
|
98
|
+
}
|
|
99
|
+
function optionalString(value) {
|
|
100
|
+
return typeof value === "string" && value.length > 0 ? value : void 0;
|
|
101
|
+
}
|
|
102
|
+
function recordFallback(state, fallback) {
|
|
103
|
+
if (!state) return;
|
|
104
|
+
const normalized = {
|
|
105
|
+
...fallback,
|
|
106
|
+
fromModel: canonicalEventModel(fallback.fromModel),
|
|
107
|
+
toModel: canonicalEventModel(fallback.toModel)
|
|
108
|
+
};
|
|
109
|
+
const existing = state.modelFallbacks?.find((item) => item.trigger === normalized.trigger && item.fromModel === normalized.fromModel && item.toModel === normalized.toModel);
|
|
110
|
+
if (existing) {
|
|
111
|
+
existing.category ??= normalized.category;
|
|
112
|
+
existing.explanation ??= normalized.explanation;
|
|
113
|
+
} else (state.modelFallbacks ??= []).push(normalized);
|
|
114
|
+
state.servedModel = normalized.toModel;
|
|
115
|
+
state.refusalWithoutFallback = false;
|
|
116
|
+
}
|
|
117
|
+
function updateRoutingFromUsage(usage, state) {
|
|
118
|
+
if (!state || !usage || !Array.isArray(usage.iterations)) return;
|
|
119
|
+
let previousModel;
|
|
120
|
+
for (const raw of usage.iterations) {
|
|
121
|
+
const iteration = asObject(raw);
|
|
122
|
+
if (!iteration) continue;
|
|
123
|
+
const model = optionalString(iteration.model);
|
|
124
|
+
const type = optionalString(iteration.type);
|
|
125
|
+
if (!model) continue;
|
|
126
|
+
const canonicalModel = canonicalEventModel(model);
|
|
127
|
+
if (type === "fallback_message" && previousModel) recordFallback(state, {
|
|
128
|
+
trigger: "refusal",
|
|
129
|
+
fromModel: previousModel,
|
|
130
|
+
toModel: canonicalModel
|
|
131
|
+
});
|
|
132
|
+
previousModel = canonicalModel;
|
|
133
|
+
state.servedModel = canonicalModel;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
function updateRoutingFromMessage(message, state) {
|
|
137
|
+
if (!state || !message) return;
|
|
138
|
+
const model = optionalString(message.model);
|
|
139
|
+
const canonicalModel = model ? canonicalEventModel(model) : void 0;
|
|
140
|
+
if (canonicalModel) state.servedModel = canonicalModel;
|
|
141
|
+
const stopReason = optionalString(message.stop_reason);
|
|
142
|
+
if (stopReason) {
|
|
143
|
+
state.stopReason = stopReason;
|
|
144
|
+
if (stopReason === "refusal") state.refusalWithoutFallback = true;
|
|
145
|
+
else if (state.modelFallbacks?.some((fallback) => fallback.toModel === canonicalModel)) state.refusalWithoutFallback = false;
|
|
146
|
+
}
|
|
147
|
+
const stopDetails = asObject(message.stop_details);
|
|
148
|
+
if (stopDetails?.type === "refusal" || stopReason === "refusal") state.refusal = {
|
|
149
|
+
category: optionalString(stopDetails?.category),
|
|
150
|
+
explanation: optionalString(stopDetails?.explanation)
|
|
151
|
+
};
|
|
152
|
+
updateRoutingFromUsage(asObject(message.usage), state);
|
|
153
|
+
}
|
|
92
154
|
function handleStreamJsonLine(line, onDelta, opts) {
|
|
93
155
|
const structuredOutput = opts?.structuredOutput ?? false;
|
|
94
156
|
const state = opts?.state;
|
|
@@ -102,6 +164,14 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
102
164
|
}
|
|
103
165
|
if (j.type === "stream_event") {
|
|
104
166
|
const event = asObject(j.event);
|
|
167
|
+
if (event?.type === "message_start") updateRoutingFromMessage(asObject(event.message), state);
|
|
168
|
+
else if (event?.type === "message_delta") {
|
|
169
|
+
const stopReason = optionalString(asObject(event.delta)?.stop_reason);
|
|
170
|
+
if (state && stopReason) {
|
|
171
|
+
state.stopReason = stopReason;
|
|
172
|
+
if (stopReason === "refusal") state.refusalWithoutFallback = true;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
105
175
|
if (event && event.type === "content_block_delta") {
|
|
106
176
|
const delta = asObject(event.delta);
|
|
107
177
|
if (delta) {
|
|
@@ -112,9 +182,36 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
112
182
|
}
|
|
113
183
|
return null;
|
|
114
184
|
}
|
|
115
|
-
if (j.type === "
|
|
116
|
-
const
|
|
117
|
-
if (
|
|
185
|
+
if (j.type === "system") {
|
|
186
|
+
const subtype = optionalString(j.subtype);
|
|
187
|
+
if (subtype === "model_refusal_fallback") {
|
|
188
|
+
const fromModel = optionalString(j.originalModel) ?? optionalString(j.original_model);
|
|
189
|
+
const toModel = optionalString(j.fallbackModel) ?? optionalString(j.fallback_model);
|
|
190
|
+
if (fromModel && toModel) recordFallback(state, {
|
|
191
|
+
trigger: "refusal",
|
|
192
|
+
fromModel,
|
|
193
|
+
toModel,
|
|
194
|
+
category: optionalString(j.apiRefusalCategory) ?? optionalString(j.api_refusal_category) ?? optionalString(j.refusalCategory) ?? optionalString(j.refusal_category),
|
|
195
|
+
explanation: optionalString(j.apiRefusalExplanation) ?? optionalString(j.api_refusal_explanation) ?? optionalString(j.refusalExplanation) ?? optionalString(j.refusal_explanation)
|
|
196
|
+
});
|
|
197
|
+
} else if (subtype === "model_refusal_no_fallback" && state) {
|
|
198
|
+
const originalModel = optionalString(j.originalModel) ?? optionalString(j.original_model);
|
|
199
|
+
if (originalModel) state.servedModel = canonicalEventModel(originalModel);
|
|
200
|
+
state.stopReason = "refusal";
|
|
201
|
+
state.refusalWithoutFallback = true;
|
|
202
|
+
state.refusal = {
|
|
203
|
+
category: optionalString(j.apiRefusalCategory) ?? optionalString(j.api_refusal_category) ?? optionalString(j.refusalCategory) ?? optionalString(j.refusal_category),
|
|
204
|
+
explanation: optionalString(j.apiRefusalExplanation) ?? optionalString(j.api_refusal_explanation) ?? optionalString(j.refusalExplanation) ?? optionalString(j.refusal_explanation)
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
if (j.type === "assistant") {
|
|
210
|
+
updateRoutingFromMessage(asObject(j.message), state);
|
|
211
|
+
if (structuredOutput && state && state.structuredOutputText === void 0) {
|
|
212
|
+
const text = structuredOutputToolUseText(j);
|
|
213
|
+
if (text !== void 0) state.structuredOutputText = text;
|
|
214
|
+
}
|
|
118
215
|
return null;
|
|
119
216
|
}
|
|
120
217
|
if (j.type === "result") {
|
|
@@ -123,11 +220,20 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
123
220
|
if (preservedStructuredOutput !== void 0) text = preservedStructuredOutput;
|
|
124
221
|
else if (j.structured_output !== void 0) text = JSON.stringify(j.structured_output);
|
|
125
222
|
else text = stripCodeFence(typeof j.result === "string" ? j.result : "");
|
|
126
|
-
const
|
|
223
|
+
const rawUsage = asObject(j.usage) ?? {};
|
|
224
|
+
updateRoutingFromUsage(rawUsage, state);
|
|
225
|
+
const resultModel = optionalString(j.model);
|
|
226
|
+
if (state && resultModel && !state.servedModel) state.servedModel = canonicalEventModel(resultModel);
|
|
227
|
+
const resultStopReason = optionalString(j.stop_reason);
|
|
228
|
+
if (state && resultStopReason) {
|
|
229
|
+
state.stopReason = resultStopReason;
|
|
230
|
+
if (resultStopReason === "refusal") state.refusalWithoutFallback = true;
|
|
231
|
+
}
|
|
232
|
+
const usage = toUsageBreakdown(rawUsage);
|
|
127
233
|
const quotaExhausted = text.startsWith("You've hit");
|
|
128
234
|
const subtype = typeof j.subtype === "string" ? j.subtype : void 0;
|
|
129
235
|
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";
|
|
236
|
+
const isError = j.is_error === true || j.terminal_reason === "model_error" || subtype !== void 0 && subtype !== "success" || state?.refusalWithoutFallback === true;
|
|
131
237
|
return {
|
|
132
238
|
text,
|
|
133
239
|
usage,
|
|
@@ -136,7 +242,11 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
136
242
|
quotaExhausted,
|
|
137
243
|
isError,
|
|
138
244
|
subtype,
|
|
139
|
-
terminalReason
|
|
245
|
+
terminalReason,
|
|
246
|
+
servedModel: state?.servedModel,
|
|
247
|
+
stopReason: state?.stopReason,
|
|
248
|
+
refusal: state?.refusal,
|
|
249
|
+
modelFallbacks: state?.modelFallbacks
|
|
140
250
|
};
|
|
141
251
|
}
|
|
142
252
|
return null;
|
|
@@ -144,4 +254,4 @@ function handleStreamJsonLine(line, onDelta, opts) {
|
|
|
144
254
|
//#endregion
|
|
145
255
|
export { buildStreamJsonInput, handleStreamJsonLine, serializeStreamJsonInput };
|
|
146
256
|
|
|
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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
|
|
257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtLWpzb24tYWRhcHRlci5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9zdHJlYW0tanNvbi1hZGFwdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ2xhdWRlIENMSSBzdHJlYW0tanNvbiBhZGFwdGVyLlxuICpcbiAqIElucHV0OiBxZ3JpZCBoaXN0b3J5L2lucHV0IC0+IENsYXVkZSBKU09OTCBzdGRpbi5cbiAqIE91dHB1dDogQ2xhdWRlIEpTT05MIHN0ZG91dCAtPiBxZ3JpZCBkZWx0YXMgKyBmaW5hbCByZXN1bHQgbWV0YWRhdGEuXG4gKlxuICogUHJldmlvdXMgY29udmVyc2F0aW9uIGl0ZW1zIGFyZSBmbGF0dGVuZWQgaW50byBvbmUgYXNzaXN0YW50IGNvbnRleHQgbGluZS5cbiAqIFRoZSBvbmx5IGV4ZWN1dGFibGUgdXNlciBsaW5lIGlzIHRoZSBjdXJyZW50IGlucHV0LlxuICovXG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL2NvZGV4LXByb3RvY29sL3NlcmRlX2pzb24vSnNvblZhbHVlXCI7XG5pbXBvcnQgeyB0eXBlIFVzZXJJbnB1dCB9IGZyb20gXCIuLi8uLi8uLi9jb2RleC1wcm90b2NvbC92Mi9Vc2VySW5wdXRcIjtcbmltcG9ydCB7XG4gIHR5cGUgTW9kZWxGYWxsYmFjayxcbiAgdHlwZSBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24sXG59IGZyb20gXCIuLi9jb21tb24vcHJvdmlkZXItZGlzcGF0Y2hlclwiO1xuXG4vLyDilIDilIAg7J6F66ClIOyWtOuMke2EsCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLy8gQ2xhdWRlIHN0cmVhbS1qc29uIOyeheugpSDtlZwg7KSEKEpTT05MKS4gRW52ZWxvcGUgZmllbGRzIGFyZSBhZGRlZCBpbiBjbGF1ZGUtc2Vzc2lvbi5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhdWRlU3RyZWFtSnNvbkxpbmUge1xuICB0eXBlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gIG1lc3NhZ2U6IHtcbiAgICByb2xlOiBcInVzZXJcIiB8IFwiYXNzaXN0YW50XCI7XG4gICAgY29udGVudDogQXJyYXk8eyB0eXBlOiBcInRleHRcIjsgdGV4dDogc3RyaW5nIH0+O1xuICB9O1xufVxuXG5mdW5jdGlvbiB1c2VySW5wdXRUb1RleHQoaW5wdXQ6IEFycmF5PFVzZXJJbnB1dD4pOiBzdHJpbmcge1xuICByZXR1cm4gaW5wdXRcbiAgICAuZmlsdGVyKChpKTogaSBpcyBFeHRyYWN0PFVzZXJJbnB1dCwgeyB0eXBlOiBcInRleHRcIiB9PiA9PiBpLnR5cGUgPT09IFwidGV4dFwiKVxuICAgIC5tYXAoKGkpID0+IGkudGV4dClcbiAgICAuam9pbihcIlxcblwiKTtcbn1cblxuZnVuY3Rpb24gdGV4dEJsb2NrKHRleHQ6IHN0cmluZyk6IEFycmF5PHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZyB9PiB7XG4gIHJldHVybiBbeyB0eXBlOiBcInRleHRcIiwgdGV4dCB9XTtcbn1cblxuLy8gY29kZXggUmVzcG9uc2VJdGVtKGNvbGRIaXN0b3J5IGl0ZW0pIOy1nOyGjCBzaGFwZS5cbi8vIGV4dHJhY3RQcm9tcHRBbmRIaXN0b3J5KGFpLXNkay91dGlscy50cykg6rCAIOunjOuTnOuKlCDtmJXsi506XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcInVzZXJcIiwgY29udGVudDpbe3R5cGU6XCJpbnB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcIm1lc3NhZ2VcIiwgcm9sZTpcImFzc2lzdGFudFwiLCBjb250ZW50Olt7dHlwZTpcIm91dHB1dF90ZXh0XCIsIHRleHR9XSB9XG4vLyAgIHsgdHlwZTpcImZ1bmN0aW9uX2NhbGxcIiwgbmFtZSwgYXJndW1lbnRzLCBjYWxsX2lkIH1cbi8vICAgeyB0eXBlOlwiZnVuY3Rpb25fY2FsbF9vdXRwdXRcIiwgY2FsbF9pZCwgb3V0cHV0IH1cbnR5cGUgUmVzcG9uc2VJdGVtID0geyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcblxuZnVuY3Rpb24gYXNPYmplY3QodjogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogUmVzcG9uc2VJdGVtIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHYpID8gKHYgYXMgUmVzcG9uc2VJdGVtKSA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIHJlc3BvbnNlSXRlbVRleHQoaXRlbTogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHtcbiAgY29uc3QgY29udGVudCA9IGl0ZW0uY29udGVudDtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGNvbnRlbnQpKSByZXR1cm4gXCJcIjtcbiAgcmV0dXJuIGNvbnRlbnRcbiAgICAubWFwKChjKSA9PiB7XG4gICAgICBjb25zdCBvYmogPSBhc09iamVjdChjKTtcbiAgICAgIHJldHVybiBvYmogJiYgdHlwZW9mIG9iai50ZXh0ID09PSBcInN0cmluZ1wiID8gb2JqLnRleHQgOiBcIlwiO1xuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKVxuICAgIC5qb2luKFwiXFxuXCIpO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuQ29sZEhpc3RvcnkoY29sZEhpc3Rvcnk6IEFycmF5PEpzb25WYWx1ZT4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICBmb3IgKGNvbnN0IHJhdyBvZiBjb2xkSGlzdG9yeSkge1xuICAgIGNvbnN0IGl0ZW0gPSBhc09iamVjdChyYXcpO1xuICAgIGlmICghaXRlbSkgY29udGludWU7XG5cbiAgICBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICAgIHBhcnRzLnB1c2goYEFzc2lzdGFudDogJHtyZXNwb25zZUl0ZW1UZXh0KGl0ZW0pfWApO1xuICAgIH0gZWxzZSBpZiAoaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiBpdGVtLnJvbGUgPT09IFwidXNlclwiKSB7XG4gICAgICBwYXJ0cy5wdXNoKGBVc2VyOiAke3Jlc3BvbnNlSXRlbVRleHQoaXRlbSl9YCk7XG4gICAgfSBlbHNlIGlmIChpdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICBjb25zdCBuYW1lID0gdHlwZW9mIGl0ZW0ubmFtZSA9PT0gXCJzdHJpbmdcIiA/IGl0ZW0ubmFtZSA6IFwiXCI7XG4gICAgICBjb25zdCBhcmdzID1cbiAgICAgICAgdHlwZW9mIGl0ZW0uYXJndW1lbnRzID09PSBcInN0cmluZ1wiID8gaXRlbS5hcmd1bWVudHMgOiBKU09OLnN0cmluZ2lmeShpdGVtLmFyZ3VtZW50cyA/PyB7fSk7XG4gICAgICBwYXJ0cy5wdXNoKGBUb29sIGNhbGw6ICR7bmFtZX0oJHthcmdzfSlgKTtcbiAgICB9IGVsc2UgaWYgKGl0ZW0udHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiKSB7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICB0eXBlb2YgaXRlbS5vdXRwdXQgPT09IFwic3RyaW5nXCIgPyBpdGVtLm91dHB1dCA6IEpTT04uc3RyaW5naWZ5KGl0ZW0ub3V0cHV0ID8/IFwiXCIpO1xuICAgICAgcGFydHMucHVzaChgVG9vbCByZXN1bHQ6ICR7b3V0cHV0fWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFydHMuam9pbihcIlxcblwiKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU3RyZWFtSnNvbklucHV0KG9wdHM6IHtcbiAgY29sZEhpc3Rvcnk/OiBBcnJheTxKc29uVmFsdWU+O1xuICBpbnB1dDogQXJyYXk8VXNlcklucHV0Pjtcbn0pOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4ge1xuICBjb25zdCBsaW5lczogQXJyYXk8Q2xhdWRlU3RyZWFtSnNvbkxpbmU+ID0gW107XG5cbiAgaWYgKG9wdHMuY29sZEhpc3RvcnkgJiYgb3B0cy5jb2xkSGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZmxhdHRlbmVkID0gZmxhdHRlbkNvbGRIaXN0b3J5KG9wdHMuY29sZEhpc3RvcnkpO1xuICAgIGlmIChmbGF0dGVuZWQpIHtcbiAgICAgIGxpbmVzLnB1c2goe1xuICAgICAgICB0eXBlOiBcImFzc2lzdGFudFwiLFxuICAgICAgICBtZXNzYWdlOiB7XG4gICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICBjb250ZW50OiB0ZXh0QmxvY2soYFByaW9yIGNvbnZlcnNhdGlvbiBjb250ZXh0OlxcbiR7ZmxhdHRlbmVkfWApLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbGluZXMucHVzaCh7XG4gICAgdHlwZTogXCJ1c2VyXCIsXG4gICAgbWVzc2FnZTogeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogdGV4dEJsb2NrKHVzZXJJbnB1dFRvVGV4dChvcHRzLmlucHV0KSkgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplU3RyZWFtSnNvbklucHV0KGxpbmVzOiBBcnJheTxDbGF1ZGVTdHJlYW1Kc29uTGluZT4pOiBzdHJpbmcge1xuICByZXR1cm4gbGluZXMubWFwKChsKSA9PiBKU09OLnN0cmluZ2lmeShsKSkuam9pbihcIlxcblwiKSArIFwiXFxuXCI7XG59XG5cbi8vIOKUgOKUgCDstpzroKUg7Ja064yR7YSwIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIENsYXVkZSBzdGRvdXQoSlNPTkwp7J2EIHFncmlkIGRlbHRhcyArIGZpbmFsIHJlc3VsdCDroZwg67OA7ZmY7ZWc64ukLlxuXG5pbnRlcmZhY2UgQ2xhdWRlVXNhZ2Uge1xuICBpbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgY2FjaGVfcmVhZF9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uPzoge1xuICAgIGVwaGVtZXJhbF81bV9pbnB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgZXBoZW1lcmFsXzFoX2lucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgfTtcbiAgaXRlcmF0aW9ucz86IEFycmF5PHtcbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIG1vZGVsPzogc3RyaW5nO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1SZXN1bHQge1xuICB0ZXh0OiBzdHJpbmc7XG4gIHVzYWdlOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd247XG4gIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgY29zdFVzZDogbnVtYmVyO1xuICAvLyBxdW90YSDshozsp4QoXCJZb3UndmUgaGl0IC4uLlwiKSDqsJDsp4AuIGRpc3BhdGNoZXIg6rCAIFF1b3RhRXJyb3Ig66GcIOuzgO2ZmC5cbiAgcXVvdGFFeGhhdXN0ZWQ6IGJvb2xlYW47XG4gIC8vIHJlc3VsdC5pc19lcnJvciAvIHRlcm1pbmFsIG1vZGVsX2Vycm9yIOuTsS4gZGlzcGF0Y2hlciDqsIAg7JeQ65+s66GcIOuzgO2ZmC5cbiAgaXNFcnJvcjogYm9vbGVhbjtcbiAgLy8g7KeE64uo7JqpOiBDQyByZXN1bHQg65287J247J2YIHN1YnR5cGUoXCJzdWNjZXNzXCIgfCBcImVycm9yX21heF90dXJuc1wiIHwgLi4uKSDqs7wgdGVybWluYWxfcmVhc29uLlxuICAvLyBpc0Vycm9yIO2MkOyglSDsgqzsnKDrpbwg7JeQ65+sIOuplOyLnOyngOyXkCDrk5zrn6zrgrTquLAg7JyE7ZW0IOuztOyhtO2VnOuLpChTT04tNDk1KS5cbiAgc3VidHlwZT86IHN0cmluZztcbiAgdGVybWluYWxSZWFzb24/OiBzdHJpbmc7XG4gIC8vIOyLpOygnCDstZzsooUg7J2R64u17J2EIOunjOuToCDrqqjrjbguIEZhYmxlIHJlZnVzYWwgZmFsbGJhY2sg65WMIHJlcXVlc3RlZCBtb2RlbCDqs7wg64uk66W064ukLlxuICBzZXJ2ZWRNb2RlbD86IHN0cmluZztcbiAgc3RvcFJlYXNvbj86IHN0cmluZztcbiAgcmVmdXNhbD86IHtcbiAgICBjYXRlZ29yeT86IHN0cmluZztcbiAgICBleHBsYW5hdGlvbj86IHN0cmluZztcbiAgfTtcbiAgbW9kZWxGYWxsYmFja3M/OiBBcnJheTxNb2RlbEZhbGxiYWNrPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDbGF1ZGVTdHJlYW1Kc29uU3RhdGUge1xuICBzdHJ1Y3R1cmVkT3V0cHV0VGV4dD86IHN0cmluZztcbiAgc2VydmVkTW9kZWw/OiBzdHJpbmc7XG4gIHN0b3BSZWFzb24/OiBzdHJpbmc7XG4gIHJlZnVzYWw/OiB7XG4gICAgY2F0ZWdvcnk/OiBzdHJpbmc7XG4gICAgZXhwbGFuYXRpb24/OiBzdHJpbmc7XG4gIH07XG4gIG1vZGVsRmFsbGJhY2tzPzogQXJyYXk8TW9kZWxGYWxsYmFjaz47XG4gIHJlZnVzYWxXaXRob3V0RmFsbGJhY2s/OiBib29sZWFuO1xufVxuXG4vLyBBbnRocm9waWMgdXNhZ2UgNCDsubTthYzqs6Drpqwg4oaSIFRva2VuVXNhZ2VCcmVha2Rvd24uXG4vLyBBbnRocm9waWMgbmF0aXZlIHVzYWdlIOuKlCBpbnB1dC9jYWNoZV9jcmVhdGlvbi9jYWNoZV9yZWFkIOulvCDshJzroZwg67Cw7YOA7KCB7J24IOy5tO2FjOqzoOumrOuhnCDspIDri6QuXG4vLyDrsJjrqbQgcWdyaWQg64K067aAIO2RnOykgChUb2tlblVzYWdlQnJlYWtkb3duKeqzvCBjb3N0IOqzhOyCsOydgCBpbnB1dFRva2VucyDrpbwgXCLsoITssrQg7J6F66ClXG4vLyAoPSBub24tY2FjaGUgaW5wdXQgKyBjYWNoZSBjcmVhdGlvbiArIGNhY2hlIHJlYWQpXCIg7Jy866GcIOy3qOq4ie2VmOqzoCBjYWNoZWRJbnB1dFRva2Vucy9jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnNcbi8vIOulvCDqt7jspJEg6rCBIOuqq+ycvOuhnCDri6Tsi5wg7ZGc7Iuc7ZWc64ukKE9wZW5BSS9Db2RleCB1c2FnZSDsmYAg6rCZ7J2AIOydmOuvuCkuIOuUsOudvOyEnCDsl6zquLDshJwg7ZWp7LOQIO2RnOykgO2ZlO2VnOuLpC5cbmZ1bmN0aW9uIHRvVXNhZ2VCcmVha2Rvd24odTogQ2xhdWRlVXNhZ2UpOiBQcm92aWRlclRva2VuVXNhZ2VCcmVha2Rvd24ge1xuICBjb25zdCBpbnB1dCA9IHUuaW5wdXRfdG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlID0gdS5jYWNoZV9jcmVhdGlvbl9pbnB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVSZWFkID0gdS5jYWNoZV9yZWFkX2lucHV0X3Rva2VucyA/PyAwO1xuICBjb25zdCBvdXRwdXQgPSB1Lm91dHB1dF90b2tlbnMgPz8gMDtcbiAgY29uc3QgdG90YWxJbnB1dCA9IGlucHV0ICsgY2FjaGVDcmVhdGUgKyBjYWNoZVJlYWQ7XG4gIGNvbnN0IGNhY2hlQ3JlYXRlNW0gPSB1LmNhY2hlX2NyZWF0aW9uPy5lcGhlbWVyYWxfNW1faW5wdXRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0ZTFoID0gdS5jYWNoZV9jcmVhdGlvbj8uZXBoZW1lcmFsXzFoX2lucHV0X3Rva2VucztcbiAgcmV0dXJuIHtcbiAgICB0b3RhbFRva2VuczogdG90YWxJbnB1dCArIG91dHB1dCxcbiAgICBpbnB1dFRva2VuczogdG90YWxJbnB1dCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGUsXG4gICAgLi4uKHR5cGVvZiBjYWNoZUNyZWF0ZTVtID09PSBcIm51bWJlclwiID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogY2FjaGVDcmVhdGU1bSB9IDoge30pLFxuICAgIC4uLih0eXBlb2YgY2FjaGVDcmVhdGUxaCA9PT0gXCJudW1iZXJcIiA/IHsgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGNhY2hlQ3JlYXRlMWggfSA6IHt9KSxcbiAgICBvdXRwdXRUb2tlbnM6IG91dHB1dCxcbiAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHN0cmlwQ29kZUZlbmNlKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzXG4gICAgLnRyaW0oKVxuICAgIC5yZXBsYWNlKC9eYGBgKD86anNvbik/XFxzKlxcbj8vaSwgXCJcIilcbiAgICAucmVwbGFjZSgvXFxuP2BgYFxccyokL2ksIFwiXCIpO1xufVxuXG5mdW5jdGlvbiBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoajogUmVzcG9uc2VJdGVtKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWVzc2FnZSA9IGFzT2JqZWN0KGoubWVzc2FnZSk7XG4gIGNvbnN0IGNvbnRlbnQgPSBtZXNzYWdlPy5jb250ZW50O1xuICBpZiAoIUFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCByYXcgb2YgY29udGVudCkge1xuICAgIGNvbnN0IGJsb2NrID0gYXNPYmplY3QocmF3KTtcbiAgICBpZiAoIWJsb2NrKSBjb250aW51ZTtcbiAgICBpZiAoXG4gICAgICBibG9jay50eXBlID09PSBcInRvb2xfdXNlXCIgJiZcbiAgICAgIGJsb2NrLm5hbWUgPT09IFwiU3RydWN0dXJlZE91dHB1dFwiICYmXG4gICAgICBibG9jay5pbnB1dCAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmxvY2suaW5wdXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB3aXRob3V0UHJvdmlkZXIgPSBtb2RlbC5zdGFydHNXaXRoKFwiYW50aHJvcGljL1wiKSA/IG1vZGVsLnNsaWNlKFwiYW50aHJvcGljL1wiLmxlbmd0aCkgOiBtb2RlbDtcbiAgcmV0dXJuIHdpdGhvdXRQcm92aWRlci5yZXBsYWNlKC9cXFsxbVxcXSQvLCBcIlwiKTtcbn1cblxuZnVuY3Rpb24gb3B0aW9uYWxTdHJpbmcodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCA/IHZhbHVlIDogdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiByZWNvcmRGYWxsYmFjayhzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogTW9kZWxGYWxsYmFjayk6IHZvaWQge1xuICBpZiAoIXN0YXRlKSByZXR1cm47XG4gIGNvbnN0IG5vcm1hbGl6ZWQ6IE1vZGVsRmFsbGJhY2sgPSB7XG4gICAgLi4uZmFsbGJhY2ssXG4gICAgZnJvbU1vZGVsOiBjYW5vbmljYWxFdmVudE1vZGVsKGZhbGxiYWNrLmZyb21Nb2RlbCksXG4gICAgdG9Nb2RlbDogY2Fub25pY2FsRXZlbnRNb2RlbChmYWxsYmFjay50b01vZGVsKSxcbiAgfTtcbiAgY29uc3QgZXhpc3RpbmcgPSBzdGF0ZS5tb2RlbEZhbGxiYWNrcz8uZmluZChcbiAgICAoaXRlbSkgPT5cbiAgICAgIGl0ZW0udHJpZ2dlciA9PT0gbm9ybWFsaXplZC50cmlnZ2VyICYmXG4gICAgICBpdGVtLmZyb21Nb2RlbCA9PT0gbm9ybWFsaXplZC5mcm9tTW9kZWwgJiZcbiAgICAgIGl0ZW0udG9Nb2RlbCA9PT0gbm9ybWFsaXplZC50b01vZGVsLFxuICApO1xuICBpZiAoZXhpc3RpbmcpIHtcbiAgICBleGlzdGluZy5jYXRlZ29yeSA/Pz0gbm9ybWFsaXplZC5jYXRlZ29yeTtcbiAgICBleGlzdGluZy5leHBsYW5hdGlvbiA/Pz0gbm9ybWFsaXplZC5leHBsYW5hdGlvbjtcbiAgfSBlbHNlIHtcbiAgICAoc3RhdGUubW9kZWxGYWxsYmFja3MgPz89IFtdKS5wdXNoKG5vcm1hbGl6ZWQpO1xuICB9XG4gIHN0YXRlLnNlcnZlZE1vZGVsID0gbm9ybWFsaXplZC50b01vZGVsO1xuICBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJvdXRpbmdGcm9tVXNhZ2UoXG4gIHVzYWdlOiBSZXNwb25zZUl0ZW0gfCBudWxsLFxuICBzdGF0ZTogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIHwgdW5kZWZpbmVkLFxuKTogdm9pZCB7XG4gIGlmICghc3RhdGUgfHwgIXVzYWdlIHx8ICFBcnJheS5pc0FycmF5KHVzYWdlLml0ZXJhdGlvbnMpKSByZXR1cm47XG5cbiAgbGV0IHByZXZpb3VzTW9kZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCByYXcgb2YgdXNhZ2UuaXRlcmF0aW9ucykge1xuICAgIGNvbnN0IGl0ZXJhdGlvbiA9IGFzT2JqZWN0KHJhdyk7XG4gICAgaWYgKCFpdGVyYXRpb24pIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vZGVsID0gb3B0aW9uYWxTdHJpbmcoaXRlcmF0aW9uLm1vZGVsKTtcbiAgICBjb25zdCB0eXBlID0gb3B0aW9uYWxTdHJpbmcoaXRlcmF0aW9uLnR5cGUpO1xuICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGNhbm9uaWNhbE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChtb2RlbCk7XG4gICAgaWYgKHR5cGUgPT09IFwiZmFsbGJhY2tfbWVzc2FnZVwiICYmIHByZXZpb3VzTW9kZWwpIHtcbiAgICAgIHJlY29yZEZhbGxiYWNrKHN0YXRlLCB7XG4gICAgICAgIHRyaWdnZXI6IFwicmVmdXNhbFwiLFxuICAgICAgICBmcm9tTW9kZWw6IHByZXZpb3VzTW9kZWwsXG4gICAgICAgIHRvTW9kZWw6IGNhbm9uaWNhbE1vZGVsLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHByZXZpb3VzTW9kZWwgPSBjYW5vbmljYWxNb2RlbDtcbiAgICBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShcbiAgbWVzc2FnZTogUmVzcG9uc2VJdGVtIHwgbnVsbCxcbiAgc3RhdGU6IENsYXVkZVN0cmVhbUpzb25TdGF0ZSB8IHVuZGVmaW5lZCxcbik6IHZvaWQge1xuICBpZiAoIXN0YXRlIHx8ICFtZXNzYWdlKSByZXR1cm47XG4gIGNvbnN0IG1vZGVsID0gb3B0aW9uYWxTdHJpbmcobWVzc2FnZS5tb2RlbCk7XG4gIGNvbnN0IGNhbm9uaWNhbE1vZGVsID0gbW9kZWwgPyBjYW5vbmljYWxFdmVudE1vZGVsKG1vZGVsKSA6IHVuZGVmaW5lZDtcbiAgaWYgKGNhbm9uaWNhbE1vZGVsKSBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbE1vZGVsO1xuICBjb25zdCBzdG9wUmVhc29uID0gb3B0aW9uYWxTdHJpbmcobWVzc2FnZS5zdG9wX3JlYXNvbik7XG4gIGlmIChzdG9wUmVhc29uKSB7XG4gICAgc3RhdGUuc3RvcFJlYXNvbiA9IHN0b3BSZWFzb247XG4gICAgaWYgKHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICBlbHNlIGlmIChzdGF0ZS5tb2RlbEZhbGxiYWNrcz8uc29tZSgoZmFsbGJhY2spID0+IGZhbGxiYWNrLnRvTW9kZWwgPT09IGNhbm9uaWNhbE1vZGVsKSkge1xuICAgICAgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHN0b3BEZXRhaWxzID0gYXNPYmplY3QobWVzc2FnZS5zdG9wX2RldGFpbHMpO1xuICBpZiAoc3RvcERldGFpbHM/LnR5cGUgPT09IFwicmVmdXNhbFwiIHx8IHN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSB7XG4gICAgc3RhdGUucmVmdXNhbCA9IHtcbiAgICAgIGNhdGVnb3J5OiBvcHRpb25hbFN0cmluZyhzdG9wRGV0YWlscz8uY2F0ZWdvcnkpLFxuICAgICAgZXhwbGFuYXRpb246IG9wdGlvbmFsU3RyaW5nKHN0b3BEZXRhaWxzPy5leHBsYW5hdGlvbiksXG4gICAgfTtcbiAgfVxuICB1cGRhdGVSb3V0aW5nRnJvbVVzYWdlKGFzT2JqZWN0KG1lc3NhZ2UudXNhZ2UpLCBzdGF0ZSk7XG59XG5cbi8vIFByb2Nlc3NlcyBvbmUgQ2xhdWRlIHN0ZG91dCBKU09OTCBsaW5lLiBSZXR1cm5zIGZpbmFsIHJlc3VsdCBvbiByZXN1bHQgZXZlbnQuXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlU3RyZWFtSnNvbkxpbmUoXG4gIGxpbmU6IHN0cmluZyxcbiAgb25EZWx0YTogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgb3B0cz86IHsgc3RydWN0dXJlZE91dHB1dD86IGJvb2xlYW47IHN0YXRlPzogQ2xhdWRlU3RyZWFtSnNvblN0YXRlIH0sXG4pOiBDbGF1ZGVTdHJlYW1SZXN1bHQgfCBudWxsIHtcbiAgY29uc3Qgc3RydWN0dXJlZE91dHB1dCA9IG9wdHM/LnN0cnVjdHVyZWRPdXRwdXQgPz8gZmFsc2U7XG4gIGNvbnN0IHN0YXRlID0gb3B0cz8uc3RhdGU7XG4gIGNvbnN0IHRyaW1tZWQgPSBsaW5lLnRyaW0oKTtcbiAgaWYgKCF0cmltbWVkKSByZXR1cm4gbnVsbDtcblxuICBsZXQgajogeyBba2V5OiBzdHJpbmddOiBKc29uVmFsdWUgfCB1bmRlZmluZWQgfTtcbiAgdHJ5IHtcbiAgICBqID0gSlNPTi5wYXJzZSh0cmltbWVkKSBhcyB7IFtrZXk6IHN0cmluZ106IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwic3RyZWFtX2V2ZW50XCIpIHtcbiAgICBjb25zdCBldmVudCA9IGFzT2JqZWN0KGouZXZlbnQpO1xuICAgIGlmIChldmVudD8udHlwZSA9PT0gXCJtZXNzYWdlX3N0YXJ0XCIpIHtcbiAgICAgIHVwZGF0ZVJvdXRpbmdGcm9tTWVzc2FnZShhc09iamVjdChldmVudC5tZXNzYWdlKSwgc3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQ/LnR5cGUgPT09IFwibWVzc2FnZV9kZWx0YVwiKSB7XG4gICAgICBjb25zdCBkZWx0YSA9IGFzT2JqZWN0KGV2ZW50LmRlbHRhKTtcbiAgICAgIGNvbnN0IHN0b3BSZWFzb24gPSBvcHRpb25hbFN0cmluZyhkZWx0YT8uc3RvcF9yZWFzb24pO1xuICAgICAgaWYgKHN0YXRlICYmIHN0b3BSZWFzb24pIHtcbiAgICAgICAgc3RhdGUuc3RvcFJlYXNvbiA9IHN0b3BSZWFzb247XG4gICAgICAgIGlmIChzdG9wUmVhc29uID09PSBcInJlZnVzYWxcIikgc3RhdGUucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChldmVudCAmJiBldmVudC50eXBlID09PSBcImNvbnRlbnRfYmxvY2tfZGVsdGFcIikge1xuICAgICAgY29uc3QgZGVsdGEgPSBhc09iamVjdChldmVudC5kZWx0YSk7XG4gICAgICBpZiAoZGVsdGEpIHtcbiAgICAgICAgaWYgKHN0cnVjdHVyZWRPdXRwdXQpIHtcbiAgICAgICAgICBpZiAoZGVsdGEudHlwZSA9PT0gXCJpbnB1dF9qc29uX2RlbHRhXCIgJiYgdHlwZW9mIGRlbHRhLnBhcnRpYWxfanNvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgb25EZWx0YShkZWx0YS5wYXJ0aWFsX2pzb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZGVsdGEudHlwZSA9PT0gXCJ0ZXh0X2RlbHRhXCIgJiYgdHlwZW9mIGRlbHRhLnRleHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIG9uRGVsdGEoZGVsdGEudGV4dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJzeXN0ZW1cIikge1xuICAgIGNvbnN0IHN1YnR5cGUgPSBvcHRpb25hbFN0cmluZyhqLnN1YnR5cGUpO1xuICAgIGlmIChzdWJ0eXBlID09PSBcIm1vZGVsX3JlZnVzYWxfZmFsbGJhY2tcIikge1xuICAgICAgY29uc3QgZnJvbU1vZGVsID0gb3B0aW9uYWxTdHJpbmcoai5vcmlnaW5hbE1vZGVsKSA/PyBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsX21vZGVsKTtcbiAgICAgIGNvbnN0IHRvTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLmZhbGxiYWNrTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGouZmFsbGJhY2tfbW9kZWwpO1xuICAgICAgaWYgKGZyb21Nb2RlbCAmJiB0b01vZGVsKSB7XG4gICAgICAgIHJlY29yZEZhbGxiYWNrKHN0YXRlLCB7XG4gICAgICAgICAgdHJpZ2dlcjogXCJyZWZ1c2FsXCIsXG4gICAgICAgICAgZnJvbU1vZGVsLFxuICAgICAgICAgIHRvTW9kZWwsXG4gICAgICAgICAgY2F0ZWdvcnk6XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfY2F0ZWdvcnkpID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9jYXRlZ29yeSksXG4gICAgICAgICAgZXhwbGFuYXRpb246XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGouYXBpX3JlZnVzYWxfZXhwbGFuYXRpb24pID8/XG4gICAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9leHBsYW5hdGlvbiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc3VidHlwZSA9PT0gXCJtb2RlbF9yZWZ1c2FsX25vX2ZhbGxiYWNrXCIgJiYgc3RhdGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsTW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm9yaWdpbmFsTW9kZWwpID8/IG9wdGlvbmFsU3RyaW5nKGoub3JpZ2luYWxfbW9kZWwpO1xuICAgICAgaWYgKG9yaWdpbmFsTW9kZWwpIHN0YXRlLnNlcnZlZE1vZGVsID0gY2Fub25pY2FsRXZlbnRNb2RlbChvcmlnaW5hbE1vZGVsKTtcbiAgICAgIHN0YXRlLnN0b3BSZWFzb24gPSBcInJlZnVzYWxcIjtcbiAgICAgIHN0YXRlLnJlZnVzYWxXaXRob3V0RmFsbGJhY2sgPSB0cnVlO1xuICAgICAgc3RhdGUucmVmdXNhbCA9IHtcbiAgICAgICAgY2F0ZWdvcnk6XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlSZWZ1c2FsQ2F0ZWdvcnkpID8/XG4gICAgICAgICAgb3B0aW9uYWxTdHJpbmcoai5hcGlfcmVmdXNhbF9jYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxDYXRlZ29yeSkgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLnJlZnVzYWxfY2F0ZWdvcnkpLFxuICAgICAgICBleHBsYW5hdGlvbjpcbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaVJlZnVzYWxFeHBsYW5hdGlvbikgPz9cbiAgICAgICAgICBvcHRpb25hbFN0cmluZyhqLmFwaV9yZWZ1c2FsX2V4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbEV4cGxhbmF0aW9uKSA/P1xuICAgICAgICAgIG9wdGlvbmFsU3RyaW5nKGoucmVmdXNhbF9leHBsYW5hdGlvbiksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGlmIChqLnR5cGUgPT09IFwiYXNzaXN0YW50XCIpIHtcbiAgICB1cGRhdGVSb3V0aW5nRnJvbU1lc3NhZ2UoYXNPYmplY3Qoai5tZXNzYWdlKSwgc3RhdGUpO1xuICAgIGlmIChzdHJ1Y3R1cmVkT3V0cHV0ICYmIHN0YXRlICYmIHN0YXRlLnN0cnVjdHVyZWRPdXRwdXRUZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJ1Y3R1cmVkT3V0cHV0VG9vbFVzZVRleHQoaik7XG4gICAgICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSBzdGF0ZS5zdHJ1Y3R1cmVkT3V0cHV0VGV4dCA9IHRleHQ7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgaWYgKGoudHlwZSA9PT0gXCJyZXN1bHRcIikge1xuICAgIGxldCB0ZXh0OiBzdHJpbmc7XG4gICAgY29uc3QgcHJlc2VydmVkU3RydWN0dXJlZE91dHB1dCA9IHN0cnVjdHVyZWRPdXRwdXQgPyBzdGF0ZT8uc3RydWN0dXJlZE91dHB1dFRleHQgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGV4dCA9IHByZXNlcnZlZFN0cnVjdHVyZWRPdXRwdXQ7XG4gICAgfSBlbHNlIGlmIChqLnN0cnVjdHVyZWRfb3V0cHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRleHQgPSBKU09OLnN0cmluZ2lmeShqLnN0cnVjdHVyZWRfb3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dCA9IHN0cmlwQ29kZUZlbmNlKHR5cGVvZiBqLnJlc3VsdCA9PT0gXCJzdHJpbmdcIiA/IGoucmVzdWx0IDogXCJcIik7XG4gICAgfVxuXG4gICAgY29uc3QgcmF3VXNhZ2UgPSBhc09iamVjdChqLnVzYWdlKSA/PyB7fTtcbiAgICB1cGRhdGVSb3V0aW5nRnJvbVVzYWdlKHJhd1VzYWdlLCBzdGF0ZSk7XG4gICAgY29uc3QgcmVzdWx0TW9kZWwgPSBvcHRpb25hbFN0cmluZyhqLm1vZGVsKTtcbiAgICBpZiAoc3RhdGUgJiYgcmVzdWx0TW9kZWwgJiYgIXN0YXRlLnNlcnZlZE1vZGVsKSB7XG4gICAgICBzdGF0ZS5zZXJ2ZWRNb2RlbCA9IGNhbm9uaWNhbEV2ZW50TW9kZWwocmVzdWx0TW9kZWwpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRTdG9wUmVhc29uID0gb3B0aW9uYWxTdHJpbmcoai5zdG9wX3JlYXNvbik7XG4gICAgaWYgKHN0YXRlICYmIHJlc3VsdFN0b3BSZWFzb24pIHtcbiAgICAgIHN0YXRlLnN0b3BSZWFzb24gPSByZXN1bHRTdG9wUmVhc29uO1xuICAgICAgaWYgKHJlc3VsdFN0b3BSZWFzb24gPT09IFwicmVmdXNhbFwiKSBzdGF0ZS5yZWZ1c2FsV2l0aG91dEZhbGxiYWNrID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgdXNhZ2UgPSB0b1VzYWdlQnJlYWtkb3duKHJhd1VzYWdlIGFzIENsYXVkZVVzYWdlKTtcbiAgICBjb25zdCBxdW90YUV4aGF1c3RlZCA9IHRleHQuc3RhcnRzV2l0aChcIllvdSd2ZSBoaXRcIik7XG4gICAgY29uc3Qgc3VidHlwZSA9IHR5cGVvZiBqLnN1YnR5cGUgPT09IFwic3RyaW5nXCIgPyBqLnN1YnR5cGUgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdGVybWluYWxSZWFzb24gPSB0eXBlb2Ygai50ZXJtaW5hbF9yZWFzb24gPT09IFwic3RyaW5nXCIgPyBqLnRlcm1pbmFsX3JlYXNvbiA6IHVuZGVmaW5lZDtcblxuICAgIC8vIFNPTi00OTU6IOu5hOygleyDgSDsooXro4woZXJyb3JfbWF4X3N0cnVjdHVyZWRfb3V0cHV0X3JldHJpZXMg65OxKeuKlCDsoJXsp4HtlZjqsowg7JeQ65+s66GcIOyymOumrO2VnOuLpC5cbiAgICAvLyBDQyBzdHJ1Y3R1cmVkIG91dHB1dCDsnYAgY29uc3RyYWluZWQgZGVjb2Rpbmcg7J20IOyVhOuLiOudvCBcInRvb2wgaW5wdXQg7IOd7ISxIO2bhCDsgqztm4QgQUpWIOqygOymnVwi7J206528XG4gICAgLy8g66qo64247J20IOqwgOuBlCBwbGFjZWhvbGRlcigkUEFSQU1FVEVSX05BTUUpwrfqsbDrtoAoXCJqdXN0IGtpZGRpbmdcIinCt+2VhOuTnCDriITrnb0oYWR2YW5jZSkg6rCZ7J2AIOuwnOyekS9cbiAgICAvLyDrtojsmYTsoIQg7Lac66Cl7J2EIOuCuOuLpC4g7J2066W8IFwi6rGw7J2YIOunnuyVmOycvOuLiCDsgrTrpqzsnpBcIuqzoCDtnZjrpqzrqbQg7YG065287J207Ja47Yq4IOqygOymneyXkOyEnCDquajsp4DqsbDrgpgo7ZWE65OcIOuIhOudvSlcbiAgICAvLyDsk7DroIjquLDqsIAg7IOI7Ja0IOuCmOqwhOuLpCjsi6TsuKEgMTE2NzQvMTE2NzUpLiDslYzroKTsp4QgYmVzdCBwcmFjdGljZShyZWZ1c2FsL2RlZ2VuZXJhdGUgb3V0cHV0IOydgCDsgrTrpqzsp4BcbiAgICAvLyDrp5Dqs6AgZ3JhY2VmdWwgZXJyb3Ip64yA66GcLCBzdWJ0eXBlICE9IHN1Y2Nlc3Mg64qUIOq3uOuMgOuhnCDsl5Drn6zroZwg65GU64ukLiDtgbTrnbzsnbTslrjtirjqsIAg6re4IO2EtOydhCDsi6TtjKjroZxcbiAgICAvLyDri6Tro6jqsowg7ZWc64ukKOyKpO2KuOumvOydtOudvCDsnpDrj5kg7J6s7Iuc64+EIOyXhuydjCDigJQg7Iuc6rCEIDLrsLAg67Cp7KeAKS5cbiAgICBjb25zdCBpc0Vycm9yID1cbiAgICAgIGouaXNfZXJyb3IgPT09IHRydWUgfHxcbiAgICAgIGoudGVybWluYWxfcmVhc29uID09PSBcIm1vZGVsX2Vycm9yXCIgfHxcbiAgICAgIChzdWJ0eXBlICE9PSB1bmRlZmluZWQgJiYgc3VidHlwZSAhPT0gXCJzdWNjZXNzXCIpIHx8XG4gICAgICBzdGF0ZT8ucmVmdXNhbFdpdGhvdXRGYWxsYmFjayA9PT0gdHJ1ZTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXh0LFxuICAgICAgdXNhZ2UsXG4gICAgICBkdXJhdGlvbk1zOiB0eXBlb2Ygai5kdXJhdGlvbl9tcyA9PT0gXCJudW1iZXJcIiA/IGouZHVyYXRpb25fbXMgOiAwLFxuICAgICAgY29zdFVzZDogdHlwZW9mIGoudG90YWxfY29zdF91c2QgPT09IFwibnVtYmVyXCIgPyBqLnRvdGFsX2Nvc3RfdXNkIDogMCxcbiAgICAgIHF1b3RhRXhoYXVzdGVkLFxuICAgICAgaXNFcnJvcixcbiAgICAgIHN1YnR5cGUsXG4gICAgICB0ZXJtaW5hbFJlYXNvbixcbiAgICAgIHNlcnZlZE1vZGVsOiBzdGF0ZT8uc2VydmVkTW9kZWwsXG4gICAgICBzdG9wUmVhc29uOiBzdGF0ZT8uc3RvcFJlYXNvbixcbiAgICAgIHJlZnVzYWw6IHN0YXRlPy5yZWZ1c2FsLFxuICAgICAgbW9kZWxGYWxsYmFja3M6IHN0YXRlPy5tb2RlbEZhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBNEJBLFNBQVMsZ0JBQWdCLE9BQWlDO0FBQ3hELFFBQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxPQUFPLENBQzNFLEtBQUssTUFBTSxFQUFFLEtBQUssQ0FDbEIsS0FBSyxLQUFLOztBQUdmLFNBQVMsVUFBVSxNQUFxRDtBQUN0RSxRQUFPLENBQUM7RUFBRSxNQUFNO0VBQVE7RUFB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
|
|
@@ -56,121 +56,68 @@ const OPENAI_COSTS = {
|
|
|
56
56
|
cachedInputTokens: .175
|
|
57
57
|
}
|
|
58
58
|
};
|
|
59
|
+
function anthropicCosts(inputTokens, outputTokens) {
|
|
60
|
+
return {
|
|
61
|
+
inputTokens,
|
|
62
|
+
outputTokens,
|
|
63
|
+
cachedInputTokens: inputTokens / 10,
|
|
64
|
+
cacheCreationInputTokens: inputTokens * 2,
|
|
65
|
+
cacheCreationInputTokens5m: inputTokens * 1.25,
|
|
66
|
+
cacheCreationInputTokens1h: inputTokens * 2
|
|
67
|
+
};
|
|
68
|
+
}
|
|
59
69
|
const ANTHROPIC_COSTS = {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"claude-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
"claude-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
cacheCreationInputTokens: 1.25
|
|
77
|
-
},
|
|
78
|
-
"claude-3-5-sonnet": {
|
|
79
|
-
inputTokens: 3,
|
|
80
|
-
outputTokens: 15,
|
|
81
|
-
cachedInputTokens: .3,
|
|
82
|
-
cacheCreationInputTokens: 3.75
|
|
83
|
-
},
|
|
84
|
-
"claude-3-7-sonnet": {
|
|
85
|
-
inputTokens: 3,
|
|
86
|
-
outputTokens: 15,
|
|
87
|
-
cachedInputTokens: .3,
|
|
88
|
-
cacheCreationInputTokens: 3.75
|
|
89
|
-
},
|
|
90
|
-
"claude-sonnet-4": {
|
|
91
|
-
inputTokens: 3,
|
|
92
|
-
outputTokens: 15,
|
|
93
|
-
cachedInputTokens: .3,
|
|
94
|
-
cacheCreationInputTokens: 3.75
|
|
95
|
-
},
|
|
96
|
-
"claude-sonnet-4-5": {
|
|
97
|
-
inputTokens: 3,
|
|
98
|
-
outputTokens: 15,
|
|
99
|
-
cachedInputTokens: .3,
|
|
100
|
-
cacheCreationInputTokens: 3.75
|
|
101
|
-
},
|
|
102
|
-
"claude-sonnet-4-6": {
|
|
103
|
-
inputTokens: 3,
|
|
104
|
-
outputTokens: 15,
|
|
105
|
-
cachedInputTokens: .3,
|
|
106
|
-
cacheCreationInputTokens: 3.75
|
|
107
|
-
},
|
|
108
|
-
"claude-sonnet-4-7": {
|
|
109
|
-
inputTokens: 3,
|
|
110
|
-
outputTokens: 15,
|
|
111
|
-
cachedInputTokens: .3,
|
|
112
|
-
cacheCreationInputTokens: 3.75
|
|
113
|
-
},
|
|
114
|
-
"claude-opus-4": {
|
|
115
|
-
inputTokens: 15,
|
|
116
|
-
outputTokens: 75,
|
|
117
|
-
cachedInputTokens: 1.5,
|
|
118
|
-
cacheCreationInputTokens: 18.75
|
|
119
|
-
},
|
|
120
|
-
"claude-opus-4-1": {
|
|
121
|
-
inputTokens: 15,
|
|
122
|
-
outputTokens: 75,
|
|
123
|
-
cachedInputTokens: 1.5,
|
|
124
|
-
cacheCreationInputTokens: 18.75
|
|
125
|
-
},
|
|
126
|
-
"claude-opus-4-5": {
|
|
127
|
-
inputTokens: 5,
|
|
128
|
-
outputTokens: 25,
|
|
129
|
-
cachedInputTokens: .5,
|
|
130
|
-
cacheCreationInputTokens: 6.25
|
|
131
|
-
},
|
|
132
|
-
"claude-opus-4-6": {
|
|
133
|
-
inputTokens: 5,
|
|
134
|
-
outputTokens: 25,
|
|
135
|
-
cachedInputTokens: .5,
|
|
136
|
-
cacheCreationInputTokens: 6.25
|
|
137
|
-
},
|
|
138
|
-
"claude-opus-4-7": {
|
|
139
|
-
inputTokens: 5,
|
|
140
|
-
outputTokens: 25,
|
|
141
|
-
cachedInputTokens: .5,
|
|
142
|
-
cacheCreationInputTokens: 6.25
|
|
143
|
-
},
|
|
144
|
-
"claude-opus-4-8": {
|
|
145
|
-
inputTokens: 5,
|
|
146
|
-
outputTokens: 25,
|
|
147
|
-
cachedInputTokens: .5,
|
|
148
|
-
cacheCreationInputTokens: 6.25
|
|
149
|
-
}
|
|
70
|
+
"claude-fable-5": anthropicCosts(10, 50),
|
|
71
|
+
sonnet: anthropicCosts(3, 15),
|
|
72
|
+
"claude-3-5-haiku": anthropicCosts(.8, 4),
|
|
73
|
+
"claude-haiku-4-5": anthropicCosts(1, 5),
|
|
74
|
+
"claude-3-5-sonnet": anthropicCosts(3, 15),
|
|
75
|
+
"claude-3-7-sonnet": anthropicCosts(3, 15),
|
|
76
|
+
"claude-sonnet-4": anthropicCosts(3, 15),
|
|
77
|
+
"claude-sonnet-4-5": anthropicCosts(3, 15),
|
|
78
|
+
"claude-sonnet-4-6": anthropicCosts(3, 15),
|
|
79
|
+
"claude-sonnet-4-7": anthropicCosts(3, 15),
|
|
80
|
+
"claude-opus-4": anthropicCosts(15, 75),
|
|
81
|
+
"claude-opus-4-1": anthropicCosts(15, 75),
|
|
82
|
+
"claude-opus-4-5": anthropicCosts(5, 25),
|
|
83
|
+
"claude-opus-4-6": anthropicCosts(5, 25),
|
|
84
|
+
"claude-opus-4-7": anthropicCosts(5, 25),
|
|
85
|
+
"claude-opus-4-8": anthropicCosts(5, 25)
|
|
150
86
|
};
|
|
87
|
+
const CLAUDE_SONNET_5_INTRO_PRICING_END_MS = Date.UTC(2026, 8, 1);
|
|
88
|
+
const CLAUDE_SONNET_5_INTRO_COSTS = anthropicCosts(2, 10);
|
|
89
|
+
const CLAUDE_SONNET_5_STANDARD_COSTS = anthropicCosts(3, 15);
|
|
151
90
|
const DEFAULT_COSTS = {
|
|
152
91
|
inputTokens: 3,
|
|
153
92
|
outputTokens: 15,
|
|
154
93
|
cachedInputTokens: .3
|
|
155
94
|
};
|
|
156
|
-
function getModelCosts(model) {
|
|
157
|
-
const normalizedModel = model.replace(/\[1m\]$/i, "");
|
|
95
|
+
function getModelCosts(model, atMs = Date.now()) {
|
|
96
|
+
const normalizedModel = (model.split("/").pop() ?? model).replace(/\[1m\]$/i, "");
|
|
97
|
+
if (normalizedModel === "claude-sonnet-5") return atMs < CLAUDE_SONNET_5_INTRO_PRICING_END_MS ? CLAUDE_SONNET_5_INTRO_COSTS : CLAUDE_SONNET_5_STANDARD_COSTS;
|
|
158
98
|
return OPENAI_COSTS[normalizedModel] ?? ANTHROPIC_COSTS[normalizedModel] ?? DEFAULT_COSTS;
|
|
159
99
|
}
|
|
160
|
-
function calculateCostUsd(model, usage) {
|
|
161
|
-
const costs = getModelCosts(model);
|
|
100
|
+
function calculateCostUsd(model, usage, atMs = Date.now()) {
|
|
101
|
+
const costs = getModelCosts(model, atMs);
|
|
162
102
|
const cachedInput = usage.cachedInputTokens ?? 0;
|
|
163
|
-
const
|
|
103
|
+
const cacheCreationInput5m = Math.max(usage.cacheCreationInputTokens5m ?? 0, 0);
|
|
104
|
+
const cacheCreationInput1h = Math.max(usage.cacheCreationInputTokens1h ?? 0, 0);
|
|
105
|
+
const cacheCreationInput = Math.max(usage.cacheCreationInputTokens ?? 0, cacheCreationInput5m + cacheCreationInput1h);
|
|
106
|
+
const classifiedCacheCreationInput5m = Math.min(cacheCreationInput5m, cacheCreationInput);
|
|
107
|
+
const classifiedCacheCreationInput1h = Math.min(cacheCreationInput1h, cacheCreationInput - classifiedCacheCreationInput5m);
|
|
108
|
+
const unclassifiedCacheCreationInput = cacheCreationInput - classifiedCacheCreationInput5m - classifiedCacheCreationInput1h;
|
|
164
109
|
const nonCachedInput = Math.max(usage.inputTokens - cachedInput - cacheCreationInput, 0);
|
|
165
110
|
const lc = costs.longContext;
|
|
166
111
|
const isLongContext = lc !== void 0 && usage.inputTokens > lc.threshold;
|
|
167
112
|
const inputRate = costs.inputTokens * (isLongContext ? lc.inputMultiplier : 1);
|
|
168
113
|
const cachedRate = costs.cachedInputTokens * (isLongContext ? lc.cachedInputMultiplier : 1);
|
|
169
|
-
const
|
|
114
|
+
const cacheCreationFallbackRate = (costs.cacheCreationInputTokens ?? costs.inputTokens) * (isLongContext ? lc.inputMultiplier : 1);
|
|
115
|
+
const cacheCreation5mRate = (costs.cacheCreationInputTokens5m ?? costs.cacheCreationInputTokens ?? costs.inputTokens) * (isLongContext ? lc.inputMultiplier : 1);
|
|
116
|
+
const cacheCreation1hRate = (costs.cacheCreationInputTokens1h ?? costs.cacheCreationInputTokens ?? costs.inputTokens) * (isLongContext ? lc.inputMultiplier : 1);
|
|
170
117
|
const outputRate = costs.outputTokens * (isLongContext ? lc.outputMultiplier : 1);
|
|
171
|
-
return nonCachedInput / 1e6 * inputRate + usage.outputTokens / 1e6 * outputRate + cachedInput / 1e6 * cachedRate +
|
|
118
|
+
return nonCachedInput / 1e6 * inputRate + usage.outputTokens / 1e6 * outputRate + cachedInput / 1e6 * cachedRate + unclassifiedCacheCreationInput / 1e6 * cacheCreationFallbackRate + classifiedCacheCreationInput5m / 1e6 * cacheCreation5mRate + classifiedCacheCreationInput1h / 1e6 * cacheCreation1hRate;
|
|
172
119
|
}
|
|
173
120
|
//#endregion
|
|
174
121
|
export { calculateCostUsd, getModelCosts };
|
|
175
122
|
|
|
176
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBsb25nLWNvbnRleHQg7ZWg7KadLiDsoITssrQg7J6F66ClIO2GoO2BsChpbnB1dF90b2tlbnMsIGNhY2hlX3JlYWQg7Y+s7ZWoKeydtCB0aHJlc2hvbGQg7LSI6rO8IOyLnFxuICAgKiDstIjqs7zrtoTrp4zsnbQg7JWE64uI6528IOyalOyyrSDsoITssrQoZnVsbCBzZXNzaW9uKeyXkCDrsLDsnKgg7KCB7JqpLlxuICAgKi9cbiAgbG9uZ0NvbnRleHQ/OiB7XG4gICAgdGhyZXNob2xkOiBudW1iZXI7XG4gICAgaW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gICAgb3V0cHV0TXVsdGlwbGllcjogbnVtYmVyO1xuICB9O1xufVxuXG4vLyDilIDilIAgT3BlbkFJIOKAlCBjb2RleCBhcHAtc2VydmVyIOyXkOyEnCDsgqzsmqkg6rCA64ql7ZWcIOuqqOuNuCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyDqsIDqsqkg7Lac7LKYOiBodHRwczovL29wZW5haS5jb20vYXBpL3ByaWNpbmcgKDIwMjYtMDYtMTEg7ZmV7J24KVxuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG5jb25zdCBPUEVOQUlfQ09TVFM6IFJlY29yZDxzdHJpbmcsIE1vZGVsQ29zdHM+ID0ge1xuICAvLyBHUFQtNS42IFNvbCwgVGVycmEsIEx1bmEuIE9wZW5BSSBuYXRpdmUgQVBJIOuKlCAxLjA1TSBjb250ZXh0IC8gMTI4SyBtYXggb3V0cHV0IOydtOyngOunjCxcbiAgLy8gcWdyaWQg7J2YIGNvZGV4IGFwcC1zZXJ2ZXIg6rK966Gc64qUIGNvbnRleHRfd2luZG93PTM3MksgKG1heF9jb250ZXh0X3dpbmRvdyDrj4QgMzcySyxcbiAgLy8gZWZmZWN0aXZlIDk1JSDiiYggMzUzSykg66GcIOygnO2VnOuQnOuLpCDigJQgY29kZXggMC4xNDQuMSBtb2RlbHNfY2FjaGUg7Iuk7LihICgyMDI2LTA3LTEwKS5cbiAgLy8gY2FjaGUgd3JpdGUg64qUIHVuY2FjaGVkIGlucHV0IOydmCAxLjI1eCDroZwg6rO86riI65CY7KeA66eMLCBjb2RleCBhcHAtc2VydmVyIHVzYWdlXG4gIC8vIChUb2tlblVzYWdlQnJlYWtkb3duKSDsl5AgY2FjaGUgd3JpdGUg7Yag7YGwIO2VhOuTnOqwgCDsl4bslrQg7ZiE7J6sIE9wZW5BSSDsi6Ttlokg6rK966Gc7J2YXG4gIC8vIGNvc3Qg6rOE7IKw7JeQ7ISc64qUIO2VreyDgSAwIOycvOuhnCDsnqHtnozri6Qg4oaSIOq3uOunjO2BvCDqs7zshozsp5Hqs4QuIOuLqOqwgOuKlCDsmbjrtoAgbG9nZ2VyL21hbnVhbFxuICAvLyB1c2FnZSDsnoXroKXqs7wg7Zal7ZuEIO2UhOuhnO2GoOy9nCDtmZXsnqXsnYQg7JyE7ZW0IOycoOyngO2VnOuLpC5cbiAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTUuNi1zb2xcbiAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTUuNi10ZXJyYVxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LWx1bmFcbiAgXCJncHQtNS42LXNvbFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAzMCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNi4yNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNi10ZXJyYVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDIuNSxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy4xMjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICBcImdwdC01LjYtbHVuYVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDEsXG4gICAgb3V0cHV0VG9rZW5zOiA2LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxLjI1LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTUvICgyMDI2LTA0IOy2nOyLnClcbiAgXCJncHQtNS41XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDMwLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNC8gKDIwMjYtMDMg7Lac7IucKVxuICBcImdwdC01LjRcIjoge1xuICAgIGlucHV0VG9rZW5zOiAyLjUsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNC1taW5pXCI6IHsgaW5wdXRUb2tlbnM6IDAuNzUsIG91dHB1dFRva2VuczogNC41LCBjYWNoZWRJbnB1dFRva2VuczogMC4wNzUgfSxcbiAgLy8gZ3B0LTUuMuyZgCDrj5nsnbwg64uo6rCAIChjYWNoZWQgPSBpbnB1dOydmCAxMCUpXG4gIFwiZ3B0LTUuMy1jb2RleFwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTIvIChjYWNoZWQgaW5wdXQgOTAlIO2VoOyduCDrqoXsi5wpXG4gIFwiZ3B0LTUuMlwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbn07XG5cbi8vIOKUgOKUgCBBbnRocm9waWMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IEFOVEhST1BJQ19DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIC8vIENsYXVkZSBDb2RlIOuKlCDrs4Trj4QgdHRsOlwiMWhcIiDsmLXshZgg7JeG7J20IOyLpO2WieuQmOuvgOuhnCBmYWxsYmFjayDqsIDqsqntkZzripQgNeu2hCBjYWNoZSB3cml0ZSgxLjI1eCnrpbwg6riw7KSA7Jy866GcIOuRlOuLpC5cbiAgLy8gMeyLnOqwhCBjYWNoZSB3cml0ZSDripQgaW5wdXQgMngg7J207KeA66eMIO2YhOyerCBxZ3JpZCDsi6Ttlokg6rK966Gc7J2YIOq4sOuzuOqwkuydtCDslYTri4jri6QuXG4gIHNvbm5ldDoge1xuICAgIGlucHV0VG9rZW5zOiAzLFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDMuNzUsXG4gIH0sXG4gIFwiY2xhdWRlLTMtNS1oYWlrdVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDAuOCxcbiAgICBvdXRwdXRUb2tlbnM6IDQsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMDgsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxLFxuICB9LFxuICBcImNsYXVkZS1oYWlrdS00LTVcIjoge1xuICAgIGlucHV0VG9rZW5zOiAxLFxuICAgIG91dHB1dFRva2VuczogNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4xLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMS4yNSxcbiAgfSxcbiAgXCJjbGF1ZGUtMy01LXNvbm5ldFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtMy03LXNvbm5ldFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDMsXG4gICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4zLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMy43NSxcbiAgfSxcbiAgXCJjbGF1ZGUtc29ubmV0LTRcIjoge1xuICAgIGlucHV0VG9rZW5zOiAzLFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDMuNzUsXG4gIH0sXG4gIFwiY2xhdWRlLXNvbm5ldC00LTVcIjoge1xuICAgIGlucHV0VG9rZW5zOiAzLFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDMuNzUsXG4gIH0sXG4gIFwiY2xhdWRlLXNvbm5ldC00LTZcIjoge1xuICAgIGlucHV0VG9rZW5zOiAzLFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDMuNzUsXG4gIH0sXG4gIFwiY2xhdWRlLXNvbm5ldC00LTdcIjoge1xuICAgIGlucHV0VG9rZW5zOiAzLFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDMuNzUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDE1LFxuICAgIG91dHB1dFRva2VuczogNzUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDEuNSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDE4Ljc1LFxuICB9LFxuICBcImNsYXVkZS1vcHVzLTQtMVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDE1LFxuICAgIG91dHB1dFRva2VuczogNzUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDEuNSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDE4Ljc1LFxuICB9LFxuICBcImNsYXVkZS1vcHVzLTQtNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAyNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNi4yNSxcbiAgfSxcbiAgXCJjbGF1ZGUtb3B1cy00LTZcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMjUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDYuMjUsXG4gIH0sXG4gIFwiY2xhdWRlLW9wdXMtNC03XCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDI1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICB9LFxuICBcImNsYXVkZS1vcHVzLTQtOFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAyNSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNi4yNSxcbiAgfSxcbn07XG5cbmNvbnN0IERFRkFVTFRfQ09TVFM6IE1vZGVsQ29zdHMgPSB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbENvc3RzKG1vZGVsOiBzdHJpbmcpOiBNb2RlbENvc3RzIHtcbiAgY29uc3Qgbm9ybWFsaXplZE1vZGVsID0gbW9kZWwucmVwbGFjZSgvXFxbMW1cXF0kL2ksIFwiXCIpO1xuICByZXR1cm4gT1BFTkFJX0NPU1RTW25vcm1hbGl6ZWRNb2RlbF0gPz8gQU5USFJPUElDX0NPU1RTW25vcm1hbGl6ZWRNb2RlbF0gPz8gREVGQVVMVF9DT1NUUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvc3RVc2QoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHVzYWdlOiB7XG4gICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dFRva2Vucz86IG51bWJlcjtcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIH0sXG4pOiBudW1iZXIge1xuICBjb25zdCBjb3N0cyA9IGdldE1vZGVsQ29zdHMobW9kZWwpO1xuICBjb25zdCBjYWNoZWRJbnB1dCA9IHVzYWdlLmNhY2hlZElucHV0VG9rZW5zID8/IDA7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25JbnB1dCA9IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyAwO1xuICBjb25zdCBub25DYWNoZWRJbnB1dCA9IE1hdGgubWF4KHVzYWdlLmlucHV0VG9rZW5zIC0gY2FjaGVkSW5wdXQgLSBjYWNoZUNyZWF0aW9uSW5wdXQsIDApO1xuXG4gIC8vIGxvbmctY29udGV4dCDtlaDspp06IOyghOyytCDsnoXroKUoaW5wdXRfdG9rZW5zLCBjYWNoZSDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucIOyalOyyrSDsoITssrTsl5Ag67Cw7JyoIOyggeyaqVxuICBjb25zdCBsYyA9IGNvc3RzLmxvbmdDb250ZXh0O1xuICBjb25zdCBpc0xvbmdDb250ZXh0ID0gbGMgIT09IHVuZGVmaW5lZCAmJiB1c2FnZS5pbnB1dFRva2VucyA+IGxjLnRocmVzaG9sZDtcbiAgY29uc3QgaW5wdXRSYXRlID0gY29zdHMuaW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZWRSYXRlID0gY29zdHMuY2FjaGVkSW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmNhY2hlZElucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uUmF0ZSA9XG4gICAgKGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyBjb3N0cy5pbnB1dFRva2VucykgKlxuICAgIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICByZXR1cm4gKFxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgIChjYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvblJhdGVcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFxQ0EsTUFBTSxvQkFBNEQ7Q0FDaEUsV0FBVztDQUNYLGlCQUFpQjtDQUNqQix1QkFBdUI7Q0FDdkIsa0JBQWtCO0NBQ25CO0FBRUQsTUFBTSxlQUEyQztDQVcvQyxlQUFlO0VBQ2IsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzFCLGFBQWE7RUFDZDtDQUNELGlCQUFpQjtFQUNmLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0VBQ2Q7Q0FDRCxnQkFBZ0I7RUFDZCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtFQUNkO0NBRUQsV0FBVztFQUNULGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLGFBQWE7RUFDZDtDQUVELFdBQVc7RUFDVCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixhQUFhO0VBQ2Q7Q0FDRCxnQkFBZ0I7RUFBRSxhQUFhO0VBQU0sY0FBYztFQUFLLG1CQUFtQjtFQUFPO0NBRWxGLGlCQUFpQjtFQUFFLGFBQWE7RUFBTSxjQUFjO0VBQUksbUJBQW1CO0VBQU87Q0FFbEYsV0FBVztFQUFF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
|
|
123
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhnTogY29kZXggYXBwLXNlcnZlciBtb2RlbC9saXN0IFJQQyDroZwg7Iuk7LihICgyMDI2LTA1LTE4KVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKiogVFRMIGJyZWFrZG93biDsnbQg7JeG64qUIHVzYWdlIOyXkCDsoIHsmqntlaAgY2FjaGUgd3JpdGUgZmFsbGJhY2sg64uo6rCALiAqL1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbiAgLyoqXG4gICAqIGxvbmctY29udGV4dCDtlaDspp0uIOyghOyytCDsnoXroKUg7Yag7YGwKGlucHV0X3Rva2VucywgY2FjaGVfcmVhZCDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucXG4gICAqIOy0iOqzvOu2hOunjOydtCDslYTri4jrnbwg7JqU7LKtIOyghOyytChmdWxsIHNlc3Npb24p7JeQIOuwsOycqCDsoIHsmqkuXG4gICAqL1xuICBsb25nQ29udGV4dD86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBpbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBvdXRwdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gIH07XG59XG5cbi8vIOKUgOKUgCBPcGVuQUkg4oCUIGNvZGV4IGFwcC1zZXJ2ZXIg7JeQ7IScIOyCrOyaqSDqsIDriqXtlZwg66qo6424IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIOqwgOqyqSDstpzsspg6IGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscyAoMjAyNi0wNy0xOCDtmZXsnbgpXG4vLyDsi6Drqqjrjbgg7Lac7Iuc66eI64ukIOuLqOqwgOqwgCDrsJTrgIzrr4DroZwoNS4y4oaSNS404oaSNS41KSDrqqjrjbgg7LaU6rCAIOyLnCDrsJjrk5zsi5wg6rO17IudIO2OmOydtOyngCDsnqztmZXsnbjtlbTslbztlahcblxuLy8gR1BULTUuNOyXkOyEnCDsspjsnYwg64+E7J6F65CcIGxvbmctY29udGV4dCDtlaDspp0gKDUuMi81LjMtY29kZXjripQg7ZW064u5IOyXhuydjCwgNS40LW1pbmkvbmFub+uKlCDqs7Xsi50g7ZGc7JeQ7IScIGxvbmctY29udGV4dCDri6jqsIAg7JeG7J2MKVxuLy8gMjcySyDstIjqs7wg7IucIGlucHV0IDJ4IC8gY2FjaGVkIDJ4IC8gb3V0cHV0IDEuNXgg4oCUIOy0iOqzvOu2hOunjOydtCDslYTri4wg7IS47IWYIOyghOyytOyXkCDsoIHsmqnrkKhcbi8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjUgKFwicHJvbXB0cyB3aXRoID4yNzJLIGlucHV0IHRva2Vuc1wiKVxuY29uc3QgTE9OR19DT05URVhUXzI3Mks6IE5vbk51bGxhYmxlPE1vZGVsQ29zdHNbXCJsb25nQ29udGV4dFwiXT4gPSB7XG4gIHRocmVzaG9sZDogMjcyXzAwMCxcbiAgaW5wdXRNdWx0aXBsaWVyOiAyLFxuICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IDIsXG4gIG91dHB1dE11bHRpcGxpZXI6IDEuNSxcbn07XG5cbmNvbnN0IE9QRU5BSV9DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIC8vIEdQVC01LjYgU29sLCBUZXJyYSwgTHVuYS4gT3BlbkFJIG5hdGl2ZSBBUEkg64qUIDEuMDVNIGNvbnRleHQgLyAxMjhLIG1heCBvdXRwdXQg7J207KeA66eMLFxuICAvLyBxZ3JpZCDsnZggY29kZXggYXBwLXNlcnZlciDqsr3roZzripQgY29udGV4dF93aW5kb3c9MzcySyAobWF4X2NvbnRleHRfd2luZG93IOuPhCAzNzJLLFxuICAvLyBlZmZlY3RpdmUgOTUlIOKJiCAzNTNLKSDroZwg7KCc7ZWc65Cc64ukIOKAlCBjb2RleCAwLjE0NC4xIG1vZGVsc19jYWNoZSDsi6TsuKEgKDIwMjYtMDctMTApLlxuICAvLyBjYWNoZSB3cml0ZSDripQgdW5jYWNoZWQgaW5wdXQg7J2YIDEuMjV4IOuhnCDqs7zquIjrkJjsp4Drp4wsIGNvZGV4IGFwcC1zZXJ2ZXIgdXNhZ2VcbiAgLy8gKFRva2VuVXNhZ2VCcmVha2Rvd24pIOyXkCBjYWNoZSB3cml0ZSDthqDtgbAg7ZWE65Oc6rCAIOyXhuyWtCDtmITsnqwgT3BlbkFJIOyLpO2WiSDqsr3roZzsnZhcbiAgLy8gY29zdCDqs4TsgrDsl5DshJzripQg7ZWt7IOBIDAg7Jy866GcIOyeoe2ejOuLpCDihpIg6re466eM7YG8IOqzvOyGjOynkeqzhC4g64uo6rCA64qUIOyZuOu2gCBsb2dnZXIvbWFudWFsXG4gIC8vIHVzYWdlIOyeheugpeqzvCDtlqXtm4Qg7ZSE66Gc7Yag7L2cIO2ZleyepeydhCDsnITtlbQg7Jyg7KeA7ZWc64ukLlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXNvbFxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXRlcnJhXG4gIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtbHVuYVxuICBcImdwdC01LjYtc29sXCI6IHtcbiAgICBpbnB1dFRva2VuczogNSxcbiAgICBvdXRwdXRUb2tlbnM6IDMwLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiA2LjI1LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS42LXRlcnJhXCI6IHtcbiAgICBpbnB1dFRva2VuczogMi41LFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAzLjEyNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNi1sdW5hXCI6IHtcbiAgICBpbnB1dFRva2VuczogMSxcbiAgICBvdXRwdXRUb2tlbnM6IDYsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMSxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDEuMjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNS8gKDIwMjYtMDQg7Lac7IucKVxuICBcImdwdC01LjVcIjoge1xuICAgIGlucHV0VG9rZW5zOiA1LFxuICAgIG91dHB1dFRva2VuczogMzAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS00LyAoMjAyNi0wMyDstpzsi5wpXG4gIFwiZ3B0LTUuNFwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDIuNSxcbiAgICBvdXRwdXRUb2tlbnM6IDE1LFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS40LW1pbmlcIjogeyBpbnB1dFRva2VuczogMC43NSwgb3V0cHV0VG9rZW5zOiA0LjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA3NSB9LFxuICAvLyBncHQtNS4y7JmAIOuPmeydvCDri6jqsIAgKGNhY2hlZCA9IGlucHV07J2YIDEwJSlcbiAgXCJncHQtNS4zLWNvZGV4XCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxuICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtMi8gKGNhY2hlZCBpbnB1dCA5MCUg7ZWg7J24IOuqheyLnClcbiAgXCJncHQtNS4yXCI6IHsgaW5wdXRUb2tlbnM6IDEuNzUsIG91dHB1dFRva2VuczogMTQsIGNhY2hlZElucHV0VG9rZW5zOiAwLjE3NSB9LFxufTtcblxuLy8g4pSA4pSAIEFudGhyb3BpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYW50aHJvcGljQ29zdHMoaW5wdXRUb2tlbnM6IG51bWJlciwgb3V0cHV0VG9rZW5zOiBudW1iZXIpOiBNb2RlbENvc3RzIHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VucyxcbiAgICBvdXRwdXRUb2tlbnMsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IGlucHV0VG9rZW5zIC8gMTAsXG4gICAgLy8gQ2xhdWRlIENvZGUgc3Vic2NyaXB0aW9uIE9BdXRoIOuKlCAxaCBUVEwg7J2EIOyekOuPmSDshKDtg53tlZzri6QuIOq1rOuyhOyghOyymOufvCDsnZHri7Xsl5BcbiAgICAvLyBUVEwgYnJlYWtkb3duIOydtCDsl4bsnYQg65WM66eMIOydtCAxaCDri6jqsIDrpbwgZmFsbGJhY2sg7Jy866GcIOyCrOyaqe2VnOuLpC5cbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGlucHV0VG9rZW5zICogMixcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogaW5wdXRUb2tlbnMgKiAxLjI1LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiBpbnB1dFRva2VucyAqIDIsXG4gIH07XG59XG5cbmNvbnN0IEFOVEhST1BJQ19DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIFwiY2xhdWRlLWZhYmxlLTVcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwKSxcbiAgc29ubmV0OiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLTMtNS1oYWlrdVwiOiBhbnRocm9waWNDb3N0cygwLjgsIDQpLFxuICBcImNsYXVkZS1oYWlrdS00LTVcIjogYW50aHJvcGljQ29zdHMoMSwgNSksXG4gIFwiY2xhdWRlLTMtNS1zb25uZXRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1zb25uZXQtNC01XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1vcHVzLTRcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTFcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gIFwiY2xhdWRlLW9wdXMtNC03XCI6IGFudGhyb3BpY0Nvc3RzKDUsIDI1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LThcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxufTtcblxuLy8gQW50aHJvcGljIOqzteyLnSBpbnRyb2R1Y3RvcnkgcHJpY2luZzogMjAyNi0wOC0zMeq5jOyngCAkMi8kMTAsIOydtO2bhCAkMy8kMTUuXG4vLyBxZ3JpZCDripQg7JqU7LKtIOyLnOygkOyXkCDqs4TsgrDtlZjrr4DroZwg67Cw7Y+s66W8IOuLpOyLnCDtlZjsp4Ag7JWK7JWE64+EIDIwMjYtMDktMDEgVVRD67aA7YSwIO2RnOykgCDri6jqsIDroZwg7KCE7ZmY7ZWc64ukLlxuY29uc3QgQ0xBVURFX1NPTk5FVF81X0lOVFJPX1BSSUNJTkdfRU5EX01TID0gRGF0ZS5VVEMoMjAyNiwgOCwgMSk7XG5jb25zdCBDTEFVREVfU09OTkVUXzVfSU5UUk9fQ09TVFMgPSBhbnRocm9waWNDb3N0cygyLCAxMCk7XG5jb25zdCBDTEFVREVfU09OTkVUXzVfU1RBTkRBUkRfQ09TVFMgPSBhbnRocm9waWNDb3N0cygzLCAxNSk7XG5cbi8vIGdwdC01LjMtY29kZXgtc3Bhcmsg64qUIHJlc2VhcmNoIHByZXZpZXcg66GcIOqzteyLnSB0b2tlbiDri6jqsIDqsIAg7JWE7KeBIGZpbmFsIOydtCDslYTri4jri6QuXG4vLyDsp4Dsm5Ag7YOA7J6F7J2AIOycoOyngO2VmOuQmCwg6rO17IudIOuLqOqwgOqwgCDqs7XqsJzrkKAg65WM6rmM7KeAIOyVhOuemCBnZW5lcmljIGVzdGltYXRlIOuhnCDqs4TsgrDtlZzri6QuXG4vLyBAc2VlIGh0dHBzOi8vaGVscC5vcGVuYWkuY29tL2VuL2FydGljbGVzLzIwMDAxMTA2LWNvZGV4LXJhdGUtY2FyZFxuY29uc3QgREVGQVVMVF9DT1NUUzogTW9kZWxDb3N0cyA9IHsgaW5wdXRUb2tlbnM6IDMsIG91dHB1dFRva2VuczogMTUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjMgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZywgYXRNcyA9IERhdGUubm93KCkpOiBNb2RlbENvc3RzIHtcbiAgY29uc3Qgbm9ybWFsaXplZE1vZGVsID0gKG1vZGVsLnNwbGl0KFwiL1wiKS5wb3AoKSA/PyBtb2RlbCkucmVwbGFjZSgvXFxbMW1cXF0kL2ksIFwiXCIpO1xuICBpZiAobm9ybWFsaXplZE1vZGVsID09PSBcImNsYXVkZS1zb25uZXQtNVwiKSB7XG4gICAgcmV0dXJuIGF0TXMgPCBDTEFVREVfU09OTkVUXzVfSU5UUk9fUFJJQ0lOR19FTkRfTVNcbiAgICAgID8gQ0xBVURFX1NPTk5FVF81X0lOVFJPX0NPU1RTXG4gICAgICA6IENMQVVERV9TT05ORVRfNV9TVEFOREFSRF9DT1NUUztcbiAgfVxuICByZXR1cm4gT1BFTkFJX0NPU1RTW25vcm1hbGl6ZWRNb2RlbF0gPz8gQU5USFJPUElDX0NPU1RTW25vcm1hbGl6ZWRNb2RlbF0gPz8gREVGQVVMVF9DT1NUUztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZUNvc3RVc2QoXG4gIG1vZGVsOiBzdHJpbmcsXG4gIHVzYWdlOiB7XG4gICAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgICBvdXRwdXRUb2tlbnM6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dFRva2Vucz86IG51bWJlcjtcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg/OiBudW1iZXI7XG4gIH0sXG4gIGF0TXMgPSBEYXRlLm5vdygpLFxuKTogbnVtYmVyIHtcbiAgY29uc3QgY29zdHMgPSBnZXRNb2RlbENvc3RzKG1vZGVsLCBhdE1zKTtcbiAgY29uc3QgY2FjaGVkSW5wdXQgPSB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyA/PyAwO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQ1bSA9IE1hdGgubWF4KHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtID8/IDAsIDApO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQxaCA9IE1hdGgubWF4KHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoID8/IDAsIDApO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQgPSBNYXRoLm1heChcbiAgICB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXQ1bSArIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICApO1xuICBjb25zdCBjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0NW0gPSBNYXRoLm1pbihjYWNoZUNyZWF0aW9uSW5wdXQ1bSwgY2FjaGVDcmVhdGlvbklucHV0KTtcbiAgY29uc3QgY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDFoID0gTWF0aC5taW4oXG4gICAgY2FjaGVDcmVhdGlvbklucHV0MWgsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0IC0gY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDVtLFxuICApO1xuICBjb25zdCB1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgPVxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaDtcbiAgY29uc3Qgbm9uQ2FjaGVkSW5wdXQgPSBNYXRoLm1heCh1c2FnZS5pbnB1dFRva2VucyAtIGNhY2hlZElucHV0IC0gY2FjaGVDcmVhdGlvbklucHV0LCAwKTtcblxuICAvLyBsb25nLWNvbnRleHQg7ZWg7KadOiDsoITssrQg7J6F66ClKGlucHV0X3Rva2VucywgY2FjaGUg7Y+s7ZWoKeydtCB0aHJlc2hvbGQg7LSI6rO8IOyLnCDsmpTssq0g7KCE7LK07JeQIOuwsOycqCDsoIHsmqlcbiAgY29uc3QgbGMgPSBjb3N0cy5sb25nQ29udGV4dDtcbiAgY29uc3QgaXNMb25nQ29udGV4dCA9IGxjICE9PSB1bmRlZmluZWQgJiYgdXNhZ2UuaW5wdXRUb2tlbnMgPiBsYy50aHJlc2hvbGQ7XG4gIGNvbnN0IGlucHV0UmF0ZSA9IGNvc3RzLmlucHV0VG9rZW5zICogKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVkUmF0ZSA9IGNvc3RzLmNhY2hlZElucHV0VG9rZW5zICogKGlzTG9uZ0NvbnRleHQgPyBsYy5jYWNoZWRJbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbkZhbGxiYWNrUmF0ZSA9XG4gICAgKGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyBjb3N0cy5pbnB1dFRva2VucykgKlxuICAgIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb241bVJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyBjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uMWhSYXRlID1cbiAgICAoY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWggPz8gY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IGNvc3RzLmlucHV0VG9rZW5zKSAqXG4gICAgKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3Qgb3V0cHV0UmF0ZSA9IGNvc3RzLm91dHB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMub3V0cHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIHJldHVybiAoXG4gICAgKG5vbkNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGlucHV0UmF0ZSArXG4gICAgKHVzYWdlLm91dHB1dFRva2VucyAvIDFfMDAwXzAwMCkgKiBvdXRwdXRSYXRlICtcbiAgICAoY2FjaGVkSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVkUmF0ZSArXG4gICAgKHVuY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dCAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uRmFsbGJhY2tSYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDVtIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb241bVJhdGUgK1xuICAgIChjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0MWggLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbjFoUmF0ZVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQXdDQSxNQUFNLG9CQUE0RDtDQUNoRSxXQUFXO0NBQ1gsaUJBQWlCO0NBQ2pCLHVCQUF1QjtDQUN2QixrQkFBa0I7Q0FDbkI7QUFFRCxNQUFNLGVBQTJDO0NBVy9DLGVBQWU7RUFDYixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtFQUNkO0NBQ0QsaUJBQWlCO0VBQ2YsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzFCLGFBQWE7RUFDZDtDQUNELGdCQUFnQjtFQUNkLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0VBQ2Q7Q0FFRCxXQUFXO0VBQ1QsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsYUFBYTtFQUNkO0NBRUQsV0FBVztFQUNULGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLGFBQWE7RUFDZDtDQUNELGdCQUFnQjtFQUFFLGFBQWE7RUFBTSxjQUFjO0VBQUssbUJBQW1CO0VBQU87Q0FFbEYsaUJBQWlCO0VBQUUsYUFBYTtFQUFNLGNBQWM7RUFBSSxtQkFBbUI7RUFBTztDQUVsRixXQUFXO0VBQUUsYUFBYTtFQUFNLGNBQWM7RUFBSSxtQkFBbUI7RUFBTztDQUM3RTtBQUlELFNBQVMsZUFBZSxhQUFxQixjQUFrQztBQUM3RSxRQUFPO0VBQ0w7RUFDQTtFQUNBLG1CQUFtQixjQUFjO0VBR2pDLDBCQUEwQixjQUFjO0VBQ3hDLDRCQUE0QixjQUFjO0VBQzFDLDRCQUE0QixjQUFjO0VBQzNDOztBQUdILE1BQU0sa0JBQThDO0NBQ2xELGtCQUFrQixlQUFlLElBQUksR0FBRztDQUN4QyxRQUFRLGVBQWUsR0FBRyxHQUFHO0NBQzdCLG9CQUFvQixlQUFlLElBQUssRUFBRTtDQUMxQyxvQkFBb0IsZUFBZSxHQUFHLEVBQUU7Q0FDeEMscUJBQXFCLGVBQWUsR0FBRyxHQUFHO0NBQzFDLHFCQUFxQixlQUFlLEdBQUcsR0FBRztDQUMxQyxtQkFBbUIsZUFBZSxHQUFHLEdBQUc7Q0FDeEMscUJBQXFCLGVBQWUsR0FBRyxHQUFHO0NBQzFDLHFCQUFxQixlQUFlLEdBQUcsR0FBRztDQUMxQyxxQkFBcUIsZUFBZSxHQUFHLEdBQUc7Q0FDMUMsaUJBQWlCLGVBQWUsSUFBSSxHQUFHO0NBQ3ZDLG1CQUFtQixlQUFlLElBQUksR0FBRztDQUN6QyxtQkFBbUIsZUFBZSxHQUFHLEdBQUc7Q0FDeEMsbUJBQW1CLGVBQWUsR0FBRyxHQUFHO0NBQ3hDLG1CQUFtQixlQUFlLEdBQUcsR0FBRztDQUN4QyxtQkFBbUIsZUFBZSxHQUFHLEdBQUc7Q0FDekM7QUFJRCxNQUFNLHVDQUF1QyxLQUFLLElBQUksTUFBTSxHQUFHLEVBQUU7QUFDakUsTUFBTSw4QkFBOEIsZUFBZSxHQUFHLEdBQUc7QUFDekQsTUFBTSxpQ0FBaUMsZUFBZSxHQUFHLEdBQUc7QUFLNUQsTUFBTSxnQkFBNEI7Q0FBRSxhQUFhO0NBQUcsY0FBYztDQUFJLG1CQUFtQjtDQUFLO0FBRTlGLFNBQWdCLGNBQWMsT0FBZSxPQUFPLEtBQUssS0FBSyxFQUFjO0NBQzFFLE1BQU0sbUJBQW1CLE1BQU0sTUFBTSxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sUUFBUSxZQUFZLEdBQUc7QUFDakYsS0FBSSxvQkFBb0Isa0JBQ3RCLFFBQU8sT0FBTyx1Q0FDViw4QkFDQTtBQUVOLFFBQU8sYUFBYSxvQkFBb0IsZ0JBQWdCLG9CQUFvQjs7QUFHOUUsU0FBZ0IsaUJBQ2QsT0FDQSxPQVFBLE9BQU8sS0FBSyxLQUFLLEVBQ1Q7Q0FDUixNQUFNLFFBQVEsY0FBYyxPQUFPLEtBQUs7Q0FDeEMsTUFBTSxjQUFjLE1BQU0scUJBQXFCO0NBQy9DLE1BQU0sdUJBQXVCLEtBQUssSUFBSSxNQUFNLDhCQUE4QixHQUFHLEVBQUU7Q0FDL0UsTUFBTSx1QkFBdUIsS0FBSyxJQUFJLE1BQU0sOEJBQThCLEdBQUcsRUFBRTtDQUMvRSxNQUFNLHFCQUFxQixLQUFLLElBQzlCLE1BQU0sNEJBQTRCLEdBQ2xDLHVCQUF1QixxQkFDeEI7Q0FDRCxNQUFNLGlDQUFpQyxLQUFLLElBQUksc0JBQXNCLG1CQUFtQjtDQUN6RixNQUFNLGlDQUFpQyxLQUFLLElBQzFDLHNCQUNBLHFCQUFxQiwrQkFDdEI7Q0FDRCxNQUFNLGlDQUNKLHFCQUFxQixpQ0FBaUM7Q0FDeEQsTUFBTSxpQkFBaUIsS0FBSyxJQUFJLE1BQU0sY0FBYyxjQUFjLG9CQUFvQixFQUFFO0NBR3hGLE1BQU0sS0FBSyxNQUFNO0NBQ2pCLE1BQU0sZ0JBQWdCLE9BQU8sVUFBYSxNQUFNLGNBQWMsR0FBRztDQUNqRSxNQUFNLFlBQVksTUFBTSxlQUFlLGdCQUFnQixHQUFHLGtCQUFrQjtDQUM1RSxNQUFNLGFBQWEsTUFBTSxxQkFBcUIsZ0JBQWdCLEdBQUcsd0JBQXdCO0NBQ3pGLE1BQU0sNkJBQ0gsTUFBTSw0QkFBNEIsTUFBTSxnQkFDeEMsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sdUJBQ0gsTUFBTSw4QkFBOEIsTUFBTSw0QkFBNEIsTUFBTSxnQkFDNUUsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sdUJBQ0gsTUFBTSw4QkFBOEIsTUFBTSw0QkFBNEIsTUFBTSxnQkFDNUUsZ0JBQWdCLEdBQUcsa0JBQWtCO0NBQ3hDLE1BQU0sYUFBYSxNQUFNLGdCQUFnQixnQkFBZ0IsR0FBRyxtQkFBbUI7QUFFL0UsUUFDRyxpQkFBaUIsTUFBYSxZQUM5QixNQUFNLGVBQWUsTUFBYSxhQUNsQyxjQUFjLE1BQWEsYUFDM0IsaUNBQWlDLE1BQWEsNEJBQzlDLGlDQUFpQyxNQUFhLHNCQUM5QyxpQ0FBaUMsTUFBYSJ9
|
|
@@ -33,6 +33,7 @@ function queryOutput(overrides: Partial<QueryOutput> = {}): QueryOutput {
|
|
|
33
33
|
durationMs: 120,
|
|
34
34
|
ttftMs: 39,
|
|
35
35
|
costUsd: 0.001,
|
|
36
|
+
costSource: "pricing_table",
|
|
36
37
|
...overrides,
|
|
37
38
|
};
|
|
38
39
|
}
|
|
@@ -198,4 +199,71 @@ describe("qgrid run lifecycle TTFT", () => {
|
|
|
198
199
|
}),
|
|
199
200
|
);
|
|
200
201
|
});
|
|
202
|
+
|
|
203
|
+
it("preserves serving model, fallback count, TTL split, and exact step cost", async () => {
|
|
204
|
+
aggregateStepUsageMock.mockResolvedValueOnce({
|
|
205
|
+
input_tokens: 100_000,
|
|
206
|
+
output_tokens: 20,
|
|
207
|
+
cache_read_tokens: 10_000,
|
|
208
|
+
cache_creation_tokens: 80_000,
|
|
209
|
+
cache_creation_5m_tokens: 30_000,
|
|
210
|
+
cache_creation_1h_tokens: 50_000,
|
|
211
|
+
duration_ms: 120,
|
|
212
|
+
cost_usd: 3_000,
|
|
213
|
+
cost_source: "provider",
|
|
214
|
+
fallback_count: 1,
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
await afterQuery(
|
|
218
|
+
10,
|
|
219
|
+
2,
|
|
220
|
+
{ prompt: "hi", model: "anthropic/claude-fable-5" },
|
|
221
|
+
queryOutput({
|
|
222
|
+
model: "claude-opus-4-8",
|
|
223
|
+
requestedModel: "claude-fable-5",
|
|
224
|
+
modelFallbacks: [
|
|
225
|
+
{
|
|
226
|
+
trigger: "refusal",
|
|
227
|
+
fromModel: "claude-fable-5",
|
|
228
|
+
toModel: "claude-opus-4-8",
|
|
229
|
+
},
|
|
230
|
+
],
|
|
231
|
+
costUsd: 0.003,
|
|
232
|
+
costSource: "provider",
|
|
233
|
+
usage: {
|
|
234
|
+
input_tokens: 100_000,
|
|
235
|
+
output_tokens: 20,
|
|
236
|
+
cache_read_input_tokens: 10_000,
|
|
237
|
+
cache_creation_input_tokens: 80_000,
|
|
238
|
+
cache_creation_5m_input_tokens: 30_000,
|
|
239
|
+
cache_creation_1h_input_tokens: 50_000,
|
|
240
|
+
},
|
|
241
|
+
}),
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
expect(appendStepMock).toHaveBeenCalledWith(
|
|
245
|
+
10,
|
|
246
|
+
expect.objectContaining({
|
|
247
|
+
requested_model_name: "claude-fable-5",
|
|
248
|
+
model_name: "claude-opus-4-8",
|
|
249
|
+
fallback_count: 1,
|
|
250
|
+
cache_creation_5m_tokens: 30_000,
|
|
251
|
+
cache_creation_1h_tokens: 50_000,
|
|
252
|
+
cost_usd: 3_000,
|
|
253
|
+
cost_source: "provider",
|
|
254
|
+
}),
|
|
255
|
+
);
|
|
256
|
+
expect(finishRunMock).toHaveBeenCalledWith(
|
|
257
|
+
10,
|
|
258
|
+
expect.objectContaining({
|
|
259
|
+
requested_model_name: "claude-fable-5",
|
|
260
|
+
model_name: "claude-opus-4-8",
|
|
261
|
+
fallback_count: 1,
|
|
262
|
+
cache_creation_5m_tokens: 30_000,
|
|
263
|
+
cache_creation_1h_tokens: 50_000,
|
|
264
|
+
cost_usd: 3_000,
|
|
265
|
+
cost_source: "provider",
|
|
266
|
+
}),
|
|
267
|
+
);
|
|
268
|
+
});
|
|
201
269
|
});
|
|
@@ -90,10 +90,17 @@ export async function afterQuery(
|
|
|
90
90
|
await RequestLogModel.appendStep(requestLogId, {
|
|
91
91
|
step_index: stepIndex,
|
|
92
92
|
type: "generate",
|
|
93
|
+
model_name: result.model,
|
|
94
|
+
requested_model_name: result.requestedModel ?? result.model ?? args.model,
|
|
95
|
+
fallback_count: result.modelFallbacks?.length ?? 0,
|
|
93
96
|
input_tokens: result.usage.input_tokens,
|
|
94
97
|
output_tokens: result.usage.output_tokens,
|
|
95
98
|
cache_read_tokens: result.usage.cache_read_input_tokens,
|
|
96
99
|
cache_creation_tokens: result.usage.cache_creation_input_tokens,
|
|
100
|
+
cache_creation_5m_tokens: result.usage.cache_creation_5m_input_tokens,
|
|
101
|
+
cache_creation_1h_tokens: result.usage.cache_creation_1h_input_tokens,
|
|
102
|
+
cost_usd: Math.round(result.costUsd * 1_000_000),
|
|
103
|
+
cost_source: result.costSource,
|
|
97
104
|
duration_ms: result.durationMs,
|
|
98
105
|
ttft_ms: result.ttftMs,
|
|
99
106
|
finish_reason: result.finishReason,
|
|
@@ -137,7 +144,14 @@ export async function afterQuery(
|
|
|
137
144
|
output_tokens: agg.output_tokens,
|
|
138
145
|
cache_read_tokens: agg.cache_read_tokens,
|
|
139
146
|
cache_creation_tokens: agg.cache_creation_tokens,
|
|
147
|
+
cache_creation_5m_tokens: agg.cache_creation_5m_tokens,
|
|
148
|
+
cache_creation_1h_tokens: agg.cache_creation_1h_tokens,
|
|
140
149
|
duration_ms: agg.duration_ms,
|
|
150
|
+
requested_model_name: agg.requested_model_name ?? result.requestedModel ?? result.model,
|
|
151
|
+
model_name: agg.model_name ?? result.model,
|
|
152
|
+
fallback_count: agg.fallback_count,
|
|
153
|
+
cost_usd: agg.cost_usd,
|
|
154
|
+
cost_source: agg.cost_source,
|
|
141
155
|
image_cost_usd: imageCostMicroUsd,
|
|
142
156
|
image_cost_method:
|
|
143
157
|
imageCostMicroUsd !== null ? imageGenerationCostMethod(args.imageGenerationOptions) : null,
|