@aws-cdk/toolkit-lib 0.1.8 → 0.3.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/api-extractor.json +36 -0
- package/build-info.json +2 -2
- package/db.json.gz +0 -0
- package/lib/actions/bootstrap/index.d.ts +1 -1
- package/lib/actions/bootstrap/index.js +69 -5
- package/lib/actions/deploy/index.d.ts +1 -21
- package/lib/actions/deploy/index.js +1 -1
- package/lib/actions/deploy/private/deploy-options.d.ts +16 -4
- package/lib/actions/deploy/private/deploy-options.js +1 -1
- package/lib/actions/deploy/private/helpers.d.ts +3 -3
- package/lib/actions/deploy/private/helpers.js +5 -5
- package/lib/actions/destroy/index.d.ts +0 -6
- package/lib/actions/destroy/index.js +1 -1
- package/lib/actions/diff/index.d.ts +9 -1
- package/lib/actions/diff/index.js +1 -1
- package/lib/actions/diff/private/helpers.d.ts +19 -0
- package/lib/actions/diff/private/helpers.js +114 -1
- package/lib/actions/index.d.ts +1 -0
- package/lib/actions/index.js +2 -1
- package/lib/actions/refactor/index.d.ts +15 -0
- package/lib/actions/refactor/index.js +3 -0
- package/lib/actions/watch/index.d.ts +0 -14
- package/lib/actions/watch/index.js +1 -1
- package/lib/api/cloud-assembly/cached-source.d.ts +36 -0
- package/lib/api/cloud-assembly/cached-source.js +52 -0
- package/lib/api/cloud-assembly/index.d.ts +2 -1
- package/lib/api/cloud-assembly/index.js +5 -2
- package/lib/api/cloud-assembly/private/borrowed-assembly.d.ts +14 -0
- package/lib/api/cloud-assembly/private/borrowed-assembly.js +22 -0
- package/lib/api/cloud-assembly/private/context-aware-source.d.ts +19 -6
- package/lib/api/cloud-assembly/private/context-aware-source.js +29 -11
- package/lib/api/cloud-assembly/private/exec.js +5 -4
- package/lib/api/cloud-assembly/private/index.d.ts +0 -2
- package/lib/api/cloud-assembly/private/index.js +1 -3
- package/lib/api/cloud-assembly/private/prepare-source.d.ts +37 -8
- package/lib/api/cloud-assembly/private/prepare-source.js +79 -19
- package/lib/api/cloud-assembly/private/readable-assembly.d.ts +26 -0
- package/lib/api/cloud-assembly/private/readable-assembly.js +34 -0
- package/lib/api/cloud-assembly/private/source-builder.d.ts +27 -6
- package/lib/api/cloud-assembly/private/source-builder.js +143 -34
- package/lib/api/cloud-assembly/private/stack-assembly.d.ts +10 -5
- package/lib/api/cloud-assembly/private/stack-assembly.js +30 -12
- package/lib/api/cloud-assembly/source-builder.d.ts +6 -0
- package/lib/api/cloud-assembly/source-builder.js +1 -1
- package/lib/api/cloud-assembly/types.d.ts +32 -1
- package/lib/api/cloud-assembly/types.js +1 -1
- package/lib/api/shared-private.d.ts +4 -0
- package/lib/api/shared-private.js +11636 -52
- package/lib/api/shared-private.js.map +4 -4
- package/lib/api/shared-public.d.ts +295 -1394
- package/lib/api/shared-public.js +32 -923
- package/lib/api/shared-public.js.map +4 -4
- package/lib/index_bg.wasm +0 -0
- package/lib/private/util.js +35 -14
- package/lib/private/util.js.map +4 -4
- package/lib/toolkit/index.d.ts +2 -1
- package/lib/toolkit/index.js +3 -2
- package/lib/toolkit/non-interactive-io-host.d.ts +80 -0
- package/lib/toolkit/non-interactive-io-host.js +129 -0
- package/lib/toolkit/private/index.d.ts +5 -2
- package/lib/toolkit/private/index.js +7 -2
- package/lib/toolkit/toolkit.d.ts +54 -26
- package/lib/toolkit/toolkit.js +413 -282
- package/lib/toolkit/types.d.ts +163 -0
- package/lib/toolkit/types.js +3 -0
- package/lib/util/promises.d.ts +12 -0
- package/lib/util/promises.js +17 -0
- package/lib/util/shell-env.d.ts +10 -0
- package/lib/util/shell-env.js +19 -0
- package/package.json +17 -14
- package/tsconfig.dts.json +9 -0
- package/lib/api/aws-cdk.d.ts +0 -20
- package/lib/api/aws-cdk.js +0 -11041
- package/lib/api/aws-cdk.js.map +0 -7
- package/lib/api/cloud-assembly/private/cached-source.d.ts +0 -15
- package/lib/api/cloud-assembly/private/cached-source.js +0 -25
- package/lib/api/cloud-assembly/private/identity-source.d.ts +0 -10
- package/lib/api/cloud-assembly/private/identity-source.js +0 -17
package/lib/toolkit/toolkit.js
CHANGED
|
@@ -1,4 +1,56 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
3
|
+
if (value !== null && value !== void 0) {
|
|
4
|
+
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
5
|
+
var dispose, inner;
|
|
6
|
+
if (async) {
|
|
7
|
+
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
8
|
+
dispose = value[Symbol.asyncDispose];
|
|
9
|
+
}
|
|
10
|
+
if (dispose === void 0) {
|
|
11
|
+
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
12
|
+
dispose = value[Symbol.dispose];
|
|
13
|
+
if (async) inner = dispose;
|
|
14
|
+
}
|
|
15
|
+
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
16
|
+
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
17
|
+
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
18
|
+
}
|
|
19
|
+
else if (async) {
|
|
20
|
+
env.stack.push({ async: true });
|
|
21
|
+
}
|
|
22
|
+
return value;
|
|
23
|
+
};
|
|
24
|
+
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
25
|
+
return function (env) {
|
|
26
|
+
function fail(e) {
|
|
27
|
+
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
28
|
+
env.hasError = true;
|
|
29
|
+
}
|
|
30
|
+
var r, s = 0;
|
|
31
|
+
function next() {
|
|
32
|
+
while (r = env.stack.pop()) {
|
|
33
|
+
try {
|
|
34
|
+
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
35
|
+
if (r.dispose) {
|
|
36
|
+
var result = r.dispose.call(r.value);
|
|
37
|
+
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
38
|
+
}
|
|
39
|
+
else s |= 1;
|
|
40
|
+
}
|
|
41
|
+
catch (e) {
|
|
42
|
+
fail(e);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
46
|
+
if (env.hasError) throw env.error;
|
|
47
|
+
}
|
|
48
|
+
return next();
|
|
49
|
+
};
|
|
50
|
+
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
51
|
+
var e = new Error(message);
|
|
52
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
53
|
+
});
|
|
2
54
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
55
|
exports.Toolkit = void 0;
|
|
4
56
|
const path = require("node:path");
|
|
@@ -6,22 +58,20 @@ const cxapi = require("@aws-cdk/cx-api");
|
|
|
6
58
|
const chalk = require("chalk");
|
|
7
59
|
const chokidar = require("chokidar");
|
|
8
60
|
const fs = require("fs-extra");
|
|
9
|
-
const
|
|
61
|
+
const non_interactive_io_host_1 = require("./non-interactive-io-host");
|
|
10
62
|
const private_1 = require("./private");
|
|
11
63
|
const bootstrap_1 = require("../actions/bootstrap");
|
|
12
64
|
const deploy_1 = require("../actions/deploy");
|
|
13
65
|
const private_2 = require("../actions/deploy/private");
|
|
14
|
-
const diff_1 = require("../actions/diff");
|
|
15
66
|
const private_3 = require("../actions/diff/private");
|
|
16
67
|
const private_4 = require("../actions/watch/private");
|
|
17
|
-
const aws_cdk_1 = require("../api/aws-cdk");
|
|
18
68
|
const cloud_assembly_1 = require("../api/cloud-assembly");
|
|
19
69
|
const private_5 = require("../api/cloud-assembly/private");
|
|
20
70
|
const private_6 = require("../api/io/private");
|
|
21
71
|
const shared_private_1 = require("../api/shared-private");
|
|
22
|
-
const shared_public_1 = require("../api/shared-public");
|
|
23
72
|
const util_1 = require("../private/util");
|
|
24
73
|
const concurrency_1 = require("../util/concurrency");
|
|
74
|
+
const promises_1 = require("../util/promises");
|
|
25
75
|
/**
|
|
26
76
|
* The AWS CDK Programmatic Toolkit
|
|
27
77
|
*/
|
|
@@ -35,17 +85,15 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
35
85
|
* The IoHost of this Toolkit
|
|
36
86
|
*/
|
|
37
87
|
ioHost;
|
|
38
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Cache of the internal SDK Provider instance
|
|
90
|
+
*/
|
|
91
|
+
sdkProviderCache;
|
|
39
92
|
constructor(props = {}) {
|
|
40
93
|
super();
|
|
41
94
|
this.props = props;
|
|
42
|
-
this.toolkitStackName = props.toolkitStackName ??
|
|
43
|
-
|
|
44
|
-
const globalIoHost = aws_cdk_1.CliIoHost.instance();
|
|
45
|
-
if (props.ioHost) {
|
|
46
|
-
globalIoHost.registerIoHost(props.ioHost);
|
|
47
|
-
}
|
|
48
|
-
let ioHost = globalIoHost;
|
|
95
|
+
this.toolkitStackName = props.toolkitStackName ?? shared_private_1.DEFAULT_TOOLKIT_STACK_NAME;
|
|
96
|
+
let ioHost = props.ioHost ?? new non_interactive_io_host_1.NonInteractiveIoHost();
|
|
49
97
|
if (props.emojis === false) {
|
|
50
98
|
ioHost = (0, private_6.withoutEmojis)(ioHost);
|
|
51
99
|
}
|
|
@@ -56,27 +104,25 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
56
104
|
// This also removes newlines that we currently emit for CLI backwards compatibility.
|
|
57
105
|
this.ioHost = (0, private_6.withTrimmedWhitespace)(ioHost);
|
|
58
106
|
}
|
|
59
|
-
async dispose() {
|
|
60
|
-
// nothing to do yet
|
|
61
|
-
}
|
|
62
|
-
async [Symbol.asyncDispose]() {
|
|
63
|
-
await this.dispose();
|
|
64
|
-
}
|
|
65
107
|
/**
|
|
66
108
|
* Access to the AWS SDK
|
|
109
|
+
* @internal
|
|
67
110
|
*/
|
|
68
111
|
async sdkProvider(action) {
|
|
69
112
|
// @todo this needs to be different instance per action
|
|
70
|
-
if (!this.
|
|
71
|
-
|
|
113
|
+
if (!this.sdkProviderCache) {
|
|
114
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, action);
|
|
115
|
+
this.sdkProviderCache = await shared_private_1.SdkProvider.withAwsCliCompatibleDefaults({
|
|
72
116
|
...this.props.sdkConfig,
|
|
73
|
-
|
|
117
|
+
ioHelper,
|
|
118
|
+
logger: (0, private_6.asSdkLogger)(ioHelper),
|
|
74
119
|
});
|
|
75
120
|
}
|
|
76
|
-
return this.
|
|
121
|
+
return this.sdkProviderCache;
|
|
77
122
|
}
|
|
78
123
|
/**
|
|
79
124
|
* Helper to provide the CloudAssemblySourceBuilder with required toolkit services
|
|
125
|
+
* @internal
|
|
80
126
|
*/
|
|
81
127
|
async sourceBuilderServices() {
|
|
82
128
|
return {
|
|
@@ -94,7 +140,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
94
140
|
const bootstrapEnvironments = await environments.getEnvironments(this.ioHost);
|
|
95
141
|
const source = options.source ?? bootstrap_1.BootstrapSource.default();
|
|
96
142
|
const parameters = options.parameters;
|
|
97
|
-
const bootstrapper = new
|
|
143
|
+
const bootstrapper = new shared_private_1.Bootstrapper(source, ioHelper);
|
|
98
144
|
const sdkProvider = await this.sdkProvider('bootstrap');
|
|
99
145
|
const limit = (0, concurrency_1.pLimit)(20);
|
|
100
146
|
// eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
|
|
@@ -137,11 +183,15 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
137
183
|
}
|
|
138
184
|
/**
|
|
139
185
|
* Synth Action
|
|
186
|
+
*
|
|
187
|
+
* The caller assumes ownership of the `CachedCloudAssembly` and is responsible for calling `dispose()` on
|
|
188
|
+
* it after use.
|
|
140
189
|
*/
|
|
141
190
|
async synth(cx, options = {}) {
|
|
142
191
|
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'synth');
|
|
143
192
|
const selectStacks = options.stacks ?? private_5.ALL_STACKS;
|
|
144
193
|
const synthSpan = await ioHelper.span(private_6.SPAN.SYNTH_ASSEMBLY).begin({ stacks: selectStacks });
|
|
194
|
+
// NOTE: NOT 'await using' because we return ownership to the caller
|
|
145
195
|
const assembly = await (0, private_1.assemblyFromSource)(ioHelper, cx);
|
|
146
196
|
const stacks = await assembly.selectStacksV2(selectStacks);
|
|
147
197
|
const autoValidateStacks = options.validateStacks ? [assembly.selectStacksForValidation()] : [];
|
|
@@ -174,110 +224,37 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
174
224
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I1902.msg(chalk.green(message), assemblyData));
|
|
175
225
|
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_INFO.msg(`Supply a stack id (${stacks.stackArtifacts.map((s) => chalk.green(s.hierarchicalId)).join(', ')}) to display its template.`));
|
|
176
226
|
}
|
|
177
|
-
return new
|
|
227
|
+
return new cloud_assembly_1.CachedCloudAssembly(assembly);
|
|
178
228
|
}
|
|
179
229
|
/**
|
|
180
230
|
* Diff Action
|
|
181
231
|
*/
|
|
182
232
|
async diff(cx, options) {
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
const
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
}
|
|
203
|
-
if (!(await fs.pathExists(methodOptions.path))) {
|
|
204
|
-
throw new shared_public_1.ToolkitError(`There is no file at ${path}`);
|
|
205
|
-
}
|
|
206
|
-
const file = fs.readFileSync(methodOptions.path).toString();
|
|
207
|
-
const template = (0, util_1.deserializeStructure)(file);
|
|
208
|
-
const formatter = new shared_public_1.DiffFormatter({
|
|
209
|
-
ioHelper,
|
|
210
|
-
oldTemplate: template,
|
|
211
|
-
newTemplate: stacks.firstStack,
|
|
212
|
-
});
|
|
213
|
-
if (options.securityOnly) {
|
|
214
|
-
const securityDiff = formatter.formatSecurityDiff({
|
|
215
|
-
requireApproval: shared_public_1.RequireApproval.BROADENING,
|
|
216
|
-
});
|
|
217
|
-
formattedSecurityDiff = securityDiff.formattedDiff ?? '';
|
|
218
|
-
diffs = securityDiff.formattedDiff ? diffs + 1 : diffs;
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
const diff = formatter.formatStackDiff({
|
|
222
|
-
strict,
|
|
223
|
-
context: contextLines,
|
|
224
|
-
});
|
|
225
|
-
formattedStackDiff = diff.formattedDiff;
|
|
226
|
-
diffs = diff.numStacksWithChanges;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
const methodOptions = diffMethod.options;
|
|
231
|
-
// Compare N stacks against deployed templates
|
|
232
|
-
for (const stack of stacks.stackArtifacts) {
|
|
233
|
-
const templateWithNestedStacks = await deployments.readCurrentTemplateWithNestedStacks(stack, methodOptions.compareAgainstProcessedTemplate);
|
|
234
|
-
const currentTemplate = templateWithNestedStacks.deployedRootTemplate;
|
|
235
|
-
const nestedStacks = templateWithNestedStacks.nestedStacks;
|
|
236
|
-
const formatter = new shared_public_1.DiffFormatter({
|
|
233
|
+
const env_1 = { stack: [], error: void 0, hasError: false };
|
|
234
|
+
try {
|
|
235
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'diff');
|
|
236
|
+
const selectStacks = options.stacks ?? private_5.ALL_STACKS;
|
|
237
|
+
const synthSpan = await ioHelper.span(private_6.SPAN.SYNTH_ASSEMBLY).begin({ stacks: selectStacks });
|
|
238
|
+
const assembly = __addDisposableResource(env_1, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
239
|
+
const stacks = await assembly.selectStacksV2(selectStacks);
|
|
240
|
+
await synthSpan.end();
|
|
241
|
+
const diffSpan = await ioHelper.span(private_6.SPAN.DIFF_STACK).begin({ stacks: selectStacks });
|
|
242
|
+
const deployments = await this.deploymentsForAction('diff');
|
|
243
|
+
const strict = !!options.strict;
|
|
244
|
+
const contextLines = options.contextLines || 3;
|
|
245
|
+
let diffs = 0;
|
|
246
|
+
let formattedSecurityDiff = '';
|
|
247
|
+
let formattedStackDiff = '';
|
|
248
|
+
const templateInfos = await (0, private_3.makeTemplateInfos)(ioHelper, stacks, deployments, await this.sdkProvider('diff'), options);
|
|
249
|
+
const templateDiffs = {};
|
|
250
|
+
for (const templateInfo of templateInfos) {
|
|
251
|
+
const formatter = new shared_private_1.DiffFormatter({
|
|
237
252
|
ioHelper,
|
|
238
|
-
|
|
239
|
-
newTemplate: stack,
|
|
253
|
+
templateInfo,
|
|
240
254
|
});
|
|
241
|
-
const migrator = new aws_cdk_1.ResourceMigrator({ deployments, ioHelper });
|
|
242
|
-
const resourcesToImport = await migrator.tryGetResources(await deployments.resolveEnvironment(stack));
|
|
243
|
-
if (resourcesToImport) {
|
|
244
|
-
(0, shared_public_1.removeNonImportResources)(stack);
|
|
245
|
-
}
|
|
246
|
-
let changeSet = undefined;
|
|
247
|
-
if (diffMethod.method === 'change-set') {
|
|
248
|
-
let stackExists = false;
|
|
249
|
-
try {
|
|
250
|
-
stackExists = await deployments.stackExists({
|
|
251
|
-
stack,
|
|
252
|
-
deployName: stack.stackName,
|
|
253
|
-
tryLookupRole: true,
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
catch (e) {
|
|
257
|
-
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_DEBUG.msg(`Checking if the stack ${stack.stackName} exists before creating the changeset has failed, will base the diff on template differences.\n`));
|
|
258
|
-
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_DEBUG.msg((0, util_1.formatErrorMessage)(e)));
|
|
259
|
-
stackExists = false;
|
|
260
|
-
}
|
|
261
|
-
if (stackExists) {
|
|
262
|
-
changeSet = await (0, aws_cdk_1.createDiffChangeSet)(ioHelper, {
|
|
263
|
-
stack,
|
|
264
|
-
uuid: uuid.v4(),
|
|
265
|
-
deployments,
|
|
266
|
-
willExecute: false,
|
|
267
|
-
sdkProvider: await this.sdkProvider('diff'),
|
|
268
|
-
parameters: methodOptions.parameters ?? {},
|
|
269
|
-
resourcesToImport,
|
|
270
|
-
});
|
|
271
|
-
}
|
|
272
|
-
else {
|
|
273
|
-
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_DEBUG.msg(`the stack '${stack.stackName}' has not been deployed to CloudFormation or describeStacks call failed, skipping changeset creation.`));
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
255
|
if (options.securityOnly) {
|
|
277
256
|
const securityDiff = formatter.formatSecurityDiff({
|
|
278
|
-
requireApproval:
|
|
279
|
-
stackName: stack.displayName,
|
|
280
|
-
changeSet,
|
|
257
|
+
requireApproval: shared_private_1.RequireApproval.BROADENING,
|
|
281
258
|
});
|
|
282
259
|
formattedSecurityDiff = securityDiff.formattedDiff ?? '';
|
|
283
260
|
diffs = securityDiff.formattedDiff ? diffs + 1 : diffs;
|
|
@@ -286,21 +263,27 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
286
263
|
const diff = formatter.formatStackDiff({
|
|
287
264
|
strict,
|
|
288
265
|
context: contextLines,
|
|
289
|
-
stackName: stack.displayName,
|
|
290
|
-
changeSet,
|
|
291
|
-
isImport: !!resourcesToImport,
|
|
292
|
-
nestedStackTemplates: nestedStacks,
|
|
293
266
|
});
|
|
294
267
|
formattedStackDiff = diff.formattedDiff;
|
|
295
268
|
diffs = diff.numStacksWithChanges;
|
|
296
269
|
}
|
|
270
|
+
(0, private_3.appendObject)(templateDiffs, formatter.diffs);
|
|
297
271
|
}
|
|
272
|
+
await diffSpan.end(`✨ Number of stacks with differences: ${diffs}`, {
|
|
273
|
+
formattedSecurityDiff,
|
|
274
|
+
formattedStackDiff,
|
|
275
|
+
});
|
|
276
|
+
return templateDiffs;
|
|
277
|
+
}
|
|
278
|
+
catch (e_1) {
|
|
279
|
+
env_1.error = e_1;
|
|
280
|
+
env_1.hasError = true;
|
|
281
|
+
}
|
|
282
|
+
finally {
|
|
283
|
+
const result_1 = __disposeResources(env_1);
|
|
284
|
+
if (result_1)
|
|
285
|
+
await result_1;
|
|
298
286
|
}
|
|
299
|
-
await diffSpan.end(`✨ Number of stacks with differences: ${diffs}`, {
|
|
300
|
-
formattedSecurityDiff,
|
|
301
|
-
formattedStackDiff,
|
|
302
|
-
});
|
|
303
|
-
return;
|
|
304
287
|
}
|
|
305
288
|
/**
|
|
306
289
|
* List Action
|
|
@@ -308,16 +291,28 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
308
291
|
* List selected stacks and their dependencies
|
|
309
292
|
*/
|
|
310
293
|
async list(cx, options = {}) {
|
|
311
|
-
const
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
294
|
+
const env_2 = { stack: [], error: void 0, hasError: false };
|
|
295
|
+
try {
|
|
296
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'list');
|
|
297
|
+
const selectStacks = options.stacks ?? private_5.ALL_STACKS;
|
|
298
|
+
const synthSpan = await ioHelper.span(private_6.SPAN.SYNTH_ASSEMBLY).begin({ stacks: selectStacks });
|
|
299
|
+
const assembly = __addDisposableResource(env_2, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
300
|
+
const stackCollection = await assembly.selectStacksV2(selectStacks);
|
|
301
|
+
await synthSpan.end();
|
|
302
|
+
const stacks = stackCollection.withDependencies();
|
|
303
|
+
const message = stacks.map(s => s.id).join('\n');
|
|
304
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I2901.msg(message, { stacks }));
|
|
305
|
+
return stacks;
|
|
306
|
+
}
|
|
307
|
+
catch (e_2) {
|
|
308
|
+
env_2.error = e_2;
|
|
309
|
+
env_2.hasError = true;
|
|
310
|
+
}
|
|
311
|
+
finally {
|
|
312
|
+
const result_2 = __disposeResources(env_2);
|
|
313
|
+
if (result_2)
|
|
314
|
+
await result_2;
|
|
315
|
+
}
|
|
321
316
|
}
|
|
322
317
|
/**
|
|
323
318
|
* Deploy Action
|
|
@@ -325,9 +320,21 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
325
320
|
* Deploys the selected stacks into an AWS account
|
|
326
321
|
*/
|
|
327
322
|
async deploy(cx, options = {}) {
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
|
|
323
|
+
const env_3 = { stack: [], error: void 0, hasError: false };
|
|
324
|
+
try {
|
|
325
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'deploy');
|
|
326
|
+
const assembly = __addDisposableResource(env_3, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
327
|
+
return await this._deploy(assembly, 'deploy', options);
|
|
328
|
+
}
|
|
329
|
+
catch (e_3) {
|
|
330
|
+
env_3.error = e_3;
|
|
331
|
+
env_3.hasError = true;
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
const result_3 = __disposeResources(env_3);
|
|
335
|
+
if (result_3)
|
|
336
|
+
await result_3;
|
|
337
|
+
}
|
|
331
338
|
}
|
|
332
339
|
/**
|
|
333
340
|
* Helper to allow deploy being called as part of the watch action.
|
|
@@ -339,16 +346,19 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
339
346
|
const stackCollection = await assembly.selectStacksV2(selectStacks);
|
|
340
347
|
await this.validateStacksMetadata(stackCollection, ioHelper);
|
|
341
348
|
const synthDuration = await synthSpan.end();
|
|
349
|
+
const ret = {
|
|
350
|
+
stacks: [],
|
|
351
|
+
};
|
|
342
352
|
if (stackCollection.stackCount === 0) {
|
|
343
353
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_E5001.msg('This app contains no stacks'));
|
|
344
|
-
return;
|
|
354
|
+
return ret;
|
|
345
355
|
}
|
|
346
356
|
const deployments = await this.deploymentsForAction('deploy');
|
|
347
|
-
const migrator = new
|
|
357
|
+
const migrator = new shared_private_1.ResourceMigrator({ deployments, ioHelper });
|
|
348
358
|
await migrator.tryMigrateResources(stackCollection, options);
|
|
349
359
|
const parameterMap = (0, private_2.buildParameterMap)(options.parameters?.parameters);
|
|
350
|
-
const hotswapMode = options.hotswap ??
|
|
351
|
-
if (hotswapMode !==
|
|
360
|
+
const hotswapMode = options.hotswap ?? shared_private_1.HotswapMode.FULL_DEPLOYMENT;
|
|
361
|
+
if (hotswapMode !== shared_private_1.HotswapMode.FULL_DEPLOYMENT) {
|
|
352
362
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_W5400.msg([
|
|
353
363
|
'⚠️ The --hotswap and --hotswap-fallback flags deliberately introduce CloudFormation drift to speed up deployments',
|
|
354
364
|
'⚠️ They should only be used for development - never use them for your production Stacks!',
|
|
@@ -376,7 +386,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
376
386
|
stack: assetNode.parentStack,
|
|
377
387
|
roleArn: options.roleArn,
|
|
378
388
|
stackName: assetNode.parentStack.stackName,
|
|
379
|
-
forcePublish: options.
|
|
389
|
+
forcePublish: options.forceAssetPublishing,
|
|
380
390
|
});
|
|
381
391
|
await publishAssetSpan.end();
|
|
382
392
|
};
|
|
@@ -386,7 +396,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
386
396
|
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_INFO.msg(chalk.bold(stack.displayName)));
|
|
387
397
|
}
|
|
388
398
|
if (!stack.environment) {
|
|
389
|
-
throw new
|
|
399
|
+
throw new shared_private_1.ToolkitError(`Stack ${stack.displayName} does not define an environment, and AWS credentials could not be obtained from standard locations or no region was configured.`);
|
|
390
400
|
}
|
|
391
401
|
// The generated stack has no resources
|
|
392
402
|
if (Object.keys(stack.template.Resources || {}).length === 0) {
|
|
@@ -400,7 +410,6 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
400
410
|
await this._destroy(assembly, 'deploy', {
|
|
401
411
|
stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
|
|
402
412
|
roleArn: options.roleArn,
|
|
403
|
-
ci: options.ci,
|
|
404
413
|
});
|
|
405
414
|
return;
|
|
406
415
|
}
|
|
@@ -414,7 +423,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
414
423
|
permissionChangeType,
|
|
415
424
|
}));
|
|
416
425
|
if (!deployConfirmed) {
|
|
417
|
-
throw new
|
|
426
|
+
throw new shared_private_1.ToolkitError('Aborted by user');
|
|
418
427
|
}
|
|
419
428
|
// Following are the same semantics we apply with respect to Notification ARNs (dictated by the SDK)
|
|
420
429
|
//
|
|
@@ -426,7 +435,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
426
435
|
: undefined;
|
|
427
436
|
for (const notificationArn of notificationArns ?? []) {
|
|
428
437
|
if (!(0, util_1.validateSnsTopicArn)(notificationArn)) {
|
|
429
|
-
throw new
|
|
438
|
+
throw new shared_private_1.ToolkitError(`Notification arn ${notificationArn} is not a valid arn for an SNS topic`);
|
|
430
439
|
}
|
|
431
440
|
}
|
|
432
441
|
const stackIndex = stacks.indexOf(stack) + 1;
|
|
@@ -438,7 +447,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
438
447
|
});
|
|
439
448
|
let tags = options.tags;
|
|
440
449
|
if (!tags || tags.length === 0) {
|
|
441
|
-
tags = (0,
|
|
450
|
+
tags = (0, shared_private_1.tagsForStack)(stack);
|
|
442
451
|
}
|
|
443
452
|
let deployDuration;
|
|
444
453
|
try {
|
|
@@ -447,7 +456,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
447
456
|
let iteration = 0;
|
|
448
457
|
while (!deployResult) {
|
|
449
458
|
if (++iteration > 2) {
|
|
450
|
-
throw new
|
|
459
|
+
throw new shared_private_1.ToolkitError('This loop should have stabilized in 2 iterations, but didn\'t. If you are seeing this error, please report it at https://github.com/aws/aws-cdk/issues/new/choose');
|
|
451
460
|
}
|
|
452
461
|
const r = await deployments.deployStack({
|
|
453
462
|
stack,
|
|
@@ -458,7 +467,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
458
467
|
notificationArns,
|
|
459
468
|
tags,
|
|
460
469
|
deploymentMethod: options.deploymentMethod,
|
|
461
|
-
|
|
470
|
+
forceDeployment: options.forceDeployment,
|
|
462
471
|
parameters: Object.assign({}, parameterMap['*'], parameterMap[stack.stackName]),
|
|
463
472
|
usePreviousParameters: options.parameters?.keepExistingParameters,
|
|
464
473
|
rollback,
|
|
@@ -476,22 +485,17 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
476
485
|
? `Stack is in a paused fail state (${r.status}) and change includes a replacement which cannot be deployed with "--no-rollback"`
|
|
477
486
|
: `Stack is in a paused fail state (${r.status}) and command line arguments do not include "--no-rollback"`;
|
|
478
487
|
const question = `${motivation}. Perform a regular deployment`;
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
concurrency,
|
|
486
|
-
}));
|
|
487
|
-
if (!confirmed) {
|
|
488
|
-
throw new shared_public_1.ToolkitError('Aborted by user');
|
|
489
|
-
}
|
|
488
|
+
const confirmed = await ioHelper.requestResponse(private_6.IO.CDK_TOOLKIT_I5050.req(question, {
|
|
489
|
+
motivation,
|
|
490
|
+
concurrency,
|
|
491
|
+
}));
|
|
492
|
+
if (!confirmed) {
|
|
493
|
+
throw new shared_private_1.ToolkitError('Aborted by user');
|
|
490
494
|
}
|
|
491
495
|
// Perform a rollback
|
|
492
496
|
await this._rollback(assembly, action, {
|
|
493
497
|
stacks: { patterns: [stack.hierarchicalId], strategy: cloud_assembly_1.StackSelectionStrategy.PATTERN_MUST_MATCH_SINGLE },
|
|
494
|
-
orphanFailedResources: options.
|
|
498
|
+
orphanFailedResources: options.orphanFailedResourcesDuringRollback,
|
|
495
499
|
});
|
|
496
500
|
// Go around through the 'while' loop again but switch rollback to true.
|
|
497
501
|
rollback = true;
|
|
@@ -500,25 +504,19 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
500
504
|
case 'replacement-requires-rollback': {
|
|
501
505
|
const motivation = 'Change includes a replacement which cannot be deployed with "--no-rollback"';
|
|
502
506
|
const question = `${motivation}. Perform a regular deployment`;
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
motivation,
|
|
510
|
-
concurrency,
|
|
511
|
-
}));
|
|
512
|
-
if (!confirmed) {
|
|
513
|
-
throw new shared_public_1.ToolkitError('Aborted by user');
|
|
514
|
-
}
|
|
507
|
+
const confirmed = await ioHelper.requestResponse(private_6.IO.CDK_TOOLKIT_I5050.req(question, {
|
|
508
|
+
motivation,
|
|
509
|
+
concurrency,
|
|
510
|
+
}));
|
|
511
|
+
if (!confirmed) {
|
|
512
|
+
throw new shared_private_1.ToolkitError('Aborted by user');
|
|
515
513
|
}
|
|
516
514
|
// Go around through the 'while' loop again but switch rollback to true.
|
|
517
515
|
rollback = true;
|
|
518
516
|
break;
|
|
519
517
|
}
|
|
520
518
|
default:
|
|
521
|
-
throw new
|
|
519
|
+
throw new shared_private_1.ToolkitError(`Unexpected result type from deployStack: ${JSON.stringify(r)}. If you are seeing this error, please report it at https://github.com/aws/aws-cdk/issues/new/choose`);
|
|
522
520
|
}
|
|
523
521
|
}
|
|
524
522
|
const message = deployResult.noOp
|
|
@@ -536,17 +534,27 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
536
534
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5901.msg(buffer.join('\n')));
|
|
537
535
|
}
|
|
538
536
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5901.msg(`Stack ARN:\n${deployResult.stackArn}`));
|
|
537
|
+
ret.stacks.push({
|
|
538
|
+
stackName: stack.stackName,
|
|
539
|
+
environment: {
|
|
540
|
+
account: stack.environment.account,
|
|
541
|
+
region: stack.environment.region,
|
|
542
|
+
},
|
|
543
|
+
stackArn: deployResult.stackArn,
|
|
544
|
+
outputs: deployResult.outputs,
|
|
545
|
+
hierarchicalId: stack.hierarchicalId,
|
|
546
|
+
});
|
|
539
547
|
}
|
|
540
548
|
catch (e) {
|
|
541
549
|
// It has to be exactly this string because an integration test tests for
|
|
542
550
|
// "bold(stackname) failed: ResourceNotReady: <error>"
|
|
543
|
-
throw new
|
|
551
|
+
throw new shared_private_1.ToolkitError([`❌ ${chalk.bold(stack.stackName)} failed:`, ...(e.name ? [`${e.name}:`] : []), e.message].join(' '));
|
|
544
552
|
}
|
|
545
553
|
finally {
|
|
546
554
|
if (options.traceLogs) {
|
|
547
555
|
// deploy calls that originate from watch will come with their own cloudWatchLogMonitor
|
|
548
|
-
const cloudWatchLogMonitor = options.cloudWatchLogMonitor ?? new
|
|
549
|
-
const foundLogGroupsResult = await (0,
|
|
556
|
+
const cloudWatchLogMonitor = options.cloudWatchLogMonitor ?? new shared_private_1.CloudWatchLogEventMonitor({ ioHelper });
|
|
557
|
+
const foundLogGroupsResult = await (0, shared_private_1.findCloudWatchLogGroups)(await this.sdkProvider('deploy'), ioHelper, stack);
|
|
550
558
|
cloudWatchLogMonitor.addLogGroups(foundLogGroupsResult.env, foundLogGroupsResult.sdk, foundLogGroupsResult.logGroupNames);
|
|
551
559
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5031.msg(`The following log groups are added: ${foundLogGroupsResult.logGroupNames}`));
|
|
552
560
|
}
|
|
@@ -571,10 +579,10 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
571
579
|
stack,
|
|
572
580
|
...stack.dependencies.filter(x => cxapi.AssetManifestArtifact.isAssetManifestArtifact(x)),
|
|
573
581
|
]);
|
|
574
|
-
const workGraph = new
|
|
582
|
+
const workGraph = new shared_private_1.WorkGraphBuilder(ioHelper, prebuildAssets).build(stacksAndTheirAssetManifests);
|
|
575
583
|
// Unless we are running with '--force', skip already published assets
|
|
576
|
-
if (!options.
|
|
577
|
-
await (0, private_2.
|
|
584
|
+
if (!options.forceAssetPublishing) {
|
|
585
|
+
await (0, private_2.removePublishedAssetsFromWorkGraph)(workGraph, deployments, options);
|
|
578
586
|
}
|
|
579
587
|
const graphConcurrency = {
|
|
580
588
|
'stack': concurrency,
|
|
@@ -586,98 +594,137 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
586
594
|
buildAsset,
|
|
587
595
|
publishAsset,
|
|
588
596
|
});
|
|
597
|
+
return ret;
|
|
589
598
|
}
|
|
590
599
|
/**
|
|
591
600
|
* Watch Action
|
|
592
601
|
*
|
|
593
|
-
* Continuously observe project files and deploy the selected stacks
|
|
594
|
-
* Implies hotswap deployments.
|
|
602
|
+
* Continuously observe project files and deploy the selected stacks
|
|
603
|
+
* automatically when changes are detected. Implies hotswap deployments.
|
|
604
|
+
*
|
|
605
|
+
* This function returns immediately, starting a watcher in the background.
|
|
595
606
|
*/
|
|
596
607
|
async watch(cx, options) {
|
|
597
|
-
const
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
608
|
+
const env_4 = { stack: [], error: void 0, hasError: false };
|
|
609
|
+
try {
|
|
610
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'watch');
|
|
611
|
+
const assembly = __addDisposableResource(env_4, await (0, private_1.assemblyFromSource)(ioHelper, cx, false), true);
|
|
612
|
+
const rootDir = options.watchDir ?? process.cwd();
|
|
613
|
+
if (options.include === undefined && options.exclude === undefined) {
|
|
614
|
+
throw new shared_private_1.ToolkitError("Cannot use the 'watch' command without specifying at least one directory to monitor. " +
|
|
615
|
+
'Make sure to add a "watch" key to your cdk.json');
|
|
616
|
+
}
|
|
617
|
+
// For the "include" subkey under the "watch" key, the behavior is:
|
|
618
|
+
// 1. No "watch" setting? We error out.
|
|
619
|
+
// 2. "watch" setting without an "include" key? We default to observing "./**".
|
|
620
|
+
// 3. "watch" setting with an empty "include" key? We default to observing "./**".
|
|
621
|
+
// 4. Non-empty "include" key? Just use the "include" key.
|
|
622
|
+
const watchIncludes = (0, private_4.patternsArrayForWatch)(options.include, {
|
|
623
|
+
rootDir,
|
|
624
|
+
returnRootDirIfEmpty: true,
|
|
625
|
+
});
|
|
626
|
+
// For the "exclude" subkey under the "watch" key,
|
|
627
|
+
// the behavior is to add some default excludes in addition to the ones specified by the user:
|
|
628
|
+
// 1. The CDK output directory.
|
|
629
|
+
// 2. Any file whose name starts with a dot.
|
|
630
|
+
// 3. Any directory's content whose name starts with a dot.
|
|
631
|
+
// 4. Any node_modules and its content (even if it's not a JS/TS project, you might be using a local aws-cli package)
|
|
632
|
+
const outdir = assembly.directory;
|
|
633
|
+
const watchExcludes = (0, private_4.patternsArrayForWatch)(options.exclude, {
|
|
634
|
+
rootDir,
|
|
635
|
+
returnRootDirIfEmpty: false,
|
|
636
|
+
});
|
|
637
|
+
// only exclude the outdir if it is under the rootDir
|
|
638
|
+
const relativeOutDir = path.relative(rootDir, outdir);
|
|
639
|
+
if (Boolean(relativeOutDir && !relativeOutDir.startsWith('..' + path.sep) && !path.isAbsolute(relativeOutDir))) {
|
|
640
|
+
watchExcludes.push(`${relativeOutDir}/**`);
|
|
641
|
+
}
|
|
642
|
+
watchExcludes.push('**/.*', '**/.*/**', '**/node_modules/**');
|
|
643
|
+
// Print some debug information on computed settings
|
|
644
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5310.msg([
|
|
645
|
+
`root directory used for 'watch' is: ${rootDir}`,
|
|
646
|
+
`'include' patterns for 'watch': ${JSON.stringify(watchIncludes)}`,
|
|
647
|
+
`'exclude' patterns for 'watch': ${JSON.stringify(watchExcludes)}`,
|
|
648
|
+
].join('\n'), {
|
|
649
|
+
watchDir: rootDir,
|
|
650
|
+
includes: watchIncludes,
|
|
651
|
+
excludes: watchExcludes,
|
|
652
|
+
}));
|
|
653
|
+
let latch = 'pre-ready';
|
|
654
|
+
const cloudWatchLogMonitor = options.traceLogs ? new shared_private_1.CloudWatchLogEventMonitor({ ioHelper }) : undefined;
|
|
655
|
+
const deployAndWatch = async () => {
|
|
645
656
|
latch = 'deploying';
|
|
646
|
-
await
|
|
657
|
+
await cloudWatchLogMonitor?.deactivate();
|
|
647
658
|
await this.invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor);
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_DEBUG.msg("'watch' received the 'ready' event. From now on, all file changes will trigger a deployment"));
|
|
660
|
-
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5314.msg("Triggering initial 'cdk deploy'"));
|
|
661
|
-
await deployAndWatch();
|
|
662
|
-
})
|
|
663
|
-
.on('all', async (event, filePath) => {
|
|
664
|
-
const watchEvent = {
|
|
665
|
-
event,
|
|
666
|
-
path: filePath,
|
|
659
|
+
// If latch is still 'deploying' after the 'await', that's fine,
|
|
660
|
+
// but if it's 'queued', that means we need to deploy again
|
|
661
|
+
while (latch === 'queued') {
|
|
662
|
+
// TypeScript doesn't realize latch can change between 'awaits',
|
|
663
|
+
// and thinks the above 'while' condition is always 'false' without the cast
|
|
664
|
+
latch = 'deploying';
|
|
665
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5315.msg("Detected file changes during deployment. Invoking 'cdk deploy' again"));
|
|
666
|
+
await this.invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor);
|
|
667
|
+
}
|
|
668
|
+
latch = 'open';
|
|
669
|
+
await cloudWatchLogMonitor?.activate();
|
|
667
670
|
};
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
671
|
+
const watcher = chokidar
|
|
672
|
+
.watch(watchIncludes, {
|
|
673
|
+
ignored: watchExcludes,
|
|
674
|
+
cwd: rootDir,
|
|
675
|
+
})
|
|
676
|
+
.on('ready', async () => {
|
|
677
|
+
latch = 'open';
|
|
678
|
+
await ioHelper.notify(private_6.IO.DEFAULT_TOOLKIT_DEBUG.msg("'watch' received the 'ready' event. From now on, all file changes will trigger a deployment"));
|
|
679
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5314.msg("Triggering initial 'cdk deploy'"));
|
|
673
680
|
await deployAndWatch();
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
+
})
|
|
682
|
+
.on('all', async (event, filePath) => {
|
|
683
|
+
const watchEvent = {
|
|
684
|
+
event,
|
|
685
|
+
path: filePath,
|
|
686
|
+
};
|
|
687
|
+
if (latch === 'pre-ready') {
|
|
688
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5311.msg(`'watch' is observing ${event === 'addDir' ? 'directory' : 'the file'} '${filePath}' for changes`, watchEvent));
|
|
689
|
+
}
|
|
690
|
+
else if (latch === 'open') {
|
|
691
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5312.msg(`Detected change to '${filePath}' (type: ${event}). Triggering 'cdk deploy'`, watchEvent));
|
|
692
|
+
await deployAndWatch();
|
|
693
|
+
}
|
|
694
|
+
else {
|
|
695
|
+
// this means latch is either 'deploying' or 'queued'
|
|
696
|
+
latch = 'queued';
|
|
697
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I5313.msg(`Detected change to '${filePath}' (type: ${event}) while 'cdk deploy' is still running. Will queue for another deployment after this one finishes'`, watchEvent));
|
|
698
|
+
}
|
|
699
|
+
});
|
|
700
|
+
const stoppedPromise = (0, promises_1.promiseWithResolvers)();
|
|
701
|
+
return {
|
|
702
|
+
async dispose() {
|
|
703
|
+
await watcher.close();
|
|
704
|
+
// Prevents Node from staying alive. There is no 'end' event that the watcher emits
|
|
705
|
+
// that we can know it's definitely done, so best we can do is tell it to stop watching,
|
|
706
|
+
// stop keeping Node alive, and then pretend that's everything we needed to do.
|
|
707
|
+
watcher.unref();
|
|
708
|
+
stoppedPromise.resolve();
|
|
709
|
+
return stoppedPromise.promise;
|
|
710
|
+
},
|
|
711
|
+
async waitForEnd() {
|
|
712
|
+
return stoppedPromise.promise;
|
|
713
|
+
},
|
|
714
|
+
async [Symbol.asyncDispose]() {
|
|
715
|
+
return this.dispose();
|
|
716
|
+
},
|
|
717
|
+
};
|
|
718
|
+
}
|
|
719
|
+
catch (e_4) {
|
|
720
|
+
env_4.error = e_4;
|
|
721
|
+
env_4.hasError = true;
|
|
722
|
+
}
|
|
723
|
+
finally {
|
|
724
|
+
const result_4 = __disposeResources(env_4);
|
|
725
|
+
if (result_4)
|
|
726
|
+
await result_4;
|
|
727
|
+
}
|
|
681
728
|
}
|
|
682
729
|
/**
|
|
683
730
|
* Rollback Action
|
|
@@ -685,9 +732,21 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
685
732
|
* Rolls back the selected stacks.
|
|
686
733
|
*/
|
|
687
734
|
async rollback(cx, options) {
|
|
688
|
-
const
|
|
689
|
-
|
|
690
|
-
|
|
735
|
+
const env_5 = { stack: [], error: void 0, hasError: false };
|
|
736
|
+
try {
|
|
737
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'rollback');
|
|
738
|
+
const assembly = __addDisposableResource(env_5, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
739
|
+
return await this._rollback(assembly, 'rollback', options);
|
|
740
|
+
}
|
|
741
|
+
catch (e_5) {
|
|
742
|
+
env_5.error = e_5;
|
|
743
|
+
env_5.hasError = true;
|
|
744
|
+
}
|
|
745
|
+
finally {
|
|
746
|
+
const result_5 = __disposeResources(env_5);
|
|
747
|
+
if (result_5)
|
|
748
|
+
await result_5;
|
|
749
|
+
}
|
|
691
750
|
}
|
|
692
751
|
/**
|
|
693
752
|
* Helper to allow rollback being called as part of the deploy or watch action.
|
|
@@ -698,9 +757,12 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
698
757
|
const stacks = await assembly.selectStacksV2(options.stacks);
|
|
699
758
|
await this.validateStacksMetadata(stacks, ioHelper);
|
|
700
759
|
await synthSpan.end();
|
|
760
|
+
const ret = {
|
|
761
|
+
stacks: [],
|
|
762
|
+
};
|
|
701
763
|
if (stacks.stackCount === 0) {
|
|
702
764
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_E6001.msg('No stacks selected'));
|
|
703
|
-
return;
|
|
765
|
+
return ret;
|
|
704
766
|
}
|
|
705
767
|
let anyRollbackable = false;
|
|
706
768
|
for (const [index, stack] of stacks.stackArtifacts.entries()) {
|
|
@@ -715,7 +777,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
715
777
|
stack,
|
|
716
778
|
roleArn: options.roleArn,
|
|
717
779
|
toolkitStackName: this.toolkitStackName,
|
|
718
|
-
|
|
780
|
+
orphanFailedResources: options.orphanFailedResources,
|
|
719
781
|
validateBootstrapStackVersion: options.validateBootstrapStackVersion,
|
|
720
782
|
orphanLogicalIds: options.orphanLogicalIds,
|
|
721
783
|
});
|
|
@@ -723,14 +785,58 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
723
785
|
anyRollbackable = true;
|
|
724
786
|
}
|
|
725
787
|
await rollbackSpan.end();
|
|
788
|
+
ret.stacks.push({
|
|
789
|
+
environment: {
|
|
790
|
+
account: stack.environment.account,
|
|
791
|
+
region: stack.environment.region,
|
|
792
|
+
},
|
|
793
|
+
stackName: stack.stackName,
|
|
794
|
+
stackArn: stackResult.stackArn,
|
|
795
|
+
result: stackResult.notInRollbackableState ? 'already-stable' : 'rolled-back',
|
|
796
|
+
});
|
|
726
797
|
}
|
|
727
798
|
catch (e) {
|
|
728
799
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_E6900.msg(`\n ❌ ${chalk.bold(stack.displayName)} failed: ${(0, util_1.formatErrorMessage)(e)}`, { error: e }));
|
|
729
|
-
throw new
|
|
800
|
+
throw new shared_private_1.ToolkitError('Rollback failed (use --force to orphan failing resources)');
|
|
730
801
|
}
|
|
731
802
|
}
|
|
732
803
|
if (!anyRollbackable) {
|
|
733
|
-
throw new
|
|
804
|
+
throw new shared_private_1.ToolkitError('No stacks were in a state that could be rolled back');
|
|
805
|
+
}
|
|
806
|
+
return ret;
|
|
807
|
+
}
|
|
808
|
+
/**
|
|
809
|
+
* Refactor Action. Moves resources from one location (stack + logical ID) to another.
|
|
810
|
+
*/
|
|
811
|
+
async refactor(cx, options = {}) {
|
|
812
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'refactor');
|
|
813
|
+
const assembly = await (0, private_1.assemblyFromSource)(ioHelper, cx);
|
|
814
|
+
return this._refactor(assembly, ioHelper, options);
|
|
815
|
+
}
|
|
816
|
+
async _refactor(assembly, ioHelper, options = {}) {
|
|
817
|
+
if (!options.dryRun) {
|
|
818
|
+
throw new shared_private_1.ToolkitError('Refactor is not available yet. Too see the proposed changes, use the --dry-run flag.');
|
|
819
|
+
}
|
|
820
|
+
const strategy = options.stacks?.strategy ?? cloud_assembly_1.StackSelectionStrategy.ALL_STACKS;
|
|
821
|
+
if (strategy !== cloud_assembly_1.StackSelectionStrategy.ALL_STACKS) {
|
|
822
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_W8010.msg('Refactor does not yet support stack selection. Proceeding with the default behavior (considering all stacks).'));
|
|
823
|
+
}
|
|
824
|
+
const stacks = await assembly.selectStacksV2(private_5.ALL_STACKS);
|
|
825
|
+
const sdkProvider = await this.sdkProvider('refactor');
|
|
826
|
+
const movements = await (0, shared_private_1.findResourceMovements)(stacks.stackArtifacts, sdkProvider);
|
|
827
|
+
const ambiguous = (0, shared_private_1.ambiguousMovements)(movements);
|
|
828
|
+
if (ambiguous.length === 0) {
|
|
829
|
+
const typedMappings = (0, shared_private_1.resourceMappings)(movements).map(m => m.toTypedMapping());
|
|
830
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I8900.msg((0, shared_private_1.formatTypedMappings)(typedMappings), {
|
|
831
|
+
typedMappings,
|
|
832
|
+
}));
|
|
833
|
+
}
|
|
834
|
+
else {
|
|
835
|
+
const error = new shared_private_1.AmbiguityError(ambiguous);
|
|
836
|
+
const paths = error.paths();
|
|
837
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I8900.msg((0, shared_private_1.formatAmbiguousMappings)(paths), {
|
|
838
|
+
ambiguousPaths: paths,
|
|
839
|
+
}));
|
|
734
840
|
}
|
|
735
841
|
}
|
|
736
842
|
/**
|
|
@@ -739,9 +845,21 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
739
845
|
* Destroys the selected Stacks.
|
|
740
846
|
*/
|
|
741
847
|
async destroy(cx, options) {
|
|
742
|
-
const
|
|
743
|
-
|
|
744
|
-
|
|
848
|
+
const env_6 = { stack: [], error: void 0, hasError: false };
|
|
849
|
+
try {
|
|
850
|
+
const ioHelper = (0, shared_private_1.asIoHelper)(this.ioHost, 'destroy');
|
|
851
|
+
const assembly = __addDisposableResource(env_6, await (0, private_1.assemblyFromSource)(ioHelper, cx), true);
|
|
852
|
+
return await this._destroy(assembly, 'destroy', options);
|
|
853
|
+
}
|
|
854
|
+
catch (e_6) {
|
|
855
|
+
env_6.error = e_6;
|
|
856
|
+
env_6.hasError = true;
|
|
857
|
+
}
|
|
858
|
+
finally {
|
|
859
|
+
const result_6 = __disposeResources(env_6);
|
|
860
|
+
if (result_6)
|
|
861
|
+
await result_6;
|
|
862
|
+
}
|
|
745
863
|
}
|
|
746
864
|
/**
|
|
747
865
|
* Helper to allow destroy being called as part of the deploy action.
|
|
@@ -752,11 +870,15 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
752
870
|
// The stacks will have been ordered for deployment, so reverse them for deletion.
|
|
753
871
|
const stacks = (await assembly.selectStacksV2(options.stacks)).reversed();
|
|
754
872
|
await synthSpan.end();
|
|
873
|
+
const ret = {
|
|
874
|
+
stacks: [],
|
|
875
|
+
};
|
|
755
876
|
const motivation = 'Destroying stacks is an irreversible action';
|
|
756
877
|
const question = `Are you sure you want to delete: ${chalk.red(stacks.hierarchicalIds.join(', '))}`;
|
|
757
878
|
const confirmed = await ioHelper.requestResponse(private_6.IO.CDK_TOOLKIT_I7010.req(question, { motivation }));
|
|
758
879
|
if (!confirmed) {
|
|
759
|
-
|
|
880
|
+
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_E7010.msg('Aborted by user'));
|
|
881
|
+
return ret;
|
|
760
882
|
}
|
|
761
883
|
const destroySpan = await ioHelper.span(private_6.SPAN.DESTROY_ACTION).begin({
|
|
762
884
|
stacks: stacks.stackArtifacts,
|
|
@@ -771,11 +893,20 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
771
893
|
stack,
|
|
772
894
|
});
|
|
773
895
|
const deployments = await this.deploymentsForAction(action);
|
|
774
|
-
await deployments.destroyStack({
|
|
896
|
+
const result = await deployments.destroyStack({
|
|
775
897
|
stack,
|
|
776
898
|
deployName: stack.stackName,
|
|
777
899
|
roleArn: options.roleArn,
|
|
778
900
|
});
|
|
901
|
+
ret.stacks.push({
|
|
902
|
+
environment: {
|
|
903
|
+
account: stack.environment.account,
|
|
904
|
+
region: stack.environment.region,
|
|
905
|
+
},
|
|
906
|
+
stackName: stack.stackName,
|
|
907
|
+
stackArn: result.stackArn,
|
|
908
|
+
stackExisted: result.stackArn !== undefined,
|
|
909
|
+
});
|
|
779
910
|
await ioHelper.notify(private_6.IO.CDK_TOOLKIT_I7900.msg(chalk.green(`\n ✅ ${chalk.blue(stack.displayName)}: ${action}ed`), stack));
|
|
780
911
|
await singleDestroySpan.end();
|
|
781
912
|
}
|
|
@@ -784,6 +915,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
784
915
|
throw e;
|
|
785
916
|
}
|
|
786
917
|
}
|
|
918
|
+
return ret;
|
|
787
919
|
}
|
|
788
920
|
finally {
|
|
789
921
|
await destroySpan.end();
|
|
@@ -806,7 +938,7 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
806
938
|
* Create a deployments class
|
|
807
939
|
*/
|
|
808
940
|
async deploymentsForAction(action) {
|
|
809
|
-
return new
|
|
941
|
+
return new shared_private_1.Deployments({
|
|
810
942
|
sdkProvider: await this.sdkProvider(action),
|
|
811
943
|
toolkitStackName: this.toolkitStackName,
|
|
812
944
|
ioHelper: (0, shared_private_1.asIoHelper)(this.ioHost, action),
|
|
@@ -814,13 +946,12 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
814
946
|
}
|
|
815
947
|
async invokeDeployFromWatch(assembly, options, cloudWatchLogMonitor) {
|
|
816
948
|
// watch defaults hotswap to enabled
|
|
817
|
-
const hotswap = options.hotswap ??
|
|
949
|
+
const hotswap = options.hotswap ?? shared_private_1.HotswapMode.HOTSWAP_ONLY;
|
|
818
950
|
const deployOptions = {
|
|
819
951
|
...options,
|
|
820
|
-
requireApproval: shared_public_1.RequireApproval.NEVER,
|
|
821
952
|
cloudWatchLogMonitor,
|
|
822
953
|
hotswap,
|
|
823
|
-
extraUserAgent: `cdk-watch/hotswap-${hotswap ===
|
|
954
|
+
extraUserAgent: `cdk-watch/hotswap-${hotswap === shared_private_1.HotswapMode.FULL_DEPLOYMENT ? 'off' : 'on'}`,
|
|
824
955
|
};
|
|
825
956
|
try {
|
|
826
957
|
await this._deploy(assembly, 'watch', deployOptions);
|
|
@@ -831,4 +962,4 @@ class Toolkit extends private_5.CloudAssemblySourceBuilder {
|
|
|
831
962
|
}
|
|
832
963
|
}
|
|
833
964
|
exports.Toolkit = Toolkit;
|
|
834
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLHlDQUF5QztBQUN6QywrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLCtCQUErQjtBQUMvQiw2QkFBNkI7QUFFN0IsdUNBQStDO0FBRS9DLG9EQUF1RDtBQUN2RCw4Q0FBdUU7QUFDdkUsdURBQWlKO0FBR2pKLDBDQUE2QztBQUM3QyxxREFBa0U7QUFLbEUsc0RBQWlFO0FBR2pFLDRDQUF1UDtBQUV2UCwwREFBK0Q7QUFFL0QsMkRBQW9IO0FBRXBILCtDQUE4RztBQUU5RywwREFBbUQ7QUFFbkQsd0RBQThHO0FBQzlHLDBDQUFpSjtBQUNqSixxREFBNkM7QUE2QzdDOztHQUVHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsb0NBQTBCO0lBWWpCO0lBWHBDOztPQUVHO0lBQ2EsZ0JBQWdCLENBQVM7SUFFekM7O09BRUc7SUFDYSxNQUFNLENBQVU7SUFDeEIsWUFBWSxDQUFlO0lBRW5DLFlBQW9DLFFBQXdCLEVBQUU7UUFDNUQsS0FBSyxFQUFFLENBQUM7UUFEMEIsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFFNUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxvQ0FBMEIsQ0FBQztRQUU3RSxvRkFBb0Y7UUFDcEYsTUFBTSxZQUFZLEdBQUcsbUJBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQixZQUFZLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxNQUFhLENBQUMsQ0FBQztRQUNuRCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEdBQUcsWUFBdUIsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDM0IsTUFBTSxHQUFHLElBQUEsdUJBQWEsRUFBQyxNQUFNLENBQUMs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LENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMscUJBQXFCLENBQ2pDLFFBQXVCLEVBQ3ZCLE9BQXFCLEVBQ3JCLG9CQUFnRDtRQUVoRCxvQ0FBb0M7UUFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxxQkFBVyxDQUFDLFlBQVksQ0FBQztRQUM1RCxNQUFNLGFBQWEsR0FBMEI7WUFDM0MsR0FBRyxPQUFPO1lBQ1YsZUFBZSxFQUFFLCtCQUFlLENBQUMsS0FBSztZQUN0QyxvQkFBb0I7WUFDcEIsT0FBTztZQUNQLGNBQWMsRUFBRSxxQkFBcUIsT0FBTyxLQUFLLHFCQUFXLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtTQUM5RixDQUFDO1FBRUYsSUFBSSxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDdkQsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLDZDQUE2QztRQUMvQyxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdDZCRCwwQkFzNkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHV1aWQgZnJvbSAndXVpZCc7XG5pbXBvcnQgdHlwZSB7IFRvb2xraXRTZXJ2aWNlcyB9IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc3NlbWJseUZyb21Tb3VyY2UgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBCb290c3RyYXBFbnZpcm9ubWVudHMsIEJvb3RzdHJhcE9wdGlvbnMsIEJvb3RzdHJhcFJlc3VsdCwgRW52aXJvbm1lbnRCb290c3RyYXBSZXN1bHQgfSBmcm9tICcuLi9hY3Rpb25zL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBCb290c3RyYXBTb3VyY2UgfSBmcm9tICcuLi9hY3Rpb25zL2Jvb3RzdHJhcCc7XG5pbXBvcnQgeyBBc3NldEJ1aWxkVGltZSwgdHlwZSBEZXBsb3lPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9kZXBsb3knO1xuaW1wb3J0IHsgdHlwZSBFeHRlbmRlZERlcGxveU9wdGlvbnMsIGJ1aWxkUGFyYW1ldGVyTWFwLCBjcmVhdGVIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsIHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95L3ByaXZhdGUnO1xuaW1wb3J0IHsgdHlwZSBEZXN0cm95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVzdHJveSc7XG5pbXBvcnQgdHlwZSB7IENoYW5nZVNldERpZmZPcHRpb25zLCBEaWZmT3B0aW9ucywgTG9jYWxGaWxlRGlmZk9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2RpZmYnO1xuaW1wb3J0IHsgRGlmZk1ldGhvZCB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZic7XG5pbXBvcnQgeyBkZXRlcm1pbmVQZXJtaXNzaW9uVHlwZSB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgTGlzdE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2xpc3QnO1xuaW1wb3J0IHsgdHlwZSBSb2xsYmFja09wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JvbGxiYWNrJztcbmltcG9ydCB7IHR5cGUgU3ludGhPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9zeW50aCc7XG5pbXBvcnQgdHlwZSB7IFdhdGNoT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gnO1xuaW1wb3J0IHsgcGF0dGVybnNBcnJheUZvcldhdGNoIH0gZnJvbSAnLi4vYWN0aW9ucy93YXRjaC9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgU2RrQ29uZmlnIH0gZnJvbSAnLi4vYXBpL2F3cy1hdXRoJztcbmltcG9ydCB0eXBlIHsgU3VjY2Vzc2Z1bERlcGxveVN0YWNrUmVzdWx0LCBTdGFja0NvbGxlY3Rpb24sIENvbmN1cnJlbmN5LCBBc3NldEJ1aWxkTm9kZSwgQXNzZXRQdWJsaXNoTm9kZSwgU3RhY2tOb2RlIH0gZnJvbSAnLi4vYXBpL2F3cy1jZGsnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsIEJvb3RzdHJhcHBlciwgU2RrUHJvdmlkZXIsIERlcGxveW1lbnRzLCBIb3Rzd2FwTW9kZSwgUmVzb3VyY2VNaWdyYXRvciwgdGFnc0ZvclN0YWNrLCBDbGlJb0hvc3QsIFdvcmtHcmFwaEJ1aWxkZXIsIENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsIGZpbmRDbG91ZFdhdGNoTG9nR3JvdXBzLCBjcmVhdGVEaWZmQ2hhbmdlU2V0IH0gZnJvbSAnLi4vYXBpL2F3cy1jZGsnO1xuaW1wb3J0IHR5cGUgeyBJQ2xvdWRBc3NlbWJseVNvdXJjZSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB0eXBlIHsgU3RhY2tBc3NlbWJseSB9IGZyb20gJy4uL2FwaS9jbG91ZC1hc3NlbWJseS9wcml2YXRlJztcbmltcG9ydCB7IEFMTF9TVEFDS1MsIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyLCBJZGVudGl0eUNsb3VkQXNzZW1ibHlTb3VyY2UgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IElJb0hvc3QsIElvTWVzc2FnZUxldmVsIH0gZnJvbSAnLi4vYXBpL2lvJztcbmltcG9ydCB7IElPLCBTUEFOLCBhc1Nka0xvZ2dlciwgd2l0aG91dENvbG9yLCB3aXRob3V0RW1vamlzLCB3aXRoVHJpbW1lZFdoaXRlc3BhY2UgfSBmcm9tICcuLi9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyIH0gZnJvbSAnLi4vYXBpL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB7IGFzSW9IZWxwZXIgfSBmcm9tICcuLi9hcGkvc2hhcmVkLXByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBBc3NlbWJseURhdGEsIFN0YWNrRGV0YWlscywgVG9vbGtpdEFjdGlvbiB9IGZyb20gJy4uL2FwaS9zaGFyZWQtcHVibGljJztcbmltcG9ydCB7IERpZmZGb3JtYXR0ZXIsIFJlcXVpcmVBcHByb3ZhbCwgVG9vbGtpdEVycm9yLCByZW1vdmVOb25JbXBvcnRSZXNvdXJjZXMgfSBmcm9tICcuLi9hcGkvc2hhcmVkLXB1YmxpYyc7XG5pbXBvcnQgeyBvYnNjdXJlVGVtcGxhdGUsIHNlcmlhbGl6ZVN0cnVjdHVyZSwgdmFsaWRhdGVTbnNUb3BpY0FybiwgZm9ybWF0VGltZSwgZm9ybWF0RXJyb3JNZXNzYWdlLCBkZXNlcmlhbGl6ZVN0cnVjdHVyZSB9IGZyb20gJy4uL3ByaXZhdGUvdXRpbCc7XG5pbXBvcnQgeyBwTGltaXQgfSBmcm9tICcuLi91dGlsL2NvbmN1cnJlbmN5JztcblxuZXhwb3J0IGludGVyZmFjZSBUb29sa2l0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IGltcGxlbWVudGF0aW9uLCBoYW5kbGluZyB0aGUgaW5saW5lIGludGVyYWN0aW9ucyBiZXR3ZWVuIHRoZSBUb29sa2l0IGFuZCBhbiBpbnRlZ3JhdGlvbi5cbiAgICovXG4gIGlvSG9zdD86IElJb0hvc3Q7XG5cbiAgLyoqXG4gICAqIEFsbG93IGVtb2ppcyBpbiBtZXNzYWdlcyBzZW50IHRvIHRoZSBJb0hvc3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVtb2ppcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgQU5TSSBjb2xvcnMgYW5kIGZvcm1hdHRpbmcgaW4gSW9Ib3N0IG1lc3NhZ2VzLlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gYGZhbHNlYCBlbmZvcmNlcyB0aGF0IG5vIGNvbG9yIG9yIHN0eWxlIHNob3dzIHVwXG4gICAqIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICogU2V0dGluZyB0aGlzIHZhbHVlIHRvIHRydWUgaXMgYSBuby1vcDsgaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgZGVmYXVsdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlY3RzIGNvbG9yIGZyb20gdGhlIFRUWSBzdGF0dXMgb2YgdGhlIElvSG9zdFxuICAgKi9cbiAgY29sb3I/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBTREsuXG4gICAqL1xuICBzZGtDb25maWc/OiBTZGtDb25maWc7XG5cbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRvb2xraXQgc3RhY2sgdG8gYmUgdXNlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJDREtUb29sa2l0XCJcbiAgICovXG4gIHRvb2xraXRTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWwgQ2xvdWQgQXNzZW1ibGllc1xuICAgKlxuICAgKiBAZGVmYXVsdCBcImVycm9yXCJcbiAgICovXG4gIGFzc2VtYmx5RmFpbHVyZUF0PzogJ2Vycm9yJyB8ICd3YXJuJyB8ICdub25lJztcbn1cblxuLyoqXG4gKiBUaGUgQVdTIENESyBQcm9ncmFtbWF0aWMgVG9vbGtpdFxuICovXG5leHBvcnQgY2xhc3MgVG9vbGtpdCBleHRlbmRzIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIGltcGxlbWVudHMgQXN5bmNEaXNwb3NhYmxlIHtcbiAgLyoqXG4gICAqIFRoZSB0b29sa2l0IHN0YWNrIG5hbWUgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSW9Ib3N0IG9mIHRoaXMgVG9vbGtpdFxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlvSG9zdDogSUlvSG9zdDtcbiAgcHJpdmF0ZSBfc2RrUHJvdmlkZXI/OiBTZGtQcm92aWRlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogVG9vbGtpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50b29sa2l0U3RhY2tOYW1lID0gcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRTtcblxuICAgIC8vIEhhY2t5IHdheSB0byByZS11c2UgdGhlIGdsb2JhbCBJb0hvc3QgdW50aWwgd2UgaGF2ZSBmdWxseSByZW1vdmVkIHRoZSBuZWVkIGZvciBpdFxuICAgIGNvbnN0IGdsb2JhbElvSG9zdCA9IENsaUlvSG9zdC5pbnN0YW5jZSgpO1xuICAgIGlmIChwcm9wcy5pb0hvc3QpIHtcbiAgICAgIGdsb2JhbElvSG9zdC5yZWdpc3RlcklvSG9zdChwcm9wcy5pb0hvc3QgYXMgYW55KTtcbiAgICB9XG4gICAgbGV0IGlvSG9zdCA9IGdsb2JhbElvSG9zdCBhcyBJSW9Ib3N0O1xuICAgIGlmIChwcm9wcy5lbW9qaXMgPT09IGZhbHNlKSB7XG4gICAgICBpb0hvc3QgPSB3aXRob3V0RW1vamlzKGlvSG9zdCk7XG4gICAgfVxuICAgIGlmIChwcm9wcy5jb2xvciA9PT0gZmFsc2UpIHtcbiAgICAgIGlvSG9zdCA9IHdpdGhvdXRDb2xvcihpb0hvc3QpO1xuICAgIH1cbiAgICAvLyBBZnRlciByZW1vdmluZyBlbW9qaXMgYW5kIGNvbG9yLCB3ZSBtaWdodCBlbmQgdXAgd2l0aCBmbG9hdGluZyB3aGl0ZXNwYWNlIGF0IGVpdGhlciBlbmQgb2YgdGhlIG1lc3NhZ2VcbiAgICAvLyBUaGlzIGFsc28gcmVtb3ZlcyBuZXdsaW5lcyB0aGF0IHdlIGN1cnJlbnRseSBlbWl0IGZvciBDTEkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuXG4gICAgdGhpcy5pb0hvc3QgPSB3aXRoVHJpbW1lZFdoaXRlc3BhY2UoaW9Ib3N0KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBkaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIG5vdGhpbmcgdG8gZG8geWV0XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0byB0aGUgQVdTIFNES1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzZGtQcm92aWRlcihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPFNka1Byb3ZpZGVyPiB7XG4gICAgLy8gQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkaWZmZXJlbnQgaW5zdGFuY2UgcGVyIGFjdGlvblxuICAgIGlmICghdGhpcy5fc2RrUHJvdmlkZXIpIHtcbiAgICAgIHRoaXMuX3Nka1Byb3ZpZGVyID0gYXdhaXQgU2RrUHJvdmlkZXIud2l0aEF3c0NsaUNvbXBhdGlibGVEZWZhdWx0cyh7XG4gICAgICAgIC4uLnRoaXMucHJvcHMuc2RrQ29uZmlnLFxuICAgICAgICBsb2dnZXI6IGFzU2RrTG9nZ2VyKGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbikpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3Nka1Byb3ZpZGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBwcm92aWRlIHRoZSBDbG91ZEFzc2VtYmx5U291cmNlQnVpbGRlciB3aXRoIHJlcXVpcmVkIHRvb2xraXQgc2VydmljZXNcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzb3VyY2VCdWlsZGVyU2VydmljZXMoKTogUHJvbWlzZTxUb29sa2l0U2VydmljZXM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW9IZWxwZXI6IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdhc3NlbWJseScpLFxuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2Fzc2VtYmx5JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb290c3RyYXAgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwKGVudmlyb25tZW50czogQm9vdHN0cmFwRW52aXJvbm1lbnRzLCBvcHRpb25zOiBCb290c3RyYXBPcHRpb25zKTogUHJvbWlzZTxCb290c3RyYXBSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEVudmlyb25tZW50Qm9vdHN0cmFwUmVzdWx0W10gPSBbXTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHModGhpcy5pb0hvc3QpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IEJvb3RzdHJhcFNvdXJjZS5kZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBib290c3RyYXBwZXIgPSBuZXcgQm9vdHN0cmFwcGVyKHNvdXJjZSwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoMjApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYm9vdHN0cmFwRW52aXJvbm1lbnRzLm1hcCgoZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LCBjdXJyZW50SWR4KSA9PiBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib290c3RyYXBTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkJPT1RTVFJBUF9TSU5HTEUpXG4gICAgICAgIC5iZWdpbihgJHtjaGFsay5ib2xkKGVudmlyb25tZW50Lm5hbWUpfTogYm9vdHN0cmFwcGluZy4uLmAsIHtcbiAgICAgICAgICB0b3RhbDogYm9vdHN0cmFwRW52aXJvbm1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBjdXJyZW50OiBjdXJyZW50SWR4KzEsXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib290c3RyYXBSZXN1bHQgPSBhd2FpdCBib290c3RyYXBwZXIuYm9vdHN0cmFwRW52aXJvbm1lbnQoXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc2RrUHJvdmlkZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LnBhcmFtZXRlcnMsXG4gICAgICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LmtlZXBFeGlzdGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYm9vdHN0cmFwUmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk5MDAubXNnKGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIHsgZW52aXJvbm1lbnQgfSkpO1xuICAgICAgICBjb25zdCBlbnZUaW1lID0gYXdhaXQgYm9vdHN0cmFwU3Bhbi5lbmQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCA9IHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBzdGF0dXM6IGJvb3RzdHJhcFJlc3VsdC5ub09wID8gJ25vLW9wJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICBkdXJhdGlvbjogZW52VGltZS5hc01zLFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTk5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudHM6IHJlc3VsdHMsXG4gICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN5bnRoKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogU3ludGhPcHRpb25zID0ge30pOiBQcm9taXNlPElDbG91ZEFzc2VtYmx5U291cmNlPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnc3ludGgnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBvcHRpb25zLnN0YWNrcyA/PyBBTExfU1RBQ0tTO1xuICAgIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgYXV0b1ZhbGlkYXRlU3RhY2tzID0gb3B0aW9ucy52YWxpZGF0ZVN0YWNrcyA/IFthc3NlbWJseS5zZWxlY3RTdGFja3NGb3JWYWxpZGF0aW9uKCldIDogW107XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcy5jb25jYXQoLi4uYXV0b1ZhbGlkYXRlU3RhY2tzKSwgaW9IZWxwZXIpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgc3RhY2ssIHByaW50IGl0IHRvIFNURE9VVFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3VjY2Vzc2Z1bGx5IHN5bnRoZXNpemVkIHRvICR7Y2hhbGsuYmx1ZShwYXRoLnJlc29sdmUoc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSkpfWA7XG4gICAgY29uc3QgYXNzZW1ibHlEYXRhOiBBc3NlbWJseURhdGEgPSB7XG4gICAgICBhc3NlbWJseURpcmVjdG9yeTogc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSxcbiAgICAgIHN0YWNrc0NvdW50OiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgIHN0YWNrSWRzOiBzdGFja3MuaGllcmFyY2hpY2FsSWRzLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0U3RhY2sgPSBzdGFja3MuZmlyc3RTdGFjayE7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZpcnN0U3RhY2sudGVtcGxhdGU7XG4gICAgICBjb25zdCBvYnNjdXJlZFRlbXBsYXRlID0gb2JzY3VyZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMTkwMS5tc2cobWVzc2FnZSwge1xuICAgICAgICAuLi5hc3NlbWJseURhdGEsXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgc3RhY2tOYW1lOiBmaXJzdFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogZmlyc3RTdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBzdHJpbmdpZmllZEpzb246IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICBzdHJpbmdpZmllZFlhbWw6IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCBmYWxzZSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBvdXRwdXR0aW5nIHRlbXBsYXRlIHRvIHN0ZG91dCwgbGV0J3MgZXhwbGFpbiB0aGluZ3MgdG8gdGhlIHVzZXIgYSBsaXR0bGUgYml0Li4uXG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTE5MDIubXNnKGNoYWxrLmdyZWVuKG1lc3NhZ2UpLCBhc3NlbWJseURhdGEpKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYFN1cHBseSBhIHN0YWNrIGlkICgke3N0YWNrcy5zdGFja0FydGlmYWN0cy5tYXAoKHMpID0+IGNoYWxrLmdyZWVuKHMuaGllcmFyY2hpY2FsSWQpKS5qb2luKCcsICcpfSkgdG8gZGlzcGxheSBpdHMgdGVtcGxhdGUuYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSWRlbnRpdHlDbG91ZEFzc2VtYmx5U291cmNlKGFzc2VtYmx5LmFzc2VtYmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaWZmIEFjdGlvblxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRpZmYoY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEaWZmT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RpZmYnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBvcHRpb25zLnN0YWNrcyA/PyBBTExfU1RBQ0tTO1xuICAgIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgc3ludGhTcGFuLmVuZCgpO1xuXG4gICAgY29uc3QgZGlmZlNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uRElGRl9TVEFDSykuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ2RpZmYnKTtcblxuICAgIGNvbnN0IHN0cmljdCA9ICEhb3B0aW9ucy5zdHJpY3Q7XG4gICAgY29uc3QgY29udGV4dExpbmVzID0gb3B0aW9ucy5jb250ZXh0TGluZXMgfHwgMztcbiAgICBjb25zdCBkaWZmTWV0aG9kID0gb3B0aW9ucy5tZXRob2QgPz8gRGlmZk1ldGhvZC5DaGFuZ2VTZXQoKTtcblxuICAgIGxldCBkaWZmcyA9IDA7XG4gICAgbGV0IGZvcm1hdHRlZFNlY3VyaXR5RGlmZiA9ICcnO1xuICAgIGxldCBmb3JtYXR0ZWRTdGFja0RpZmYgPSAnJztcblxuICAgIGlmIChkaWZmTWV0aG9kLm1ldGhvZCA9PT0gJ2xvY2FsLWZpbGUnKSB7XG4gICAgICBjb25zdCBtZXRob2RPcHRpb25zID0gZGlmZk1ldGhvZC5vcHRpb25zIGFzIExvY2FsRmlsZURpZmZPcHRpb25zO1xuXG4gICAgICAvLyBDb21wYXJlIHNpbmdsZSBzdGFjayBhZ2FpbnN0IGZpeGVkIHRlbXBsYXRlXG4gICAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICAnQ2FuIG9ubHkgc2VsZWN0IG9uZSBzdGFjayB3aGVuIGNvbXBhcmluZyB0byBmaXhlZCB0ZW1wbGF0ZS4gVXNlIC0tZXhjbHVzaXZlbHkgdG8gYXZvaWQgc2VsZWN0aW5nIG11bHRpcGxlIHN0YWNrcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBpZiAoIShhd2FpdCBmcy5wYXRoRXhpc3RzKG1ldGhvZE9wdGlvbnMucGF0aCkpKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFRoZXJlIGlzIG5vIGZpbGUgYXQgJHtwYXRofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmaWxlID0gZnMucmVhZEZpbGVTeW5jKG1ldGhvZE9wdGlvbnMucGF0aCkudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZGVzZXJpYWxpemVTdHJ1Y3R1cmUoZmlsZSk7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRGlmZkZvcm1hdHRlcih7XG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICBvbGRUZW1wbGF0ZTogdGVtcGxhdGUsXG4gICAgICAgIG5ld1RlbXBsYXRlOiBzdGFja3MuZmlyc3RTdGFjayxcbiAgICAgIH0pO1xuICAgICAgaWYgKG9wdGlvbnMuc2VjdXJpdHlPbmx5KSB7XG4gICAgICAgIGNvbnN0IHNlY3VyaXR5RGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTZWN1cml0eURpZmYoe1xuICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkcsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtYXR0ZWRTZWN1cml0eURpZmYgPSBzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZiA/PyAnJztcbiAgICAgICAgZGlmZnMgPSBzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZiA/IGRpZmZzICsgMSA6IGRpZmZzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RpZmYoe1xuICAgICAgICAgIHN0cmljdCxcbiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0TGluZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtYXR0ZWRTdGFja0RpZmYgPSBkaWZmLmZvcm1hdHRlZERpZmY7XG4gICAgICAgIGRpZmZzID0gZGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbWV0aG9kT3B0aW9ucyA9IGRpZmZNZXRob2Qub3B0aW9ucyBhcyBDaGFuZ2VTZXREaWZmT3B0aW9ucztcbiAgICAgIC8vIENvbXBhcmUgTiBzdGFja3MgYWdhaW5zdCBkZXBsb3llZCB0ZW1wbGF0ZXNcbiAgICAgIGZvciAoY29uc3Qgc3RhY2sgb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlV2l0aE5lc3RlZFN0YWNrcyA9IGF3YWl0IGRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzKFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgIG1ldGhvZE9wdGlvbnMuY29tcGFyZUFnYWluc3RQcm9jZXNzZWRUZW1wbGF0ZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gdGVtcGxhdGVXaXRoTmVzdGVkU3RhY2tzLmRlcGxveWVkUm9vdFRlbXBsYXRlO1xuICAgICAgICBjb25zdCBuZXN0ZWRTdGFja3MgPSB0ZW1wbGF0ZVdpdGhOZXN0ZWRTdGFja3MubmVzdGVkU3RhY2tzO1xuXG4gICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IG5ldyBEaWZmRm9ybWF0dGVyKHtcbiAgICAgICAgICBpb0hlbHBlcixcbiAgICAgICAgICBvbGRUZW1wbGF0ZTogY3VycmVudFRlbXBsYXRlLFxuICAgICAgICAgIG5ld1RlbXBsYXRlOiBzdGFjayxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hlbHBlciB9KTtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzVG9JbXBvcnQgPSBhd2FpdCBtaWdyYXRvci50cnlHZXRSZXNvdXJjZXMoYXdhaXQgZGVwbG95bWVudHMucmVzb2x2ZUVudmlyb25tZW50KHN0YWNrKSk7XG4gICAgICAgIGlmIChyZXNvdXJjZXNUb0ltcG9ydCkge1xuICAgICAgICAgIHJlbW92ZU5vbkltcG9ydFJlc291cmNlcyhzdGFjayk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2hhbmdlU2V0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGlmIChkaWZmTWV0aG9kLm1ldGhvZCA9PT0gJ2NoYW5nZS1zZXQnKSB7XG4gICAgICAgICAgbGV0IHN0YWNrRXhpc3RzID0gZmFsc2U7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHN0YWNrRXhpc3RzID0gYXdhaXQgZGVwbG95bWVudHMuc3RhY2tFeGlzdHMoe1xuICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgICB0cnlMb29rdXBSb2xlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgQ2hlY2tpbmcgaWYgdGhlIHN0YWNrICR7c3RhY2suc3RhY2tOYW1lfSBleGlzdHMgYmVmb3JlIGNyZWF0aW5nIHRoZSBjaGFuZ2VzZXQgaGFzIGZhaWxlZCwgd2lsbCBiYXNlIHRoZSBkaWZmIG9uIHRlbXBsYXRlIGRpZmZlcmVuY2VzLlxcbmApKTtcbiAgICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfREVCVUcubXNnKGZvcm1hdEVycm9yTWVzc2FnZShlKSkpO1xuICAgICAgICAgICAgc3RhY2tFeGlzdHMgPSBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICAgIGNoYW5nZVNldCA9IGF3YWl0IGNyZWF0ZURpZmZDaGFuZ2VTZXQoaW9IZWxwZXIsIHtcbiAgICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICAgIHV1aWQ6IHV1aWQudjQoKSxcbiAgICAgICAgICAgICAgZGVwbG95bWVudHMsXG4gICAgICAgICAgICAgIHdpbGxFeGVjdXRlOiBmYWxzZSxcbiAgICAgICAgICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RpZmYnKSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczogbWV0aG9kT3B0aW9ucy5wYXJhbWV0ZXJzID8/IHt9LFxuICAgICAgICAgICAgICByZXNvdXJjZXNUb0ltcG9ydCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhgdGhlIHN0YWNrICcke3N0YWNrLnN0YWNrTmFtZX0nIGhhcyBub3QgYmVlbiBkZXBsb3llZCB0byBDbG91ZEZvcm1hdGlvbiBvciBkZXNjcmliZVN0YWNrcyBjYWxsIGZhaWxlZCwgc2tpcHBpbmcgY2hhbmdlc2V0IGNyZWF0aW9uLmApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5zZWN1cml0eU9ubHkpIHtcbiAgICAgICAgICBjb25zdCBzZWN1cml0eURpZmYgPSBmb3JtYXR0ZXIuZm9ybWF0U2VjdXJpdHlEaWZmKHtcbiAgICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkcsXG4gICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgY2hhbmdlU2V0LFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvcm1hdHRlZFNlY3VyaXR5RGlmZiA9IHNlY3VyaXR5RGlmZi5mb3JtYXR0ZWREaWZmID8/ICcnO1xuICAgICAgICAgIGRpZmZzID0gc2VjdXJpdHlEaWZmLmZvcm1hdHRlZERpZmYgPyBkaWZmcyArIDEgOiBkaWZmcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gZm9ybWF0dGVyLmZvcm1hdFN0YWNrRGlmZih7XG4gICAgICAgICAgICBzdHJpY3QsXG4gICAgICAgICAgICBjb250ZXh0OiBjb250ZXh0TGluZXMsXG4gICAgICAgICAgICBzdGFja05hbWU6IHN0YWNrLmRpc3BsYXlOYW1lLFxuICAgICAgICAgICAgY2hhbmdlU2V0LFxuICAgICAgICAgICAgaXNJbXBvcnQ6ICEhcmVzb3VyY2VzVG9JbXBvcnQsXG4gICAgICAgICAgICBuZXN0ZWRTdGFja1RlbXBsYXRlczogbmVzdGVkU3RhY2tzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvcm1hdHRlZFN0YWNrRGlmZiA9IGRpZmYuZm9ybWF0dGVkRGlmZjtcbiAgICAgICAgICBkaWZmcyA9IGRpZmYubnVtU3RhY2tzV2l0aENoYW5nZXM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBhd2FpdCBkaWZmU3Bhbi5lbmQoYOKcqCBOdW1iZXIgb2Ygc3RhY2tzIHdpdGggZGlmZmVyZW5jZXM6ICR7ZGlmZnN9YCwge1xuICAgICAgZm9ybWF0dGVkU2VjdXJpdHlEaWZmLFxuICAgICAgZm9ybWF0dGVkU3RhY2tEaWZmLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3QgQWN0aW9uXG4gICAqXG4gICAqIExpc3Qgc2VsZWN0ZWQgc3RhY2tzIGFuZCB0aGVpciBkZXBlbmRlbmNpZXNcbiAgICovXG4gIHB1YmxpYyBhc3luYyBsaXN0KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogTGlzdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8U3RhY2tEZXRhaWxzW10+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdsaXN0Jyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gb3B0aW9ucy5zdGFja3MgPz8gQUxMX1NUQUNLUztcbiAgICBjb25zdCBzeW50aFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uU1lOVEhfQVNTRU1CTFkpLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcbiAgICBjb25zdCBzdGFja0NvbGxlY3Rpb24gPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IHN0YWNrQ29sbGVjdGlvbi53aXRoRGVwZW5kZW5jaWVzKCk7XG4gICAgY29uc3QgbWVzc2FnZSA9IHN0YWNrcy5tYXAocyA9PiBzLmlkKS5qb2luKCdcXG4nKTtcblxuICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMjkwMS5tc2cobWVzc2FnZSwgeyBzdGFja3MgfSkpO1xuICAgIHJldHVybiBzdGFja3M7XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IEFjdGlvblxuICAgKlxuICAgKiBEZXBsb3lzIHRoZSBzZWxlY3RlZCBzdGFja3MgaW50byBhbiBBV1MgYWNjb3VudFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlcGxveShjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IERlcGxveU9wdGlvbnMgPSB7fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RlcGxveScpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCk7XG4gICAgcmV0dXJuIHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ2RlcGxveScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXBsb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RlcGxveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICd3YXRjaCcsIG9wdGlvbnM6IEV4dGVuZGVkRGVwbG95T3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1M7XG4gICAgY29uc3Qgc3ludGhTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlNZTlRIX0FTU0VNQkxZKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICAgIGNvbnN0IHN0YWNrQ29sbGVjdGlvbiA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrQ29sbGVjdGlvbiwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHN5bnRoRHVyYXRpb24gPSBhd2FpdCBzeW50aFNwYW4uZW5kKCk7XG5cbiAgICBpZiAoc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNTAwMS5tc2coJ1RoaXMgYXBwIGNvbnRhaW5zIG5vIHN0YWNrcycpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZXBsb3ltZW50cyA9IGF3YWl0IHRoaXMuZGVwbG95bWVudHNGb3JBY3Rpb24oJ2RlcGxveScpO1xuICAgIGNvbnN0IG1pZ3JhdG9yID0gbmV3IFJlc291cmNlTWlncmF0b3IoeyBkZXBsb3ltZW50cywgaW9IZWxwZXIgfSk7XG5cbiAgICBhd2FpdCBtaWdyYXRvci50cnlNaWdyYXRlUmVzb3VyY2VzKHN0YWNrQ29sbGVjdGlvbiwgb3B0aW9ucyk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJNYXAgPSBidWlsZFBhcmFtZXRlck1hcChvcHRpb25zLnBhcmFtZXRlcnM/LnBhcmFtZXRlcnMpO1xuXG4gICAgY29uc3QgaG90c3dhcE1vZGUgPSBvcHRpb25zLmhvdHN3YXAgPz8gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UO1xuICAgIGlmIChob3Rzd2FwTW9kZSAhPT0gSG90c3dhcE1vZGUuRlVMTF9ERVBMT1lNRU5UKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzU0MDAubXNnKFtcbiAgICAgICAgJ+KaoO+4jyBUaGUgLS1ob3Rzd2FwIGFuZCAtLWhvdHN3YXAtZmFsbGJhY2sgZmxhZ3MgZGVsaWJlcmF0ZWx5IGludHJvZHVjZSBDbG91ZEZvcm1hdGlvbiBkcmlmdCB0byBzcGVlZCB1cCBkZXBsb3ltZW50cycsXG4gICAgICAgICfimqDvuI8gVGhleSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBkZXZlbG9wbWVudCAtIG5ldmVyIHVzZSB0aGVtIGZvciB5b3VyIHByb2R1Y3Rpb24gU3RhY2tzIScsXG4gICAgICBdLmpvaW4oJ1xcbicpKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhY2tzID0gc3RhY2tDb2xsZWN0aW9uLnN0YWNrQXJ0aWZhY3RzO1xuICAgIGNvbnN0IHN0YWNrT3V0cHV0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfSA9IHt9O1xuICAgIGNvbnN0IG91dHB1dHNGaWxlID0gb3B0aW9ucy5vdXRwdXRzRmlsZTtcblxuICAgIGNvbnN0IGJ1aWxkQXNzZXQgPSBhc3luYyAoYXNzZXROb2RlOiBBc3NldEJ1aWxkTm9kZSkgPT4ge1xuICAgICAgY29uc3QgYnVpbGRBc3NldFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uQlVJTERfQVNTRVQpLmJlZ2luKHtcbiAgICAgICAgYXNzZXQ6IGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZGVwbG95bWVudHMuYnVpbGRTaW5nbGVBc3NldChcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0TWFuaWZlc3RBcnRpZmFjdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0TWFuaWZlc3QsXG4gICAgICAgIGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgICAge1xuICAgICAgICAgIHN0YWNrOiBhc3NldE5vZGUucGFyZW50U3RhY2ssXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIHN0YWNrTmFtZTogYXNzZXROb2RlLnBhcmVudFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBidWlsZEFzc2V0U3Bhbi5lbmQoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHVibGlzaEFzc2V0ID0gYXN5bmMgKGFzc2V0Tm9kZTogQXNzZXRQdWJsaXNoTm9kZSkgPT4ge1xuICAgICAgY29uc3QgcHVibGlzaEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5QVUJMSVNIX0FTU0VUKS5iZWdpbih7XG4gICAgICAgIGFzc2V0OiBhc3NldE5vZGUuYXNzZXQsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IGRlcGxveW1lbnRzLnB1Ymxpc2hTaW5nbGVBc3NldChhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCwgYXNzZXROb2RlLmFzc2V0LCB7XG4gICAgICAgIHN0YWNrOiBhc3NldE5vZGUucGFyZW50U3RhY2ssXG4gICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgc3RhY2tOYW1lOiBhc3NldE5vZGUucGFyZW50U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICBmb3JjZVB1Ymxpc2g6IG9wdGlvbnMuZm9yY2UsXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHB1Ymxpc2hBc3NldFNwYW4uZW5kKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlcGxveVN0YWNrID0gYXN5bmMgKHN0YWNrTm9kZTogU3RhY2tOb2RlKSA9PiB7XG4gICAgICBjb25zdCBzdGFjayA9IHN0YWNrTm9kZS5zdGFjaztcbiAgICAgIGlmIChzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCAhPT0gMSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0lORk8ubXNnKGNoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc3RhY2suZW52aXJvbm1lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgICBgU3RhY2sgJHtzdGFjay5kaXNwbGF5TmFtZX0gZG9lcyBub3QgZGVmaW5lIGFuIGVudmlyb25tZW50LCBhbmQgQVdTIGNyZWRlbnRpYWxzIGNvdWxkIG5vdCBiZSBvYnRhaW5lZCBmcm9tIHN0YW5kYXJkIGxvY2F0aW9ucyBvciBubyByZWdpb24gd2FzIGNvbmZpZ3VyZWQuYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIGdlbmVyYXRlZCBzdGFjayBoYXMgbm8gcmVzb3VyY2VzXG4gICAgICBpZiAoT2JqZWN0LmtleXMoc3RhY2sudGVtcGxhdGUuUmVzb3VyY2VzIHx8IHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHkgYW5kIGRvZXNuJ3QgZXhpc3QgPT4gZG8gbm90aGluZ1xuICAgICAgICBjb25zdCBzdGFja0V4aXN0cyA9IGF3YWl0IGRlcGxveW1lbnRzLnN0YWNrRXhpc3RzKHsgc3RhY2sgfSk7XG4gICAgICAgIGlmICghc3RhY2tFeGlzdHMpIHtcbiAgICAgICAgICByZXR1cm4gaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1MDIxLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIHNraXBwaW5nIGRlcGxveW1lbnQuYCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RhY2sgaXMgZW1wdHksIGJ1dCBleGlzdHMgPT4gZGVsZXRlXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTAyMi5tc2coYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBzdGFjayBoYXMgbm8gcmVzb3VyY2VzLCBkZWxldGluZyBleGlzdGluZyBzdGFjay5gKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuX2Rlc3Ryb3koYXNzZW1ibHksICdkZXBsb3knLCB7XG4gICAgICAgICAgc3RhY2tzOiB7IHBhdHRlcm5zOiBbc3RhY2suaGllcmFyY2hpY2FsSWRdLCBzdHJhdGVneTogU3RhY2tTZWxlY3Rpb25TdHJhdGVneS5QQVRURVJOX01VU1RfTUFUQ0hfU0lOR0xFIH0sXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIGNpOiBvcHRpb25zLmNpLFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGN1cnJlbnRUZW1wbGF0ZSA9IGF3YWl0IGRlcGxveW1lbnRzLnJlYWRDdXJyZW50VGVtcGxhdGUoc3RhY2spO1xuICAgICAgY29uc3QgcGVybWlzc2lvbkNoYW5nZVR5cGUgPSBkZXRlcm1pbmVQZXJtaXNzaW9uVHlwZShjdXJyZW50VGVtcGxhdGUsIHN0YWNrKTtcbiAgICAgIGNvbnN0IGRlcGxveU1vdGl2YXRpb24gPSAnXCItLXJlcXVpcmUtYXBwcm92YWxcIiBpcyBlbmFibGVkIGFuZCBzdGFjayBpbmNsdWRlcyBzZWN1cml0eS1zZW5zaXRpdmUgdXBkYXRlcy4nO1xuICAgICAgY29uc3QgZGVwbG95UXVlc3Rpb24gPSBgJHtkZXBsb3lNb3RpdmF0aW9ufVxcbkRvIHlvdSB3aXNoIHRvIGRlcGxveSB0aGVzZSBjaGFuZ2VzYDtcbiAgICAgIGNvbnN0IGRlcGxveUNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA2MC5yZXEoZGVwbG95UXVlc3Rpb24sIHtcbiAgICAgICAgbW90aXZhdGlvbjogZGVwbG95TW90aXZhdGlvbixcbiAgICAgICAgY29uY3VycmVuY3ksXG4gICAgICAgIHBlcm1pc3Npb25DaGFuZ2VUeXBlLFxuICAgICAgfSkpO1xuICAgICAgaWYgKCFkZXBsb3lDb25maXJtZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHNhbWUgc2VtYW50aWNzIHdlIGFwcGx5IHdpdGggcmVzcGVjdCB0byBOb3RpZmljYXRpb24gQVJOcyAoZGljdGF0ZWQgYnkgdGhlIFNESylcbiAgICAgIC8vXG4gICAgICAvLyAgLSB1bmRlZmluZWQgID0+ICBjZGsgaWdub3JlcyBpdCwgYXMgaWYgaXQgd2Fzbid0IHN1cHBvcnRlZCAoYWxsb3dzIGV4dGVybmFsIG1hbmFnZW1lbnQpLlxuICAgICAgLy8gIC0gW106ICAgICAgICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byB3aXBlIGl0IG91dC5cbiAgICAgIC8vICAtIFsnYXJuLTEnXSAgPT4gIGNkayBtYW5hZ2VzIGl0LCBhbmQgdGhlIHVzZXIgd2FudHMgdG8gc2V0IGl0IHRvIFsnYXJuLTEnXS5cbiAgICAgIGNvbnN0IG5vdGlmaWNhdGlvbkFybnMgPSAoISFvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgfHwgISFzdGFjay5ub3RpZmljYXRpb25Bcm5zKVxuICAgICAgICA/IChvcHRpb25zLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pLmNvbmNhdChzdGFjay5ub3RpZmljYXRpb25Bcm5zID8/IFtdKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBub3RpZmljYXRpb25Bcm4gb2Ygbm90aWZpY2F0aW9uQXJucyA/PyBbXSkge1xuICAgICAgICBpZiAoIXZhbGlkYXRlU25zVG9waWNBcm4obm90aWZpY2F0aW9uQXJuKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYE5vdGlmaWNhdGlvbiBhcm4gJHtub3RpZmljYXRpb25Bcm59IGlzIG5vdCBhIHZhbGlkIGFybiBmb3IgYW4gU05TIHRvcGljYCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhY2tJbmRleCA9IHN0YWNrcy5pbmRleE9mKHN0YWNrKSArIDE7XG4gICAgICBjb25zdCBkZXBsb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFUExPWV9TVEFDSylcbiAgICAgICAgLmJlZ2luKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogZGVwbG95aW5nLi4uIFske3N0YWNrSW5kZXh9LyR7c3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnR9XWAsIHtcbiAgICAgICAgICB0b3RhbDogc3RhY2tDb2xsZWN0aW9uLnN0YWNrQ291bnQsXG4gICAgICAgICAgY3VycmVudDogc3RhY2tJbmRleCxcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgfSk7XG5cbiAgICAgIGxldCB0YWdzID0gb3B0aW9ucy50YWdzO1xuICAgICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRhZ3MgPSB0YWdzRm9yU3RhY2soc3RhY2spO1xuICAgICAgfVxuXG4gICAgICBsZXQgZGVwbG95RHVyYXRpb247XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgZGVwbG95UmVzdWx0OiBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJvbGxiYWNrID0gb3B0aW9ucy5yb2xsYmFjaztcbiAgICAgICAgbGV0IGl0ZXJhdGlvbiA9IDA7XG4gICAgICAgIHdoaWxlICghZGVwbG95UmVzdWx0KSB7XG4gICAgICAgICAgaWYgKCsraXRlcmF0aW9uID4gMikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignVGhpcyBsb29wIHNob3VsZCBoYXZlIHN0YWJpbGl6ZWQgaW4gMiBpdGVyYXRpb25zLCBidXQgZGlkblxcJ3QuIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgciA9IGF3YWl0IGRlcGxveW1lbnRzLmRlcGxveVN0YWNrKHtcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgICAgcmV1c2VBc3NldHM6IG9wdGlvbnMucmV1c2VBc3NldHMsXG4gICAgICAgICAgICBub3RpZmljYXRpb25Bcm5zLFxuICAgICAgICAgICAgdGFncyxcbiAgICAgICAgICAgIGRlcGxveW1lbnRNZXRob2Q6IG9wdGlvbnMuZGVwbG95bWVudE1ldGhvZCxcbiAgICAgICAgICAgIGZvcmNlOiBvcHRpb25zLmZvcmNlLFxuICAgICAgICAgICAgcGFyYW1ldGVyczogT2JqZWN0LmFzc2lnbih7fSwgcGFyYW1ldGVyTWFwWycqJ10sIHBhcmFtZXRlck1hcFtzdGFjay5zdGFja05hbWVdKSxcbiAgICAgICAgICAgIHVzZVByZXZpb3VzUGFyYW1ldGVyczogb3B0aW9ucy5wYXJhbWV0ZXJzPy5rZWVwRXhpc3RpbmdQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgcm9sbGJhY2ssXG4gICAgICAgICAgICBob3Rzd2FwOiBob3Rzd2FwTW9kZSxcbiAgICAgICAgICAgIGV4dHJhVXNlckFnZW50OiBvcHRpb25zLmV4dHJhVXNlckFnZW50LFxuICAgICAgICAgICAgaG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzOiBvcHRpb25zLmhvdHN3YXBQcm9wZXJ0aWVzID8gY3JlYXRlSG90c3dhcFByb3BlcnR5T3ZlcnJpZGVzKG9wdGlvbnMuaG90c3dhcFByb3BlcnRpZXMpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYXNzZXRQYXJhbGxlbGlzbTogb3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgc3dpdGNoIChyLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2RpZC1kZXBsb3ktc3RhY2snOlxuICAgICAgICAgICAgICBkZXBsb3lSZXN1bHQgPSByO1xuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnZmFpbHBhdXNlZC1uZWVkLXJvbGxiYWNrLWZpcnN0Jzoge1xuICAgICAgICAgICAgICBjb25zdCBtb3RpdmF0aW9uID0gci5yZWFzb24gPT09ICdyZXBsYWNlbWVudCdcbiAgICAgICAgICAgICAgICA/IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNoYW5nZSBpbmNsdWRlcyBhIHJlcGxhY2VtZW50IHdoaWNoIGNhbm5vdCBiZSBkZXBsb3llZCB3aXRoIFwiLS1uby1yb2xsYmFja1wiYFxuICAgICAgICAgICAgICAgIDogYFN0YWNrIGlzIGluIGEgcGF1c2VkIGZhaWwgc3RhdGUgKCR7ci5zdGF0dXN9KSBhbmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBkbyBub3QgaW5jbHVkZSBcIi0tbm8tcm9sbGJhY2tcImA7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLmZvcmNlKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkRFRkFVTFRfVE9PTEtJVF9XQVJOLm1zZyhgJHttb3RpdmF0aW9ufS4gUm9sbGluZyBiYWNrIGZpcnN0ICgtLWZvcmNlKS5gKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgICAgbW90aXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCBhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICAgICAgICBvcnBoYW5GYWlsZWRSZXNvdXJjZXM6IG9wdGlvbnMuZm9yY2UsXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdyZXBsYWNlbWVudC1yZXF1aXJlcy1yb2xsYmFjayc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdDaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcIic7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIC8vIEB0b2RvIG5vIGZvcmNlIGhlcmVcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX1dBUk4ubXNnKGAke21vdGl2YXRpb259LiBQcm9jZWVkaW5nIHdpdGggcmVndWxhciBkZXBsb3ltZW50ICgtLWZvcmNlKS5gKSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDUwLnJlcShxdWVzdGlvbiwge1xuICAgICAgICAgICAgICAgICAgbW90aXZhdGlvbixcbiAgICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gR28gYXJvdW5kIHRocm91Z2ggdGhlICd3aGlsZScgbG9vcCBhZ2FpbiBidXQgc3dpdGNoIHJvbGxiYWNrIHRvIHRydWUuXG4gICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoYFVuZXhwZWN0ZWQgcmVzdWx0IHR5cGUgZnJvbSBkZXBsb3lTdGFjazogJHtKU09OLnN0cmluZ2lmeShyKX0uIElmIHlvdSBhcmUgc2VlaW5nIHRoaXMgZXJyb3IsIHBsZWFzZSByZXBvcnQgaXQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy9uZXcvY2hvb3NlYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGRlcGxveVJlc3VsdC5ub09wXG4gICAgICAgICAgPyBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX0gKG5vIGNoYW5nZXMpYFxuICAgICAgICAgIDogYCDinIUgICR7c3RhY2suZGlzcGxheU5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDAubXNnKGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIGRlcGxveVJlc3VsdCkpO1xuICAgICAgICBkZXBsb3lEdXJhdGlvbiA9IGF3YWl0IGRlcGxveVNwYW4udGltaW5nKElPLkNES19UT09MS0lUX0k1MDAwKTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoZGVwbG95UmVzdWx0Lm91dHB1dHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSBbJ091dHB1dHM6J107XG4gICAgICAgICAgc3RhY2tPdXRwdXRzW3N0YWNrLnN0YWNrTmFtZV0gPSBkZXBsb3lSZXN1bHQub3V0cHV0cztcblxuICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykuc29ydCgpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzW25hbWVdO1xuICAgICAgICAgICAgYnVmZmVyLnB1c2goYCR7Y2hhbGsuY3lhbihzdGFjay5pZCl9LiR7Y2hhbGsuY3lhbihuYW1lKX0gPSAke2NoYWxrLnVuZGVybGluZShjaGFsay5jeWFuKHZhbHVlKSl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMS5tc2coYnVmZmVyLmpvaW4oJ1xcbicpKSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAxLm1zZyhgU3RhY2sgQVJOOlxcbiR7ZGVwbG95UmVzdWx0LnN0YWNrQXJufWApKTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBJdCBoYXMgdG8gYmUgZXhhY3RseSB0aGlzIHN0cmluZyBiZWNhdXNlIGFuIGludGVncmF0aW9uIHRlc3QgdGVzdHMgZm9yXG4gICAgICAgIC8vIFwiYm9sZChzdGFja25hbWUpIGZhaWxlZDogUmVzb3VyY2VOb3RSZWFkeTogPGVycm9yPlwiXG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgW2DinYwgICR7Y2hhbGsuYm9sZChzdGFjay5zdGFja05hbWUpfSBmYWlsZWQ6YCwgLi4uKGUubmFtZSA/IFtgJHtlLm5hbWV9OmBdIDogW10pLCBlLm1lc3NhZ2VdLmpvaW4oJyAnKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNlTG9ncykge1xuICAgICAgICAgIC8vIGRlcGxveSBjYWxscyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHdhdGNoIHdpbGwgY29tZSB3aXRoIHRoZWlyIG93biBjbG91ZFdhdGNoTG9nTW9uaXRvclxuICAgICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nTW9uaXRvciA/PyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcih7IGlvSGVscGVyIH0pO1xuICAgICAgICAgIGNvbnN0IGZvdW5kTG9nR3JvdXBzUmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGVwbG95JyksIGlvSGVscGVyLCBzdGFjayk7XG4gICAgICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IuYWRkTG9nR3JvdXBzKFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuZW52LFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuc2RrLFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTAzMS5tc2coYFRoZSBmb2xsb3dpbmcgbG9nIGdyb3VwcyBhcmUgYWRkZWQ6ICR7Zm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lc31gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhbiBvdXRwdXRzIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCBjcmVhdGUgdGhlIGZpbGUgcGF0aCBhbmQgd3JpdGUgc3RhY2sgb3V0cHV0cyB0byBpdCBvbmNlLlxuICAgICAgICAvLyBPdXRwdXRzIGFyZSB3cml0dGVuIGFmdGVyIGFsbCBzdGFja3MgaGF2ZSBiZWVuIGRlcGxveWVkLiBJZiBhIHN0YWNrIGRlcGxveW1lbnQgZmFpbHMsXG4gICAgICAgIC8vIGFsbCBvZiB0aGUgb3V0cHV0cyBmcm9tIHN1Y2Nlc3NmdWxseSBkZXBsb3llZCBzdGFja3MgYmVmb3JlIHRoZSBmYWlsdXJlIHdpbGwgc3RpbGwgYmUgd3JpdHRlbi5cbiAgICAgICAgaWYgKG91dHB1dHNGaWxlKSB7XG4gICAgICAgICAgZnMuZW5zdXJlRmlsZVN5bmMob3V0cHV0c0ZpbGUpO1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSnNvbihvdXRwdXRzRmlsZSwgc3RhY2tPdXRwdXRzLCB7XG4gICAgICAgICAgICBzcGFjZXM6IDIsXG4gICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHN5bnRoRHVyYXRpb24uYXNNcyArIChkZXBsb3lEdXJhdGlvbj8uYXNNcyA/PyAwKTtcbiAgICAgIGF3YWl0IGRlcGxveVNwYW4uZW5kKGBcXG7inKggIFRvdGFsIHRpbWU6ICR7Zm9ybWF0VGltZShkdXJhdGlvbil9c1xcbmAsIHsgZHVyYXRpb24gfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2V0QnVpbGRUaW1lID0gb3B0aW9ucy5hc3NldEJ1aWxkVGltZSA/PyBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBwcmVidWlsZEFzc2V0cyA9IGFzc2V0QnVpbGRUaW1lID09PSBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcblxuICAgIGNvbnN0IHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMgPSBzdGFja3MuZmxhdE1hcCgoc3RhY2spID0+IFtcbiAgICAgIHN0YWNrLFxuICAgICAgLi4uc3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcih4ID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSksXG4gICAgXSk7XG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoaW9IZWxwZXIsIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2UpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0cyh3b3JrR3JhcGgsIGRlcGxveW1lbnRzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBjb25zdCBncmFwaENvbmN1cnJlbmN5OiBDb25jdXJyZW5jeSA9IHtcbiAgICAgICdzdGFjayc6IGNvbmN1cnJlbmN5LFxuICAgICAgJ2Fzc2V0LWJ1aWxkJzogMSwgLy8gVGhpcyB3aWxsIGJlIENQVS1ib3VuZC9tZW1vcnkgYm91bmQsIG1vc3RseSBtYXR0ZXJzIGZvciBEb2NrZXIgYnVpbGRzXG4gICAgICAnYXNzZXQtcHVibGlzaCc6IChvcHRpb25zLmFzc2V0UGFyYWxsZWxpc20gPz8gdHJ1ZSkgPyA4IDogMSwgLy8gVGhpcyB3aWxsIGJlIEkvTy1ib3VuZCwgOCBpbiBwYXJhbGxlbCBzZWVtcyByZWFzb25hYmxlXG4gICAgfTtcblxuICAgIGF3YWl0IHdvcmtHcmFwaC5kb1BhcmFsbGVsKGdyYXBoQ29uY3VycmVuY3ksIHtcbiAgICAgIGRlcGxveVN0YWNrLFxuICAgICAgYnVpbGRBc3NldCxcbiAgICAgIHB1Ymxpc2hBc3NldCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYXRjaCBBY3Rpb25cbiAgICpcbiAgICogQ29udGludW91c2x5IG9ic2VydmUgcHJvamVjdCBmaWxlcyBhbmQgZGVwbG95IHRoZSBzZWxlY3RlZCBzdGFja3MgYXV0b21hdGljYWxseSB3aGVuIGNoYW5nZXMgYXJlIGRldGVjdGVkLlxuICAgKiBJbXBsaWVzIGhvdHN3YXAgZGVwbG95bWVudHMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2F0Y2goY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICd3YXRjaCcpO1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCwgZmFsc2UpO1xuICAgIGNvbnN0IHJvb3REaXIgPSBvcHRpb25zLndhdGNoRGlyID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgICBpZiAob3B0aW9ucy5pbmNsdWRlID09PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5leGNsdWRlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgIFwiQ2Fubm90IHVzZSB0aGUgJ3dhdGNoJyBjb21tYW5kIHdpdGhvdXQgc3BlY2lmeWluZyBhdCBsZWFzdCBvbmUgZGlyZWN0b3J5IHRvIG1vbml0b3IuIFwiICtcbiAgICAgICAgICAnTWFrZSBzdXJlIHRvIGFkZCBhIFwid2F0Y2hcIiBrZXkgdG8geW91ciBjZGsuanNvbicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEZvciB0aGUgXCJpbmNsdWRlXCIgc3Via2V5IHVuZGVyIHRoZSBcIndhdGNoXCIga2V5LCB0aGUgYmVoYXZpb3IgaXM6XG4gICAgLy8gMS4gTm8gXCJ3YXRjaFwiIHNldHRpbmc/IFdlIGVycm9yIG91dC5cbiAgICAvLyAyLiBcIndhdGNoXCIgc2V0dGluZyB3aXRob3V0IGFuIFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIuLyoqXCIuXG4gICAgLy8gMy4gXCJ3YXRjaFwiIHNldHRpbmcgd2l0aCBhbiBlbXB0eSBcImluY2x1ZGVcIiBrZXk/IFdlIGRlZmF1bHQgdG8gb2JzZXJ2aW5nIFwiLi8qKlwiLlxuICAgIC8vIDQuIE5vbi1lbXB0eSBcImluY2x1ZGVcIiBrZXk/IEp1c3QgdXNlIHRoZSBcImluY2x1ZGVcIiBrZXkuXG4gICAgY29uc3Qgd2F0Y2hJbmNsdWRlcyA9IHBhdHRlcm5zQXJyYXlGb3JXYXRjaChvcHRpb25zLmluY2x1ZGUsIHtcbiAgICAgIHJvb3REaXIsXG4gICAgICByZXR1cm5Sb290RGlySWZFbXB0eTogdHJ1ZSxcbiAgICB9KTtcblxuICAgIC8vIEZvciB0aGUgXCJleGNsdWRlXCIgc3Via2V5IHVuZGVyIHRoZSBcIndhdGNoXCIga2V5LFxuICAgIC8vIHRoZSBiZWhhdmlvciBpcyB0byBhZGQgc29tZSBkZWZhdWx0IGV4Y2x1ZGVzIGluIGFkZGl0aW9uIHRvIHRoZSBvbmVzIHNwZWNpZmllZCBieSB0aGUgdXNlcjpcbiAgICAvLyAxLiBUaGUgQ0RLIG91dHB1dCBkaXJlY3RvcnkuXG4gICAgLy8gMi4gQW55IGZpbGUgd2hvc2UgbmFtZSBzdGFydHMgd2l0aCBhIGRvdC5cbiAgICAvLyAzLiBBbnkgZGlyZWN0b3J5J3MgY29udGVudCB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIC8vIDQuIEFueSBub2RlX21vZHVsZXMgYW5kIGl0cyBjb250ZW50IChldmVuIGlmIGl0J3Mgbm90IGEgSlMvVFMgcHJvamVjdCwgeW91IG1pZ2h0IGJlIHVzaW5nIGEgbG9jYWwgYXdzLWNsaSBwYWNrYWdlKVxuICAgIGNvbnN0IG91dGRpciA9IG9wdGlvbnMub3V0ZGlyID8/ICdjZGsub3V0JztcbiAgICBjb25zdCB3YXRjaEV4Y2x1ZGVzID0gcGF0dGVybnNBcnJheUZvcldhdGNoKG9wdGlvbnMuZXhjbHVkZSwge1xuICAgICAgcm9vdERpcixcbiAgICAgIHJldHVyblJvb3REaXJJZkVtcHR5OiBmYWxzZSxcbiAgICB9KS5jb25jYXQoYCR7b3V0ZGlyfS8qKmAsICcqKi8uKicsICcqKi8uKi8qKicsICcqKi9ub2RlX21vZHVsZXMvKionKTtcblxuICAgIC8vIFByaW50IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gb24gY29tcHV0ZWQgc2V0dGluZ3NcbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTAubXNnKFtcbiAgICAgIGByb290IGRpcmVjdG9yeSB1c2VkIGZvciAnd2F0Y2gnIGlzOiAke3Jvb3REaXJ9YCxcbiAgICAgIGAnaW5jbHVkZScgcGF0dGVybnMgZm9yICd3YXRjaCc6ICR7SlNPTi5zdHJpbmdpZnkod2F0Y2hJbmNsdWRlcyl9YCxcbiAgICAgIGAnZXhjbHVkZScgcGF0dGVybnMgZm9yICd3YXRjaCc6ICR7SlNPTi5zdHJpbmdpZnkod2F0Y2hFeGNsdWRlcyl9YCxcbiAgICBdLmpvaW4oJ1xcbicpLCB7XG4gICAgICB3YXRjaERpcjogcm9vdERpcixcbiAgICAgIGluY2x1ZGVzOiB3YXRjaEluY2x1ZGVzLFxuICAgICAgZXhjbHVkZXM6IHdhdGNoRXhjbHVkZXMsXG4gICAgfSkpO1xuXG4gICAgLy8gU2luY2UgJ2NkayBkZXBsb3knIGlzIGEgcmVsYXRpdmVseSBzbG93IG9wZXJhdGlvbiBmb3IgYSAnd2F0Y2gnIHByb2Nlc3MsXG4gICAgLy8gaW50cm9kdWNlIGEgY29uY3VycmVuY3kgbGF0Y2ggdGhhdCB0cmFja3MgdGhlIHN0YXRlLlxuICAgIC8vIFRoaXMgd2F5LCBpZiBmaWxlIGNoYW5nZSBldmVudHMgYXJyaXZlIHdoZW4gYSAnY2RrIGRlcGxveScgaXMgc3RpbGwgZXhlY3V0aW5nLFxuICAgIC8vIHdlIHdpbGwgYmF0Y2ggdGhlbSwgYW5kIHRyaWdnZXIgYW5vdGhlciAnY2RrIGRlcGxveScgYWZ0ZXIgdGhlIGN1cnJlbnQgb25lIGZpbmlzaGVzLFxuICAgIC8vIG1ha2luZyBzdXJlICdjZGsgZGVwbG95J3MgIGFsd2F5cyBleGVjdXRlIG9uZSBhdCBhIHRpbWUuXG4gICAgLy8gSGVyZSdzIGEgZGlhZ3JhbSBzaG93aW5nIHRoZSBzdGF0ZSB0cmFuc2l0aW9uczpcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICAgIGZpbGUgY2hhbmdlZCAgICAgLS0tLS0tLS0tLS0tLS0gIGZpbGUgY2hhbmdlZFxuICAgIC8vIHwgICAgICAgICAgICB8ICByZWFkeSBldmVudCAgIHwgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgICAgfCAtLS0tLS0tLS0tLS0tLXxcbiAgICAvLyB8IHByZS1yZWFkeSAgfCAtLS0tLS0tLS0tLS0tPiB8IG9wZW4gfCAgICAgICAgICAgICAgICAgICAgIHwgZGVwbG95aW5nICB8ICAgICAgICAgICAgICAgICAgICAgfCAgIHF1ZXVlZCAgIHwgICAgICAgICAgICAgICB8XG4gICAgLy8gfCAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLS0tLS0tIHwgICAgICAgICAgICB8IDwtLS0tLS0tLS0tLS0tfFxuICAgIC8vIC0tLS0tLS0tLS0tLS0tICAgICAgICAgICAgICAgIC0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS0gICdjZGsgZGVwbG95JyBkb25lICAtLS0tLS0tLS0tLS0tLVxuICAgIHR5cGUgTGF0Y2hTdGF0ZSA9ICdwcmUtcmVhZHknIHwgJ29wZW4nIHwgJ2RlcGxveWluZycgfCAncXVldWVkJztcbiAgICBsZXQgbGF0Y2g6IExhdGNoU3RhdGUgPSAncHJlLXJlYWR5JztcblxuICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy50cmFjZUxvZ3MgPyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcih7IGlvSGVscGVyIH0pIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlcGxveUFuZFdhdGNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgbGF0Y2ggPSAnZGVwbG95aW5nJyBhcyBMYXRjaFN0YXRlO1xuICAgICAgYXdhaXQgY2xvdWRXYXRjaExvZ01vbml0b3I/LmRlYWN0aXZhdGUoKTtcblxuICAgICAgYXdhaXQgdGhpcy5pbnZva2VEZXBsb3lGcm9tV2F0Y2goYXNzZW1ibHksIG9wdGlvbnMsIGNsb3VkV2F0Y2hMb2dNb25pdG9yKTtcblxuICAgICAgLy8gSWYgbGF0Y2ggaXMgc3RpbGwgJ2RlcGxveWluZycgYWZ0ZXIgdGhlICdhd2FpdCcsIHRoYXQncyBmaW5lLFxuICAgICAgLy8gYnV0IGlmIGl0J3MgJ3F1ZXVlZCcsIHRoYXQgbWVhbnMgd2UgbmVlZCB0byBkZXBsb3kgYWdhaW5cbiAgICAgIHdoaWxlIChsYXRjaCA9PT0gJ3F1ZXVlZCcpIHtcbiAgICAgICAgLy8gVHlwZVNjcmlwdCBkb2Vzbid0IHJlYWxpemUgbGF0Y2ggY2FuIGNoYW5nZSBiZXR3ZWVuICdhd2FpdHMnLFxuICAgICAgICAvLyBhbmQgdGhpbmtzIHRoZSBhYm92ZSAnd2hpbGUnIGNvbmRpdGlvbiBpcyBhbHdheXMgJ2ZhbHNlJyB3aXRob3V0IHRoZSBjYXN0XG4gICAgICAgIGxhdGNoID0gJ2RlcGxveWluZyc7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxNS5tc2coXCJEZXRlY3RlZCBmaWxlIGNoYW5nZXMgZHVyaW5nIGRlcGxveW1lbnQuIEludm9raW5nICdjZGsgZGVwbG95JyBhZ2FpblwiKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG4gICAgICB9XG4gICAgICBsYXRjaCA9ICdvcGVuJztcbiAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5hY3RpdmF0ZSgpO1xuICAgIH07XG5cbiAgICBjaG9raWRhclxuICAgICAgLndhdGNoKHdhdGNoSW5jbHVkZXMsIHtcbiAgICAgICAgaWdub3JlZDogd2F0Y2hFeGNsdWRlcyxcbiAgICAgICAgY3dkOiByb290RGlyLFxuICAgICAgfSlcbiAgICAgIC5vbigncmVhZHknLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGxhdGNoID0gJ29wZW4nO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uREVGQVVMVF9UT09MS0lUX0RFQlVHLm1zZyhcIid3YXRjaCcgcmVjZWl2ZWQgdGhlICdyZWFkeScgZXZlbnQuIEZyb20gbm93IG9uLCBhbGwgZmlsZSBjaGFuZ2VzIHdpbGwgdHJpZ2dlciBhIGRlcGxveW1lbnRcIikpO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTQubXNnKFwiVHJpZ2dlcmluZyBpbml0aWFsICdjZGsgZGVwbG95J1wiKSk7XG4gICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICB9KVxuICAgICAgLm9uKCdhbGwnLCBhc3luYyAoZXZlbnQ6ICdhZGQnIHwgJ2FkZERpcicgfCAnY2hhbmdlJyB8ICd1bmxpbmsnIHwgJ3VubGlua0RpcicsIGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3Qgd2F0Y2hFdmVudCA9IHtcbiAgICAgICAgICBldmVudCxcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGxhdGNoID09PSAncHJlLXJlYWR5Jykge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMS5tc2coYCd3YXRjaCcgaXMgb2JzZXJ2aW5nICR7ZXZlbnQgPT09ICdhZGREaXInID8gJ2RpcmVjdG9yeScgOiAndGhlIGZpbGUnfSAnJHtmaWxlUGF0aH0nIGZvciBjaGFuZ2VzYCwgd2F0Y2hFdmVudCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGxhdGNoID09PSAnb3BlbicpIHtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTIubXNnKGBEZXRlY3RlZCBjaGFuZ2UgdG8gJyR7ZmlsZVBhdGh9JyAodHlwZTogJHtldmVudH0pLiBUcmlnZ2VyaW5nICdjZGsgZGVwbG95J2AsIHdhdGNoRXZlbnQpKTtcbiAgICAgICAgICBhd2FpdCBkZXBsb3lBbmRXYXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIHRoaXMgbWVhbnMgbGF0Y2ggaXMgZWl0aGVyICdkZXBsb3lpbmcnIG9yICdxdWV1ZWQnXG4gICAgICAgICAgbGF0Y2ggPSAncXVldWVkJztcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTMubXNnKFxuICAgICAgICAgICAgYERldGVjdGVkIGNoYW5nZSB0byAnJHtmaWxlUGF0aH0nICh0eXBlOiAke2V2ZW50fSkgd2hpbGUgJ2NkayBkZXBsb3knIGlzIHN0aWxsIHJ1bm5pbmcuIFdpbGwgcXVldWUgZm9yIGFub3RoZXIgZGVwbG95bWVudCBhZnRlciB0aGlzIG9uZSBmaW5pc2hlcydgLFxuICAgICAgICAgICAgd2F0Y2hFdmVudCxcbiAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUm9sbGJhY2sgQWN0aW9uXG4gICAqXG4gICAqIFJvbGxzIGJhY2sgdGhlIHNlbGVjdGVkIHN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByb2xsYmFjayhjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3JvbGxiYWNrJyk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcbiAgICByZXR1cm4gdGhpcy5fcm9sbGJhY2soYXNzZW1ibHksICdyb2xsYmFjaycsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyByb2xsYmFjayBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IG9yIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX3JvbGxiYWNrKGFzc2VtYmx5OiBTdGFja0Fzc2VtYmx5LCBhY3Rpb246ICdyb2xsYmFjaycgfCAnZGVwbG95JyB8ICd3YXRjaCcsIG9wdGlvbnM6IFJvbGxiYWNrT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzeW50aFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uU1lOVEhfQVNTRU1CTFkpLmJlZ2luKHsgc3RhY2tzOiBvcHRpb25zLnN0YWNrcyB9KTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcywgaW9IZWxwZXIpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGlmIChzdGFja3Muc3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U2MDAxLm1zZygnTm8gc3RhY2tzIHNlbGVjdGVkJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhbnlSb2xsYmFja2FibGUgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGFja10gb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmVudHJpZXMoKSkge1xuICAgICAgY29uc3Qgcm9sbGJhY2tTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlJPTExCQUNLX1NUQUNLKS5iZWdpbihgUm9sbGluZyBiYWNrICR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9YCwge1xuICAgICAgICB0b3RhbDogc3RhY2tzLnN0YWNrQ291bnQsXG4gICAgICAgIGN1cnJlbnQ6IGluZGV4ICsgMSxcbiAgICAgICAgc3RhY2ssXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbigncm9sbGJhY2snKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHN0YWNrUmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMucm9sbGJhY2tTdGFjayh7XG4gICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICBmb3JjZTogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMsXG4gICAgICAgICAgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb246IG9wdGlvbnMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgICAgb3JwaGFuTG9naWNhbElkczogb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlKSB7XG4gICAgICAgICAgYW55Um9sbGJhY2thYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCByb2xsYmFja1NwYW4uZW5kKCk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U2OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX0gZmFpbGVkOiAke2Zvcm1hdEVycm9yTWVzc2FnZShlKX1gLCB7IGVycm9yOiBlIH0pKTtcbiAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUm9sbGJhY2sgZmFpbGVkICh1c2UgLS1mb3JjZSB0byBvcnBoYW4gZmFpbGluZyByZXNvdXJjZXMpJyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghYW55Um9sbGJhY2thYmxlKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdObyBzdGFja3Mgd2VyZSBpbiBhIHN0YXRlIHRoYXQgY291bGQgYmUgcm9sbGVkIGJhY2snKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVzdHJveSBBY3Rpb25cbiAgICpcbiAgICogRGVzdHJveXMgdGhlIHNlbGVjdGVkIFN0YWNrcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXN0cm95KGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGVzdHJveU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkZXN0cm95Jyk7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcbiAgICByZXR1cm4gdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2Rlc3Ryb3knLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgdG8gYWxsb3cgZGVzdHJveSBiZWluZyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgZGVwbG95IGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2Rlc3Ryb3koYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ2RlcGxveScgfCAnZGVzdHJveScsIG9wdGlvbnM6IERlc3Ryb3lPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pO1xuICAgIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IG9wdGlvbnMuc3RhY2tzIH0pO1xuICAgIC8vIFRoZSBzdGFja3Mgd2lsbCBoYXZlIGJlZW4gb3JkZXJlZCBmb3IgZGVwbG95bWVudCwgc28gcmV2ZXJzZSB0aGVtIGZvciBkZWxldGlvbi5cbiAgICBjb25zdCBzdGFja3MgPSAoYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIob3B0aW9ucy5zdGFja3MpKS5yZXZlcnNlZCgpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGNvbnN0IG1vdGl2YXRpb24gPSAnRGVzdHJveWluZyBzdGFja3MgaXMgYW4gaXJyZXZlcnNpYmxlIGFjdGlvbic7XG4gICAgY29uc3QgcXVlc3Rpb24gPSBgQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZTogJHtjaGFsay5yZWQoc3RhY2tzLmhpZXJhcmNoaWNhbElkcy5qb2luKCcsICcpKX1gO1xuICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNzAxMC5yZXEocXVlc3Rpb24sIHsgbW90aXZhdGlvbiB9KSk7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIHJldHVybiBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTcwMTAubXNnKCdBYm9ydGVkIGJ5IHVzZXInKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdHJveVNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uREVTVFJPWV9BQ1RJT04pLmJlZ2luKHtcbiAgICAgIHN0YWNrczogc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLFxuICAgIH0pO1xuICAgIHRyeSB7XG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgc3RhY2tdIG9mIHN0YWNrcy5zdGFja0FydGlmYWN0cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBzaW5nbGVEZXN0cm95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVNUUk9ZX1NUQUNLKVxuICAgICAgICAgICAgLmJlZ2luKGNoYWxrLmdyZWVuKGAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogZGVzdHJveWluZy4uLiBbJHtpbmRleCArIDF9LyR7c3RhY2tzLnN0YWNrQ291bnR9XWApLCB7XG4gICAgICAgICAgICAgIHRvdGFsOiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgICAgICAgICAgY3VycmVudDogaW5kZXggKyAxLFxuICAgICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbihhY3Rpb24pO1xuICAgICAgICAgIGF3YWl0IGRlcGxveW1lbnRzLmRlc3Ryb3lTdGFjayh7XG4gICAgICAgICAgICBzdGFjayxcbiAgICAgICAgICAgIGRlcGxveU5hbWU6IHN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybixcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTc5MDAubXNnKGNoYWxrLmdyZWVuKGBcXG4g4pyFICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259ZWRgKSwgc3RhY2spKTtcbiAgICAgICAgICBhd2FpdCBzaW5nbGVEZXN0cm95U3Bhbi5lbmQoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufSBmYWlsZWQgJHtlfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGVzdHJveVNwYW4uZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogSW9IZWxwZXIpIHtcbiAgICBjb25zdCBidWlsZGVyID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCkgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6IHJldHVybiBJTy5DREtfQVNTRU1CTFlfRTk5OTk7XG4gICAgICAgIGNhc2UgJ3dhcm4nOiByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX1c5OTk5O1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX0k5OTk5O1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEoXG4gICAgICB0aGlzLnByb3BzLmFzc2VtYmx5RmFpbHVyZUF0LFxuICAgICAgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoYnVpbGRlcihsZXZlbCkubXNnKGBbJHtsZXZlbH0gYXQgJHttc2cuaWR9XSAke21zZy5lbnRyeS5kYXRhfWAsIG1zZykpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVwbG95bWVudHMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxEZXBsb3ltZW50cz4ge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudHMoe1xuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoYWN0aW9uKSxcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnZva2VEZXBsb3lGcm9tV2F0Y2goXG4gICAgYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksXG4gICAgb3B0aW9uczogV2F0Y2hPcHRpb25zLFxuICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPzogQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2ggZGVmYXVsdHMgaG90c3dhcCB0byBlbmFibGVkXG4gICAgY29uc3QgaG90c3dhcCA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5IT1RTV0FQX09OTFk7XG4gICAgY29uc3QgZGVwbG95T3B0aW9uczogRXh0ZW5kZWREZXBsb3lPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLk5FVkVSLFxuICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IsXG4gICAgICBob3Rzd2FwLFxuICAgICAgZXh0cmFVc2VyQWdlbnQ6IGBjZGstd2F0Y2gvaG90c3dhcC0ke2hvdHN3YXAgPT09IEhvdHN3YXBNb2RlLkZVTExfREVQTE9ZTUVOVCA/ICdvZmYnIDogJ29uJ31gLFxuICAgIH07XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5fZGVwbG95KGFzc2VtYmx5LCAnd2F0Y2gnLCBkZXBsb3lPcHRpb25zKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGp1c3QgY29udGludWUgLSBkZXBsb3kgd2lsbCBzaG93IHRoZSBlcnJvclxuICAgIH1cbiAgfVxufVxuIl19
|
|
965
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9vbGtpdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRvb2xraXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGtDQUFrQztBQUVsQyx5Q0FBeUM7QUFDekMsK0JBQStCO0FBQy9CLHFDQUFxQztBQUNyQywrQkFBK0I7QUFDL0IsdUVBQWlFO0FBRWpFLHVDQUErQztBQVEvQyxvREFBdUQ7QUFDdkQsOENBQXVFO0FBQ3ZFLHVEQUttQztBQUduQyxxREFBa0g7QUFNbEgsc0RBQWlFO0FBR2pFLDBEQUFvRjtBQUVwRiwyREFBdUY7QUFFdkYsK0NBQThHO0FBVTlHLDBEQXFCK0I7QUFFL0IsMENBTXlCO0FBQ3pCLHFEQUE2QztBQUM3QywrQ0FBd0Q7QUE2Q3hEOztHQUVHO0FBQ0gsTUFBYSxPQUFRLFNBQVEsb0NBQTBCO0lBZ0JqQjtJQWZwQzs7T0FFRztJQUNhLGdCQUFnQixDQUFTO0lBRXpDOztPQUVHO0lBQ2EsTUFBTSxDQUFVO0lBRWhDOztPQUVHO0lBQ0ssZ0JBQWdCLENBQWU7SUFFdkMsWUFBb0MsUUFBd0IsRUFBRTtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUQwQixVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUU1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixJQUFJLDJDQUEwQixDQUFDO1FBRTdFLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSw4Q0FBb0IsRUFBRSxDQUFDO1FBQ3hELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixNQUFNLEdBQUcsSUFBQSx1QkFBYSxFQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDMUIsTUFBTSxHQUFHLElBQUEsc0JB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LEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUMxRyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLG9CQUFvQixDQUFDLE1BQXFCO1FBQ3RELE9BQU8sSUFBSSw0QkFBVyxDQUFDO1lBQ3JCLFdBQVcsRUFBRSxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1lBQzNDLGdCQUFnQixFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDdkMsUUFBUSxFQUFFLElBQUEsMkJBQVUsRUFBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztTQUMxQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLHFCQUFxQixDQUNqQyxRQUF1QixFQUN2QixPQUFxQixFQUNyQixvQkFBZ0Q7UUFFaEQsb0NBQW9DO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksNEJBQVcsQ0FBQyxZQUFZLENBQUM7UUFDNUQsTUFBTSxhQUFhLEdBQTBCO1lBQzNDLEdBQUcsT0FBTztZQUNWLG9CQUFvQjtZQUNwQixPQUFPO1lBQ1AsY0FBYyxFQUFFLHFCQUFxQixPQUFPLEtBQUssNEJBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO1NBQzlGLENBQUM7UUFFRixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsNkNBQTZDO1FBQy9DLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUE1N0JELDBCQTQ3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFRlbXBsYXRlRGlmZiB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkZm9ybWF0aW9uLWRpZmYnO1xuaW1wb3J0ICogYXMgY3hhcGkgZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCAqIGFzIGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCB7IE5vbkludGVyYWN0aXZlSW9Ib3N0IH0gZnJvbSAnLi9ub24taW50ZXJhY3RpdmUtaW8taG9zdCc7XG5pbXBvcnQgdHlwZSB7IFRvb2xraXRTZXJ2aWNlcyB9IGZyb20gJy4vcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc3NlbWJseUZyb21Tb3VyY2UgfSBmcm9tICcuL3ByaXZhdGUnO1xuaW1wb3J0IHR5cGUgeyBEZXBsb3lSZXN1bHQsIERlc3Ryb3lSZXN1bHQsIFJvbGxiYWNrUmVzdWx0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgdHlwZSB7XG4gIEJvb3RzdHJhcEVudmlyb25tZW50cyxcbiAgQm9vdHN0cmFwT3B0aW9ucyxcbiAgQm9vdHN0cmFwUmVzdWx0LFxuICBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCxcbn0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQm9vdHN0cmFwU291cmNlIH0gZnJvbSAnLi4vYWN0aW9ucy9ib290c3RyYXAnO1xuaW1wb3J0IHsgQXNzZXRCdWlsZFRpbWUsIHR5cGUgRGVwbG95T3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGVwbG95JztcbmltcG9ydCB7XG4gIGJ1aWxkUGFyYW1ldGVyTWFwLFxuICBjcmVhdGVIb3Rzd2FwUHJvcGVydHlPdmVycmlkZXMsXG4gIHR5cGUgRXh0ZW5kZWREZXBsb3lPcHRpb25zLFxuICByZW1vdmVQdWJsaXNoZWRBc3NldHNGcm9tV29ya0dyYXBoLFxufSBmcm9tICcuLi9hY3Rpb25zL2RlcGxveS9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgRGVzdHJveU9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2Rlc3Ryb3knO1xuaW1wb3J0IHR5cGUgeyBEaWZmT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZic7XG5pbXBvcnQgeyBhcHBlbmRPYmplY3QsIGRldGVybWluZVBlcm1pc3Npb25UeXBlLCBtYWtlVGVtcGxhdGVJbmZvcyBhcyBwcmVwYXJlRGlmZiB9IGZyb20gJy4uL2FjdGlvbnMvZGlmZi9wcml2YXRlJztcbmltcG9ydCB7IHR5cGUgTGlzdE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL2xpc3QnO1xuaW1wb3J0IHR5cGUgeyBSZWZhY3Rvck9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3JlZmFjdG9yJztcbmltcG9ydCB7IHR5cGUgUm9sbGJhY2tPcHRpb25zIH0gZnJvbSAnLi4vYWN0aW9ucy9yb2xsYmFjayc7XG5pbXBvcnQgeyB0eXBlIFN5bnRoT3B0aW9ucyB9IGZyb20gJy4uL2FjdGlvbnMvc3ludGgnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE9wdGlvbnMgfSBmcm9tICcuLi9hY3Rpb25zL3dhdGNoJztcbmltcG9ydCB7IHBhdHRlcm5zQXJyYXlGb3JXYXRjaCB9IGZyb20gJy4uL2FjdGlvbnMvd2F0Y2gvcHJpdmF0ZSc7XG5pbXBvcnQgeyB0eXBlIFNka0NvbmZpZyB9IGZyb20gJy4uL2FwaS9hd3MtYXV0aCc7XG5pbXBvcnQgdHlwZSB7IElDbG91ZEFzc2VtYmx5U291cmNlIH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5JztcbmltcG9ydCB7IENhY2hlZENsb3VkQXNzZW1ibHksIFN0YWNrU2VsZWN0aW9uU3RyYXRlZ3kgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHknO1xuaW1wb3J0IHR5cGUgeyBTdGFja0Fzc2VtYmx5IH0gZnJvbSAnLi4vYXBpL2Nsb3VkLWFzc2VtYmx5L3ByaXZhdGUnO1xuaW1wb3J0IHsgQUxMX1NUQUNLUywgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIgfSBmcm9tICcuLi9hcGkvY2xvdWQtYXNzZW1ibHkvcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IElJb0hvc3QsIElvTWVzc2FnZUxldmVsIH0gZnJvbSAnLi4vYXBpL2lvJztcbmltcG9ydCB7IGFzU2RrTG9nZ2VyLCBJTywgU1BBTiwgd2l0aG91dENvbG9yLCB3aXRob3V0RW1vamlzLCB3aXRoVHJpbW1lZFdoaXRlc3BhY2UgfSBmcm9tICcuLi9hcGkvaW8vcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEFzc2V0QnVpbGROb2RlLFxuICBBc3NldFB1Ymxpc2hOb2RlLFxuICBDb25jdXJyZW5jeSxcbiAgSW9IZWxwZXIsXG4gIFN0YWNrQ29sbGVjdGlvbixcbiAgU3RhY2tOb2RlLFxuICBTdWNjZXNzZnVsRGVwbG95U3RhY2tSZXN1bHQsXG59IGZyb20gJy4uL2FwaS9zaGFyZWQtcHJpdmF0ZSc7XG5pbXBvcnQge1xuICBBbWJpZ3VpdHlFcnJvcixcbiAgYW1iaWd1b3VzTW92ZW1lbnRzLFxuICBhc0lvSGVscGVyLFxuICBCb290c3RyYXBwZXIsXG4gIENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IsXG4gIERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLFxuICBEZXBsb3ltZW50cyxcbiAgRGlmZkZvcm1hdHRlcixcbiAgZmluZFJlc291cmNlTW92ZW1lbnRzLFxuICBmaW5kQ2xvdWRXYXRjaExvZ0dyb3VwcyxcbiAgZm9ybWF0QW1iaWd1b3VzTWFwcGluZ3MsXG4gIGZvcm1hdFR5cGVkTWFwcGluZ3MsXG4gIEhvdHN3YXBNb2RlLFxuICBSZXF1aXJlQXBwcm92YWwsXG4gIFJlc291cmNlTWlncmF0b3IsXG4gIFNka1Byb3ZpZGVyLFxuICB0YWdzRm9yU3RhY2ssXG4gIFRvb2xraXRFcnJvcixcbiAgcmVzb3VyY2VNYXBwaW5ncyxcbiAgV29ya0dyYXBoQnVpbGRlcixcbn0gZnJvbSAnLi4vYXBpL3NoYXJlZC1wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQXNzZW1ibHlEYXRhLCBTdGFja0RldGFpbHMsIFRvb2xraXRBY3Rpb24gfSBmcm9tICcuLi9hcGkvc2hhcmVkLXB1YmxpYyc7XG5pbXBvcnQge1xuICBmb3JtYXRFcnJvck1lc3NhZ2UsXG4gIGZvcm1hdFRpbWUsXG4gIG9ic2N1cmVUZW1wbGF0ZSxcbiAgc2VyaWFsaXplU3RydWN0dXJlLFxuICB2YWxpZGF0ZVNuc1RvcGljQXJuLFxufSBmcm9tICcuLi9wcml2YXRlL3V0aWwnO1xuaW1wb3J0IHsgcExpbWl0IH0gZnJvbSAnLi4vdXRpbC9jb25jdXJyZW5jeSc7XG5pbXBvcnQgeyBwcm9taXNlV2l0aFJlc29sdmVycyB9IGZyb20gJy4uL3V0aWwvcHJvbWlzZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xraXRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBJb0hvc3QgaW1wbGVtZW50YXRpb24sIGhhbmRsaW5nIHRoZSBpbmxpbmUgaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIFRvb2xraXQgYW5kIGFuIGludGVncmF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgaW9Ib3N0PzogSUlvSG9zdDtcblxuICAvKipcbiAgICogQWxsb3cgZW1vamlzIGluIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElvSG9zdC5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW1vamlzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBBTlNJIGNvbG9ycyBhbmQgZm9ybWF0dGluZyBpbiBJb0hvc3QgbWVzc2FnZXMuXG4gICAqIFNldHRpbmcgdGhpcyB2YWx1ZSB0byBgZmFsc2VgIGVuZm9yY2VzIHRoYXQgbm8gY29sb3Igb3Igc3R5bGUgc2hvd3MgdXBcbiAgICogaW4gbWVzc2FnZXMgc2VudCB0byB0aGUgSW9Ib3N0LlxuICAgKiBTZXR0aW5nIHRoaXMgdmFsdWUgdG8gdHJ1ZSBpcyBhIG5vLW9wOyBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVjdHMgY29sb3IgZnJvbSB0aGUgVFRZIHN0YXR1cyBvZiB0aGUgSW9Ib3N0XG4gICAqL1xuICByZWFkb25seSBjb2xvcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIFNESy5cbiAgICovXG4gIHJlYWRvbmx5IHNka0NvbmZpZz86IFNka0NvbmZpZztcblxuICAvKipcbiAgICogTmFtZSBvZiB0aGUgdG9vbGtpdCBzdGFjayB0byBiZSB1c2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIkNES1Rvb2xraXRcIlxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbGtpdFN0YWNrTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmFpbCBDbG91ZCBBc3NlbWJsaWVzXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiZXJyb3JcIlxuICAgKi9cbiAgcmVhZG9ubHkgYXNzZW1ibHlGYWlsdXJlQXQ/OiAnZXJyb3InIHwgJ3dhcm4nIHwgJ25vbmUnO1xufVxuXG4vKipcbiAqIFRoZSBBV1MgQ0RLIFByb2dyYW1tYXRpYyBUb29sa2l0XG4gKi9cbmV4cG9ydCBjbGFzcyBUb29sa2l0IGV4dGVuZHMgQ2xvdWRBc3NlbWJseVNvdXJjZUJ1aWxkZXIge1xuICAvKipcbiAgICogVGhlIHRvb2xraXQgc3RhY2sgbmFtZSB1c2VkIGZvciBib290c3RyYXBwaW5nIHJlc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB0b29sa2l0U3RhY2tOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJb0hvc3Qgb2YgdGhpcyBUb29sa2l0XG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaW9Ib3N0OiBJSW9Ib3N0O1xuXG4gIC8qKlxuICAgKiBDYWNoZSBvZiB0aGUgaW50ZXJuYWwgU0RLIFByb3ZpZGVyIGluc3RhbmNlXG4gICAqL1xuICBwcml2YXRlIHNka1Byb3ZpZGVyQ2FjaGU/OiBTZGtQcm92aWRlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBwcm9wczogVG9vbGtpdE9wdGlvbnMgPSB7fSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy50b29sa2l0U3RhY2tOYW1lID0gcHJvcHMudG9vbGtpdFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRTtcblxuICAgIGxldCBpb0hvc3QgPSBwcm9wcy5pb0hvc3QgPz8gbmV3IE5vbkludGVyYWN0aXZlSW9Ib3N0KCk7XG4gICAgaWYgKHByb3BzLmVtb2ppcyA9PT0gZmFsc2UpIHtcbiAgICAgIGlvSG9zdCA9IHdpdGhvdXRFbW9qaXMoaW9Ib3N0KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmNvbG9yID09PSBmYWxzZSkge1xuICAgICAgaW9Ib3N0ID0gd2l0aG91dENvbG9yKGlvSG9zdCk7XG4gICAgfVxuICAgIC8vIEFmdGVyIHJlbW92aW5nIGVtb2ppcyBhbmQgY29sb3IsIHdlIG1pZ2h0IGVuZCB1cCB3aXRoIGZsb2F0aW5nIHdoaXRlc3BhY2UgYXQgZWl0aGVyIGVuZCBvZiB0aGUgbWVzc2FnZVxuICAgIC8vIFRoaXMgYWxzbyByZW1vdmVzIG5ld2xpbmVzIHRoYXQgd2UgY3VycmVudGx5IGVtaXQgZm9yIENMSSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS5cbiAgICB0aGlzLmlvSG9zdCA9IHdpdGhUcmltbWVkV2hpdGVzcGFjZShpb0hvc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjY2VzcyB0byB0aGUgQVdTIFNES1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBhc3luYyBzZGtQcm92aWRlcihhY3Rpb246IFRvb2xraXRBY3Rpb24pOiBQcm9taXNlPFNka1Byb3ZpZGVyPiB7XG4gICAgLy8gQHRvZG8gdGhpcyBuZWVkcyB0byBiZSBkaWZmZXJlbnQgaW5zdGFuY2UgcGVyIGFjdGlvblxuICAgIGlmICghdGhpcy5zZGtQcm92aWRlckNhY2hlKSB7XG4gICAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgICB0aGlzLnNka1Byb3ZpZGVyQ2FjaGUgPSBhd2FpdCBTZGtQcm92aWRlci53aXRoQXdzQ2xpQ29tcGF0aWJsZURlZmF1bHRzKHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5zZGtDb25maWcsXG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICBsb2dnZXI6IGFzU2RrTG9nZ2VyKGlvSGVscGVyKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNka1Byb3ZpZGVyQ2FjaGU7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIHByb3ZpZGUgdGhlIENsb3VkQXNzZW1ibHlTb3VyY2VCdWlsZGVyIHdpdGggcmVxdWlyZWQgdG9vbGtpdCBzZXJ2aWNlc1xuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBzb3VyY2VCdWlsZGVyU2VydmljZXMoKTogUHJvbWlzZTxUb29sa2l0U2VydmljZXM+IHtcbiAgICByZXR1cm4ge1xuICAgICAgaW9IZWxwZXI6IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdhc3NlbWJseScpLFxuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2Fzc2VtYmx5JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCb290c3RyYXAgQWN0aW9uXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgYm9vdHN0cmFwKGVudmlyb25tZW50czogQm9vdHN0cmFwRW52aXJvbm1lbnRzLCBvcHRpb25zOiBCb290c3RyYXBPcHRpb25zKTogUHJvbWlzZTxCb290c3RyYXBSZXN1bHQ+IHtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IHJlc3VsdHM6IEVudmlyb25tZW50Qm9vdHN0cmFwUmVzdWx0W10gPSBbXTtcblxuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Jvb3RzdHJhcCcpO1xuICAgIGNvbnN0IGJvb3RzdHJhcEVudmlyb25tZW50cyA9IGF3YWl0IGVudmlyb25tZW50cy5nZXRFbnZpcm9ubWVudHModGhpcy5pb0hvc3QpO1xuICAgIGNvbnN0IHNvdXJjZSA9IG9wdGlvbnMuc291cmNlID8/IEJvb3RzdHJhcFNvdXJjZS5kZWZhdWx0KCk7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IG9wdGlvbnMucGFyYW1ldGVycztcbiAgICBjb25zdCBib290c3RyYXBwZXIgPSBuZXcgQm9vdHN0cmFwcGVyKHNvdXJjZSwgaW9IZWxwZXIpO1xuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcignYm9vdHN0cmFwJyk7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoMjApO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBjZGtsYWJzL3Byb21pc2VhbGwtbm8tdW5ib3VuZGVkLXBhcmFsbGVsaXNtXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoYm9vdHN0cmFwRW52aXJvbm1lbnRzLm1hcCgoZW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50LCBjdXJyZW50SWR4KSA9PiBsaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBib290c3RyYXBTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkJPT1RTVFJBUF9TSU5HTEUpXG4gICAgICAgIC5iZWdpbihgJHtjaGFsay5ib2xkKGVudmlyb25tZW50Lm5hbWUpfTogYm9vdHN0cmFwcGluZy4uLmAsIHtcbiAgICAgICAgICB0b3RhbDogYm9vdHN0cmFwRW52aXJvbm1lbnRzLmxlbmd0aCxcbiAgICAgICAgICBjdXJyZW50OiBjdXJyZW50SWR4KzEsXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgIH0pO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBib290c3RyYXBSZXN1bHQgPSBhd2FpdCBib290c3RyYXBwZXIuYm9vdHN0cmFwRW52aXJvbm1lbnQoXG4gICAgICAgICAgZW52aXJvbm1lbnQsXG4gICAgICAgICAgc2RrUHJvdmlkZXIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LnBhcmFtZXRlcnMsXG4gICAgICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IHBhcmFtZXRlcnM/LmtlZXBFeGlzdGluZ1BhcmFtZXRlcnMsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gYm9vdHN0cmFwUmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9IChubyBjaGFuZ2VzKWBcbiAgICAgICAgICA6IGAg4pyFICAke2Vudmlyb25tZW50Lm5hbWV9YDtcblxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTk5MDAubXNnKGNoYWxrLmdyZWVuKCdcXG4nICsgbWVzc2FnZSksIHsgZW52aXJvbm1lbnQgfSkpO1xuICAgICAgICBjb25zdCBlbnZUaW1lID0gYXdhaXQgYm9vdHN0cmFwU3Bhbi5lbmQoKTtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBFbnZpcm9ubWVudEJvb3RzdHJhcFJlc3VsdCA9IHtcbiAgICAgICAgICBlbnZpcm9ubWVudCxcbiAgICAgICAgICBzdGF0dXM6IGJvb3RzdHJhcFJlc3VsdC5ub09wID8gJ25vLW9wJyA6ICdzdWNjZXNzJyxcbiAgICAgICAgICBkdXJhdGlvbjogZW52VGltZS5hc01zLFxuICAgICAgICB9O1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTk5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoZW52aXJvbm1lbnQubmFtZSl9IGZhaWxlZDogJHtmb3JtYXRFcnJvck1lc3NhZ2UoZSl9YCwgeyBlcnJvcjogZSB9KSk7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSkpKTtcblxuICAgIHJldHVybiB7XG4gICAgICBlbnZpcm9ubWVudHM6IHJlc3VsdHMsXG4gICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bnRoIEFjdGlvblxuICAgKlxuICAgKiBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBgQ2FjaGVkQ2xvdWRBc3NlbWJseWAgYW5kIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGBkaXNwb3NlKClgIG9uXG4gICAqIGl0IGFmdGVyIHVzZS5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzeW50aChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFN5bnRoT3B0aW9ucyA9IHt9KTogUHJvbWlzZTxDYWNoZWRDbG91ZEFzc2VtYmx5PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnc3ludGgnKTtcbiAgICBjb25zdCBzZWxlY3RTdGFja3MgPSBvcHRpb25zLnN0YWNrcyA/PyBBTExfU1RBQ0tTO1xuICAgIGNvbnN0IHN5bnRoU3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5TWU5USF9BU1NFTUJMWSkuYmVnaW4oeyBzdGFja3M6IHNlbGVjdFN0YWNrcyB9KTtcblxuICAgIC8vIE5PVEU6IE5PVCAnYXdhaXQgdXNpbmcnIGJlY2F1c2Ugd2UgcmV0dXJuIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyXG4gICAgY29uc3QgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcblxuICAgIGNvbnN0IHN0YWNrcyA9IGF3YWl0IGFzc2VtYmx5LnNlbGVjdFN0YWNrc1YyKHNlbGVjdFN0YWNrcyk7XG4gICAgY29uc3QgYXV0b1ZhbGlkYXRlU3RhY2tzID0gb3B0aW9ucy52YWxpZGF0ZVN0YWNrcyA/IFthc3NlbWJseS5zZWxlY3RTdGFja3NGb3JWYWxpZGF0aW9uKCldIDogW107XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcy5jb25jYXQoLi4uYXV0b1ZhbGlkYXRlU3RhY2tzKSwgaW9IZWxwZXIpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIC8vIGlmIHdlIGhhdmUgYSBzaW5nbGUgc3RhY2ssIHByaW50IGl0IHRvIFNURE9VVFxuICAgIGNvbnN0IG1lc3NhZ2UgPSBgU3VjY2Vzc2Z1bGx5IHN5bnRoZXNpemVkIHRvICR7Y2hhbGsuYmx1ZShwYXRoLnJlc29sdmUoc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSkpfWA7XG4gICAgY29uc3QgYXNzZW1ibHlEYXRhOiBBc3NlbWJseURhdGEgPSB7XG4gICAgICBhc3NlbWJseURpcmVjdG9yeTogc3RhY2tzLmFzc2VtYmx5LmRpcmVjdG9yeSxcbiAgICAgIHN0YWNrc0NvdW50OiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgIHN0YWNrSWRzOiBzdGFja3MuaGllcmFyY2hpY2FsSWRzLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDEpIHtcbiAgICAgIGNvbnN0IGZpcnN0U3RhY2sgPSBzdGFja3MuZmlyc3RTdGFjayE7XG4gICAgICBjb25zdCB0ZW1wbGF0ZSA9IGZpcnN0U3RhY2sudGVtcGxhdGU7XG4gICAgICBjb25zdCBvYnNjdXJlZFRlbXBsYXRlID0gb2JzY3VyZVRlbXBsYXRlKHRlbXBsYXRlKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JMTkwMS5tc2cobWVzc2FnZSwge1xuICAgICAgICAuLi5hc3NlbWJseURhdGEsXG4gICAgICAgIHN0YWNrOiB7XG4gICAgICAgICAgc3RhY2tOYW1lOiBmaXJzdFN0YWNrLnN0YWNrTmFtZSxcbiAgICAgICAgICBoaWVyYXJjaGljYWxJZDogZmlyc3RTdGFjay5oaWVyYXJjaGljYWxJZCxcbiAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICBzdHJpbmdpZmllZEpzb246IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCB0cnVlKSxcbiAgICAgICAgICBzdHJpbmdpZmllZFlhbWw6IHNlcmlhbGl6ZVN0cnVjdHVyZShvYnNjdXJlZFRlbXBsYXRlLCBmYWxzZSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vdCBvdXRwdXR0aW5nIHRlbXBsYXRlIHRvIHN0ZG91dCwgbGV0J3MgZXhwbGFpbiB0aGluZ3MgdG8gdGhlIHVzZXIgYSBsaXR0bGUgYml0Li4uXG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTE5MDIubXNnKGNoYWxrLmdyZWVuKG1lc3NhZ2UpLCBhc3NlbWJseURhdGEpKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coYFN1cHBseSBhIHN0YWNrIGlkICgke3N0YWNrcy5zdGFja0FydGlmYWN0cy5tYXAoKHMpID0+IGNoYWxrLmdyZWVuKHMuaGllcmFyY2hpY2FsSWQpKS5qb2luKCcsICcpfSkgdG8gZGlzcGxheSBpdHMgdGVtcGxhdGUuYCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ2FjaGVkQ2xvdWRBc3NlbWJseShhc3NlbWJseSk7XG4gIH1cblxuICAvKipcbiAgICogRGlmZiBBY3Rpb25cbiAgICovXG4gIHB1YmxpYyBhc3luYyBkaWZmKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogRGlmZk9wdGlvbnMpOiBQcm9taXNlPHsgW25hbWU6IHN0cmluZ106IFRlbXBsYXRlRGlmZn0+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsICdkaWZmJyk7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gb3B0aW9ucy5zdGFja3MgPz8gQUxMX1NUQUNLUztcbiAgICBjb25zdCBzeW50aFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uU1lOVEhfQVNTRU1CTFkpLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4KTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihzZWxlY3RTdGFja3MpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGNvbnN0IGRpZmZTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRJRkZfU1RBQ0spLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdkaWZmJyk7XG5cbiAgICBjb25zdCBzdHJpY3QgPSAhIW9wdGlvbnMuc3RyaWN0O1xuICAgIGNvbnN0IGNvbnRleHRMaW5lcyA9IG9wdGlvbnMuY29udGV4dExpbmVzIHx8IDM7XG5cbiAgICBsZXQgZGlmZnMgPSAwO1xuICAgIGxldCBmb3JtYXR0ZWRTZWN1cml0eURpZmYgPSAnJztcbiAgICBsZXQgZm9ybWF0dGVkU3RhY2tEaWZmID0gJyc7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZUluZm9zID0gYXdhaXQgcHJlcGFyZURpZmYoaW9IZWxwZXIsIHN0YWNrcywgZGVwbG95bWVudHMsIGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoJ2RpZmYnKSwgb3B0aW9ucyk7XG4gICAgY29uc3QgdGVtcGxhdGVEaWZmczogeyBbbmFtZTogc3RyaW5nXTogVGVtcGxhdGVEaWZmIH0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRlbXBsYXRlSW5mbyBvZiB0ZW1wbGF0ZUluZm9zKSB7XG4gICAgICBjb25zdCBmb3JtYXR0ZXIgPSBuZXcgRGlmZkZvcm1hdHRlcih7XG4gICAgICAgIGlvSGVscGVyLFxuICAgICAgICB0ZW1wbGF0ZUluZm8sXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnMuc2VjdXJpdHlPbmx5KSB7XG4gICAgICAgIGNvbnN0IHNlY3VyaXR5RGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTZWN1cml0eURpZmYoe1xuICAgICAgICAgIHJlcXVpcmVBcHByb3ZhbDogUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkcsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtYXR0ZWRTZWN1cml0eURpZmYgPSBzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZiA/PyAnJztcbiAgICAgICAgZGlmZnMgPSBzZWN1cml0eURpZmYuZm9ybWF0dGVkRGlmZiA/IGRpZmZzICsgMSA6IGRpZmZzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZGlmZiA9IGZvcm1hdHRlci5mb3JtYXRTdGFja0RpZmYoe1xuICAgICAgICAgIHN0cmljdCxcbiAgICAgICAgICBjb250ZXh0OiBjb250ZXh0TGluZXMsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtYXR0ZWRTdGFja0RpZmYgPSBkaWZmLmZvcm1hdHRlZERpZmY7XG4gICAgICAgIGRpZmZzID0gZGlmZi5udW1TdGFja3NXaXRoQ2hhbmdlcztcbiAgICAgIH1cbiAgICAgIGFwcGVuZE9iamVjdCh0ZW1wbGF0ZURpZmZzLCBmb3JtYXR0ZXIuZGlmZnMpO1xuICAgIH1cblxuICAgIGF3YWl0IGRpZmZTcGFuLmVuZChg4pyoIE51bWJlciBvZiBzdGFja3Mgd2l0aCBkaWZmZXJlbmNlczogJHtkaWZmc31gLCB7XG4gICAgICBmb3JtYXR0ZWRTZWN1cml0eURpZmYsXG4gICAgICBmb3JtYXR0ZWRTdGFja0RpZmYsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGVtcGxhdGVEaWZmcztcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0IEFjdGlvblxuICAgKlxuICAgKiBMaXN0IHNlbGVjdGVkIHN0YWNrcyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbGlzdChjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IExpc3RPcHRpb25zID0ge30pOiBQcm9taXNlPFN0YWNrRGV0YWlsc1tdPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAnbGlzdCcpO1xuICAgIGNvbnN0IHNlbGVjdFN0YWNrcyA9IG9wdGlvbnMuc3RhY2tzID8/IEFMTF9TVEFDS1M7XG4gICAgY29uc3Qgc3ludGhTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlNZTlRIX0FTU0VNQkxZKS5iZWdpbih7IHN0YWNrczogc2VsZWN0U3RhY2tzIH0pO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCk7XG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBhd2FpdCBzeW50aFNwYW4uZW5kKCk7XG5cbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24ud2l0aERlcGVuZGVuY2llcygpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBzdGFja3MubWFwKHMgPT4gcy5pZCkuam9pbignXFxuJyk7XG5cbiAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTI5MDEubXNnKG1lc3NhZ2UsIHsgc3RhY2tzIH0pKTtcbiAgICByZXR1cm4gc3RhY2tzO1xuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBBY3Rpb25cbiAgICpcbiAgICogRGVwbG95cyB0aGUgc2VsZWN0ZWQgc3RhY2tzIGludG8gYW4gQVdTIGFjY291bnRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBkZXBsb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXBsb3lPcHRpb25zID0ge30pOiBQcm9taXNlPERlcGxveVJlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2RlcGxveScpO1xuICAgIGF3YWl0IHVzaW5nIGFzc2VtYmx5ID0gYXdhaXQgYXNzZW1ibHlGcm9tU291cmNlKGlvSGVscGVyLCBjeCk7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ2RlcGxveScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXBsb3kgYmVpbmcgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHdhdGNoIGFjdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2RlcGxveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICd3YXRjaCcsIG9wdGlvbnM6IEV4dGVuZGVkRGVwbG95T3B0aW9ucyA9IHt9KTogUHJvbWlzZTxEZXBsb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc2VsZWN0U3RhY2tzID0gb3B0aW9ucy5zdGFja3MgPz8gQUxMX1NUQUNLUztcbiAgICBjb25zdCBzeW50aFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uU1lOVEhfQVNTRU1CTFkpLmJlZ2luKHsgc3RhY2tzOiBzZWxlY3RTdGFja3MgfSk7XG4gICAgY29uc3Qgc3RhY2tDb2xsZWN0aW9uID0gYXdhaXQgYXNzZW1ibHkuc2VsZWN0U3RhY2tzVjIoc2VsZWN0U3RhY2tzKTtcbiAgICBhd2FpdCB0aGlzLnZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tDb2xsZWN0aW9uLCBpb0hlbHBlcik7XG4gICAgY29uc3Qgc3ludGhEdXJhdGlvbiA9IGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGNvbnN0IHJldDogRGVwbG95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ID09PSAwKSB7XG4gICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTUwMDEubXNnKCdUaGlzIGFwcCBjb250YWlucyBubyBzdGFja3MnKSk7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGRlcGxveW1lbnRzID0gYXdhaXQgdGhpcy5kZXBsb3ltZW50c0ZvckFjdGlvbignZGVwbG95Jyk7XG4gICAgY29uc3QgbWlncmF0b3IgPSBuZXcgUmVzb3VyY2VNaWdyYXRvcih7IGRlcGxveW1lbnRzLCBpb0hlbHBlciB9KTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLnRyeU1pZ3JhdGVSZXNvdXJjZXMoc3RhY2tDb2xsZWN0aW9uLCBvcHRpb25zKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlck1hcCA9IGJ1aWxkUGFyYW1ldGVyTWFwKG9wdGlvbnMucGFyYW1ldGVycz8ucGFyYW1ldGVycyk7XG5cbiAgICBjb25zdCBob3Rzd2FwTW9kZSA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQ7XG4gICAgaWYgKGhvdHN3YXBNb2RlICE9PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XNTQwMC5tc2coW1xuICAgICAgICAn4pqg77iPIFRoZSAtLWhvdHN3YXAgYW5kIC0taG90c3dhcC1mYWxsYmFjayBmbGFncyBkZWxpYmVyYXRlbHkgaW50cm9kdWNlIENsb3VkRm9ybWF0aW9uIGRyaWZ0IHRvIHNwZWVkIHVwIGRlcGxveW1lbnRzJyxcbiAgICAgICAgJ+KaoO+4jyBUaGV5IHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGRldmVsb3BtZW50IC0gbmV2ZXIgdXNlIHRoZW0gZm9yIHlvdXIgcHJvZHVjdGlvbiBTdGFja3MhJyxcbiAgICAgIF0uam9pbignXFxuJykpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja3MgPSBzdGFja0NvbGxlY3Rpb24uc3RhY2tBcnRpZmFjdHM7XG4gICAgY29uc3Qgc3RhY2tPdXRwdXRzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgY29uc3Qgb3V0cHV0c0ZpbGUgPSBvcHRpb25zLm91dHB1dHNGaWxlO1xuXG4gICAgY29uc3QgYnVpbGRBc3NldCA9IGFzeW5jIChhc3NldE5vZGU6IEFzc2V0QnVpbGROb2RlKSA9PiB7XG4gICAgICBjb25zdCBidWlsZEFzc2V0U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5CVUlMRF9BU1NFVCkuYmVnaW4oe1xuICAgICAgICBhc3NldDogYXNzZXROb2RlLmFzc2V0LFxuICAgICAgfSk7XG4gICAgICBhd2FpdCBkZXBsb3ltZW50cy5idWlsZFNpbmdsZUFzc2V0KFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdEFydGlmYWN0LFxuICAgICAgICBhc3NldE5vZGUuYXNzZXRNYW5pZmVzdCxcbiAgICAgICAgYXNzZXROb2RlLmFzc2V0LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgc3RhY2tOYW1lOiBhc3NldE5vZGUucGFyZW50U3RhY2suc3RhY2tOYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGJ1aWxkQXNzZXRTcGFuLmVuZCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBwdWJsaXNoQXNzZXQgPSBhc3luYyAoYXNzZXROb2RlOiBBc3NldFB1Ymxpc2hOb2RlKSA9PiB7XG4gICAgICBjb25zdCBwdWJsaXNoQXNzZXRTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlBVQkxJU0hfQVNTRVQpLmJlZ2luKHtcbiAgICAgICAgYXNzZXQ6IGFzc2V0Tm9kZS5hc3NldCxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgZGVwbG95bWVudHMucHVibGlzaFNpbmdsZUFzc2V0KGFzc2V0Tm9kZS5hc3NldE1hbmlmZXN0LCBhc3NldE5vZGUuYXNzZXQsIHtcbiAgICAgICAgc3RhY2s6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjayxcbiAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICBzdGFja05hbWU6IGFzc2V0Tm9kZS5wYXJlbnRTdGFjay5zdGFja05hbWUsXG4gICAgICAgIGZvcmNlUHVibGlzaDogb3B0aW9ucy5mb3JjZUFzc2V0UHVibGlzaGluZyxcbiAgICAgIH0pO1xuICAgICAgYXdhaXQgcHVibGlzaEFzc2V0U3Bhbi5lbmQoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVwbG95U3RhY2sgPSBhc3luYyAoc3RhY2tOb2RlOiBTdGFja05vZGUpID0+IHtcbiAgICAgIGNvbnN0IHN0YWNrID0gc3RhY2tOb2RlLnN0YWNrO1xuICAgICAgaWYgKHN0YWNrQ29sbGVjdGlvbi5zdGFja0NvdW50ICE9PSAxKSB7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfSU5GTy5tc2coY2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSkpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFzdGFjay5lbnZpcm9ubWVudCkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKFxuICAgICAgICAgIGBTdGFjayAke3N0YWNrLmRpc3BsYXlOYW1lfSBkb2VzIG5vdCBkZWZpbmUgYW4gZW52aXJvbm1lbnQsIGFuZCBBV1MgY3JlZGVudGlhbHMgY291bGQgbm90IGJlIG9idGFpbmVkIGZyb20gc3RhbmRhcmQgbG9jYXRpb25zIG9yIG5vIHJlZ2lvbiB3YXMgY29uZmlndXJlZC5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgZ2VuZXJhdGVkIHN0YWNrIGhhcyBubyByZXNvdXJjZXNcbiAgICAgIGlmIChPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZS5SZXNvdXJjZXMgfHwge30pLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSBhbmQgZG9lc24ndCBleGlzdCA9PiBkbyBub3RoaW5nXG4gICAgICAgIGNvbnN0IHN0YWNrRXhpc3RzID0gYXdhaXQgZGVwbG95bWVudHMuc3RhY2tFeGlzdHMoeyBzdGFjayB9KTtcbiAgICAgICAgaWYgKCFzdGFja0V4aXN0cykge1xuICAgICAgICAgIHJldHVybiBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfVzUwMjEubXNnKGAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfTogc3RhY2sgaGFzIG5vIHJlc291cmNlcywgc2tpcHBpbmcgZGVwbG95bWVudC5gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdGFjayBpcyBlbXB0eSwgYnV0IGV4aXN0cyA9PiBkZWxldGVcbiAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX1c1MDIyLm1zZyhgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX06IHN0YWNrIGhhcyBubyByZXNvdXJjZXMsIGRlbGV0aW5nIGV4aXN0aW5nIHN0YWNrLmApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5fZGVzdHJveShhc3NlbWJseSwgJ2RlcGxveScsIHtcbiAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlID0gYXdhaXQgZGVwbG95bWVudHMucmVhZEN1cnJlbnRUZW1wbGF0ZShzdGFjayk7XG4gICAgICBjb25zdCBwZXJtaXNzaW9uQ2hhbmdlVHlwZSA9IGRldGVybWluZVBlcm1pc3Npb25UeXBlKGN1cnJlbnRUZW1wbGF0ZSwgc3RhY2spO1xuICAgICAgY29uc3QgZGVwbG95TW90aXZhdGlvbiA9ICdcIi0tcmVxdWlyZS1hcHByb3ZhbFwiIGlzIGVuYWJsZWQgYW5kIHN0YWNrIGluY2x1ZGVzIHNlY3VyaXR5LXNlbnNpdGl2ZSB1cGRhdGVzLic7XG4gICAgICBjb25zdCBkZXBsb3lRdWVzdGlvbiA9IGAke2RlcGxveU1vdGl2YXRpb259XFxuRG8geW91IHdpc2ggdG8gZGVwbG95IHRoZXNlIGNoYW5nZXNgO1xuICAgICAgY29uc3QgZGVwbG95Q29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k1MDYwLnJlcShkZXBsb3lRdWVzdGlvbiwge1xuICAgICAgICBtb3RpdmF0aW9uOiBkZXBsb3lNb3RpdmF0aW9uLFxuICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgcGVybWlzc2lvbkNoYW5nZVR5cGUsXG4gICAgICB9KSk7XG4gICAgICBpZiAoIWRlcGxveUNvbmZpcm1lZCkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdBYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgIH1cblxuICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc2FtZSBzZW1hbnRpY3Mgd2UgYXBwbHkgd2l0aCByZXNwZWN0IHRvIE5vdGlmaWNhdGlvbiBBUk5zIChkaWN0YXRlZCBieSB0aGUgU0RLKVxuICAgICAgLy9cbiAgICAgIC8vICAtIHVuZGVmaW5lZCAgPT4gIGNkayBpZ25vcmVzIGl0LCBhcyBpZiBpdCB3YXNuJ3Qgc3VwcG9ydGVkIChhbGxvd3MgZXh0ZXJuYWwgbWFuYWdlbWVudCkuXG4gICAgICAvLyAgLSBbXTogICAgICAgID0+ICBjZGsgbWFuYWdlcyBpdCwgYW5kIHRoZSB1c2VyIHdhbnRzIHRvIHdpcGUgaXQgb3V0LlxuICAgICAgLy8gIC0gWydhcm4tMSddICA9PiAgY2RrIG1hbmFnZXMgaXQsIGFuZCB0aGUgdXNlciB3YW50cyB0byBzZXQgaXQgdG8gWydhcm4tMSddLlxuICAgICAgY29uc3Qgbm90aWZpY2F0aW9uQXJucyA9ICghIW9wdGlvbnMubm90aWZpY2F0aW9uQXJucyB8fCAhIXN0YWNrLm5vdGlmaWNhdGlvbkFybnMpXG4gICAgICAgID8gKG9wdGlvbnMubm90aWZpY2F0aW9uQXJucyA/PyBbXSkuY29uY2F0KHN0YWNrLm5vdGlmaWNhdGlvbkFybnMgPz8gW10pXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IG5vdGlmaWNhdGlvbkFybiBvZiBub3RpZmljYXRpb25Bcm5zID8/IFtdKSB7XG4gICAgICAgIGlmICghdmFsaWRhdGVTbnNUb3BpY0Fybihub3RpZmljYXRpb25Bcm4pKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgTm90aWZpY2F0aW9uIGFybiAke25vdGlmaWNhdGlvbkFybn0gaXMgbm90IGEgdmFsaWQgYXJuIGZvciBhbiBTTlMgdG9waWNgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGFja0luZGV4ID0gc3RhY2tzLmluZGV4T2Yoc3RhY2spICsgMTtcbiAgICAgIGNvbnN0IGRlcGxveVNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uREVQTE9ZX1NUQUNLKVxuICAgICAgICAuYmVnaW4oYCR7Y2hhbGsuYm9sZChzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXBsb3lpbmcuLi4gWyR7c3RhY2tJbmRleH0vJHtzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudH1dYCwge1xuICAgICAgICAgIHRvdGFsOiBzdGFja0NvbGxlY3Rpb24uc3RhY2tDb3VudCxcbiAgICAgICAgICBjdXJyZW50OiBzdGFja0luZGV4LFxuICAgICAgICAgIHN0YWNrLFxuICAgICAgICB9KTtcblxuICAgICAgbGV0IHRhZ3MgPSBvcHRpb25zLnRhZ3M7XG4gICAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGFncyA9IHRhZ3NGb3JTdGFjayhzdGFjayk7XG4gICAgICB9XG5cbiAgICAgIGxldCBkZXBsb3lEdXJhdGlvbjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBkZXBsb3lSZXN1bHQ6IFN1Y2Nlc3NmdWxEZXBsb3lTdGFja1Jlc3VsdCB8IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgcm9sbGJhY2sgPSBvcHRpb25zLnJvbGxiYWNrO1xuICAgICAgICBsZXQgaXRlcmF0aW9uID0gMDtcbiAgICAgICAgd2hpbGUgKCFkZXBsb3lSZXN1bHQpIHtcbiAgICAgICAgICBpZiAoKytpdGVyYXRpb24gPiAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdUaGlzIGxvb3Agc2hvdWxkIGhhdmUgc3RhYmlsaXplZCBpbiAyIGl0ZXJhdGlvbnMsIGJ1dCBkaWRuXFwndC4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2UnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByID0gYXdhaXQgZGVwbG95bWVudHMuZGVwbG95U3RhY2soe1xuICAgICAgICAgICAgc3RhY2ssXG4gICAgICAgICAgICBkZXBsb3lOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgICB0b29sa2l0U3RhY2tOYW1lOiB0aGlzLnRvb2xraXRTdGFja05hbWUsXG4gICAgICAgICAgICByZXVzZUFzc2V0czogb3B0aW9ucy5yZXVzZUFzc2V0cyxcbiAgICAgICAgICAgIG5vdGlmaWNhdGlvbkFybnMsXG4gICAgICAgICAgICB0YWdzLFxuICAgICAgICAgICAgZGVwbG95bWVudE1ldGhvZDogb3B0aW9ucy5kZXBsb3ltZW50TWV0aG9kLFxuICAgICAgICAgICAgZm9yY2VEZXBsb3ltZW50OiBvcHRpb25zLmZvcmNlRGVwbG95bWVudCxcbiAgICAgICAgICAgIHBhcmFtZXRlcnM6IE9iamVjdC5hc3NpZ24oe30sIHBhcmFtZXRlck1hcFsnKiddLCBwYXJhbWV0ZXJNYXBbc3RhY2suc3RhY2tOYW1lXSksXG4gICAgICAgICAgICB1c2VQcmV2aW91c1BhcmFtZXRlcnM6IG9wdGlvbnMucGFyYW1ldGVycz8ua2VlcEV4aXN0aW5nUGFyYW1ldGVycyxcbiAgICAgICAgICAgIHJvbGxiYWNrLFxuICAgICAgICAgICAgaG90c3dhcDogaG90c3dhcE1vZGUsXG4gICAgICAgICAgICBleHRyYVVzZXJBZ2VudDogb3B0aW9ucy5leHRyYVVzZXJBZ2VudCxcbiAgICAgICAgICAgIGhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlczogb3B0aW9ucy5ob3Rzd2FwUHJvcGVydGllcyA/IGNyZWF0ZUhvdHN3YXBQcm9wZXJ0eU92ZXJyaWRlcyhvcHRpb25zLmhvdHN3YXBQcm9wZXJ0aWVzKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGFzc2V0UGFyYWxsZWxpc206IG9wdGlvbnMuYXNzZXRQYXJhbGxlbGlzbSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHN3aXRjaCAoci50eXBlKSB7XG4gICAgICAgICAgICBjYXNlICdkaWQtZGVwbG95LXN0YWNrJzpcbiAgICAgICAgICAgICAgZGVwbG95UmVzdWx0ID0gcjtcbiAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2ZhaWxwYXVzZWQtbmVlZC1yb2xsYmFjay1maXJzdCc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9IHIucmVhc29uID09PSAncmVwbGFjZW1lbnQnXG4gICAgICAgICAgICAgICAgPyBgU3RhY2sgaXMgaW4gYSBwYXVzZWQgZmFpbCBzdGF0ZSAoJHtyLnN0YXR1c30pIGFuZCBjaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcImBcbiAgICAgICAgICAgICAgICA6IGBTdGFjayBpcyBpbiBhIHBhdXNlZCBmYWlsIHN0YXRlICgke3Iuc3RhdHVzfSkgYW5kIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZG8gbm90IGluY2x1ZGUgXCItLW5vLXJvbGxiYWNrXCJgO1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbiA9IGAke21vdGl2YXRpb259LiBQZXJmb3JtIGEgcmVndWxhciBkZXBsb3ltZW50YDtcblxuICAgICAgICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBpb0hlbHBlci5yZXF1ZXN0UmVzcG9uc2UoSU8uQ0RLX1RPT0xLSVRfSTUwNTAucmVxKHF1ZXN0aW9uLCB7XG4gICAgICAgICAgICAgICAgbW90aXZhdGlvbixcbiAgICAgICAgICAgICAgICBjb25jdXJyZW5jeSxcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Fib3J0ZWQgYnkgdXNlcicpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHJvbGxiYWNrXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3JvbGxiYWNrKGFzc2VtYmx5LCBhY3Rpb24sIHtcbiAgICAgICAgICAgICAgICBzdGFja3M6IHsgcGF0dGVybnM6IFtzdGFjay5oaWVyYXJjaGljYWxJZF0sIHN0cmF0ZWd5OiBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LlBBVFRFUk5fTVVTVF9NQVRDSF9TSU5HTEUgfSxcbiAgICAgICAgICAgICAgICBvcnBoYW5GYWlsZWRSZXNvdXJjZXM6IG9wdGlvbnMub3JwaGFuRmFpbGVkUmVzb3VyY2VzRHVyaW5nUm9sbGJhY2ssXG4gICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIC8vIEdvIGFyb3VuZCB0aHJvdWdoIHRoZSAnd2hpbGUnIGxvb3AgYWdhaW4gYnV0IHN3aXRjaCByb2xsYmFjayB0byB0cnVlLlxuICAgICAgICAgICAgICByb2xsYmFjayA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjYXNlICdyZXBsYWNlbWVudC1yZXF1aXJlcy1yb2xsYmFjayc6IHtcbiAgICAgICAgICAgICAgY29uc3QgbW90aXZhdGlvbiA9ICdDaGFuZ2UgaW5jbHVkZXMgYSByZXBsYWNlbWVudCB3aGljaCBjYW5ub3QgYmUgZGVwbG95ZWQgd2l0aCBcIi0tbm8tcm9sbGJhY2tcIic7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gYCR7bW90aXZhdGlvbn0uIFBlcmZvcm0gYSByZWd1bGFyIGRlcGxveW1lbnRgO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGF3YWl0IGlvSGVscGVyLnJlcXVlc3RSZXNwb25zZShJTy5DREtfVE9PTEtJVF9JNTA1MC5yZXEocXVlc3Rpb24sIHtcbiAgICAgICAgICAgICAgICBtb3RpdmF0aW9uLFxuICAgICAgICAgICAgICAgIGNvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgIGlmICghY29uZmlybWVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBHbyBhcm91bmQgdGhyb3VnaCB0aGUgJ3doaWxlJyBsb29wIGFnYWluIGJ1dCBzd2l0Y2ggcm9sbGJhY2sgdG8gdHJ1ZS5cbiAgICAgICAgICAgICAgcm9sbGJhY2sgPSB0cnVlO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihgVW5leHBlY3RlZCByZXN1bHQgdHlwZSBmcm9tIGRlcGxveVN0YWNrOiAke0pTT04uc3RyaW5naWZ5KHIpfS4gSWYgeW91IGFyZSBzZWVpbmcgdGhpcyBlcnJvciwgcGxlYXNlIHJlcG9ydCBpdCBhdCBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzL25ldy9jaG9vc2VgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtZXNzYWdlID0gZGVwbG95UmVzdWx0Lm5vT3BcbiAgICAgICAgICA/IGAg4pyFICAke3N0YWNrLmRpc3BsYXlOYW1lfSAobm8gY2hhbmdlcylgXG4gICAgICAgICAgOiBgIOKchSAgJHtzdGFjay5kaXNwbGF5TmFtZX1gO1xuXG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTkwMC5tc2coY2hhbGsuZ3JlZW4oJ1xcbicgKyBtZXNzYWdlKSwgZGVwbG95UmVzdWx0KSk7XG4gICAgICAgIGRlcGxveUR1cmF0aW9uID0gYXdhaXQgZGVwbG95U3Bhbi50aW1pbmcoSU8uQ0RLX1RPT0xLSVRfSTUwMDApO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhkZXBsb3lSZXN1bHQub3V0cHV0cykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IFsnT3V0cHV0czonXTtcbiAgICAgICAgICBzdGFja091dHB1dHNbc3RhY2suc3RhY2tOYW1lXSA9IGRlcGxveVJlc3VsdC5vdXRwdXRzO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIE9iamVjdC5rZXlzKGRlcGxveVJlc3VsdC5vdXRwdXRzKS5zb3J0KCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZGVwbG95UmVzdWx0Lm91dHB1dHNbbmFtZV07XG4gICAgICAgICAgICBidWZmZXIucHVzaChgJHtjaGFsay5jeWFuKHN0YWNrLmlkKX0uJHtjaGFsay5jeWFuKG5hbWUpfSA9ICR7Y2hhbGsudW5kZXJsaW5lKGNoYWxrLmN5YW4odmFsdWUpKX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1OTAxLm1zZyhidWZmZXIuam9pbignXFxuJykpKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTU5MDEubXNnKGBTdGFjayBBUk46XFxuJHtkZXBsb3lSZXN1bHQuc3RhY2tBcm59YCkpO1xuXG4gICAgICAgIHJldC5zdGFja3MucHVzaCh7XG4gICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICAgICAgICByZWdpb246IHN0YWNrLmVudmlyb25tZW50LnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YWNrQXJuOiBkZXBsb3lSZXN1bHQuc3RhY2tBcm4sXG4gICAgICAgICAgb3V0cHV0czogZGVwbG95UmVzdWx0Lm91dHB1dHMsXG4gICAgICAgICAgaGllcmFyY2hpY2FsSWQ6IHN0YWNrLmhpZXJhcmNoaWNhbElkLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAvLyBJdCBoYXMgdG8gYmUgZXhhY3RseSB0aGlzIHN0cmluZyBiZWNhdXNlIGFuIGludGVncmF0aW9uIHRlc3QgdGVzdHMgZm9yXG4gICAgICAgIC8vIFwiYm9sZChzdGFja25hbWUpIGZhaWxlZDogUmVzb3VyY2VOb3RSZWFkeTogPGVycm9yPlwiXG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoXG4gICAgICAgICAgW2DinYwgICR7Y2hhbGsuYm9sZChzdGFjay5zdGFja05hbWUpfSBmYWlsZWQ6YCwgLi4uKGUubmFtZSA/IFtgJHtlLm5hbWV9OmBdIDogW10pLCBlLm1lc3NhZ2VdLmpvaW4oJyAnKSxcbiAgICAgICAgKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvcHRpb25zLnRyYWNlTG9ncykge1xuICAgICAgICAgIC8vIGRlcGxveSBjYWxscyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHdhdGNoIHdpbGwgY29tZSB3aXRoIHRoZWlyIG93biBjbG91ZFdhdGNoTG9nTW9uaXRvclxuICAgICAgICAgIGNvbnN0IGNsb3VkV2F0Y2hMb2dNb25pdG9yID0gb3B0aW9ucy5jbG91ZFdhdGNoTG9nTW9uaXRvciA/PyBuZXcgQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcih7IGlvSGVscGVyIH0pO1xuICAgICAgICAgIGNvbnN0IGZvdW5kTG9nR3JvdXBzUmVzdWx0ID0gYXdhaXQgZmluZENsb3VkV2F0Y2hMb2dHcm91cHMoYXdhaXQgdGhpcy5zZGtQcm92aWRlcignZGVwbG95JyksIGlvSGVscGVyLCBzdGFjayk7XG4gICAgICAgICAgY2xvdWRXYXRjaExvZ01vbml0b3IuYWRkTG9nR3JvdXBzKFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuZW52LFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQuc2RrLFxuICAgICAgICAgICAgZm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTAzMS5tc2coYFRoZSBmb2xsb3dpbmcgbG9nIGdyb3VwcyBhcmUgYWRkZWQ6ICR7Zm91bmRMb2dHcm91cHNSZXN1bHQubG9nR3JvdXBOYW1lc31gKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBhbiBvdXRwdXRzIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkLCBjcmVhdGUgdGhlIGZpbGUgcGF0aCBhbmQgd3JpdGUgc3RhY2sgb3V0cHV0cyB0byBpdCBvbmNlLlxuICAgICAgICAvLyBPdXRwdXRzIGFyZSB3cml0dGVuIGFmdGVyIGFsbCBzdGFja3MgaGF2ZSBiZWVuIGRlcGxveWVkLiBJZiBhIHN0YWNrIGRlcGxveW1lbnQgZmFpbHMsXG4gICAgICAgIC8vIGFsbCBvZiB0aGUgb3V0cHV0cyBmcm9tIHN1Y2Nlc3NmdWxseSBkZXBsb3llZCBzdGFja3MgYmVmb3JlIHRoZSBmYWlsdXJlIHdpbGwgc3RpbGwgYmUgd3JpdHRlbi5cbiAgICAgICAgaWYgKG91dHB1dHNGaWxlKSB7XG4gICAgICAgICAgZnMuZW5zdXJlRmlsZVN5bmMob3V0cHV0c0ZpbGUpO1xuICAgICAgICAgIGF3YWl0IGZzLndyaXRlSnNvbihvdXRwdXRzRmlsZSwgc3RhY2tPdXRwdXRzLCB7XG4gICAgICAgICAgICBzcGFjZXM6IDIsXG4gICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IHN5bnRoRHVyYXRpb24uYXNNcyArIChkZXBsb3lEdXJhdGlvbj8uYXNNcyA/PyAwKTtcbiAgICAgIGF3YWl0IGRlcGxveVNwYW4uZW5kKGBcXG7inKggIFRvdGFsIHRpbWU6ICR7Zm9ybWF0VGltZShkdXJhdGlvbil9c1xcbmAsIHsgZHVyYXRpb24gfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGFzc2V0QnVpbGRUaW1lID0gb3B0aW9ucy5hc3NldEJ1aWxkVGltZSA/PyBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBwcmVidWlsZEFzc2V0cyA9IGFzc2V0QnVpbGRUaW1lID09PSBBc3NldEJ1aWxkVGltZS5BTExfQkVGT1JFX0RFUExPWTtcbiAgICBjb25zdCBjb25jdXJyZW5jeSA9IG9wdGlvbnMuY29uY3VycmVuY3kgfHwgMTtcblxuICAgIGNvbnN0IHN0YWNrc0FuZFRoZWlyQXNzZXRNYW5pZmVzdHMgPSBzdGFja3MuZmxhdE1hcCgoc3RhY2spID0+IFtcbiAgICAgIHN0YWNrLFxuICAgICAgLi4uc3RhY2suZGVwZW5kZW5jaWVzLmZpbHRlcih4ID0+IGN4YXBpLkFzc2V0TWFuaWZlc3RBcnRpZmFjdC5pc0Fzc2V0TWFuaWZlc3RBcnRpZmFjdCh4KSksXG4gICAgXSk7XG4gICAgY29uc3Qgd29ya0dyYXBoID0gbmV3IFdvcmtHcmFwaEJ1aWxkZXIoaW9IZWxwZXIsIHByZWJ1aWxkQXNzZXRzKS5idWlsZChzdGFja3NBbmRUaGVpckFzc2V0TWFuaWZlc3RzKTtcblxuICAgIC8vIFVubGVzcyB3ZSBhcmUgcnVubmluZyB3aXRoICctLWZvcmNlJywgc2tpcCBhbHJlYWR5IHB1Ymxpc2hlZCBhc3NldHNcbiAgICBpZiAoIW9wdGlvbnMuZm9yY2VBc3NldFB1Ymxpc2hpbmcpIHtcbiAgICAgIGF3YWl0IHJlbW92ZVB1Ymxpc2hlZEFzc2V0c0Zyb21Xb3JrR3JhcGgod29ya0dyYXBoLCBkZXBsb3ltZW50cywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JhcGhDb25jdXJyZW5jeTogQ29uY3VycmVuY3kgPSB7XG4gICAgICAnc3RhY2snOiBjb25jdXJyZW5jeSxcbiAgICAgICdhc3NldC1idWlsZCc6IDEsIC8vIFRoaXMgd2lsbCBiZSBDUFUtYm91bmQvbWVtb3J5IGJvdW5kLCBtb3N0bHkgbWF0dGVycyBmb3IgRG9ja2VyIGJ1aWxkc1xuICAgICAgJ2Fzc2V0LXB1Ymxpc2gnOiAob3B0aW9ucy5hc3NldFBhcmFsbGVsaXNtID8/IHRydWUpID8gOCA6IDEsIC8vIFRoaXMgd2lsbCBiZSBJL08tYm91bmQsIDggaW4gcGFyYWxsZWwgc2VlbXMgcmVhc29uYWJsZVxuICAgIH07XG5cbiAgICBhd2FpdCB3b3JrR3JhcGguZG9QYXJhbGxlbChncmFwaENvbmN1cnJlbmN5LCB7XG4gICAgICBkZXBsb3lTdGFjayxcbiAgICAgIGJ1aWxkQXNzZXQsXG4gICAgICBwdWJsaXNoQXNzZXQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdhdGNoIEFjdGlvblxuICAgKlxuICAgKiBDb250aW51b3VzbHkgb2JzZXJ2ZSBwcm9qZWN0IGZpbGVzIGFuZCBkZXBsb3kgdGhlIHNlbGVjdGVkIHN0YWNrc1xuICAgKiBhdXRvbWF0aWNhbGx5IHdoZW4gY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuICBJbXBsaWVzIGhvdHN3YXAgZGVwbG95bWVudHMuXG4gICAqXG4gICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSwgc3RhcnRpbmcgYSB3YXRjaGVyIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdhdGNoKGN4OiBJQ2xvdWRBc3NlbWJseVNvdXJjZSwgb3B0aW9uczogV2F0Y2hPcHRpb25zKTogUHJvbWlzZTxJV2F0Y2hlcj4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ3dhdGNoJyk7XG4gICAgYXdhaXQgdXNpbmcgYXNzZW1ibHkgPSBhd2FpdCBhc3NlbWJseUZyb21Tb3VyY2UoaW9IZWxwZXIsIGN4LCBmYWxzZSk7XG4gICAgY29uc3Qgcm9vdERpciA9IG9wdGlvbnMud2F0Y2hEaXIgPz8gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGlmIChvcHRpb25zLmluY2x1ZGUgPT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmV4Y2x1ZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihcbiAgICAgICAgXCJDYW5ub3QgdXNlIHRoZSAnd2F0Y2gnIGNvbW1hbmQgd2l0aG91dCBzcGVjaWZ5aW5nIGF0IGxlYXN0IG9uZSBkaXJlY3RvcnkgdG8gbW9uaXRvci4gXCIgK1xuICAgICAgICAgICdNYWtlIHN1cmUgdG8gYWRkIGEgXCJ3YXRjaFwiIGtleSB0byB5b3VyIGNkay5qc29uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRm9yIHRoZSBcImluY2x1ZGVcIiBzdWJrZXkgdW5kZXIgdGhlIFwid2F0Y2hcIiBrZXksIHRoZSBiZWhhdmlvciBpczpcbiAgICAvLyAxLiBObyBcIndhdGNoXCIgc2V0dGluZz8gV2UgZXJyb3Igb3V0LlxuICAgIC8vIDIuIFwid2F0Y2hcIiBzZXR0aW5nIHdpdGhvdXQgYW4gXCJpbmNsdWRlXCIga2V5PyBXZSBkZWZhdWx0IHRvIG9ic2VydmluZyBcIi4vKipcIi5cbiAgICAvLyAzLiBcIndhdGNoXCIgc2V0dGluZyB3aXRoIGFuIGVtcHR5IFwiaW5jbHVkZVwiIGtleT8gV2UgZGVmYXVsdCB0byBvYnNlcnZpbmcgXCIuLyoqXCIuXG4gICAgLy8gNC4gTm9uLWVtcHR5IFwiaW5jbHVkZVwiIGtleT8gSnVzdCB1c2UgdGhlIFwiaW5jbHVkZVwiIGtleS5cbiAgICBjb25zdCB3YXRjaEluY2x1ZGVzID0gcGF0dGVybnNBcnJheUZvcldhdGNoKG9wdGlvbnMuaW5jbHVkZSwge1xuICAgICAgcm9vdERpcixcbiAgICAgIHJldHVyblJvb3REaXJJZkVtcHR5OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgLy8gRm9yIHRoZSBcImV4Y2x1ZGVcIiBzdWJrZXkgdW5kZXIgdGhlIFwid2F0Y2hcIiBrZXksXG4gICAgLy8gdGhlIGJlaGF2aW9yIGlzIHRvIGFkZCBzb21lIGRlZmF1bHQgZXhjbHVkZXMgaW4gYWRkaXRpb24gdG8gdGhlIG9uZXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyOlxuICAgIC8vIDEuIFRoZSBDREsgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAvLyAyLiBBbnkgZmlsZSB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgZG90LlxuICAgIC8vIDMuIEFueSBkaXJlY3RvcnkncyBjb250ZW50IHdob3NlIG5hbWUgc3RhcnRzIHdpdGggYSBkb3QuXG4gICAgLy8gNC4gQW55IG5vZGVfbW9kdWxlcyBhbmQgaXRzIGNvbnRlbnQgKGV2ZW4gaWYgaXQncyBub3QgYSBKUy9UUyBwcm9qZWN0LCB5b3UgbWlnaHQgYmUgdXNpbmcgYSBsb2NhbCBhd3MtY2xpIHBhY2thZ2UpXG4gICAgY29uc3Qgb3V0ZGlyID0gYXNzZW1ibHkuZGlyZWN0b3J5O1xuICAgIGNvbnN0IHdhdGNoRXhjbHVkZXMgPSBwYXR0ZXJuc0FycmF5Rm9yV2F0Y2gob3B0aW9ucy5leGNsdWRlLCB7XG4gICAgICByb290RGlyLFxuICAgICAgcmV0dXJuUm9vdERpcklmRW1wdHk6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gb25seSBleGNsdWRlIHRoZSBvdXRkaXIgaWYgaXQgaXMgdW5kZXIgdGhlIHJvb3REaXJcbiAgICBjb25zdCByZWxhdGl2ZU91dERpciA9IHBhdGgucmVsYXRpdmUocm9vdERpciwgb3V0ZGlyKTtcbiAgICBpZiAoQm9vbGVhbihyZWxhdGl2ZU91dERpciAmJiAhcmVsYXRpdmVPdXREaXIuc3RhcnRzV2l0aCgnLi4nICsgcGF0aC5zZXApICYmICFwYXRoLmlzQWJzb2x1dGUocmVsYXRpdmVPdXREaXIpKSkge1xuICAgICAgd2F0Y2hFeGNsdWRlcy5wdXNoKGAke3JlbGF0aXZlT3V0RGlyfS8qKmApO1xuICAgIH1cblxuICAgIHdhdGNoRXhjbHVkZXMucHVzaCgnKiovLionLCAnKiovLiovKionLCAnKiovbm9kZV9tb2R1bGVzLyoqJyk7XG5cbiAgICAvLyBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIG9uIGNvbXB1dGVkIHNldHRpbmdzXG4gICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzEwLm1zZyhbXG4gICAgICBgcm9vdCBkaXJlY3RvcnkgdXNlZCBmb3IgJ3dhdGNoJyBpczogJHtyb290RGlyfWAsXG4gICAgICBgJ2luY2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoSW5jbHVkZXMpfWAsXG4gICAgICBgJ2V4Y2x1ZGUnIHBhdHRlcm5zIGZvciAnd2F0Y2gnOiAke0pTT04uc3RyaW5naWZ5KHdhdGNoRXhjbHVkZXMpfWAsXG4gICAgXS5qb2luKCdcXG4nKSwge1xuICAgICAgd2F0Y2hEaXI6IHJvb3REaXIsXG4gICAgICBpbmNsdWRlczogd2F0Y2hJbmNsdWRlcyxcbiAgICAgIGV4Y2x1ZGVzOiB3YXRjaEV4Y2x1ZGVzLFxuICAgIH0pKTtcblxuICAgIC8vIFNpbmNlICdjZGsgZGVwbG95JyBpcyBhIHJlbGF0aXZlbHkgc2xvdyBvcGVyYXRpb24gZm9yIGEgJ3dhdGNoJyBwcm9jZXNzLFxuICAgIC8vIGludHJvZHVjZSBhIGNvbmN1cnJlbmN5IGxhdGNoIHRoYXQgdHJhY2tzIHRoZSBzdGF0ZS5cbiAgICAvLyBUaGlzIHdheSwgaWYgZmlsZSBjaGFuZ2UgZXZlbnRzIGFycml2ZSB3aGVuIGEgJ2NkayBkZXBsb3knIGlzIHN0aWxsIGV4ZWN1dGluZyxcbiAgICAvLyB3ZSB3aWxsIGJhdGNoIHRoZW0sIGFuZCB0cmlnZ2VyIGFub3RoZXIgJ2NkayBkZXBsb3knIGFmdGVyIHRoZSBjdXJyZW50IG9uZSBmaW5pc2hlcyxcbiAgICAvLyBtYWtpbmcgc3VyZSAnY2RrIGRlcGxveSdzICBhbHdheXMgZXhlY3V0ZSBvbmUgYXQgYSB0aW1lLlxuICAgIC8vIEhlcmUncyBhIGRpYWdyYW0gc2hvd2luZyB0aGUgc3RhdGUgdHJhbnNpdGlvbnM6XG4gICAgLy8gLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgLS0tLS0tLS0gICAgZmlsZSBjaGFuZ2VkICAgICAtLS0tLS0tLS0tLS0tLSAgICBmaWxlIGNoYW5nZWQgICAgIC0tLS0tLS0tLS0tLS0tICBmaWxlIGNoYW5nZWRcbiAgICAvLyB8ICAgICAgICAgICAgfCAgcmVhZHkgZXZlbnQgICB8ICAgICAgfCAtLS0tLS0tLS0tLS0tLS0tLS0+IHwgICAgICAgICAgICB8IC0tLS0tLS0tLS0tLS0tLS0tLT4gfCAgICAgICAgICAgIHwgLS0tLS0tLS0tLS0tLS18XG4gICAgLy8gfCBwcmUtcmVhZHkgIHwgLS0tLS0tLS0tLS0tLT4gfCBvcGVuIHwgICAgICAgICAgICAgICAgICAgICB8IGRlcGxveWluZyAgfCAgICAgICAgICAgICAgICAgICAgIHwgICBxdWV1ZWQgICB8ICAgICAgICAgICAgICAgfFxuICAgIC8vIHwgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICB8IDwtLS0tLS0tLS0tLS0tLS0tLS0gfCAgICAgICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tLS0tLSB8ICAgICAgICAgICAgfCA8LS0tLS0tLS0tLS0tLXxcbiAgICAvLyAtLS0tLS0tLS0tLS0tLSAgICAgICAgICAgICAgICAtLS0tLS0tLSAgJ2NkayBkZXBsb3knIGRvbmUgIC0tLS0tLS0tLS0tLS0tICAnY2RrIGRlcGxveScgZG9uZSAgLS0tLS0tLS0tLS0tLS1cbiAgICB0eXBlIExhdGNoU3RhdGUgPSAncHJlLXJlYWR5JyB8ICdvcGVuJyB8ICdkZXBsb3lpbmcnIHwgJ3F1ZXVlZCc7XG4gICAgbGV0IGxhdGNoOiBMYXRjaFN0YXRlID0gJ3ByZS1yZWFkeSc7XG5cbiAgICBjb25zdCBjbG91ZFdhdGNoTG9nTW9uaXRvciA9IG9wdGlvbnMudHJhY2VMb2dzID8gbmV3IENsb3VkV2F0Y2hMb2dFdmVudE1vbml0b3IoeyBpb0hlbHBlciB9KSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZXBsb3lBbmRXYXRjaCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGxhdGNoID0gJ2RlcGxveWluZycgYXMgTGF0Y2hTdGF0ZTtcbiAgICAgIGF3YWl0IGNsb3VkV2F0Y2hMb2dNb25pdG9yPy5kZWFjdGl2YXRlKCk7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW52b2tlRGVwbG95RnJvbVdhdGNoKGFzc2VtYmx5LCBvcHRpb25zLCBjbG91ZFdhdGNoTG9nTW9uaXRvcik7XG5cbiAgICAgIC8vIElmIGxhdGNoIGlzIHN0aWxsICdkZXBsb3lpbmcnIGFmdGVyIHRoZSAnYXdhaXQnLCB0aGF0J3MgZmluZSxcbiAgICAgIC8vIGJ1dCBpZiBpdCdzICdxdWV1ZWQnLCB0aGF0IG1lYW5zIHdlIG5lZWQgdG8gZGVwbG95IGFnYWluXG4gICAgICB3aGlsZSAobGF0Y2ggPT09ICdxdWV1ZWQnKSB7XG4gICAgICAgIC8vIFR5cGVTY3JpcHQgZG9lc24ndCByZWFsaXplIGxhdGNoIGNhbiBjaGFuZ2UgYmV0d2VlbiAnYXdhaXRzJyxcbiAgICAgICAgLy8gYW5kIHRoaW5rcyB0aGUgYWJvdmUgJ3doaWxlJyBjb25kaXRpb24gaXMgYWx3YXlzICdmYWxzZScgd2l0aG91dCB0aGUgY2FzdFxuICAgICAgICBsYXRjaCA9ICdkZXBsb3lpbmcnO1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTUzMTUubXNnKFwiRGV0ZWN0ZWQgZmlsZSBjaGFuZ2VzIGR1cmluZyBkZXBsb3ltZW50LiBJbnZva2luZyAnY2RrIGRlcGxveScgYWdhaW5cIikpO1xuICAgICAgICBhd2FpdCB0aGlzLmludm9rZURlcGxveUZyb21XYXRjaChhc3NlbWJseSwgb3B0aW9ucywgY2xvdWRXYXRjaExvZ01vbml0b3IpO1xuICAgICAgfVxuICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICBhd2FpdCBjbG91ZFdhdGNoTG9nTW9uaXRvcj8uYWN0aXZhdGUoKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyXG4gICAgICAud2F0Y2god2F0Y2hJbmNsdWRlcywge1xuICAgICAgICBpZ25vcmVkOiB3YXRjaEV4Y2x1ZGVzLFxuICAgICAgICBjd2Q6IHJvb3REaXIsXG4gICAgICB9KVxuICAgICAgLm9uKCdyZWFkeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgbGF0Y2ggPSAnb3Blbic7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5ERUZBVUxUX1RPT0xLSVRfREVCVUcubXNnKFwiJ3dhdGNoJyByZWNlaXZlZCB0aGUgJ3JlYWR5JyBldmVudC4gRnJvbSBub3cgb24sIGFsbCBmaWxlIGNoYW5nZXMgd2lsbCB0cmlnZ2VyIGEgZGVwbG95bWVudFwiKSk7XG4gICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxNC5tc2coXCJUcmlnZ2VyaW5nIGluaXRpYWwgJ2NkayBkZXBsb3knXCIpKTtcbiAgICAgICAgYXdhaXQgZGVwbG95QW5kV2F0Y2goKTtcbiAgICAgIH0pXG4gICAgICAub24oJ2FsbCcsIGFzeW5jIChldmVudDogJ2FkZCcgfCAnYWRkRGlyJyB8ICdjaGFuZ2UnIHwgJ3VubGluaycgfCAndW5saW5rRGlyJywgZmlsZVBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCB3YXRjaEV2ZW50ID0ge1xuICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgIHBhdGg6IGZpbGVQYXRoLFxuICAgICAgICB9O1xuICAgICAgICBpZiAobGF0Y2ggPT09ICdwcmUtcmVhZHknKSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k1MzExLm1zZyhgJ3dhdGNoJyBpcyBvYnNlcnZpbmcgJHtldmVudCA9PT0gJ2FkZERpcicgPyAnZGlyZWN0b3J5JyA6ICd0aGUgZmlsZSd9ICcke2ZpbGVQYXRofScgZm9yIGNoYW5nZXNgLCB3YXRjaEV2ZW50KSk7XG4gICAgICAgIH0gZWxzZSBpZiAobGF0Y2ggPT09ICdvcGVuJykge1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMi5tc2coYERldGVjdGVkIGNoYW5nZSB0byAnJHtmaWxlUGF0aH0nICh0eXBlOiAke2V2ZW50fSkuIFRyaWdnZXJpbmcgJ2NkayBkZXBsb3knYCwgd2F0Y2hFdmVudCkpO1xuICAgICAgICAgIGF3YWl0IGRlcGxveUFuZFdhdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcyBtZWFucyBsYXRjaCBpcyBlaXRoZXIgJ2RlcGxveWluZycgb3IgJ3F1ZXVlZCdcbiAgICAgICAgICBsYXRjaCA9ICdxdWV1ZWQnO1xuICAgICAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JNTMxMy5tc2coXG4gICAgICAgICAgICBgRGV0ZWN0ZWQgY2hhbmdlIHRvICcke2ZpbGVQYXRofScgKHR5cGU6ICR7ZXZlbnR9KSB3aGlsZSAnY2RrIGRlcGxveScgaXMgc3RpbGwgcnVubmluZy4gV2lsbCBxdWV1ZSBmb3IgYW5vdGhlciBkZXBsb3ltZW50IGFmdGVyIHRoaXMgb25lIGZpbmlzaGVzJ2AsXG4gICAgICAgICAgICB3YXRjaEV2ZW50LFxuICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgIGNvbnN0IHN0b3BwZWRQcm9taXNlID0gcHJvbWlzZVdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcblxuICAgIHJldHVybiB7XG4gICAgICBhc3luYyBkaXNwb3NlKCkge1xuICAgICAgICBhd2FpdCB3YXRjaGVyLmNsb3NlKCk7XG4gICAgICAgIC8vIFByZXZlbnRzIE5vZGUgZnJvbSBzdGF5aW5nIGFsaXZlLiBUaGVyZSBpcyBubyAnZW5kJyBldmVudCB0aGF0IHRoZSB3YXRjaGVyIGVtaXRzXG4gICAgICAgIC8vIHRoYXQgd2UgY2FuIGtub3cgaXQncyBkZWZpbml0ZWx5IGRvbmUsIHNvIGJlc3Qgd2UgY2FuIGRvIGlzIHRlbGwgaXQgdG8gc3RvcCB3YXRjaGluZyxcbiAgICAgICAgLy8gc3RvcCBrZWVwaW5nIE5vZGUgYWxpdmUsIGFuZCB0aGVuIHByZXRlbmQgdGhhdCdzIGV2ZXJ5dGhpbmcgd2UgbmVlZGVkIHRvIGRvLlxuICAgICAgICB3YXRjaGVyLnVucmVmKCk7XG4gICAgICAgIHN0b3BwZWRQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgd2FpdEZvckVuZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0b3BwZWRQcm9taXNlLnByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kaXNwb3NlKCk7XG4gICAgICB9LFxuICAgIH0gc2F0aXNmaWVzIElXYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJvbGxiYWNrIEFjdGlvblxuICAgKlxuICAgKiBSb2xscyBiYWNrIHRoZSBzZWxlY3RlZCBzdGFja3MuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcm9sbGJhY2soY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBSb2xsYmFja09wdGlvbnMpOiBQcm9taXNlPFJvbGxiYWNrUmVzdWx0PiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAncm9sbGJhY2snKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9yb2xsYmFjayhhc3NlbWJseSwgJ3JvbGxiYWNrJywgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIHRvIGFsbG93IHJvbGxiYWNrIGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgb3Igd2F0Y2ggYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfcm9sbGJhY2soYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGFjdGlvbjogJ3JvbGxiYWNrJyB8ICdkZXBsb3knIHwgJ3dhdGNoJywgb3B0aW9uczogUm9sbGJhY2tPcHRpb25zKTogUHJvbWlzZTxSb2xsYmFja1Jlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgYWN0aW9uKTtcbiAgICBjb25zdCBzeW50aFNwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uU1lOVEhfQVNTRU1CTFkpLmJlZ2luKHsgc3RhY2tzOiBvcHRpb25zLnN0YWNrcyB9KTtcbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcyk7XG4gICAgYXdhaXQgdGhpcy52YWxpZGF0ZVN0YWNrc01ldGFkYXRhKHN0YWNrcywgaW9IZWxwZXIpO1xuICAgIGF3YWl0IHN5bnRoU3Bhbi5lbmQoKTtcblxuICAgIGNvbnN0IHJldDogUm9sbGJhY2tSZXN1bHQgPSB7XG4gICAgICBzdGFja3M6IFtdLFxuICAgIH07XG5cbiAgICBpZiAoc3RhY2tzLnN0YWNrQ291bnQgPT09IDApIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9FNjAwMS5tc2coJ05vIHN0YWNrcyBzZWxlY3RlZCcpKTtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgbGV0IGFueVJvbGxiYWNrYWJsZSA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHN0YWNrXSBvZiBzdGFja3Muc3RhY2tBcnRpZmFjdHMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCByb2xsYmFja1NwYW4gPSBhd2FpdCBpb0hlbHBlci5zcGFuKFNQQU4uUk9MTEJBQ0tfU1RBQ0spLmJlZ2luKGBSb2xsaW5nIGJhY2sgJHtjaGFsay5ib2xkKHN0YWNrLmRpc3BsYXlOYW1lKX1gLCB7XG4gICAgICAgIHRvdGFsOiBzdGFja3Muc3RhY2tDb3VudCxcbiAgICAgICAgY3VycmVudDogaW5kZXggKyAxLFxuICAgICAgICBzdGFjayxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKCdyb2xsYmFjaycpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgc3RhY2tSZXN1bHQgPSBhd2FpdCBkZXBsb3ltZW50cy5yb2xsYmFja1N0YWNrKHtcbiAgICAgICAgICBzdGFjayxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgICAgdG9vbGtpdFN0YWNrTmFtZTogdGhpcy50b29sa2l0U3RhY2tOYW1lLFxuICAgICAgICAgIG9ycGhhbkZhaWxlZFJlc291cmNlczogb3B0aW9ucy5vcnBoYW5GYWlsZWRSZXNvdXJjZXMsXG4gICAgICAgICAgdmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb246IG9wdGlvbnMudmFsaWRhdGVCb290c3RyYXBTdGFja1ZlcnNpb24sXG4gICAgICAgICAgb3JwaGFuTG9naWNhbElkczogb3B0aW9ucy5vcnBoYW5Mb2dpY2FsSWRzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCFzdGFja1Jlc3VsdC5ub3RJblJvbGxiYWNrYWJsZVN0YXRlKSB7XG4gICAgICAgICAgYW55Um9sbGJhY2thYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCByb2xsYmFja1NwYW4uZW5kKCk7XG5cbiAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgYWNjb3VudDogc3RhY2suZW52aXJvbm1lbnQuYWNjb3VudCxcbiAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhY2tOYW1lOiBzdGFjay5zdGFja05hbWUsXG4gICAgICAgICAgc3RhY2tBcm46IHN0YWNrUmVzdWx0LnN0YWNrQXJuLFxuICAgICAgICAgIHJlc3VsdDogc3RhY2tSZXN1bHQubm90SW5Sb2xsYmFja2FibGVTdGF0ZSA/ICdhbHJlYWR5LXN0YWJsZScgOiAncm9sbGVkLWJhY2snLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfRTY5MDAubXNnKGBcXG4g4p2MICAke2NoYWxrLmJvbGQoc3RhY2suZGlzcGxheU5hbWUpfSBmYWlsZWQ6ICR7Zm9ybWF0RXJyb3JNZXNzYWdlKGUpfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSb2xsYmFjayBmYWlsZWQgKHVzZSAtLWZvcmNlIHRvIG9ycGhhbiBmYWlsaW5nIHJlc291cmNlcyknKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFhbnlSb2xsYmFja2FibGUpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ05vIHN0YWNrcyB3ZXJlIGluIGEgc3RhdGUgdGhhdCBjb3VsZCBiZSByb2xsZWQgYmFjaycpO1xuICAgIH1cblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVmYWN0b3IgQWN0aW9uLiBNb3ZlcyByZXNvdXJjZXMgZnJvbSBvbmUgbG9jYXRpb24gKHN0YWNrICsgbG9naWNhbCBJRCkgdG8gYW5vdGhlci5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZWZhY3RvcihjeDogSUNsb3VkQXNzZW1ibHlTb3VyY2UsIG9wdGlvbnM6IFJlZmFjdG9yT3B0aW9ucyA9IHt9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaW9IZWxwZXIgPSBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCAncmVmYWN0b3InKTtcbiAgICBjb25zdCBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIHJldHVybiB0aGlzLl9yZWZhY3Rvcihhc3NlbWJseSwgaW9IZWxwZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBfcmVmYWN0b3IoYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksIGlvSGVscGVyOiBJb0hlbHBlciwgb3B0aW9uczogUmVmYWN0b3JPcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdSZWZhY3RvciBpcyBub3QgYXZhaWxhYmxlIHlldC4gVG9vIHNlZSB0aGUgcHJvcG9zZWQgY2hhbmdlcywgdXNlIHRoZSAtLWRyeS1ydW4gZmxhZy4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdHJhdGVneSA9IG9wdGlvbnMuc3RhY2tzPy5zdHJhdGVneSA/PyBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LkFMTF9TVEFDS1M7XG4gICAgaWYgKHN0cmF0ZWd5ICE9PSBTdGFja1NlbGVjdGlvblN0cmF0ZWd5LkFMTF9TVEFDS1MpIHtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9XODAxMC5tc2coXG4gICAgICAgICdSZWZhY3RvciBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBzdGFjayBzZWxlY3Rpb24uIFByb2NlZWRpbmcgd2l0aCB0aGUgZGVmYXVsdCBiZWhhdmlvciAoY29uc2lkZXJpbmcgYWxsIHN0YWNrcykuJyxcbiAgICAgICkpO1xuICAgIH1cbiAgICBjb25zdCBzdGFja3MgPSBhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihBTExfU1RBQ0tTKTtcblxuICAgIGNvbnN0IHNka1Byb3ZpZGVyID0gYXdhaXQgdGhpcy5zZGtQcm92aWRlcigncmVmYWN0b3InKTtcbiAgICBjb25zdCBtb3ZlbWVudHMgPSBhd2FpdCBmaW5kUmVzb3VyY2VNb3ZlbWVudHMoc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLCBzZGtQcm92aWRlcik7XG4gICAgY29uc3QgYW1iaWd1b3VzID0gYW1iaWd1b3VzTW92ZW1lbnRzKG1vdmVtZW50cyk7XG4gICAgaWYgKGFtYmlndW91cy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNvbnN0IHR5cGVkTWFwcGluZ3MgPSByZXNvdXJjZU1hcHBpbmdzKG1vdmVtZW50cykubWFwKG0gPT4gbS50b1R5cGVkTWFwcGluZygpKTtcbiAgICAgIGF3YWl0IGlvSGVscGVyLm5vdGlmeShJTy5DREtfVE9PTEtJVF9JODkwMC5tc2coZm9ybWF0VHlwZWRNYXBwaW5ncyh0eXBlZE1hcHBpbmdzKSwge1xuICAgICAgICB0eXBlZE1hcHBpbmdzLFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBBbWJpZ3VpdHlFcnJvcihhbWJpZ3VvdXMpO1xuICAgICAgY29uc3QgcGF0aHMgPSBlcnJvci5wYXRocygpO1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0k4OTAwLm1zZyhmb3JtYXRBbWJpZ3VvdXNNYXBwaW5ncyhwYXRocyksIHtcbiAgICAgICAgYW1iaWd1b3VzUGF0aHM6IHBhdGhzLFxuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXN0cm95IEFjdGlvblxuICAgKlxuICAgKiBEZXN0cm95cyB0aGUgc2VsZWN0ZWQgU3RhY2tzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlc3Ryb3koY3g6IElDbG91ZEFzc2VtYmx5U291cmNlLCBvcHRpb25zOiBEZXN0cm95T3B0aW9ucyk6IFByb21pc2U8RGVzdHJveVJlc3VsdD4ge1xuICAgIGNvbnN0IGlvSGVscGVyID0gYXNJb0hlbHBlcih0aGlzLmlvSG9zdCwgJ2Rlc3Ryb3knKTtcbiAgICBhd2FpdCB1c2luZyBhc3NlbWJseSA9IGF3YWl0IGFzc2VtYmx5RnJvbVNvdXJjZShpb0hlbHBlciwgY3gpO1xuICAgIHJldHVybiBhd2FpdCB0aGlzLl9kZXN0cm95KGFzc2VtYmx5LCAnZGVzdHJveScsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciB0byBhbGxvdyBkZXN0cm95IGJlaW5nIGNhbGxlZCBhcyBwYXJ0IG9mIHRoZSBkZXBsb3kgYWN0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBfZGVzdHJveShhc3NlbWJseTogU3RhY2tBc3NlbWJseSwgYWN0aW9uOiAnZGVwbG95JyB8ICdkZXN0cm95Jywgb3B0aW9uczogRGVzdHJveU9wdGlvbnMpOiBQcm9taXNlPERlc3Ryb3lSZXN1bHQ+IHtcbiAgICBjb25zdCBpb0hlbHBlciA9IGFzSW9IZWxwZXIodGhpcy5pb0hvc3QsIGFjdGlvbik7XG4gICAgY29uc3Qgc3ludGhTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLlNZTlRIX0FTU0VNQkxZKS5iZWdpbih7IHN0YWNrczogb3B0aW9ucy5zdGFja3MgfSk7XG4gICAgLy8gVGhlIHN0YWNrcyB3aWxsIGhhdmUgYmVlbiBvcmRlcmVkIGZvciBkZXBsb3ltZW50LCBzbyByZXZlcnNlIHRoZW0gZm9yIGRlbGV0aW9uLlxuICAgIGNvbnN0IHN0YWNrcyA9IChhd2FpdCBhc3NlbWJseS5zZWxlY3RTdGFja3NWMihvcHRpb25zLnN0YWNrcykpLnJldmVyc2VkKCk7XG4gICAgYXdhaXQgc3ludGhTcGFuLmVuZCgpO1xuXG4gICAgY29uc3QgcmV0OiBEZXN0cm95UmVzdWx0ID0ge1xuICAgICAgc3RhY2tzOiBbXSxcbiAgICB9O1xuXG4gICAgY29uc3QgbW90aXZhdGlvbiA9ICdEZXN0cm95aW5nIHN0YWNrcyBpcyBhbiBpcnJldmVyc2libGUgYWN0aW9uJztcbiAgICBjb25zdCBxdWVzdGlvbiA9IGBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlOiAke2NoYWxrLnJlZChzdGFja3MuaGllcmFyY2hpY2FsSWRzLmpvaW4oJywgJykpfWA7XG4gICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgaW9IZWxwZXIucmVxdWVzdFJlc3BvbnNlKElPLkNES19UT09MS0lUX0k3MDEwLnJlcShxdWVzdGlvbiwgeyBtb3RpdmF0aW9uIH0pKTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3MDEwLm1zZygnQWJvcnRlZCBieSB1c2VyJykpO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBkZXN0cm95U3BhbiA9IGF3YWl0IGlvSGVscGVyLnNwYW4oU1BBTi5ERVNUUk9ZX0FDVElPTikuYmVnaW4oe1xuICAgICAgc3RhY2tzOiBzdGFja3Muc3RhY2tBcnRpZmFjdHMsXG4gICAgfSk7XG4gICAgdHJ5IHtcbiAgICAgIGZvciAoY29uc3QgW2luZGV4LCBzdGFja10gb2Ygc3RhY2tzLnN0YWNrQXJ0aWZhY3RzLmVudHJpZXMoKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNpbmdsZURlc3Ryb3lTcGFuID0gYXdhaXQgaW9IZWxwZXIuc3BhbihTUEFOLkRFU1RST1lfU1RBQ0spXG4gICAgICAgICAgICAuYmVnaW4oY2hhbGsuZ3JlZW4oYCR7Y2hhbGsuYmx1ZShzdGFjay5kaXNwbGF5TmFtZSl9OiBkZXN0cm95aW5nLi4uIFske2luZGV4ICsgMX0vJHtzdGFja3Muc3RhY2tDb3VudH1dYCksIHtcbiAgICAgICAgICAgICAgdG90YWw6IHN0YWNrcy5zdGFja0NvdW50LFxuICAgICAgICAgICAgICBjdXJyZW50OiBpbmRleCArIDEsXG4gICAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgZGVwbG95bWVudHMgPSBhd2FpdCB0aGlzLmRlcGxveW1lbnRzRm9yQWN0aW9uKGFjdGlvbik7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGVwbG95bWVudHMuZGVzdHJveVN0YWNrKHtcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgZGVwbG95TmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0LnN0YWNrcy5wdXNoKHtcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgIGFjY291bnQ6IHN0YWNrLmVudmlyb25tZW50LmFjY291bnQsXG4gICAgICAgICAgICAgIHJlZ2lvbjogc3RhY2suZW52aXJvbm1lbnQucmVnaW9uLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YWNrTmFtZTogc3RhY2suc3RhY2tOYW1lLFxuICAgICAgICAgICAgc3RhY2tBcm46IHJlc3VsdC5zdGFja0FybixcbiAgICAgICAgICAgIHN0YWNrRXhpc3RlZDogcmVzdWx0LnN0YWNrQXJuICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBhd2FpdCBpb0hlbHBlci5ub3RpZnkoSU8uQ0RLX1RPT0xLSVRfSTc5MDAubXNnKGNoYWxrLmdyZWVuKGBcXG4g4pyFICAke2NoYWxrLmJsdWUoc3RhY2suZGlzcGxheU5hbWUpfTogJHthY3Rpb259ZWRgKSwgc3RhY2spKTtcbiAgICAgICAgICBhd2FpdCBzaW5nbGVEZXN0cm95U3Bhbi5lbmQoKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgYXdhaXQgaW9IZWxwZXIubm90aWZ5KElPLkNES19UT09MS0lUX0U3OTAwLm1zZyhgXFxuIOKdjCAgJHtjaGFsay5ibHVlKHN0YWNrLmRpc3BsYXlOYW1lKX06ICR7YWN0aW9ufSBmYWlsZWQgJHtlfWAsIHsgZXJyb3I6IGUgfSkpO1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJldDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZGVzdHJveVNwYW4uZW5kKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHRoZSBzdGFja3MgZm9yIGVycm9ycyBhbmQgd2FybmluZ3MgYWNjb3JkaW5nIHRvIHRoZSBDTEkncyBjdXJyZW50IHNldHRpbmdzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3RhY2tzTWV0YWRhdGEoc3RhY2tzOiBTdGFja0NvbGxlY3Rpb24sIGlvSG9zdDogSW9IZWxwZXIpIHtcbiAgICBjb25zdCBidWlsZGVyID0gKGxldmVsOiBJb01lc3NhZ2VMZXZlbCkgPT4ge1xuICAgICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgICBjYXNlICdlcnJvcic6IHJldHVybiBJTy5DREtfQVNTRU1CTFlfRTk5OTk7XG4gICAgICAgIGNhc2UgJ3dhcm4nOiByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX1c5OTk5O1xuICAgICAgICBkZWZhdWx0OiByZXR1cm4gSU8uQ0RLX0FTU0VNQkxZX0k5OTk5O1xuICAgICAgfVxuICAgIH07XG4gICAgYXdhaXQgc3RhY2tzLnZhbGlkYXRlTWV0YWRhdGEoXG4gICAgICB0aGlzLnByb3BzLmFzc2VtYmx5RmFpbHVyZUF0LFxuICAgICAgYXN5bmMgKGxldmVsLCBtc2cpID0+IGlvSG9zdC5ub3RpZnkoYnVpbGRlcihsZXZlbCkubXNnKGBbJHtsZXZlbH0gYXQgJHttc2cuaWR9XSAke21zZy5lbnRyeS5kYXRhfWAsIG1zZykpLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVwbG95bWVudHMgY2xhc3NcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95bWVudHNGb3JBY3Rpb24oYWN0aW9uOiBUb29sa2l0QWN0aW9uKTogUHJvbWlzZTxEZXBsb3ltZW50cz4ge1xuICAgIHJldHVybiBuZXcgRGVwbG95bWVudHMoe1xuICAgICAgc2RrUHJvdmlkZXI6IGF3YWl0IHRoaXMuc2RrUHJvdmlkZXIoYWN0aW9uKSxcbiAgICAgIHRvb2xraXRTdGFja05hbWU6IHRoaXMudG9vbGtpdFN0YWNrTmFtZSxcbiAgICAgIGlvSGVscGVyOiBhc0lvSGVscGVyKHRoaXMuaW9Ib3N0LCBhY3Rpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBpbnZva2VEZXBsb3lGcm9tV2F0Y2goXG4gICAgYXNzZW1ibHk6IFN0YWNrQXNzZW1ibHksXG4gICAgb3B0aW9uczogV2F0Y2hPcHRpb25zLFxuICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yPzogQ2xvdWRXYXRjaExvZ0V2ZW50TW9uaXRvcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgLy8gd2F0Y2ggZGVmYXVsdHMgaG90c3dhcCB0byBlbmFibGVkXG4gICAgY29uc3QgaG90c3dhcCA9IG9wdGlvbnMuaG90c3dhcCA/PyBIb3Rzd2FwTW9kZS5IT1RTV0FQX09OTFk7XG4gICAgY29uc3QgZGVwbG95T3B0aW9uczogRXh0ZW5kZWREZXBsb3lPcHRpb25zID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGNsb3VkV2F0Y2hMb2dNb25pdG9yLFxuICAgICAgaG90c3dhcCxcbiAgICAgIGV4dHJhVXNlckFnZW50OiBgY2RrLXdhdGNoL2hvdHN3YXAtJHtob3Rzd2FwID09PSBIb3Rzd2FwTW9kZS5GVUxMX0RFUExPWU1FTlQgPyAnb2ZmJyA6ICdvbid9YCxcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuX2RlcGxveShhc3NlbWJseSwgJ3dhdGNoJywgZGVwbG95T3B0aW9ucyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBqdXN0IGNvbnRpbnVlIC0gZGVwbG95IHdpbGwgc2hvdyB0aGUgZXJyb3JcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGEgYGNkay53YXRjaCgpYCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVdhdGNoZXIgZXh0ZW5kcyBBc3luY0Rpc3Bvc2FibGUge1xuICAvKipcbiAgICogU3RvcCB0aGUgd2F0Y2hlciBhbmQgd2FpdCBmb3IgdGhlIGN1cnJlbnQgd2F0Y2ggaXRlcmF0aW9uIHRvIGNvbXBsZXRlLlxuICAgKlxuICAgKiBBbiBhbGlhcyBmb3IgYFtTeW1ib2wuYXN5bmNEaXNwb3NlXWAsIGFzIGEgbW9yZSByZWFkYWJsZSBhbHRlcm5hdGl2ZSBmb3JcbiAgICogZW52aXJvbm1lbnRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0aGUgRGlzcG9zYWJsZSBBUElzIHlldC5cbiAgICovXG4gIGRpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogV2FpdCBmb3IgdGhlIHdhdGNoZXIgdG8gc3RvcC5cbiAgICpcbiAgICogVGhlIHdhdGNoZXIgd2lsbCBvbmx5IHN0b3AgaWYgYGRpc3Bvc2UoKWAgb3IgYFtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCBhcmUgY2FsbGVkLlxuICAgKlxuICAgKiBJZiBuZWl0aGVyIG9mIHRob3NlIGlzIGNhbGxlZCwgYXdhaXRpbmcgdGhpcyBwcm9taXNlIHdpbGwgd2FpdCBmb3JldmVyLlxuICAgKi9cbiAgd2FpdEZvckVuZCgpOiBQcm9taXNlPHZvaWQ+O1xufVxuIl19
|