@dbx-tools/appkit-web-search 0.9.70 → 0.9.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +30 -33
- package/index.ts +5 -5
- package/lib/index.d.ts +5 -5
- package/lib/index.js +4 -4
- package/lib/src/config.d.ts +10 -15
- package/lib/src/config.js +8 -15
- package/lib/src/fetch.js +4 -1
- package/lib/src/plugin.d.ts +3 -0
- package/lib/src/plugin.js +16 -6
- package/lib/src/provider.d.ts +18 -20
- package/lib/src/provider.js +38 -29
- package/lib/src/runtime.d.ts +3 -0
- package/lib/src/runtime.js +3 -3
- package/lib/src/schema.d.ts +6 -0
- package/lib/src/schema.js +8 -7
- package/lib/src/search.d.ts +10 -2
- package/lib/src/search.js +216 -66
- package/lib/src/tool.d.ts +0 -1
- package/lib/src/tool.js +4 -4
- package/package.json +7 -7
- package/src/config.ts +13 -23
- package/src/fetch.ts +3 -0
- package/src/plugin.ts +35 -5
- package/src/provider.ts +44 -36
- package/src/runtime.ts +5 -2
- package/src/schema.ts +11 -6
- package/src/search.ts +252 -68
- package/src/tool.ts +3 -3
package/lib/src/search.js
CHANGED
|
@@ -20,17 +20,17 @@
|
|
|
20
20
|
*
|
|
21
21
|
* @module
|
|
22
22
|
*/
|
|
23
|
-
import { ConfigurationError, ConnectionError, ExecutionError, getExecutionContext,
|
|
24
|
-
import { invoke, resolve, modelCatalog } from "@dbx-tools/model";
|
|
23
|
+
import { ConfigurationError, ConnectionError, ExecutionError, getExecutionContext, } from "@databricks/appkit";
|
|
24
|
+
import { invoke, policy, resolve, modelCatalog } from "@dbx-tools/model";
|
|
25
25
|
import { log, object, stringUtils } from "@dbx-tools/shared-core";
|
|
26
26
|
import { openaiChat } from "@dbx-tools/shared-model";
|
|
27
|
-
import { MODEL_ENV
|
|
27
|
+
import { MODEL_ENV } from "./config.js";
|
|
28
28
|
import { toCallSettings, webSearchExecuteDefaults } from "./defaults.js";
|
|
29
|
-
import {
|
|
29
|
+
import { supportsWebSearch, webSearchProviderForFamily, webSearchToolSpec } from "./provider.js";
|
|
30
30
|
import { executeRead, toWebSearchRuntime, } from "./runtime.js";
|
|
31
31
|
import { runScrapeSearch } from "./scrape.js";
|
|
32
32
|
const logger = log.logger("web-search/search");
|
|
33
|
-
const {
|
|
33
|
+
const { lookupModels } = resolve;
|
|
34
34
|
const { listServingEndpoints } = modelCatalog;
|
|
35
35
|
/**
|
|
36
36
|
* How deep the grounding-metadata walk descends. Gemini nests its sources a
|
|
@@ -39,6 +39,8 @@ const { listServingEndpoints } = modelCatalog;
|
|
|
39
39
|
* into a full traversal of the response.
|
|
40
40
|
*/
|
|
41
41
|
const MAX_GROUNDING_WALK_DEPTH = 6;
|
|
42
|
+
const GEMINI_CROSS_REGION_COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
43
|
+
const GEMINI_CROSS_REGION_DISABLED = /cross-region processing is disabled/i;
|
|
42
44
|
/** Lowest HTTP status treated as a server-side (retryable) serving failure. */
|
|
43
45
|
const SERVER_ERROR_STATUS = 500;
|
|
44
46
|
/** Status Model Serving uses to shed load; retryable like a 5xx. */
|
|
@@ -59,66 +61,81 @@ export async function resolveWebSearchContext() {
|
|
|
59
61
|
* Resolve a web-search-capable model against the LIVE workspace catalogue - so
|
|
60
62
|
* we never return an endpoint id that isn't actually deployed (the "endpoint
|
|
61
63
|
* does not exist" failure a hardcoded fallback id would cause). Reuses
|
|
62
|
-
* `@dbx-tools/model`'s existing catalogue +
|
|
64
|
+
* `@dbx-tools/model`'s existing catalogue + ranker rather than a custom
|
|
63
65
|
* lookup: {@link listServingEndpoints} lists the endpoints (cached), and we
|
|
64
|
-
* restrict the candidate set
|
|
65
|
-
* {@link
|
|
66
|
+
* restrict the candidate set through model-owned capability metadata before
|
|
67
|
+
* {@link lookupModels} ranks within it.
|
|
66
68
|
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
*
|
|
70
|
-
* plugin's `model`, or `WEB_SEARCH_MODEL` - throws when it resolves to an
|
|
71
|
-
* unsupported / absent endpoint, so a bad pin surfaces rather than silently
|
|
72
|
-
* degrading. A pin inherited from the shared `DATABRICKS_SERVING_ENDPOINT_NAME`
|
|
73
|
-
* binding is only a preference: that endpoint is the app's serving endpoint,
|
|
74
|
-
* not necessarily a web-search-capable one, so an unusable value falls through
|
|
75
|
-
* to the fallback order.
|
|
69
|
+
* The highest-ranked Gemini model wins. Without Gemini, a GPT request matching
|
|
70
|
+
* the calling/configured model wins, followed by the highest-ranked GPT model
|
|
71
|
+
* and then any additional configured searches.
|
|
76
72
|
*/
|
|
77
|
-
async function resolveWebSearchModel(ctx,
|
|
73
|
+
async function resolveWebSearchModel(ctx, runtime, requested) {
|
|
74
|
+
const { config } = runtime;
|
|
78
75
|
const endpoints = await listServingEndpoints(ctx.client, ctx.host, {
|
|
79
76
|
...(ctx.cacheIdentity ? { cacheIdentity: ctx.cacheIdentity } : {}),
|
|
80
77
|
});
|
|
78
|
+
return selectWebSearchEndpoint(endpoints, requested, config, activeFamilyCooldowns(runtime));
|
|
79
|
+
}
|
|
80
|
+
/** Select one deployed web-search endpoint using family and capability policy. */
|
|
81
|
+
export function selectWebSearchEndpoint(endpoints, requested, config, suppressedFamilies = new Set()) {
|
|
81
82
|
// Only deployed, web-search-capable endpoints are candidates.
|
|
82
|
-
const capable = endpoints.filter((
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
83
|
+
const capable = endpoints.filter((endpoint) => {
|
|
84
|
+
const family = endpointFamily(endpoint);
|
|
85
|
+
return supportsWebSearch(endpoint) && (!family || !suppressedFamilies.has(family));
|
|
86
|
+
});
|
|
87
|
+
const gemini = lookupModels(capable, {
|
|
88
|
+
search: policy.ModelFamily.Gemini,
|
|
89
|
+
limit: 1,
|
|
90
|
+
threshold: config.fuzzyThreshold,
|
|
91
|
+
})[0]?.endpoint;
|
|
92
|
+
if (gemini)
|
|
93
|
+
return gemini;
|
|
94
|
+
const gpt = lookupModels(capable, {
|
|
95
|
+
search: policy.ModelFamily.Gpt,
|
|
96
|
+
limit: 50,
|
|
97
|
+
threshold: config.fuzzyThreshold,
|
|
98
|
+
}).map(({ endpoint }) => endpoint);
|
|
99
|
+
const preferred = requested ?? config.model;
|
|
100
|
+
if (preferred && policy.modelFamily(preferred) === policy.ModelFamily.Gpt) {
|
|
101
|
+
const matched = config.fuzzy
|
|
102
|
+
? lookupModels(gpt, {
|
|
103
|
+
search: preferred,
|
|
104
|
+
limit: 1,
|
|
105
|
+
threshold: config.fuzzyThreshold,
|
|
106
|
+
})[0]?.endpoint
|
|
107
|
+
: gpt.find((endpoint) => endpoint.name === preferred);
|
|
108
|
+
if (matched)
|
|
109
|
+
return matched;
|
|
110
|
+
}
|
|
111
|
+
if (gpt[0])
|
|
112
|
+
return gpt[0];
|
|
113
|
+
for (const search of config.modelFallbacks) {
|
|
114
|
+
if (search.toLowerCase() === policy.ModelFamily.Gemini ||
|
|
115
|
+
search.toLowerCase() === policy.ModelFamily.Gpt) {
|
|
116
|
+
continue;
|
|
109
117
|
}
|
|
118
|
+
const matched = lookupModels(capable, {
|
|
119
|
+
search,
|
|
120
|
+
limit: 1,
|
|
121
|
+
threshold: config.fuzzyThreshold,
|
|
122
|
+
})[0]?.endpoint;
|
|
123
|
+
if (matched)
|
|
124
|
+
return matched;
|
|
110
125
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/** Return one endpoint's model-owned family identity. */
|
|
129
|
+
function endpointFamily(endpoint) {
|
|
130
|
+
return policy.modelFamily(endpoint.modelServiceName ?? endpoint.name);
|
|
131
|
+
}
|
|
132
|
+
/** Drop expired family cooldowns and return the currently suppressed set. */
|
|
133
|
+
function activeFamilyCooldowns(runtime, now = Date.now()) {
|
|
134
|
+
for (const [family, expiresAt] of runtime.familyCooldowns) {
|
|
135
|
+
if (expiresAt <= now)
|
|
136
|
+
runtime.familyCooldowns.delete(family);
|
|
137
|
+
}
|
|
138
|
+
return new Set(runtime.familyCooldowns.keys());
|
|
122
139
|
}
|
|
123
140
|
/**
|
|
124
141
|
* POST a serving request as the OBO caller and return the parsed JSON body.
|
|
@@ -134,7 +151,7 @@ async function resolveWebSearchModel(ctx, config, requested) {
|
|
|
134
151
|
* directly; the SDK raises an `ApiError` that carries the status under
|
|
135
152
|
* inconsistent keys, which is guesswork by comparison.
|
|
136
153
|
*/
|
|
137
|
-
async function postServing(ctx, url, body, runtime, cacheKey, signal) {
|
|
154
|
+
async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgress) {
|
|
138
155
|
const { config } = runtime;
|
|
139
156
|
const payload = await executeRead(runtime, "serving-request", toCallSettings(webSearchExecuteDefaults, config.timeoutMs, cacheKey), async (executeSignal) => {
|
|
140
157
|
const response = await fetch(url, {
|
|
@@ -148,6 +165,27 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal) {
|
|
|
148
165
|
...(executeSignal ? { signal: executeSignal } : {}),
|
|
149
166
|
});
|
|
150
167
|
if (!response.ok) {
|
|
168
|
+
const responseBody = await response.text();
|
|
169
|
+
const model = object.isRecord(body) && typeof body.model === "string" ? body.model : undefined;
|
|
170
|
+
logger.error("serving-request-rejected", {
|
|
171
|
+
model,
|
|
172
|
+
api: url.endsWith("/responses") ? "responses" : "chat",
|
|
173
|
+
url,
|
|
174
|
+
status: response.status,
|
|
175
|
+
responseBody,
|
|
176
|
+
});
|
|
177
|
+
if (response.status === 400 &&
|
|
178
|
+
model &&
|
|
179
|
+
policy.modelFamily(model) === policy.ModelFamily.Gemini &&
|
|
180
|
+
GEMINI_CROSS_REGION_DISABLED.test(responseBody)) {
|
|
181
|
+
const expiresAt = Date.now() + GEMINI_CROSS_REGION_COOLDOWN_MS;
|
|
182
|
+
runtime.familyCooldowns.set(policy.ModelFamily.Gemini, expiresAt);
|
|
183
|
+
logger.warn("provider-family-suppressed", {
|
|
184
|
+
family: policy.ModelFamily.Gemini,
|
|
185
|
+
reason: "cross-region-disabled",
|
|
186
|
+
expiresAt: new Date(expiresAt).toISOString(),
|
|
187
|
+
});
|
|
188
|
+
}
|
|
151
189
|
// Load-shedding and server faults are worth another attempt; a 4xx is
|
|
152
190
|
// this request's own problem, so it must not be retried.
|
|
153
191
|
const retryable = response.status >= SERVER_ERROR_STATUS || response.status === RATE_LIMITED_STATUS;
|
|
@@ -156,10 +194,91 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal) {
|
|
|
156
194
|
? new ConnectionError(message, { context: { status: response.status } })
|
|
157
195
|
: new ExecutionError(message, { context: { status: response.status } });
|
|
158
196
|
}
|
|
159
|
-
return
|
|
197
|
+
return writeProgress &&
|
|
198
|
+
response.body &&
|
|
199
|
+
response.headers.get("content-type")?.includes("text/event-stream")
|
|
200
|
+
? readStreamingResponse(response, writeProgress)
|
|
201
|
+
: response.json();
|
|
160
202
|
}, signal);
|
|
161
203
|
return object.isRecord(payload) ? payload : {};
|
|
162
204
|
}
|
|
205
|
+
/** Consume an OpenAI Responses SSE stream and retain its completed response. */
|
|
206
|
+
async function readStreamingResponse(response, writeProgress) {
|
|
207
|
+
const reader = response.body.getReader();
|
|
208
|
+
const decoder = new TextDecoder();
|
|
209
|
+
let buffer = "";
|
|
210
|
+
let completed;
|
|
211
|
+
const consume = async (frame) => {
|
|
212
|
+
const data = frame
|
|
213
|
+
.split("\n")
|
|
214
|
+
.filter((line) => line.startsWith("data:"))
|
|
215
|
+
.map((line) => line.slice(5).trimStart())
|
|
216
|
+
.join("\n");
|
|
217
|
+
if (!data || data === "[DONE]")
|
|
218
|
+
return;
|
|
219
|
+
const event = JSON.parse(data);
|
|
220
|
+
if (!object.isRecord(event) || typeof event.type !== "string")
|
|
221
|
+
return;
|
|
222
|
+
await emitWebSearchProgress(event, writeProgress);
|
|
223
|
+
if (event.type === "response.completed" && object.isRecord(event.response)) {
|
|
224
|
+
completed = event.response;
|
|
225
|
+
}
|
|
226
|
+
if (event.type === "response.failed") {
|
|
227
|
+
throw new ExecutionError("web-search: streaming response failed", {
|
|
228
|
+
context: { response: event.response },
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
};
|
|
232
|
+
for (;;) {
|
|
233
|
+
const { done, value } = await reader.read();
|
|
234
|
+
buffer += decoder.decode(value, { stream: !done });
|
|
235
|
+
buffer = buffer.replaceAll("\r\n", "\n");
|
|
236
|
+
let boundary = buffer.indexOf("\n\n");
|
|
237
|
+
while (boundary >= 0) {
|
|
238
|
+
await consume(buffer.slice(0, boundary));
|
|
239
|
+
buffer = buffer.slice(boundary + 2);
|
|
240
|
+
boundary = buffer.indexOf("\n\n");
|
|
241
|
+
}
|
|
242
|
+
if (done)
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
if (buffer.trim())
|
|
246
|
+
await consume(buffer);
|
|
247
|
+
if (!completed)
|
|
248
|
+
throw new ExecutionError("web-search: streaming response did not complete");
|
|
249
|
+
return completed;
|
|
250
|
+
}
|
|
251
|
+
/** Publish native web-search lifecycle events as common tool progress. */
|
|
252
|
+
async function emitWebSearchProgress(event, writeProgress) {
|
|
253
|
+
if (event.type !== "response.output_item.done" || !object.isRecord(event.item))
|
|
254
|
+
return;
|
|
255
|
+
const action = object.isRecord(event.item.action) ? event.item.action : undefined;
|
|
256
|
+
if (!action || action.type !== "search")
|
|
257
|
+
return;
|
|
258
|
+
const query = typeof action.query === "string" ? action.query : undefined;
|
|
259
|
+
const queries = Array.isArray(action.queries)
|
|
260
|
+
? action.queries.filter((value) => typeof value === "string")
|
|
261
|
+
: [];
|
|
262
|
+
const groupId = typeof event.item.id === "string"
|
|
263
|
+
? event.item.id
|
|
264
|
+
: `search-${String(event.sequence_number ?? query ?? "unknown")}`;
|
|
265
|
+
const resultCount = queries.length > 0 ? queries.length : query ? 1 : 0;
|
|
266
|
+
await writeProgress({
|
|
267
|
+
type: "tool_status",
|
|
268
|
+
status: "search",
|
|
269
|
+
message: query ?? "the web",
|
|
270
|
+
groupId,
|
|
271
|
+
});
|
|
272
|
+
await writeProgress({
|
|
273
|
+
type: "tool_status",
|
|
274
|
+
status: "result",
|
|
275
|
+
message: "Result",
|
|
276
|
+
groupId,
|
|
277
|
+
...(resultCount > 0
|
|
278
|
+
? { detail: `${resultCount} ${resultCount === 1 ? "result" : "results"}` }
|
|
279
|
+
: {}),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
163
282
|
/* --------------------------- response extraction --------------------------- */
|
|
164
283
|
/**
|
|
165
284
|
* Extract answer text and citations from an OpenAI Responses API payload.
|
|
@@ -239,11 +358,11 @@ function fromChatPayload(payload) {
|
|
|
239
358
|
*
|
|
240
359
|
* `signal` cancels the whole call, including the in-flight serving request.
|
|
241
360
|
*/
|
|
242
|
-
export async function runWebSearch(request, runtimeOrConfig, ctx, signal) {
|
|
361
|
+
export async function runWebSearch(request, runtimeOrConfig, ctx, signal, writeProgress) {
|
|
243
362
|
const runtime = toWebSearchRuntime(runtimeOrConfig);
|
|
244
363
|
const { config } = runtime;
|
|
245
|
-
const
|
|
246
|
-
if (
|
|
364
|
+
const endpoint = await resolveWebSearchModel(ctx, runtime, request.model);
|
|
365
|
+
if (endpoint === null) {
|
|
247
366
|
// No native web-search model deployed in this workspace.
|
|
248
367
|
if (config.scrapeFallback) {
|
|
249
368
|
logger.info("no-native-model:scrape-fallback", { query: request.query });
|
|
@@ -253,21 +372,52 @@ export async function runWebSearch(request, runtimeOrConfig, ctx, signal) {
|
|
|
253
372
|
`disabled. Deploy a supported endpoint, set model or ${MODEL_ENV}, or enable the ` +
|
|
254
373
|
"fallback (WEB_SEARCH_SCRAPE_FALLBACK=1).");
|
|
255
374
|
}
|
|
256
|
-
|
|
375
|
+
try {
|
|
376
|
+
return await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
|
|
377
|
+
}
|
|
378
|
+
catch (error) {
|
|
379
|
+
if (endpointFamily(endpoint) !== policy.ModelFamily.Gemini ||
|
|
380
|
+
!activeFamilyCooldowns(runtime).has(policy.ModelFamily.Gemini)) {
|
|
381
|
+
throw error;
|
|
382
|
+
}
|
|
383
|
+
const fallback = await resolveWebSearchModel(ctx, runtime, request.model);
|
|
384
|
+
if (!fallback) {
|
|
385
|
+
if (config.scrapeFallback) {
|
|
386
|
+
logger.info("gemini-unavailable:scrape-fallback", { query: request.query });
|
|
387
|
+
return runScrapeSearch(request, runtime, signal);
|
|
388
|
+
}
|
|
389
|
+
throw error;
|
|
390
|
+
}
|
|
391
|
+
logger.info("gemini-unavailable:model-fallback", {
|
|
392
|
+
failedModel: endpoint.name,
|
|
393
|
+
fallbackModel: fallback.name,
|
|
394
|
+
});
|
|
395
|
+
return runNativeWebSearch(request, runtime, ctx, fallback, signal, writeProgress);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
/** Execute one native provider request against an already-selected endpoint. */
|
|
399
|
+
async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress) {
|
|
400
|
+
const { config } = runtime;
|
|
401
|
+
const modelId = endpoint.name;
|
|
402
|
+
const provider = webSearchProviderForFamily(policy.modelFamily(endpoint.modelServiceName ?? endpoint.name));
|
|
403
|
+
if (!provider) {
|
|
404
|
+
throw ConfigurationError.resourceNotFound("Native web-search provider", `Model ${modelId} has no supported provider family.`);
|
|
405
|
+
}
|
|
257
406
|
const spec = webSearchToolSpec(provider, config.webSearchTools);
|
|
258
407
|
const url = spec.api === "responses" ? invoke.responsesUrl(ctx.host) : invoke.chatCompletionsUrl(ctx.host);
|
|
259
408
|
const body = spec.api === "responses"
|
|
260
409
|
? {
|
|
410
|
+
...spec.request,
|
|
261
411
|
model: modelId,
|
|
262
412
|
input: [{ role: "user", content: request.query }],
|
|
263
|
-
|
|
413
|
+
...(writeProgress ? { stream: true } : {}),
|
|
264
414
|
}
|
|
265
415
|
: {
|
|
416
|
+
...spec.request,
|
|
266
417
|
model: modelId,
|
|
267
418
|
messages: [{ role: "user", content: request.query }],
|
|
268
|
-
tools: [spec.tool],
|
|
269
419
|
};
|
|
270
|
-
const payload = await postServing(ctx, url, body, runtime, ["web-search", "serving", spec.api, modelId, request.query], signal);
|
|
420
|
+
const payload = await postServing(ctx, url, body, runtime, ["web-search", "serving", spec.api, modelId, request.query], signal, writeProgress);
|
|
271
421
|
const { answer, citations } = spec.api === "responses" ? fromResponsesPayload(payload) : fromChatPayload(payload);
|
|
272
422
|
const permitted = citations.filter((c) => config.allowList.allows(c.url));
|
|
273
423
|
const dropped = citations.length - permitted.length;
|
|
@@ -282,4 +432,4 @@ export async function runWebSearch(request, runtimeOrConfig, ctx, signal) {
|
|
|
282
432
|
});
|
|
283
433
|
return { query: request.query, answer, citations: trimmed, model: modelId };
|
|
284
434
|
}
|
|
285
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixFQUNuQixlQUFlLEdBQ2hCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQzVGLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFFbkMsK0VBQStFO0FBQy9FLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxDQUFDO0FBRWhDLG9FQUFvRTtBQUNwRSxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQVVoQzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsdUJBQXVCO0lBQzNDLE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUQsTUFBTSxhQUFhLEdBQUcsUUFBUSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQztJQUN2RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxDQUFDO0FBQ3JELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUNsQyxHQUFxQixFQUNyQixNQUErQixFQUMvQixTQUE2QjtJQUU3QixNQUFNLFNBQVMsR0FBRyxNQUFNLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRTtRQUNqRSxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDbkUsQ0FBQyxDQUFDO0lBQ0gsOERBQThEO0lBQzlELE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLFNBQVMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3pDLE1BQU0sZUFBZSxHQUNuQixTQUFTLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLE1BQU0sQ0FBQyxXQUFXLEtBQUssU0FBUyxDQUFDO0lBRWpHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCx3REFBd0Q7UUFDeEQsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUU7WUFDeEMsUUFBUSxFQUFFLE1BQU07WUFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO1lBQ25CLFNBQVMsRUFBRSxNQUFNLENBQUMsY0FBYztTQUNqQyxDQUFDLENBQUM7UUFDSCwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckYsSUFBSSxNQUFNO1lBQUUsT0FBTyxPQUFPLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUM7UUFDakUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUU7Z0JBQzdDLE1BQU0sRUFBRSxvQkFBb0I7Z0JBQzVCLFFBQVE7YUFDVCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDbkMsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUNoQyxPQUFPLEVBQ1AsTUFBTSxFQUNOLHFEQUFxRCxRQUFRLEdBQUcsQ0FDakUsQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMscUNBQXFDLEVBQ3JDLDBDQUEwQyxRQUFRLGtCQUFrQixTQUFTLGtCQUFrQixDQUNoRyxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBRXRDLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEUsWUFBWTtJQUNaLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFO1FBQ3hDLFNBQVMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUNyQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7UUFDbkIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxjQUFjO0tBQ2pDLENBQUMsQ0FBQztJQUNILE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUN4QixHQUFxQixFQUNyQixHQUFXLEVBQ1gsSUFBYSxFQUNiLE9BQXlCLEVBQ3pCLFFBQXNDLEVBQ3RDLE1BQW9CO0lBRXBCLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDM0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxXQUFXLENBQy9CLE9BQU8sRUFDUCxpQkFBaUIsRUFDakIsY0FBYyxDQUFDLHdCQUF3QixFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEVBQ3BFLEtBQUssRUFBRSxhQUFhLEVBQW9CLEVBQUU7UUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2hDLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLEVBQUUsa0JBQWtCO2dCQUMxQixjQUFjLEVBQUUsa0JBQWtCO2FBQ25DO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDcEQsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNqQixzRUFBc0U7WUFDdEUseURBQXlEO1lBQ3pELE1BQU0sU0FBUyxHQUNiLFFBQVEsQ0FBQyxNQUFNLElBQUksbUJBQW1CLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxtQkFBbUIsQ0FBQztZQUNwRixNQUFNLE9BQU8sR0FBRywrREFBK0QsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQ2xHLE1BQU0sU0FBUztnQkFDYixDQUFDLENBQUMsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDO2dCQUN4RSxDQUFDLENBQUMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUUsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3pCLENBQUMsRUFDRCxNQUFNLENBQ1AsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDakQsQ0FBQztBQUVELGlGQUFpRjtBQUVqRjs7R0FFRztBQUNILFNBQVMsb0JBQW9CLENBQUMsT0FBZ0M7SUFJNUQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNuRSxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsTUFBTSxTQUFTLEdBQXdCLEVBQUUsQ0FBQztJQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1lBQUUsU0FBUztRQUNyQyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxLQUFLO1lBQUUsU0FBUztRQUNyQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztnQkFBRSxTQUFTO1lBQ3JDLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hELElBQUksSUFBSTtnQkFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDNUUsS0FBSyxNQUFNLFVBQVUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO29CQUFFLFNBQVM7Z0JBQzNDLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO29CQUFFLFNBQVM7Z0JBQ3BDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2QsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3hELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkYsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztBQUMvQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGVBQWUsQ0FBQyxPQUFnQztJQUl2RCxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ3RFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUYsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3RCxNQUFNLFNBQVMsR0FBd0IsRUFBRSxDQUFDO0lBQzFDLGdGQUFnRjtJQUNoRixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBVSxFQUFFLEtBQWEsRUFBUSxFQUFFO1FBQ2hELElBQUksS0FBSyxHQUFHLHdCQUF3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFBRSxPQUFPO1FBQ3BFLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdFLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDZCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzRCxJQUFJLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO2dCQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDLENBQUM7SUFDRixLQUFLLENBQUMsT0FBTyxDQUFDLGtCQUFrQixJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxPQUF5QixFQUN6QixlQUFzQyxFQUN0QyxHQUFxQixFQUNyQixNQUFvQjtJQUVwQixNQUFNLE9BQU8sR0FBRyxrQkFBa0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNwRCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQzNCLE1BQU0sT0FBTyxHQUFHLE1BQU0scUJBQXFCLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEUsSUFBSSxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckIseURBQXlEO1FBQ3pELElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLEVBQUUsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDekUsT0FBTyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsTUFBTSxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FDdkMscUNBQXFDLEVBQ3JDLGtGQUFrRjtZQUNoRix1REFBdUQsU0FBUyxrQkFBa0I7WUFDbEYsMENBQTBDLENBQzdDLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsdUJBQXVCLENBQUMsT0FBTyxDQUFFLENBQUMsQ0FBQyw2QkFBNkI7SUFDakYsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVoRSxNQUFNLEdBQUcsR0FDUCxJQUFJLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakcsTUFBTSxJQUFJLEdBQ1IsSUFBSSxDQUFDLEdBQUcsS0FBSyxXQUFXO1FBQ3RCLENBQUMsQ0FBQztZQUNFLEtBQUssRUFBRSxPQUFPO1lBQ2QsS0FBSyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakQsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQjtRQUNILENBQUMsQ0FBQztZQUNFLEtBQUssRUFBRSxPQUFPO1lBQ2QsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDcEQsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNuQixDQUFDO0lBRVIsTUFBTSxPQUFPLEdBQUcsTUFBTSxXQUFXLENBQy9CLEdBQUcsRUFDSCxHQUFHLEVBQ0gsSUFBSSxFQUNKLE9BQU8sRUFDUCxDQUFDLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUMzRCxNQUFNLENBQ1AsQ0FBQztJQUVGLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQ3pCLElBQUksQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbiAgVmFsaWRhdGlvbkVycm9yLFxufSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHJlc29sdmUsIG1vZGVsQ2F0YWxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgb3BlbmFpQ2hhdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCBTRVJWSU5HX0VORFBPSU5UX0VOViwgdHlwZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgdG9DYWxsU2V0dGluZ3MsIHdlYlNlYXJjaEV4ZWN1dGVEZWZhdWx0cyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5pbXBvcnQgeyBkZXRlY3RXZWJTZWFyY2hQcm92aWRlciwgc3VwcG9ydHNXZWJTZWFyY2gsIHdlYlNlYXJjaFRvb2xTcGVjIH0gZnJvbSBcIi4vcHJvdmlkZXIudHNcIjtcbmltcG9ydCB7XG4gIGV4ZWN1dGVSZWFkLFxuICB0b1dlYlNlYXJjaFJ1bnRpbWUsXG4gIHR5cGUgV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG59IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB0eXBlIHsgV2ViU2VhcmNoQ2l0YXRpb24sIFdlYlNlYXJjaFJlcXVlc3QsIFdlYlNlYXJjaFJlc3VsdCB9IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuaW1wb3J0IHsgcnVuU2NyYXBlU2VhcmNoIH0gZnJvbSBcIi4vc2NyYXBlLnRzXCI7XG5cbnR5cGUgV29ya3NwYWNlQ2xpZW50TGlrZSA9IG1vZGVsQ2F0YWxvZy5Xb3Jrc3BhY2VDbGllbnRMaWtlICYgaW52b2tlLkF1dGhlbnRpY2F0aW5nQ2xpZW50TGlrZTtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgcmVzb2x2ZU1vZGVsIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuXG4vKiogTG93ZXN0IEhUVFAgc3RhdHVzIHRyZWF0ZWQgYXMgYSBzZXJ2ZXItc2lkZSAocmV0cnlhYmxlKSBzZXJ2aW5nIGZhaWx1cmUuICovXG5jb25zdCBTRVJWRVJfRVJST1JfU1RBVFVTID0gNTAwO1xuXG4vKiogU3RhdHVzIE1vZGVsIFNlcnZpbmcgdXNlcyB0byBzaGVkIGxvYWQ7IHJldHJ5YWJsZSBsaWtlIGEgNXh4LiAqL1xuY29uc3QgUkFURV9MSU1JVEVEX1NUQVRVUyA9IDQyOTtcblxuLyoqIENvbnRleHQgYSBzZWFyY2ggbmVlZHMgZnJvbSB0aGUgY2FsbGVyOiB0aGUgT0JPIGNsaWVudCArIHdvcmtzcGFjZSBob3N0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hDb250ZXh0IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBUcnVzdGVkIGlkZW50aXR5IG9mIHRoZSBjcmVkZW50aWFsIGNhcnJpZWQgYnkgYGNsaWVudGAuICovXG4gIGNhY2hlSWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgT0JPIHdvcmtzcGFjZSBjbGllbnQgKyBob3N0IGZyb20gdGhlIGFjdGl2ZSBBcHBLaXQgZXhlY3V0aW9uXG4gKiBjb250ZXh0LiBJbnNpZGUgYGFnZW50LnN0cmVhbWAncyBgYXNVc2VyKHJlcSlgIHNjb3BlIHRoaXMgaGl0cyB0aGUgc2VydmluZ1xuICogZW5kcG9pbnQgYXMgdGhlIHJlcXVlc3RpbmcgdXNlcjsgb3V0c2lkZSBhIHVzZXIgY29udGV4dCBBcHBLaXQgZmFsbHMgYmFjayB0b1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKTogUHJvbWlzZTxXZWJTZWFyY2hDb250ZXh0PiB7XG4gIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjdHguY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGNhY2hlSWRlbnRpdHkgPSBcInVzZXJJZFwiIGluIGN0eCA/IGN0eC51c2VySWQgOiBjdHguc2VydmljZVVzZXJJZDtcbiAgcmV0dXJuIHsgY2xpZW50OiBjdHguY2xpZW50LCBob3N0LCBjYWNoZUlkZW50aXR5IH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBhZ2FpbnN0IHRoZSBMSVZFIHdvcmtzcGFjZSBjYXRhbG9ndWUgLSBzb1xuICogd2UgbmV2ZXIgcmV0dXJuIGFuIGVuZHBvaW50IGlkIHRoYXQgaXNuJ3QgYWN0dWFsbHkgZGVwbG95ZWQgKHRoZSBcImVuZHBvaW50XG4gKiBkb2VzIG5vdCBleGlzdFwiIGZhaWx1cmUgYSBoYXJkY29kZWQgZmFsbGJhY2sgaWQgd291bGQgY2F1c2UpLiBSZXVzZXNcbiAqIGBAZGJ4LXRvb2xzL21vZGVsYCdzIGV4aXN0aW5nIGNhdGFsb2d1ZSArIHJlc29sdmVyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0byB0aGUge0BsaW5rIHN1cHBvcnRzV2ViU2VhcmNofSBvbmVzIGJlZm9yZVxuICoge0BsaW5rIHJlc29sdmVNb2RlbH0gZnV6enktcGlja3Mgd2l0aGluIGl0LlxuICpcbiAqIFJldHVybnMgdGhlIGNob3NlbiBlbmRwb2ludCBpZCwgb3IgYG51bGxgIHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9cbiAqIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBkZXBsb3llZCAodGhlIGNhbGxlciB0aGVuIHVzZXMgdGhlIHNjcmFwZVxuICogZmFsbGJhY2spLiBBIHBpbiB0aGUgY2FsbGVyIGNob3NlIGRlbGliZXJhdGVseSAtIHRoZSByZXF1ZXN0J3MgYG1vZGVsYCwgdGhlXG4gKiBwbHVnaW4ncyBgbW9kZWxgLCBvciBgV0VCX1NFQVJDSF9NT0RFTGAgLSB0aHJvd3Mgd2hlbiBpdCByZXNvbHZlcyB0byBhblxuICogdW5zdXBwb3J0ZWQgLyBhYnNlbnQgZW5kcG9pbnQsIHNvIGEgYmFkIHBpbiBzdXJmYWNlcyByYXRoZXIgdGhhbiBzaWxlbnRseVxuICogZGVncmFkaW5nLiBBIHBpbiBpbmhlcml0ZWQgZnJvbSB0aGUgc2hhcmVkIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWBcbiAqIGJpbmRpbmcgaXMgb25seSBhIHByZWZlcmVuY2U6IHRoYXQgZW5kcG9pbnQgaXMgdGhlIGFwcCdzIHNlcnZpbmcgZW5kcG9pbnQsXG4gKiBub3QgbmVjZXNzYXJpbHkgYSB3ZWItc2VhcmNoLWNhcGFibGUgb25lLCBzbyBhbiB1bnVzYWJsZSB2YWx1ZSBmYWxscyB0aHJvdWdoXG4gKiB0byB0aGUgZmFsbGJhY2sgb3JkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXZWJTZWFyY2hNb2RlbChcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBjb25maWc6IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIC8vIE9ubHkgZGVwbG95ZWQsIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludHMgYXJlIGNhbmRpZGF0ZXMuXG4gIGNvbnN0IGNhcGFibGUgPSBlbmRwb2ludHMuZmlsdGVyKChlKSA9PiBzdXBwb3J0c1dlYlNlYXJjaChlLm5hbWUpKTtcbiAgY29uc3QgcGlubmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgY29uc3QgcGluSXNEZWxpYmVyYXRlID1cbiAgICByZXF1ZXN0ZWQgIT09IHVuZGVmaW5lZCB8fCBjb25maWcubW9kZWxTb3VyY2UgPT09IFwiY29uZmlnXCIgfHwgY29uZmlnLm1vZGVsU291cmNlID09PSBNT0RFTF9FTlY7XG5cbiAgaWYgKHBpbm5lZCkge1xuICAgIC8vIFJlc29sdmUgdGhlIGV4cGxpY2l0IGFzayB3aXRoaW4gdGhlIGNhcGFibGUgc2V0IG9ubHkuXG4gICAgY29uc3QgeyBtb2RlbElkIH0gPSByZXNvbHZlTW9kZWwoY2FwYWJsZSwge1xuICAgICAgZXhwbGljaXQ6IHBpbm5lZCxcbiAgICAgIGZ1enp5OiBjb25maWcuZnV6enksXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KTtcbiAgICAvLyByZXNvbHZlTW9kZWwgcmV0dXJucyB0aGUgaW5wdXQgdmVyYmF0aW0gb24gbm8gbWF0Y2g7IHJlcXVpcmUgaXQgdG8gYmUgYVxuICAgIC8vIHJlYWwgY2FwYWJsZSBlbmRwb2ludCBzbyBhIGJhZCBwaW4gaXMgYSBjbGVhciBlcnJvciwgbm90IGEgcGhhbnRvbSBjYWxsLlxuICAgIGNvbnN0IHVzYWJsZSA9IGNhcGFibGUuc29tZSgoZSkgPT4gZS5uYW1lID09PSBtb2RlbElkKSAmJiBzdXBwb3J0c1dlYlNlYXJjaChtb2RlbElkKTtcbiAgICBpZiAodXNhYmxlKSByZXR1cm4gbW9kZWxJZDtcbiAgICBjb25zdCBkZXBsb3llZCA9IGNhcGFibGUubWFwKChlKSA9PiBlLm5hbWUpLmpvaW4oXCIsIFwiKSB8fCBcIm5vbmVcIjtcbiAgICBpZiAoIXBpbklzRGVsaWJlcmF0ZSkge1xuICAgICAgbG9nZ2VyLmluZm8oXCJzaGFyZWQtZW5kcG9pbnQtbm90LXdlYi1jYXBhYmxlXCIsIHtcbiAgICAgICAgZW52VmFyOiBTRVJWSU5HX0VORFBPSU5UX0VOVixcbiAgICAgICAgZGVwbG95ZWQsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHJlcXVlc3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgICBcIm1vZGVsXCIsXG4gICAgICAgIHBpbm5lZCxcbiAgICAgICAgYGEgZGVwbG95ZWQgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IChkZXBsb3llZDogJHtkZXBsb3llZH0pYCxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIldlYi1zZWFyY2gtY2FwYWJsZSBzZXJ2aW5nIGVuZHBvaW50XCIsXG4gICAgICAgIGBEZXBsb3llZCB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnRzOiAke2RlcGxveWVkfS4gU2V0IG1vZGVsIG9yICR7TU9ERUxfRU5WfSB0byBvbmUgb2YgdGhlbS5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoY2FwYWJsZS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gIC8vIE5vdGhpbmcgdXNhYmxlIHBpbm5lZDogcHJlZmVyIHRoZSBjb25maWd1cmVkIGZhbGxiYWNrIG9yZGVyIChHZW1pbmksIHRoZW5cbiAgLy8gR1BUKSB3aGVuIHRob3NlIGlkcyBhcmUgYWN0dWFsbHkgZGVwbG95ZWQ7IGVsc2UgdGFrZSB0aGUgYmVzdCBjYXBhYmxlXG4gIC8vIGVuZHBvaW50LlxuICBjb25zdCB7IG1vZGVsSWQgfSA9IHJlc29sdmVNb2RlbChjYXBhYmxlLCB7XG4gICAgZmFsbGJhY2tzOiBbLi4uY29uZmlnLm1vZGVsRmFsbGJhY2tzXSxcbiAgICBmdXp6eTogY29uZmlnLmZ1enp5LFxuICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICB9KTtcbiAgcmV0dXJuIGNhcGFibGUuc29tZSgoZSkgPT4gZS5uYW1lID09PSBtb2RlbElkKSA/IG1vZGVsSWQgOiAoY2FwYWJsZVswXT8ubmFtZSA/PyBudWxsKTtcbn1cblxuLyoqXG4gKiBQT1NUIGEgc2VydmluZyByZXF1ZXN0IGFzIHRoZSBPQk8gY2FsbGVyIGFuZCByZXR1cm4gdGhlIHBhcnNlZCBKU09OIGJvZHkuXG4gKlxuICogQXV0aCBoZWFkZXJzIGFyZSBtaW50ZWQgcGVyIGNhbGwgZnJvbSB0aGUgT0JPIGNsaWVudCdzIFNESyBjb25maWcsIHdoaWNoXG4gKiByZWZyZXNoZXMgdGhlIHRva2VuIHdoZW4gaXQgaXMgY2xvc2UgdG8gZXhwaXJ5LCBzbyB0aGUgcmVxdWVzdCBjYXJyaWVzIHRoZVxuICogcmVxdWVzdGluZyB1c2VyJ3MgaWRlbnRpdHkuXG4gKlxuICogVGhpcyBpcyB0aGUgb25lIERhdGFicmlja3MgY2FsbCBpbiB0aGUgcmVwbyB0aGF0IGRvZXMgbm90IGdvIHRocm91Z2hcbiAqIGBhcGlDbGllbnQucmVxdWVzdGAgKyBgZGF0YWJyaWNrcy50b0NvbnRleHRgICh3aGljaCBkb2VzIGZvcndhcmRcbiAqIGNhbmNlbGxhdGlvbikuIFJldHJ5IGNsYXNzaWZpY2F0aW9uIGhlcmUgaGFzIHRvIGRpc3Rpbmd1aXNoIGEgbG9hZC1zaGVkIG9yXG4gKiBzZXJ2ZXIgZmF1bHQgZnJvbSB0aGlzIHJlcXVlc3QncyBvd24gNHh4LCBhbmQgYGZldGNoYCBleHBvc2VzIHRoZSBIVFRQIHN0YXR1c1xuICogZGlyZWN0bHk7IHRoZSBTREsgcmFpc2VzIGFuIGBBcGlFcnJvcmAgdGhhdCBjYXJyaWVzIHRoZSBzdGF0dXMgdW5kZXJcbiAqIGluY29uc2lzdGVudCBrZXlzLCB3aGljaCBpcyBndWVzc3dvcmsgYnkgY29tcGFyaXNvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcG9zdFNlcnZpbmcoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgdXJsOiBzdHJpbmcsXG4gIGJvZHk6IHVua25vd24sXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIGNhY2hlS2V5OiByZWFkb25seSAoc3RyaW5nIHwgbnVtYmVyKVtdLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIC8vIExvYWQtc2hlZGRpbmcgYW5kIHNlcnZlciBmYXVsdHMgYXJlIHdvcnRoIGFub3RoZXIgYXR0ZW1wdDsgYSA0eHggaXNcbiAgICAgICAgLy8gdGhpcyByZXF1ZXN0J3Mgb3duIHByb2JsZW0sIHNvIGl0IG11c3Qgbm90IGJlIHJldHJpZWQuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IFNFUlZFUl9FUlJPUl9TVEFUVVMgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBSQVRFX0xJTUlURURfU1RBVFVTO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYHdlYi1zZWFyY2g6IE1vZGVsIFNlcnZpbmcgcmVqZWN0ZWQgdGhlIHNlYXJjaCByZXF1ZXN0IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICB0aHJvdyByZXRyeWFibGVcbiAgICAgICAgICA/IG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgeyBjb250ZXh0OiB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0gfSlcbiAgICAgICAgICA6IG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNwb25zZS5qc29uKCk7XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICk7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGF5bG9hZCkgPyBwYXlsb2FkIDoge307XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNwb25zZSBleHRyYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgYW5kIGNpdGF0aW9ucyBmcm9tIGFuIE9wZW5BSSBSZXNwb25zZXMgQVBJIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IG91dHB1dCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5vdXRwdXQpID8gcGF5bG9hZC5vdXRwdXQgOiBbXTtcbiAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChpdGVtKSkgY29udGludWU7XG4gICAgY29uc3QgcGFydHMgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50UGFydHMoaXRlbS5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXJ0LnRleHQpO1xuICAgICAgaWYgKHRleHQpIHRleHRzLnB1c2godGV4dCk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocGFydC5hbm5vdGF0aW9ucykgPyBwYXJ0LmFubm90YXRpb25zIDogW107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYW5ub3RhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB1cmwgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShhbm5vdGF0aW9uLnVybCk7XG4gICAgICAgIGlmICghdXJsIHx8IHNlZW4uaGFzKHVybCkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udGl0bGUpO1xuICAgICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhbnN3ZXIgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXlsb2FkLm91dHB1dF90ZXh0KSB8fCB0ZXh0cy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuc3dlciB0ZXh0ICsgY2l0YXRpb25zIGZyb20gYSBDaGF0IENvbXBsZXRpb25zIHBheWxvYWQgKEdlbWluaSB2aWFcbiAqIGBnb29nbGVfc2VhcmNoYCkuIFRoZSBhbnN3ZXIgaXMgYGNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50YDsgZ3JvdW5kaW5nXG4gKiBzb3VyY2VzLCB3aGVuIHByZXNlbnQsIHN1cmZhY2UgdW5kZXIgYGNob2ljZXNbMF0ubWVzc2FnZWAgZ3JvdW5kaW5nXG4gKiBtZXRhZGF0YSAoYmVzdC1lZmZvcnQgLSBzaGFwZXMgdmFyeSwgc28gd2Ugc2NhbiBmb3IgdXJsLWJlYXJpbmcgZW50cmllcykuXG4gKi9cbmZ1bmN0aW9uIGZyb21DaGF0UGF5bG9hZChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgYW5zd2VyOiBzdHJpbmc7XG4gIGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXTtcbn0ge1xuICBjb25zdCBjaG9pY2VzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpID8gcGF5bG9hZC5jaG9pY2VzIDogW107XG4gIGNvbnN0IGZpcnN0ID0gY2hvaWNlc1swXTtcbiAgY29uc3QgbWVzc2FnZSA9IG9iamVjdC5pc1JlY29yZChmaXJzdCkgJiYgb2JqZWN0LmlzUmVjb3JkKGZpcnN0Lm1lc3NhZ2UpID8gZmlyc3QubWVzc2FnZSA6IHt9O1xuICBjb25zdCBhbnN3ZXIgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICAvLyBCZXN0LWVmZm9ydCBncm91bmRpbmcgZXh0cmFjdGlvbjogd2FsayBhbnkgbmVzdGVkIG9iamVjdCBmb3Ige3VyaXx1cmwsdGl0bGV9LlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHZpc2l0ID0gKHY6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZGVwdGggPiBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggfHwgIW9iamVjdC5pc1JlY29yZCh2KSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJsKSB8fCBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnVyaSk7XG4gICAgaWYgKHVybCAmJiAhc2Vlbi5oYXModXJsKSkge1xuICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi50aXRsZSk7XG4gICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHYpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwuZm9yRWFjaCgoeCkgPT4gdmlzaXQoeCwgZGVwdGggKyAxKSk7XG4gICAgICBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikgdmlzaXQodmFsLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfTtcbiAgdmlzaXQobWVzc2FnZS5ncm91bmRpbmdfbWV0YWRhdGEgPz8gbWVzc2FnZS5ncm91bmRpbmdNZXRhZGF0YSwgMCk7XG4gIHJldHVybiB7IGFuc3dlciwgY2l0YXRpb25zIH07XG59XG5cbi8qKlxuICogUnVuIGEgd2ViIHNlYXJjaC4gUHJlZmVycyB0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIG9uIGFcbiAqIGRlcGxveWVkIEdQVC9HZW1pbmkgZW5kcG9pbnQgKHN5bnRoZXNpemVkIGFuc3dlciArIGNpdGF0aW9ucyk7IHdoZW4gdGhlXG4gKiB3b3Jrc3BhY2UgaGFzIG5vIHN1Y2ggZW5kcG9pbnQgQU5EIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgZW5hYmxlZCwgZmFsbHNcbiAqIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSBzbyB0aGUgdG9vbCBzdGlsbCByZXR1cm5zIHJlc3VsdHMgaW5zdGVhZCBvZlxuICogZXJyb3JpbmcuIENpdGF0aW9ucyBhcmUgZmlsdGVyZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBVUkwgYWxsb3ctbGlzdC5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIHRoZSB3aG9sZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGluLWZsaWdodCBzZXJ2aW5nIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgcnVudGltZSA9IHRvV2ViU2VhcmNoUnVudGltZShydW50aW1lT3JDb25maWcpO1xuICBjb25zdCB7IGNvbmZpZyB9ID0gcnVudGltZTtcbiAgY29uc3QgbW9kZWxJZCA9IGF3YWl0IHJlc29sdmVXZWJTZWFyY2hNb2RlbChjdHgsIGNvbmZpZywgcmVxdWVzdC5tb2RlbCk7XG5cbiAgaWYgKG1vZGVsSWQgPT09IG51bGwpIHtcbiAgICAvLyBObyBuYXRpdmUgd2ViLXNlYXJjaCBtb2RlbCBkZXBsb3llZCBpbiB0aGlzIHdvcmtzcGFjZS5cbiAgICBpZiAoY29uZmlnLnNjcmFwZUZhbGxiYWNrKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcIm5vLW5hdGl2ZS1tb2RlbDpzY3JhcGUtZmFsbGJhY2tcIiwgeyBxdWVyeTogcmVxdWVzdC5xdWVyeSB9KTtcbiAgICAgIHJldHVybiBydW5TY3JhcGVTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBcIldlYi1zZWFyY2gtY2FwYWJsZSBzZXJ2aW5nIGVuZHBvaW50XCIsXG4gICAgICBcIk5vIEdQVC9HZW1pbmkgZW5kcG9pbnQgaXMgZGVwbG95ZWQgaW4gdGhpcyB3b3Jrc3BhY2UgYW5kIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgXCIgK1xuICAgICAgICBgZGlzYWJsZWQuIERlcGxveSBhIHN1cHBvcnRlZCBlbmRwb2ludCwgc2V0IG1vZGVsIG9yICR7TU9ERUxfRU5WfSwgb3IgZW5hYmxlIHRoZSBgICtcbiAgICAgICAgXCJmYWxsYmFjayAoV0VCX1NFQVJDSF9TQ1JBUEVfRkFMTEJBQ0s9MSkuXCIsXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHByb3ZpZGVyID0gZGV0ZWN0V2ViU2VhcmNoUHJvdmlkZXIobW9kZWxJZCkhOyAvLyBndWFyYW50ZWVkIGJ5IHJlc29sdmUgc3RlcFxuICBjb25zdCBzcGVjID0gd2ViU2VhcmNoVG9vbFNwZWMocHJvdmlkZXIsIGNvbmZpZy53ZWJTZWFyY2hUb29scyk7XG5cbiAgY29uc3QgdXJsID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIiA/IGludm9rZS5yZXNwb25zZXNVcmwoY3R4Lmhvc3QpIDogaW52b2tlLmNoYXRDb21wbGV0aW9uc1VybChjdHguaG9zdCk7XG4gIGNvbnN0IGJvZHkgPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiXG4gICAgICA/IHtcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBpbnB1dDogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgdG9vbHM6IFtzcGVjLnRvb2xdLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBtZXNzYWdlczogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgdG9vbHM6IFtzcGVjLnRvb2xdLFxuICAgICAgICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBwb3N0U2VydmluZyhcbiAgICBjdHgsXG4gICAgdXJsLFxuICAgIGJvZHksXG4gICAgcnVudGltZSxcbiAgICBbXCJ3ZWItc2VhcmNoXCIsIFwic2VydmluZ1wiLCBzcGVjLmFwaSwgbW9kZWxJZCwgcmVxdWVzdC5xdWVyeV0sXG4gICAgc2lnbmFsLFxuICApO1xuXG4gIGNvbnN0IHsgYW5zd2VyLCBjaXRhdGlvbnMgfSA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCIgPyBmcm9tUmVzcG9uc2VzUGF5bG9hZChwYXlsb2FkKSA6IGZyb21DaGF0UGF5bG9hZChwYXlsb2FkKTtcblxuICBjb25zdCBwZXJtaXR0ZWQgPSBjaXRhdGlvbnMuZmlsdGVyKChjKSA9PiBjb25maWcuYWxsb3dMaXN0LmFsbG93cyhjLnVybCkpO1xuICBjb25zdCBkcm9wcGVkID0gY2l0YXRpb25zLmxlbmd0aCAtIHBlcm1pdHRlZC5sZW5ndGg7XG4gIGNvbnN0IHRyaW1tZWQgPSBwZXJtaXR0ZWQuc2xpY2UoMCwgY29uZmlnLm1heENpdGF0aW9ucyk7XG4gIGxvZ2dlci5kZWJ1ZyhcInNlYXJjaGVkXCIsIHtcbiAgICBxdWVyeTogcmVxdWVzdC5xdWVyeSxcbiAgICBtb2RlbDogbW9kZWxJZCxcbiAgICBwcm92aWRlcixcbiAgICBjaXRhdGlvbnM6IGNpdGF0aW9ucy5sZW5ndGgsXG4gICAgLi4uKGRyb3BwZWQgPiAwID8geyBmaWx0ZXJlZDogZHJvcHBlZCB9IDoge30pLFxuICAgIHJldHVybmVkOiB0cmltbWVkLmxlbmd0aCxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcXVlcnk6IHJlcXVlc3QucXVlcnksIGFuc3dlciwgY2l0YXRpb25zOiB0cmltbWVkLCBtb2RlbDogbW9kZWxJZCB9O1xufVxuIl19
|
|
435
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENB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QUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcInNlcnZpbmctcmVxdWVzdC1yZWplY3RlZFwiLCB7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICBtb2RlbCAmJlxuICAgICAgICAgIHBvbGljeS5tb2RlbEZhbWlseShtb2RlbCkgPT09IHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmkgJiZcbiAgICAgICAgICBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVELnRlc3QocmVzcG9uc2VCb2R5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUztcbiAgICAgICAgICBydW50aW1lLmZhbWlseUNvb2xkb3ducy5zZXQocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSwgZXhwaXJlc0F0KTtcbiAgICAgICAgICBsb2dnZXIud2FybihcInByb3ZpZGVyLWZhbWlseS1zdXBwcmVzc2VkXCIsIHtcbiAgICAgICAgICAgIGZhbWlseTogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICAgICAgICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoZXhwaXJlc0F0KS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvYWQtc2hlZGRpbmcgYW5kIHNlcnZlciBmYXVsdHMgYXJlIHdvcnRoIGFub3RoZXIgYXR0ZW1wdDsgYSA0eHggaXNcbiAgICAgICAgLy8gdGhpcyByZXF1ZXN0J3Mgb3duIHByb2JsZW0sIHNvIGl0IG11c3Qgbm90IGJlIHJldHJpZWQuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IFNFUlZFUl9FUlJPUl9TVEFUVVMgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBSQVRFX0xJTUlURURfU1RBVFVTO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYHdlYi1zZWFyY2g6IE1vZGVsIFNlcnZpbmcgcmVqZWN0ZWQgdGhlIHNlYXJjaCByZXF1ZXN0IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICB0aHJvdyByZXRyeWFibGVcbiAgICAgICAgICA/IG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgeyBjb250ZXh0OiB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0gfSlcbiAgICAgICAgICA6IG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cml0ZVByb2dyZXNzICYmXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIilcbiAgICAgICAgPyByZWFkU3RyZWFtaW5nUmVzcG9uc2UocmVzcG9uc2UsIHdyaXRlUHJvZ3Jlc3MpXG4gICAgICAgIDogcmVzcG9uc2UuanNvbigpO1xuICAgIH0sXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBheWxvYWQpID8gcGF5bG9hZCA6IHt9O1xufVxuXG4vKiogQ29uc3VtZSBhbiBPcGVuQUkgUmVzcG9uc2VzIFNTRSBzdHJlYW0gYW5kIHJldGFpbiBpdHMgY29tcGxldGVkIHJlc3BvbnNlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbWluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5IS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgbGV0IGNvbXBsZXRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbnN1bWUgPSBhc3luYyAoZnJhbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBmcmFtZVxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoNSkudHJpbVN0YXJ0KCkpXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YSA9PT0gXCJbRE9ORV1cIikgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShkYXRhKSBhcyB1bmtub3duO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGV2ZW50KSB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuICAgIGF3YWl0IGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhldmVudCwgd3JpdGVQcm9ncmVzcyk7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuY29tcGxldGVkXCIgJiYgb2JqZWN0LmlzUmVjb3JkKGV2ZW50LnJlc3BvbnNlKSkge1xuICAgICAgY29tcGxldGVkID0gZXZlbnQucmVzcG9uc2U7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZmFpbGVkXCIsIHtcbiAgICAgICAgY29udGV4dDogeyByZXNwb25zZTogZXZlbnQucmVzcG9uc2UgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiAhZG9uZSB9KTtcbiAgICBidWZmZXIgPSBidWZmZXIucmVwbGFjZUFsbChcIlxcclxcblwiLCBcIlxcblwiKTtcbiAgICBsZXQgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB3aGlsZSAoYm91bmRhcnkgPj0gMCkge1xuICAgICAgYXdhaXQgY29uc3VtZShidWZmZXIuc2xpY2UoMCwgYm91bmRhcnkpKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShib3VuZGFyeSArIDIpO1xuICAgICAgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB9XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICB9XG4gIGlmIChidWZmZXIudHJpbSgpKSBhd2FpdCBjb25zdW1lKGJ1ZmZlcik7XG4gIGlmICghY29tcGxldGVkKSB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZGlkIG5vdCBjb21wbGV0ZVwiKTtcbiAgcmV0dXJuIGNvbXBsZXRlZDtcbn1cblxuLyoqIFB1Ymxpc2ggbmF0aXZlIHdlYi1zZWFyY2ggbGlmZWN5Y2xlIGV2ZW50cyBhcyBjb21tb24gdG9vbCBwcm9ncmVzcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhcbiAgZXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3cml0ZVByb2dyZXNzOiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXZlbnQudHlwZSAhPT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIgfHwgIW9iamVjdC5pc1JlY29yZChldmVudC5pdGVtKSkgcmV0dXJuO1xuICBjb25zdCBhY3Rpb24gPSBvYmplY3QuaXNSZWNvcmQoZXZlbnQuaXRlbS5hY3Rpb24pID8gZXZlbnQuaXRlbS5hY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGlmICghYWN0aW9uIHx8IGFjdGlvbi50eXBlICE9PSBcInNlYXJjaFwiKSByZXR1cm47XG4gIGNvbnN0IHF1ZXJ5ID0gdHlwZW9mIGFjdGlvbi5xdWVyeSA9PT0gXCJzdHJpbmdcIiA/IGFjdGlvbi5xdWVyeSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcXVlcmllcyA9IEFycmF5LmlzQXJyYXkoYWN0aW9uLnF1ZXJpZXMpXG4gICAgPyBhY3Rpb24ucXVlcmllcy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICA6IFtdO1xuICBjb25zdCBncm91cElkID1cbiAgICB0eXBlb2YgZXZlbnQuaXRlbS5pZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBldmVudC5pdGVtLmlkXG4gICAgICA6IGBzZWFyY2gtJHtTdHJpbmcoZXZlbnQuc2VxdWVuY2VfbnVtYmVyID8/IHF1ZXJ5ID8/IFwidW5rbm93blwiKX1gO1xuICBjb25zdCByZXN1bHRDb3VudCA9IHF1ZXJpZXMubGVuZ3RoID4gMCA/IHF1ZXJpZXMubGVuZ3RoIDogcXVlcnkgPyAxIDogMDtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJzZWFyY2hcIixcbiAgICBtZXNzYWdlOiBxdWVyeSA/PyBcInRoZSB3ZWJcIixcbiAgICBncm91cElkLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJyZXN1bHRcIixcbiAgICBtZXNzYWdlOiBcIlJlc3VsdFwiLFxuICAgIGdyb3VwSWQsXG4gICAgLi4uKHJlc3VsdENvdW50ID4gMFxuICAgICAgPyB7IGRldGFpbDogYCR7cmVzdWx0Q291bnR9ICR7cmVzdWx0Q291bnQgPT09IDEgPyBcInJlc3VsdFwiIDogXCJyZXN1bHRzXCJ9YCB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNwb25zZSBleHRyYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgYW5kIGNpdGF0aW9ucyBmcm9tIGFuIE9wZW5BSSBSZXNwb25zZXMgQVBJIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IG91dHB1dCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5vdXRwdXQpID8gcGF5bG9hZC5vdXRwdXQgOiBbXTtcbiAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChpdGVtKSkgY29udGludWU7XG4gICAgY29uc3QgcGFydHMgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50UGFydHMoaXRlbS5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXJ0LnRleHQpO1xuICAgICAgaWYgKHRleHQpIHRleHRzLnB1c2godGV4dCk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocGFydC5hbm5vdGF0aW9ucykgPyBwYXJ0LmFubm90YXRpb25zIDogW107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYW5ub3RhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB1cmwgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShhbm5vdGF0aW9uLnVybCk7XG4gICAgICAgIGlmICghdXJsIHx8IHNlZW4uaGFzKHVybCkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udGl0bGUpO1xuICAgICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhbnN3ZXIgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXlsb2FkLm91dHB1dF90ZXh0KSB8fCB0ZXh0cy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuc3dlciB0ZXh0ICsgY2l0YXRpb25zIGZyb20gYSBDaGF0IENvbXBsZXRpb25zIHBheWxvYWQgKEdlbWluaSB2aWFcbiAqIGBnb29nbGVfc2VhcmNoYCkuIFRoZSBhbnN3ZXIgaXMgYGNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50YDsgZ3JvdW5kaW5nXG4gKiBzb3VyY2VzLCB3aGVuIHByZXNlbnQsIHN1cmZhY2UgdW5kZXIgYGNob2ljZXNbMF0ubWVzc2FnZWAgZ3JvdW5kaW5nXG4gKiBtZXRhZGF0YSAoYmVzdC1lZmZvcnQgLSBzaGFwZXMgdmFyeSwgc28gd2Ugc2NhbiBmb3IgdXJsLWJlYXJpbmcgZW50cmllcykuXG4gKi9cbmZ1bmN0aW9uIGZyb21DaGF0UGF5bG9hZChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgYW5zd2VyOiBzdHJpbmc7XG4gIGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXTtcbn0ge1xuICBjb25zdCBjaG9pY2VzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpID8gcGF5bG9hZC5jaG9pY2VzIDogW107XG4gIGNvbnN0IGZpcnN0ID0gY2hvaWNlc1swXTtcbiAgY29uc3QgbWVzc2FnZSA9IG9iamVjdC5pc1JlY29yZChmaXJzdCkgJiYgb2JqZWN0LmlzUmVjb3JkKGZpcnN0Lm1lc3NhZ2UpID8gZmlyc3QubWVzc2FnZSA6IHt9O1xuICBjb25zdCBhbnN3ZXIgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICAvLyBCZXN0LWVmZm9ydCBncm91bmRpbmcgZXh0cmFjdGlvbjogd2FsayBhbnkgbmVzdGVkIG9iamVjdCBmb3Ige3VyaXx1cmwsdGl0bGV9LlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHZpc2l0ID0gKHY6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZGVwdGggPiBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggfHwgIW9iamVjdC5pc1JlY29yZCh2KSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJsKSB8fCBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnVyaSk7XG4gICAgaWYgKHVybCAmJiAhc2Vlbi5oYXModXJsKSkge1xuICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi50aXRsZSk7XG4gICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHYpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwuZm9yRWFjaCgoeCkgPT4gdmlzaXQoeCwgZGVwdGggKyAxKSk7XG4gICAgICBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikgdmlzaXQodmFsLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfTtcbiAgdmlzaXQobWVzc2FnZS5ncm91bmRpbmdfbWV0YWRhdGEgPz8gbWVzc2FnZS5ncm91bmRpbmdNZXRhZGF0YSwgMCk7XG4gIHJldHVybiB7IGFuc3dlciwgY2l0YXRpb25zIH07XG59XG5cbi8qKlxuICogUnVuIGEgd2ViIHNlYXJjaC4gUHJlZmVycyB0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIG9uIGFcbiAqIGRlcGxveWVkIEdQVC9HZW1pbmkgZW5kcG9pbnQgKHN5bnRoZXNpemVkIGFuc3dlciArIGNpdGF0aW9ucyk7IHdoZW4gdGhlXG4gKiB3b3Jrc3BhY2UgaGFzIG5vIHN1Y2ggZW5kcG9pbnQgQU5EIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgZW5hYmxlZCwgZmFsbHNcbiAqIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSBzbyB0aGUgdG9vbCBzdGlsbCByZXR1cm5zIHJlc3VsdHMgaW5zdGVhZCBvZlxuICogZXJyb3JpbmcuIENpdGF0aW9ucyBhcmUgZmlsdGVyZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBVUkwgYWxsb3ctbGlzdC5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIHRoZSB3aG9sZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGluLWZsaWdodCBzZXJ2aW5nIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHJlc29sdmVXZWJTZWFyY2hNb2RlbChjdHgsIHJ1bnRpbWUsIHJlcXVlc3QubW9kZWwpO1xuXG4gIGlmIChlbmRwb2ludCA9PT0gbnVsbCkge1xuICAgIC8vIE5vIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLlxuICAgIGlmIChjb25maWcuc2NyYXBlRmFsbGJhY2spIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwibm8tbmF0aXZlLW1vZGVsOnNjcmFwZS1mYWxsYmFja1wiLCB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5IH0pO1xuICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIFwiV2ViLXNlYXJjaC1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnRcIixcbiAgICAgIFwiTm8gR1BUL0dlbWluaSBlbmRwb2ludCBpcyBkZXBsb3llZCBpbiB0aGlzIHdvcmtzcGFjZSBhbmQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBcIiArXG4gICAgICAgIGBkaXNhYmxlZC4gRGVwbG95IGEgc3VwcG9ydGVkIGVuZHBvaW50LCBzZXQgbW9kZWwgb3IgJHtNT0RFTF9FTlZ9LCBvciBlbmFibGUgdGhlIGAgK1xuICAgICAgICBcImZhbGxiYWNrIChXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSz0xKS5cIixcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKFxuICAgICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICAhYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pKVxuICAgICkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGZhbGxiYWNrID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG4gICAgaWYgKCFmYWxsYmFjaykge1xuICAgICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgICBsb2dnZXIuaW5mbyhcImdlbWluaS11bmF2YWlsYWJsZTpzY3JhcGUtZmFsbGJhY2tcIiwgeyBxdWVyeTogcmVxdWVzdC5xdWVyeSB9KTtcbiAgICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiZ2VtaW5pLXVuYXZhaWxhYmxlOm1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgIGZhaWxlZE1vZGVsOiBlbmRwb2ludC5uYW1lLFxuICAgICAgZmFsbGJhY2tNb2RlbDogZmFsbGJhY2submFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZmFsbGJhY2ssIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cbn1cblxuLyoqIEV4ZWN1dGUgb25lIG5hdGl2ZSBwcm92aWRlciByZXF1ZXN0IGFnYWluc3QgYW4gYWxyZWFkeS1zZWxlY3RlZCBlbmRwb2ludC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk5hdGl2ZVdlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBtb2RlbElkID0gZW5kcG9pbnQubmFtZTtcbiAgY29uc3QgcHJvdmlkZXIgPSB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseShcbiAgICBwb2xpY3kubW9kZWxGYW1pbHkoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSA/PyBlbmRwb2ludC5uYW1lKSxcbiAgKTtcbiAgaWYgKCFwcm92aWRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJOYXRpdmUgd2ViLXNlYXJjaCBwcm92aWRlclwiLFxuICAgICAgYE1vZGVsICR7bW9kZWxJZH0gaGFzIG5vIHN1cHBvcnRlZCBwcm92aWRlciBmYW1pbHkuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHNwZWMgPSB3ZWJTZWFyY2hUb29sU3BlYyhwcm92aWRlciwgY29uZmlnLndlYlNlYXJjaFRvb2xzKTtcblxuICBjb25zdCB1cmwgPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gaW52b2tlLnJlc3BvbnNlc1VybChjdHguaG9zdCkgOiBpbnZva2UuY2hhdENvbXBsZXRpb25zVXJsKGN0eC5ob3N0KTtcbiAgY29uc3QgYm9keSA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCJcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBpbnB1dDogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgLi4uKHdyaXRlUHJvZ3Jlc3MgPyB7IHN0cmVhbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5zcGVjLnJlcXVlc3QsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiByZXF1ZXN0LnF1ZXJ5IH1dLFxuICAgICAgICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBwb3N0U2VydmluZyhcbiAgICBjdHgsXG4gICAgdXJsLFxuICAgIGJvZHksXG4gICAgcnVudGltZSxcbiAgICBbXCJ3ZWItc2VhcmNoXCIsIFwic2VydmluZ1wiLCBzcGVjLmFwaSwgbW9kZWxJZCwgcmVxdWVzdC5xdWVyeV0sXG4gICAgc2lnbmFsLFxuICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICk7XG5cbiAgY29uc3QgeyBhbnN3ZXIsIGNpdGF0aW9ucyB9ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIiA/IGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQpIDogZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQpO1xuXG4gIGNvbnN0IHBlcm1pdHRlZCA9IGNpdGF0aW9ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5hbGxvd0xpc3QuYWxsb3dzKGMudXJsKSk7XG4gIGNvbnN0IGRyb3BwZWQgPSBjaXRhdGlvbnMubGVuZ3RoIC0gcGVybWl0dGVkLmxlbmd0aDtcbiAgY29uc3QgdHJpbW1lZCA9IHBlcm1pdHRlZC5zbGljZSgwLCBjb25maWcubWF4Q2l0YXRpb25zKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VhcmNoZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIG1vZGVsOiBtb2RlbElkLFxuICAgIHByb3ZpZGVyLFxuICAgIGNpdGF0aW9uczogY2l0YXRpb25zLmxlbmd0aCxcbiAgICAuLi4oZHJvcHBlZCA+IDAgPyB7IGZpbHRlcmVkOiBkcm9wcGVkIH0gOiB7fSksXG4gICAgcmV0dXJuZWQ6IHRyaW1tZWQubGVuZ3RoLFxuICB9KTtcblxuICByZXR1cm4geyBxdWVyeTogcmVxdWVzdC5xdWVyeSwgYW5zd2VyLCBjaXRhdGlvbnM6IHRyaW1tZWQsIG1vZGVsOiBtb2RlbElkIH07XG59XG4iXX0=
|
package/lib/src/tool.d.ts
CHANGED