@aws-cdk/integ-runner 2.49.1 → 2.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -5
- package/THIRD_PARTY_LICENSES +4 -4
- package/lib/cli.d.ts +22 -1
- package/lib/cli.js +87 -47
- package/lib/index.js +114 -65
- package/lib/runner/integration-tests.d.ts +37 -10
- package/lib/runner/integration-tests.js +34 -21
- package/lib/runner/private/cloud-assembly.d.ts +10 -0
- package/lib/runner/private/cloud-assembly.js +28 -2
- package/lib/runner/runner-base.d.ts +0 -1
- package/lib/runner/runner-base.js +7 -12
- package/lib/runner/snapshot-test-runner.d.ts +9 -0
- package/lib/runner/snapshot-test-runner.js +114 -96
- package/lib/utils.js +2 -1
- package/lib/workers/common.d.ts +8 -0
- package/lib/workers/common.js +1 -1
- package/lib/workers/extract/index.js +14296 -6110
- package/package.json +12 -12
|
@@ -16,6 +16,15 @@ export declare class IntegSnapshotRunner extends IntegRunner {
|
|
|
16
16
|
diagnostics: Diagnostic[];
|
|
17
17
|
destructiveChanges: DestructiveChange[];
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* For a given cloud assembly return a collection of all templates
|
|
21
|
+
* that should be part of the snapshot and any required meta data.
|
|
22
|
+
*
|
|
23
|
+
* @param cloudAssemblyDir The directory of the cloud assembly to look for snapshots
|
|
24
|
+
* @param pickStacks Pick only these stacks from the cloud assembly
|
|
25
|
+
* @returns A SnapshotAssembly, the collection of all templates in this snapshot and required meta data
|
|
26
|
+
*/
|
|
27
|
+
private getSnapshotAssembly;
|
|
19
28
|
/**
|
|
20
29
|
* For a given stack return all resource types that are allowed to be destroyed
|
|
21
30
|
* as part of a stack update
|
|
@@ -26,15 +26,7 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
26
26
|
var _a;
|
|
27
27
|
let doClean = true;
|
|
28
28
|
try {
|
|
29
|
-
|
|
30
|
-
const expectedStacks = this.readAssembly(this.snapshotDir);
|
|
31
|
-
// only diff stacks that are part of the test case
|
|
32
|
-
const expectedStacksToDiff = {};
|
|
33
|
-
for (const [stackName, template] of Object.entries(expectedStacks)) {
|
|
34
|
-
if ((_a = this.expectedTestSuite) === null || _a === void 0 ? void 0 : _a.stacks.includes(stackName)) {
|
|
35
|
-
expectedStacksToDiff[stackName] = template;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
29
|
+
const expectedSnapshotAssembly = this.getSnapshotAssembly(this.snapshotDir, (_a = this.expectedTestSuite) === null || _a === void 0 ? void 0 : _a.stacks);
|
|
38
30
|
// synth the integration test
|
|
39
31
|
// FIXME: ideally we should not need to run this again if
|
|
40
32
|
// the cdkOutDir exists already, but for some reason generateActualSnapshot
|
|
@@ -52,22 +44,14 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
52
44
|
output: path.relative(this.directory, this.cdkOutDir),
|
|
53
45
|
});
|
|
54
46
|
// read the "actual" snapshot
|
|
55
|
-
const
|
|
56
|
-
const actualStacks = this.readAssembly(actualDir);
|
|
57
|
-
// only diff stacks that are part of the test case
|
|
58
|
-
const actualStacksToDiff = {};
|
|
59
|
-
for (const [stackName, template] of Object.entries(actualStacks)) {
|
|
60
|
-
if (this.actualTestSuite.stacks.includes(stackName)) {
|
|
61
|
-
actualStacksToDiff[stackName] = template;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
47
|
+
const actualSnapshotAssembly = this.getSnapshotAssembly(this.cdkOutDir, this.actualTestSuite.stacks);
|
|
64
48
|
// diff the existing snapshot (expected) with the integration test (actual)
|
|
65
|
-
const diagnostics = this.diffAssembly(
|
|
49
|
+
const diagnostics = this.diffAssembly(expectedSnapshotAssembly, actualSnapshotAssembly);
|
|
66
50
|
if (diagnostics.diagnostics.length) {
|
|
67
51
|
// Attach additional messages to the first diagnostic
|
|
68
52
|
const additionalMessages = [];
|
|
69
53
|
if (options.retain) {
|
|
70
|
-
additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), this.snapshotDir)}`, ` Actual: ${path.relative(process.cwd(),
|
|
54
|
+
additionalMessages.push(`(Failure retained) Expected: ${path.relative(process.cwd(), this.snapshotDir)}`, ` Actual: ${path.relative(process.cwd(), this.cdkOutDir)}`),
|
|
71
55
|
doClean = false;
|
|
72
56
|
}
|
|
73
57
|
if (options.verbose) {
|
|
@@ -94,6 +78,33 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
94
78
|
}
|
|
95
79
|
}
|
|
96
80
|
}
|
|
81
|
+
/**
|
|
82
|
+
* For a given cloud assembly return a collection of all templates
|
|
83
|
+
* that should be part of the snapshot and any required meta data.
|
|
84
|
+
*
|
|
85
|
+
* @param cloudAssemblyDir The directory of the cloud assembly to look for snapshots
|
|
86
|
+
* @param pickStacks Pick only these stacks from the cloud assembly
|
|
87
|
+
* @returns A SnapshotAssembly, the collection of all templates in this snapshot and required meta data
|
|
88
|
+
*/
|
|
89
|
+
getSnapshotAssembly(cloudAssemblyDir, pickStacks = []) {
|
|
90
|
+
const assembly = this.readAssembly(cloudAssemblyDir);
|
|
91
|
+
const stacks = assembly.stacks;
|
|
92
|
+
const snapshots = {};
|
|
93
|
+
for (const [stackName, stackTemplate] of Object.entries(stacks)) {
|
|
94
|
+
if (pickStacks.includes(stackName)) {
|
|
95
|
+
const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(cloudAssemblyDir);
|
|
96
|
+
const assets = manifest.getAssetIdsForStack(stackName);
|
|
97
|
+
snapshots[stackName] = {
|
|
98
|
+
templates: {
|
|
99
|
+
[stackName]: stackTemplate,
|
|
100
|
+
...assembly.getNestedStacksForStack(stackName),
|
|
101
|
+
},
|
|
102
|
+
assets,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return snapshots;
|
|
107
|
+
}
|
|
97
108
|
/**
|
|
98
109
|
* For a given stack return all resource types that are allowed to be destroyed
|
|
99
110
|
* as part of a stack update
|
|
@@ -118,84 +129,95 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
118
129
|
* @returns any diagnostics and any destructive changes
|
|
119
130
|
*/
|
|
120
131
|
diffAssembly(expected, actual) {
|
|
121
|
-
var _a, _b;
|
|
132
|
+
var _a, _b, _c, _d;
|
|
122
133
|
const failures = [];
|
|
123
134
|
const destructiveChanges = [];
|
|
124
135
|
// check if there is a CFN template in the current snapshot
|
|
125
136
|
// that does not exist in the "actual" snapshot
|
|
126
|
-
for (const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
137
|
+
for (const [stackId, stack] of Object.entries(expected)) {
|
|
138
|
+
for (const templateId of Object.keys(stack.templates)) {
|
|
139
|
+
if (!((_a = actual[stackId]) === null || _a === void 0 ? void 0 : _a.templates[templateId])) {
|
|
140
|
+
failures.push({
|
|
141
|
+
testName: this.testName,
|
|
142
|
+
stackName: templateId,
|
|
143
|
+
reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
|
|
144
|
+
message: `${templateId} exists in snapshot, but not in actual`,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
133
147
|
}
|
|
134
148
|
}
|
|
135
|
-
for (const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
testName: this.testName,
|
|
141
|
-
reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
|
|
142
|
-
message: `${templateId} does not exist in snapshot, but does in actual`,
|
|
143
|
-
});
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
else {
|
|
147
|
-
let actualTemplate = actual[templateId];
|
|
148
|
-
let expectedTemplate = expected[templateId];
|
|
149
|
-
const allowedDestroyTypes = (_a = this.getAllowedDestroyTypesForStack(templateId)) !== null && _a !== void 0 ? _a : [];
|
|
150
|
-
// if we are not verifying asset hashes then remove the specific
|
|
151
|
-
// asset hashes from the templates so they are not part of the diff
|
|
152
|
-
// comparison
|
|
153
|
-
if (!((_b = this.actualTestSuite.getOptionsForStack(templateId)) === null || _b === void 0 ? void 0 : _b.diffAssets)) {
|
|
154
|
-
actualTemplate = this.canonicalizeTemplate(actualTemplate, templateId, this.cdkOutDir);
|
|
155
|
-
expectedTemplate = this.canonicalizeTemplate(expectedTemplate, templateId, this.snapshotDir);
|
|
156
|
-
}
|
|
157
|
-
const templateDiff = cloudformation_diff_1.diffTemplate(expectedTemplate, actualTemplate);
|
|
158
|
-
if (!templateDiff.isEmpty) {
|
|
159
|
-
// go through all the resource differences and check for any
|
|
160
|
-
// "destructive" changes
|
|
161
|
-
templateDiff.resources.forEachDifference((logicalId, change) => {
|
|
162
|
-
var _a, _b, _c;
|
|
163
|
-
// if the change is a removal it will not show up as a 'changeImpact'
|
|
164
|
-
// so need to check for it separately, unless it is a resourceType that
|
|
165
|
-
// has been "allowed" to be destroyed
|
|
166
|
-
const resourceType = (_b = (_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.Type) !== null && _b !== void 0 ? _b : (_c = change.newValue) === null || _c === void 0 ? void 0 : _c.Type;
|
|
167
|
-
if (resourceType && allowedDestroyTypes.includes(resourceType)) {
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
if (change.isRemoval) {
|
|
171
|
-
destructiveChanges.push({
|
|
172
|
-
impact: cloudformation_diff_1.ResourceImpact.WILL_DESTROY,
|
|
173
|
-
logicalId,
|
|
174
|
-
stackName: templateId,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
switch (change.changeImpact) {
|
|
179
|
-
case cloudformation_diff_1.ResourceImpact.MAY_REPLACE:
|
|
180
|
-
case cloudformation_diff_1.ResourceImpact.WILL_ORPHAN:
|
|
181
|
-
case cloudformation_diff_1.ResourceImpact.WILL_DESTROY:
|
|
182
|
-
case cloudformation_diff_1.ResourceImpact.WILL_REPLACE:
|
|
183
|
-
destructiveChanges.push({
|
|
184
|
-
impact: change.changeImpact,
|
|
185
|
-
logicalId,
|
|
186
|
-
stackName: templateId,
|
|
187
|
-
});
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
const writable = new StringWritable({});
|
|
193
|
-
cloudformation_diff_1.formatDifferences(writable, templateDiff);
|
|
149
|
+
for (const [stackId, stack] of Object.entries(actual)) {
|
|
150
|
+
for (const templateId of Object.keys(stack.templates)) {
|
|
151
|
+
// check if there is a CFN template in the "actual" snapshot
|
|
152
|
+
// that does not exist in the current snapshot
|
|
153
|
+
if (!((_b = expected[stackId]) === null || _b === void 0 ? void 0 : _b.templates[templateId])) {
|
|
194
154
|
failures.push({
|
|
195
|
-
reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
|
|
196
|
-
message: writable.data,
|
|
197
155
|
testName: this.testName,
|
|
156
|
+
stackName: templateId,
|
|
157
|
+
reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
|
|
158
|
+
message: `${templateId} does not exist in snapshot, but does in actual`,
|
|
198
159
|
});
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const config = {
|
|
164
|
+
diffAssets: (_c = this.actualTestSuite.getOptionsForStack(stackId)) === null || _c === void 0 ? void 0 : _c.diffAssets,
|
|
165
|
+
};
|
|
166
|
+
let actualTemplate = actual[stackId].templates[templateId];
|
|
167
|
+
let expectedTemplate = expected[stackId].templates[templateId];
|
|
168
|
+
// if we are not verifying asset hashes then remove the specific
|
|
169
|
+
// asset hashes from the templates so they are not part of the diff
|
|
170
|
+
// comparison
|
|
171
|
+
if (!config.diffAssets) {
|
|
172
|
+
actualTemplate = this.canonicalizeTemplate(actualTemplate, actual[stackId].assets);
|
|
173
|
+
expectedTemplate = this.canonicalizeTemplate(expectedTemplate, expected[stackId].assets);
|
|
174
|
+
}
|
|
175
|
+
const templateDiff = cloudformation_diff_1.diffTemplate(expectedTemplate, actualTemplate);
|
|
176
|
+
if (!templateDiff.isEmpty) {
|
|
177
|
+
const allowedDestroyTypes = (_d = this.getAllowedDestroyTypesForStack(stackId)) !== null && _d !== void 0 ? _d : [];
|
|
178
|
+
// go through all the resource differences and check for any
|
|
179
|
+
// "destructive" changes
|
|
180
|
+
templateDiff.resources.forEachDifference((logicalId, change) => {
|
|
181
|
+
var _a, _b, _c;
|
|
182
|
+
// if the change is a removal it will not show up as a 'changeImpact'
|
|
183
|
+
// so need to check for it separately, unless it is a resourceType that
|
|
184
|
+
// has been "allowed" to be destroyed
|
|
185
|
+
const resourceType = (_b = (_a = change.oldValue) === null || _a === void 0 ? void 0 : _a.Type) !== null && _b !== void 0 ? _b : (_c = change.newValue) === null || _c === void 0 ? void 0 : _c.Type;
|
|
186
|
+
if (resourceType && allowedDestroyTypes.includes(resourceType)) {
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
if (change.isRemoval) {
|
|
190
|
+
destructiveChanges.push({
|
|
191
|
+
impact: cloudformation_diff_1.ResourceImpact.WILL_DESTROY,
|
|
192
|
+
logicalId,
|
|
193
|
+
stackName: templateId,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
switch (change.changeImpact) {
|
|
198
|
+
case cloudformation_diff_1.ResourceImpact.MAY_REPLACE:
|
|
199
|
+
case cloudformation_diff_1.ResourceImpact.WILL_ORPHAN:
|
|
200
|
+
case cloudformation_diff_1.ResourceImpact.WILL_DESTROY:
|
|
201
|
+
case cloudformation_diff_1.ResourceImpact.WILL_REPLACE:
|
|
202
|
+
destructiveChanges.push({
|
|
203
|
+
impact: change.changeImpact,
|
|
204
|
+
logicalId,
|
|
205
|
+
stackName: templateId,
|
|
206
|
+
});
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
const writable = new StringWritable({});
|
|
212
|
+
cloudformation_diff_1.formatDifferences(writable, templateDiff);
|
|
213
|
+
failures.push({
|
|
214
|
+
reason: common_1.DiagnosticReason.SNAPSHOT_FAILED,
|
|
215
|
+
message: writable.data,
|
|
216
|
+
stackName: templateId,
|
|
217
|
+
testName: this.testName,
|
|
218
|
+
config,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
199
221
|
}
|
|
200
222
|
}
|
|
201
223
|
}
|
|
@@ -205,9 +227,7 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
205
227
|
};
|
|
206
228
|
}
|
|
207
229
|
readAssembly(dir) {
|
|
208
|
-
|
|
209
|
-
const stacks = assembly.stacks;
|
|
210
|
-
return stacks;
|
|
230
|
+
return cloud_assembly_1.AssemblyManifestReader.fromPath(dir);
|
|
211
231
|
}
|
|
212
232
|
/**
|
|
213
233
|
* Reduce template to a normal form where asset references have been normalized
|
|
@@ -215,7 +235,7 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
215
235
|
* This makes it possible to compare templates if all that's different between
|
|
216
236
|
* them is the hashes of the asset values.
|
|
217
237
|
*/
|
|
218
|
-
canonicalizeTemplate(template,
|
|
238
|
+
canonicalizeTemplate(template, assets) {
|
|
219
239
|
const assetsSeen = new Set();
|
|
220
240
|
const stringSubstitutions = new Array();
|
|
221
241
|
// Find assets via parameters (for LegacyStackSynthesizer)
|
|
@@ -243,8 +263,6 @@ class IntegSnapshotRunner extends runner_base_1.IntegRunner {
|
|
|
243
263
|
}
|
|
244
264
|
// find assets defined in the asset manifest
|
|
245
265
|
try {
|
|
246
|
-
const manifest = cloud_assembly_1.AssemblyManifestReader.fromPath(manifestDir);
|
|
247
|
-
const assets = manifest.getAssetIdsForStack(stackName);
|
|
248
266
|
assets.forEach(asset => {
|
|
249
267
|
if (!assetsSeen.has(asset)) {
|
|
250
268
|
assetsSeen.add(asset);
|
|
@@ -304,4 +322,4 @@ class StringWritable extends stream_1.Writable {
|
|
|
304
322
|
callback();
|
|
305
323
|
}
|
|
306
324
|
}
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IsbUNBQW1EO0FBQ25ELG1EQUErQztBQUMvQyxzRUFBbUg7QUFDbkgsOENBQWlIO0FBQ2pILDZEQUFrRTtBQUNsRSwrQ0FBdUY7QUFFdkY7OztHQUdHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSx5QkFBVztJQUNsRCxZQUFZLE9BQTJCO1FBQ3JDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxZQUFZLENBQUMsVUFBdUMsRUFBRTs7UUFDM0QsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUk7WUFDRiw2QkFBNkI7WUFDN0IsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDM0Qsa0RBQWtEO1lBQ2xELE1BQU0sb0JBQW9CLEdBQXdCLEVBQUUsQ0FBQztZQUNyRCxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRTtnQkFDbEUsVUFBSSxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHO29CQUN0RCxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUM7aUJBQzVDO2FBQ0Y7WUFFRCw2QkFBNkI7WUFDN0IseURBQXlEO1lBQ3pELDJFQUEyRTtZQUMzRSw2RUFBNkU7WUFDN0Usb0NBQW9DO1lBQ3BDLE1BQU0sR0FBRyxHQUFHO2dCQUNWLEdBQUcsbUNBQXFCLENBQUMsR0FBRztnQkFDNUIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO29C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QUMzRSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDekIsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXdDO1FBQzdDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBXcml0YWJsZSwgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgeyBkaWZmVGVtcGxhdGUsIGZvcm1hdERpZmZlcmVuY2VzLCBSZXNvdXJjZURpZmZlcmVuY2UsIFJlc291cmNlSW1wYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBEaWFnbm9zdGljLCBEaWFnbm9zdGljUmVhc29uLCBEZXN0cnVjdGl2ZUNoYW5nZSwgU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB9IGZyb20gJy4vcHJpdmF0ZS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBJbnRlZ1J1bm5lck9wdGlvbnMsIEludGVnUnVubmVyLCBERUZBVUxUX1NZTlRIX09QVElPTlMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcblxuLyoqXG4gKiBSdW5uZXIgZm9yIHNuYXBzaG90IHRlc3RzLiBUaGlzIGhhbmRsZXMgb3JjaGVzdHJhdGluZ1xuICogdGhlIHZhbGlkYXRpb24gb2YgdGhlIGludGVncmF0aW9uIHRlc3Qgc25hcHNob3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1NuYXBzaG90UnVubmVyIGV4dGVuZHMgSW50ZWdSdW5uZXIge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbnRlZ1J1bm5lck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCB0aGUgaW50ZWdyYXRpb24gdGVzdHMgYW5kIGNvbXBhcmUgdGhlIHRlbXBsYXRlc1xuICAgKiB0byB0aGUgZXhpc3Rpbmcgc25hcHNob3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHB1YmxpYyB0ZXN0U25hcHNob3Qob3B0aW9uczogU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zID0ge30pOiB7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10sIGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSB9IHtcbiAgICBsZXQgZG9DbGVhbiA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIC8vIHJlYWQgdGhlIGV4aXN0aW5nIHNuYXBzaG90XG4gICAgICBjb25zdCBleHBlY3RlZFN0YWNrcyA9IHRoaXMucmVhZEFzc2VtYmx5KHRoaXMuc25hcHNob3REaXIpO1xuICAgICAgLy8gb25seSBkaWZmIHN0YWNrcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSB0ZXN0IGNhc2VcbiAgICAgIGNvbnN0IGV4cGVjdGVkU3RhY2tzVG9EaWZmOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtzdGFja05hbWUsIHRlbXBsYXRlXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZFN0YWNrcykpIHtcbiAgICAgICAgaWYgKHRoaXMuZXhwZWN0ZWRUZXN0U3VpdGU/LnN0YWNrcy5pbmNsdWRlcyhzdGFja05hbWUpKSB7XG4gICAgICAgICAgZXhwZWN0ZWRTdGFja3NUb0RpZmZbc3RhY2tOYW1lXSA9IHRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN5bnRoIHRoZSBpbnRlZ3JhdGlvbiB0ZXN0XG4gICAgICAvLyBGSVhNRTogaWRlYWxseSB3ZSBzaG91bGQgbm90IG5lZWQgdG8gcnVuIHRoaXMgYWdhaW4gaWZcbiAgICAgIC8vIHRoZSBjZGtPdXREaXIgZXhpc3RzIGFscmVhZHksIGJ1dCBmb3Igc29tZSByZWFzb24gZ2VuZXJhdGVBY3R1YWxTbmFwc2hvdFxuICAgICAgLy8gZ2VuZXJhdGVzIGFuIGluY29ycmVjdCBzbmFwc2hvdCBhbmQgSSBoYXZlIG5vIGlkZWEgd2h5IHNvIHN5bnRoIGFnYWluIGhlcmVcbiAgICAgIC8vIHRvIHByb2R1Y2UgdGhlIFwiY29ycmVjdFwiIHNuYXBzaG90XG4gICAgICBjb25zdCBlbnYgPSB7XG4gICAgICAgIC4uLkRFRkFVTFRfU1lOVEhfT1BUSU9OUy5lbnYsXG4gICAgICAgIENES19DT05URVhUX0pTT046IEpTT04uc3RyaW5naWZ5KHRoaXMuZ2V0Q29udGV4dCh7XG4gICAgICAgICAgLi4udGhpcy5hY3R1YWxUZXN0U3VpdGUuZW5hYmxlTG9va3VwcyA/IERFRkFVTFRfU1lOVEhfT1BUSU9OUy5jb250ZXh0IDoge30sXG4gICAgICAgIH0pKSxcbiAgICAgIH07XG4gICAgICB0aGlzLmNkay5zeW50aEZhc3Qoe1xuICAgICAgICBleGVjQ21kOiB0aGlzLmNka0FwcC5zcGxpdCgnICcpLFxuICAgICAgICBlbnYsXG4gICAgICAgIG91dHB1dDogcGF0aC5yZWxhdGl2ZSh0aGlzLmRpcmVjdG9yeSwgdGhpcy5jZGtPdXREaXIpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIHJlYWQgdGhlIFwiYWN0dWFsXCIgc25hcHNob3RcbiAgICAgIGNvbnN0IGFjdHVhbERpciA9IHRoaXMuY2RrT3V0RGlyO1xuICAgICAgY29uc3QgYWN0dWFsU3RhY2tzID0gdGhpcy5yZWFkQXNzZW1ibHkoYWN0dWFsRGlyKTtcbiAgICAgIC8vIG9ubHkgZGlmZiBzdGFja3MgdGhhdCBhcmUgcGFydCBvZiB0aGUgdGVzdCBjYXNlXG4gICAgICBjb25zdCBhY3R1YWxTdGFja3NUb0RpZmY6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgW3N0YWNrTmFtZSwgdGVtcGxhdGVdIG9mIE9iamVjdC5lbnRyaWVzKGFjdHVhbFN0YWNrcykpIHtcbiAgICAgICAgaWYgKHRoaXMuYWN0dWFsVGVzdFN1aXRlLnN0YWNrcy5pbmNsdWRlcyhzdGFja05hbWUpKSB7XG4gICAgICAgICAgYWN0dWFsU3RhY2tzVG9EaWZmW3N0YWNrTmFtZV0gPSB0ZW1wbGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBkaWZmIHRoZSBleGlzdGluZyBzbmFwc2hvdCAoZXhwZWN0ZWQpIHdpdGggdGhlIGludGVncmF0aW9uIHRlc3QgKGFjdHVhbClcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gdGhpcy5kaWZmQXNzZW1ibHkoZXhwZWN0ZWRTdGFja3NUb0RpZmYsIGFjdHVhbFN0YWNrc1RvRGlmZik7XG5cbiAgICAgIGlmIChkaWFnbm9zdGljcy5kaWFnbm9zdGljcy5sZW5ndGgpIHtcbiAgICAgICAgLy8gQXR0YWNoIGFkZGl0aW9uYWwgbWVzc2FnZXMgdG8gdGhlIGZpcnN0IGRpYWdub3N0aWNcbiAgICAgICAgY29uc3QgYWRkaXRpb25hbE1lc3NhZ2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnJldGFpbikge1xuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgYChGYWlsdXJlIHJldGFpbmVkKSBFeHBlY3RlZDogJHtwYXRoLnJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIHRoaXMuc25hcHNob3REaXIpfWAsXG4gICAgICAgICAgICBgICAgICAgICAgICAgICAgICAgIEFjdHVhbDogICAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgYWN0dWFsRGlyKX1gLFxuICAgICAgICAgICksXG4gICAgICAgICAgZG9DbGVhbiA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgIC8vIFNob3cgdGhlIGNvbW1hbmQgbmVjZXNzYXJ5IHRvIHJlcHJvIHRoaXNcbiAgICAgICAgICBjb25zdCBlbnZTZXQgPSBPYmplY3QuZW50cmllcyhlbnYpXG4gICAgICAgICAgICAuZmlsdGVyKChbaywgX10pID0+IGsgIT09ICdDREtfQ09OVEVYVF9KU09OJylcbiAgICAgICAgICAgIC5tYXAoKFtrLCB2XSkgPT4gYCR7a309JyR7dn0nYCk7XG4gICAgICAgICAgY29uc3QgZW52Q21kID0gZW52U2V0Lmxlbmd0aCA+IDAgPyBbJ2VudicsIC4uLmVudlNldF0gOiBbXTtcblxuICAgICAgICAgIGFkZGl0aW9uYWxNZXNzYWdlcy5wdXNoKFxuICAgICAgICAgICAgJ1JlcHJvOicsXG4gICAgICAgICAgICBgICAke1suLi5lbnZDbWQsICdjZGsgc3ludGgnLCBgLWEgJyR7dGhpcy5jZGtBcHB9J2AsIGAtbyAnJHt0aGlzLmNka091dERpcn0nYCwgLi4uT2JqZWN0LmVudHJpZXModGhpcy5nZXRDb250ZXh0KCkpLmZsYXRNYXAoKFtrLCB2XSkgPT4gdHlwZW9mIHYgIT09ICdvYmplY3QnID8gW2AtYyAnJHtrfT0ke3Z9J2BdIDogW10pXS5qb2luKCcgJyl9YCxcblxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBkaWFnbm9zdGljcy5kaWFnbm9zdGljc1swXSA9IHtcbiAgICAgICAgICAuLi5kaWFnbm9zdGljcy5kaWFnbm9zdGljc1swXSxcbiAgICAgICAgICBhZGRpdGlvbmFsTWVzc2FnZXMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpZiAoZG9DbGVhbikge1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRm9yIGEgZ2l2ZW4gc3RhY2sgcmV0dXJuIGFsbCByZXNvdXJjZSB0eXBlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGJlIGRlc3Ryb3llZFxuICAgKiBhcyBwYXJ0IG9mIGEgc3RhY2sgdXBkYXRlXG4gICAqXG4gICAqIEBwYXJhbSBzdGFja0lkIHRoZSBzdGFjayBpZFxuICAgKiBAcmV0dXJucyBhIGxpc3Qgb2YgcmVzb3VyY2UgdHlwZXMgb3IgdW5kZWZpbmVkIGlmIG5vbmUgYXJlIGZvdW5kXG4gICAqL1xuICBwcml2YXRlIGdldEFsbG93ZWREZXN0cm95VHlwZXNGb3JTdGFjayhzdGFja0lkOiBzdHJpbmcpOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCB0ZXN0Q2FzZSBvZiBPYmplY3QudmFsdWVzKHRoaXMuYWN0dWFsVGVzdHMoKSA/PyB7fSkpIHtcbiAgICAgIGlmICh0ZXN0Q2FzZS5zdGFja3MuaW5jbHVkZXMoc3RhY2tJZCkpIHtcbiAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmFsbG93RGVzdHJveTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGFueSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBleGlzdGluZyBhbmQgZXhwZWN0ZWQgc25hcHNob3RzXG4gICAqXG4gICAqIEBwYXJhbSBleGlzdGluZyAtIHRoZSBleGlzdGluZyAoZXhwZWN0ZWQpIHNuYXBzaG90XG4gICAqIEBwYXJhbSBhY3R1YWwgLSB0aGUgbmV3IChhY3R1YWwpIHNuYXBzaG90XG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHByaXZhdGUgZGlmZkFzc2VtYmx5KFxuICAgIGV4cGVjdGVkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGFjdHVhbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgKTogeyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdLCBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW10gfSB7XG4gICAgY29uc3QgZmFpbHVyZXM6IERpYWdub3N0aWNbXSA9IFtdO1xuICAgIGNvbnN0IGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSBDRk4gdGVtcGxhdGUgaW4gdGhlIGN1cnJlbnQgc25hcHNob3RcbiAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKGV4cGVjdGVkKSkge1xuICAgICAgaWYgKCFhY3R1YWwuaGFzT3duUHJvcGVydHkodGVtcGxhdGVJZCkpIHtcbiAgICAgICAgZmFpbHVyZXMucHVzaCh7XG4gICAgICAgICAgdGVzdE5hbWU6IHRoaXMudGVzdE5hbWUsXG4gICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICBtZXNzYWdlOiBgJHt0ZW1wbGF0ZUlkfSBleGlzdHMgaW4gc25hcHNob3QsIGJ1dCBub3QgaW4gYWN0dWFsYCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZUlkIG9mIE9iamVjdC5rZXlzKGFjdHVhbCkpIHtcbiAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICAvLyB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgICBpZiAoIWV4cGVjdGVkLmhhc093blByb3BlcnR5KHRlbXBsYXRlSWQpKSB7XG4gICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3ROYW1lLFxuICAgICAgICAgIHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9GQUlMRUQsXG4gICAgICAgICAgbWVzc2FnZTogYCR7dGVtcGxhdGVJZH0gZG9lcyBub3QgZXhpc3QgaW4gc25hcHNob3QsIGJ1dCBkb2VzIGluIGFjdHVhbGAsXG4gICAgICAgIH0pO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBhY3R1YWxUZW1wbGF0ZSA9IGFjdHVhbFt0ZW1wbGF0ZUlkXTtcbiAgICAgICAgbGV0IGV4cGVjdGVkVGVtcGxhdGUgPSBleHBlY3RlZFt0ZW1wbGF0ZUlkXTtcbiAgICAgICAgY29uc3QgYWxsb3dlZERlc3Ryb3lUeXBlcyA9IHRoaXMuZ2V0QWxsb3dlZERlc3Ryb3lUeXBlc0ZvclN0YWNrKHRlbXBsYXRlSWQpID8/IFtdO1xuXG4gICAgICAgIC8vIGlmIHdlIGFyZSBub3QgdmVyaWZ5aW5nIGFzc2V0IGhhc2hlcyB0aGVuIHJlbW92ZSB0aGUgc3BlY2lmaWNcbiAgICAgICAgLy8gYXNzZXQgaGFzaGVzIGZyb20gdGhlIHRlbXBsYXRlcyBzbyB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZGlmZlxuICAgICAgICAvLyBjb21wYXJpc29uXG4gICAgICAgIGlmICghdGhpcy5hY3R1YWxUZXN0U3VpdGUuZ2V0T3B0aW9uc0ZvclN0YWNrKHRlbXBsYXRlSWQpPy5kaWZmQXNzZXRzKSB7XG4gICAgICAgICAgYWN0dWFsVGVtcGxhdGUgPSB0aGlzLmNhbm9uaWNhbGl6ZVRlbXBsYXRlKGFjdHVhbFRlbXBsYXRlLCB0ZW1wbGF0ZUlkLCB0aGlzLmNka091dERpcik7XG4gICAgICAgICAgZXhwZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoZXhwZWN0ZWRUZW1wbGF0ZSwgdGVtcGxhdGVJZCwgdGhpcy5zbmFwc2hvdERpcik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZGlmZlRlbXBsYXRlKGV4cGVjdGVkVGVtcGxhdGUsIGFjdHVhbFRlbXBsYXRlKTtcbiAgICAgICAgaWYgKCF0ZW1wbGF0ZURpZmYuaXNFbXB0eSkge1xuICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZSBkaWZmZXJlbmNlcyBhbmQgY2hlY2sgZm9yIGFueVxuICAgICAgICAgIC8vIFwiZGVzdHJ1Y3RpdmVcIiBjaGFuZ2VzXG4gICAgICAgICAgdGVtcGxhdGVEaWZmLnJlc291cmNlcy5mb3JFYWNoRGlmZmVyZW5jZSgobG9naWNhbElkOiBzdHJpbmcsIGNoYW5nZTogUmVzb3VyY2VEaWZmZXJlbmNlKSA9PiB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgY2hhbmdlIGlzIGEgcmVtb3ZhbCBpdCB3aWxsIG5vdCBzaG93IHVwIGFzIGEgJ2NoYW5nZUltcGFjdCdcbiAgICAgICAgICAgIC8vIHNvIG5lZWQgdG8gY2hlY2sgZm9yIGl0IHNlcGFyYXRlbHksIHVubGVzcyBpdCBpcyBhIHJlc291cmNlVHlwZSB0aGF0XG4gICAgICAgICAgICAvLyBoYXMgYmVlbiBcImFsbG93ZWRcIiB0byBiZSBkZXN0cm95ZWRcbiAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoYW5nZS5vbGRWYWx1ZT8uVHlwZSA/PyBjaGFuZ2UubmV3VmFsdWU/LlR5cGU7XG4gICAgICAgICAgICBpZiAocmVzb3VyY2VUeXBlICYmIGFsbG93ZWREZXN0cm95VHlwZXMuaW5jbHVkZXMocmVzb3VyY2VUeXBlKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY2hhbmdlLmlzUmVtb3ZhbCkge1xuICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgaW1wYWN0OiBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1ksXG4gICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5jaGFuZ2VJbXBhY3QpIHtcbiAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9PUlBIQU46XG4gICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1k6XG4gICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgICAgICAgICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGltcGFjdDogY2hhbmdlLmNoYW5nZUltcGFjdCxcbiAgICAgICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3Qgd3JpdGFibGUgPSBuZXcgU3RyaW5nV3JpdGFibGUoe30pO1xuICAgICAgICAgIGZvcm1hdERpZmZlcmVuY2VzKHdyaXRhYmxlLCB0ZW1wbGF0ZURpZmYpO1xuICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IHdyaXRhYmxlLmRhdGEsXG4gICAgICAgICAgICB0ZXN0TmFtZTogdGhpcy50ZXN0TmFtZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkaWFnbm9zdGljczogZmFpbHVyZXMsXG4gICAgICBkZXN0cnVjdGl2ZUNoYW5nZXMsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZEFzc2VtYmx5KGRpcjogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgY29uc3QgYXNzZW1ibHkgPSBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKGRpcik7XG4gICAgY29uc3Qgc3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzO1xuXG4gICAgcmV0dXJuIHN0YWNrcztcbiAgfVxuXG4gIC8qKlxuICAqIFJlZHVjZSB0ZW1wbGF0ZSB0byBhIG5vcm1hbCBmb3JtIHdoZXJlIGFzc2V0IHJlZmVyZW5jZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWRcbiAgKlxuICAqIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gY29tcGFyZSB0ZW1wbGF0ZXMgaWYgYWxsIHRoYXQncyBkaWZmZXJlbnQgYmV0d2VlblxuICAqIHRoZW0gaXMgdGhlIGhhc2hlcyBvZiB0aGUgYXNzZXQgdmFsdWVzLlxuICAqL1xuICBwcml2YXRlIGNhbm9uaWNhbGl6ZVRlbXBsYXRlKHRlbXBsYXRlOiBhbnksIHN0YWNrTmFtZTogc3RyaW5nLCBtYW5pZmVzdERpcjogc3RyaW5nKTogYW55IHtcbiAgICBjb25zdCBhc3NldHNTZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3RyaW5nU3Vic3RpdHV0aW9ucyA9IG5ldyBBcnJheTxbUmVnRXhwLCBzdHJpbmddPigpO1xuXG4gICAgLy8gRmluZCBhc3NldHMgdmlhIHBhcmFtZXRlcnMgKGZvciBMZWdhY3lTdGFja1N5bnRoZXNpemVyKVxuICAgIGNvbnN0IHBhcmFtUmUgPSAvXkFzc2V0UGFyYW1ldGVycyhbYS16QS1aMC05XXs2NH0pKFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KSQvO1xuICAgIGZvciAoY29uc3QgcGFyYW1OYW1lIG9mIE9iamVjdC5rZXlzKHRlbXBsYXRlPy5QYXJhbWV0ZXJzIHx8IHt9KSkge1xuICAgICAgY29uc3QgbSA9IHBhcmFtUmUuZXhlYyhwYXJhbU5hbWUpO1xuICAgICAgaWYgKCFtKSB7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoYXNzZXRzU2Vlbi5oYXMobVsxXSkpIHsgY29udGludWU7IH1cblxuICAgICAgYXNzZXRzU2Vlbi5hZGQobVsxXSk7XG4gICAgICBjb25zdCBpeCA9IGFzc2V0c1NlZW4uc2l6ZTtcblxuICAgICAgLy8gRnVsbCBwYXJhbWV0ZXIgcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGBBc3NldFBhcmFtZXRlcnMke21bMV19KFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KWApLFxuICAgICAgICBgQXNzZXQke2l4fSQxYCxcbiAgICAgIF0pO1xuICAgICAgLy8gU3Vic3RyaW5nIGFzc2V0IGhhc2ggcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGAke21bMV19YCksXG4gICAgICAgIGBBc3NldCR7aXh9SGFzaGAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGFzc2V0cyBkZWZpbmVkIGluIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgobWFuaWZlc3REaXIpO1xuICAgICAgY29uc3QgYXNzZXRzID0gbWFuaWZlc3QuZ2V0QXNzZXRJZHNGb3JTdGFjayhzdGFja05hbWUpO1xuICAgICAgYXNzZXRzLmZvckVhY2goYXNzZXQgPT4ge1xuICAgICAgICBpZiAoIWFzc2V0c1NlZW4uaGFzKGFzc2V0KSkge1xuICAgICAgICAgIGFzc2V0c1NlZW4uYWRkKGFzc2V0KTtcbiAgICAgICAgICBjb25zdCBpeCA9IGFzc2V0c1NlZW4uc2l6ZTtcbiAgICAgICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICAgICAgbmV3IFJlZ0V4cChhc3NldCksXG4gICAgICAgICAgICBgQXNzZXQke2l4fSQxYCxcbiAgICAgICAgICBdKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZiB0aGVyZSBpcyBubyBhc3NldCBtYW5pZmVzdCB0aGF0IGlzIGZpbmUuXG4gICAgfVxuXG4gICAgLy8gU3Vic3RpdHV0ZSB0aGVtIG91dFxuICAgIHJldHVybiBzdWJzdGl0dXRlKHRlbXBsYXRlKTtcblxuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGUod2hhdDogYW55KTogYW55IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHdoYXQpKSB7XG4gICAgICAgIHJldHVybiB3aGF0Lm1hcChzdWJzdGl0dXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB3aGF0ID09PSAnb2JqZWN0JyAmJiB3aGF0ICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHJldDogYW55ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHdoYXQpKSB7XG4gICAgICAgICAgcmV0W3N0cmluZ1N1YihrKV0gPSBzdWJzdGl0dXRlKHYpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygd2hhdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1N1Yih3aGF0KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdoYXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RyaW5nU3ViKHg6IHN0cmluZykge1xuICAgICAgZm9yIChjb25zdCBbcmUsIHJlcGxhY2VtZW50XSBvZiBzdHJpbmdTdWJzdGl0dXRpb25zKSB7XG4gICAgICAgIHggPSB4LnJlcGxhY2UocmUsIHJlcGxhY2VtZW50KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBTdHJpbmdXcml0YWJsZSBleHRlbmRzIFdyaXRhYmxlIHtcbiAgcHVibGljIGRhdGE6IHN0cmluZztcbiAgcHJpdmF0ZSBfZGVjb2RlcjogU3RyaW5nRGVjb2RlcjtcbiAgY29uc3RydWN0b3Iob3B0aW9uczogV3JpdGFibGVPcHRpb25zKSB7XG4gICAgc3VwZXIob3B0aW9ucyk7XG4gICAgdGhpcy5fZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKCk7XG4gICAgdGhpcy5kYXRhID0gJyc7XG4gIH1cblxuICBfd3JpdGUoY2h1bms6IGFueSwgZW5jb2Rpbmc6IHN0cmluZywgY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmIChlbmNvZGluZyA9PT0gJ2J1ZmZlcicpIHtcbiAgICAgIGNodW5rID0gdGhpcy5fZGVjb2Rlci53cml0ZShjaHVuayk7XG4gICAgfVxuXG4gICAgdGhpcy5kYXRhICs9IGNodW5rO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cblxuICBfZmluYWwoY2FsbGJhY2s6IChlcnJvcj86IEVycm9yIHwgbnVsbCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMuZGF0YSArPSB0aGlzLl9kZWNvZGVyLmVuZCgpO1xuICAgIGNhbGxiYWNrKCk7XG4gIH1cbn1cbiJdfQ==
|
|
325
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic25hcHNob3QtdGVzdC1ydW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzbmFwc2hvdC10ZXN0LXJ1bm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBNkI7QUFDN0IsbUNBQW1EO0FBQ25ELG1EQUErQztBQUMvQyxzRUFBbUg7QUFDbkgsOENBQWlIO0FBQ2pILDZEQUFrRTtBQUNsRSwrQ0FBdUY7QUFxQnZGOzs7R0FHRztBQUNILE1BQWEsbUJBQW9CLFNBQVEseUJBQVc7SUFDbEQsWUFBWSxPQUEyQjtRQUNyQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksWUFBWSxDQUFDLFVBQXVDLEVBQUU7O1FBQzNELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJO1lBQ0YsTUFBTSx3QkFBd0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFdBQVcsUUFBRSxJQUFJLENBQUMsaUJBQWlCLDBDQUFFLE1BQU0sQ0FBQyxDQUFDO1lBRTVHLDZCQUE2QjtZQUM3Qix5REFBeUQ7WUFDekQsMkVBQTJFO1lBQzNFLDZFQUE2RTtZQUM3RSxvQ0FBb0M7WUFDcEMsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsR0FBRyxtQ0FBcUIsQ0FBQyxHQUFHO2dCQUM1QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQy9DLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLG1DQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtpQkFDM0UsQ0FBQyxDQUFDO2FBQ0osQ0FBQztZQUNGLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO2dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUMvQixHQUFHO2dCQUNI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UztZQUMxQixLQUFLLE1BQU0sQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLElBQUksbUJBQW1CLEVBQUU7Z0JBQ25ELENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNoQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ1gsQ0FBQztJQUNILENBQUM7Q0FDRjtBQS9URCxrREErVEM7QUFFRCxNQUFNLGNBQWUsU0FBUSxpQkFBUTtJQUduQyxZQUFZLE9BQXdCO1FBQ2xDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSw4QkFBYSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFVLEVBQUUsUUFBZ0IsRUFBRSxRQUF3QztRQUMzRSxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUU7WUFDekIsS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO1FBRUQsSUFBSSxDQUFDLElBQUksSUFBSSxLQUFLLENBQUM7UUFDbkIsUUFBUSxFQUFFLENBQUM7SUFDYixDQUFDO0lBRUQsTUFBTSxDQUFDLFFBQXdDO1FBQzdDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNqQyxRQUFRLEVBQUUsQ0FBQztJQUNiLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBXcml0YWJsZSwgV3JpdGFibGVPcHRpb25zIH0gZnJvbSAnc3RyZWFtJztcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tICdzdHJpbmdfZGVjb2Rlcic7XG5pbXBvcnQgeyBkaWZmVGVtcGxhdGUsIGZvcm1hdERpZmZlcmVuY2VzLCBSZXNvdXJjZURpZmZlcmVuY2UsIFJlc291cmNlSW1wYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgeyBEaWFnbm9zdGljLCBEaWFnbm9zdGljUmVhc29uLCBEZXN0cnVjdGl2ZUNoYW5nZSwgU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zIH0gZnJvbSAnLi4vd29ya2Vycy9jb21tb24nO1xuaW1wb3J0IHsgQXNzZW1ibHlNYW5pZmVzdFJlYWRlciB9IGZyb20gJy4vcHJpdmF0ZS9jbG91ZC1hc3NlbWJseSc7XG5pbXBvcnQgeyBJbnRlZ1J1bm5lck9wdGlvbnMsIEludGVnUnVubmVyLCBERUZBVUxUX1NZTlRIX09QVElPTlMgfSBmcm9tICcuL3J1bm5lci1iYXNlJztcblxuaW50ZXJmYWNlIFNuYXBzaG90QXNzZW1ibHkge1xuICAvKipcbiAgICogTWFwIG9mIHN0YWNrcyB0aGF0IGFyZSBwYXJ0IG9mIHRoaXMgYXNzZW1ibHlcbiAgICovXG4gIFtzdGFja05hbWU6IHN0cmluZ106IHtcbiAgICAvKipcbiAgICAgKiBBbGwgdGVtcGxhdGVzIGZvciB0aGlzIHN0YWNrLCBpbmNsdWRpbmcgbmVzdGVkIHN0YWNrc1xuICAgICAqL1xuICAgIHRlbXBsYXRlczoge1xuICAgICAgW3RlbXBsYXRlSWQ6IHN0cmluZ106IGFueVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGFzc2V0IElkcyB0aGF0IGFyZSB1c2VkIGJ5IHRoaXMgYXNzZW1ibHlcbiAgICAgKi9cbiAgICBhc3NldHM6IHN0cmluZ1tdXG4gIH1cbn1cblxuLyoqXG4gKiBSdW5uZXIgZm9yIHNuYXBzaG90IHRlc3RzLiBUaGlzIGhhbmRsZXMgb3JjaGVzdHJhdGluZ1xuICogdGhlIHZhbGlkYXRpb24gb2YgdGhlIGludGVncmF0aW9uIHRlc3Qgc25hcHNob3RzXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlZ1NuYXBzaG90UnVubmVyIGV4dGVuZHMgSW50ZWdSdW5uZXIge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBJbnRlZ1J1bm5lck9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTeW50aCB0aGUgaW50ZWdyYXRpb24gdGVzdHMgYW5kIGNvbXBhcmUgdGhlIHRlbXBsYXRlc1xuICAgKiB0byB0aGUgZXhpc3Rpbmcgc25hcHNob3QuXG4gICAqXG4gICAqIEByZXR1cm5zIGFueSBkaWFnbm9zdGljcyBhbmQgYW55IGRlc3RydWN0aXZlIGNoYW5nZXNcbiAgICovXG4gIHB1YmxpYyB0ZXN0U25hcHNob3Qob3B0aW9uczogU25hcHNob3RWZXJpZmljYXRpb25PcHRpb25zID0ge30pOiB7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10sIGRlc3RydWN0aXZlQ2hhbmdlczogRGVzdHJ1Y3RpdmVDaGFuZ2VbXSB9IHtcbiAgICBsZXQgZG9DbGVhbiA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4cGVjdGVkU25hcHNob3RBc3NlbWJseSA9IHRoaXMuZ2V0U25hcHNob3RBc3NlbWJseSh0aGlzLnNuYXBzaG90RGlyLCB0aGlzLmV4cGVjdGVkVGVzdFN1aXRlPy5zdGFja3MpO1xuXG4gICAgICAvLyBzeW50aCB0aGUgaW50ZWdyYXRpb24gdGVzdFxuICAgICAgLy8gRklYTUU6IGlkZWFsbHkgd2Ugc2hvdWxkIG5vdCBuZWVkIHRvIHJ1biB0aGlzIGFnYWluIGlmXG4gICAgICAvLyB0aGUgY2RrT3V0RGlyIGV4aXN0cyBhbHJlYWR5LCBidXQgZm9yIHNvbWUgcmVhc29uIGdlbmVyYXRlQWN0dWFsU25hcHNob3RcbiAgICAgIC8vIGdlbmVyYXRlcyBhbiBpbmNvcnJlY3Qgc25hcHNob3QgYW5kIEkgaGF2ZSBubyBpZGVhIHdoeSBzbyBzeW50aCBhZ2FpbiBoZXJlXG4gICAgICAvLyB0byBwcm9kdWNlIHRoZSBcImNvcnJlY3RcIiBzbmFwc2hvdFxuICAgICAgY29uc3QgZW52ID0ge1xuICAgICAgICAuLi5ERUZBVUxUX1NZTlRIX09QVElPTlMuZW52LFxuICAgICAgICBDREtfQ09OVEVYVF9KU09OOiBKU09OLnN0cmluZ2lmeSh0aGlzLmdldENvbnRleHQoe1xuICAgICAgICAgIC4uLnRoaXMuYWN0dWFsVGVzdFN1aXRlLmVuYWJsZUxvb2t1cHMgPyBERUZBVUxUX1NZTlRIX09QVElPTlMuY29udGV4dCA6IHt9LFxuICAgICAgICB9KSksXG4gICAgICB9O1xuICAgICAgdGhpcy5jZGsuc3ludGhGYXN0KHtcbiAgICAgICAgZXhlY0NtZDogdGhpcy5jZGtBcHAuc3BsaXQoJyAnKSxcbiAgICAgICAgZW52LFxuICAgICAgICBvdXRwdXQ6IHBhdGgucmVsYXRpdmUodGhpcy5kaXJlY3RvcnksIHRoaXMuY2RrT3V0RGlyKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyByZWFkIHRoZSBcImFjdHVhbFwiIHNuYXBzaG90XG4gICAgICBjb25zdCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5ID0gdGhpcy5nZXRTbmFwc2hvdEFzc2VtYmx5KHRoaXMuY2RrT3V0RGlyLCB0aGlzLmFjdHVhbFRlc3RTdWl0ZS5zdGFja3MpO1xuXG4gICAgICAvLyBkaWZmIHRoZSBleGlzdGluZyBzbmFwc2hvdCAoZXhwZWN0ZWQpIHdpdGggdGhlIGludGVncmF0aW9uIHRlc3QgKGFjdHVhbClcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gdGhpcy5kaWZmQXNzZW1ibHkoZXhwZWN0ZWRTbmFwc2hvdEFzc2VtYmx5LCBhY3R1YWxTbmFwc2hvdEFzc2VtYmx5KTtcblxuICAgICAgaWYgKGRpYWdub3N0aWNzLmRpYWdub3N0aWNzLmxlbmd0aCkge1xuICAgICAgICAvLyBBdHRhY2ggYWRkaXRpb25hbCBtZXNzYWdlcyB0byB0aGUgZmlyc3QgZGlhZ25vc3RpY1xuICAgICAgICBjb25zdCBhZGRpdGlvbmFsTWVzc2FnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucmV0YWluKSB7XG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLnB1c2goXG4gICAgICAgICAgICBgKEZhaWx1cmUgcmV0YWluZWQpIEV4cGVjdGVkOiAke3BhdGgucmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwgdGhpcy5zbmFwc2hvdERpcil9YCxcbiAgICAgICAgICAgIGAgICAgICAgICAgICAgICAgICAgQWN0dWFsOiAgICR7cGF0aC5yZWxhdGl2ZShwcm9jZXNzLmN3ZCgpLCB0aGlzLmNka091dERpcil9YCxcbiAgICAgICAgICApLFxuICAgICAgICAgIGRvQ2xlYW4gPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAvLyBTaG93IHRoZSBjb21tYW5kIG5lY2Vzc2FyeSB0byByZXBybyB0aGlzXG4gICAgICAgICAgY29uc3QgZW52U2V0ID0gT2JqZWN0LmVudHJpZXMoZW52KVxuICAgICAgICAgICAgLmZpbHRlcigoW2ssIF9dKSA9PiBrICE9PSAnQ0RLX0NPTlRFWFRfSlNPTicpXG4gICAgICAgICAgICAubWFwKChbaywgdl0pID0+IGAke2t9PScke3Z9J2ApO1xuICAgICAgICAgIGNvbnN0IGVudkNtZCA9IGVudlNldC5sZW5ndGggPiAwID8gWydlbnYnLCAuLi5lbnZTZXRdIDogW107XG5cbiAgICAgICAgICBhZGRpdGlvbmFsTWVzc2FnZXMucHVzaChcbiAgICAgICAgICAgICdSZXBybzonLFxuICAgICAgICAgICAgYCAgJHtbLi4uZW52Q21kLCAnY2RrIHN5bnRoJywgYC1hICcke3RoaXMuY2RrQXBwfSdgLCBgLW8gJyR7dGhpcy5jZGtPdXREaXJ9J2AsIC4uLk9iamVjdC5lbnRyaWVzKHRoaXMuZ2V0Q29udGV4dCgpKS5mbGF0TWFwKChbaywgdl0pID0+IHR5cGVvZiB2ICE9PSAnb2JqZWN0JyA/IFtgLWMgJyR7a309JHt2fSdgXSA6IFtdKV0uam9pbignICcpfWAsXG5cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0gPSB7XG4gICAgICAgICAgLi4uZGlhZ25vc3RpY3MuZGlhZ25vc3RpY3NbMF0sXG4gICAgICAgICAgYWRkaXRpb25hbE1lc3NhZ2VzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaWYgKGRvQ2xlYW4pIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGdpdmVuIGNsb3VkIGFzc2VtYmx5IHJldHVybiBhIGNvbGxlY3Rpb24gb2YgYWxsIHRlbXBsYXRlc1xuICAgKiB0aGF0IHNob3VsZCBiZSBwYXJ0IG9mIHRoZSBzbmFwc2hvdCBhbmQgYW55IHJlcXVpcmVkIG1ldGEgZGF0YS5cbiAgICpcbiAgICogQHBhcmFtIGNsb3VkQXNzZW1ibHlEaXIgVGhlIGRpcmVjdG9yeSBvZiB0aGUgY2xvdWQgYXNzZW1ibHkgdG8gbG9vayBmb3Igc25hcHNob3RzXG4gICAqIEBwYXJhbSBwaWNrU3RhY2tzIFBpY2sgb25seSB0aGVzZSBzdGFja3MgZnJvbSB0aGUgY2xvdWQgYXNzZW1ibHlcbiAgICogQHJldHVybnMgQSBTbmFwc2hvdEFzc2VtYmx5LCB0aGUgY29sbGVjdGlvbiBvZiBhbGwgdGVtcGxhdGVzIGluIHRoaXMgc25hcHNob3QgYW5kIHJlcXVpcmVkIG1ldGEgZGF0YVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRTbmFwc2hvdEFzc2VtYmx5KGNsb3VkQXNzZW1ibHlEaXI6IHN0cmluZywgcGlja1N0YWNrczogc3RyaW5nW10gPSBbXSk6IFNuYXBzaG90QXNzZW1ibHkge1xuICAgIGNvbnN0IGFzc2VtYmx5ID0gdGhpcy5yZWFkQXNzZW1ibHkoY2xvdWRBc3NlbWJseURpcik7XG4gICAgY29uc3Qgc3RhY2tzID0gYXNzZW1ibHkuc3RhY2tzO1xuICAgIGNvbnN0IHNuYXBzaG90czogU25hcHNob3RBc3NlbWJseSA9IHt9O1xuICAgIGZvciAoY29uc3QgW3N0YWNrTmFtZSwgc3RhY2tUZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3RhY2tzKSkge1xuICAgICAgaWYgKHBpY2tTdGFja3MuaW5jbHVkZXMoc3RhY2tOYW1lKSkge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIuZnJvbVBhdGgoY2xvdWRBc3NlbWJseURpcik7XG4gICAgICAgIGNvbnN0IGFzc2V0cyA9IG1hbmlmZXN0LmdldEFzc2V0SWRzRm9yU3RhY2soc3RhY2tOYW1lKTtcblxuICAgICAgICBzbmFwc2hvdHNbc3RhY2tOYW1lXSA9IHtcbiAgICAgICAgICB0ZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgIFtzdGFja05hbWVdOiBzdGFja1RlbXBsYXRlLFxuICAgICAgICAgICAgLi4uYXNzZW1ibHkuZ2V0TmVzdGVkU3RhY2tzRm9yU3RhY2soc3RhY2tOYW1lKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGFzc2V0cyxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3RzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvciBhIGdpdmVuIHN0YWNrIHJldHVybiBhbGwgcmVzb3VyY2UgdHlwZXMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBkZXN0cm95ZWRcbiAgICogYXMgcGFydCBvZiBhIHN0YWNrIHVwZGF0ZVxuICAgKlxuICAgKiBAcGFyYW0gc3RhY2tJZCB0aGUgc3RhY2sgaWRcbiAgICogQHJldHVybnMgYSBsaXN0IG9mIHJlc291cmNlIHR5cGVzIG9yIHVuZGVmaW5lZCBpZiBub25lIGFyZSBmb3VuZFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soc3RhY2tJZDogc3RyaW5nKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIGZvciAoY29uc3QgdGVzdENhc2Ugb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmFjdHVhbFRlc3RzKCkgPz8ge30pKSB7XG4gICAgICBpZiAodGVzdENhc2Uuc3RhY2tzLmluY2x1ZGVzKHN0YWNrSWQpKSB7XG4gICAgICAgIHJldHVybiB0ZXN0Q2FzZS5hbGxvd0Rlc3Ryb3k7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhbnkgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZXhpc3RpbmcgYW5kIGV4cGVjdGVkIHNuYXBzaG90c1xuICAgKlxuICAgKiBAcGFyYW0gZXhpc3RpbmcgLSB0aGUgZXhpc3RpbmcgKGV4cGVjdGVkKSBzbmFwc2hvdFxuICAgKiBAcGFyYW0gYWN0dWFsIC0gdGhlIG5ldyAoYWN0dWFsKSBzbmFwc2hvdFxuICAgKiBAcmV0dXJucyBhbnkgZGlhZ25vc3RpY3MgYW5kIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqL1xuICBwcml2YXRlIGRpZmZBc3NlbWJseShcbiAgICBleHBlY3RlZDogU25hcHNob3RBc3NlbWJseSxcbiAgICBhY3R1YWw6IFNuYXBzaG90QXNzZW1ibHksXG4gICk6IHsgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSwgZGVzdHJ1Y3RpdmVDaGFuZ2VzOiBEZXN0cnVjdGl2ZUNoYW5nZVtdIH0ge1xuICAgIGNvbnN0IGZhaWx1cmVzOiBEaWFnbm9zdGljW10gPSBbXTtcbiAgICBjb25zdCBkZXN0cnVjdGl2ZUNoYW5nZXM6IERlc3RydWN0aXZlQ2hhbmdlW10gPSBbXTtcblxuICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgQ0ZOIHRlbXBsYXRlIGluIHRoZSBjdXJyZW50IHNuYXBzaG90XG4gICAgLy8gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgIGZvciAoY29uc3QgW3N0YWNrSWQsIHN0YWNrXSBvZiBPYmplY3QuZW50cmllcyhleHBlY3RlZCkpIHtcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVJZCBvZiBPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZXMpKSB7XG4gICAgICAgIGlmICghYWN0dWFsW3N0YWNrSWRdPy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICBmYWlsdXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3ROYW1lLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RlbXBsYXRlSWR9IGV4aXN0cyBpbiBzbmFwc2hvdCwgYnV0IG5vdCBpbiBhY3R1YWxgLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBbc3RhY2tJZCwgc3RhY2tdIG9mIE9iamVjdC5lbnRyaWVzKGFjdHVhbCkpIHtcbiAgICAgIGZvciAoY29uc3QgdGVtcGxhdGVJZCBvZiBPYmplY3Qua2V5cyhzdGFjay50ZW1wbGF0ZXMpKSB7XG4gICAgICAvLyBjaGVjayBpZiB0aGVyZSBpcyBhIENGTiB0ZW1wbGF0ZSBpbiB0aGUgXCJhY3R1YWxcIiBzbmFwc2hvdFxuICAgICAgLy8gdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY3VycmVudCBzbmFwc2hvdFxuICAgICAgICBpZiAoIWV4cGVjdGVkW3N0YWNrSWRdPy50ZW1wbGF0ZXNbdGVtcGxhdGVJZF0pIHtcbiAgICAgICAgICBmYWlsdXJlcy5wdXNoKHtcbiAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3ROYW1lLFxuICAgICAgICAgICAgc3RhY2tOYW1lOiB0ZW1wbGF0ZUlkLFxuICAgICAgICAgICAgcmVhc29uOiBEaWFnbm9zdGljUmVhc29uLlNOQVBTSE9UX0ZBSUxFRCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke3RlbXBsYXRlSWR9IGRvZXMgbm90IGV4aXN0IGluIHNuYXBzaG90LCBidXQgZG9lcyBpbiBhY3R1YWxgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgICAgICAgIGRpZmZBc3NldHM6IHRoaXMuYWN0dWFsVGVzdFN1aXRlLmdldE9wdGlvbnNGb3JTdGFjayhzdGFja0lkKT8uZGlmZkFzc2V0cyxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGxldCBhY3R1YWxUZW1wbGF0ZSA9IGFjdHVhbFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG4gICAgICAgICAgbGV0IGV4cGVjdGVkVGVtcGxhdGUgPSBleHBlY3RlZFtzdGFja0lkXS50ZW1wbGF0ZXNbdGVtcGxhdGVJZF07XG5cbiAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHZlcmlmeWluZyBhc3NldCBoYXNoZXMgdGhlbiByZW1vdmUgdGhlIHNwZWNpZmljXG4gICAgICAgICAgLy8gYXNzZXQgaGFzaGVzIGZyb20gdGhlIHRlbXBsYXRlcyBzbyB0aGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZGlmZlxuICAgICAgICAgIC8vIGNvbXBhcmlzb25cbiAgICAgICAgICBpZiAoIWNvbmZpZy5kaWZmQXNzZXRzKSB7XG4gICAgICAgICAgICBhY3R1YWxUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoYWN0dWFsVGVtcGxhdGUsIGFjdHVhbFtzdGFja0lkXS5hc3NldHMpO1xuICAgICAgICAgICAgZXhwZWN0ZWRUZW1wbGF0ZSA9IHRoaXMuY2Fub25pY2FsaXplVGVtcGxhdGUoZXhwZWN0ZWRUZW1wbGF0ZSwgZXhwZWN0ZWRbc3RhY2tJZF0uYXNzZXRzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGVEaWZmID0gZGlmZlRlbXBsYXRlKGV4cGVjdGVkVGVtcGxhdGUsIGFjdHVhbFRlbXBsYXRlKTtcbiAgICAgICAgICBpZiAoIXRlbXBsYXRlRGlmZi5pc0VtcHR5KSB7XG4gICAgICAgICAgICBjb25zdCBhbGxvd2VkRGVzdHJveVR5cGVzID0gdGhpcy5nZXRBbGxvd2VkRGVzdHJveVR5cGVzRm9yU3RhY2soc3RhY2tJZCkgPz8gW107XG5cbiAgICAgICAgICAgIC8vIGdvIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZSBkaWZmZXJlbmNlcyBhbmQgY2hlY2sgZm9yIGFueVxuICAgICAgICAgICAgLy8gXCJkZXN0cnVjdGl2ZVwiIGNoYW5nZXNcbiAgICAgICAgICAgIHRlbXBsYXRlRGlmZi5yZXNvdXJjZXMuZm9yRWFjaERpZmZlcmVuY2UoKGxvZ2ljYWxJZDogc3RyaW5nLCBjaGFuZ2U6IFJlc291cmNlRGlmZmVyZW5jZSkgPT4ge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGNoYW5nZSBpcyBhIHJlbW92YWwgaXQgd2lsbCBub3Qgc2hvdyB1cCBhcyBhICdjaGFuZ2VJbXBhY3QnXG4gICAgICAgICAgICAvLyBzbyBuZWVkIHRvIGNoZWNrIGZvciBpdCBzZXBhcmF0ZWx5LCB1bmxlc3MgaXQgaXMgYSByZXNvdXJjZVR5cGUgdGhhdFxuICAgICAgICAgICAgLy8gaGFzIGJlZW4gXCJhbGxvd2VkXCIgdG8gYmUgZGVzdHJveWVkXG4gICAgICAgICAgICAgIGNvbnN0IHJlc291cmNlVHlwZSA9IGNoYW5nZS5vbGRWYWx1ZT8uVHlwZSA/PyBjaGFuZ2UubmV3VmFsdWU/LlR5cGU7XG4gICAgICAgICAgICAgIGlmIChyZXNvdXJjZVR5cGUgJiYgYWxsb3dlZERlc3Ryb3lUeXBlcy5pbmNsdWRlcyhyZXNvdXJjZVR5cGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChjaGFuZ2UuaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgaW1wYWN0OiBSZXNvdXJjZUltcGFjdC5XSUxMX0RFU1RST1ksXG4gICAgICAgICAgICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChjaGFuZ2UuY2hhbmdlSW1wYWN0KSB7XG4gICAgICAgICAgICAgICAgICBjYXNlIFJlc291cmNlSW1wYWN0Lk1BWV9SRVBMQUNFOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX09SUEhBTjpcbiAgICAgICAgICAgICAgICAgIGNhc2UgUmVzb3VyY2VJbXBhY3QuV0lMTF9ERVNUUk9ZOlxuICAgICAgICAgICAgICAgICAgY2FzZSBSZXNvdXJjZUltcGFjdC5XSUxMX1JFUExBQ0U6XG4gICAgICAgICAgICAgICAgICAgIGRlc3RydWN0aXZlQ2hhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICBpbXBhY3Q6IGNoYW5nZS5jaGFuZ2VJbXBhY3QsXG4gICAgICAgICAgICAgICAgICAgICAgbG9naWNhbElkLFxuICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTmFtZTogdGVtcGxhdGVJZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCB3cml0YWJsZSA9IG5ldyBTdHJpbmdXcml0YWJsZSh7fSk7XG4gICAgICAgICAgICBmb3JtYXREaWZmZXJlbmNlcyh3cml0YWJsZSwgdGVtcGxhdGVEaWZmKTtcbiAgICAgICAgICAgIGZhaWx1cmVzLnB1c2goe1xuICAgICAgICAgICAgICByZWFzb246IERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVELFxuICAgICAgICAgICAgICBtZXNzYWdlOiB3cml0YWJsZS5kYXRhLFxuICAgICAgICAgICAgICBzdGFja05hbWU6IHRlbXBsYXRlSWQsXG4gICAgICAgICAgICAgIHRlc3ROYW1lOiB0aGlzLnRlc3ROYW1lLFxuICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZGlhZ25vc3RpY3M6IGZhaWx1cmVzLFxuICAgICAgZGVzdHJ1Y3RpdmVDaGFuZ2VzLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlYWRBc3NlbWJseShkaXI6IHN0cmluZyk6IEFzc2VtYmx5TWFuaWZlc3RSZWFkZXIge1xuICAgIHJldHVybiBBc3NlbWJseU1hbmlmZXN0UmVhZGVyLmZyb21QYXRoKGRpcik7XG4gIH1cblxuICAvKipcbiAgKiBSZWR1Y2UgdGVtcGxhdGUgdG8gYSBub3JtYWwgZm9ybSB3aGVyZSBhc3NldCByZWZlcmVuY2VzIGhhdmUgYmVlbiBub3JtYWxpemVkXG4gICpcbiAgKiBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNvbXBhcmUgdGVtcGxhdGVzIGlmIGFsbCB0aGF0J3MgZGlmZmVyZW50IGJldHdlZW5cbiAgKiB0aGVtIGlzIHRoZSBoYXNoZXMgb2YgdGhlIGFzc2V0IHZhbHVlcy5cbiAgKi9cbiAgcHJpdmF0ZSBjYW5vbmljYWxpemVUZW1wbGF0ZSh0ZW1wbGF0ZTogYW55LCBhc3NldHM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBjb25zdCBhc3NldHNTZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3RyaW5nU3Vic3RpdHV0aW9ucyA9IG5ldyBBcnJheTxbUmVnRXhwLCBzdHJpbmddPigpO1xuXG4gICAgLy8gRmluZCBhc3NldHMgdmlhIHBhcmFtZXRlcnMgKGZvciBMZWdhY3lTdGFja1N5bnRoZXNpemVyKVxuICAgIGNvbnN0IHBhcmFtUmUgPSAvXkFzc2V0UGFyYW1ldGVycyhbYS16QS1aMC05XXs2NH0pKFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KSQvO1xuICAgIGZvciAoY29uc3QgcGFyYW1OYW1lIG9mIE9iamVjdC5rZXlzKHRlbXBsYXRlPy5QYXJhbWV0ZXJzIHx8IHt9KSkge1xuICAgICAgY29uc3QgbSA9IHBhcmFtUmUuZXhlYyhwYXJhbU5hbWUpO1xuICAgICAgaWYgKCFtKSB7IGNvbnRpbnVlOyB9XG4gICAgICBpZiAoYXNzZXRzU2Vlbi5oYXMobVsxXSkpIHsgY29udGludWU7IH1cblxuICAgICAgYXNzZXRzU2Vlbi5hZGQobVsxXSk7XG4gICAgICBjb25zdCBpeCA9IGFzc2V0c1NlZW4uc2l6ZTtcblxuICAgICAgLy8gRnVsbCBwYXJhbWV0ZXIgcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGBBc3NldFBhcmFtZXRlcnMke21bMV19KFMzQnVja2V0fFMzVmVyc2lvbktleXxBcnRpZmFjdEhhc2gpKFthLXpBLVowLTldezh9KWApLFxuICAgICAgICBgQXNzZXQke2l4fSQxYCxcbiAgICAgIF0pO1xuICAgICAgLy8gU3Vic3RyaW5nIGFzc2V0IGhhc2ggcmVmZXJlbmNlXG4gICAgICBzdHJpbmdTdWJzdGl0dXRpb25zLnB1c2goW1xuICAgICAgICBuZXcgUmVnRXhwKGAke21bMV19YCksXG4gICAgICAgIGBBc3NldCR7aXh9SGFzaGAsXG4gICAgICBdKTtcbiAgICB9XG5cbiAgICAvLyBmaW5kIGFzc2V0cyBkZWZpbmVkIGluIHRoZSBhc3NldCBtYW5pZmVzdFxuICAgIHRyeSB7XG4gICAgICBhc3NldHMuZm9yRWFjaChhc3NldCA9PiB7XG4gICAgICAgIGlmICghYXNzZXRzU2Vlbi5oYXMoYXNzZXQpKSB7XG4gICAgICAgICAgYXNzZXRzU2Vlbi5hZGQoYXNzZXQpO1xuICAgICAgICAgIGNvbnN0IGl4ID0gYXNzZXRzU2Vlbi5zaXplO1xuICAgICAgICAgIHN0cmluZ1N1YnN0aXR1dGlvbnMucHVzaChbXG4gICAgICAgICAgICBuZXcgUmVnRXhwKGFzc2V0KSxcbiAgICAgICAgICAgIGBBc3NldCR7aXh9JDFgLFxuICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGFzc2V0IG1hbmlmZXN0IHRoYXQgaXMgZmluZS5cbiAgICB9XG5cbiAgICAvLyBTdWJzdGl0dXRlIHRoZW0gb3V0XG4gICAgcmV0dXJuIHN1YnN0aXR1dGUodGVtcGxhdGUpO1xuXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZSh3aGF0OiBhbnkpOiBhbnkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkod2hhdCkpIHtcbiAgICAgICAgcmV0dXJuIHdoYXQubWFwKHN1YnN0aXR1dGUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIHdoYXQgPT09ICdvYmplY3QnICYmIHdoYXQgIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgcmV0OiBhbnkgPSB7fTtcbiAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMod2hhdCkpIHtcbiAgICAgICAgICByZXRbc3RyaW5nU3ViKGspXSA9IHN1YnN0aXR1dGUodik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiB3aGF0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gc3RyaW5nU3ViKHdoYXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2hhdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTdWIoeDogc3RyaW5nKSB7XG4gICAgICBmb3IgKGNvbnN0IFtyZSwgcmVwbGFjZW1lbnRdIG9mIHN0cmluZ1N1YnN0aXR1dGlvbnMpIHtcbiAgICAgICAgeCA9IHgucmVwbGFjZShyZSwgcmVwbGFjZW1lbnQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFN0cmluZ1dyaXRhYmxlIGV4dGVuZHMgV3JpdGFibGUge1xuICBwdWJsaWMgZGF0YTogc3RyaW5nO1xuICBwcml2YXRlIF9kZWNvZGVyOiBTdHJpbmdEZWNvZGVyO1xuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBXcml0YWJsZU9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICB0aGlzLl9kZWNvZGVyID0gbmV3IFN0cmluZ0RlY29kZXIoKTtcbiAgICB0aGlzLmRhdGEgPSAnJztcbiAgfVxuXG4gIF93cml0ZShjaHVuazogYW55LCBlbmNvZGluZzogc3RyaW5nLCBjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgaWYgKGVuY29kaW5nID09PSAnYnVmZmVyJykge1xuICAgICAgY2h1bmsgPSB0aGlzLl9kZWNvZGVyLndyaXRlKGNodW5rKTtcbiAgICB9XG5cbiAgICB0aGlzLmRhdGEgKz0gY2h1bms7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxuXG4gIF9maW5hbChjYWxsYmFjazogKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhICs9IHRoaXMuX2RlY29kZXIuZW5kKCk7XG4gICAgY2FsbGJhY2soKTtcbiAgfVxufVxuIl19
|
package/lib/utils.js
CHANGED
|
@@ -73,6 +73,7 @@ class WorkList {
|
|
|
73
73
|
}
|
|
74
74
|
done() {
|
|
75
75
|
this.remaining.clear();
|
|
76
|
+
this.stopTimer();
|
|
76
77
|
}
|
|
77
78
|
stopTimer() {
|
|
78
79
|
if (this.timer) {
|
|
@@ -89,4 +90,4 @@ class WorkList {
|
|
|
89
90
|
}
|
|
90
91
|
}
|
|
91
92
|
exports.WorkList = WorkList;
|
|
92
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
93
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ1dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnQ0FBZ0M7QUFDaEMsaURBQTBDO0FBRTFDOztHQUVHO0FBQ0gsU0FBZ0IsSUFBSSxDQUFDLFdBQXFCLEVBQUUsVUFBMEQsRUFBRztJQUN2RyxNQUFNLElBQUksR0FBRyx5QkFBUyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNELEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDL0QsR0FBRyxFQUFFO1lBQ0gsR0FBRyxPQUFPLENBQUMsR0FBRztZQUNkLEdBQUcsT0FBTyxDQUFDLEdBQUc7U0FDZjtRQUNELEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRztLQUNqQixDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7S0FBRTtJQUNyQyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLGlDQUFpQztZQUNyRCxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDbkM7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHVCQUF1QixJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzNHO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFcEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQXJCRCxvQkFxQkM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE9BQU8sQ0FBSSxFQUFTO0lBQ2xDLE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRkQsMEJBRUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLEtBQUssQ0FBQyxRQUFrQjtJQUN0QyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFGRCxzQkFFQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsTUFBTSxDQUFDLE9BQWU7SUFDcEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sTUFBTSxhQUFOLE1BQU0sY0FBTixNQUFNLEdBQUksRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFIRCx3QkFHQztBQUdEOzs7O0dBSUc7QUFDSCxNQUFhLFFBQVE7SUFLbkIsWUFBNkIsS0FBVSxFQUFtQixVQUE4QixFQUFFOztRQUE3RCxVQUFLLEdBQUwsS0FBSyxDQUFLO1FBQW1CLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBSnpFLGNBQVMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFLL0MsSUFBSSxDQUFDLE9BQU8sU0FBRyxPQUFPLENBQUMsT0FBTyxtQ0FBSSxLQUFNLENBQUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFTSxRQUFRLENBQUMsSUFBTztRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQ3RCO0lBQ0gsQ0FBQztJQUVNLElBQUk7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRU8sU0FBUztRQUNmLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7U0FDeEI7SUFDSCxDQUFDO0lBRU8sYUFBYTtRQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFTyxNQUFNOztRQUNaLE1BQUEsTUFBQSxJQUFJLENBQUMsT0FBTyxFQUFDLFNBQVMsbURBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRTtJQUMzQyxDQUFDO0NBQ0Y7QUFyQ0QsNEJBcUNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgQ0RLIEV4ZWNcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuXG4vKipcbiAqIE91ciBvd24gZXhlY3V0ZSBmdW5jdGlvbiB3aGljaCBkb2Vzbid0IHVzZSBzaGVsbHMgYW5kIHN0cmluZ3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjKGNvbW1hbmRMaW5lOiBzdHJpbmdbXSwgb3B0aW9uczogeyBjd2Q/OiBzdHJpbmcsIHZlcmJvc2U/OiBib29sZWFuLCBlbnY/OiBhbnkgfSA9IHsgfSk6IGFueSB7XG4gIGNvbnN0IHByb2MgPSBzcGF3blN5bmMoY29tbWFuZExpbmVbMF0sIGNvbW1hbmRMaW5lLnNsaWNlKDEpLCB7XG4gICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCBvcHRpb25zLnZlcmJvc2UgPyAnaW5oZXJpdCcgOiAncGlwZSddLCAvLyBpbmhlcml0IFNUREVSUiBpbiB2ZXJib3NlIG1vZGVcbiAgICBlbnY6IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgLi4ub3B0aW9ucy5lbnYsXG4gICAgfSxcbiAgICBjd2Q6IG9wdGlvbnMuY3dkLFxuICB9KTtcblxuICBpZiAocHJvYy5lcnJvcikgeyB0aHJvdyBwcm9jLmVycm9yOyB9XG4gIGlmIChwcm9jLnN0YXR1cyAhPT0gMCkge1xuICAgIGlmIChwcm9jZXNzLnN0ZGVycikgeyAvLyB3aWxsIGJlICdudWxsJyBpbiB2ZXJib3NlIG1vZGVcbiAgICAgIHByb2Nlc3Muc3RkZXJyLndyaXRlKHByb2Muc3RkZXJyKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb21tYW5kIGV4aXRlZCB3aXRoICR7cHJvYy5zdGF0dXMgPyBgc3RhdHVzICR7cHJvYy5zdGF0dXN9YCA6IGBzaWduYWwgJHtwcm9jLnNpZ25hbH1gfWApO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0ID0gcHJvYy5zdGRvdXQudG9TdHJpbmcoJ3V0Zi04JykudHJpbSgpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogRmxhdHRlbiBhIGxpc3Qgb2YgbGlzdHMgaW50byBhIGxpc3Qgb2YgZWxlbWVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsYXR0ZW48VD4oeHM6IFRbXVtdKTogVFtdIHtcbiAgcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sIHhzKTtcbn1cblxuLyoqXG4gKiBDaGFpbiBjb21tYW5kc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhaW4oY29tbWFuZHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvbW1hbmRzLmZpbHRlcihjID0+ICEhYykuam9pbignICYmICcpO1xufVxuXG4vKipcbiAqIFNwbGl0IGNvbW1hbmQgdG8gY2h1bmtzIGJ5IHNwYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaHVua3MoY29tbWFuZDogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBjb21tYW5kLm1hdGNoKC8oPzpbXlxcc1wiXSt8XCJbXlwiXSpcIikrL2cpO1xuICByZXR1cm4gcmVzdWx0ID8/IFtdO1xufVxuXG5cbi8qKlxuICogQSBjbGFzcyBob2xkaW5nIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGFyZSBiZWluZyBjcm9zc2VkIG9mZiBpbiB0aW1lXG4gKlxuICogSWYgaXQgdGFrZXMgdG9vIGxvbmcgdG8gY3Jvc3Mgb2ZmIGEgbmV3IGl0ZW0sIHByaW50IHRoZSBsaXN0LlxuICovXG5leHBvcnQgY2xhc3MgV29ya0xpc3Q8QT4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlbWFpbmluZyA9IG5ldyBTZXQodGhpcy5pdGVtcyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyO1xuICBwcml2YXRlIHRpbWVyPzogTm9kZUpTLlRpbWVvdXQ7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpdGVtczogQVtdLCBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IFdvcmtMaXN0T3B0aW9uczxBPiA9IHt9KSB7XG4gICAgdGhpcy50aW1lb3V0ID0gb3B0aW9ucy50aW1lb3V0ID8/IDYwXzAwMDtcbiAgICB0aGlzLnNjaGVkdWxlVGltZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjcm9zc09mZihpdGVtOiBBKSB7XG4gICAgdGhpcy5yZW1haW5pbmcuZGVsZXRlKGl0ZW0pO1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gICAgaWYgKHRoaXMucmVtYWluaW5nLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlVGltZXIoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG9uZSgpIHtcbiAgICB0aGlzLnJlbWFpbmluZy5jbGVhcigpO1xuICAgIHRoaXMuc3RvcFRpbWVyKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BUaW1lcigpIHtcbiAgICBpZiAodGhpcy50aW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZXIpO1xuICAgICAgdGhpcy50aW1lciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNjaGVkdWxlVGltZXIoKSB7XG4gICAgdGhpcy50aW1lciA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5yZXBvcnQoKSwgdGhpcy50aW1lb3V0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVwb3J0KCkge1xuICAgIHRoaXMub3B0aW9ucy5vblRpbWVvdXQ/Lih0aGlzLnJlbWFpbmluZyk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrTGlzdE9wdGlvbnM8QT4ge1xuICAvKipcbiAgICogV2hlbiB0byByZXBseSB3aXRoIHJlbWFpbmluZyBpdGVtc1xuICAgKlxuICAgKiBAZGVmYXVsdCA2MDAwMFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRpbWVvdXQgaGl0c1xuICAgKi9cbiAgcmVhZG9ubHkgb25UaW1lb3V0PzogKHg6IFNldDxBPikgPT4gdm9pZDtcbn0iXX0=
|
package/lib/workers/common.d.ts
CHANGED
|
@@ -191,6 +191,10 @@ export interface Diagnostic {
|
|
|
191
191
|
* The name of the test
|
|
192
192
|
*/
|
|
193
193
|
readonly testName: string;
|
|
194
|
+
/**
|
|
195
|
+
* The name of the stack
|
|
196
|
+
*/
|
|
197
|
+
readonly stackName: string;
|
|
194
198
|
/**
|
|
195
199
|
* The diagnostic message
|
|
196
200
|
*/
|
|
@@ -207,6 +211,10 @@ export interface Diagnostic {
|
|
|
207
211
|
* Additional messages to print
|
|
208
212
|
*/
|
|
209
213
|
readonly additionalMessages?: string[];
|
|
214
|
+
/**
|
|
215
|
+
* Relevant config options that were used for the integ test
|
|
216
|
+
*/
|
|
217
|
+
readonly config?: Record<string, any>;
|
|
210
218
|
}
|
|
211
219
|
export declare function printSummary(total: number, failed: number): void;
|
|
212
220
|
/**
|
package/lib/workers/common.js
CHANGED
|
@@ -106,4 +106,4 @@ function printLaggards(testNames) {
|
|
|
106
106
|
logger.print(chalk.grey(parts.filter(x => x).join(' ')));
|
|
107
107
|
}
|
|
108
108
|
exports.printLaggards = printLaggards;
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUU5QiwrQkFBK0I7QUFDL0Isb0NBQW9DO0FBbUtwQzs7R0FFRztBQUNILElBQVksZ0JBMENYO0FBMUNELFdBQVksZ0JBQWdCO0lBQzFCOzs7T0FHRztJQUNILCtDQUEyQixDQUFBO0lBRTNCOztPQUVHO0lBQ0gsK0NBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCw2Q0FBeUIsQ0FBQTtJQUV6Qjs7O09BR0c7SUFDSCx1REFBbUMsQ0FBQTtJQUVuQzs7T0FFRztJQUNILHFEQUFpQyxDQUFBO0lBRWpDOztPQUVHO0lBQ0gseURBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxpREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILHlEQUFxQyxDQUFBO0FBQ3ZDLENBQUMsRUExQ1csZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUEwQzNCO0FBaUNELFNBQWdCLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUN4RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVHO1NBQU07UUFDTCxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQy9HO0FBQ0gsQ0FBQztBQU5ELG9DQU1DO0FBRUQ7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U0FBc0I7SUFDbEQsTUFBTSxLQUFLLEdBQUc7UUFDWixJQUFJO1FBQ0osZUFBZSxTQUFTLENBQUMsSUFBSSxPQUFPO1FBQ3BDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDakYsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBUkQsc0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IFJlc291cmNlSW1wYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IEludGVnVGVzdEluZm8gfSBmcm9tICcuLi9ydW5uZXIvaW50ZWdyYXRpb24tdGVzdHMnO1xuXG4vKipcbiAqIFRoZSBhZ2dyZWdhdGUgcmVzdWx0cyBmcm9tIHJ1bm5pbmcgYXNzZXJ0aW9ucyBvbiBhIHRlc3QgY2FzZVxuICovXG5leHBvcnQgdHlwZSBBc3NlcnRpb25SZXN1bHRzID0geyBbaWQ6IHN0cmluZ106IEFzc2VydGlvblJlc3VsdCB9O1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYW4gaW5kaXZpZHVhbCBhc3NlcnRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NlcnRpb25SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGFzc2VydGlvbiBtZXNzYWdlLiBJZiB0aGUgYXNzZXJ0aW9uIGZhaWxlZCwgdGhpcyB3aWxsXG4gICAqIGluY2x1ZGUgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogJ3N1Y2Nlc3MnIHwgJ2ZhaWwnO1xufVxuXG4vKipcbiAqIENvbmZpZyBmb3IgYW4gaW50ZWdyYXRpb24gdGVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVnVGVzdFdvcmtlckNvbmZpZyBleHRlbmRzIEludGVnVGVzdEluZm8ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBkZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJ1Y3RpdmVDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGxvZ2ljYWxJZCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCBhIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFjayB0aGF0IGNvbnRhaW5zIHRoZSBkZXN0cnVjdGl2ZSBjaGFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1wYWN0IG9mIHRoZSBkZXN0cnVjdGl2ZSBjaGFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltcGFjdDogUmVzb3VyY2VJbXBhY3Q7XG59XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGludGVncmF0aW9uIHRlc3RzIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gd29ya2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdSdW5uZXJNZXRyaWNzIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHRlc3Qgd2FzIHJ1biBpblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgd29ya2VyLlxuICAgKiBUaGlzIHdpbGwgYmUgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCB0ZXN0IGR1cmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogQ29udGFpbnMgdGhlIGR1cmF0aW9uIG9mIGluZGl2aWR1YWwgdGVzdHMgdGhhdCB0aGVcbiAgICogd29ya2VyIGV4ZWN1dGVkLlxuICAgKlxuICAgKiBNYXAgb2YgdGVzdE5hbWUgdG8gZHVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0ZXN0czogeyBbdGVzdE5hbWU6IHN0cmluZ106IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgdGVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgcHJvZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogUmV0YWluIGZhaWxlZCBzbmFwc2hvdCBjb21wYXJpc29uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0YWluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVmVyYm9zZSBtb2RlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlZ0JhdGNoUmVzcG9uc2Uge1xuICAvKipcbiAgICogTGlzdCBvZiBmYWlsZWQgdGVzdHNcbiAgICovXG4gIHJlYWRvbmx5IGZhaWxlZFRlc3RzOiBJbnRlZ1Rlc3RJbmZvW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgSW50ZWdyYXRpb24gdGVzdCBtZXRyaWNzLiBFYWNoIGVudHJ5IGluIHRoZVxuICAgKiBsaXN0IHJlcHJlc2VudHMgbWV0cmljcyBmcm9tIGEgc2luZ2xlIHdvcmtlciAoYWNjb3VudCArIHJlZ2lvbikuXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNzOiBJbnRlZ1J1bm5lck1ldHJpY3NbXTtcbn1cblxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBmb3IgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVnVGVzdE9wdGlvbnMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVncmF0aW9uIHRlc3RzIHRvIHJ1blxuICAgKiBpbiB0aGlzIGJhdGNoXG4gICAqL1xuICByZWFkb25seSB0ZXN0czogSW50ZWdUZXN0V29ya2VyQ29uZmlnW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRlc3Ryb3kgdGhlIHN0YWNrcyBhdCB0aGVcbiAgICogZW5kIG9mIHRoZSB0ZXN0XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAgdGhlIHNuYXBzaG90IHdpbGxcbiAgICogYmUgY3JlYXRlZCBfd2l0aG91dF8gcnVubmluZyB0aGUgaW50ZWdyYXRpb24gdGVzdFxuICAgKiBUaGUgcmVzdWx0aW5nIHNuYXBzaG90IFNIT1VMRCBOT1QgYmUgY2hlY2tlZCBpblxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZHJ5UnVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxldmVsIG9mIHZlcmJvc2l0eSBmb3IgbG9nZ2luZy5cbiAgICogSGlnaGVyIG51bWJlciBtZWFucyBtb3JlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYm9zaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdGhlIHN0YWNrIHVwZGF0ZSB3b3JrZmxvdyB3aWxsIGJlIGRpc2FibGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHBvc3NpYmxlIHJlYXNvbnMgZm9yIGEgZGlhZ25vc3RpY1xuICovXG5leHBvcnQgZW51bSBEaWFnbm9zdGljUmVhc29uIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZXJlXG4gICAqIGlzIG5vdCBleGlzdGluZyBzbmFwc2hvdFxuICAgKi9cbiAgTk9fU05BUFNIT1QgPSAnTk9fU05BUFNIT1QnLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGVzdCBmYWlsZWRcbiAgICovXG4gIFRFU1RfRkFJTEVEID0gJ1RFU1RfRkFJTEVEJyxcblxuICAvKipcbiAgICogVGhlcmUgd2FzIGFuIGVycm9yIHJ1bm5pbmcgdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICovXG4gIFRFU1RfRVJST1IgPSAnVEVTVF9FUlJPUicsXG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZSBhY3R1YWxcbiAgICogc25hcHNob3Qgd2FzIGRpZmZlcmVudCB0aGFuIHRoZSBleHBlY3RlZCBzbmFwc2hvdFxuICAgKi9cbiAgU05BUFNIT1RfRkFJTEVEID0gJ1NOQVBTSE9UX0ZBSUxFRCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZXJlIHdhcyBhbiBlcnJvciBleGVjdXRpbmcgaXRcbiAgICovXG4gIFNOQVBTSE9UX0VSUk9SID0gJ1NOQVBTSE9UX0VSUk9SJyxcblxuICAvKipcbiAgICogVGhlIHNuYXBzaG90IHRlc3Qgc3VjY2VlZGVkXG4gICAqL1xuICBTTkFQU0hPVF9TVUNDRVNTID0gJ1NOQVBTSE9UX1NVQ0NFU1MnLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGVzdCBzdWNjZWVkZWRcbiAgICovXG4gIFRFU1RfU1VDQ0VTUyA9ICdURVNUX1NVQ0NFU1MnLFxuXG4gIC8qKlxuICAgKiBUaGUgYXNzZXJ0aW9uIGZhaWxlZFxuICAgKi9cbiAgQVNTRVJUSU9OX0ZBSUxFRCA9ICdBU1NFUlRJT05fRkFJTEVEJyxcbn1cblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IGRpYWdub3N0aWNzXG4gKiBUaGlzIGlzIHVzZWQgdG8gcmVwb3J0IGJhY2sgdGhlIHN0YXR1cyBvZiBlYWNoIHRlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICByZWFkb25seSB0ZXN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGl0IHRvb2sgdG8gcnVuIHRoZSB0ZXN0XG4gICAqL1xuICByZWFkb25seSBkdXJhdGlvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiBmb3IgdGhlIGRpYWdub3N0aWNcbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtZXNzYWdlcyB0byBwcmludFxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbE1lc3NhZ2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN1bW1hcnkodG90YWw6IG51bWJlciwgZmFpbGVkOiBudW1iZXIpOiB2b2lkIHtcbiAgaWYgKGZhaWxlZCA+IDApIHtcbiAgICBsb2dnZXIucHJpbnQoJyVzOiAgICAlcyAlcywgJXMgdG90YWwnLCBjaGFsay5ib2xkKCdUZXN0cycpLCBjaGFsay5yZWQoZmFpbGVkKSwgY2hhbGsucmVkKCdmYWlsZWQnKSwgdG90YWwpO1xuICB9IGVsc2Uge1xuICAgIGxvZ2dlci5wcmludCgnJXM6ICAgICVzICVzLCAlcyB0b3RhbCcsIGNoYWxrLmJvbGQoJ1Rlc3RzJyksIGNoYWxrLmdyZWVuKHRvdGFsKSwgY2hhbGsuZ3JlZW4oJ3Bhc3NlZCcpLCB0b3RhbCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgdGhlIGFzc2VydGlvbiByZXN1bHRzIHNvIHRoYXQgdGhlIHJlc3VsdHMgY2FuIGJlXG4gKiBwcmludGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBc3NlcnRpb25SZXN1bHRzKHJlc3VsdHM6IEFzc2VydGlvblJlc3VsdHMpOiBzdHJpbmcge1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMocmVzdWx0cylcbiAgICAubWFwKChbaWQsIHJlc3VsdF0pID0+IGZvcm1hdCgnJXMlcycsIGlkLCByZXN1bHQuc3RhdHVzID09PSAnc3VjY2VzcycgPyBgIC0gJHtyZXN1bHQuc3RhdHVzfWAgOiBgXFxuJHtyZXN1bHQubWVzc2FnZX1gKSlcbiAgICAuam9pbignXFxuICAgICAgJyk7XG59XG5cbi8qKlxuICogUHJpbnQgb3V0IHRoZSByZXN1bHRzIGZyb20gdGVzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaW50UmVzdWx0cyhkaWFnbm9zdGljOiBEaWFnbm9zdGljKTogdm9pZCB7XG4gIHN3aXRjaCAoZGlhZ25vc3RpYy5yZWFzb24pIHtcbiAgICBjYXNlIERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfU1VDQ0VTUzpcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCcgIFVOQ0hBTkdFRCAgJXMgJXMnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5URVNUX1NVQ0NFU1M6XG4gICAgICBsb2dnZXIuc3VjY2VzcygnICBTVUNDRVNTICAgICVzICVzXFxuICAgICAgJywgZGlhZ25vc3RpYy50ZXN0TmFtZSwgY2hhbGsuZ3JheShgJHtkaWFnbm9zdGljLmR1cmF0aW9ufXNgKSwgZGlhZ25vc3RpYy5tZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5OT19TTkFQU0hPVDpcbiAgICAgIGxvZ2dlci5lcnJvcignICBORVcgICAgICAgICVzICVzJywgZGlhZ25vc3RpYy50ZXN0TmFtZSwgY2hhbGsuZ3JheShgJHtkaWFnbm9zdGljLmR1cmF0aW9ufXNgKSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRkFJTEVEOlxuICAgICAgbG9nZ2VyLmVycm9yKCcgIENIQU5HRUQgICAgJXMgJXNcXG4gICAgICAlcycsIGRpYWdub3N0aWMudGVzdE5hbWUsIGNoYWxrLmdyYXkoYCR7ZGlhZ25vc3RpYy5kdXJhdGlvbn1zYCksIGRpYWdub3N0aWMubWVzc2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERpYWdub3N0aWNSZWFzb24uU05BUFNIT1RfRVJST1I6XG4gICAgY2FzZSBEaWFnbm9zdGljUmVhc29uLlRFU1RfRVJST1I6XG4gICAgICBsb2dnZXIuZXJyb3IoJyAgRVJST1IgICAgICAlcyAlc1xcbiAgICAgICVzJywgZGlhZ25vc3RpYy50ZXN0TmFtZSwgY2hhbGsuZ3JheShgJHtkaWFnbm9zdGljLmR1cmF0aW9ufXNgKSwgZGlhZ25vc3RpYy5tZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5URVNUX0ZBSUxFRDpcbiAgICAgIGxvZ2dlci5lcnJvcignICBGQUlMRUQgICAgICVzICVzXFxuICAgICAgJXMnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApLCBkaWFnbm9zdGljLm1lc3NhZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaWFnbm9zdGljUmVhc29uLkFTU0VSVElPTl9GQUlMRUQ6XG4gICAgICBsb2dnZXIuZXJyb3IoJyAgQVNTRVJUICAgICAlcyAlc1xcbiAgICAgICVzJywgZGlhZ25vc3RpYy50ZXN0TmFtZSwgY2hhbGsuZ3JheShgJHtkaWFnbm9zdGljLmR1cmF0aW9ufXNgKSwgZGlhZ25vc3RpYy5tZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGZvciAoY29uc3QgYWRkbCBvZiBkaWFnbm9zdGljLmFkZGl0aW9uYWxNZXNzYWdlcyA/PyBbXSkge1xuICAgIGxvZ2dlci5wcmludChgICAgICAgJHthZGRsfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludExhZ2dhcmRzKHRlc3ROYW1lczogU2V0PHN0cmluZz4pIHtcbiAgY29uc3QgcGFydHMgPSBbXG4gICAgJyAgJyxcbiAgICBgV2FpdGluZyBmb3IgJHt0ZXN0TmFtZXMuc2l6ZX0gbW9yZWAsXG4gICAgdGVzdE5hbWVzLnNpemUgPCAxMCA/IFsnKCcsIEFycmF5LmZyb20odGVzdE5hbWVzKS5qb2luKCcsICcpLCAnKSddLmpvaW4oJycpIDogJycsXG4gIF07XG5cbiAgbG9nZ2VyLnByaW50KGNoYWxrLmdyZXkocGFydHMuZmlsdGVyKHggPT4geCkuam9pbignICcpKSk7XG59XG4iXX0=
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtCQUE4QjtBQUU5QiwrQkFBK0I7QUFDL0Isb0NBQW9DO0FBbUtwQzs7R0FFRztBQUNILElBQVksZ0JBMENYO0FBMUNELFdBQVksZ0JBQWdCO0lBQzFCOzs7T0FHRztJQUNILCtDQUEyQixDQUFBO0lBRTNCOztPQUVHO0lBQ0gsK0NBQTJCLENBQUE7SUFFM0I7O09BRUc7SUFDSCw2Q0FBeUIsQ0FBQTtJQUV6Qjs7O09BR0c7SUFDSCx1REFBbUMsQ0FBQTtJQUVuQzs7T0FFRztJQUNILHFEQUFpQyxDQUFBO0lBRWpDOztPQUVHO0lBQ0gseURBQXFDLENBQUE7SUFFckM7O09BRUc7SUFDSCxpREFBNkIsQ0FBQTtJQUU3Qjs7T0FFRztJQUNILHlEQUFxQyxDQUFBO0FBQ3ZDLENBQUMsRUExQ1csZ0JBQWdCLEdBQWhCLHdCQUFnQixLQUFoQix3QkFBZ0IsUUEwQzNCO0FBMkNELFNBQWdCLFlBQVksQ0FBQyxLQUFhLEVBQUUsTUFBYztJQUN4RCxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVHO1NBQU07UUFDTCxNQUFNLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQy9HO0FBQ0gsQ0FBQztBQU5ELG9DQU1DO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsT0FBeUI7SUFDOUQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUMzQixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsYUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3RILElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN0QixDQUFDO0FBSkQsd0RBSUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFlBQVksQ0FBQyxVQUFzQjs7SUFDakQsUUFBUSxVQUFVLENBQUMsTUFBTSxFQUFFO1FBQ3pCLEtBQUssZ0JBQWdCLENBQUMsZ0JBQWdCO1lBQ3BDLE1BQU0sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNqRyxNQUFNO1FBQ1IsS0FBSyxnQkFBZ0IsQ0FBQyxZQUFZO1lBQ2hDLE1BQU0sQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdILE1BQU07UUFDUixLQUFLLGdCQUFnQixDQUFDLFdBQVc7WUFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQy9GLE1BQU07UUFDUixLQUFLLGdCQUFnQixDQUFDLGVBQWU7WUFDbkMsTUFBTSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsRUFBRSxVQUFVLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsRUFBRSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDN0gsTUFBTTtRQUNSLEtBQUssZ0JBQWdCLENBQUMsY0FBYyxDQUFDO1FBQ3JDLEtBQUssZ0JBQWdCLENBQUMsVUFBVTtZQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3SCxNQUFNO1FBQ1IsS0FBSyxnQkFBZ0IsQ0FBQyxXQUFXO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLEVBQUUsVUFBVSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLFFBQVEsR0FBRyxDQUFDLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzdILE1BQU07UUFDUixLQUFLLGdCQUFnQixDQUFDLGdCQUFnQjtZQUNwQyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM3SCxNQUFNO0tBQ1Q7SUFDRCxLQUFLLE1BQU0sSUFBSSxVQUFJLFVBQVUsQ0FBQyxrQkFBa0IsbUNBQUksRUFBRSxFQUFFO1FBQ3RELE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQy9CO0FBQ0gsQ0FBQztBQTVCRCxvQ0E0QkM7QUFFRCxTQUFnQixhQUFhLENBQUMsU0FBc0I7SUFDbEQsTUFBTSxLQUFLLEdBQUc7UUFDWixJQUFJO1FBQ0osZUFBZSxTQUFTLENBQUMsSUFBSSxPQUFPO1FBQ3BDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7S0FDakYsQ0FBQztJQUVGLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBUkQsc0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JtYXQgfSBmcm9tICd1dGlsJztcbmltcG9ydCB7IFJlc291cmNlSW1wYWN0IH0gZnJvbSAnQGF3cy1jZGsvY2xvdWRmb3JtYXRpb24tZGlmZic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBsb2dnZXIgZnJvbSAnLi4vbG9nZ2VyJztcbmltcG9ydCB7IEludGVnVGVzdEluZm8gfSBmcm9tICcuLi9ydW5uZXIvaW50ZWdyYXRpb24tdGVzdHMnO1xuXG4vKipcbiAqIFRoZSBhZ2dyZWdhdGUgcmVzdWx0cyBmcm9tIHJ1bm5pbmcgYXNzZXJ0aW9ucyBvbiBhIHRlc3QgY2FzZVxuICovXG5leHBvcnQgdHlwZSBBc3NlcnRpb25SZXN1bHRzID0geyBbaWQ6IHN0cmluZ106IEFzc2VydGlvblJlc3VsdCB9O1xuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgYW4gaW5kaXZpZHVhbCBhc3NlcnRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NlcnRpb25SZXN1bHQge1xuICAvKipcbiAgICogVGhlIGFzc2VydGlvbiBtZXNzYWdlLiBJZiB0aGUgYXNzZXJ0aW9uIGZhaWxlZCwgdGhpcyB3aWxsXG4gICAqIGluY2x1ZGUgdGhlIHJlYXNvbi5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgYXNzZXJ0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWRcbiAgICovXG4gIHJlYWRvbmx5IHN0YXR1czogJ3N1Y2Nlc3MnIHwgJ2ZhaWwnO1xufVxuXG4vKipcbiAqIENvbmZpZyBmb3IgYW4gaW50ZWdyYXRpb24gdGVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVnVGVzdFdvcmtlckNvbmZpZyBleHRlbmRzIEludGVnVGVzdEluZm8ge1xuICAvKipcbiAgICogQSBsaXN0IG9mIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IFtdXG4gICAqL1xuICByZWFkb25seSBkZXN0cnVjdGl2ZUNoYW5nZXM/OiBEZXN0cnVjdGl2ZUNoYW5nZVtdO1xufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGFueSBkZXN0cnVjdGl2ZSBjaGFuZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVzdHJ1Y3RpdmVDaGFuZ2Uge1xuICAvKipcbiAgICogVGhlIGxvZ2ljYWxJZCBvZiB0aGUgcmVzb3VyY2Ugd2l0aCBhIGRlc3RydWN0aXZlIGNoYW5nZVxuICAgKi9cbiAgcmVhZG9ubHkgbG9naWNhbElkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzdGFjayB0aGF0IGNvbnRhaW5zIHRoZSBkZXN0cnVjdGl2ZSBjaGFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaW1wYWN0IG9mIHRoZSBkZXN0cnVjdGl2ZSBjaGFuZ2VcbiAgICovXG4gIHJlYWRvbmx5IGltcGFjdDogUmVzb3VyY2VJbXBhY3Q7XG59XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGludGVncmF0aW9uIHRlc3RzIG1ldHJpY3MgZm9yIGEgZ2l2ZW4gd29ya2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZWdSdW5uZXJNZXRyaWNzIHtcbiAgLyoqXG4gICAqIFRoZSByZWdpb24gdGhlIHRlc3Qgd2FzIHJ1biBpblxuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgd29ya2VyLlxuICAgKiBUaGlzIHdpbGwgYmUgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbCB0ZXN0IGR1cmF0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgZHVyYXRpb246IG51bWJlcjtcblxuICAvKipcbiAgICogQ29udGFpbnMgdGhlIGR1cmF0aW9uIG9mIGluZGl2aWR1YWwgdGVzdHMgdGhhdCB0aGVcbiAgICogd29ya2VyIGV4ZWN1dGVkLlxuICAgKlxuICAgKiBNYXAgb2YgdGVzdE5hbWUgdG8gZHVyYXRpb24uXG4gICAqL1xuICByZWFkb25seSB0ZXN0czogeyBbdGVzdE5hbWU6IHN0cmluZ106IG51bWJlciB9O1xuXG4gIC8qKlxuICAgKiBUaGUgcHJvZmlsZSB0aGF0IHdhcyB1c2VkIHRvIHJ1biB0aGUgdGVzdFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgcHJvZmlsZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZmlsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTbmFwc2hvdFZlcmlmaWNhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogUmV0YWluIGZhaWxlZCBzbmFwc2hvdCBjb21wYXJpc29uc1xuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcmV0YWluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVmVyYm9zZSBtb2RlXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSB2ZXJib3NlPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IHJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnRlZ0JhdGNoUmVzcG9uc2Uge1xuICAvKipcbiAgICogTGlzdCBvZiBmYWlsZWQgdGVzdHNcbiAgICovXG4gIHJlYWRvbmx5IGZhaWxlZFRlc3RzOiBJbnRlZ1Rlc3RJbmZvW107XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgSW50ZWdyYXRpb24gdGVzdCBtZXRyaWNzLiBFYWNoIGVudHJ5IGluIHRoZVxuICAgKiBsaXN0IHJlcHJlc2VudHMgbWV0cmljcyBmcm9tIGEgc2luZ2xlIHdvcmtlciAoYWNjb3VudCArIHJlZ2lvbikuXG4gICAqL1xuICByZWFkb25seSBtZXRyaWNzOiBJbnRlZ1J1bm5lck1ldHJpY3NbXTtcbn1cblxuLyoqXG4gKiBDb21tb24gb3B0aW9ucyBmb3IgcnVubmluZyBpbnRlZ3JhdGlvbiB0ZXN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVnVGVzdE9wdGlvbnMge1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVncmF0aW9uIHRlc3RzIHRvIHJ1blxuICAgKiBpbiB0aGlzIGJhdGNoXG4gICAqL1xuICByZWFkb25seSB0ZXN0czogSW50ZWdUZXN0V29ya2VyQ29uZmlnW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgb3Igbm90IHRvIGRlc3Ryb3kgdGhlIHN0YWNrcyBhdCB0aGVcbiAgICogZW5kIG9mIHRoZSB0ZXN0XG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGNsZWFuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAgdGhlIHNuYXBzaG90IHdpbGxcbiAgICogYmUgY3JlYXRlZCBfd2l0aG91dF8gcnVubmluZyB0aGUgaW50ZWdyYXRpb24gdGVzdFxuICAgKiBUaGUgcmVzdWx0aW5nIHNuYXBzaG90IFNIT1VMRCBOT1QgYmUgY2hlY2tlZCBpblxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZHJ5UnVuPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGxldmVsIG9mIHZlcmJvc2l0eSBmb3IgbG9nZ2luZy5cbiAgICogSGlnaGVyIG51bWJlciBtZWFucyBtb3JlIG91dHB1dC5cbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgdmVyYm9zaXR5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlIHRoZW4gdGhlIHN0YWNrIHVwZGF0ZSB3b3JrZmxvdyB3aWxsIGJlIGRpc2FibGVkXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHVwZGF0ZVdvcmtmbG93PzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIHBvc3NpYmxlIHJlYXNvbnMgZm9yIGEgZGlhZ25vc3RpY1xuICovXG5leHBvcnQgZW51bSBEaWFnbm9zdGljUmVhc29uIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ3JhdGlvbiB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZXJlXG4gICAqIGlzIG5vdCBleGlzdGluZyBzbmFwc2hvdFxuICAgKi9cbiAgTk9fU05BUFNIT1QgPSAnTk9fU05BUFNIT1QnLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGVzdCBmYWlsZWRcbiAgICovXG4gIFRFU1RfRkFJTEVEID0gJ1RFU1RfRkFJTEVEJyxcblxuICAvKipcbiAgICogVGhlcmUgd2FzIGFuIGVycm9yIHJ1bm5pbmcgdGhlIGludGVncmF0aW9uIHRlc3RcbiAgICovXG4gIFRFU1RfRVJST1IgPSAnVEVTVF9FUlJPUicsXG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZSBhY3R1YWxcbiAgICogc25hcHNob3Qgd2FzIGRpZmZlcmVudCB0aGFuIHRoZSBleHBlY3RlZCBzbmFwc2hvdFxuICAgKi9cbiAgU05BUFNIT1RfRkFJTEVEID0gJ1NOQVBTSE9UX0ZBSUxFRCcsXG5cbiAgLyoqXG4gICAqIFRoZSBzbmFwc2hvdCB0ZXN0IGZhaWxlZCBiZWNhdXNlIHRoZXJlIHdhcyBhbiBlcnJvciBleGVjdXRpbmcgaXRcbiAgICovXG4gIFNOQVBTSE9UX0VSUk9SID0gJ1NOQVBTSE9UX0VSUk9SJyxcblxuICAvKipcbiAgICogVGhlIHNuYXBzaG90IHRlc3Qgc3VjY2VlZGVkXG4gICAqL1xuICBTTkFQU0hPVF9TVUNDRVNTID0gJ1NOQVBTSE9UX1NVQ0NFU1MnLFxuXG4gIC8qKlxuICAgKiBUaGUgaW50ZWdyYXRpb24gdGVzdCBzdWNjZWVkZWRcbiAgICovXG4gIFRFU1RfU1VDQ0VTUyA9ICdURVNUX1NVQ0NFU1MnLFxuXG4gIC8qKlxuICAgKiBUaGUgYXNzZXJ0aW9uIGZhaWxlZFxuICAgKi9cbiAgQVNTRVJUSU9OX0ZBSUxFRCA9ICdBU1NFUlRJT05fRkFJTEVEJyxcbn1cblxuLyoqXG4gKiBJbnRlZ3JhdGlvbiB0ZXN0IGRpYWdub3N0aWNzXG4gKiBUaGlzIGlzIHVzZWQgdG8gcmVwb3J0IGJhY2sgdGhlIHN0YXR1cyBvZiBlYWNoIHRlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFnbm9zdGljIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB0ZXN0XG4gICAqL1xuICByZWFkb25seSB0ZXN0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RhY2tcbiAgICovXG4gIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0aW1lIGl0IHRvb2sgdG8gcnVuIHRoZSB0ZXN0XG4gICAqL1xuICByZWFkb25seSBkdXJhdGlvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHJlYXNvbiBmb3IgdGhlIGRpYWdub3N0aWNcbiAgICovXG4gIHJlYWRvbmx5IHJlYXNvbjogRGlhZ25vc3RpY1JlYXNvbjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBtZXNzYWdlcyB0byBwcmludFxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbE1lc3NhZ2VzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFJlbGV2YW50IGNvbmZpZyBvcHRpb25zIHRoYXQgd2VyZSB1c2VkIGZvciB0aGUgaW50ZWcgdGVzdFxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlnPzogUmVjb3JkPHN0cmluZywgYW55Pjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50U3VtbWFyeSh0b3RhbDogbnVtYmVyLCBmYWlsZWQ6IG51bWJlcik6IHZvaWQge1xuICBpZiAoZmFpbGVkID4gMCkge1xuICAgIGxvZ2dlci5wcmludCgnJXM6ICAgICVzICVzLCAlcyB0b3RhbCcsIGNoYWxrLmJvbGQoJ1Rlc3RzJyksIGNoYWxrLnJlZChmYWlsZWQpLCBjaGFsay5yZWQoJ2ZhaWxlZCcpLCB0b3RhbCk7XG4gIH0gZWxzZSB7XG4gICAgbG9nZ2VyLnByaW50KCclczogICAgJXMgJXMsICVzIHRvdGFsJywgY2hhbGsuYm9sZCgnVGVzdHMnKSwgY2hhbGsuZ3JlZW4odG90YWwpLCBjaGFsay5ncmVlbigncGFzc2VkJyksIHRvdGFsKTtcbiAgfVxufVxuXG4vKipcbiAqIEZvcm1hdCB0aGUgYXNzZXJ0aW9uIHJlc3VsdHMgc28gdGhhdCB0aGUgcmVzdWx0cyBjYW4gYmVcbiAqIHByaW50ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEFzc2VydGlvblJlc3VsdHMocmVzdWx0czogQXNzZXJ0aW9uUmVzdWx0cyk6IHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QuZW50cmllcyhyZXN1bHRzKVxuICAgIC5tYXAoKFtpZCwgcmVzdWx0XSkgPT4gZm9ybWF0KCclcyVzJywgaWQsIHJlc3VsdC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/IGAgLSAke3Jlc3VsdC5zdGF0dXN9YCA6IGBcXG4ke3Jlc3VsdC5tZXNzYWdlfWApKVxuICAgIC5qb2luKCdcXG4gICAgICAnKTtcbn1cblxuLyoqXG4gKiBQcmludCBvdXQgdGhlIHJlc3VsdHMgZnJvbSB0ZXN0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpbnRSZXN1bHRzKGRpYWdub3N0aWM6IERpYWdub3N0aWMpOiB2b2lkIHtcbiAgc3dpdGNoIChkaWFnbm9zdGljLnJlYXNvbikge1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9TVUNDRVNTOlxuICAgICAgbG9nZ2VyLnN1Y2Nlc3MoJyAgVU5DSEFOR0VEICAlcyAlcycsIGRpYWdub3N0aWMudGVzdE5hbWUsIGNoYWxrLmdyYXkoYCR7ZGlhZ25vc3RpYy5kdXJhdGlvbn1zYCkpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaWFnbm9zdGljUmVhc29uLlRFU1RfU1VDQ0VTUzpcbiAgICAgIGxvZ2dlci5zdWNjZXNzKCcgIFNVQ0NFU1MgICAgJXMgJXNcXG4gICAgICAnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApLCBkaWFnbm9zdGljLm1lc3NhZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaWFnbm9zdGljUmVhc29uLk5PX1NOQVBTSE9UOlxuICAgICAgbG9nZ2VyLmVycm9yKCcgIE5FVyAgICAgICAgJXMgJXMnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9GQUlMRUQ6XG4gICAgICBsb2dnZXIuZXJyb3IoJyAgQ0hBTkdFRCAgICAlcyAlc1xcbiAgICAgICVzJywgZGlhZ25vc3RpYy50ZXN0TmFtZSwgY2hhbGsuZ3JheShgJHtkaWFnbm9zdGljLmR1cmF0aW9ufXNgKSwgZGlhZ25vc3RpYy5tZXNzYWdlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRGlhZ25vc3RpY1JlYXNvbi5TTkFQU0hPVF9FUlJPUjpcbiAgICBjYXNlIERpYWdub3N0aWNSZWFzb24uVEVTVF9FUlJPUjpcbiAgICAgIGxvZ2dlci5lcnJvcignICBFUlJPUiAgICAgICVzICVzXFxuICAgICAgJXMnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApLCBkaWFnbm9zdGljLm1lc3NhZ2UpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBEaWFnbm9zdGljUmVhc29uLlRFU1RfRkFJTEVEOlxuICAgICAgbG9nZ2VyLmVycm9yKCcgIEZBSUxFRCAgICAgJXMgJXNcXG4gICAgICAlcycsIGRpYWdub3N0aWMudGVzdE5hbWUsIGNoYWxrLmdyYXkoYCR7ZGlhZ25vc3RpYy5kdXJhdGlvbn1zYCksIGRpYWdub3N0aWMubWVzc2FnZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERpYWdub3N0aWNSZWFzb24uQVNTRVJUSU9OX0ZBSUxFRDpcbiAgICAgIGxvZ2dlci5lcnJvcignICBBU1NFUlQgICAgICVzICVzXFxuICAgICAgJXMnLCBkaWFnbm9zdGljLnRlc3ROYW1lLCBjaGFsay5ncmF5KGAke2RpYWdub3N0aWMuZHVyYXRpb259c2ApLCBkaWFnbm9zdGljLm1lc3NhZ2UpO1xuICAgICAgYnJlYWs7XG4gIH1cbiAgZm9yIChjb25zdCBhZGRsIG9mIGRpYWdub3N0aWMuYWRkaXRpb25hbE1lc3NhZ2VzID8/IFtdKSB7XG4gICAgbG9nZ2VyLnByaW50KGAgICAgICAke2FkZGx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByaW50TGFnZ2FyZHModGVzdE5hbWVzOiBTZXQ8c3RyaW5nPikge1xuICBjb25zdCBwYXJ0cyA9IFtcbiAgICAnICAnLFxuICAgIGBXYWl0aW5nIGZvciAke3Rlc3ROYW1lcy5zaXplfSBtb3JlYCxcbiAgICB0ZXN0TmFtZXMuc2l6ZSA8IDEwID8gWycoJywgQXJyYXkuZnJvbSh0ZXN0TmFtZXMpLmpvaW4oJywgJyksICcpJ10uam9pbignJykgOiAnJyxcbiAgXTtcblxuICBsb2dnZXIucHJpbnQoY2hhbGsuZ3JleShwYXJ0cy5maWx0ZXIoeCA9PiB4KS5qb2luKCcgJykpKTtcbn1cbiJdfQ==
|