@dbx-tools/appkit-mastra 0.9.153 → 0.9.157
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/index.ts +32 -24
- package/lib/index.d.ts +32 -24
- package/lib/index.js +32 -23
- package/lib/src/agents.d.ts +5 -6
- package/lib/src/agents.js +12 -15
- package/lib/src/chart.js +33 -33
- package/lib/src/chat.js +10 -13
- package/lib/src/config.d.ts +12 -13
- package/lib/src/config.js +4 -4
- package/lib/src/evaluation.js +7 -9
- package/lib/src/feedback-mode.d.ts +1 -1
- package/lib/src/feedback-mode.js +1 -1
- package/lib/src/filesystems.js +6 -6
- package/lib/src/follow-up-suggestions.js +10 -10
- package/lib/src/genie-chat.js +27 -29
- package/lib/src/genie.d.ts +2 -2
- package/lib/src/genie.js +29 -29
- package/lib/src/identity.d.ts +3 -30
- package/lib/src/identity.js +2 -27
- package/lib/src/memory.d.ts +1 -1
- package/lib/src/memory.js +24 -6
- package/lib/src/mlflow.d.ts +4 -4
- package/lib/src/mlflow.js +15 -18
- package/lib/src/model.d.ts +3 -3
- package/lib/src/model.js +6 -6
- package/lib/src/monty-sandbox.js +8 -8
- package/lib/src/observability.d.ts +6 -5
- package/lib/src/observability.js +8 -6
- package/lib/src/plugin.d.ts +1 -1
- package/lib/src/plugin.js +49 -51
- package/lib/src/remote-skills.d.ts +3 -4
- package/lib/src/remote-skills.js +46 -46
- package/lib/src/rest.d.ts +2 -2
- package/lib/src/rest.js +3 -3
- package/lib/src/server.js +17 -20
- package/lib/src/serving.js +10 -11
- package/lib/src/statement.js +7 -7
- package/lib/src/storage-schema.js +4 -4
- package/lib/src/summarize.js +5 -5
- package/lib/src/telemetry.d.ts +0 -6
- package/lib/src/telemetry.js +34 -41
- package/lib/src/validation.js +3 -4
- package/lib/src/workspaces.d.ts +2 -2
- package/lib/src/workspaces.js +34 -36
- package/lib/src/writer.d.ts +2 -2
- package/lib/src/writer.js +3 -3
- package/package.json +17 -305
- package/src/agents.ts +27 -21
- package/src/chart.ts +43 -37
- package/src/chat.ts +10 -12
- package/src/config.ts +14 -15
- package/src/evaluation.ts +6 -8
- package/src/feedback-mode.ts +1 -1
- package/src/filesystems.ts +5 -5
- package/src/follow-up-suggestions.ts +9 -9
- package/src/genie-chat.ts +32 -31
- package/src/genie.ts +29 -29
- package/src/identity.ts +3 -38
- package/src/memory.ts +24 -6
- package/src/mlflow.ts +21 -21
- package/src/model.ts +7 -7
- package/src/monty-sandbox.ts +7 -7
- package/src/observability.ts +8 -6
- package/src/plugin.ts +78 -65
- package/src/remote-skills.ts +63 -55
- package/src/rest.ts +4 -4
- package/src/server.ts +32 -20
- package/src/serving.ts +14 -11
- package/src/statement.ts +10 -6
- package/src/storage-schema.ts +3 -3
- package/src/summarize.ts +4 -4
- package/src/telemetry.ts +49 -55
- package/src/validation.ts +2 -3
- package/src/workspaces.ts +52 -42
- package/src/writer.ts +3 -3
package/lib/src/mlflow.js
CHANGED
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
* @module
|
|
26
26
|
*/
|
|
27
27
|
import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
28
|
+
import { log, sleep, isDatabricksAppEnv, toError, isRecord } from "@dbx-tools/shared-core";
|
|
29
|
+
import { DEFAULT_FEEDBACK_NAME, DEFAULT_COMMENT_NAME, } from "@dbx-tools/shared-mastra";
|
|
30
30
|
import { TraceLocationType, TraceMetadataKey } from "@mlflow/core";
|
|
31
31
|
import { TraceInfo } from "@mlflow/core/dist/core/entities/trace_info.js";
|
|
32
32
|
import { TraceState } from "@mlflow/core/dist/core/entities/trace_state.js";
|
|
@@ -140,14 +140,14 @@ function experimentTagMap(raw) {
|
|
|
140
140
|
const tags = new Map();
|
|
141
141
|
if (Array.isArray(raw)) {
|
|
142
142
|
for (const tag of raw) {
|
|
143
|
-
if (!
|
|
143
|
+
if (!isRecord(tag) || typeof tag.key !== "string" || typeof tag.value !== "string") {
|
|
144
144
|
continue;
|
|
145
145
|
}
|
|
146
146
|
tags.set(tag.key, tag.value);
|
|
147
147
|
}
|
|
148
148
|
return tags;
|
|
149
149
|
}
|
|
150
|
-
if (!
|
|
150
|
+
if (!isRecord(raw))
|
|
151
151
|
return tags;
|
|
152
152
|
for (const [key, value] of Object.entries(raw)) {
|
|
153
153
|
if (typeof value === "string")
|
|
@@ -297,7 +297,7 @@ function configuredExperiment() {
|
|
|
297
297
|
}
|
|
298
298
|
/** Tracking URI for direct local MLflow tracing, with CLI-profile auth injected. */
|
|
299
299
|
export function directMlflowTrackingUri() {
|
|
300
|
-
if (
|
|
300
|
+
if (isDatabricksAppEnv())
|
|
301
301
|
return undefined;
|
|
302
302
|
const configured = process.env.MLFLOW_TRACKING_URI?.trim();
|
|
303
303
|
if (configured && configured !== "databricks")
|
|
@@ -330,13 +330,11 @@ export function directMlflowTraceLocation() {
|
|
|
330
330
|
}
|
|
331
331
|
/** Whether the local direct-to-experiment MLflow SDK has enough configuration. */
|
|
332
332
|
export function directMlflowTracingConfigured() {
|
|
333
|
-
return Boolean(!
|
|
334
|
-
process.env.MLFLOW_EXPERIMENT_ID?.trim() &&
|
|
335
|
-
directMlflowTrackingUri());
|
|
333
|
+
return Boolean(!isDatabricksAppEnv() && process.env.MLFLOW_EXPERIMENT_ID?.trim() && directMlflowTrackingUri());
|
|
336
334
|
}
|
|
337
335
|
/** Whether a Databricks App can promote OTLP spans into full MLflow trace info. */
|
|
338
336
|
export function appMlflowTraceInfoConfigured() {
|
|
339
|
-
return Boolean(
|
|
337
|
+
return Boolean(isDatabricksAppEnv() &&
|
|
340
338
|
(process.env.MLFLOW_EXPERIMENT_ID?.trim() || process.env.MLFLOW_EXPERIMENT_NAME?.trim()) &&
|
|
341
339
|
(process.env.OTEL_EXPORTER_OTLP_ENDPOINT?.trim() ||
|
|
342
340
|
process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT?.trim()));
|
|
@@ -361,7 +359,7 @@ export async function initializeAppMlflowTraceInfo(client) {
|
|
|
361
359
|
}
|
|
362
360
|
catch (err) {
|
|
363
361
|
logger.warn("Databricks Apps MLflow trace-info promotion disabled", {
|
|
364
|
-
error:
|
|
362
|
+
error: toError(err),
|
|
365
363
|
});
|
|
366
364
|
// Startup uses the service principal. Permit one later request-scoped
|
|
367
365
|
// client to resolve experiment metadata when that principal cannot read it.
|
|
@@ -425,7 +423,7 @@ export function persistAppMlflowTraceInfo(params) {
|
|
|
425
423
|
.catch((err) => {
|
|
426
424
|
logger.warn("Databricks Apps MLflow trace-info promotion failed", {
|
|
427
425
|
traceId: params.traceId,
|
|
428
|
-
error:
|
|
426
|
+
error: toError(err),
|
|
429
427
|
});
|
|
430
428
|
})
|
|
431
429
|
.finally(() => pendingAppMlflowTraceInfo.delete(pending));
|
|
@@ -465,7 +463,7 @@ async function detectedDirectMlflowTraceLocation(mlflow, trackingUri, experiment
|
|
|
465
463
|
catch (err) {
|
|
466
464
|
logger.warn("direct MLflow UC trace-location detection failed", {
|
|
467
465
|
experimentId,
|
|
468
|
-
error:
|
|
466
|
+
error: toError(err),
|
|
469
467
|
});
|
|
470
468
|
return undefined;
|
|
471
469
|
}
|
|
@@ -520,7 +518,7 @@ export async function initializeDirectMlflowTracing() {
|
|
|
520
518
|
}
|
|
521
519
|
catch (err) {
|
|
522
520
|
logger.warn("direct MLflow tracing disabled", {
|
|
523
|
-
error:
|
|
521
|
+
error: toError(err),
|
|
524
522
|
});
|
|
525
523
|
return false;
|
|
526
524
|
}
|
|
@@ -630,8 +628,7 @@ export async function logFeedback(client, params) {
|
|
|
630
628
|
// A comment with no thumbs value is logged as text feedback; a value
|
|
631
629
|
// (with an optional comment as the rationale) is the thumbs path.
|
|
632
630
|
const hasValue = params.value !== undefined;
|
|
633
|
-
const name = params.name?.trim() ||
|
|
634
|
-
(hasValue ? feedback.DEFAULT_FEEDBACK_NAME : feedback.DEFAULT_COMMENT_NAME);
|
|
631
|
+
const name = params.name?.trim() || (hasValue ? DEFAULT_FEEDBACK_NAME : DEFAULT_COMMENT_NAME);
|
|
635
632
|
const value = hasValue ? params.value : params.comment;
|
|
636
633
|
const assessmentTraceId = mlflowAssessmentTraceId(params.traceId, await resolveUcTracePrefix(client));
|
|
637
634
|
const assessment = {
|
|
@@ -657,7 +654,7 @@ export async function logFeedback(client, params) {
|
|
|
657
654
|
logger.warn("feedback request failed", {
|
|
658
655
|
traceId: params.traceId,
|
|
659
656
|
assessmentTraceId,
|
|
660
|
-
error:
|
|
657
|
+
error: toError(err),
|
|
661
658
|
});
|
|
662
659
|
return undefined;
|
|
663
660
|
}
|
|
@@ -670,7 +667,7 @@ export async function logFeedback(client, params) {
|
|
|
670
667
|
// Trace export is async; a fresh trace may not exist yet. Retry a
|
|
671
668
|
// few times with a short backoff before giving up softly.
|
|
672
669
|
if (res.status === 404 && attempt < NOT_FOUND_RETRIES) {
|
|
673
|
-
await
|
|
670
|
+
await sleep(NOT_FOUND_BACKOFF_MS * (attempt + 1));
|
|
674
671
|
continue;
|
|
675
672
|
}
|
|
676
673
|
logger.warn("feedback not recorded", {
|
|
@@ -683,4 +680,4 @@ export async function logFeedback(client, params) {
|
|
|
683
680
|
}
|
|
684
681
|
return undefined;
|
|
685
682
|
}
|
|
686
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMvRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFJNUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEtBQUssQ0FBQztBQUN4QixPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRXJFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7QUFLM0MsSUFBSSxZQUFzQyxDQUFDO0FBQzNDLElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBQ3BDLElBQUksb0JBQW9ELENBQUM7QUFDekQsSUFBSSxxQkFBZ0QsQ0FBQztBQUNyRCxJQUFJLDZCQUE2QixHQUFHLEtBQUssQ0FBQztBQUMxQyxJQUFJLG9DQUFvQyxHQUFHLEtBQUssQ0FBQztBQUNqRCxJQUFJLHdCQUFxRCxDQUFDO0FBQzFELElBQUksb0JBQXdDLENBQUM7QUFDN0MsTUFBTSx5QkFB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QUMsQ0FBQztZQUNILE9BQU8sU0FBUyxDQUFDO1FBQ25CLENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0MsTUFBTSxZQUFZLEdBQ2YsTUFBdUQsRUFBRSxVQUFVLEVBQUUsYUFBYTtnQkFDbEYsTUFBc0MsRUFBRSxhQUFhLENBQUM7WUFDekQsT0FBTyxPQUFPLFlBQVksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFDRCxrRUFBa0U7UUFDbEUsMERBQTBEO1FBQzFELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxHQUFHLGlCQUFpQixFQUFFLENBQUM7WUFDdEQsTUFBTSxVQUFVLENBQUMsS0FBSyxDQUFDLG9CQUFvQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0QsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ25DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixpQkFBaUI7WUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUxmbG93IHVzZXItZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFVDLWJhY2tlZCBBcHBzIHRyYWNlcyBuZWVkXG4gKiB0aGUgZXhwZXJpbWVudCdzIHRhYmxlLXByZWZpeCBVUkkgKGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YClcbiAqIHJhdGhlciB0aGFuIHRoZSBleHBlcmltZW50LXN0b3JlIGlkIHRoZSBVSSBkb2VzIG5vdCBzdG9yZS4gVGhhdCBwcmVmaXggaXNcbiAqIHJlYWQgZnJvbSB0aGUgZXhwZXJpbWVudCdzIGBtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhgXG4gKiB0YWcgKG9yIHRoZSBzcGFucy10YWJsZSB0YWcpOyBgTUxGTE9XX1VDX1RSQUNFX1BSRUZJWGAgcmVtYWlucyBhbiBvcHRpb25hbFxuICogb3ZlcnJpZGUuIFRyYWNlIGV4cG9ydCBpcyBhc3luY2hyb25vdXMsIHNvIHRoZSBqdXN0LWZpbmlzaGVkIHRyYWNlIG1heSBub3RcbiAqIGV4aXN0IGluIE1MZmxvdyB5ZXQgd2hlbiB0aGUgdXNlciByZWFjdHM7IHRoZSBsb2cgY2FsbCByZXRyaWVzIGJyaWVmbHkgb25cbiAqIFwibm90IGZvdW5kXCIgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBhc3luY1V0aWxzLCBlbnZpcm9ubWVudFV0aWxzLCBlcnJvclV0aWxzLCBsb2csIG9iamVjdCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBmZWVkYmFjayB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB7IFRyYWNlTG9jYXRpb25UeXBlLCBUcmFjZU1ldGFkYXRhS2V5IH0gZnJvbSBcIkBtbGZsb3cvY29yZVwiO1xuaW1wb3J0IHsgVHJhY2VJbmZvIH0gZnJvbSBcIkBtbGZsb3cvY29yZS9kaXN0L2NvcmUvZW50aXRpZXMvdHJhY2VfaW5mby5qc1wiO1xuaW1wb3J0IHsgVHJhY2VTdGF0ZSB9IGZyb20gXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2VudGl0aWVzL3RyYWNlX3N0YXRlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFJlYWRhYmxlU3BhbiwgU3BhbiBhcyBTZGtTcGFuLCBTcGFuUHJvY2Vzc29yIH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L3Nkay10cmFjZS1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVUcmFjZXJQcm92aWRlciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7IGRhdGFicmlja3NGZXRjaCwgcmVhZFJlc3BvbnNlSnNvbiwgcmVhZFJlc3BvbnNlVGV4dCB9IGZyb20gXCIuL3Jlc3QudHNcIjtcbmltcG9ydCB7IEFQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFIgfSBmcm9tIFwiLi90cmFjZS1hdHRyaWJ1dGVzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvbWxmbG93XCIpO1xuXG50eXBlIE1sZmxvd01vZHVsZSA9IHR5cGVvZiBpbXBvcnQoXCJAbWxmbG93L2NvcmVcIik7XG50eXBlIFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMgPSBQYXJhbWV0ZXJzPE1sZmxvd01vZHVsZVtcInVwZGF0ZUN1cnJlbnRUcmFjZVwiXT5bMF07XG5cbmxldCBkaXJlY3RNbGZsb3c6IE1sZmxvd01vZHVsZSB8IHVuZGVmaW5lZDtcbmxldCBkaXJlY3RNbGZsb3dJbml0U3RhcnRlZCA9IGZhbHNlO1xubGV0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyOiBOb2RlVHJhY2VyUHJvdmlkZXIgfCB1bmRlZmluZWQ7XG5sZXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yOiBTcGFuUHJvY2Vzc29yIHwgdW5kZWZpbmVkO1xubGV0IGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvUmVxdWVzdEluaXRTdGFydGVkID0gZmFsc2U7XG5sZXQgYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG5sZXQgYXBwTWxmbG93VHJhY2VQcmVmaXg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbmNvbnN0IHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8gPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG5cbmNvbnN0IE5PSVNZX0lOU1RSVU1FTlRBVElPTl9TQ09QRVMgPSBuZXcgU2V0KFtcbiAgXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24tZXhwcmVzc1wiLFxuICBcIkBvcGVudGVsZW1ldHJ5L2luc3RydW1lbnRhdGlvbi1odHRwXCIsXG4gIFwiY2FjaGUtbWFuYWdlci1jYWNoZS1tYW5hZ2VyXCIsXG5dKTtcblxuZnVuY3Rpb24gaXNBZ2VudFRyYWNlUm9vdChzcGFuOiBTZGtTcGFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGFuLmF0dHJpYnV0ZXNbQVBQS0lUX0FHRU5UX1RSQUNFX1JPT1RfQVRUUl0gPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIGlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW46IFNka1NwYW4pOiBib29sZWFuIHtcbiAgcmV0dXJuICFOT0lTWV9JTlNUUlVNRU5UQVRJT05fU0NPUEVTLmhhcyhzcGFuLmluc3RydW1lbnRhdGlvblNjb3BlLm5hbWUpO1xufVxuXG4vKipcbiAqIFJlc3RyaWN0IHRoZSBkaXJlY3QgTUxmbG93IHByb3ZpZGVyIHRvIGNoYXQgcm9vdHMgYW5kIHRoZWlyIGRlc2NlbmRhbnRzLlxuICogQXBwS2l0IGFuZCBNYXN0cmEgY3JlYXRlIG90aGVyIE9UZWwgcm9vdHMgZm9yIGNhY2hlIGFuZCBwbHVnaW4gb3BlcmF0aW9ucztcbiAqIGZvcndhcmRpbmcgdGhvc2Ugd291bGQgcmVjcmVhdGUgdGhlIG9uZS10cmFjZS1wZXItcmVxdWVzdCBub2lzZSB0aGlzIHBhdGggaXNcbiAqIGludGVuZGVkIHRvIGF2b2lkLlxuICovXG5leHBvcnQgY2xhc3MgQWdlbnRUcmFjZVNwYW5Qcm9jZXNzb3IgaW1wbGVtZW50cyBTcGFuUHJvY2Vzc29yIHtcbiAgcHJpdmF0ZSByZWFkb25seSB0cmFjZUlkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNwYW5JZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGRlbGVnYXRlOiBTcGFuUHJvY2Vzc29yKSB7fVxuXG4gIG9uU3RhcnQoc3BhbjogU2RrU3BhbiwgcGFyZW50Q29udGV4dDogQ29udGV4dCk6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBpc1Jvb3QgPSAhc3Bhbi5wYXJlbnRTcGFuQ29udGV4dD8uc3BhbklkO1xuICAgIGlmIChpc1Jvb3QpIHtcbiAgICAgIGlmICghaXNBZ2VudFRyYWNlUm9vdChzcGFuKSkgcmV0dXJuO1xuICAgICAgdGhpcy50cmFjZUlkcy5hZGQodHJhY2VJZCk7XG4gICAgfSBlbHNlIGlmICghdGhpcy50cmFjZUlkcy5oYXModHJhY2VJZCkgfHwgIWlzVXNlZnVsQWdlbnREZXNjZW5kYW50KHNwYW4pKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc3Bhbklkcy5hZGQoc3Bhbi5zcGFuQ29udGV4dCgpLnNwYW5JZCk7XG4gICAgdGhpcy5kZWxlZ2F0ZS5vblN0YXJ0KHNwYW4sIHBhcmVudENvbnRleHQpO1xuICB9XG5cbiAgb25FbmRpbmcoc3BhbjogU2RrU3Bhbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmhhcyhzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZWdhdGUub25FbmRpbmc/LihzcGFuKTtcbiAgfVxuXG4gIG9uRW5kKHNwYW46IFJlYWRhYmxlU3Bhbik6IHZvaWQge1xuICAgIGNvbnN0IHRyYWNlSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkudHJhY2VJZDtcbiAgICBjb25zdCBzcGFuSWQgPSBzcGFuLnNwYW5Db250ZXh0KCkuc3BhbklkO1xuICAgIGlmICghdGhpcy5zcGFuSWRzLmRlbGV0ZShzcGFuSWQpKSByZXR1cm47XG4gICAgdGhpcy5kZWxlZ2F0ZS5vbkVuZChzcGFuKTtcbiAgICBpZiAoIXNwYW4ucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZCkgdGhpcy50cmFjZUlkcy5kZWxldGUodHJhY2VJZCk7XG4gIH1cblxuICBmb3JjZUZsdXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmZvcmNlRmx1c2goKTtcbiAgfVxuXG4gIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudHJhY2VJZHMuY2xlYXIoKTtcbiAgICB0aGlzLnNwYW5JZHMuY2xlYXIoKTtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zaHV0ZG93bigpO1xuICB9XG59XG5cbi8qKiBXb3Jrc3BhY2UgY2xpZW50IGNhcnJpZWQgb24gYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0LiAqL1xudHlwZSBXb3Jrc3BhY2VDbGllbnQgPSBhcHBraXQuV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIEV4cGVyaW1lbnQgdGFnIERhdGFicmlja3Mgc3RvcmVzIGFzIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgLiAqL1xuY29uc3QgVFJBQ0VfREVTVElOQVRJT05fUEFUSF9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZURlc3RpbmF0aW9uUGF0aFwiO1xuLyoqIEV4cGVyaW1lbnQgdGFnIG5hbWluZyB0aGUgT1RlbCBzcGFucyB0YWJsZSAoYGNhdGFsb2cuc2NoZW1hLntwcmVmaXh9X290ZWxfc3BhbnNgKS4gKi9cbmNvbnN0IFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZVNwYW5TdG9yYWdlVGFibGVcIjtcblxuLyoqXG4gKiBDYWNoZWQgVUMgdGFibGUgcHJlZml4IHJlc29sdmVkIGZyb20gdGhlIGV4cGVyaW1lbnQuIGBsb2FkZWRgIGRpc3Rpbmd1aXNoZXNcbiAqIFwibm90IGZldGNoZWQgeWV0XCIgZnJvbSBcImZldGNoZWQsIGV4cGVyaW1lbnQgaGFzIG5vIFVDIGxvY2F0aW9uXCIuIE5ldHdvcmtcbiAqIGZhaWx1cmVzIGFyZSBub3QgY2FjaGVkIHNvIGEgbGF0ZXIgdGh1bWJzIGNsaWNrIGNhbiByZXRyeS5cbiAqL1xubGV0IGxvYWRlZFVjUHJlZml4OiB7IHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJpcCB0aGUgYHRyYWNlOi9gIFVSSSB3cmFwcGVyIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZyb20gYSBVQyBwcmVmaXguICovXG5mdW5jdGlvbiBub3JtYWxpemVVY1ByZWZpeChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcmF3XG4gICAgPy50cmltKClcbiAgICAucmVwbGFjZSgvXnRyYWNlOlxcLy8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIHJldHVybiB2YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVyaXZlIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgIGZyb20gYSBzcGFucyB0YWJsZSBuYW1lLlxuICogRGF0YWJyaWNrcyBuYW1lcyB0aGUgdGFibGUgYHtwcmVmaXh9X290ZWxfc3BhbnNgLlxuICovXG5mdW5jdGlvbiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhYmxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBuYW1lID0gdGFibGU/LnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIl9vdGVsX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfb3RlbF9zcGFuc1wiLmxlbmd0aCk7XG4gIGlmIChuYW1lLmVuZHNXaXRoKFwiX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfc3BhbnNcIi5sZW5ndGgpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHBlcmltZW50VGFnTWFwKHJhdzogdW5rbm93bik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHJhdykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQodGFnKSB8fCB0eXBlb2YgdGFnLmtleSAhPT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdGFnLnZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgdGFncy5zZXQodGFnLmtleSwgdGFnLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhZ3M7XG4gIH1cbiAgaWYgKCFvYmplY3QuaXNSZWNvcmQocmF3KSkgcmV0dXJuIHRhZ3M7XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhdykpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKSB0YWdzLnNldChrZXksIHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdGFncztcbn1cblxuLyoqXG4gKiBVQyB0YWJsZSBwcmVmaXggdGhlIGFzc2Vzc21lbnRzIEFQSSBuZWVkcywgcmVhZCBmcm9tIGV4cGVyaW1lbnQgdGFncy5cbiAqXG4gKiBQcmVmZXJzIHRoZSB0aHJlZS1wYXJ0IGRlc3RpbmF0aW9uIHBhdGggRGF0YWJyaWNrcyB3cml0ZXMgd2hlbiB0aGVcbiAqIGV4cGVyaW1lbnQgaXMgbGlua2VkIHRvIGEgdGFibGUtcHJlZml4IGxvY2F0aW9uLiBGYWxscyBiYWNrIHRvIHN0cmlwcGluZ1xuICogYF9vdGVsX3NwYW5zYCBmcm9tIHRoZSBzcGFucy10YWJsZSB0YWcuIFR3by1wYXJ0IHNjaGVtYS1saW5rZWQgZGVzdGluYXRpb25zXG4gKiBhcmUgaWdub3JlZCAodGhleSBhcmUgbm90IGEgdGFibGUgcHJlZml4KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVjVHJhY2VQcmVmaXhGcm9tRXhwZXJpbWVudFRhZ3MocmF3VGFnczogdW5rbm93bik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHRhZ3MgPSBleHBlcmltZW50VGFnTWFwKHJhd1RhZ3MpO1xuICBjb25zdCBkZXN0aW5hdGlvbiA9IG5vcm1hbGl6ZVVjUHJlZml4KHRhZ3MuZ2V0KFRSQUNFX0RFU1RJTkFUSU9OX1BBVEhfVEFHKSk7XG4gIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5zcGxpdChcIi5cIikubGVuZ3RoID49IDMpIHJldHVybiBkZXN0aW5hdGlvbjtcbiAgcmV0dXJuIHByZWZpeEZyb21TcGFuVGFibGUodGFncy5nZXQoVFJBQ0VfU1BBTl9TVE9SQUdFX1RBQkxFX1RBRykpO1xufVxuXG4vKiogRHJvcCB0aGUgaW4tcHJvY2VzcyBVQyBwcmVmaXggY2FjaGUgKHRlc3RzKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldFVjVHJhY2VQcmVmaXhDYWNoZSgpOiB2b2lkIHtcbiAgbG9hZGVkVWNQcmVmaXggPSB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogVHJhY2UgaWQgdGhlIGFzc2Vzc21lbnRzIFJFU1QgQVBJIGFjY2VwdHMgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBEYXRhYnJpY2tzIEFwcHMgcGVyc2lzdCB0cmFjZXMgaW4gVW5pdHkgQ2F0YWxvZy4gVGhlIGV4cGVyaW1lbnQgVUkgbGlzdHNcbiAqIHRob3NlIHJvd3MsIGJ1dCBgUE9TVCAvYXBpLzMuMC9tbGZsb3cvdHJhY2VzL3tpZH0vYXNzZXNzbWVudHNgIGxvb2tzIHVwIHRoZVxuICogZXhwZXJpbWVudCBzdG9yZSB1bmxlc3MgYHtpZH1gIGlzIHRoZSBVQyBVUkkgYHRyYWNlOi97Y2F0YWxvZ30ue3NjaGVtYX0ue3ByZWZpeH0ve3RyLWhleH1gLlxuICogQSBiYXJlIGB0ci08aGV4PmAgNDA0cyBhbmQgdGhlIGFzc2Vzc21lbnQgbmV2ZXIgYXBwZWFycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKHRyYWNlSWQ6IHN0cmluZywgcHJlZml4Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzb2x2ZWQgPSBub3JtYWxpemVVY1ByZWZpeChwcmVmaXgpO1xuICByZXR1cm4gcmVzb2x2ZWQgPyBgdHJhY2U6LyR7cmVzb2x2ZWR9LyR7dHJhY2VJZH1gIDogdHJhY2VJZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVVjVHJhY2VQcmVmaXgoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmcm9tRW52ID0gbm9ybWFsaXplVWNQcmVmaXgocHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1RSQUNFX1BSRUZJWCk7XG4gIGlmIChmcm9tRW52KSByZXR1cm4gZnJvbUVudjtcbiAgaWYgKGxvYWRlZFVjUHJlZml4KSByZXR1cm4gbG9hZGVkVWNQcmVmaXgucHJlZml4O1xuICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgbG9jYXRpb24gPSBleHBlcmltZW50LnRyYWNlX2xvY2F0aW9uPy51Y190cmFjZV9sb2NhdGlvbjtcbiAgY29uc3QgcHJlZml4ID1cbiAgICB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzKGV4cGVyaW1lbnQudGFncykgPz9cbiAgICAobG9jYXRpb25cbiAgICAgID8gW1xuICAgICAgICAgIGxvY2F0aW9uLmNhdGFsb2csXG4gICAgICAgICAgbG9jYXRpb24uc2NoZW1hLFxuICAgICAgICAgIGxvY2F0aW9uLmVmZmVjdGl2ZV90YWJsZV9wcmVmaXggPz8gbG9jYXRpb24udGFibGVfcHJlZml4LFxuICAgICAgICBdXG4gICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgIC5qb2luKFwiLlwiKVxuICAgICAgOiB1bmRlZmluZWQpO1xuICBsb2FkZWRVY1ByZWZpeCA9IHsgcHJlZml4IH07XG4gIHJldHVybiBwcmVmaXg7XG59XG5cbi8qKiBBc3Nlc3NtZW50cyBSRVNUIHBhdGggZm9yIGEgdHJhY2UuIGAzLjBgIGlzIHRoZSBjdXJyZW50IE1MZmxvdyBBUEkgdmVyc2lvbi4gKi9cbmNvbnN0IGFzc2Vzc21lbnRzUGF0aCA9ICh0cmFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYC9hcGkvMy4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQodHJhY2VJZCl9L2Fzc2Vzc21lbnRzYDtcblxuLyoqIE51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIFwidHJhY2Ugbm90IGZvdW5kXCIgcmVzcG9uc2UgYmVmb3JlIGdpdmluZyB1cC4gKi9cbmNvbnN0IE5PVF9GT1VORF9SRVRSSUVTID0gMztcbi8qKiBCYXNlIGJhY2tvZmYgYmV0d2VlbiBcInRyYWNlIG5vdCBmb3VuZFwiIHJldHJpZXMsIGluIG1zIChncm93cyBsaW5lYXJseSkuICovXG5jb25zdCBOT1RfRk9VTkRfQkFDS09GRl9NUyA9IDEyMDA7XG5cbmNvbnN0IE1sZmxvd0V4cGVyaW1lbnRSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZXhwZXJpbWVudDogelxuICAgICAgLm9iamVjdCh7XG4gICAgICAgIGV4cGVyaW1lbnRfaWQ6IHouc3RyaW5nKCkubWluKDEpLmRlc2NyaWJlKFwiV29ya3NwYWNlIE1MZmxvdyBleHBlcmltZW50IGlkZW50aWZpZXIuXCIpLFxuICAgICAgICB0YWdzOiB6LnVua25vd24oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiRXhwZXJpbWVudCB0YWdzLCBpbmNsdWRpbmcgdGhlIFVDIHRyYWNlIGxvY2F0aW9uLlwiKSxcbiAgICAgICAgdHJhY2VfbG9jYXRpb246IHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHVjX3RyYWNlX2xvY2F0aW9uOiB6XG4gICAgICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgICAgIGNhdGFsb2c6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJVbml0eSBDYXRhbG9nIGNhdGFsb2cgbmFtZS5cIiksXG4gICAgICAgICAgICAgICAgc2NoZW1hOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVW5pdHkgQ2F0YWxvZyBzY2hlbWEgbmFtZS5cIiksXG4gICAgICAgICAgICAgICAgdGFibGVfcHJlZml4OiB6LnN0cmluZygpLmRlc2NyaWJlKFwiQ29uZmlndXJlZCB0cmFjZSB0YWJsZSBwcmVmaXguXCIpLFxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZV90YWJsZV9wcmVmaXg6IHpcbiAgICAgICAgICAgICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgICAgIC5kZXNjcmliZShcIkVmZmVjdGl2ZSB0cmFjZSB0YWJsZSBwcmVmaXggc2VsZWN0ZWQgYnkgRGF0YWJyaWNrcy5cIiksXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIlVuaXR5IENhdGFsb2cgdHJhY2UgbG9jYXRpb24uXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IHRyYWNlIHN0b3JhZ2UgbG9jYXRpb24uXCIpLFxuICAgICAgfSlcbiAgICAgIC5wYXNzdGhyb3VnaCgpXG4gICAgICAuZGVzY3JpYmUoXCJDb25maWd1cmVkIE1MZmxvdyBleHBlcmltZW50LlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiTUxmbG93IGdldC1leHBlcmltZW50IHJlc3BvbnNlLlwiKTtcblxuY29uc3QgQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdXNlck5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgd29ya3NwYWNlIHVzZXIgbmFtZS5cIiksXG4gICAgYXBwbGljYXRpb25JZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQ3VycmVudCBzZXJ2aWNlIHByaW5jaXBhbCBhcHBsaWNhdGlvbiBpZC5cIiksXG4gICAgZGlzcGxheU5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgcHJpbmNpcGFsIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgZ3JvdXBzOiB6XG4gICAgICAuYXJyYXkoXG4gICAgICAgIHpcbiAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgIHZhbHVlOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgaWRlbnRpZmllci5cIiksXG4gICAgICAgICAgICBkaXNwbGF5OiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJXb3Jrc3BhY2UgZ3JvdXAgZGlzcGxheSBuYW1lLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgKVxuICAgICAgLm9wdGlvbmFsKClcbiAgICAgIC5kZXNjcmliZShcIkdyb3VwcyBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBwcmluY2lwYWwuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIEN1cnJlbnQgVXNlciBBUEkgcmVzcG9uc2UuXCIpO1xuXG5jb25zdCBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjZXNzX2NvbnRyb2xfbGlzdDogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB1c2VyX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIlVzZXIgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgZ3JvdXBfbmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiR3JvdXAgcHJpbmNpcGFsIG5hbWUuXCIpLFxuICAgICAgICAgICAgc2VydmljZV9wcmluY2lwYWxfbmFtZTogelxuICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgICAgICAgLmRlc2NyaWJlKFwiU2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgICAgICAgICAgYWxsX3Blcm1pc3Npb25zOiB6XG4gICAgICAgICAgICAgIC5hcnJheShcbiAgICAgICAgICAgICAgICB6XG4gICAgICAgICAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbl9sZXZlbDogei5zdHJpbmcoKS5kZXNjcmliZShcIkVmZmVjdGl2ZSBleHBlcmltZW50IHBlcm1pc3Npb24gbGV2ZWwuXCIpLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgIC5wYXNzdGhyb3VnaCgpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIkRpcmVjdCBhbmQgaW5oZXJpdGVkIHBlcm1pc3Npb25zIGZvciB0aGlzIHByaW5jaXBhbC5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJFeHBlcmltZW50IGFjY2VzcyBjb250cm9sIGVudHJpZXMuXCIpLFxuICB9KVxuICAucGFzc3Rocm91Z2goKVxuICAuZGVzY3JpYmUoXCJEYXRhYnJpY2tzIGV4cGVyaW1lbnQgcGVybWlzc2lvbnMgcmVzcG9uc2UuXCIpO1xuXG5mdW5jdGlvbiBjb25maWd1cmVkRXhwZXJpbWVudCgpOiB7IGlkPzogc3RyaW5nOyBuYW1lPzogc3RyaW5nIH0ge1xuICBjb25zdCBpZCA9IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCk7XG4gIGNvbnN0IG5hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCk7XG4gIHJldHVybiB7XG4gICAgLi4uKGlkID8geyBpZCB9IDoge30pLFxuICAgIC4uLihuYW1lID8geyBuYW1lIH0gOiB7fSksXG4gIH07XG59XG5cbi8qKiBUcmFja2luZyBVUkkgZm9yIGRpcmVjdCBsb2NhbCBNTGZsb3cgdHJhY2luZywgd2l0aCBDTEktcHJvZmlsZSBhdXRoIGluamVjdGVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1RSQUNLSU5HX1VSST8udHJpbSgpO1xuICBpZiAoY29uZmlndXJlZCAmJiBjb25maWd1cmVkICE9PSBcImRhdGFicmlja3NcIikgcmV0dXJuIGNvbmZpZ3VyZWQ7XG4gIGNvbnN0IHByb2ZpbGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFPy50cmltKCk7XG4gIHJldHVybiBwcm9maWxlID8gYGRhdGFicmlja3M6Ly8ke3Byb2ZpbGV9YCA6IFwiZGF0YWJyaWNrc1wiO1xufVxuXG4vKiogUGFyc2UgdGhlIG9wdGlvbmFsIFVDIHRhYmxlLXByZWZpeCBsb2NhdGlvbiB1c2VkIGJ5IGRpcmVjdCBsb2NhbCB0cmFjaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNlTG9jYXRpb24oKTpcbiAgeyBjYXRhbG9nTmFtZTogc3RyaW5nOyBzY2hlbWFOYW1lOiBzdHJpbmc7IHRhYmxlUHJlZml4OiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhdGFsb2dOYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1VDX0NBVEFMT0c/LnRyaW0oKTtcbiAgY29uc3Qgc2NoZW1hTmFtZSA9IHByb2Nlc3MuZW52Lk1MRkxPV19VQ19TQ0hFTUE/LnRyaW0oKTtcbiAgY29uc3QgdGFibGVQcmVmaXggPSBwcm9jZXNzLmVudi5NTEZMT1dfVUNfVEFCTEVfUFJFRklYPy50cmltKCk7XG4gIGlmIChjYXRhbG9nTmFtZSAmJiBzY2hlbWFOYW1lICYmIHRhYmxlUHJlZml4KSB7XG4gICAgcmV0dXJuIHsgY2F0YWxvZ05hbWUsIHNjaGVtYU5hbWUsIHRhYmxlUHJlZml4IH07XG4gIH1cblxuICBjb25zdCBwcmVmaXggPSBub3JtYWxpemVVY1ByZWZpeChwcm9jZXNzLmVudi5NTEZMT1dfVUNfVFJBQ0VfUFJFRklYKTtcbiAgaWYgKCFwcmVmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHBhcnRzID0gcHJlZml4LnNwbGl0KFwiLlwiKTtcbiAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgW3ByZWZpeENhdGFsb2csIHByZWZpeFNjaGVtYSwgcHJlZml4VGFibGVdID0gcGFydHM7XG4gIGlmICghcHJlZml4Q2F0YWxvZyB8fCAhcHJlZml4U2NoZW1hIHx8ICFwcmVmaXhUYWJsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjYXRhbG9nTmFtZTogcHJlZml4Q2F0YWxvZyxcbiAgICBzY2hlbWFOYW1lOiBwcmVmaXhTY2hlbWEsXG4gICAgdGFibGVQcmVmaXg6IHByZWZpeFRhYmxlLFxuICB9O1xufVxuXG4vKiogV2hldGhlciB0aGUgbG9jYWwgZGlyZWN0LXRvLWV4cGVyaW1lbnQgTUxmbG93IFNESyBoYXMgZW5vdWdoIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0TWxmbG93VHJhY2luZ0NvbmZpZ3VyZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgICFlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudigpICYmXG4gICAgcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSAmJlxuICAgIGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCksXG4gICk7XG59XG5cbi8qKiBXaGV0aGVyIGEgRGF0YWJyaWNrcyBBcHAgY2FuIHByb21vdGUgT1RMUCBzcGFucyBpbnRvIGZ1bGwgTUxmbG93IHRyYWNlIGluZm8uICovXG5leHBvcnQgZnVuY3Rpb24gYXBwTWxmbG93VHJhY2VJbmZvQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgZW52aXJvbm1lbnRVdGlscy5pc0RhdGFicmlja3NBcHBFbnYoKSAmJlxuICAgIChwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSkgJiZcbiAgICAocHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UPy50cmltKCkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSksXG4gICk7XG59XG5cbi8qKiBJbml0aWFsaXplIHRoZSBBcHAgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IHVzZWQgdG8gcGVyc2lzdCBWNCB0cmFjZSB0YWdzIGFuZCBtZXRhZGF0YS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50ICYmIGFwcE1sZmxvd1RyYWNlUHJlZml4KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkIHx8ICFhcHBNbGZsb3dUcmFjZUluZm9Db25maWd1cmVkKCkpIHJldHVybiBmYWxzZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvSW5pdFN0YXJ0ZWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkQ2xpZW50ID0gY2xpZW50ID8/IChjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSBhcyBXb3Jrc3BhY2VDbGllbnQpO1xuICAgIGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCA/Pz0gcmVzb2x2ZWRDbGllbnQ7XG4gICAgY29uc3QgcHJlZml4ID0gYXdhaXQgcmVzb2x2ZVVjVHJhY2VQcmVmaXgocmVzb2x2ZWRDbGllbnQpO1xuICAgIGlmICghcHJlZml4IHx8IHByZWZpeC5zcGxpdChcIi5cIikubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICBcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXBwTWxmbG93VHJhY2VQcmVmaXggPSBwcmVmaXg7XG4gICAgbG9nZ2VyLmluZm8oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGVuYWJsZWRcIiwgeyBwcmVmaXggfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiBkaXNhYmxlZFwiLCB7XG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gICAgLy8gU3RhcnR1cCB1c2VzIHRoZSBzZXJ2aWNlIHByaW5jaXBhbC4gUGVybWl0IG9uZSBsYXRlciByZXF1ZXN0LXNjb3BlZFxuICAgIC8vIGNsaWVudCB0byByZXNvbHZlIGV4cGVyaW1lbnQgbWV0YWRhdGEgd2hlbiB0aGF0IHByaW5jaXBhbCBjYW5ub3QgcmVhZCBpdC5cbiAgICBpZiAoY2xpZW50ID09PSB1bmRlZmluZWQpIGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogUmV0cnkgQXBwcyB0cmFjZS1sb2NhdGlvbiBkaXNjb3Zlcnkgb25jZSB3aXRoIGEgcmVxdWVzdC1zY29wZWQgd29ya3NwYWNlXG4gKiBjbGllbnQgYWZ0ZXIgc2VydmljZS1wcmluY2lwYWwgc3RhcnR1cCBkaXNjb3ZlcnkgZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5pdGlhbGl6ZVJlcXVlc3RNbGZsb3dUcmFjZUluZm8oY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCAmJiBhcHBNbGZsb3dUcmFjZVByZWZpeCkgcmV0dXJuIHRydWU7XG4gIGlmIChhcHBNbGZsb3dUcmFjZUluZm9SZXF1ZXN0SW5pdFN0YXJ0ZWQgfHwgIWFwcE1sZmxvd1RyYWNlSW5mb0NvbmZpZ3VyZWQoKSkgcmV0dXJuIGZhbHNlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9SZXF1ZXN0SW5pdFN0YXJ0ZWQgPSB0cnVlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCA9IGZhbHNlO1xuICByZXR1cm4gaW5pdGlhbGl6ZUFwcE1sZmxvd1RyYWNlSW5mbyhjbGllbnQpO1xufVxuXG4vKiogVHJhY2UtbGV2ZWwgdmFsdWVzIHBlcnNpc3RlZCBiZXNpZGUgc3BhbnMgYWxyZWFkeSBleHBvcnRlZCBieSB0aGUgQXBwcyBPVExQIHNpZGVjYXIuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcE1sZmxvd1RyYWNlSW5mbyB7XG4gIHRyYWNlSWQ6IHN0cmluZztcbiAgcmVxdWVzdFRpbWU6IG51bWJlcjtcbiAgZXhlY3V0aW9uRHVyYXRpb246IG51bWJlcjtcbiAgZXJyb3I6IGJvb2xlYW47XG4gIHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHVzZXI/OiBzdHJpbmc7XG4gIHNlc3Npb25JZD86IHN0cmluZztcbiAgcmVxdWVzdFByZXZpZXc/OiBzdHJpbmc7XG4gIHJlc3BvbnNlUHJldmlldz86IHN0cmluZztcbn1cblxuLyoqIFBlcnNpc3QgTUxmbG93IFY0IHRyYWNlIGluZm8gZm9yIG9uZSBEYXRhYnJpY2tzIEFwcHMgT1RlbCByb290IHdpdGhvdXQgcmUtZXhwb3J0aW5nIHNwYW5zLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBlcnNpc3RBcHBNbGZsb3dUcmFjZUluZm8ocGFyYW1zOiBBcHBNbGZsb3dUcmFjZUluZm8pOiB2b2lkIHtcbiAgY29uc3QgY2xpZW50ID0gYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50O1xuICBjb25zdCBwcmVmaXggPSBhcHBNbGZsb3dUcmFjZVByZWZpeDtcbiAgaWYgKCFjbGllbnQgfHwgIXByZWZpeCkgcmV0dXJuO1xuICBjb25zdCBbY2F0YWxvZ05hbWUsIHNjaGVtYU5hbWUsIHRhYmxlUHJlZml4XSA9IHByZWZpeC5zcGxpdChcIi5cIik7XG4gIGlmICghY2F0YWxvZ05hbWUgfHwgIXNjaGVtYU5hbWUgfHwgIXRhYmxlUHJlZml4KSByZXR1cm47XG4gIGNvbnN0IHRyYWNlSW5mbyA9IG5ldyBUcmFjZUluZm8oe1xuICAgIHRyYWNlSWQ6IGB0cmFjZTovJHtwcmVmaXh9LyR7cGFyYW1zLnRyYWNlSWR9YCxcbiAgICB0cmFjZUxvY2F0aW9uOiB7XG4gICAgICB0eXBlOiBUcmFjZUxvY2F0aW9uVHlwZS5VQ19UQUJMRV9QUkVGSVgsXG4gICAgICB1Y1RhYmxlUHJlZml4OiB7IGNhdGFsb2dOYW1lLCBzY2hlbWFOYW1lLCB0YWJsZVByZWZpeCB9LFxuICAgIH0sXG4gICAgcmVxdWVzdFRpbWU6IHBhcmFtcy5yZXF1ZXN0VGltZSxcbiAgICBleGVjdXRpb25EdXJhdGlvbjogcGFyYW1zLmV4ZWN1dGlvbkR1cmF0aW9uLFxuICAgIHN0YXRlOiBwYXJhbXMuZXJyb3IgPyBUcmFjZVN0YXRlLkVSUk9SIDogVHJhY2VTdGF0ZS5PSyxcbiAgICAuLi4ocGFyYW1zLnJlcXVlc3RQcmV2aWV3ID8geyByZXF1ZXN0UHJldmlldzogcGFyYW1zLnJlcXVlc3RQcmV2aWV3IH0gOiB7fSksXG4gICAgLi4uKHBhcmFtcy5yZXNwb25zZVByZXZpZXcgPyB7IHJlc3BvbnNlUHJldmlldzogcGFyYW1zLnJlc3BvbnNlUHJldmlldyB9IDoge30pLFxuICAgIHRyYWNlTWV0YWRhdGE6IHtcbiAgICAgIFtUcmFjZU1ldGFkYXRhS2V5LlNDSEVNQV9WRVJTSU9OXTogXCI0XCIsXG4gICAgICAuLi4ocGFyYW1zLnVzZXIgPyB7IFtUcmFjZU1ldGFkYXRhS2V5LlRSQUNFX1VTRVJdOiBwYXJhbXMudXNlciB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy5zZXNzaW9uSWQgPyB7IFtUcmFjZU1ldGFkYXRhS2V5LlRSQUNFX1NFU1NJT05dOiBwYXJhbXMuc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgfSxcbiAgICB0YWdzOiBwYXJhbXMudGFncyxcbiAgICBhc3Nlc3NtZW50czogW10sXG4gIH0pO1xuICBjb25zdCBwYXRoID0gYC9hcGkvNC4wL21sZmxvdy90cmFjZXMvJHtlbmNvZGVVUklDb21wb25lbnQocHJlZml4KX0vJHtwYXJhbXMudHJhY2VJZH0vaW5mb2A7XG4gIGNvbnN0IHBlbmRpbmcgPSBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBwYXRoLCB7IG1ldGhvZDogXCJQT1NUXCIsIGJvZHk6IHRyYWNlSW5mby50b0pzb24oKSB9KVxuICAgIC50aGVuKGFzeW5jIChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSByZXR1cm47XG4gICAgICBsb2dnZXIud2FybihcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICBib2R5OiBhd2FpdCByZWFkUmVzcG9uc2VUZXh0KHJlc3BvbnNlKSxcbiAgICAgIH0pO1xuICAgIH0pXG4gICAgLmNhdGNoKChlcnIpID0+IHtcbiAgICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiBmYWlsZWRcIiwge1xuICAgICAgICB0cmFjZUlkOiBwYXJhbXMudHJhY2VJZCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgfSk7XG4gICAgfSlcbiAgICAuZmluYWxseSgoKSA9PiBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmRlbGV0ZShwZW5kaW5nKSk7XG4gIHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8uYWRkKHBlbmRpbmcpO1xufVxuXG4vKiogUmVzZXQgQXBwcyB0cmFjZS1pbmZvIHByb21vdGlvbiBzdGF0ZSBmb3IgdGVzdHMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRBcHBNbGZsb3dUcmFjZUluZm8oKTogdm9pZCB7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkID0gZmFsc2U7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb1JlcXVlc3RJbml0U3RhcnRlZCA9IGZhbHNlO1xuICBhcHBNbGZsb3dUcmFjZUluZm9DbGllbnQgPSB1bmRlZmluZWQ7XG4gIGFwcE1sZmxvd1RyYWNlUHJlZml4ID0gdW5kZWZpbmVkO1xuICBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvLmNsZWFyKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgbWxmbG93OiBNbGZsb3dNb2R1bGUsXG4gIHRyYWNraW5nVXJpOiBzdHJpbmcsXG4gIGV4cGVyaW1lbnRJZDogc3RyaW5nLFxuICBob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHsgY2F0YWxvZ05hbWU6IHN0cmluZzsgc2NoZW1hTmFtZTogc3RyaW5nOyB0YWJsZVByZWZpeDogc3RyaW5nIH0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwbGljaXQgPSBkaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKCk7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIGV4cGxpY2l0O1xuICB0cnkge1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBlcmltZW50ID0gYXdhaXQgY2xpZW50LmdldEV4cGVyaW1lbnQoZXhwZXJpbWVudElkKTtcbiAgICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgeyB1Y0xvY2F0aW9uRnJvbUV4cGVyaW1lbnRUYWdzIH0gPSBhd2FpdCBpbXBvcnQoXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2Rlc3RpbmF0aW9uLmpzXCIpO1xuICAgIGNvbnN0IGxvY2F0aW9uID0gdWNMb2NhdGlvbkZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpO1xuICAgIGlmICghbG9jYXRpb24/LnRhYmxlUHJlZml4KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBjYXRhbG9nTmFtZTogbG9jYXRpb24uY2F0YWxvZ05hbWUsXG4gICAgICBzY2hlbWFOYW1lOiBsb2NhdGlvbi5zY2hlbWFOYW1lLFxuICAgICAgdGFibGVQcmVmaXg6IGxvY2F0aW9uLnRhYmxlUHJlZml4LFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGlyZWN0IE1MZmxvdyBVQyB0cmFjZS1sb2NhdGlvbiBkZXRlY3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIE1MZmxvdyBOb2RlIHRyYWNlciBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgd2hlbiBBcHBLaXQgaGFzIG5vIE9UTFBcbiAqIGV4cG9ydGVyLiBUaGlzIHByb3ZpZGVyIGlzIG5ldmVyIHN0YXJ0ZWQgaW4gdGhlIGRlcGxveWVkIEFwcHMgcGF0aCwgYXZvaWRpbmdcbiAqIGEgc2Vjb25kIGdsb2JhbCBPVGVsIHByb3ZpZGVyIHJhY2luZyBBcHBLaXQncyB0ZWxlbWV0cnkgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVEaXJlY3RNbGZsb3dUcmFjaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZGlyZWN0TWxmbG93KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRpcmVjdE1sZmxvd0luaXRTdGFydGVkIHx8ICFkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gIGRpcmVjdE1sZmxvd0luaXRTdGFydGVkID0gdHJ1ZTtcblxuICBjb25zdCBleHBlcmltZW50SWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRCEudHJpbSgpO1xuICBjb25zdCB0cmFja2luZ1VyaSA9IGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCkhO1xuICB0cnkge1xuICAgIGNvbnN0IG1sZmxvdyA9IGF3YWl0IGltcG9ydChcIkBtbGZsb3cvY29yZVwiKTtcbiAgICBjb25zdCByYXdIb3N0ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gICAgY29uc3QgaG9zdCA9IHJhd0hvc3RcbiAgICAgID8gL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdIb3N0KVxuICAgICAgICA/IHJhd0hvc3RcbiAgICAgICAgOiBgaHR0cHM6Ly8ke3Jhd0hvc3R9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJhY2VMb2NhdGlvbiA9IGF3YWl0IGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgICAgIG1sZmxvdyxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgaG9zdCxcbiAgICApO1xuICAgIGlmICghdHJhY2VMb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgXCJEaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcgcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgW3sgRGF0YWJyaWNrc1VDVGFibGVTcGFuRXhwb3J0ZXIsIERhdGFicmlja3NVQ1RhYmxlU3BhblByb2Nlc3NvciB9LCBzZGtdID1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW1wb3J0KFwiQG1sZmxvdy9jb3JlL2Rpc3QvZXhwb3J0ZXJzL3VjX3RhYmxlLmpzXCIpLFxuICAgICAgICBpbXBvcnQoXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiKSxcbiAgICAgIF0pO1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5FeHBvcnRlcihjbGllbnQpO1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvcihcbiAgICAgIG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5Qcm9jZXNzb3IoZXhwb3J0ZXIsIHRyYWNlTG9jYXRpb24pLFxuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc2RrLk5vZGVUcmFjZXJQcm92aWRlcih7IHNwYW5Qcm9jZXNzb3JzOiBbcHJvY2Vzc29yXSB9KTtcbiAgICBwcm92aWRlci5yZWdpc3RlcigpO1xuICAgIGRpcmVjdE1sZmxvdyA9IG1sZmxvdztcbiAgICBkaXJlY3RNbGZsb3dQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIGRpcmVjdE1sZmxvd1Byb2Nlc3NvciA9IHByb2Nlc3NvcjtcbiAgICBsb2dnZXIuaW5mbyhcImRpcmVjdCBNTGZsb3cgdHJhY2luZyBlbmFibGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgdHJhY2VMb2NhdGlvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkaXJlY3QgTUxmbG93IHRyYWNpbmcgZGlzYWJsZWRcIiwge1xuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKiogUGVyc2lzdCB0cmFjZS1sZXZlbCBmaWVsZHMgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgaW4gdGhlIGN1cnJlbnQgT1RlbCBjb250ZXh0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFjdGl2ZU1sZmxvd1RyYWNlKG9wdGlvbnM6IFVwZGF0ZUN1cnJlbnRUcmFjZU9wdGlvbnMpOiB2b2lkIHtcbiAgZGlyZWN0TWxmbG93Py51cGRhdGVDdXJyZW50VHJhY2Uob3B0aW9ucyk7XG59XG5cbi8qKiBQZXJzaXN0IHRhZ3Mgb24gdGhlIGRpcmVjdCBNTGZsb3cgdHJhY2UgYWN0aXZlIGluIHRoZSBjdXJyZW50IE9UZWwgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZVRhZ3ModGFnczogUmVjb3JkPHN0cmluZywgc3RyaW5nPik6IHZvaWQge1xuICB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZSh7IHRhZ3MgfSk7XG59XG5cbi8qKiBXaGV0aGVyIHRoaXMgcHJvY2VzcyBvd25zIHRoZSBmaWx0ZXJlZCBsb2NhbCBNTGZsb3cgdHJhY2VyIHByb3ZpZGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpcmVjdE1sZmxvd1RyYWNpbmdBY3RpdmUoKTogYm9vbGVhbiB7XG4gIHJldHVybiBkaXJlY3RNbGZsb3dQcm9jZXNzb3IgIT09IHVuZGVmaW5lZDtcbn1cblxuLyoqIEZsdXNoIHBlbmRpbmcgZGlyZWN0IGxvY2FsIHRyYWNlIGV4cG9ydHMgZHVyaW5nIGdyYWNlZnVsIHNodXRkb3duLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZsdXNoRGlyZWN0TWxmbG93VHJhY2luZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoWy4uLnBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm9dKTtcbiAgYXdhaXQgZGlyZWN0TWxmbG93UHJvY2Vzc29yPy5mb3JjZUZsdXNoKCk7XG4gIGF3YWl0IGRpcmVjdE1sZmxvd1Byb3ZpZGVyPy5mb3JjZUZsdXNoKCk7XG59XG5cbi8qKlxuICogV2hldGhlciBNTGZsb3cgZmVlZGJhY2sgbG9nZ2luZyBpcyBhdmFpbGFibGUgZm9yIHRoaXMgZGVwbG95bWVudC5cbiAqXG4gKiBFbmFibGVkIHdoZW4gYW4gTUxmbG93IGV4cGVyaW1lbnQgaXMgY29uZmlndXJlZCBhbmQgdHJhY2VzIGhhdmUgYW4gZXhwb3J0XG4gKiBwYXRoOiBBcHBLaXQgT1RMUCBpbiBhIERhdGFicmlja3MgQXBwLCBvciB0aGUgZGlyZWN0IE1MZmxvdyBOb2RlIFNESyBvdXRzaWRlXG4gKiBvbmUuIEJvdGggcGF0aHMgYXJlIHNlbGVjdGVkIGZyb20gc3RhbmRhcmQgZW52aXJvbm1lbnQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWxmbG93RW5hYmxlZCgpOiBib29sZWFuIHtcbiAgY29uc3QgaGFzRXhwb3J0ZXIgPSBCb29sZWFuKFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVD8udHJpbSgpIHx8XG4gICAgcHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVD8udHJpbSgpLFxuICApO1xuICBjb25zdCBoYXNFeHBlcmltZW50ID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSxcbiAgKTtcbiAgcmV0dXJuIGhhc0V4cGVyaW1lbnQgJiYgKGhhc0V4cG9ydGVyIHx8IGRpcmVjdE1sZmxvd1RyYWNpbmdDb25maWd1cmVkKCkpO1xufVxuXG4vKipcbiAqIFJldHVybiB0aGUgY29uZmlndXJlZCBleHBlcmltZW50IFVSTCBvbmx5IHdoZW4gdGhlIGFjdGl2ZSBEYXRhYnJpY2tzXG4gKiBwcmluY2lwYWwgaGFzIGVmZmVjdGl2ZSBgQ0FOX01BTkFHRWAgcGVybWlzc2lvbi4gUGVybWlzc2lvbiBsb29rdXAgaXNcbiAqIGludGVudGlvbmFsbHkgYmVzdC1lZmZvcnQgc28gQXBwcyBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgZXhwb3NlIHRoZVxuICogcmVxdWlyZWQgQVBJcyBzaW1wbHkgb21pdCB0aGUgZGVidWcgYWZmb3JkYW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1sZmxvd0V4cGVyaW1lbnRNYW5hZ2VyVXJsKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChjbGllbnQpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVNbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50SWQgPSBhd2FpdCByZXNvbHZlRXhwZXJpbWVudElkKGNsaWVudCk7XG4gIGlmICghZXhwZXJpbWVudElkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IFtjdXJyZW50UmVzcG9uc2UsIHBlcm1pc3Npb25zUmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGRhdGFicmlja3NGZXRjaChjbGllbnQsIFwiL2FwaS8yLjAvcHJldmlldy9zY2ltL3YyL01lXCIsIHsgbWV0aG9kOiBcIkdFVFwiIH0pLFxuICAgIGRhdGFicmlja3NGZXRjaChcbiAgICAgIGNsaWVudCxcbiAgICAgIGAvYXBpLzIuMC9wZXJtaXNzaW9ucy9leHBlcmltZW50cy8ke2VuY29kZVVSSUNvbXBvbmVudChleHBlcmltZW50SWQpfWAsXG4gICAgICB7IG1ldGhvZDogXCJHRVRcIiB9LFxuICAgICksXG4gIF0pO1xuICBpZiAoIWN1cnJlbnRSZXNwb25zZS5vayB8fCAhcGVybWlzc2lvbnNSZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBjdXJyZW50ID0gQ3VycmVudFVzZXJSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihjdXJyZW50UmVzcG9uc2UpKTtcbiAgY29uc3QgcGVybWlzc2lvbnMgPSBFeHBlcmltZW50UGVybWlzc2lvbnNSZXNwb25zZVNjaGVtYS5zYWZlUGFyc2UoXG4gICAgYXdhaXQgcmVhZFJlc3BvbnNlSnNvbihwZXJtaXNzaW9uc1Jlc3BvbnNlKSxcbiAgKTtcbiAgaWYgKCFjdXJyZW50LnN1Y2Nlc3MgfHwgIXBlcm1pc3Npb25zLnN1Y2Nlc3MpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgdXNlck5hbWVzID0gbmV3IFNldChcbiAgICBbY3VycmVudC5kYXRhLnVzZXJOYW1lLCBjdXJyZW50LmRhdGEuYXBwbGljYXRpb25JZCwgY3VycmVudC5kYXRhLmRpc3BsYXlOYW1lXS5maWx0ZXIoXG4gICAgICAodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gQm9vbGVhbih2YWx1ZSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgZ3JvdXBOYW1lcyA9IG5ldyBTZXQoXG4gICAgKGN1cnJlbnQuZGF0YS5ncm91cHMgPz8gW10pLmZsYXRNYXAoKHsgdmFsdWUsIGRpc3BsYXkgfSkgPT5cbiAgICAgIFt2YWx1ZSwgZGlzcGxheV0uZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiBCb29sZWFuKGVudHJ5KSksXG4gICAgKSxcbiAgKTtcbiAgY29uc3QgY2FuTWFuYWdlID0gKHBlcm1pc3Npb25zLmRhdGEuYWNjZXNzX2NvbnRyb2xfbGlzdCA/PyBbXSkuc29tZSgoZW50cnkpID0+IHtcbiAgICBjb25zdCBtYXRjaGVzID1cbiAgICAgIChlbnRyeS51c2VyX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnVzZXJfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSAhPT0gdW5kZWZpbmVkICYmIHVzZXJOYW1lcy5oYXMoZW50cnkuc2VydmljZV9wcmluY2lwYWxfbmFtZSkpIHx8XG4gICAgICAoZW50cnkuZ3JvdXBfbmFtZSAhPT0gdW5kZWZpbmVkICYmIGdyb3VwTmFtZXMuaGFzKGVudHJ5Lmdyb3VwX25hbWUpKTtcbiAgICByZXR1cm4gKFxuICAgICAgbWF0Y2hlcyAmJlxuICAgICAgKGVudHJ5LmFsbF9wZXJtaXNzaW9ucyA/PyBbXSkuc29tZShcbiAgICAgICAgKHBlcm1pc3Npb24pID0+IHBlcm1pc3Npb24ucGVybWlzc2lvbl9sZXZlbCA9PT0gXCJDQU5fTUFOQUdFXCIsXG4gICAgICApXG4gICAgKTtcbiAgfSk7XG4gIGlmICghY2FuTWFuYWdlKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIHJldHVybiBuZXcgVVJMKGAvbWwvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLCBob3N0KS50b1N0cmluZygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEV4cGVyaW1lbnQoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTx6LmluZmVyPHR5cGVvZiBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWE+W1wiZXhwZXJpbWVudFwiXSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBlcmltZW50ID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgY29uc3QgcGF0aCA9IGV4cGVyaW1lbnQuaWRcbiAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0P2V4cGVyaW1lbnRfaWQ9JHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudC5pZCl9YFxuICAgIDogZXhwZXJpbWVudC5uYW1lXG4gICAgICA/IGAvYXBpLzIuMC9tbGZsb3cvZXhwZXJpbWVudHMvZ2V0LWJ5LW5hbWU/ZXhwZXJpbWVudF9uYW1lPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFxuICAgICAgICAgIGV4cGVyaW1lbnQubmFtZSxcbiAgICAgICAgKX1gXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKCFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRhdGFicmlja3NGZXRjaChjbGllbnQsIHBhdGgsIHsgbWV0aG9kOiBcIkdFVFwiIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXJzZWQgPSBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzcG9uc2UpKTtcbiAgcmV0dXJuIHBhcnNlZC5zdWNjZXNzID8gcGFyc2VkLmRhdGEuZXhwZXJpbWVudCA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUV4cGVyaW1lbnRJZChjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBjb25maWd1cmVkRXhwZXJpbWVudCgpO1xuICBpZiAoY29uZmlndXJlZC5pZCkgcmV0dXJuIGNvbmZpZ3VyZWQuaWQ7XG4gIHJldHVybiAoYXdhaXQgZmV0Y2hFeHBlcmltZW50KGNsaWVudCkpPy5leHBlcmltZW50X2lkO1xufVxuXG4vKiogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvZ0ZlZWRiYWNrfS4gKi9cbmV4cG9ydCB0eXBlIExvZ0ZlZWRiYWNrUGFyYW1zID0gZmVlZGJhY2suTWxmbG93RmVlZGJhY2tSZXF1ZXN0ICYge1xuICAvKiogSWRlbnRpdHkgdGhlIGZlZWRiYWNrIGlzIGF0dHJpYnV0ZWQgdG8gKHVzZXIgZW1haWwgLyBpZCkuICovXG4gIHNvdXJjZUlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBMb2cgYSBIVU1BTiBmZWVkYmFjayBhc3Nlc3NtZW50IHRvIGEgdHJhY2UuIFJldHVybnMgdGhlIGNyZWF0ZWRcbiAqIGFzc2Vzc21lbnQgaWQgb24gc3VjY2Vzcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGUgdHJhY2UgY2FuJ3QgYmVcbiAqIGZvdW5kIChldmVuIGFmdGVyIHJldHJ5aW5nIGZvciBleHBvcnQgbGFnKSBvciB0aGUgcmVxdWVzdCBvdGhlcndpc2VcbiAqIGZhaWxzIC0gY2FsbGVycyBzdXJmYWNlIHRoYXQgYXMgYSBzb2Z0IFwibm90IHJlY29yZGVkXCIgcmF0aGVyIHRoYW4gYW5cbiAqIGVycm9yLCBrZWVwaW5nIHRoZSBjaGF0IHVzYWJsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvZ0ZlZWRiYWNrKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcGFyYW1zOiBMb2dGZWVkYmFja1BhcmFtcyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIC8vIEEgY29tbWVudCB3aXRoIG5vIHRodW1icyB2YWx1ZSBpcyBsb2dnZWQgYXMgdGV4dCBmZWVkYmFjazsgYSB2YWx1ZVxuICAvLyAod2l0aCBhbiBvcHRpb25hbCBjb21tZW50IGFzIHRoZSByYXRpb25hbGUpIGlzIHRoZSB0aHVtYnMgcGF0aC5cbiAgY29uc3QgaGFzVmFsdWUgPSBwYXJhbXMudmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgY29uc3QgbmFtZSA9XG4gICAgcGFyYW1zLm5hbWU/LnRyaW0oKSB8fFxuICAgIChoYXNWYWx1ZSA/IGZlZWRiYWNrLkRFRkFVTFRfRkVFREJBQ0tfTkFNRSA6IGZlZWRiYWNrLkRFRkFVTFRfQ09NTUVOVF9OQU1FKTtcbiAgY29uc3QgdmFsdWUgPSBoYXNWYWx1ZSA/IHBhcmFtcy52YWx1ZSA6IHBhcmFtcy5jb21tZW50O1xuICBjb25zdCBhc3Nlc3NtZW50VHJhY2VJZCA9IG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKFxuICAgIHBhcmFtcy50cmFjZUlkLFxuICAgIGF3YWl0IHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudCksXG4gICk7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKGFzc2Vzc21lbnRUcmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChyZXMub2spIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocmVzKTtcbiAgICAgIGNvbnN0IGFzc2Vzc21lbnRJZCA9XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50PzogeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9IH0pPy5hc3Nlc3NtZW50Py5hc3Nlc3NtZW50X2lkID8/XG4gICAgICAgIChwYXJzZWQgYXMgeyBhc3Nlc3NtZW50X2lkPzogdW5rbm93biB9KT8uYXNzZXNzbWVudF9pZDtcbiAgICAgIHJldHVybiB0eXBlb2YgYXNzZXNzbWVudElkID09PSBcInN0cmluZ1wiID8gYXNzZXNzbWVudElkIDogXCJcIjtcbiAgICB9XG4gICAgLy8gVHJhY2UgZXhwb3J0IGlzIGFzeW5jOyBhIGZyZXNoIHRyYWNlIG1heSBub3QgZXhpc3QgeWV0LiBSZXRyeSBhXG4gICAgLy8gZmV3IHRpbWVzIHdpdGggYSBzaG9ydCBiYWNrb2ZmIGJlZm9yZSBnaXZpbmcgdXAgc29mdGx5LlxuICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQgJiYgYXR0ZW1wdCA8IE5PVF9GT1VORF9SRVRSSUVTKSB7XG4gICAgICBhd2FpdCBhc3luY1V0aWxzLnNsZWVwKE5PVF9GT1VORF9CQUNLT0ZGX01TICogKGF0dGVtcHQgKyAxKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbG9nZ2VyLndhcm4oXCJmZWVkYmFjayBub3QgcmVjb3JkZWRcIiwge1xuICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICAgIHN0YXR1czogcmVzLnN0YXR1cyxcbiAgICAgIGJvZHk6IGF3YWl0IHJlYWRSZXNwb25zZVRleHQocmVzKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
683
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWxmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21sZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUVILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBSTVFLE9BQU8sRUFBRSxDQUFDLEVBQUUsTUFBTSxLQUFLLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNoRixPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBSzNDLElBQUksWUFBc0MsQ0FBQztBQUMzQyxJQUFJLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUNwQyxJQUFJLG9CQUFvRCxDQUFDO0FBQ3pELElBQUkscUJBQWdELENBQUM7QUFDckQsSUFBSSw2QkFBNkIsR0FBRyxLQUFLLENBQUM7QUFDMUMsSUFBSSxvQ0FBb0MsR0FBRyxLQUFLLENBQUM7QUFDakQsSUFBSSx3QkFBcUQsQ0FBQztBQUMxRCxJQUFJLG9CQUF3QyxDQUFD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QUcsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sWUFBWSxHQUNmLE1BQXVELEVBQUUsVUFBVSxFQUFFLGFBQWE7Z0JBQ2xGLE1BQXNDLEVBQUUsYUFBYSxDQUFDO1lBQ3pELE9BQU8sT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxDQUFDO1FBQ0Qsa0VBQWtFO1FBQ2xFLDBEQUEwRDtRQUMxRCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLE9BQU8sR0FBRyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RELE1BQU0sS0FBSyxDQUFDLG9CQUFvQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQ25DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztZQUN2QixpQkFBaUI7WUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ2xCLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDLEdBQUcsQ0FBQztTQUNsQyxDQUFDLENBQUM7UUFDSCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTUxmbG93IHVzZXItZmVlZGJhY2sgbG9nZ2luZzogZGV0ZWN0IHdoZXRoZXIgTUxmbG93IHRyYWNpbmcgaXMgd2lyZWRcbiAqIGZvciB0aGlzIGRlcGxveW1lbnQsIGFuZCBsb2cgYSB0aHVtYnMgLyBjb21tZW50IGFzIGEgdHJhY2VcbiAqICphc3Nlc3NtZW50KiB2aWEgdGhlIERhdGFicmlja3MgTUxmbG93IFJFU1QgQVBJLlxuICpcbiAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHJhY2UsIGFuZCB0aGUgcGx1Z2luJ3Mgc3BhbnMgcmVhY2ggTUxmbG93XG4gKiB0aHJvdWdoIHRoZSBzYW1lIE9UZWwgcGlwZWxpbmUgYXMgZXZlcnkgb3RoZXIgQXBwS2l0IHNwYW4gKHNlZVxuICogYG9ic2VydmFiaWxpdHkudHNgKS4gT24gRGF0YWJyaWNrcyBBcHBzIHRoYXQgcGlwZWxpbmUgaXMgdGhlIFVDXG4gKiBzaWRlY2FyIGluamVjdGVkIGJ5IGB0ZWxlbWV0cnlfZXhwb3J0X2Rlc3RpbmF0aW9uc2AsIG5vdCBhIGRpcmVjdFxuICogd29ya3NwYWNlIE9UTFAgVVJMLiBNTGZsb3cgZGVyaXZlcyBpdHMgdHJhY2UgaWQgZnJvbSB0aGUgT3BlblRlbGVtZXRyeVxuICogdHJhY2UgaWQgKGB0ci08aGV4KG90ZWxUcmFjZUlkKT5gKSwgc28gdGhlIHNlcnZlciBzdGFtcHMgdGhlIGFjdGl2ZVxuICogdHJhY2UgaWQgb24gZWFjaCB0dXJuJ3MgcmVzcG9uc2UgYW5kIHRoZSBjbGllbnQgc2VuZHMgaXQgYmFjayBoZXJlLlxuICpcbiAqIFRoZXJlIGlzIG5vIE1MZmxvdyBKUyBTREssIHNvIHRoaXMgcG9zdHMgdG8gdGhlIGFzc2Vzc21lbnRzIFJFU1RcbiAqIGVuZHBvaW50IGRpcmVjdGx5IHVzaW5nIHRoZSBPQk8tc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQgKHRoZSBmZWVkYmFja1xuICogaXMgdGh1cyBhdHRyaWJ1dGVkIHRvIHRoZSBzaWduZWQtaW4gdXNlcikuIFVDLWJhY2tlZCBBcHBzIHRyYWNlcyBuZWVkXG4gKiB0aGUgZXhwZXJpbWVudCdzIHRhYmxlLXByZWZpeCBVUkkgKGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YClcbiAqIHJhdGhlciB0aGFuIHRoZSBleHBlcmltZW50LXN0b3JlIGlkIHRoZSBVSSBkb2VzIG5vdCBzdG9yZS4gVGhhdCBwcmVmaXggaXNcbiAqIHJlYWQgZnJvbSB0aGUgZXhwZXJpbWVudCdzIGBtbGZsb3cuZXhwZXJpbWVudC5kYXRhYnJpY2tzVHJhY2VEZXN0aW5hdGlvblBhdGhgXG4gKiB0YWcgKG9yIHRoZSBzcGFucy10YWJsZSB0YWcpOyBgTUxGTE9XX1VDX1RSQUNFX1BSRUZJWGAgcmVtYWlucyBhbiBvcHRpb25hbFxuICogb3ZlcnJpZGUuIFRyYWNlIGV4cG9ydCBpcyBhc3luY2hyb25vdXMsIHNvIHRoZSBqdXN0LWZpbmlzaGVkIHRyYWNlIG1heSBub3RcbiAqIGV4aXN0IGluIE1MZmxvdyB5ZXQgd2hlbiB0aGUgdXNlciByZWFjdHM7IHRoZSBsb2cgY2FsbCByZXRyaWVzIGJyaWVmbHkgb25cbiAqIFwibm90IGZvdW5kXCIgYmVmb3JlIGdpdmluZyB1cCBzb2Z0bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgdHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIHNsZWVwLCBpc0RhdGFicmlja3NBcHBFbnYsIHRvRXJyb3IsIGlzUmVjb3JkIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIHR5cGUgTWxmbG93RmVlZGJhY2tSZXF1ZXN0LFxuICBERUZBVUxUX0ZFRURCQUNLX05BTUUsXG4gIERFRkFVTFRfQ09NTUVOVF9OQU1FLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtbWFzdHJhXCI7XG5pbXBvcnQgeyBUcmFjZUxvY2F0aW9uVHlwZSwgVHJhY2VNZXRhZGF0YUtleSB9IGZyb20gXCJAbWxmbG93L2NvcmVcIjtcbmltcG9ydCB7IFRyYWNlSW5mbyB9IGZyb20gXCJAbWxmbG93L2NvcmUvZGlzdC9jb3JlL2VudGl0aWVzL3RyYWNlX2luZm8uanNcIjtcbmltcG9ydCB7IFRyYWNlU3RhdGUgfSBmcm9tIFwiQG1sZmxvdy9jb3JlL2Rpc3QvY29yZS9lbnRpdGllcy90cmFjZV9zdGF0ZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSBcIkBvcGVudGVsZW1ldHJ5L2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBSZWFkYWJsZVNwYW4sIFNwYW4gYXMgU2RrU3BhbiwgU3BhblByb2Nlc3NvciB9IGZyb20gXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2UtYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlVHJhY2VyUHJvdmlkZXIgfSBmcm9tIFwiQG9wZW50ZWxlbWV0cnkvc2RrLXRyYWNlLW5vZGVcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQgeyBkYXRhYnJpY2tzRmV0Y2gsIHJlYWRSZXNwb25zZUpzb24sIHJlYWRSZXNwb25zZVRleHQgfSBmcm9tIFwiLi9yZXN0LnRzXCI7XG5pbXBvcnQgeyBBUFBLSVRfQUdFTlRfVFJBQ0VfUk9PVF9BVFRSIH0gZnJvbSBcIi4vdHJhY2UtYXR0cmlidXRlcy50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL21sZmxvd1wiKTtcblxudHlwZSBNbGZsb3dNb2R1bGUgPSB0eXBlb2YgaW1wb3J0KFwiQG1sZmxvdy9jb3JlXCIpO1xudHlwZSBVcGRhdGVDdXJyZW50VHJhY2VPcHRpb25zID0gUGFyYW1ldGVyczxNbGZsb3dNb2R1bGVbXCJ1cGRhdGVDdXJyZW50VHJhY2VcIl0+WzBdO1xuXG5sZXQgZGlyZWN0TWxmbG93OiBNbGZsb3dNb2R1bGUgfCB1bmRlZmluZWQ7XG5sZXQgZGlyZWN0TWxmbG93SW5pdFN0YXJ0ZWQgPSBmYWxzZTtcbmxldCBkaXJlY3RNbGZsb3dQcm92aWRlcjogTm9kZVRyYWNlclByb3ZpZGVyIHwgdW5kZWZpbmVkO1xubGV0IGRpcmVjdE1sZmxvd1Byb2Nlc3NvcjogU3BhblByb2Nlc3NvciB8IHVuZGVmaW5lZDtcbmxldCBhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCA9IGZhbHNlO1xubGV0IGFwcE1sZmxvd1RyYWNlSW5mb1JlcXVlc3RJbml0U3RhcnRlZCA9IGZhbHNlO1xubGV0IGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xubGV0IGFwcE1sZmxvd1RyYWNlUHJlZml4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5jb25zdCBwZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvID0gbmV3IFNldDxQcm9taXNlPHZvaWQ+PigpO1xuXG5jb25zdCBOT0lTWV9JTlNUUlVNRU5UQVRJT05fU0NPUEVTID0gbmV3IFNldChbXG4gIFwiQG9wZW50ZWxlbWV0cnkvaW5zdHJ1bWVudGF0aW9uLWV4cHJlc3NcIixcbiAgXCJAb3BlbnRlbGVtZXRyeS9pbnN0cnVtZW50YXRpb24taHR0cFwiLFxuICBcImNhY2hlLW1hbmFnZXItY2FjaGUtbWFuYWdlclwiLFxuXSk7XG5cbmZ1bmN0aW9uIGlzQWdlbnRUcmFjZVJvb3Qoc3BhbjogU2RrU3Bhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3Bhbi5hdHRyaWJ1dGVzW0FQUEtJVF9BR0VOVF9UUkFDRV9ST09UX0FUVFJdID09PSB0cnVlO1xufVxuXG5mdW5jdGlvbiBpc1VzZWZ1bEFnZW50RGVzY2VuZGFudChzcGFuOiBTZGtTcGFuKTogYm9vbGVhbiB7XG4gIHJldHVybiAhTk9JU1lfSU5TVFJVTUVOVEFUSU9OX1NDT1BFUy5oYXMoc3Bhbi5pbnN0cnVtZW50YXRpb25TY29wZS5uYW1lKTtcbn1cblxuLyoqXG4gKiBSZXN0cmljdCB0aGUgZGlyZWN0IE1MZmxvdyBwcm92aWRlciB0byBjaGF0IHJvb3RzIGFuZCB0aGVpciBkZXNjZW5kYW50cy5cbiAqIEFwcEtpdCBhbmQgTWFzdHJhIGNyZWF0ZSBvdGhlciBPVGVsIHJvb3RzIGZvciBjYWNoZSBhbmQgcGx1Z2luIG9wZXJhdGlvbnM7XG4gKiBmb3J3YXJkaW5nIHRob3NlIHdvdWxkIHJlY3JlYXRlIHRoZSBvbmUtdHJhY2UtcGVyLXJlcXVlc3Qgbm9pc2UgdGhpcyBwYXRoIGlzXG4gKiBpbnRlbmRlZCB0byBhdm9pZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEFnZW50VHJhY2VTcGFuUHJvY2Vzc29yIGltcGxlbWVudHMgU3BhblByb2Nlc3NvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdHJhY2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBzcGFuSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBkZWxlZ2F0ZTogU3BhblByb2Nlc3Nvcikge31cblxuICBvblN0YXJ0KHNwYW46IFNka1NwYW4sIHBhcmVudENvbnRleHQ6IENvbnRleHQpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFjZUlkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gICAgY29uc3QgaXNSb290ID0gIXNwYW4ucGFyZW50U3BhbkNvbnRleHQ/LnNwYW5JZDtcbiAgICBpZiAoaXNSb290KSB7XG4gICAgICBpZiAoIWlzQWdlbnRUcmFjZVJvb3Qoc3BhbikpIHJldHVybjtcbiAgICAgIHRoaXMudHJhY2VJZHMuYWRkKHRyYWNlSWQpO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMudHJhY2VJZHMuaGFzKHRyYWNlSWQpIHx8ICFpc1VzZWZ1bEFnZW50RGVzY2VuZGFudChzcGFuKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnNwYW5JZHMuYWRkKHNwYW4uc3BhbkNvbnRleHQoKS5zcGFuSWQpO1xuICAgIHRoaXMuZGVsZWdhdGUub25TdGFydChzcGFuLCBwYXJlbnRDb250ZXh0KTtcbiAgfVxuXG4gIG9uRW5kaW5nKHNwYW46IFNka1NwYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3Bhbklkcy5oYXMoc3Bhbi5zcGFuQ29udGV4dCgpLnNwYW5JZCkpIHJldHVybjtcbiAgICB0aGlzLmRlbGVnYXRlLm9uRW5kaW5nPy4oc3Bhbik7XG4gIH1cblxuICBvbkVuZChzcGFuOiBSZWFkYWJsZVNwYW4pOiB2b2lkIHtcbiAgICBjb25zdCB0cmFjZUlkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnRyYWNlSWQ7XG4gICAgY29uc3Qgc3BhbklkID0gc3Bhbi5zcGFuQ29udGV4dCgpLnNwYW5JZDtcbiAgICBpZiAoIXRoaXMuc3Bhbklkcy5kZWxldGUoc3BhbklkKSkgcmV0dXJuO1xuICAgIHRoaXMuZGVsZWdhdGUub25FbmQoc3Bhbik7XG4gICAgaWYgKCFzcGFuLnBhcmVudFNwYW5Db250ZXh0Py5zcGFuSWQpIHRoaXMudHJhY2VJZHMuZGVsZXRlKHRyYWNlSWQpO1xuICB9XG5cbiAgZm9yY2VGbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5mb3JjZUZsdXNoKCk7XG4gIH1cblxuICBzaHV0ZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnRyYWNlSWRzLmNsZWFyKCk7XG4gICAgdGhpcy5zcGFuSWRzLmNsZWFyKCk7XG4gICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuc2h1dGRvd24oKTtcbiAgfVxufVxuXG4vKiogV29ya3NwYWNlIGNsaWVudCBjYXJyaWVkIG9uIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbnR5cGUgV29ya3NwYWNlQ2xpZW50ID0gV29ya3NwYWNlQ2xpZW50TGlrZTtcblxuLyoqIEV4cGVyaW1lbnQgdGFnIERhdGFicmlja3Mgc3RvcmVzIGFzIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgLiAqL1xuY29uc3QgVFJBQ0VfREVTVElOQVRJT05fUEFUSF9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZURlc3RpbmF0aW9uUGF0aFwiO1xuLyoqIEV4cGVyaW1lbnQgdGFnIG5hbWluZyB0aGUgT1RlbCBzcGFucyB0YWJsZSAoYGNhdGFsb2cuc2NoZW1hLntwcmVmaXh9X290ZWxfc3BhbnNgKS4gKi9cbmNvbnN0IFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcgPSBcIm1sZmxvdy5leHBlcmltZW50LmRhdGFicmlja3NUcmFjZVNwYW5TdG9yYWdlVGFibGVcIjtcblxuLyoqXG4gKiBDYWNoZWQgVUMgdGFibGUgcHJlZml4IHJlc29sdmVkIGZyb20gdGhlIGV4cGVyaW1lbnQuIGBsb2FkZWRgIGRpc3Rpbmd1aXNoZXNcbiAqIFwibm90IGZldGNoZWQgeWV0XCIgZnJvbSBcImZldGNoZWQsIGV4cGVyaW1lbnQgaGFzIG5vIFVDIGxvY2F0aW9uXCIuIE5ldHdvcmtcbiAqIGZhaWx1cmVzIGFyZSBub3QgY2FjaGVkIHNvIGEgbGF0ZXIgdGh1bWJzIGNsaWNrIGNhbiByZXRyeS5cbiAqL1xubGV0IGxvYWRlZFVjUHJlZml4OiB7IHByZWZpeDogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWQ7XG5cbi8qKiBTdHJpcCB0aGUgYHRyYWNlOi9gIFVSSSB3cmFwcGVyIGFuZCB0cmFpbGluZyBzbGFzaGVzIGZyb20gYSBVQyBwcmVmaXguICovXG5mdW5jdGlvbiBub3JtYWxpemVVY1ByZWZpeChyYXc6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gcmF3XG4gICAgPy50cmltKClcbiAgICAucmVwbGFjZSgvXnRyYWNlOlxcLy8sIFwiXCIpXG4gICAgLnJlcGxhY2UoL1xcLyskLywgXCJcIik7XG4gIHJldHVybiB2YWx1ZSB8fCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRGVyaXZlIGBjYXRhbG9nLnNjaGVtYS50YWJsZV9wcmVmaXhgIGZyb20gYSBzcGFucyB0YWJsZSBuYW1lLlxuICogRGF0YWJyaWNrcyBuYW1lcyB0aGUgdGFibGUgYHtwcmVmaXh9X290ZWxfc3BhbnNgLlxuICovXG5mdW5jdGlvbiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhYmxlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCBuYW1lID0gdGFibGU/LnRyaW0oKTtcbiAgaWYgKCFuYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAobmFtZS5lbmRzV2l0aChcIl9vdGVsX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfb3RlbF9zcGFuc1wiLmxlbmd0aCk7XG4gIGlmIChuYW1lLmVuZHNXaXRoKFwiX3NwYW5zXCIpKSByZXR1cm4gbmFtZS5zbGljZSgwLCAtXCJfc3BhbnNcIi5sZW5ndGgpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBleHBlcmltZW50VGFnTWFwKHJhdzogdW5rbm93bik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB0YWdzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkge1xuICAgIGZvciAoY29uc3QgdGFnIG9mIHJhdykge1xuICAgICAgaWYgKCFpc1JlY29yZCh0YWcpIHx8IHR5cGVvZiB0YWcua2V5ICE9PSBcInN0cmluZ1wiIHx8IHR5cGVvZiB0YWcudmFsdWUgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0YWdzLnNldCh0YWcua2V5LCB0YWcudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdGFncztcbiAgfVxuICBpZiAoIWlzUmVjb3JkKHJhdykpIHJldHVybiB0YWdzO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyYXcpKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGFncy5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHRhZ3M7XG59XG5cbi8qKlxuICogVUMgdGFibGUgcHJlZml4IHRoZSBhc3Nlc3NtZW50cyBBUEkgbmVlZHMsIHJlYWQgZnJvbSBleHBlcmltZW50IHRhZ3MuXG4gKlxuICogUHJlZmVycyB0aGUgdGhyZWUtcGFydCBkZXN0aW5hdGlvbiBwYXRoIERhdGFicmlja3Mgd3JpdGVzIHdoZW4gdGhlXG4gKiBleHBlcmltZW50IGlzIGxpbmtlZCB0byBhIHRhYmxlLXByZWZpeCBsb2NhdGlvbi4gRmFsbHMgYmFjayB0byBzdHJpcHBpbmdcbiAqIGBfb3RlbF9zcGFuc2AgZnJvbSB0aGUgc3BhbnMtdGFibGUgdGFnLiBUd28tcGFydCBzY2hlbWEtbGlua2VkIGRlc3RpbmF0aW9uc1xuICogYXJlIGlnbm9yZWQgKHRoZXkgYXJlIG5vdCBhIHRhYmxlIHByZWZpeCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1Y1RyYWNlUHJlZml4RnJvbUV4cGVyaW1lbnRUYWdzKHJhd1RhZ3M6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB0YWdzID0gZXhwZXJpbWVudFRhZ01hcChyYXdUYWdzKTtcbiAgY29uc3QgZGVzdGluYXRpb24gPSBub3JtYWxpemVVY1ByZWZpeCh0YWdzLmdldChUUkFDRV9ERVNUSU5BVElPTl9QQVRIX1RBRykpO1xuICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uc3BsaXQoXCIuXCIpLmxlbmd0aCA+PSAzKSByZXR1cm4gZGVzdGluYXRpb247XG4gIHJldHVybiBwcmVmaXhGcm9tU3BhblRhYmxlKHRhZ3MuZ2V0KFRSQUNFX1NQQU5fU1RPUkFHRV9UQUJMRV9UQUcpKTtcbn1cblxuLyoqIERyb3AgdGhlIGluLXByb2Nlc3MgVUMgcHJlZml4IGNhY2hlICh0ZXN0cykuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRVY1RyYWNlUHJlZml4Q2FjaGUoKTogdm9pZCB7XG4gIGxvYWRlZFVjUHJlZml4ID0gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFRyYWNlIGlkIHRoZSBhc3Nlc3NtZW50cyBSRVNUIEFQSSBhY2NlcHRzIGZvciB0aGlzIGRlcGxveW1lbnQuXG4gKlxuICogRGF0YWJyaWNrcyBBcHBzIHBlcnNpc3QgdHJhY2VzIGluIFVuaXR5IENhdGFsb2cuIFRoZSBleHBlcmltZW50IFVJIGxpc3RzXG4gKiB0aG9zZSByb3dzLCBidXQgYFBPU1QgL2FwaS8zLjAvbWxmbG93L3RyYWNlcy97aWR9L2Fzc2Vzc21lbnRzYCBsb29rcyB1cCB0aGVcbiAqIGV4cGVyaW1lbnQgc3RvcmUgdW5sZXNzIGB7aWR9YCBpcyB0aGUgVUMgVVJJIGB0cmFjZTove2NhdGFsb2d9LntzY2hlbWF9LntwcmVmaXh9L3t0ci1oZXh9YC5cbiAqIEEgYmFyZSBgdHItPGhleD5gIDQwNHMgYW5kIHRoZSBhc3Nlc3NtZW50IG5ldmVyIGFwcGVhcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtbGZsb3dBc3Nlc3NtZW50VHJhY2VJZCh0cmFjZUlkOiBzdHJpbmcsIHByZWZpeD86IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHJlc29sdmVkID0gbm9ybWFsaXplVWNQcmVmaXgocHJlZml4KTtcbiAgcmV0dXJuIHJlc29sdmVkID8gYHRyYWNlOi8ke3Jlc29sdmVkfS8ke3RyYWNlSWR9YCA6IHRyYWNlSWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZnJvbUVudiA9IG5vcm1hbGl6ZVVjUHJlZml4KHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UUkFDRV9QUkVGSVgpO1xuICBpZiAoZnJvbUVudikgcmV0dXJuIGZyb21FbnY7XG4gIGlmIChsb2FkZWRVY1ByZWZpeCkgcmV0dXJuIGxvYWRlZFVjUHJlZml4LnByZWZpeDtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGF3YWl0IGZldGNoRXhwZXJpbWVudChjbGllbnQpO1xuICBpZiAoIWV4cGVyaW1lbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGxvY2F0aW9uID0gZXhwZXJpbWVudC50cmFjZV9sb2NhdGlvbj8udWNfdHJhY2VfbG9jYXRpb247XG4gIGNvbnN0IHByZWZpeCA9XG4gICAgdWNUcmFjZVByZWZpeEZyb21FeHBlcmltZW50VGFncyhleHBlcmltZW50LnRhZ3MpID8/XG4gICAgKGxvY2F0aW9uXG4gICAgICA/IFtcbiAgICAgICAgICBsb2NhdGlvbi5jYXRhbG9nLFxuICAgICAgICAgIGxvY2F0aW9uLnNjaGVtYSxcbiAgICAgICAgICBsb2NhdGlvbi5lZmZlY3RpdmVfdGFibGVfcHJlZml4ID8/IGxvY2F0aW9uLnRhYmxlX3ByZWZpeCxcbiAgICAgICAgXVxuICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAuam9pbihcIi5cIilcbiAgICAgIDogdW5kZWZpbmVkKTtcbiAgbG9hZGVkVWNQcmVmaXggPSB7IHByZWZpeCB9O1xuICByZXR1cm4gcHJlZml4O1xufVxuXG4vKiogQXNzZXNzbWVudHMgUkVTVCBwYXRoIGZvciBhIHRyYWNlLiBgMy4wYCBpcyB0aGUgY3VycmVudCBNTGZsb3cgQVBJIHZlcnNpb24uICovXG5jb25zdCBhc3Nlc3NtZW50c1BhdGggPSAodHJhY2VJZDogc3RyaW5nKTogc3RyaW5nID0+XG4gIGAvYXBpLzMuMC9tbGZsb3cvdHJhY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNlSWQpfS9hc3Nlc3NtZW50c2A7XG5cbi8qKiBOdW1iZXIgb2YgdGltZXMgdG8gcmV0cnkgYSBcInRyYWNlIG5vdCBmb3VuZFwiIHJlc3BvbnNlIGJlZm9yZSBnaXZpbmcgdXAuICovXG5jb25zdCBOT1RfRk9VTkRfUkVUUklFUyA9IDM7XG4vKiogQmFzZSBiYWNrb2ZmIGJldHdlZW4gXCJ0cmFjZSBub3QgZm91bmRcIiByZXRyaWVzLCBpbiBtcyAoZ3Jvd3MgbGluZWFybHkpLiAqL1xuY29uc3QgTk9UX0ZPVU5EX0JBQ0tPRkZfTVMgPSAxMjAwO1xuXG5jb25zdCBNbGZsb3dFeHBlcmltZW50UmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGV4cGVyaW1lbnQ6IHpcbiAgICAgIC5vYmplY3Qoe1xuICAgICAgICBleHBlcmltZW50X2lkOiB6LnN0cmluZygpLm1pbigxKS5kZXNjcmliZShcIldvcmtzcGFjZSBNTGZsb3cgZXhwZXJpbWVudCBpZGVudGlmaWVyLlwiKSxcbiAgICAgICAgdGFnczogei51bmtub3duKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkV4cGVyaW1lbnQgdGFncywgaW5jbHVkaW5nIHRoZSBVQyB0cmFjZSBsb2NhdGlvbi5cIiksXG4gICAgICAgIHRyYWNlX2xvY2F0aW9uOiB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB1Y190cmFjZV9sb2NhdGlvbjogelxuICAgICAgICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICAgICAgICBjYXRhbG9nOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiVW5pdHkgQ2F0YWxvZyBjYXRhbG9nIG5hbWUuXCIpLFxuICAgICAgICAgICAgICAgIHNjaGVtYTogei5zdHJpbmcoKS5kZXNjcmliZShcIlVuaXR5IENhdGFsb2cgc2NoZW1hIG5hbWUuXCIpLFxuICAgICAgICAgICAgICAgIHRhYmxlX3ByZWZpeDogei5zdHJpbmcoKS5kZXNjcmliZShcIkNvbmZpZ3VyZWQgdHJhY2UgdGFibGUgcHJlZml4LlwiKSxcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVfdGFibGVfcHJlZml4OiB6XG4gICAgICAgICAgICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgICAgICAuZGVzY3JpYmUoXCJFZmZlY3RpdmUgdHJhY2UgdGFibGUgcHJlZml4IHNlbGVjdGVkIGJ5IERhdGFicmlja3MuXCIpLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCJVbml0eSBDYXRhbG9nIHRyYWNlIGxvY2F0aW9uLlwiKSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgLmRlc2NyaWJlKFwiRXhwZXJpbWVudCB0cmFjZSBzdG9yYWdlIGxvY2F0aW9uLlwiKSxcbiAgICAgIH0pXG4gICAgICAucGFzc3Rocm91Z2goKVxuICAgICAgLmRlc2NyaWJlKFwiQ29uZmlndXJlZCBNTGZsb3cgZXhwZXJpbWVudC5cIiksXG4gIH0pXG4gIC5wYXNzdGhyb3VnaCgpXG4gIC5kZXNjcmliZShcIk1MZmxvdyBnZXQtZXhwZXJpbWVudCByZXNwb25zZS5cIik7XG5cbmNvbnN0IEN1cnJlbnRVc2VyUmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHVzZXJOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJDdXJyZW50IHdvcmtzcGFjZSB1c2VyIG5hbWUuXCIpLFxuICAgIGFwcGxpY2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkN1cnJlbnQgc2VydmljZSBwcmluY2lwYWwgYXBwbGljYXRpb24gaWQuXCIpLFxuICAgIGRpc3BsYXlOYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJDdXJyZW50IHByaW5jaXBhbCBkaXNwbGF5IG5hbWUuXCIpLFxuICAgIGdyb3VwczogelxuICAgICAgLmFycmF5KFxuICAgICAgICB6XG4gICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICB2YWx1ZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV29ya3NwYWNlIGdyb3VwIGlkZW50aWZpZXIuXCIpLFxuICAgICAgICAgICAgZGlzcGxheTogei5zdHJpbmcoKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiV29ya3NwYWNlIGdyb3VwIGRpc3BsYXkgbmFtZS5cIiksXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgIClcbiAgICAgIC5vcHRpb25hbCgpXG4gICAgICAuZGVzY3JpYmUoXCJHcm91cHMgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgcHJpbmNpcGFsLlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBDdXJyZW50IFVzZXIgQVBJIHJlc3BvbnNlLlwiKTtcblxuY29uc3QgRXhwZXJpbWVudFBlcm1pc3Npb25zUmVzcG9uc2VTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGFjY2Vzc19jb250cm9sX2xpc3Q6IHpcbiAgICAgIC5hcnJheShcbiAgICAgICAgelxuICAgICAgICAgIC5vYmplY3Qoe1xuICAgICAgICAgICAgdXNlcl9uYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCkuZGVzY3JpYmUoXCJVc2VyIHByaW5jaXBhbCBuYW1lLlwiKSxcbiAgICAgICAgICAgIGdyb3VwX25hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKS5kZXNjcmliZShcIkdyb3VwIHByaW5jaXBhbCBuYW1lLlwiKSxcbiAgICAgICAgICAgIHNlcnZpY2VfcHJpbmNpcGFsX25hbWU6IHpcbiAgICAgICAgICAgICAgLnN0cmluZygpXG4gICAgICAgICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgICAgICAgIC5kZXNjcmliZShcIlNlcnZpY2UgcHJpbmNpcGFsIGFwcGxpY2F0aW9uIGlkLlwiKSxcbiAgICAgICAgICAgIGFsbF9wZXJtaXNzaW9uczogelxuICAgICAgICAgICAgICAuYXJyYXkoXG4gICAgICAgICAgICAgICAgelxuICAgICAgICAgICAgICAgICAgLm9iamVjdCh7XG4gICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25fbGV2ZWw6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJFZmZlY3RpdmUgZXhwZXJpbWVudCBwZXJtaXNzaW9uIGxldmVsLlwiKSxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAucGFzc3Rocm91Z2goKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAgICAgICAuZGVzY3JpYmUoXCJEaXJlY3QgYW5kIGluaGVyaXRlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyBwcmluY2lwYWwuXCIpLFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnBhc3N0aHJvdWdoKCksXG4gICAgICApXG4gICAgICAub3B0aW9uYWwoKVxuICAgICAgLmRlc2NyaWJlKFwiRXhwZXJpbWVudCBhY2Nlc3MgY29udHJvbCBlbnRyaWVzLlwiKSxcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKClcbiAgLmRlc2NyaWJlKFwiRGF0YWJyaWNrcyBleHBlcmltZW50IHBlcm1pc3Npb25zIHJlc3BvbnNlLlwiKTtcblxuZnVuY3Rpb24gY29uZmlndXJlZEV4cGVyaW1lbnQoKTogeyBpZD86IHN0cmluZzsgbmFtZT86IHN0cmluZyB9IHtcbiAgY29uc3QgaWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpO1xuICBjb25zdCBuYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfTkFNRT8udHJpbSgpO1xuICByZXR1cm4ge1xuICAgIC4uLihpZCA/IHsgaWQgfSA6IHt9KSxcbiAgICAuLi4obmFtZSA/IHsgbmFtZSB9IDoge30pLFxuICB9O1xufVxuXG4vKiogVHJhY2tpbmcgVVJJIGZvciBkaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcsIHdpdGggQ0xJLXByb2ZpbGUgYXV0aCBpbmplY3RlZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFja2luZ1VyaSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoaXNEYXRhYnJpY2tzQXBwRW52KCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfVFJBQ0tJTkdfVVJJPy50cmltKCk7XG4gIGlmIChjb25maWd1cmVkICYmIGNvbmZpZ3VyZWQgIT09IFwiZGF0YWJyaWNrc1wiKSByZXR1cm4gY29uZmlndXJlZDtcbiAgY29uc3QgcHJvZmlsZSA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ09ORklHX1BST0ZJTEU/LnRyaW0oKTtcbiAgcmV0dXJuIHByb2ZpbGUgPyBgZGF0YWJyaWNrczovLyR7cHJvZmlsZX1gIDogXCJkYXRhYnJpY2tzXCI7XG59XG5cbi8qKiBQYXJzZSB0aGUgb3B0aW9uYWwgVUMgdGFibGUtcHJlZml4IGxvY2F0aW9uIHVzZWQgYnkgZGlyZWN0IGxvY2FsIHRyYWNpbmcuICovXG5leHBvcnQgZnVuY3Rpb24gZGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbigpOlxuICB7IGNhdGFsb2dOYW1lOiBzdHJpbmc7IHNjaGVtYU5hbWU6IHN0cmluZzsgdGFibGVQcmVmaXg6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY2F0YWxvZ05hbWUgPSBwcm9jZXNzLmVudi5NTEZMT1dfVUNfQ0FUQUxPRz8udHJpbSgpO1xuICBjb25zdCBzY2hlbWFOYW1lID0gcHJvY2Vzcy5lbnYuTUxGTE9XX1VDX1NDSEVNQT8udHJpbSgpO1xuICBjb25zdCB0YWJsZVByZWZpeCA9IHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UQUJMRV9QUkVGSVg/LnRyaW0oKTtcbiAgaWYgKGNhdGFsb2dOYW1lICYmIHNjaGVtYU5hbWUgJiYgdGFibGVQcmVmaXgpIHtcbiAgICByZXR1cm4geyBjYXRhbG9nTmFtZSwgc2NoZW1hTmFtZSwgdGFibGVQcmVmaXggfTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeCA9IG5vcm1hbGl6ZVVjUHJlZml4KHByb2Nlc3MuZW52Lk1MRkxPV19VQ19UUkFDRV9QUkVGSVgpO1xuICBpZiAoIXByZWZpeCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXguc3BsaXQoXCIuXCIpO1xuICBpZiAocGFydHMubGVuZ3RoICE9PSAzKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBbcHJlZml4Q2F0YWxvZywgcHJlZml4U2NoZW1hLCBwcmVmaXhUYWJsZV0gPSBwYXJ0cztcbiAgaWYgKCFwcmVmaXhDYXRhbG9nIHx8ICFwcmVmaXhTY2hlbWEgfHwgIXByZWZpeFRhYmxlKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNhdGFsb2dOYW1lOiBwcmVmaXhDYXRhbG9nLFxuICAgIHNjaGVtYU5hbWU6IHByZWZpeFNjaGVtYSxcbiAgICB0YWJsZVByZWZpeDogcHJlZml4VGFibGUsXG4gIH07XG59XG5cbi8qKiBXaGV0aGVyIHRoZSBsb2NhbCBkaXJlY3QtdG8tZXhwZXJpbWVudCBNTGZsb3cgU0RLIGhhcyBlbm91Z2ggY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIEJvb2xlYW4oXG4gICAgIWlzRGF0YWJyaWNrc0FwcEVudigpICYmIHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX0lEPy50cmltKCkgJiYgZGlyZWN0TWxmbG93VHJhY2tpbmdVcmkoKSxcbiAgKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBEYXRhYnJpY2tzIEFwcCBjYW4gcHJvbW90ZSBPVExQIHNwYW5zIGludG8gZnVsbCBNTGZsb3cgdHJhY2UgaW5mby4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBNbGZsb3dUcmFjZUluZm9Db25maWd1cmVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICBpc0RhdGFicmlja3NBcHBFbnYoKSAmJlxuICAgIChwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRD8udHJpbSgpIHx8IHByb2Nlc3MuZW52Lk1MRkxPV19FWFBFUklNRU5UX05BTUU/LnRyaW0oKSkgJiZcbiAgICAocHJvY2Vzcy5lbnYuT1RFTF9FWFBPUlRFUl9PVExQX0VORFBPSU5UPy50cmltKCkgfHxcbiAgICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSksXG4gICk7XG59XG5cbi8qKiBJbml0aWFsaXplIHRoZSBBcHAgc2VydmljZS1wcmluY2lwYWwgY2xpZW50IHVzZWQgdG8gcGVyc2lzdCBWNCB0cmFjZSB0YWdzIGFuZCBtZXRhZGF0YS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbml0aWFsaXplQXBwTWxmbG93VHJhY2VJbmZvKGNsaWVudD86IFdvcmtzcGFjZUNsaWVudCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoYXBwTWxmbG93VHJhY2VJbmZvQ2xpZW50ICYmIGFwcE1sZmxvd1RyYWNlUHJlZml4KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGFwcE1sZmxvd1RyYWNlSW5mb0luaXRTdGFydGVkIHx8ICFhcHBNbGZsb3dUcmFjZUluZm9Db25maWd1cmVkKCkpIHJldHVybiBmYWxzZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvSW5pdFN0YXJ0ZWQgPSB0cnVlO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc29sdmVkQ2xpZW50ID0gY2xpZW50ID8/IChjcmVhdGVXb3Jrc3BhY2VDbGllbnQoKSBhcyBXb3Jrc3BhY2VDbGllbnQpO1xuICAgIGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCA/Pz0gcmVzb2x2ZWRDbGllbnQ7XG4gICAgY29uc3QgcHJlZml4ID0gYXdhaXQgcmVzb2x2ZVVjVHJhY2VQcmVmaXgocmVzb2x2ZWRDbGllbnQpO1xuICAgIGlmICghcHJlZml4IHx8IHByZWZpeC5zcGxpdChcIi5cIikubGVuZ3RoICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgQ29uZmlndXJhdGlvbkVycm9yKFxuICAgICAgICBcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgYXBwTWxmbG93VHJhY2VQcmVmaXggPSBwcmVmaXg7XG4gICAgbG9nZ2VyLmluZm8oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGVuYWJsZWRcIiwgeyBwcmVmaXggfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiRGF0YWJyaWNrcyBBcHBzIE1MZmxvdyB0cmFjZS1pbmZvIHByb21vdGlvbiBkaXNhYmxlZFwiLCB7XG4gICAgICBlcnJvcjogdG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIC8vIFN0YXJ0dXAgdXNlcyB0aGUgc2VydmljZSBwcmluY2lwYWwuIFBlcm1pdCBvbmUgbGF0ZXIgcmVxdWVzdC1zY29wZWRcbiAgICAvLyBjbGllbnQgdG8gcmVzb2x2ZSBleHBlcmltZW50IG1ldGFkYXRhIHdoZW4gdGhhdCBwcmluY2lwYWwgY2Fubm90IHJlYWQgaXQuXG4gICAgaWYgKGNsaWVudCA9PT0gdW5kZWZpbmVkKSBhcHBNbGZsb3dUcmFjZUluZm9Jbml0U3RhcnRlZCA9IGZhbHNlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFJldHJ5IEFwcHMgdHJhY2UtbG9jYXRpb24gZGlzY292ZXJ5IG9uY2Ugd2l0aCBhIHJlcXVlc3Qtc2NvcGVkIHdvcmtzcGFjZVxuICogY2xpZW50IGFmdGVyIHNlcnZpY2UtcHJpbmNpcGFsIHN0YXJ0dXAgZGlzY292ZXJ5IGZhaWxlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVSZXF1ZXN0TWxmbG93VHJhY2VJbmZvKGNsaWVudDogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmIChhcHBNbGZsb3dUcmFjZUluZm9DbGllbnQgJiYgYXBwTWxmbG93VHJhY2VQcmVmaXgpIHJldHVybiB0cnVlO1xuICBpZiAoYXBwTWxmbG93VHJhY2VJbmZvUmVxdWVzdEluaXRTdGFydGVkIHx8ICFhcHBNbGZsb3dUcmFjZUluZm9Db25maWd1cmVkKCkpIHJldHVybiBmYWxzZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvUmVxdWVzdEluaXRTdGFydGVkID0gdHJ1ZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvSW5pdFN0YXJ0ZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGluaXRpYWxpemVBcHBNbGZsb3dUcmFjZUluZm8oY2xpZW50KTtcbn1cblxuLyoqIFRyYWNlLWxldmVsIHZhbHVlcyBwZXJzaXN0ZWQgYmVzaWRlIHNwYW5zIGFscmVhZHkgZXhwb3J0ZWQgYnkgdGhlIEFwcHMgT1RMUCBzaWRlY2FyLiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBNbGZsb3dUcmFjZUluZm8ge1xuICB0cmFjZUlkOiBzdHJpbmc7XG4gIHJlcXVlc3RUaW1lOiBudW1iZXI7XG4gIGV4ZWN1dGlvbkR1cmF0aW9uOiBudW1iZXI7XG4gIGVycm9yOiBib29sZWFuO1xuICB0YWdzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICB1c2VyPzogc3RyaW5nO1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIHJlcXVlc3RQcmV2aWV3Pzogc3RyaW5nO1xuICByZXNwb25zZVByZXZpZXc/OiBzdHJpbmc7XG59XG5cbi8qKiBQZXJzaXN0IE1MZmxvdyBWNCB0cmFjZSBpbmZvIGZvciBvbmUgRGF0YWJyaWNrcyBBcHBzIE9UZWwgcm9vdCB3aXRob3V0IHJlLWV4cG9ydGluZyBzcGFucy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwZXJzaXN0QXBwTWxmbG93VHJhY2VJbmZvKHBhcmFtczogQXBwTWxmbG93VHJhY2VJbmZvKTogdm9pZCB7XG4gIGNvbnN0IGNsaWVudCA9IGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudDtcbiAgY29uc3QgcHJlZml4ID0gYXBwTWxmbG93VHJhY2VQcmVmaXg7XG4gIGlmICghY2xpZW50IHx8ICFwcmVmaXgpIHJldHVybjtcbiAgY29uc3QgW2NhdGFsb2dOYW1lLCBzY2hlbWFOYW1lLCB0YWJsZVByZWZpeF0gPSBwcmVmaXguc3BsaXQoXCIuXCIpO1xuICBpZiAoIWNhdGFsb2dOYW1lIHx8ICFzY2hlbWFOYW1lIHx8ICF0YWJsZVByZWZpeCkgcmV0dXJuO1xuICBjb25zdCB0cmFjZUluZm8gPSBuZXcgVHJhY2VJbmZvKHtcbiAgICB0cmFjZUlkOiBgdHJhY2U6LyR7cHJlZml4fS8ke3BhcmFtcy50cmFjZUlkfWAsXG4gICAgdHJhY2VMb2NhdGlvbjoge1xuICAgICAgdHlwZTogVHJhY2VMb2NhdGlvblR5cGUuVUNfVEFCTEVfUFJFRklYLFxuICAgICAgdWNUYWJsZVByZWZpeDogeyBjYXRhbG9nTmFtZSwgc2NoZW1hTmFtZSwgdGFibGVQcmVmaXggfSxcbiAgICB9LFxuICAgIHJlcXVlc3RUaW1lOiBwYXJhbXMucmVxdWVzdFRpbWUsXG4gICAgZXhlY3V0aW9uRHVyYXRpb246IHBhcmFtcy5leGVjdXRpb25EdXJhdGlvbixcbiAgICBzdGF0ZTogcGFyYW1zLmVycm9yID8gVHJhY2VTdGF0ZS5FUlJPUiA6IFRyYWNlU3RhdGUuT0ssXG4gICAgLi4uKHBhcmFtcy5yZXF1ZXN0UHJldmlldyA/IHsgcmVxdWVzdFByZXZpZXc6IHBhcmFtcy5yZXF1ZXN0UHJldmlldyB9IDoge30pLFxuICAgIC4uLihwYXJhbXMucmVzcG9uc2VQcmV2aWV3ID8geyByZXNwb25zZVByZXZpZXc6IHBhcmFtcy5yZXNwb25zZVByZXZpZXcgfSA6IHt9KSxcbiAgICB0cmFjZU1ldGFkYXRhOiB7XG4gICAgICBbVHJhY2VNZXRhZGF0YUtleS5TQ0hFTUFfVkVSU0lPTl06IFwiNFwiLFxuICAgICAgLi4uKHBhcmFtcy51c2VyID8geyBbVHJhY2VNZXRhZGF0YUtleS5UUkFDRV9VU0VSXTogcGFyYW1zLnVzZXIgfSA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMuc2Vzc2lvbklkID8geyBbVHJhY2VNZXRhZGF0YUtleS5UUkFDRV9TRVNTSU9OXTogcGFyYW1zLnNlc3Npb25JZCB9IDoge30pLFxuICAgIH0sXG4gICAgdGFnczogcGFyYW1zLnRhZ3MsXG4gICAgYXNzZXNzbWVudHM6IFtdLFxuICB9KTtcbiAgY29uc3QgcGF0aCA9IGAvYXBpLzQuMC9tbGZsb3cvdHJhY2VzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHByZWZpeCl9LyR7cGFyYW1zLnRyYWNlSWR9L2luZm9gO1xuICBjb25zdCBwZW5kaW5nID0gZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgcGF0aCwgeyBtZXRob2Q6IFwiUE9TVFwiLCBib2R5OiB0cmFjZUluZm8udG9Kc29uKCkgfSlcbiAgICAudGhlbihhc3luYyAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5vaykgcmV0dXJuO1xuICAgICAgbG9nZ2VyLndhcm4oXCJEYXRhYnJpY2tzIEFwcHMgTUxmbG93IHRyYWNlLWluZm8gcHJvbW90aW9uIGZhaWxlZFwiLCB7XG4gICAgICAgIHRyYWNlSWQ6IHBhcmFtcy50cmFjZUlkLFxuICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgYm9keTogYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXNwb25zZSksXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICBsb2dnZXIud2FybihcIkRhdGFicmlja3MgQXBwcyBNTGZsb3cgdHJhY2UtaW5mbyBwcm9tb3Rpb24gZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGVycm9yOiB0b0Vycm9yKGVyciksXG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5maW5hbGx5KCgpID0+IHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8uZGVsZXRlKHBlbmRpbmcpKTtcbiAgcGVuZGluZ0FwcE1sZmxvd1RyYWNlSW5mby5hZGQocGVuZGluZyk7XG59XG5cbi8qKiBSZXNldCBBcHBzIHRyYWNlLWluZm8gcHJvbW90aW9uIHN0YXRlIGZvciB0ZXN0cy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldEFwcE1sZmxvd1RyYWNlSW5mbygpOiB2b2lkIHtcbiAgYXBwTWxmbG93VHJhY2VJbmZvSW5pdFN0YXJ0ZWQgPSBmYWxzZTtcbiAgYXBwTWxmbG93VHJhY2VJbmZvUmVxdWVzdEluaXRTdGFydGVkID0gZmFsc2U7XG4gIGFwcE1sZmxvd1RyYWNlSW5mb0NsaWVudCA9IHVuZGVmaW5lZDtcbiAgYXBwTWxmbG93VHJhY2VQcmVmaXggPSB1bmRlZmluZWQ7XG4gIHBlbmRpbmdBcHBNbGZsb3dUcmFjZUluZm8uY2xlYXIoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0ZWREaXJlY3RNbGZsb3dUcmFjZUxvY2F0aW9uKFxuICBtbGZsb3c6IE1sZmxvd01vZHVsZSxcbiAgdHJhY2tpbmdVcmk6IHN0cmluZyxcbiAgZXhwZXJpbWVudElkOiBzdHJpbmcsXG4gIGhvc3Q6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8eyBjYXRhbG9nTmFtZTogc3RyaW5nOyBzY2hlbWFOYW1lOiBzdHJpbmc7IHRhYmxlUHJlZml4OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBleHBsaWNpdCA9IGRpcmVjdE1sZmxvd1RyYWNlTG9jYXRpb24oKTtcbiAgaWYgKGV4cGxpY2l0KSByZXR1cm4gZXhwbGljaXQ7XG4gIHRyeSB7XG4gICAgY29uc3QgYXV0aFByb3ZpZGVyID0gbWxmbG93LmNyZWF0ZUF1dGhQcm92aWRlcih7XG4gICAgICB0cmFja2luZ1VyaSxcbiAgICAgIC4uLihob3N0ID8geyBob3N0IH0gOiB7fSksXG4gICAgfSk7XG4gICAgY29uc3QgY2xpZW50ID0gbmV3IG1sZmxvdy5NbGZsb3dDbGllbnQoeyB0cmFja2luZ1VyaSwgYXV0aFByb3ZpZGVyIH0pO1xuICAgIGNvbnN0IGV4cGVyaW1lbnQgPSBhd2FpdCBjbGllbnQuZ2V0RXhwZXJpbWVudChleHBlcmltZW50SWQpO1xuICAgIGlmICghZXhwZXJpbWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCB7IHVjTG9jYXRpb25Gcm9tRXhwZXJpbWVudFRhZ3MgfSA9IGF3YWl0IGltcG9ydChcIkBtbGZsb3cvY29yZS9kaXN0L2NvcmUvZGVzdGluYXRpb24uanNcIik7XG4gICAgY29uc3QgbG9jYXRpb24gPSB1Y0xvY2F0aW9uRnJvbUV4cGVyaW1lbnRUYWdzKGV4cGVyaW1lbnQudGFncyk7XG4gICAgaWYgKCFsb2NhdGlvbj8udGFibGVQcmVmaXgpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhdGFsb2dOYW1lOiBsb2NhdGlvbi5jYXRhbG9nTmFtZSxcbiAgICAgIHNjaGVtYU5hbWU6IGxvY2F0aW9uLnNjaGVtYU5hbWUsXG4gICAgICB0YWJsZVByZWZpeDogbG9jYXRpb24udGFibGVQcmVmaXgsXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkaXJlY3QgTUxmbG93IFVDIHRyYWNlLWxvY2F0aW9uIGRldGVjdGlvbiBmYWlsZWRcIiwge1xuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnQgdGhlIE1MZmxvdyBOb2RlIHRyYWNlciBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgd2hlbiBBcHBLaXQgaGFzIG5vIE9UTFBcbiAqIGV4cG9ydGVyLiBUaGlzIHByb3ZpZGVyIGlzIG5ldmVyIHN0YXJ0ZWQgaW4gdGhlIGRlcGxveWVkIEFwcHMgcGF0aCwgYXZvaWRpbmdcbiAqIGEgc2Vjb25kIGdsb2JhbCBPVGVsIHByb3ZpZGVyIHJhY2luZyBBcHBLaXQncyB0ZWxlbWV0cnkgbWFuYWdlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVEaXJlY3RNbGZsb3dUcmFjaW5nKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBpZiAoZGlyZWN0TWxmbG93KSByZXR1cm4gdHJ1ZTtcbiAgaWYgKGRpcmVjdE1sZmxvd0luaXRTdGFydGVkIHx8ICFkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKSByZXR1cm4gZmFsc2U7XG4gIGRpcmVjdE1sZmxvd0luaXRTdGFydGVkID0gdHJ1ZTtcblxuICBjb25zdCBleHBlcmltZW50SWQgPSBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9JRCEudHJpbSgpO1xuICBjb25zdCB0cmFja2luZ1VyaSA9IGRpcmVjdE1sZmxvd1RyYWNraW5nVXJpKCkhO1xuICB0cnkge1xuICAgIGNvbnN0IG1sZmxvdyA9IGF3YWl0IGltcG9ydChcIkBtbGZsb3cvY29yZVwiKTtcbiAgICBjb25zdCByYXdIb3N0ID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19IT1NUPy50cmltKCk7XG4gICAgY29uc3QgaG9zdCA9IHJhd0hvc3RcbiAgICAgID8gL15odHRwcz86XFwvXFwvL2kudGVzdChyYXdIb3N0KVxuICAgICAgICA/IHJhd0hvc3RcbiAgICAgICAgOiBgaHR0cHM6Ly8ke3Jhd0hvc3R9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgdHJhY2VMb2NhdGlvbiA9IGF3YWl0IGRldGVjdGVkRGlyZWN0TWxmbG93VHJhY2VMb2NhdGlvbihcbiAgICAgIG1sZmxvdyxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgZXhwZXJpbWVudElkLFxuICAgICAgaG9zdCxcbiAgICApO1xuICAgIGlmICghdHJhY2VMb2NhdGlvbikge1xuICAgICAgdGhyb3cgbmV3IENvbmZpZ3VyYXRpb25FcnJvcihcbiAgICAgICAgXCJEaXJlY3QgbG9jYWwgTUxmbG93IHRyYWNpbmcgcmVxdWlyZXMgYSBVQy1saW5rZWQgZXhwZXJpbWVudCBvciBNTEZMT1dfVUNfVFJBQ0VfUFJFRklYLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgW3sgRGF0YWJyaWNrc1VDVGFibGVTcGFuRXhwb3J0ZXIsIERhdGFicmlja3NVQ1RhYmxlU3BhblByb2Nlc3NvciB9LCBzZGtdID1cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgaW1wb3J0KFwiQG1sZmxvdy9jb3JlL2Rpc3QvZXhwb3J0ZXJzL3VjX3RhYmxlLmpzXCIpLFxuICAgICAgICBpbXBvcnQoXCJAb3BlbnRlbGVtZXRyeS9zZGstdHJhY2Utbm9kZVwiKSxcbiAgICAgIF0pO1xuICAgIGNvbnN0IGF1dGhQcm92aWRlciA9IG1sZmxvdy5jcmVhdGVBdXRoUHJvdmlkZXIoe1xuICAgICAgdHJhY2tpbmdVcmksXG4gICAgICAuLi4oaG9zdCA/IHsgaG9zdCB9IDoge30pLFxuICAgIH0pO1xuICAgIGNvbnN0IGNsaWVudCA9IG5ldyBtbGZsb3cuTWxmbG93Q2xpZW50KHsgdHJhY2tpbmdVcmksIGF1dGhQcm92aWRlciB9KTtcbiAgICBjb25zdCBleHBvcnRlciA9IG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5FeHBvcnRlcihjbGllbnQpO1xuICAgIGNvbnN0IHByb2Nlc3NvciA9IG5ldyBBZ2VudFRyYWNlU3BhblByb2Nlc3NvcihcbiAgICAgIG5ldyBEYXRhYnJpY2tzVUNUYWJsZVNwYW5Qcm9jZXNzb3IoZXhwb3J0ZXIsIHRyYWNlTG9jYXRpb24pLFxuICAgICk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBuZXcgc2RrLk5vZGVUcmFjZXJQcm92aWRlcih7IHNwYW5Qcm9jZXNzb3JzOiBbcHJvY2Vzc29yXSB9KTtcbiAgICBwcm92aWRlci5yZWdpc3RlcigpO1xuICAgIGRpcmVjdE1sZmxvdyA9IG1sZmxvdztcbiAgICBkaXJlY3RNbGZsb3dQcm92aWRlciA9IHByb3ZpZGVyO1xuICAgIGRpcmVjdE1sZmxvd1Byb2Nlc3NvciA9IHByb2Nlc3NvcjtcbiAgICBsb2dnZXIuaW5mbyhcImRpcmVjdCBNTGZsb3cgdHJhY2luZyBlbmFibGVkXCIsIHtcbiAgICAgIGV4cGVyaW1lbnRJZCxcbiAgICAgIHRyYWNraW5nVXJpLFxuICAgICAgdHJhY2VMb2NhdGlvbixcbiAgICB9KTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJkaXJlY3QgTUxmbG93IHRyYWNpbmcgZGlzYWJsZWRcIiwge1xuICAgICAgZXJyb3I6IHRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqIFBlcnNpc3QgdHJhY2UtbGV2ZWwgZmllbGRzIG9uIHRoZSBkaXJlY3QgTUxmbG93IHRyYWNlIGluIHRoZSBjdXJyZW50IE9UZWwgY29udGV4dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVBY3RpdmVNbGZsb3dUcmFjZShvcHRpb25zOiBVcGRhdGVDdXJyZW50VHJhY2VPcHRpb25zKTogdm9pZCB7XG4gIGRpcmVjdE1sZmxvdz8udXBkYXRlQ3VycmVudFRyYWNlKG9wdGlvbnMpO1xufVxuXG4vKiogUGVyc2lzdCB0YWdzIG9uIHRoZSBkaXJlY3QgTUxmbG93IHRyYWNlIGFjdGl2ZSBpbiB0aGUgY3VycmVudCBPVGVsIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQWN0aXZlTWxmbG93VHJhY2VUYWdzKHRhZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pOiB2b2lkIHtcbiAgdXBkYXRlQWN0aXZlTWxmbG93VHJhY2UoeyB0YWdzIH0pO1xufVxuXG4vKiogV2hldGhlciB0aGlzIHByb2Nlc3Mgb3ducyB0aGUgZmlsdGVyZWQgbG9jYWwgTUxmbG93IHRyYWNlciBwcm92aWRlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXJlY3RNbGZsb3dUcmFjaW5nQWN0aXZlKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gZGlyZWN0TWxmbG93UHJvY2Vzc29yICE9PSB1bmRlZmluZWQ7XG59XG5cbi8qKiBGbHVzaCBwZW5kaW5nIGRpcmVjdCBsb2NhbCB0cmFjZSBleHBvcnRzIGR1cmluZyBncmFjZWZ1bCBzaHV0ZG93bi4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmbHVzaERpcmVjdE1sZmxvd1RyYWNpbmcoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IFByb21pc2UuYWxsKFsuLi5wZW5kaW5nQXBwTWxmbG93VHJhY2VJbmZvXSk7XG4gIGF3YWl0IGRpcmVjdE1sZmxvd1Byb2Nlc3Nvcj8uZm9yY2VGbHVzaCgpO1xuICBhd2FpdCBkaXJlY3RNbGZsb3dQcm92aWRlcj8uZm9yY2VGbHVzaCgpO1xufVxuXG4vKipcbiAqIFdoZXRoZXIgTUxmbG93IGZlZWRiYWNrIGxvZ2dpbmcgaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRlcGxveW1lbnQuXG4gKlxuICogRW5hYmxlZCB3aGVuIGFuIE1MZmxvdyBleHBlcmltZW50IGlzIGNvbmZpZ3VyZWQgYW5kIHRyYWNlcyBoYXZlIGFuIGV4cG9ydFxuICogcGF0aDogQXBwS2l0IE9UTFAgaW4gYSBEYXRhYnJpY2tzIEFwcCwgb3IgdGhlIGRpcmVjdCBNTGZsb3cgTm9kZSBTREsgb3V0c2lkZVxuICogb25lLiBCb3RoIHBhdGhzIGFyZSBzZWxlY3RlZCBmcm9tIHN0YW5kYXJkIGVudmlyb25tZW50IHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1sZmxvd0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIGNvbnN0IGhhc0V4cG9ydGVyID0gQm9vbGVhbihcbiAgICBwcm9jZXNzLmVudi5PVEVMX0VYUE9SVEVSX09UTFBfRU5EUE9JTlQ/LnRyaW0oKSB8fFxuICAgIHByb2Nlc3MuZW52Lk9URUxfRVhQT1JURVJfT1RMUF9UUkFDRVNfRU5EUE9JTlQ/LnRyaW0oKSxcbiAgKTtcbiAgY29uc3QgaGFzRXhwZXJpbWVudCA9IEJvb2xlYW4oXG4gICAgcHJvY2Vzcy5lbnYuTUxGTE9XX0VYUEVSSU1FTlRfSUQ/LnRyaW0oKSB8fCBwcm9jZXNzLmVudi5NTEZMT1dfRVhQRVJJTUVOVF9OQU1FPy50cmltKCksXG4gICk7XG4gIHJldHVybiBoYXNFeHBlcmltZW50ICYmIChoYXNFeHBvcnRlciB8fCBkaXJlY3RNbGZsb3dUcmFjaW5nQ29uZmlndXJlZCgpKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdGhlIGNvbmZpZ3VyZWQgZXhwZXJpbWVudCBVUkwgb25seSB3aGVuIHRoZSBhY3RpdmUgRGF0YWJyaWNrc1xuICogcHJpbmNpcGFsIGhhcyBlZmZlY3RpdmUgYENBTl9NQU5BR0VgIHBlcm1pc3Npb24uIFBlcm1pc3Npb24gbG9va3VwIGlzXG4gKiBpbnRlbnRpb25hbGx5IGJlc3QtZWZmb3J0IHNvIEFwcHMgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGV4cG9zZSB0aGVcbiAqIHJlcXVpcmVkIEFQSXMgc2ltcGx5IG9taXQgdGhlIGRlYnVnIGFmZm9yZGFuY2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtbGZsb3dFeHBlcmltZW50TWFuYWdlclVybChcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCByZXNvbHZlTWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoY2xpZW50KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlTWxmbG93RXhwZXJpbWVudE1hbmFnZXJVcmwoXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwZXJpbWVudElkID0gYXdhaXQgcmVzb2x2ZUV4cGVyaW1lbnRJZChjbGllbnQpO1xuICBpZiAoIWV4cGVyaW1lbnRJZCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBbY3VycmVudFJlc3BvbnNlLCBwZXJtaXNzaW9uc1Jlc3BvbnNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBcIi9hcGkvMi4wL3ByZXZpZXcvc2NpbS92Mi9NZVwiLCB7IG1ldGhvZDogXCJHRVRcIiB9KSxcbiAgICBkYXRhYnJpY2tzRmV0Y2goXG4gICAgICBjbGllbnQsXG4gICAgICBgL2FwaS8yLjAvcGVybWlzc2lvbnMvZXhwZXJpbWVudHMvJHtlbmNvZGVVUklDb21wb25lbnQoZXhwZXJpbWVudElkKX1gLFxuICAgICAgeyBtZXRob2Q6IFwiR0VUXCIgfSxcbiAgICApLFxuICBdKTtcbiAgaWYgKCFjdXJyZW50UmVzcG9uc2Uub2sgfHwgIXBlcm1pc3Npb25zUmVzcG9uc2Uub2spIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgY3VycmVudCA9IEN1cnJlbnRVc2VyUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKGF3YWl0IHJlYWRSZXNwb25zZUpzb24oY3VycmVudFJlc3BvbnNlKSk7XG4gIGNvbnN0IHBlcm1pc3Npb25zID0gRXhwZXJpbWVudFBlcm1pc3Npb25zUmVzcG9uc2VTY2hlbWEuc2FmZVBhcnNlKFxuICAgIGF3YWl0IHJlYWRSZXNwb25zZUpzb24ocGVybWlzc2lvbnNSZXNwb25zZSksXG4gICk7XG4gIGlmICghY3VycmVudC5zdWNjZXNzIHx8ICFwZXJtaXNzaW9ucy5zdWNjZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHVzZXJOYW1lcyA9IG5ldyBTZXQoXG4gICAgW2N1cnJlbnQuZGF0YS51c2VyTmFtZSwgY3VycmVudC5kYXRhLmFwcGxpY2F0aW9uSWQsIGN1cnJlbnQuZGF0YS5kaXNwbGF5TmFtZV0uZmlsdGVyKFxuICAgICAgKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IEJvb2xlYW4odmFsdWUpLFxuICAgICksXG4gICk7XG4gIGNvbnN0IGdyb3VwTmFtZXMgPSBuZXcgU2V0KFxuICAgIChjdXJyZW50LmRhdGEuZ3JvdXBzID8/IFtdKS5mbGF0TWFwKCh7IHZhbHVlLCBkaXNwbGF5IH0pID0+XG4gICAgICBbdmFsdWUsIGRpc3BsYXldLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gQm9vbGVhbihlbnRyeSkpLFxuICAgICksXG4gICk7XG4gIGNvbnN0IGNhbk1hbmFnZSA9IChwZXJtaXNzaW9ucy5kYXRhLmFjY2Vzc19jb250cm9sX2xpc3QgPz8gW10pLnNvbWUoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlcyA9XG4gICAgICAoZW50cnkudXNlcl9uYW1lICE9PSB1bmRlZmluZWQgJiYgdXNlck5hbWVzLmhhcyhlbnRyeS51c2VyX25hbWUpKSB8fFxuICAgICAgKGVudHJ5LnNlcnZpY2VfcHJpbmNpcGFsX25hbWUgIT09IHVuZGVmaW5lZCAmJiB1c2VyTmFtZXMuaGFzKGVudHJ5LnNlcnZpY2VfcHJpbmNpcGFsX25hbWUpKSB8fFxuICAgICAgKGVudHJ5Lmdyb3VwX25hbWUgIT09IHVuZGVmaW5lZCAmJiBncm91cE5hbWVzLmhhcyhlbnRyeS5ncm91cF9uYW1lKSk7XG4gICAgcmV0dXJuIChcbiAgICAgIG1hdGNoZXMgJiZcbiAgICAgIChlbnRyeS5hbGxfcGVybWlzc2lvbnMgPz8gW10pLnNvbWUoXG4gICAgICAgIChwZXJtaXNzaW9uKSA9PiBwZXJtaXNzaW9uLnBlcm1pc3Npb25fbGV2ZWwgPT09IFwiQ0FOX01BTkFHRVwiLFxuICAgICAgKVxuICAgICk7XG4gIH0pO1xuICBpZiAoIWNhbk1hbmFnZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpO1xuICByZXR1cm4gbmV3IFVSTChgL21sL2V4cGVyaW1lbnRzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cGVyaW1lbnRJZCl9YCwgaG9zdCkudG9TdHJpbmcoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hFeHBlcmltZW50KFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbik6IFByb21pc2U8ei5pbmZlcjx0eXBlb2YgTWxmbG93RXhwZXJpbWVudFJlc3BvbnNlU2NoZW1hPltcImV4cGVyaW1lbnRcIl0gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZXhwZXJpbWVudCA9IGNvbmZpZ3VyZWRFeHBlcmltZW50KCk7XG4gIGNvbnN0IHBhdGggPSBleHBlcmltZW50LmlkXG4gICAgPyBgL2FwaS8yLjAvbWxmbG93L2V4cGVyaW1lbnRzL2dldD9leHBlcmltZW50X2lkPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGV4cGVyaW1lbnQuaWQpfWBcbiAgICA6IGV4cGVyaW1lbnQubmFtZVxuICAgICAgPyBgL2FwaS8yLjAvbWxmbG93L2V4cGVyaW1lbnRzL2dldC1ieS1uYW1lP2V4cGVyaW1lbnRfbmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICAgICBleHBlcmltZW50Lm5hbWUsXG4gICAgICAgICl9YFxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmICghcGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBkYXRhYnJpY2tzRmV0Y2goY2xpZW50LCBwYXRoLCB7IG1ldGhvZDogXCJHRVRcIiB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgcGFyc2VkID0gTWxmbG93RXhwZXJpbWVudFJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShhd2FpdCByZWFkUmVzcG9uc2VKc29uKHJlc3BvbnNlKSk7XG4gIHJldHVybiBwYXJzZWQuc3VjY2VzcyA/IHBhcnNlZC5kYXRhLmV4cGVyaW1lbnQgOiB1bmRlZmluZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVFeHBlcmltZW50SWQoY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBjb25maWd1cmVkID0gY29uZmlndXJlZEV4cGVyaW1lbnQoKTtcbiAgaWYgKGNvbmZpZ3VyZWQuaWQpIHJldHVybiBjb25maWd1cmVkLmlkO1xuICByZXR1cm4gKGF3YWl0IGZldGNoRXhwZXJpbWVudChjbGllbnQpKT8uZXhwZXJpbWVudF9pZDtcbn1cblxuLyoqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBsb2dGZWVkYmFja30uICovXG5leHBvcnQgdHlwZSBMb2dGZWVkYmFja1BhcmFtcyA9IE1sZmxvd0ZlZWRiYWNrUmVxdWVzdCAmIHtcbiAgLyoqIElkZW50aXR5IHRoZSBmZWVkYmFjayBpcyBhdHRyaWJ1dGVkIHRvICh1c2VyIGVtYWlsIC8gaWQpLiAqL1xuICBzb3VyY2VJZD86IHN0cmluZztcbn07XG5cbi8qKlxuICogTG9nIGEgSFVNQU4gZmVlZGJhY2sgYXNzZXNzbWVudCB0byBhIHRyYWNlLiBSZXR1cm5zIHRoZSBjcmVhdGVkXG4gKiBhc3Nlc3NtZW50IGlkIG9uIHN1Y2Nlc3MsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHRyYWNlIGNhbid0IGJlXG4gKiBmb3VuZCAoZXZlbiBhZnRlciByZXRyeWluZyBmb3IgZXhwb3J0IGxhZykgb3IgdGhlIHJlcXVlc3Qgb3RoZXJ3aXNlXG4gKiBmYWlscyAtIGNhbGxlcnMgc3VyZmFjZSB0aGF0IGFzIGEgc29mdCBcIm5vdCByZWNvcmRlZFwiIHJhdGhlciB0aGFuIGFuXG4gKiBlcnJvciwga2VlcGluZyB0aGUgY2hhdCB1c2FibGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2dGZWVkYmFjayhcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHBhcmFtczogTG9nRmVlZGJhY2tQYXJhbXMsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvLyBBIGNvbW1lbnQgd2l0aCBubyB0aHVtYnMgdmFsdWUgaXMgbG9nZ2VkIGFzIHRleHQgZmVlZGJhY2s7IGEgdmFsdWVcbiAgLy8gKHdpdGggYW4gb3B0aW9uYWwgY29tbWVudCBhcyB0aGUgcmF0aW9uYWxlKSBpcyB0aGUgdGh1bWJzIHBhdGguXG4gIGNvbnN0IGhhc1ZhbHVlID0gcGFyYW1zLnZhbHVlICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IG5hbWUgPSBwYXJhbXMubmFtZT8udHJpbSgpIHx8IChoYXNWYWx1ZSA/IERFRkFVTFRfRkVFREJBQ0tfTkFNRSA6IERFRkFVTFRfQ09NTUVOVF9OQU1FKTtcbiAgY29uc3QgdmFsdWUgPSBoYXNWYWx1ZSA/IHBhcmFtcy52YWx1ZSA6IHBhcmFtcy5jb21tZW50O1xuICBjb25zdCBhc3Nlc3NtZW50VHJhY2VJZCA9IG1sZmxvd0Fzc2Vzc21lbnRUcmFjZUlkKFxuICAgIHBhcmFtcy50cmFjZUlkLFxuICAgIGF3YWl0IHJlc29sdmVVY1RyYWNlUHJlZml4KGNsaWVudCksXG4gICk7XG4gIGNvbnN0IGFzc2Vzc21lbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIHRyYWNlX2lkOiBhc3Nlc3NtZW50VHJhY2VJZCxcbiAgICBhc3Nlc3NtZW50X25hbWU6IG5hbWUsXG4gICAgc291cmNlOiB7XG4gICAgICBzb3VyY2VfdHlwZTogXCJIVU1BTlwiLFxuICAgICAgc291cmNlX2lkOiBwYXJhbXMuc291cmNlSWQ/LnRyaW0oKSB8fCBcInVzZXJcIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7IHZhbHVlIH0sXG4gICAgLi4uKGhhc1ZhbHVlICYmIHBhcmFtcy5jb21tZW50Py50cmltKCkgPyB7IHJhdGlvbmFsZTogcGFyYW1zLmNvbW1lbnQgfSA6IHt9KSxcbiAgfTtcbiAgY29uc3QgYm9keSA9IHsgYXNzZXNzbWVudCB9O1xuXG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IE5PVF9GT1VORF9SRVRSSUVTOyBhdHRlbXB0KyspIHtcbiAgICBsZXQgcmVzOiBSZXNwb25zZTtcbiAgICB0cnkge1xuICAgICAgcmVzID0gYXdhaXQgZGF0YWJyaWNrc0ZldGNoKGNsaWVudCwgYXNzZXNzbWVudHNQYXRoKGFzc2Vzc21lbnRUcmFjZUlkKSwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5LFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIHJlcXVlc3QgZmFpbGVkXCIsIHtcbiAgICAgICAgdHJhY2VJZDogcGFyYW1zLnRyYWNlSWQsXG4gICAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnIpLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAocmVzLm9rKSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBhd2FpdCByZWFkUmVzcG9uc2VKc29uKHJlcyk7XG4gICAgICBjb25zdCBhc3Nlc3NtZW50SWQgPVxuICAgICAgICAocGFyc2VkIGFzIHsgYXNzZXNzbWVudD86IHsgYXNzZXNzbWVudF9pZD86IHVua25vd24gfSB9KT8uYXNzZXNzbWVudD8uYXNzZXNzbWVudF9pZCA/P1xuICAgICAgICAocGFyc2VkIGFzIHsgYXNzZXNzbWVudF9pZD86IHVua25vd24gfSk/LmFzc2Vzc21lbnRfaWQ7XG4gICAgICByZXR1cm4gdHlwZW9mIGFzc2Vzc21lbnRJZCA9PT0gXCJzdHJpbmdcIiA/IGFzc2Vzc21lbnRJZCA6IFwiXCI7XG4gICAgfVxuICAgIC8vIFRyYWNlIGV4cG9ydCBpcyBhc3luYzsgYSBmcmVzaCB0cmFjZSBtYXkgbm90IGV4aXN0IHlldC4gUmV0cnkgYVxuICAgIC8vIGZldyB0aW1lcyB3aXRoIGEgc2hvcnQgYmFja29mZiBiZWZvcmUgZ2l2aW5nIHVwIHNvZnRseS5cbiAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0ICYmIGF0dGVtcHQgPCBOT1RfRk9VTkRfUkVUUklFUykge1xuICAgICAgYXdhaXQgc2xlZXAoTk9UX0ZPVU5EX0JBQ0tPRkZfTVMgKiAoYXR0ZW1wdCArIDEpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsb2dnZXIud2FybihcImZlZWRiYWNrIG5vdCByZWNvcmRlZFwiLCB7XG4gICAgICB0cmFjZUlkOiBwYXJhbXMudHJhY2VJZCxcbiAgICAgIGFzc2Vzc21lbnRUcmFjZUlkLFxuICAgICAgc3RhdHVzOiByZXMuc3RhdHVzLFxuICAgICAgYm9keTogYXdhaXQgcmVhZFJlc3BvbnNlVGV4dChyZXMpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
package/lib/src/model.d.ts
CHANGED
|
@@ -22,11 +22,11 @@
|
|
|
22
22
|
* @module
|
|
23
23
|
*/
|
|
24
24
|
import { type WorkspaceClient } from "@databricks/appkit";
|
|
25
|
-
import { type DatabricksLanguageModel } from "@dbx-tools/model-protocol
|
|
26
|
-
import {
|
|
25
|
+
import { type DatabricksLanguageModel } from "@dbx-tools/model-protocol";
|
|
26
|
+
import { contracts, type ServingEndpointSummary } from "@dbx-tools/shared-model";
|
|
27
27
|
import { RequestContext } from "@mastra/core/request-context";
|
|
28
28
|
import { type MastraPluginConfig } from "./config.ts";
|
|
29
|
-
type ModelClass =
|
|
29
|
+
type ModelClass = contracts.ModelClass;
|
|
30
30
|
/** Keep Responses turns stateless so tool continuations replay encrypted reasoning inline. */
|
|
31
31
|
export declare const RESPONSES_PROVIDER_OPTIONS: {
|
|
32
32
|
readonly openai: {
|
package/lib/src/model.js
CHANGED
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
* @module
|
|
23
23
|
*/
|
|
24
24
|
import { createWorkspaceClient } from "@databricks/appkit";
|
|
25
|
-
import {
|
|
26
|
-
import { classes, policy, resolve } from "@dbx-tools/model";
|
|
27
|
-
import { createDatabricksLanguageModel, } from "@dbx-tools/model-protocol
|
|
25
|
+
import { tryGetExecutionContext } from "@dbx-tools/appkit";
|
|
26
|
+
import { classes, policy, resolve, selection } from "@dbx-tools/model";
|
|
27
|
+
import { createDatabricksLanguageModel, } from "@dbx-tools/model-protocol";
|
|
28
28
|
import { log } from "@dbx-tools/shared-core";
|
|
29
29
|
import { RequestContext } from "@mastra/core/request-context";
|
|
30
30
|
import { MASTRA_USER_KEY } from "./config.js";
|
|
@@ -45,7 +45,7 @@ export function servingApi(modelId) {
|
|
|
45
45
|
/** Resolve an OBO workspace client when present, else a service-principal client. */
|
|
46
46
|
function resolveModelWorkspaceContext(requestContext) {
|
|
47
47
|
const user = requestContext?.get(MASTRA_USER_KEY);
|
|
48
|
-
const executionContext = user?.executionContext ??
|
|
48
|
+
const executionContext = user?.executionContext ?? tryGetExecutionContext();
|
|
49
49
|
if (executionContext?.client.config) {
|
|
50
50
|
return {
|
|
51
51
|
client: executionContext.client,
|
|
@@ -81,7 +81,7 @@ function selectionInput(config, requested, defaultClass, serving = resolveServin
|
|
|
81
81
|
*/
|
|
82
82
|
export function resolveDefaultModelId(config, endpoints, overrides = {}) {
|
|
83
83
|
const requested = overrides.modelId ?? process.env.DATABRICKS_SERVING_ENDPOINT_NAME;
|
|
84
|
-
return
|
|
84
|
+
return selection.resolveModel(endpoints, selectionInput(config, requested, overrides.modelClass))
|
|
85
85
|
.modelId;
|
|
86
86
|
}
|
|
87
87
|
/**
|
|
@@ -137,4 +137,4 @@ export async function buildModel(config, requestContext, overrides = {}) {
|
|
|
137
137
|
providerName: config.providerId ?? "openai",
|
|
138
138
|
});
|
|
139
139
|
}
|
|
140
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUscUJBQXFCLEVBQXdCLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFDTCw2QkFBNkIsR0FFOUIsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQXNDLE1BQU0sYUFBYSxDQUFDO0FBQ2xGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLG9CQUFvQixHQUNyQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ3BDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFFaEMsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLE1BQU0sRUFBRTtRQUNOLEtBQUssRUFBRSxLQUFLO0tBQ2I7Q0FDTyxDQUFDO0FBRVgsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxVQUFVLENBQUMsT0FBZTtJQUN4QyxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQTZCRCxxRkFBcUY7QUFDckYsU0FBUyw0QkFBNEIsQ0FD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LEVBQUUsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDaEQsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFaEMsT0FBTyw2QkFBNkIsQ0FBQztRQUNuQyxPQUFPO1FBQ1AsUUFBUSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSTtRQUNKLE9BQU8sRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUM5QyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxRQUFRO0tBQzVDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERhdGFicmlja3MgTW9kZWwgU2VydmluZyByZXNvbHZlciBmb3IgTWFzdHJhIGFnZW50cy5cbiAqXG4gKiBFYWNoIGFnZW50IHN0ZXAgY2FsbHMge0BsaW5rIGJ1aWxkTW9kZWx9IHdpdGggdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIHVzZXIgc3RhbXBlZCBieSBgTWFzdHJhU2VydmVyYCBjYXJyaWVzIGFuXG4gKiBBcHBLaXQgYFdvcmtzcGFjZUNsaWVudGA7IHdlIGFzayBpdCBmb3IgdGhlIHdvcmtzcGFjZSBob3N0IGFuZCBhXG4gKiBmcmVzaCBiZWFyZXIgaGVhZGVyLCB0aGVuIGNvbnN0cnVjdCBhIHJlcXVlc3Qtc2NvcGVkIFZlcmNlbCBBSSBTREsgcHJvdmlkZXJcbiAqIGZvciB0aGUgZW5kcG9pbnQncyBuYXRpdmUgRGF0YWJyaWNrcyBzZXJ2aW5nIHByb3RvY29sLlxuICpcbiAqIFRoaXMgbW9kdWxlIG9ubHkgYWRkcyB0aGUgTWFzdHJhLXNwZWNpZmljIGdsdWUuIFRoZSBhY3R1YWwgbW9kZWxcbiAqIHNlbGVjdGlvbiAtIGxpc3RpbmcgdGhlIHdvcmtzcGFjZSBjYXRhbG9ndWUgYW5kIHJlc29sdmluZyBhblxuICogZXhwbGljaXQgbmFtZSAvIGNsYXNzIC8gZmFsbGJhY2sgY2hhaW4gdG8gYSByZWFsIGVuZHBvaW50IGlkIC0gbGl2ZXNcbiAqIGluIGBAZGJ4LXRvb2xzL21vZGVsYCAoe0BsaW5rIHNlbGVjdE1vZGVsfSkgc28gbm9uLU1hc3RyYSBjb25zdW1lcnNcbiAqIChlLmcuIGEgam9iIHRoYXQganVzdCBuZWVkcyBhIG1vZGVsIG5hbWUpIGNhbiByZXVzZSBpdC4gSGVyZSB3ZVxuICogYXNzZW1ibGUgdGhlIGV4cGxpY2l0IGFzayBmcm9tIE1hc3RyYSdzIHJlcXVlc3QgY29udGV4dCAodGhlXG4gKiBwZXItcmVxdWVzdCBvdmVycmlkZSB1bmRlciB7QGxpbmsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWX0sIHRoZVxuICogYWdlbnQgLyBwbHVnaW4gYG1vZGVsSWRgLCBvciBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgKSxcbiAqIHBhc3MgdGhlIHBsdWdpbidzIGZ1enp5IC8gY2xhc3MgLyBmYWxsYmFjayBrbm9icyB0aHJvdWdoLCBhbmQgd3JhcFxuICogdGhlIHJlc29sdmVkIGlkIGluIHRoZSBQcm92aWRlclY0IG1vZGVsIE1hc3RyYSBhY2NlcHRzLiBDYXRhbG9ndWUgZmV0Y2hlcyBmYWlsIGxvdWQ6IG5ldHdvcmsgLyBhdXRoIGVycm9yc1xuICogcHJvcGFnYXRlIHNvIGNhbGxlcnMgc2VlIHRoZSByZWFsIFNESyBtZXNzYWdlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVXb3Jrc3BhY2VDbGllbnQsIHR5cGUgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbGFzc2VzLCBwb2xpY3ksIHJlc29sdmUgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHtcbiAgY3JlYXRlRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWwsXG4gIHR5cGUgRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWwsXG59IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsLXByb3RvY29sL3Byb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgbW9kZWwsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuXG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gbW9kZWwuTW9kZWxDbGFzcztcbmNvbnN0IHsgcGFyc2VNb2RlbENsYXNzIH0gPSBjbGFzc2VzO1xuY29uc3QgeyBzZWxlY3RNb2RlbCB9ID0gcmVzb2x2ZTtcblxuLyoqIEtlZXAgUmVzcG9uc2VzIHR1cm5zIHN0YXRlbGVzcyBzbyB0b29sIGNvbnRpbnVhdGlvbnMgcmVwbGF5IGVuY3J5cHRlZCByZWFzb25pbmcgaW5saW5lLiAqL1xuZXhwb3J0IGNvbnN0IFJFU1BPTlNFU19QUk9WSURFUl9PUFRJT05TID0ge1xuICBvcGVuYWk6IHtcbiAgICBzdG9yZTogZmFsc2UsXG4gIH0sXG59IGFzIGNvbnN0O1xuXG4vKiogUGljayB0aGUgbmF0aXZlIERhdGFicmlja3MgaW5mZXJlbmNlIHN1cmZhY2UgcmVxdWlyZWQgYnkgYSByZXNvbHZlZCBtb2RlbC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXJ2aW5nQXBpKG1vZGVsSWQ6IHN0cmluZyk6IFwiY2hhdFwiIHwgXCJyZXNwb25zZXNcIiB7XG4gIHJldHVybiBwb2xpY3kubW9kZWxTZXJ2aW5nQXBpKG1vZGVsSWQpO1xufVxuXG4vKiogT3B0aW9uYWwgb3ZlcnJpZGVzIGFjY2VwdGVkIGJ5IHtAbGluayBidWlsZE1vZGVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnVpbGRNb2RlbE92ZXJyaWRlcyB7XG4gIC8qKlxuICAgKiBTdGF0aWMgbW9kZWwgaWQgZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW4gY29uZmlnIChzdHJpbmcgc3VnYXIgb25cbiAgICogYGRlZi5tb2RlbGAgb3IgYGNvbmZpZy5kZWZhdWx0TW9kZWxgKS4gTG9zZXMgdG8gdGhlIHBlci1yZXF1ZXN0XG4gICAqIG92ZXJyaWRlIGJ1dCB3aW5zIG92ZXIgZW52IC8gY2xhc3MgLyBmYWxsYmFjay5cbiAgICovXG4gIG1vZGVsSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDaGF0IGNhcGFiaWxpdHkgY2xhc3MgdG8gcmVzb2x2ZSB3aGVuIG5vIGV4cGxpY2l0IG1vZGVsIGlkIGlzXG4gICAqIHN1cHBsaWVkLiBVc2VkIGJ5IGludGVybmFsIGFnZW50cyAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lciBhc2tzIGZvclxuICAgKiB7QGxpbmsgbW9kZWwuTW9kZWxDbGFzcy5DaGF0RmFzdH0pIHRvIGV4cHJlc3MgaW50ZW50IHdpdGhvdXQgcGlubmluZyBhblxuICAgKiBlbmRwb2ludCBuYW1lOyB0aGUgbGl2ZSBjYXRhbG9ndWUgaXMgY2xhc3NpZmllZCBhbmQgdGhlIHRvcFxuICAgKiBhdmFpbGFibGUgbW9kZWwgaW4gdGhlIGNsYXNzIGlzIGNob3NlbiwgZmFsbGluZyBiYWNrIHRvIHRoZVxuICAgKiBjbGFzcydzIHN0YXRpYyBsaXN0IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm9uZS5cbiAgICovXG4gIG1vZGVsQ2xhc3M/OiBNb2RlbENsYXNzO1xuICAvKiogRXhwbGljaXQgd29ya3NwYWNlIGNsaWVudCBmb3Igc3RhbmRhbG9uZSBjYWxsZXJzIHN1Y2ggYXMgQ0xJcy4gKi9cbiAgd29ya3NwYWNlQ2xpZW50PzogV29ya3NwYWNlQ2xpZW50O1xufVxuXG4vKiogUmVzb2x2ZWQgd29ya3NwYWNlIGNsaWVudCBhbmQgdGhlIGF1dGhlbnRpY2F0aW9uIG1vZGUgYmFja2luZyBpdC4gKi9cbmludGVyZmFjZSBSZXNvbHZlZE1vZGVsV29ya3NwYWNlQ2xpZW50IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIGF1dGg6IFwib2JvXCIgfCBcInNlcnZpY2UtcHJpbmNpcGFsXCI7XG59XG5cbi8qKiBSZXNvbHZlIGFuIE9CTyB3b3Jrc3BhY2UgY2xpZW50IHdoZW4gcHJlc2VudCwgZWxzZSBhIHNlcnZpY2UtcHJpbmNpcGFsIGNsaWVudC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVNb2RlbFdvcmtzcGFjZUNvbnRleHQoXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQsXG4pOiBSZXNvbHZlZE1vZGVsV29ya3NwYWNlQ2xpZW50IHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBleGVjdXRpb25Db250ZXh0ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dCA/PyBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBpZiAoZXhlY3V0aW9uQ29udGV4dD8uY2xpZW50LmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnQ6IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LFxuICAgICAgYXV0aDogXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBjbGllbnQ6IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLCBhdXRoOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgdXNlZCBmb3IgbW9kZWwgZGlzY292ZXJ5IGFuZCBpbmZlcmVuY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ2xpZW50KHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQpOiBXb3Jrc3BhY2VDbGllbnQge1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ29udGV4dChyZXF1ZXN0Q29udGV4dCkuY2xpZW50O1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25JbnB1dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0Q2xhc3M6IE1vZGVsQ2xhc3MgfCB1bmRlZmluZWQsXG4gIHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpLFxuKSB7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgPyBwYXJzZU1vZGVsQ2xhc3MocmVxdWVzdGVkKSA6IG51bGw7XG4gIGNvbnN0IGV4cGxpY2l0ID0gcmVxdWVzdGVkQ2xhc3MgPT09IG51bGwgPyByZXF1ZXN0ZWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXF1ZXN0ZWRDbGFzcyA/PyBkZWZhdWx0Q2xhc3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgPyB7IGV4cGxpY2l0IH0gOiB7fSksXG4gICAgZnV6enk6IHNlcnZpbmcuZnV6enksXG4gICAgdGhyZXNob2xkOiBzZXJ2aW5nLnRocmVzaG9sZCxcbiAgICAuLi4obW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzIH0gOiB7fSksXG4gICAgZmFsbGJhY2tzOiBzZXJ2aW5nLmZhbGxiYWNrcy5zbGljZSgpLFxuICAgIGxpdmVPbmx5OiByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCxcbiAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFnZW50J3MgdW5waW5uZWQgZGVmYXVsdCBhZ2FpbnN0IGFuIGFscmVhZHktbG9hZGVkIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdpdGggbm8gY29uZmlndXJlZCBpZC9jbGFzcy9mYWxsYmFjaywgdGhlIGdlbmVyaWMgbW9kZWwgcmFua2VyIHNlbGVjdHMgdGhlXG4gKiBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBoaWdoZXN0LXJhbmtlZFxuICogbGl2ZSBjaGF0IGVuZHBvaW50IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm8gR1BULlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNb2RlbElkKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiByZXNvbHZlLnJlc29sdmVNb2RlbChlbmRwb2ludHMsIHNlbGVjdGlvbklucHV0KGNvbmZpZywgcmVxdWVzdGVkLCBvdmVycmlkZXMubW9kZWxDbGFzcykpXG4gICAgLm1vZGVsSWQ7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIERhdGFicmlja3MgUHJvdmlkZXJWNCBtb2RlbCBmb3IgdGhlIGN1cnJlbnQgYWdlbnQgc3RlcC4gUnVuc1xuICogd2hpbGUgYGFnZW50LnN0cmVhbWAgaXMgaW5zaWRlIHRoZSBgYXNVc2VyKHJlcSlgIHNjb3BlIHNvIHRva2Vuc1xuICogYXJlIHVzZXItc2NvcGVkOyBvdXRzaWRlIGFuIGFjdGl2ZSB1c2VyIGNvbnRleHQgdGhlIHdvcmtzcGFjZVxuICogY2xpZW50IGZhbGxzIGJhY2sgdG8gdGhlIHNlcnZpY2UgcHJpbmNpcGFsLlxuICpcbiAqIEVuZHBvaW50IHByZWNlZGVuY2U6IHRoZSBwZXItcmVxdWVzdCBvdmVycmlkZVxuICogKHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgb25seSB3aGVuIGBjb25maWcubW9kZWxPdmVycmlkZWAgYWxsb3dzXG4gKiBpdCksIHRoZW4ge0BsaW5rIEJ1aWxkTW9kZWxPdmVycmlkZXMubW9kZWxJZH0gZnJvbSB0aGUgYWdlbnQgLyBwbHVnaW5cbiAqIGNvbmZpZywgdGhlbiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgLiBXaXRoIG5vbmUgb2YgdGhvc2Ugc2V0IHRoZVxuICogY2FwYWJpbGl0eSBjbGFzcyBhbmQgZmFsbGJhY2sgbGFkZGVyIGluIGBAZGJ4LXRvb2xzL21vZGVsYCBjaG9vc2UgdGhlXG4gKiBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJ1aWxkTW9kZWwoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0LFxuICBvdmVycmlkZXM6IEJ1aWxkTW9kZWxPdmVycmlkZXMgPSB7fSxcbik6IFByb21pc2U8RGF0YWJyaWNrc0xhbmd1YWdlTW9kZWw+IHtcbiAgY29uc3QgY29udGV4dCA9IHJlcXVlc3RDb250ZXh0ID8/IG5ldyBSZXF1ZXN0Q29udGV4dCgpO1xuICAvLyBUaGUgY2hhdCBwYXRoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIHJlcXVlc3QgY29udGV4dCB2aWFcbiAgLy8gYE1hc3RyYVNlcnZlcmAuIFRoZSBNQ1AgdHJhbnNwb3J0IHJvdXRlcyBkb24ndCB0aHJlYWQgdGhhdCBjb250ZXh0XG4gIC8vIGludG8gdG9vbCBleGVjdXRpb24sIHNvIGZhbGwgYmFjayB0byB0aGUgYW1iaWVudCBleGVjdXRpb24gY29udGV4dFxuICAvLyAodGhlIGFjdGl2ZSBPQk8gc2NvcGUsIG9yIHRoZSBzZXJ2aWNlIHByaW5jaXBhbCkgd2hlbiBpdCdzIGFic2VudC5cbiAgY29uc3QgcmVzb2x2ZWQgPSBvdmVycmlkZXMud29ya3NwYWNlQ2xpZW50XG4gICAgPyB7IGNsaWVudDogb3ZlcnJpZGVzLndvcmtzcGFjZUNsaWVudCwgYXV0aDogXCJzZXJ2aWNlLXByaW5jaXBhbFwiIGFzIGNvbnN0IH1cbiAgICA6IHJlc29sdmVNb2RlbFdvcmtzcGFjZUNvbnRleHQoY29udGV4dCk7XG4gIGNvbnN0IHsgY2xpZW50LCBhdXRoIH0gPSByZXNvbHZlZDtcbiAgcmVjb3JkQWN0aXZlVHJhY2VBdXRoKGF1dGgpO1xuICBjb25zdCBjbGllbnRDb25maWcgPSBjbGllbnQuY29uZmlnO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGNsaWVudENvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGhlYWRlcnMgPSBuZXcgSGVhZGVycygpO1xuICBhd2FpdCBjbGllbnRDb25maWcuYXV0aGVudGljYXRlKGhlYWRlcnMpO1xuICBjb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKGNvbmZpZyk7XG4gIGNvbnN0IHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpO1xuICBjb25zdCBvdmVycmlkZSA9IHNlcnZpbmcuYWxsb3dPdmVycmlkZVxuICAgID8gKGNvbnRleHQuZ2V0KE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZClcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBUaGUgb3ZlcnJpZGUgLyBhZ2VudCBkZWZhdWx0IC8gZW52IHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBjb25jcmV0ZVxuICAvLyBlbmRwb2ludCBuYW1lIG9yIGEgbW9kZWwgY2xhc3Mgc2x1ZyAoXCJjaGF0LXRoaW5raW5nXCIgL1xuICAvLyBcImNoYXQtYmFsYW5jZWRcIiAvIFwiY2hhdC1mYXN0XCIpLiBBIGNsYXNzIHNsdWcgYmVjb21lcyBhIGNsYXNzIGludGVudFxuICAvLyAobGV0IHRoZSBsaXZlIGNhdGFsb2d1ZSBwaWNrIHRoZSBiZXN0IG1vZGVsIGluIHRoYXQgYmFuZCk7IGFueXRoaW5nXG4gIC8vIGVsc2UgaXMgYW4gZXhwbGljaXQgbmFtZSBmdXp6eS1tYXRjaGVkIGFnYWluc3QgdGhlIGNhdGFsb2d1ZS4gQW5cbiAgLy8gaW50ZXJuYWwgYG92ZXJyaWRlcy5tb2RlbENsYXNzYCAoZS5nLiB0aGUgY2hhcnQgcGxhbm5lcikgaXMgdGhlXG4gIC8vIGZsb29yIHdoZW4gbm90aGluZyB3YXMgcmVxdWVzdGVkLlxuICBjb25zdCByZXF1ZXN0ZWQgPSBvdmVycmlkZSA/PyBvdmVycmlkZXMubW9kZWxJZCA/PyBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRTtcblxuICBjb25zdCB7IG1vZGVsSWQsIHNvdXJjZSB9ID0gYXdhaXQgc2VsZWN0TW9kZWwoXG4gICAgY2xpZW50LFxuICAgIGhvc3QsXG4gICAgc2VsZWN0aW9uSW5wdXQoY29uZmlnLCByZXF1ZXN0ZWQsIG92ZXJyaWRlcy5tb2RlbENsYXNzLCBzZXJ2aW5nKSxcbiAgKTtcbiAgbG9nZ2VyLmRlYnVnKFwibW9kZWwgc2VsZWN0ZWRcIiwgeyBtb2RlbElkLCBzb3VyY2UsIHJlcXVlc3RlZCB9KTtcbiAgY29udGV4dC5zZXQoTUFTVFJBX1JFU09MVkVEX01PREVMX0tFWSwgbW9kZWxJZCk7XG4gIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwobW9kZWxJZCk7XG5cbiAgcmV0dXJuIGNyZWF0ZURhdGFicmlja3NMYW5ndWFnZU1vZGVsKHtcbiAgICBtb2RlbElkLFxuICAgIHByb3RvY29sOiBzZXJ2aW5nQXBpKG1vZGVsSWQpLFxuICAgIGhvc3QsXG4gICAgaGVhZGVyczogT2JqZWN0LmZyb21FbnRyaWVzKGhlYWRlcnMuZW50cmllcygpKSxcbiAgICBwcm92aWRlck5hbWU6IGNvbmZpZy5wcm92aWRlcklkID8/IFwib3BlbmFpXCIsXG4gIH0pO1xufVxuIl19
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFFSCxPQUFPLEVBQUUscUJBQXFCLEVBQXdCLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCw2QkFBNkIsR0FFOUIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRTlELE9BQU8sRUFBRSxlQUFlLEVBQXNDLE1BQU0sYUFBYSxDQUFDO0FBQ2xGLE9BQU8sRUFDTCx5QkFBeUIsRUFDekIseUJBQXlCLEVBQ3pCLG9CQUFvQixHQUNyQixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUcvRSxNQUFNLEVBQUUsZUFBZSxFQUFFLEdBQUcsT0FBTyxDQUFDO0FBQ3BDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFFaEMsOEZBQThGO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHO0lBQ3hDLE1BQU0sRUFBRTtRQUNOLEtBQUssRUFBRSxLQUFLO0tBQ2I7Q0FDTyxDQUFDO0FBRVgsaUZBQWlGO0FBQ2pGLE1BQU0sVUFBVSxVQUFVLENBQUMsT0FBZTtJQUN4QyxPQUFPLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQTZCRCxxRkFBcUY7QUFDckYsU0FB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QVMsRUFBRSxDQUFDLENBQUM7SUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUVoQyxPQUFPLDZCQUE2QixDQUFDO1FBQ25DLE9BQU87UUFDUCxRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQztRQUM3QixJQUFJO1FBQ0osT0FBTyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlDLFlBQVksRUFBRSxNQUFNLENBQUMsVUFBVSxJQUFJLFFBQVE7S0FDNUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIHJlc29sdmVyIGZvciBNYXN0cmEgYWdlbnRzLlxuICpcbiAqIEVhY2ggYWdlbnQgc3RlcCBjYWxscyB7QGxpbmsgYnVpbGRNb2RlbH0gd2l0aCB0aGUgYWN0aXZlXG4gKiBgUmVxdWVzdENvbnRleHRgLiBUaGUgdXNlciBzdGFtcGVkIGJ5IGBNYXN0cmFTZXJ2ZXJgIGNhcnJpZXMgYW5cbiAqIEFwcEtpdCBgV29ya3NwYWNlQ2xpZW50YDsgd2UgYXNrIGl0IGZvciB0aGUgd29ya3NwYWNlIGhvc3QgYW5kIGFcbiAqIGZyZXNoIGJlYXJlciBoZWFkZXIsIHRoZW4gY29uc3RydWN0IGEgcmVxdWVzdC1zY29wZWQgVmVyY2VsIEFJIFNESyBwcm92aWRlclxuICogZm9yIHRoZSBlbmRwb2ludCdzIG5hdGl2ZSBEYXRhYnJpY2tzIHNlcnZpbmcgcHJvdG9jb2wuXG4gKlxuICogVGhpcyBtb2R1bGUgb25seSBhZGRzIHRoZSBNYXN0cmEtc3BlY2lmaWMgZ2x1ZS4gVGhlIGFjdHVhbCBtb2RlbFxuICogc2VsZWN0aW9uIC0gbGlzdGluZyB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZSBhbmQgcmVzb2x2aW5nIGFuXG4gKiBleHBsaWNpdCBuYW1lIC8gY2xhc3MgLyBmYWxsYmFjayBjaGFpbiB0byBhIHJlYWwgZW5kcG9pbnQgaWQgLSBsaXZlc1xuICogaW4gYEBkYngtdG9vbHMvbW9kZWxgICh7QGxpbmsgc2VsZWN0TW9kZWx9KSBzbyBub24tTWFzdHJhIGNvbnN1bWVyc1xuICogKGUuZy4gYSBqb2IgdGhhdCBqdXN0IG5lZWRzIGEgbW9kZWwgbmFtZSkgY2FuIHJldXNlIGl0LiBIZXJlIHdlXG4gKiBhc3NlbWJsZSB0aGUgZXhwbGljaXQgYXNrIGZyb20gTWFzdHJhJ3MgcmVxdWVzdCBjb250ZXh0ICh0aGVcbiAqIHBlci1yZXF1ZXN0IG92ZXJyaWRlIHVuZGVyIHtAbGluayBNQVNUUkFfTU9ERUxfT1ZFUlJJREVfS0VZfSwgdGhlXG4gKiBhZ2VudCAvIHBsdWdpbiBgbW9kZWxJZGAsIG9yIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWApLFxuICogcGFzcyB0aGUgcGx1Z2luJ3MgZnV6enkgLyBjbGFzcyAvIGZhbGxiYWNrIGtub2JzIHRocm91Z2gsIGFuZCB3cmFwXG4gKiB0aGUgcmVzb2x2ZWQgaWQgaW4gdGhlIFByb3ZpZGVyVjQgbW9kZWwgTWFzdHJhIGFjY2VwdHMuIENhdGFsb2d1ZSBmZXRjaGVzIGZhaWwgbG91ZDogbmV0d29yayAvIGF1dGggZXJyb3JzXG4gKiBwcm9wYWdhdGUgc28gY2FsbGVycyBzZWUgdGhlIHJlYWwgU0RLIG1lc3NhZ2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCwgdHlwZSBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyB0cnlHZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBjbGFzc2VzLCBwb2xpY3ksIHJlc29sdmUsIHNlbGVjdGlvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQge1xuICBjcmVhdGVEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCxcbiAgdHlwZSBEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbCxcbn0gZnJvbSBcIkBkYngtdG9vbHMvbW9kZWwtcHJvdG9jb2xcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBjb250cmFjdHMsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuXG5pbXBvcnQgeyBNQVNUUkFfVVNFUl9LRVksIHR5cGUgTWFzdHJhUGx1Z2luQ29uZmlnLCB0eXBlIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVksXG4gIE1BU1RSQV9SRVNPTFZFRF9NT0RFTF9LRVksXG4gIHJlc29sdmVTZXJ2aW5nQ29uZmlnLFxufSBmcm9tIFwiLi9zZXJ2aW5nLnRzXCI7XG5pbXBvcnQgeyByZWNvcmRBY3RpdmVUcmFjZUF1dGgsIHJlY29yZEFjdGl2ZVRyYWNlTW9kZWwgfSBmcm9tIFwiLi90ZWxlbWV0cnkudHNcIjtcblxudHlwZSBNb2RlbENsYXNzID0gY29udHJhY3RzLk1vZGVsQ2xhc3M7XG5jb25zdCB7IHBhcnNlTW9kZWxDbGFzcyB9ID0gY2xhc3NlcztcbmNvbnN0IHsgc2VsZWN0TW9kZWwgfSA9IHJlc29sdmU7XG5cbi8qKiBLZWVwIFJlc3BvbnNlcyB0dXJucyBzdGF0ZWxlc3Mgc28gdG9vbCBjb250aW51YXRpb25zIHJlcGxheSBlbmNyeXB0ZWQgcmVhc29uaW5nIGlubGluZS4gKi9cbmV4cG9ydCBjb25zdCBSRVNQT05TRVNfUFJPVklERVJfT1BUSU9OUyA9IHtcbiAgb3BlbmFpOiB7XG4gICAgc3RvcmU6IGZhbHNlLFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqIFBpY2sgdGhlIG5hdGl2ZSBEYXRhYnJpY2tzIGluZmVyZW5jZSBzdXJmYWNlIHJlcXVpcmVkIGJ5IGEgcmVzb2x2ZWQgbW9kZWwuICovXG5leHBvcnQgZnVuY3Rpb24gc2VydmluZ0FwaShtb2RlbElkOiBzdHJpbmcpOiBcImNoYXRcIiB8IFwicmVzcG9uc2VzXCIge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsU2VydmluZ0FwaShtb2RlbElkKTtcbn1cblxuLyoqIE9wdGlvbmFsIG92ZXJyaWRlcyBhY2NlcHRlZCBieSB7QGxpbmsgYnVpbGRNb2RlbH0uICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkTW9kZWxPdmVycmlkZXMge1xuICAvKipcbiAgICogU3RhdGljIG1vZGVsIGlkIGZyb20gdGhlIGFnZW50IC8gcGx1Z2luIGNvbmZpZyAoc3RyaW5nIHN1Z2FyIG9uXG4gICAqIGBkZWYubW9kZWxgIG9yIGBjb25maWcuZGVmYXVsdE1vZGVsYCkuIExvc2VzIHRvIHRoZSBwZXItcmVxdWVzdFxuICAgKiBvdmVycmlkZSBidXQgd2lucyBvdmVyIGVudiAvIGNsYXNzIC8gZmFsbGJhY2suXG4gICAqL1xuICBtb2RlbElkPzogc3RyaW5nO1xuICAvKipcbiAgICogQ2hhdCBjYXBhYmlsaXR5IGNsYXNzIHRvIHJlc29sdmUgd2hlbiBubyBleHBsaWNpdCBtb2RlbCBpZCBpc1xuICAgKiBzdXBwbGllZC4gVXNlZCBieSBpbnRlcm5hbCBhZ2VudHMgKGUuZy4gdGhlIGNoYXJ0IHBsYW5uZXIgYXNrcyBmb3JcbiAgICoge0BsaW5rIG1vZGVsLk1vZGVsQ2xhc3MuQ2hhdEZhc3R9KSB0byBleHByZXNzIGludGVudCB3aXRob3V0IHBpbm5pbmcgYW5cbiAgICogZW5kcG9pbnQgbmFtZTsgdGhlIGxpdmUgY2F0YWxvZ3VlIGlzIGNsYXNzaWZpZWQgYW5kIHRoZSB0b3BcbiAgICogYXZhaWxhYmxlIG1vZGVsIGluIHRoZSBjbGFzcyBpcyBjaG9zZW4sIGZhbGxpbmcgYmFjayB0byB0aGVcbiAgICogY2xhc3MncyBzdGF0aWMgbGlzdCB3aGVuIHRoZSB3b3Jrc3BhY2UgaGFzIG5vbmUuXG4gICAqL1xuICBtb2RlbENsYXNzPzogTW9kZWxDbGFzcztcbiAgLyoqIEV4cGxpY2l0IHdvcmtzcGFjZSBjbGllbnQgZm9yIHN0YW5kYWxvbmUgY2FsbGVycyBzdWNoIGFzIENMSXMuICovXG4gIHdvcmtzcGFjZUNsaWVudD86IFdvcmtzcGFjZUNsaWVudDtcbn1cblxuLyoqIFJlc29sdmVkIHdvcmtzcGFjZSBjbGllbnQgYW5kIHRoZSBhdXRoZW50aWNhdGlvbiBtb2RlIGJhY2tpbmcgaXQuICovXG5pbnRlcmZhY2UgUmVzb2x2ZWRNb2RlbFdvcmtzcGFjZUNsaWVudCB7XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBhdXRoOiBcIm9ib1wiIHwgXCJzZXJ2aWNlLXByaW5jaXBhbFwiO1xufVxuXG4vKiogUmVzb2x2ZSBhbiBPQk8gd29ya3NwYWNlIGNsaWVudCB3aGVuIHByZXNlbnQsIGVsc2UgYSBzZXJ2aWNlLXByaW5jaXBhbCBjbGllbnQuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kZWxXb3Jrc3BhY2VDb250ZXh0KFxuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0LFxuKTogUmVzb2x2ZWRNb2RlbFdvcmtzcGFjZUNsaWVudCB7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgZXhlY3V0aW9uQ29udGV4dCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQgPz8gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBpZiAoZXhlY3V0aW9uQ29udGV4dD8uY2xpZW50LmNvbmZpZykge1xuICAgIHJldHVybiB7XG4gICAgICBjbGllbnQ6IGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LFxuICAgICAgYXV0aDogXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCA/IFwib2JvXCIgOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIsXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBjbGllbnQ6IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpLCBhdXRoOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIgfTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHdvcmtzcGFjZSBjbGllbnQgdXNlZCBmb3IgbW9kZWwgZGlzY292ZXJ5IGFuZCBpbmZlcmVuY2UuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ2xpZW50KHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQpOiBXb3Jrc3BhY2VDbGllbnQge1xuICByZXR1cm4gcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ29udGV4dChyZXF1ZXN0Q29udGV4dCkuY2xpZW50O1xufVxuXG5mdW5jdGlvbiBzZWxlY3Rpb25JbnB1dChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBkZWZhdWx0Q2xhc3M6IE1vZGVsQ2xhc3MgfCB1bmRlZmluZWQsXG4gIHNlcnZpbmcgPSByZXNvbHZlU2VydmluZ0NvbmZpZyhjb25maWcpLFxuKSB7XG4gIGNvbnN0IHJlcXVlc3RlZENsYXNzID0gcmVxdWVzdGVkICE9PSB1bmRlZmluZWQgPyBwYXJzZU1vZGVsQ2xhc3MocmVxdWVzdGVkKSA6IG51bGw7XG4gIGNvbnN0IGV4cGxpY2l0ID0gcmVxdWVzdGVkQ2xhc3MgPT09IG51bGwgPyByZXF1ZXN0ZWQgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IG1vZGVsQ2xhc3MgPSByZXF1ZXN0ZWRDbGFzcyA/PyBkZWZhdWx0Q2xhc3M7XG4gIHJldHVybiB7XG4gICAgLi4uKGV4cGxpY2l0ICE9PSB1bmRlZmluZWQgPyB7IGV4cGxpY2l0IH0gOiB7fSksXG4gICAgZnV6enk6IHNlcnZpbmcuZnV6enksXG4gICAgdGhyZXNob2xkOiBzZXJ2aW5nLnRocmVzaG9sZCxcbiAgICAuLi4obW9kZWxDbGFzcyAhPT0gdW5kZWZpbmVkID8geyBtb2RlbENsYXNzIH0gOiB7fSksXG4gICAgZmFsbGJhY2tzOiBzZXJ2aW5nLmZhbGxiYWNrcy5zbGljZSgpLFxuICAgIGxpdmVPbmx5OiByZXF1ZXN0ZWQgPT09IHVuZGVmaW5lZCxcbiAgICB0dGxNczogc2VydmluZy50dGxNcyxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGFuIGFnZW50J3MgdW5waW5uZWQgZGVmYXVsdCBhZ2FpbnN0IGFuIGFscmVhZHktbG9hZGVkIGxpdmUgY2F0YWxvZ3VlLlxuICpcbiAqIFdpdGggbm8gY29uZmlndXJlZCBpZC9jbGFzcy9mYWxsYmFjaywgdGhlIGdlbmVyaWMgbW9kZWwgcmFua2VyIHNlbGVjdHMgdGhlXG4gKiBoaWdoZXN0LXJhbmtlZCBjdXJyZW50bHkgYXZhaWxhYmxlIEdQVCwgdGhlbiBmYWxscyBiYWNrIHRvIHRoZSBoaWdoZXN0LXJhbmtlZFxuICogbGl2ZSBjaGF0IGVuZHBvaW50IHdoZW4gdGhlIHdvcmtzcGFjZSBoYXMgbm8gR1BULlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURlZmF1bHRNb2RlbElkKFxuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyxcbiAgZW5kcG9pbnRzOiByZWFkb25seSBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5W10sXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogc3RyaW5nIHtcbiAgY29uc3QgcmVxdWVzdGVkID0gb3ZlcnJpZGVzLm1vZGVsSWQgPz8gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUU7XG4gIHJldHVybiBzZWxlY3Rpb24ucmVzb2x2ZU1vZGVsKGVuZHBvaW50cywgc2VsZWN0aW9uSW5wdXQoY29uZmlnLCByZXF1ZXN0ZWQsIG92ZXJyaWRlcy5tb2RlbENsYXNzKSlcbiAgICAubW9kZWxJZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgRGF0YWJyaWNrcyBQcm92aWRlclY0IG1vZGVsIGZvciB0aGUgY3VycmVudCBhZ2VudCBzdGVwLiBSdW5zXG4gKiB3aGlsZSBgYWdlbnQuc3RyZWFtYCBpcyBpbnNpZGUgdGhlIGBhc1VzZXIocmVxKWAgc2NvcGUgc28gdG9rZW5zXG4gKiBhcmUgdXNlci1zY29wZWQ7IG91dHNpZGUgYW4gYWN0aXZlIHVzZXIgY29udGV4dCB0aGUgd29ya3NwYWNlXG4gKiBjbGllbnQgZmFsbHMgYmFjayB0byB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKlxuICogRW5kcG9pbnQgcHJlY2VkZW5jZTogdGhlIHBlci1yZXF1ZXN0IG92ZXJyaWRlXG4gKiAoe0BsaW5rIE1BU1RSQV9NT0RFTF9PVkVSUklERV9LRVl9LCBvbmx5IHdoZW4gYGNvbmZpZy5tb2RlbE92ZXJyaWRlYCBhbGxvd3NcbiAqIGl0KSwgdGhlbiB7QGxpbmsgQnVpbGRNb2RlbE92ZXJyaWRlcy5tb2RlbElkfSBmcm9tIHRoZSBhZ2VudCAvIHBsdWdpblxuICogY29uZmlnLCB0aGVuIGBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRWAuIFdpdGggbm9uZSBvZiB0aG9zZSBzZXQgdGhlXG4gKiBjYXBhYmlsaXR5IGNsYXNzIGFuZCBmYWxsYmFjayBsYWRkZXIgaW4gYEBkYngtdG9vbHMvbW9kZWxgIGNob29zZSB0aGVcbiAqIGVuZHBvaW50LlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYnVpbGRNb2RlbChcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQsXG4gIG92ZXJyaWRlczogQnVpbGRNb2RlbE92ZXJyaWRlcyA9IHt9LFxuKTogUHJvbWlzZTxEYXRhYnJpY2tzTGFuZ3VhZ2VNb2RlbD4ge1xuICBjb25zdCBjb250ZXh0ID0gcmVxdWVzdENvbnRleHQgPz8gbmV3IFJlcXVlc3RDb250ZXh0KCk7XG4gIC8vIFRoZSBjaGF0IHBhdGggc3RhbXBzIHRoZSBBcHBLaXQgdXNlciBvbiB0aGUgcmVxdWVzdCBjb250ZXh0IHZpYVxuICAvLyBgTWFzdHJhU2VydmVyYC4gVGhlIE1DUCB0cmFuc3BvcnQgcm91dGVzIGRvbid0IHRocmVhZCB0aGF0IGNvbnRleHRcbiAgLy8gaW50byB0b29sIGV4ZWN1dGlvbiwgc28gZmFsbCBiYWNrIHRvIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0XG4gIC8vICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2UgcHJpbmNpcGFsKSB3aGVuIGl0J3MgYWJzZW50LlxuICBjb25zdCByZXNvbHZlZCA9IG92ZXJyaWRlcy53b3Jrc3BhY2VDbGllbnRcbiAgICA/IHsgY2xpZW50OiBvdmVycmlkZXMud29ya3NwYWNlQ2xpZW50LCBhdXRoOiBcInNlcnZpY2UtcHJpbmNpcGFsXCIgYXMgY29uc3QgfVxuICAgIDogcmVzb2x2ZU1vZGVsV29ya3NwYWNlQ29udGV4dChjb250ZXh0KTtcbiAgY29uc3QgeyBjbGllbnQsIGF1dGggfSA9IHJlc29sdmVkO1xuICByZWNvcmRBY3RpdmVUcmFjZUF1dGgoYXV0aCk7XG4gIGNvbnN0IGNsaWVudENvbmZpZyA9IGNsaWVudC5jb25maWc7XG4gIGNvbnN0IGhvc3QgPSAoYXdhaXQgY2xpZW50Q29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgaGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gIGF3YWl0IGNsaWVudENvbmZpZy5hdXRoZW50aWNhdGUoaGVhZGVycyk7XG4gIGNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoY29uZmlnKTtcbiAgY29uc3Qgc2VydmluZyA9IHJlc29sdmVTZXJ2aW5nQ29uZmlnKGNvbmZpZyk7XG4gIGNvbnN0IG92ZXJyaWRlID0gc2VydmluZy5hbGxvd092ZXJyaWRlXG4gICAgPyAoY29udGV4dC5nZXQoTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSkgYXMgc3RyaW5nIHwgdW5kZWZpbmVkKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIFRoZSBvdmVycmlkZSAvIGFnZW50IGRlZmF1bHQgLyBlbnYgdmFsdWUgY2FuIGJlIGVpdGhlciBhIGNvbmNyZXRlXG4gIC8vIGVuZHBvaW50IG5hbWUgb3IgYSBtb2RlbCBjbGFzcyBzbHVnIChcImNoYXQtdGhpbmtpbmdcIiAvXG4gIC8vIFwiY2hhdC1iYWxhbmNlZFwiIC8gXCJjaGF0LWZhc3RcIikuIEEgY2xhc3Mgc2x1ZyBiZWNvbWVzIGEgY2xhc3MgaW50ZW50XG4gIC8vIChsZXQgdGhlIGxpdmUgY2F0YWxvZ3VlIHBpY2sgdGhlIGJlc3QgbW9kZWwgaW4gdGhhdCBiYW5kKTsgYW55dGhpbmdcbiAgLy8gZWxzZSBpcyBhbiBleHBsaWNpdCBuYW1lIGZ1enp5LW1hdGNoZWQgYWdhaW5zdCB0aGUgY2F0YWxvZ3VlLiBBblxuICAvLyBpbnRlcm5hbCBgb3ZlcnJpZGVzLm1vZGVsQ2xhc3NgIChlLmcuIHRoZSBjaGFydCBwbGFubmVyKSBpcyB0aGVcbiAgLy8gZmxvb3Igd2hlbiBub3RoaW5nIHdhcyByZXF1ZXN0ZWQuXG4gIGNvbnN0IHJlcXVlc3RlZCA9IG92ZXJyaWRlID8/IG92ZXJyaWRlcy5tb2RlbElkID8/IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfU0VSVklOR19FTkRQT0lOVF9OQU1FO1xuXG4gIGNvbnN0IHsgbW9kZWxJZCwgc291cmNlIH0gPSBhd2FpdCBzZWxlY3RNb2RlbChcbiAgICBjbGllbnQsXG4gICAgaG9zdCxcbiAgICBzZWxlY3Rpb25JbnB1dChjb25maWcsIHJlcXVlc3RlZCwgb3ZlcnJpZGVzLm1vZGVsQ2xhc3MsIHNlcnZpbmcpLFxuICApO1xuICBsb2dnZXIuZGVidWcoXCJtb2RlbCBzZWxlY3RlZFwiLCB7IG1vZGVsSWQsIHNvdXJjZSwgcmVxdWVzdGVkIH0pO1xuICBjb250ZXh0LnNldChNQVNUUkFfUkVTT0xWRURfTU9ERUxfS0VZLCBtb2RlbElkKTtcbiAgcmVjb3JkQWN0aXZlVHJhY2VNb2RlbChtb2RlbElkKTtcblxuICByZXR1cm4gY3JlYXRlRGF0YWJyaWNrc0xhbmd1YWdlTW9kZWwoe1xuICAgIG1vZGVsSWQsXG4gICAgcHJvdG9jb2w6IHNlcnZpbmdBcGkobW9kZWxJZCksXG4gICAgaG9zdCxcbiAgICBoZWFkZXJzOiBPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycy5lbnRyaWVzKCkpLFxuICAgIHByb3ZpZGVyTmFtZTogY29uZmlnLnByb3ZpZGVySWQgPz8gXCJvcGVuYWlcIixcbiAgfSk7XG59XG4iXX0=
|