@aws-cdk/integ-runner 2.200.0 → 2.200.2
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/THIRD_PARTY_LICENSES +739 -2567
- package/lib/runner/{runner-base.d.ts → cdk-integ-helper.d.ts} +84 -33
- package/lib/runner/cdk-integ-helper.d.ts.map +1 -0
- package/lib/runner/cdk-integ-helper.js +451 -0
- package/lib/runner/engine.d.ts +3 -2
- package/lib/runner/engine.d.ts.map +1 -1
- package/lib/runner/engine.js +1 -1
- package/lib/runner/index.d.ts +1 -1
- package/lib/runner/index.d.ts.map +1 -1
- package/lib/runner/index.js +2 -2
- package/lib/runner/integ-test-runner.d.ts +12 -4
- package/lib/runner/integ-test-runner.d.ts.map +1 -1
- package/lib/runner/integ-test-runner.js +96 -66
- package/lib/runner/private/cloud-assembly.d.ts +1 -2
- package/lib/runner/private/cloud-assembly.d.ts.map +1 -1
- package/lib/runner/private/cloud-assembly.js +1 -1
- package/lib/runner/snapshot-test-runner.d.ts +10 -6
- package/lib/runner/snapshot-test-runner.d.ts.map +1 -1
- package/lib/runner/snapshot-test-runner.js +30 -33
- package/lib/workers/extract/index.js +3115 -44420
- package/package.json +7 -7
- package/lib/runner/runner-base.d.ts.map +0 -1
- package/lib/runner/runner-base.js +0 -381
|
@@ -7,7 +7,7 @@ const chokidar = require("chokidar");
|
|
|
7
7
|
const handler_js_1 = require("chokidar/handler.js");
|
|
8
8
|
const fs = require("fs-extra");
|
|
9
9
|
const workerpool = require("workerpool");
|
|
10
|
-
const
|
|
10
|
+
const cdk_integ_helper_1 = require("./cdk-integ-helper");
|
|
11
11
|
const logger = require("../logger");
|
|
12
12
|
const utils_1 = require("../utils");
|
|
13
13
|
const common_1 = require("../workers/common");
|
|
@@ -27,26 +27,48 @@ function isFileEvent(event) {
|
|
|
27
27
|
* An integration test runner that orchestrates executing
|
|
28
28
|
* integration tests
|
|
29
29
|
*/
|
|
30
|
-
class IntegTestRunner
|
|
30
|
+
class IntegTestRunner {
|
|
31
|
+
helper;
|
|
31
32
|
constructor(options, destructiveChanges) {
|
|
32
|
-
|
|
33
|
-
this._destructiveChanges = destructiveChanges;
|
|
33
|
+
this.helper = cdk_integ_helper_1.CdkIntegHelper.create(options);
|
|
34
|
+
this.helper._destructiveChanges = destructiveChanges;
|
|
35
|
+
// We need to have given this a value, but we don't actually care about it initially,
|
|
36
|
+
// because we only synth to get the test definition.
|
|
37
|
+
// FIXME: This is unfortunate -- in order to start running the test "for real" we
|
|
38
|
+
// already have created a real snapshot with the real test definition, but we've thrown
|
|
39
|
+
// that away already. So we need to synth again just to get the test definition, AGAIN.
|
|
40
|
+
//
|
|
41
|
+
// We will rewrite this later when it comes time to generate the actual
|
|
42
|
+
// golden snapshot, to match the requested value in the test definition.
|
|
43
|
+
this.helper.configureLegacyEnableLookups('dont-care');
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compatibility shim with old API
|
|
47
|
+
*/
|
|
48
|
+
get testName() {
|
|
49
|
+
return this.helper.testName;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Compatibility shim with old API
|
|
53
|
+
*/
|
|
54
|
+
async actualTestSuite() {
|
|
55
|
+
return (await this.helper.actualSnapshot()).testDefinition;
|
|
34
56
|
}
|
|
35
57
|
async actualTests() {
|
|
36
58
|
const actualTestSuite = await this.actualTestSuite();
|
|
37
59
|
// We don't want new tests written in the legacy mode.
|
|
38
60
|
// If there is no existing snapshot _and_ this is a legacy
|
|
39
61
|
// test then point the user to the new `IntegTest` construct
|
|
40
|
-
if (!this.hasSnapshot() && actualTestSuite.type === 'legacy-test-suite') {
|
|
41
|
-
throw new Error(`${this.testName} is a new test. Please use the IntegTest construct ` +
|
|
62
|
+
if (!this.helper.hasSnapshot() && actualTestSuite.type === 'legacy-test-suite') {
|
|
63
|
+
throw new Error(`${this.helper.testName} is a new test. Please use the IntegTest construct ` +
|
|
42
64
|
'to configure the test\n' +
|
|
43
65
|
'https://github.com/aws/aws-cdk/tree/main/packages/%40aws-cdk/integ-tests-alpha');
|
|
44
66
|
}
|
|
45
67
|
return actualTestSuite.testSuite;
|
|
46
68
|
}
|
|
47
69
|
createCdkContextJson() {
|
|
48
|
-
if (!fs.existsSync(this.cdkContextPath)) {
|
|
49
|
-
fs.writeFileSync(this.cdkContextPath, JSON.stringify({
|
|
70
|
+
if (!fs.existsSync(this.helper.cdkContextPath)) {
|
|
71
|
+
fs.writeFileSync(this.helper.cdkContextPath, JSON.stringify({
|
|
50
72
|
watch: {},
|
|
51
73
|
}, undefined, 2));
|
|
52
74
|
}
|
|
@@ -56,9 +78,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
56
78
|
* Fails fast if the snapshot does not exist at the given ref.
|
|
57
79
|
*/
|
|
58
80
|
checkoutSnapshotAtRef(ref) {
|
|
59
|
-
const gitCwd = path.dirname(this.
|
|
81
|
+
const gitCwd = path.dirname(this.helper.goldenSnapshotDir);
|
|
60
82
|
const git = ['git', '-C', gitCwd];
|
|
61
|
-
const relativeSnapshotDir = path.relative(gitCwd, this.
|
|
83
|
+
const relativeSnapshotDir = path.relative(gitCwd, this.helper.goldenSnapshotDir);
|
|
62
84
|
try {
|
|
63
85
|
(0, utils_1.exec)([...git, 'checkout', ref, '--', relativeSnapshotDir]);
|
|
64
86
|
}
|
|
@@ -76,19 +98,19 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
76
98
|
const totalTags = tags.length;
|
|
77
99
|
for (let i = 0; i < totalTags; i++) {
|
|
78
100
|
const tag = tags[i];
|
|
79
|
-
logger.highlight(`${this.testName}/${testCaseName}: deploying tag ${tag} (${i + 1}/${totalTags})`);
|
|
101
|
+
logger.highlight(`${this.helper.testName}/${testCaseName}: deploying tag ${tag} (${i + 1}/${totalTags})`);
|
|
80
102
|
this.checkoutSnapshotAtRef(tag);
|
|
81
|
-
const expectedTestSuite = await this.expectedTestSuite();
|
|
103
|
+
const expectedTestSuite = await this.helper.expectedTestSuite();
|
|
82
104
|
if (!expectedTestSuite || !(testCaseName in expectedTestSuite.testSuite)) {
|
|
83
105
|
throw new Error(`Test case '${testCaseName}' does not exist in snapshot at tag '${tag}'`);
|
|
84
106
|
}
|
|
85
107
|
const expectedTestCase = expectedTestSuite.testSuite[testCaseName];
|
|
86
|
-
const deployResult = await this.cdk.deploy({
|
|
108
|
+
const deployResult = await this.helper.cdk.deploy({
|
|
87
109
|
...deployArgs,
|
|
88
110
|
stacks: expectedTestCase.stacks,
|
|
89
111
|
...expectedTestCase?.cdkCommandOptions?.deploy?.args,
|
|
90
|
-
context: this.getContext(expectedTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
91
|
-
app: path.relative(this.directory, this.
|
|
112
|
+
context: this.helper.getContext(expectedTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
113
|
+
app: path.relative(this.helper.directory, this.helper.goldenSnapshotDir),
|
|
92
114
|
lookups: expectedTestSuite?.enableLookups,
|
|
93
115
|
});
|
|
94
116
|
if (deployResult.deleteFailures.length > 0) {
|
|
@@ -104,7 +126,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
104
126
|
}
|
|
105
127
|
}
|
|
106
128
|
}
|
|
107
|
-
logger.highlight(`${this.testName}/${testCaseName}: deploying current branch (final)`);
|
|
129
|
+
logger.highlight(`${this.helper.testName}/${testCaseName}: deploying current branch (final)`);
|
|
108
130
|
}
|
|
109
131
|
/**
|
|
110
132
|
* When running integration tests with the update path workflow
|
|
@@ -123,7 +145,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
123
145
|
// @see https://git-scm.com/docs/git#Documentation/git.txt--Cltpathgt
|
|
124
146
|
// This way we are guaranteed to operate under the correct git repo, even
|
|
125
147
|
// when executing integ-runner from outside the repo under test.
|
|
126
|
-
const gitCwd = path.dirname(this.
|
|
148
|
+
const gitCwd = path.dirname(this.helper.goldenSnapshotDir);
|
|
127
149
|
const git = ['git', '-C', gitCwd];
|
|
128
150
|
// https://git-scm.com/docs/git-merge-base
|
|
129
151
|
let baseBranch = undefined;
|
|
@@ -138,20 +160,20 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
138
160
|
}
|
|
139
161
|
}
|
|
140
162
|
catch (e) {
|
|
141
|
-
logger.warning('%s\n%s', 'Could not determine git origin branch.', `You need to manually checkout the snapshot directory ${this.
|
|
163
|
+
logger.warning('%s\n%s', 'Could not determine git origin branch.', `You need to manually checkout the snapshot directory ${this.helper.goldenSnapshotDir}` +
|
|
142
164
|
'from the merge-base (https://git-scm.com/docs/git-merge-base)');
|
|
143
165
|
logger.warning('error: %s', (0, common_1.formatError)(e));
|
|
144
166
|
}
|
|
145
167
|
// if we found the base branch then get the merge-base (most recent common commit)
|
|
146
168
|
// and checkout the snapshot using that commit
|
|
147
169
|
if (baseBranch) {
|
|
148
|
-
const relativeSnapshotDir = path.relative(gitCwd, this.
|
|
170
|
+
const relativeSnapshotDir = path.relative(gitCwd, this.helper.goldenSnapshotDir);
|
|
149
171
|
const checkoutCommand = [...git, 'checkout', [...git, 'merge-base', 'HEAD', baseBranch], '--', relativeSnapshotDir];
|
|
150
172
|
try {
|
|
151
173
|
(0, utils_1.execWithSubShell)(checkoutCommand);
|
|
152
174
|
}
|
|
153
175
|
catch (e) {
|
|
154
|
-
logger.warning('%s\n%s', `Could not checkout snapshot directory '${this.
|
|
176
|
+
logger.warning('%s\n%s', `Could not checkout snapshot directory '${this.helper.goldenSnapshotDir}'. Please verify the following command completes correctly:`, (0, utils_1.renderCommand)(checkoutCommand), '');
|
|
155
177
|
logger.warning('error: %s', (0, common_1.formatError)(e));
|
|
156
178
|
}
|
|
157
179
|
}
|
|
@@ -173,14 +195,14 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
173
195
|
};
|
|
174
196
|
try {
|
|
175
197
|
await this.watch({
|
|
176
|
-
...this.defaultArgs,
|
|
198
|
+
...this.helper.defaultArgs,
|
|
177
199
|
deploymentMethod: {
|
|
178
200
|
method: 'hotswap',
|
|
179
201
|
fallback: {
|
|
180
202
|
method: 'change-set',
|
|
181
203
|
},
|
|
182
204
|
},
|
|
183
|
-
profile: this.profile,
|
|
205
|
+
profile: this.helper.profile,
|
|
184
206
|
requireApproval: cloud_assembly_schema_1.RequireApproval.NEVER,
|
|
185
207
|
traceLogs: enableForVerbosityLevel(2) ?? false,
|
|
186
208
|
verbose: enableForVerbosityLevel(3),
|
|
@@ -210,6 +232,14 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
210
232
|
if (!actualTestCase) {
|
|
211
233
|
throw new Error(`Did not find test case name '${options.testCaseName}' in '${Object.keys(actualTestSuite.testSuite)}'`);
|
|
212
234
|
}
|
|
235
|
+
// Ideally we would force `enableLookups` to `true`, always, because that's what we would like to converge on for the snapshots.
|
|
236
|
+
//
|
|
237
|
+
// HOWEVER!
|
|
238
|
+
//
|
|
239
|
+
// In order to do that, to validate the snapshot correctly we need to match what's in `integ.json`. In order to ratchet
|
|
240
|
+
// that value to `true`, we would need to rewrite `integ.json` to have `enableLookups: true`. We don't currently
|
|
241
|
+
// have code to reliably rewrite that file, so we just leave the value at whatever the test requested.
|
|
242
|
+
this.helper.configureLegacyEnableLookups(actualTestSuite.enableLookups ?? false);
|
|
213
243
|
const clean = options.clean ?? true;
|
|
214
244
|
const updateWorkflowEnabled = (options.updateWorkflow ?? true)
|
|
215
245
|
&& (actualTestCase.stackUpdateWorkflow ?? true);
|
|
@@ -221,8 +251,8 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
221
251
|
try {
|
|
222
252
|
if (!options.dryRun && (actualTestCase.cdkCommandOptions?.deploy?.enabled ?? true)) {
|
|
223
253
|
assertionResults = await this.deploy({
|
|
224
|
-
...this.defaultArgs,
|
|
225
|
-
profile: this.profile,
|
|
254
|
+
...this.helper.defaultArgs,
|
|
255
|
+
profile: this.helper.profile,
|
|
226
256
|
requireApproval: cloud_assembly_schema_1.RequireApproval.NEVER,
|
|
227
257
|
verbose: enableForVerbosityLevel(3),
|
|
228
258
|
debug: enableForVerbosityLevel(4),
|
|
@@ -232,7 +262,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
232
262
|
// only create the snapshot if there are no failed assertion results
|
|
233
263
|
// (i.e. no failures)
|
|
234
264
|
if (!Object.values(assertionResults ?? {}).some(result => result.status === 'fail')) {
|
|
235
|
-
await this.createSnapshot();
|
|
265
|
+
await this.helper.createSnapshot();
|
|
236
266
|
}
|
|
237
267
|
}
|
|
238
268
|
catch (e) {
|
|
@@ -242,21 +272,21 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
242
272
|
if (!options.dryRun) {
|
|
243
273
|
if (clean && (actualTestCase.cdkCommandOptions?.destroy?.enabled ?? true)) {
|
|
244
274
|
await this.destroy(options.testCaseName, {
|
|
245
|
-
...this.defaultArgs,
|
|
246
|
-
profile: this.profile,
|
|
275
|
+
...this.helper.defaultArgs,
|
|
276
|
+
profile: this.helper.profile,
|
|
247
277
|
all: true,
|
|
248
278
|
force: true,
|
|
249
|
-
app: this.cdkApp,
|
|
250
|
-
output: path.relative(this.directory, this.cdkOutDir),
|
|
279
|
+
app: this.helper.cdkApp,
|
|
280
|
+
output: path.relative(this.helper.directory, this.helper.cdkOutDir),
|
|
251
281
|
...actualTestCase.cdkCommandOptions?.destroy?.args,
|
|
252
|
-
context: this.getContext(actualTestCase.cdkCommandOptions?.destroy?.args?.context),
|
|
282
|
+
context: this.helper.getContext(actualTestCase.cdkCommandOptions?.destroy?.args?.context),
|
|
253
283
|
roleArn: options.roleArn ?? actualTestCase.cdkCommandOptions?.destroy?.args?.roleArn,
|
|
254
284
|
verbose: enableForVerbosityLevel(3),
|
|
255
285
|
debug: enableForVerbosityLevel(4),
|
|
256
286
|
});
|
|
257
287
|
}
|
|
258
288
|
}
|
|
259
|
-
this.cleanup();
|
|
289
|
+
this.helper.cleanup();
|
|
260
290
|
}
|
|
261
291
|
return assertionResults;
|
|
262
292
|
}
|
|
@@ -269,17 +299,17 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
269
299
|
if (actualTestCase.hooks?.preDestroy) {
|
|
270
300
|
actualTestCase.hooks.preDestroy.forEach(cmd => {
|
|
271
301
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
272
|
-
cwd: path.dirname(this.
|
|
302
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
273
303
|
});
|
|
274
304
|
});
|
|
275
305
|
}
|
|
276
|
-
await this.cdk.destroy({
|
|
306
|
+
await this.helper.cdk.destroy({
|
|
277
307
|
...destroyArgs,
|
|
278
308
|
});
|
|
279
309
|
if (actualTestCase.hooks?.postDestroy) {
|
|
280
310
|
actualTestCase.hooks.postDestroy.forEach(cmd => {
|
|
281
311
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
282
|
-
cwd: path.dirname(this.
|
|
312
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
283
313
|
});
|
|
284
314
|
});
|
|
285
315
|
}
|
|
@@ -294,7 +324,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
294
324
|
if (actualTestCase.hooks?.preDeploy) {
|
|
295
325
|
actualTestCase.hooks.preDeploy.forEach(cmd => {
|
|
296
326
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
297
|
-
cwd: path.dirname(this.
|
|
327
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
298
328
|
});
|
|
299
329
|
});
|
|
300
330
|
}
|
|
@@ -305,13 +335,13 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
305
335
|
...actualTestCase.stacks,
|
|
306
336
|
...actualTestCase.assertionStack ? [actualTestCase.assertionStack] : [],
|
|
307
337
|
],
|
|
308
|
-
output: path.relative(this.directory, this.cdkOutDir),
|
|
309
|
-
outputsFile: path.relative(this.directory, path.join(this.cdkOutDir, 'assertion-results.json')),
|
|
338
|
+
output: path.relative(this.helper.directory, this.helper.cdkOutDir),
|
|
339
|
+
outputsFile: path.relative(this.helper.directory, path.join(this.helper.cdkOutDir, 'assertion-results.json')),
|
|
310
340
|
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
311
341
|
context: {
|
|
312
|
-
...this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
342
|
+
...this.helper.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
313
343
|
},
|
|
314
|
-
app: this.cdkApp,
|
|
344
|
+
app: this.helper.cdkApp,
|
|
315
345
|
};
|
|
316
346
|
const destroyMessage = {
|
|
317
347
|
additionalMessages: [
|
|
@@ -319,7 +349,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
319
349
|
` ${[
|
|
320
350
|
...process.env.AWS_REGION ? [`AWS_REGION=${process.env.AWS_REGION}`] : [],
|
|
321
351
|
'cdk destroy',
|
|
322
|
-
`-a '${this.cdkApp}'`,
|
|
352
|
+
`-a '${this.helper.cdkApp}'`,
|
|
323
353
|
watchArgs.stacks.join(' '),
|
|
324
354
|
`--profile ${watchArgs.profile}`,
|
|
325
355
|
].join(' ')}`,
|
|
@@ -334,9 +364,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
334
364
|
'Repro:',
|
|
335
365
|
` ${[
|
|
336
366
|
'cdk synth',
|
|
337
|
-
`-a '${this.cdkApp}'`,
|
|
338
|
-
`-o '${this.cdkOutDir}'`,
|
|
339
|
-
...Object.entries(this.getContext()).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []),
|
|
367
|
+
`-a '${this.helper.cdkApp}'`,
|
|
368
|
+
`-o '${this.helper.cdkOutDir}'`,
|
|
369
|
+
...Object.entries(this.helper.getContext()).flatMap(([k, v]) => typeof v !== 'object' ? [`-c '${k}=${v}'`] : []),
|
|
340
370
|
watchArgs.stacks.join(' '),
|
|
341
371
|
`--outputs-file ${watchArgs.outputsFile}`,
|
|
342
372
|
`--profile ${watchArgs.profile}`,
|
|
@@ -345,9 +375,9 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
345
375
|
],
|
|
346
376
|
});
|
|
347
377
|
}
|
|
348
|
-
const assertionResults = path.join(this.cdkOutDir, 'assertion-results.json');
|
|
349
|
-
const watcher = chokidar.watch([this.cdkOutDir], {
|
|
350
|
-
cwd: this.directory,
|
|
378
|
+
const assertionResults = path.join(this.helper.cdkOutDir, 'assertion-results.json');
|
|
379
|
+
const watcher = chokidar.watch([this.helper.cdkOutDir], {
|
|
380
|
+
cwd: this.helper.directory,
|
|
351
381
|
});
|
|
352
382
|
watcher.on('all', (event, file) => {
|
|
353
383
|
if (!isFileEvent(event)) {
|
|
@@ -360,7 +390,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
360
390
|
if (actualTestCase.hooks?.postDeploy) {
|
|
361
391
|
actualTestCase.hooks.postDeploy.forEach(cmd => {
|
|
362
392
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
363
|
-
cwd: path.dirname(this.
|
|
393
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
364
394
|
});
|
|
365
395
|
});
|
|
366
396
|
}
|
|
@@ -394,7 +424,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
394
424
|
});
|
|
395
425
|
});
|
|
396
426
|
const { promise: waiter, resolve } = (0, utils_1.promiseWithResolvers)();
|
|
397
|
-
await this.cdk.watch(watchArgs, {
|
|
427
|
+
await this.helper.cdk.watch(watchArgs, {
|
|
398
428
|
// if `-v` (or above) is passed then stream the logs
|
|
399
429
|
onStdout: (message) => {
|
|
400
430
|
if (verbosity > 0) {
|
|
@@ -427,7 +457,7 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
427
457
|
if (actualTestCase.hooks?.preDeploy) {
|
|
428
458
|
actualTestCase.hooks.preDeploy.forEach(cmd => {
|
|
429
459
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
430
|
-
cwd: path.dirname(this.
|
|
460
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
431
461
|
});
|
|
432
462
|
});
|
|
433
463
|
}
|
|
@@ -435,34 +465,34 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
435
465
|
// Tag-sequence update workflow: deploy each tag's snapshot in order
|
|
436
466
|
await this.deployFromTags(deployArgs, testCaseName, updateFromTags, allowDeleteFailures);
|
|
437
467
|
}
|
|
438
|
-
else if (updateWorkflowEnabled && this.hasSnapshot()) {
|
|
468
|
+
else if (updateWorkflowEnabled && this.helper.hasSnapshot()) {
|
|
439
469
|
// Normal merge-base update workflow
|
|
440
|
-
const expectedTestSuite = await this.expectedTestSuite();
|
|
470
|
+
const expectedTestSuite = await this.helper.expectedTestSuite();
|
|
441
471
|
if (expectedTestSuite && testCaseName in expectedTestSuite?.testSuite) {
|
|
442
472
|
this.checkoutSnapshot();
|
|
443
473
|
const expectedTestCase = expectedTestSuite.testSuite[testCaseName];
|
|
444
|
-
await this.cdk.deploy({
|
|
474
|
+
await this.helper.cdk.deploy({
|
|
445
475
|
...deployArgs,
|
|
446
476
|
stacks: expectedTestCase.stacks,
|
|
447
477
|
...expectedTestCase?.cdkCommandOptions?.deploy?.args,
|
|
448
|
-
context: this.getContext(expectedTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
449
|
-
app: path.relative(this.directory, this.
|
|
478
|
+
context: this.helper.getContext(expectedTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
479
|
+
app: path.relative(this.helper.directory, this.helper.goldenSnapshotDir),
|
|
450
480
|
lookups: expectedTestSuite?.enableLookups,
|
|
451
481
|
});
|
|
452
482
|
}
|
|
453
483
|
}
|
|
454
484
|
// now deploy the "actual" test.
|
|
455
485
|
// This is the stack update if the update workflow ran above.
|
|
456
|
-
const actualDeployResult = await this.cdk.deploy({
|
|
486
|
+
const actualDeployResult = await this.helper.cdk.deploy({
|
|
457
487
|
...deployArgs,
|
|
458
488
|
lookups: (await this.actualTestSuite()).enableLookups,
|
|
459
489
|
stacks: [
|
|
460
490
|
...actualTestCase.stacks,
|
|
461
491
|
],
|
|
462
|
-
output: path.relative(this.directory, this.cdkOutDir),
|
|
492
|
+
output: path.relative(this.helper.directory, this.helper.cdkOutDir),
|
|
463
493
|
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
464
|
-
context: this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
465
|
-
app: this.cdkApp,
|
|
494
|
+
context: this.helper.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
495
|
+
app: this.helper.cdkApp,
|
|
466
496
|
});
|
|
467
497
|
if (actualDeployResult.deleteFailures.length > 0) {
|
|
468
498
|
const details = actualDeployResult.deleteFailures
|
|
@@ -484,29 +514,29 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
484
514
|
// assertions instead of failing at the first failed assertion
|
|
485
515
|
// combining it with the above deployment would prevent any replacement updates
|
|
486
516
|
if (actualTestCase.assertionStack) {
|
|
487
|
-
await this.cdk.deploy({
|
|
517
|
+
await this.helper.cdk.deploy({
|
|
488
518
|
...deployArgs,
|
|
489
519
|
lookups: (await this.actualTestSuite()).enableLookups,
|
|
490
520
|
stacks: [
|
|
491
521
|
actualTestCase.assertionStack,
|
|
492
522
|
],
|
|
493
523
|
rollback: false,
|
|
494
|
-
output: path.relative(this.directory, this.cdkOutDir),
|
|
524
|
+
output: path.relative(this.helper.directory, this.helper.cdkOutDir),
|
|
495
525
|
...actualTestCase?.cdkCommandOptions?.deploy?.args,
|
|
496
|
-
outputsFile: path.relative(this.directory, path.join(this.cdkOutDir, 'assertion-results.json')),
|
|
497
|
-
context: this.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
498
|
-
app: this.cdkApp,
|
|
526
|
+
outputsFile: path.relative(this.helper.directory, path.join(this.helper.cdkOutDir, 'assertion-results.json')),
|
|
527
|
+
context: this.helper.getContext(actualTestCase?.cdkCommandOptions?.deploy?.args?.context),
|
|
528
|
+
app: this.helper.cdkApp,
|
|
499
529
|
});
|
|
500
530
|
}
|
|
501
531
|
if (actualTestCase.hooks?.postDeploy) {
|
|
502
532
|
actualTestCase.hooks.postDeploy.forEach(cmd => {
|
|
503
533
|
(0, utils_1.exec)((0, utils_1.chunks)(cmd), {
|
|
504
|
-
cwd: path.dirname(this.
|
|
534
|
+
cwd: path.dirname(this.helper.goldenSnapshotDir),
|
|
505
535
|
});
|
|
506
536
|
});
|
|
507
537
|
}
|
|
508
538
|
if (actualTestCase.assertionStack && actualTestCase.assertionStackName) {
|
|
509
|
-
return this.processAssertionResults(path.join(this.cdkOutDir, 'assertion-results.json'), actualTestCase.assertionStackName, actualTestCase.assertionStack);
|
|
539
|
+
return this.processAssertionResults(path.join(this.helper.cdkOutDir, 'assertion-results.json'), actualTestCase.assertionStackName, actualTestCase.assertionStack);
|
|
510
540
|
}
|
|
511
541
|
}
|
|
512
542
|
catch (e) {
|
|
@@ -569,4 +599,4 @@ class IntegTestRunner extends runner_base_1.IntegRunner {
|
|
|
569
599
|
}
|
|
570
600
|
}
|
|
571
601
|
exports.IntegTestRunner = IntegTestRunner;
|
|
572
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsMEVBQWlFO0FBQ2pFLHFDQUFxQztBQUNyQyxvREFBNkQ7QUFDN0QsK0JBQStCO0FBQy9CLHlDQUF5QztBQUV6QywrQ0FBNEM7QUFFNUMsb0NBQW9DO0FBQ3BDLG9DQUErRjtBQUUvRiw4Q0FBMEY7QUFFMUY7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsbUJBQU0sQ0FBQyxHQUFHLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLENBQVUsQ0FBQztBQUd6RDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWdCO0lBQ25DLE9BQVEsV0FBaUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQXdGRDs7O0dBR0c7QUFDSCxNQUFhLGVBQWdCLFNBQVEseUJBQVc7SUFDOUMsWUFBWSxPQUEyQixFQUFFLGtCQUF3QztRQUMvRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUM7SUFDaEQsQ0FBQztJQUVNLEtBQUssQ0FBQyxXQUFXO1FBQ3RCLE1BQU0sZUFBZSxHQUFHLE1BQU0sSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JELHNEQUFzRDtRQUN0RCwwREFBMEQ7UUFDMUQsNERBQTREO1FBQzVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksZUFBZSxDQUFDLElBQUksS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hFLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsUUFBUSxxREFBcUQ7Z0JBQ25GLHlCQUF5QjtnQkFDekIsZ0ZBQWdGLENBQ2pGLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTyxlQUFlLENBQUMsU0FBUyxDQUFD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RUFBRSxNQUFNO29CQUNkLE9BQU8sRUFBRSx1Q0FBdUMsQ0FBQyxFQUFFO2lCQUNwRCxDQUFDO1lBQ0osQ0FBQztvQkFBUyxDQUFDO2dCQUNULDREQUE0RDtnQkFDNUQsdURBQXVEO2dCQUN2RCwwQkFBMEI7Z0JBQzFCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDL0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLENBQVUsRUFBRSxXQUFvQixFQUFFLGVBQXdCO1FBQzNFLElBQUksV0FBVyxFQUFFLENBQUM7WUFDaEIsSUFBSSxlQUFlLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxPQUFPLEdBQUksQ0FBVyxDQUFDLE9BQU8sQ0FBQztnQkFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDcEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLENBQUMsQ0FBQztRQUNWLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUFubUJELDBDQW1tQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHR5cGUgeyBEZXN0cm95T3B0aW9ucywgVGVzdENhc2UgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgUmVxdWlyZUFwcHJvdmFsIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCAqIGFzIGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCB7IHR5cGUgRXZlbnROYW1lLCBFVkVOVFMgfSBmcm9tICdjaG9raWRhci9oYW5kbGVyLmpzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIHdvcmtlcnBvb2wgZnJvbSAnd29ya2VycG9vbCc7XG5pbXBvcnQgdHlwZSB7IEludGVnUnVubmVyT3B0aW9ucyB9IGZyb20gJy4vcnVubmVyLWJhc2UnO1xuaW1wb3J0IHsgSW50ZWdSdW5uZXIgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcbmltcG9ydCB0eXBlICogYXMgY2RrIGZyb20gJy4uL2VuZ2luZXMvY2RrLWludGVyZmFjZSc7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IGNodW5rcywgZXhlYywgZXhlY1dpdGhTdWJTaGVsbCwgcHJvbWlzZVdpdGhSZXNvbHZlcnMsIHJlbmRlckNvbW1hbmQgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgdHlwZSB7IERlc3RydWN0aXZlQ2hhbmdlLCBBc3NlcnRpb25SZXN1bHRzLCBBc3NlcnRpb25SZXN1bHQgfSBmcm9tICcuLi93b3JrZXJzL2NvbW1vbic7XG5pbXBvcnQgeyBEaWFnbm9zdGljUmVhc29uLCBmb3JtYXRBc3NlcnRpb25SZXN1bHRzLCBmb3JtYXRFcnJvciB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcblxuLyoqXG4gKiBGaWxlIGV2ZW50cyB0aGF0IHdlIGNhcmUgYWJvdXQgZnJvbSBjaG9raWRhci5cbiAqIEluIGNob2tpZGFyIHY0LCBFdmVudE5hbWUgaW5jbHVkZXMgYWRkaXRpb25hbCBldmVudHMgbGlrZSAnZXJyb3InLCAncmF3JywgJ3JlYWR5JywgJ2FsbCdcbiAqIHRoYXQgd2UgbmVlZCB0byBmaWx0ZXIgb3V0IGluIHRoZSAnYWxsJyBoYW5kbGVyLlxuICovXG5jb25zdCBGSUxFX0VWRU5UUyA9IFtFVkVOVFMuQURELCBFVkVOVFMuQ0hBTkdFXSBhcyBjb25zdDtcbnR5cGUgRmlsZUV2ZW50ID0gdHlwZW9mIEZJTEVfRVZFTlRTW251bWJlcl07XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBldmVudCBpcyBhIGZpbGUgZXZlbnQgd2Ugc2hvdWxkIHByb2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIGlzRmlsZUV2ZW50KGV2ZW50OiBFdmVudE5hbWUpOiBldmVudCBpcyBGaWxlRXZlbnQge1xuICByZXR1cm4gKEZJTEVfRVZFTlRTIGFzIHJlYWRvbmx5IHN0cmluZ1tdKS5pbmNsdWRlcyhldmVudCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlXG4gICAqL1xuICByZWFkb25seSB0ZXN0Q2FzZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGxldmVsIG9mIHZlcmJvc2l0eSBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYm9zaXR5PzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNoT3B0aW9ucyBleHRlbmRzIENvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogQVJOIG9mIHRoZSBJQU0gcm9sZSBmb3IgQ2xvdWRGb3JtYXRpb24gdG8gYXNzdW1lIGR1cmluZyBkZXBsb3kvZGVzdHJveVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgYm9vdHN0cmFwIGNmbi1leGVjIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGludGVncmF0aW9uIHRlc3QgcnVubmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuT3B0aW9ucyBleHRlbmRzIENvbW1vbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcnVuIGBjZGsgZGVzdHJveWAgYW5kIGNsZWFudXAgdGhlXG4gICAqIGludGVncmF0aW9uIHRlc3Qgc3RhY2tzLlxuICAgKlxuICAgKiBTZXQgdGhpcyB0byBmYWxzZSBpZiB5b3UgbmVlZCB0byBwZXJmb3JtIGFueSB2YWxpZGF0aW9uXG4gICAqIG9yIHRyb3VibGVzaG9vdGluZyBhZnRlciBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBjbGVhbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHNldCB0byB0cnVlLCB0aGUgaW50ZWdyYXRpb24gdGVzdCB3aWxsIG5vdCBkZXBsb3lcbiAgICogYW55dGhpbmcgYW5kIHdpbGwgc2ltcGx5IHVwZGF0ZSB0aGUgc25hcHNob3QuXG4gICAqXG4gICAqIFlvdSBzaG91bGQgTk9UIHVzZSB0aGlzIG1ldGhvZCBzaW5jZSB5b3UgYXJlIGVzc2VudGlhbGx5XG4gICAqIGJ5cGFzc2luZyB0aGUgaW50ZWdyYXRpb24gdGVzdC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGRyeVJ1bj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIHRoaXMgaXMgc2V0IHRvIGZhbHNlIHRoZW4gdGhlIHN0YWNrIHVwZGF0ZSB3b3JrZmxvdyB3aWxsXG4gICAqIG5vdCBiZSBydW5cbiAgICpcbiAgICogVGhlIHVwZGF0ZSB3b3JrZmxvdyBleGlzdHMgdG8gY2hlY2sgZm9yIGNhc2VzIHdoZXJlIGEgY2hhbmdlIHdvdWxkIGNhdXNlXG4gICAqIGEgZmFpbHVyZSB0byBhbiBleGlzdGluZyBzdGFjaywgYnV0IG5vdCBmb3IgYSBuZXdseSBjcmVhdGVkIHN0YWNrLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSB1cGRhdGVXb3JrZmxvdz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgZ2l0IHRhZ3MgdG8gZGVwbG95IGluIHNlcXVlbmNlIGJlZm9yZSBkZXBsb3lpbmcgdGhlIGN1cnJlbnQgY29kZS5cbiAgICogV2hlbiBwcm92aWRlZCwgcmVwbGFjZXMgdGhlIG5vcm1hbCBtZXJnZS1iYXNlIHVwZGF0ZSB3b3JrZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIG5vcm1hbCB1cGRhdGUgd29ya2Zsb3dcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZUZyb21UYWdzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgSUFNIHJvbGUgZm9yIENsb3VkRm9ybWF0aW9uIHRvIGFzc3VtZSBkdXJpbmcgZGVwbG95L2Rlc3Ryb3lcbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgdGhlIGJvb3RzdHJhcCBjZm4tZXhlYyByb2xlXG4gICAqL1xuICByZWFkb25seSByb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IHJlc291cmNlcyB0aGF0IGZhaWwgdG8gZGVsZXRlIGR1cmluZyBhIHN0YWNrIHVwZGF0ZS5cbiAgICpcbiAgICogV2hlbiBmYWxzZSwgdGhlIHRlc3Qgd2lsbCBmYWlsIGlmIENsb3VkRm9ybWF0aW9uIHNraXBzIGRlbGV0aW5nIGEgcmVzb3VyY2VcbiAgICogZHVyaW5nIGEgc3RhY2sgdXBkYXRlLiBXaGVuIHRydWUsIG9ubHkgYSB3YXJuaW5nIGlzIHByaW50ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhbGxvd0RlbGV0ZUZhaWx1cmVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBpbnRlZ3JhdGlvbiB0ZXN0IHJ1bm5lciB0aGF0IG9yY2hlc3RyYXRlcyBleGVjdXRpbmdcbiAqIGludGVncmF0aW9uIHRlc3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1Rlc3RSdW5uZXIgZXh0ZW5kcyBJbnRlZ1J1bm5lciB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEludGVnUnVubmVyT3B0aW9ucywgZGVzdHJ1Y3RpdmVDaGFuZ2VzPzogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSkge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuX2Rlc3RydWN0aXZlQ2hhbmdlcyA9IGRlc3RydWN0aXZlQ2hhbmdlcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY3R1YWxUZXN0cygpOiBQcm9taXNlPHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICAvLyBXZSBkb24ndCB3YW50IG5ldyB0ZXN0cyB3cml0dGVuIGluIHRoZSBsZWdhY3kgbW9kZS5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBleGlzdGluZyBzbmFwc2hvdCBfYW5kXyB0aGlzIGlzIGEgbGVnYWN5XG4gICAgLy8gdGVzdCB0aGVuIHBvaW50IHRoZSB1c2VyIHRvIHRoZSBuZXcgYEludGVnVGVzdGAgY29uc3RydWN0XG4gICAgaWYgKCF0aGlzLmhhc1NuYXBzaG90KCkgJiYgYWN0dWFsVGVzdFN1aXRlLnR5cGUgPT09ICdsZWdhY3ktdGVzdC1zdWl0ZScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLnRlc3ROYW1lfSBpcyBhIG5ldyB0ZXN0LiBQbGVhc2UgdXNlIHRoZSBJbnRlZ1Rlc3QgY29uc3RydWN0IGAgK1xuICAgICAgICAndG8gY29uZmlndXJlIHRoZSB0ZXN0XFxuJyArXG4gICAgICAgICdodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvdHJlZS9tYWluL3BhY2thZ2VzLyU0MGF3cy1jZGsvaW50ZWctdGVzdHMtYWxwaGEnLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVDZGtDb250ZXh0SnNvbigpOiB2b2lkIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmModGhpcy5jZGtDb250ZXh0UGF0aCkpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5jZGtDb250ZXh0UGF0aCwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICB3YXRjaDogeyB9LFxuICAgICAgfSwgdW5kZWZpbmVkLCAyKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrb3V0IHRoZSBzbmFwc2hvdCBkaXJlY3RvcnkgYXQgYSBzcGVjaWZpYyBnaXQgcmVmICh0YWcsIGNvbW1pdCwgYnJhbmNoKS5cbiAgICogRmFpbHMgZmFzdCBpZiB0aGUgc25hcHNob3QgZG9lcyBub3QgZXhpc3QgYXQgdGhlIGdpdmVuIHJlZi5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tvdXRTbmFwc2hvdEF0UmVmKHJlZjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZ2l0Q3dkID0gcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpO1xuICAgIGNvbnN0IGdpdCA9IFsnZ2l0JywgJy1DJywgZ2l0Q3dkXTtcbiAgICBjb25zdCByZWxhdGl2ZVNuYXBzaG90RGlyID0gcGF0aC5yZWxhdGl2ZShnaXRDd2QsIHRoaXMuc25hcHNob3REaXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWMoWy4uLmdpdCwgJ2NoZWNrb3V0JywgcmVmLCAnLS0nLCByZWxhdGl2ZVNuYXBzaG90RGlyXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU25hcHNob3QgZG9lcyBub3QgZXhpc3QgYXQgdGFnICcke3JlZn0nLiBgICtcbiAgICAgICAgYFBhdGg6ICR7cmVsYXRpdmVTbmFwc2hvdERpcn1cXG5gICtcbiAgICAgICAgYFVuZGVybHlpbmcgZXJyb3I6ICR7Zm9ybWF0RXJyb3IoZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSB0aGUgc25hcHNob3QgZnJvbSBlYWNoIGdpdCB0YWcgaW4gc2VxdWVuY2UsIHRoZW4gbGV0IHRoZSBjYWxsZXJcbiAgICogZGVwbG95IHRoZSBjdXJyZW50IGNvZGUgYXMgdGhlIGZpbmFsIHVwZGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95RnJvbVRhZ3MoXG4gICAgZGVwbG95QXJnczogY2RrLkRlcGxveU9wdGlvbnMsXG4gICAgdGVzdENhc2VOYW1lOiBzdHJpbmcsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWxsb3dEZWxldGVGYWlsdXJlczogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG90YWxUYWdzID0gdGFncy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsVGFnczsgaSsrKSB7XG4gICAgICBjb25zdCB0YWcgPSB0YWdzW2ldO1xuICAgICAgbG9nZ2VyLmhpZ2hsaWdodChgJHt0aGlzLnRlc3ROYW1lfS8ke3Rlc3RDYXNlTmFtZX06IGRlcGxveWluZyB0YWcgJHt0YWd9ICgke2kgKyAxfS8ke3RvdGFsVGFnc30pYCk7XG5cbiAgICAgIHRoaXMuY2hlY2tvdXRTbmFwc2hvdEF0UmVmKHRhZyk7XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5leHBlY3RlZFRlc3RTdWl0ZSgpO1xuICAgICAgaWYgKCFleHBlY3RlZFRlc3RTdWl0ZSB8fCAhKHRlc3RDYXNlTmFtZSBpbiBleHBlY3RlZFRlc3RTdWl0ZS50ZXN0U3VpdGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVzdCBjYXNlICcke3Rlc3RDYXNlTmFtZX0nIGRvZXMgbm90IGV4aXN0IGluIHNuYXBzaG90IGF0IHRhZyAnJHt0YWd9J2AsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdENhc2UgPSBleHBlY3RlZFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICAgIGNvbnN0IGRlcGxveVJlc3VsdCA9IGF3YWl0IHRoaXMuY2RrLmRlcGxveSh7XG4gICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgIHN0YWNrczogZXhwZWN0ZWRUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgIC4uLmV4cGVjdGVkVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3MsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dChleHBlY3RlZFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgYXBwOiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgbG9va3VwczogZXhwZWN0ZWRUZXN0U3VpdGU/LmVuYWJsZUxvb2t1cHMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBkZXBsb3lSZXN1bHQuZGVsZXRlRmFpbHVyZXNcbiAgICAgICAgICAubWFwKGYgPT4gYCAgLSAke2YubG9naWNhbFJlc291cmNlSWR9ICgke2YucmVzb3VyY2VUeXBlfSk6ICR7Zi5yZWFzb259YClcbiAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGBVcGRhdGUgZnJvbSB0YWcgJyR7dGFnfSc6ICR7ZGVwbG95UmVzdWx0LmRlbGV0ZUZhaWx1cmVzLmxlbmd0aH0gcmVzb3VyY2UocykgZmFpbGVkIHRvIGRlbGV0ZTpcXG4ke2RldGFpbHN9YDtcbiAgICAgICAgaWYgKGFsbG93RGVsZXRlRmFpbHVyZXMpIHtcbiAgICAgICAgICBsb2dnZXIud2FybmluZyhtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaGlnaGxpZ2h0KGAke3RoaXMudGVzdE5hbWV9LyR7dGVzdENhc2VOYW1lfTogZGVwbG95aW5nIGN1cnJlbnQgYnJhbmNoIChmaW5hbClgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMgd2l0aCB0aGUgdXBkYXRlIHBhdGggd29ya2Zsb3dcbiAgICogaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHNuYXBzaG90IHRoYXQgaXMgZGVwbG95ZWQgaXMgdGhlIGN1cnJlbnQgc25hcHNob3RcbiAgICogZnJvbSB0aGUgdXBzdHJlYW0gYnJhbmNoLiBJbiBvcmRlciB0byBndWFyYW50ZWUgdGhhdCwgZmlyc3QgY2hlY2tvdXQgdGhlIGxhdGVzdFxuICAgKiAodG8gdGhlIHVzZXIpIHNuYXBzaG90IGZyb20gdXBzdHJlYW1cbiAgICpcbiAgICogSXQgaXMgbm90IHN0cmFpZ2h0Zm9yd2FyZCB0byBmaWd1cmUgb3V0IHdoYXQgYnJhbmNoIHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgYnJhbmNoIHdhcyBjcmVhdGVkIGZyb20uIFRoaXMgaXMgYSBiZXN0IGVmZm9ydCBhdHRlbXB0IHRvIGRvIHNvLlxuICAgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGVyZSBpcyBhbiAnb3JpZ2luJy4gYGdpdCByZW1vdGUgc2hvdyBvcmlnaW5gIHJldHVybnMgYSBsaXN0IG9mXG4gICAqIGFsbCBicmFuY2hlcyBhbmQgd2UgdGhlbiBzZWFyY2ggZm9yIG9uZSB0aGF0IHN0YXJ0cyB3aXRoIGBIRUFEIGJyYW5jaDogYFxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja291dFNuYXBzaG90KCk6IHZvaWQge1xuICAgIC8vIFdlIHVzZSB0aGUgZGlyZWN0b3J5IHRoYXQgY29udGFpbnMgdGhlIHNuYXBzaG90IHRvIHJ1biBnaXQgY29tbWFuZHMgaW5cbiAgICAvLyBXZSBkb24ndCBjaGFuZ2UgdGhlIGN3ZCBmb3IgZXhlY3V0aW5nIGdpdCwgYnV0IGluc3RlYWQgdXNlIHRoZSAtQyBmbGFnXG4gICAgLy8gQHNlZSBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0I0RvY3VtZW50YXRpb24vZ2l0LnR4dC0tQ2x0cGF0aGd0XG4gICAgLy8gVGhpcyB3YXkgd2UgYXJlIGd1YXJhbnRlZWQgdG8gb3BlcmF0ZSB1bmRlciB0aGUgY29ycmVjdCBnaXQgcmVwbywgZXZlblxuICAgIC8vIHdoZW4gZXhlY3V0aW5nIGludGVnLXJ1bm5lciBmcm9tIG91dHNpZGUgdGhlIHJlcG8gdW5kZXIgdGVzdC5cbiAgICBjb25zdCBnaXRDd2QgPSBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpcik7XG4gICAgY29uc3QgZ2l0ID0gWydnaXQnLCAnLUMnLCBnaXRDd2RdO1xuXG4gICAgLy8gaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdC1tZXJnZS1iYXNlXG4gICAgbGV0IGJhc2VCcmFuY2g6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICAvLyB0cnkgdG8gZmluZCB0aGUgYmFzZSBicmFuY2ggdGhhdCB0aGUgd29ya2luZyBicmFuY2ggd2FzIGNyZWF0ZWQgZnJvbVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW46IHN0cmluZyA9IGV4ZWMoWy4uLmdpdCwgJ3JlbW90ZScsICdzaG93JywgJ29yaWdpbiddKTtcbiAgICAgIGNvbnN0IG9yaWdpbkxpbmVzID0gb3JpZ2luLnNwbGl0KCdcXG4nKTtcbiAgICAgIGZvciAoY29uc3QgbGluZSBvZiBvcmlnaW5MaW5lcykge1xuICAgICAgICBpZiAobGluZS50cmltKCkuc3RhcnRzV2l0aCgnSEVBRCBicmFuY2g6ICcpKSB7XG4gICAgICAgICAgYmFzZUJyYW5jaCA9IGxpbmUudHJpbSgpLnNwbGl0KCdIRUFEIGJyYW5jaDogJylbMV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnZXIud2FybmluZygnJXNcXG4lcycsXG4gICAgICAgICdDb3VsZCBub3QgZGV0ZXJtaW5lIGdpdCBvcmlnaW4gYnJhbmNoLicsXG4gICAgICAgIGBZb3UgbmVlZCB0byBtYW51YWxseSBjaGVja291dCB0aGUgc25hcHNob3QgZGlyZWN0b3J5ICR7dGhpcy5zbmFwc2hvdERpcn1gICtcbiAgICAgICAgJ2Zyb20gdGhlIG1lcmdlLWJhc2UgKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtbWVyZ2UtYmFzZSknLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvcjogJXMnLCBmb3JtYXRFcnJvcihlKSk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZm91bmQgdGhlIGJhc2UgYnJhbmNoIHRoZW4gZ2V0IHRoZSBtZXJnZS1iYXNlIChtb3N0IHJlY2VudCBjb21tb24gY29tbWl0KVxuICAgIC8vIGFuZCBjaGVja291dCB0aGUgc25hcHNob3QgdXNpbmcgdGhhdCBjb21taXRcbiAgICBpZiAoYmFzZUJyYW5jaCkge1xuICAgICAgY29uc3QgcmVsYXRpdmVTbmFwc2hvdERpciA9IHBhdGgucmVsYXRpdmUoZ2l0Q3dkLCB0aGlzLnNuYXBzaG90RGlyKTtcblxuICAgICAgY29uc3QgY2hlY2tvdXRDb21tYW5kID0gWy4uLmdpdCwgJ2NoZWNrb3V0JywgWy4uLmdpdCwgJ21lcmdlLWJhc2UnLCAnSEVBRCcsIGJhc2VCcmFuY2hdLCAnLS0nLCByZWxhdGl2ZVNuYXBzaG90RGlyXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGV4ZWNXaXRoU3ViU2hlbGwoY2hlY2tvdXRDb21tYW5kKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoJyVzXFxuJXMnLFxuICAgICAgICAgIGBDb3VsZCBub3QgY2hlY2tvdXQgc25hcHNob3QgZGlyZWN0b3J5ICcke3RoaXMuc25hcHNob3REaXJ9Jy4gUGxlYXNlIHZlcmlmeSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY29tcGxldGVzIGNvcnJlY3RseTpgLFxuICAgICAgICAgIHJlbmRlckNvbW1hbmQoY2hlY2tvdXRDb21tYW5kKSxcbiAgICAgICAgICAnJyxcbiAgICAgICAgKTtcbiAgICAgICAgbG9nZ2VyLndhcm5pbmcoJ2Vycm9yOiAlcycsIGZvcm1hdEVycm9yKGUpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUnVucyBjZGsgZGVwbG95IC0td2F0Y2ggZm9yIGFuIGludGVncmF0aW9uIHRlc3RcbiAgICpcbiAgICogVGhpcyBpcyBtZWFudCB0byBiZSBydW4gb24gYSBzaW5nbGUgdGVzdCBhbmQgd2lsbCBub3QgY3JlYXRlIGEgc25hcHNob3RcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3YXRjaEludGVnVGVzdChvcHRpb25zOiBXYXRjaE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBhY3R1YWxUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpO1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZVtvcHRpb25zLnRlc3RDYXNlTmFtZV07XG4gICAgaWYgKCFhY3R1YWxUZXN0Q2FzZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaWQgbm90IGZpbmQgdGVzdCBjYXNlIG5hbWUgJyR7b3B0aW9ucy50ZXN0Q2FzZU5hbWV9JyBpbiAnJHtPYmplY3Qua2V5cyhhY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlKX0nYCk7XG4gICAgfVxuICAgIGNvbnN0IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsID0gKG5lZWRlZCA9IDEpID0+IHtcbiAgICAgIGNvbnN0IHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zaXR5ID8/IDA7XG4gICAgICByZXR1cm4gKHZlcmJvc2l0eSA+PSBuZWVkZWQpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLndhdGNoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiB7XG4gICAgICAgICAgICBtZXRob2Q6ICdob3Rzd2FwJyxcbiAgICAgICAgICAgIGZhbGxiYWNrOiB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ2NoYW5nZS1zZXQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICByZXF1aXJlQXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbC5ORVZFUixcbiAgICAgICAgICB0cmFjZUxvZ3M6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDIpID8/IGZhbHNlLFxuICAgICAgICAgIHZlcmJvc2U6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDMpLFxuICAgICAgICAgIGRlYnVnOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCg0KSxcbiAgICAgICAgICByb2xlQXJuOiBvcHRpb25zLnJvbGVBcm4sXG4gICAgICAgIH0sXG4gICAgICAgIG9wdGlvbnMudGVzdENhc2VOYW1lLFxuICAgICAgICBvcHRpb25zLnZlcmJvc2l0eSA/PyAwLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcmNoZXN0cmF0ZXMgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0cy4gQ3VycmVudGx5IHRoaXMgaW5jbHVkZXNcbiAgICpcbiAgICogMS4gKGlmIHVwZGF0ZSB3b3JrZmxvdyBpcyBlbmFibGVkKSBEZXBsb3lpbmcgdGhlIHNuYXBzaG90IHRlc3Qgc3RhY2tzXG4gICAqIDIuIERlcGxveWluZyB0aGUgaW50ZWdyYXRpb24gdGVzdCBzdGFja3NcbiAgICogMi4gU2F2aW5nIHRoZSBzbmFwc2hvdCAoaWYgc3VjY2Vzc2Z1bClcbiAgICogMy4gRGVzdHJveWluZyB0aGUgaW50ZWdyYXRpb24gdGVzdCBzdGFja3MgKGlmIGNsZWFuPWZhbHNlKVxuICAgKlxuICAgKiBUaGUgdXBkYXRlIHdvcmtmbG93IGV4aXN0cyB0byBjaGVjayBmb3IgY2FzZXMgd2hlcmUgYSBjaGFuZ2Ugd291bGQgY2F1c2VcbiAgICogYSBmYWlsdXJlIHRvIGFuIGV4aXN0aW5nIHN0YWNrLCBidXQgbm90IGZvciBhIG5ld2x5IGNyZWF0ZWQgc3RhY2suXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcnVuSW50ZWdUZXN0Q2FzZShvcHRpb25zOiBSdW5PcHRpb25zKTogUHJvbWlzZTxBc3NlcnRpb25SZXN1bHRzIHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IGFzc2VydGlvblJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IGFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbb3B0aW9ucy50ZXN0Q2FzZU5hbWVdO1xuICAgIGlmICghYWN0dWFsVGVzdENhc2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRGlkIG5vdCBmaW5kIHRlc3QgY2FzZSBuYW1lICcke29wdGlvbnMudGVzdENhc2VOYW1lfScgaW4gJyR7T2JqZWN0LmtleXMoYWN0dWFsVGVzdFN1aXRlLnRlc3RTdWl0ZSl9J2ApO1xuICAgIH1cbiAgICBjb25zdCBjbGVhbiA9IG9wdGlvbnMuY2xlYW4gPz8gdHJ1ZTtcbiAgICBjb25zdCB1cGRhdGVXb3JrZmxvd0VuYWJsZWQgPSAob3B0aW9ucy51cGRhdGVXb3JrZmxvdyA/PyB0cnVlKVxuICAgICAgJiYgKGFjdHVhbFRlc3RDYXNlLnN0YWNrVXBkYXRlV29ya2Zsb3cgPz8gdHJ1ZSk7XG4gICAgY29uc3QgYWxsb3dEZWxldGVGYWlsdXJlcyA9IGFjdHVhbFRlc3RDYXNlLmFsbG93RGVsZXRlRmFpbHVyZXMgPz8gb3B0aW9ucy5hbGxvd0RlbGV0ZUZhaWx1cmVzID8/IGZhbHNlO1xuICAgIGNvbnN0IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsID0gKG5lZWRlZCA9IDEpID0+IHtcbiAgICAgIGNvbnN0IHZlcmJvc2l0eSA9IG9wdGlvbnMudmVyYm9zaXR5ID8/IDA7XG4gICAgICByZXR1cm4gKHZlcmJvc2l0eSA+PSBuZWVkZWQpID8gdHJ1ZSA6IHVuZGVmaW5lZDtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4gJiYgKGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmVuYWJsZWQgPz8gdHJ1ZSkpIHtcbiAgICAgICAgYXNzZXJ0aW9uUmVzdWx0cyA9IGF3YWl0IHRoaXMuZGVwbG95KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnRoaXMuZGVmYXVsdEFyZ3MsXG4gICAgICAgICAgICBwcm9maWxlOiB0aGlzLnByb2ZpbGUsXG4gICAgICAgICAgICByZXF1aXJlQXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbC5ORVZFUixcbiAgICAgICAgICAgIHZlcmJvc2U6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDMpLFxuICAgICAgICAgICAgZGVidWc6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDQpLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlV29ya2Zsb3dFbmFibGVkLFxuICAgICAgICAgIG9wdGlvbnMudGVzdENhc2VOYW1lLFxuICAgICAgICAgIGFsbG93RGVsZXRlRmFpbHVyZXMsXG4gICAgICAgICAgb3B0aW9ucy51cGRhdGVGcm9tVGFncyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSBjcmVhdGUgdGhlIHNuYXBzaG90IGlmIHRoZXJlIGFyZSBubyBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdHNcbiAgICAgIC8vIChpLmUuIG5vIGZhaWx1cmVzKVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKGFzc2VydGlvblJlc3VsdHMgPz8ge30pLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmYWlsJykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jcmVhdGVTbmFwc2hvdCgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICghb3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgaWYgKGNsZWFuICYmIChhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZW5hYmxlZCA/PyB0cnVlKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuZGVzdHJveShvcHRpb25zLnRlc3RDYXNlTmFtZSwge1xuICAgICAgICAgICAgLi4udGhpcy5kZWZhdWx0QXJncyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgYXBwOiB0aGlzLmNka0FwcCxcbiAgICAgICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmFyZ3MsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuID8/IGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5hcmdzPy5yb2xlQXJuLFxuICAgICAgICAgICAgdmVyYm9zZTogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoMyksXG4gICAgICAgICAgICBkZWJ1ZzogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoNCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgIH1cbiAgICByZXR1cm4gYXNzZXJ0aW9uUmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgaW50ZWcgdGVzdCBjYXNlIHN0YWNrIGRlc3RydWN0aW9uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGRlc3Ryb3kodGVzdENhc2VOYW1lOiBzdHJpbmcsIGRlc3Ryb3lBcmdzOiBEZXN0cm95T3B0aW9ucykge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlc3Ryb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucHJlRGVzdHJveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5jZGsuZGVzdHJveSh7XG4gICAgICAgIC4uLmRlc3Ryb3lBcmdzLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucG9zdERlc3Ryb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucG9zdERlc3Ryb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLnBhcnNlRXJyb3IoZSxcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmV4cGVjdEVycm9yID8/IGZhbHNlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZXhwZWN0ZWRNZXNzYWdlLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHdhdGNoKG9wdGlvbnM6IGNkay5XYXRjaE9wdGlvbnMsIHRlc3RDYXNlTmFtZTogc3RyaW5nLCB2ZXJib3NpdHk6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSBhY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlW3Rlc3RDYXNlTmFtZV07XG4gICAgaWYgKGFjdHVhbFRlc3RDYXNlLmhvb2tzPy5wcmVEZXBsb3kpIHtcbiAgICAgIGFjdHVhbFRlc3RDYXNlLmhvb2tzLnByZURlcGxveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgd2F0Y2hBcmdzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxvb2t1cHM6IGFjdHVhbFRlc3RTdWl0ZS5lbmFibGVMb29rdXBzLFxuICAgICAgc3RhY2tzOiBbXG4gICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlLnN0YWNrcyxcbiAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgPyBbYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tdIDogW10sXG4gICAgICBdLFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLmNka091dERpciksXG4gICAgICBvdXRwdXRzRmlsZTogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgcGF0aC5qb2luKHRoaXMuY2RrT3V0RGlyLCAnYXNzZXJ0aW9uLXJlc3VsdHMuanNvbicpKSxcbiAgICAgIC4uLmFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICAuLi50aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgfSxcbiAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgfTtcbiAgICBjb25zdCBkZXN0cm95TWVzc2FnZSA9IHtcbiAgICAgIGFkZGl0aW9uYWxNZXNzYWdlczogW1xuICAgICAgICAnQWZ0ZXIgeW91IGFyZSBkb25lIHlvdSBtdXN0IG1hbnVhbGx5IGRlc3Ryb3kgdGhlIGRlcGxveWVkIHN0YWNrcycsXG4gICAgICAgIGAgICR7W1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LkFXU19SRUdJT04gPyBbYEFXU19SRUdJT049JHtwcm9jZXNzLmVudi5BV1NfUkVHSU9OfWBdIDogW10sXG4gICAgICAgICAgJ2NkayBkZXN0cm95JyxcbiAgICAgICAgICBgLWEgJyR7dGhpcy5jZGtBcHB9J2AsXG4gICAgICAgICAgd2F0Y2hBcmdzLnN0YWNrcy5qb2luKCcgJyksXG4gICAgICAgICAgYC0tcHJvZmlsZSAke3dhdGNoQXJncy5wcm9maWxlfWAsXG4gICAgICAgIF0uam9pbignICcpfWAsXG4gICAgICBdLFxuICAgIH07XG4gICAgd29ya2VycG9vbC53b3JrZXJFbWl0KGRlc3Ryb3lNZXNzYWdlKTtcbiAgICBpZiAod2F0Y2hBcmdzLnZlcmJvc2UpIHtcbiAgICAgIC8vIGlmIGAtdnZ2YCAob3IgYWJvdmUpIGlzIHVzZWQgdGhlbiBwcmludCBvdXQgdGhlIGNvbW1hbmQgdGhhdCB3YXMgdXNlZFxuICAgICAgLy8gdGhpcyBhbGxvd3MgdXNlcnMgdG8gbWFudWFsbHkgcnVuIHRoZSBjb21tYW5kXG4gICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICBhZGRpdGlvbmFsTWVzc2FnZXM6IFtcbiAgICAgICAgICAnUmVwcm86JyxcbiAgICAgICAgICBgICAke1tcbiAgICAgICAgICAgICdjZGsgc3ludGgnLFxuICAgICAgICAgICAgYC1hICcke3RoaXMuY2RrQXBwfSdgLFxuICAgICAgICAgICAgYC1vICcke3RoaXMuY2RrT3V0RGlyfSdgLFxuICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXModGhpcy5nZXRDb250ZXh0KCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pLFxuICAgICAgICAgICAgd2F0Y2hBcmdzLnN0YWNrcy5qb2luKCcgJyksXG4gICAgICAgICAgICBgLS1vdXRwdXRzLWZpbGUgJHt3YXRjaEFyZ3Mub3V0cHV0c0ZpbGV9YCxcbiAgICAgICAgICAgIGAtLXByb2ZpbGUgJHt3YXRjaEFyZ3MucHJvZmlsZX1gLFxuICAgICAgICAgICAgJy0taG90c3dhcC1mYWxsYmFjaycsXG4gICAgICAgICAgXS5qb2luKCcgJyl9YCxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGFzc2VydGlvblJlc3VsdHMgPSBwYXRoLmpvaW4odGhpcy5jZGtPdXREaXIsICdhc3NlcnRpb24tcmVzdWx0cy5qc29uJyk7XG4gICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKFt0aGlzLmNka091dERpcl0sIHtcbiAgICAgIGN3ZDogdGhpcy5kaXJlY3RvcnksXG4gICAgfSk7XG4gICAgd2F0Y2hlci5vbignYWxsJywgKGV2ZW50OiBFdmVudE5hbWUsIGZpbGU6IHN0cmluZykgPT4ge1xuICAgICAgaWYgKCFpc0ZpbGVFdmVudChldmVudCkpIHtcbiAgICAgICAgcmV0dXJuOyAvLyBJZ25vcmUgbm9uLWZpbGUgZXZlbnRzIGxpa2UgJ2Vycm9yJywgJ3JhdycsICdyZWFkeScsICdhbGwnXG4gICAgICB9XG4gICAgICAvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgY2hhbmdlcyB0byB0aGUgYGFzc2VydGlvbi1yZXN1bHRzLmpzb25gIGZpbGUuIElmIHRoZXJlXG4gICAgICAvLyBhcmUgYXNzZXJ0aW9ucyB0aGVuIHRoaXMgd2lsbCBjaGFuZ2Ugb24gZXZlcnkgZGVwbG95bWVudFxuICAgICAgaWYgKGFzc2VydGlvblJlc3VsdHMuZW5kc1dpdGgoZmlsZSkgJiYgKGV2ZW50ID09PSAnYWRkJyB8fCBldmVudCA9PT0gJ2NoYW5nZScpKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGFjdHVhbFRlc3RDYXNlLmhvb2tzPy5wb3N0RGVwbG95KSB7XG4gICAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucG9zdERlcGxveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgJiYgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tOYW1lKSB7XG4gICAgICAgICAgY29uc3QgcmVzID0gdGhpcy5wcm9jZXNzQXNzZXJ0aW9uUmVzdWx0cyhcbiAgICAgICAgICAgIGFzc2VydGlvblJlc3VsdHMsXG4gICAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUsXG4gICAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChyZXMgJiYgT2JqZWN0LnZhbHVlcyhyZXMpLnNvbWUociA9PiByLnN0YXR1cyA9PT0gJ2ZhaWwnKSkge1xuICAgICAgICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLkFTU0VSVElPTl9GQUlMRUQsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiBgJHt0ZXN0Q2FzZU5hbWV9ICgke3dhdGNoQXJncy5wcm9maWxlfWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGZvcm1hdEFzc2VydGlvblJlc3VsdHMocmVzKSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uVEVTVF9TVUNDRVNTLFxuICAgICAgICAgICAgICB0ZXN0TmFtZTogYCR7dGVzdENhc2VOYW1lfWAsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IHJlcyA/IGZvcm1hdEFzc2VydGlvblJlc3VsdHMocmVzKSA6ICdOTyBBU1NFUlRJT05TJyxcbiAgICAgICAgICAgICAgZHVyYXRpb246IChEYXRlLm5vdygpIC0gc3RhcnQpIC8gMTAwMCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBlbWl0IHRoZSBkZXN0cm95IG1lc3NhZ2UgYWZ0ZXIgZXZlcnkgcnVuXG4gICAgICAgICAgLy8gc28gdGhhdCBpdCdzIHZpc2libGUgdG8gdGhlIHVzZXJcbiAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoZGVzdHJveU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICB3YXRjaGVyLm9uKCdyZWFkeScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgcmVzb2x2ZSh7fSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHJvbWlzZTogd2FpdGVyLCByZXNvbHZlIH0gPSBwcm9taXNlV2l0aFJlc29sdmVyczxudW1iZXIgfCBudWxsPigpO1xuXG4gICAgYXdhaXQgdGhpcy5jZGsud2F0Y2god2F0Y2hBcmdzLCB7XG4gICAgICAvLyBpZiBgLXZgIChvciBhYm92ZSkgaXMgcGFzc2VkIHRoZW4gc3RyZWFtIHRoZSBsb2dzXG4gICAgICBvblN0ZG91dDogKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHZlcmJvc2l0eSA+IDApIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGlmIGAtdmAgKG9yIGFib3ZlKSBpcyBwYXNzZWQgdGhlbiBzdHJlYW0gdGhlIGxvZ3NcbiAgICAgIG9uU3RkZXJyOiAobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAodmVyYm9zaXR5ID4gMCkge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DbG9zZTogYXN5bmMgKGNvZGUpID0+IHtcbiAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhdGNoIGV4aXRlZCB3aXRoIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgICAgICByZXNvbHZlKGNvZGUpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHdhaXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgaW50ZWcgdGVzdCBjYXNlIGRlcGxveW1lbnQsIGluY2x1ZGluZ1xuICAgKiBwZXJmb3JtaW5nIHRoZSB1cGRhdGUgd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95KFxuICAgIGRlcGxveUFyZ3M6IGNkay5EZXBsb3lPcHRpb25zLFxuICAgIHVwZGF0ZVdvcmtmbG93RW5hYmxlZDogYm9vbGVhbixcbiAgICB0ZXN0Q2FzZU5hbWU6IHN0cmluZyxcbiAgICBhbGxvd0RlbGV0ZUZhaWx1cmVzOiBib29sZWFuLFxuICAgIHVwZGF0ZUZyb21UYWdzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlcGxveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuc25hcHNob3REaXIpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVwZGF0ZUZyb21UYWdzICYmIHVwZGF0ZUZyb21UYWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gVGFnLXNlcXVlbmNlIHVwZGF0ZSB3b3JrZmxvdzogZGVwbG95IGVhY2ggdGFnJ3Mgc25hcHNob3QgaW4gb3JkZXJcbiAgICAgICAgYXdhaXQgdGhpcy5kZXBsb3lGcm9tVGFncyhkZXBsb3lBcmdzLCB0ZXN0Q2FzZU5hbWUsIHVwZGF0ZUZyb21UYWdzLCBhbGxvd0RlbGV0ZUZhaWx1cmVzKTtcbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlV29ya2Zsb3dFbmFibGVkICYmIHRoaXMuaGFzU25hcHNob3QoKSkge1xuICAgICAgICAvLyBOb3JtYWwgbWVyZ2UtYmFzZSB1cGRhdGUgd29ya2Zsb3dcbiAgICAgICAgY29uc3QgZXhwZWN0ZWRUZXN0U3VpdGUgPSBhd2FpdCB0aGlzLmV4cGVjdGVkVGVzdFN1aXRlKCk7XG4gICAgICAgIGlmIChleHBlY3RlZFRlc3RTdWl0ZSAmJiB0ZXN0Q2FzZU5hbWUgaW4gZXhwZWN0ZWRUZXN0U3VpdGU/LnRlc3RTdWl0ZSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tvdXRTbmFwc2hvdCgpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdENhc2UgPSBleHBlY3RlZFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAgICAgLi4uZGVwbG95QXJncyxcbiAgICAgICAgICAgIHN0YWNrczogZXhwZWN0ZWRUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgICAgICAuLi5leHBlY3RlZFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgICAgICAgY29udGV4dDogdGhpcy5nZXRDb250ZXh0KGV4cGVjdGVkVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgICAgYXBwOiBwYXRoLnJlbGF0aXZlKHRoaXMuZGlyZWN0b3J5LCB0aGlzLnNuYXBzaG90RGlyKSxcbiAgICAgICAgICAgIGxvb2t1cHM6IGV4cGVjdGVkVGVzdFN1aXRlPy5lbmFibGVMb29rdXBzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBub3cgZGVwbG95IHRoZSBcImFjdHVhbFwiIHRlc3QuXG4gICAgICAvLyBUaGlzIGlzIHRoZSBzdGFjayB1cGRhdGUgaWYgdGhlIHVwZGF0ZSB3b3JrZmxvdyByYW4gYWJvdmUuXG4gICAgICBjb25zdCBhY3R1YWxEZXBsb3lSZXN1bHQgPSBhd2FpdCB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAuLi5kZXBsb3lBcmdzLFxuICAgICAgICBsb29rdXBzOiAoYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKSkuZW5hYmxlTG9va3VwcyxcbiAgICAgICAgc3RhY2tzOiBbXG4gICAgICAgICAgLi4uYWN0dWFsVGVzdENhc2Uuc3RhY2tzLFxuICAgICAgICBdLFxuICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgLi4uYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3MsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuZ2V0Q29udGV4dChhY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGFjdHVhbERlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBhY3R1YWxEZXBsb3lSZXN1bHQuZGVsZXRlRmFpbHVyZXNcbiAgICAgICAgICAubWFwKGYgPT4gYCAgLSAke2YubG9naWNhbFJlc291cmNlSWR9ICgke2YucmVzb3VyY2VUeXBlfSk6ICR7Zi5yZWFzb259YClcbiAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGAke2FjdHVhbERlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGh9IHJlc291cmNlKHMpIGZhaWxlZCB0byBkZWxldGUgZHVyaW5nIHN0YWNrIHVwZGF0ZTpcXG4ke2RldGFpbHN9XFxuYCArXG4gICAgICAgICAgJ1RoZXNlIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQgYnkgQ2xvdWRGb3JtYXRpb24gYnV0IHN0aWxsIGV4aXN0IGFuZCBtYXkgaW5jdXIgY2hhcmdlcy4nO1xuICAgICAgICBpZiAoYWxsb3dEZWxldGVGYWlsdXJlcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGFzc2VydGlvbnNcbiAgICAgIC8vIGRlcGxveSB0aGUgYXNzZXJ0aW9uIHN0YWNrIGFzIHdlbGxcbiAgICAgIC8vIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgYWJvdmUgZGVwbG95bWVudCBiZWNhdXNlIHdlIHdhbnQgdG9cbiAgICAgIC8vIHNldCBgcm9sbGJhY2s6IGZhbHNlYC4gVGhpcyBhbGxvd3MgdGhlIGFzc2VydGlvbiBzdGFjayB0byBkZXBsb3kgYWxsIHRoZVxuICAgICAgLy8gYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIGZhaWxpbmcgYXQgdGhlIGZpcnN0IGZhaWxlZCBhc3NlcnRpb25cbiAgICAgIC8vIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBhYm92ZSBkZXBsb3ltZW50IHdvdWxkIHByZXZlbnQgYW55IHJlcGxhY2VtZW50IHVwZGF0ZXNcbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjaykge1xuICAgICAgICBhd2FpdCB0aGlzLmNkay5kZXBsb3koe1xuICAgICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgICAgbG9va3VwczogKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLmVuYWJsZUxvb2t1cHMsXG4gICAgICAgICAgc3RhY2tzOiBbXG4gICAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayxcbiAgICAgICAgICBdLFxuICAgICAgICAgIHJvbGxiYWNrOiBmYWxzZSxcbiAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgICAgICBvdXRwdXRzRmlsZTogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgcGF0aC5qb2luKHRoaXMuY2RrT3V0RGlyLCAnYXNzZXJ0aW9uLXJlc3VsdHMuanNvbicpKSxcbiAgICAgICAgICBjb250ZXh0OiB0aGlzLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgIGFwcDogdGhpcy5jZGtBcHAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnBvc3REZXBsb3kpIHtcbiAgICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucG9zdERlcGxveS5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgY3dkOiBwYXRoLmRpcm5hbWUodGhpcy5zbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgJiYgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tOYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKFxuICAgICAgICAgIHBhdGguam9pbih0aGlzLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKSxcbiAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUsXG4gICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5wYXJzZUVycm9yKGUsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmV4cGVjdEVycm9yID8/IGZhbHNlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5leHBlY3RlZE1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgb3V0cHV0c0ZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGFzc2VydGlvbnMgcmVzdWx0cyBhcyBzdGFja1xuICAgKiBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKGZpbGU6IHN0cmluZywgYXNzZXJ0aW9uU3RhY2tOYW1lOiBzdHJpbmcsIGFzc2VydGlvblN0YWNrSWQ6IHN0cmluZyk6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMgPSB7fTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0czogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0gPSBmcy5yZWFkSlNPTlN5bmMoZmlsZSk7XG5cbiAgICAgICAgaWYgKGFzc2VydGlvblN0YWNrTmFtZSBpbiBvdXRwdXRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbYXNzZXJ0aW9uSWQsIHJlc3VsdF0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0c1thc3NlcnRpb25TdGFja05hbWVdKSkge1xuICAgICAgICAgICAgaWYgKGFzc2VydGlvbklkLnN0YXJ0c1dpdGgoJ0Fzc2VydGlvblJlc3VsdHMnKSkge1xuICAgICAgICAgICAgICBjb25zdCBhc3NlcnRpb25SZXN1bHQ6IEFzc2VydGlvblJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0LnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSk7XG4gICAgICAgICAgICAgIGlmIChhc3NlcnRpb25SZXN1bHQuc3RhdHVzID09PSAnZmFpbCcgfHwgYXNzZXJ0aW9uUmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1thc3NlcnRpb25JZF0gPSBhc3NlcnRpb25SZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG91dHB1dHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBwcm9jZXNzZWQsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgdGVzdCBmYWlsc1xuICAgICAgICByZXN1bHRzW2Fzc2VydGlvblN0YWNrSWRdID0ge1xuICAgICAgICAgIHN0YXR1czogJ2ZhaWwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBlcnJvciBwcm9jZXNzaW5nIGFzc2VydGlvbiByZXN1bHRzOiAke2V9YCxcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgb3V0cHV0cyBmaWxlIHNvIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBzbmFwc2hvdFxuICAgICAgICAvLyBpdCB3aWxsIGNvbnRhaW4gZW52IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdmFsdWVzXG4gICAgICAgIC8vIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lXG4gICAgICAgIGZzLnVubGlua1N5bmMoZmlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHRzKS5sZW5ndGggPiAwID8gcmVzdWx0cyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBmcm9tIGEgQ0RLIGNvbW1hbmRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VFcnJvcihlOiB1bmtub3duLCBleHBlY3RFcnJvcjogYm9vbGVhbiwgZXhwZWN0ZWRNZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgaWYgKGV4cGVjdEVycm9yKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoKGV4cGVjdGVkTWVzc2FnZSkpIHtcbiAgICAgICAgICB0aHJvdyAoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
602
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWctdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbnRlZy10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFFN0IsMEVBQWlFO0FBQ2pFLHFDQUFxQztBQUNyQyxvREFBNkQ7QUFDN0QsK0JBQStCO0FBQy9CLHlDQUF5QztBQUV6Qyx5REFBb0Q7QUFFcEQsb0NBQW9DO0FBQ3BDLG9DQUErRjtBQUUvRiw4Q0FBMEY7QUFFMUY7Ozs7R0FJRztBQUNILE1BQU0sV0FBVyxHQUFHLENBQUMsbUJBQU0sQ0FBQyxHQUFHLEVBQUUsbUJBQU0sQ0FBQyxNQUFNLENBQVUsQ0FBQztBQUd6RDs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLEtBQWdCO0lBQ25DLE9BQVEsV0FBaUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQXdGRDs7O0dBR0c7QUFDSCxNQUFhLGVBQWU7SUFDVCxNQUFNLENBQWlCO0lBQ3hDLFlBQVksT0FBOEIsRUFBRSxrQkFBd0M7UUFDbEYsSUFBSSxDQUFDLE1BQU0sR0FBRyxpQ0FBYyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDO1FBRXJELHFGQUFxRjtRQUNyRixvREFBb0Q7UUFDcEQsaUZBQWlGO1FBQ2pGLHVGQUF1RjtRQUN2Rix1RkFBdUY7UUFDdkYsRUFBRTtRQUNGLHVFQUF1RTtRQUN2RSx3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSyxLQUFLLENBQUMsZUFBZTtRQUMzQixPQUFP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WixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBdG9CRCwwQ0Fzb0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgRGVzdHJveU9wdGlvbnMsIFRlc3RDYXNlIH0gZnJvbSAnQGF3cy1jZGsvY2xvdWQtYXNzZW1ibHktc2NoZW1hJztcbmltcG9ydCB7IFJlcXVpcmVBcHByb3ZhbCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgKiBhcyBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgeyB0eXBlIEV2ZW50TmFtZSwgRVZFTlRTIH0gZnJvbSAnY2hva2lkYXIvaGFuZGxlci5qcyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyB3b3JrZXJwb29sIGZyb20gJ3dvcmtlcnBvb2wnO1xuaW1wb3J0IHR5cGUgeyBDZGtJbnRlZ0hlbHBlck9wdGlvbnMgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHsgQ2RrSW50ZWdIZWxwZXIgfSBmcm9tICcuL2Nkay1pbnRlZy1oZWxwZXInO1xuaW1wb3J0IHR5cGUgKiBhcyBjZGsgZnJvbSAnLi4vZW5naW5lcy9jZGstaW50ZXJmYWNlJztcbmltcG9ydCAqIGFzIGxvZ2dlciBmcm9tICcuLi9sb2dnZXInO1xuaW1wb3J0IHsgY2h1bmtzLCBleGVjLCBleGVjV2l0aFN1YlNoZWxsLCBwcm9taXNlV2l0aFJlc29sdmVycywgcmVuZGVyQ29tbWFuZCB9IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB0eXBlIHsgRGVzdHJ1Y3RpdmVDaGFuZ2UsIEFzc2VydGlvblJlc3VsdHMsIEFzc2VydGlvblJlc3VsdCB9IGZyb20gJy4uL3dvcmtlcnMvY29tbW9uJztcbmltcG9ydCB7IERpYWdub3N0aWNSZWFzb24sIGZvcm1hdEFzc2VydGlvblJlc3VsdHMsIGZvcm1hdEVycm9yIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuXG4vKipcbiAqIEZpbGUgZXZlbnRzIHRoYXQgd2UgY2FyZSBhYm91dCBmcm9tIGNob2tpZGFyLlxuICogSW4gY2hva2lkYXIgdjQsIEV2ZW50TmFtZSBpbmNsdWRlcyBhZGRpdGlvbmFsIGV2ZW50cyBsaWtlICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJ1xuICogdGhhdCB3ZSBuZWVkIHRvIGZpbHRlciBvdXQgaW4gdGhlICdhbGwnIGhhbmRsZXIuXG4gKi9cbmNvbnN0IEZJTEVfRVZFTlRTID0gW0VWRU5UUy5BREQsIEVWRU5UUy5DSEFOR0VdIGFzIGNvbnN0O1xudHlwZSBGaWxlRXZlbnQgPSB0eXBlb2YgRklMRV9FVkVOVFNbbnVtYmVyXTtcblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIGV2ZW50IGlzIGEgZmlsZSBldmVudCB3ZSBzaG91bGQgcHJvY2Vzcy5cbiAqL1xuZnVuY3Rpb24gaXNGaWxlRXZlbnQoZXZlbnQ6IEV2ZW50TmFtZSk6IGV2ZW50IGlzIEZpbGVFdmVudCB7XG4gIHJldHVybiAoRklMRV9FVkVOVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGV2ZW50KTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21tb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2VcbiAgICovXG4gIHJlYWRvbmx5IHRlc3RDYXNlTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbGV2ZWwgb2YgdmVyYm9zaXR5IGZvciBsb2dnaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSB2ZXJib3NpdHk/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hPcHRpb25zIGV4dGVuZHMgQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBUk4gb2YgdGhlIElBTSByb2xlIGZvciBDbG91ZEZvcm1hdGlvbiB0byBhc3N1bWUgZHVyaW5nIGRlcGxveS9kZXN0cm95XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIHRoZSBib290c3RyYXAgY2ZuLWV4ZWMgcm9sZVxuICAgKi9cbiAgcmVhZG9ubHkgcm9sZUFybj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdCBydW5uZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5PcHRpb25zIGV4dGVuZHMgQ29tbW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBydW4gYGNkayBkZXN0cm95YCBhbmQgY2xlYW51cCB0aGVcbiAgICogaW50ZWdyYXRpb24gdGVzdCBzdGFja3MuXG4gICAqXG4gICAqIFNldCB0aGlzIHRvIGZhbHNlIGlmIHlvdSBuZWVkIHRvIHBlcmZvcm0gYW55IHZhbGlkYXRpb25cbiAgICogb3IgdHJvdWJsZXNob290aW5nIGFmdGVyIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgc2V0IHRvIHRydWUsIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0IHdpbGwgbm90IGRlcGxveVxuICAgKiBhbnl0aGluZyBhbmQgd2lsbCBzaW1wbHkgdXBkYXRlIHRoZSBzbmFwc2hvdC5cbiAgICpcbiAgICogWW91IHNob3VsZCBOT1QgdXNlIHRoaXMgbWV0aG9kIHNpbmNlIHlvdSBhcmUgZXNzZW50aWFsbHlcbiAgICogYnlwYXNzaW5nIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZHJ5UnVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgdGhpcyBpcyBzZXQgdG8gZmFsc2UgdGhlbiB0aGUgc3RhY2sgdXBkYXRlIHdvcmtmbG93IHdpbGxcbiAgICogbm90IGJlIHJ1blxuICAgKlxuICAgKiBUaGUgdXBkYXRlIHdvcmtmbG93IGV4aXN0cyB0byBjaGVjayBmb3IgY2FzZXMgd2hlcmUgYSBjaGFuZ2Ugd291bGQgY2F1c2VcbiAgICogYSBmYWlsdXJlIHRvIGFuIGV4aXN0aW5nIHN0YWNrLCBidXQgbm90IGZvciBhIG5ld2x5IGNyZWF0ZWQgc3RhY2suXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTGlzdCBvZiBnaXQgdGFncyB0byBkZXBsb3kgaW4gc2VxdWVuY2UgYmVmb3JlIGRlcGxveWluZyB0aGUgY3VycmVudCBjb2RlLlxuICAgKiBXaGVuIHByb3ZpZGVkLCByZXBsYWNlcyB0aGUgbm9ybWFsIG1lcmdlLWJhc2UgdXBkYXRlIHdvcmtmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgbm9ybWFsIHVwZGF0ZSB3b3JrZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgdXBkYXRlRnJvbVRhZ3M/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSBJQU0gcm9sZSBmb3IgQ2xvdWRGb3JtYXRpb24gdG8gYXNzdW1lIGR1cmluZyBkZXBsb3kvZGVzdHJveVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVzZSB0aGUgYm9vdHN0cmFwIGNmbi1leGVjIHJvbGVcbiAgICovXG4gIHJlYWRvbmx5IHJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgcmVzb3VyY2VzIHRoYXQgZmFpbCB0byBkZWxldGUgZHVyaW5nIGEgc3RhY2sgdXBkYXRlLlxuICAgKlxuICAgKiBXaGVuIGZhbHNlLCB0aGUgdGVzdCB3aWxsIGZhaWwgaWYgQ2xvdWRGb3JtYXRpb24gc2tpcHMgZGVsZXRpbmcgYSByZXNvdXJjZVxuICAgKiBkdXJpbmcgYSBzdGFjayB1cGRhdGUuIFdoZW4gdHJ1ZSwgb25seSBhIHdhcm5pbmcgaXMgcHJpbnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGFsbG93RGVsZXRlRmFpbHVyZXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEFuIGludGVncmF0aW9uIHRlc3QgcnVubmVyIHRoYXQgb3JjaGVzdHJhdGVzIGV4ZWN1dGluZ1xuICogaW50ZWdyYXRpb24gdGVzdHNcbiAqL1xuZXhwb3J0IGNsYXNzIEludGVnVGVzdFJ1bm5lciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGVscGVyOiBDZGtJbnRlZ0hlbHBlcjtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogQ2RrSW50ZWdIZWxwZXJPcHRpb25zLCBkZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdKSB7XG4gICAgdGhpcy5oZWxwZXIgPSBDZGtJbnRlZ0hlbHBlci5jcmVhdGUob3B0aW9ucyk7XG4gICAgdGhpcy5oZWxwZXIuX2Rlc3RydWN0aXZlQ2hhbmdlcyA9IGRlc3RydWN0aXZlQ2hhbmdlcztcblxuICAgIC8vIFdlIG5lZWQgdG8gaGF2ZSBnaXZlbiB0aGlzIGEgdmFsdWUsIGJ1dCB3ZSBkb24ndCBhY3R1YWxseSBjYXJlIGFib3V0IGl0IGluaXRpYWxseSxcbiAgICAvLyBiZWNhdXNlIHdlIG9ubHkgc3ludGggdG8gZ2V0IHRoZSB0ZXN0IGRlZmluaXRpb24uXG4gICAgLy8gRklYTUU6IFRoaXMgaXMgdW5mb3J0dW5hdGUgLS0gaW4gb3JkZXIgdG8gc3RhcnQgcnVubmluZyB0aGUgdGVzdCBcImZvciByZWFsXCIgd2VcbiAgICAvLyBhbHJlYWR5IGhhdmUgY3JlYXRlZCBhIHJlYWwgc25hcHNob3Qgd2l0aCB0aGUgcmVhbCB0ZXN0IGRlZmluaXRpb24sIGJ1dCB3ZSd2ZSB0aHJvd25cbiAgICAvLyB0aGF0IGF3YXkgYWxyZWFkeS4gU28gd2UgbmVlZCB0byBzeW50aCBhZ2FpbiBqdXN0IHRvIGdldCB0aGUgdGVzdCBkZWZpbml0aW9uLCBBR0FJTi5cbiAgICAvL1xuICAgIC8vIFdlIHdpbGwgcmV3cml0ZSB0aGlzIGxhdGVyIHdoZW4gaXQgY29tZXMgdGltZSB0byBnZW5lcmF0ZSB0aGUgYWN0dWFsXG4gICAgLy8gZ29sZGVuIHNuYXBzaG90LCB0byBtYXRjaCB0aGUgcmVxdWVzdGVkIHZhbHVlIGluIHRoZSB0ZXN0IGRlZmluaXRpb24uXG4gICAgdGhpcy5oZWxwZXIuY29uZmlndXJlTGVnYWN5RW5hYmxlTG9va3VwcygnZG9udC1jYXJlJyk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGF0aWJpbGl0eSBzaGltIHdpdGggb2xkIEFQSVxuICAgKi9cbiAgcHVibGljIGdldCB0ZXN0TmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oZWxwZXIudGVzdE5hbWU7XG4gIH1cblxuICAvKipcbiAgICogQ29tcGF0aWJpbGl0eSBzaGltIHdpdGggb2xkIEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBhY3R1YWxUZXN0U3VpdGUoKSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLmhlbHBlci5hY3R1YWxTbmFwc2hvdCgpKS50ZXN0RGVmaW5pdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBhY3R1YWxUZXN0cygpOiBQcm9taXNlPHsgW3Rlc3ROYW1lOiBzdHJpbmddOiBUZXN0Q2FzZSB9IHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICAvLyBXZSBkb24ndCB3YW50IG5ldyB0ZXN0cyB3cml0dGVuIGluIHRoZSBsZWdhY3kgbW9kZS5cbiAgICAvLyBJZiB0aGVyZSBpcyBubyBleGlzdGluZyBzbmFwc2hvdCBfYW5kXyB0aGlzIGlzIGEgbGVnYWN5XG4gICAgLy8gdGVzdCB0aGVuIHBvaW50IHRoZSB1c2VyIHRvIHRoZSBuZXcgYEludGVnVGVzdGAgY29uc3RydWN0XG4gICAgaWYgKCF0aGlzLmhlbHBlci5oYXNTbmFwc2hvdCgpICYmIGFjdHVhbFRlc3RTdWl0ZS50eXBlID09PSAnbGVnYWN5LXRlc3Qtc3VpdGUnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5oZWxwZXIudGVzdE5hbWV9IGlzIGEgbmV3IHRlc3QuIFBsZWFzZSB1c2UgdGhlIEludGVnVGVzdCBjb25zdHJ1Y3QgYCArXG4gICAgICAgICd0byBjb25maWd1cmUgdGhlIHRlc3RcXG4nICtcbiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay90cmVlL21haW4vcGFja2FnZXMvJTQwYXdzLWNkay9pbnRlZy10ZXN0cy1hbHBoYScsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBhY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUNka0NvbnRleHRKc29uKCk6IHZvaWQge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh0aGlzLmhlbHBlci5jZGtDb250ZXh0UGF0aCkpIHtcbiAgICAgIGZzLndyaXRlRmlsZVN5bmModGhpcy5oZWxwZXIuY2RrQ29udGV4dFBhdGgsIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgd2F0Y2g6IHsgfSxcbiAgICAgIH0sIHVuZGVmaW5lZCwgMikpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja291dCB0aGUgc25hcHNob3QgZGlyZWN0b3J5IGF0IGEgc3BlY2lmaWMgZ2l0IHJlZiAodGFnLCBjb21taXQsIGJyYW5jaCkuXG4gICAqIEZhaWxzIGZhc3QgaWYgdGhlIHNuYXBzaG90IGRvZXMgbm90IGV4aXN0IGF0IHRoZSBnaXZlbiByZWYuXG4gICAqL1xuICBwcml2YXRlIGNoZWNrb3V0U25hcHNob3RBdFJlZihyZWY6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGdpdEN3ZCA9IHBhdGguZGlybmFtZSh0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpcik7XG4gICAgY29uc3QgZ2l0ID0gWydnaXQnLCAnLUMnLCBnaXRDd2RdO1xuICAgIGNvbnN0IHJlbGF0aXZlU25hcHNob3REaXIgPSBwYXRoLnJlbGF0aXZlKGdpdEN3ZCwgdGhpcy5oZWxwZXIuZ29sZGVuU25hcHNob3REaXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWMoWy4uLmdpdCwgJ2NoZWNrb3V0JywgcmVmLCAnLS0nLCByZWxhdGl2ZVNuYXBzaG90RGlyXSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgU25hcHNob3QgZG9lcyBub3QgZXhpc3QgYXQgdGFnICcke3JlZn0nLiBgICtcbiAgICAgICAgYFBhdGg6ICR7cmVsYXRpdmVTbmFwc2hvdERpcn1cXG5gICtcbiAgICAgICAgYFVuZGVybHlpbmcgZXJyb3I6ICR7Zm9ybWF0RXJyb3IoZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSB0aGUgc25hcHNob3QgZnJvbSBlYWNoIGdpdCB0YWcgaW4gc2VxdWVuY2UsIHRoZW4gbGV0IHRoZSBjYWxsZXJcbiAgICogZGVwbG95IHRoZSBjdXJyZW50IGNvZGUgYXMgdGhlIGZpbmFsIHVwZGF0ZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95RnJvbVRhZ3MoXG4gICAgZGVwbG95QXJnczogY2RrLkRlcGxveU9wdGlvbnMsXG4gICAgdGVzdENhc2VOYW1lOiBzdHJpbmcsXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWxsb3dEZWxldGVGYWlsdXJlczogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdG90YWxUYWdzID0gdGFncy5sZW5ndGg7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsVGFnczsgaSsrKSB7XG4gICAgICBjb25zdCB0YWcgPSB0YWdzW2ldO1xuICAgICAgbG9nZ2VyLmhpZ2hsaWdodChgJHt0aGlzLmhlbHBlci50ZXN0TmFtZX0vJHt0ZXN0Q2FzZU5hbWV9OiBkZXBsb3lpbmcgdGFnICR7dGFnfSAoJHtpICsgMX0vJHt0b3RhbFRhZ3N9KWApO1xuXG4gICAgICB0aGlzLmNoZWNrb3V0U25hcHNob3RBdFJlZih0YWcpO1xuXG4gICAgICBjb25zdCBleHBlY3RlZFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuaGVscGVyLmV4cGVjdGVkVGVzdFN1aXRlKCk7XG4gICAgICBpZiAoIWV4cGVjdGVkVGVzdFN1aXRlIHx8ICEodGVzdENhc2VOYW1lIGluIGV4cGVjdGVkVGVzdFN1aXRlLnRlc3RTdWl0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZXN0IGNhc2UgJyR7dGVzdENhc2VOYW1lfScgZG9lcyBub3QgZXhpc3QgaW4gc25hcHNob3QgYXQgdGFnICcke3RhZ30nYCxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhwZWN0ZWRUZXN0Q2FzZSA9IGV4cGVjdGVkVGVzdFN1aXRlLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgICAgY29uc3QgZGVwbG95UmVzdWx0ID0gYXdhaXQgdGhpcy5oZWxwZXIuY2RrLmRlcGxveSh7XG4gICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgIHN0YWNrczogZXhwZWN0ZWRUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgIC4uLmV4cGVjdGVkVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3MsXG4gICAgICAgIGNvbnRleHQ6IHRoaXMuaGVscGVyLmdldENvbnRleHQoZXhwZWN0ZWRUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICAgIGFwcDogcGF0aC5yZWxhdGl2ZSh0aGlzLmhlbHBlci5kaXJlY3RvcnksIHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyKSxcbiAgICAgICAgbG9va3VwczogZXhwZWN0ZWRUZXN0U3VpdGU/LmVuYWJsZUxvb2t1cHMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBkZXBsb3lSZXN1bHQuZGVsZXRlRmFpbHVyZXNcbiAgICAgICAgICAubWFwKGYgPT4gYCAgLSAke2YubG9naWNhbFJlc291cmNlSWR9ICgke2YucmVzb3VyY2VUeXBlfSk6ICR7Zi5yZWFzb259YClcbiAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGBVcGRhdGUgZnJvbSB0YWcgJyR7dGFnfSc6ICR7ZGVwbG95UmVzdWx0LmRlbGV0ZUZhaWx1cmVzLmxlbmd0aH0gcmVzb3VyY2UocykgZmFpbGVkIHRvIGRlbGV0ZTpcXG4ke2RldGFpbHN9YDtcbiAgICAgICAgaWYgKGFsbG93RGVsZXRlRmFpbHVyZXMpIHtcbiAgICAgICAgICBsb2dnZXIud2FybmluZyhtZXNzYWdlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIuaGlnaGxpZ2h0KGAke3RoaXMuaGVscGVyLnRlc3ROYW1lfS8ke3Rlc3RDYXNlTmFtZX06IGRlcGxveWluZyBjdXJyZW50IGJyYW5jaCAoZmluYWwpYCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBydW5uaW5nIGludGVncmF0aW9uIHRlc3RzIHdpdGggdGhlIHVwZGF0ZSBwYXRoIHdvcmtmbG93XG4gICAqIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoZSBzbmFwc2hvdCB0aGF0IGlzIGRlcGxveWVkIGlzIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAqIGZyb20gdGhlIHVwc3RyZWFtIGJyYW5jaC4gSW4gb3JkZXIgdG8gZ3VhcmFudGVlIHRoYXQsIGZpcnN0IGNoZWNrb3V0IHRoZSBsYXRlc3RcbiAgICogKHRvIHRoZSB1c2VyKSBzbmFwc2hvdCBmcm9tIHVwc3RyZWFtXG4gICAqXG4gICAqIEl0IGlzIG5vdCBzdHJhaWdodGZvcndhcmQgdG8gZmlndXJlIG91dCB3aGF0IGJyYW5jaCB0aGUgY3VycmVudFxuICAgKiB3b3JraW5nIGJyYW5jaCB3YXMgY3JlYXRlZCBmcm9tLiBUaGlzIGlzIGEgYmVzdCBlZmZvcnQgYXR0ZW1wdCB0byBkbyBzby5cbiAgICogVGhpcyBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgYW4gJ29yaWdpbicuIGBnaXQgcmVtb3RlIHNob3cgb3JpZ2luYCByZXR1cm5zIGEgbGlzdCBvZlxuICAgKiBhbGwgYnJhbmNoZXMgYW5kIHdlIHRoZW4gc2VhcmNoIGZvciBvbmUgdGhhdCBzdGFydHMgd2l0aCBgSEVBRCBicmFuY2g6IGBcbiAgICovXG4gIHByaXZhdGUgY2hlY2tvdXRTbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAvLyBXZSB1c2UgdGhlIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIHRoZSBzbmFwc2hvdCB0byBydW4gZ2l0IGNvbW1hbmRzIGluXG4gICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSBjd2QgZm9yIGV4ZWN1dGluZyBnaXQsIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgLUMgZmxhZ1xuICAgIC8vIEBzZWUgaHR0cHM6Ly9naXQtc2NtLmNvbS9kb2NzL2dpdCNEb2N1bWVudGF0aW9uL2dpdC50eHQtLUNsdHBhdGhndFxuICAgIC8vIFRoaXMgd2F5IHdlIGFyZSBndWFyYW50ZWVkIHRvIG9wZXJhdGUgdW5kZXIgdGhlIGNvcnJlY3QgZ2l0IHJlcG8sIGV2ZW5cbiAgICAvLyB3aGVuIGV4ZWN1dGluZyBpbnRlZy1ydW5uZXIgZnJvbSBvdXRzaWRlIHRoZSByZXBvIHVuZGVyIHRlc3QuXG4gICAgY29uc3QgZ2l0Q3dkID0gcGF0aC5kaXJuYW1lKHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyKTtcbiAgICBjb25zdCBnaXQgPSBbJ2dpdCcsICctQycsIGdpdEN3ZF07XG5cbiAgICAvLyBodHRwczovL2dpdC1zY20uY29tL2RvY3MvZ2l0LW1lcmdlLWJhc2VcbiAgICBsZXQgYmFzZUJyYW5jaDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIC8vIHRyeSB0byBmaW5kIHRoZSBiYXNlIGJyYW5jaCB0aGF0IHRoZSB3b3JraW5nIGJyYW5jaCB3YXMgY3JlYXRlZCBmcm9tXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9yaWdpbjogc3RyaW5nID0gZXhlYyhbLi4uZ2l0LCAncmVtb3RlJywgJ3Nob3cnLCAnb3JpZ2luJ10pO1xuICAgICAgY29uc3Qgb3JpZ2luTGluZXMgPSBvcmlnaW4uc3BsaXQoJ1xcbicpO1xuICAgICAgZm9yIChjb25zdCBsaW5lIG9mIG9yaWdpbkxpbmVzKSB7XG4gICAgICAgIGlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdIRUFEIGJyYW5jaDogJykpIHtcbiAgICAgICAgICBiYXNlQnJhbmNoID0gbGluZS50cmltKCkuc3BsaXQoJ0hFQUQgYnJhbmNoOiAnKVsxXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dlci53YXJuaW5nKCclc1xcbiVzJyxcbiAgICAgICAgJ0NvdWxkIG5vdCBkZXRlcm1pbmUgZ2l0IG9yaWdpbiBicmFuY2guJyxcbiAgICAgICAgYFlvdSBuZWVkIHRvIG1hbnVhbGx5IGNoZWNrb3V0IHRoZSBzbmFwc2hvdCBkaXJlY3RvcnkgJHt0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpcn1gICtcbiAgICAgICAgJ2Zyb20gdGhlIG1lcmdlLWJhc2UgKGh0dHBzOi8vZ2l0LXNjbS5jb20vZG9jcy9naXQtbWVyZ2UtYmFzZSknLFxuICAgICAgKTtcbiAgICAgIGxvZ2dlci53YXJuaW5nKCdlcnJvcjogJXMnLCBmb3JtYXRFcnJvcihlKSk7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgZm91bmQgdGhlIGJhc2UgYnJhbmNoIHRoZW4gZ2V0IHRoZSBtZXJnZS1iYXNlIChtb3N0IHJlY2VudCBjb21tb24gY29tbWl0KVxuICAgIC8vIGFuZCBjaGVja291dCB0aGUgc25hcHNob3QgdXNpbmcgdGhhdCBjb21taXRcbiAgICBpZiAoYmFzZUJyYW5jaCkge1xuICAgICAgY29uc3QgcmVsYXRpdmVTbmFwc2hvdERpciA9IHBhdGgucmVsYXRpdmUoZ2l0Q3dkLCB0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpcik7XG5cbiAgICAgIGNvbnN0IGNoZWNrb3V0Q29tbWFuZCA9IFsuLi5naXQsICdjaGVja291dCcsIFsuLi5naXQsICdtZXJnZS1iYXNlJywgJ0hFQUQnLCBiYXNlQnJhbmNoXSwgJy0tJywgcmVsYXRpdmVTbmFwc2hvdERpcl07XG4gICAgICB0cnkge1xuICAgICAgICBleGVjV2l0aFN1YlNoZWxsKGNoZWNrb3V0Q29tbWFuZCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci53YXJuaW5nKCclc1xcbiVzJyxcbiAgICAgICAgICBgQ291bGQgbm90IGNoZWNrb3V0IHNuYXBzaG90IGRpcmVjdG9yeSAnJHt0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpcn0nLiBQbGVhc2UgdmVyaWZ5IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjb21wbGV0ZXMgY29ycmVjdGx5OmAsXG4gICAgICAgICAgcmVuZGVyQ29tbWFuZChjaGVja291dENvbW1hbmQpLFxuICAgICAgICAgICcnLFxuICAgICAgICApO1xuICAgICAgICBsb2dnZXIud2FybmluZygnZXJyb3I6ICVzJywgZm9ybWF0RXJyb3IoZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGNkayBkZXBsb3kgLS13YXRjaCBmb3IgYW4gaW50ZWdyYXRpb24gdGVzdFxuICAgKlxuICAgKiBUaGlzIGlzIG1lYW50IHRvIGJlIHJ1biBvbiBhIHNpbmdsZSB0ZXN0IGFuZCB3aWxsIG5vdCBjcmVhdGUgYSBzbmFwc2hvdFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHdhdGNoSW50ZWdUZXN0KG9wdGlvbnM6IFdhdGNoT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSBhY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlW29wdGlvbnMudGVzdENhc2VOYW1lXTtcbiAgICBpZiAoIWFjdHVhbFRlc3RDYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERpZCBub3QgZmluZCB0ZXN0IGNhc2UgbmFtZSAnJHtvcHRpb25zLnRlc3RDYXNlTmFtZX0nIGluICcke09iamVjdC5rZXlzKGFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGUpfSdgKTtcbiAgICB9XG4gICAgY29uc3QgZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwgPSAobmVlZGVkID0gMSkgPT4ge1xuICAgICAgY29uc3QgdmVyYm9zaXR5ID0gb3B0aW9ucy52ZXJib3NpdHkgPz8gMDtcbiAgICAgIHJldHVybiAodmVyYm9zaXR5ID49IG5lZWRlZCkgPyB0cnVlIDogdW5kZWZpbmVkO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMud2F0Y2goXG4gICAgICAgIHtcbiAgICAgICAgICAuLi50aGlzLmhlbHBlci5kZWZhdWx0QXJncyxcbiAgICAgICAgICBkZXBsb3ltZW50TWV0aG9kOiB7XG4gICAgICAgICAgICBtZXRob2Q6ICdob3Rzd2FwJyxcbiAgICAgICAgICAgIGZhbGxiYWNrOiB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ2NoYW5nZS1zZXQnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2ZpbGU6IHRoaXMuaGVscGVyLnByb2ZpbGUsXG4gICAgICAgICAgcmVxdWlyZUFwcHJvdmFsOiBSZXF1aXJlQXBwcm92YWwuTkVWRVIsXG4gICAgICAgICAgdHJhY2VMb2dzOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCgyKSA/PyBmYWxzZSxcbiAgICAgICAgICB2ZXJib3NlOiBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCgzKSxcbiAgICAgICAgICBkZWJ1ZzogZW5hYmxlRm9yVmVyYm9zaXR5TGV2ZWwoNCksXG4gICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICB9LFxuICAgICAgICBvcHRpb25zLnRlc3RDYXNlTmFtZSxcbiAgICAgICAgb3B0aW9ucy52ZXJib3NpdHkgPz8gMCxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3JjaGVzdHJhdGVzIHJ1bm5pbmcgaW50ZWdyYXRpb24gdGVzdHMuIEN1cnJlbnRseSB0aGlzIGluY2x1ZGVzXG4gICAqXG4gICAqIDEuIChpZiB1cGRhdGUgd29ya2Zsb3cgaXMgZW5hYmxlZCkgRGVwbG95aW5nIHRoZSBzbmFwc2hvdCB0ZXN0IHN0YWNrc1xuICAgKiAyLiBEZXBsb3lpbmcgdGhlIGludGVncmF0aW9uIHRlc3Qgc3RhY2tzXG4gICAqIDIuIFNhdmluZyB0aGUgc25hcHNob3QgKGlmIHN1Y2Nlc3NmdWwpXG4gICAqIDMuIERlc3Ryb3lpbmcgdGhlIGludGVncmF0aW9uIHRlc3Qgc3RhY2tzIChpZiBjbGVhbj1mYWxzZSlcbiAgICpcbiAgICogVGhlIHVwZGF0ZSB3b3JrZmxvdyBleGlzdHMgdG8gY2hlY2sgZm9yIGNhc2VzIHdoZXJlIGEgY2hhbmdlIHdvdWxkIGNhdXNlXG4gICAqIGEgZmFpbHVyZSB0byBhbiBleGlzdGluZyBzdGFjaywgYnV0IG5vdCBmb3IgYSBuZXdseSBjcmVhdGVkIHN0YWNrLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJ1bkludGVnVGVzdENhc2Uob3B0aW9uczogUnVuT3B0aW9ucyk6IFByb21pc2U8QXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZD4ge1xuICAgIGxldCBhc3NlcnRpb25SZXN1bHRzOiBBc3NlcnRpb25SZXN1bHRzIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGFjdHVhbFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCk7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSBhY3R1YWxUZXN0U3VpdGUudGVzdFN1aXRlW29wdGlvbnMudGVzdENhc2VOYW1lXTtcbiAgICBpZiAoIWFjdHVhbFRlc3RDYXNlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYERpZCBub3QgZmluZCB0ZXN0IGNhc2UgbmFtZSAnJHtvcHRpb25zLnRlc3RDYXNlTmFtZX0nIGluICcke09iamVjdC5rZXlzKGFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGUpfSdgKTtcbiAgICB9XG5cbiAgICAvLyBJZGVhbGx5IHdlIHdvdWxkIGZvcmNlIGBlbmFibGVMb29rdXBzYCB0byBgdHJ1ZWAsIGFsd2F5cywgYmVjYXVzZSB0aGF0J3Mgd2hhdCB3ZSB3b3VsZCBsaWtlIHRvIGNvbnZlcmdlIG9uIGZvciB0aGUgc25hcHNob3RzLlxuICAgIC8vXG4gICAgLy8gSE9XRVZFUiFcbiAgICAvL1xuICAgIC8vIEluIG9yZGVyIHRvIGRvIHRoYXQsIHRvIHZhbGlkYXRlIHRoZSBzbmFwc2hvdCBjb3JyZWN0bHkgd2UgbmVlZCB0byBtYXRjaCB3aGF0J3MgaW4gYGludGVnLmpzb25gLiBJbiBvcmRlciB0byByYXRjaGV0XG4gICAgLy8gdGhhdCB2YWx1ZSB0byBgdHJ1ZWAsIHdlIHdvdWxkIG5lZWQgdG8gcmV3cml0ZSBgaW50ZWcuanNvbmAgdG8gaGF2ZSBgZW5hYmxlTG9va3VwczogdHJ1ZWAuIFdlIGRvbid0IGN1cnJlbnRseVxuICAgIC8vIGhhdmUgY29kZSB0byByZWxpYWJseSByZXdyaXRlIHRoYXQgZmlsZSwgc28gd2UganVzdCBsZWF2ZSB0aGUgdmFsdWUgYXQgd2hhdGV2ZXIgdGhlIHRlc3QgcmVxdWVzdGVkLlxuICAgIHRoaXMuaGVscGVyLmNvbmZpZ3VyZUxlZ2FjeUVuYWJsZUxvb2t1cHMoYWN0dWFsVGVzdFN1aXRlLmVuYWJsZUxvb2t1cHMgPz8gZmFsc2UpO1xuXG4gICAgY29uc3QgY2xlYW4gPSBvcHRpb25zLmNsZWFuID8/IHRydWU7XG4gICAgY29uc3QgdXBkYXRlV29ya2Zsb3dFbmFibGVkID0gKG9wdGlvbnMudXBkYXRlV29ya2Zsb3cgPz8gdHJ1ZSlcbiAgICAgICYmIChhY3R1YWxUZXN0Q2FzZS5zdGFja1VwZGF0ZVdvcmtmbG93ID8/IHRydWUpO1xuICAgIGNvbnN0IGFsbG93RGVsZXRlRmFpbHVyZXMgPSBhY3R1YWxUZXN0Q2FzZS5hbGxvd0RlbGV0ZUZhaWx1cmVzID8/IG9wdGlvbnMuYWxsb3dEZWxldGVGYWlsdXJlcyA/PyBmYWxzZTtcbiAgICBjb25zdCBlbmFibGVGb3JWZXJib3NpdHlMZXZlbCA9IChuZWVkZWQgPSAxKSA9PiB7XG4gICAgICBjb25zdCB2ZXJib3NpdHkgPSBvcHRpb25zLnZlcmJvc2l0eSA/PyAwO1xuICAgICAgcmV0dXJuICh2ZXJib3NpdHkgPj0gbmVlZGVkKSA/IHRydWUgOiB1bmRlZmluZWQ7XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuICYmIChhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5lbmFibGVkID8/IHRydWUpKSB7XG4gICAgICAgIGFzc2VydGlvblJlc3VsdHMgPSBhd2FpdCB0aGlzLmRlcGxveShcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi50aGlzLmhlbHBlci5kZWZhdWx0QXJncyxcbiAgICAgICAgICAgIHByb2ZpbGU6IHRoaXMuaGVscGVyLnByb2ZpbGUsXG4gICAgICAgICAgICByZXF1aXJlQXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbC5ORVZFUixcbiAgICAgICAgICAgIHZlcmJvc2U6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDMpLFxuICAgICAgICAgICAgZGVidWc6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDQpLFxuICAgICAgICAgICAgcm9sZUFybjogb3B0aW9ucy5yb2xlQXJuLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXBkYXRlV29ya2Zsb3dFbmFibGVkLFxuICAgICAgICAgIG9wdGlvbnMudGVzdENhc2VOYW1lLFxuICAgICAgICAgIGFsbG93RGVsZXRlRmFpbHVyZXMsXG4gICAgICAgICAgb3B0aW9ucy51cGRhdGVGcm9tVGFncyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSBjcmVhdGUgdGhlIHNuYXBzaG90IGlmIHRoZXJlIGFyZSBubyBmYWlsZWQgYXNzZXJ0aW9uIHJlc3VsdHNcbiAgICAgIC8vIChpLmUuIG5vIGZhaWx1cmVzKVxuICAgICAgaWYgKCFPYmplY3QudmFsdWVzKGFzc2VydGlvblJlc3VsdHMgPz8ge30pLnNvbWUocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdmYWlsJykpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oZWxwZXIuY3JlYXRlU25hcHNob3QoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoIW9wdGlvbnMuZHJ5UnVuKSB7XG4gICAgICAgIGlmIChjbGVhbiAmJiAoYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmVuYWJsZWQgPz8gdHJ1ZSkpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmRlc3Ryb3kob3B0aW9ucy50ZXN0Q2FzZU5hbWUsIHtcbiAgICAgICAgICAgIC4uLnRoaXMuaGVscGVyLmRlZmF1bHRBcmdzLFxuICAgICAgICAgICAgcHJvZmlsZTogdGhpcy5oZWxwZXIucHJvZmlsZSxcbiAgICAgICAgICAgIGFsbDogdHJ1ZSxcbiAgICAgICAgICAgIGZvcmNlOiB0cnVlLFxuICAgICAgICAgICAgYXBwOiB0aGlzLmhlbHBlci5jZGtBcHAsXG4gICAgICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5oZWxwZXIuZGlyZWN0b3J5LCB0aGlzLmhlbHBlci5jZGtPdXREaXIpLFxuICAgICAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuY2RrQ29tbWFuZE9wdGlvbnM/LmRlc3Ryb3k/LmFyZ3MsXG4gICAgICAgICAgICBjb250ZXh0OiB0aGlzLmhlbHBlci5nZXRDb250ZXh0KGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgICAgIHJvbGVBcm46IG9wdGlvbnMucm9sZUFybiA/PyBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uYXJncz8ucm9sZUFybixcbiAgICAgICAgICAgIHZlcmJvc2U6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDMpLFxuICAgICAgICAgICAgZGVidWc6IGVuYWJsZUZvclZlcmJvc2l0eUxldmVsKDQpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmhlbHBlci5jbGVhbnVwKCk7XG4gICAgfVxuICAgIHJldHVybiBhc3NlcnRpb25SZXN1bHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gYSBpbnRlZyB0ZXN0IGNhc2Ugc3RhY2sgZGVzdHJ1Y3Rpb25cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVzdHJveSh0ZXN0Q2FzZU5hbWU6IHN0cmluZywgZGVzdHJveUFyZ3M6IERlc3Ryb3lPcHRpb25zKSB7XG4gICAgY29uc3QgYWN0dWFsVGVzdENhc2UgPSAoYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKSkudGVzdFN1aXRlW3Rlc3RDYXNlTmFtZV07XG4gICAgdHJ5IHtcbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucHJlRGVzdHJveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXN0cm95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5oZWxwZXIuY2RrLmRlc3Ryb3koe1xuICAgICAgICAuLi5kZXN0cm95QXJncyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnBvc3REZXN0cm95KSB7XG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmhvb2tzLnBvc3REZXN0cm95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgICBleGVjKGNodW5rcyhjbWQpLCB7XG4gICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpciksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMucGFyc2VFcnJvcihlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVzdHJveT8uZXhwZWN0RXJyb3IgPz8gZmFsc2UsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXN0cm95Py5leHBlY3RlZE1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgd2F0Y2gob3B0aW9uczogY2RrLldhdGNoT3B0aW9ucywgdGVzdENhc2VOYW1lOiBzdHJpbmcsIHZlcmJvc2l0eTogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYWN0dWFsVGVzdFN1aXRlID0gYXdhaXQgdGhpcy5hY3R1YWxUZXN0U3VpdGUoKTtcbiAgICBjb25zdCBhY3R1YWxUZXN0Q2FzZSA9IGFjdHVhbFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlcGxveSkge1xuICAgICAgYWN0dWFsVGVzdENhc2UuaG9va3MucHJlRGVwbG95LmZvckVhY2goY21kID0+IHtcbiAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyKSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgY29uc3Qgd2F0Y2hBcmdzID0ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGxvb2t1cHM6IGFjdHVhbFRlc3RTdWl0ZS5lbmFibGVMb29rdXBzLFxuICAgICAgc3RhY2tzOiBbXG4gICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlLnN0YWNrcyxcbiAgICAgICAgLi4uYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2sgPyBbYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2tdIDogW10sXG4gICAgICBdLFxuICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuaGVscGVyLmRpcmVjdG9yeSwgdGhpcy5oZWxwZXIuY2RrT3V0RGlyKSxcbiAgICAgIG91dHB1dHNGaWxlOiBwYXRoLnJlbGF0aXZlKHRoaXMuaGVscGVyLmRpcmVjdG9yeSwgcGF0aC5qb2luKHRoaXMuaGVscGVyLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKSksXG4gICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgLi4udGhpcy5oZWxwZXIuZ2V0Q29udGV4dChhY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICB9LFxuICAgICAgYXBwOiB0aGlzLmhlbHBlci5jZGtBcHAsXG4gICAgfTtcbiAgICBjb25zdCBkZXN0cm95TWVzc2FnZSA9IHtcbiAgICAgIGFkZGl0aW9uYWxNZXNzYWdlczogW1xuICAgICAgICAnQWZ0ZXIgeW91IGFyZSBkb25lIHlvdSBtdXN0IG1hbnVhbGx5IGRlc3Ryb3kgdGhlIGRlcGxveWVkIHN0YWNrcycsXG4gICAgICAgIGAgICR7W1xuICAgICAgICAgIC4uLnByb2Nlc3MuZW52LkFXU19SRUdJT04gPyBbYEFXU19SRUdJT049JHtwcm9jZXNzLmVudi5BV1NfUkVHSU9OfWBdIDogW10sXG4gICAgICAgICAgJ2NkayBkZXN0cm95JyxcbiAgICAgICAgICBgLWEgJyR7dGhpcy5oZWxwZXIuY2RrQXBwfSdgLFxuICAgICAgICAgIHdhdGNoQXJncy5zdGFja3Muam9pbignICcpLFxuICAgICAgICAgIGAtLXByb2ZpbGUgJHt3YXRjaEFyZ3MucHJvZmlsZX1gLFxuICAgICAgICBdLmpvaW4oJyAnKX1gLFxuICAgICAgXSxcbiAgICB9O1xuICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdChkZXN0cm95TWVzc2FnZSk7XG4gICAgaWYgKHdhdGNoQXJncy52ZXJib3NlKSB7XG4gICAgICAvLyBpZiBgLXZ2dmAgKG9yIGFib3ZlKSBpcyB1c2VkIHRoZW4gcHJpbnQgb3V0IHRoZSBjb21tYW5kIHRoYXQgd2FzIHVzZWRcbiAgICAgIC8vIHRoaXMgYWxsb3dzIHVzZXJzIHRvIG1hbnVhbGx5IHJ1biB0aGUgY29tbWFuZFxuICAgICAgd29ya2VycG9vbC53b3JrZXJFbWl0KHtcbiAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzOiBbXG4gICAgICAgICAgJ1JlcHJvOicsXG4gICAgICAgICAgYCAgJHtbXG4gICAgICAgICAgICAnY2RrIHN5bnRoJyxcbiAgICAgICAgICAgIGAtYSAnJHt0aGlzLmhlbHBlci5jZGtBcHB9J2AsXG4gICAgICAgICAgICBgLW8gJyR7dGhpcy5oZWxwZXIuY2RrT3V0RGlyfSdgLFxuICAgICAgICAgICAgLi4uT2JqZWN0LmVudHJpZXModGhpcy5oZWxwZXIuZ2V0Q29udGV4dCgpKS5mbGF0TWFwKChbaywgdl0pID0+IHR5cGVvZiB2ICE9PSAnb2JqZWN0JyA/IFtgLWMgJyR7a309JHt2fSdgXSA6IFtdKSxcbiAgICAgICAgICAgIHdhdGNoQXJncy5zdGFja3Muam9pbignICcpLFxuICAgICAgICAgICAgYC0tb3V0cHV0cy1maWxlICR7d2F0Y2hBcmdzLm91dHB1dHNGaWxlfWAsXG4gICAgICAgICAgICBgLS1wcm9maWxlICR7d2F0Y2hBcmdzLnByb2ZpbGV9YCxcbiAgICAgICAgICAgICctLWhvdHN3YXAtZmFsbGJhY2snLFxuICAgICAgICAgIF0uam9pbignICcpfWAsXG4gICAgICAgIF0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBhc3NlcnRpb25SZXN1bHRzID0gcGF0aC5qb2luKHRoaXMuaGVscGVyLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKTtcbiAgICBjb25zdCB3YXRjaGVyID0gY2hva2lkYXIud2F0Y2goW3RoaXMuaGVscGVyLmNka091dERpcl0sIHtcbiAgICAgIGN3ZDogdGhpcy5oZWxwZXIuZGlyZWN0b3J5LFxuICAgIH0pO1xuICAgIHdhdGNoZXIub24oJ2FsbCcsIChldmVudDogRXZlbnROYW1lLCBmaWxlOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghaXNGaWxlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgIHJldHVybjsgLy8gSWdub3JlIG5vbi1maWxlIGV2ZW50cyBsaWtlICdlcnJvcicsICdyYXcnLCAncmVhZHknLCAnYWxsJ1xuICAgICAgfVxuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IGNoYW5nZXMgdG8gdGhlIGBhc3NlcnRpb24tcmVzdWx0cy5qc29uYCBmaWxlLiBJZiB0aGVyZVxuICAgICAgLy8gYXJlIGFzc2VydGlvbnMgdGhlbiB0aGlzIHdpbGwgY2hhbmdlIG9uIGV2ZXJ5IGRlcGxveW1lbnRcbiAgICAgIGlmIChhc3NlcnRpb25SZXN1bHRzLmVuZHNXaXRoKGZpbGUpICYmIChldmVudCA9PT0gJ2FkZCcgfHwgZXZlbnQgPT09ICdjaGFuZ2UnKSkge1xuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5ob29rcz8ucG9zdERlcGxveSkge1xuICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmhvb2tzLnBvc3REZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgICAgZXhlYyhjaHVua3MoY21kKSwge1xuICAgICAgICAgICAgICBjd2Q6IHBhdGguZGlybmFtZSh0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayAmJiBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUpIHtcbiAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLnByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKFxuICAgICAgICAgICAgYXNzZXJ0aW9uUmVzdWx0cyxcbiAgICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrTmFtZSxcbiAgICAgICAgICAgIGFjdHVhbFRlc3RDYXNlLmFzc2VydGlvblN0YWNrLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlcyAmJiBPYmplY3QudmFsdWVzKHJlcykuc29tZShyID0+IHIuc3RhdHVzID09PSAnZmFpbCcpKSB7XG4gICAgICAgICAgICB3b3JrZXJwb29sLndvcmtlckVtaXQoe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uQVNTRVJUSU9OX0ZBSUxFRCxcbiAgICAgICAgICAgICAgdGVzdE5hbWU6IGAke3Rlc3RDYXNlTmFtZX0gKCR7d2F0Y2hBcmdzLnByb2ZpbGV9YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXMpLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdCh7XG4gICAgICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5URVNUX1NVQ0NFU1MsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiBgJHt0ZXN0Q2FzZU5hbWV9YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogcmVzID8gZm9ybWF0QXNzZXJ0aW9uUmVzdWx0cyhyZXMpIDogJ05PIEFTU0VSVElPTlMnLFxuICAgICAgICAgICAgICBkdXJhdGlvbjogKERhdGUubm93KCkgLSBzdGFydCkgLyAxMDAwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVtaXQgdGhlIGRlc3Ryb3kgbWVzc2FnZSBhZnRlciBldmVyeSBydW5cbiAgICAgICAgICAvLyBzbyB0aGF0IGl0J3MgdmlzaWJsZSB0byB0aGUgdXNlclxuICAgICAgICAgIHdvcmtlcnBvb2wud29ya2VyRW1pdChkZXN0cm95TWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgYXN5bmMgKCkgPT4ge1xuICAgICAgICByZXNvbHZlKHt9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwcm9taXNlOiB3YWl0ZXIsIHJlc29sdmUgfSA9IHByb21pc2VXaXRoUmVzb2x2ZXJzPG51bWJlciB8IG51bGw+KCk7XG5cbiAgICBhd2FpdCB0aGlzLmhlbHBlci5jZGsud2F0Y2god2F0Y2hBcmdzLCB7XG4gICAgICAvLyBpZiBgLXZgIChvciBhYm92ZSkgaXMgcGFzc2VkIHRoZW4gc3RyZWFtIHRoZSBsb2dzXG4gICAgICBvblN0ZG91dDogKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKHZlcmJvc2l0eSA+IDApIHtcbiAgICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8vIGlmIGAtdmAgKG9yIGFib3ZlKSBpcyBwYXNzZWQgdGhlbiBzdHJlYW0gdGhlIGxvZ3NcbiAgICAgIG9uU3RkZXJyOiAobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAodmVyYm9zaXR5ID4gMCkge1xuICAgICAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25DbG9zZTogYXN5bmMgKGNvZGUpID0+IHtcbiAgICAgICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dhdGNoIGV4aXRlZCB3aXRoIGVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgd2F0Y2hlci5jbG9zZSgpO1xuICAgICAgICByZXNvbHZlKGNvZGUpO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHdhaXRlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGEgaW50ZWcgdGVzdCBjYXNlIGRlcGxveW1lbnQsIGluY2x1ZGluZ1xuICAgKiBwZXJmb3JtaW5nIHRoZSB1cGRhdGUgd29ya2Zsb3dcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGVwbG95KFxuICAgIGRlcGxveUFyZ3M6IGNkay5EZXBsb3lPcHRpb25zLFxuICAgIHVwZGF0ZVdvcmtmbG93RW5hYmxlZDogYm9vbGVhbixcbiAgICB0ZXN0Q2FzZU5hbWU6IHN0cmluZyxcbiAgICBhbGxvd0RlbGV0ZUZhaWx1cmVzOiBib29sZWFuLFxuICAgIHVwZGF0ZUZyb21UYWdzPzogc3RyaW5nW10sXG4gICk6IFByb21pc2U8QXNzZXJ0aW9uUmVzdWx0cyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IGFjdHVhbFRlc3RDYXNlID0gKGF3YWl0IHRoaXMuYWN0dWFsVGVzdFN1aXRlKCkpLnRlc3RTdWl0ZVt0ZXN0Q2FzZU5hbWVdO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYWN0dWFsVGVzdENhc2UuaG9va3M/LnByZURlcGxveSkge1xuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5ob29rcy5wcmVEZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh1cGRhdGVGcm9tVGFncyAmJiB1cGRhdGVGcm9tVGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRhZy1zZXF1ZW5jZSB1cGRhdGUgd29ya2Zsb3c6IGRlcGxveSBlYWNoIHRhZydzIHNuYXBzaG90IGluIG9yZGVyXG4gICAgICAgIGF3YWl0IHRoaXMuZGVwbG95RnJvbVRhZ3MoZGVwbG95QXJncywgdGVzdENhc2VOYW1lLCB1cGRhdGVGcm9tVGFncywgYWxsb3dEZWxldGVGYWlsdXJlcyk7XG4gICAgICB9IGVsc2UgaWYgKHVwZGF0ZVdvcmtmbG93RW5hYmxlZCAmJiB0aGlzLmhlbHBlci5oYXNTbmFwc2hvdCgpKSB7XG4gICAgICAgIC8vIE5vcm1hbCBtZXJnZS1iYXNlIHVwZGF0ZSB3b3JrZmxvd1xuICAgICAgICBjb25zdCBleHBlY3RlZFRlc3RTdWl0ZSA9IGF3YWl0IHRoaXMuaGVscGVyLmV4cGVjdGVkVGVzdFN1aXRlKCk7XG4gICAgICAgIGlmIChleHBlY3RlZFRlc3RTdWl0ZSAmJiB0ZXN0Q2FzZU5hbWUgaW4gZXhwZWN0ZWRUZXN0U3VpdGU/LnRlc3RTdWl0ZSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tvdXRTbmFwc2hvdCgpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkVGVzdENhc2UgPSBleHBlY3RlZFRlc3RTdWl0ZS50ZXN0U3VpdGVbdGVzdENhc2VOYW1lXTtcbiAgICAgICAgICBhd2FpdCB0aGlzLmhlbHBlci5jZGsuZGVwbG95KHtcbiAgICAgICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgICAgICBzdGFja3M6IGV4cGVjdGVkVGVzdENhc2Uuc3RhY2tzLFxuICAgICAgICAgICAgLi4uZXhwZWN0ZWRUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRoaXMuaGVscGVyLmdldENvbnRleHQoZXhwZWN0ZWRUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncz8uY29udGV4dCksXG4gICAgICAgICAgICBhcHA6IHBhdGgucmVsYXRpdmUodGhpcy5oZWxwZXIuZGlyZWN0b3J5LCB0aGlzLmhlbHBlci5nb2xkZW5TbmFwc2hvdERpciksXG4gICAgICAgICAgICBsb29rdXBzOiBleHBlY3RlZFRlc3RTdWl0ZT8uZW5hYmxlTG9va3VwcyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gbm93IGRlcGxveSB0aGUgXCJhY3R1YWxcIiB0ZXN0LlxuICAgICAgLy8gVGhpcyBpcyB0aGUgc3RhY2sgdXBkYXRlIGlmIHRoZSB1cGRhdGUgd29ya2Zsb3cgcmFuIGFib3ZlLlxuICAgICAgY29uc3QgYWN0dWFsRGVwbG95UmVzdWx0ID0gYXdhaXQgdGhpcy5oZWxwZXIuY2RrLmRlcGxveSh7XG4gICAgICAgIC4uLmRlcGxveUFyZ3MsXG4gICAgICAgIGxvb2t1cHM6IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5lbmFibGVMb29rdXBzLFxuICAgICAgICBzdGFja3M6IFtcbiAgICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZS5zdGFja3MsXG4gICAgICAgIF0sXG4gICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmhlbHBlci5kaXJlY3RvcnksIHRoaXMuaGVscGVyLmNka091dERpciksXG4gICAgICAgIC4uLmFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmhlbHBlci5nZXRDb250ZXh0KGFjdHVhbFRlc3RDYXNlPy5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5hcmdzPy5jb250ZXh0KSxcbiAgICAgICAgYXBwOiB0aGlzLmhlbHBlci5jZGtBcHAsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGFjdHVhbERlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHMgPSBhY3R1YWxEZXBsb3lSZXN1bHQuZGVsZXRlRmFpbHVyZXNcbiAgICAgICAgICAubWFwKGYgPT4gYCAgLSAke2YubG9naWNhbFJlc291cmNlSWR9ICgke2YucmVzb3VyY2VUeXBlfSk6ICR7Zi5yZWFzb259YClcbiAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPVxuICAgICAgICAgIGAke2FjdHVhbERlcGxveVJlc3VsdC5kZWxldGVGYWlsdXJlcy5sZW5ndGh9IHJlc291cmNlKHMpIGZhaWxlZCB0byBkZWxldGUgZHVyaW5nIHN0YWNrIHVwZGF0ZTpcXG4ke2RldGFpbHN9XFxuYCArXG4gICAgICAgICAgJ1RoZXNlIHJlc291cmNlcyBhcmUgbm8gbG9uZ2VyIG1hbmFnZWQgYnkgQ2xvdWRGb3JtYXRpb24gYnV0IHN0aWxsIGV4aXN0IGFuZCBtYXkgaW5jdXIgY2hhcmdlcy4nO1xuICAgICAgICBpZiAoYWxsb3dEZWxldGVGYWlsdXJlcykge1xuICAgICAgICAgIGxvZ2dlci53YXJuaW5nKG1lc3NhZ2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IGFzc2VydGlvbnNcbiAgICAgIC8vIGRlcGxveSB0aGUgYXNzZXJ0aW9uIHN0YWNrIGFzIHdlbGxcbiAgICAgIC8vIFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgYWJvdmUgZGVwbG95bWVudCBiZWNhdXNlIHdlIHdhbnQgdG9cbiAgICAgIC8vIHNldCBgcm9sbGJhY2s6IGZhbHNlYC4gVGhpcyBhbGxvd3MgdGhlIGFzc2VydGlvbiBzdGFjayB0byBkZXBsb3kgYWxsIHRoZVxuICAgICAgLy8gYXNzZXJ0aW9ucyBpbnN0ZWFkIG9mIGZhaWxpbmcgYXQgdGhlIGZpcnN0IGZhaWxlZCBhc3NlcnRpb25cbiAgICAgIC8vIGNvbWJpbmluZyBpdCB3aXRoIHRoZSBhYm92ZSBkZXBsb3ltZW50IHdvdWxkIHByZXZlbnQgYW55IHJlcGxhY2VtZW50IHVwZGF0ZXNcbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjaykge1xuICAgICAgICBhd2FpdCB0aGlzLmhlbHBlci5jZGsuZGVwbG95KHtcbiAgICAgICAgICAuLi5kZXBsb3lBcmdzLFxuICAgICAgICAgIGxvb2t1cHM6IChhd2FpdCB0aGlzLmFjdHVhbFRlc3RTdWl0ZSgpKS5lbmFibGVMb29rdXBzLFxuICAgICAgICAgIHN0YWNrczogW1xuICAgICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2ssXG4gICAgICAgICAgXSxcbiAgICAgICAgICByb2xsYmFjazogZmFsc2UsXG4gICAgICAgICAgb3V0cHV0OiBwYXRoLnJlbGF0aXZlKHRoaXMuaGVscGVyLmRpcmVjdG9yeSwgdGhpcy5oZWxwZXIuY2RrT3V0RGlyKSxcbiAgICAgICAgICAuLi5hY3R1YWxUZXN0Q2FzZT8uY2RrQ29tbWFuZE9wdGlvbnM/LmRlcGxveT8uYXJncyxcbiAgICAgICAgICBvdXRwdXRzRmlsZTogcGF0aC5yZWxhdGl2ZSh0aGlzLmhlbHBlci5kaXJlY3RvcnksIHBhdGguam9pbih0aGlzLmhlbHBlci5jZGtPdXREaXIsICdhc3NlcnRpb24tcmVzdWx0cy5qc29uJykpLFxuICAgICAgICAgIGNvbnRleHQ6IHRoaXMuaGVscGVyLmdldENvbnRleHQoYWN0dWFsVGVzdENhc2U/LmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmFyZ3M/LmNvbnRleHQpLFxuICAgICAgICAgIGFwcDogdGhpcy5oZWxwZXIuY2RrQXBwLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGFjdHVhbFRlc3RDYXNlLmhvb2tzPy5wb3N0RGVwbG95KSB7XG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmhvb2tzLnBvc3REZXBsb3kuZm9yRWFjaChjbWQgPT4ge1xuICAgICAgICAgIGV4ZWMoY2h1bmtzKGNtZCksIHtcbiAgICAgICAgICAgIGN3ZDogcGF0aC5kaXJuYW1lKHRoaXMuaGVscGVyLmdvbGRlblNuYXBzaG90RGlyKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFjayAmJiBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc0Fzc2VydGlvblJlc3VsdHMoXG4gICAgICAgICAgcGF0aC5qb2luKHRoaXMuaGVscGVyLmNka091dERpciwgJ2Fzc2VydGlvbi1yZXN1bHRzLmpzb24nKSxcbiAgICAgICAgICBhY3R1YWxUZXN0Q2FzZS5hc3NlcnRpb25TdGFja05hbWUsXG4gICAgICAgICAgYWN0dWFsVGVzdENhc2UuYXNzZXJ0aW9uU3RhY2ssXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5wYXJzZUVycm9yKGUsXG4gICAgICAgIGFjdHVhbFRlc3RDYXNlLmNka0NvbW1hbmRPcHRpb25zPy5kZXBsb3k/LmV4cGVjdEVycm9yID8/IGZhbHNlLFxuICAgICAgICBhY3R1YWxUZXN0Q2FzZS5jZGtDb21tYW5kT3B0aW9ucz8uZGVwbG95Py5leHBlY3RlZE1lc3NhZ2UsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogUHJvY2VzcyB0aGUgb3V0cHV0c0ZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGFzc2VydGlvbnMgcmVzdWx0cyBhcyBzdGFja1xuICAgKiBvdXRwdXRzXG4gICAqL1xuICBwcml2YXRlIHByb2Nlc3NBc3NlcnRpb25SZXN1bHRzKGZpbGU6IHN0cmluZywgYXNzZXJ0aW9uU3RhY2tOYW1lOiBzdHJpbmcsIGFzc2VydGlvblN0YWNrSWQ6IHN0cmluZyk6IEFzc2VydGlvblJlc3VsdHMgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMgPSB7fTtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3Qgb3V0cHV0czogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IH0gPSBmcy5yZWFkSlNPTlN5bmMoZmlsZSk7XG5cbiAgICAgICAgaWYgKGFzc2VydGlvblN0YWNrTmFtZSBpbiBvdXRwdXRzKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbYXNzZXJ0aW9uSWQsIHJlc3VsdF0gb2YgT2JqZWN0LmVudHJpZXMob3V0cHV0c1thc3NlcnRpb25TdGFja05hbWVdKSkge1xuICAgICAgICAgICAgaWYgKGFzc2VydGlvbklkLnN0YXJ0c1dpdGgoJ0Fzc2VydGlvblJlc3VsdHMnKSkge1xuICAgICAgICAgICAgICBjb25zdCBhc3NlcnRpb25SZXN1bHQ6IEFzc2VydGlvblJlc3VsdCA9IEpTT04ucGFyc2UocmVzdWx0LnJlcGxhY2UoL1xcbi9nLCAnXFxcXG4nKSk7XG4gICAgICAgICAgICAgIGlmIChhc3NlcnRpb25SZXN1bHQuc3RhdHVzID09PSAnZmFpbCcgfHwgYXNzZXJ0aW9uUmVzdWx0LnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0c1thc3NlcnRpb25JZF0gPSBhc3NlcnRpb25SZXN1bHQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gaWYgdGhlcmUgYXJlIG91dHB1dHMsIGJ1dCB0aGV5IGNhbm5vdCBiZSBwcm9jZXNzZWQsIHRoZW4gdGhyb3cgYW4gZXJyb3JcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgdGVzdCBmYWlsc1xuICAgICAgICByZXN1bHRzW2Fzc2VydGlvblN0YWNrSWRdID0ge1xuICAgICAgICAgIHN0YXR1czogJ2ZhaWwnLFxuICAgICAgICAgIG1lc3NhZ2U6IGBlcnJvciBwcm9jZXNzaW5nIGFzc2VydGlvbiByZXN1bHRzOiAke2V9YCxcbiAgICAgICAgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIHJlbW92ZSB0aGUgb3V0cHV0cyBmaWxlIHNvIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBzbmFwc2hvdFxuICAgICAgICAvLyBpdCB3aWxsIGNvbnRhaW4gZW52IHNwZWNpZmljIGluZm9ybWF0aW9uIGZyb20gdmFsdWVzXG4gICAgICAgIC8vIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lXG4gICAgICAgIGZzLnVubGlua1N5bmMoZmlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyhyZXN1bHRzKS5sZW5ndGggPiAwID8gcmVzdWx0cyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gZXJyb3IgbWVzc2FnZSByZXR1cm5lZCBmcm9tIGEgQ0RLIGNvbW1hbmRcbiAgICovXG4gIHByaXZhdGUgcGFyc2VFcnJvcihlOiB1bmtub3duLCBleHBlY3RFcnJvcjogYm9vbGVhbiwgZXhwZWN0ZWRNZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgaWYgKGV4cGVjdEVycm9yKSB7XG4gICAgICBpZiAoZXhwZWN0ZWRNZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAoZSBhcyBFcnJvcikubWVzc2FnZTtcbiAgICAgICAgaWYgKCFtZXNzYWdlLm1hdGNoKGV4cGVjdGVkTWVzc2FnZSkpIHtcbiAgICAgICAgICB0aHJvdyAoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|