aws-cdk 2.1138.0 → 2.1140.0
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 +16 -2
- package/THIRD_PARTY_LICENSES +128 -38
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/docs/deploy-architecture.md +3 -3
- package/lib/api/cloud-assembly.d.ts +0 -1
- package/lib/api/cloud-assembly.js +1 -2
- package/lib/cli/cdk-toolkit.d.ts +56 -25
- package/lib/cli/cdk-toolkit.js +186 -149
- package/lib/cli/cli.js +68 -32
- package/lib/cli/io-host/cli-io-host.d.ts +51 -9
- package/lib/cli/io-host/cli-io-host.js +111 -5
- package/lib/cli/pretty-print-error.d.ts +13 -4
- package/lib/cli/pretty-print-error.js +25 -13
- package/lib/cli/telemetry/library-version.js +3 -5
- package/lib/cli/telemetry/session.d.ts +1 -0
- package/lib/cli/telemetry/session.js +25 -13
- package/lib/cli/util/guess-agent.js +46 -20
- package/lib/commands/docs.js +6 -38
- package/lib/commands/init/init.d.ts +1 -1
- package/lib/commands/init/init.js +17 -23
- package/lib/commands/init/os.d.ts +3 -2
- package/lib/commands/init/os.js +18 -110
- package/lib/commands/migrate.js +8 -5
- package/lib/cxapp/cloud-executable.d.ts +2 -2
- package/lib/cxapp/cloud-executable.js +11 -11
- package/lib/cxapp/index.d.ts +0 -1
- package/lib/cxapp/index.js +1 -2
- package/lib/index.js +3077 -2059
- package/lib/index_bg.wasm +0 -0
- package/lib/init-templates/.init-version.json +1 -1
- package/lib/private/tools.d.ts +1 -0
- package/lib/private/tools.js +2 -1
- package/package.json +14 -13
- package/lib/cxapp/cloud-assembly.d.ts +0 -79
- package/lib/cxapp/cloud-assembly.js +0 -142
|
@@ -32,12 +32,65 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
32
32
|
return result;
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
36
|
+
if (value !== null && value !== void 0) {
|
|
37
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
38
|
+
var dispose, inner;
|
|
39
|
+
if (async) {
|
|
40
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
41
|
+
dispose = value[Symbol.asyncDispose];
|
|
42
|
+
}
|
|
43
|
+
if (dispose === void 0) {
|
|
44
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
45
|
+
dispose = value[Symbol.dispose];
|
|
46
|
+
if (async) inner = dispose;
|
|
47
|
+
}
|
|
48
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
49
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
50
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
51
|
+
}
|
|
52
|
+
else if (async) {
|
|
53
|
+
env.stack.push({ async: true });
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
};
|
|
57
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
58
|
+
return function (env) {
|
|
59
|
+
function fail(e) {
|
|
60
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
61
|
+
env.hasError = true;
|
|
62
|
+
}
|
|
63
|
+
var r, s = 0;
|
|
64
|
+
function next() {
|
|
65
|
+
while (r = env.stack.pop()) {
|
|
66
|
+
try {
|
|
67
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
68
|
+
if (r.dispose) {
|
|
69
|
+
var result = r.dispose.call(r.value);
|
|
70
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
71
|
+
}
|
|
72
|
+
else s |= 1;
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
fail(e);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
79
|
+
if (env.hasError) throw env.error;
|
|
80
|
+
}
|
|
81
|
+
return next();
|
|
82
|
+
};
|
|
83
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
84
|
+
var e = new Error(message);
|
|
85
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
86
|
+
});
|
|
35
87
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
88
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
89
|
};
|
|
38
90
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
91
|
exports.CliIoHost = void 0;
|
|
40
92
|
exports.matchAny = matchAny;
|
|
93
|
+
exports.suppressMessages = suppressMessages;
|
|
41
94
|
const util = __importStar(require("node:util"));
|
|
42
95
|
const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
|
|
43
96
|
const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
|
|
@@ -53,6 +106,12 @@ const endpoint_sink_1 = require("../telemetry/sink/endpoint-sink");
|
|
|
53
106
|
const file_sink_1 = require("../telemetry/sink/file-sink");
|
|
54
107
|
const funnel_1 = require("../telemetry/sink/funnel");
|
|
55
108
|
const ci_1 = require("../util/ci");
|
|
109
|
+
/**
|
|
110
|
+
* Make a plain remover function usable as a `Disposable` (see `DisposeListener`).
|
|
111
|
+
*/
|
|
112
|
+
function disposeListener(dispose) {
|
|
113
|
+
return Object.assign(dispose, { [Symbol.dispose]: dispose });
|
|
114
|
+
}
|
|
56
115
|
/**
|
|
57
116
|
* A simple IO host for the CLI that writes messages to the console.
|
|
58
117
|
*/
|
|
@@ -357,16 +416,17 @@ class CliIoHost {
|
|
|
357
416
|
return this.once(code, (msg) => ({ message: formatter(msg), ...(level !== undefined ? { level } : {}) }));
|
|
358
417
|
}
|
|
359
418
|
/**
|
|
360
|
-
* Add a listener to the registry and return a
|
|
419
|
+
* Add a listener to the registry and return a remover for it (callable and
|
|
420
|
+
* `using`-compatible, see `DisposeListener`).
|
|
361
421
|
*/
|
|
362
422
|
addMessageListener(listener) {
|
|
363
423
|
this.messageListeners.push(listener);
|
|
364
|
-
return () => {
|
|
424
|
+
return disposeListener(() => {
|
|
365
425
|
const index = this.messageListeners.indexOf(listener);
|
|
366
426
|
if (index >= 0) {
|
|
367
427
|
this.messageListeners.splice(index, 1);
|
|
368
428
|
}
|
|
369
|
-
};
|
|
429
|
+
});
|
|
370
430
|
}
|
|
371
431
|
/**
|
|
372
432
|
* Run every registered listener that matches the message, in registration
|
|
@@ -631,7 +691,7 @@ class CliIoHost {
|
|
|
631
691
|
return true;
|
|
632
692
|
}
|
|
633
693
|
// respond with the default for all other messages
|
|
634
|
-
if (msg.defaultResponse) {
|
|
694
|
+
if (msg.defaultResponse !== undefined) {
|
|
635
695
|
await this.writeMessage({
|
|
636
696
|
...msg,
|
|
637
697
|
message: `${chalk_1.default.cyan(msg.message)} (auto-responded with default: ${util.format(msg.defaultResponse)})`,
|
|
@@ -738,6 +798,52 @@ function matchAny(...selectors) {
|
|
|
738
798
|
const matchers = selectors.map(messageMatcher);
|
|
739
799
|
return (msg) => matchers.some((matches) => matches(msg));
|
|
740
800
|
}
|
|
801
|
+
/**
|
|
802
|
+
* Method decorator that suppresses the given IoHost messages for the duration
|
|
803
|
+
* of the decorated method.
|
|
804
|
+
*
|
|
805
|
+
* Before the method runs, a single `preventDefault` listener covering all
|
|
806
|
+
* given selectors is registered on the instance's `ioHost`; when the method
|
|
807
|
+
* settles (returns or throws), exactly that listener is removed again. This
|
|
808
|
+
* replaces the manual pattern of registering drop-listeners at the top of a
|
|
809
|
+
* method and cleaning them up in a `finally`, and — unlike a blanket
|
|
810
|
+
* `removeAllListeners()` — it does not disturb listeners registered elsewhere.
|
|
811
|
+
*
|
|
812
|
+
* The decorated method must be async and live on a class whose instances carry
|
|
813
|
+
* the `CliIoHost` on an `ioHost` property (like `CdkToolkit`).
|
|
814
|
+
*
|
|
815
|
+
* @example
|
|
816
|
+
* class CdkToolkit {
|
|
817
|
+
* \@suppressMessages(IO.CDK_TOOLKIT_I1001, IO.CDK_TOOLKIT_I1000)
|
|
818
|
+
* public async metadata(stackName: string, json: boolean) {
|
|
819
|
+
* // I1001/I1000 are dropped while this runs
|
|
820
|
+
* }
|
|
821
|
+
* }
|
|
822
|
+
*/
|
|
823
|
+
function suppressMessages(...selectors) {
|
|
824
|
+
return function (_target, _propertyKey, descriptor) {
|
|
825
|
+
const original = descriptor.value;
|
|
826
|
+
if (!original) {
|
|
827
|
+
throw new toolkit_lib_1.ToolkitError('InvalidDecoratorTarget', 'suppressMessages can only decorate methods');
|
|
828
|
+
}
|
|
829
|
+
descriptor.value = async function (...args) {
|
|
830
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
831
|
+
try {
|
|
832
|
+
const _suppress = __addDisposableResource(env_1, this.ioHost.on(matchAny(...selectors), () => ({ preventDefault: true })), false);
|
|
833
|
+
// `return await` (not a bare `return`) so the listener is only disposed
|
|
834
|
+
// after the method has actually settled.
|
|
835
|
+
return await original.apply(this, args);
|
|
836
|
+
}
|
|
837
|
+
catch (e_1) {
|
|
838
|
+
env_1.error = e_1;
|
|
839
|
+
env_1.hasError = true;
|
|
840
|
+
}
|
|
841
|
+
finally {
|
|
842
|
+
__disposeResources(env_1);
|
|
843
|
+
}
|
|
844
|
+
};
|
|
845
|
+
};
|
|
846
|
+
}
|
|
741
847
|
/**
|
|
742
848
|
* This IoHost implementation considers a request promptable, if:
|
|
743
849
|
* - it's a yes/no confirmation
|
|
@@ -846,4 +952,4 @@ function hotswapToEventResult(result) {
|
|
|
846
952
|
},
|
|
847
953
|
};
|
|
848
954
|
}
|
|
849
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFta0NBLDRCQUdDO0FBcmtDRCxnREFBa0M7QUFDbEMsMEVBQWlFO0FBQ2pFLHNEQUFvRDtBQUVwRCxrREFBMEI7QUFDMUIsbURBQXFDO0FBRXJDLDBEQUFnSztBQUVoSyxrREFBOEQ7QUFDOUQsc0VBQXFFO0FBQ3JFLDhDQUFxRDtBQUVyRCxvREFBdUQ7QUFFdkQsa0RBQXdEO0FBQ3hELG1FQUF3RTtBQUN4RSwyREFBZ0U7QUFDaEUscURBQWtEO0FBRWxELG1DQUFrQztBQTRQbEM7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLFNBQVMsQ0FBd0I7SUFFaEQ7O09BRUc7SUFDSSxhQUFhLENBQVk7SUFFaEM7Ozs7T0FJRztJQUNJLElBQUksQ0FBVTtJQUVyQjs7T0FFRztJQUNJLEtBQUssQ0FBVTtJQUV0Qjs7OztPQUlHO0lBQ0ksUUFBUSxDQUFpQjtJQUVoQzs7T0FFRztJQUNJLHFCQUFxQixDQUFrQjtJQUU5Qzs7Ozs7T0FLRztJQUNJLGtCQUFrQixHQUFpQixRQUFRLENB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IH0gZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHR5cGUgeyBIb3Rzd2FwUmVzdWx0LCBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QsIFRvb2xraXRBY3Rpb24gfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgcHJvbXB0bHkgZnJvbSAncHJvbXB0bHknO1xuaW1wb3J0IHR5cGUgeyBJb0hlbHBlciwgQWN0aXZpdHlQcmludGVyUHJvcHMsIElBY3Rpdml0eVByaW50ZXIsIElvTWVzc2FnZU1ha2VyLCBJb1JlcXVlc3RNYWtlciwgSW9EZWZhdWx0TWVzc2FnZXMgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpLXByaXZhdGUnO1xuaW1wb3J0IHsgYXNJb0hlbHBlciwgSU8sIGlzTWVzc2FnZVJlbGV2YW50Rm9yTGV2ZWwsIEN1cnJlbnRBY3Rpdml0eVByaW50ZXIsIEhpc3RvcnlBY3Rpdml0eVByaW50ZXIsIEVycm9yc09ubHlBY3Rpdml0eVByaW50ZXIgfSBmcm9tICcuLi8uLi8uLi9saWIvYXBpLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBDb250ZXh0IH0gZnJvbSAnLi4vLi4vYXBpL2NvbnRleHQnO1xuaW1wb3J0IHsgU3RhY2tBY3Rpdml0eVByb2dyZXNzIH0gZnJvbSAnLi4vLi4vY29tbWFuZHMvZGVwbG95JztcbmltcG9ydCB7IGNhbkNvbGxlY3RUZWxlbWV0cnkgfSBmcm9tICcuLi90ZWxlbWV0cnkvY29sbGVjdC10ZWxlbWV0cnknO1xuaW1wb3J0IHsgY2RrQ2xpRXJyb3JOYW1lIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L2Vycm9yJztcbmltcG9ydCB0eXBlIHsgRXZlbnRSZXN1bHQgfSBmcm9tICcuLi90ZWxlbWV0cnkvbWVzc2FnZXMnO1xuaW1wb3J0IHsgQ0xJX1BSSVZBVEVfSU8gfSBmcm9tICcuLi90ZWxlbWV0cnkvbWVzc2FnZXMnO1xuaW1wb3J0IHR5cGUgeyBUZWxlbWV0cnlFdmVudCB9IGZyb20gJy4uL3RlbGVtZXRyeS9zZXNzaW9uJztcbmltcG9ydCB7IFRlbGVtZXRyeVNlc3Npb24gfSBmcm9tICcuLi90ZWxlbWV0cnkvc2Vzc2lvbic7XG5pbXBvcnQgeyBFbmRwb2ludFRlbGVtZXRyeVNpbmsgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9lbmRwb2ludC1zaW5rJztcbmltcG9ydCB7IEZpbGVUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3NpbmsvZmlsZS1zaW5rJztcbmltcG9ydCB7IEZ1bm5lbCB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2Z1bm5lbCc7XG5pbXBvcnQgdHlwZSB7IElUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Npbmsvc2luay1pbnRlcmZhY2UnO1xuaW1wb3J0IHsgaXNDSSB9IGZyb20gJy4uL3V0aWwvY2knO1xuXG5leHBvcnQgdHlwZSB7IElJb0hvc3QsIElvTWVzc2FnZSwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwsIElvUmVxdWVzdCB9O1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS4gJ25vbmUnIHJlcHJlc2VudHMgdGhlIGFic2VuY2Ugb2YgYW4gYWN0aW9uLlxuICovXG50eXBlIENsaUFjdGlvbiA9XG4gIHwgVG9vbGtpdEFjdGlvblxuICB8ICdjb250ZXh0J1xuICB8ICdkb2NzJ1xuICB8ICdsc3AnXG4gIHwgJ2ZsYWdzJ1xuICB8ICdub3RpY2VzJ1xuICB8ICd2ZXJzaW9uJ1xuICB8ICdjbGktdGVsZW1ldHJ5J1xuICB8ICdub25lJztcblxuZXhwb3J0IGludGVyZmFjZSBDbGlJb0hvc3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBUb29sa2l0IGFjdGlvbiB0aGUgaG9zdHMgc3RhcnRzIHdpdGguXG4gICAqXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEFjdGlvbj86IENsaUFjdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQuXG4gICAqXG4gICAqIFRoZSBDbGlJb0hvc3Qgd2lsbCBzdGlsbCByZWNlaXZlIGFsbCBtZXNzYWdlcyBhbmQgcmVxdWVzdHMsXG4gICAqIGJ1dCBvbmx5IHRoZSBtZXNzYWdlcyBpbmNsdWRlZCBpbiB0aGlzIGxldmVsIHdpbGwgYmUgcHJpbnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2luZm8nXG4gICAqL1xuICByZWFkb25seSBsb2dMZXZlbD86IElvTWVzc2FnZUxldmVsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGF1dG9tYXRpYyBUVFkgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBXaGVuIFRUWSBpcyBkaXNhYmxlZCwgdGhlIENMSSB3aWxsIGhhdmUgbm8gaW50ZXJhY3Rpb25zIG9yIGNvbG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBwcm9jZXNzXG4gICAqL1xuICByZWFkb25seSBpc1RUWT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKiBTZXQgdG8gZmFsc2UgaW4gdGhlIENsaUlvSG9zdCBjb25zdHJ1Y3RvciBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBDTEkgQ0kgYXJndW1lbnQgaXMgcGFzc2VkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc3BlY2lmaWNhbGx5IGJhc2VkIG9uIGBwcm9jZXNzLmVudi5DSWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ0k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbiB3aGF0IHNjZW5hcmlvcyBzaG91bGQgdGhlIENsaUlvSG9zdCBhc2sgZm9yIGFwcHJvdmFsXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlRGVwbG95QXBwcm92YWw/OiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIFRvb2xraXQgYWN0aW9uIHRoZSBob3N0cyBzdGFydHMgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tQcm9ncmVzcz86IFN0YWNrQWN0aXZpdHlQcm9ncmVzcztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIHNob3VsZCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgcmVzcG9uZCB0byBwcm9tcHRzLlxuICAgKlxuICAgKiBXaGVuIHRydWUsIG9wZXJhdGlvbiB3aWxsIHVzdWFsbHkgcHJvY2VlZCB3aXRob3V0IGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbi5cbiAgICogQ29uZmlybWF0aW9ucyBhcmUgcmVzcG9uZGVkIHRvIHdpdGggeWVzLiBPdGhlciBwcm9tcHRzIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b1Jlc3BvbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgdHlwZSBmb3IgY29uZmlndXJpbmcgYSB0YXJnZXQgc3RyZWFtXG4gKi9cbmV4cG9ydCB0eXBlIFRhcmdldFN0cmVhbSA9ICdzdGRvdXQnIHwgJ3N0ZGVycicgfCAnZHJvcCc7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBhIG1lc3NhZ2UgbGlzdGVuZXIgbWF5IHJldHVybiB0byBpbmZsdWVuY2UgaG93IGEgbWVzc2FnZSBpcyBoYW5kbGVkLlxuICpcbiAqIEEgbGlzdGVuZXIgbWF5IHVwZGF0ZSB0aGUgbWVzc2FnZSBfdGV4dF8sIF9sZXZlbF8sIGFuZC9vciBfYWN0aW9uXzsgaXQgY2Fubm90XG4gKiBjaGFuZ2Ugb3RoZXIgZmllbGRzIChzdWNoIGFzIGl0cyBgY29kZWApLCB3aGljaCBrZWVwcyB0aGUgY29kZS1rZXllZCBsaXN0ZW5lclxuICogcmVnaXN0cnkgdmFsaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyUmVzdWx0IHtcbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIHRleHQgdGhhdCBpcyBwcmludGVkIGZvciB0aGlzIG1lc3NhZ2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1lc3NhZ2UgdGV4dCBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGxldmVsIG9mIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogVGhlIG5ldyBsZXZlbCBpcyB1c2VkIGZvciBib3RoIHZlcmJvc2l0eSBmaWx0ZXJpbmcgYW5kIHN0cmVhbSBzZWxlY3Rpb24sIHNvXG4gICAqIHRoaXMgY2FuIG1vdmUgYSBtZXNzYWdlIGJldHdlZW4gc3Rkb3V0L3N0ZGVyciAoZS5nLiBkb3duZ3JhZGUgYSBgcmVzdWx0YCB0b1xuICAgKiBgaW5mb2ApLiBUaGUgYGNvZGVgIGlzIGludGVudGlvbmFsbHkgbGVmdCB1bmNoYW5nZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIG1lc3NhZ2UgbGV2ZWwgaXMgbGVmdCB1bmNoYW5nZWRcbiAgICovXG4gIHJlYWRvbmx5IGxldmVsPzogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogVGhlIG92ZXJyaWRlIGFmZmVjdHMgc3Vic2VxdWVudCBsaXN0ZW5lcnMgYW5kIHByZXNlbnRhdGlvbi9vYnNlcnZhdGlvbiBvZlxuICAgKiB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UuIE1hdGNoaW5nIGFuZCB0ZWxlbWV0cnkgY29udGludWUgdG8gdXNlIHRoZSBhY3Rpb25cbiAgICogb24gdGhlIG9yaWdpbmFsbHkgZW1pdHRlZCBtZXNzYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBtZXNzYWdlIGFjdGlvbiBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aW9uPzogVG9vbGtpdEFjdGlvbjtcblxuICAvKipcbiAgICogU2tpcCB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogRm9yIGEgbm90aWZpY2F0aW9uIHRoaXMgbWVhbnMgaXQgaXMgbm90IHdyaXR0ZW4gdG8gYSBzdHJlYW0uIEZvciBhIHJlcXVlc3RcbiAgICogaXQgc3RvcHMgcHJvY2Vzc2luZyBlbnRpcmVseTogdGhlIHVzZXIgaXMgbm90IHByb21wdGVkLCBub3RoaW5nIGlzIHdyaXR0ZW4sXG4gICAqIGFuZCB0aGUgcmVxdWVzdCByZXNvbHZlcyB3aXRoIGl0cyAocG9zc2libHkgYHJlc3BvbmRgLW92ZXJyaWRkZW4pIGRlZmF1bHRcbiAgICogcmVzcG9uc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciByZXF1ZXN0cyBvbmx5OiB0aGUgdmFsdWUgdG8gcmVzb2x2ZSB0aGUgcmVxdWVzdCB3aXRoLiBJdCBpcyBmb2xkZWQgaW50b1xuICAgKiB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIHNraXBzIHRoZSBwcm9tcHQgKHRoZSByZXF1ZXN0IGlzIHRyZWF0ZWRcbiAgICogYXMgbm90IHByb21wdGFibGUpLiBUaGUgcXVlc3Rpb24gaXMgc3RpbGwgd3JpdHRlbiB1bmxlc3MgYHByZXZlbnREZWZhdWx0YCBpc1xuICAgKiBhbHNvIHNldC4gSWdub3JlZCBmb3IgcGxhaW4gbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogVGhlIHByZXNlbmNlIG9mIHRoZSBrZXkgaXMgd2hhdCBtYXR0ZXJzLCBzbyBgZmFsc2VgL2AwYC9gJydgIGFyZSB2YWxpZFxuICAgKiBhbnN3ZXJzLiBVc2UgdGhlIGByZXNwb25kYC9gcmVzcG9uZE9uY2VgIGhlbHBlcnMgZm9yIHRoZSBjb21tb24gY2FzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGlzIGxpc3RlbmVyIGRvZXMgbm90IHN1cHBseSBhIHJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSByZXNwb25kPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgbWVzc2FnZSBsaXN0ZW5lciBtYXkgcmV0dXJuOiBub3RoaW5nLCBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgLCBvciBhXG4gKiBgUHJvbWlzZWAgb2YgZWl0aGVyLlxuICpcbiAqIExpc3RlbmVycyBtYXkgYmUgYXN5bmMuIFRoZSBob3N0IGF3YWl0cyBlYWNoIGxpc3RlbmVyIGJlZm9yZSBydW5uaW5nIHRoZVxuICogbmV4dCwgc28gcmVnaXN0cmF0aW9uIG9yZGVyIOKAlCBhbmQgdGhlIGN1bXVsYXRpdmUgZWZmZWN0IG9uIHRoZSBtZXNzYWdlIOKAlCBpc1xuICogcHJlc2VydmVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsaXN0ZW5lcnMgYXJlIHN5bmMgb3IgYXN5bmMuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSA9IHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQgfCBQcm9taXNlPHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQ+O1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBtZXNzYWdlIGxpc3RlbmVyLiBJdHMgcmV0dXJuIHZhbHVlIChpZiBhbnkpIG1heSB1cGRhdGUgdGhlXG4gKiBtZXNzYWdlIHRleHQsIGxldmVsLCBhbmQvb3IgYWN0aW9uIG9yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZy4gSXQgbWF5XG4gKiBiZSBhc3luYy5cbiAqL1xudHlwZSBNZXNzYWdlTGlzdGVuZXJGbiA9IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2U7XG5pbnRlcmZhY2UgTWVzc2FnZUxpc3RlbmVyIHtcbiAgcmVhZG9ubHkgb25jZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm46IE1lc3NhZ2VMaXN0ZW5lckZuO1xuICAvKipcbiAgICogRGVjaWRlcyB3aGljaCBtZXNzYWdlcyB0aGlzIGxpc3RlbmVyIGFwcGxpZXMgdG8uIEZvciBhIGxpc3RlbmVyIHJlZ2lzdGVyZWRcbiAgICogd2l0aCBhIG1ha2VyIHRoaXMgbWF0Y2hlcyBieSBgY29kZWA7IGZvciBvbmUgcmVnaXN0ZXJlZCB3aXRoIGEgcHJlZGljYXRlIGl0XG4gICAqIGlzIHRoZSBwcmVkaWNhdGUgaXRzZWxmLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF0Y2hlczogKG1zZzogSW9NZXNzYWdlPHVua25vd24+KSA9PiBib29sZWFuO1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIGlzIG9uZSBvZiB0aGUgaG9zdCdzIG93biBpbnRlcm5hbCBsaXN0ZW5lcnMgKGUuZy4gc3RhY2stYWN0aXZpdHlcbiAgICogcm91dGluZykuIEludGVybmFsIGxpc3RlbmVycyBhcmUgbm90IHJlbW92ZWQgYnkgYHJlbW92ZUFsbExpc3RlbmVyc2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlIC0gYSB1c2VyIGxpc3RlbmVyIHJlZ2lzdGVyZWQgdmlhIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGBcbiAgICovXG4gIHJlYWRvbmx5IGludGVybmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZWxlY3RzIHdoaWNoIG1lc3NhZ2VzIGEgbGlzdGVuZXIgYXBwbGllcyB0by5cbiAqXG4gKiBFaXRoZXIgYSBtZXNzYWdlL3JlcXVlc3QgKm1ha2VyKiDigJQgdGhlIGxpc3RlbmVyIGZpcmVzIGZvciBtZXNzYWdlcyB3aXRoIHRoYXRcbiAqIG1ha2VyJ3MgYGNvZGVgICh0aGUgb3JpZ2luYWwgYmVoYXZpb3IpIOKAlCBvciBhIGN1c3RvbSAqcHJlZGljYXRlKiBvdmVyIHRoZVxuICogbWVzc2FnZS4gQSBtYWtlcidzIGAuaXNgIHR5cGUgZ3VhcmQgKGUuZy4gYElPLkNES19UT09MS0lUX0k3MDEwLmlzYCkgaXMgYVxuICogY29udmVuaWVudCBwcmVkaWNhdGUsIGJ1dCBhbnkgYChtc2cpID0+IGJvb2xlYW5gIHdvcmtzIChlLmcuIHRvIG1hdGNoIGEgZmFtaWx5XG4gKiBvZiBjb2Rlcywgb3Igb24gdGhlIG1lc3NhZ2UgbGV2ZWwpLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlU2VsZWN0b3I8VD4gPVxuICB8IElvTWVzc2FnZU1ha2VyPFQ+XG4gIHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PlxuICB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gYm9vbGVhbik7XG5cbi8qKlxuICogSG93IGFuIElvSG9zdCBwcm9jZXNzZWQgYSBzaW5nbGUgbWVzc2FnZSBvciByZXF1ZXN0LlxuICpcbiAqIFRoaXMgZGVzY3JpYmVzIHRoZSBtZXNzYWdlICphcyB0aGUgaG9zdCBoYW5kbGVkIGl0Kiwgd2hpY2ggY2FuIGRpZmZlciBmcm9tXG4gKiB3aGF0IHdhcyBlbWl0dGVkOiBsaXN0ZW5lcnMgbWF5IHJld3JpdGUgdGhlIHRleHQgb3IgbGV2ZWwsIHByZXZlbnQgaXQgZnJvbVxuICogYmVpbmcgd3JpdHRlbiBhdCBhbGwsIG9yIChmb3IgcmVxdWVzdHMpIGFuc3dlciBpdCBvbiB0aGUgdXNlcidzIGJlaGFsZi5cbiAqXG4gKiBCb3RoIG5vdGlmaWNhdGlvbnMgKGBub3RpZnlgKSBhbmQgcmVxdWVzdHMgKGByZXF1ZXN0UmVzcG9uc2VgKSBhcmUgcmVwb3J0ZWQsXG4gKiBzbyBhbiBvYnNlcnZlciBzZWVzIHRoZSBjb21wbGV0ZSwgb3JkZXJlZCBzdHJlYW0gdGhlIGhvc3QgaGFuZGxlZC4gVXNlXG4gKiBgdHlwZWAgdG8gdGVsbCB0aGVtIGFwYXJ0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvTWVzc2FnZU9ic2VydmF0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBvYnNlcnZhdGlvbiBkZXNjcmliZXMgYSBwbGFpbiBub3RpZmljYXRpb24gKGBub3RpZnlgKSBvciBhXG4gICAqIHJlcXVlc3QgdGhhdCBhc2tlZCBmb3IgYSByZXNwb25zZSAoYHJlcXVlc3RSZXNwb25zZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ25vdGlmeScgfCAncmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIGV4YWN0bHkgYXMgaXQgd2FzIGVtaXR0ZWQgdG8gdGhlIGhvc3QgKGJlZm9yZSBhbnkgbGlzdGVuZXJzKS5cbiAgICovXG4gIHJlYWRvbmx5IGVtaXR0ZWQ6IElvTWVzc2FnZTx1bmtub3duPjtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgYWZ0ZXIgdGhlIGhvc3QncyBsaXN0ZW5lcnMgcmFuICh0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBtYXkgZGlmZmVyKS5cbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgbGlzdGVuZXIgcHJldmVudGVkIHRoaXMgbWVzc2FnZSBmcm9tIGJlaW5nIHdyaXR0ZW4sIGkuZS4gdGhlIHVzZXJcbiAgICogd291bGQgbm90IHNlZSBpdC4gQWx3YXlzIGBmYWxzZWAgZm9yIHJlcXVlc3RzIChhIHJlcXVlc3QgaXMgcmVwb3J0ZWQgb25jZVxuICAgKiBpdCBoYXMgYmVlbiByZXNvbHZlZCwgcmVnYXJkbGVzcyBvZiBob3cgaXQgd2FzIGFuc3dlcmVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGRyb3BwZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gSW9Ib3N0IHdob3NlIG1lc3NhZ2UgaGFuZGxpbmcgY2FuIGJlIG9ic2VydmVkLlxuICpcbiAqIFRoaXMgaXMgYSBDTEktaW50ZXJuYWwgY29udHJhY3QgdXNlZCBieSB0ZXN0cyB0byByZWNvcmQgdGhlICplZmZlY3RpdmUqLFxuICogdXNlci1mYWNpbmcgbWVzc2FnZSBzdHJlYW0gKGFmdGVyIGxpc3RlbmVycykgd2l0aG91dCByZWFjaGluZyBpbnRvIGhvc3RcbiAqIGludGVybmFscy4gSXQgaXMgaW50ZW50aW9uYWxseSBzZXBhcmF0ZSBmcm9tIGBJSW9Ib3N0YCBzbyB0aGF0IHRoZSByZWNvcmRlclxuICogY2FuIHdvcmsgd2l0aCBhbnkgYElJb0hvc3RgIGFuZCBvbmx5IGVucmljaCBpdHMgb3V0cHV0IHdoZW4gdGhlIGhvc3QgYWxzb1xuICogaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZhYmxlSW9Ib3N0IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB0aGUgaG9zdCBoYW5kbGVzIOKAlFxuICAgKiBib3RoIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVlc3RzIOKAlCB3aXRoIHRoZSBkaXNwb3NpdGlvbiB0aGUgaG9zdCBjb21wdXRlZFxuICAgKiBmb3IgaXQgKGl0cyBlZmZlY3RpdmUgZm9ybSBhZnRlciBsaXN0ZW5lcnMgYW5kIHdoZXRoZXIgaXQgd2FzIGRyb3BwZWQpLiBGb3JcbiAgICogYSByZXF1ZXN0LCB0aGUgcmVzb2x2ZWQgYW5zd2VyIGlzIHRoZSBlZmZlY3RpdmUgbWVzc2FnZSdzIGBkZWZhdWx0UmVzcG9uc2VgLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBvYnNlcnZlciBhZ2Fpbi5cbiAgICovXG4gIG9ic2VydmVNZXNzYWdlcyhvYnNlcnZlcjogKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgSU8gaG9zdCBmb3IgdGhlIENMSSB0aGF0IHdyaXRlcyBtZXNzYWdlcyB0byB0aGUgY29uc29sZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENsaUlvSG9zdCBpbXBsZW1lbnRzIElJb0hvc3QsIE9ic2VydmFibGVJb0hvc3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgaW5zdGFuY2UocHJvcHM6IENsaUlvSG9zdFByb3BzID0ge30sIGZvcmNlTmV3ID0gZmFsc2UpOiBDbGlJb0hvc3Qge1xuICAgIGlmIChmb3JjZU5ldyB8fCAhQ2xpSW9Ib3N0Ll9pbnN0YW5jZSkge1xuICAgICAgQ2xpSW9Ib3N0Ll9pbnN0YW5jZSA9IG5ldyBDbGlJb0hvc3QocHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ2xpSW9Ib3N0Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgaXQgZXhpc3RzXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IENsaUlvSG9zdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENsaUlvSG9zdC5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDbGlJb0hvc3RcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogQ2xpSW9Ib3N0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuXG4gICAqL1xuICBwdWJsaWMgY3VycmVudEFjdGlvbjogQ2xpQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBDbGlJb0hvc3QgaXMgcnVubmluZyBpbiBDSSBtb2RlLlxuICAgKlxuICAgKiBJbiBDSSBtb2RlLCBhbGwgbm9uLWVycm9yIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci5cbiAgICovXG4gIHB1YmxpYyBpc0NJOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBob3N0IGNhbiB1c2UgaW50ZXJhY3Rpb25zIGFuZCBtZXNzYWdlIHN0eWxpbmcuXG4gICAqL1xuICBwdWJsaWMgaXNUVFk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRocmVzaG9sZC5cbiAgICpcbiAgICogTWVzc2FnZXMgd2l0aCBhIGxvd2VyIHByaW9yaXR5IGxldmVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIHB1YmxpYyBsb2dMZXZlbDogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIGZvciByZXF1aXJpbmcgYXBwcm92YWwgaW4gdGhpcyBDbGlJb0hvc3QuXG4gICAqL1xuICBwdWJsaWMgcmVxdWlyZURlcGxveUFwcHJvdmFsOiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgdGFyZ2V0IHN0cmVhbSBmb3Igbm90aWNlc1xuICAgKlxuICAgKiAoTm90IGEgc2V0dGVyIGJlY2F1c2UgdGhlcmUncyBubyBuZWVkIGZvciBhZGRpdGlvbmFsIGxvZ2ljIHdoZW4gdGhpcyB2YWx1ZVxuICAgKiBpcyBjaGFuZ2VkIHlldClcbiAgICovXG4gIHB1YmxpYyBub3RpY2VzRGVzdGluYXRpb246IFRhcmdldFN0cmVhbSA9ICdzdGRlcnInO1xuXG4gIHByaXZhdGUgX3Byb2dyZXNzOiBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MgPSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSO1xuXG4gIC8vIFN0YWNrIEFjdGl2aXR5IFByaW50ZXJcbiAgcHJpdmF0ZSBhY3Rpdml0eVByaW50ZXI/OiBJQWN0aXZpdHlQcmludGVyO1xuXG4gIC8vIENvcmtlZCBMb2dnaW5nXG4gIHByaXZhdGUgY29ya2VkQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ya2VkTG9nZ2luZ0J1ZmZlcjogSW9NZXNzYWdlPHVua25vd24+W10gPSBbXTtcblxuICAvLyBNZXNzYWdlIGxpc3RlbmVycyBpbiByZWdpc3RyYXRpb24gb3JkZXIuIEVhY2ggY2FycmllcyBhIG1hdGNoZXIgKGJ5IGNvZGUsXG4gIC8vIG9yIGEgY3VzdG9tIHByZWRpY2F0ZSkuIFNlZSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgLlxuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VMaXN0ZW5lcnM6IE1lc3NhZ2VMaXN0ZW5lcltdID0gW107XG5cbiAgLy8gT2JzZXJ2ZXJzIG9mIGhvdyBtZXNzYWdlcyBhcmUgaGFuZGxlZCAoc2VlIE9ic2VydmFibGVJb0hvc3QgLyBvYnNlcnZlTWVzc2FnZXMpLlxuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VPYnNlcnZlcnMgPSBuZXcgU2V0PChvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pID0+IHZvaWQ+KCk7XG5cbiAgLy8gVHJ1ZSB3aGlsZSByZXBsYXlpbmcgY29ya2VkIG1lc3NhZ2VzLCBzbyBvYnNlcnZlcnMgYXJlbid0IG5vdGlmaWVkIHR3aWNlLlxuICBwcml2YXRlIGNvcmtSZXBsYXlpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZXNwb25kOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVsZW1ldHJ5IHNlc3Npb24gb2JqZWN0XG4gICAqXG4gICAqIFdpbGwgcmVtYWluIGB1bmRlZmluZWRgIGlmIHRoZSB1c2VyIGhhcyBkaXNhYmxlZCB0ZWxlbWV0cnkuXG4gICAqL1xuICBwdWJsaWMgdGVsZW1ldHJ5PzogVGVsZW1ldHJ5U2Vzc2lvbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBDbGlJb0hvc3RQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5jdXJyZW50QWN0aW9uID0gcHJvcHMuY3VycmVudEFjdGlvbiA/PyAnbm9uZSc7XG4gICAgdGhpcy5pc1RUWSA9IHByb3BzLmlzVFRZID8/IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIHRoaXMubG9nTGV2ZWwgPSBwcm9wcy5sb2dMZXZlbCA/PyAnaW5mbyc7XG4gICAgdGhpcy5pc0NJID0gcHJvcHMuaXNDSSA/PyBpc0NJKCk7XG4gICAgdGhpcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPSBwcm9wcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPz8gUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkc7XG4gICAgdGhpcy5zdGFja1Byb2dyZXNzID0gcHJvcHMuc3RhY2tQcm9ncmVzcyA/PyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSO1xuICAgIHRoaXMuYXV0b1Jlc3BvbmQgPSBwcm9wcy5hdXRvUmVzcG9uZCA/PyBmYWxzZTtcblxuICAgIC8vIFN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBhY3Rpdml0eSBwcmludGVyIHJhdGhlciB0aGFuXG4gICAgLy8gd3JpdHRlbiB0byBhIHN0cmVhbS4gVGhpcyBpcyB3aXJlZCB1cCBhcyBtZXNzYWdlIGxpc3RlbmVycy5cbiAgICB0aGlzLnJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0VGVsZW1ldHJ5KGFyZ3M6IGFueSwgY29udGV4dDogQ29udGV4dCwgcHJveHlBZ2VudD86IEFnZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jbGktdHlwZS1yZWdpc3RyeS5qc29uJyk7XG4gICAgY29uc3QgdmFsaWRDb21tYW5kcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb21tYW5kcyk7XG4gICAgY29uc3QgY21kID0gYXJncy5fWzBdO1xuICAgIGlmICghdmFsaWRDb21tYW5kcy5pbmNsdWRlcyhjbWQpKSB7XG4gICAgICAvLyB0aGUgdXNlciB0eXBlZCBpbiBhbiBpbnZhbGlkIGNvbW1hbmQgLSBubyBuZWVkIGZvciB0ZWxlbWV0cnkgc2luY2UgdGhlIGludm9jYXRpb24gaXMgZ29pbmcgdG8gZmFpbFxuICAgICAgLy8gaW1taW5lbnRseSBhbnl3YXkuXG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZShgU2Vzc2lvbiBpbnN0YW50aWF0ZWQgd2l0aCBhbiBpbnZhbGlkIGNvbW1hbmQgKCR7Y21kfSkuIE5vdCBzdGFydGluZyB0ZWxlbWV0cnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNpbmtzOiBJVGVsZW1ldHJ5U2lua1tdID0gW107XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZVBhdGggPSBhcmdzWyd0ZWxlbWV0cnktZmlsZSddO1xuICAgIGlmICh0ZWxlbWV0cnlGaWxlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgRmlsZVRlbGVtZXRyeVNpbmsoe1xuICAgICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgICBsb2dGaWxlUGF0aDogdGVsZW1ldHJ5RmlsZVBhdGgsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ0ZpbGUgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBGaWxlIFRlbGVtZXRyeSBpbnN0YW50aWF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5RW5kcG9pbnQgPSBwcm9jZXNzLmVudi5URUxFTUVUUllfRU5EUE9JTlQgPz8gJ2h0dHBzOi8vY2RrLWNsaS10ZWxlbWV0cnkudXMtZWFzdC0xLmFwaS5hd3MvbWV0cmljcyc7XG4gICAgaWYgKGNhbkNvbGxlY3RUZWxlbWV0cnkoYXJncywgY29udGV4dCkgJiYgdGVsZW1ldHJ5RW5kcG9pbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpbmtzLnB1c2gobmV3IEVuZHBvaW50VGVsZW1ldHJ5U2luayh7XG4gICAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICAgIGFnZW50OiBwcm94eUFnZW50LFxuICAgICAgICAgIGVuZHBvaW50OiB0ZWxlbWV0cnlFbmRwb2ludCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBFbmRwb2ludCBUZWxlbWV0cnkgaW5zdGFudGlhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IE5PVCBjb25uZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lua3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZWxlbWV0cnkgPSBuZXcgVGVsZW1ldHJ5U2Vzc2lvbih7XG4gICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgY2xpZW50OiBuZXcgRnVubmVsKHsgc2lua3MgfSksXG4gICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5iZWdpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc3RhY2tQcm9ncmVzcyBwcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHNldCBzdGFja1Byb2dyZXNzKHR5cGU6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcykge1xuICAgIHRoaXMuX3Byb2dyZXNzID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFja1Byb2dyZXNzIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBvdGhlciBzdGF0ZSBvZiB0aGUgaW9Ib3N0LFxuICAgKiBsaWtlIGlmIGlzVFRZIGFuZCBpc0NJLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja1Byb2dyZXNzKCk6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB7XG4gICAgLy8gV2UgY2FuIGFsd2F5cyB1c2UgRVZFTlRTIGFuZCBFUlJPUlNfT05MWVxuICAgIGlmICh0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUyB8fCB0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVSUk9SU19PTkxZKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBkZWJ1ZyBtZXNzYWdlIChhbmQgdGh1cyBhbnkgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzKSBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgbG9nIGxldmVsLCB3ZSBoYXZlIHZlcmJvc2UgbG9nZ2luZ1xuICAgIGNvbnN0IHZlcmJvc2VMb2dnaW5nID0gaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCh7IGxldmVsOiAnZGVidWcnIH0sIHRoaXMubG9nTGV2ZWwpO1xuICAgIGlmICh2ZXJib3NlTG9nZ2luZykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gV2luZG93cyB3ZSBjYW5ub3QgdXNlIGZhbmN5IG91dHB1dFxuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgaWYgKGlzV2luZG93cykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gc29tZSBDSSBzeXN0ZW1zIChzdWNoIGFzIENpcmNsZUNJKSBvdXRwdXQgc3RpbGwgcmVwb3J0cyBhcyBhIFRUWSBzbyB3ZSBhbHNvXG4gICAgLy8gbmVlZCBhbiBpbmRpdmlkdWFsIGNoZWNrIGZvciB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgb24gQ0kuXG4gICAgLy8gc2VlOiBodHRwczovL2Rpc2N1c3MuY2lyY2xlY2kuY29tL3QvY2lyY2xlY2ktdGVybWluYWwtaXMtYS10dHktYnV0LXRlcm0taXMtbm90LXNldC85OTY1XG4gICAgY29uc3QgZmFuY3lPdXRwdXRBdmFpbGFibGUgPSB0aGlzLmlzVFRZICYmICF0aGlzLmlzQ0k7XG4gICAgaWYgKCFmYW5jeU91dHB1dEF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB1c2VyIHByZWZlcmVuY2VcbiAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRzKCk6IElvRGVmYXVsdE1lc3NhZ2VzIHtcbiAgICByZXR1cm4gdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHM7XG4gIH1cblxuICBwdWJsaWMgYXNJb0hlbHBlcigpOiBJb0hlbHBlciB7XG4gICAgcmV0dXJuIGFzSW9IZWxwZXIodGhpcywgdGhpcy5jdXJyZW50QWN0aW9uIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBibG9jayBvZiBjb2RlIHdpdGggY29ya2VkIGxvZ2dpbmcuIEFsbCBsb2cgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvblxuICAgKiBhcmUgYnVmZmVyZWQgYW5kIG9ubHkgd3JpdHRlbiB3aGVuIGFsbCBuZXN0ZWQgY29yayBibG9ja3MgY29tcGxldGUgKHdoZW4gQ09SS19DT1VOVEVSIHJlYWNoZXMgMCkuXG4gICAqIFRoZSBjb3JraW5nIGlzIGJvdW5kIHRvIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgQ2xpSW9Ib3N0LlxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2sgLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGggY29ya2VkIGxvZ2dpbmdcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJsb2NrJ3MgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2l0aENvcmtlZExvZ2dpbmc8VD4oYmxvY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmNvcmtlZENvdW50ZXIrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ya2VkQ291bnRlci0tO1xuICAgICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA9PT0gMCkge1xuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggYnVmZmVyZWQgbWVzc2FnZSB0aHJvdWdoIG5vdGlmeVxuICAgICAgICB0aGlzLmNvcmtSZXBsYXlpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgaW9NZXNzYWdlIG9mIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnkoaW9NZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5jb3JrUmVwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBidWZmZXJlZCBtZXNzYWdlcyBpbi1wbGFjZVxuICAgICAgICB0aGlzLmNvcmtlZExvZ2dpbmdCdWZmZXIuc3BsaWNlKDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBjb2RlLlxuICAgKlxuICAgKiBUaGUgbGlzdGVuZXIgbWF5IHJldHVybiBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgIHRvIHVwZGF0ZSB0aGUgbWVzc2FnZVxuICAgKiB0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBvciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgKHdyaXRpbmcgaXQgdG9cbiAgICogYSBzdHJlYW0pOyByZXR1cm5pbmcgbm90aGluZyBsZWF2ZXMgdGhlIG1lc3NhZ2UgdW50b3VjaGVkLiBUaGUgbGlzdGVuZXIgbWF5XG4gICAqIGJlIGFzeW5jIChyZXR1cm4gYSBgUHJvbWlzZWApOyB0aGUgaG9zdCBhd2FpdHMgaXQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlXG4gICAqIG1lc3NhZ2UgZnVydGhlci4gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3Qub24oSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIGFzeW5jIChtc2cpID0+IHtcbiAgICogICBteUNvdW50ICs9IG1zZy5kYXRhLnN0YWNrcy5sZW5ndGg7XG4gICAqICAgYXdhaXQgcGVyc2lzdChteUNvdW50KTtcbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE1hdGNoIHdpdGggYSBjdXN0b20gcHJlZGljYXRlIGluc3RlYWQgb2YgYSBjb2RlLCBlLmcuIGEgbWFrZXIncyBgLmlzYDpcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5vbihJTy5DREtfVE9PTEtJVF9JNzAxMC5pcywgKG1zZykgPT4gKHsgcmVzcG9uZDogdHJ1ZSB9KSk7XG4gICAqL1xuICBwdWJsaWMgb248VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb24oXG4gICAgcHJlZGljYXRlOiAobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gYm9vbGVhbixcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPHVua25vd24+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBvbihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4sIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXJGbik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IG1lc3NhZ2UgdGhlIGhvc3QgaGFuZGxlcyDigJRcbiAgICogYm90aCBub3RpZmljYXRpb25zIGFuZCByZXF1ZXN0cyDigJQgd2l0aCB0aGUgZGlzcG9zaXRpb24gdGhlIGhvc3QgY29tcHV0ZWRcbiAgICogZm9yIGl0IChpdHMgZWZmZWN0aXZlIGZvcm0gYWZ0ZXIgbGlzdGVuZXJzIGFuZCB3aGV0aGVyIGl0IHdhcyBkcm9wcGVkKS4gRm9yXG4gICAqIGEgcmVxdWVzdCwgdGhlIHJlc29sdmVkIGFuc3dlciBpcyB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UncyBgZGVmYXVsdFJlc3BvbnNlYC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgb2JzZXJ2ZXIuXG4gICAqXG4gICAqIEBzZWUgT2JzZXJ2YWJsZUlvSG9zdFxuICAgKi9cbiAgcHVibGljIG9ic2VydmVNZXNzYWdlcyhvYnNlcnZlcjogKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZU9ic2VydmVycy5hZGQob2JzZXJ2ZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYG9uYCwgYnV0IHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzIGJlZW5cbiAgICogaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIG9uY2U8VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25jZShcbiAgICBwcmVkaWNhdGU6IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuLFxuICAgIGxpc3RlbmVyOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSxcbiAgKTogKCkgPT4gdm9pZDtcbiAgcHVibGljIG9uY2Uoc2VsZWN0b3I6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+LCBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyRm4pOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiB0cnVlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlcnkgbWVzc2FnZSBsaXN0ZW5lciByZWdpc3RlcmVkIHZpYSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIG93biBpbnRlcm5hbCBsaXN0ZW5lcnMgKHN1Y2ggYXMgc3RhY2stYWN0aXZpdHkgcm91dGluZykgYXJlIGtlcHQsXG4gICAqIHNvIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgYWZ0ZXJ3YXJkcy4gTWVzc2FnZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCB2aWFcbiAgICogYG9ic2VydmVNZXNzYWdlc2AgYXJlIGEgc2VwYXJhdGUgbWVjaGFuaXNtIGFuZCBhcmUgbm90IGFmZmVjdGVkLlxuICAgKlxuICAgKiBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yIHRlc3RzIHRoYXQgc2hhcmUgdGhlIHNpbmdsZXRvbiBob3N0IGFuZCBuZWVkIHRvXG4gICAqIHJlc2V0IGxpc3RlbmVyIHN0YXRlIGJldHdlZW4gY2FzZXMgKGEgbGVmdG92ZXIgbGlzdGVuZXIgd291bGQgb3RoZXJ3aXNlXG4gICAqIGxlYWsgaW50byB0aGUgbmV4dCB0ZXN0KS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gRHJvcCB1c2VyIGxpc3RlbmVycyBpbiBwbGFjZSAocHJlc2VydmluZyBhcnJheSBpZGVudGl0eSBmb3IgYW55XG4gICAgLy8gb3V0c3RhbmRpbmcgZGlzcG9zZSBjbG9zdXJlcyk7IGtlZXAgdGhlIGhvc3QncyBpbnRlcm5hbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VMaXN0ZW5lcnNbaV0uaW50ZXJuYWwpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQW5zd2VyIGEgcmVxdWVzdCAoYnkgaXRzIGNvZGUpIG9uIHRoZSB1c2VyJ3MgYmVoYWxmIHdpdGggYSBmaXhlZCB2YWx1ZSwgc29cbiAgICogdGhlIGhvc3QgZG9lcyBub3QgcHJvbXB0LiBTeW50YWN0aWMgc3VnYXIgZm9yIGFuIGBvbmAgbGlzdGVuZXIgcmV0dXJuaW5nXG4gICAqIGB7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9YDsgZm9yIGNvbmRpdGlvbmFsXG4gICAqIGFuc3dlcnMgb3IgdG8gYWxzbyByZXdvcmQgdGhlIHF1ZXN0aW9uLCB1c2UgYG9uYC9gb25jZWAgZGlyZWN0bHkuIFJldHVybnMgYVxuICAgKiBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIHJlc3BvbmRlciBhZ2Fpbi5cbiAgICpcbiAgICogQHBhcmFtIHN1cHByZXNzUXVlc3Rpb24gLSB3aGV0aGVyIHRvIGFsc28gc3VwcHJlc3Mgd3JpdGluZyB0aGUgcXVlc3Rpb24gdGV4dC5cbiAgICogICBEZWZhdWx0cyB0byBgdHJ1ZWAgKGFuc3dlciBzaWxlbnRseSkuIFBhc3MgYGZhbHNlYCB0byBzdGlsbCBzdXJmYWNlIHRoZVxuICAgKiAgIHF1ZXN0aW9uIHdoaWxlIGFuc3dlcmluZyBpdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5kZXIgLS1mb3JjZSwgYXV0by1jb25maXJtIHRoZSBkZXN0cm95IHByb21wdCB3aXRob3V0IHByb21wdGluZy5cbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5yZXNwb25kKElPLkNES19UT09MS0lUX0k3MDEwLCB0cnVlKTtcbiAgICovXG4gIHB1YmxpYyByZXNwb25kPFQsIFU+KGNvZGU6IElvUmVxdWVzdE1ha2VyPFQsIFU+LCB2YWx1ZTogVSwgc3VwcHJlc3NRdWVzdGlvbiA9IHRydWUpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiBmYWxzZSwgZm46ICgpID0+ICh7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9KSwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoY29kZSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgcmVzcG9uZGAsIGJ1dCB0aGUgYW5zd2VyIGlzIGdpdmVuIG9ubHkgb25jZSBhbmQgdGhlbiByZW1vdmVkLlxuICAgKi9cbiAgcHVibGljIHJlc3BvbmRPbmNlPFQsIFU+KGNvZGU6IElvUmVxdWVzdE1ha2VyPFQsIFU+LCB2YWx1ZTogVSwgc3VwcHJlc3NRdWVzdGlvbiA9IHRydWUpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiB0cnVlLCBmbjogKCkgPT4gKHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH0pLCBtYXRjaGVzOiBtZXNzYWdlTWF0Y2hlcihjb2RlKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZvcm1hdHRlciB0aGF0IHJlcGxhY2VzIHRoZSBwcmludGVkIHRleHQgb2YgbWVzc2FnZXMgd2l0aCB0aGVcbiAgICogZ2l2ZW4gY29kZS4gVGhpcyBsZXRzIGEgY2FsbGVyIGRlZmluZSBfaG93XyBhIHRvb2xraXQgbWVzc2FnZSBpcyBwcmVzZW50ZWRcbiAgICogd2l0aG91dCB0aGUgSW9Ib3N0IG5lZWRpbmcgdG8ga25vdyBhYm91dCBpdC5cbiAgICpcbiAgICogT3B0aW9uYWxseSBwYXNzIGEgYGxldmVsYCB0byBhbHNvIG92ZXJyaWRlIHRoZSBtZXNzYWdlJ3MgbGV2ZWwgKHdoaWNoIG1vdmVzXG4gICAqIGl0IGJldHdlZW4gc3Rkb3V0L3N0ZGVyciBhbmQgY2hhbmdlcyB2ZXJib3NpdHkgZmlsdGVyaW5nKS4gRm9yIHRoZSByYXJlclxuICAgKiBjYXNlIG9mIG92ZXJyaWRpbmcgb25seSB0aGUgbGV2ZWwsIHVzZSBgb25gL2BvbmNlYCByZXR1cm5pbmcgYHsgbGV2ZWwgfWAuXG4gICAqXG4gICAqIFN5bnRhY3RpYyBzdWdhciBmb3IgYW4gYG9uYCBsaXN0ZW5lciB0aGF0IHJldHVybnMgYHsgbWVzc2FnZSwgbGV2ZWw/IH1gLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBmb3JtYXR0ZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3QucmV3cml0ZShJTy5DREtfVE9PTEtJVF9JMjkwMSwgKG1zZykgPT5cbiAgICogICBzZXJpYWxpemVTdHJ1Y3R1cmUobXNnLmRhdGEuc3RhY2tzLCB0cnVlKSk7XG4gICAqL1xuICBwdWJsaWMgcmV3cml0ZTxUPihcbiAgICBjb2RlOiBJb01lc3NhZ2VNYWtlcjxUPiB8IElvUmVxdWVzdE1ha2VyPFQsIGFueT4sXG4gICAgZm9ybWF0dGVyOiAobXNnOiBJb01lc3NhZ2U8VD4pID0+IHN0cmluZyxcbiAgICBsZXZlbD86IElvTWVzc2FnZUxldmVsLFxuICApOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5vbihjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYHJld3JpdGVgLCBidXQgdGhlIGZvcm1hdHRlciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzXG4gICAqIGJlZW4gYXBwbGllZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIHJld3JpdGVPbmNlPFQ+KFxuICAgIGNvZGU6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PixcbiAgICBmb3JtYXR0ZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gc3RyaW5nLFxuICAgIGxldmVsPzogSW9NZXNzYWdlTGV2ZWwsXG4gICk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm9uY2UoY29kZSwgKG1zZykgPT4gKHsgbWVzc2FnZTogZm9ybWF0dGVyKG1zZyksIC4uLihsZXZlbCAhPT0gdW5kZWZpbmVkID8geyBsZXZlbCB9IDoge30pIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBsaXN0ZW5lciB0byB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyBpdC5cbiAgICovXG4gIHByaXZhdGUgYWRkTWVzc2FnZUxpc3RlbmVyKGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXIpOiAoKSA9PiB2b2lkIHtcbiAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBldmVyeSByZWdpc3RlcmVkIGxpc3RlbmVyIHRoYXQgbWF0Y2hlcyB0aGUgbWVzc2FnZSwgaW4gcmVnaXN0cmF0aW9uXG4gICAqIG9yZGVyLiBBIGxpc3RlbmVyIG1hdGNoZXMgYnkgaXRzIGNvZGUgKG1ha2VyKSBvciBpdHMgY3VzdG9tIHByZWRpY2F0ZS5cbiAgICpcbiAgICogQSBsaXN0ZW5lciBtYXkgdXBkYXRlIHRoZSBtZXNzYWdlIHRleHQsIGxldmVsLCBhbmQvb3IgYWN0aW9uIChwYXNzZWQgb24gdG9cbiAgICogc3Vic2VxdWVudCBsaXN0ZW5lcnMgYW5kIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSksIHByZXZlbnQgdGhlIGRlZmF1bHRcbiAgICogcHJvY2Vzc2luZywgb3IgKGZvciByZXF1ZXN0cykgYW5zd2VyIGl0LiBgb25jZWAgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGFmdGVyXG4gICAqIHRoZXkgaGF2ZSBydW4uIE1hdGNoaW5nIGlzIGRlY2lkZWQgYWdhaW5zdCB0aGUgbWVzc2FnZSBhcyBlbWl0dGVkLCBzbyBhXG4gICAqIHRyYW5zZm9ybWF0aW9uIGJ5IGFuIGVhcmxpZXIgbGlzdGVuZXIgZG9lcyBub3QgY2hhbmdlIHdoaWNoIGxhdGVyIGxpc3RlbmVyc1xuICAgKiBhcHBseS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IHVwZGF0ZWQpIG1lc3NhZ2UsIHdoZXRoZXIgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyB3YXNcbiAgICogcHJldmVudGVkLCBhbmQgd2hldGhlciBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IChhbmQgd2l0aCB3aGF0KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlNZXNzYWdlTGlzdGVuZXJzPFQgZXh0ZW5kcyBJb01lc3NhZ2U8dW5rbm93bj4+KG1zZzogVCk6IFByb21pc2U8e1xuICAgIG1lc3NhZ2U6IFQ7XG4gICAgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47XG4gICAgcmVzcG9uZGVkOiBib29sZWFuO1xuICB9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBtc2c7XG4gICAgbGV0IHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgbGV0IHJlc3BvbmRlZCA9IGZhbHNlO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhIGNvcHkgc28gdGhhdCBgb25jZWAgbGlzdGVuZXJzIGNhbiByZW1vdmUgdGhlbXNlbHZlcyBzYWZlbHkuXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5tZXNzYWdlTGlzdGVuZXJzXSkge1xuICAgICAgLy8gTWF0Y2ggYWdhaW5zdCB0aGUgZW1pdHRlZCBtZXNzYWdlOyBhIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBjdW11bGF0aXZlbHlcbiAgICAgIC8vIHRyYW5zZm9ybWVkIGBjdXJyZW50YCBtZXNzYWdlLlxuICAgICAgaWYgKCFsaXN0ZW5lci5tYXRjaGVzKG1zZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbmVycyBtYXkgYmUgYXN5bmM7IGF3YWl0IGVhY2ggb25lIGJlZm9yZSBydW5uaW5nIHRoZSBuZXh0IHNvIHRoZVxuICAgICAgLy8gY3VtdWxhdGl2ZSBlZmZlY3Qgb24gdGhlIG1lc3NhZ2Ugc3RheXMgb3JkZXItZGV0ZXJtaW5pc3RpYy5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxpc3RlbmVyLmZuKGN1cnJlbnQpO1xuXG4gICAgICBpZiAobGlzdGVuZXIub25jZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBsZXZlbDogcmVzdWx0LmxldmVsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5hY3Rpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGFjdGlvbjogcmVzdWx0LmFjdGlvbiB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQucHJldmVudERlZmF1bHQpIHtcbiAgICAgICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCdyZXNwb25kJyBpbiByZXN1bHQgJiYgJ2RlZmF1bHRSZXNwb25zZScgaW4gbXNnKSB7XG4gICAgICAgICAgLy8gRm9sZCB0aGUgYW5zd2VyIGludG8gdGhlIHJlcXVlc3QncyBkZWZhdWx0IHJlc3BvbnNlIGFuZCBtYXJrIGl0XG4gICAgICAgICAgLy8gYW5zd2VyZWQsIHNvIHdlIHNraXAgcHJvbXB0aW5nIGFuZCByZXNvbHZlIHdpdGggdGhpcyB2YWx1ZS5cbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBkZWZhdWx0UmVzcG9uc2U6IHJlc3VsdC5yZXNwb25kIH07XG4gICAgICAgICAgcmVzcG9uZGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG1lc3NhZ2U6IGN1cnJlbnQsIHByZXZlbnREZWZhdWx0LCByZXNwb25kZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyB0aGUgaG9zdCBvZiBhIG1lc3NhZ2UuXG4gICAqIFRoZSBjYWxsZXIgd2FpdHMgdW50aWwgdGhlIG5vdGlmaWNhdGlvbiBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbm90aWZ5KG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5tYXliZUVtaXRUZWxlbWV0cnkobXNnKTtcblxuICAgIC8vIFJ1biBhbnkgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuIEEgbGlzdGVuZXIgbWF5IHVwZGF0ZSB0aGUgbWVzc2FnZSB0ZXh0LFxuICAgIC8vIGxldmVsLCBhbmQvb3IgYWN0aW9uIG9yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyAoZS5nLlxuICAgIC8vIHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIGFyZSByb3V0ZWQgdG8gdGhlIGFjdGl2aXR5IHByaW50ZXIgYW5kIG5vdFxuICAgIC8vIHdyaXR0ZW4gdG8gYSBzdHJlYW0pLlxuICAgIC8vXG4gICAgLy8gU2tpcCB0aGlzIHdoaWxlIHJlcGxheWluZyBjb3JrZWQgbWVzc2FnZXM6IHRoZSBsaXN0ZW5lcnMgYWxyZWFkeSByYW4gb25cbiAgICAvLyB0aGUgZmlyc3QgcGFzcywgYW5kIHJ1bm5pbmcgdGhlbSBhZ2FpbiB3b3VsZCByZS10cmFuc2Zvcm0gYW5cbiAgICAvLyBhbHJlYWR5LXRyYW5zZm9ybWVkIG1lc3NhZ2UuXG4gICAgY29uc3QgeyBtZXNzYWdlLCBwcmV2ZW50RGVmYXVsdCB9ID0gdGhpcy5jb3JrUmVwbGF5aW5nXG4gICAgICA/IHsgbWVzc2FnZTogbXNnLCBwcmV2ZW50RGVmYXVsdDogZmFsc2UgfVxuICAgICAgOiBhd2FpdCB0aGlzLmFwcGx5TWVzc2FnZUxpc3RlbmVycyhtc2cpO1xuXG4gICAgLy8gVGVsbCBvYnNlcnZlcnMgaG93IHRoaXMgbWVzc2FnZSB3YXMgaGFuZGxlZCAoaXRzIGVmZmVjdGl2ZSBmb3JtIGFuZFxuICAgIC8vIHdoZXRoZXIgaXQgd2FzIGRyb3BwZWQpLiBTa2lwcGVkIHdoaWxlIHJlcGxheWluZyBjb3JrZWQgbWVzc2FnZXMgc28gZWFjaFxuICAgIC8vIG1lc3NhZ2UgaXMgb2JzZXJ2ZWQgZXhhY3RseSBvbmNlLlxuICAgIGlmICghdGhpcy5jb3JrUmVwbGF5aW5nKSB7XG4gICAgICB0aGlzLm5vdGlmeU9ic2VydmVycyh7IHR5cGU6ICdub3RpZnknLCBlbWl0dGVkOiBtc2csIGVmZmVjdGl2ZTogbWVzc2FnZSwgZHJvcHBlZDogcHJldmVudERlZmF1bHQgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZlbnREZWZhdWx0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy53cml0ZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IGV2ZXJ5IHJlZ2lzdGVyZWQgbWVzc2FnZSBvYnNlcnZlciBvZiBob3cgYSBtZXNzYWdlIG9yIHJlcXVlc3Qgd2FzXG4gICAqIGhhbmRsZWQuIEEgbm8tb3Agd2hlbiBub3RoaW5nIGlzIG9ic2VydmluZyAoaS5lLiBvdXRzaWRlIG9mIHRlc3RzKSwgc28gdGhlXG4gICAqIHN1cnJvdW5kaW5nIGhvdCBwYXRocyBwYXkgbm90aGluZyBpbiBwcm9kdWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBub3RpZnlPYnNlcnZlcnMob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWVzc2FnZU9ic2VydmVycy5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgdGhpcy5tZXNzYWdlT2JzZXJ2ZXJzKSB7XG4gICAgICBvYnNlcnZlcihvYnNlcnZhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIGEgKGFscmVhZHkgbGlzdGVuZXItcHJvY2Vzc2VkKSBtZXNzYWdlIHRvIGl0cyB0YXJnZXQgc3RyZWFtLCBob25vcmluZ1xuICAgKiB0aGUgbG9nIGxldmVsIGFuZCBjb3JrZWQtbG9nZ2luZyBidWZmZXIuIFNoYXJlZCBieSBgbm90aWZ5YCBhbmQgdGhlXG4gICAqIG5vbi1wcm9tcHRpbmcgYHJlcXVlc3RSZXNwb25zZWAgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgd3JpdGVNZXNzYWdlKG1lc3NhZ2U6IElvTWVzc2FnZTx1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbChtZXNzYWdlLCB0aGlzLmxvZ0xldmVsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNvcmtlZENvdW50ZXIgPiAwKSB7XG4gICAgICB0aGlzLmNvcmtlZExvZ2dpbmdCdWZmZXIucHVzaChtZXNzYWdlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5zZWxlY3RTdHJlYW0obWVzc2FnZSk7XG4gICAgc3RyZWFtPy53cml0ZShvdXRwdXQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBtYXliZUVtaXRUZWxlbWV0cnkobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgdGVsZW1ldHJ5RXZlbnQgPSBldmVudEZyb21NZXNzYWdlKG1zZyk7XG4gICAgICBpZiAodGVsZW1ldHJ5RXZlbnQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy50ZWxlbWV0cnk/LmVtaXQodGVsZW1ldHJ5RXZlbnQpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgYXdhaXQgdGhpcy5kZWZhdWx0cy50cmFjZShgRW1pdCBUZWxlbWV0cnkgRmFpbGVkICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZSBzdGFjay1hY3Rpdml0eSBtZXNzYWdlcyB0byB0aGUgYWN0aXZpdHkgcHJpbnRlciAocHJvZ3Jlc3MgYmFyIG9yXG4gICAqIGV2ZW50IGxpc3QpIHJhdGhlciB0aGFuIHdyaXRpbmcgdGhlbSB0byBhIHN0cmVhbS5cbiAgICpcbiAgICogSW1wbGVtZW50ZWQgYXMgbGlzdGVuZXJzIHRoYXQgaGFuZGxlIHRoZSBtZXNzYWdlIHZpYSB0aGUgcHJpbnRlciBhbmRcbiAgICogcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nLCBzbyB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUgZG9lcyBub3QgYWxzb1xuICAgKiBlbWl0IHRoZW0uIFRoZSBwcmludGVyIGlzIGNyZWF0ZWQgbGF6aWx5IG9uIHRoZSBmaXJzdCBzdGFjay1hY3Rpdml0eSBtZXNzYWdlLlxuICAgKi9cbiAgcHJpdmF0ZSByb3V0ZVN0YWNrQWN0aXZpdHlUb1ByaW50ZXIoKSB7XG4gICAgY29uc3Qgcm91dGUgPSAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBNZXNzYWdlTGlzdGVuZXJSZXN1bHQgPT4ge1xuICAgICAgaWYgKCF0aGlzLmFjdGl2aXR5UHJpbnRlcikge1xuICAgICAgICB0aGlzLmFjdGl2aXR5UHJpbnRlciA9IHRoaXMubWFrZUFjdGl2aXR5UHJpbnRlcigpO1xuICAgICAgfVxuICAgICAgdGhpcy5hY3Rpdml0eVByaW50ZXIubm90aWZ5KG1zZyk7XG4gICAgICByZXR1cm4geyBwcmV2ZW50RGVmYXVsdDogdHJ1ZSB9OyAvLyBoYW5kbGVkIGJ5IHRoZSBwcmludGVyOyBkb24ndCBhbHNvIHdyaXRlIHRvIGEgc3RyZWFtXG4gICAgfTtcblxuICAgIC8vIEEgc2luZ2xlIGludGVybmFsIGxpc3RlbmVyIChzbyBpdCBzdXJ2aXZlcyBgcmVtb3ZlQWxsTGlzdGVuZXJzKClgIGFuZCB0aGVcbiAgICAvLyBob3N0IGtlZXBzIHJvdXRpbmcgc3RhY2sgYWN0aXZpdHkpIG1hdGNoaW5nIGFueSBvZiB0aGUgYWN0aXZpdHkgY29kZXMuXG4gICAgdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoe1xuICAgICAgb25jZTogZmFsc2UsXG4gICAgICBpbnRlcm5hbDogdHJ1ZSxcbiAgICAgIGZuOiByb3V0ZSxcbiAgICAgIG1hdGNoZXM6IG1hdGNoQW55KElPLkNES19UT09MS0lUX0k1NTAxLCBJTy5DREtfVE9PTEtJVF9JNTUwMiwgSU8uQ0RLX1RPT0xLSVRfSTU1MDMpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVjdCBzcGVjaWFsIG1lc3NhZ2VzIGVuY29kZSBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyIG9yIG5vdFxuICAgKiB0aGV5IHJlcXVpcmUgYXBwcm92YWxcbiAgICovXG4gIHByaXZhdGUgc2tpcEFwcHJvdmFsU3RlcChtc2c6IElvUmVxdWVzdDxhbnksIGFueT4pOiBib29sZWFuIHtcbiAgICBjb25zdCBhcHByb3ZhbFRvb2xraXRDb2RlcyA9IFsnQ0RLX1RPT0xLSVRfSTUwNjAnXTtcbiAgICBpZiAoIShtc2cuY29kZSAmJiBhcHByb3ZhbFRvb2xraXRDb2Rlcy5pbmNsdWRlcyhtc2cuY29kZSkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLnJlcXVpcmVEZXBsb3lBcHByb3ZhbCkge1xuICAgICAgLy8gTmV2ZXIgcmVxdWlyZSBhcHByb3ZhbFxuICAgICAgY2FzZSBSZXF1aXJlQXBwcm92YWwuTkVWRVI6XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgLy8gQWx3YXlzIHJlcXVpcmUgYXBwcm92YWxcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLkFOWUNIQU5HRTpcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy8gUmVxdWlyZSBhcHByb3ZhbCBpZiBjaGFuZ2VzIGluY2x1ZGUgYnJvYWRlbmluZyBwZXJtaXNzaW9uc1xuICAgICAgY2FzZSBSZXF1aXJlQXBwcm92YWwuQlJPQURFTklORzpcbiAgICAgICAgcmV0dXJuIFsnbm9uZScsICdub24tYnJvYWRlbmluZyddLmluY2x1ZGVzKG1zZy5kYXRhPy5wZXJtaXNzaW9uQ2hhbmdlVHlwZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG91dHB1dCBzdHJlYW0sIGJhc2VkIG9uIG1lc3NhZ2UgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdFN0cmVhbShtc2c6IElvTWVzc2FnZTxhbnk+KTogTm9kZUpTLldyaXRlU3RyZWFtIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaXNOb3RpY2VzTWVzc2FnZShtc2cpKSB7XG4gICAgICByZXR1cm4gdGFyZ2V0U3RyZWFtT2JqZWN0KHRoaXMubm90aWNlc0Rlc3RpbmF0aW9uKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZWxlY3RTdHJlYW1Gcm9tTGV2ZWwobXNnLmxldmVsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBvdXRwdXQgc3RyZWFtLCBiYXNlZCBvbiBtZXNzYWdlIGxldmVsIGFuZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RTdHJlYW1Gcm9tTGV2ZWwobGV2ZWw6IElvTWVzc2FnZUxldmVsKTogTm9kZUpTLldyaXRlU3RyZWFtIHtcbiAgICAvLyBUaGUgc3RyZWFtIHNlbGVjdGlvbiBwb2xpY3kgZm9yIHRoZSBDTEkgaXMgdGhlIGZvbGxvd2luZzpcbiAgICAvL1xuICAgIC8vICAgKDEpIE1lc3NhZ2VzIG9mIGxldmVsIGByZXN1bHRgIGFsd2F5cyBnbyB0byBgc3Rkb3V0YFxuICAgIC8vICAgKDIpIE1lc3NhZ2VzIG9mIGxldmVsIGBlcnJvcmAgYWx3YXlzIGdvIHRvIGBzdGRlcnJgLlxuICAgIC8vICAgKDNhKSBBbGwgcmVtYWluaW5nIG1lc3NhZ2VzIGdvIHRvIGBzdGRlcnJgLlxuICAgIC8vICAgKDNiKSBJZiB3ZSBhcmUgaW4gQ0kgbW9kZSwgYWxsIHJlbWFpbmluZyBtZXNzYWdlcyBnbyB0byBgc3Rkb3V0YC5cbiAgICAvL1xuICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIHByb2Nlc3Muc3RkZXJyO1xuICAgICAgY2FzZSAncmVzdWx0JzpcbiAgICAgICAgcmV0dXJuIHByb2Nlc3Muc3Rkb3V0O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNDSSA/IHByb2Nlc3Muc3Rkb3V0IDogcHJvY2Vzcy5zdGRlcnI7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHRoZSBob3N0IG9mIGEgbWVzc2FnZSB0aGF0IHJlcXVpcmVzIGEgcmVzcG9uc2UuXG4gICAqXG4gICAqIFJlZ2lzdGVyZWQgbGlzdGVuZXJzIHJ1biBmaXJzdDogYSBsaXN0ZW5lciBtYXkgcmV3b3JkIHRoZSBxdWVzdGlvbiAoaXRzIHRleHRcbiAgICogb3IgbGV2ZWwpIG9yIGFuc3dlciBpdCBvdXRyaWdodCB2aWEgYHJlc3BvbmRgIChlLmcuIGAtLWZvcmNlYCBhdXRvLWNvbmZpcm1zXG4gICAqIGEgZGVzdHJveSkuIElmIG5vIGxpc3RlbmVyIGFuc3dlcnMgYW5kIHRoZSBob3N0IGNhbm5vdCBwcm9tcHQsIHRoZSBzdWdnZXN0ZWRcbiAgICogZGVmYXVsdCByZXNwb25zZSBpcyB1c2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlcXVlc3RSZXNwb25zZTxEYXRhVHlwZSwgUmVzcG9uc2VUeXBlPihtc2c6IElvUmVxdWVzdDxEYXRhVHlwZSwgUmVzcG9uc2VUeXBlPik6IFByb21pc2U8UmVzcG9uc2VUeXBlPiB7XG4gICAgLy8gTGlzdGVuZXJzIHJ1biBleGFjdGx5IG9uY2UgaGVyZSAoc28gd2UgZG9uJ3QgZ28gYmFjayB0aHJvdWdoIGBub3RpZnlgKTpcbiAgICAvLyB0aGV5IG1heSBhbnN3ZXIgdGhlIHJlcXVlc3QsIG9yIHJld29yZC9yZWxldmVsL3JldGFnIHRoZSBxdWVzdGlvbiBzaG93biBiZWxvdy5cbiAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmxpc3RlbmVyUmVzdWx0IH0gPSBhd2FpdCB0aGlzLmFwcGx5TWVzc2FnZUxpc3RlbmVycyhtc2cpO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlc29sdmVSZXF1ZXN0KG1lc3NhZ2UsIGxpc3RlbmVyUmVzdWx0KTtcblxuICAgIC8vIFRlbGwgb2JzZXJ2ZXJzIGhvdyB0aGlzIHJlcXVlc3Qgd2FzIGhhbmRsZWQ6IHRoZSBlZmZlY3RpdmUgKHBvc3NpYmx5IHJld29yZGVkKSBxdWVzdGlvblxuICAgIC8vIGFuZCB0aGUgcmVzb2x2ZWQgcmVzcG9uc2UuIFdoZW4gYSBsaXN0ZW5lciBhbnN3ZXJlZCB0aGUgcmVxdWVzdCB3aXRoIHRoZSBxdWVzdGlvbiBzdXBwcmVzc2VkXG4gICAgLy8gKGBwcmV2ZW50RGVmYXVsdGAsIGUuZy4gYC0tZm9yY2VgIGF1dG8tY29uZmlybSksIGl0IGlzIHJlcG9ydGVkIGFzIGBkcm9wcGVkYCBzaW5jZSB0aGUgdXNlciBuZXZlciBzYXcgaXQuXG4gICAgdGhpcy5ub3RpZnlPYnNlcnZlcnMoeyB0eXBlOiAncmVxdWVzdCcsIGVtaXR0ZWQ6IG1zZywgZWZmZWN0aXZlOiBtZXNzYWdlLCBkcm9wcGVkOiBsaXN0ZW5lclJlc3VsdC5wcmV2ZW50RGVmYXVsdCB9KTtcblxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlIGEgcmVxdWVzdCB0byBpdHMgcmVzcG9uc2U6IGEgbGlzdGVuZXIncyBhbnN3ZXIgaWYgb25lIHdhcyBnaXZlbixcbiAgICogb3RoZXJ3aXNlIHRoZSBhbnN3ZXIgcHJvbXB0ZWQgZnJvbSB0aGUgdXNlciwgb3RoZXJ3aXNlIHRoZSBzdWdnZXN0ZWRcbiAgICogZGVmYXVsdCB3aGVuIHRoZSBob3N0IGNhbm5vdCBwcm9tcHQuXG4gICAqXG4gICAqIEtlcHQgc2VwYXJhdGUgZnJvbSBgcmVxdWVzdFJlc3BvbnNlYCBzbyB0aGUgcmVzcG9uc2UgY2FuIGJlIG9ic2VydmVkIGluIGFcbiAgICogc2luZ2xlIHBsYWNlIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggb2YgdGhlc2UgcGF0aHMgcHJvZHVjZWQgaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc29sdmVSZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KFxuICAgIG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+LFxuICAgIGxpc3RlbmVyUmVzdWx0OiB7IHByZXZlbnREZWZhdWx0OiBib29sZWFuOyByZXNwb25kZWQ6IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBzdG9wIHByb2Nlc3NpbmcsIGEgbGlzdGVuZXIgaGFzIHRha2VuIGNhcmUgb2YgaXRcbiAgICBpZiAobGlzdGVuZXJSZXN1bHQucHJldmVudERlZmF1bHQpIHtcbiAgICAgIHJldHVybiBtc2cuZGVmYXVsdFJlc3BvbnNlO1xuICAgIH1cblxuICAgIC8vIGlmIGEgbGlzdGVuZXIgcHJvdmlkZWQgYSByZXNwb25zZSwgd2Ugc2tpcCBpbnRlcmFjdGlvblxuICAgIGlmICghaXNQcm9tcHRhYmxlUmVxdWVzdChtc2cpIHx8IGxpc3RlbmVyUmVzdWx0LnJlc3BvbmRlZCkge1xuICAgICAgdGhpcy53cml0ZU1lc3NhZ2UobXNnKTtcbiAgICAgIHJldHVybiBtc2cuZGVmYXVsdFJlc3BvbnNlO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy53aXRoQ29ya2VkTG9nZ2luZyhhc3luYyAoKTogUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiA9PiB7XG4gICAgICAvLyBwcmVwYXJlIHByb21wdCBkYXRhXG4gICAgICAvLyBAdG9kbyB0aGlzIGZvcm1hdCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZSwgcHJvYmFibHkgc2hvdWxkIGJlXG4gICAgICBjb25zdCBkYXRhOiB7XG4gICAgICAgIG1vdGl2YXRpb24/OiBzdHJpbmc7XG4gICAgICAgIGNvbmN1cnJlbmN5PzogbnVtYmVyO1xuICAgICAgICByZXNwb25zZURlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgICAgfSA9IG1zZy5kYXRhID8/IHt9O1xuXG4gICAgICBjb25zdCBtb3RpdmF0aW9uID0gZGF0YS5tb3RpdmF0aW9uID8/ICdVc2VyIGlucHV0IGlzIG5lZWRlZCc7XG4gICAgICBjb25zdCBjb25jdXJyZW5jeSA9IGRhdGEuY29uY3VycmVuY3kgPz8gMDtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGVzY3JpcHRpb24gPSBkYXRhLnJlc3BvbnNlRGVzY3JpcHRpb247XG5cbiAgICAgIC8vIFNwZWNpYWwgYXBwcm92YWwgcHJvbXB0XG4gICAgICAvLyBEZXRlcm1pbmUgaWYgdGhlIG1lc3NhZ2UgbmVlZHMgYXBwcm92YWwuIElmIGl0IGRvZXMsIGNvbnRpbnVlIChpdCBpcyBhIGJhc2ljIGNvbmZpcm1hdGlvbiBwcm9tcHQpXG4gICAgICAvLyBJZiBpdCBkb2VzIG5vdCwgcmV0dXJuIHN1Y2Nlc3MgKHRydWUpLiBXZSBvbmx5IGNoZWNrIG1lc3NhZ2VzIHdpdGggY29kZXMgdGhhdCB3ZSBhcmUgYXdhcmVcbiAgICAgIC8vIGFyZSByZXF1aXJlcyBhcHByb3ZhbCBjb2Rlcy5cbiAgICAgIGlmICh0aGlzLnNraXBBcHByb3ZhbFN0ZXAobXNnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSW4gLS15ZXMgbW9kZSwgcmVzcG9uZCBmb3IgdGhlIHVzZXIgaWYgd2UgY2FuXG4gICAgICBpZiAodGhpcy5hdXRvUmVzcG9uZCkge1xuICAgICAgICAvLyByZXNwb25kIHdpdGggeWVzIHRvIGFsbCBjb25maXJtYXRpb25zXG4gICAgICAgIGlmIChpc0NvbmZpcm1hdGlvblByb21wdChtc2cpKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9IChhdXRvLWNvbmZpcm1lZClgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmVzcG9uZCB3aXRoIHRoZSBkZWZhdWx0IGZvciBhbGwgb3RoZXIgbWVzc2FnZXNcbiAgICAgICAgaWYgKG1zZy5kZWZhdWx0UmVzcG9uc2UpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tc2csXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKGF1dG8tcmVzcG9uZGVkIHdpdGggZGVmYXVsdDogJHt1dGlsLmZvcm1hdChtc2cuZGVmYXVsdFJlc3BvbnNlKX0pYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gbXNnLmRlZmF1bHRSZXNwb25zZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHRhbGsgdG8gdXNlciBpZiBTVERJTiBpcyBhIHRlcm1pbmFsIChvdGhlcndpc2UsIGZhaWwpXG4gICAgICBpZiAoIXRoaXMuaXNUVFkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVHR5Tm90QXR0YWNoZWQnLCBgJHttb3RpdmF0aW9ufSwgYnV0IHRlcm1pbmFsIChUVFkpIGlzIG5vdCBhdHRhY2hlZCBzbyB3ZSBhcmUgdW5hYmxlIHRvIGdldCBhIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSB1c2VyYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgdGFsayB0byB1c2VyIGlmIGNvbmN1cnJlbmN5IGlzIDEgKG90aGVyd2lzZSwgZmFpbClcbiAgICAgIGlmIChjb25jdXJyZW5jeSA+IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ29uY3VycmVuY3lDb25mbGljdCcsIGAke21vdGl2YXRpb259LCBidXQgY29uY3VycmVuY3kgaXMgZ3JlYXRlciB0aGFuIDEgc28gd2UgYXJlIHVuYWJsZSB0byBnZXQgYSBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcmApO1xuICAgICAgfVxuXG4gICAgICAvLyBCYXNpYyBjb25maXJtYXRpb24gcHJvbXB0XG4gICAgICAvLyBXZSB0cmVhdCBhbGwgcmVxdWVzdHMgd2l0aCBhIGJvb2xlYW4gcmVzcG9uc2UgYXMgY29uZmlybWF0aW9uIHByb21wdHNcbiAgICAgIC8vIFRoZSBJb0hvc3QgbmV2ZXIgYWJvcnRzIG9uIGEgXCJub1wiOiBpdCByZXR1cm5zIHRoZSBhbnN3ZXIgYW5kIGxldHMgdGhlXG4gICAgICAvLyBjYWxsaW5nIGFjdGlvbiBkZWNpZGUgd2hhdCB0byBkbyAoc28gYWJvcnQgaGFuZGxpbmcgaXMgY29uc2lzdGVudFxuICAgICAgLy8gYWNyb3NzIGFjdGlvbnMpLlxuICAgICAgaWYgKGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZykpIHtcbiAgICAgICAgcmV0dXJuIHByb21wdGx5LmNvbmZpcm0oYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9ICh5L24pYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFza2luZyBmb3IgYSBzcGVjaWZpYyB2YWx1ZVxuICAgICAgY29uc3QgcHJvbXB0ID0gZXh0cmFjdFByb21wdEluZm8obXNnKTtcbiAgICAgIGNvbnN0IGRlc2MgPSByZXNwb25zZURlc2NyaXB0aW9uID8/IHByb21wdC5kZWZhdWx0O1xuICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgcHJvbXB0bHkucHJvbXB0KGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSR7ZGVzYyA/IGAgKCR7ZGVzY30pYCA6ICcnfWAsIHtcbiAgICAgICAgZGVmYXVsdDogcHJvbXB0LmRlZmF1bHQsXG4gICAgICAgIHRyaW06IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwcm9tcHQuY29udmVydEFuc3dlcihhbnN3ZXIpO1xuICAgIH0pO1xuXG4gICAgLy8gV2UgbmVlZCB0byBjYXN0IHRoaXMgYmVjYXVzZSBpdCBpcyBpbXBvc3NpYmxlIHRvIG5hcnJvdyB0aGUgZ2VuZXJpYyB0eXBlXG4gICAgLy8gaXNQcm9tcHRhYmxlUmVxdWVzdCBlbnN1cmVzIHRoYXQgdGhlIHJlc3BvbnNlIHR5cGUgaXMgb25lIHdlIGNhbiBwcm9tcHQgZm9yXG4gICAgLy8gdGhlIHJlbWFpbmluZyBjb2RlIGVuc3VyZSB3ZSBhcmUgaW5kZWVkIHJldHVybmluZyB0aGUgY29ycmVjdCB0eXBlXG4gICAgcmV0dXJuIHJlc3BvbnNlIGFzIFJlc3BvbnNlVHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXRzIGEgbWVzc2FnZSBmb3IgY29uc29sZSBvdXRwdXQgd2l0aCBvcHRpb25hbCBjb2xvciBzdXBwb3J0XG4gICAqL1xuICBwcml2YXRlIGZvcm1hdE1lc3NhZ2UobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBzdHJpbmcge1xuICAgIC8vIGFwcGx5IHByb3ZpZGVkIHN0eWxlIG9yIGEgZGVmYXVsdCBzdHlsZSBpZiB3ZSdyZSBpbiBUVFkgbW9kZVxuICAgIGxldCBtZXNzYWdlX3RleHQ7XG4gICAgaWYgKG1zZy5jb2RlID09PSAnQ0RLX1RPT0xLSVRfRTk2MDAnKSB7XG4gICAgICAvLyBNZXNzYWdlIGlzIHByZS1zdHlsZWRcbiAgICAgIG1lc3NhZ2VfdGV4dCA9IG1zZy5tZXNzYWdlO1xuICAgIH0gZWxzZSB7XG4gICAgICBtZXNzYWdlX3RleHQgPSB0aGlzLmlzVFRZXG4gICAgICAgID8gc3R5bGVNYXBbbXNnLmxldmVsXShtc2cubWVzc2FnZSlcbiAgICAgICAgOiBtc2cubWVzc2FnZTtcbiAgICB9XG5cbiAgICAvLyBwcmVwZW5kIHRpbWVzdGFtcCBpZiBJb01lc3NhZ2VMZXZlbCBpcyBERUJVRyBvciBUUkFDRS4gUG9zdHBlbmQgYSBuZXdsaW5lLlxuICAgIHJldHVybiAoKG1zZy5sZXZlbCA9PT0gJ2RlYnVnJyB8fCBtc2cubGV2ZWwgPT09ICd0cmFjZScpXG4gICAgICA/IGBbJHt0aGlzLmZvcm1hdFRpbWUobXNnLnRpbWUpfV0gJHttZXNzYWdlX3RleHR9YFxuICAgICAgOiBtZXNzYWdlX3RleHQpICsgJ1xcbic7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBkYXRlIHRvIEhIOk1NOlNTXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFRpbWUoZDogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7cGFkKGQuZ2V0SG91cnMoKSl9OiR7cGFkKGQuZ2V0TWludXRlcygpKX06JHtwYWQoZC5nZXRTZWNvbmRzKCkpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBBY3Rpdml0eVByaW50ZXJcbiAgICovXG4gIHByaXZhdGUgbWFrZUFjdGl2aXR5UHJpbnRlcigpIHtcbiAgICBjb25zdCBwcm9wczogQWN0aXZpdHlQcmludGVyUHJvcHMgPSB7XG4gICAgICBzdHJlYW06IHRoaXMuc2VsZWN0U3RyZWFtRnJvbUxldmVsKCdpbmZvJyksXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGFja1Byb2dyZXNzKSB7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM6XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI6XG4gICAgICAgIHJldHVybiBuZXcgQ3VycmVudEFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FUlJPUlNfT05MWTpcbiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcnNPbmx5QWN0aXZpdHlQcmludGVyKHByb3BzKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgYE1lc3NhZ2VTZWxlY3RvcmAgaW50byBhIHByZWRpY2F0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhIGxpc3RlbmVyXG4gKiBhcHBsaWVzIHRvIGEgbWVzc2FnZS4gQSBtYWtlciBtYXRjaGVzIG1lc3NhZ2VzIGNhcnJ5aW5nIGl0cyBgY29kZWA7IGFcbiAqIHByZWRpY2F0ZSAoZS5nLiBhIG1ha2VyJ3MgYC5pc2AsIG9yIGFueSBgKG1zZykgPT4gYm9vbGVhbmApIGlzIHVzZWQgYXMtaXMuXG4gKi9cbmZ1bmN0aW9uIG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yOiBNZXNzYWdlU2VsZWN0b3I8YW55Pik6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbiAgY29uc3QgeyBjb2RlIH0gPSBzZWxlY3RvcjtcbiAgcmV0dXJuIChtc2cpID0+IG1zZy5jb2RlID09PSBjb2RlO1xufVxuXG4vKipcbiAqIENvbWJpbmUgc2V2ZXJhbCBzZWxlY3RvcnMgaW50byBhIHNpbmdsZSBwcmVkaWNhdGUgdGhhdCBtYXRjaGVzIGEgbWVzc2FnZSB3aGVuXG4gKiAqYW55KiBvZiB0aGVtIG1hdGNoZXMuIEVhY2ggc2VsZWN0b3IgbWF5IGJlIGEgbWFrZXIgKG1hdGNoZWQgYnkgaXRzIGBjb2RlYClcbiAqIG9yIGEgcHJlZGljYXRlLlxuICpcbiAqIFVzZWZ1bCBmb3Igb25lIGxpc3RlbmVyIHRoYXQgc3BhbnMgbXVsdGlwbGUgY29kZXMsIGUuZy5cbiAqIGBpb0hvc3Qub24obWF0Y2hBbnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDEsIElPLkNES19UT09MS0lUX0k1NTAyKSwgbGlzdGVuZXIpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hdGNoQW55KC4uLnNlbGVjdG9yczogTWVzc2FnZVNlbGVjdG9yPGFueT5bXSk6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gYm9vbGVhbiB7XG4gIGNvbnN0IG1hdGNoZXJzID0gc2VsZWN0b3JzLm1hcChtZXNzYWdlTWF0Y2hlcik7XG4gIHJldHVybiAobXNnKSA9PiBtYXRjaGVycy5zb21lKChtYXRjaGVzKSA9PiBtYXRjaGVzKG1zZykpO1xufVxuXG4vKipcbiAqIFRoaXMgSW9Ib3N0IGltcGxlbWVudGF0aW9uIGNvbnNpZGVycyBhIHJlcXVlc3QgcHJvbXB0YWJsZSwgaWY6XG4gKiAtIGl0J3MgYSB5ZXMvbm8gY29uZmlybWF0aW9uXG4gKiAtIGFza2luZyBmb3IgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzUHJvbXB0YWJsZVJlcXVlc3QobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHtcbiAgcmV0dXJuIGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZylcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgYSBjb25maXJtYXRpb24gcHJvbXB0XG4gKiBXZSB0cmVhdCBhbGwgcmVxdWVzdHMgd2l0aCBhIGJvb2xlYW4gcmVzcG9uc2UgYXMgY29uZmlybWF0aW9uIHByb21wdHNcbiAqL1xuZnVuY3Rpb24gaXNDb25maXJtYXRpb25Qcm9tcHQobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIGJvb2xlYW4+IHtcbiAgcmV0dXJuIHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZm9yIHByb21wdGx5IGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFByb21wdEluZm8obXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KToge1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIGRlZmF1bHREZXNjOiBzdHJpbmc7XG4gIGNvbnZlcnRBbnN3ZXI6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmcgfCBudW1iZXI7XG59IHtcbiAgY29uc3QgaXNOdW1iZXIgPSAodHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdudW1iZXInKTtcbiAgY29uc3QgZGVmYXVsdFJlc3BvbnNlID0gdXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSk7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGRlZmF1bHREZXNjOiAnZGVmYXVsdERlc2NyaXB0aW9uJyBpbiBtc2cgJiYgbXNnLmRlZmF1bHREZXNjcmlwdGlvbiA/IHV0aWwuZm9ybWF0KG1zZy5kZWZhdWx0RGVzY3JpcHRpb24pIDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGNvbnZlcnRBbnN3ZXI6IGlzTnVtYmVyID8gKHYpID0+IE51bWJlcih2KSA6ICh2KSA9PiBTdHJpbmcodiksXG4gIH07XG59XG5cbmNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8SW9NZXNzYWdlTGV2ZWwsIChzdHI6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgZXJyb3I6IGNoYWxrLnJlZCxcbiAgd2FybjogY2hhbGsueWVsbG93LFxuICByZXN1bHQ6IGNoYWxrLnJlc2V0LFxuICBpbmZvOiBjaGFsay5yZXNldCxcbiAgZGVidWc6IGNoYWxrLmdyYXksXG4gIHRyYWNlOiBjaGFsay5ncmF5LFxufTtcblxuZnVuY3Rpb24gdGFyZ2V0U3RyZWFtT2JqZWN0KHg6IFRhcmdldFN0cmVhbSk6IE5vZGVKUy5Xcml0ZVN0cmVhbSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoeCkge1xuICAgIGNhc2UgJ3N0ZGVycic6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgY2FzZSAnc3Rkb3V0JzpcbiAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dDtcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RpY2VzTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IG1zZyBpcyBJb01lc3NhZ2U8dm9pZD4ge1xuICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTAxMDAuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9XMDEwMS5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX0UwMTAxLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfSTAxMDEuaXMobXNnKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRGcm9tTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFRlbGVtZXRyeUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTEwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnU1lOVEgnLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kyMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0lOVk9LRScsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTMwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnREVQTE9ZJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMzAwMy5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdBU1NFVCcsIG1zZyk7XG4gIH1cbiAgLy8gSG90c3dhcCBsaXZlcyBpbiB0aGUgY2RrLXRvb2xraXQgc28gaXQgY2Fubm90IGJlIGEgQ0RLX0NMSSBlcnJvciBjb2RlLlxuICAvLyBJbnN0ZWFkIHdlIHJldXNlIHRoZSBleGlzdGluZyBIb3Rzd2FwIHNwYW4uXG4gIGlmIChJTy5DREtfVE9PTEtJVF9JNTQxMC5pcyhtc2cpKSB7XG4gICAgLy8gQ3JlYXRlIGEgdGVsZW1ldHJ5LWNvbXBhdGlibGUgcmVzdWx0XG4gICAgcmV0dXJuIGhvdHN3YXBUb0V2ZW50UmVzdWx0KG1zZy5kYXRhKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGV2ZW50UmVzdWx0KGV2ZW50VHlwZTogVGVsZW1ldHJ5RXZlbnRbJ2V2ZW50VHlwZSddLCBtOiBJb01lc3NhZ2U8RXZlbnRSZXN1bHQ+KTogVGVsZW1ldHJ5RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudFR5cGUsXG4gICAgICBkdXJhdGlvbjogbS5kYXRhLmR1cmF0aW9uLFxuICAgICAgZXJyb3I6IG0uZGF0YS5lcnJvcixcbiAgICAgIGNvdW50ZXJzOiBtLmRhdGEuY291bnRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBob3Rzd2FwVG9FdmVudFJlc3VsdChyZXN1bHQ6IEhvdHN3YXBSZXN1bHQpOiBUZWxlbWV0cnlFdmVudCB7XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVJlc291cmNlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBmb3IgKGNvbnN0IHsgc3ViamVjdCB9IG9mIHJlc3VsdC5ub25Ib3Rzd2FwcGFibGVDaGFuZ2VzKSB7XG4gICAgaWYgKCdyZXNvdXJjZVR5cGUnIGluIHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IGtleXMgPSAncmVqZWN0ZWRQcm9wZXJ0aWVzJyBpbiBzdWJqZWN0ICYmIHN1YmplY3QucmVqZWN0ZWRQcm9wZXJ0aWVzXG4gICAgICAgID8gc3ViamVjdC5yZWplY3RlZFByb3BlcnRpZXMubWFwKHAgPT4gYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfSMke3B9YClcbiAgICAgICAgOiBbYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfWBdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA9IChub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA/PyAwKSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFR5cGU6ICdIT1RTV0FQJyBhcyBjb25zdCxcbiAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgIC4uLihyZXN1bHQuZXJyb3IgPyB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBuYW1lOiBjZGtDbGlFcnJvck5hbWUocmVzdWx0LmVycm9yKSxcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICBjb3VudGVyczoge1xuICAgICAgaG90c3dhcHBlZDogcmVzdWx0LmhvdHN3YXBwZWQgPyAxIDogMCxcbiAgICAgIGhvdHN3YXBGYWxsYmFjazogcmVzdWx0LmhvdHN3YXBGYWxsYmFjayA/IDEgOiAwLFxuICAgICAgaG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0LmhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgbm9uSG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0Lm5vbkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgLi4ubm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
955
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOGxDQSw0QkFHQztBQXdCRCw0Q0FpQkM7QUF6b0NELGdEQUFrQztBQUNsQywwRUFBaUU7QUFDakUsc0RBQW9EO0FBRXBELGtEQUEwQjtBQUMxQixtREFBcUM7QUFFckMsMERBQWdLO0FBRWhLLGtEQUE4RDtBQUM5RCxzRUFBcUU7QUFDckUsOENBQXFEO0FBRXJELG9EQUF1RDtBQUV2RCxrREFBd0Q7QUFDeEQsbUVBQXdFO0FBQ3hFLDJEQUFnRTtBQUNoRSxxREFBa0Q7QUFFbEQsbUNBQWtDO0FBdU5sQzs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQW1CO0lBQzFDLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUEwREQ7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVH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QUFFLENBQUMsbUJBQW1CLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoRCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUN2Qix3QkFBd0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMzRSxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsU0FBUyxFQUFFLFNBQWtCO1FBQzdCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtRQUN6QixHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDakIsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxJQUFBLHVCQUFlLEVBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQzthQUNwQztTQUNGLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNQLFFBQVEsRUFBRTtZQUNSLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTTtZQUN0RCxzQkFBc0IsRUFBRSxNQUFNLENBQUMsc0JBQXNCLENBQUMsTUFBTTtZQUM1RCxHQUFHLHdCQUF3QjtTQUM1QjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBZ2VudCB9IGZyb20gJ25vZGU6aHR0cHMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHsgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IFRvb2xraXRFcnJvciB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCB0eXBlIHsgSG90c3dhcFJlc3VsdCwgSUlvSG9zdCwgSW9NZXNzYWdlLCBJb01lc3NhZ2VDb2RlLCBJb01lc3NhZ2VMZXZlbCwgSW9SZXF1ZXN0LCBUb29sa2l0QWN0aW9uIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIHByb21wdGx5IGZyb20gJ3Byb21wdGx5JztcbmltcG9ydCB0eXBlIHsgSW9IZWxwZXIsIEFjdGl2aXR5UHJpbnRlclByb3BzLCBJQWN0aXZpdHlQcmludGVyLCBJb01lc3NhZ2VNYWtlciwgSW9SZXF1ZXN0TWFrZXIsIElvRGVmYXVsdE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS1wcml2YXRlJztcbmltcG9ydCB7IGFzSW9IZWxwZXIsIElPLCBpc01lc3NhZ2VSZWxldmFudEZvckxldmVsLCBDdXJyZW50QWN0aXZpdHlQcmludGVyLCBIaXN0b3J5QWN0aXZpdHlQcmludGVyLCBFcnJvcnNPbmx5QWN0aXZpdHlQcmludGVyIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS1wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJy4uLy4uL2FwaS9jb250ZXh0JztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL2RlcGxveSc7XG5pbXBvcnQgeyBjYW5Db2xsZWN0VGVsZW1ldHJ5IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L2NvbGxlY3QtdGVsZW1ldHJ5JztcbmltcG9ydCB7IGNka0NsaUVycm9yTmFtZSB9IGZyb20gJy4uL3RlbGVtZXRyeS9lcnJvcic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UmVzdWx0IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB7IENMSV9QUklWQVRFX0lPIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB0eXBlIHsgVGVsZW1ldHJ5RXZlbnQgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2Vzc2lvbic7XG5pbXBvcnQgeyBUZWxlbWV0cnlTZXNzaW9uIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Nlc3Npb24nO1xuaW1wb3J0IHsgRW5kcG9pbnRUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3NpbmsvZW5kcG9pbnQtc2luayc7XG5pbXBvcnQgeyBGaWxlVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2ZpbGUtc2luayc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9mdW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBJVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL3NpbmstaW50ZXJmYWNlJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlsL2NpJztcblxuZXhwb3J0IHR5cGUgeyBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QgfTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuICdub25lJyByZXByZXNlbnRzIHRoZSBhYnNlbmNlIG9mIGFuIGFjdGlvbi5cbiAqL1xudHlwZSBDbGlBY3Rpb24gPVxuICB8IFRvb2xraXRBY3Rpb25cbiAgfCAnY29udGV4dCdcbiAgfCAnZG9jcydcbiAgfCAnbHNwJ1xuICB8ICdmbGFncydcbiAgfCAnbm90aWNlcydcbiAgfCAndmVyc2lvbidcbiAgfCAnY2xpLXRlbGVtZXRyeSdcbiAgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpSW9Ib3N0UHJvcHMge1xuICAvKipcbiAgICogVGhlIGluaXRpYWwgVG9vbGtpdCBhY3Rpb24gdGhlIGhvc3RzIHN0YXJ0cyB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnbm9uZSdcbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRBY3Rpb24/OiBDbGlBY3Rpb247XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHZlcmJvc2l0eSBvZiB0aGUgb3V0cHV0LlxuICAgKlxuICAgKiBUaGUgQ2xpSW9Ib3N0IHdpbGwgc3RpbGwgcmVjZWl2ZSBhbGwgbWVzc2FnZXMgYW5kIHJlcXVlc3RzLFxuICAgKiBidXQgb25seSB0aGUgbWVzc2FnZXMgaW5jbHVkZWQgaW4gdGhpcyBsZXZlbCB3aWxsIGJlIHByaW50ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdpbmZvJ1xuICAgKi9cbiAgcmVhZG9ubHkgbG9nTGV2ZWw/OiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBhdXRvbWF0aWMgVFRZIGRldGVjdGlvbi5cbiAgICpcbiAgICogV2hlbiBUVFkgaXMgZGlzYWJsZWQsIHRoZSBDTEkgd2lsbCBoYXZlIG5vIGludGVyYWN0aW9ucyBvciBjb2xvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgcHJvY2Vzc1xuICAgKi9cbiAgcmVhZG9ubHkgaXNUVFk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBDbGlJb0hvc3QgaXMgcnVubmluZyBpbiBDSSBtb2RlLlxuICAgKlxuICAgKiBJbiBDSSBtb2RlLCBhbGwgbm9uLWVycm9yIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci5cbiAgICogU2V0IHRvIGZhbHNlIGluIHRoZSBDbGlJb0hvc3QgY29uc3RydWN0b3IgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBpZiB0aGUgQ0xJIENJIGFyZ3VtZW50IGlzIHBhc3NlZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVybWluZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQsIHNwZWNpZmljYWxseSBiYXNlZCBvbiBgcHJvY2Vzcy5lbnYuQ0lgXG4gICAqL1xuICByZWFkb25seSBpc0NJPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW4gd2hhdCBzY2VuYXJpb3Mgc2hvdWxkIHRoZSBDbGlJb0hvc3QgYXNrIGZvciBhcHByb3ZhbFxuICAgKlxuICAgKiBAZGVmYXVsdCBSZXF1aXJlQXBwcm92YWwuQlJPQURFTklOR1xuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWlyZURlcGxveUFwcHJvdmFsPzogUmVxdWlyZUFwcHJvdmFsO1xuXG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBUb29sa2l0IGFjdGlvbiB0aGUgaG9zdHMgc3RhcnRzIHdpdGguXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVJcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrUHJvZ3Jlc3M/OiBTdGFja0FjdGl2aXR5UHJvZ3Jlc3M7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENMSSBzaG91bGQgYXR0ZW1wdCB0byBhdXRvbWF0aWNhbGx5IHJlc3BvbmQgdG8gcHJvbXB0cy5cbiAgICpcbiAgICogV2hlbiB0cnVlLCBvcGVyYXRpb24gd2lsbCB1c3VhbGx5IHByb2NlZWQgd2l0aG91dCBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24uXG4gICAqIENvbmZpcm1hdGlvbnMgYXJlIHJlc3BvbmRlZCB0byB3aXRoIHllcy4gT3RoZXIgcHJvbXB0cyB3aWxsIHJlc3BvbmQgd2l0aCB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9SZXNwb25kPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHR5cGUgZm9yIGNvbmZpZ3VyaW5nIGEgdGFyZ2V0IHN0cmVhbVxuICovXG5leHBvcnQgdHlwZSBUYXJnZXRTdHJlYW0gPSAnc3Rkb3V0JyB8ICdzdGRlcnInIHwgJ2Ryb3AnO1xuXG4vKipcbiAqIFRoZSByZXN1bHQgYSBtZXNzYWdlIGxpc3RlbmVyIG1heSByZXR1cm4gdG8gaW5mbHVlbmNlIGhvdyBhIG1lc3NhZ2UgaXMgaGFuZGxlZC5cbiAqXG4gKiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgX3RleHRfLCBfbGV2ZWxfLCBhbmQvb3IgX2FjdGlvbl87IGl0IGNhbm5vdFxuICogY2hhbmdlIG90aGVyIGZpZWxkcyAoc3VjaCBhcyBpdHMgYGNvZGVgKSwgd2hpY2gga2VlcHMgdGhlIGNvZGUta2V5ZWQgbGlzdGVuZXJcbiAqIHJlZ2lzdHJ5IHZhbGlkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lclJlc3VsdCB7XG4gIC8qKlxuICAgKiBSZXBsYWNlIHRoZSB0ZXh0IHRoYXQgaXMgcHJpbnRlZCBmb3IgdGhpcyBtZXNzYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBtZXNzYWdlIHRleHQgaXMgbGVmdCB1bmNoYW5nZWRcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBsZXZlbCBvZiB0aGlzIG1lc3NhZ2UuXG4gICAqXG4gICAqIFRoZSBuZXcgbGV2ZWwgaXMgdXNlZCBmb3IgYm90aCB2ZXJib3NpdHkgZmlsdGVyaW5nIGFuZCBzdHJlYW0gc2VsZWN0aW9uLCBzb1xuICAgKiB0aGlzIGNhbiBtb3ZlIGEgbWVzc2FnZSBiZXR3ZWVuIHN0ZG91dC9zdGRlcnIgKGUuZy4gZG93bmdyYWRlIGEgYHJlc3VsdGAgdG9cbiAgICogYGluZm9gKS4gVGhlIGBjb2RlYCBpcyBpbnRlbnRpb25hbGx5IGxlZnQgdW5jaGFuZ2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBtZXNzYWdlIGxldmVsIGlzIGxlZnQgdW5jaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBsZXZlbD86IElvTWVzc2FnZUxldmVsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgYWN0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UuXG4gICAqXG4gICAqIFRoZSBvdmVycmlkZSBhZmZlY3RzIHN1YnNlcXVlbnQgbGlzdGVuZXJzIGFuZCBwcmVzZW50YXRpb24vb2JzZXJ2YXRpb24gb2ZcbiAgICogdGhlIGVmZmVjdGl2ZSBtZXNzYWdlLiBNYXRjaGluZyBhbmQgdGVsZW1ldHJ5IGNvbnRpbnVlIHRvIHVzZSB0aGUgYWN0aW9uXG4gICAqIG9uIHRoZSBvcmlnaW5hbGx5IGVtaXR0ZWQgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSBhY3Rpb24gaXMgbGVmdCB1bmNoYW5nZWRcbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbj86IFRvb2xraXRBY3Rpb247XG5cbiAgLyoqXG4gICAqIFNraXAgdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgdGhlIG1lc3NhZ2UuXG4gICAqXG4gICAqIEZvciBhIG5vdGlmaWNhdGlvbiB0aGlzIG1lYW5zIGl0IGlzIG5vdCB3cml0dGVuIHRvIGEgc3RyZWFtLiBGb3IgYSByZXF1ZXN0XG4gICAqIGl0IHN0b3BzIHByb2Nlc3NpbmcgZW50aXJlbHk6IHRoZSB1c2VyIGlzIG5vdCBwcm9tcHRlZCwgbm90aGluZyBpcyB3cml0dGVuLFxuICAgKiBhbmQgdGhlIHJlcXVlc3QgcmVzb2x2ZXMgd2l0aCBpdHMgKHBvc3NpYmx5IGByZXNwb25kYC1vdmVycmlkZGVuKSBkZWZhdWx0XG4gICAqIHJlc3BvbnNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBGb3IgcmVxdWVzdHMgb25seTogdGhlIHZhbHVlIHRvIHJlc29sdmUgdGhlIHJlcXVlc3Qgd2l0aC4gSXQgaXMgZm9sZGVkIGludG9cbiAgICogdGhlIHJlcXVlc3QncyBkZWZhdWx0IHJlc3BvbnNlIGFuZCBza2lwcyB0aGUgcHJvbXB0ICh0aGUgcmVxdWVzdCBpcyB0cmVhdGVkXG4gICAqIGFzIG5vdCBwcm9tcHRhYmxlKS4gVGhlIHF1ZXN0aW9uIGlzIHN0aWxsIHdyaXR0ZW4gdW5sZXNzIGBwcmV2ZW50RGVmYXVsdGAgaXNcbiAgICogYWxzbyBzZXQuIElnbm9yZWQgZm9yIHBsYWluIG5vdGlmaWNhdGlvbnMuXG4gICAqXG4gICAqIFRoZSBwcmVzZW5jZSBvZiB0aGUga2V5IGlzIHdoYXQgbWF0dGVycywgc28gYGZhbHNlYC9gMGAvYCcnYCBhcmUgdmFsaWRcbiAgICogYW5zd2Vycy4gVXNlIHRoZSBgcmVzcG9uZGAvYHJlc3BvbmRPbmNlYCBoZWxwZXJzIGZvciB0aGUgY29tbW9uIGNhc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhpcyBsaXN0ZW5lciBkb2VzIG5vdCBzdXBwbHkgYSByZXNwb25zZVxuICAgKi9cbiAgcmVhZG9ubHkgcmVzcG9uZD86IHVua25vd247XG59XG5cbi8qKlxuICogV2hhdCBhIG1lc3NhZ2UgbGlzdGVuZXIgbWF5IHJldHVybjogbm90aGluZywgYSBgTWVzc2FnZUxpc3RlbmVyUmVzdWx0YCwgb3IgYVxuICogYFByb21pc2VgIG9mIGVpdGhlci5cbiAqXG4gKiBMaXN0ZW5lcnMgbWF5IGJlIGFzeW5jLiBUaGUgaG9zdCBhd2FpdHMgZWFjaCBsaXN0ZW5lciBiZWZvcmUgcnVubmluZyB0aGVcbiAqIG5leHQsIHNvIHJlZ2lzdHJhdGlvbiBvcmRlciDigJQgYW5kIHRoZSBjdW11bGF0aXZlIGVmZmVjdCBvbiB0aGUgbWVzc2FnZSDigJQgaXNcbiAqIHByZXNlcnZlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgbGlzdGVuZXJzIGFyZSBzeW5jIG9yIGFzeW5jLlxuICovXG5leHBvcnQgdHlwZSBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UgPSB2b2lkIHwgTWVzc2FnZUxpc3RlbmVyUmVzdWx0IHwgUHJvbWlzZTx2b2lkIHwgTWVzc2FnZUxpc3RlbmVyUmVzdWx0PjtcblxuLyoqXG4gKiBBIHJlZ2lzdGVyZWQgbWVzc2FnZSBsaXN0ZW5lci4gSXRzIHJldHVybiB2YWx1ZSAoaWYgYW55KSBtYXkgdXBkYXRlIHRoZVxuICogbWVzc2FnZSB0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBvciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcuIEl0IG1heVxuICogYmUgYXN5bmMuXG4gKi9cbnR5cGUgTWVzc2FnZUxpc3RlbmVyRm4gPSAobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlO1xuaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciB7XG4gIHJlYWRvbmx5IG9uY2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZuOiBNZXNzYWdlTGlzdGVuZXJGbjtcbiAgLyoqXG4gICAqIERlY2lkZXMgd2hpY2ggbWVzc2FnZXMgdGhpcyBsaXN0ZW5lciBhcHBsaWVzIHRvLiBGb3IgYSBsaXN0ZW5lciByZWdpc3RlcmVkXG4gICAqIHdpdGggYSBtYWtlciB0aGlzIG1hdGNoZXMgYnkgYGNvZGVgOyBmb3Igb25lIHJlZ2lzdGVyZWQgd2l0aCBhIHByZWRpY2F0ZSBpdFxuICAgKiBpcyB0aGUgcHJlZGljYXRlIGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IG1hdGNoZXM6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gYm9vbGVhbjtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBpcyBvbmUgb2YgdGhlIGhvc3QncyBvd24gaW50ZXJuYWwgbGlzdGVuZXJzIChlLmcuIHN0YWNrLWFjdGl2aXR5XG4gICAqIHJvdXRpbmcpLiBJbnRlcm5hbCBsaXN0ZW5lcnMgYXJlIG5vdCByZW1vdmVkIGJ5IGByZW1vdmVBbGxMaXN0ZW5lcnNgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZSAtIGEgdXNlciBsaXN0ZW5lciByZWdpc3RlcmVkIHZpYSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgXG4gICAqL1xuICByZWFkb25seSBpbnRlcm5hbD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogU2VsZWN0cyB3aGljaCBtZXNzYWdlcyBhIGxpc3RlbmVyIGFwcGxpZXMgdG8uXG4gKlxuICogRWl0aGVyIGEgbWVzc2FnZS9yZXF1ZXN0ICptYWtlciog4oCUIHRoZSBsaXN0ZW5lciBmaXJlcyBmb3IgbWVzc2FnZXMgd2l0aCB0aGF0XG4gKiBtYWtlcidzIGBjb2RlYCAodGhlIG9yaWdpbmFsIGJlaGF2aW9yKSDigJQgb3IgYSBjdXN0b20gKnByZWRpY2F0ZSogb3ZlciB0aGVcbiAqIG1lc3NhZ2UuIEEgbWFrZXIncyBgLmlzYCB0eXBlIGd1YXJkIChlLmcuIGBJTy5DREtfVE9PTEtJVF9JNzAxMC5pc2ApIGlzIGFcbiAqIGNvbnZlbmllbnQgcHJlZGljYXRlLCBidXQgYW55IGAobXNnKSA9PiBib29sZWFuYCB3b3JrcyAoZS5nLiB0byBtYXRjaCBhIGZhbWlseVxuICogb2YgY29kZXMsIG9yIG9uIHRoZSBtZXNzYWdlIGxldmVsKS5cbiAqL1xuZXhwb3J0IHR5cGUgTWVzc2FnZVNlbGVjdG9yPFQ+ID1cbiAgfCBJb01lc3NhZ2VNYWtlcjxUPlxuICB8IElvUmVxdWVzdE1ha2VyPFQsIGFueT5cbiAgfCAoKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IGJvb2xlYW4pO1xuXG4vKipcbiAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgbWVzc2FnZSBsaXN0ZW5lci5cbiAqXG4gKiBDYWxsYWJsZSBkaXJlY3RseSAoYGRpc3Bvc2UoKWApLCBhbmQgYWxzbyBhIGBEaXNwb3NhYmxlYCwgc28gaXQgY2FuIGJlIGJvdW5kXG4gKiB0byB0aGUgZW5jbG9zaW5nIHNjb3BlIHdpdGggYSBgdXNpbmdgIGRlY2xhcmF0aW9uIOKAlCB0aGUgbGlzdGVuZXIgaXMgdGhlblxuICogcmVtb3ZlZCB3aGVuIHRoZSBzY29wZSBleGl0cywgZXZlbiBvbiBhbiBlYXJseSByZXR1cm4gb3IgYSB0aHJvdzpcbiAqXG4gKiBgYGB0c1xuICogdXNpbmcgX2ZtdCA9IGlvSG9zdC5yZXdyaXRlKElPLkNES19UT09MS0lUX0kyOTAxLCBmb3JtYXQpO1xuICogYGBgXG4gKlxuICogYHVzaW5nIHggPSBjb25kID8gaW9Ib3N0Lm9uKC4uLikgOiB1bmRlZmluZWRgIGlzIGFsc28gdmFsaWQ6IGRpc3Bvc2FsIGlzXG4gKiBzaW1wbHkgc2tpcHBlZCBmb3IgYHVuZGVmaW5lZGAsIHdoaWNoIG1ha2VzIGNvbmRpdGlvbmFsIGxpc3RlbmVycyBjaGVhcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaXNwb3NlTGlzdGVuZXIge1xuICAoKTogdm9pZDtcbiAgW1N5bWJvbC5kaXNwb3NlXSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIE1ha2UgYSBwbGFpbiByZW1vdmVyIGZ1bmN0aW9uIHVzYWJsZSBhcyBhIGBEaXNwb3NhYmxlYCAoc2VlIGBEaXNwb3NlTGlzdGVuZXJgKS5cbiAqL1xuZnVuY3Rpb24gZGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2U6ICgpID0+IHZvaWQpOiBEaXNwb3NlTGlzdGVuZXIge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihkaXNwb3NlLCB7IFtTeW1ib2wuZGlzcG9zZV06IGRpc3Bvc2UgfSk7XG59XG5cbi8qKlxuICogSG93IGFuIElvSG9zdCBwcm9jZXNzZWQgYSBzaW5nbGUgbWVzc2FnZSBvciByZXF1ZXN0LlxuICpcbiAqIFRoaXMgZGVzY3JpYmVzIHRoZSBtZXNzYWdlICphcyB0aGUgaG9zdCBoYW5kbGVkIGl0Kiwgd2hpY2ggY2FuIGRpZmZlciBmcm9tXG4gKiB3aGF0IHdhcyBlbWl0dGVkOiBsaXN0ZW5lcnMgbWF5IHJld3JpdGUgdGhlIHRleHQgb3IgbGV2ZWwsIHByZXZlbnQgaXQgZnJvbVxuICogYmVpbmcgd3JpdHRlbiBhdCBhbGwsIG9yIChmb3IgcmVxdWVzdHMpIGFuc3dlciBpdCBvbiB0aGUgdXNlcidzIGJlaGFsZi5cbiAqXG4gKiBCb3RoIG5vdGlmaWNhdGlvbnMgKGBub3RpZnlgKSBhbmQgcmVxdWVzdHMgKGByZXF1ZXN0UmVzcG9uc2VgKSBhcmUgcmVwb3J0ZWQsXG4gKiBzbyBhbiBvYnNlcnZlciBzZWVzIHRoZSBjb21wbGV0ZSwgb3JkZXJlZCBzdHJlYW0gdGhlIGhvc3QgaGFuZGxlZC4gVXNlXG4gKiBgdHlwZWAgdG8gdGVsbCB0aGVtIGFwYXJ0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElvTWVzc2FnZU9ic2VydmF0aW9uIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBvYnNlcnZhdGlvbiBkZXNjcmliZXMgYSBwbGFpbiBub3RpZmljYXRpb24gKGBub3RpZnlgKSBvciBhXG4gICAqIHJlcXVlc3QgdGhhdCBhc2tlZCBmb3IgYSByZXNwb25zZSAoYHJlcXVlc3RSZXNwb25zZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogJ25vdGlmeScgfCAncmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIFRoZSBtZXNzYWdlIGV4YWN0bHkgYXMgaXQgd2FzIGVtaXR0ZWQgdG8gdGhlIGhvc3QgKGJlZm9yZSBhbnkgbGlzdGVuZXJzKS5cbiAgICovXG4gIHJlYWRvbmx5IGVtaXR0ZWQ6IElvTWVzc2FnZTx1bmtub3duPjtcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgYWZ0ZXIgdGhlIGhvc3QncyBsaXN0ZW5lcnMgcmFuICh0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBtYXkgZGlmZmVyKS5cbiAgICovXG4gIHJlYWRvbmx5IGVmZmVjdGl2ZTogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGEgbGlzdGVuZXIgcHJldmVudGVkIHRoaXMgbWVzc2FnZSBmcm9tIGJlaW5nIHdyaXR0ZW4sIGkuZS4gdGhlIHVzZXJcbiAgICogd291bGQgbm90IHNlZSBpdC4gQWx3YXlzIGBmYWxzZWAgZm9yIHJlcXVlc3RzIChhIHJlcXVlc3QgaXMgcmVwb3J0ZWQgb25jZVxuICAgKiBpdCBoYXMgYmVlbiByZXNvbHZlZCwgcmVnYXJkbGVzcyBvZiBob3cgaXQgd2FzIGFuc3dlcmVkKS5cbiAgICovXG4gIHJlYWRvbmx5IGRyb3BwZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQW4gSW9Ib3N0IHdob3NlIG1lc3NhZ2UgaGFuZGxpbmcgY2FuIGJlIG9ic2VydmVkLlxuICpcbiAqIFRoaXMgaXMgYSBDTEktaW50ZXJuYWwgY29udHJhY3QgdXNlZCBieSB0ZXN0cyB0byByZWNvcmQgdGhlICplZmZlY3RpdmUqLFxuICogdXNlci1mYWNpbmcgbWVzc2FnZSBzdHJlYW0gKGFmdGVyIGxpc3RlbmVycykgd2l0aG91dCByZWFjaGluZyBpbnRvIGhvc3RcbiAqIGludGVybmFscy4gSXQgaXMgaW50ZW50aW9uYWxseSBzZXBhcmF0ZSBmcm9tIGBJSW9Ib3N0YCBzbyB0aGF0IHRoZSByZWNvcmRlclxuICogY2FuIHdvcmsgd2l0aCBhbnkgYElJb0hvc3RgIGFuZCBvbmx5IGVucmljaCBpdHMgb3V0cHV0IHdoZW4gdGhlIGhvc3QgYWxzb1xuICogaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPYnNlcnZhYmxlSW9Ib3N0IHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB0aGUgaG9zdCBoYW5kbGVzIOKAlFxuICAgKiBib3RoIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVlc3RzIOKAlCB3aXRoIHRoZSBkaXNwb3NpdGlvbiB0aGUgaG9zdCBjb21wdXRlZFxuICAgKiBmb3IgaXQgKGl0cyBlZmZlY3RpdmUgZm9ybSBhZnRlciBsaXN0ZW5lcnMgYW5kIHdoZXRoZXIgaXQgd2FzIGRyb3BwZWQpLiBGb3JcbiAgICogYSByZXF1ZXN0LCB0aGUgcmVzb2x2ZWQgYW5zd2VyIGlzIHRoZSBlZmZlY3RpdmUgbWVzc2FnZSdzIGBkZWZhdWx0UmVzcG9uc2VgLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBvYnNlcnZlciBhZ2Fpbi5cbiAgICovXG4gIG9ic2VydmVNZXNzYWdlcyhvYnNlcnZlcjogKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZCk6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQSBzaW1wbGUgSU8gaG9zdCBmb3IgdGhlIENMSSB0aGF0IHdyaXRlcyBtZXNzYWdlcyB0byB0aGUgY29uc29sZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENsaUlvSG9zdCBpbXBsZW1lbnRzIElJb0hvc3QsIE9ic2VydmFibGVJb0hvc3Qge1xuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gICAqL1xuICBzdGF0aWMgaW5zdGFuY2UocHJvcHM6IENsaUlvSG9zdFByb3BzID0ge30sIGZvcmNlTmV3ID0gZmFsc2UpOiBDbGlJb0hvc3Qge1xuICAgIGlmIChmb3JjZU5ldyB8fCAhQ2xpSW9Ib3N0Ll9pbnN0YW5jZSkge1xuICAgICAgQ2xpSW9Ib3N0Ll9pbnN0YW5jZSA9IG5ldyBDbGlJb0hvc3QocHJvcHMpO1xuICAgIH1cbiAgICByZXR1cm4gQ2xpSW9Ib3N0Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UgaWYgaXQgZXhpc3RzXG4gICAqL1xuICBzdGF0aWMgZ2V0KCk6IENsaUlvSG9zdCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIENsaUlvSG9zdC5faW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBDbGlJb0hvc3RcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogQ2xpSW9Ib3N0IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuXG4gICAqL1xuICBwdWJsaWMgY3VycmVudEFjdGlvbjogQ2xpQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBDbGlJb0hvc3QgaXMgcnVubmluZyBpbiBDSSBtb2RlLlxuICAgKlxuICAgKiBJbiBDSSBtb2RlLCBhbGwgbm9uLWVycm9yIG91dHB1dCBnb2VzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci5cbiAgICovXG4gIHB1YmxpYyBpc0NJOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBob3N0IGNhbiB1c2UgaW50ZXJhY3Rpb25zIGFuZCBtZXNzYWdlIHN0eWxpbmcuXG4gICAqL1xuICBwdWJsaWMgaXNUVFk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHRocmVzaG9sZC5cbiAgICpcbiAgICogTWVzc2FnZXMgd2l0aCBhIGxvd2VyIHByaW9yaXR5IGxldmVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICovXG4gIHB1YmxpYyBsb2dMZXZlbDogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb25zIGZvciByZXF1aXJpbmcgYXBwcm92YWwgaW4gdGhpcyBDbGlJb0hvc3QuXG4gICAqL1xuICBwdWJsaWMgcmVxdWlyZURlcGxveUFwcHJvdmFsOiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSB0aGUgdGFyZ2V0IHN0cmVhbSBmb3Igbm90aWNlc1xuICAgKlxuICAgKiAoTm90IGEgc2V0dGVyIGJlY2F1c2UgdGhlcmUncyBubyBuZWVkIGZvciBhZGRpdGlvbmFsIGxvZ2ljIHdoZW4gdGhpcyB2YWx1ZVxuICAgKiBpcyBjaGFuZ2VkIHlldClcbiAgICovXG4gIHB1YmxpYyBub3RpY2VzRGVzdGluYXRpb246IFRhcmdldFN0cmVhbSA9ICdzdGRlcnInO1xuXG4gIHByaXZhdGUgX3Byb2dyZXNzOiBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MgPSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSO1xuXG4gIC8vIFN0YWNrIEFjdGl2aXR5IFByaW50ZXJcbiAgcHJpdmF0ZSBhY3Rpdml0eVByaW50ZXI/OiBJQWN0aXZpdHlQcmludGVyO1xuXG4gIC8vIENvcmtlZCBMb2dnaW5nXG4gIHByaXZhdGUgY29ya2VkQ291bnRlciA9IDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29ya2VkTG9nZ2luZ0J1ZmZlcjogSW9NZXNzYWdlPHVua25vd24+W10gPSBbXTtcblxuICAvLyBNZXNzYWdlIGxpc3RlbmVycyBpbiByZWdpc3RyYXRpb24gb3JkZXIuIEVhY2ggY2FycmllcyBhIG1hdGNoZXIgKGJ5IGNvZGUsXG4gIC8vIG9yIGEgY3VzdG9tIHByZWRpY2F0ZSkuIFNlZSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgLlxuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VMaXN0ZW5lcnM6IE1lc3NhZ2VMaXN0ZW5lcltdID0gW107XG5cbiAgLy8gT2JzZXJ2ZXJzIG9mIGhvdyBtZXNzYWdlcyBhcmUgaGFuZGxlZCAoc2VlIE9ic2VydmFibGVJb0hvc3QgLyBvYnNlcnZlTWVzc2FnZXMpLlxuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VPYnNlcnZlcnMgPSBuZXcgU2V0PChvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pID0+IHZvaWQ+KCk7XG5cbiAgLy8gVHJ1ZSB3aGlsZSByZXBsYXlpbmcgY29ya2VkIG1lc3NhZ2VzLCBzbyBvYnNlcnZlcnMgYXJlbid0IG5vdGlmaWVkIHR3aWNlLlxuICBwcml2YXRlIGNvcmtSZXBsYXlpbmcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZXNwb25kOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVsZW1ldHJ5IHNlc3Npb24gb2JqZWN0XG4gICAqXG4gICAqIFdpbGwgcmVtYWluIGB1bmRlZmluZWRgIGlmIHRoZSB1c2VyIGhhcyBkaXNhYmxlZCB0ZWxlbWV0cnkuXG4gICAqL1xuICBwdWJsaWMgdGVsZW1ldHJ5PzogVGVsZW1ldHJ5U2Vzc2lvbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBDbGlJb0hvc3RQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5jdXJyZW50QWN0aW9uID0gcHJvcHMuY3VycmVudEFjdGlvbiA/PyAnbm9uZSc7XG4gICAgdGhpcy5pc1RUWSA9IHByb3BzLmlzVFRZID8/IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIHRoaXMubG9nTGV2ZWwgPSBwcm9wcy5sb2dMZXZlbCA/PyAnaW5mbyc7XG4gICAgdGhpcy5pc0NJID0gcHJvcHMuaXNDSSA/PyBpc0NJKCk7XG4gICAgdGhpcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPSBwcm9wcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPz8gUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkc7XG4gICAgdGhpcy5zdGFja1Byb2dyZXNzID0gcHJvcHMuc3RhY2tQcm9ncmVzcyA/PyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSO1xuICAgIHRoaXMuYXV0b1Jlc3BvbmQgPSBwcm9wcy5hdXRvUmVzcG9uZCA/PyBmYWxzZTtcblxuICAgIC8vIFN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBhY3Rpdml0eSBwcmludGVyIHJhdGhlciB0aGFuXG4gICAgLy8gd3JpdHRlbiB0byBhIHN0cmVhbS4gVGhpcyBpcyB3aXJlZCB1cCBhcyBtZXNzYWdlIGxpc3RlbmVycy5cbiAgICB0aGlzLnJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0VGVsZW1ldHJ5KGFyZ3M6IGFueSwgY29udGV4dDogQ29udGV4dCwgcHJveHlBZ2VudD86IEFnZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jbGktdHlwZS1yZWdpc3RyeS5qc29uJyk7XG4gICAgY29uc3QgdmFsaWRDb21tYW5kcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb21tYW5kcyk7XG4gICAgY29uc3QgY21kID0gYXJncy5fWzBdO1xuICAgIGlmICghdmFsaWRDb21tYW5kcy5pbmNsdWRlcyhjbWQpKSB7XG4gICAgICAvLyB0aGUgdXNlciB0eXBlZCBpbiBhbiBpbnZhbGlkIGNvbW1hbmQgLSBubyBuZWVkIGZvciB0ZWxlbWV0cnkgc2luY2UgdGhlIGludm9jYXRpb24gaXMgZ29pbmcgdG8gZmFpbFxuICAgICAgLy8gaW1taW5lbnRseSBhbnl3YXkuXG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZShgU2Vzc2lvbiBpbnN0YW50aWF0ZWQgd2l0aCBhbiBpbnZhbGlkIGNvbW1hbmQgKCR7Y21kfSkuIE5vdCBzdGFydGluZyB0ZWxlbWV0cnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNpbmtzOiBJVGVsZW1ldHJ5U2lua1tdID0gW107XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZVBhdGggPSBhcmdzWyd0ZWxlbWV0cnktZmlsZSddO1xuICAgIGlmICh0ZWxlbWV0cnlGaWxlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgRmlsZVRlbGVtZXRyeVNpbmsoe1xuICAgICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgICBsb2dGaWxlUGF0aDogdGVsZW1ldHJ5RmlsZVBhdGgsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ0ZpbGUgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBGaWxlIFRlbGVtZXRyeSBpbnN0YW50aWF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5RW5kcG9pbnQgPSBwcm9jZXNzLmVudi5URUxFTUVUUllfRU5EUE9JTlQgPz8gJ2h0dHBzOi8vY2RrLWNsaS10ZWxlbWV0cnkudXMtZWFzdC0xLmFwaS5hd3MvbWV0cmljcyc7XG4gICAgaWYgKGNhbkNvbGxlY3RUZWxlbWV0cnkoYXJncywgY29udGV4dCkgJiYgdGVsZW1ldHJ5RW5kcG9pbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpbmtzLnB1c2gobmV3IEVuZHBvaW50VGVsZW1ldHJ5U2luayh7XG4gICAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICAgIGFnZW50OiBwcm94eUFnZW50LFxuICAgICAgICAgIGVuZHBvaW50OiB0ZWxlbWV0cnlFbmRwb2ludCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBFbmRwb2ludCBUZWxlbWV0cnkgaW5zdGFudGlhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IE5PVCBjb25uZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lua3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZWxlbWV0cnkgPSBuZXcgVGVsZW1ldHJ5U2Vzc2lvbih7XG4gICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgY2xpZW50OiBuZXcgRnVubmVsKHsgc2lua3MgfSksXG4gICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5iZWdpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc3RhY2tQcm9ncmVzcyBwcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHNldCBzdGFja1Byb2dyZXNzKHR5cGU6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcykge1xuICAgIHRoaXMuX3Byb2dyZXNzID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFja1Byb2dyZXNzIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBvdGhlciBzdGF0ZSBvZiB0aGUgaW9Ib3N0LFxuICAgKiBsaWtlIGlmIGlzVFRZIGFuZCBpc0NJLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja1Byb2dyZXNzKCk6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB7XG4gICAgLy8gV2UgY2FuIGFsd2F5cyB1c2UgRVZFTlRTIGFuZCBFUlJPUlNfT05MWVxuICAgIGlmICh0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUyB8fCB0aGlzLl9wcm9ncmVzcyA9PT0gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVSUk9SU19PTkxZKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBkZWJ1ZyBtZXNzYWdlIChhbmQgdGh1cyBhbnkgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzKSBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgbG9nIGxldmVsLCB3ZSBoYXZlIHZlcmJvc2UgbG9nZ2luZ1xuICAgIGNvbnN0IHZlcmJvc2VMb2dnaW5nID0gaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCh7IGxldmVsOiAnZGVidWcnIH0sIHRoaXMubG9nTGV2ZWwpO1xuICAgIGlmICh2ZXJib3NlTG9nZ2luZykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gV2luZG93cyB3ZSBjYW5ub3QgdXNlIGZhbmN5IG91dHB1dFxuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgaWYgKGlzV2luZG93cykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gc29tZSBDSSBzeXN0ZW1zIChzdWNoIGFzIENpcmNsZUNJKSBvdXRwdXQgc3RpbGwgcmVwb3J0cyBhcyBhIFRUWSBzbyB3ZSBhbHNvXG4gICAgLy8gbmVlZCBhbiBpbmRpdmlkdWFsIGNoZWNrIGZvciB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgb24gQ0kuXG4gICAgLy8gc2VlOiBodHRwczovL2Rpc2N1c3MuY2lyY2xlY2kuY29tL3QvY2lyY2xlY2ktdGVybWluYWwtaXMtYS10dHktYnV0LXRlcm0taXMtbm90LXNldC85OTY1XG4gICAgY29uc3QgZmFuY3lPdXRwdXRBdmFpbGFibGUgPSB0aGlzLmlzVFRZICYmICF0aGlzLmlzQ0k7XG4gICAgaWYgKCFmYW5jeU91dHB1dEF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB1c2VyIHByZWZlcmVuY2VcbiAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRzKCk6IElvRGVmYXVsdE1lc3NhZ2VzIHtcbiAgICByZXR1cm4gdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHM7XG4gIH1cblxuICBwdWJsaWMgYXNJb0hlbHBlcigpOiBJb0hlbHBlciB7XG4gICAgcmV0dXJuIGFzSW9IZWxwZXIodGhpcywgdGhpcy5jdXJyZW50QWN0aW9uIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBibG9jayBvZiBjb2RlIHdpdGggY29ya2VkIGxvZ2dpbmcuIEFsbCBsb2cgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvblxuICAgKiBhcmUgYnVmZmVyZWQgYW5kIG9ubHkgd3JpdHRlbiB3aGVuIGFsbCBuZXN0ZWQgY29yayBibG9ja3MgY29tcGxldGUgKHdoZW4gQ09SS19DT1VOVEVSIHJlYWNoZXMgMCkuXG4gICAqIFRoZSBjb3JraW5nIGlzIGJvdW5kIHRvIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgQ2xpSW9Ib3N0LlxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2sgLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGggY29ya2VkIGxvZ2dpbmdcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJsb2NrJ3MgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2l0aENvcmtlZExvZ2dpbmc8VD4oYmxvY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmNvcmtlZENvdW50ZXIrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ya2VkQ291bnRlci0tO1xuICAgICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA9PT0gMCkge1xuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggYnVmZmVyZWQgbWVzc2FnZSB0aHJvdWdoIG5vdGlmeVxuICAgICAgICB0aGlzLmNvcmtSZXBsYXlpbmcgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZvciAoY29uc3QgaW9NZXNzYWdlIG9mIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlcikge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnkoaW9NZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgdGhpcy5jb3JrUmVwbGF5aW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gcmVtb3ZlIGFsbCBidWZmZXJlZCBtZXNzYWdlcyBpbi1wbGFjZVxuICAgICAgICB0aGlzLmNvcmtlZExvZ2dpbmdCdWZmZXIuc3BsaWNlKDApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBjb2RlLlxuICAgKlxuICAgKiBUaGUgbGlzdGVuZXIgbWF5IHJldHVybiBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgIHRvIHVwZGF0ZSB0aGUgbWVzc2FnZVxuICAgKiB0ZXh0LCBsZXZlbCwgYW5kL29yIGFjdGlvbiBvciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgKHdyaXRpbmcgaXQgdG9cbiAgICogYSBzdHJlYW0pOyByZXR1cm5pbmcgbm90aGluZyBsZWF2ZXMgdGhlIG1lc3NhZ2UgdW50b3VjaGVkLiBUaGUgbGlzdGVuZXIgbWF5XG4gICAqIGJlIGFzeW5jIChyZXR1cm4gYSBgUHJvbWlzZWApOyB0aGUgaG9zdCBhd2FpdHMgaXQgYmVmb3JlIHByb2Nlc3NpbmcgdGhlXG4gICAqIG1lc3NhZ2UgZnVydGhlci4gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgbGlzdGVuZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3Qub24oSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIGFzeW5jIChtc2cpID0+IHtcbiAgICogICBteUNvdW50ICs9IG1zZy5kYXRhLnN0YWNrcy5sZW5ndGg7XG4gICAqICAgYXdhaXQgcGVyc2lzdChteUNvdW50KTtcbiAgICogfSk7XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIE1hdGNoIHdpdGggYSBjdXN0b20gcHJlZGljYXRlIGluc3RlYWQgb2YgYSBjb2RlLCBlLmcuIGEgbWFrZXIncyBgLmlzYDpcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5vbihJTy5DREtfVE9PTEtJVF9JNzAxMC5pcywgKG1zZykgPT4gKHsgcmVzcG9uZDogdHJ1ZSB9KSk7XG4gICAqL1xuICBwdWJsaWMgb248VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbihcbiAgICBwcmVkaWNhdGU6IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuLFxuICAgIGxpc3RlbmVyOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSxcbiAgKTogRGlzcG9zZUxpc3RlbmVyO1xuICBwdWJsaWMgb24oc2VsZWN0b3I6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+LCBsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyRm4pOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvYnNlcnZlciB0aGF0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IG1lc3NhZ2UgdGhlIGhvc3QgaGFuZGxlcyDigJRcbiAgICogYm90aCBub3RpZmljYXRpb25zIGFuZCByZXF1ZXN0cyDigJQgd2l0aCB0aGUgZGlzcG9zaXRpb24gdGhlIGhvc3QgY29tcHV0ZWRcbiAgICogZm9yIGl0IChpdHMgZWZmZWN0aXZlIGZvcm0gYWZ0ZXIgbGlzdGVuZXJzIGFuZCB3aGV0aGVyIGl0IHdhcyBkcm9wcGVkKS4gRm9yXG4gICAqIGEgcmVxdWVzdCwgdGhlIHJlc29sdmVkIGFuc3dlciBpcyB0aGUgZWZmZWN0aXZlIG1lc3NhZ2UncyBgZGVmYXVsdFJlc3BvbnNlYC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgb2JzZXJ2ZXIuXG4gICAqXG4gICAqIEBzZWUgT2JzZXJ2YWJsZUlvSG9zdFxuICAgKi9cbiAgcHVibGljIG9ic2VydmVNZXNzYWdlcyhvYnNlcnZlcjogKG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZCk6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZU9ic2VydmVycy5hZGQob2JzZXJ2ZXIpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMuZGVsZXRlKG9ic2VydmVyKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYG9uYCwgYnV0IHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzIGJlZW5cbiAgICogaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIG9uY2U8VD4oXG4gICAgc2VsZWN0b3I6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PiB8ICgobXNnOiBJb01lc3NhZ2U8YW55PikgPT4gbXNnIGlzIElvTWVzc2FnZTxUPiksXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbmNlKFxuICAgIHByZWRpY2F0ZTogKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IGJvb2xlYW4sXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiBEaXNwb3NlTGlzdGVuZXI7XG4gIHB1YmxpYyBvbmNlKHNlbGVjdG9yOiBNZXNzYWdlU2VsZWN0b3I8YW55PiwgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lckZuKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoeyBvbmNlOiB0cnVlLCBmbjogbGlzdGVuZXIsIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKHNlbGVjdG9yKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgZXZlcnkgbWVzc2FnZSBsaXN0ZW5lciByZWdpc3RlcmVkIHZpYSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJlc3BvbmRgLlxuICAgKlxuICAgKiBUaGUgaG9zdCdzIG93biBpbnRlcm5hbCBsaXN0ZW5lcnMgKHN1Y2ggYXMgc3RhY2stYWN0aXZpdHkgcm91dGluZykgYXJlIGtlcHQsXG4gICAqIHNvIHRoZSBob3N0IGtlZXBzIHdvcmtpbmcgYWZ0ZXJ3YXJkcy4gTWVzc2FnZSBvYnNlcnZlcnMgcmVnaXN0ZXJlZCB2aWFcbiAgICogYG9ic2VydmVNZXNzYWdlc2AgYXJlIGEgc2VwYXJhdGUgbWVjaGFuaXNtIGFuZCBhcmUgbm90IGFmZmVjdGVkLlxuICAgKlxuICAgKiBUaGlzIGlzIG1haW5seSB1c2VmdWwgZm9yIHRlc3RzIHRoYXQgc2hhcmUgdGhlIHNpbmdsZXRvbiBob3N0IGFuZCBuZWVkIHRvXG4gICAqIHJlc2V0IGxpc3RlbmVyIHN0YXRlIGJldHdlZW4gY2FzZXMgKGEgbGVmdG92ZXIgbGlzdGVuZXIgd291bGQgb3RoZXJ3aXNlXG4gICAqIGxlYWsgaW50byB0aGUgbmV4dCB0ZXN0KS5cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbGxMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgLy8gRHJvcCB1c2VyIGxpc3RlbmVycyBpbiBwbGFjZSAocHJlc2VydmluZyBhcnJheSBpZGVudGl0eSBmb3IgYW55XG4gICAgLy8gb3V0c3RhbmRpbmcgZGlzcG9zZSBjbG9zdXJlcyk7IGtlZXAgdGhlIGhvc3QncyBpbnRlcm5hbCBsaXN0ZW5lcnMuXG4gICAgZm9yIChsZXQgaSA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VMaXN0ZW5lcnNbaV0uaW50ZXJuYWwpIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQW5zd2VyIGEgcmVxdWVzdCAoYnkgaXRzIGNvZGUpIG9uIHRoZSB1c2VyJ3MgYmVoYWxmIHdpdGggYSBmaXhlZCB2YWx1ZSwgc29cbiAgICogdGhlIGhvc3QgZG9lcyBub3QgcHJvbXB0LiBTeW50YWN0aWMgc3VnYXIgZm9yIGFuIGBvbmAgbGlzdGVuZXIgcmV0dXJuaW5nXG4gICAqIGB7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9YDsgZm9yIGNvbmRpdGlvbmFsXG4gICAqIGFuc3dlcnMgb3IgdG8gYWxzbyByZXdvcmQgdGhlIHF1ZXN0aW9uLCB1c2UgYG9uYC9gb25jZWAgZGlyZWN0bHkuIFJldHVybnMgYVxuICAgKiBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIHJlc3BvbmRlciBhZ2Fpbi5cbiAgICpcbiAgICogQHBhcmFtIHN1cHByZXNzUXVlc3Rpb24gLSB3aGV0aGVyIHRvIGFsc28gc3VwcHJlc3Mgd3JpdGluZyB0aGUgcXVlc3Rpb24gdGV4dC5cbiAgICogICBEZWZhdWx0cyB0byBgdHJ1ZWAgKGFuc3dlciBzaWxlbnRseSkuIFBhc3MgYGZhbHNlYCB0byBzdGlsbCBzdXJmYWNlIHRoZVxuICAgKiAgIHF1ZXN0aW9uIHdoaWxlIGFuc3dlcmluZyBpdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gVW5kZXIgLS1mb3JjZSwgYXV0by1jb25maXJtIHRoZSBkZXN0cm95IHByb21wdCB3aXRob3V0IHByb21wdGluZy5cbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5yZXNwb25kKElPLkNES19UT09MS0lUX0k3MDEwLCB0cnVlKTtcbiAgICovXG4gIHB1YmxpYyByZXNwb25kPFQsIFU+KGNvZGU6IElvUmVxdWVzdE1ha2VyPFQsIFU+LCB2YWx1ZTogVSwgc3VwcHJlc3NRdWVzdGlvbiA9IHRydWUpOiBEaXNwb3NlTGlzdGVuZXIge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogKCkgPT4gKHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH0pLCBtYXRjaGVzOiBtZXNzYWdlTWF0Y2hlcihjb2RlKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIGByZXNwb25kYCwgYnV0IHRoZSBhbnN3ZXIgaXMgZ2l2ZW4gb25seSBvbmNlIGFuZCB0aGVuIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzcG9uZE9uY2U8VCwgVT4oY29kZTogSW9SZXF1ZXN0TWFrZXI8VCwgVT4sIHZhbHVlOiBVLCBzdXBwcmVzc1F1ZXN0aW9uID0gdHJ1ZSk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHsgb25jZTogdHJ1ZSwgZm46ICgpID0+ICh7IHJlc3BvbmQ6IHZhbHVlLCBwcmV2ZW50RGVmYXVsdDogc3VwcHJlc3NRdWVzdGlvbiB9KSwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoY29kZSkgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBmb3JtYXR0ZXIgdGhhdCByZXBsYWNlcyB0aGUgcHJpbnRlZCB0ZXh0IG9mIG1lc3NhZ2VzIHdpdGggdGhlXG4gICAqIGdpdmVuIGNvZGUuIFRoaXMgbGV0cyBhIGNhbGxlciBkZWZpbmUgX2hvd18gYSB0b29sa2l0IG1lc3NhZ2UgaXMgcHJlc2VudGVkXG4gICAqIHdpdGhvdXQgdGhlIElvSG9zdCBuZWVkaW5nIHRvIGtub3cgYWJvdXQgaXQuXG4gICAqXG4gICAqIE9wdGlvbmFsbHkgcGFzcyBhIGBsZXZlbGAgdG8gYWxzbyBvdmVycmlkZSB0aGUgbWVzc2FnZSdzIGxldmVsICh3aGljaCBtb3Zlc1xuICAgKiBpdCBiZXR3ZWVuIHN0ZG91dC9zdGRlcnIgYW5kIGNoYW5nZXMgdmVyYm9zaXR5IGZpbHRlcmluZykuIEZvciB0aGUgcmFyZXJcbiAgICogY2FzZSBvZiBvdmVycmlkaW5nIG9ubHkgdGhlIGxldmVsLCB1c2UgYG9uYC9gb25jZWAgcmV0dXJuaW5nIGB7IGxldmVsIH1gLlxuICAgKlxuICAgKiBTeW50YWN0aWMgc3VnYXIgZm9yIGFuIGBvbmAgbGlzdGVuZXIgdGhhdCByZXR1cm5zIGB7IG1lc3NhZ2UsIGxldmVsPyB9YC5cbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgZm9ybWF0dGVyIGFnYWluLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0LnJld3JpdGUoSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIChtc2cpID0+XG4gICAqICAgc2VyaWFsaXplU3RydWN0dXJlKG1zZy5kYXRhLnN0YWNrcywgdHJ1ZSkpO1xuICAgKi9cbiAgcHVibGljIHJld3JpdGU8VD4oXG4gICAgY29kZTogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+LFxuICAgIGZvcm1hdHRlcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBzdHJpbmcsXG4gICAgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbCxcbiAgKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICByZXR1cm4gdGhpcy5vbihjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYHJld3JpdGVgLCBidXQgdGhlIGZvcm1hdHRlciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzXG4gICAqIGJlZW4gYXBwbGllZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIHJld3JpdGVPbmNlPFQ+KFxuICAgIGNvZGU6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PixcbiAgICBmb3JtYXR0ZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gc3RyaW5nLFxuICAgIGxldmVsPzogSW9NZXNzYWdlTGV2ZWwsXG4gICk6IERpc3Bvc2VMaXN0ZW5lciB7XG4gICAgcmV0dXJuIHRoaXMub25jZShjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIGEgcmVtb3ZlciBmb3IgaXQgKGNhbGxhYmxlIGFuZFxuICAgKiBgdXNpbmdgLWNvbXBhdGlibGUsIHNlZSBgRGlzcG9zZUxpc3RlbmVyYCkuXG4gICAqL1xuICBwcml2YXRlIGFkZE1lc3NhZ2VMaXN0ZW5lcihsaXN0ZW5lcjogTWVzc2FnZUxpc3RlbmVyKTogRGlzcG9zZUxpc3RlbmVyIHtcbiAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gZGlzcG9zZUxpc3RlbmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5tZXNzYWdlTGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGV2ZXJ5IHJlZ2lzdGVyZWQgbGlzdGVuZXIgdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLCBpbiByZWdpc3RyYXRpb25cbiAgICogb3JkZXIuIEEgbGlzdGVuZXIgbWF0Y2hlcyBieSBpdHMgY29kZSAobWFrZXIpIG9yIGl0cyBjdXN0b20gcHJlZGljYXRlLlxuICAgKlxuICAgKiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dCwgbGV2ZWwsIGFuZC9vciBhY3Rpb24gKHBhc3NlZCBvbiB0b1xuICAgKiBzdWJzZXF1ZW50IGxpc3RlbmVycyBhbmQgdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lKSwgcHJldmVudCB0aGUgZGVmYXVsdFxuICAgKiBwcm9jZXNzaW5nLCBvciAoZm9yIHJlcXVlc3RzKSBhbnN3ZXIgaXQuIGBvbmNlYCBsaXN0ZW5lcnMgYXJlIHJlbW92ZWQgYWZ0ZXJcbiAgICogdGhleSBoYXZlIHJ1bi4gTWF0Y2hpbmcgaXMgZGVjaWRlZCBhZ2FpbnN0IHRoZSBtZXNzYWdlIGFzIGVtaXR0ZWQsIHNvIGFcbiAgICogdHJhbnNmb3JtYXRpb24gYnkgYW4gZWFybGllciBsaXN0ZW5lciBkb2VzIG5vdCBjaGFuZ2Ugd2hpY2ggbGF0ZXIgbGlzdGVuZXJzXG4gICAqIGFwcGx5LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSAocG9zc2libHkgdXBkYXRlZCkgbWVzc2FnZSwgd2hldGhlciB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIHdhc1xuICAgKiBwcmV2ZW50ZWQsIGFuZCB3aGV0aGVyIGEgbGlzdGVuZXIgYW5zd2VyZWQgdGhlIHJlcXVlc3QgKGFuZCB3aXRoIHdoYXQpLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhcHBseU1lc3NhZ2VMaXN0ZW5lcnM8VCBleHRlbmRzIElvTWVzc2FnZTx1bmtub3duPj4obXNnOiBUKTogUHJvbWlzZTx7XG4gICAgbWVzc2FnZTogVDtcbiAgICBwcmV2ZW50RGVmYXVsdDogYm9vbGVhbjtcbiAgICByZXNwb25kZWQ6IGJvb2xlYW47XG4gIH0+IHtcbiAgICBsZXQgY3VycmVudCA9IG1zZztcbiAgICBsZXQgcHJldmVudERlZmF1bHQgPSBmYWxzZTtcbiAgICBsZXQgcmVzcG9uZGVkID0gZmFsc2U7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGEgY29weSBzbyB0aGF0IGBvbmNlYCBsaXN0ZW5lcnMgY2FuIHJlbW92ZSB0aGVtc2VsdmVzIHNhZmVseS5cbiAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi50aGlzLm1lc3NhZ2VMaXN0ZW5lcnNdKSB7XG4gICAgICAvLyBNYXRjaCBhZ2FpbnN0IHRoZSBlbWl0dGVkIG1lc3NhZ2U7IGEgbGlzdGVuZXIgcmVjZWl2ZXMgdGhlIGN1bXVsYXRpdmVseVxuICAgICAgLy8gdHJhbnNmb3JtZWQgYGN1cnJlbnRgIG1lc3NhZ2UuXG4gICAgICBpZiAoIWxpc3RlbmVyLm1hdGNoZXMobXNnKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuZXJzIG1heSBiZSBhc3luYzsgYXdhaXQgZWFjaCBvbmUgYmVmb3JlIHJ1bm5pbmcgdGhlIG5leHQgc28gdGhlXG4gICAgICAvLyBjdW11bGF0aXZlIGVmZmVjdCBvbiB0aGUgbWVzc2FnZSBzdGF5cyBvcmRlci1kZXRlcm1pbmlzdGljLlxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbGlzdGVuZXIuZm4oY3VycmVudCk7XG5cbiAgICAgIGlmIChsaXN0ZW5lci5vbmNlKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgaWYgKHJlc3VsdC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBtZXNzYWdlOiByZXN1bHQubWVzc2FnZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQubGV2ZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGxldmVsOiByZXN1bHQubGV2ZWwgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmFjdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgYWN0aW9uOiByZXN1bHQuYWN0aW9uIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3Jlc3BvbmQnIGluIHJlc3VsdCAmJiAnZGVmYXVsdFJlc3BvbnNlJyBpbiBtc2cpIHtcbiAgICAgICAgICAvLyBGb2xkIHRoZSBhbnN3ZXIgaW50byB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIG1hcmsgaXRcbiAgICAgICAgICAvLyBhbnN3ZXJlZCwgc28gd2Ugc2tpcCBwcm9tcHRpbmcgYW5kIHJlc29sdmUgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGRlZmF1bHRSZXNwb25zZTogcmVzdWx0LnJlc3BvbmQgfTtcbiAgICAgICAgICByZXNwb25kZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWVzc2FnZTogY3VycmVudCwgcHJldmVudERlZmF1bHQsIHJlc3BvbmRlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHRoZSBob3N0IG9mIGEgbWVzc2FnZS5cbiAgICogVGhlIGNhbGxlciB3YWl0cyB1bnRpbCB0aGUgbm90aWZpY2F0aW9uIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBub3RpZnkobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1heWJlRW1pdFRlbGVtZXRyeShtc2cpO1xuXG4gICAgLy8gUnVuIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4gQSBsaXN0ZW5lciBtYXkgdXBkYXRlIHRoZSBtZXNzYWdlIHRleHQsXG4gICAgLy8gbGV2ZWwsIGFuZC9vciBhY3Rpb24gb3IgcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIChlLmcuXG4gICAgLy8gc3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgYXJlIHJvdXRlZCB0byB0aGUgYWN0aXZpdHkgcHJpbnRlciBhbmQgbm90XG4gICAgLy8gd3JpdHRlbiB0byBhIHN0cmVhbSkuXG4gICAgLy9cbiAgICAvLyBTa2lwIHRoaXMgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlczogdGhlIGxpc3RlbmVycyBhbHJlYWR5IHJhbiBvblxuICAgIC8vIHRoZSBmaXJzdCBwYXNzLCBhbmQgcnVubmluZyB0aGVtIGFnYWluIHdvdWxkIHJlLXRyYW5zZm9ybSBhblxuICAgIC8vIGFscmVhZHktdHJhbnNmb3JtZWQgbWVzc2FnZS5cbiAgICBjb25zdCB7IG1lc3NhZ2UsIHByZXZlbnREZWZhdWx0IH0gPSB0aGlzLmNvcmtSZXBsYXlpbmdcbiAgICAgID8geyBtZXNzYWdlOiBtc2csIHByZXZlbnREZWZhdWx0OiBmYWxzZSB9XG4gICAgICA6IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICAvLyBUZWxsIG9ic2VydmVycyBob3cgdGhpcyBtZXNzYWdlIHdhcyBoYW5kbGVkIChpdHMgZWZmZWN0aXZlIGZvcm0gYW5kXG4gICAgLy8gd2hldGhlciBpdCB3YXMgZHJvcHBlZCkuIFNraXBwZWQgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlcyBzbyBlYWNoXG4gICAgLy8gbWVzc2FnZSBpcyBvYnNlcnZlZCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKCF0aGlzLmNvcmtSZXBsYXlpbmcpIHtcbiAgICAgIHRoaXMubm90aWZ5T2JzZXJ2ZXJzKHsgdHlwZTogJ25vdGlmeScsIGVtaXR0ZWQ6IG1zZywgZWZmZWN0aXZlOiBtZXNzYWdlLCBkcm9wcGVkOiBwcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgZXZlcnkgcmVnaXN0ZXJlZCBtZXNzYWdlIG9ic2VydmVyIG9mIGhvdyBhIG1lc3NhZ2Ugb3IgcmVxdWVzdCB3YXNcbiAgICogaGFuZGxlZC4gQSBuby1vcCB3aGVuIG5vdGhpbmcgaXMgb2JzZXJ2aW5nIChpLmUuIG91dHNpZGUgb2YgdGVzdHMpLCBzbyB0aGVcbiAgICogc3Vycm91bmRpbmcgaG90IHBhdGhzIHBheSBub3RoaW5nIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeU9ic2VydmVycyhvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlT2JzZXJ2ZXJzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMpIHtcbiAgICAgIG9ic2VydmVyKG9ic2VydmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSAoYWxyZWFkeSBsaXN0ZW5lci1wcm9jZXNzZWQpIG1lc3NhZ2UgdG8gaXRzIHRhcmdldCBzdHJlYW0sIGhvbm9yaW5nXG4gICAqIHRoZSBsb2cgbGV2ZWwgYW5kIGNvcmtlZC1sb2dnaW5nIGJ1ZmZlci4gU2hhcmVkIGJ5IGBub3RpZnlgIGFuZCB0aGVcbiAgICogbm9uLXByb21wdGluZyBgcmVxdWVzdFJlc3BvbnNlYCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZU1lc3NhZ2UobWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCFpc01lc3NhZ2VSZWxldmFudEZvckxldmVsKG1lc3NhZ2UsIHRoaXMubG9nTGV2ZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA+IDApIHtcbiAgICAgIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlci5wdXNoKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuZm9ybWF0TWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnNlbGVjdFN0cmVhbShtZXNzYWdlKTtcbiAgICBzdHJlYW0/LndyaXRlKG91dHB1dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlRW1pdFRlbGVtZXRyeShtc2c6IElvTWVzc2FnZTx1bmtub3duPikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZWxlbWV0cnlFdmVudCA9IGV2ZW50RnJvbU1lc3NhZ2UobXNnKTtcbiAgICAgIGlmICh0ZWxlbWV0cnlFdmVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRlbGVtZXRyeT8uZW1pdCh0ZWxlbWV0cnlFdmVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLmRlZmF1bHRzLnRyYWNlKGBFbWl0IFRlbGVtZXRyeSBGYWlsZWQgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIHRvIHRoZSBhY3Rpdml0eSBwcmludGVyIChwcm9ncmVzcyBiYXIgb3JcbiAgICogZXZlbnQgbGlzdCkgcmF0aGVyIHRoYW4gd3JpdGluZyB0aGVtIHRvIGEgc3RyZWFtLlxuICAgKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBsaXN0ZW5lcnMgdGhhdCBoYW5kbGUgdGhlIG1lc3NhZ2UgdmlhIHRoZSBwcmludGVyIGFuZFxuICAgKiBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcsIHNvIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBkb2VzIG5vdCBhbHNvXG4gICAqIGVtaXQgdGhlbS4gVGhlIHByaW50ZXIgaXMgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZpcnN0IHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpIHtcbiAgICBjb25zdCByb3V0ZSA9IChtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdCA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWN0aXZpdHlQcmludGVyKSB7XG4gICAgICAgIHRoaXMuYWN0aXZpdHlQcmludGVyID0gdGhpcy5tYWtlQWN0aXZpdHlQcmludGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2aXR5UHJpbnRlci5ub3RpZnkobXNnKTtcbiAgICAgIHJldHVybiB7IHByZXZlbnREZWZhdWx0OiB0cnVlIH07IC8vIGhhbmRsZWQgYnkgdGhlIHByaW50ZXI7IGRvbid0IGFsc28gd3JpdGUgdG8gYSBzdHJlYW1cbiAgICB9O1xuXG4gICAgLy8gQSBzaW5nbGUgaW50ZXJuYWwgbGlzdGVuZXIgKHNvIGl0IHN1cnZpdmVzIGByZW1vdmVBbGxMaXN0ZW5lcnMoKWAgYW5kIHRoZVxuICAgIC8vIGhvc3Qga2VlcHMgcm91dGluZyBzdGFjayBhY3Rpdml0eSkgbWF0Y2hpbmcgYW55IG9mIHRoZSBhY3Rpdml0eSBjb2Rlcy5cbiAgICB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7XG4gICAgICBvbmNlOiBmYWxzZSxcbiAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgZm46IHJvdXRlLFxuICAgICAgbWF0Y2hlczogbWF0Y2hBbnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDEsIElPLkNES19UT09MS0lUX0k1NTAyLCBJTy5DREtfVE9PTEtJVF9JNTUwMyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHNwZWNpYWwgbWVzc2FnZXMgZW5jb2RlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZXkgcmVxdWlyZSBhcHByb3ZhbFxuICAgKi9cbiAgcHJpdmF0ZSBza2lwQXBwcm92YWxTdGVwKG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFwcHJvdmFsVG9vbGtpdENvZGVzID0gWydDREtfVE9PTEtJVF9JNTA2MCddO1xuICAgIGlmICghKG1zZy5jb2RlICYmIGFwcHJvdmFsVG9vbGtpdENvZGVzLmluY2x1ZGVzKG1zZy5jb2RlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMucmVxdWlyZURlcGxveUFwcHJvdmFsKSB7XG4gICAgICAvLyBOZXZlciByZXF1aXJlIGFwcHJvdmFsXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5ORVZFUjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAvLyBBbHdheXMgcmVxdWlyZSBhcHByb3ZhbFxuICAgICAgY2FzZSBSZXF1aXJlQXBwcm92YWwuQU5ZQ0hBTkdFOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBSZXF1aXJlIGFwcHJvdmFsIGlmIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuaW5nIHBlcm1pc3Npb25zXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HOlxuICAgICAgICByZXR1cm4gWydub25lJywgJ25vbi1icm9hZGVuaW5nJ10uaW5jbHVkZXMobXNnLmRhdGE/LnBlcm1pc3Npb25DaGFuZ2VUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IHN0cmVhbSwgYmFzZWQgb24gbWVzc2FnZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0U3RyZWFtKG1zZzogSW9NZXNzYWdlPGFueT4pOiBOb2RlSlMuV3JpdGVTdHJlYW0gfCB1bmRlZmluZWQge1xuICAgIGlmIChpc05vdGljZXNNZXNzYWdlKG1zZykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRTdHJlYW1PYmplY3QodGhpcy5ub3RpY2VzRGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbChtc2cubGV2ZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG91dHB1dCBzdHJlYW0sIGJhc2VkIG9uIG1lc3NhZ2UgbGV2ZWwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdFN0cmVhbUZyb21MZXZlbChsZXZlbDogSW9NZXNzYWdlTGV2ZWwpOiBOb2RlSlMuV3JpdGVTdHJlYW0ge1xuICAgIC8vIFRoZSBzdHJlYW0gc2VsZWN0aW9uIHBvbGljeSBmb3IgdGhlIENMSSBpcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vXG4gICAgLy8gICAoMSkgTWVzc2FnZXMgb2YgbGV2ZWwgYHJlc3VsdGAgYWx3YXlzIGdvIHRvIGBzdGRvdXRgXG4gICAgLy8gICAoMikgTWVzc2FnZXMgb2YgbGV2ZWwgYGVycm9yYCBhbHdheXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2EpIEFsbCByZW1haW5pbmcgbWVzc2FnZXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2IpIElmIHdlIGFyZSBpbiBDSSBtb2RlLCBhbGwgcmVtYWluaW5nIG1lc3NhZ2VzIGdvIHRvIGBzdGRvdXRgLlxuICAgIC8vXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5pc0NJID8gcHJvY2Vzcy5zdGRvdXQgOiBwcm9jZXNzLnN0ZGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlIHRoYXQgcmVxdWlyZXMgYSByZXNwb25zZS5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMgcnVuIGZpcnN0OiBhIGxpc3RlbmVyIG1heSByZXdvcmQgdGhlIHF1ZXN0aW9uIChpdHMgdGV4dFxuICAgKiBvciBsZXZlbCkgb3IgYW5zd2VyIGl0IG91dHJpZ2h0IHZpYSBgcmVzcG9uZGAgKGUuZy4gYC0tZm9yY2VgIGF1dG8tY29uZmlybXNcbiAgICogYSBkZXN0cm95KS4gSWYgbm8gbGlzdGVuZXIgYW5zd2VycyBhbmQgdGhlIGhvc3QgY2Fubm90IHByb21wdCwgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHJlc3BvbnNlIGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBMaXN0ZW5lcnMgcnVuIGV4YWN0bHkgb25jZSBoZXJlIChzbyB3ZSBkb24ndCBnbyBiYWNrIHRocm91Z2ggYG5vdGlmeWApOlxuICAgIC8vIHRoZXkgbWF5IGFuc3dlciB0aGUgcmVxdWVzdCwgb3IgcmV3b3JkL3JlbGV2ZWwvcmV0YWcgdGhlIHF1ZXN0aW9uIHNob3duIGJlbG93LlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ubGlzdGVuZXJSZXN1bHQgfSA9IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlcXVlc3QobWVzc2FnZSwgbGlzdGVuZXJSZXN1bHQpO1xuXG4gICAgLy8gVGVsbCBvYnNlcnZlcnMgaG93IHRoaXMgcmVxdWVzdCB3YXMgaGFuZGxlZDogdGhlIGVmZmVjdGl2ZSAocG9zc2libHkgcmV3b3JkZWQpIHF1ZXN0aW9uXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlZCByZXNwb25zZS4gV2hlbiBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IHdpdGggdGhlIHF1ZXN0aW9uIHN1cHByZXNzZWRcbiAgICAvLyAoYHByZXZlbnREZWZhdWx0YCwgZS5nLiBgLS1mb3JjZWAgYXV0by1jb25maXJtKSwgaXQgaXMgcmVwb3J0ZWQgYXMgYGRyb3BwZWRgIHNpbmNlIHRoZSB1c2VyIG5ldmVyIHNhdyBpdC5cbiAgICB0aGlzLm5vdGlmeU9ic2VydmVycyh7IHR5cGU6ICdyZXF1ZXN0JywgZW1pdHRlZDogbXNnLCBlZmZlY3RpdmU6IG1lc3NhZ2UsIGRyb3BwZWQ6IGxpc3RlbmVyUmVzdWx0LnByZXZlbnREZWZhdWx0IH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSByZXF1ZXN0IHRvIGl0cyByZXNwb25zZTogYSBsaXN0ZW5lcidzIGFuc3dlciBpZiBvbmUgd2FzIGdpdmVuLFxuICAgKiBvdGhlcndpc2UgdGhlIGFuc3dlciBwcm9tcHRlZCBmcm9tIHRoZSB1c2VyLCBvdGhlcndpc2UgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHdoZW4gdGhlIGhvc3QgY2Fubm90IHByb21wdC5cbiAgICpcbiAgICogS2VwdCBzZXBhcmF0ZSBmcm9tIGByZXF1ZXN0UmVzcG9uc2VgIHNvIHRoZSByZXNwb25zZSBjYW4gYmUgb2JzZXJ2ZWQgaW4gYVxuICAgKiBzaW5nbGUgcGxhY2UgcmVnYXJkbGVzcyBvZiB3aGljaCBvZiB0aGVzZSBwYXRocyBwcm9kdWNlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4oXG4gICAgbXNnOiBJb1JlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4sXG4gICAgbGlzdGVuZXJSZXN1bHQ6IHsgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHJlc3BvbmRlZDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFJlc3BvbnNlVHlwZT4ge1xuICAgIC8vIHN0b3AgcHJvY2Vzc2luZywgYSBsaXN0ZW5lciBoYXMgdGFrZW4gY2FyZSBvZiBpdFxuICAgIGlmIChsaXN0ZW5lclJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBsaXN0ZW5lciBwcm92aWRlZCBhIHJlc3BvbnNlLCB3ZSBza2lwIGludGVyYWN0aW9uXG4gICAgaWYgKCFpc1Byb21wdGFibGVSZXF1ZXN0KG1zZykgfHwgbGlzdGVuZXJSZXN1bHQucmVzcG9uZGVkKSB7XG4gICAgICB0aGlzLndyaXRlTWVzc2FnZShtc2cpO1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0+IHtcbiAgICAgIC8vIHByZXBhcmUgcHJvbXB0IGRhdGFcbiAgICAgIC8vIEB0b2RvIHRoaXMgZm9ybWF0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCBwcm9iYWJseSBzaG91bGQgYmVcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgbW90aXZhdGlvbj86IHN0cmluZztcbiAgICAgICAgY29uY3VycmVuY3k/OiBudW1iZXI7XG4gICAgICAgIHJlc3BvbnNlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICB9ID0gbXNnLmRhdGEgPz8ge307XG5cbiAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSBkYXRhLm1vdGl2YXRpb24gPz8gJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJztcbiAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gZGF0YS5jb25jdXJyZW5jeSA/PyAwO1xuICAgICAgY29uc3QgcmVzcG9uc2VEZXNjcmlwdGlvbiA9IGRhdGEucmVzcG9uc2VEZXNjcmlwdGlvbjtcblxuICAgICAgLy8gU3BlY2lhbCBhcHByb3ZhbCBwcm9tcHRcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWVzc2FnZSBuZWVkcyBhcHByb3ZhbC4gSWYgaXQgZG9lcywgY29udGludWUgKGl0IGlzIGEgYmFzaWMgY29uZmlybWF0aW9uIHByb21wdClcbiAgICAgIC8vIElmIGl0IGRvZXMgbm90LCByZXR1cm4gc3VjY2VzcyAodHJ1ZSkuIFdlIG9ubHkgY2hlY2sgbWVzc2FnZXMgd2l0aCBjb2RlcyB0aGF0IHdlIGFyZSBhd2FyZVxuICAgICAgLy8gYXJlIHJlcXVpcmVzIGFwcHJvdmFsIGNvZGVzLlxuICAgICAgaWYgKHRoaXMuc2tpcEFwcHJvdmFsU3RlcChtc2cpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiAtLXllcyBtb2RlLCByZXNwb25kIGZvciB0aGUgdXNlciBpZiB3ZSBjYW5cbiAgICAgIGlmICh0aGlzLmF1dG9SZXNwb25kKSB7XG4gICAgICAgIC8vIHJlc3BvbmQgd2l0aCB5ZXMgdG8gYWxsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tc2csXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKGF1dG8tY29uZmlybWVkKWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgZm9yIGFsbCBvdGhlciBtZXNzYWdlc1xuICAgICAgICBpZiAobXNnLmRlZmF1bHRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy53cml0ZU1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9IChhdXRvLXJlc3BvbmRlZCB3aXRoIGRlZmF1bHQ6ICR7dXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSl9KWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0YWxrIHRvIHVzZXIgaWYgU1RESU4gaXMgYSB0ZXJtaW5hbCAob3RoZXJ3aXNlLCBmYWlsKVxuICAgICAgaWYgKCF0aGlzLmlzVFRZKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1R0eU5vdEF0dGFjaGVkJywgYCR7bW90aXZhdGlvbn0sIGJ1dCB0ZXJtaW5hbCAoVFRZKSBpcyBub3QgYXR0YWNoZWQgc28gd2UgYXJlIHVuYWJsZSB0byBnZXQgYSBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcmApO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHRhbGsgdG8gdXNlciBpZiBjb25jdXJyZW5jeSBpcyAxIChvdGhlcndpc2UsIGZhaWwpXG4gICAgICBpZiAoY29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmN1cnJlbmN5Q29uZmxpY3QnLCBgJHttb3RpdmF0aW9ufSwgYnV0IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAxIHNvIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzaWMgY29uZmlybWF0aW9uIHByb21wdFxuICAgICAgLy8gV2UgdHJlYXQgYWxsIHJlcXVlc3RzIHdpdGggYSBib29sZWFuIHJlc3BvbnNlIGFzIGNvbmZpcm1hdGlvbiBwcm9tcHRzXG4gICAgICAvLyBUaGUgSW9Ib3N0IG5ldmVyIGFib3J0cyBvbiBhIFwibm9cIjogaXQgcmV0dXJucyB0aGUgYW5zd2VyIGFuZCBsZXRzIHRoZVxuICAgICAgLy8gY2FsbGluZyBhY3Rpb24gZGVjaWRlIHdoYXQgdG8gZG8gKHNvIGFib3J0IGhhbmRsaW5nIGlzIGNvbnNpc3RlbnRcbiAgICAgIC8vIGFjcm9zcyBhY3Rpb25zKS5cbiAgICAgIGlmIChpc0NvbmZpcm1hdGlvblByb21wdChtc2cpKSB7XG4gICAgICAgIHJldHVybiBwcm9tcHRseS5jb25maXJtKGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoeS9uKWApO1xuICAgICAgfVxuXG4gICAgICAvLyBBc2tpbmcgZm9yIGEgc3BlY2lmaWMgdmFsdWVcbiAgICAgIGNvbnN0IHByb21wdCA9IGV4dHJhY3RQcm9tcHRJbmZvKG1zZyk7XG4gICAgICBjb25zdCBkZXNjID0gcmVzcG9uc2VEZXNjcmlwdGlvbiA/PyBwcm9tcHQuZGVmYXVsdDtcbiAgICAgIGNvbnN0IGFuc3dlciA9IGF3YWl0IHByb21wdGx5LnByb21wdChgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0ke2Rlc2MgPyBgICgke2Rlc2N9KWAgOiAnJ31gLCB7XG4gICAgICAgIGRlZmF1bHQ6IHByb21wdC5kZWZhdWx0LFxuICAgICAgICB0cmltOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gcHJvbXB0LmNvbnZlcnRBbnN3ZXIoYW5zd2VyKTtcbiAgICB9KTtcblxuICAgIC8vIFdlIG5lZWQgdG8gY2FzdCB0aGlzIGJlY2F1c2UgaXQgaXMgaW1wb3NzaWJsZSB0byBuYXJyb3cgdGhlIGdlbmVyaWMgdHlwZVxuICAgIC8vIGlzUHJvbXB0YWJsZVJlcXVlc3QgZW5zdXJlcyB0aGF0IHRoZSByZXNwb25zZSB0eXBlIGlzIG9uZSB3ZSBjYW4gcHJvbXB0IGZvclxuICAgIC8vIHRoZSByZW1haW5pbmcgY29kZSBlbnN1cmUgd2UgYXJlIGluZGVlZCByZXR1cm5pbmcgdGhlIGNvcnJlY3QgdHlwZVxuICAgIHJldHVybiByZXNwb25zZSBhcyBSZXNwb25zZVR5cGU7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBhIG1lc3NhZ2UgZm9yIGNvbnNvbGUgb3V0cHV0IHdpdGggb3B0aW9uYWwgY29sb3Igc3VwcG9ydFxuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogc3RyaW5nIHtcbiAgICAvLyBhcHBseSBwcm92aWRlZCBzdHlsZSBvciBhIGRlZmF1bHQgc3R5bGUgaWYgd2UncmUgaW4gVFRZIG1vZGVcbiAgICBsZXQgbWVzc2FnZV90ZXh0O1xuICAgIGlmIChtc2cuY29kZSA9PT0gJ0NES19UT09MS0lUX0U5NjAwJykge1xuICAgICAgLy8gTWVzc2FnZSBpcyBwcmUtc3R5bGVkXG4gICAgICBtZXNzYWdlX3RleHQgPSBtc2cubWVzc2FnZTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZV90ZXh0ID0gdGhpcy5pc1RUWVxuICAgICAgICA/IHN0eWxlTWFwW21zZy5sZXZlbF0obXNnLm1lc3NhZ2UpXG4gICAgICAgIDogbXNnLm1lc3NhZ2U7XG4gICAgfVxuXG4gICAgLy8gcHJlcGVuZCB0aW1lc3RhbXAgaWYgSW9NZXNzYWdlTGV2ZWwgaXMgREVCVUcgb3IgVFJBQ0UuIFBvc3RwZW5kIGEgbmV3bGluZS5cbiAgICByZXR1cm4gKChtc2cubGV2ZWwgPT09ICdkZWJ1ZycgfHwgbXNnLmxldmVsID09PSAndHJhY2UnKVxuICAgICAgPyBgWyR7dGhpcy5mb3JtYXRUaW1lKG1zZy50aW1lKX1dICR7bWVzc2FnZV90ZXh0fWBcbiAgICAgIDogbWVzc2FnZV90ZXh0KSArICdcXG4nO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgZGF0ZSB0byBISDpNTTpTU1xuICAgKi9cbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhZCA9IChuOiBudW1iZXIpOiBzdHJpbmcgPT4gbi50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke3BhZChkLmdldEhvdXJzKCkpfToke3BhZChkLmdldE1pbnV0ZXMoKSl9OiR7cGFkKGQuZ2V0U2Vjb25kcygpKX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhbiBpbnN0YW5jZSBvZiB0aGUgQWN0aXZpdHlQcmludGVyXG4gICAqL1xuICBwcml2YXRlIG1ha2VBY3Rpdml0eVByaW50ZXIoKSB7XG4gICAgY29uc3QgcHJvcHM6IEFjdGl2aXR5UHJpbnRlclByb3BzID0ge1xuICAgICAgc3RyZWFtOiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbCgnaW5mbycpLFxuICAgIH07XG5cbiAgICBzd2l0Y2ggKHRoaXMuc3RhY2tQcm9ncmVzcykge1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTOlxuICAgICAgICByZXR1cm4gbmV3IEhpc3RvcnlBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSOlxuICAgICAgICByZXR1cm4gbmV3IEN1cnJlbnRBY3Rpdml0eVByaW50ZXIocHJvcHMpO1xuICAgICAgY2FzZSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVJST1JTX09OTFk6XG4gICAgICAgIHJldHVybiBuZXcgRXJyb3JzT25seUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGBNZXNzYWdlU2VsZWN0b3JgIGludG8gYSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBsaXN0ZW5lclxuICogYXBwbGllcyB0byBhIG1lc3NhZ2UuIEEgbWFrZXIgbWF0Y2hlcyBtZXNzYWdlcyBjYXJyeWluZyBpdHMgYGNvZGVgOyBhXG4gKiBwcmVkaWNhdGUgKGUuZy4gYSBtYWtlcidzIGAuaXNgLCBvciBhbnkgYChtc2cpID0+IGJvb2xlYW5gKSBpcyB1c2VkIGFzLWlzLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlTWF0Y2hlcihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIGNvbnN0IHsgY29kZSB9ID0gc2VsZWN0b3I7XG4gIHJldHVybiAobXNnKSA9PiBtc2cuY29kZSA9PT0gY29kZTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHNldmVyYWwgc2VsZWN0b3JzIGludG8gYSBzaW5nbGUgcHJlZGljYXRlIHRoYXQgbWF0Y2hlcyBhIG1lc3NhZ2Ugd2hlblxuICogKmFueSogb2YgdGhlbSBtYXRjaGVzLiBFYWNoIHNlbGVjdG9yIG1heSBiZSBhIG1ha2VyIChtYXRjaGVkIGJ5IGl0cyBgY29kZWApXG4gKiBvciBhIHByZWRpY2F0ZS5cbiAqXG4gKiBVc2VmdWwgZm9yIG9uZSBsaXN0ZW5lciB0aGF0IHNwYW5zIG11bHRpcGxlIGNvZGVzLCBlLmcuXG4gKiBgaW9Ib3N0Lm9uKG1hdGNoQW55KElPLkNES19UT09MS0lUX0k1NTAxLCBJTy5DREtfVE9PTEtJVF9JNTUwMiksIGxpc3RlbmVyKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEFueSguLi5zZWxlY3RvcnM6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+W10pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBjb25zdCBtYXRjaGVycyA9IHNlbGVjdG9ycy5tYXAobWVzc2FnZU1hdGNoZXIpO1xuICByZXR1cm4gKG1zZykgPT4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcykgPT4gbWF0Y2hlcyhtc2cpKTtcbn1cblxuLyoqXG4gKiBNZXRob2QgZGVjb3JhdG9yIHRoYXQgc3VwcHJlc3NlcyB0aGUgZ2l2ZW4gSW9Ib3N0IG1lc3NhZ2VzIGZvciB0aGUgZHVyYXRpb25cbiAqIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLlxuICpcbiAqIEJlZm9yZSB0aGUgbWV0aG9kIHJ1bnMsIGEgc2luZ2xlIGBwcmV2ZW50RGVmYXVsdGAgbGlzdGVuZXIgY292ZXJpbmcgYWxsXG4gKiBnaXZlbiBzZWxlY3RvcnMgaXMgcmVnaXN0ZXJlZCBvbiB0aGUgaW5zdGFuY2UncyBgaW9Ib3N0YDsgd2hlbiB0aGUgbWV0aG9kXG4gKiBzZXR0bGVzIChyZXR1cm5zIG9yIHRocm93cyksIGV4YWN0bHkgdGhhdCBsaXN0ZW5lciBpcyByZW1vdmVkIGFnYWluLiBUaGlzXG4gKiByZXBsYWNlcyB0aGUgbWFudWFsIHBhdHRlcm4gb2YgcmVnaXN0ZXJpbmcgZHJvcC1saXN0ZW5lcnMgYXQgdGhlIHRvcCBvZiBhXG4gKiBtZXRob2QgYW5kIGNsZWFuaW5nIHRoZW0gdXAgaW4gYSBgZmluYWxseWAsIGFuZCDigJQgdW5saWtlIGEgYmxhbmtldFxuICogYHJlbW92ZUFsbExpc3RlbmVycygpYCDigJQgaXQgZG9lcyBub3QgZGlzdHVyYiBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBlbHNld2hlcmUuXG4gKlxuICogVGhlIGRlY29yYXRlZCBtZXRob2QgbXVzdCBiZSBhc3luYyBhbmQgbGl2ZSBvbiBhIGNsYXNzIHdob3NlIGluc3RhbmNlcyBjYXJyeVxuICogdGhlIGBDbGlJb0hvc3RgIG9uIGFuIGBpb0hvc3RgIHByb3BlcnR5IChsaWtlIGBDZGtUb29sa2l0YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNsYXNzIENka1Rvb2xraXQge1xuICogICBcXEBzdXBwcmVzc01lc3NhZ2VzKElPLkNES19UT09MS0lUX0kxMDAxLCBJTy5DREtfVE9PTEtJVF9JMTAwMClcbiAqICAgcHVibGljIGFzeW5jIG1ldGFkYXRhKHN0YWNrTmFtZTogc3RyaW5nLCBqc29uOiBib29sZWFuKSB7XG4gKiAgICAgLy8gSTEwMDEvSTEwMDAgYXJlIGRyb3BwZWQgd2hpbGUgdGhpcyBydW5zXG4gKiAgIH1cbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1cHByZXNzTWVzc2FnZXMoLi4uc2VsZWN0b3JzOiBNZXNzYWdlU2VsZWN0b3I8YW55PltdKSB7XG4gIHJldHVybiBmdW5jdGlvbiA8QSBleHRlbmRzIGFueVtdLCBSPihcbiAgICBfdGFyZ2V0OiBvYmplY3QsXG4gICAgX3Byb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wsXG4gICAgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8KC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4+LFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgaWYgKCFvcmlnaW5hbCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignSW52YWxpZERlY29yYXRvclRhcmdldCcsICdzdXBwcmVzc01lc3NhZ2VzIGNhbiBvbmx5IGRlY29yYXRlIG1ldGhvZHMnKTtcbiAgICB9XG4gICAgZGVzY3JpcHRvci52YWx1ZSA9IGFzeW5jIGZ1bmN0aW9uICh0aGlzOiB7IHJlYWRvbmx5IGlvSG9zdDogQ2xpSW9Ib3N0IH0sIC4uLmFyZ3M6IEEpOiBQcm9taXNlPFI+IHtcbiAgICAgIHVzaW5nIF9zdXBwcmVzcyA9IHRoaXMuaW9Ib3N0Lm9uKG1hdGNoQW55KC4uLnNlbGVjdG9ycyksICgpID0+ICh7IHByZXZlbnREZWZhdWx0OiB0cnVlIH0pKTtcbiAgICAgIC8vIGByZXR1cm4gYXdhaXRgIChub3QgYSBiYXJlIGByZXR1cm5gKSBzbyB0aGUgbGlzdGVuZXIgaXMgb25seSBkaXNwb3NlZFxuICAgICAgLy8gYWZ0ZXIgdGhlIG1ldGhvZCBoYXMgYWN0dWFsbHkgc2V0dGxlZC5cbiAgICAgIHJldHVybiBhd2FpdCBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9O1xuICB9O1xufVxuXG4vKipcbiAqIFRoaXMgSW9Ib3N0IGltcGxlbWVudGF0aW9uIGNvbnNpZGVycyBhIHJlcXVlc3QgcHJvbXB0YWJsZSwgaWY6XG4gKiAtIGl0J3MgYSB5ZXMvbm8gY29uZmlybWF0aW9uXG4gKiAtIGFza2luZyBmb3IgYSBzdHJpbmcgb3IgbnVtYmVyIHZhbHVlXG4gKi9cbmZ1bmN0aW9uIGlzUHJvbXB0YWJsZVJlcXVlc3QobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+IHtcbiAgcmV0dXJuIGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZylcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ3N0cmluZydcbiAgICB8fCB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgdGhlIHJlcXVlc3QgaXMgYSBjb25maXJtYXRpb24gcHJvbXB0XG4gKiBXZSB0cmVhdCBhbGwgcmVxdWVzdHMgd2l0aCBhIGJvb2xlYW4gcmVzcG9uc2UgYXMgY29uZmlybWF0aW9uIHByb21wdHNcbiAqL1xuZnVuY3Rpb24gaXNDb25maXJtYXRpb25Qcm9tcHQobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogbXNnIGlzIElvUmVxdWVzdDxhbnksIGJvb2xlYW4+IHtcbiAgcmV0dXJuIHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnYm9vbGVhbic7XG59XG5cbi8qKlxuICogSGVscGVyIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24gZm9yIHByb21wdGx5IGZyb20gdGhlIHJlcXVlc3RcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFByb21wdEluZm8obXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KToge1xuICBkZWZhdWx0OiBzdHJpbmc7XG4gIGRlZmF1bHREZXNjOiBzdHJpbmc7XG4gIGNvbnZlcnRBbnN3ZXI6IChpbnB1dDogc3RyaW5nKSA9PiBzdHJpbmcgfCBudW1iZXI7XG59IHtcbiAgY29uc3QgaXNOdW1iZXIgPSAodHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdudW1iZXInKTtcbiAgY29uc3QgZGVmYXVsdFJlc3BvbnNlID0gdXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSk7XG4gIHJldHVybiB7XG4gICAgZGVmYXVsdDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGRlZmF1bHREZXNjOiAnZGVmYXVsdERlc2NyaXB0aW9uJyBpbiBtc2cgJiYgbXNnLmRlZmF1bHREZXNjcmlwdGlvbiA/IHV0aWwuZm9ybWF0KG1zZy5kZWZhdWx0RGVzY3JpcHRpb24pIDogZGVmYXVsdFJlc3BvbnNlLFxuICAgIGNvbnZlcnRBbnN3ZXI6IGlzTnVtYmVyID8gKHYpID0+IE51bWJlcih2KSA6ICh2KSA9PiBTdHJpbmcodiksXG4gIH07XG59XG5cbmNvbnN0IHN0eWxlTWFwOiBSZWNvcmQ8SW9NZXNzYWdlTGV2ZWwsIChzdHI6IHN0cmluZykgPT4gc3RyaW5nPiA9IHtcbiAgZXJyb3I6IGNoYWxrLnJlZCxcbiAgd2FybjogY2hhbGsueWVsbG93LFxuICByZXN1bHQ6IGNoYWxrLnJlc2V0LFxuICBpbmZvOiBjaGFsay5yZXNldCxcbiAgZGVidWc6IGNoYWxrLmdyYXksXG4gIHRyYWNlOiBjaGFsay5ncmF5LFxufTtcblxuZnVuY3Rpb24gdGFyZ2V0U3RyZWFtT2JqZWN0KHg6IFRhcmdldFN0cmVhbSk6IE5vZGVKUy5Xcml0ZVN0cmVhbSB8IHVuZGVmaW5lZCB7XG4gIHN3aXRjaCAoeCkge1xuICAgIGNhc2UgJ3N0ZGVycic6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgY2FzZSAnc3Rkb3V0JzpcbiAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dDtcbiAgICBjYXNlICdkcm9wJzpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOb3RpY2VzTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IG1zZyBpcyBJb01lc3NhZ2U8dm9pZD4ge1xuICByZXR1cm4gSU8uQ0RLX1RPT0xLSVRfSTAxMDAuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9XMDEwMS5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX0UwMTAxLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfSTAxMDEuaXMobXNnKTtcbn1cblxuZnVuY3Rpb24gZXZlbnRGcm9tTWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFRlbGVtZXRyeUV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTEwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnU1lOVEgnLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kyMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0lOVk9LRScsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTMwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnREVQTE9ZJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMzAwMy5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdBU1NFVCcsIG1zZyk7XG4gIH1cbiAgLy8gSG90c3dhcCBsaXZlcyBpbiB0aGUgY2RrLXRvb2xraXQgc28gaXQgY2Fubm90IGJlIGEgQ0RLX0NMSSBlcnJvciBjb2RlLlxuICAvLyBJbnN0ZWFkIHdlIHJldXNlIHRoZSBleGlzdGluZyBIb3Rzd2FwIHNwYW4uXG4gIGlmIChJTy5DREtfVE9PTEtJVF9JNTQxMC5pcyhtc2cpKSB7XG4gICAgLy8gQ3JlYXRlIGEgdGVsZW1ldHJ5LWNvbXBhdGlibGUgcmVzdWx0XG4gICAgcmV0dXJuIGhvdHN3YXBUb0V2ZW50UmVzdWx0KG1zZy5kYXRhKTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGV2ZW50UmVzdWx0KGV2ZW50VHlwZTogVGVsZW1ldHJ5RXZlbnRbJ2V2ZW50VHlwZSddLCBtOiBJb01lc3NhZ2U8RXZlbnRSZXN1bHQ+KTogVGVsZW1ldHJ5RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudFR5cGUsXG4gICAgICBkdXJhdGlvbjogbS5kYXRhLmR1cmF0aW9uLFxuICAgICAgZXJyb3I6IG0uZGF0YS5lcnJvcixcbiAgICAgIGNvdW50ZXJzOiBtLmRhdGEuY291bnRlcnMsXG4gICAgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBob3Rzd2FwVG9FdmVudFJlc3VsdChyZXN1bHQ6IEhvdHN3YXBSZXN1bHQpOiBUZWxlbWV0cnlFdmVudCB7XG4gIGNvbnN0IG5vbkhvdHN3YXBwYWJsZVJlc291cmNlczogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICBmb3IgKGNvbnN0IHsgc3ViamVjdCB9IG9mIHJlc3VsdC5ub25Ib3Rzd2FwcGFibGVDaGFuZ2VzKSB7XG4gICAgaWYgKCdyZXNvdXJjZVR5cGUnIGluIHN1YmplY3QpIHtcbiAgICAgIGNvbnN0IGtleXMgPSAncmVqZWN0ZWRQcm9wZXJ0aWVzJyBpbiBzdWJqZWN0ICYmIHN1YmplY3QucmVqZWN0ZWRQcm9wZXJ0aWVzXG4gICAgICAgID8gc3ViamVjdC5yZWplY3RlZFByb3BlcnRpZXMubWFwKHAgPT4gYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfSMke3B9YClcbiAgICAgICAgOiBbYGhvdHN3YXBGYWxsYmFjazoke3N1YmplY3QucmVzb3VyY2VUeXBlfWBdO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA9IChub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXNba2V5XSA/PyAwKSArIDE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBldmVudFR5cGU6ICdIT1RTV0FQJyBhcyBjb25zdCxcbiAgICBkdXJhdGlvbjogcmVzdWx0LmR1cmF0aW9uLFxuICAgIC4uLihyZXN1bHQuZXJyb3IgPyB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBuYW1lOiBjZGtDbGlFcnJvck5hbWUocmVzdWx0LmVycm9yKSxcbiAgICAgIH0sXG4gICAgfSA6IHt9KSxcbiAgICBjb3VudGVyczoge1xuICAgICAgaG90c3dhcHBlZDogcmVzdWx0LmhvdHN3YXBwZWQgPyAxIDogMCxcbiAgICAgIGhvdHN3YXBGYWxsYmFjazogcmVzdWx0LmhvdHN3YXBGYWxsYmFjayA/IDEgOiAwLFxuICAgICAgaG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0LmhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgbm9uSG90c3dhcHBhYmxlQ2hhbmdlczogcmVzdWx0Lm5vbkhvdHN3YXBwYWJsZUNoYW5nZXMubGVuZ3RoLFxuICAgICAgLi4ubm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
|
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
interface PrettyErrorPrinterOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Print the error as an expected outcome, for example when a user declined a confirmation prompt.
|
|
4
|
+
* While thrown as exceptions, these should visually not be presented as a crash.
|
|
5
|
+
*/
|
|
6
|
+
readonly soft: boolean;
|
|
7
|
+
/**
|
|
8
|
+
* Prints as much debug output as possible.
|
|
9
|
+
*/
|
|
10
|
+
readonly debug: boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare function prettyPrintError(error: unknown, options?: PrettyErrorPrinterOptions): void;
|
|
13
|
+
export {};
|