@dbx-tools/appkit-model-gateway 0.9.189 → 0.9.193
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 +6 -0
- package/index.ts +7 -1
- package/lib/index.d.ts +7 -1
- package/lib/index.js +6 -2
- package/lib/src/ai-decide.d.ts +50 -0
- package/lib/src/ai-decide.js +406 -0
- package/lib/src/gateway.d.ts +6 -2
- package/lib/src/gateway.js +72 -16
- package/lib/src/model-context.d.ts +32 -0
- package/lib/src/model-context.js +270 -0
- package/lib/src/models.d.ts +3 -3
- package/lib/src/models.js +55 -8
- package/lib/src/reasoning-adapt.js +2 -5
- package/lib/src/routes.js +18 -2
- package/lib/src/smart-router.d.ts +4 -7
- package/lib/src/smart-router.js +7 -175
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +8 -8
- package/src/ai-decide.ts +552 -0
- package/src/gateway.ts +96 -14
- package/src/model-context.ts +306 -0
- package/src/models.ts +66 -4
- package/src/reasoning-adapt.ts +1 -5
- package/src/routes.ts +16 -0
- package/src/smart-router.ts +8 -187
package/lib/src/smart-router.js
CHANGED
|
@@ -10,9 +10,8 @@ import { refreshWorkspaceClientAuthentication } from "@dbx-tools/databricks";
|
|
|
10
10
|
import { isRecord, log, toError } from "@dbx-tools/shared-core";
|
|
11
11
|
import { ReasoningEffortSchema } from "@dbx-tools/shared-model";
|
|
12
12
|
import { SMART_ROUTER_NAME, SmartRouterObservationSchema, SmartRouterRequestSchema, SmartRouterResponseSchema, } from "@dbx-tools/shared-model-gateway";
|
|
13
|
-
import { Tiktoken } from "js-tiktoken/lite";
|
|
14
|
-
import o200kBase from "js-tiktoken/ranks/o200k_base";
|
|
15
13
|
import { z } from "zod";
|
|
14
|
+
import { normalizeModelContext } from "./model-context.js";
|
|
16
15
|
import { resolveRoute } from "./router.js";
|
|
17
16
|
const logger = log.logger("appkit/model-gateway/smart-router");
|
|
18
17
|
const ROUTE_CACHE_NAMESPACE = "model-gateway-smart-router";
|
|
@@ -21,7 +20,6 @@ const PROBE_CACHE_NAMESPACE = "model-gateway-smart-router-probe";
|
|
|
21
20
|
const PROBE_CACHE_VERSION = 1;
|
|
22
21
|
const PROBE_TASK = "Check whether Smart Router can select an available model.";
|
|
23
22
|
const NEGATIVE_PROBE_TTL_MS = 30_000;
|
|
24
|
-
const CONTEXT_ENCODING = new Tiktoken(o200kBase);
|
|
25
23
|
/** Defaults shared by gateway, Mastra, and CLI Smart Router callers. */
|
|
26
24
|
export const SMART_ROUTER_DEFAULT_SETTINGS = Object.freeze({
|
|
27
25
|
contextTokenBudget: 4_096,
|
|
@@ -96,7 +94,7 @@ export class SmartRouterService {
|
|
|
96
94
|
}
|
|
97
95
|
/** Select one offered route for arbitrary input content. */
|
|
98
96
|
async select(input, candidates, options = {}) {
|
|
99
|
-
const task = this.context.build(input);
|
|
97
|
+
const task = await this.context.build(input);
|
|
100
98
|
if (!task)
|
|
101
99
|
throw new SmartRouterError(400, "Smart Router input contains no routable text");
|
|
102
100
|
const client = options.client ?? getExecutionContext().client;
|
|
@@ -281,18 +279,12 @@ export class SmartRouterContextBuilder {
|
|
|
281
279
|
this.tokenBudget = tokenBudget;
|
|
282
280
|
}
|
|
283
281
|
/** Return only the bounded task prompt required by routes:select. */
|
|
284
|
-
build(input) {
|
|
285
|
-
return this.analyze(input).task;
|
|
282
|
+
async build(input) {
|
|
283
|
+
return (await this.analyze(input)).task;
|
|
286
284
|
}
|
|
287
285
|
/** Return bounded task text plus logical-turn metadata used for pinning. */
|
|
288
286
|
analyze(input) {
|
|
289
|
-
|
|
290
|
-
const events = conversationEvents(normalized);
|
|
291
|
-
if (events.length > 0)
|
|
292
|
-
return contextFromEvents(events, this.tokenBudget);
|
|
293
|
-
const values = collectTaskStrings(normalized);
|
|
294
|
-
const task = truncateText(values.join("\n"), this.tokenBudget, "start");
|
|
295
|
-
return { task, logicalTurn: task, continuation: false };
|
|
287
|
+
return normalizeModelContext(input, { tokenLimit: this.tokenBudget });
|
|
296
288
|
}
|
|
297
289
|
}
|
|
298
290
|
/** Smart Router orchestration shared by Responses, Chat Completions, and Messages. */
|
|
@@ -323,7 +315,7 @@ export class SmartModelRouter {
|
|
|
323
315
|
if (candidates.length === 0) {
|
|
324
316
|
throw new SmartRouterError(400, "No compatible system models are available to Databricks Smart Router");
|
|
325
317
|
}
|
|
326
|
-
const context = this.service.context.analyze(input.body);
|
|
318
|
+
const context = await this.service.context.analyze(input.body);
|
|
327
319
|
if (!context.task) {
|
|
328
320
|
throw new SmartRouterError(400, "Smart Router request contains no task text");
|
|
329
321
|
}
|
|
@@ -459,166 +451,6 @@ function requestedReasoningEffort(body) {
|
|
|
459
451
|
}
|
|
460
452
|
return parsed.data;
|
|
461
453
|
}
|
|
462
|
-
function contextFromEvents(events, tokenBudget) {
|
|
463
|
-
const latestUserIndex = lastEventIndex(events, "user");
|
|
464
|
-
const taskEvent = latestUserIndex >= 0 ? events[latestUserIndex] : events.at(-1);
|
|
465
|
-
const task = truncateText(taskEvent?.text ?? "", tokenBudget, "start");
|
|
466
|
-
let remaining = Math.max(0, tokenBudget - countTokens(task));
|
|
467
|
-
const context = [];
|
|
468
|
-
for (let index = (taskEvent ? events.indexOf(taskEvent) : events.length) - 1; index >= 0; index -= 1) {
|
|
469
|
-
const event = events[index];
|
|
470
|
-
if (!event || !event.text || event.role === "tool")
|
|
471
|
-
continue;
|
|
472
|
-
const value = `${event.role}: ${event.text}`;
|
|
473
|
-
const retained = truncateText(value, remaining, "end");
|
|
474
|
-
if (!retained)
|
|
475
|
-
break;
|
|
476
|
-
context.unshift(retained);
|
|
477
|
-
remaining -= countTokens(retained);
|
|
478
|
-
}
|
|
479
|
-
const combined = [...context, task].filter(Boolean).join("\n");
|
|
480
|
-
const logicalEvents = latestUserIndex >= 0 ? events.slice(0, latestUserIndex + 1) : events;
|
|
481
|
-
return {
|
|
482
|
-
task: combined,
|
|
483
|
-
logicalTurn: logicalEvents.map((event) => `${event.role}:${event.text}`).join("\n"),
|
|
484
|
-
continuation: latestUserIndex >= 0 &&
|
|
485
|
-
events.slice(latestUserIndex + 1).some((event) => event.role !== "system"),
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
function conversationEvents(input) {
|
|
489
|
-
if (typeof input === "string")
|
|
490
|
-
return input.trim() ? [{ role: "user", text: input.trim() }] : [];
|
|
491
|
-
if (Array.isArray(input))
|
|
492
|
-
return input.flatMap(messageEvent);
|
|
493
|
-
if (!isRecord(input))
|
|
494
|
-
return [];
|
|
495
|
-
for (const key of ["messages", "input"]) {
|
|
496
|
-
const value = input[key];
|
|
497
|
-
if (typeof value === "string" && value.trim())
|
|
498
|
-
return [{ role: "user", text: value.trim() }];
|
|
499
|
-
if (Array.isArray(value)) {
|
|
500
|
-
const events = value.flatMap(messageEvent);
|
|
501
|
-
if (events.length > 0)
|
|
502
|
-
return events;
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
return [];
|
|
506
|
-
}
|
|
507
|
-
function messageEvent(value) {
|
|
508
|
-
if (typeof value === "string")
|
|
509
|
-
return value.trim() ? [{ role: "user", text: value.trim() }] : [];
|
|
510
|
-
if (!isRecord(value))
|
|
511
|
-
return [];
|
|
512
|
-
const role = messageRole(value);
|
|
513
|
-
if (!role)
|
|
514
|
-
return [];
|
|
515
|
-
const text = contentText(value.content ?? value.text ?? value.input_text ?? value.output_text);
|
|
516
|
-
return text ? [{ role, text }] : [];
|
|
517
|
-
}
|
|
518
|
-
function messageRole(value) {
|
|
519
|
-
if (value.role === "user" || value.role === "assistant" || value.role === "system") {
|
|
520
|
-
return value.role;
|
|
521
|
-
}
|
|
522
|
-
if (value.role === "tool" ||
|
|
523
|
-
value.type === "function_call_output" ||
|
|
524
|
-
value.type === "tool_result") {
|
|
525
|
-
return "tool";
|
|
526
|
-
}
|
|
527
|
-
if (value.type === "function_call" || value.type === "reasoning")
|
|
528
|
-
return "assistant";
|
|
529
|
-
if (value.type === "message" && value.role === undefined)
|
|
530
|
-
return "user";
|
|
531
|
-
return undefined;
|
|
532
|
-
}
|
|
533
|
-
function contentText(value) {
|
|
534
|
-
if (typeof value === "string")
|
|
535
|
-
return value.trim();
|
|
536
|
-
if (Array.isArray(value))
|
|
537
|
-
return value.map(contentText).filter(Boolean).join("\n");
|
|
538
|
-
if (!isRecord(value))
|
|
539
|
-
return "";
|
|
540
|
-
for (const key of ["text", "input_text", "output_text", "content"]) {
|
|
541
|
-
const text = contentText(value[key]);
|
|
542
|
-
if (text)
|
|
543
|
-
return text;
|
|
544
|
-
}
|
|
545
|
-
return "";
|
|
546
|
-
}
|
|
547
|
-
const TASK_KEYS = [
|
|
548
|
-
"prompt",
|
|
549
|
-
"task",
|
|
550
|
-
"query",
|
|
551
|
-
"question",
|
|
552
|
-
"request",
|
|
553
|
-
"description",
|
|
554
|
-
"message",
|
|
555
|
-
"text",
|
|
556
|
-
"input",
|
|
557
|
-
];
|
|
558
|
-
const IGNORED_KEYS = new Set([
|
|
559
|
-
"api_key",
|
|
560
|
-
"authorization",
|
|
561
|
-
"arguments",
|
|
562
|
-
"credentials",
|
|
563
|
-
"headers",
|
|
564
|
-
"metadata",
|
|
565
|
-
"password",
|
|
566
|
-
"secret",
|
|
567
|
-
"token",
|
|
568
|
-
"tools",
|
|
569
|
-
]);
|
|
570
|
-
function collectTaskStrings(input) {
|
|
571
|
-
if (typeof input === "string")
|
|
572
|
-
return input.trim() ? [input.trim()] : [];
|
|
573
|
-
const preferred = [];
|
|
574
|
-
if (isRecord(input)) {
|
|
575
|
-
for (const key of TASK_KEYS)
|
|
576
|
-
preferred.push(...stringLeaves(input[key], key, 0));
|
|
577
|
-
}
|
|
578
|
-
return preferred.length > 0 ? preferred.slice(0, 32) : stringLeaves(input, "", 0).slice(0, 32);
|
|
579
|
-
}
|
|
580
|
-
function stringLeaves(value, key, depth) {
|
|
581
|
-
if (depth > 6 || IGNORED_KEYS.has(key.toLowerCase()))
|
|
582
|
-
return [];
|
|
583
|
-
if (typeof value === "string")
|
|
584
|
-
return value.trim() ? [value.trim()] : [];
|
|
585
|
-
if (Array.isArray(value))
|
|
586
|
-
return value.flatMap((item) => stringLeaves(item, key, depth + 1));
|
|
587
|
-
if (!isRecord(value))
|
|
588
|
-
return [];
|
|
589
|
-
return Object.entries(value).flatMap(([childKey, child]) => stringLeaves(child, childKey, depth + 1));
|
|
590
|
-
}
|
|
591
|
-
function parseJsonString(input) {
|
|
592
|
-
if (typeof input !== "string")
|
|
593
|
-
return input;
|
|
594
|
-
const trimmed = input.trim();
|
|
595
|
-
if (!trimmed || (!trimmed.startsWith("{") && !trimmed.startsWith("[")))
|
|
596
|
-
return input;
|
|
597
|
-
try {
|
|
598
|
-
return JSON.parse(trimmed);
|
|
599
|
-
}
|
|
600
|
-
catch {
|
|
601
|
-
return input;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
function countTokens(text) {
|
|
605
|
-
return CONTEXT_ENCODING.encode(text, [], []).length;
|
|
606
|
-
}
|
|
607
|
-
function truncateText(text, tokenBudget, edge) {
|
|
608
|
-
if (tokenBudget <= 0 || !text)
|
|
609
|
-
return "";
|
|
610
|
-
const tokens = CONTEXT_ENCODING.encode(text, [], []);
|
|
611
|
-
if (tokens.length <= tokenBudget)
|
|
612
|
-
return text;
|
|
613
|
-
return CONTEXT_ENCODING.decode(edge === "start" ? tokens.slice(0, tokenBudget) : tokens.slice(-tokenBudget));
|
|
614
|
-
}
|
|
615
|
-
function lastEventIndex(events, role) {
|
|
616
|
-
for (let index = events.length - 1; index >= 0; index -= 1) {
|
|
617
|
-
if (events[index]?.role === role)
|
|
618
|
-
return index;
|
|
619
|
-
}
|
|
620
|
-
return -1;
|
|
621
|
-
}
|
|
622
454
|
function uniqueCandidates(candidates) {
|
|
623
455
|
const seen = new Set();
|
|
624
456
|
return candidates.filter((candidate) => {
|
|
@@ -697,4 +529,4 @@ async function invokeSmartRouter(client, body, signal, timeoutMs) {
|
|
|
697
529
|
}
|
|
698
530
|
return response.json();
|
|
699
531
|
}
|
|
700
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtcm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NtYXJ0LXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUF3QixNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLDRCQUE0QixFQUM1Qix3QkFBd0IsRUFDeEIseUJBQXlCLEdBTzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sU0FBUyxNQUFNLDhCQUE4QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFFeEIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDL0QsTUFBTSxxQkFBcUIsR0FBRyw0QkFBNEIsQ0FBQztBQUMzRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDO0FBQ2pFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sVUFBVSxHQUFH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TUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQzFCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsT0FBTztZQUNQLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztZQUMxQixNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQixNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDNUUsTUFBTSxJQUFJLGdCQUFnQixDQUN4QixRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQ25DLDRDQUE0QyxRQUFRLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQzVGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBTbWFydCBSb3V0ZXIgdHJhbnNwb3J0LCBjb250ZXh0IGNvbnN0cnVjdGlvbiwgcHJvYmluZywgYW5kIHR1cm4gcGlubmluZy5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgQ2FjaGVNYW5hZ2VyLCBnZXRFeGVjdXRpb25Db250ZXh0LCB0eXBlIFdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGNsb3NlQ2FjaGUsIGNyZWF0ZUNhY2hlLCBnZXRPclNldCB9IGZyb20gXCJAZGJ4LXRvb2xzL2NhY2hlXCI7XG5pbXBvcnQgeyByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24gfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBpc1JlY29yZCwgbG9nLCB0b0Vycm9yIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IFJlYXNvbmluZ0VmZm9ydFNjaGVtYSwgdHlwZSBSZWFzb25pbmdFZmZvcnQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWxcIjtcbmltcG9ydCB7XG4gIFNNQVJUX1JPVVRFUl9OQU1FLFxuICBTbWFydFJvdXRlck9ic2VydmF0aW9uU2NoZW1hLFxuICBTbWFydFJvdXRlclJlcXVlc3RTY2hlbWEsXG4gIFNtYXJ0Um91dGVyUmVzcG9uc2VTY2hlbWEsXG4gIHR5cGUgQ2xpZW50UHJvdG9jb2wsXG4gIHR5cGUgTW9kZWxUYXJnZXQsXG4gIHR5cGUgUmVxdWVzdGVkRmVhdHVyZXMsXG4gIHR5cGUgU21hcnRSb3V0ZXJIYXJuZXNzLFxuICB0eXBlIFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24sXG4gIHR5cGUgU21hcnRSb3V0ZXJSZXF1ZXN0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbW9kZWwtZ2F0ZXdheVwiO1xuaW1wb3J0IHsgVGlrdG9rZW4gfSBmcm9tIFwianMtdGlrdG9rZW4vbGl0ZVwiO1xuaW1wb3J0IG8yMDBrQmFzZSBmcm9tIFwianMtdGlrdG9rZW4vcmFua3MvbzIwMGtfYmFzZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHsgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9zbWFydC1yb3V0ZXJcIik7XG5jb25zdCBST1VURV9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1vZGVsLWdhdGV3YXktc21hcnQtcm91dGVyXCI7XG5jb25zdCBST1VURV9QT0xJQ1lfVkVSU0lPTiA9IDE7XG5jb25zdCBQUk9CRV9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1vZGVsLWdhdGV3YXktc21hcnQtcm91dGVyLXByb2JlXCI7XG5jb25zdCBQUk9CRV9DQUNIRV9WRVJTSU9OID0gMTtcbmNvbnN0IFBST0JFX1RBU0sgPSBcIkNoZWNrIHdoZXRoZXIgU21hcnQgUm91dGVyIGNhbiBzZWxlY3QgYW4gYXZhaWxhYmxlIG1vZGVsLlwiO1xuY29uc3QgTkVHQVRJVkVfUFJPQkVfVFRMX01TID0gMzBfMDAwO1xuY29uc3QgQ09OVEVYVF9FTkNPRElORyA9IG5ldyBUaWt0b2tlbihvMjAwa0Jhc2UpO1xuXG4vKiogUnVudGltZSBzZXR0aW5ncyBmb3IgU21hcnQgUm91dGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNldHRpbmdzIHtcbiAgcmVhZG9ubHkgY29udGV4dFRva2VuQnVkZ2V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHByb2JlUmVmcmVzaEludGVydmFsTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcHJvYmVUdGxNczogbnVtYmVyO1xuICByZWFkb25seSByb3V0ZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm91dGVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHRzIHNoYXJlZCBieSBnYXRld2F5LCBNYXN0cmEsIGFuZCBDTEkgU21hcnQgUm91dGVyIGNhbGxlcnMuICovXG5leHBvcnQgY29uc3QgU01BUlRfUk9VVEVSX0RFRkFVTFRfU0VUVElOR1M6IFNtYXJ0Um91dGVyU2V0dGluZ3MgPSBPYmplY3QuZnJlZXplKHtcbiAgY29udGV4dFRva2VuQnVkZ2V0OiA0XzA5NixcbiAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczogM182MDBfMDAwLFxuICBwcm9iZVR0bE1zOiAzMDBfMDAwLFxuICByb3V0ZVR0bFNlY29uZHM6IDIxXzYwMCxcbiAgcm91dGVyTmFtZTogU01BUlRfUk9VVEVSX05BTUUsXG4gIHRpbWVvdXRNczogMTBfMDAwLFxufSk7XG5cbi8qKiBPbmUgcm91dGUgb3B0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGVyLW93bmVkIHZhbHVlIGl0IHJlcHJlc2VudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+IHtcbiAgcmVhZG9ubHkgaGFybmVzczogU21hcnRSb3V0ZXJIYXJuZXNzO1xuICByZWFkb25seSBtb2RlbDogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogVDtcbn1cblxuLyoqIFJlc3VsdCByZXR1cm5lZCBhZnRlciBtYXBwaW5nIGEgRGF0YWJyaWNrcyByb3V0ZSBiYWNrIHRvIGEgY2FsbGVyLW93bmVkIHZhbHVlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNlbGVjdGlvbjxUPiB7XG4gIHJlYWRvbmx5IGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcztcbiAgcmVhZG9ubHkgbGF0ZW5jeU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhcmFtcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmVhZG9ubHkgcmF0aW9uYWxlPzogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZU1vZGVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdXRlck5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8qKiBQb3J0YWJsZSBwZXJzaXN0ZW5jZSBzdXJmYWNlIGZvciBhIHBpbm5lZCBTbWFydCBSb3V0ZXIgdHVybi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU21hcnRSb3V0ZXJTdG9yZSB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24sIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjb25zdCBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBlbmFibGVkOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIGxpdmUgU21hcnQgUm91dGVyIHByb2JlIHN1Y2NlZWRlZC5cIiksXG4gICAgZXhwaXJlc0F0OiB6Lm51bWJlcigpLmludCgpLmRlc2NyaWJlKFwiRXBvY2ggbWlsbGlzZWNvbmRzIHdoZW4gdGhpcyBwcm9iZSBiZWNvbWVzIHN0YWxlLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiUGVyc2lzdGVkIFNtYXJ0IFJvdXRlciBjYXBhYmlsaXR5IHByb2JlIHJlc3VsdC5cIik7XG5cbmV4cG9ydCB0eXBlIFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQgPSB6LmluZmVyPHR5cGVvZiBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hPjtcblxuLyoqIE9wdGlvbmFsIHBlcnNpc3RlbnQgY2FjaGUgZm9yIGNhcGFiaWxpdHkgcHJvYmVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclByb2JlU3RvcmUge1xuICBnZXQoa2V5OiBzdHJpbmcsIGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTx1bmtub3duPjtcbiAgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBTbWFydFJvdXRlclByb2JlUmVjb3JkLFxuICAgIHR0bFNlY29uZHM6IG51bWJlcixcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIFJlc3VsdCBhcHBsaWVkIHRvIG9uZSBjb25jcmV0ZSBnYXRld2F5IHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Um91dGVyUmVzdWx0IHtcbiAgcmVhZG9ubHkgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICByZWFkb25seSBvYnNlcnZhdGlvbjogU21hcnRSb3V0ZXJPYnNlcnZhdGlvbjtcbiAgcmVhZG9ubHkgdGFyZ2V0OiBNb2RlbFRhcmdldDtcbn1cblxuLyoqIEJvdW5kZWQgdGFzayBjb250ZXh0IGV4dHJhY3RlZCBmcm9tIGFuIGFyYml0cmFyeSBzdXBwb3J0ZWQgaW5wdXQgc2hhcGUuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Um91dGVyQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNvbnRpbnVhdGlvbjogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9naWNhbFR1cm46IHN0cmluZztcbiAgcmVhZG9ubHkgdGFzazogc3RyaW5nO1xufVxuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgZm9yIFNtYXJ0IFJvdXRlciB2YWxpZGF0aW9uIG9yIGF2YWlsYWJpbGl0eSBmYWlsdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBTbWFydFJvdXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiU21hcnRSb3V0ZXJFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQgY2FjaGUgYWRhcHRlcjsgY29uZmlndXJlZCBMYWtlYmFzZS9Qb3N0Z3JlcyBzdG9yYWdlIHJlbWFpbnMgQXBwS2l0LW93bmVkLiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdFNtYXJ0Um91dGVyU3RvcmUgaW1wbGVtZW50cyBTbWFydFJvdXRlclN0b3JlIHtcbiAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KGNhY2hlLmdlbmVyYXRlS2V5KFtST1VURV9DQUNIRV9OQU1FU1BBQ0UsIFJPVVRFX1BPTElDWV9WRVJTSU9OXSwga2V5KSk7XG4gIH1cblxuICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLCB0dGxTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYWNoZSA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGNhY2hlLnNldChjYWNoZS5nZW5lcmF0ZUtleShbUk9VVEVfQ0FDSEVfTkFNRVNQQUNFLCBST1VURV9QT0xJQ1lfVkVSU0lPTl0sIGtleSksIHZhbHVlLCB7XG4gICAgICB0dGw6IHR0bFNlY29uZHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEFwcEtpdCBjYWNoZSBhZGFwdGVyIGZvciBwcm9jZXNzLSBhbmQgcGVyc2lzdGVuY2UtYmFja2VkIGNhcGFiaWxpdHkgcHJvYmVzLiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSBpbXBsZW1lbnRzIFNtYXJ0Um91dGVyUHJvYmVTdG9yZSB7XG4gIGFzeW5jIGdldChrZXk6IHN0cmluZywgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZSA9IGFwcEtpdENhY2hlTWFuYWdlcigpO1xuICAgIGlmICghY2FjaGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBzbWFydFJvdXRlclByb2JlSWRlbnRpdHkoY2xpZW50KTtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KFxuICAgICAgY2FjaGUuZ2VuZXJhdGVLZXkoW1BST0JFX0NBQ0hFX05BTUVTUEFDRSwgUFJPQkVfQ0FDSEVfVkVSU0lPTl0sIGAke2lkZW50aXR5fToke2tleX1gKSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBTbWFydFJvdXRlclByb2JlUmVjb3JkLFxuICAgIHR0bFNlY29uZHM6IG51bWJlcixcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhcHBLaXRDYWNoZU1hbmFnZXIoKTtcbiAgICBpZiAoIWNhY2hlKSByZXR1cm47XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBzbWFydFJvdXRlclByb2JlSWRlbnRpdHkoY2xpZW50KTtcbiAgICBhd2FpdCBjYWNoZS5zZXQoXG4gICAgICBjYWNoZS5nZW5lcmF0ZUtleShbUFJPQkVfQ0FDSEVfTkFNRVNQQUNFLCBQUk9CRV9DQUNIRV9WRVJTSU9OXSwgYCR7aWRlbnRpdHl9OiR7a2V5fWApLFxuICAgICAgdmFsdWUsXG4gICAgICB7IHR0bDogdHRsU2Vjb25kcyB9LFxuICAgICk7XG4gIH1cbn1cblxudHlwZSBTbWFydFJvdXRlclByb2JlQ2FjaGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDYWNoZT47XG5cbi8qKiBPcHRpb25hbCBpZGVudGl0eSBhbmQgY2FuY2VsbGF0aW9uIGlucHV0cyBmb3Igb25lIFNtYXJ0IFJvdXRlciBjYWxsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMge1xuICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG50eXBlIFNtYXJ0Um91dGVySW52b2tlciA9IChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJlcXVlc3Q6IFNtYXJ0Um91dGVyUmVxdWVzdCxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbi8qKlxuICogRGVkaWNhdGVkIFNtYXJ0IFJvdXRlciBzZXJ2aWNlIGZvciBzdHJpbmdzLCByZXF1ZXN0IG9iamVjdHMsIG1lc3NhZ2UgYXJyYXlzLFxuICogYW5kIGdlbmVyaWMgSlNPTi1saWtlIGlucHV0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNtYXJ0Um91dGVyU2VydmljZSB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFNtYXJ0Um91dGVyQ29udGV4dEJ1aWxkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IFNtYXJ0Um91dGVyU2V0dGluZ3M7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTbWFydFJvdXRlclByb2JlQ2FjaGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVLZXlzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9iZUNhY2hlcyA9IG5ldyBTZXQ8U21hcnRSb3V0ZXJQcm9iZUNhY2hlPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFNtYXJ0Um91dGVyU2V0dGluZ3M+ID0ge30sXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnZva2U6IFNtYXJ0Um91dGVySW52b2tlciA9IGludm9rZVNtYXJ0Um91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVTdG9yZTogU21hcnRSb3V0ZXJQcm9iZVN0b3JlID0gbmV3IEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSgpLFxuICApIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi5TTUFSVF9ST1VURVJfREVGQVVMVF9TRVRUSU5HUywgLi4uc2V0dGluZ3MgfTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXcgU21hcnRSb3V0ZXJDb250ZXh0QnVpbGRlcih0aGlzLnNldHRpbmdzLmNvbnRleHRUb2tlbkJ1ZGdldCk7XG4gIH1cblxuICAvKiogU2VsZWN0IG9uZSBvZmZlcmVkIHJvdXRlIGZvciBhcmJpdHJhcnkgaW5wdXQgY29udGVudC4gKi9cbiAgYXN5bmMgc2VsZWN0PFQ+KFxuICAgIGlucHV0OiB1bmtub3duLFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgb3B0aW9uczogU21hcnRSb3V0ZXJTZWxlY3RPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJTZWxlY3Rpb248VD4+IHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy5jb250ZXh0LmJ1aWxkKGlucHV0KTtcbiAgICBpZiAoIXRhc2spIHRocm93IG5ldyBTbWFydFJvdXRlckVycm9yKDQwMCwgXCJTbWFydCBSb3V0ZXIgaW5wdXQgY29udGFpbnMgbm8gcm91dGFibGUgdGV4dFwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBvcHRpb25zLmNsaWVudCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBhd2FpdCB0aGlzLnNlbGVjdFRhc2sodGFzaywgY2FuZGlkYXRlcywgeyAuLi5vcHRpb25zLCBjbGllbnQgfSk7XG4gICAgICB0aGlzLnNldFByb2JlVmFsdWUoY2FuZGlkYXRlcywgY2xpZW50LCB0cnVlKTtcbiAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0UHJvYmVVbmF2YWlsYWJsZShjYW5kaWRhdGVzLCBjbGllbnQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJldHVybiBhIG1lbW9pemVkIGxpdmUgY2FwYWJpbGl0eSBwcm9iZSBmb3IgdGhlIGFjdGl2ZSBpZGVudGl0eSBhbmQgY2FuZGlkYXRlIG1lbnUuICovXG4gIGFzeW5jIGlzRW5hYmxlZDxUPihcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGlmIChvZmZlcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5wcm9iZUNhY2hlKGNsaWVudCk7XG4gICAgY29uc3Qga2V5ID0gcHJvYmVLZXkob2ZmZXJlZCwgdGhpcy5zZXR0aW5ncy5yb3V0ZXJOYW1lKTtcbiAgICB0aGlzLnJlbWVtYmVyUHJvYmVLZXkoY2xpZW50LCBrZXkpO1xuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgZ2V0T3JTZXQoY2FjaGUsIGtleSwgKCkgPT4gdGhpcy5sb2FkUHJvYmUoa2V5LCBvZmZlcmVkLCBjbGllbnQpLCB7XG4gICAgICB0dGw6IHRoaXMucHJvYmVDYWNoZVR0bE1zKCksXG4gICAgICByZWZyZXNoQWZ0ZXJXcml0ZTogKHZhbHVlKSA9PiB0aGlzLnByb2JlUmVmcmVzaEFmdGVyV3JpdGUodmFsdWUuZW5hYmxlZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHByb2JlPy5lbmFibGVkID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqIFN0b3AgcHJvY2Vzcy1sb2NhbCBwcm9iZSBjYWNoZXMgYWZ0ZXIgdGhlaXIgYWN0aXZlIHJlZnJlc2hlcyBzZXR0bGUuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWNoZSBvZiB0aGlzLnByb2JlQ2FjaGVzKSB2b2lkIGNsb3NlQ2FjaGUoY2FjaGUpO1xuICAgIHRoaXMucHJvYmVDYWNoZXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFByb2JlPFQ+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJQcm9iZVJlY29yZD4ge1xuICAgIGNvbnN0IHN0b3JlZCA9IGF3YWl0IHRoaXMucmVhZFN0b3JlZFByb2JlKGtleSwgY2xpZW50KTtcbiAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC5leHBpcmVzQXQgPiBEYXRlLm5vdygpKSByZXR1cm4gc3RvcmVkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9iZShrZXksIGNhbmRpZGF0ZXMsIGNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVQcm9iZTxUPihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICApOiBQcm9taXNlPFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQ+IHtcbiAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgdGhpcy5zZWxlY3RUYXNrKFBST0JFX1RBU0ssIGNhbmRpZGF0ZXMsIHsgY2xpZW50IH0pXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTbWFydCBSb3V0ZXIgY2FwYWJpbGl0eSBwcm9iZSB1bmF2YWlsYWJsZVwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgY29uc3QgcHJvYmUgPSB0aGlzLnByb2JlUmVjb3JkKGVuYWJsZWQpO1xuICAgIHZvaWQgdGhpcy53cml0ZVN0b3JlZFByb2JlKGtleSwgcHJvYmUsIGNsaWVudCk7XG4gICAgcmV0dXJuIHByb2JlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9iZVZhbHVlPFQ+KFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2ZmZXJlZCA9IHVuaXF1ZUNhbmRpZGF0ZXMoY2FuZGlkYXRlcyk7XG4gICAgaWYgKG9mZmVyZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnByb2JlQ2FjaGUoY2xpZW50KTtcbiAgICBjb25zdCBrZXkgPSBwcm9iZUtleShvZmZlcmVkLCB0aGlzLnNldHRpbmdzLnJvdXRlck5hbWUpO1xuICAgIHRoaXMucmVtZW1iZXJQcm9iZUtleShjbGllbnQsIGtleSk7XG4gICAgY29uc3QgcHJvYmUgPSB0aGlzLnByb2JlUmVjb3JkKGVuYWJsZWQpO1xuICAgIHZvaWQgdGhpcy53cml0ZVByb2Nlc3NQcm9iZShjYWNoZSwga2V5LCBwcm9iZSk7XG4gICAgdm9pZCB0aGlzLndyaXRlU3RvcmVkUHJvYmUoa2V5LCBwcm9iZSwgY2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvYmVVbmF2YWlsYWJsZTxUPihcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMucHJvYmVDYWNoZShjbGllbnQpO1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEtleSA9IHByb2JlS2V5KG9mZmVyZWQsIHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSk7XG4gICAgdGhpcy5yZW1lbWJlclByb2JlS2V5KGNsaWVudCwgcmVxdWVzdGVkS2V5KTtcbiAgICBjb25zdCBrZXlzID0gdGhpcy5wcm9iZUtleXMuZ2V0KGNsaWVudC5jb25maWcgYXMgb2JqZWN0KSA/PyBuZXcgU2V0KFtyZXF1ZXN0ZWRLZXldKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBwcm9iZSA9IHRoaXMucHJvYmVSZWNvcmQoZmFsc2UpO1xuICAgICAgdm9pZCB0aGlzLndyaXRlUHJvY2Vzc1Byb2JlKGNhY2hlLCBrZXksIHByb2JlKTtcbiAgICAgIHZvaWQgdGhpcy53cml0ZVN0b3JlZFByb2JlKGtleSwgcHJvYmUsIGNsaWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVJlY29yZChlbmFibGVkOiBib29sZWFuKTogU21hcnRSb3V0ZXJQcm9iZVJlY29yZCB7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCwgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdGhpcy5wcm9iZVR0bChlbmFibGVkKSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkUHJvYmUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJQcm9iZVJlY29yZCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hLnNhZmVQYXJzZShhd2FpdCB0aGlzLnByb2JlU3RvcmUuZ2V0KGtleSwgY2xpZW50KSk7XG4gICAgICByZXR1cm4gcGFyc2VkLnN1Y2Nlc3MgPyBwYXJzZWQuZGF0YSA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiU21hcnQgUm91dGVyIHByb2JlIGNhY2hlIHJlYWQgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlUHJvY2Vzc1Byb2JlKFxuICAgIGNhY2hlOiBTbWFydFJvdXRlclByb2JlQ2FjaGUsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcHJvYmU6IFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWNoZS5zZXQoa2V5LCBwcm9iZSwgeyB0dGw6IHRoaXMucHJvYmVDYWNoZVR0bE1zKCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNtYXJ0IFJvdXRlciBwcm9jZXNzIHByb2JlIGNhY2hlIHdyaXRlIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlU3RvcmVkUHJvYmUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcHJvYmU6IFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQsXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2JlU3RvcmUuc2V0KFxuICAgICAgICBrZXksXG4gICAgICAgIHByb2JlLFxuICAgICAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5wcm9iZUNhY2hlVHRsTXMoKSAvIDFfMDAwKSksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNtYXJ0IFJvdXRlciBwcm9iZSBjYWNoZSB3cml0ZSBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZUNhY2hlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogU21hcnRSb3V0ZXJQcm9iZUNhY2hlIHtcbiAgICBjb25zdCBvd25lciA9IGNsaWVudC5jb25maWcgYXMgb2JqZWN0O1xuICAgIGxldCBjYWNoZSA9IHRoaXMucHJvYmVzLmdldChvd25lcik7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY2FjaGUgPSBjcmVhdGVDYWNoZSh7IG1heEVudHJpZXM6IDMyLCB1c2VDbG9uZTogZmFsc2UgfSk7XG4gICAgICB0aGlzLnByb2Jlcy5zZXQob3duZXIsIGNhY2hlKTtcbiAgICAgIHRoaXMucHJvYmVDYWNoZXMuYWRkKGNhY2hlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlclByb2JlS2V5KGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyID0gY2xpZW50LmNvbmZpZyBhcyBvYmplY3Q7XG4gICAgbGV0IGtleXMgPSB0aGlzLnByb2JlS2V5cy5nZXQob3duZXIpO1xuICAgIGlmICgha2V5cykge1xuICAgICAga2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMucHJvYmVLZXlzLnNldChvd25lciwga2V5cyk7XG4gICAgfVxuICAgIGtleXMuYWRkKGtleSk7XG4gIH1cblxuICBwcml2YXRlIHByb2JlQ2FjaGVUdGxNcygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnNldHRpbmdzLnByb2JlUmVmcmVzaEludGVydmFsTXMsIHRoaXMuc2V0dGluZ3MucHJvYmVUdGxNcykgKiAyO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVR0bChlbmFibGVkOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZW5hYmxlZFxuICAgICAgPyB0aGlzLnNldHRpbmdzLnByb2JlVHRsTXNcbiAgICAgIDogTWF0aC5taW4odGhpcy5zZXR0aW5ncy5wcm9iZVR0bE1zLCBORUdBVElWRV9QUk9CRV9UVExfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVJlZnJlc2hBZnRlcldyaXRlKGVuYWJsZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnNldHRpbmdzLnByb2JlUmVmcmVzaEludGVydmFsTXMsIHRoaXMucHJvYmVUdGwoZW5hYmxlZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUYXNrPFQ+KFxuICAgIHRhc2s6IHN0cmluZyxcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIG9wdGlvbnM6IFNtYXJ0Um91dGVyU2VsZWN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTbWFydFJvdXRlclNlbGVjdGlvbjxUPj4ge1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGlmIChvZmZlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFNtYXJ0Um91dGVyRXJyb3IoNDAwLCBcIk5vIGNvbXBhdGlibGUgc3lzdGVtIG1vZGVscyBhcmUgYXZhaWxhYmxlIHRvIFNtYXJ0IFJvdXRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IFNtYXJ0Um91dGVyUmVxdWVzdFNjaGVtYS5wYXJzZSh7XG4gICAgICByb3V0ZV9vcHRpb25zOiBvZmZlcmVkLm1hcCgoeyBtb2RlbCwgaGFybmVzcyB9KSA9PiAoeyBtb2RlbCwgaGFybmVzcyB9KSksXG4gICAgICB0YXNrOiB7IHByb21wdDogdGFzayB9LFxuICAgICAgcm91dGVfc2VsZWN0b3I6IHsgcm91dGVyX25hbWU6IHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgPz8gbmV3IEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gU21hcnRSb3V0ZXJSZXNwb25zZVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlKGNsaWVudCwgcmVxdWVzdCwgc2lnbmFsLCB0aGlzLnNldHRpbmdzLnRpbWVvdXRNcyksXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSByZXNwb25zZS5yb3V0ZV9zZWxlY3Rpb25bMF0hO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gb2ZmZXJlZC5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgbm9ybWFsaXplUm91dGVNb2RlbChjYW5kaWRhdGUubW9kZWwpID09PVxuICAgICAgICAgIG5vcm1hbGl6ZVJvdXRlTW9kZWwoc2VsZWN0aW9uLnJvdXRlX29wdGlvbi5tb2RlbCkgJiZcbiAgICAgICAgKCFzZWxlY3Rpb24ucm91dGVfb3B0aW9uLmhhcm5lc3MgfHwgY2FuZGlkYXRlLmhhcm5lc3MgPT09IHNlbGVjdGlvbi5yb3V0ZV9vcHRpb24uaGFybmVzcyksXG4gICAgKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcihcbiAgICAgICAgNTAyLFxuICAgICAgICBgU21hcnQgUm91dGVyIHNlbGVjdGVkIGFuIHVuc3VwcG9ydGVkIG1vZGVsOiAke3NlbGVjdGlvbi5yb3V0ZV9vcHRpb24ubW9kZWx9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogc2VsZWN0ZWQudmFsdWUsXG4gICAgICByb3V0ZU1vZGVsOiBzZWxlY3Rpb24ucm91dGVfb3B0aW9uLm1vZGVsLFxuICAgICAgaGFybmVzczogc2VsZWN0ZWQuaGFybmVzcyxcbiAgICAgIHJvdXRlck5hbWU6IHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSxcbiAgICAgIGxhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIC4uLihyZXNwb25zZS5yYXRpb25hbGUgPyB7IHJhdGlvbmFsZTogcmVzcG9uc2UucmF0aW9uYWxlIH0gOiB7fSksXG4gICAgICAuLi4oc2VsZWN0aW9uLnBhcmFtcyA/IHsgcGFyYW1zOiBzZWxlY3Rpb24ucGFyYW1zIH0gOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQnVpbGQgYSBTbWFydCBSb3V0ZXIgY2FuZGlkYXRlIG1lbnUgZnJvbSB2YWx1ZXMgY2FycnlpbmcgbW9kZWxTZXJ2aWNlTmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbWFydFJvdXRlckNhbmRpZGF0ZXM8VCBleHRlbmRzIHsgcmVhZG9ubHkgbW9kZWxTZXJ2aWNlTmFtZT86IHN0cmluZyB9PihcbiAgdmFsdWVzOiByZWFkb25seSBUW10sXG4gIGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcyxcbik6IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10ge1xuICByZXR1cm4gdmFsdWVzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB2YWx1ZS5tb2RlbFNlcnZpY2VOYW1lPy50cmltKCk7XG4gICAgaWYgKCFtb2RlbCB8fCAhbW9kZWwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwic3lzdGVtLmFpLlwiKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbeyBtb2RlbCwgaGFybmVzcywgdmFsdWUgfV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXh0cmFjdG9yIHNoYXJlZCBieSB0aGUgZ2F0ZXdheSwgTWFzdHJhLCBhbmQgdGhlIGZpbGUvc3RkaW4gQ0xJLlxuICogSXQgZmF2b3JzIGNvbnZlcnNhdGlvbi90YXNrIGZpZWxkcyBhbmQgaWdub3JlcyBjcmVkZW50aWFscywgdG9vbCBzY2hlbWFzLFxuICogYW5kIHRvb2wgYXJndW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU21hcnRSb3V0ZXJDb250ZXh0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9rZW5CdWRnZXQgPSA0XzA5Nikge31cblxuICAvKiogUmV0dXJuIG9ubHkgdGhlIGJvdW5kZWQgdGFzayBwcm9tcHQgcmVxdWlyZWQgYnkgcm91dGVzOnNlbGVjdC4gKi9cbiAgYnVpbGQoaW5wdXQ6IHVua25vd24pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmFuYWx5emUoaW5wdXQpLnRhc2s7XG4gIH1cblxuICAvKiogUmV0dXJuIGJvdW5kZWQgdGFzayB0ZXh0IHBsdXMgbG9naWNhbC10dXJuIG1ldGFkYXRhIHVzZWQgZm9yIHBpbm5pbmcuICovXG4gIGFuYWx5emUoaW5wdXQ6IHVua25vd24pOiBTbWFydFJvdXRlckNvbnRleHQge1xuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSBwYXJzZUpzb25TdHJpbmcoaW5wdXQpO1xuICAgIGNvbnN0IGV2ZW50cyA9IGNvbnZlcnNhdGlvbkV2ZW50cyhub3JtYWxpemVkKTtcbiAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHJldHVybiBjb250ZXh0RnJvbUV2ZW50cyhldmVudHMsIHRoaXMudG9rZW5CdWRnZXQpO1xuICAgIGNvbnN0IHZhbHVlcyA9IGNvbGxlY3RUYXNrU3RyaW5ncyhub3JtYWxpemVkKTtcbiAgICBjb25zdCB0YXNrID0gdHJ1bmNhdGVUZXh0KHZhbHVlcy5qb2luKFwiXFxuXCIpLCB0aGlzLnRva2VuQnVkZ2V0LCBcInN0YXJ0XCIpO1xuICAgIHJldHVybiB7IHRhc2ssIGxvZ2ljYWxUdXJuOiB0YXNrLCBjb250aW51YXRpb246IGZhbHNlIH07XG4gIH1cbn1cblxuLyoqIFNtYXJ0IFJvdXRlciBvcmNoZXN0cmF0aW9uIHNoYXJlZCBieSBSZXNwb25zZXMsIENoYXQgQ29tcGxldGlvbnMsIGFuZCBNZXNzYWdlcy4gKi9cbmV4cG9ydCBjbGFzcyBTbWFydE1vZGVsUm91dGVyIHtcbiAgcmVhZG9ubHkgc2VydmljZTogU21hcnRSb3V0ZXJTZXJ2aWNlO1xuICBwcml2YXRlIHJlYWRvbmx5IHNldHRpbmdzOiBTbWFydFJvdXRlclNldHRpbmdzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFNtYXJ0Um91dGVyU2V0dGluZ3M+ID0ge30sXG4gICAgc2VydmljZTogU21hcnRSb3V0ZXJTZXJ2aWNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmU6IFNtYXJ0Um91dGVyU3RvcmUgPSBuZXcgQXBwS2l0U21hcnRSb3V0ZXJTdG9yZSgpLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50LFxuICApIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi5TTUFSVF9ST1VURVJfREVGQVVMVF9TRVRUSU5HUywgLi4uc2V0dGluZ3MgfTtcbiAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlID8/IG5ldyBTbWFydFJvdXRlclNlcnZpY2UodGhpcy5zZXR0aW5ncyk7XG4gIH1cblxuICAvKiogUHJvYmUgd2hldGhlciBTbWFydCBSb3V0ZXIgaXMgdXNhYmxlIGZvciB0aGUgY3VycmVudCBtb2RlbCBjYXRhbG9ndWUuICovXG4gIGlzRW5hYmxlZCh0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IHNtYXJ0Um91dGVyQ2FuZGlkYXRlcyhcbiAgICAgIHRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+IHRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCAmJiB0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4KSxcbiAgICAgIFwiY29kZXhcIixcbiAgICApO1xuICAgIHJldHVybiB0aGlzLmNsaWVudFxuICAgICAgPyB0aGlzLnNlcnZpY2UuaXNFbmFibGVkKGNhbmRpZGF0ZXMsIHRoaXMuY2xpZW50KVxuICAgICAgOiB0aGlzLnNlcnZpY2UuaXNFbmFibGVkKGNhbmRpZGF0ZXMpO1xuICB9XG5cbiAgLyoqIFJlc29sdmUgb25lIHZpcnR1YWwgc21hcnQtcm91dGVyIHJlcXVlc3QgdG8gYSBjb25jcmV0ZSBjb21wYXRpYmxlIHRhcmdldC4gKi9cbiAgYXN5bmMgcmVzb2x2ZShpbnB1dDoge1xuICAgIHJlYWRvbmx5IGJvZHk6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICByZWFkb25seSBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXM7XG4gICAgcmVhZG9ubHkgaGVhZGVyczogSGVhZGVycztcbiAgICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgcHJvdG9jb2w6IEV4Y2x1ZGU8Q2xpZW50UHJvdG9jb2wsIFwib3BlbmFpLWVtYmVkZGluZ3NcIj47XG4gICAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbDtcbiAgICByZWFkb25seSB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdO1xuICB9KTogUHJvbWlzZTxTbWFydFJvdXRlclJlc3VsdD4ge1xuICAgIGNvbnN0IGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcyA9XG4gICAgICBpbnB1dC5wcm90b2NvbCA9PT0gXCJhbnRocm9waWMtbWVzc2FnZXNcIiA/IFwiY2xhdWRlXCIgOiBcImNvZGV4XCI7XG4gICAgY29uc3QgZXhwbGljaXRSZWFzb25pbmdFZmZvcnQgPSByZXF1ZXN0ZWRSZWFzb25pbmdFZmZvcnQoaW5wdXQuYm9keSk7XG4gICAgY29uc3QgZWxpZ2libGVUYXJnZXRzID0gaW5wdXQudGFyZ2V0cy5maWx0ZXIoKHRhcmdldCkgPT5cbiAgICAgIGlzRWxpZ2libGVUYXJnZXQoXG4gICAgICAgIHRhcmdldCxcbiAgICAgICAgeyAuLi5pbnB1dCwgb3JpZ2luYXRvcjogaW5wdXQuaGVhZGVycy5nZXQoXCJvcmlnaW5hdG9yXCIpID8/IHVuZGVmaW5lZCB9LFxuICAgICAgICBleHBsaWNpdFJlYXNvbmluZ0VmZm9ydCxcbiAgICAgICAgaGFybmVzcyxcbiAgICAgICksXG4gICAgKTtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gc21hcnRSb3V0ZXJDYW5kaWRhdGVzKGVsaWdpYmxlVGFyZ2V0cywgaGFybmVzcyk7XG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcihcbiAgICAgICAgNDAwLFxuICAgICAgICBcIk5vIGNvbXBhdGlibGUgc3lzdGVtIG1vZGVscyBhcmUgYXZhaWxhYmxlIHRvIERhdGFicmlja3MgU21hcnQgUm91dGVyXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnNlcnZpY2UuY29udGV4dC5hbmFseXplKGlucHV0LmJvZHkpO1xuICAgIGlmICghY29udGV4dC50YXNrKSB7XG4gICAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcig0MDAsIFwiU21hcnQgUm91dGVyIHJlcXVlc3QgY29udGFpbnMgbm8gdGFzayB0ZXh0XCIpO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBzbWFydFJvdXRlclR1cm5LZXkoY29udGV4dC5sb2dpY2FsVHVybiwgY2FuZGlkYXRlcywge1xuICAgICAgaGFybmVzcyxcbiAgICAgIHByb3RvY29sOiBpbnB1dC5wcm90b2NvbCxcbiAgICAgIGZlYXR1cmVzOiBpbnB1dC5mZWF0dXJlcyxcbiAgICAgIC4uLihleHBsaWNpdFJlYXNvbmluZ0VmZm9ydCA/IHsgZXhwbGljaXRSZWFzb25pbmdFZmZvcnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBjYWNoZWQgPSBjb250ZXh0LmNvbnRpbnVhdGlvbiA/IGF3YWl0IHRoaXMucmVhZENhY2hlZChrZXksIGVsaWdpYmxlVGFyZ2V0cykgOiB1bmRlZmluZWQ7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBlbGlnaWJsZVRhcmdldHMuZmluZCgodGFyZ2V0KSA9PiB0YXJnZXQuaWQgPT09IGNhY2hlZC5zZWxlY3RlZE1vZGVsKSEsXG4gICAgICAgIGJvZHk6IGlucHV0LmJvZHksXG4gICAgICAgIG9ic2VydmF0aW9uOiB7IC4uLmNhY2hlZCwgc291cmNlOiBcImNhY2hlXCIgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSBhd2FpdCB0aGlzLnNlcnZpY2Uuc2VsZWN0KGNvbnRleHQudGFzaywgY2FuZGlkYXRlcywge1xuICAgICAgc2lnbmFsOiBpbnB1dC5zaWduYWwsXG4gICAgICAuLi4odGhpcy5jbGllbnQgPyB7IGNsaWVudDogdGhpcy5jbGllbnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCB0YXJnZXQgPSBzZWxlY3RlZC52YWx1ZTtcbiAgICBjb25zdCBvYnNlcnZhdGlvbiA9IFNtYXJ0Um91dGVyT2JzZXJ2YXRpb25TY2hlbWEucGFyc2Uoe1xuICAgICAgc2VsZWN0ZWRNb2RlbDogdGFyZ2V0LmlkLFxuICAgICAgcm91dGVNb2RlbDogc2VsZWN0ZWQucm91dGVNb2RlbCxcbiAgICAgIGhhcm5lc3M6IHNlbGVjdGVkLmhhcm5lc3MsXG4gICAgICByb3V0ZXJOYW1lOiBzZWxlY3RlZC5yb3V0ZXJOYW1lLFxuICAgICAgc291cmNlOiBcInJvdXRlclwiLFxuICAgICAgbGF0ZW5jeU1zOiBzZWxlY3RlZC5sYXRlbmN5TXMsXG4gICAgICAuLi4oc2VsZWN0ZWQucmF0aW9uYWxlID8geyByYXRpb25hbGU6IHNlbGVjdGVkLnJhdGlvbmFsZSB9IDoge30pLFxuICAgICAgLi4uKHNlbGVjdGVkLnBhcmFtcyA/IHsgcGFyYW1zOiBzZWxlY3RlZC5wYXJhbXMgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBhd2FpdCB0aGlzLndyaXRlQ2FjaGVkKGtleSwgb2JzZXJ2YXRpb24pO1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIFNtYXJ0IFJvdXRlciBtb2RlbFwiLCB7XG4gICAgICBjYW5kaWRhdGVDb3VudDogY2FuZGlkYXRlcy5sZW5ndGgsXG4gICAgICBoYXJuZXNzLFxuICAgICAgbGF0ZW5jeU1zOiBvYnNlcnZhdGlvbi5sYXRlbmN5TXMsXG4gICAgICBtb2RlbDogb2JzZXJ2YXRpb24uc2VsZWN0ZWRNb2RlbCxcbiAgICAgIHJvdXRlTW9kZWw6IG9ic2VydmF0aW9uLnJvdXRlTW9kZWwsXG4gICAgICByb3V0ZXJOYW1lOiBvYnNlcnZhdGlvbi5yb3V0ZXJOYW1lLFxuICAgIH0pO1xuICAgIHJldHVybiB7IHRhcmdldCwgYm9keTogaW5wdXQuYm9keSwgb2JzZXJ2YXRpb24gfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcmVhZENhY2hlZChcbiAgICBrZXk6IHN0cmluZyxcbiAgICB0YXJnZXRzOiByZWFkb25seSBNb2RlbFRhcmdldFtdLFxuICApOiBQcm9taXNlPFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkID0gU21hcnRSb3V0ZXJPYnNlcnZhdGlvblNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgdGhpcy5zdG9yZS5nZXQoa2V5KSk7XG4gICAgICBpZiAoIXBhcnNlZC5zdWNjZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRhcmdldHMuc29tZSgodGFyZ2V0KSA9PiB0YXJnZXQuaWQgPT09IHBhcnNlZC5kYXRhLnNlbGVjdGVkTW9kZWwpXG4gICAgICAgID8gcGFyc2VkLmRhdGFcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNtYXJ0IFJvdXRlciBjYWNoZSByZWFkIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZUNhY2hlZChrZXk6IHN0cmluZywgb2JzZXJ2YXRpb246IFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zdG9yZS5zZXQoa2V5LCBvYnNlcnZhdGlvbiwgdGhpcy5zZXR0aW5ncy5yb3V0ZVR0bFNlY29uZHMpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJTbWFydCBSb3V0ZXIgY2FjaGUgd3JpdGUgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKiogU3RhYmxlIGxvZ2ljYWwtdHVybiBrZXkgc2hhcmVkIGJ5IGluaXRpYWwgcmVxdWVzdHMgYW5kIHRvb2wgY29udGludWF0aW9ucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbWFydFJvdXRlclR1cm5LZXkoXG4gIGxvZ2ljYWxUdXJuOiBzdHJpbmcsXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPHVua25vd24+W10sXG4gIGNvbnRleHQ6IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcbik6IHN0cmluZyB7XG4gIHJldHVybiBjcmVhdGVIYXNoKFwic2hhMjU2XCIpXG4gICAgLnVwZGF0ZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgbG9naWNhbFR1cm4sXG4gICAgICAgIGNhbmRpZGF0ZXM6IGNhbmRpZGF0ZXMubWFwKCh7IG1vZGVsLCBoYXJuZXNzIH0pID0+ICh7IG1vZGVsLCBoYXJuZXNzIH0pKSxcbiAgICAgICAgY29udGV4dCxcbiAgICAgIH0pLFxuICAgIClcbiAgICAuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5mdW5jdGlvbiBpc0VsaWdpYmxlVGFyZ2V0KFxuICB0YXJnZXQ6IE1vZGVsVGFyZ2V0LFxuICBpbnB1dDoge1xuICAgIHJlYWRvbmx5IGZlYXR1cmVzOiBSZXF1ZXN0ZWRGZWF0dXJlcztcbiAgICByZWFkb25seSBvcmlnaW5hdG9yPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHByZWZlclN5c3RlbU1vZGVsczogYm9vbGVhbjtcbiAgICByZWFkb25seSBwcm90b2NvbDogRXhjbHVkZTxDbGllbnRQcm90b2NvbCwgXCJvcGVuYWktZW1iZWRkaW5nc1wiPjtcbiAgfSxcbiAgZXhwbGljaXRSZWFzb25pbmdFZmZvcnQ6IFJlYXNvbmluZ0VmZm9ydCB8IHVuZGVmaW5lZCxcbiAgaGFybmVzczogU21hcnRSb3V0ZXJIYXJuZXNzLFxuKTogYm9vbGVhbiB7XG4gIGlmICghdGFyZ2V0LmVuZHBvaW50IHx8IHRhcmdldC5lbmRwb2ludC5zdGF0dXM/LmRlcHJlY2F0ZWQgPT09IHRydWUpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0YXJnZXQubW9kZWxTZXJ2aWNlTmFtZT8udG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwic3lzdGVtLmFpLlwiKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAoIXRhcmdldC5jYXBhYmlsaXRpZXMuY2hhdCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaGFybmVzcyA9PT0gXCJjb2RleFwiICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLmFpR2F0ZXdheUNvZGV4KSByZXR1cm4gZmFsc2U7XG4gIGlmIChoYXJuZXNzID09PSBcImNsYXVkZVwiICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLmFudGhyb3BpYykgcmV0dXJuIGZhbHNlO1xuICBpZiAoaW5wdXQuZmVhdHVyZXMudG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMudG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLnBhcmFsbGVsVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMucGFyYWxsZWxUb29scykgcmV0dXJuIGZhbHNlO1xuICBpZiAoaW5wdXQuZmVhdHVyZXMuY3VzdG9tVG9vbHMgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMuY3VzdG9tVG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLnN0cnVjdHVyZWRPdXRwdXQgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMuc3RydWN0dXJlZE91dHB1dCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaW5wdXQuZmVhdHVyZXMud2ViU2VhcmNoICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLndlYlNlYXJjaCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaW5wdXQuZmVhdHVyZXMuaW1hZ2VJbnB1dCAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy5pbWFnZUlucHV0KSByZXR1cm4gZmFsc2U7XG4gIGlmIChpbnB1dC5mZWF0dXJlcy5hcHBseVBhdGNoICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLmFwcGx5UGF0Y2gpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLnJlYXNvbmluZyAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy5yZWFzb25pbmcpIHJldHVybiBmYWxzZTtcbiAgaWYgKFxuICAgIGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0ICYmXG4gICAgZXhwbGljaXRSZWFzb25pbmdFZmZvcnQgIT09IFwibm9uZVwiICYmXG4gICAgIXRhcmdldC5yZWFzb25pbmdFZmZvcnRzLmluY2x1ZGVzKGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0KVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXNvbHZlUm91dGUoe1xuICAgICAgY2xpZW50UHJvdG9jb2w6IGlucHV0LnByb3RvY29sLFxuICAgICAgLi4uKGlucHV0Lm9yaWdpbmF0b3IgPyB7IG9yaWdpbmF0b3I6IGlucHV0Lm9yaWdpbmF0b3IgfSA6IHt9KSxcbiAgICAgIHByZWZlclN5c3RlbU1vZGVsczogaW5wdXQucHJlZmVyU3lzdGVtTW9kZWxzLFxuICAgICAgZmVhdHVyZXM6IGlucHV0LmZlYXR1cmVzLFxuICAgICAgdGFyZ2V0LFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVxdWVzdGVkUmVhc29uaW5nRWZmb3J0KFxuICBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBSZWFzb25pbmdFZmZvcnQgfCB1bmRlZmluZWQge1xuICBjb25zdCByZWFzb25pbmcgPSBpc1JlY29yZChib2R5LnJlYXNvbmluZykgPyBib2R5LnJlYXNvbmluZyA6IHVuZGVmaW5lZDtcbiAgY29uc3Qgb3V0cHV0Q29uZmlnID0gaXNSZWNvcmQoYm9keS5vdXRwdXRfY29uZmlnKSA/IGJvZHkub3V0cHV0X2NvbmZpZyA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmF3ID0gYm9keS5yZWFzb25pbmdfZWZmb3J0ID8/IHJlYXNvbmluZz8uZWZmb3J0ID8/IG91dHB1dENvbmZpZz8uZWZmb3J0O1xuICBpZiAocmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBub3JtYWxpemVkID0gU3RyaW5nKHJhdykudHJpbSgpLnRvTG93ZXJDYXNlKCkucmVwbGFjZUFsbChcIl9cIiwgXCItXCIpO1xuICBjb25zdCBwYXJzZWQgPSBSZWFzb25pbmdFZmZvcnRTY2hlbWEuc2FmZVBhcnNlKFxuICAgIG5vcm1hbGl6ZWQgPT09IFwiZXh0cmEtaGlnaFwiID8gXCJ4aGlnaFwiIDogbm9ybWFsaXplZCxcbiAgKTtcbiAgaWYgKCFwYXJzZWQuc3VjY2Vzcykge1xuICAgIHRocm93IG5ldyBTbWFydFJvdXRlckVycm9yKDQwMCwgYFVuc3VwcG9ydGVkIFNtYXJ0IFJvdXRlciByZWFzb25pbmcgZWZmb3J0OiAke1N0cmluZyhyYXcpfWApO1xuICB9XG4gIHJldHVybiBwYXJzZWQuZGF0YTtcbn1cblxuaW50ZXJmYWNlIENvbnZlcnNhdGlvbkV2ZW50IHtcbiAgcmVhZG9ubHkgcm9sZTogXCJhc3Npc3RhbnRcIiB8IFwic3lzdGVtXCIgfCBcInRvb2xcIiB8IFwidXNlclwiO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNvbnRleHRGcm9tRXZlbnRzKFxuICBldmVudHM6IHJlYWRvbmx5IENvbnZlcnNhdGlvbkV2ZW50W10sXG4gIHRva2VuQnVkZ2V0OiBudW1iZXIsXG4pOiBTbWFydFJvdXRlckNvbnRleHQge1xuICBjb25zdCBsYXRlc3RVc2VySW5kZXggPSBsYXN0RXZlbnRJbmRleChldmVudHMsIFwidXNlclwiKTtcbiAgY29uc3QgdGFza0V2ZW50ID0gbGF0ZXN0VXNlckluZGV4ID49IDAgPyBldmVudHNbbGF0ZXN0VXNlckluZGV4XSA6IGV2ZW50cy5hdCgtMSk7XG4gIGNvbnN0IHRhc2sgPSB0cnVuY2F0ZVRleHQodGFza0V2ZW50Py50ZXh0ID8/IFwiXCIsIHRva2VuQnVkZ2V0LCBcInN0YXJ0XCIpO1xuICBsZXQgcmVtYWluaW5nID0gTWF0aC5tYXgoMCwgdG9rZW5CdWRnZXQgLSBjb3VudFRva2Vucyh0YXNrKSk7XG4gIGNvbnN0IGNvbnRleHQ6IHN0cmluZ1tdID0gW107XG4gIGZvciAoXG4gICAgbGV0IGluZGV4ID0gKHRhc2tFdmVudCA/IGV2ZW50cy5pbmRleE9mKHRhc2tFdmVudCkgOiBldmVudHMubGVuZ3RoKSAtIDE7XG4gICAgaW5kZXggPj0gMDtcbiAgICBpbmRleCAtPSAxXG4gICkge1xuICAgIGNvbnN0IGV2ZW50ID0gZXZlbnRzW2luZGV4XTtcbiAgICBpZiAoIWV2ZW50IHx8ICFldmVudC50ZXh0IHx8IGV2ZW50LnJvbGUgPT09IFwidG9vbFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB2YWx1ZSA9IGAke2V2ZW50LnJvbGV9OiAke2V2ZW50LnRleHR9YDtcbiAgICBjb25zdCByZXRhaW5lZCA9IHRydW5jYXRlVGV4dCh2YWx1ZSwgcmVtYWluaW5nLCBcImVuZFwiKTtcbiAgICBpZiAoIXJldGFpbmVkKSBicmVhaztcbiAgICBjb250ZXh0LnVuc2hpZnQocmV0YWluZWQpO1xuICAgIHJlbWFpbmluZyAtPSBjb3VudFRva2VucyhyZXRhaW5lZCk7XG4gIH1cbiAgY29uc3QgY29tYmluZWQgPSBbLi4uY29udGV4dCwgdGFza10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCJcXG5cIik7XG4gIGNvbnN0IGxvZ2ljYWxFdmVudHMgPSBsYXRlc3RVc2VySW5kZXggPj0gMCA/IGV2ZW50cy5zbGljZSgwLCBsYXRlc3RVc2VySW5kZXggKyAxKSA6IGV2ZW50cztcbiAgcmV0dXJuIHtcbiAgICB0YXNrOiBjb21iaW5lZCxcbiAgICBsb2dpY2FsVHVybjogbG9naWNhbEV2ZW50cy5tYXAoKGV2ZW50KSA9PiBgJHtldmVudC5yb2xlfToke2V2ZW50LnRleHR9YCkuam9pbihcIlxcblwiKSxcbiAgICBjb250aW51YXRpb246XG4gICAgICBsYXRlc3RVc2VySW5kZXggPj0gMCAmJlxuICAgICAgZXZlbnRzLnNsaWNlKGxhdGVzdFVzZXJJbmRleCArIDEpLnNvbWUoKGV2ZW50KSA9PiBldmVudC5yb2xlICE9PSBcInN5c3RlbVwiKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29udmVyc2F0aW9uRXZlbnRzKGlucHV0OiB1bmtub3duKTogQ29udmVyc2F0aW9uRXZlbnRbXSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dC50cmltKCkgPyBbeyByb2xlOiBcInVzZXJcIiwgdGV4dDogaW5wdXQudHJpbSgpIH1dIDogW107XG4gIGlmIChBcnJheS5pc0FycmF5KGlucHV0KSkgcmV0dXJuIGlucHV0LmZsYXRNYXAobWVzc2FnZUV2ZW50KTtcbiAgaWYgKCFpc1JlY29yZChpbnB1dCkpIHJldHVybiBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgW1wibWVzc2FnZXNcIiwgXCJpbnB1dFwiXSBhcyBjb25zdCkge1xuICAgIGNvbnN0IHZhbHVlID0gaW5wdXRba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlLnRyaW0oKSkgcmV0dXJuIFt7IHJvbGU6IFwidXNlclwiLCB0ZXh0OiB2YWx1ZS50cmltKCkgfV07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICBjb25zdCBldmVudHMgPSB2YWx1ZS5mbGF0TWFwKG1lc3NhZ2VFdmVudCk7XG4gICAgICBpZiAoZXZlbnRzLmxlbmd0aCA+IDApIHJldHVybiBldmVudHM7XG4gICAgfVxuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZUV2ZW50KHZhbHVlOiB1bmtub3duKTogQ29udmVyc2F0aW9uRXZlbnRbXSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHJldHVybiB2YWx1ZS50cmltKCkgPyBbeyByb2xlOiBcInVzZXJcIiwgdGV4dDogdmFsdWUudHJpbSgpIH1dIDogW107XG4gIGlmICghaXNSZWNvcmQodmFsdWUpKSByZXR1cm4gW107XG4gIGNvbnN0IHJvbGUgPSBtZXNzYWdlUm9sZSh2YWx1ZSk7XG4gIGlmICghcm9sZSkgcmV0dXJuIFtdO1xuICBjb25zdCB0ZXh0ID0gY29udGVudFRleHQodmFsdWUuY29udGVudCA/PyB2YWx1ZS50ZXh0ID8/IHZhbHVlLmlucHV0X3RleHQgPz8gdmFsdWUub3V0cHV0X3RleHQpO1xuICByZXR1cm4gdGV4dCA/IFt7IHJvbGUsIHRleHQgfV0gOiBbXTtcbn1cblxuZnVuY3Rpb24gbWVzc2FnZVJvbGUoXG4gIHZhbHVlOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBDb252ZXJzYXRpb25FdmVudFtcInJvbGVcIl0gfCB1bmRlZmluZWQge1xuICBpZiAodmFsdWUucm9sZSA9PT0gXCJ1c2VyXCIgfHwgdmFsdWUucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiB8fCB2YWx1ZS5yb2xlID09PSBcInN5c3RlbVwiKSB7XG4gICAgcmV0dXJuIHZhbHVlLnJvbGU7XG4gIH1cbiAgaWYgKFxuICAgIHZhbHVlLnJvbGUgPT09IFwidG9vbFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsX291dHB1dFwiIHx8XG4gICAgdmFsdWUudHlwZSA9PT0gXCJ0b29sX3Jlc3VsdFwiXG4gICkge1xuICAgIHJldHVybiBcInRvb2xcIjtcbiAgfVxuICBpZiAodmFsdWUudHlwZSA9PT0gXCJmdW5jdGlvbl9jYWxsXCIgfHwgdmFsdWUudHlwZSA9PT0gXCJyZWFzb25pbmdcIikgcmV0dXJuIFwiYXNzaXN0YW50XCI7XG4gIGlmICh2YWx1ZS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJiB2YWx1ZS5yb2xlID09PSB1bmRlZmluZWQpIHJldHVybiBcInVzZXJcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gY29udGVudFRleHQodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSByZXR1cm4gdmFsdWUudHJpbSgpO1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHJldHVybiB2YWx1ZS5tYXAoY29udGVudFRleHQpLmZpbHRlcihCb29sZWFuKS5qb2luKFwiXFxuXCIpO1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFwiXCI7XG4gIGZvciAoY29uc3Qga2V5IG9mIFtcInRleHRcIiwgXCJpbnB1dF90ZXh0XCIsIFwib3V0cHV0X3RleHRcIiwgXCJjb250ZW50XCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdGV4dCA9IGNvbnRlbnRUZXh0KHZhbHVlW2tleV0pO1xuICAgIGlmICh0ZXh0KSByZXR1cm4gdGV4dDtcbiAgfVxuICByZXR1cm4gXCJcIjtcbn1cblxuY29uc3QgVEFTS19LRVlTID0gW1xuICBcInByb21wdFwiLFxuICBcInRhc2tcIixcbiAgXCJxdWVyeVwiLFxuICBcInF1ZXN0aW9uXCIsXG4gIFwicmVxdWVzdFwiLFxuICBcImRlc2NyaXB0aW9uXCIsXG4gIFwibWVzc2FnZVwiLFxuICBcInRleHRcIixcbiAgXCJpbnB1dFwiLFxuXSBhcyBjb25zdDtcbmNvbnN0IElHTk9SRURfS0VZUyA9IG5ldyBTZXQoW1xuICBcImFwaV9rZXlcIixcbiAgXCJhdXRob3JpemF0aW9uXCIsXG4gIFwiYXJndW1lbnRzXCIsXG4gIFwiY3JlZGVudGlhbHNcIixcbiAgXCJoZWFkZXJzXCIsXG4gIFwibWV0YWRhdGFcIixcbiAgXCJwYXNzd29yZFwiLFxuICBcInNlY3JldFwiLFxuICBcInRva2VuXCIsXG4gIFwidG9vbHNcIixcbl0pO1xuXG5mdW5jdGlvbiBjb2xsZWN0VGFza1N0cmluZ3MoaW5wdXQ6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHJldHVybiBpbnB1dC50cmltKCkgPyBbaW5wdXQudHJpbSgpXSA6IFtdO1xuICBjb25zdCBwcmVmZXJyZWQ6IHN0cmluZ1tdID0gW107XG4gIGlmIChpc1JlY29yZChpbnB1dCkpIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBUQVNLX0tFWVMpIHByZWZlcnJlZC5wdXNoKC4uLnN0cmluZ0xlYXZlcyhpbnB1dFtrZXldLCBrZXksIDApKTtcbiAgfVxuICByZXR1cm4gcHJlZmVycmVkLmxlbmd0aCA+IDAgPyBwcmVmZXJyZWQuc2xpY2UoMCwgMzIpIDogc3RyaW5nTGVhdmVzKGlucHV0LCBcIlwiLCAwKS5zbGljZSgwLCAzMik7XG59XG5cbmZ1bmN0aW9uIHN0cmluZ0xlYXZlcyh2YWx1ZTogdW5rbm93biwga2V5OiBzdHJpbmcsIGRlcHRoOiBudW1iZXIpOiBzdHJpbmdbXSB7XG4gIGlmIChkZXB0aCA+IDYgfHwgSUdOT1JFRF9LRVlTLmhhcyhrZXkudG9Mb3dlckNhc2UoKSkpIHJldHVybiBbXTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHZhbHVlLnRyaW0oKSA/IFt2YWx1ZS50cmltKCldIDogW107XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIHZhbHVlLmZsYXRNYXAoKGl0ZW0pID0+IHN0cmluZ0xlYXZlcyhpdGVtLCBrZXksIGRlcHRoICsgMSkpO1xuICBpZiAoIWlzUmVjb3JkKHZhbHVlKSkgcmV0dXJuIFtdO1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXModmFsdWUpLmZsYXRNYXAoKFtjaGlsZEtleSwgY2hpbGRdKSA9PlxuICAgIHN0cmluZ0xlYXZlcyhjaGlsZCwgY2hpbGRLZXksIGRlcHRoICsgMSksXG4gICk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlSnNvblN0cmluZyhpbnB1dDogdW5rbm93bik6IHVua25vd24ge1xuICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSByZXR1cm4gaW5wdXQ7XG4gIGNvbnN0IHRyaW1tZWQgPSBpbnB1dC50cmltKCk7XG4gIGlmICghdHJpbW1lZCB8fCAoIXRyaW1tZWQuc3RhcnRzV2l0aChcIntcIikgJiYgIXRyaW1tZWQuc3RhcnRzV2l0aChcIltcIikpKSByZXR1cm4gaW5wdXQ7XG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodHJpbW1lZCkgYXMgdW5rbm93bjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGlucHV0O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvdW50VG9rZW5zKHRleHQ6IHN0cmluZyk6IG51bWJlciB7XG4gIHJldHVybiBDT05URVhUX0VOQ09ESU5HLmVuY29kZSh0ZXh0LCBbXSwgW10pLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gdHJ1bmNhdGVUZXh0KHRleHQ6IHN0cmluZywgdG9rZW5CdWRnZXQ6IG51bWJlciwgZWRnZTogXCJzdGFydFwiIHwgXCJlbmRcIik6IHN0cmluZyB7XG4gIGlmICh0b2tlbkJ1ZGdldCA8PSAwIHx8ICF0ZXh0KSByZXR1cm4gXCJcIjtcbiAgY29uc3QgdG9rZW5zID0gQ09OVEVYVF9FTkNPRElORy5lbmNvZGUodGV4dCwgW10sIFtdKTtcbiAgaWYgKHRva2Vucy5sZW5ndGggPD0gdG9rZW5CdWRnZXQpIHJldHVybiB0ZXh0O1xuICByZXR1cm4gQ09OVEVYVF9FTkNPRElORy5kZWNvZGUoXG4gICAgZWRnZSA9PT0gXCJzdGFydFwiID8gdG9rZW5zLnNsaWNlKDAsIHRva2VuQnVkZ2V0KSA6IHRva2Vucy5zbGljZSgtdG9rZW5CdWRnZXQpLFxuICApO1xufVxuXG5mdW5jdGlvbiBsYXN0RXZlbnRJbmRleChcbiAgZXZlbnRzOiByZWFkb25seSBDb252ZXJzYXRpb25FdmVudFtdLFxuICByb2xlOiBDb252ZXJzYXRpb25FdmVudFtcInJvbGVcIl0sXG4pOiBudW1iZXIge1xuICBmb3IgKGxldCBpbmRleCA9IGV2ZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyBpbmRleCAtPSAxKSB7XG4gICAgaWYgKGV2ZW50c1tpbmRleF0/LnJvbGUgPT09IHJvbGUpIHJldHVybiBpbmRleDtcbiAgfVxuICByZXR1cm4gLTE7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZUNhbmRpZGF0ZXM8VD4oXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4pOiBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGAke2NhbmRpZGF0ZS5oYXJuZXNzfToke25vcm1hbGl6ZVJvdXRlTW9kZWwoY2FuZGlkYXRlLm1vZGVsKX1gO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBub3JtYWxpemVkID0gbW9kZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIvXCIpLmF0KC0xKSA/PyBcIlwiO1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbXCJkYXRhYnJpY2tzLVwiLCBcInN5c3RlbS5haS5cIl0gYXMgY29uc3QpIHtcbiAgICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG5mdW5jdGlvbiBwcm9iZUtleTxUPihjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLCByb3V0ZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHJvdXRlck5hbWUsXG4gICAgY2FuZGlkYXRlczogY2FuZGlkYXRlc1xuICAgICAgLm1hcCgoeyBtb2RlbCwgaGFybmVzcyB9KSA9PiAoeyBtb2RlbDogbm9ybWFsaXplUm91dGVNb2RlbChtb2RlbCksIGhhcm5lc3MgfSkpXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgICAgIGAke2xlZnQuaGFybmVzc306JHtsZWZ0Lm1vZGVsfWAubG9jYWxlQ29tcGFyZShgJHtyaWdodC5oYXJuZXNzfToke3JpZ2h0Lm1vZGVsfWApLFxuICAgICAgKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcEtpdENhY2hlTWFuYWdlcigpOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc21hcnRSb3V0ZXJQcm9iZUlkZW50aXR5KGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoaG9zdClcbiAgICAudXBkYXRlKFwiXFwwXCIpXG4gICAgLnVwZGF0ZShoZWFkZXJzLmdldChcImF1dGhvcml6YXRpb25cIikgPz8gXCJcIilcbiAgICAudXBkYXRlKFwiXFwwXCIpXG4gICAgLnVwZGF0ZShoZWFkZXJzLmdldChcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIikgPz8gXCJcIilcbiAgICAuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnZva2VTbWFydFJvdXRlcihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGJvZHk6IFNtYXJ0Um91dGVyUmVxdWVzdCxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChcIi9haS1nYXRld2F5L3JvdXRpbmcvdjEvcm91dGVzOnNlbGVjdFwiLCBob3N0KTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCBjb21iaW5lZFNpZ25hbCA9IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCBBYm9ydFNpZ25hbC50aW1lb3V0KHRpbWVvdXRNcyldKTtcbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIHNpZ25hbDogY29tYmluZWRTaWduYWwsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgKGF3YWl0IHJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihjbGllbnQpKSkge1xuICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICBoZWFkZXJzLmRlbGV0ZShcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIik7XG4gICAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBzaWduYWw6IGNvbWJpbmVkU2lnbmFsLFxuICAgIH0pO1xuICB9XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBkZXRhaWwgPSAoYXdhaXQgcmVzcG9uc2UudGV4dCgpLmNhdGNoKCgpID0+IFwiXCIpKS50cmltKCkuc2xpY2UoMCwgNTAwKTtcbiAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcihcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0ID8gNDA0IDogNTAzLFxuICAgICAgYERhdGFicmlja3MgU21hcnQgUm91dGVyIGZhaWxlZCB3aXRoIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9JHtkZXRhaWwgPyBgOiAke2RldGFpbH1gIDogXCJcIn1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cbiJdfQ==
|
|
532
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtcm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NtYXJ0LXJvdXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUF3QixNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxxQkFBcUIsRUFBd0IsTUFBTSx5QkFBeUIsQ0FBQztBQUN0RixPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLDRCQUE0QixFQUM1Qix3QkFBd0IsRUFDeEIseUJBQXlCLEdBTzFCLE1BQU0saUNBQWlDLENBQUM7QUFDekMsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUV4QixPQUFPLEVBQUUscUJBQXFCLEVBQStCLE1BQU0sb0JBQW9CLENBQUM7QUFDeEYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUUzQyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUM7QUFDL0QsTUFBTSxxQkFBcUIsR0FBRyw0QkFBNEIsQ0FBQztBQUMzRCxNQUFNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztBQUMvQixNQUFNLHFCQUFxQixHQUFHLGtDQUFrQyxDQUFDO0FBQ2pFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBQzlCLE1BQU0sVUFBVSxHQUFHLDJEQUEyRCxDQUFDO0FBQy9FLE1BQU0scUJBQXFC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biAqIERhdGFicmlja3MgU21hcnQgUm91dGVyIHRyYW5zcG9ydCwgY29udGV4dCBjb25zdHJ1Y3Rpb24sIHByb2JpbmcsIGFuZCB0dXJuIHBpbm5pbmcuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENhY2hlTWFuYWdlciwgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbG9zZUNhY2hlLCBjcmVhdGVDYWNoZSwgZ2V0T3JTZXQgfSBmcm9tIFwiQGRieC10b29scy9jYWNoZVwiO1xuaW1wb3J0IHsgcmVmcmVzaFdvcmtzcGFjZUNsaWVudEF1dGhlbnRpY2F0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgaXNSZWNvcmQsIGxvZywgdG9FcnJvciB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBSZWFzb25pbmdFZmZvcnRTY2hlbWEsIHR5cGUgUmVhc29uaW5nRWZmb3J0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsXCI7XG5pbXBvcnQge1xuICBTTUFSVF9ST1VURVJfTkFNRSxcbiAgU21hcnRSb3V0ZXJPYnNlcnZhdGlvblNjaGVtYSxcbiAgU21hcnRSb3V0ZXJSZXF1ZXN0U2NoZW1hLFxuICBTbWFydFJvdXRlclJlc3BvbnNlU2NoZW1hLFxuICB0eXBlIENsaWVudFByb3RvY29sLFxuICB0eXBlIE1vZGVsVGFyZ2V0LFxuICB0eXBlIFJlcXVlc3RlZEZlYXR1cmVzLFxuICB0eXBlIFNtYXJ0Um91dGVySGFybmVzcyxcbiAgdHlwZSBTbWFydFJvdXRlck9ic2VydmF0aW9uLFxuICB0eXBlIFNtYXJ0Um91dGVyUmVxdWVzdCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1vZGVsLWdhdGV3YXlcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IG5vcm1hbGl6ZU1vZGVsQ29udGV4dCwgdHlwZSBOb3JtYWxpemVkTW9kZWxDb250ZXh0IH0gZnJvbSBcIi4vbW9kZWwtY29udGV4dC50c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZVJvdXRlIH0gZnJvbSBcIi4vcm91dGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXQvbW9kZWwtZ2F0ZXdheS9zbWFydC1yb3V0ZXJcIik7XG5jb25zdCBST1VURV9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1vZGVsLWdhdGV3YXktc21hcnQtcm91dGVyXCI7XG5jb25zdCBST1VURV9QT0xJQ1lfVkVSU0lPTiA9IDE7XG5jb25zdCBQUk9CRV9DQUNIRV9OQU1FU1BBQ0UgPSBcIm1vZGVsLWdhdGV3YXktc21hcnQtcm91dGVyLXByb2JlXCI7XG5jb25zdCBQUk9CRV9DQUNIRV9WRVJTSU9OID0gMTtcbmNvbnN0IFBST0JFX1RBU0sgPSBcIkNoZWNrIHdoZXRoZXIgU21hcnQgUm91dGVyIGNhbiBzZWxlY3QgYW4gYXZhaWxhYmxlIG1vZGVsLlwiO1xuY29uc3QgTkVHQVRJVkVfUFJPQkVfVFRMX01TID0gMzBfMDAwO1xuXG4vKiogUnVudGltZSBzZXR0aW5ncyBmb3IgU21hcnQgUm91dGVyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNldHRpbmdzIHtcbiAgcmVhZG9ubHkgY29udGV4dFRva2VuQnVkZ2V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IHByb2JlUmVmcmVzaEludGVydmFsTXM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcHJvYmVUdGxNczogbnVtYmVyO1xuICByZWFkb25seSByb3V0ZVR0bFNlY29uZHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgcm91dGVyTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0aW1lb3V0TXM6IG51bWJlcjtcbn1cblxuLyoqIERlZmF1bHRzIHNoYXJlZCBieSBnYXRld2F5LCBNYXN0cmEsIGFuZCBDTEkgU21hcnQgUm91dGVyIGNhbGxlcnMuICovXG5leHBvcnQgY29uc3QgU01BUlRfUk9VVEVSX0RFRkFVTFRfU0VUVElOR1M6IFNtYXJ0Um91dGVyU2V0dGluZ3MgPSBPYmplY3QuZnJlZXplKHtcbiAgY29udGV4dFRva2VuQnVkZ2V0OiA0XzA5NixcbiAgcHJvYmVSZWZyZXNoSW50ZXJ2YWxNczogM182MDBfMDAwLFxuICBwcm9iZVR0bE1zOiAzMDBfMDAwLFxuICByb3V0ZVR0bFNlY29uZHM6IDIxXzYwMCxcbiAgcm91dGVyTmFtZTogU01BUlRfUk9VVEVSX05BTUUsXG4gIHRpbWVvdXRNczogMTBfMDAwLFxufSk7XG5cbi8qKiBPbmUgcm91dGUgb3B0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FsbGVyLW93bmVkIHZhbHVlIGl0IHJlcHJlc2VudHMuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+IHtcbiAgcmVhZG9ubHkgaGFybmVzczogU21hcnRSb3V0ZXJIYXJuZXNzO1xuICByZWFkb25seSBtb2RlbDogc3RyaW5nO1xuICByZWFkb25seSB2YWx1ZTogVDtcbn1cblxuLyoqIFJlc3VsdCByZXR1cm5lZCBhZnRlciBtYXBwaW5nIGEgRGF0YWJyaWNrcyByb3V0ZSBiYWNrIHRvIGEgY2FsbGVyLW93bmVkIHZhbHVlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNlbGVjdGlvbjxUPiB7XG4gIHJlYWRvbmx5IGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcztcbiAgcmVhZG9ubHkgbGF0ZW5jeU1zOiBudW1iZXI7XG4gIHJlYWRvbmx5IHBhcmFtcz86IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgcmVhZG9ubHkgcmF0aW9uYWxlPzogc3RyaW5nO1xuICByZWFkb25seSByb3V0ZU1vZGVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJvdXRlck5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdmFsdWU6IFQ7XG59XG5cbi8qKiBQb3J0YWJsZSBwZXJzaXN0ZW5jZSBzdXJmYWNlIGZvciBhIHBpbm5lZCBTbWFydCBSb3V0ZXIgdHVybi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU21hcnRSb3V0ZXJTdG9yZSB7XG4gIGdldChrZXk6IHN0cmluZyk6IFByb21pc2U8dW5rbm93bj47XG4gIHNldChrZXk6IHN0cmluZywgdmFsdWU6IFNtYXJ0Um91dGVyT2JzZXJ2YXRpb24sIHR0bFNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD47XG59XG5cbmV4cG9ydCBjb25zdCBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBlbmFibGVkOiB6LmJvb2xlYW4oKS5kZXNjcmliZShcIldoZXRoZXIgdGhlIGxpdmUgU21hcnQgUm91dGVyIHByb2JlIHN1Y2NlZWRlZC5cIiksXG4gICAgZXhwaXJlc0F0OiB6Lm51bWJlcigpLmludCgpLmRlc2NyaWJlKFwiRXBvY2ggbWlsbGlzZWNvbmRzIHdoZW4gdGhpcyBwcm9iZSBiZWNvbWVzIHN0YWxlLlwiKSxcbiAgfSlcbiAgLmRlc2NyaWJlKFwiUGVyc2lzdGVkIFNtYXJ0IFJvdXRlciBjYXBhYmlsaXR5IHByb2JlIHJlc3VsdC5cIik7XG5cbmV4cG9ydCB0eXBlIFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQgPSB6LmluZmVyPHR5cGVvZiBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hPjtcblxuLyoqIE9wdGlvbmFsIHBlcnNpc3RlbnQgY2FjaGUgZm9yIGNhcGFiaWxpdHkgcHJvYmVzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclByb2JlU3RvcmUge1xuICBnZXQoa2V5OiBzdHJpbmcsIGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTx1bmtub3duPjtcbiAgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBTbWFydFJvdXRlclByb2JlUmVjb3JkLFxuICAgIHR0bFNlY29uZHM6IG51bWJlcixcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqIFJlc3VsdCBhcHBsaWVkIHRvIG9uZSBjb25jcmV0ZSBnYXRld2F5IHJlcXVlc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Um91dGVyUmVzdWx0IHtcbiAgcmVhZG9ubHkgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICByZWFkb25seSBvYnNlcnZhdGlvbjogU21hcnRSb3V0ZXJPYnNlcnZhdGlvbjtcbiAgcmVhZG9ubHkgdGFyZ2V0OiBNb2RlbFRhcmdldDtcbn1cblxuLyoqIEJvdW5kZWQgdGFzayBjb250ZXh0IGV4dHJhY3RlZCBmcm9tIGFuIGFyYml0cmFyeSBzdXBwb3J0ZWQgaW5wdXQgc2hhcGUuICovXG5leHBvcnQgdHlwZSBTbWFydFJvdXRlckNvbnRleHQgPSBOb3JtYWxpemVkTW9kZWxDb250ZXh0O1xuXG4vKiogRXJyb3IgY2FycnlpbmcgYW4gSFRUUCBzdGF0dXMgZm9yIFNtYXJ0IFJvdXRlciB2YWxpZGF0aW9uIG9yIGF2YWlsYWJpbGl0eSBmYWlsdXJlcy4gKi9cbmV4cG9ydCBjbGFzcyBTbWFydFJvdXRlckVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBzdGF0dXM6IG51bWJlcixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9IFwiU21hcnRSb3V0ZXJFcnJvclwiO1xuICB9XG59XG5cbi8qKiBBcHBLaXQgY2FjaGUgYWRhcHRlcjsgY29uZmlndXJlZCBMYWtlYmFzZS9Qb3N0Z3JlcyBzdG9yYWdlIHJlbWFpbnMgQXBwS2l0LW93bmVkLiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdFNtYXJ0Um91dGVyU3RvcmUgaW1wbGVtZW50cyBTbWFydFJvdXRlclN0b3JlIHtcbiAgYXN5bmMgZ2V0KGtleTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2UoKTtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KGNhY2hlLmdlbmVyYXRlS2V5KFtST1VURV9DQUNIRV9OQU1FU1BBQ0UsIFJPVVRFX1BPTElDWV9WRVJTSU9OXSwga2V5KSk7XG4gIH1cblxuICBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBTbWFydFJvdXRlck9ic2VydmF0aW9uLCB0dGxTZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjYWNoZSA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpO1xuICAgIGF3YWl0IGNhY2hlLnNldChjYWNoZS5nZW5lcmF0ZUtleShbUk9VVEVfQ0FDSEVfTkFNRVNQQUNFLCBST1VURV9QT0xJQ1lfVkVSU0lPTl0sIGtleSksIHZhbHVlLCB7XG4gICAgICB0dGw6IHR0bFNlY29uZHMsXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEFwcEtpdCBjYWNoZSBhZGFwdGVyIGZvciBwcm9jZXNzLSBhbmQgcGVyc2lzdGVuY2UtYmFja2VkIGNhcGFiaWxpdHkgcHJvYmVzLiAqL1xuZXhwb3J0IGNsYXNzIEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSBpbXBsZW1lbnRzIFNtYXJ0Um91dGVyUHJvYmVTdG9yZSB7XG4gIGFzeW5jIGdldChrZXk6IHN0cmluZywgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICBjb25zdCBjYWNoZSA9IGFwcEtpdENhY2hlTWFuYWdlcigpO1xuICAgIGlmICghY2FjaGUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBzbWFydFJvdXRlclByb2JlSWRlbnRpdHkoY2xpZW50KTtcbiAgICByZXR1cm4gY2FjaGUuZ2V0KFxuICAgICAgY2FjaGUuZ2VuZXJhdGVLZXkoW1BST0JFX0NBQ0hFX05BTUVTUEFDRSwgUFJPQkVfQ0FDSEVfVkVSU0lPTl0sIGAke2lkZW50aXR5fToke2tleX1gKSxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBTbWFydFJvdXRlclByb2JlUmVjb3JkLFxuICAgIHR0bFNlY29uZHM6IG51bWJlcixcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY2FjaGUgPSBhcHBLaXRDYWNoZU1hbmFnZXIoKTtcbiAgICBpZiAoIWNhY2hlKSByZXR1cm47XG4gICAgY29uc3QgaWRlbnRpdHkgPSBhd2FpdCBzbWFydFJvdXRlclByb2JlSWRlbnRpdHkoY2xpZW50KTtcbiAgICBhd2FpdCBjYWNoZS5zZXQoXG4gICAgICBjYWNoZS5nZW5lcmF0ZUtleShbUFJPQkVfQ0FDSEVfTkFNRVNQQUNFLCBQUk9CRV9DQUNIRV9WRVJTSU9OXSwgYCR7aWRlbnRpdHl9OiR7a2V5fWApLFxuICAgICAgdmFsdWUsXG4gICAgICB7IHR0bDogdHRsU2Vjb25kcyB9LFxuICAgICk7XG4gIH1cbn1cblxudHlwZSBTbWFydFJvdXRlclByb2JlQ2FjaGUgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVDYWNoZT47XG5cbi8qKiBPcHRpb25hbCBpZGVudGl0eSBhbmQgY2FuY2VsbGF0aW9uIGlucHV0cyBmb3Igb25lIFNtYXJ0IFJvdXRlciBjYWxsLiAqL1xuZXhwb3J0IGludGVyZmFjZSBTbWFydFJvdXRlclNlbGVjdE9wdGlvbnMge1xuICByZWFkb25seSBjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlYWRvbmx5IHNpZ25hbD86IEFib3J0U2lnbmFsO1xufVxuXG50eXBlIFNtYXJ0Um91dGVySW52b2tlciA9IChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJlcXVlc3Q6IFNtYXJ0Um91dGVyUmVxdWVzdCxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pID0+IFByb21pc2U8dW5rbm93bj47XG5cbi8qKlxuICogRGVkaWNhdGVkIFNtYXJ0IFJvdXRlciBzZXJ2aWNlIGZvciBzdHJpbmdzLCByZXF1ZXN0IG9iamVjdHMsIG1lc3NhZ2UgYXJyYXlzLFxuICogYW5kIGdlbmVyaWMgSlNPTi1saWtlIGlucHV0cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNtYXJ0Um91dGVyU2VydmljZSB7XG4gIHJlYWRvbmx5IGNvbnRleHQ6IFNtYXJ0Um91dGVyQ29udGV4dEJ1aWxkZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2V0dGluZ3M6IFNtYXJ0Um91dGVyU2V0dGluZ3M7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTbWFydFJvdXRlclByb2JlQ2FjaGU+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVLZXlzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9iZUNhY2hlcyA9IG5ldyBTZXQ8U21hcnRSb3V0ZXJQcm9iZUNhY2hlPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNldHRpbmdzOiBQYXJ0aWFsPFNtYXJ0Um91dGVyU2V0dGluZ3M+ID0ge30sXG4gICAgcHJpdmF0ZSByZWFkb25seSBpbnZva2U6IFNtYXJ0Um91dGVySW52b2tlciA9IGludm9rZVNtYXJ0Um91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvYmVTdG9yZTogU21hcnRSb3V0ZXJQcm9iZVN0b3JlID0gbmV3IEFwcEtpdFNtYXJ0Um91dGVyUHJvYmVTdG9yZSgpLFxuICApIHtcbiAgICB0aGlzLnNldHRpbmdzID0geyAuLi5TTUFSVF9ST1VURVJfREVGQVVMVF9TRVRUSU5HUywgLi4uc2V0dGluZ3MgfTtcbiAgICB0aGlzLmNvbnRleHQgPSBuZXcgU21hcnRSb3V0ZXJDb250ZXh0QnVpbGRlcih0aGlzLnNldHRpbmdzLmNvbnRleHRUb2tlbkJ1ZGdldCk7XG4gIH1cblxuICAvKiogU2VsZWN0IG9uZSBvZmZlcmVkIHJvdXRlIGZvciBhcmJpdHJhcnkgaW5wdXQgY29udGVudC4gKi9cbiAgYXN5bmMgc2VsZWN0PFQ+KFxuICAgIGlucHV0OiB1bmtub3duLFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgb3B0aW9uczogU21hcnRSb3V0ZXJTZWxlY3RPcHRpb25zID0ge30sXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJTZWxlY3Rpb248VD4+IHtcbiAgICBjb25zdCB0YXNrID0gYXdhaXQgdGhpcy5jb250ZXh0LmJ1aWxkKGlucHV0KTtcbiAgICBpZiAoIXRhc2spIHRocm93IG5ldyBTbWFydFJvdXRlckVycm9yKDQwMCwgXCJTbWFydCBSb3V0ZXIgaW5wdXQgY29udGFpbnMgbm8gcm91dGFibGUgdGV4dFwiKTtcbiAgICBjb25zdCBjbGllbnQgPSBvcHRpb25zLmNsaWVudCA/PyBnZXRFeGVjdXRpb25Db250ZXh0KCkuY2xpZW50O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWxlY3Rpb24gPSBhd2FpdCB0aGlzLnNlbGVjdFRhc2sodGFzaywgY2FuZGlkYXRlcywgeyAuLi5vcHRpb25zLCBjbGllbnQgfSk7XG4gICAgICB0aGlzLnNldFByb2JlVmFsdWUoY2FuZGlkYXRlcywgY2xpZW50LCB0cnVlKTtcbiAgICAgIHJldHVybiBzZWxlY3Rpb247XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2V0UHJvYmVVbmF2YWlsYWJsZShjYW5kaWRhdGVzLCBjbGllbnQpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJldHVybiBhIG1lbW9pemVkIGxpdmUgY2FwYWJpbGl0eSBwcm9iZSBmb3IgdGhlIGFjdGl2ZSBpZGVudGl0eSBhbmQgY2FuZGlkYXRlIG1lbnUuICovXG4gIGFzeW5jIGlzRW5hYmxlZDxUPihcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudCA9IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGlmIChvZmZlcmVkLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNhY2hlID0gdGhpcy5wcm9iZUNhY2hlKGNsaWVudCk7XG4gICAgY29uc3Qga2V5ID0gcHJvYmVLZXkob2ZmZXJlZCwgdGhpcy5zZXR0aW5ncy5yb3V0ZXJOYW1lKTtcbiAgICB0aGlzLnJlbWVtYmVyUHJvYmVLZXkoY2xpZW50LCBrZXkpO1xuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgZ2V0T3JTZXQoY2FjaGUsIGtleSwgKCkgPT4gdGhpcy5sb2FkUHJvYmUoa2V5LCBvZmZlcmVkLCBjbGllbnQpLCB7XG4gICAgICB0dGw6IHRoaXMucHJvYmVDYWNoZVR0bE1zKCksXG4gICAgICByZWZyZXNoQWZ0ZXJXcml0ZTogKHZhbHVlKSA9PiB0aGlzLnByb2JlUmVmcmVzaEFmdGVyV3JpdGUodmFsdWUuZW5hYmxlZCksXG4gICAgfSk7XG4gICAgcmV0dXJuIHByb2JlPy5lbmFibGVkID8/IGZhbHNlO1xuICB9XG5cbiAgLyoqIFN0b3AgcHJvY2Vzcy1sb2NhbCBwcm9iZSBjYWNoZXMgYWZ0ZXIgdGhlaXIgYWN0aXZlIHJlZnJlc2hlcyBzZXR0bGUuICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjYWNoZSBvZiB0aGlzLnByb2JlQ2FjaGVzKSB2b2lkIGNsb3NlQ2FjaGUoY2FjaGUpO1xuICAgIHRoaXMucHJvYmVDYWNoZXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZFByb2JlPFQ+KFxuICAgIGtleTogc3RyaW5nLFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJQcm9iZVJlY29yZD4ge1xuICAgIGNvbnN0IHN0b3JlZCA9IGF3YWl0IHRoaXMucmVhZFN0b3JlZFByb2JlKGtleSwgY2xpZW50KTtcbiAgICBpZiAoc3RvcmVkICYmIHN0b3JlZC5leHBpcmVzQXQgPiBEYXRlLm5vdygpKSByZXR1cm4gc3RvcmVkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVQcm9iZShrZXksIGNhbmRpZGF0ZXMsIGNsaWVudCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVQcm9iZTxUPihcbiAgICBrZXk6IHN0cmluZyxcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICApOiBQcm9taXNlPFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQ+IHtcbiAgICBjb25zdCBlbmFibGVkID0gYXdhaXQgdGhpcy5zZWxlY3RUYXNrKFBST0JFX1RBU0ssIGNhbmRpZGF0ZXMsIHsgY2xpZW50IH0pXG4gICAgICAudGhlbigoKSA9PiB0cnVlKVxuICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICBsb2dnZXIuZGVidWcoXCJTbWFydCBSb3V0ZXIgY2FwYWJpbGl0eSBwcm9iZSB1bmF2YWlsYWJsZVwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgY29uc3QgcHJvYmUgPSB0aGlzLnByb2JlUmVjb3JkKGVuYWJsZWQpO1xuICAgIHZvaWQgdGhpcy53cml0ZVN0b3JlZFByb2JlKGtleSwgcHJvYmUsIGNsaWVudCk7XG4gICAgcmV0dXJuIHByb2JlO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQcm9iZVZhbHVlPFQ+KFxuICAgIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICAgZW5hYmxlZDogYm9vbGVhbixcbiAgKTogdm9pZCB7XG4gICAgY29uc3Qgb2ZmZXJlZCA9IHVuaXF1ZUNhbmRpZGF0ZXMoY2FuZGlkYXRlcyk7XG4gICAgaWYgKG9mZmVyZWQubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgY2FjaGUgPSB0aGlzLnByb2JlQ2FjaGUoY2xpZW50KTtcbiAgICBjb25zdCBrZXkgPSBwcm9iZUtleShvZmZlcmVkLCB0aGlzLnNldHRpbmdzLnJvdXRlck5hbWUpO1xuICAgIHRoaXMucmVtZW1iZXJQcm9iZUtleShjbGllbnQsIGtleSk7XG4gICAgY29uc3QgcHJvYmUgPSB0aGlzLnByb2JlUmVjb3JkKGVuYWJsZWQpO1xuICAgIHZvaWQgdGhpcy53cml0ZVByb2Nlc3NQcm9iZShjYWNoZSwga2V5LCBwcm9iZSk7XG4gICAgdm9pZCB0aGlzLndyaXRlU3RvcmVkUHJvYmUoa2V5LCBwcm9iZSwgY2xpZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UHJvYmVVbmF2YWlsYWJsZTxUPihcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBjYWNoZSA9IHRoaXMucHJvYmVDYWNoZShjbGllbnQpO1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGNvbnN0IHJlcXVlc3RlZEtleSA9IHByb2JlS2V5KG9mZmVyZWQsIHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSk7XG4gICAgdGhpcy5yZW1lbWJlclByb2JlS2V5KGNsaWVudCwgcmVxdWVzdGVkS2V5KTtcbiAgICBjb25zdCBrZXlzID0gdGhpcy5wcm9iZUtleXMuZ2V0KGNsaWVudC5jb25maWcgYXMgb2JqZWN0KSA/PyBuZXcgU2V0KFtyZXF1ZXN0ZWRLZXldKTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICBjb25zdCBwcm9iZSA9IHRoaXMucHJvYmVSZWNvcmQoZmFsc2UpO1xuICAgICAgdm9pZCB0aGlzLndyaXRlUHJvY2Vzc1Byb2JlKGNhY2hlLCBrZXksIHByb2JlKTtcbiAgICAgIHZvaWQgdGhpcy53cml0ZVN0b3JlZFByb2JlKGtleSwgcHJvYmUsIGNsaWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVJlY29yZChlbmFibGVkOiBib29sZWFuKTogU21hcnRSb3V0ZXJQcm9iZVJlY29yZCB7XG4gICAgcmV0dXJuIHsgZW5hYmxlZCwgZXhwaXJlc0F0OiBEYXRlLm5vdygpICsgdGhpcy5wcm9iZVR0bChlbmFibGVkKSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkU3RvcmVkUHJvYmUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8U21hcnRSb3V0ZXJQcm9iZVJlY29yZCB8IHVuZGVmaW5lZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBTbWFydFJvdXRlclByb2JlUmVjb3JkU2NoZW1hLnNhZmVQYXJzZShhd2FpdCB0aGlzLnByb2JlU3RvcmUuZ2V0KGtleSwgY2xpZW50KSk7XG4gICAgICByZXR1cm4gcGFyc2VkLnN1Y2Nlc3MgPyBwYXJzZWQuZGF0YSA6IHVuZGVmaW5lZDtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiU21hcnQgUm91dGVyIHByb2JlIGNhY2hlIHJlYWQgZmFpbGVkXCIsIHsgZXJyb3I6IHRvRXJyb3IoZXJyb3IpIH0pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlUHJvY2Vzc1Byb2JlKFxuICAgIGNhY2hlOiBTbWFydFJvdXRlclByb2JlQ2FjaGUsXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcHJvYmU6IFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjYWNoZS5zZXQoa2V5LCBwcm9iZSwgeyB0dGw6IHRoaXMucHJvYmVDYWNoZVR0bE1zKCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNtYXJ0IFJvdXRlciBwcm9jZXNzIHByb2JlIGNhY2hlIHdyaXRlIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdyaXRlU3RvcmVkUHJvYmUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgcHJvYmU6IFNtYXJ0Um91dGVyUHJvYmVSZWNvcmQsXG4gICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnByb2JlU3RvcmUuc2V0KFxuICAgICAgICBrZXksXG4gICAgICAgIHByb2JlLFxuICAgICAgICBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5wcm9iZUNhY2hlVHRsTXMoKSAvIDFfMDAwKSksXG4gICAgICAgIGNsaWVudCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIlNtYXJ0IFJvdXRlciBwcm9iZSBjYWNoZSB3cml0ZSBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZUNhY2hlKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogU21hcnRSb3V0ZXJQcm9iZUNhY2hlIHtcbiAgICBjb25zdCBvd25lciA9IGNsaWVudC5jb25maWcgYXMgb2JqZWN0O1xuICAgIGxldCBjYWNoZSA9IHRoaXMucHJvYmVzLmdldChvd25lcik7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY2FjaGUgPSBjcmVhdGVDYWNoZSh7IG1heEVudHJpZXM6IDMyLCB1c2VDbG9uZTogZmFsc2UgfSk7XG4gICAgICB0aGlzLnByb2Jlcy5zZXQob3duZXIsIGNhY2hlKTtcbiAgICAgIHRoaXMucHJvYmVDYWNoZXMuYWRkKGNhY2hlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNhY2hlO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlclByb2JlS2V5KGNsaWVudDogV29ya3NwYWNlQ2xpZW50LCBrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyID0gY2xpZW50LmNvbmZpZyBhcyBvYmplY3Q7XG4gICAgbGV0IGtleXMgPSB0aGlzLnByb2JlS2V5cy5nZXQob3duZXIpO1xuICAgIGlmICgha2V5cykge1xuICAgICAga2V5cyA9IG5ldyBTZXQoKTtcbiAgICAgIHRoaXMucHJvYmVLZXlzLnNldChvd25lciwga2V5cyk7XG4gICAgfVxuICAgIGtleXMuYWRkKGtleSk7XG4gIH1cblxuICBwcml2YXRlIHByb2JlQ2FjaGVUdGxNcygpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCh0aGlzLnNldHRpbmdzLnByb2JlUmVmcmVzaEludGVydmFsTXMsIHRoaXMuc2V0dGluZ3MucHJvYmVUdGxNcykgKiAyO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVR0bChlbmFibGVkOiBib29sZWFuKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZW5hYmxlZFxuICAgICAgPyB0aGlzLnNldHRpbmdzLnByb2JlVHRsTXNcbiAgICAgIDogTWF0aC5taW4odGhpcy5zZXR0aW5ncy5wcm9iZVR0bE1zLCBORUdBVElWRV9QUk9CRV9UVExfTVMpO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9iZVJlZnJlc2hBZnRlcldyaXRlKGVuYWJsZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1pbih0aGlzLnNldHRpbmdzLnByb2JlUmVmcmVzaEludGVydmFsTXMsIHRoaXMucHJvYmVUdGwoZW5hYmxlZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZWxlY3RUYXNrPFQ+KFxuICAgIHRhc2s6IHN0cmluZyxcbiAgICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLFxuICAgIG9wdGlvbnM6IFNtYXJ0Um91dGVyU2VsZWN0T3B0aW9ucyxcbiAgKTogUHJvbWlzZTxTbWFydFJvdXRlclNlbGVjdGlvbjxUPj4ge1xuICAgIGNvbnN0IG9mZmVyZWQgPSB1bmlxdWVDYW5kaWRhdGVzKGNhbmRpZGF0ZXMpO1xuICAgIGlmIChvZmZlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFNtYXJ0Um91dGVyRXJyb3IoNDAwLCBcIk5vIGNvbXBhdGlibGUgc3lzdGVtIG1vZGVscyBhcmUgYXZhaWxhYmxlIHRvIFNtYXJ0IFJvdXRlclwiKTtcbiAgICB9XG4gICAgY29uc3QgcmVxdWVzdCA9IFNtYXJ0Um91dGVyUmVxdWVzdFNjaGVtYS5wYXJzZSh7XG4gICAgICByb3V0ZV9vcHRpb25zOiBvZmZlcmVkLm1hcCgoeyBtb2RlbCwgaGFybmVzcyB9KSA9PiAoeyBtb2RlbCwgaGFybmVzcyB9KSksXG4gICAgICB0YXNrOiB7IHByb21wdDogdGFzayB9LFxuICAgICAgcm91dGVfc2VsZWN0b3I6IHsgcm91dGVyX25hbWU6IHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG9wdGlvbnMuY2xpZW50ID8/IGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnQ7XG4gICAgY29uc3Qgc2lnbmFsID0gb3B0aW9ucy5zaWduYWwgPz8gbmV3IEFib3J0Q29udHJvbGxlcigpLnNpZ25hbDtcbiAgICBjb25zdCBzdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gU21hcnRSb3V0ZXJSZXNwb25zZVNjaGVtYS5wYXJzZShcbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlKGNsaWVudCwgcmVxdWVzdCwgc2lnbmFsLCB0aGlzLnNldHRpbmdzLnRpbWVvdXRNcyksXG4gICAgKTtcbiAgICBjb25zdCBzZWxlY3Rpb24gPSByZXNwb25zZS5yb3V0ZV9zZWxlY3Rpb25bMF0hO1xuICAgIGNvbnN0IHNlbGVjdGVkID0gb2ZmZXJlZC5maW5kKFxuICAgICAgKGNhbmRpZGF0ZSkgPT5cbiAgICAgICAgbm9ybWFsaXplUm91dGVNb2RlbChjYW5kaWRhdGUubW9kZWwpID09PVxuICAgICAgICAgIG5vcm1hbGl6ZVJvdXRlTW9kZWwoc2VsZWN0aW9uLnJvdXRlX29wdGlvbi5tb2RlbCkgJiZcbiAgICAgICAgKCFzZWxlY3Rpb24ucm91dGVfb3B0aW9uLmhhcm5lc3MgfHwgY2FuZGlkYXRlLmhhcm5lc3MgPT09IHNlbGVjdGlvbi5yb3V0ZV9vcHRpb24uaGFybmVzcyksXG4gICAgKTtcbiAgICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcihcbiAgICAgICAgNTAyLFxuICAgICAgICBgU21hcnQgUm91dGVyIHNlbGVjdGVkIGFuIHVuc3VwcG9ydGVkIG1vZGVsOiAke3NlbGVjdGlvbi5yb3V0ZV9vcHRpb24ubW9kZWx9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB2YWx1ZTogc2VsZWN0ZWQudmFsdWUsXG4gICAgICByb3V0ZU1vZGVsOiBzZWxlY3Rpb24ucm91dGVfb3B0aW9uLm1vZGVsLFxuICAgICAgaGFybmVzczogc2VsZWN0ZWQuaGFybmVzcyxcbiAgICAgIHJvdXRlck5hbWU6IHRoaXMuc2V0dGluZ3Mucm91dGVyTmFtZSxcbiAgICAgIGxhdGVuY3lNczogRGF0ZS5ub3coKSAtIHN0YXJ0ZWRBdCxcbiAgICAgIC4uLihyZXNwb25zZS5yYXRpb25hbGUgPyB7IHJhdGlvbmFsZTogcmVzcG9uc2UucmF0aW9uYWxlIH0gOiB7fSksXG4gICAgICAuLi4oc2VsZWN0aW9uLnBhcmFtcyA/IHsgcGFyYW1zOiBzZWxlY3Rpb24ucGFyYW1zIH0gOiB7fSksXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQnVpbGQgYSBTbWFydCBSb3V0ZXIgY2FuZGlkYXRlIG1lbnUgZnJvbSB2YWx1ZXMgY2FycnlpbmcgbW9kZWxTZXJ2aWNlTmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbWFydFJvdXRlckNhbmRpZGF0ZXM8VCBleHRlbmRzIHsgcmVhZG9ubHkgbW9kZWxTZXJ2aWNlTmFtZT86IHN0cmluZyB9PihcbiAgdmFsdWVzOiByZWFkb25seSBUW10sXG4gIGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcyxcbik6IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10ge1xuICByZXR1cm4gdmFsdWVzLmZsYXRNYXAoKHZhbHVlKSA9PiB7XG4gICAgY29uc3QgbW9kZWwgPSB2YWx1ZS5tb2RlbFNlcnZpY2VOYW1lPy50cmltKCk7XG4gICAgaWYgKCFtb2RlbCB8fCAhbW9kZWwudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFwic3lzdGVtLmFpLlwiKSkgcmV0dXJuIFtdO1xuICAgIHJldHVybiBbeyBtb2RlbCwgaGFybmVzcywgdmFsdWUgfV07XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbnRleHQgZXh0cmFjdG9yIHNoYXJlZCBieSB0aGUgZ2F0ZXdheSwgTWFzdHJhLCBhbmQgdGhlIGZpbGUvc3RkaW4gQ0xJLlxuICogSXQgZmF2b3JzIGNvbnZlcnNhdGlvbi90YXNrIGZpZWxkcyBhbmQgaWdub3JlcyBjcmVkZW50aWFscywgdG9vbCBzY2hlbWFzLFxuICogYW5kIHRvb2wgYXJndW1lbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU21hcnRSb3V0ZXJDb250ZXh0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdG9rZW5CdWRnZXQgPSA0XzA5Nikge31cblxuICAvKiogUmV0dXJuIG9ubHkgdGhlIGJvdW5kZWQgdGFzayBwcm9tcHQgcmVxdWlyZWQgYnkgcm91dGVzOnNlbGVjdC4gKi9cbiAgYXN5bmMgYnVpbGQoaW5wdXQ6IHVua25vd24pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5hbmFseXplKGlucHV0KSkudGFzaztcbiAgfVxuXG4gIC8qKiBSZXR1cm4gYm91bmRlZCB0YXNrIHRleHQgcGx1cyBsb2dpY2FsLXR1cm4gbWV0YWRhdGEgdXNlZCBmb3IgcGlubmluZy4gKi9cbiAgYW5hbHl6ZShpbnB1dDogdW5rbm93bik6IFByb21pc2U8U21hcnRSb3V0ZXJDb250ZXh0PiB7XG4gICAgcmV0dXJuIG5vcm1hbGl6ZU1vZGVsQ29udGV4dChpbnB1dCwgeyB0b2tlbkxpbWl0OiB0aGlzLnRva2VuQnVkZ2V0IH0pO1xuICB9XG59XG5cbi8qKiBTbWFydCBSb3V0ZXIgb3JjaGVzdHJhdGlvbiBzaGFyZWQgYnkgUmVzcG9uc2VzLCBDaGF0IENvbXBsZXRpb25zLCBhbmQgTWVzc2FnZXMuICovXG5leHBvcnQgY2xhc3MgU21hcnRNb2RlbFJvdXRlciB7XG4gIHJlYWRvbmx5IHNlcnZpY2U6IFNtYXJ0Um91dGVyU2VydmljZTtcbiAgcHJpdmF0ZSByZWFkb25seSBzZXR0aW5nczogU21hcnRSb3V0ZXJTZXR0aW5ncztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzZXR0aW5nczogUGFydGlhbDxTbWFydFJvdXRlclNldHRpbmdzPiA9IHt9LFxuICAgIHNlcnZpY2U6IFNtYXJ0Um91dGVyU2VydmljZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JlOiBTbWFydFJvdXRlclN0b3JlID0gbmV3IEFwcEtpdFNtYXJ0Um91dGVyU3RvcmUoKSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCxcbiAgKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHsgLi4uU01BUlRfUk9VVEVSX0RFRkFVTFRfU0VUVElOR1MsIC4uLnNldHRpbmdzIH07XG4gICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZSA/PyBuZXcgU21hcnRSb3V0ZXJTZXJ2aWNlKHRoaXMuc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqIFByb2JlIHdoZXRoZXIgU21hcnQgUm91dGVyIGlzIHVzYWJsZSBmb3IgdGhlIGN1cnJlbnQgbW9kZWwgY2F0YWxvZ3VlLiAqL1xuICBpc0VuYWJsZWQodGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBzbWFydFJvdXRlckNhbmRpZGF0ZXMoXG4gICAgICB0YXJnZXRzLmZpbHRlcigodGFyZ2V0KSA9PiB0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQgJiYgdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCksXG4gICAgICBcImNvZGV4XCIsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5jbGllbnRcbiAgICAgID8gdGhpcy5zZXJ2aWNlLmlzRW5hYmxlZChjYW5kaWRhdGVzLCB0aGlzLmNsaWVudClcbiAgICAgIDogdGhpcy5zZXJ2aWNlLmlzRW5hYmxlZChjYW5kaWRhdGVzKTtcbiAgfVxuXG4gIC8qKiBSZXNvbHZlIG9uZSB2aXJ0dWFsIHNtYXJ0LXJvdXRlciByZXF1ZXN0IHRvIGEgY29uY3JldGUgY29tcGF0aWJsZSB0YXJnZXQuICovXG4gIGFzeW5jIHJlc29sdmUoaW5wdXQ6IHtcbiAgICByZWFkb25seSBib2R5OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgcmVhZG9ubHkgZmVhdHVyZXM6IFJlcXVlc3RlZEZlYXR1cmVzO1xuICAgIHJlYWRvbmx5IGhlYWRlcnM6IEhlYWRlcnM7XG4gICAgcmVhZG9ubHkgcHJlZmVyU3lzdGVtTW9kZWxzOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHByb3RvY29sOiBFeGNsdWRlPENsaWVudFByb3RvY29sLCBcIm9wZW5haS1lbWJlZGRpbmdzXCI+O1xuICAgIHJlYWRvbmx5IHNpZ25hbDogQWJvcnRTaWduYWw7XG4gICAgcmVhZG9ubHkgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXTtcbiAgfSk6IFByb21pc2U8U21hcnRSb3V0ZXJSZXN1bHQ+IHtcbiAgICBjb25zdCBoYXJuZXNzOiBTbWFydFJvdXRlckhhcm5lc3MgPVxuICAgICAgaW5wdXQucHJvdG9jb2wgPT09IFwiYW50aHJvcGljLW1lc3NhZ2VzXCIgPyBcImNsYXVkZVwiIDogXCJjb2RleFwiO1xuICAgIGNvbnN0IGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0ID0gcmVxdWVzdGVkUmVhc29uaW5nRWZmb3J0KGlucHV0LmJvZHkpO1xuICAgIGNvbnN0IGVsaWdpYmxlVGFyZ2V0cyA9IGlucHV0LnRhcmdldHMuZmlsdGVyKCh0YXJnZXQpID0+XG4gICAgICBpc0VsaWdpYmxlVGFyZ2V0KFxuICAgICAgICB0YXJnZXQsXG4gICAgICAgIHsgLi4uaW5wdXQsIG9yaWdpbmF0b3I6IGlucHV0LmhlYWRlcnMuZ2V0KFwib3JpZ2luYXRvclwiKSA/PyB1bmRlZmluZWQgfSxcbiAgICAgICAgZXhwbGljaXRSZWFzb25pbmdFZmZvcnQsXG4gICAgICAgIGhhcm5lc3MsXG4gICAgICApLFxuICAgICk7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IHNtYXJ0Um91dGVyQ2FuZGlkYXRlcyhlbGlnaWJsZVRhcmdldHMsIGhhcm5lc3MpO1xuICAgIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFNtYXJ0Um91dGVyRXJyb3IoXG4gICAgICAgIDQwMCxcbiAgICAgICAgXCJObyBjb21wYXRpYmxlIHN5c3RlbSBtb2RlbHMgYXJlIGF2YWlsYWJsZSB0byBEYXRhYnJpY2tzIFNtYXJ0IFJvdXRlclwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZXh0ID0gYXdhaXQgdGhpcy5zZXJ2aWNlLmNvbnRleHQuYW5hbHl6ZShpbnB1dC5ib2R5KTtcbiAgICBpZiAoIWNvbnRleHQudGFzaykge1xuICAgICAgdGhyb3cgbmV3IFNtYXJ0Um91dGVyRXJyb3IoNDAwLCBcIlNtYXJ0IFJvdXRlciByZXF1ZXN0IGNvbnRhaW5zIG5vIHRhc2sgdGV4dFwiKTtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gc21hcnRSb3V0ZXJUdXJuS2V5KGNvbnRleHQubG9naWNhbFR1cm4sIGNhbmRpZGF0ZXMsIHtcbiAgICAgIGhhcm5lc3MsXG4gICAgICBwcm90b2NvbDogaW5wdXQucHJvdG9jb2wsXG4gICAgICBmZWF0dXJlczogaW5wdXQuZmVhdHVyZXMsXG4gICAgICAuLi4oZXhwbGljaXRSZWFzb25pbmdFZmZvcnQgPyB7IGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgY2FjaGVkID0gY29udGV4dC5jb250aW51YXRpb24gPyBhd2FpdCB0aGlzLnJlYWRDYWNoZWQoa2V5LCBlbGlnaWJsZVRhcmdldHMpIDogdW5kZWZpbmVkO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHRhcmdldDogZWxpZ2libGVUYXJnZXRzLmZpbmQoKHRhcmdldCkgPT4gdGFyZ2V0LmlkID09PSBjYWNoZWQuc2VsZWN0ZWRNb2RlbCkhLFxuICAgICAgICBib2R5OiBpbnB1dC5ib2R5LFxuICAgICAgICBvYnNlcnZhdGlvbjogeyAuLi5jYWNoZWQsIHNvdXJjZTogXCJjYWNoZVwiIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkID0gYXdhaXQgdGhpcy5zZXJ2aWNlLnNlbGVjdChjb250ZXh0LnRhc2ssIGNhbmRpZGF0ZXMsIHtcbiAgICAgIHNpZ25hbDogaW5wdXQuc2lnbmFsLFxuICAgICAgLi4uKHRoaXMuY2xpZW50ID8geyBjbGllbnQ6IHRoaXMuY2xpZW50IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0ZWQudmFsdWU7XG4gICAgY29uc3Qgb2JzZXJ2YXRpb24gPSBTbWFydFJvdXRlck9ic2VydmF0aW9uU2NoZW1hLnBhcnNlKHtcbiAgICAgIHNlbGVjdGVkTW9kZWw6IHRhcmdldC5pZCxcbiAgICAgIHJvdXRlTW9kZWw6IHNlbGVjdGVkLnJvdXRlTW9kZWwsXG4gICAgICBoYXJuZXNzOiBzZWxlY3RlZC5oYXJuZXNzLFxuICAgICAgcm91dGVyTmFtZTogc2VsZWN0ZWQucm91dGVyTmFtZSxcbiAgICAgIHNvdXJjZTogXCJyb3V0ZXJcIixcbiAgICAgIGxhdGVuY3lNczogc2VsZWN0ZWQubGF0ZW5jeU1zLFxuICAgICAgLi4uKHNlbGVjdGVkLnJhdGlvbmFsZSA/IHsgcmF0aW9uYWxlOiBzZWxlY3RlZC5yYXRpb25hbGUgfSA6IHt9KSxcbiAgICAgIC4uLihzZWxlY3RlZC5wYXJhbXMgPyB7IHBhcmFtczogc2VsZWN0ZWQucGFyYW1zIH0gOiB7fSksXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy53cml0ZUNhY2hlZChrZXksIG9ic2VydmF0aW9uKTtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBTbWFydCBSb3V0ZXIgbW9kZWxcIiwge1xuICAgICAgY2FuZGlkYXRlQ291bnQ6IGNhbmRpZGF0ZXMubGVuZ3RoLFxuICAgICAgaGFybmVzcyxcbiAgICAgIGxhdGVuY3lNczogb2JzZXJ2YXRpb24ubGF0ZW5jeU1zLFxuICAgICAgbW9kZWw6IG9ic2VydmF0aW9uLnNlbGVjdGVkTW9kZWwsXG4gICAgICByb3V0ZU1vZGVsOiBvYnNlcnZhdGlvbi5yb3V0ZU1vZGVsLFxuICAgICAgcm91dGVyTmFtZTogb2JzZXJ2YXRpb24ucm91dGVyTmFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4geyB0YXJnZXQsIGJvZHk6IGlucHV0LmJvZHksIG9ic2VydmF0aW9uIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJlYWRDYWNoZWQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdGFyZ2V0czogcmVhZG9ubHkgTW9kZWxUYXJnZXRbXSxcbiAgKTogUHJvbWlzZTxTbWFydFJvdXRlck9ic2VydmF0aW9uIHwgdW5kZWZpbmVkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IFNtYXJ0Um91dGVyT2JzZXJ2YXRpb25TY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHRoaXMuc3RvcmUuZ2V0KGtleSkpO1xuICAgICAgaWYgKCFwYXJzZWQuc3VjY2VzcykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB0YXJnZXRzLnNvbWUoKHRhcmdldCkgPT4gdGFyZ2V0LmlkID09PSBwYXJzZWQuZGF0YS5zZWxlY3RlZE1vZGVsKVxuICAgICAgICA/IHBhcnNlZC5kYXRhXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJTbWFydCBSb3V0ZXIgY2FjaGUgcmVhZCBmYWlsZWRcIiwgeyBlcnJvcjogdG9FcnJvcihlcnJvcikgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVDYWNoZWQoa2V5OiBzdHJpbmcsIG9ic2VydmF0aW9uOiBTbWFydFJvdXRlck9ic2VydmF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcmUuc2V0KGtleSwgb2JzZXJ2YXRpb24sIHRoaXMuc2V0dGluZ3Mucm91dGVUdGxTZWNvbmRzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiU21hcnQgUm91dGVyIGNhY2hlIHdyaXRlIGZhaWxlZFwiLCB7IGVycm9yOiB0b0Vycm9yKGVycm9yKSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIFN0YWJsZSBsb2dpY2FsLXR1cm4ga2V5IHNoYXJlZCBieSBpbml0aWFsIHJlcXVlc3RzIGFuZCB0b29sIGNvbnRpbnVhdGlvbnMuICovXG5leHBvcnQgZnVuY3Rpb24gc21hcnRSb3V0ZXJUdXJuS2V5KFxuICBsb2dpY2FsVHVybjogc3RyaW5nLFxuICBjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTx1bmtub3duPltdLFxuICBjb250ZXh0OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIGxvZ2ljYWxUdXJuLFxuICAgICAgICBjYW5kaWRhdGVzOiBjYW5kaWRhdGVzLm1hcCgoeyBtb2RlbCwgaGFybmVzcyB9KSA9PiAoeyBtb2RlbCwgaGFybmVzcyB9KSksXG4gICAgICAgIGNvbnRleHQsXG4gICAgICB9KSxcbiAgICApXG4gICAgLmRpZ2VzdChcImhleFwiKTtcbn1cblxuZnVuY3Rpb24gaXNFbGlnaWJsZVRhcmdldChcbiAgdGFyZ2V0OiBNb2RlbFRhcmdldCxcbiAgaW5wdXQ6IHtcbiAgICByZWFkb25seSBmZWF0dXJlczogUmVxdWVzdGVkRmVhdHVyZXM7XG4gICAgcmVhZG9ubHkgb3JpZ2luYXRvcj86IHN0cmluZztcbiAgICByZWFkb25seSBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgcHJvdG9jb2w6IEV4Y2x1ZGU8Q2xpZW50UHJvdG9jb2wsIFwib3BlbmFpLWVtYmVkZGluZ3NcIj47XG4gIH0sXG4gIGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0OiBSZWFzb25pbmdFZmZvcnQgfCB1bmRlZmluZWQsXG4gIGhhcm5lc3M6IFNtYXJ0Um91dGVySGFybmVzcyxcbik6IGJvb2xlYW4ge1xuICBpZiAoIXRhcmdldC5lbmRwb2ludCB8fCB0YXJnZXQuZW5kcG9pbnQuc3RhdHVzPy5kZXByZWNhdGVkID09PSB0cnVlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghdGFyZ2V0Lm1vZGVsU2VydmljZU5hbWU/LnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChcInN5c3RlbS5haS5cIikpIHJldHVybiBmYWxzZTtcbiAgaWYgKCF0YXJnZXQuY2FwYWJpbGl0aWVzLmNoYXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGhhcm5lc3MgPT09IFwiY29kZXhcIiAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy5haUdhdGV3YXlDb2RleCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaGFybmVzcyA9PT0gXCJjbGF1ZGVcIiAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy5hbnRocm9waWMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLnRvb2xzICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLnRvb2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpbnB1dC5mZWF0dXJlcy5wYXJhbGxlbFRvb2xzICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLnBhcmFsbGVsVG9vbHMpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLmN1c3RvbVRvb2xzICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLmN1c3RvbVRvb2xzKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpbnB1dC5mZWF0dXJlcy5zdHJ1Y3R1cmVkT3V0cHV0ICYmICF0YXJnZXQuY2FwYWJpbGl0aWVzLnN0cnVjdHVyZWRPdXRwdXQpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLndlYlNlYXJjaCAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy53ZWJTZWFyY2gpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlucHV0LmZlYXR1cmVzLmltYWdlSW5wdXQgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMuaW1hZ2VJbnB1dCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaW5wdXQuZmVhdHVyZXMuYXBwbHlQYXRjaCAmJiAhdGFyZ2V0LmNhcGFiaWxpdGllcy5hcHBseVBhdGNoKSByZXR1cm4gZmFsc2U7XG4gIGlmIChpbnB1dC5mZWF0dXJlcy5yZWFzb25pbmcgJiYgIXRhcmdldC5jYXBhYmlsaXRpZXMucmVhc29uaW5nKSByZXR1cm4gZmFsc2U7XG4gIGlmIChcbiAgICBleHBsaWNpdFJlYXNvbmluZ0VmZm9ydCAmJlxuICAgIGV4cGxpY2l0UmVhc29uaW5nRWZmb3J0ICE9PSBcIm5vbmVcIiAmJlxuICAgICF0YXJnZXQucmVhc29uaW5nRWZmb3J0cy5pbmNsdWRlcyhleHBsaWNpdFJlYXNvbmluZ0VmZm9ydClcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHRyeSB7XG4gICAgcmVzb2x2ZVJvdXRlKHtcbiAgICAgIGNsaWVudFByb3RvY29sOiBpbnB1dC5wcm90b2NvbCxcbiAgICAgIC4uLihpbnB1dC5vcmlnaW5hdG9yID8geyBvcmlnaW5hdG9yOiBpbnB1dC5vcmlnaW5hdG9yIH0gOiB7fSksXG4gICAgICBwcmVmZXJTeXN0ZW1Nb2RlbHM6IGlucHV0LnByZWZlclN5c3RlbU1vZGVscyxcbiAgICAgIGZlYXR1cmVzOiBpbnB1dC5mZWF0dXJlcyxcbiAgICAgIHRhcmdldCxcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RlZFJlYXNvbmluZ0VmZm9ydChcbiAgYm9keTogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuKTogUmVhc29uaW5nRWZmb3J0IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVhc29uaW5nID0gaXNSZWNvcmQoYm9keS5yZWFzb25pbmcpID8gYm9keS5yZWFzb25pbmcgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG91dHB1dENvbmZpZyA9IGlzUmVjb3JkKGJvZHkub3V0cHV0X2NvbmZpZykgPyBib2R5Lm91dHB1dF9jb25maWcgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJhdyA9IGJvZHkucmVhc29uaW5nX2VmZm9ydCA/PyByZWFzb25pbmc/LmVmZm9ydCA/PyBvdXRwdXRDb25maWc/LmVmZm9ydDtcbiAgaWYgKHJhdyA9PT0gdW5kZWZpbmVkIHx8IHJhdyA9PT0gbnVsbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IFN0cmluZyhyYXcpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2VBbGwoXCJfXCIsIFwiLVwiKTtcbiAgY29uc3QgcGFyc2VkID0gUmVhc29uaW5nRWZmb3J0U2NoZW1hLnNhZmVQYXJzZShcbiAgICBub3JtYWxpemVkID09PSBcImV4dHJhLWhpZ2hcIiA/IFwieGhpZ2hcIiA6IG5vcm1hbGl6ZWQsXG4gICk7XG4gIGlmICghcGFyc2VkLnN1Y2Nlc3MpIHtcbiAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcig0MDAsIGBVbnN1cHBvcnRlZCBTbWFydCBSb3V0ZXIgcmVhc29uaW5nIGVmZm9ydDogJHtTdHJpbmcocmF3KX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkLmRhdGE7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZUNhbmRpZGF0ZXM8VD4oXG4gIGNhbmRpZGF0ZXM6IHJlYWRvbmx5IFNtYXJ0Um91dGVyQ2FuZGlkYXRlPFQ+W10sXG4pOiBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICByZXR1cm4gY2FuZGlkYXRlcy5maWx0ZXIoKGNhbmRpZGF0ZSkgPT4ge1xuICAgIGNvbnN0IGtleSA9IGAke2NhbmRpZGF0ZS5oYXJuZXNzfToke25vcm1hbGl6ZVJvdXRlTW9kZWwoY2FuZGlkYXRlLm1vZGVsKX1gO1xuICAgIGlmIChzZWVuLmhhcyhrZXkpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQoa2V5KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVJvdXRlTW9kZWwobW9kZWw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGxldCBub3JtYWxpemVkID0gbW9kZWwudHJpbSgpLnRvTG93ZXJDYXNlKCkuc3BsaXQoXCIvXCIpLmF0KC0xKSA/PyBcIlwiO1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbXCJkYXRhYnJpY2tzLVwiLCBcInN5c3RlbS5haS5cIl0gYXMgY29uc3QpIHtcbiAgICBpZiAobm9ybWFsaXplZC5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIG5vcm1hbGl6ZWQgPSBub3JtYWxpemVkLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG5mdW5jdGlvbiBwcm9iZUtleTxUPihjYW5kaWRhdGVzOiByZWFkb25seSBTbWFydFJvdXRlckNhbmRpZGF0ZTxUPltdLCByb3V0ZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgIHJvdXRlck5hbWUsXG4gICAgY2FuZGlkYXRlczogY2FuZGlkYXRlc1xuICAgICAgLm1hcCgoeyBtb2RlbCwgaGFybmVzcyB9KSA9PiAoeyBtb2RlbDogbm9ybWFsaXplUm91dGVNb2RlbChtb2RlbCksIGhhcm5lc3MgfSkpXG4gICAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgICAgIGAke2xlZnQuaGFybmVzc306JHtsZWZ0Lm1vZGVsfWAubG9jYWxlQ29tcGFyZShgJHtyaWdodC5oYXJuZXNzfToke3JpZ2h0Lm1vZGVsfWApLFxuICAgICAgKSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGFwcEtpdENhY2hlTWFuYWdlcigpOiBDYWNoZU1hbmFnZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gc21hcnRSb3V0ZXJQcm9iZUlkZW50aXR5KGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICByZXR1cm4gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUoaG9zdClcbiAgICAudXBkYXRlKFwiXFwwXCIpXG4gICAgLnVwZGF0ZShoZWFkZXJzLmdldChcImF1dGhvcml6YXRpb25cIikgPz8gXCJcIilcbiAgICAudXBkYXRlKFwiXFwwXCIpXG4gICAgLnVwZGF0ZShoZWFkZXJzLmdldChcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIikgPz8gXCJcIilcbiAgICAuZGlnZXN0KFwiaGV4XCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbnZva2VTbWFydFJvdXRlcihcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGJvZHk6IFNtYXJ0Um91dGVyUmVxdWVzdCxcbiAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgdGltZW91dE1zOiBudW1iZXIsXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgY29uc3QgaG9zdCA9IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChcIi9haS1nYXRld2F5L3JvdXRpbmcvdjEvcm91dGVzOnNlbGVjdFwiLCBob3N0KTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSk7XG4gIGF3YWl0IGNsaWVudC5jb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCBjb21iaW5lZFNpZ25hbCA9IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCBBYm9ydFNpZ25hbC50aW1lb3V0KHRpbWVvdXRNcyldKTtcbiAgbGV0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzLFxuICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGJvZHkpLFxuICAgIHNpZ25hbDogY29tYmluZWRTaWduYWwsXG4gIH0pO1xuICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEgJiYgKGF3YWl0IHJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihjbGllbnQpKSkge1xuICAgIGF3YWl0IHJlc3BvbnNlLmJvZHk/LmNhbmNlbCgpO1xuICAgIGhlYWRlcnMuZGVsZXRlKFwiYXV0aG9yaXphdGlvblwiKTtcbiAgICBoZWFkZXJzLmRlbGV0ZShcIngtZGF0YWJyaWNrcy13b3Jrc3BhY2UtaWRcIik7XG4gICAgYXdhaXQgY2xpZW50LmNvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gICAgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgICBzaWduYWw6IGNvbWJpbmVkU2lnbmFsLFxuICAgIH0pO1xuICB9XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICBjb25zdCBkZXRhaWwgPSAoYXdhaXQgcmVzcG9uc2UudGV4dCgpLmNhdGNoKCgpID0+IFwiXCIpKS50cmltKCkuc2xpY2UoMCwgNTAwKTtcbiAgICB0aHJvdyBuZXcgU21hcnRSb3V0ZXJFcnJvcihcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0ID8gNDA0IDogNTAzLFxuICAgICAgYERhdGFicmlja3MgU21hcnQgUm91dGVyIGZhaWxlZCB3aXRoIEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9JHtkZXRhaWwgPyBgOiAke2RldGFpbH1gIDogXCJcIn1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKTtcbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/gateway.ts","../src/models.ts","../src/plugin.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/smart-router.ts","../src/translation.ts","../src/transport.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
|
|
1
|
+
{"root":["../src/ai-decide.ts","../src/gateway.ts","../src/model-context.ts","../src/models.ts","../src/plugin.ts","../src/reasoning-adapt.ts","../src/registry.ts","../src/router.ts","../src/routes.ts","../src/smart-router.ts","../src/translation.ts","../src/transport.ts","../scripts/copy-manifest.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -27,13 +27,13 @@
|
|
|
27
27
|
},
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
|
-
"@dbx-tools/cache": "0.9.
|
|
31
|
-
"@dbx-tools/databricks": "0.9.
|
|
32
|
-
"@dbx-tools/model": "0.9.
|
|
33
|
-
"@dbx-tools/model-protocol": "0.9.
|
|
34
|
-
"@dbx-tools/shared-core": "0.9.
|
|
35
|
-
"@dbx-tools/shared-model": "0.9.
|
|
36
|
-
"@dbx-tools/shared-model-gateway": "0.9.
|
|
30
|
+
"@dbx-tools/cache": "0.9.193",
|
|
31
|
+
"@dbx-tools/databricks": "0.9.193",
|
|
32
|
+
"@dbx-tools/model": "0.9.193",
|
|
33
|
+
"@dbx-tools/model-protocol": "0.9.193",
|
|
34
|
+
"@dbx-tools/shared-core": "0.9.193",
|
|
35
|
+
"@dbx-tools/shared-model": "0.9.193",
|
|
36
|
+
"@dbx-tools/shared-model-gateway": "0.9.193",
|
|
37
37
|
"ai": "^7.0.0",
|
|
38
38
|
"js-tiktoken": "^1.0.21",
|
|
39
39
|
"zod": "4.3.6"
|
|
@@ -52,7 +52,7 @@
|
|
|
52
52
|
"./package.json": "./package.json"
|
|
53
53
|
}
|
|
54
54
|
},
|
|
55
|
-
"version": "0.9.
|
|
55
|
+
"version": "0.9.193",
|
|
56
56
|
"types": "./lib/index.d.ts",
|
|
57
57
|
"dbxToolsConfig": {
|
|
58
58
|
"tags": [
|