@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.
Files changed (73) hide show
  1. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +15 -1
  2. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -4
  3. package/bundle/dist/application/qgrid/qgrid.frame.js +20 -1
  4. package/bundle/dist/application/qgrid/qgrid.types.js +38 -2
  5. package/bundle/dist/application/request-log/request-log.model.js +49 -22
  6. package/bundle/dist/application/request-log-step/request-log-step.types.js +8 -1
  7. package/bundle/dist/application/sonamu.generated.js +37 -1
  8. package/bundle/dist/application/sonamu.generated.sso.js +25 -1
  9. package/bundle/dist/i18n/sd.generated.js +13 -1
  10. package/bundle/dist/migrations/20260718180824_alter_request_logs_add5_alter1.js +20 -0
  11. package/bundle/dist/migrations/20260718180825_alter_request_log_steps_add7_alter1.js +22 -0
  12. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +8 -2
  13. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +6 -3
  14. package/bundle/dist/utils/providers/anthropic/claude-session.js +11 -7
  15. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +117 -7
  16. package/bundle/dist/utils/providers/common/model-cost.js +45 -98
  17. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +68 -0
  18. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +14 -0
  19. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +81 -0
  20. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +16 -9
  21. package/bundle/src/application/qgrid/qgrid.frame.ts +19 -0
  22. package/bundle/src/application/qgrid/qgrid.types.ts +36 -0
  23. package/bundle/src/application/qgrid/tool-emulation.test.ts +1 -0
  24. package/bundle/src/application/request-log/request-log.entity.json +42 -0
  25. package/bundle/src/application/request-log/request-log.model.test.ts +58 -0
  26. package/bundle/src/application/request-log/request-log.model.ts +107 -18
  27. package/bundle/src/application/request-log-step/request-log-step.entity.json +54 -0
  28. package/bundle/src/application/request-log-step/request-log-step.types.ts +7 -0
  29. package/bundle/src/application/sonamu.generated.http +26 -0
  30. package/bundle/src/application/sonamu.generated.sso.ts +24 -0
  31. package/bundle/src/application/sonamu.generated.ts +48 -0
  32. package/bundle/src/i18n/sd.generated.ts +12 -0
  33. package/bundle/src/migrations/20260718180824_alter_request_logs_add5_alter1.ts +25 -0
  34. package/bundle/src/migrations/20260718180825_alter_request_log_steps_add7_alter1.ts +29 -0
  35. package/bundle/src/utils/providers/anthropic/anthropic-constants.test.ts +15 -0
  36. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +11 -2
  37. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +7 -2
  38. package/bundle/src/utils/providers/anthropic/claude-session.test.ts +26 -0
  39. package/bundle/src/utils/providers/anthropic/claude-session.ts +16 -4
  40. package/bundle/src/utils/providers/anthropic/stream-json-adapter.test.ts +131 -0
  41. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +194 -11
  42. package/bundle/src/utils/providers/common/model-cost.test.ts +136 -2
  43. package/bundle/src/utils/providers/common/model-cost.ts +76 -99
  44. package/bundle/src/utils/providers/common/provider-dispatcher.ts +18 -0
  45. package/bundle/web-dist/client/assets/{index-BOXhNo0k.js → index-CmuPjbCl.js} +3 -3
  46. package/bundle/web-dist/client/assets/{logs-BShH_sut.js → logs-cXOsDli3.js} +1 -1
  47. package/bundle/web-dist/client/assets/{monit-CoEAp5S0.js → monit-B5Edhvy-.js} +1 -1
  48. package/bundle/web-dist/client/assets/{routes-Dr3cGnV3.js → routes-UPWScORY.js} +1 -1
  49. package/bundle/web-dist/client/assets/{sd.generated-D2Y9QeiN.js → sd.generated-DYuKzBY6.js} +1 -1
  50. package/bundle/web-dist/client/assets/{services.generated-CmxXl220.js → services.generated-D_SkWOo-.js} +1 -1
  51. package/bundle/web-dist/client/assets/show-pRp-eZIK.js +30 -0
  52. package/bundle/web-dist/client/assets/{tokens-hP1NecIg.js → tokens-DJlttxCM.js} +1 -1
  53. package/bundle/web-dist/client/assets/{use-update-token-mutation-6J1T9U2-.js → use-update-token-mutation-CpFGLWUl.js} +1 -1
  54. package/bundle/web-dist/client/index.html +2 -2
  55. package/bundle/web-dist/server/assets/{lazyRouteComponent-BlfOh9S3.js → lazyRouteComponent-Cu6IkL8A.js} +1 -1
  56. package/bundle/web-dist/server/assets/{logs-DYly4ipQ.js → logs-Dx2knN2T.js} +10 -7
  57. package/bundle/web-dist/server/assets/{monit-CYyY2S2f.js → monit-DU6PLatf.js} +2 -2
  58. package/bundle/web-dist/server/assets/{routes-Dqu3osXt.js → routes-CTco1oJZ.js} +3 -3
  59. package/bundle/web-dist/server/assets/{sd.generated-CE6D5clm.js → sd.generated-qzuRe35X.js} +12 -0
  60. package/bundle/web-dist/server/assets/{services.generated-DyZUzXiq.js → services.generated-C8q1M41a.js} +1 -1
  61. package/bundle/web-dist/server/assets/{show-BDul8xLb.js → show-B3q8_GDh.js} +47 -4
  62. package/bundle/web-dist/server/assets/{tokens-fzMW4G74.js → tokens-Bvjn15h9.js} +3 -3
  63. package/bundle/web-dist/server/assets/{use-update-token-mutation-BejUW5sw.js → use-update-token-mutation-BlZo6swF.js} +1 -1
  64. package/bundle/web-dist/server/entry-server.generated.js +8 -8
  65. package/package.json +2 -2
  66. package/skills/qgrid/SKILL.md +4 -0
  67. package/skills/qgrid/references/ai-sdk-provider-contract.md +30 -2
  68. package/skills/qgrid/references/anthropic-claude-code-runtime.md +43 -5
  69. package/skills/qgrid/references/decision-rationale.md +2 -0
  70. package/skills/qgrid/references/prompt-cache-and-usage.md +4 -1
  71. package/skills/qgrid/references/request-log-run-lifecycle.md +6 -2
  72. package/skills/qgrid/references/sonamu-api-web-flow.md +13 -0
  73. 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 === "assistant" && structuredOutput && state && state.structuredOutputText === void 0) {
116
- const text = structuredOutputToolUseText(j);
117
- if (text !== void 0) state.structuredOutputText = text;
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 usage = toUsageBreakdown(asObject(j.usage) ?? {});
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/IGoudG90YWxfY29zdF91c2QgOiAwLFxuICAgICAgcXVvdGFFeGhhdXN0ZWQsXG4gICAgICBpc0Vycm9yLFxuICAgICAgc3VidHlwZSxcbiAgICAgIHRlcm1pbmFsUmVhc29uLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUF5QkEsU0FBUyxnQkFBZ0IsT0FBaUM7QUFDeEQsUUFBTyxNQUNKLFFBQVEsTUFBaUQsRUFBRSxTQUFTLE9BQU8sQ0FDM0UsS0FBSyxNQUFNLEVBQUUsS0FBSyxDQUNsQixLQUFLLEtBQUs7O0FBR2YsU0FBUyxVQUFVLE1BQXFEO0FBQ3RFLFFBQU8sQ0FBQztFQUFFLE1BQU07RUFBUTtFQUFNLENBQUM7O0FBV2pDLFNBQVMsU0FBUyxHQUErQztBQUMvRCxRQUFPLE9BQU8sTUFBTSxZQUFZLE1BQU0sUUFBUSxDQUFDLE1BQU0sUUFBUSxFQUFFLEdBQUksSUFBcUI7O0FBRzFGLFNBQVMsaUJBQWlCLE1BQTRCO0NBQ3BELE1BQU0sVUFBVSxLQUFLO0FBQ3JCLEtBQUksQ0FBQyxNQUFNLFFBQVEsUUFBUSxDQUFFLFFBQU87QUFDcEMsUUFBTyxRQUNKLEtBQUssTUFBTTtFQUNWLE1BQU0sTUFBTSxTQUFTLEVBQUU7QUFDdkIsU0FBTyxPQUFPLE9BQU8sSUFBSSxTQUFTLFdBQVcsSUFBSSxPQUFPO0dBQ3hELENBQ0QsT0FBTyxRQUFRLENBQ2YsS0FBSyxLQUFLOztBQUdmLFNBQVMsbUJBQW1CLGFBQXVDO0NBQ2pFLE1BQU0sUUFBdUIsRUFBRTtBQUMvQixNQUFLLE1BQU0sT0FBTyxhQUFhO0VBQzdCLE1BQU0sT0FBTyxTQUFTLElBQUk7QUFDMUIsTUFBSSxDQUFDLEtBQU07QUFFWCxNQUFJLEtBQUssU0FBUyxhQUFhLEtBQUssU0FBUyxZQUMzQyxPQUFNLEtBQUssY0FBYyxpQkFBaUIsS0FBSyxHQUFHO1dBQ3pDLEtBQUssU0FBUyxhQUFhLEtBQUssU0FBUyxPQUNsRCxPQUFNLEtBQUssU0FBUyxpQkFBaUIsS0FBSyxHQUFHO1dBQ3BDLEtBQUssU0FBUyxpQkFBaUI7R0FDeEMsTUFBTSxPQUFPLE9BQU8sS0FBSyxTQUFTLFdBQVcsS0FBSyxPQUFPO0dBQ3pELE1BQU0sT0FDSixPQUFPLEtBQUssY0FBYyxXQUFXLEtBQUssWUFBWSxLQUFLLFVBQVUsS0FBSyxhQUFhLEVBQUUsQ0FBQztBQUM1RixTQUFNLEtBQUssY0FBYyxLQUFLLEdBQUcsS0FBSyxHQUFHO2FBQ2hDLEtBQUssU0FBUyx3QkFBd0I7R0FDL0MsTUFBTSxTQUNKLE9BQU8sS0FBSyxXQUFXLFdBQVcsS0FBSyxTQUFTLEtBQUssVUFBVSxLQUFLLFVBQVUsR0FBRztBQUNuRixTQUFNLEtBQUssZ0JBQWdCLFNBQVM7OztBQUd4QyxRQUFPLE1BQU0sS0FBSyxLQUFLOztBQUd6QixTQUFnQixxQkFBcUIsTUFHTDtDQUM5QixNQUFNLFFBQXFDLEVBQUU7QUFFN0MsS0FBSSxLQUFLLGVBQWUsS0FBSyxZQUFZLFNBQVMsR0FBRztFQUNuRCxNQUFNLFlBQVksbUJBQW1CLEtBQUssWUFBWTtBQUN0RCxNQUFJLFVBQ0YsT0FBTSxLQUFLO0dBQ1QsTUFBTTtHQUNOLFNBQVM7SUFDUCxNQUFNO0lBQ04sU0FBUyxVQUFVLGdDQUFnQyxZQUFZO0lBQ2hFO0dBQ0YsQ0FBQzs7QUFJTixPQUFNLEtBQUs7RUFDVCxNQUFNO0VBQ04sU0FBUztHQUFFLE1BQU07R0FBUSxTQUFTLFVBQVUsZ0JBQWdCLEtBQUssTUFBTSxDQUFDO0dBQUU7RUFDM0UsQ0FBQztBQUVGLFFBQU87O0FBR1QsU0FBZ0IseUJBQXlCLE9BQTRDO0FBQ25GLFFBQU8sTUFBTSxLQUFLLE1BQU0sS0FBSyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEtBQUssS0FBSyxHQUFHOztBQXNDMUQsU0FBUyxpQkFBaUIsR0FBNkM7Q0FDckUsTUFBTSxRQUFRLEVBQUUsZ0JBQWdCO0NBQ2hDLE1BQU0sY0FBYyxFQUFFLCtCQUErQjtDQUNyRCxNQUFNLFlBQVksRUFBRSwyQkFBMkI7Q0FDL0MsTUFBTSxTQUFTLEVBQUUsaUJBQWlCO0NBQ2xDLE1BQU0sYUFBYSxRQUFRLGNBQWM7QUFDekMsUUFBTztFQUNMLGFBQWEsYUFBYTtFQUMxQixhQUFhO0VBQ2IsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixjQUFjO0VBQ2QsdUJBQXVCO0VBQ3hCOztBQUdILFNBQVMsZUFBZSxHQUFtQjtBQUN6QyxRQUFPLEVBQ0osTUFBTSxDQUNOLFFBQVEsd0JBQXdCLEdBQUcsQ0FDbkMsUUFBUSxlQUFlLEdBQUc7O0FBRy9CLFNBQVMsNEJBQTRCLEdBQXFDO0NBRXhFLE1BQU0sVUFEVSxTQUFTLEVBQUUsUUFBUSxFQUNWO0FBQ3pCLEtBQUksQ0FBQyxNQUFNLFFBQVEsUUFBUSxDQUFFLFFBQU87QUFFcEMsTUFBSyxNQUFNLE9BQU8sU0FBUztFQUN6QixNQUFNLFFBQVEsU0FBUyxJQUFJO0FBQzNCLE1BQUksQ0FBQyxNQUFPO0FBQ1osTUFDRSxNQUFNLFNBQVMsY0FDZixNQUFNLFNBQVMsc0JBQ2YsTUFBTSxVQUFVLE9BRWhCLFFBQU8sS0FBSyxVQUFVLE1BQU0sTUFBTTs7O0FBT3hDLFNBQWdCLHFCQUNkLE1BQ0EsU0FDQSxNQUMyQjtDQUMzQixNQUFNLG1CQUFtQixNQUFNLG9CQUFvQjtDQUNuRCxNQUFNLFFBQVEsTUFBTTtDQUNwQixNQUFNLFVBQVUsS0FBSyxNQUFNO0FBQzNCLEtBQUksQ0FBQyxRQUFTLFFBQU87Q0FFckIsSUFBSTtBQUNKLEtBQUk7QUFDRixNQUFJLEtBQUssTUFBTSxRQUFRO1NBQ2pCO0FBQ04sU0FBTzs7QUFHVCxLQUFJLEVBQUUsU0FBUyxnQkFBZ0I7RUFDN0IsTUFBTSxRQUFRLFNBQVMsRUFBRSxNQUFNO0FBQy9CLE1BQUksU0FBUyxNQUFNLFNBQVMsdUJBQXVCO0dBQ2pELE1BQU0sUUFBUSxTQUFTLE1BQU0sTUFBTTtBQUNuQyxPQUFJLE9BQ0Y7UUFBSSxrQkFDRjtTQUFJLE1BQU0sU0FBUyxzQkFBc0IsT0FBTyxNQUFNLGlCQUFpQixTQUNyRSxTQUFRLE1BQU0sYUFBYTtlQUd6QixNQUFNLFNBQVMsZ0JBQWdCLE9BQU8sTUFBTSxTQUFTLFNBQ3ZELFNBQVEsTUFBTSxLQUFLOzs7QUFLM0IsU0FBTzs7QUFHVCxLQUNFLEVBQUUsU0FBUyxlQUNYLG9CQUNBLFNBQ0EsTUFBTSx5QkFBeUIsUUFDL0I7RUFDQSxNQUFNLE9BQU8sNEJBQTRCLEVBQUU7QUFDM0MsTUFBSSxTQUFTLE9BQVcsT0FBTSx1QkFBdUI7QUFDckQsU0FBTzs7QUFHVCxLQUFJLEVBQUUsU0FBUyxVQUFVO0VBQ3ZCLElBQUk7RUFDSixNQUFNLDRCQUE0QixtQkFBbUIsT0FBTyx1QkFBdUI7QUFDbkYsTUFBSSw4QkFBOEIsT0FDaEMsUUFBTztXQUNFLEVBQUUsc0JBQXNCLE9BQ2pDLFFBQU8sS0FBSyxVQUFVLEVBQUUsa0JBQWtCO01BRTFDLFFBQU8sZUFBZSxPQUFPLEVBQUUsV0FBVyxXQUFXLEVBQUUsU0FBUyxHQUFHO0VBR3JFLE1BQU0sUUFBUSxpQkFBa0IsU0FBUyxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQWlCO0VBQ3hFLE1BQU0saUJBQWlCLEtBQUssV0FBVyxhQUFhO0VBQ3BELE1BQU0sVUFBVSxPQUFPLEVBQUUsWUFBWSxXQUFXLEVBQUUsVUFBVTtFQUM1RCxNQUFNLGlCQUFpQixPQUFPLEVBQUUsb0JBQW9CLFdBQVcsRUFBRSxrQkFBa0I7RUFTbkYsTUFBTSxVQUNKLEVBQUUsYUFBYSxRQUNmLEVBQUUsb0JBQW9CLGlCQUNyQixZQUFZLFVBQWEsWUFBWTtBQUV4QyxTQUFPO0dBQ0w7R0FDQTtHQUNBLFlBQVksT0FBTyxFQUFFLGdCQUFnQixXQUFXLEVBQUUsY0FBYztHQUNoRSxTQUFTLE9BQU8sRUFBRSxtQkFBbUIsV0FBVyxFQUFFLGlCQUFpQjtHQUNuRTtHQUNBO0dBQ0E7R0FDQTtHQUNEOztBQUdILFFBQU8ifQ==
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/IGouZHVyYXRpb25fbXMgOiAwLFxuICAgICAgY29zdFVzZDogdHlwZW9mIGoudG90YWxfY29zdF91c2QgPT09IFwibnVtYmVyXCIgPyBqLnRvdGFsX2Nvc3RfdXNkIDogMCxcbiAgICAgIHF1b3RhRXhoYXVzdGVkLFxuICAgICAgaXNFcnJvcixcbiAgICAgIHN1YnR5cGUsXG4gICAgICB0ZXJtaW5hbFJlYXNvbixcbiAgICAgIHNlcnZlZE1vZGVsOiBzdGF0ZT8uc2VydmVkTW9kZWwsXG4gICAgICBzdG9wUmVhc29uOiBzdGF0ZT8uc3RvcFJlYXNvbixcbiAgICAgIHJlZnVzYWw6IHN0YXRlPy5yZWZ1c2FsLFxuICAgICAgbW9kZWxGYWxsYmFja3M6IHN0YXRlPy5tb2RlbEZhbGxiYWNrcyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBNEJBLFNBQVMsZ0JBQWdCLE9BQWlDO0FBQ3hELFFBQU8sTUFDSixRQUFRLE1BQWlELEVBQUUsU0FBUyxPQUFPLENBQzNFLEtBQUssTUFBTSxFQUFFLEtBQUssQ0FDbEIsS0FBSyxLQUFLOztBQUdmLFNBQVMsVUFBVSxNQUFxRDtBQUN0RSxRQUFPLENBQUM7RUFBRSxNQUFNO0VBQVE7RUFBTSxDQUFDOztBQVdqQyxTQUFTLFNBQVMsR0FBK0M7QUFDL0QsUUFBTyxPQUFPLE1BQU0sWUFBWSxNQUFNLFFBQVEsQ0FBQyxNQUFNLFFBQVEsRUFBRSxHQUFJLElBQXFCOztBQUcxRixTQUFTLGlCQUFpQixNQUE0QjtDQUNwRCxNQUFNLFVBQVUsS0FBSztBQUNyQixLQUFJLENBQUMsTUFBTSxRQUFRLFFBQVEsQ0FBRSxRQUFPO0FBQ3BDLFFBQU8sUUFDSixLQUFLLE1BQU07RUFDVixNQUFNLE1BQU0sU0FBUyxFQUFFO0FBQ3ZCLFNBQU8sT0FBTyxPQUFPLElBQUksU0FBUyxXQUFXLElBQUksT0FBTztHQUN4RCxDQUNELE9BQU8sUUFBUSxDQUNmLEtBQUssS0FBSzs7QUFHZixTQUFTLG1CQUFtQixhQUF1QztDQUNqRSxNQUFNLFFBQXVCLEVBQUU7QUFDL0IsTUFBSyxNQUFNLE9BQU8sYUFBYTtFQUM3QixNQUFNLE9BQU8sU0FBUyxJQUFJO0FBQzFCLE1BQUksQ0FBQyxLQUFNO0FBRVgsTUFBSSxLQUFLLFNBQVMsYUFBYSxLQUFLLFNBQVMsWUFDM0MsT0FBTSxLQUFLLGNBQWMsaUJBQWlCLEtBQUssR0FBRztXQUN6QyxLQUFLLFNBQVMsYUFBYSxLQUFLLFNBQVMsT0FDbEQsT0FBTSxLQUFLLFNBQVMsaUJBQWlCLEtBQUssR0FBRztXQUNwQyxLQUFLLFNBQVMsaUJBQWlCO0dBQ3hDLE1BQU0sT0FBTyxPQUFPLEtBQUssU0FBUyxXQUFXLEtBQUssT0FBTztHQUN6RCxNQUFNLE9BQ0osT0FBTyxLQUFLLGNBQWMsV0FBVyxLQUFLLFlBQVksS0FBSyxVQUFVLEtBQUssYUFBYSxFQUFFLENBQUM7QUFDNUYsU0FBTSxLQUFLLGNBQWMsS0FBSyxHQUFHLEtBQUssR0FBRzthQUNoQyxLQUFLLFNBQVMsd0JBQXdCO0dBQy9DLE1BQU0sU0FDSixPQUFPLEtBQUssV0FBVyxXQUFXLEtBQUssU0FBUyxLQUFLLFVBQVUsS0FBSyxVQUFVLEdBQUc7QUFDbkYsU0FBTSxLQUFLLGdCQUFnQixTQUFTOzs7QUFHeEMsUUFBTyxNQUFNLEtBQUssS0FBSzs7QUFHekIsU0FBZ0IscUJBQXFCLE1BR0w7Q0FDOUIsTUFBTSxRQUFxQyxFQUFFO0FBRTdDLEtBQUksS0FBSyxlQUFlLEtBQUssWUFBWSxTQUFTLEdBQUc7RUFDbkQsTUFBTSxZQUFZLG1CQUFtQixLQUFLLFlBQVk7QUFDdEQsTUFBSSxVQUNGLE9BQU0sS0FBSztHQUNULE1BQU07R0FDTixTQUFTO0lBQ1AsTUFBTTtJQUNOLFNBQVMsVUFBVSxnQ0FBZ0MsWUFBWTtJQUNoRTtHQUNGLENBQUM7O0FBSU4sT0FBTSxLQUFLO0VBQ1QsTUFBTTtFQUNOLFNBQVM7R0FBRSxNQUFNO0dBQVEsU0FBUyxVQUFVLGdCQUFnQixLQUFLLE1BQU0sQ0FBQztHQUFFO0VBQzNFLENBQUM7QUFFRixRQUFPOztBQUdULFNBQWdCLHlCQUF5QixPQUE0QztBQUNuRixRQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUMsQ0FBQyxLQUFLLEtBQUssR0FBRzs7QUE4RDFELFNBQVMsaUJBQWlCLEdBQTZDO0NBQ3JFLE1BQU0sUUFBUSxFQUFFLGdCQUFnQjtDQUNoQyxNQUFNLGNBQWMsRUFBRSwrQkFBK0I7Q0FDckQsTUFBTSxZQUFZLEVBQUUsMkJBQTJCO0NBQy9DLE1BQU0sU0FBUyxFQUFFLGlCQUFpQjtDQUNsQyxNQUFNLGFBQWEsUUFBUSxjQUFjO0NBQ3pDLE1BQU0sZ0JBQWdCLEVBQUUsZ0JBQWdCO0NBQ3hDLE1BQU0sZ0JBQWdCLEVBQUUsZ0JBQWdCO0FBQ3hDLFFBQU87RUFDTCxhQUFhLGFBQWE7RUFDMUIsYUFBYTtFQUNiLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsR0FBSSxPQUFPLGtCQUFrQixXQUFXLEVBQUUsNEJBQTRCLGVBQWUsR0FBRyxFQUFFO0VBQzFGLEdBQUksT0FBTyxrQkFBa0IsV0FBVyxFQUFFLDRCQUE0QixlQUFlLEdBQUcsRUFBRTtFQUMxRixjQUFjO0VBQ2QsdUJBQXVCO0VBQ3hCOztBQUdILFNBQVMsZUFBZSxHQUFtQjtBQUN6QyxRQUFPLEVBQ0osTUFBTSxDQUNOLFFBQVEsd0JBQXdCLEdBQUcsQ0FDbkMsUUFBUSxlQUFlLEdBQUc7O0FBRy9CLFNBQVMsNEJBQTRCLEdBQXFDO0NBRXhFLE1BQU0sVUFEVSxTQUFTLEVBQUUsUUFBUSxFQUNWO0FBQ3pCLEtBQUksQ0FBQyxNQUFNLFFBQVEsUUFBUSxDQUFFLFFBQU87QUFFcEMsTUFBSyxNQUFNLE9BQU8sU0FBUztFQUN6QixNQUFNLFFBQVEsU0FBUyxJQUFJO0FBQzNCLE1BQUksQ0FBQyxNQUFPO0FBQ1osTUFDRSxNQUFNLFNBQVMsY0FDZixNQUFNLFNBQVMsc0JBQ2YsTUFBTSxVQUFVLE9BRWhCLFFBQU8sS0FBSyxVQUFVLE1BQU0sTUFBTTs7O0FBTXhDLFNBQVMsb0JBQW9CLE9BQXVCO0FBRWxELFNBRHdCLE1BQU0sV0FBVyxhQUFhLEdBQUcsTUFBTSxNQUFNLEdBQW9CLEdBQUcsT0FDckUsUUFBUSxXQUFXLEdBQUc7O0FBRy9DLFNBQVMsZUFBZSxPQUFrRDtBQUN4RSxRQUFPLE9BQU8sVUFBVSxZQUFZLE1BQU0sU0FBUyxJQUFJLFFBQVE7O0FBR2pFLFNBQVMsZUFBZSxPQUEwQyxVQUErQjtBQUMvRixLQUFJLENBQUMsTUFBTztDQUNaLE1BQU0sYUFBNEI7RUFDaEMsR0FBRztFQUNILFdBQVcsb0JBQW9CLFNBQVMsVUFBVTtFQUNsRCxTQUFTLG9CQUFvQixTQUFTLFFBQVE7RUFDL0M7Q0FDRCxNQUFNLFdBQVcsTUFBTSxnQkFBZ0IsTUFDcEMsU0FDQyxLQUFLLFlBQVksV0FBVyxXQUM1QixLQUFLLGNBQWMsV0FBVyxhQUM5QixLQUFLLFlBQVksV0FBVyxRQUMvQjtBQUNELEtBQUksVUFBVTtBQUNaLFdBQVMsYUFBYSxXQUFXO0FBQ2pDLFdBQVMsZ0JBQWdCLFdBQVc7T0FFcEMsRUFBQyxNQUFNLG1CQUFtQixFQUFFLEVBQUUsS0FBSyxXQUFXO0FBRWhELE9BQU0sY0FBYyxXQUFXO0FBQy9CLE9BQU0seUJBQXlCOztBQUdqQyxTQUFTLHVCQUNQLE9BQ0EsT0FDTTtBQUNOLEtBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sUUFBUSxNQUFNLFdBQVcsQ0FBRTtDQUUxRCxJQUFJO0FBQ0osTUFBSyxNQUFNLE9BQU8sTUFBTSxZQUFZO0VBQ2xDLE1BQU0sWUFBWSxTQUFTLElBQUk7QUFDL0IsTUFBSSxDQUFDLFVBQVc7RUFDaEIsTUFBTSxRQUFRLGVBQWUsVUFBVSxNQUFNO0VBQzdDLE1BQU0sT0FBTyxlQUFlLFVBQVUsS0FBSztBQUMzQyxNQUFJLENBQUMsTUFBTztFQUNaLE1BQU0saUJBQWlCLG9CQUFvQixNQUFNO0FBQ2pELE1BQUksU0FBUyxzQkFBc0IsY0FDakMsZ0JBQWUsT0FBTztHQUNwQixTQUFTO0dBQ1QsV0FBVztHQUNYLFNBQVM7R0FDVixDQUFDO0FBRUosa0JBQWdCO0FBQ2hCLFFBQU0sY0FBYzs7O0FBSXhCLFNBQVMseUJBQ1AsU0FDQSxPQUNNO0FBQ04sS0FBSSxDQUFDLFNBQVMsQ0FBQyxRQUFTO0NBQ3hCLE1BQU0sUUFBUSxlQUFlLFFBQVEsTUFBTTtDQUMzQyxNQUFNLGlCQUFpQixRQUFRLG9CQUFvQixNQUFNLEdBQUc7QUFDNUQsS0FBSSxlQUFnQixPQUFNLGNBQWM7Q0FDeEMsTUFBTSxhQUFhLGVBQWUsUUFBUSxZQUFZO0FBQ3RELEtBQUksWUFBWTtBQUNkLFFBQU0sYUFBYTtBQUNuQixNQUFJLGVBQWUsVUFBVyxPQUFNLHlCQUF5QjtXQUNwRCxNQUFNLGdCQUFnQixNQUFNLGFBQWEsU0FBUyxZQUFZLGVBQWUsQ0FDcEYsT0FBTSx5QkFBeUI7O0NBSW5DLE1BQU0sY0FBYyxTQUFTLFFBQVEsYUFBYTtBQUNsRCxLQUFJLGFBQWEsU0FBUyxhQUFhLGVBQWUsVUFDcEQsT0FBTSxVQUFVO0VBQ2QsVUFBVSxlQUFlLGFBQWEsU0FBUztFQUMvQyxhQUFhLGVBQWUsYUFBYSxZQUFZO0VBQ3REO0FBRUgsd0JBQXVCLFNBQVMsUUFBUSxNQUFNLEVBQUUsTUFBTTs7QUFJeEQsU0FBZ0IscUJBQ2QsTUFDQSxTQUNBLE1BQzJCO0NBQzNCLE1BQU0sbUJBQW1CLE1BQU0sb0JBQW9CO0NBQ25ELE1BQU0sUUFBUSxNQUFNO0NBQ3BCLE1BQU0sVUFBVSxLQUFLLE1BQU07QUFDM0IsS0FBSSxDQUFDLFFBQVMsUUFBTztDQUVyQixJQUFJO0FBQ0osS0FBSTtBQUNGLE1BQUksS0FBSyxNQUFNLFFBQVE7U0FDakI7QUFDTixTQUFPOztBQUdULEtBQUksRUFBRSxTQUFTLGdCQUFnQjtFQUM3QixNQUFNLFFBQVEsU0FBUyxFQUFFLE1BQU07QUFDL0IsTUFBSSxPQUFPLFNBQVMsZ0JBQ2xCLDBCQUF5QixTQUFTLE1BQU0sUUFBUSxFQUFFLE1BQU07V0FDL0MsT0FBTyxTQUFTLGlCQUFpQjtHQUUxQyxNQUFNLGFBQWEsZUFETCxTQUFTLE1BQU0sTUFBTSxFQUNNLFlBQVk7QUFDckQsT0FBSSxTQUFTLFlBQVk7QUFDdkIsVUFBTSxhQUFhO0FBQ25CLFFBQUksZUFBZSxVQUFXLE9BQU0seUJBQXlCOzs7QUFHakUsTUFBSSxTQUFTLE1BQU0sU0FBUyx1QkFBdUI7R0FDakQsTUFBTSxRQUFRLFNBQVMsTUFBTSxNQUFNO0FBQ25DLE9BQUksT0FDRjtRQUFJLGtCQUNGO1NBQUksTUFBTSxTQUFTLHNCQUFzQixPQUFPLE1BQU0saUJBQWlCLFNBQ3JFLFNBQVEsTUFBTSxhQUFhO2VBR3pCLE1BQU0sU0FBUyxnQkFBZ0IsT0FBTyxNQUFNLFNBQVMsU0FDdkQsU0FBUSxNQUFNLEtBQUs7OztBQUszQixTQUFPOztBQUdULEtBQUksRUFBRSxTQUFTLFVBQVU7RUFDdkIsTUFBTSxVQUFVLGVBQWUsRUFBRSxRQUFRO0FBQ3pDLE1BQUksWUFBWSwwQkFBMEI7R0FDeEMsTUFBTSxZQUFZLGVBQWUsRUFBRSxjQUFjLElBQUksZUFBZSxFQUFFLGVBQWU7R0FDckYsTUFBTSxVQUFVLGVBQWUsRUFBRSxjQUFjLElBQUksZUFBZSxFQUFFLGVBQWU7QUFDbkYsT0FBSSxhQUFhLFFBQ2YsZ0JBQWUsT0FBTztJQUNwQixTQUFTO0lBQ1Q7SUFDQTtJQUNBLFVBQ0UsZUFBZSxFQUFFLG1CQUFtQixJQUNwQyxlQUFlLEVBQUUscUJBQXFCLElBQ3RDLGVBQWUsRUFBRSxnQkFBZ0IsSUFDakMsZUFBZSxFQUFFLGlCQUFpQjtJQUNwQyxhQUNFLGVBQWUsRUFBRSxzQkFBc0IsSUFDdkMsZUFBZSxFQUFFLHdCQUF3QixJQUN6QyxlQUFlLEVBQUUsbUJBQW1CLElBQ3BDLGVBQWUsRUFBRSxvQkFBb0I7SUFDeEMsQ0FBQzthQUVLLFlBQVksK0JBQStCLE9BQU87R0FDM0QsTUFBTSxnQkFBZ0IsZUFBZSxFQUFFLGNBQWMsSUFBSSxlQUFlLEVBQUUsZUFBZTtBQUN6RixPQUFJLGNBQWUsT0FBTSxjQUFjLG9CQUFvQixjQUFjO0FBQ3pFLFNBQU0sYUFBYTtBQUNuQixTQUFNLHlCQUF5QjtBQUMvQixTQUFNLFVBQVU7SUFDZCxVQUNFLGVBQWUsRUFBRSxtQkFBbUIsSUFDcEMsZUFBZSxFQUFFLHFCQUFxQixJQUN0QyxlQUFlLEVBQUUsZ0JBQWdCLElBQ2pDLGVBQWUsRUFBRSxpQkFBaUI7SUFDcEMsYUFDRSxlQUFlLEVBQUUsc0JBQXNCLElBQ3ZDLGVBQWUsRUFBRSx3QkFBd0IsSUFDekMsZUFBZSxFQUFFLG1CQUFtQixJQUNwQyxlQUFlLEVBQUUsb0JBQW9CO0lBQ3hDOztBQUVILFNBQU87O0FBR1QsS0FBSSxFQUFFLFNBQVMsYUFBYTtBQUMxQiwyQkFBeUIsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNO0FBQ3BELE1BQUksb0JBQW9CLFNBQVMsTUFBTSx5QkFBeUIsUUFBVztHQUN6RSxNQUFNLE9BQU8sNEJBQTRCLEVBQUU7QUFDM0MsT0FBSSxTQUFTLE9BQVcsT0FBTSx1QkFBdUI7O0FBRXZELFNBQU87O0FBR1QsS0FBSSxFQUFFLFNBQVMsVUFBVTtFQUN2QixJQUFJO0VBQ0osTUFBTSw0QkFBNEIsbUJBQW1CLE9BQU8sdUJBQXVCO0FBQ25GLE1BQUksOEJBQThCLE9BQ2hDLFFBQU87V0FDRSxFQUFFLHNCQUFzQixPQUNqQyxRQUFPLEtBQUssVUFBVSxFQUFFLGtCQUFrQjtNQUUxQyxRQUFPLGVBQWUsT0FBTyxFQUFFLFdBQVcsV0FBVyxFQUFFLFNBQVMsR0FBRztFQUdyRSxNQUFNLFdBQVcsU0FBUyxFQUFFLE1BQU0sSUFBSSxFQUFFO0FBQ3hDLHlCQUF1QixVQUFVLE1BQU07RUFDdkMsTUFBTSxjQUFjLGVBQWUsRUFBRSxNQUFNO0FBQzNDLE1BQUksU0FBUyxlQUFlLENBQUMsTUFBTSxZQUNqQyxPQUFNLGNBQWMsb0JBQW9CLFlBQVk7RUFFdEQsTUFBTSxtQkFBbUIsZUFBZSxFQUFFLFlBQVk7QUFDdEQsTUFBSSxTQUFTLGtCQUFrQjtBQUM3QixTQUFNLGFBQWE7QUFDbkIsT0FBSSxxQkFBcUIsVUFBVyxPQUFNLHlCQUF5Qjs7RUFFckUsTUFBTSxRQUFRLGlCQUFpQixTQUF3QjtFQUN2RCxNQUFNLGlCQUFpQixLQUFLLFdBQVcsYUFBYTtFQUNwRCxNQUFNLFVBQVUsT0FBTyxFQUFFLFlBQVksV0FBVyxFQUFFLFVBQVU7RUFDNUQsTUFBTSxpQkFBaUIsT0FBTyxFQUFFLG9CQUFvQixXQUFXLEVBQUUsa0JBQWtCO0VBU25GLE1BQU0sVUFDSixFQUFFLGFBQWEsUUFDZixFQUFFLG9CQUFvQixpQkFDckIsWUFBWSxVQUFhLFlBQVksYUFDdEMsT0FBTywyQkFBMkI7QUFFcEMsU0FBTztHQUNMO0dBQ0E7R0FDQSxZQUFZLE9BQU8sRUFBRSxnQkFBZ0IsV0FBVyxFQUFFLGNBQWM7R0FDaEUsU0FBUyxPQUFPLEVBQUUsbUJBQW1CLFdBQVcsRUFBRSxpQkFBaUI7R0FDbkU7R0FDQTtHQUNBO0dBQ0E7R0FDQSxhQUFhLE9BQU87R0FDcEIsWUFBWSxPQUFPO0dBQ25CLFNBQVMsT0FBTztHQUNoQixnQkFBZ0IsT0FBTztHQUN4Qjs7QUFHSCxRQUFPIn0=
@@ -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
- sonnet: {
61
- inputTokens: 3,
62
- outputTokens: 15,
63
- cachedInputTokens: .3,
64
- cacheCreationInputTokens: 3.75
65
- },
66
- "claude-3-5-haiku": {
67
- inputTokens: .8,
68
- outputTokens: 4,
69
- cachedInputTokens: .08,
70
- cacheCreationInputTokens: 1
71
- },
72
- "claude-haiku-4-5": {
73
- inputTokens: 1,
74
- outputTokens: 5,
75
- cachedInputTokens: .1,
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 cacheCreationInput = usage.cacheCreationInputTokens ?? 0;
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 cacheCreationRate = (costs.cacheCreationInputTokens ?? costs.inputTokens) * (isLongContext ? lc.inputMultiplier : 1);
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 + cacheCreationInput / 1e6 * cacheCreationRate;
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/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICByZXR1cm4gKFxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgIChjYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvblJhdGVcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFxQ0EsTUFBTSxvQkFBNEQ7Q0FDaEUsV0FBVztDQUNYLGlCQUFpQjtDQUNqQix1QkFBdUI7Q0FDdkIsa0JBQWtCO0NBQ25CO0FBRUQsTUFBTSxlQUEyQztDQVcvQyxlQUFlO0VBQ2IsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzFCLGFBQWE7RUFDZDtDQUNELGlCQUFpQjtFQUNmLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0VBQ2Q7Q0FDRCxnQkFBZ0I7RUFDZCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtFQUNkO0NBRUQsV0FBVztFQUNULGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLGFBQWE7RUFDZDtDQUVELFdBQVc7RUFDVCxhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQixhQUFhO0VBQ2Q7Q0FDRCxnQkFBZ0I7RUFBRSxhQUFhO0VBQU0sY0FBYztFQUFLLG1CQUFtQjtFQUFPO0NBRWxGLGlCQUFpQjtFQUFFLGFBQWE7RUFBTSxjQUFjO0VBQUksbUJBQW1CO0VBQU87Q0FFbEYsV0FBVztFQUFFLGFBQWE7RUFBTSxjQUFjO0VBQUksbUJBQW1CO0VBQU87Q0FDN0U7QUFJRCxNQUFNLGtCQUE4QztDQUdsRCxRQUFRO0VBQ04sYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzNCO0NBQ0Qsb0JBQW9CO0VBQ2xCLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjtDQUNELG9CQUFvQjtFQUNsQixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDM0I7Q0FDRCxxQkFBcUI7RUFDbkIsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzNCO0NBQ0QscUJBQXFCO0VBQ25CLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjtDQUNELG1CQUFtQjtFQUNqQixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDM0I7Q0FDRCxxQkFBcUI7RUFDbkIsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzNCO0NBQ0QscUJBQXFCO0VBQ25CLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjtDQUNELHFCQUFxQjtFQUNuQixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDM0I7Q0FDRCxpQkFBaUI7RUFDZixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDM0I7Q0FDRCxtQkFBbUI7RUFDakIsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzNCO0NBQ0QsbUJBQW1CO0VBQ2pCLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjtDQUNELG1CQUFtQjtFQUNqQixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDM0I7Q0FDRCxtQkFBbUI7RUFDakIsYUFBYTtFQUNiLGNBQWM7RUFDZCxtQkFBbUI7RUFDbkIsMEJBQTBCO0VBQzNCO0NBQ0QsbUJBQW1CO0VBQ2pCLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMzQjtDQUNGO0FBRUQsTUFBTSxnQkFBNEI7Q0FBRSxhQUFhO0NBQUcsY0FBYztDQUFJLG1CQUFtQjtDQUFLO0FBRTlGLFNBQWdCLGNBQWMsT0FBMkI7Q0FDdkQsTUFBTSxrQkFBa0IsTUFBTSxRQUFRLFlBQVksR0FBRztBQUNyRCxRQUFPLGFBQWEsb0JBQW9CLGdCQUFnQixvQkFBb0I7O0FBRzlFLFNBQWdCLGlCQUNkLE9BQ0EsT0FNUTtDQUNSLE1BQU0sUUFBUSxjQUFjLE1BQU07Q0FDbEMsTUFBTSxjQUFjLE1BQU0scUJBQXFCO0NBQy9DLE1BQU0scUJBQXFCLE1BQU0sNEJBQTRCO0NBQzdELE1BQU0saUJBQWlCLEtBQUssSUFBSSxNQUFNLGNBQWMsY0FBYyxvQkFBb0IsRUFBRTtDQUd4RixNQUFNLEtBQUssTUFBTTtDQUNqQixNQUFNLGdCQUFnQixPQUFPLFVBQWEsTUFBTSxjQUFjLEdBQUc7Q0FDakUsTUFBTSxZQUFZLE1BQU0sZUFBZSxnQkFBZ0IsR0FBRyxrQkFBa0I7Q0FDNUUsTUFBTSxhQUFhLE1BQU0scUJBQXFCLGdCQUFnQixHQUFHLHdCQUF3QjtDQUN6RixNQUFNLHFCQUNILE1BQU0sNEJBQTRCLE1BQU0sZ0JBQ3hDLGdCQUFnQixHQUFHLGtCQUFrQjtDQUN4QyxNQUFNLGFBQWEsTUFBTSxnQkFBZ0IsZ0JBQWdCLEdBQUcsbUJBQW1CO0FBRS9FLFFBQ0csaUJBQWlCLE1BQWEsWUFDOUIsTUFBTSxlQUFlLE1BQWEsYUFDbEMsY0FBYyxNQUFhLGFBQzNCLHFCQUFxQixNQUFhIn0=
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/IGNvc3RzLmlucHV0VG9rZW5zKSAqXG4gICAgKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3Qgb3V0cHV0UmF0ZSA9IGNvc3RzLm91dHB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMub3V0cHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIHJldHVybiAoXG4gICAgKG5vbkNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGlucHV0UmF0ZSArXG4gICAgKHVzYWdlLm91dHB1dFRva2VucyAvIDFfMDAwXzAwMCkgKiBvdXRwdXRSYXRlICtcbiAgICAoY2FjaGVkSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVkUmF0ZSArXG4gICAgKHVuY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dCAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uRmFsbGJhY2tSYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDVtIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb241bVJhdGUgK1xuICAgIChjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0MWggLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbjFoUmF0ZVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOztBQXdDQSxNQUFNLG9CQUE0RDtDQUNoRSxXQUFXO0NBQ1gsaUJBQWlCO0NBQ2pCLHVCQUF1QjtDQUN2QixrQkFBa0I7Q0FDbkI7QUFFRCxNQUFNLGVBQTJDO0NBVy9DLGVBQWU7RUFDYixhQUFhO0VBQ2IsY0FBYztFQUNkLG1CQUFtQjtFQUNuQiwwQkFBMEI7RUFDMUIsYUFBYTtFQUNkO0NBQ0QsaUJBQWlCO0VBQ2Ys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
@@ -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,