@dbx-tools/appkit-web-search 0.9.153 → 0.9.157

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/lib/src/search.js CHANGED
@@ -21,16 +21,16 @@
21
21
  * @module
22
22
  */
23
23
  import { ConfigurationError, ConnectionError, ExecutionError, getExecutionContext, } from "@databricks/appkit";
24
- import { invoke, policy, resolve, modelCatalog } from "@dbx-tools/model";
25
- import { log, object, stringUtils } from "@dbx-tools/shared-core";
26
- import { openaiChat } from "@dbx-tools/shared-model";
24
+ import { invoke, policy, selection, modelCatalog } from "@dbx-tools/model";
25
+ import { log, isRecord, trimToEmpty } from "@dbx-tools/shared-core";
26
+ import { chatContentParts, chatContentToText, } from "@dbx-tools/shared-model";
27
27
  import { MODEL_ENV } from "./config.js";
28
28
  import { toCallSettings, webSearchExecuteDefaults } from "./defaults.js";
29
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 { lookupModels } = resolve;
33
+ const { lookupModels } = selection;
34
34
  const { listServingEndpoints } = modelCatalog;
35
35
  /**
36
36
  * How deep the grounding-metadata walk descends. Gemini nests its sources a
@@ -166,7 +166,7 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
166
166
  });
167
167
  if (!response.ok) {
168
168
  const responseBody = await response.text();
169
- const model = object.isRecord(body) && typeof body.model === "string" ? body.model : undefined;
169
+ const model = isRecord(body) && typeof body.model === "string" ? body.model : undefined;
170
170
  const crossRegionDisabled = response.status === 400 &&
171
171
  model &&
172
172
  policy.modelFamily(model) === policy.ModelFamily.Gemini &&
@@ -199,7 +199,7 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
199
199
  ? readStreamingResponse(response, writeProgress)
200
200
  : response.json();
201
201
  }, signal, false);
202
- return object.isRecord(payload) ? payload : {};
202
+ return isRecord(payload) ? payload : {};
203
203
  }
204
204
  /** Consume an OpenAI Responses SSE stream and retain its completed response. */
205
205
  async function readStreamingResponse(response, writeProgress) {
@@ -216,10 +216,10 @@ async function readStreamingResponse(response, writeProgress) {
216
216
  if (!data || data === "[DONE]")
217
217
  return;
218
218
  const event = JSON.parse(data);
219
- if (!object.isRecord(event) || typeof event.type !== "string")
219
+ if (!isRecord(event) || typeof event.type !== "string")
220
220
  return;
221
221
  await emitWebSearchProgress(event, writeProgress);
222
- if (event.type === "response.completed" && object.isRecord(event.response)) {
222
+ if (event.type === "response.completed" && isRecord(event.response)) {
223
223
  completed = event.response;
224
224
  }
225
225
  if (event.type === "response.failed") {
@@ -249,9 +249,9 @@ async function readStreamingResponse(response, writeProgress) {
249
249
  }
250
250
  /** Publish native web-search lifecycle events as common tool progress. */
251
251
  async function emitWebSearchProgress(event, writeProgress) {
252
- if (event.type !== "response.output_item.done" || !object.isRecord(event.item))
252
+ if (event.type !== "response.output_item.done" || !isRecord(event.item))
253
253
  return;
254
- const action = object.isRecord(event.item.action) ? event.item.action : undefined;
254
+ const action = isRecord(event.item.action) ? event.item.action : undefined;
255
255
  if (!action || action.type !== "search")
256
256
  return;
257
257
  const query = typeof action.query === "string" ? action.query : undefined;
@@ -288,31 +288,31 @@ function fromResponsesPayload(payload) {
288
288
  const citations = [];
289
289
  const seen = new Set();
290
290
  for (const item of output) {
291
- if (!object.isRecord(item))
291
+ if (!isRecord(item))
292
292
  continue;
293
- const parts = openaiChat.chatContentParts(item.content);
293
+ const parts = chatContentParts(item.content);
294
294
  if (!parts)
295
295
  continue;
296
296
  for (const part of parts) {
297
- if (!object.isRecord(part))
297
+ if (!isRecord(part))
298
298
  continue;
299
- const text = stringUtils.trimToEmpty(part.text);
299
+ const text = trimToEmpty(part.text);
300
300
  if (text)
301
301
  texts.push(text);
302
302
  const annotations = Array.isArray(part.annotations) ? part.annotations : [];
303
303
  for (const annotation of annotations) {
304
- if (!object.isRecord(annotation))
304
+ if (!isRecord(annotation))
305
305
  continue;
306
- const url = stringUtils.trimToEmpty(annotation.url);
306
+ const url = trimToEmpty(annotation.url);
307
307
  if (!url || seen.has(url))
308
308
  continue;
309
309
  seen.add(url);
310
- const title = stringUtils.trimToEmpty(annotation.title);
310
+ const title = trimToEmpty(annotation.title);
311
311
  citations.push({ url, ...(title ? { title } : {}) });
312
312
  }
313
313
  }
314
314
  }
315
- const answer = stringUtils.trimToEmpty(payload.output_text) || texts.join("\n").trim();
315
+ const answer = trimToEmpty(payload.output_text) || texts.join("\n").trim();
316
316
  return { answer, citations };
317
317
  }
318
318
  /**
@@ -324,18 +324,18 @@ function fromResponsesPayload(payload) {
324
324
  function fromChatPayload(payload) {
325
325
  const choices = Array.isArray(payload.choices) ? payload.choices : [];
326
326
  const first = choices[0];
327
- const message = object.isRecord(first) && object.isRecord(first.message) ? first.message : {};
328
- const answer = openaiChat.chatContentToText(message.content);
327
+ const message = isRecord(first) && isRecord(first.message) ? first.message : {};
328
+ const answer = chatContentToText(message.content);
329
329
  const citations = [];
330
330
  // Best-effort grounding extraction: walk any nested object for {uri|url,title}.
331
331
  const seen = new Set();
332
332
  const visit = (v, depth) => {
333
- if (depth > MAX_GROUNDING_WALK_DEPTH || !object.isRecord(v))
333
+ if (depth > MAX_GROUNDING_WALK_DEPTH || !isRecord(v))
334
334
  return;
335
- const url = stringUtils.trimToEmpty(v.url) || stringUtils.trimToEmpty(v.uri);
335
+ const url = trimToEmpty(v.url) || trimToEmpty(v.uri);
336
336
  if (url && !seen.has(url)) {
337
337
  seen.add(url);
338
- const title = stringUtils.trimToEmpty(v.title);
338
+ const title = trimToEmpty(v.title);
339
339
  citations.push({ url, ...(title ? { title } : {}) });
340
340
  }
341
341
  for (const val of Object.values(v)) {
@@ -479,4 +479,4 @@ async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, write
479
479
  });
480
480
  return { query: request.query, answer, citations: trimmed, model: modelId };
481
481
  }
482
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENB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Q0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNyb3NzUmVnaW9uRGlzYWJsZWQgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmXG4gICAgICAgICAgbW9kZWwgJiZcbiAgICAgICAgICBwb2xpY3kubW9kZWxGYW1pbHkobW9kZWwpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pICYmXG4gICAgICAgICAgR0VNSU5JX0NST1NTX1JFR0lPTl9ESVNBQkxFRC50ZXN0KHJlc3BvbnNlQm9keSk7XG4gICAgICAgIGlmIChjcm9zc1JlZ2lvbkRpc2FibGVkKSB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIEdFTUlOSV9DUk9TU19SRUdJT05fQ09PTERPV05fTVM7XG4gICAgICAgICAgcnVudGltZS5mYW1pbHlDb29sZG93bnMuc2V0KHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmksIGV4cGlyZXNBdCk7XG4gICAgICAgICAgcnVudGltZS5hdmFpbGFibGVGYW1pbGllcy5kZWxldGUocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwic2VydmluZy1yZXF1ZXN0LXJlamVjdGVkXCIsIHtcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZC1zaGVkZGluZyBhbmQgc2VydmVyIGZhdWx0cyBhcmUgd29ydGggYW5vdGhlciBhdHRlbXB0OyBhIDR4eCBpc1xuICAgICAgICAvLyB0aGlzIHJlcXVlc3QncyBvd24gcHJvYmxlbSwgc28gaXQgbXVzdCBub3QgYmUgcmV0cmllZC5cbiAgICAgICAgY29uc3QgcmV0cnlhYmxlID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gU0VSVkVSX0VSUk9SX1NUQVRVUyB8fCByZXNwb25zZS5zdGF0dXMgPT09IFJBVEVfTElNSVRFRF9TVEFUVVM7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgd2ViLXNlYXJjaDogTW9kZWwgU2VydmluZyByZWplY3RlZCB0aGUgc2VhcmNoIHJlcXVlc3QgKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWA7XG4gICAgICAgIHRocm93IHJldHJ5YWJsZVxuICAgICAgICAgID8gbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KVxuICAgICAgICAgIDogbmV3IEV4ZWN1dGlvbkVycm9yKG1lc3NhZ2UsIHsgY29udGV4dDogeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlUHJvZ3Jlc3MgJiZcbiAgICAgICAgcmVzcG9uc2UuYm9keSAmJlxuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKVxuICAgICAgICA/IHJlYWRTdHJlYW1pbmdSZXNwb25zZShyZXNwb25zZSwgd3JpdGVQcm9ncmVzcylcbiAgICAgICAgOiByZXNwb25zZS5qc29uKCk7XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICAgZmFsc2UsXG4gICk7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGF5bG9hZCkgPyBwYXlsb2FkIDoge307XG59XG5cbi8qKiBDb25zdW1lIGFuIE9wZW5BSSBSZXNwb25zZXMgU1NFIHN0cmVhbSBhbmQgcmV0YWluIGl0cyBjb21wbGV0ZWQgcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtaW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgd3JpdGVQcm9ncmVzczogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuICBsZXQgY29tcGxldGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY29uc3VtZSA9IGFzeW5jIChmcmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGZyYW1lXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSg1KS50cmltU3RhcnQoKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGlmICghZGF0YSB8fCBkYXRhID09PSBcIltET05FXVwiKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKGRhdGEpIGFzIHVua25vd247XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZXZlbnQpIHx8IHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG4gICAgYXdhaXQgZW1pdFdlYlNlYXJjaFByb2dyZXNzKGV2ZW50LCB3cml0ZVByb2dyZXNzKTtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIiAmJiBvYmplY3QuaXNSZWNvcmQoZXZlbnQucmVzcG9uc2UpKSB7XG4gICAgICBjb21wbGV0ZWQgPSBldmVudC5yZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBmYWlsZWRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IHJlc3BvbnNlOiBldmVudC5yZXNwb25zZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06ICFkb25lIH0pO1xuICAgIGJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlQWxsKFwiXFxyXFxuXCIsIFwiXFxuXCIpO1xuICAgIGxldCBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIHdoaWxlIChib3VuZGFyeSA+PSAwKSB7XG4gICAgICBhd2FpdCBjb25zdW1lKGJ1ZmZlci5zbGljZSgwLCBib3VuZGFyeSkpO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGJvdW5kYXJ5ICsgMik7XG4gICAgICBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIH1cbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gIH1cbiAgaWYgKGJ1ZmZlci50cmltKCkpIGF3YWl0IGNvbnN1bWUoYnVmZmVyKTtcbiAgaWYgKCFjb21wbGV0ZWQpIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBkaWQgbm90IGNvbXBsZXRlXCIpO1xuICByZXR1cm4gY29tcGxldGVkO1xufVxuXG4vKiogUHVibGlzaCBuYXRpdmUgd2ViLXNlYXJjaCBsaWZlY3ljbGUgZXZlbnRzIGFzIGNvbW1vbiB0b29sIHByb2dyZXNzLiAqL1xuYXN5bmMgZnVuY3Rpb24gZW1pdFdlYlNlYXJjaFByb2dyZXNzKFxuICBldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChldmVudC50eXBlICE9PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB8fCAhb2JqZWN0LmlzUmVjb3JkKGV2ZW50Lml0ZW0pKSByZXR1cm47XG4gIGNvbnN0IGFjdGlvbiA9IG9iamVjdC5pc1JlY29yZChldmVudC5pdGVtLmFjdGlvbikgPyBldmVudC5pdGVtLmFjdGlvbiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uLnR5cGUgIT09IFwic2VhcmNoXCIpIHJldHVybjtcbiAgY29uc3QgcXVlcnkgPSB0eXBlb2YgYWN0aW9uLnF1ZXJ5ID09PSBcInN0cmluZ1wiID8gYWN0aW9uLnF1ZXJ5IDogdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyaWVzID0gQXJyYXkuaXNBcnJheShhY3Rpb24ucXVlcmllcylcbiAgICA/IGFjdGlvbi5xdWVyaWVzLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgIDogW107XG4gIGNvbnN0IGdyb3VwSWQgPVxuICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiXG4gICAgICA/IGV2ZW50Lml0ZW0uaWRcbiAgICAgIDogYHNlYXJjaC0ke1N0cmluZyhldmVudC5zZXF1ZW5jZV9udW1iZXIgPz8gcXVlcnkgPz8gXCJ1bmtub3duXCIpfWA7XG4gIGNvbnN0IHJlc3VsdENvdW50ID0gcXVlcmllcy5sZW5ndGggPiAwID8gcXVlcmllcy5sZW5ndGggOiBxdWVyeSA/IDEgOiAwO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInNlYXJjaFwiLFxuICAgIG1lc3NhZ2U6IHF1ZXJ5ID8/IFwidGhlIHdlYlwiLFxuICAgIGdyb3VwSWQsXG4gIH0pO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInJlc3VsdFwiLFxuICAgIG1lc3NhZ2U6IFwiUmVzdWx0XCIsXG4gICAgZ3JvdXBJZCxcbiAgICAuLi4ocmVzdWx0Q291bnQgPiAwXG4gICAgICA/IHsgZGV0YWlsOiBgJHtyZXN1bHRDb3VudH0gJHtyZXN1bHRDb3VudCA9PT0gMSA/IFwicmVzdWx0XCIgOiBcInJlc3VsdHNcIn1gIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc3BvbnNlIGV4dHJhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXh0cmFjdCBhbnN3ZXIgdGV4dCBhbmQgY2l0YXRpb25zIGZyb20gYW4gT3BlbkFJIFJlc3BvbnNlcyBBUEkgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIGFuc3dlcjogc3RyaW5nO1xuICBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW107XG59IHtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLm91dHB1dCkgPyBwYXlsb2FkLm91dHB1dCA6IFtdO1xuICBjb25zdCB0ZXh0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIG91dHB1dCkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGl0ZW0pKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhpdGVtLmNvbnRlbnQpO1xuICAgIGlmICghcGFydHMpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFydCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgICBpZiAoIW9iamVjdC5pc1JlY29yZChhbm5vdGF0aW9uKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkoYW5ub3RhdGlvbi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFuc3dlciA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICByZXR1cm4geyBhbnN3ZXIsIGNpdGF0aW9ucyB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgKyBjaXRhdGlvbnMgZnJvbSBhIENoYXQgQ29tcGxldGlvbnMgcGF5bG9hZCAoR2VtaW5pIHZpYVxuICogYGdvb2dsZV9zZWFyY2hgKS4gVGhlIGFuc3dlciBpcyBgY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnRgOyBncm91bmRpbmdcbiAqIHNvdXJjZXMsIHdoZW4gcHJlc2VudCwgc3VyZmFjZSB1bmRlciBgY2hvaWNlc1swXS5tZXNzYWdlYCBncm91bmRpbmdcbiAqIG1ldGFkYXRhIChiZXN0LWVmZm9ydCAtIHNoYXBlcyB2YXJ5LCBzbyB3ZSBzY2FuIGZvciB1cmwtYmVhcmluZyBlbnRyaWVzKS5cbiAqL1xuZnVuY3Rpb24gZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuY2hvaWNlcykgPyBwYXlsb2FkLmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSBjaG9pY2VzWzBdO1xuICBjb25zdCBtZXNzYWdlID0gb2JqZWN0LmlzUmVjb3JkKGZpcnN0KSAmJiBvYmplY3QuaXNSZWNvcmQoZmlyc3QubWVzc2FnZSkgPyBmaXJzdC5tZXNzYWdlIDoge307XG4gIGNvbnN0IGFuc3dlciA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIC8vIEJlc3QtZWZmb3J0IGdyb3VuZGluZyBleHRyYWN0aW9uOiB3YWxrIGFueSBuZXN0ZWQgb2JqZWN0IGZvciB7dXJpfHVybCx0aXRsZX0uXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgdmlzaXQgPSAodjogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChkZXB0aCA+IE1BWF9HUk9VTkRJTkdfV0FMS19ERVBUSCB8fCAhb2JqZWN0LmlzUmVjb3JkKHYpKSByZXR1cm47XG4gICAgY29uc3QgdXJsID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi51cmwpIHx8IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJpKTtcbiAgICBpZiAodXJsICYmICFzZWVuLmhhcyh1cmwpKSB7XG4gICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgY29uc3QgdGl0bGUgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnRpdGxlKTtcbiAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC52YWx1ZXModikpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHZhbC5mb3JFYWNoKCh4KSA9PiB2aXNpdCh4LCBkZXB0aCArIDEpKTtcbiAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB2aXNpdCh2YWwsIGRlcHRoICsgMSk7XG4gICAgfVxuICB9O1xuICB2aXNpdChtZXNzYWdlLmdyb3VuZGluZ19tZXRhZGF0YSA/PyBtZXNzYWdlLmdyb3VuZGluZ01ldGFkYXRhLCAwKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3ZWIgc2VhcmNoLiBQcmVmZXJzIHRoZSBEYXRhYnJpY2tzIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgb24gYVxuICogZGVwbG95ZWQgR1BUL0dlbWluaSBlbmRwb2ludCAoc3ludGhlc2l6ZWQgYW5zd2VyICsgY2l0YXRpb25zKTsgd2hlbiB0aGVcbiAqIHdvcmtzcGFjZSBoYXMgbm8gc3VjaCBlbmRwb2ludCBBTkQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBlbmFibGVkLCBmYWxsc1xuICogYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mXG4gKiBlcnJvcmluZy4gQ2l0YXRpb25zIGFyZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIFVSTCBhbGxvdy1saXN0LlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgdGhlIHdob2xlIGNhbGwsIGluY2x1ZGluZyB0aGUgaW4tZmxpZ2h0IHNlcnZpbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b1dlYlNlYXJjaFJ1bnRpbWUocnVudGltZU9yQ29uZmlnKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG5cbiAgaWYgKGVuZHBvaW50ID09PSBudWxsKSB7XG4gICAgLy8gTm8gbmF0aXZlIHdlYi1zZWFyY2ggbW9kZWwgZGVwbG95ZWQgaW4gdGhpcyB3b3Jrc3BhY2UuXG4gICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLmluZm8oXCJuby1uYXRpdmUtbW9kZWw6c2NyYXBlLWZhbGxiYWNrXCIsIHsgcXVlcnk6IHJlcXVlc3QucXVlcnkgfSk7XG4gICAgICByZXR1cm4gcnVuU2NyYXBlU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJXZWItc2VhcmNoLWNhcGFibGUgc2VydmluZyBlbmRwb2ludFwiLFxuICAgICAgXCJObyBHUFQvR2VtaW5pIGVuZHBvaW50IGlzIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlIGFuZCB0aGUgc2NyYXBlIGZhbGxiYWNrIGlzIFwiICtcbiAgICAgICAgYGRpc2FibGVkLiBEZXBsb3kgYSBzdXBwb3J0ZWQgZW5kcG9pbnQsIHNldCBtb2RlbCBvciAke01PREVMX0VOVn0sIG9yIGVuYWJsZSB0aGUgYCArXG4gICAgICAgIFwiZmFsbGJhY2sgKFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLPTEpLlwiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcnVuU2VsZWN0ZWRXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbn1cblxuLyoqIFJ1biBvbmUgc2VsZWN0ZWQgZmFtaWx5IGFmdGVyIGl0cyBmaXJzdCByZXF1ZXN0IGVzdGFibGlzaGVzIGF2YWlsYWJpbGl0eS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbGVjdGVkV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICBpZiAoIWZhbWlseSB8fCBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJ1blNlYXJjaEZhbGxiYWNrKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIGVycm9yLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVByb2JlID0gcnVudGltZS5mYW1pbHlQcm9iZXMuZ2V0KGZhbWlseSk7XG4gIGlmIChhY3RpdmVQcm9iZSkge1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCBhY3RpdmVQcm9iZTtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgcmVsZWFzZVByb2JlITogKCkgPT4gdm9pZDtcbiAgY29uc3QgcHJvYmUgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlbGVhc2VQcm9iZSA9IHJlc29sdmU7XG4gIH0pO1xuICBydW50aW1lLmZhbWlseVByb2Jlcy5zZXQoZmFtaWx5LCBwcm9iZSk7XG5cbiAgaWYgKHJ1bnRpbWUuYXZhaWxhYmxlRmFtaWxpZXMuaGFzKGZhbWlseSkgfHwgYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhmYW1pbHkpKSB7XG4gICAgcnVudGltZS5mYW1pbHlQcm9iZXMuZGVsZXRlKGZhbWlseSk7XG4gICAgcmVsZWFzZVByb2JlKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgZmFpbHVyZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmFkZChmYW1pbHkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZmFpbHVyZSA9IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChydW50aW1lLmZhbWlseVByb2Jlcy5nZXQoZmFtaWx5KSA9PT0gcHJvYmUpIHJ1bnRpbWUuZmFtaWx5UHJvYmVzLmRlbGV0ZShmYW1pbHkpO1xuICAgIHJlbGVhc2VQcm9iZSgpO1xuICB9XG4gIHJldHVybiBydW5TZWFyY2hGYWxsYmFjayhyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGVuZHBvaW50LCBmYWlsdXJlLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogUmVzb2x2ZSBhIGNhY2hlZCBmYW1pbHkgZmFpbHVyZSB0byBhbm90aGVyIG1vZGVsIG9yIHRoZSBzY3JhcGUgZmFsbGJhY2suICovXG5hc3luYyBmdW5jdGlvbiBydW5TZWFyY2hGYWxsYmFjayhcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgZXJyb3I6IHVua25vd24sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBpZiAoXG4gICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgIWFjdGl2ZUZhbWlseUNvb2xkb3ducyhydW50aW1lKS5oYXMocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSlcbiAgKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgY29uc3QgZmFsbGJhY2sgPSBhd2FpdCByZXNvbHZlV2ViU2VhcmNoTW9kZWwoY3R4LCBydW50aW1lLCByZXF1ZXN0Lm1vZGVsKTtcbiAgaWYgKCFmYWxsYmFjaykge1xuICAgIGlmIChydW50aW1lLmNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgICAgZmFpbGVkTW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGZhbGxiYWNrOiBcInNjcmFwZVwiLFxuICAgICAgICByZWFzb246IFwiY3Jvc3MtcmVnaW9uLWRpc2FibGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBydW5TY3JhcGVTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICBmYWlsZWRNb2RlbDogZW5kcG9pbnQubmFtZSxcbiAgICBmYWxsYmFja01vZGVsOiBmYWxsYmFjay5uYW1lLFxuICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgfSk7XG4gIHJldHVybiBydW5TZWxlY3RlZFdlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGZhbGxiYWNrLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogRXhlY3V0ZSBvbmUgbmF0aXZlIHByb3ZpZGVyIHJlcXVlc3QgYWdhaW5zdCBhbiBhbHJlYWR5LXNlbGVjdGVkIGVuZHBvaW50LiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuTmF0aXZlV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IG1vZGVsSWQgPSBlbmRwb2ludC5uYW1lO1xuICBjb25zdCBwcm92aWRlciA9IHdlYlNlYXJjaFByb3ZpZGVyRm9yRmFtaWx5KFxuICAgIHBvbGljeS5tb2RlbEZhbWlseShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lID8/IGVuZHBvaW50Lm5hbWUpLFxuICApO1xuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBcIk5hdGl2ZSB3ZWItc2VhcmNoIHByb3ZpZGVyXCIsXG4gICAgICBgTW9kZWwgJHttb2RlbElkfSBoYXMgbm8gc3VwcG9ydGVkIHByb3ZpZGVyIGZhbWlseS5gLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc3BlYyA9IHdlYlNlYXJjaFRvb2xTcGVjKHByb3ZpZGVyLCBjb25maWcud2ViU2VhcmNoVG9vbHMpO1xuXG4gIGNvbnN0IHVybCA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCIgPyBpbnZva2UucmVzcG9uc2VzVXJsKGN0eC5ob3N0KSA6IGludm9rZS5jaGF0Q29tcGxldGlvbnNVcmwoY3R4Lmhvc3QpO1xuICBjb25zdCBib2R5ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIlxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlYy5yZXF1ZXN0LFxuICAgICAgICAgIG1vZGVsOiBtb2RlbElkLFxuICAgICAgICAgIGlucHV0OiBbeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogcmVxdWVzdC5xdWVyeSB9XSxcbiAgICAgICAgICAuLi4od3JpdGVQcm9ncmVzcyA/IHsgc3RyZWFtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBtZXNzYWdlczogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHBvc3RTZXJ2aW5nKFxuICAgIGN0eCxcbiAgICB1cmwsXG4gICAgYm9keSxcbiAgICBydW50aW1lLFxuICAgIFtcIndlYi1zZWFyY2hcIiwgXCJzZXJ2aW5nXCIsIHNwZWMuYXBpLCBtb2RlbElkLCByZXF1ZXN0LnF1ZXJ5XSxcbiAgICBzaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcyxcbiAgKTtcblxuICBjb25zdCB7IGFuc3dlciwgY2l0YXRpb25zIH0gPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZCkgOiBmcm9tQ2hhdFBheWxvYWQocGF5bG9hZCk7XG5cbiAgY29uc3QgcGVybWl0dGVkID0gY2l0YXRpb25zLmZpbHRlcigoYykgPT4gY29uZmlnLmFsbG93TGlzdC5hbGxvd3MoYy51cmwpKTtcbiAgY29uc3QgZHJvcHBlZCA9IGNpdGF0aW9ucy5sZW5ndGggLSBwZXJtaXR0ZWQubGVuZ3RoO1xuICBjb25zdCB0cmltbWVkID0gcGVybWl0dGVkLnNsaWNlKDAsIGNvbmZpZy5tYXhDaXRhdGlvbnMpO1xuICBsb2dnZXIuZGVidWcoXCJzZWFyY2hlZFwiLCB7XG4gICAgcXVlcnk6IHJlcXVlc3QucXVlcnksXG4gICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgcHJvdmlkZXIsXG4gICAgY2l0YXRpb25zOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgIC4uLihkcm9wcGVkID4gMCA/IHsgZmlsdGVyZWQ6IGRyb3BwZWQgfSA6IHt9KSxcbiAgICByZXR1cm5lZDogdHJpbW1lZC5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LCBhbnN3ZXIsIGNpdGF0aW9uczogdHJpbW1lZCwgbW9kZWw6IG1vZGVsSWQgfTtcbn1cbiJdfQ==
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRSxPQUFPLEVBRUwsZ0JBQWdCLEVBQ2hCLGlCQUFpQixHQUNsQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxTQUFTLENBQUM7QUFDbkMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVB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QzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBpbnZva2UsIHBvbGljeSwgc2VsZWN0aW9uLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBpc1JlY29yZCwgdHJpbVRvRW1wdHkgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgdHlwZSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBjaGF0Q29udGVudFBhcnRzLFxuICBjaGF0Q29udGVudFRvVGV4dCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQgeyBNT0RFTF9FTlYsIHR5cGUgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHRvQ2FsbFNldHRpbmdzLCB3ZWJTZWFyY2hFeGVjdXRlRGVmYXVsdHMgfSBmcm9tIFwiLi9kZWZhdWx0cy50c1wiO1xuaW1wb3J0IHsgc3VwcG9ydHNXZWJTZWFyY2gsIHdlYlNlYXJjaFByb3ZpZGVyRm9yRmFtaWx5LCB3ZWJTZWFyY2hUb29sU3BlYyB9IGZyb20gXCIuL3Byb3ZpZGVyLnRzXCI7XG5pbXBvcnQge1xuICBleGVjdXRlUmVhZCxcbiAgdG9XZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWUsXG4gIHR5cGUgV2ViU2VhcmNoUnVudGltZUlucHV0LFxufSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNlYXJjaENpdGF0aW9uLCBXZWJTZWFyY2hSZXF1ZXN0LCBXZWJTZWFyY2hSZXN1bHQgfSBmcm9tIFwiLi9zY2hlbWEudHNcIjtcbmltcG9ydCB7IHJ1blNjcmFwZVNlYXJjaCB9IGZyb20gXCIuL3NjcmFwZS50c1wiO1xuXG50eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBtb2RlbENhdGFsb2cuV29ya3NwYWNlQ2xpZW50TGlrZSAmIGludm9rZS5BdXRoZW50aWNhdGluZ0NsaWVudExpa2U7XG50eXBlIFByb2dyZXNzV3JpdGVyID0gTm9uTnVsbGFibGU8QWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dFtcIndyaXRlUHJvZ3Jlc3NcIl0+O1xuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2gvc2VhcmNoXCIpO1xuY29uc3QgeyBsb29rdXBNb2RlbHMgfSA9IHNlbGVjdGlvbjtcbmNvbnN0IHsgbGlzdFNlcnZpbmdFbmRwb2ludHMgfSA9IG1vZGVsQ2F0YWxvZztcblxuLyoqXG4gKiBIb3cgZGVlcCB0aGUgZ3JvdW5kaW5nLW1ldGFkYXRhIHdhbGsgZGVzY2VuZHMuIEdlbWluaSBuZXN0cyBpdHMgc291cmNlcyBhXG4gKiBoYW5kZnVsIG9mIGxldmVscyBkb3duIGFuZCB0aGUgc2hhcGUgdmFyaWVzIGJ5IG1vZGVsIHZlcnNpb24sIHNvIHRoZSB3YWxrXG4gKiBpcyBnZW5lcmljOyB0aGUgYm91bmQgaXMgd2hhdCBrZWVwcyBhIHBhdGhvbG9naWNhbCBwYXlsb2FkIGZyb20gdHVybmluZyBpdFxuICogaW50byBhIGZ1bGwgdHJhdmVyc2FsIG9mIHRoZSByZXNwb25zZS5cbiAqL1xuY29uc3QgTUFYX0dST1VORElOR19XQUxLX0RFUFRIID0gNjtcbmNvbnN0IEdFTUlOSV9DUk9TU19SRUdJT05fQ09PTERPV05fTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9ESVNBQkxFRCA9IC9jcm9zcy1yZWdpb24gcHJvY2Vzc2luZyBpcyBkaXNhYmxlZC9pO1xuXG4vKiogTG93ZXN0IEhUVFAgc3RhdHVzIHRyZWF0ZWQgYXMgYSBzZXJ2ZXItc2lkZSAocmV0cnlhYmxlKSBzZXJ2aW5nIGZhaWx1cmUuICovXG5jb25zdCBTRVJWRVJfRVJST1JfU1RBVFVTID0gNTAwO1xuXG4vKiogU3RhdHVzIE1vZGVsIFNlcnZpbmcgdXNlcyB0byBzaGVkIGxvYWQ7IHJldHJ5YWJsZSBsaWtlIGEgNXh4LiAqL1xuY29uc3QgUkFURV9MSU1JVEVEX1NUQVRVUyA9IDQyOTtcblxuLyoqIENvbnRleHQgYSBzZWFyY2ggbmVlZHMgZnJvbSB0aGUgY2FsbGVyOiB0aGUgT0JPIGNsaWVudCArIHdvcmtzcGFjZSBob3N0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hDb250ZXh0IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnRMaWtlO1xuICBob3N0OiBzdHJpbmc7XG4gIC8qKiBUcnVzdGVkIGlkZW50aXR5IG9mIHRoZSBjcmVkZW50aWFsIGNhcnJpZWQgYnkgYGNsaWVudGAuICovXG4gIGNhY2hlSWRlbnRpdHk/OiBzdHJpbmc7XG59XG5cbi8qKiBNb2RlbC1zZWxlY3Rpb24gZmllbGRzIHVzZWQgdG8gcmFuayBvbmUgd2ViLXNlYXJjaCBlbmRwb2ludC4gKi9cbmV4cG9ydCB0eXBlIFdlYlNlYXJjaE1vZGVsU2VsZWN0aW9uT3B0aW9ucyA9IFBpY2s8XG4gIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICBcIm1vZGVsXCIgfCBcIm1vZGVsRmFsbGJhY2tzXCIgfCBcImZ1enp5XCIgfCBcImZ1enp5VGhyZXNob2xkXCJcbj47XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgT0JPIHdvcmtzcGFjZSBjbGllbnQgKyBob3N0IGZyb20gdGhlIGFjdGl2ZSBBcHBLaXQgZXhlY3V0aW9uXG4gKiBjb250ZXh0LiBJbnNpZGUgYGFnZW50LnN0cmVhbWAncyBgYXNVc2VyKHJlcSlgIHNjb3BlIHRoaXMgaGl0cyB0aGUgc2VydmluZ1xuICogZW5kcG9pbnQgYXMgdGhlIHJlcXVlc3RpbmcgdXNlcjsgb3V0c2lkZSBhIHVzZXIgY29udGV4dCBBcHBLaXQgZmFsbHMgYmFjayB0b1xuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKTogUHJvbWlzZTxXZWJTZWFyY2hDb250ZXh0PiB7XG4gIGNvbnN0IGN0eCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKTtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjdHguY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGNhY2hlSWRlbnRpdHkgPSBcInVzZXJJZFwiIGluIGN0eCA/IGN0eC51c2VySWQgOiBjdHguc2VydmljZVVzZXJJZDtcbiAgcmV0dXJuIHsgY2xpZW50OiBjdHguY2xpZW50LCBob3N0LCBjYWNoZUlkZW50aXR5IH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHdlYi1zZWFyY2gtY2FwYWJsZSBtb2RlbCBhZ2FpbnN0IHRoZSBMSVZFIHdvcmtzcGFjZSBjYXRhbG9ndWUgLSBzb1xuICogd2UgbmV2ZXIgcmV0dXJuIGFuIGVuZHBvaW50IGlkIHRoYXQgaXNuJ3QgYWN0dWFsbHkgZGVwbG95ZWQgKHRoZSBcImVuZHBvaW50XG4gKiBkb2VzIG5vdCBleGlzdFwiIGZhaWx1cmUgYSBoYXJkY29kZWQgZmFsbGJhY2sgaWQgd291bGQgY2F1c2UpLiBSZXVzZXNcbiAqIGBAZGJ4LXRvb2xzL21vZGVsYCdzIGV4aXN0aW5nIGNhdGFsb2d1ZSArIHJhbmtlciByYXRoZXIgdGhhbiBhIGN1c3RvbVxuICogbG9va3VwOiB7QGxpbmsgbGlzdFNlcnZpbmdFbmRwb2ludHN9IGxpc3RzIHRoZSBlbmRwb2ludHMgKGNhY2hlZCksIGFuZCB3ZVxuICogcmVzdHJpY3QgdGhlIGNhbmRpZGF0ZSBzZXQgdGhyb3VnaCBtb2RlbC1vd25lZCBjYXBhYmlsaXR5IG1ldGFkYXRhIGJlZm9yZVxuICoge0BsaW5rIGxvb2t1cE1vZGVsc30gcmFua3Mgd2l0aGluIGl0LlxuICpcbiAqIFRoZSBoaWdoZXN0LXJhbmtlZCBHZW1pbmkgbW9kZWwgd2lucy4gV2l0aG91dCBHZW1pbmksIGEgR1BUIHJlcXVlc3QgbWF0Y2hpbmdcbiAqIHRoZSBjYWxsaW5nL2NvbmZpZ3VyZWQgbW9kZWwgd2lucywgZm9sbG93ZWQgYnkgdGhlIGhpZ2hlc3QtcmFua2VkIEdQVCBtb2RlbFxuICogYW5kIHRoZW4gYW55IGFkZGl0aW9uYWwgY29uZmlndXJlZCBzZWFyY2hlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHwgbnVsbD4ge1xuICBjb25zdCB7IGNvbmZpZyB9ID0gcnVudGltZTtcbiAgY29uc3QgZW5kcG9pbnRzID0gYXdhaXQgbGlzdFNlcnZpbmdFbmRwb2ludHMoY3R4LmNsaWVudCwgY3R4Lmhvc3QsIHtcbiAgICAuLi4oY3R4LmNhY2hlSWRlbnRpdHkgPyB7IGNhY2hlSWRlbnRpdHk6IGN0eC5jYWNoZUlkZW50aXR5IH0gOiB7fSksXG4gIH0pO1xuICByZXR1cm4gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoZW5kcG9pbnRzLCByZXF1ZXN0ZWQsIGNvbmZpZywgYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpKTtcbn1cblxuLyoqIFNlbGVjdCBvbmUgZGVwbG95ZWQgd2ViLXNlYXJjaCBlbmRwb2ludCB1c2luZyBmYW1pbHkgYW5kIGNhcGFiaWxpdHkgcG9saWN5LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFdlYlNlYXJjaEVuZHBvaW50KFxuICBlbmRwb2ludHM6IHJlYWRvbmx5IFNlcnZpbmdFbmRwb2ludFN1bW1hcnlbXSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zLFxuICBzdXBwcmVzc2VkRmFtaWxpZXM6IFJlYWRvbmx5U2V0PHBvbGljeS5Nb2RlbEZhbWlseT4gPSBuZXcgU2V0KCksXG4pOiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5IHwgbnVsbCB7XG4gIC8vIE9ubHkgZGVwbG95ZWQsIHdlYi1zZWFyY2gtY2FwYWJsZSBlbmRwb2ludHMgYXJlIGNhbmRpZGF0ZXMuXG4gIGNvbnN0IGNhcGFibGUgPSBlbmRwb2ludHMuZmlsdGVyKChlbmRwb2ludCkgPT4ge1xuICAgIGNvbnN0IGZhbWlseSA9IGVuZHBvaW50RmFtaWx5KGVuZHBvaW50KTtcbiAgICByZXR1cm4gc3VwcG9ydHNXZWJTZWFyY2goZW5kcG9pbnQpICYmICghZmFtaWx5IHx8ICFzdXBwcmVzc2VkRmFtaWxpZXMuaGFzKGZhbWlseSkpO1xuICB9KTtcbiAgY29uc3QgZ2VtaW5pID0gbG9va3VwTW9kZWxzKGNhcGFibGUsIHtcbiAgICBzZWFyY2g6IHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmksXG4gICAgbGltaXQ6IDEsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pWzBdPy5lbmRwb2ludDtcbiAgaWYgKGdlbWluaSkgcmV0dXJuIGdlbWluaTtcbiAgY29uc3QgZ3B0ID0gbG9va3VwTW9kZWxzKGNhcGFibGUsIHtcbiAgICBzZWFyY2g6IHBvbGljeS5Nb2RlbEZhbWlseS5HcHQsXG4gICAgbGltaXQ6IDUwLFxuICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICB9KS5tYXAoKHsgZW5kcG9pbnQgfSkgPT4gZW5kcG9pbnQpO1xuXG4gIGNvbnN0IHByZWZlcnJlZCA9IHJlcXVlc3RlZCA/PyBjb25maWcubW9kZWw7XG4gIGlmIChwcmVmZXJyZWQgJiYgcG9saWN5Lm1vZGVsRmFtaWx5KHByZWZlcnJlZCkgPT09IHBvbGljeS5Nb2RlbEZhbWlseS5HcHQpIHtcbiAgICBjb25zdCBtYXRjaGVkID0gY29uZmlnLmZ1enp5XG4gICAgICA/IGxvb2t1cE1vZGVscyhncHQsIHtcbiAgICAgICAgICBzZWFyY2g6IHByZWZlcnJlZCxcbiAgICAgICAgICBsaW1pdDogMSxcbiAgICAgICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICAgICAgfSlbMF0/LmVuZHBvaW50XG4gICAgICA6IGdwdC5maW5kKChlbmRwb2ludCkgPT4gZW5kcG9pbnQubmFtZSA9PT0gcHJlZmVycmVkKTtcbiAgICBpZiAobWF0Y2hlZCkgcmV0dXJuIG1hdGNoZWQ7XG4gIH1cbiAgaWYgKGdwdFswXSkgcmV0dXJuIGdwdFswXTtcblxuICBmb3IgKGNvbnN0IHNlYXJjaCBvZiBjb25maWcubW9kZWxGYWxsYmFja3MpIHtcbiAgICBpZiAoXG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSB8fFxuICAgICAgc2VhcmNoLnRvTG93ZXJDYXNlKCkgPT09IHBvbGljeS5Nb2RlbEZhbWlseS5HcHRcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBtYXRjaGVkID0gbG9va3VwTW9kZWxzKGNhcGFibGUsIHtcbiAgICAgIHNlYXJjaCxcbiAgICAgIGxpbWl0OiAxLFxuICAgICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gICAgfSlbMF0/LmVuZHBvaW50O1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogUmV0dXJuIG9uZSBlbmRwb2ludCdzIG1vZGVsLW93bmVkIGZhbWlseSBpZGVudGl0eS4gKi9cbmZ1bmN0aW9uIGVuZHBvaW50RmFtaWx5KGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5KTogcG9saWN5Lk1vZGVsRmFtaWx5IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHBvbGljeS5tb2RlbEZhbWlseShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lID8/IGVuZHBvaW50Lm5hbWUpO1xufVxuXG4vKiogRHJvcCBleHBpcmVkIGZhbWlseSBjb29sZG93bnMgYW5kIHJldHVybiB0aGUgY3VycmVudGx5IHN1cHByZXNzZWQgc2V0LiAqL1xuZnVuY3Rpb24gYWN0aXZlRmFtaWx5Q29vbGRvd25zKFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBub3cgPSBEYXRlLm5vdygpLFxuKTogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiB7XG4gIGZvciAoY29uc3QgW2ZhbWlseSwgZXhwaXJlc0F0XSBvZiBydW50aW1lLmZhbWlseUNvb2xkb3ducykge1xuICAgIGlmIChleHBpcmVzQXQgPD0gbm93KSBydW50aW1lLmZhbWlseUNvb2xkb3ducy5kZWxldGUoZmFtaWx5KTtcbiAgfVxuICByZXR1cm4gbmV3IFNldChydW50aW1lLmZhbWlseUNvb2xkb3ducy5rZXlzKCkpO1xufVxuXG4vKipcbiAqIFBPU1QgYSBzZXJ2aW5nIHJlcXVlc3QgYXMgdGhlIE9CTyBjYWxsZXIgYW5kIHJldHVybiB0aGUgcGFyc2VkIEpTT04gYm9keS5cbiAqXG4gKiBBdXRoIGhlYWRlcnMgYXJlIG1pbnRlZCBwZXIgY2FsbCBmcm9tIHRoZSBPQk8gY2xpZW50J3MgU0RLIGNvbmZpZywgd2hpY2hcbiAqIHJlZnJlc2hlcyB0aGUgdG9rZW4gd2hlbiBpdCBpcyBjbG9zZSB0byBleHBpcnksIHNvIHRoZSByZXF1ZXN0IGNhcnJpZXMgdGhlXG4gKiByZXF1ZXN0aW5nIHVzZXIncyBpZGVudGl0eS5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvbmUgRGF0YWJyaWNrcyBjYWxsIGluIHRoZSByZXBvIHRoYXQgZG9lcyBub3QgZ28gdGhyb3VnaFxuICogYGFwaUNsaWVudC5yZXF1ZXN0YCArIGBkYXRhYnJpY2tzLnRvQ29udGV4dGAgKHdoaWNoIGRvZXMgZm9yd2FyZFxuICogY2FuY2VsbGF0aW9uKS4gUmV0cnkgY2xhc3NpZmljYXRpb24gaGVyZSBoYXMgdG8gZGlzdGluZ3Vpc2ggYSBsb2FkLXNoZWQgb3JcbiAqIHNlcnZlciBmYXVsdCBmcm9tIHRoaXMgcmVxdWVzdCdzIG93biA0eHgsIGFuZCBgZmV0Y2hgIGV4cG9zZXMgdGhlIEhUVFAgc3RhdHVzXG4gKiBkaXJlY3RseTsgdGhlIFNESyByYWlzZXMgYW4gYEFwaUVycm9yYCB0aGF0IGNhcnJpZXMgdGhlIHN0YXR1cyB1bmRlclxuICogaW5jb25zaXN0ZW50IGtleXMsIHdoaWNoIGlzIGd1ZXNzd29yayBieSBjb21wYXJpc29uLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0U2VydmluZyhcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICB1cmw6IHN0cmluZyxcbiAgYm9keTogdW5rbm93bixcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY2FjaGVLZXk6IHJlYWRvbmx5IChzdHJpbmcgfCBudW1iZXIpW10sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBwYXlsb2FkID0gYXdhaXQgZXhlY3V0ZVJlYWQoXG4gICAgcnVudGltZSxcbiAgICBcInNlcnZpbmctcmVxdWVzdFwiLFxuICAgIHRvQ2FsbFNldHRpbmdzKHdlYlNlYXJjaEV4ZWN1dGVEZWZhdWx0cywgY29uZmlnLnRpbWVvdXRNcywgY2FjaGVLZXkpLFxuICAgIGFzeW5jIChleGVjdXRlU2lnbmFsKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgLi4uKGF3YWl0IGludm9rZS5hdXRoSGVhZGVycyhjdHguY2xpZW50KSksXG4gICAgICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICAgIC4uLihleGVjdXRlU2lnbmFsID8geyBzaWduYWw6IGV4ZWN1dGVTaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCByZXNwb25zZUJvZHkgPSBhd2FpdCByZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gaXNSZWNvcmQoYm9keSkgJiYgdHlwZW9mIGJvZHkubW9kZWwgPT09IFwic3RyaW5nXCIgPyBib2R5Lm1vZGVsIDogdW5kZWZpbmVkO1xuICAgICAgICBjb25zdCBjcm9zc1JlZ2lvbkRpc2FibGVkID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPT09IDQwMCAmJlxuICAgICAgICAgIG1vZGVsICYmXG4gICAgICAgICAgcG9saWN5Lm1vZGVsRmFtaWx5KG1vZGVsKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSAmJlxuICAgICAgICAgIEdFTUlOSV9DUk9TU19SRUdJT05fRElTQUJMRUQudGVzdChyZXNwb25zZUJvZHkpO1xuICAgICAgICBpZiAoY3Jvc3NSZWdpb25EaXNhYmxlZCkge1xuICAgICAgICAgIGNvbnN0IGV4cGlyZXNBdCA9IERhdGUubm93KCkgKyBHRU1JTklfQ1JPU1NfUkVHSU9OX0NPT0xET1dOX01TO1xuICAgICAgICAgIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLnNldChwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pLCBleHBpcmVzQXQpO1xuICAgICAgICAgIHJ1bnRpbWUuYXZhaWxhYmxlRmFtaWxpZXMuZGVsZXRlKHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dlci5lcnJvcihcInNlcnZpbmctcmVxdWVzdC1yZWplY3RlZFwiLCB7XG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIGFwaTogdXJsLmVuZHNXaXRoKFwiL3Jlc3BvbnNlc1wiKSA/IFwicmVzcG9uc2VzXCIgOiBcImNoYXRcIixcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgICAgcmVzcG9uc2VCb2R5LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvYWQtc2hlZGRpbmcgYW5kIHNlcnZlciBmYXVsdHMgYXJlIHdvcnRoIGFub3RoZXIgYXR0ZW1wdDsgYSA0eHggaXNcbiAgICAgICAgLy8gdGhpcyByZXF1ZXN0J3Mgb3duIHByb2JsZW0sIHNvIGl0IG11c3Qgbm90IGJlIHJldHJpZWQuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IFNFUlZFUl9FUlJPUl9TVEFUVVMgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBSQVRFX0xJTUlURURfU1RBVFVTO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYHdlYi1zZWFyY2g6IE1vZGVsIFNlcnZpbmcgcmVqZWN0ZWQgdGhlIHNlYXJjaCByZXF1ZXN0IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICB0aHJvdyByZXRyeWFibGVcbiAgICAgICAgICA/IG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgeyBjb250ZXh0OiB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0gfSlcbiAgICAgICAgICA6IG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cml0ZVByb2dyZXNzICYmXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIilcbiAgICAgICAgPyByZWFkU3RyZWFtaW5nUmVzcG9uc2UocmVzcG9uc2UsIHdyaXRlUHJvZ3Jlc3MpXG4gICAgICAgIDogcmVzcG9uc2UuanNvbigpO1xuICAgIH0sXG4gICAgc2lnbmFsLFxuICAgIGZhbHNlLFxuICApO1xuICByZXR1cm4gaXNSZWNvcmQocGF5bG9hZCkgPyBwYXlsb2FkIDoge307XG59XG5cbi8qKiBDb25zdW1lIGFuIE9wZW5BSSBSZXNwb25zZXMgU1NFIHN0cmVhbSBhbmQgcmV0YWluIGl0cyBjb21wbGV0ZWQgcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtaW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgd3JpdGVQcm9ncmVzczogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuICBsZXQgY29tcGxldGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY29uc3VtZSA9IGFzeW5jIChmcmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGZyYW1lXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSg1KS50cmltU3RhcnQoKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGlmICghZGF0YSB8fCBkYXRhID09PSBcIltET05FXVwiKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKGRhdGEpIGFzIHVua25vd247XG4gICAgaWYgKCFpc1JlY29yZChldmVudCkgfHwgdHlwZW9mIGV2ZW50LnR5cGUgIT09IFwic3RyaW5nXCIpIHJldHVybjtcbiAgICBhd2FpdCBlbWl0V2ViU2VhcmNoUHJvZ3Jlc3MoZXZlbnQsIHdyaXRlUHJvZ3Jlc3MpO1xuICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3BvbnNlLmNvbXBsZXRlZFwiICYmIGlzUmVjb3JkKGV2ZW50LnJlc3BvbnNlKSkge1xuICAgICAgY29tcGxldGVkID0gZXZlbnQucmVzcG9uc2U7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZmFpbGVkXCIsIHtcbiAgICAgICAgY29udGV4dDogeyByZXNwb25zZTogZXZlbnQucmVzcG9uc2UgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiAhZG9uZSB9KTtcbiAgICBidWZmZXIgPSBidWZmZXIucmVwbGFjZUFsbChcIlxcclxcblwiLCBcIlxcblwiKTtcbiAgICBsZXQgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB3aGlsZSAoYm91bmRhcnkgPj0gMCkge1xuICAgICAgYXdhaXQgY29uc3VtZShidWZmZXIuc2xpY2UoMCwgYm91bmRhcnkpKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShib3VuZGFyeSArIDIpO1xuICAgICAgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB9XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICB9XG4gIGlmIChidWZmZXIudHJpbSgpKSBhd2FpdCBjb25zdW1lKGJ1ZmZlcik7XG4gIGlmICghY29tcGxldGVkKSB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZGlkIG5vdCBjb21wbGV0ZVwiKTtcbiAgcmV0dXJuIGNvbXBsZXRlZDtcbn1cblxuLyoqIFB1Ymxpc2ggbmF0aXZlIHdlYi1zZWFyY2ggbGlmZWN5Y2xlIGV2ZW50cyBhcyBjb21tb24gdG9vbCBwcm9ncmVzcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhcbiAgZXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3cml0ZVByb2dyZXNzOiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXZlbnQudHlwZSAhPT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIgfHwgIWlzUmVjb3JkKGV2ZW50Lml0ZW0pKSByZXR1cm47XG4gIGNvbnN0IGFjdGlvbiA9IGlzUmVjb3JkKGV2ZW50Lml0ZW0uYWN0aW9uKSA/IGV2ZW50Lml0ZW0uYWN0aW9uIDogdW5kZWZpbmVkO1xuICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24udHlwZSAhPT0gXCJzZWFyY2hcIikgcmV0dXJuO1xuICBjb25zdCBxdWVyeSA9IHR5cGVvZiBhY3Rpb24ucXVlcnkgPT09IFwic3RyaW5nXCIgPyBhY3Rpb24ucXVlcnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHF1ZXJpZXMgPSBBcnJheS5pc0FycmF5KGFjdGlvbi5xdWVyaWVzKVxuICAgID8gYWN0aW9uLnF1ZXJpZXMuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpXG4gICAgOiBbXTtcbiAgY29uc3QgZ3JvdXBJZCA9XG4gICAgdHlwZW9mIGV2ZW50Lml0ZW0uaWQgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZXZlbnQuaXRlbS5pZFxuICAgICAgOiBgc2VhcmNoLSR7U3RyaW5nKGV2ZW50LnNlcXVlbmNlX251bWJlciA/PyBxdWVyeSA/PyBcInVua25vd25cIil9YDtcbiAgY29uc3QgcmVzdWx0Q291bnQgPSBxdWVyaWVzLmxlbmd0aCA+IDAgPyBxdWVyaWVzLmxlbmd0aCA6IHF1ZXJ5ID8gMSA6IDA7XG4gIGF3YWl0IHdyaXRlUHJvZ3Jlc3Moe1xuICAgIHR5cGU6IFwidG9vbF9zdGF0dXNcIixcbiAgICBzdGF0dXM6IFwic2VhcmNoXCIsXG4gICAgbWVzc2FnZTogcXVlcnkgPz8gXCJ0aGUgd2ViXCIsXG4gICAgZ3JvdXBJZCxcbiAgfSk7XG4gIGF3YWl0IHdyaXRlUHJvZ3Jlc3Moe1xuICAgIHR5cGU6IFwidG9vbF9zdGF0dXNcIixcbiAgICBzdGF0dXM6IFwicmVzdWx0XCIsXG4gICAgbWVzc2FnZTogXCJSZXN1bHRcIixcbiAgICBncm91cElkLFxuICAgIC4uLihyZXN1bHRDb3VudCA+IDBcbiAgICAgID8geyBkZXRhaWw6IGAke3Jlc3VsdENvdW50fSAke3Jlc3VsdENvdW50ID09PSAxID8gXCJyZXN1bHRcIiA6IFwicmVzdWx0c1wifWAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzcG9uc2UgZXh0cmFjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBFeHRyYWN0IGFuc3dlciB0ZXh0IGFuZCBjaXRhdGlvbnMgZnJvbSBhbiBPcGVuQUkgUmVzcG9uc2VzIEFQSSBwYXlsb2FkLlxuICovXG5mdW5jdGlvbiBmcm9tUmVzcG9uc2VzUGF5bG9hZChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgYW5zd2VyOiBzdHJpbmc7XG4gIGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXTtcbn0ge1xuICBjb25zdCBvdXRwdXQgPSBBcnJheS5pc0FycmF5KHBheWxvYWQub3V0cHV0KSA/IHBheWxvYWQub3V0cHV0IDogW107XG4gIGNvbnN0IHRleHRzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW10gPSBbXTtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygb3V0cHV0KSB7XG4gICAgaWYgKCFpc1JlY29yZChpdGVtKSkgY29udGludWU7XG4gICAgY29uc3QgcGFydHMgPSBjaGF0Q29udGVudFBhcnRzKGl0ZW0uY29udGVudCk7XG4gICAgaWYgKCFwYXJ0cykgY29udGludWU7XG4gICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7XG4gICAgICBpZiAoIWlzUmVjb3JkKHBhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRleHQgPSB0cmltVG9FbXB0eShwYXJ0LnRleHQpO1xuICAgICAgaWYgKHRleHQpIHRleHRzLnB1c2godGV4dCk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocGFydC5hbm5vdGF0aW9ucykgPyBwYXJ0LmFubm90YXRpb25zIDogW107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFpc1JlY29yZChhbm5vdGF0aW9uKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHVybCA9IHRyaW1Ub0VtcHR5KGFubm90YXRpb24udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gdHJpbVRvRW1wdHkoYW5ub3RhdGlvbi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFuc3dlciA9IHRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICByZXR1cm4geyBhbnN3ZXIsIGNpdGF0aW9ucyB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgKyBjaXRhdGlvbnMgZnJvbSBhIENoYXQgQ29tcGxldGlvbnMgcGF5bG9hZCAoR2VtaW5pIHZpYVxuICogYGdvb2dsZV9zZWFyY2hgKS4gVGhlIGFuc3dlciBpcyBgY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnRgOyBncm91bmRpbmdcbiAqIHNvdXJjZXMsIHdoZW4gcHJlc2VudCwgc3VyZmFjZSB1bmRlciBgY2hvaWNlc1swXS5tZXNzYWdlYCBncm91bmRpbmdcbiAqIG1ldGFkYXRhIChiZXN0LWVmZm9ydCAtIHNoYXBlcyB2YXJ5LCBzbyB3ZSBzY2FuIGZvciB1cmwtYmVhcmluZyBlbnRyaWVzKS5cbiAqL1xuZnVuY3Rpb24gZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuY2hvaWNlcykgPyBwYXlsb2FkLmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSBjaG9pY2VzWzBdO1xuICBjb25zdCBtZXNzYWdlID0gaXNSZWNvcmQoZmlyc3QpICYmIGlzUmVjb3JkKGZpcnN0Lm1lc3NhZ2UpID8gZmlyc3QubWVzc2FnZSA6IHt9O1xuICBjb25zdCBhbnN3ZXIgPSBjaGF0Q29udGVudFRvVGV4dChtZXNzYWdlLmNvbnRlbnQpO1xuICBjb25zdCBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW10gPSBbXTtcbiAgLy8gQmVzdC1lZmZvcnQgZ3JvdW5kaW5nIGV4dHJhY3Rpb246IHdhbGsgYW55IG5lc3RlZCBvYmplY3QgZm9yIHt1cml8dXJsLHRpdGxlfS5cbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB2aXNpdCA9ICh2OiB1bmtub3duLCBkZXB0aDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgaWYgKGRlcHRoID4gTUFYX0dST1VORElOR19XQUxLX0RFUFRIIHx8ICFpc1JlY29yZCh2KSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IHRyaW1Ub0VtcHR5KHYudXJsKSB8fCB0cmltVG9FbXB0eSh2LnVyaSk7XG4gICAgaWYgKHVybCAmJiAhc2Vlbi5oYXModXJsKSkge1xuICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gdHJpbVRvRW1wdHkodi50aXRsZSk7XG4gICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHYpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwuZm9yRWFjaCgoeCkgPT4gdmlzaXQoeCwgZGVwdGggKyAxKSk7XG4gICAgICBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikgdmlzaXQodmFsLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfTtcbiAgdmlzaXQobWVzc2FnZS5ncm91bmRpbmdfbWV0YWRhdGEgPz8gbWVzc2FnZS5ncm91bmRpbmdNZXRhZGF0YSwgMCk7XG4gIHJldHVybiB7IGFuc3dlciwgY2l0YXRpb25zIH07XG59XG5cbi8qKlxuICogUnVuIGEgd2ViIHNlYXJjaC4gUHJlZmVycyB0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIG9uIGFcbiAqIGRlcGxveWVkIEdQVC9HZW1pbmkgZW5kcG9pbnQgKHN5bnRoZXNpemVkIGFuc3dlciArIGNpdGF0aW9ucyk7IHdoZW4gdGhlXG4gKiB3b3Jrc3BhY2UgaGFzIG5vIHN1Y2ggZW5kcG9pbnQgQU5EIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgZW5hYmxlZCwgZmFsbHNcbiAqIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSBzbyB0aGUgdG9vbCBzdGlsbCByZXR1cm5zIHJlc3VsdHMgaW5zdGVhZCBvZlxuICogZXJyb3JpbmcuIENpdGF0aW9ucyBhcmUgZmlsdGVyZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBVUkwgYWxsb3ctbGlzdC5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIHRoZSB3aG9sZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGluLWZsaWdodCBzZXJ2aW5nIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHJlc29sdmVXZWJTZWFyY2hNb2RlbChjdHgsIHJ1bnRpbWUsIHJlcXVlc3QubW9kZWwpO1xuXG4gIGlmIChlbmRwb2ludCA9PT0gbnVsbCkge1xuICAgIC8vIE5vIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLlxuICAgIGlmIChjb25maWcuc2NyYXBlRmFsbGJhY2spIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwibm8tbmF0aXZlLW1vZGVsOnNjcmFwZS1mYWxsYmFja1wiLCB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5IH0pO1xuICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIFwiV2ViLXNlYXJjaC1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnRcIixcbiAgICAgIFwiTm8gR1BUL0dlbWluaSBlbmRwb2ludCBpcyBkZXBsb3llZCBpbiB0aGlzIHdvcmtzcGFjZSBhbmQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBcIiArXG4gICAgICAgIGBkaXNhYmxlZC4gRGVwbG95IGEgc3VwcG9ydGVkIGVuZHBvaW50LCBzZXQgbW9kZWwgb3IgJHtNT0RFTF9FTlZ9LCBvciBlbmFibGUgdGhlIGAgK1xuICAgICAgICBcImZhbGxiYWNrIChXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSz0xKS5cIixcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHJ1blNlbGVjdGVkV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG59XG5cbi8qKiBSdW4gb25lIHNlbGVjdGVkIGZhbWlseSBhZnRlciBpdHMgZmlyc3QgcmVxdWVzdCBlc3RhYmxpc2hlcyBhdmFpbGFiaWxpdHkuICovXG5hc3luYyBmdW5jdGlvbiBydW5TZWxlY3RlZFdlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IGZhbWlseSA9IGVuZHBvaW50RmFtaWx5KGVuZHBvaW50KTtcbiAgaWYgKCFmYW1pbHkgfHwgcnVudGltZS5hdmFpbGFibGVGYW1pbGllcy5oYXMoZmFtaWx5KSkge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBydW5TZWFyY2hGYWxsYmFjayhyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGVuZHBvaW50LCBlcnJvciwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhY3RpdmVQcm9iZSA9IHJ1bnRpbWUuZmFtaWx5UHJvYmVzLmdldChmYW1pbHkpO1xuICBpZiAoYWN0aXZlUHJvYmUpIHtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgYXdhaXQgYWN0aXZlUHJvYmU7XG4gICAgc2lnbmFsPy50aHJvd0lmQWJvcnRlZCgpO1xuICAgIHJldHVybiBydW5XZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xuICB9XG5cbiAgbGV0IHJlbGVhc2VQcm9iZSE6ICgpID0+IHZvaWQ7XG4gIGNvbnN0IHByb2JlID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICByZWxlYXNlUHJvYmUgPSByZXNvbHZlO1xuICB9KTtcbiAgcnVudGltZS5mYW1pbHlQcm9iZXMuc2V0KGZhbWlseSwgcHJvYmUpO1xuXG4gIGlmIChydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmhhcyhmYW1pbHkpIHx8IGFjdGl2ZUZhbWlseUNvb2xkb3ducyhydW50aW1lKS5oYXMoZmFtaWx5KSkge1xuICAgIHJ1bnRpbWUuZmFtaWx5UHJvYmVzLmRlbGV0ZShmYW1pbHkpO1xuICAgIHJlbGVhc2VQcm9iZSgpO1xuICAgIHJldHVybiBydW5XZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xuICB9XG5cbiAgbGV0IGZhaWx1cmU6IHVua25vd247XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gICAgcnVudGltZS5hdmFpbGFibGVGYW1pbGllcy5hZGQoZmFtaWx5KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGZhaWx1cmUgPSBlcnJvcjtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAocnVudGltZS5mYW1pbHlQcm9iZXMuZ2V0KGZhbWlseSkgPT09IHByb2JlKSBydW50aW1lLmZhbWlseVByb2Jlcy5kZWxldGUoZmFtaWx5KTtcbiAgICByZWxlYXNlUHJvYmUoKTtcbiAgfVxuICByZXR1cm4gcnVuU2VhcmNoRmFsbGJhY2socmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgZmFpbHVyZSwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbn1cblxuLyoqIFJlc29sdmUgYSBjYWNoZWQgZmFtaWx5IGZhaWx1cmUgdG8gYW5vdGhlciBtb2RlbCBvciB0aGUgc2NyYXBlIGZhbGxiYWNrLiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuU2VhcmNoRmFsbGJhY2soXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnksXG4gIGVycm9yOiB1bmtub3duLFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgaWYgKFxuICAgIGVuZHBvaW50RmFtaWx5KGVuZHBvaW50KSAhPT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSB8fFxuICAgICFhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkuaGFzKHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmkpXG4gICkge1xuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGNvbnN0IGZhbGxiYWNrID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG4gIGlmICghZmFsbGJhY2spIHtcbiAgICBpZiAocnVudGltZS5jb25maWcuc2NyYXBlRmFsbGJhY2spIHtcbiAgICAgIGxvZ2dlci53YXJuKFwid2ViLXNlYXJjaC1tb2RlbC1mYWxsYmFja1wiLCB7XG4gICAgICAgIGZhaWxlZE1vZGVsOiBlbmRwb2ludC5uYW1lLFxuICAgICAgICBmYWxsYmFjazogXCJzY3JhcGVcIixcbiAgICAgICAgcmVhc29uOiBcImNyb3NzLXJlZ2lvbi1kaXNhYmxlZFwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcnVuU2NyYXBlU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG4gIGxvZ2dlci53YXJuKFwid2ViLXNlYXJjaC1tb2RlbC1mYWxsYmFja1wiLCB7XG4gICAgZmFpbGVkTW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgZmFsbGJhY2tNb2RlbDogZmFsbGJhY2submFtZSxcbiAgICByZWFzb246IFwiY3Jvc3MtcmVnaW9uLWRpc2FibGVkXCIsXG4gIH0pO1xuICByZXR1cm4gcnVuU2VsZWN0ZWRXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBmYWxsYmFjaywgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbn1cblxuLyoqIEV4ZWN1dGUgb25lIG5hdGl2ZSBwcm92aWRlciByZXF1ZXN0IGFnYWluc3QgYW4gYWxyZWFkeS1zZWxlY3RlZCBlbmRwb2ludC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk5hdGl2ZVdlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBtb2RlbElkID0gZW5kcG9pbnQubmFtZTtcbiAgY29uc3QgcHJvdmlkZXIgPSB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseShcbiAgICBwb2xpY3kubW9kZWxGYW1pbHkoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSA/PyBlbmRwb2ludC5uYW1lKSxcbiAgKTtcbiAgaWYgKCFwcm92aWRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJOYXRpdmUgd2ViLXNlYXJjaCBwcm92aWRlclwiLFxuICAgICAgYE1vZGVsICR7bW9kZWxJZH0gaGFzIG5vIHN1cHBvcnRlZCBwcm92aWRlciBmYW1pbHkuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHNwZWMgPSB3ZWJTZWFyY2hUb29sU3BlYyhwcm92aWRlciwgY29uZmlnLndlYlNlYXJjaFRvb2xzKTtcblxuICBjb25zdCB1cmwgPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gaW52b2tlLnJlc3BvbnNlc1VybChjdHguaG9zdCkgOiBpbnZva2UuY2hhdENvbXBsZXRpb25zVXJsKGN0eC5ob3N0KTtcbiAgY29uc3QgYm9keSA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCJcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBpbnB1dDogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgLi4uKHdyaXRlUHJvZ3Jlc3MgPyB7IHN0cmVhbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5zcGVjLnJlcXVlc3QsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiByZXF1ZXN0LnF1ZXJ5IH1dLFxuICAgICAgICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBwb3N0U2VydmluZyhcbiAgICBjdHgsXG4gICAgdXJsLFxuICAgIGJvZHksXG4gICAgcnVudGltZSxcbiAgICBbXCJ3ZWItc2VhcmNoXCIsIFwic2VydmluZ1wiLCBzcGVjLmFwaSwgbW9kZWxJZCwgcmVxdWVzdC5xdWVyeV0sXG4gICAgc2lnbmFsLFxuICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICk7XG5cbiAgY29uc3QgeyBhbnN3ZXIsIGNpdGF0aW9ucyB9ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIiA/IGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQpIDogZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQpO1xuXG4gIGNvbnN0IHBlcm1pdHRlZCA9IGNpdGF0aW9ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5hbGxvd0xpc3QuYWxsb3dzKGMudXJsKSk7XG4gIGNvbnN0IGRyb3BwZWQgPSBjaXRhdGlvbnMubGVuZ3RoIC0gcGVybWl0dGVkLmxlbmd0aDtcbiAgY29uc3QgdHJpbW1lZCA9IHBlcm1pdHRlZC5zbGljZSgwLCBjb25maWcubWF4Q2l0YXRpb25zKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VhcmNoZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIG1vZGVsOiBtb2RlbElkLFxuICAgIHByb3ZpZGVyLFxuICAgIGNpdGF0aW9uczogY2l0YXRpb25zLmxlbmd0aCxcbiAgICAuLi4oZHJvcHBlZCA+IDAgPyB7IGZpbHRlcmVkOiBkcm9wcGVkIH0gOiB7fSksXG4gICAgcmV0dXJuZWQ6IHRyaW1tZWQubGVuZ3RoLFxuICB9KTtcblxuICByZXR1cm4geyBxdWVyeTogcmVxdWVzdC5xdWVyeSwgYW5zd2VyLCBjaXRhdGlvbnM6IHRyaW1tZWQsIG1vZGVsOiBtb2RlbElkIH07XG59XG4iXX0=
package/package.json CHANGED
@@ -27,12 +27,12 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/appkit": "^0.9.153",
31
- "@dbx-tools/core": "^0.9.153",
32
- "@dbx-tools/model": "^0.9.153",
33
- "@dbx-tools/path": "^0.9.153",
34
- "@dbx-tools/shared-core": "^0.9.153",
35
- "@dbx-tools/shared-model": "^0.9.153",
30
+ "@dbx-tools/appkit": "^0.9.157",
31
+ "@dbx-tools/core": "^0.9.157",
32
+ "@dbx-tools/model": "^0.9.157",
33
+ "@dbx-tools/path": "^0.9.157",
34
+ "@dbx-tools/shared-core": "^0.9.157",
35
+ "@dbx-tools/shared-model": "^0.9.157",
36
36
  "@mastra/core": "1.71.0",
37
37
  "cheerio": "^1.2.0",
38
38
  "entities": "^4.5.0",
@@ -51,62 +51,10 @@
51
51
  "types": "./lib/index.d.ts",
52
52
  "default": "./lib/index.js"
53
53
  },
54
- "./allowlist": {
55
- "types": "./lib/src/allowlist.d.ts",
56
- "default": "./lib/src/allowlist.js"
57
- },
58
- "./config": {
59
- "types": "./lib/src/config.d.ts",
60
- "default": "./lib/src/config.js"
61
- },
62
- "./defaults": {
63
- "types": "./lib/src/defaults.d.ts",
64
- "default": "./lib/src/defaults.js"
65
- },
66
- "./fetch": {
67
- "types": "./lib/src/fetch.d.ts",
68
- "default": "./lib/src/fetch.js"
69
- },
70
- "./html-text": {
71
- "types": "./lib/src/html-text.d.ts",
72
- "default": "./lib/src/html-text.js"
73
- },
74
- "./plugin": {
75
- "types": "./lib/src/plugin.d.ts",
76
- "default": "./lib/src/plugin.js"
77
- },
78
- "./provider": {
79
- "types": "./lib/src/provider.d.ts",
80
- "default": "./lib/src/provider.js"
81
- },
82
- "./runtime": {
83
- "types": "./lib/src/runtime.d.ts",
84
- "default": "./lib/src/runtime.js"
85
- },
86
- "./schema": {
87
- "types": "./lib/src/schema.d.ts",
88
- "default": "./lib/src/schema.js"
89
- },
90
- "./scrape": {
91
- "types": "./lib/src/scrape.d.ts",
92
- "default": "./lib/src/scrape.js"
93
- },
94
- "./search": {
95
- "types": "./lib/src/search.d.ts",
96
- "default": "./lib/src/search.js"
97
- },
98
- "./tool": {
99
- "types": "./lib/src/tool.d.ts",
100
- "default": "./lib/src/tool.js"
101
- },
102
- "./*": {
103
- "types": "./lib/src/*/index.d.ts",
104
- "default": "./lib/src/*/index.js"
105
- },
106
54
  "./package.json": "./package.json"
107
55
  }
108
56
  },
109
- "version": "0.9.153",
57
+ "version": "0.9.157",
110
58
  "types": "./lib/index.d.ts",
111
59
  "dbxToolsConfig": {
112
60
  "tags": [
@@ -119,62 +67,10 @@
119
67
  "types": "./lib/index.d.ts",
120
68
  "default": "./lib/index.js"
121
69
  },
122
- "./allowlist": {
123
- "types": "./lib/src/allowlist.d.ts",
124
- "default": "./lib/src/allowlist.js"
125
- },
126
- "./config": {
127
- "types": "./lib/src/config.d.ts",
128
- "default": "./lib/src/config.js"
129
- },
130
- "./defaults": {
131
- "types": "./lib/src/defaults.d.ts",
132
- "default": "./lib/src/defaults.js"
133
- },
134
- "./fetch": {
135
- "types": "./lib/src/fetch.d.ts",
136
- "default": "./lib/src/fetch.js"
137
- },
138
- "./html-text": {
139
- "types": "./lib/src/html-text.d.ts",
140
- "default": "./lib/src/html-text.js"
141
- },
142
- "./plugin": {
143
- "types": "./lib/src/plugin.d.ts",
144
- "default": "./lib/src/plugin.js"
145
- },
146
- "./provider": {
147
- "types": "./lib/src/provider.d.ts",
148
- "default": "./lib/src/provider.js"
149
- },
150
- "./runtime": {
151
- "types": "./lib/src/runtime.d.ts",
152
- "default": "./lib/src/runtime.js"
153
- },
154
- "./schema": {
155
- "types": "./lib/src/schema.d.ts",
156
- "default": "./lib/src/schema.js"
157
- },
158
- "./scrape": {
159
- "types": "./lib/src/scrape.d.ts",
160
- "default": "./lib/src/scrape.js"
161
- },
162
- "./search": {
163
- "types": "./lib/src/search.d.ts",
164
- "default": "./lib/src/search.js"
165
- },
166
- "./tool": {
167
- "types": "./lib/src/tool.d.ts",
168
- "default": "./lib/src/tool.js"
169
- },
170
- "./*": {
171
- "types": "./lib/src/*/index.d.ts",
172
- "default": "./lib/src/*/index.js"
173
- },
174
70
  "./package.json": "./package.json"
175
71
  },
176
72
  "files": [
177
- "index.ts",
73
+ "index*.ts",
178
74
  "src",
179
75
  "lib"
180
76
  ],
package/src/allowlist.ts CHANGED
@@ -30,8 +30,8 @@
30
30
  */
31
31
 
32
32
  import { ValidationError } from "@databricks/appkit";
33
- import { match, type PathMatcher } from "@dbx-tools/path";
34
- import { stringUtils } from "@dbx-tools/shared-core";
33
+ import { type PathMatcher, toPathMatcher } from "@dbx-tools/path";
34
+ import { parseList } from "@dbx-tools/shared-core";
35
35
 
36
36
  /** A compiled URL allow-list. Build one with {@link toUrlAllowList}. */
37
37
  export interface UrlAllowList {
@@ -65,7 +65,7 @@ export function normalizeUrlPattern(pattern: string): string {
65
65
  * identically.
66
66
  */
67
67
  export function parseAllowedUrls(raw: string | string[] | undefined): string[] {
68
- return stringUtils.parseList(raw, normalizeUrlPattern);
68
+ return parseList(raw, normalizeUrlPattern);
69
69
  }
70
70
 
71
71
  /** One compiled entry: which URL slice it tests, and the matcher for it. */
@@ -78,12 +78,12 @@ interface CompiledPattern {
78
78
  function compilePattern(pattern: string): CompiledPattern {
79
79
  if (pattern.includes("/")) {
80
80
  // A path entry matches against `host + pathname` (no scheme, no query).
81
- return { target: "hostPath", matcher: match.toPathMatcher(pattern) };
81
+ return { target: "hostPath", matcher: toPathMatcher(pattern) };
82
82
  }
83
83
  // A host entry matches the hostname. A bare host (no wildcard) also
84
84
  // permits its subdomains via an added `*.<host>` alternative.
85
85
  const globs = pattern.includes("*") ? [pattern] : [pattern, `*.${pattern}`];
86
- return { target: "hostname", matcher: match.toPathMatcher(...globs) };
86
+ return { target: "hostname", matcher: toPathMatcher(...globs) };
87
87
  }
88
88
 
89
89
  /** The URL slices a compiled pattern is tested against. */