aws-cdk 2.1000.0 → 2.1000.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 +2 -2
- package/build-info.json +2 -2
- package/lib/api/bootstrap/bootstrap-environment.d.ts +3 -1
- package/lib/api/bootstrap/bootstrap-environment.js +23 -19
- package/lib/api/bootstrap/deploy-bootstrap.d.ts +4 -2
- package/lib/api/bootstrap/deploy-bootstrap.js +13 -12
- package/lib/api/deployments/asset-publishing.d.ts +11 -3
- package/lib/api/deployments/asset-publishing.js +38 -25
- package/lib/api/deployments/assets.d.ts +3 -2
- package/lib/api/deployments/assets.js +10 -11
- package/lib/api/deployments/checks.d.ts +2 -1
- package/lib/api/deployments/checks.js +5 -5
- package/lib/api/deployments/cloudformation.d.ts +7 -7
- package/lib/api/deployments/cloudformation.js +29 -29
- package/lib/api/deployments/deploy-stack.d.ts +4 -3
- package/lib/api/deployments/deploy-stack.js +54 -51
- package/lib/api/deployments/deployments.d.ts +7 -3
- package/lib/api/deployments/deployments.js +26 -23
- package/lib/api/deployments/hotswap-deployments.d.ts +2 -1
- package/lib/api/deployments/hotswap-deployments.js +24 -18
- package/lib/api/{environment-access.d.ts → environment/environment-access.d.ts} +7 -4
- package/lib/api/environment/environment-access.js +205 -0
- package/lib/api/{environment-resources.d.ts → environment/environment-resources.d.ts} +7 -5
- package/lib/api/environment/environment-resources.js +209 -0
- package/lib/api/environment/index.d.ts +2 -0
- package/lib/api/environment/index.js +19 -0
- package/lib/api/garbage-collection/garbage-collector.d.ts +7 -0
- package/lib/api/garbage-collection/garbage-collector.js +39 -36
- package/lib/api/garbage-collection/index.d.ts +1 -0
- package/lib/api/garbage-collection/index.js +18 -0
- package/lib/api/garbage-collection/progress-printer.d.ts +4 -1
- package/lib/api/garbage-collection/progress-printer.js +7 -5
- package/lib/api/garbage-collection/stack-refresh.d.ts +6 -1
- package/lib/api/garbage-collection/stack-refresh.js +8 -8
- package/lib/api/logs/find-cloudwatch-logs.d.ts +2 -1
- package/lib/api/logs/find-cloudwatch-logs.js +4 -4
- package/lib/api/resource-import/importer.d.ts +1 -1
- package/lib/api/resource-import/importer.js +1 -1
- package/lib/api/resource-import/migrator.d.ts +1 -1
- package/lib/api/resource-import/migrator.js +1 -1
- package/lib/api/toolkit-info.d.ts +2 -1
- package/lib/api/toolkit-info.js +7 -6
- package/lib/api/util/template-body-parameter.d.ts +1 -1
- package/lib/api/util/template-body-parameter.js +1 -1
- package/lib/cli/cdk-toolkit.d.ts +1 -1
- package/lib/cli/cdk-toolkit.js +8 -4
- package/lib/cli/cli.js +8 -3
- package/lib/cli/messages.d.ts +10 -1
- package/lib/cli/messages.js +2 -1
- package/lib/index.js +17683 -17592
- package/lib/index_bg.wasm +0 -0
- package/lib/toolkit/cli-io-host.d.ts +7 -0
- package/lib/toolkit/cli-io-host.js +1 -1
- package/package.json +2 -2
- package/release.txt +2 -0
- package/CONTRIBUTING.md +0 -276
- package/generate.sh +0 -25
- package/images/garbage-collection.png +0 -0
- package/lib/api/environment-access.js +0 -203
- package/lib/api/environment-resources.js +0 -208
|
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.GarbageCollector = exports.ObjectAsset = exports.ImageAsset = exports.ECR_ISOLATED_TAG = exports.S3_ISOLATED_TAG = void 0;
|
|
4
4
|
const chalk = require("chalk");
|
|
5
5
|
const promptly = require("promptly");
|
|
6
|
-
const logging_1 = require("../../logging");
|
|
7
6
|
const toolkit_info_1 = require("../toolkit-info");
|
|
8
7
|
const progress_printer_1 = require("./progress-printer");
|
|
9
8
|
const stack_refresh_1 = require("./stack-refresh");
|
|
9
|
+
const messages_1 = require("../../cli/messages");
|
|
10
10
|
const error_1 = require("../../toolkit/error");
|
|
11
11
|
const mode_1 = require("../plugin/mode");
|
|
12
12
|
// Must use a require() otherwise esbuild complains
|
|
@@ -109,9 +109,10 @@ class GarbageCollector {
|
|
|
109
109
|
constructor(props) {
|
|
110
110
|
var _a, _b;
|
|
111
111
|
this.props = props;
|
|
112
|
+
this.ioHost = props.msg.ioHost;
|
|
113
|
+
this.action = props.msg.action;
|
|
112
114
|
this.garbageCollectS3Assets = ['s3', 'all'].includes(props.type);
|
|
113
115
|
this.garbageCollectEcrAssets = ['ecr', 'all'].includes(props.type);
|
|
114
|
-
(0, logging_1.debug)(`${this.garbageCollectS3Assets} ${this.garbageCollectEcrAssets}`);
|
|
115
116
|
this.permissionToDelete = ['delete-tagged', 'full'].includes(props.action);
|
|
116
117
|
this.permissionToTag = ['tag', 'full'].includes(props.action);
|
|
117
118
|
this.confirm = (_a = props.confirm) !== null && _a !== void 0 ? _a : true;
|
|
@@ -121,16 +122,18 @@ class GarbageCollector {
|
|
|
121
122
|
* Perform garbage collection on the resolved environment.
|
|
122
123
|
*/
|
|
123
124
|
async garbageCollect() {
|
|
125
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${this.garbageCollectS3Assets} ${this.garbageCollectEcrAssets}`));
|
|
124
126
|
// SDKs
|
|
125
127
|
const sdk = (await this.props.sdkProvider.forEnvironment(this.props.resolvedEnvironment, mode_1.Mode.ForWriting)).sdk;
|
|
126
128
|
const cfn = sdk.cloudFormation();
|
|
127
129
|
const qualifier = await this.bootstrapQualifier(sdk, this.bootstrapStackName);
|
|
128
130
|
const activeAssets = new stack_refresh_1.ActiveAssetCache();
|
|
129
131
|
// Grab stack templates first
|
|
130
|
-
await (0, stack_refresh_1.refreshStacks)(cfn, activeAssets, qualifier);
|
|
132
|
+
await (0, stack_refresh_1.refreshStacks)(cfn, this.props.msg, activeAssets, qualifier);
|
|
131
133
|
// Start the background refresh
|
|
132
134
|
const backgroundStackRefresh = new stack_refresh_1.BackgroundStackRefresh({
|
|
133
135
|
cfn,
|
|
136
|
+
msg: this.props.msg,
|
|
134
137
|
activeAssets,
|
|
135
138
|
qualifier,
|
|
136
139
|
});
|
|
@@ -157,26 +160,26 @@ class GarbageCollector {
|
|
|
157
160
|
const ecr = sdk.ecr();
|
|
158
161
|
const repo = await this.bootstrapRepositoryName(sdk, this.bootstrapStackName);
|
|
159
162
|
const numImages = await this.numImagesInRepo(ecr, repo);
|
|
160
|
-
const printer = new progress_printer_1.ProgressPrinter(numImages, 1000);
|
|
161
|
-
(0,
|
|
163
|
+
const printer = new progress_printer_1.ProgressPrinter(this.props.msg, numImages, 1000);
|
|
164
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Found bootstrap repo ${repo} with ${numImages} images`));
|
|
162
165
|
try {
|
|
163
166
|
// const batches = 1;
|
|
164
167
|
const batchSize = 1000;
|
|
165
168
|
const currentTime = Date.now();
|
|
166
169
|
const graceDays = this.props.rollbackBufferDays;
|
|
167
|
-
(0,
|
|
170
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Parsing through ${numImages} images in batches`));
|
|
168
171
|
printer.start();
|
|
169
172
|
for await (const batch of this.readRepoInBatches(ecr, repo, batchSize, currentTime)) {
|
|
170
173
|
await backgroundStackRefresh.noOlderThan(600000); // 10 mins
|
|
171
174
|
const { included: isolated, excluded: notIsolated } = partition(batch, asset => !asset.tags.some(t => activeAssets.contains(t)));
|
|
172
|
-
(0,
|
|
173
|
-
(0,
|
|
174
|
-
(0,
|
|
175
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${isolated.length} isolated images`));
|
|
176
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${notIsolated.length} not isolated images`));
|
|
177
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${batch.length} images total`));
|
|
175
178
|
let deletables = isolated;
|
|
176
179
|
let taggables = [];
|
|
177
180
|
let untaggables = [];
|
|
178
181
|
if (graceDays > 0) {
|
|
179
|
-
(0,
|
|
182
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, 'Filtering out images that are not old enough to delete'));
|
|
180
183
|
// We delete images that are not referenced in ActiveAssets and have the Isolated Tag with a date
|
|
181
184
|
// earlier than the current time - grace period.
|
|
182
185
|
deletables = isolated.filter(img => img.isolatedTagBefore(new Date(currentTime - (graceDays * DAY))));
|
|
@@ -185,9 +188,9 @@ class GarbageCollector {
|
|
|
185
188
|
// We untag images that are referenced in ActiveAssets and currently have the Isolated Tag.
|
|
186
189
|
untaggables = notIsolated.filter(img => img.hasIsolatedTag());
|
|
187
190
|
}
|
|
188
|
-
(0,
|
|
189
|
-
(0,
|
|
190
|
-
(0,
|
|
191
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${deletables.length} deletable assets`));
|
|
192
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${taggables.length} taggable assets`));
|
|
193
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${untaggables.length} assets to untag`));
|
|
191
194
|
if (this.permissionToDelete && deletables.length > 0) {
|
|
192
195
|
await this.confirmationPrompt(printer, deletables, 'image');
|
|
193
196
|
await this.parallelDeleteEcr(ecr, repo, deletables, printer);
|
|
@@ -215,13 +218,13 @@ class GarbageCollector {
|
|
|
215
218
|
const s3 = sdk.s3();
|
|
216
219
|
const bucket = await this.bootstrapBucketName(sdk, this.bootstrapStackName);
|
|
217
220
|
const numObjects = await this.numObjectsInBucket(s3, bucket);
|
|
218
|
-
const printer = new progress_printer_1.ProgressPrinter(numObjects, 1000);
|
|
219
|
-
(0,
|
|
221
|
+
const printer = new progress_printer_1.ProgressPrinter(this.props.msg, numObjects, 1000);
|
|
222
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Found bootstrap bucket ${bucket} with ${numObjects} objects`));
|
|
220
223
|
try {
|
|
221
224
|
const batchSize = 1000;
|
|
222
225
|
const currentTime = Date.now();
|
|
223
226
|
const graceDays = this.props.rollbackBufferDays;
|
|
224
|
-
(0,
|
|
227
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Parsing through ${numObjects} objects in batches`));
|
|
225
228
|
printer.start();
|
|
226
229
|
// Process objects in batches of 1000
|
|
227
230
|
// This is the batch limit of s3.DeleteObject and we intend to optimize for the "worst case" scenario
|
|
@@ -229,14 +232,14 @@ class GarbageCollector {
|
|
|
229
232
|
for await (const batch of this.readBucketInBatches(s3, bucket, batchSize, currentTime)) {
|
|
230
233
|
await backgroundStackRefresh.noOlderThan(600000); // 10 mins
|
|
231
234
|
const { included: isolated, excluded: notIsolated } = partition(batch, asset => !activeAssets.contains(asset.fileName()));
|
|
232
|
-
(0,
|
|
233
|
-
(0,
|
|
234
|
-
(0,
|
|
235
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${isolated.length} isolated assets`));
|
|
236
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${notIsolated.length} not isolated assets`));
|
|
237
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${batch.length} objects total`));
|
|
235
238
|
let deletables = isolated;
|
|
236
239
|
let taggables = [];
|
|
237
240
|
let untaggables = [];
|
|
238
241
|
if (graceDays > 0) {
|
|
239
|
-
(0,
|
|
242
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, 'Filtering out assets that are not old enough to delete'));
|
|
240
243
|
await this.parallelReadAllTags(s3, batch);
|
|
241
244
|
// We delete objects that are not referenced in ActiveAssets and have the Isolated Tag with a date
|
|
242
245
|
// earlier than the current time - grace period.
|
|
@@ -246,9 +249,9 @@ class GarbageCollector {
|
|
|
246
249
|
// We untag objects that are referenced in ActiveAssets and currently have the Isolated Tag.
|
|
247
250
|
untaggables = notIsolated.filter(obj => obj.hasIsolatedTag());
|
|
248
251
|
}
|
|
249
|
-
(0,
|
|
250
|
-
(0,
|
|
251
|
-
(0,
|
|
252
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${deletables.length} deletable assets`));
|
|
253
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${taggables.length} taggable assets`));
|
|
254
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `${untaggables.length} assets to untag`));
|
|
252
255
|
if (this.permissionToDelete && deletables.length > 0) {
|
|
253
256
|
await this.confirmationPrompt(printer, deletables, 'object');
|
|
254
257
|
await this.parallelDeleteS3(s3, bucket, deletables, printer);
|
|
@@ -290,7 +293,7 @@ class GarbageCollector {
|
|
|
290
293
|
}],
|
|
291
294
|
}));
|
|
292
295
|
}
|
|
293
|
-
(0,
|
|
296
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Untagged ${untaggables.length} assets`));
|
|
294
297
|
}
|
|
295
298
|
/**
|
|
296
299
|
* Untag assets that were previously tagged, but now currently referenced.
|
|
@@ -314,7 +317,7 @@ class GarbageCollector {
|
|
|
314
317
|
},
|
|
315
318
|
}));
|
|
316
319
|
}
|
|
317
|
-
(0,
|
|
320
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Untagged ${untaggables.length} assets`));
|
|
318
321
|
}
|
|
319
322
|
/**
|
|
320
323
|
* Tag images in parallel using p-limit
|
|
@@ -336,13 +339,13 @@ class GarbageCollector {
|
|
|
336
339
|
// This is a false negative -- an isolated asset is untagged
|
|
337
340
|
// likely due to an imageTag collision. We can safely ignore,
|
|
338
341
|
// and the isolated asset will be tagged next time.
|
|
339
|
-
(0,
|
|
342
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Warning: unable to tag image ${JSON.stringify(img.tags)} with ${img.buildImageTag(i)} due to the following error: ${error}`));
|
|
340
343
|
}
|
|
341
344
|
};
|
|
342
345
|
await limit(() => tagEcr());
|
|
343
346
|
}
|
|
344
347
|
printer.reportTaggedAsset(taggables);
|
|
345
|
-
(0,
|
|
348
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Tagged ${taggables.length} assets`));
|
|
346
349
|
}
|
|
347
350
|
/**
|
|
348
351
|
* Tag objects in parallel using p-limit. The putObjectTagging API does not
|
|
@@ -365,7 +368,7 @@ class GarbageCollector {
|
|
|
365
368
|
}));
|
|
366
369
|
}
|
|
367
370
|
printer.reportTaggedAsset(taggables);
|
|
368
|
-
(0,
|
|
371
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Tagged ${taggables.length} assets`));
|
|
369
372
|
}
|
|
370
373
|
/**
|
|
371
374
|
* Delete images in parallel. The deleteImage API supports batches of 100.
|
|
@@ -387,12 +390,12 @@ class GarbageCollector {
|
|
|
387
390
|
repositoryName: repo,
|
|
388
391
|
});
|
|
389
392
|
const deletedCount = batch.length;
|
|
390
|
-
(0,
|
|
393
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Deleted ${deletedCount} assets`));
|
|
391
394
|
printer.reportDeletedAsset(deletables.slice(0, deletedCount));
|
|
392
395
|
}
|
|
393
396
|
}
|
|
394
397
|
catch (err) {
|
|
395
|
-
(0,
|
|
398
|
+
await this.ioHost.notify((0, messages_1.info)(this.action, chalk.red(`Error deleting images: ${err}`)));
|
|
396
399
|
}
|
|
397
400
|
}
|
|
398
401
|
/**
|
|
@@ -418,24 +421,24 @@ class GarbageCollector {
|
|
|
418
421
|
},
|
|
419
422
|
});
|
|
420
423
|
const deletedCount = batch.length;
|
|
421
|
-
(0,
|
|
424
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, `Deleted ${deletedCount} assets`));
|
|
422
425
|
printer.reportDeletedAsset(deletables.slice(0, deletedCount));
|
|
423
426
|
}
|
|
424
427
|
}
|
|
425
428
|
catch (err) {
|
|
426
|
-
(0,
|
|
429
|
+
await this.ioHost.notify((0, messages_1.debug)(this.action, chalk.red(`Error deleting objects: ${err}`)));
|
|
427
430
|
}
|
|
428
431
|
}
|
|
429
432
|
async bootstrapBucketName(sdk, bootstrapStackName) {
|
|
430
|
-
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, bootstrapStackName);
|
|
433
|
+
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
|
|
431
434
|
return toolkitInfo.bucketName;
|
|
432
435
|
}
|
|
433
436
|
async bootstrapRepositoryName(sdk, bootstrapStackName) {
|
|
434
|
-
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, bootstrapStackName);
|
|
437
|
+
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
|
|
435
438
|
return toolkitInfo.repositoryName;
|
|
436
439
|
}
|
|
437
440
|
async bootstrapQualifier(sdk, bootstrapStackName) {
|
|
438
|
-
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, bootstrapStackName);
|
|
441
|
+
const toolkitInfo = await toolkit_info_1.ToolkitInfo.lookup(this.props.resolvedEnvironment, sdk, this.props.msg, bootstrapStackName);
|
|
439
442
|
return toolkitInfo.bootstrapStack.parameters.Qualifier;
|
|
440
443
|
}
|
|
441
444
|
async numObjectsInBucket(s3, bucket) {
|
|
@@ -604,4 +607,4 @@ function imageMap(imageIds) {
|
|
|
604
607
|
}
|
|
605
608
|
return images;
|
|
606
609
|
}
|
|
607
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnYXJiYWdlLWNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLDJDQUE0QztBQUU1QyxrREFBMEU7QUFDMUUseURBQXFEO0FBQ3JELG1EQUEwRjtBQUMxRiwrQ0FBbUQ7QUFDbkQseUNBQXNDO0FBRXRDLG1EQUFtRDtBQUNuRCxpRUFBaUU7QUFDakUsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUUvQyxRQUFBLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUNyQyxRQUFBLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsK0JBQStCO0FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7QUFJbkU7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFDckIsWUFDa0IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsUUFBZ0I7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFVO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUMvQixDQUFDO0lBRUksTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMs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b3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgSW1hZ2VJZGVudGlmaWVyIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjcic7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgcHJvbXB0bHkgZnJvbSAncHJvbXB0bHknO1xuaW1wb3J0IHsgZGVidWcsIGluZm8gfSBmcm9tICcuLi8uLi9sb2dnaW5nJztcbmltcG9ydCB7IElFQ1JDbGllbnQsIElTM0NsaWVudCwgU0RLLCBTZGtQcm92aWRlciB9IGZyb20gJy4uL2F3cy1hdXRoJztcbmltcG9ydCB7IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FLCBUb29sa2l0SW5mbyB9IGZyb20gJy4uL3Rvb2xraXQtaW5mbyc7XG5pbXBvcnQgeyBQcm9ncmVzc1ByaW50ZXIgfSBmcm9tICcuL3Byb2dyZXNzLXByaW50ZXInO1xuaW1wb3J0IHsgQWN0aXZlQXNzZXRDYWNoZSwgQmFja2dyb3VuZFN0YWNrUmVmcmVzaCwgcmVmcmVzaFN0YWNrcyB9IGZyb20gJy4vc3RhY2stcmVmcmVzaCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L2Vycm9yJztcbmltcG9ydCB7IE1vZGUgfSBmcm9tICcuLi9wbHVnaW4vbW9kZSc7XG5cbi8vIE11c3QgdXNlIGEgcmVxdWlyZSgpIG90aGVyd2lzZSBlc2J1aWxkIGNvbXBsYWluc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBMaW1pdDogdHlwZW9mIGltcG9ydCgncC1saW1pdCcpID0gcmVxdWlyZSgncC1saW1pdCcpO1xuXG5leHBvcnQgY29uc3QgUzNfSVNPTEFURURfVEFHID0gJ2F3cy1jZGs6aXNvbGF0ZWQnO1xuZXhwb3J0IGNvbnN0IEVDUl9JU09MQVRFRF9UQUcgPSAnYXdzLWNkay5pc29sYXRlZCc7IC8vICc6JyBpcyBub3QgdmFsaWQgaW4gRUNSIHRhZ3NcbmNvbnN0IFBfTElNSVQgPSA1MDtcbmNvbnN0IERBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7IC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBkYXlcblxuZXhwb3J0IHR5cGUgR2NBc3NldCA9IEltYWdlQXNzZXQgfCBPYmplY3RBc3NldDtcblxuLyoqXG4gKiBBbiBpbWFnZSBhc3NldCB0aGF0IGxpdmVzIGluIHRoZSBib290c3RyYXBwZWQgRUNSIFJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlQXNzZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IHN0cmluZ1tdLFxuICAgIHB1YmxpYyByZWFkb25seSBtYW5pZmVzdDogc3RyaW5nLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmZpbmQodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLnNvbWUodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhFQ1JfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUYWcoRUNSX0lTT0xBVEVEX1RBRyk7XG4gIH1cblxuICBwdWJsaWMgaXNvbGF0ZWRUYWdCZWZvcmUoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IGRhdGVJc29sYXRlZCA9IHRoaXMuZGF0ZUlzb2xhdGVkKCk7XG4gICAgaWYgKCFkYXRlSXNvbGF0ZWQgfHwgZGF0ZUlzb2xhdGVkID09ICcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlSXNvbGF0ZWQpIDwgZGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZEltYWdlVGFnKGluYzogbnVtYmVyKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiBgJHtpbmN9LSR7RUNSX0lTT0xBVEVEX1RBR30tJHtTdHJpbmcoRGF0ZS5ub3coKSl9YDtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNvbGF0ZWQoKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiB0aGlzLmdldElzb2xhdGVkVGFnKCk/LnNwbGl0KCctJylbM107XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgYXNzZXQgdGhhdCBsaXZlcyBpbiB0aGUgYm9vdHN0cmFwcGVkIFMzIEJ1Y2tldFxuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QXNzZXQge1xuICBwcml2YXRlIGNhY2hlZF90YWdzOiBUYWdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBmaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtleS5zcGxpdCgnLicpWzBdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFsbFRhZ3MoczM6IElTM0NsaWVudCkge1xuICAgIGlmICh0aGlzLmNhY2hlZF90YWdzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncztcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHMzLmdldE9iamVjdFRhZ2dpbmcoeyBCdWNrZXQ6IHRoaXMuYnVja2V0LCBLZXk6IHRoaXMua2V5IH0pO1xuICAgIHRoaXMuY2FjaGVkX3RhZ3MgPSByZXNwb25zZS5UYWdTZXQ7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3M7XG4gIH1cblxuICBwcml2YXRlIGdldFRhZyh0YWc6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYWNoZWRfdGFncykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ2Fubm90IGNhbGwgZ2V0VGFnIGJlZm9yZSBhbGxUYWdzJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZF90YWdzLmZpbmQoKHQ6IGFueSkgPT4gdC5LZXkgPT09IHRhZyk/LlZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVkX3RhZ3MpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Nhbm5vdCBjYWxsIGhhc1RhZyBiZWZvcmUgYWxsVGFncycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncy5zb21lKCh0OiBhbnkpID0+IHQuS2V5ID09PSB0YWcpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhTM19JU09MQVRFRF9UQUcpO1xuICB9XG5cbiAgcHVibGljIGlzb2xhdGVkVGFnQmVmb3JlKGRhdGU6IERhdGUpIHtcbiAgICBjb25zdCB0YWdWYWx1ZSA9IHRoaXMuZ2V0VGFnKFMzX0lTT0xBVEVEX1RBRyk7XG4gICAgaWYgKCF0YWdWYWx1ZSB8fCB0YWdWYWx1ZSA9PSAnJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodGFnVmFsdWUpIDwgZGF0ZTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgR2FyYmFnZSBDb2xsZWN0b3JcbiAqL1xuaW50ZXJmYWNlIEdhcmJhZ2VDb2xsZWN0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0uIFNwZWNpZnkgdGhpcyBpZiB5b3Ugd2FudCB0byBwZXJmb3JtIGEgdHJ1bmNhdGVkIHNldFxuICAgKiBvZiBhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogJ3ByaW50JyB8ICd0YWcnIHwgJ2RlbGV0ZS10YWdnZWQnIHwgJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhc3NldCB0byBnYXJiYWdlIGNvbGxlY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnczMnIHwgJ2VjcicgfCAnYWxsJztcblxuICAvKipcbiAgICogVGhlIGRheXMgYW4gYXNzZXQgbXVzdCBiZSBpbiBpc29sYXRpb24gYmVmb3JlIGJlaW5nIGFjdHVhbGx5IGRlbGV0ZWQuXG4gICAqL1xuICByZWFkb25seSByb2xsYmFja0J1ZmZlckRheXM6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmdXNlIGRlbGV0aW9uIG9mIGFueSBhc3NldHMgeW91bmdlciB0aGFuIHRoaXMgbnVtYmVyIG9mIGRheXMuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQnVmZmVyRGF5czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdG8gZGVwbG95IHRoaXMgc3RhY2sgaW5cbiAgICpcbiAgICogVGhlIGVudmlyb25tZW50IG9uIHRoZSBzdGFjayBhcnRpZmFjdCBtYXkgYmUgdW5yZXNvbHZlZCwgdGhpcyBvbmVcbiAgICogbXVzdCBiZSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgKHNlZWRlZCB3aXRoIGRlZmF1bHQgY3JlZGVudGlhbHMpXG4gICAqXG4gICAqIFdpbGwgYmUgdXNlZCB0byBtYWtlIFNESyBjYWxscyB0byBDbG91ZEZvcm1hdGlvbiwgUzMsIGFuZCBFQ1IuXG4gICAqL1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdG8gbG9vayBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgYWN0dWFsIGRlbGV0aW9uIGhhcHBlbnNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlybT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBjbGFzcyB0byBmYWNpbGl0YXRlIEdhcmJhZ2UgQ29sbGVjdGlvbiBvZiBTMyBhbmQgRUNSIGFzc2V0c1xuICovXG5leHBvcnQgY2xhc3MgR2FyYmFnZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBnYXJiYWdlQ29sbGVjdEVjckFzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uVG9EZWxldGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcGVybWlzc2lvblRvVGFnOiBib29sZWFuO1xuICBwcml2YXRlIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpcm06IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHByb3BzOiBHYXJiYWdlQ29sbGVjdG9yUHJvcHMpIHtcbiAgICB0aGlzLmdhcmJhZ2VDb2xsZWN0UzNBc3NldHMgPSBbJ3MzJywgJ2FsbCddLmluY2x1ZGVzKHByb3BzLnR5cGUpO1xuICAgIHRoaXMuZ2FyYmFnZUNvbGxlY3RFY3JBc3NldHMgPSBbJ2VjcicsICdhbGwnXS5pbmNsdWRlcyhwcm9wcy50eXBlKTtcblxuICAgIGRlYnVnKGAke3RoaXMuZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0c30gJHt0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyQXNzZXRzfWApO1xuXG4gICAgdGhpcy5wZXJtaXNzaW9uVG9EZWxldGUgPSBbJ2RlbGV0ZS10YWdnZWQnLCAnZnVsbCddLmluY2x1ZGVzKHByb3BzLmFjdGlvbik7XG4gICAgdGhpcy5wZXJtaXNzaW9uVG9UYWcgPSBbJ3RhZycsICdmdWxsJ10uaW5jbHVkZXMocHJvcHMuYWN0aW9uKTtcbiAgICB0aGlzLmNvbmZpcm0gPSBwcm9wcy5jb25maXJtID8/IHRydWU7XG5cbiAgICB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSA9IHByb3BzLmJvb3RzdHJhcFN0YWNrTmFtZSA/PyBERUZBVUxUX1RPT0xLSVRfU1RBQ0tfTkFNRTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtIGdhcmJhZ2UgY29sbGVjdGlvbiBvbiB0aGUgcmVzb2x2ZWQgZW52aXJvbm1lbnQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2FyYmFnZUNvbGxlY3QoKSB7XG4gICAgLy8gU0RLc1xuICAgIGNvbnN0IHNkayA9IChhd2FpdCB0aGlzLnByb3BzLnNka1Byb3ZpZGVyLmZvckVudmlyb25tZW50KHRoaXMucHJvcHMucmVzb2x2ZWRFbnZpcm9ubWVudCwgTW9kZS5Gb3JXcml0aW5nKSkuc2RrO1xuICAgIGNvbnN0IGNmbiA9IHNkay5jbG91ZEZvcm1hdGlvbigpO1xuXG4gICAgY29uc3QgcXVhbGlmaWVyID0gYXdhaXQgdGhpcy5ib290c3RyYXBRdWFsaWZpZXIoc2RrLCB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgY29uc3QgYWN0aXZlQXNzZXRzID0gbmV3IEFjdGl2ZUFzc2V0Q2FjaGUoKTtcblxuICAgIC8vIEdyYWIgc3RhY2sgdGVtcGxhdGVzIGZpcnN0XG4gICAgYXdhaXQgcmVmcmVzaFN0YWNrcyhjZm4sIGFjdGl2ZUFzc2V0cywgcXVhbGlmaWVyKTtcbiAgICAvLyBTdGFydCB0aGUgYmFja2dyb3VuZCByZWZyZXNoXG4gICAgY29uc3QgYmFja2dyb3VuZFN0YWNrUmVmcmVzaCA9IG5ldyBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKHtcbiAgICAgIGNmbixcbiAgICAgIGFjdGl2ZUFzc2V0cyxcbiAgICAgIHF1YWxpZmllcixcbiAgICB9KTtcbiAgICBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmdhcmJhZ2VDb2xsZWN0UzMoc2RrLCBhY3RpdmVBc3NldHMsIGJhY2tncm91bmRTdGFja1JlZnJlc2gpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nYXJiYWdlQ29sbGVjdEVjckFzc2V0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyKHNkaywgYWN0aXZlQXNzZXRzLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24gb24gRUNSIGFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdhcmJhZ2VDb2xsZWN0RWNyKHNkazogU0RLLCBhY3RpdmVBc3NldHM6IEFjdGl2ZUFzc2V0Q2FjaGUsIGJhY2tncm91bmRTdGFja1JlZnJlc2g6IEJhY2tncm91bmRTdGFja1JlZnJlc2gpIHtcbiAgICBjb25zdCBlY3IgPSBzZGsuZWNyKCk7XG4gICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwUmVwb3NpdG9yeU5hbWUoc2RrLCB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgY29uc3QgbnVtSW1hZ2VzID0gYXdhaXQgdGhpcy5udW1JbWFnZXNJblJlcG8oZWNyLCByZXBvKTtcbiAgICBjb25zdCBwcmludGVyID0gbmV3IFByb2dyZXNzUHJpbnRlcihudW1JbWFnZXMsIDEwMDApO1xuXG4gICAgZGVidWcoYEZvdW5kIGJvb3RzdHJhcCByZXBvICR7cmVwb30gd2l0aCAke251bUltYWdlc30gaW1hZ2VzYCk7XG5cbiAgICB0cnkge1xuICAgICAgLy8gY29uc3QgYmF0Y2hlcyA9IDE7XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSAxMDAwO1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZ3JhY2VEYXlzID0gdGhpcy5wcm9wcy5yb2xsYmFja0J1ZmZlckRheXM7XG5cbiAgICAgIGRlYnVnKGBQYXJzaW5nIHRocm91Z2ggJHtudW1JbWFnZXN9IGltYWdlcyBpbiBiYXRjaGVzYCk7XG5cbiAgICAgIHByaW50ZXIuc3RhcnQoKTtcblxuICAgICAgZm9yIGF3YWl0IChjb25zdCBiYXRjaCBvZiB0aGlzLnJlYWRSZXBvSW5CYXRjaGVzKGVjciwgcmVwbywgYmF0Y2hTaXplLCBjdXJyZW50VGltZSkpIHtcbiAgICAgICAgYXdhaXQgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5ub09sZGVyVGhhbig2MDBfMDAwKTsgLy8gMTAgbWluc1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IGlzb2xhdGVkLCBleGNsdWRlZDogbm90SXNvbGF0ZWQgfSA9IHBhcnRpdGlvbihiYXRjaCwgYXNzZXQgPT4gIWFzc2V0LnRhZ3Muc29tZSh0ID0+IGFjdGl2ZUFzc2V0cy5jb250YWlucyh0KSkpO1xuXG4gICAgICAgIGRlYnVnKGAke2lzb2xhdGVkLmxlbmd0aH0gaXNvbGF0ZWQgaW1hZ2VzYCk7XG4gICAgICAgIGRlYnVnKGAke25vdElzb2xhdGVkLmxlbmd0aH0gbm90IGlzb2xhdGVkIGltYWdlc2ApO1xuICAgICAgICBkZWJ1ZyhgJHtiYXRjaC5sZW5ndGh9IGltYWdlcyB0b3RhbGApO1xuXG4gICAgICAgIGxldCBkZWxldGFibGVzOiBJbWFnZUFzc2V0W10gPSBpc29sYXRlZDtcbiAgICAgICAgbGV0IHRhZ2dhYmxlczogSW1hZ2VBc3NldFtdID0gW107XG4gICAgICAgIGxldCB1bnRhZ2dhYmxlczogSW1hZ2VBc3NldFtdID0gW107XG5cbiAgICAgICAgaWYgKGdyYWNlRGF5cyA+IDApIHtcbiAgICAgICAgICBkZWJ1ZygnRmlsdGVyaW5nIG91dCBpbWFnZXMgdGhhdCBhcmUgbm90IG9sZCBlbm91Z2ggdG8gZGVsZXRlJyk7XG5cbiAgICAgICAgICAvLyBXZSBkZWxldGUgaW1hZ2VzIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnIHdpdGggYSBkYXRlXG4gICAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBjdXJyZW50IHRpbWUgLSBncmFjZSBwZXJpb2QuXG4gICAgICAgICAgZGVsZXRhYmxlcyA9IGlzb2xhdGVkLmZpbHRlcihpbWcgPT4gaW1nLmlzb2xhdGVkVGFnQmVmb3JlKG5ldyBEYXRlKGN1cnJlbnRUaW1lIC0gKGdyYWNlRGF5cyAqIERBWSkpKSk7XG5cbiAgICAgICAgICAvLyBXZSB0YWcgaW1hZ2VzIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgZG8gbm90IGhhdmUgdGhlIElzb2xhdGVkIFRhZy5cbiAgICAgICAgICB0YWdnYWJsZXMgPSBpc29sYXRlZC5maWx0ZXIoaW1nID0+ICFpbWcuaGFzSXNvbGF0ZWRUYWcoKSk7XG5cbiAgICAgICAgICAvLyBXZSB1bnRhZyBpbWFnZXMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGN1cnJlbnRseSBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdW50YWdnYWJsZXMgPSBub3RJc29sYXRlZC5maWx0ZXIoaW1nID0+IGltZy5oYXNJc29sYXRlZFRhZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGAke2RlbGV0YWJsZXMubGVuZ3RofSBkZWxldGFibGUgYXNzZXRzYCk7XG4gICAgICAgIGRlYnVnKGAke3RhZ2dhYmxlcy5sZW5ndGh9IHRhZ2dhYmxlIGFzc2V0c2ApO1xuICAgICAgICBkZWJ1ZyhgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0cyB0byB1bnRhZ2ApO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub0RlbGV0ZSAmJiBkZWxldGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1hdGlvblByb21wdChwcmludGVyLCBkZWxldGFibGVzLCAnaW1hZ2UnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsRGVsZXRlRWNyKGVjciwgcmVwbywgZGVsZXRhYmxlcywgcHJpbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9UYWcgJiYgdGFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsVGFnRWNyKGVjciwgcmVwbywgdGFnZ2FibGVzLCBwcmludGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub1RhZyAmJiB1bnRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFVudGFnRWNyKGVjciwgcmVwbywgdW50YWdnYWJsZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRlci5yZXBvcnRTY2FubmVkQXNzZXQoYmF0Y2gubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBwcmludGVyLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24gb24gUzMgYXNzZXRzXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2FyYmFnZUNvbGxlY3RTMyhzZGs6IFNESywgYWN0aXZlQXNzZXRzOiBBY3RpdmVBc3NldENhY2hlLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoOiBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKSB7XG4gICAgY29uc3QgczMgPSBzZGsuczMoKTtcbiAgICBjb25zdCBidWNrZXQgPSBhd2FpdCB0aGlzLmJvb3RzdHJhcEJ1Y2tldE5hbWUoc2RrLCB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgY29uc3QgbnVtT2JqZWN0cyA9IGF3YWl0IHRoaXMubnVtT2JqZWN0c0luQnVja2V0KHMzLCBidWNrZXQpO1xuICAgIGNvbnN0IHByaW50ZXIgPSBuZXcgUHJvZ3Jlc3NQcmludGVyKG51bU9iamVjdHMsIDEwMDApO1xuXG4gICAgZGVidWcoYEZvdW5kIGJvb3RzdHJhcCBidWNrZXQgJHtidWNrZXR9IHdpdGggJHtudW1PYmplY3RzfSBvYmplY3RzYCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hTaXplID0gMTAwMDtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGdyYWNlRGF5cyA9IHRoaXMucHJvcHMucm9sbGJhY2tCdWZmZXJEYXlzO1xuXG4gICAgICBkZWJ1ZyhgUGFyc2luZyB0aHJvdWdoICR7bnVtT2JqZWN0c30gb2JqZWN0cyBpbiBiYXRjaGVzYCk7XG5cbiAgICAgIHByaW50ZXIuc3RhcnQoKTtcblxuICAgICAgLy8gUHJvY2VzcyBvYmplY3RzIGluIGJhdGNoZXMgb2YgMTAwMFxuICAgICAgLy8gVGhpcyBpcyB0aGUgYmF0Y2ggbGltaXQgb2YgczMuRGVsZXRlT2JqZWN0IGFuZCB3ZSBpbnRlbmQgdG8gb3B0aW1pemUgZm9yIHRoZSBcIndvcnN0IGNhc2VcIiBzY2VuYXJpb1xuICAgICAgLy8gd2hlcmUgZ2MgaXMgcnVuIGZvciB0aGUgZmlyc3QgdGltZSBvbiBhIGxvbmctc3RhbmRpbmcgYnVja2V0IHdoZXJlIH4xMDAlIG9mIG9iamVjdHMgYXJlIGlzb2xhdGVkLlxuICAgICAgZm9yIGF3YWl0IChjb25zdCBiYXRjaCBvZiB0aGlzLnJlYWRCdWNrZXRJbkJhdGNoZXMoczMsIGJ1Y2tldCwgYmF0Y2hTaXplLCBjdXJyZW50VGltZSkpIHtcbiAgICAgICAgYXdhaXQgYmFja2dyb3VuZFN0YWNrUmVmcmVzaC5ub09sZGVyVGhhbig2MDBfMDAwKTsgLy8gMTAgbWluc1xuXG4gICAgICAgIGNvbnN0IHsgaW5jbHVkZWQ6IGlzb2xhdGVkLCBleGNsdWRlZDogbm90SXNvbGF0ZWQgfSA9IHBhcnRpdGlvbihiYXRjaCwgYXNzZXQgPT4gIWFjdGl2ZUFzc2V0cy5jb250YWlucyhhc3NldC5maWxlTmFtZSgpKSk7XG5cbiAgICAgICAgZGVidWcoYCR7aXNvbGF0ZWQubGVuZ3RofSBpc29sYXRlZCBhc3NldHNgKTtcbiAgICAgICAgZGVidWcoYCR7bm90SXNvbGF0ZWQubGVuZ3RofSBub3QgaXNvbGF0ZWQgYXNzZXRzYCk7XG4gICAgICAgIGRlYnVnKGAke2JhdGNoLmxlbmd0aH0gb2JqZWN0cyB0b3RhbGApO1xuXG4gICAgICAgIGxldCBkZWxldGFibGVzOiBPYmplY3RBc3NldFtdID0gaXNvbGF0ZWQ7XG4gICAgICAgIGxldCB0YWdnYWJsZXM6IE9iamVjdEFzc2V0W10gPSBbXTtcbiAgICAgICAgbGV0IHVudGFnZ2FibGVzOiBPYmplY3RBc3NldFtdID0gW107XG5cbiAgICAgICAgaWYgKGdyYWNlRGF5cyA+IDApIHtcbiAgICAgICAgICBkZWJ1ZygnRmlsdGVyaW5nIG91dCBhc3NldHMgdGhhdCBhcmUgbm90IG9sZCBlbm91Z2ggdG8gZGVsZXRlJyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFJlYWRBbGxUYWdzKHMzLCBiYXRjaCk7XG5cbiAgICAgICAgICAvLyBXZSBkZWxldGUgb2JqZWN0cyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGhhdmUgdGhlIElzb2xhdGVkIFRhZyB3aXRoIGEgZGF0ZVxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lIC0gZ3JhY2UgcGVyaW9kLlxuICAgICAgICAgIGRlbGV0YWJsZXMgPSBpc29sYXRlZC5maWx0ZXIob2JqID0+IG9iai5pc29sYXRlZFRhZ0JlZm9yZShuZXcgRGF0ZShjdXJyZW50VGltZSAtIChncmFjZURheXMgKiBEQVkpKSkpO1xuXG4gICAgICAgICAgLy8gV2UgdGFnIG9iamVjdHMgdGhhdCBhcmUgbm90IHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBkbyBub3QgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHRhZ2dhYmxlcyA9IGlzb2xhdGVkLmZpbHRlcihvYmogPT4gIW9iai5oYXNJc29sYXRlZFRhZygpKTtcblxuICAgICAgICAgIC8vIFdlIHVudGFnIG9iamVjdHMgdGhhdCBhcmUgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGN1cnJlbnRseSBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdW50YWdnYWJsZXMgPSBub3RJc29sYXRlZC5maWx0ZXIob2JqID0+IG9iai5oYXNJc29sYXRlZFRhZygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlYnVnKGAke2RlbGV0YWJsZXMubGVuZ3RofSBkZWxldGFibGUgYXNzZXRzYCk7XG4gICAgICAgIGRlYnVnKGAke3RhZ2dhYmxlcy5sZW5ndGh9IHRhZ2dhYmxlIGFzc2V0c2ApO1xuICAgICAgICBkZWJ1ZyhgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0cyB0byB1bnRhZ2ApO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcm1pc3Npb25Ub0RlbGV0ZSAmJiBkZWxldGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLmNvbmZpcm1hdGlvblByb21wdChwcmludGVyLCBkZWxldGFibGVzLCAnb2JqZWN0Jyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbERlbGV0ZVMzKHMzLCBidWNrZXQsIGRlbGV0YWJsZXMsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFRhZ1MzKHMzLCBidWNrZXQsIHRhZ2dhYmxlcywgY3VycmVudFRpbWUsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHVudGFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsVW50YWdTMyhzMywgYnVja2V0LCB1bnRhZ2dhYmxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludGVyLnJlcG9ydFNjYW5uZWRBc3NldChiYXRjaC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKGVycik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHByaW50ZXIuc3RvcCgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxSZWFkQWxsVGFncyhzMzogSVMzQ2xpZW50LCBvYmplY3RzOiBPYmplY3RBc3NldFtdKSB7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoUF9MSU1JVCk7XG5cbiAgICBmb3IgKGNvbnN0IG9iaiBvZiBvYmplY3RzKSB7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PiBvYmouYWxsVGFncyhzMykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnRhZyBhc3NldHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgdGFnZ2VkLCBidXQgbm93IGN1cnJlbnRseSByZWZlcmVuY2VkLlxuICAgKiBTaW5jZSB0aGlzIGlzIHRyZWF0ZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsLCB3ZSBkbyBub3QgcHJpbnQgdGhlIHJlc3VsdHMgaW4gdGhlIHByaW50ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsVW50YWdFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIHVudGFnZ2FibGVzOiBJbWFnZUFzc2V0W10pIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAoY29uc3QgaW1nIG9mIHVudGFnZ2FibGVzKSB7XG4gICAgICBjb25zdCB0YWcgPSBpbWcuZ2V0SXNvbGF0ZWRUYWcoKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIGVjci5iYXRjaERlbGV0ZUltYWdlKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogW3tcbiAgICAgICAgICAgIGltYWdlVGFnOiB0YWcsXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBkZWJ1ZyhgVW50YWdnZWQgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIFVudGFnIGFzc2V0cyB0aGF0IHdlcmUgcHJldmlvdXNseSB0YWdnZWQsIGJ1dCBub3cgY3VycmVudGx5IHJlZmVyZW5jZWQuXG4gICAqIFNpbmNlIHRoaXMgaXMgdHJlYXRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHdlIGRvIG5vdCBwcmludCB0aGUgcmVzdWx0cyBpbiB0aGUgcHJpbnRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxVbnRhZ1MzKHMzOiBJUzNDbGllbnQsIGJ1Y2tldDogc3RyaW5nLCB1bnRhZ2dhYmxlczogT2JqZWN0QXNzZXRbXSkge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBvYmogb2YgdW50YWdnYWJsZXMpIHtcbiAgICAgIGNvbnN0IHRhZ3MgPSBhd2FpdCBvYmouYWxsVGFncyhzMykgPz8gW107XG4gICAgICBjb25zdCB1cGRhdGVkVGFncyA9IHRhZ3MuZmlsdGVyKCh0YWc6IFRhZykgPT4gdGFnLktleSAhPT0gUzNfSVNPTEFURURfVEFHKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIHMzLmRlbGV0ZU9iamVjdFRhZ2dpbmcoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIEtleTogb2JqLmtleSxcblxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PlxuICAgICAgICBzMy5wdXRPYmplY3RUYWdnaW5nKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBLZXk6IG9iai5rZXksXG4gICAgICAgICAgVGFnZ2luZzoge1xuICAgICAgICAgICAgVGFnU2V0OiB1cGRhdGVkVGFncyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZGVidWcoYFVudGFnZ2VkICR7dW50YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWcgaW1hZ2VzIGluIHBhcmFsbGVsIHVzaW5nIHAtbGltaXRcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxUYWdFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIHRhZ2dhYmxlczogSW1hZ2VBc3NldFtdLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnZ2FibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBpbWcgPSB0YWdnYWJsZXNbaV07XG4gICAgICBjb25zdCB0YWdFY3IgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZWNyLnB1dEltYWdlKHtcbiAgICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgICAgaW1hZ2VEaWdlc3Q6IGltZy5kaWdlc3QsXG4gICAgICAgICAgICBpbWFnZU1hbmlmZXN0OiBpbWcubWFuaWZlc3QsXG4gICAgICAgICAgICBpbWFnZVRhZzogaW1nLmJ1aWxkSW1hZ2VUYWcoaSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIGZhbHNlIG5lZ2F0aXZlIC0tIGFuIGlzb2xhdGVkIGFzc2V0IGlzIHVudGFnZ2VkXG4gICAgICAgICAgLy8gbGlrZWx5IGR1ZSB0byBhbiBpbWFnZVRhZyBjb2xsaXNpb24uIFdlIGNhbiBzYWZlbHkgaWdub3JlLFxuICAgICAgICAgIC8vIGFuZCB0aGUgaXNvbGF0ZWQgYXNzZXQgd2lsbCBiZSB0YWdnZWQgbmV4dCB0aW1lLlxuICAgICAgICAgIGRlYnVnKGBXYXJuaW5nOiB1bmFibGUgdG8gdGFnIGltYWdlICR7SlNPTi5zdHJpbmdpZnkoaW1nLnRhZ3MpfSB3aXRoICR7aW1nLmJ1aWxkSW1hZ2VUYWcoaSl9IGR1ZSB0byB0aGUgZm9sbG93aW5nIGVycm9yOiAke2Vycm9yfWApO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT4gdGFnRWNyKCkpO1xuICAgIH1cblxuICAgIHByaW50ZXIucmVwb3J0VGFnZ2VkQXNzZXQodGFnZ2FibGVzKTtcbiAgICBkZWJ1ZyhgVGFnZ2VkICR7dGFnZ2FibGVzLmxlbmd0aH0gYXNzZXRzYCk7XG4gIH1cblxuICAvKipcbiAgICogVGFnIG9iamVjdHMgaW4gcGFyYWxsZWwgdXNpbmcgcC1saW1pdC4gVGhlIHB1dE9iamVjdFRhZ2dpbmcgQVBJIGRvZXMgbm90XG4gICAqIHN1cHBvcnQgYmF0Y2ggdGFnZ2luZyBzbyB3ZSBtdXN0IGhhbmRsZSB0aGUgcGFyYWxsZWxpc20gY2xpZW50LXNpZGUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsVGFnUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIHRhZ2dhYmxlczogT2JqZWN0QXNzZXRbXSwgZGF0ZTogbnVtYmVyLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAoY29uc3Qgb2JqIG9mIHRhZ2dhYmxlcykge1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT5cbiAgICAgICAgczMucHV0T2JqZWN0VGFnZ2luZyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgS2V5OiBvYmoua2V5LFxuICAgICAgICAgIFRhZ2dpbmc6IHtcbiAgICAgICAgICAgIFRhZ1NldDogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgS2V5OiBTM19JU09MQVRFRF9UQUcsXG4gICAgICAgICAgICAgICAgVmFsdWU6IFN0cmluZyhkYXRlKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHByaW50ZXIucmVwb3J0VGFnZ2VkQXNzZXQodGFnZ2FibGVzKTtcbiAgICBkZWJ1ZyhgVGFnZ2VkICR7dGFnZ2FibGVzLmxlbmd0aH0gYXNzZXRzYCk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIGltYWdlcyBpbiBwYXJhbGxlbC4gVGhlIGRlbGV0ZUltYWdlIEFQSSBzdXBwb3J0cyBiYXRjaGVzIG9mIDEwMC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxEZWxldGVFY3IoZWNyOiBJRUNSQ2xpZW50LCByZXBvOiBzdHJpbmcsIGRlbGV0YWJsZXM6IEltYWdlQXNzZXRbXSwgcHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTAwO1xuICAgIGNvbnN0IGltYWdlc1RvRGVsZXRlID0gZGVsZXRhYmxlcy5tYXAoaW1nID0+ICh7XG4gICAgICBpbWFnZURpZ2VzdDogaW1nLmRpZ2VzdCxcbiAgICB9KSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgYmF0Y2hlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbWFnZXNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgIGJhdGNoZXMucHVzaChpbWFnZXNUb0RlbGV0ZS5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgaW1hZ2VzIGluIGJhdGNoZXNcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgYmF0Y2hlcykge1xuICAgICAgICBhd2FpdCBlY3IuYmF0Y2hEZWxldGVJbWFnZSh7XG4gICAgICAgICAgaW1hZ2VJZHM6IGJhdGNoLFxuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBiYXRjaC5sZW5ndGg7XG4gICAgICAgIGRlYnVnKGBEZWxldGVkICR7ZGVsZXRlZENvdW50fSBhc3NldHNgKTtcbiAgICAgICAgcHJpbnRlci5yZXBvcnREZWxldGVkQXNzZXQoZGVsZXRhYmxlcy5zbGljZSgwLCBkZWxldGVkQ291bnQpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGluZm8oY2hhbGsucmVkKGBFcnJvciBkZWxldGluZyBpbWFnZXM6ICR7ZXJyfWApKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlIG9iamVjdHMgaW4gcGFyYWxsZWwuIFRoZSBkZWxldGVPYmplY3RzIEFQSSBzdXBwb3J0cyBiYXRjaGVzIG9mIDEwMDAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHBhcmFsbGVsRGVsZXRlUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIGRlbGV0YWJsZXM6IE9iamVjdEFzc2V0W10sIHByaW50ZXI6IFByb2dyZXNzUHJpbnRlcikge1xuICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDEwMDA7XG4gICAgY29uc3Qgb2JqZWN0c1RvRGVsZXRlID0gZGVsZXRhYmxlcy5tYXAoYXNzZXQgPT4gKHtcbiAgICAgIEtleTogYXNzZXQua2V5LFxuICAgIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaGVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgICAgIGJhdGNoZXMucHVzaChvYmplY3RzVG9EZWxldGUuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSkpO1xuICAgICAgfVxuICAgICAgLy8gRGVsZXRlIG9iamVjdHMgaW4gYmF0Y2hlc1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgICAgIGF3YWl0IHMzLmRlbGV0ZU9iamVjdHMoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIERlbGV0ZToge1xuICAgICAgICAgICAgT2JqZWN0czogYmF0Y2gsXG4gICAgICAgICAgICBRdWlldDogdHJ1ZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkZWxldGVkQ291bnQgPSBiYXRjaC5sZW5ndGg7XG4gICAgICAgIGRlYnVnKGBEZWxldGVkICR7ZGVsZXRlZENvdW50fSBhc3NldHNgKTtcbiAgICAgICAgcHJpbnRlci5yZXBvcnREZWxldGVkQXNzZXQoZGVsZXRhYmxlcy5zbGljZSgwLCBkZWxldGVkQ291bnQpKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGluZm8oY2hhbGsucmVkKGBFcnJvciBkZWxldGluZyBvYmplY3RzOiAke2Vycn1gKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBCdWNrZXROYW1lKHNkazogU0RLLCBib290c3RyYXBTdGFja05hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdG9vbGtpdEluZm8gPSBhd2FpdCBUb29sa2l0SW5mby5sb29rdXAodGhpcy5wcm9wcy5yZXNvbHZlZEVudmlyb25tZW50LCBzZGssIGJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHRvb2xraXRJbmZvLmJ1Y2tldE5hbWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcFJlcG9zaXRvcnlOYW1lKHNkazogU0RLLCBib290c3RyYXBTdGFja05hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdG9vbGtpdEluZm8gPSBhd2FpdCBUb29sa2l0SW5mby5sb29rdXAodGhpcy5wcm9wcy5yZXNvbHZlZEVudmlyb25tZW50LCBzZGssIGJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgcmV0dXJuIHRvb2xraXRJbmZvLnJlcG9zaXRvcnlOYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBRdWFsaWZpZXIoc2RrOiBTREssIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCB0b29sa2l0SW5mbyA9IGF3YWl0IFRvb2xraXRJbmZvLmxvb2t1cCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIHNkaywgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8uYm9vdHN0cmFwU3RhY2sucGFyYW1ldGVycy5RdWFsaWZpZXI7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG51bU9iamVjdHNJbkJ1Y2tldChzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICAgIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5saXN0T2JqZWN0c1YyKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbENvdW50ICs9IHJlc3BvbnNlLktleUNvdW50ID8/IDA7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG5cbiAgICByZXR1cm4gdG90YWxDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbnVtSW1hZ2VzSW5SZXBvKGVjcjogSUVDUkNsaWVudCwgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlY3IubGlzdEltYWdlcyh7XG4gICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICBuZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbENvdW50ICs9IHJlc3BvbnNlLmltYWdlSWRzPy5sZW5ndGggPz8gMDtcbiAgICAgIG5leHRUb2tlbiA9IHJlc3BvbnNlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuXG4gICAgcmV0dXJuIHRvdGFsQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jICpyZWFkUmVwb0luQmF0Y2hlcyhlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZywgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBjdXJyZW50VGltZTogbnVtYmVyKTogQXN5bmNHZW5lcmF0b3I8SW1hZ2VBc3NldFtdPiB7XG4gICAgbGV0IGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBiYXRjaDogSW1hZ2VBc3NldFtdID0gW107XG5cbiAgICAgIHdoaWxlIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlY3IubGlzdEltYWdlcyh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgbmV4dFRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm8gaW1hZ2VzIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgIGlmICghcmVzcG9uc2UuaW1hZ2VJZHMgfHwgcmVzcG9uc2UuaW1hZ2VJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXAgdW5pcXVlIGltYWdlIGRpZ2VzdCB0byAocG9zc2libHkgbXVsdGlwbGUpIHRhZ3NcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gaW1hZ2VNYXAocmVzcG9uc2UuaW1hZ2VJZHMgPz8gW10pO1xuXG4gICAgICAgIGNvbnN0IGltYWdlSWRzID0gT2JqZWN0LmtleXMoaW1hZ2VzKS5tYXAoa2V5ID0+ICh7XG4gICAgICAgICAgaW1hZ2VEaWdlc3Q6IGtleSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaWJlSW1hZ2VJbmZvID0gYXdhaXQgZWNyLmRlc2NyaWJlSW1hZ2VzKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogaW1hZ2VJZHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdldEltYWdlSW5mbyA9IGF3YWl0IGVjci5iYXRjaEdldEltYWdlKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogaW1hZ2VJZHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkSW1hZ2VJbmZvID0gZGVzY3JpYmVJbWFnZUluZm8uaW1hZ2VEZXRhaWxzPy5tYXAoaW1hZ2VEZXRhaWwgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSW1hZ2UgPSBnZXRJbWFnZUluZm8uaW1hZ2VzPy5maW5kKFxuICAgICAgICAgICAgaW1nID0+IGltZy5pbWFnZUlkPy5pbWFnZURpZ2VzdCA9PT0gaW1hZ2VEZXRhaWwuaW1hZ2VEaWdlc3QsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pbWFnZURldGFpbCxcbiAgICAgICAgICAgIG1hbmlmZXN0OiBtYXRjaGluZ0ltYWdlPy5pbWFnZU1hbmlmZXN0LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgY29tYmluZWRJbWFnZUluZm8gPz8gW10pIHtcbiAgICAgICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBpbWFnZS5pbWFnZVB1c2hlZEF0ID8/IG5ldyBEYXRlKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgaW1hZ2UgaWYgaXQgd2FzIHB1c2hlZCBlYXJsaWVyIHRoYW4gdG9kYXkgLSBjcmVhdGVkQnVmZmVyRGF5c1xuICAgICAgICAgIGlmIChpbWFnZS5pbWFnZURpZ2VzdCAmJiBsYXN0TW9kaWZpZWQgPCBuZXcgRGF0ZShjdXJyZW50VGltZSAtICh0aGlzLnByb3BzLmNyZWF0ZWRCdWZmZXJEYXlzICogREFZKSkpIHtcbiAgICAgICAgICAgIGJhdGNoLnB1c2gobmV3IEltYWdlQXNzZXQoaW1hZ2UuaW1hZ2VEaWdlc3QsIGltYWdlLmltYWdlU2l6ZUluQnl0ZXMgPz8gMCwgaW1hZ2UuaW1hZ2VUYWdzID8/IFtdLCBpbWFnZS5tYW5pZmVzdCA/PyAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UubmV4dFRva2VuO1xuXG4gICAgICAgIGlmICghY29udGludWF0aW9uVG9rZW4pIGJyZWFrOyAvLyBObyBtb3JlIGltYWdlcyB0byBmZXRjaFxuICAgICAgfVxuXG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB5aWVsZCBiYXRjaDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdG9yIGZ1bmN0aW9uIHRoYXQgcmVhZHMgb2JqZWN0cyBmcm9tIHRoZSBTMyBCdWNrZXQgaW4gYmF0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgKnJlYWRCdWNrZXRJbkJhdGNoZXMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgY3VycmVudFRpbWU6IG51bWJlcik6IEFzeW5jR2VuZXJhdG9yPE9iamVjdEFzc2V0W10+IHtcbiAgICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJhdGNoOiBPYmplY3RBc3NldFtdID0gW107XG5cbiAgICAgIHdoaWxlIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5saXN0T2JqZWN0c1YyKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBDb250aW51YXRpb25Ub2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLkNvbnRlbnRzPy5mb3JFYWNoKChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IG9iai5LZXkgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IG9iai5TaXplID8/IDA7XG4gICAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gb2JqLkxhc3RNb2RpZmllZCA/PyBuZXcgRGF0ZShjdXJyZW50VGltZSk7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIG9iamVjdCBpZiBpdCBoYXMgYSBLZXkgYW5kXG4gICAgICAgICAgLy8gaWYgaXQgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRvZGF5IC0gY3JlYXRlZEJ1ZmZlckRheXNcbiAgICAgICAgICBpZiAoa2V5ICYmIGxhc3RNb2RpZmllZCA8IG5ldyBEYXRlKGN1cnJlbnRUaW1lIC0gKHRoaXMucHJvcHMuY3JlYXRlZEJ1ZmZlckRheXMgKiBEQVkpKSkge1xuICAgICAgICAgICAgYmF0Y2gucHVzaChuZXcgT2JqZWN0QXNzZXQoYnVja2V0LCBrZXksIHNpemUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuXG4gICAgICAgIGlmICghY29udGludWF0aW9uVG9rZW4pIGJyZWFrOyAvLyBObyBtb3JlIG9iamVjdHMgdG8gZmV0Y2hcbiAgICAgIH1cblxuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgeWllbGQgYmF0Y2g7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uVG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtYXRpb25Qcm9tcHQocHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyLCBkZWxldGFibGVzOiBHY0Fzc2V0W10sIHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBsdXJhbGl6ZSA9IChuYW1lOiBzdHJpbmcsIGNvdW50OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGNvdW50ID09PSAxID8gbmFtZSA6IGAke25hbWV9c2A7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAgIGBGb3VuZCAke2RlbGV0YWJsZXMubGVuZ3RofSAke3BsdXJhbGl6ZSh0eXBlLCBkZWxldGFibGVzLmxlbmd0aCl9IHRvIGRlbGV0ZSBiYXNlZCBvZmYgb2YgdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpgLFxuICAgICAgICBgLSAke3R5cGV9cyBoYXZlIGJlZW4gaXNvbGF0ZWQgZm9yID4gJHt0aGlzLnByb3BzLnJvbGxiYWNrQnVmZmVyRGF5c30gZGF5c2AsXG4gICAgICAgIGAtICR7dHlwZX1zIHdlcmUgY3JlYXRlZCA+ICR7dGhpcy5wcm9wcy5jcmVhdGVkQnVmZmVyRGF5c30gZGF5cyBhZ29gLFxuICAgICAgICAnJyxcbiAgICAgICAgJ0RlbGV0ZSB0aGlzIGJhdGNoICh5ZXMvbm8vZGVsZXRlLWFsbCk/JyxcbiAgICAgIF0uam9pbignXFxuJyk7XG4gICAgICBwcmludGVyLnBhdXNlKCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb21wdGx5LnByb21wdChtZXNzYWdlLFxuICAgICAgICB7IHRyaW06IHRydWUgfSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEFueXRoaW5nIG90aGVyIHRoYW4geWVzL3kvZGVsZXRlLWFsbCBpcyB0cmVhdGVkIGFzIG5vXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8ICFbJ3llcycsICd5JywgJ2RlbGV0ZS1hbGwnXS5pbmNsdWRlcyhyZXNwb25zZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZWxldGlvbiBhYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UudG9Mb3dlckNhc2UoKSA9PSAnZGVsZXRlLWFsbCcpIHtcbiAgICAgICAgdGhpcy5jb25maXJtID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHByaW50ZXIucmVzdW1lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFydGl0aW9uPEE+KHhzOiBJdGVyYWJsZTxBPiwgcHJlZDogKHg6IEEpID0+IGJvb2xlYW4pOiB7IGluY2x1ZGVkOiBBW107IGV4Y2x1ZGVkOiBBW10gfSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpbmNsdWRlZDogW10gYXMgQVtdLFxuICAgIGV4Y2x1ZGVkOiBbXSBhcyBBW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJlc3VsdC5pbmNsdWRlZC5wdXNoKHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuZXhjbHVkZWQucHVzaCh4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbWFnZU1hcChpbWFnZUlkczogSW1hZ2VJZGVudGlmaWVyW10pIHtcbiAgY29uc3QgaW1hZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZUlkcyA/PyBbXSkge1xuICAgIGlmICghaW1hZ2UuaW1hZ2VEaWdlc3QgfHwgIWltYWdlLmltYWdlVGFnKSB7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCFpbWFnZXNbaW1hZ2UuaW1hZ2VEaWdlc3RdKSB7XG4gICAgICBpbWFnZXNbaW1hZ2UuaW1hZ2VEaWdlc3RdID0gW107XG4gICAgfVxuICAgIGltYWdlc1tpbWFnZS5pbWFnZURpZ2VzdF0ucHVzaChpbWFnZS5pbWFnZVRhZyk7XG4gIH1cbiAgcmV0dXJuIGltYWdlcztcbn1cbiJdfQ==
|
|
610
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FyYmFnZS1jb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJnYXJiYWdlLWNvbGxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSwrQkFBK0I7QUFDL0IscUNBQXFDO0FBRXJDLGtEQUEwRTtBQUMxRSx5REFBcUQ7QUFDckQsbURBQTBGO0FBQzFGLGlEQUFpRDtBQUVqRCwrQ0FBbUQ7QUFDbkQseUNBQXNDO0FBRXRDLG1EQUFtRDtBQUNuRCxpRUFBaUU7QUFDakUsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUUvQyxRQUFBLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUNyQyxRQUFBLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLENBQUMsK0JBQStCO0FBQ25GLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUNuQixNQUFNLEdBQUcsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQyxrQ0FBa0M7QUFJbkU7O0dBRUc7QUFDSCxNQUFhLFVBQVU7SUFDckIsWUFDa0IsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsUUFBZ0I7UUFIaEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixTQUFJLEdBQUosSUFBSSxDQUFVO1FBQ2QsYUFBUSxHQUFSLFFBQVEsQ0FBUTtJQUMvQixDQUFDO0lBRUksTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRU8sTUFBTSxDQUFDLEdBQVc7UUFDeEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMs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QztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjeGFwaSBmcm9tICdAYXdzLWNkay9jeC1hcGknO1xuaW1wb3J0IHsgSW1hZ2VJZGVudGlmaWVyIH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWVjcic7XG5pbXBvcnQgeyBUYWcgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtczMnO1xuaW1wb3J0ICogYXMgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0ICogYXMgcHJvbXB0bHkgZnJvbSAncHJvbXB0bHknO1xuaW1wb3J0IHsgSUVDUkNsaWVudCwgSVMzQ2xpZW50LCBTREssIFNka1Byb3ZpZGVyIH0gZnJvbSAnLi4vYXdzLWF1dGgnO1xuaW1wb3J0IHsgREVGQVVMVF9UT09MS0lUX1NUQUNLX05BTUUsIFRvb2xraXRJbmZvIH0gZnJvbSAnLi4vdG9vbGtpdC1pbmZvJztcbmltcG9ydCB7IFByb2dyZXNzUHJpbnRlciB9IGZyb20gJy4vcHJvZ3Jlc3MtcHJpbnRlcic7XG5pbXBvcnQgeyBBY3RpdmVBc3NldENhY2hlLCBCYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLCByZWZyZXNoU3RhY2tzIH0gZnJvbSAnLi9zdGFjay1yZWZyZXNoJztcbmltcG9ydCB7IGRlYnVnLCBpbmZvIH0gZnJvbSAnLi4vLi4vY2xpL21lc3NhZ2VzJztcbmltcG9ydCB7IElvTWVzc2FnaW5nIH0gZnJvbSAnLi4vLi4vdG9vbGtpdC9jbGktaW8taG9zdCc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi8uLi90b29sa2l0L2Vycm9yJztcbmltcG9ydCB7IE1vZGUgfSBmcm9tICcuLi9wbHVnaW4vbW9kZSc7XG5cbi8vIE11c3QgdXNlIGEgcmVxdWlyZSgpIG90aGVyd2lzZSBlc2J1aWxkIGNvbXBsYWluc1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IHBMaW1pdDogdHlwZW9mIGltcG9ydCgncC1saW1pdCcpID0gcmVxdWlyZSgncC1saW1pdCcpO1xuXG5leHBvcnQgY29uc3QgUzNfSVNPTEFURURfVEFHID0gJ2F3cy1jZGs6aXNvbGF0ZWQnO1xuZXhwb3J0IGNvbnN0IEVDUl9JU09MQVRFRF9UQUcgPSAnYXdzLWNkay5pc29sYXRlZCc7IC8vICc6JyBpcyBub3QgdmFsaWQgaW4gRUNSIHRhZ3NcbmNvbnN0IFBfTElNSVQgPSA1MDtcbmNvbnN0IERBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7IC8vIE51bWJlciBvZiBtaWxsaXNlY29uZHMgaW4gYSBkYXlcblxuZXhwb3J0IHR5cGUgR2NBc3NldCA9IEltYWdlQXNzZXQgfCBPYmplY3RBc3NldDtcblxuLyoqXG4gKiBBbiBpbWFnZSBhc3NldCB0aGF0IGxpdmVzIGluIHRoZSBib290c3RyYXBwZWQgRUNSIFJlcG9zaXRvcnlcbiAqL1xuZXhwb3J0IGNsYXNzIEltYWdlQXNzZXQge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGRpZ2VzdDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzaXplOiBudW1iZXIsXG4gICAgcHVibGljIHJlYWRvbmx5IHRhZ3M6IHN0cmluZ1tdLFxuICAgIHB1YmxpYyByZWFkb25seSBtYW5pZmVzdDogc3RyaW5nLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBnZXRUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLmZpbmQodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy50YWdzLnNvbWUodCA9PiB0LmluY2x1ZGVzKHRhZykpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhFQ1JfSVNPTEFURURfVEFHKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRJc29sYXRlZFRhZygpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRUYWcoRUNSX0lTT0xBVEVEX1RBRyk7XG4gIH1cblxuICBwdWJsaWMgaXNvbGF0ZWRUYWdCZWZvcmUoZGF0ZTogRGF0ZSkge1xuICAgIGNvbnN0IGRhdGVJc29sYXRlZCA9IHRoaXMuZGF0ZUlzb2xhdGVkKCk7XG4gICAgaWYgKCFkYXRlSXNvbGF0ZWQgfHwgZGF0ZUlzb2xhdGVkID09ICcnKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlSXNvbGF0ZWQpIDwgZGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZEltYWdlVGFnKGluYzogbnVtYmVyKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiBgJHtpbmN9LSR7RUNSX0lTT0xBVEVEX1RBR30tJHtTdHJpbmcoRGF0ZS5ub3coKSl9YDtcbiAgfVxuXG4gIHB1YmxpYyBkYXRlSXNvbGF0ZWQoKSB7XG4gICAgLy8gaXNvbGF0ZWRUYWcgd2lsbCBsb29rIGxpa2UgXCJYLWF3cy1jZGsuaXNvbGF0ZWQtWVlZWVlcIlxuICAgIHJldHVybiB0aGlzLmdldElzb2xhdGVkVGFnKCk/LnNwbGl0KCctJylbM107XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgYXNzZXQgdGhhdCBsaXZlcyBpbiB0aGUgYm9vdHN0cmFwcGVkIFMzIEJ1Y2tldFxuICovXG5leHBvcnQgY2xhc3MgT2JqZWN0QXNzZXQge1xuICBwcml2YXRlIGNhY2hlZF90YWdzOiBUYWdbXSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IGtleTogc3RyaW5nLCBwdWJsaWMgcmVhZG9ubHkgc2l6ZTogbnVtYmVyKSB7fVxuXG4gIHB1YmxpYyBmaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmtleS5zcGxpdCgnLicpWzBdO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGFsbFRhZ3MoczM6IElTM0NsaWVudCkge1xuICAgIGlmICh0aGlzLmNhY2hlZF90YWdzKSB7XG4gICAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncztcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHMzLmdldE9iamVjdFRhZ2dpbmcoeyBCdWNrZXQ6IHRoaXMuYnVja2V0LCBLZXk6IHRoaXMua2V5IH0pO1xuICAgIHRoaXMuY2FjaGVkX3RhZ3MgPSByZXNwb25zZS5UYWdTZXQ7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGVkX3RhZ3M7XG4gIH1cblxuICBwcml2YXRlIGdldFRhZyh0YWc6IHN0cmluZykge1xuICAgIGlmICghdGhpcy5jYWNoZWRfdGFncykge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignQ2Fubm90IGNhbGwgZ2V0VGFnIGJlZm9yZSBhbGxUYWdzJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNhY2hlZF90YWdzLmZpbmQoKHQ6IGFueSkgPT4gdC5LZXkgPT09IHRhZyk/LlZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBoYXNUYWcodGFnOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuY2FjaGVkX3RhZ3MpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Nhbm5vdCBjYWxsIGhhc1RhZyBiZWZvcmUgYWxsVGFncycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jYWNoZWRfdGFncy5zb21lKCh0OiBhbnkpID0+IHQuS2V5ID09PSB0YWcpO1xuICB9XG5cbiAgcHVibGljIGhhc0lzb2xhdGVkVGFnKCkge1xuICAgIHJldHVybiB0aGlzLmhhc1RhZyhTM19JU09MQVRFRF9UQUcpO1xuICB9XG5cbiAgcHVibGljIGlzb2xhdGVkVGFnQmVmb3JlKGRhdGU6IERhdGUpIHtcbiAgICBjb25zdCB0YWdWYWx1ZSA9IHRoaXMuZ2V0VGFnKFMzX0lTT0xBVEVEX1RBRyk7XG4gICAgaWYgKCF0YWdWYWx1ZSB8fCB0YWdWYWx1ZSA9PSAnJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGUodGFnVmFsdWUpIDwgZGF0ZTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB0aGUgR2FyYmFnZSBDb2xsZWN0b3JcbiAqL1xuaW50ZXJmYWNlIEdhcmJhZ2VDb2xsZWN0b3JQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgYWN0aW9uIHRvIHBlcmZvcm0uIFNwZWNpZnkgdGhpcyBpZiB5b3Ugd2FudCB0byBwZXJmb3JtIGEgdHJ1bmNhdGVkIHNldFxuICAgKiBvZiBhY3Rpb25zIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdGlvbjogJ3ByaW50JyB8ICd0YWcnIHwgJ2RlbGV0ZS10YWdnZWQnIHwgJ2Z1bGwnO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBhc3NldCB0byBnYXJiYWdlIGNvbGxlY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnczMnIHwgJ2VjcicgfCAnYWxsJztcblxuICAvKipcbiAgICogVGhlIGRheXMgYW4gYXNzZXQgbXVzdCBiZSBpbiBpc29sYXRpb24gYmVmb3JlIGJlaW5nIGFjdHVhbGx5IGRlbGV0ZWQuXG4gICAqL1xuICByZWFkb25seSByb2xsYmFja0J1ZmZlckRheXM6IG51bWJlcjtcblxuICAvKipcbiAgICogUmVmdXNlIGRlbGV0aW9uIG9mIGFueSBhc3NldHMgeW91bmdlciB0aGFuIHRoaXMgbnVtYmVyIG9mIGRheXMuXG4gICAqL1xuICByZWFkb25seSBjcmVhdGVkQnVmZmVyRGF5czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgZW52aXJvbm1lbnQgdG8gZGVwbG95IHRoaXMgc3RhY2sgaW5cbiAgICpcbiAgICogVGhlIGVudmlyb25tZW50IG9uIHRoZSBzdGFjayBhcnRpZmFjdCBtYXkgYmUgdW5yZXNvbHZlZCwgdGhpcyBvbmVcbiAgICogbXVzdCBiZSByZXNvbHZlZC5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkRW52aXJvbm1lbnQ6IGN4YXBpLkVudmlyb25tZW50O1xuXG4gIC8qKlxuICAgKiBTREsgcHJvdmlkZXIgKHNlZWRlZCB3aXRoIGRlZmF1bHQgY3JlZGVudGlhbHMpXG4gICAqXG4gICAqIFdpbGwgYmUgdXNlZCB0byBtYWtlIFNESyBjYWxscyB0byBDbG91ZEZvcm1hdGlvbiwgUzMsIGFuZCBFQ1IuXG4gICAqL1xuICByZWFkb25seSBzZGtQcm92aWRlcjogU2RrUHJvdmlkZXI7XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gc2VuZCBtZXNzYWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IG1zZzogSW9NZXNzYWdpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBib290c3RyYXAgc3RhY2sgdG8gbG9vayBmb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FXG4gICAqL1xuICByZWFkb25seSBib290c3RyYXBTdGFja05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbmZpcm0gd2l0aCB0aGUgdXNlciBiZWZvcmUgYWN0dWFsIGRlbGV0aW9uIGhhcHBlbnNcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY29uZmlybT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBjbGFzcyB0byBmYWNpbGl0YXRlIEdhcmJhZ2UgQ29sbGVjdGlvbiBvZiBTMyBhbmQgRUNSIGFzc2V0c1xuICovXG5leHBvcnQgY2xhc3MgR2FyYmFnZUNvbGxlY3RvciB7XG4gIHByaXZhdGUgZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBnYXJiYWdlQ29sbGVjdEVjckFzc2V0czogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwZXJtaXNzaW9uVG9EZWxldGU6IGJvb2xlYW47XG4gIHByaXZhdGUgcGVybWlzc2lvblRvVGFnOiBib29sZWFuO1xuICBwcml2YXRlIGJvb3RzdHJhcFN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIGNvbmZpcm06IGJvb2xlYW47XG4gIHByaXZhdGUgaW9Ib3N0OiBJb01lc3NhZ2luZ1snaW9Ib3N0J107XG4gIHByaXZhdGUgYWN0aW9uOiBJb01lc3NhZ2luZ1snYWN0aW9uJ107XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHJlYWRvbmx5IHByb3BzOiBHYXJiYWdlQ29sbGVjdG9yUHJvcHMpIHtcbiAgICB0aGlzLmlvSG9zdCA9IHByb3BzLm1zZy5pb0hvc3Q7XG4gICAgdGhpcy5hY3Rpb24gPSBwcm9wcy5tc2cuYWN0aW9uO1xuXG4gICAgdGhpcy5nYXJiYWdlQ29sbGVjdFMzQXNzZXRzID0gWydzMycsICdhbGwnXS5pbmNsdWRlcyhwcm9wcy50eXBlKTtcbiAgICB0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyQXNzZXRzID0gWydlY3InLCAnYWxsJ10uaW5jbHVkZXMocHJvcHMudHlwZSk7XG5cbiAgICB0aGlzLnBlcm1pc3Npb25Ub0RlbGV0ZSA9IFsnZGVsZXRlLXRhZ2dlZCcsICdmdWxsJ10uaW5jbHVkZXMocHJvcHMuYWN0aW9uKTtcbiAgICB0aGlzLnBlcm1pc3Npb25Ub1RhZyA9IFsndGFnJywgJ2Z1bGwnXS5pbmNsdWRlcyhwcm9wcy5hY3Rpb24pO1xuICAgIHRoaXMuY29uZmlybSA9IHByb3BzLmNvbmZpcm0gPz8gdHJ1ZTtcblxuICAgIHRoaXMuYm9vdHN0cmFwU3RhY2tOYW1lID0gcHJvcHMuYm9vdHN0cmFwU3RhY2tOYW1lID8/IERFRkFVTFRfVE9PTEtJVF9TVEFDS19OQU1FO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIHRoZSByZXNvbHZlZCBlbnZpcm9ubWVudC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBnYXJiYWdlQ29sbGVjdCgpIHtcbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke3RoaXMuZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0c30gJHt0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyQXNzZXRzfWApKTtcblxuICAgIC8vIFNES3NcbiAgICBjb25zdCBzZGsgPSAoYXdhaXQgdGhpcy5wcm9wcy5zZGtQcm92aWRlci5mb3JFbnZpcm9ubWVudCh0aGlzLnByb3BzLnJlc29sdmVkRW52aXJvbm1lbnQsIE1vZGUuRm9yV3JpdGluZykpLnNkaztcbiAgICBjb25zdCBjZm4gPSBzZGsuY2xvdWRGb3JtYXRpb24oKTtcblxuICAgIGNvbnN0IHF1YWxpZmllciA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwUXVhbGlmaWVyKHNkaywgdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGNvbnN0IGFjdGl2ZUFzc2V0cyA9IG5ldyBBY3RpdmVBc3NldENhY2hlKCk7XG5cbiAgICAvLyBHcmFiIHN0YWNrIHRlbXBsYXRlcyBmaXJzdFxuICAgIGF3YWl0IHJlZnJlc2hTdGFja3MoY2ZuLCB0aGlzLnByb3BzLm1zZywgYWN0aXZlQXNzZXRzLCBxdWFsaWZpZXIpO1xuICAgIC8vIFN0YXJ0IHRoZSBiYWNrZ3JvdW5kIHJlZnJlc2hcbiAgICBjb25zdCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoID0gbmV3IEJhY2tncm91bmRTdGFja1JlZnJlc2goe1xuICAgICAgY2ZuLFxuICAgICAgbXNnOiB0aGlzLnByb3BzLm1zZyxcbiAgICAgIGFjdGl2ZUFzc2V0cyxcbiAgICAgIHF1YWxpZmllcixcbiAgICB9KTtcbiAgICBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLnN0YXJ0KCk7XG5cbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZ2FyYmFnZUNvbGxlY3RTM0Fzc2V0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmdhcmJhZ2VDb2xsZWN0UzMoc2RrLCBhY3RpdmVBc3NldHMsIGJhY2tncm91bmRTdGFja1JlZnJlc2gpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nYXJiYWdlQ29sbGVjdEVjckFzc2V0cykge1xuICAgICAgICBhd2FpdCB0aGlzLmdhcmJhZ2VDb2xsZWN0RWNyKHNkaywgYWN0aXZlQXNzZXRzLCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcihlcnIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLnN0b3AoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBnYXJiYWdlIGNvbGxlY3Rpb24gb24gRUNSIGFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdhcmJhZ2VDb2xsZWN0RWNyKHNkazogU0RLLCBhY3RpdmVBc3NldHM6IEFjdGl2ZUFzc2V0Q2FjaGUsIGJhY2tncm91bmRTdGFja1JlZnJlc2g6IEJhY2tncm91bmRTdGFja1JlZnJlc2gpIHtcbiAgICBjb25zdCBlY3IgPSBzZGsuZWNyKCk7XG4gICAgY29uc3QgcmVwbyA9IGF3YWl0IHRoaXMuYm9vdHN0cmFwUmVwb3NpdG9yeU5hbWUoc2RrLCB0aGlzLmJvb3RzdHJhcFN0YWNrTmFtZSk7XG4gICAgY29uc3QgbnVtSW1hZ2VzID0gYXdhaXQgdGhpcy5udW1JbWFnZXNJblJlcG8oZWNyLCByZXBvKTtcbiAgICBjb25zdCBwcmludGVyID0gbmV3IFByb2dyZXNzUHJpbnRlcih0aGlzLnByb3BzLm1zZywgbnVtSW1hZ2VzLCAxMDAwKTtcblxuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYEZvdW5kIGJvb3RzdHJhcCByZXBvICR7cmVwb30gd2l0aCAke251bUltYWdlc30gaW1hZ2VzYCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIGNvbnN0IGJhdGNoZXMgPSAxO1xuICAgICAgY29uc3QgYmF0Y2hTaXplID0gMTAwMDtcbiAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGdyYWNlRGF5cyA9IHRoaXMucHJvcHMucm9sbGJhY2tCdWZmZXJEYXlzO1xuXG4gICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBQYXJzaW5nIHRocm91Z2ggJHtudW1JbWFnZXN9IGltYWdlcyBpbiBiYXRjaGVzYCkpO1xuXG4gICAgICBwcmludGVyLnN0YXJ0KCk7XG5cbiAgICAgIGZvciBhd2FpdCAoY29uc3QgYmF0Y2ggb2YgdGhpcy5yZWFkUmVwb0luQmF0Y2hlcyhlY3IsIHJlcG8sIGJhdGNoU2l6ZSwgY3VycmVudFRpbWUpKSB7XG4gICAgICAgIGF3YWl0IGJhY2tncm91bmRTdGFja1JlZnJlc2gubm9PbGRlclRoYW4oNjAwXzAwMCk7IC8vIDEwIG1pbnNcblxuICAgICAgICBjb25zdCB7IGluY2x1ZGVkOiBpc29sYXRlZCwgZXhjbHVkZWQ6IG5vdElzb2xhdGVkIH0gPSBwYXJ0aXRpb24oYmF0Y2gsIGFzc2V0ID0+ICFhc3NldC50YWdzLnNvbWUodCA9PiBhY3RpdmVBc3NldHMuY29udGFpbnModCkpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke2lzb2xhdGVkLmxlbmd0aH0gaXNvbGF0ZWQgaW1hZ2VzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke25vdElzb2xhdGVkLmxlbmd0aH0gbm90IGlzb2xhdGVkIGltYWdlc2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtiYXRjaC5sZW5ndGh9IGltYWdlcyB0b3RhbGApKTtcblxuICAgICAgICBsZXQgZGVsZXRhYmxlczogSW1hZ2VBc3NldFtdID0gaXNvbGF0ZWQ7XG4gICAgICAgIGxldCB0YWdnYWJsZXM6IEltYWdlQXNzZXRbXSA9IFtdO1xuICAgICAgICBsZXQgdW50YWdnYWJsZXM6IEltYWdlQXNzZXRbXSA9IFtdO1xuXG4gICAgICAgIGlmIChncmFjZURheXMgPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCAnRmlsdGVyaW5nIG91dCBpbWFnZXMgdGhhdCBhcmUgbm90IG9sZCBlbm91Z2ggdG8gZGVsZXRlJykpO1xuXG4gICAgICAgICAgLy8gV2UgZGVsZXRlIGltYWdlcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGhhdmUgdGhlIElzb2xhdGVkIFRhZyB3aXRoIGEgZGF0ZVxuICAgICAgICAgIC8vIGVhcmxpZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lIC0gZ3JhY2UgcGVyaW9kLlxuICAgICAgICAgIGRlbGV0YWJsZXMgPSBpc29sYXRlZC5maWx0ZXIoaW1nID0+IGltZy5pc29sYXRlZFRhZ0JlZm9yZShuZXcgRGF0ZShjdXJyZW50VGltZSAtIChncmFjZURheXMgKiBEQVkpKSkpO1xuXG4gICAgICAgICAgLy8gV2UgdGFnIGltYWdlcyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGRvIG5vdCBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdGFnZ2FibGVzID0gaXNvbGF0ZWQuZmlsdGVyKGltZyA9PiAhaW1nLmhhc0lzb2xhdGVkVGFnKCkpO1xuXG4gICAgICAgICAgLy8gV2UgdW50YWcgaW1hZ2VzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gQWN0aXZlQXNzZXRzIGFuZCBjdXJyZW50bHkgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnLlxuICAgICAgICAgIHVudGFnZ2FibGVzID0gbm90SXNvbGF0ZWQuZmlsdGVyKGltZyA9PiBpbWcuaGFzSXNvbGF0ZWRUYWcoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke2RlbGV0YWJsZXMubGVuZ3RofSBkZWxldGFibGUgYXNzZXRzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke3RhZ2dhYmxlcy5sZW5ndGh9IHRhZ2dhYmxlIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHt1bnRhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0cyB0byB1bnRhZ2ApKTtcblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9EZWxldGUgJiYgZGVsZXRhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5jb25maXJtYXRpb25Qcm9tcHQocHJpbnRlciwgZGVsZXRhYmxlcywgJ2ltYWdlJyk7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbERlbGV0ZUVjcihlY3IsIHJlcG8sIGRlbGV0YWJsZXMsIHByaW50ZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvVGFnICYmIHRhZ2dhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5wYXJhbGxlbFRhZ0VjcihlY3IsIHJlcG8sIHRhZ2dhYmxlcywgcHJpbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9UYWcgJiYgdW50YWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxVbnRhZ0VjcihlY3IsIHJlcG8sIHVudGFnZ2FibGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50ZXIucmVwb3J0U2Nhbm5lZEFzc2V0KGJhdGNoLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJpbnRlci5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIG9uIFMzIGFzc2V0c1xuICAgKi9cbiAgcHVibGljIGFzeW5jIGdhcmJhZ2VDb2xsZWN0UzMoc2RrOiBTREssIGFjdGl2ZUFzc2V0czogQWN0aXZlQXNzZXRDYWNoZSwgYmFja2dyb3VuZFN0YWNrUmVmcmVzaDogQmFja2dyb3VuZFN0YWNrUmVmcmVzaCkge1xuICAgIGNvbnN0IHMzID0gc2RrLnMzKCk7XG4gICAgY29uc3QgYnVja2V0ID0gYXdhaXQgdGhpcy5ib290c3RyYXBCdWNrZXROYW1lKHNkaywgdGhpcy5ib290c3RyYXBTdGFja05hbWUpO1xuICAgIGNvbnN0IG51bU9iamVjdHMgPSBhd2FpdCB0aGlzLm51bU9iamVjdHNJbkJ1Y2tldChzMywgYnVja2V0KTtcbiAgICBjb25zdCBwcmludGVyID0gbmV3IFByb2dyZXNzUHJpbnRlcih0aGlzLnByb3BzLm1zZywgbnVtT2JqZWN0cywgMTAwMCk7XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBGb3VuZCBib290c3RyYXAgYnVja2V0ICR7YnVja2V0fSB3aXRoICR7bnVtT2JqZWN0c30gb2JqZWN0c2ApKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSAxMDAwO1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZ3JhY2VEYXlzID0gdGhpcy5wcm9wcy5yb2xsYmFja0J1ZmZlckRheXM7XG5cbiAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFBhcnNpbmcgdGhyb3VnaCAke251bU9iamVjdHN9IG9iamVjdHMgaW4gYmF0Y2hlc2ApKTtcblxuICAgICAgcHJpbnRlci5zdGFydCgpO1xuXG4gICAgICAvLyBQcm9jZXNzIG9iamVjdHMgaW4gYmF0Y2hlcyBvZiAxMDAwXG4gICAgICAvLyBUaGlzIGlzIHRoZSBiYXRjaCBsaW1pdCBvZiBzMy5EZWxldGVPYmplY3QgYW5kIHdlIGludGVuZCB0byBvcHRpbWl6ZSBmb3IgdGhlIFwid29yc3QgY2FzZVwiIHNjZW5hcmlvXG4gICAgICAvLyB3aGVyZSBnYyBpcyBydW4gZm9yIHRoZSBmaXJzdCB0aW1lIG9uIGEgbG9uZy1zdGFuZGluZyBidWNrZXQgd2hlcmUgfjEwMCUgb2Ygb2JqZWN0cyBhcmUgaXNvbGF0ZWQuXG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGJhdGNoIG9mIHRoaXMucmVhZEJ1Y2tldEluQmF0Y2hlcyhzMywgYnVja2V0LCBiYXRjaFNpemUsIGN1cnJlbnRUaW1lKSkge1xuICAgICAgICBhd2FpdCBiYWNrZ3JvdW5kU3RhY2tSZWZyZXNoLm5vT2xkZXJUaGFuKDYwMF8wMDApOyAvLyAxMCBtaW5zXG5cbiAgICAgICAgY29uc3QgeyBpbmNsdWRlZDogaXNvbGF0ZWQsIGV4Y2x1ZGVkOiBub3RJc29sYXRlZCB9ID0gcGFydGl0aW9uKGJhdGNoLCBhc3NldCA9PiAhYWN0aXZlQXNzZXRzLmNvbnRhaW5zKGFzc2V0LmZpbGVOYW1lKCkpKTtcblxuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke2lzb2xhdGVkLmxlbmd0aH0gaXNvbGF0ZWQgYXNzZXRzYCkpO1xuICAgICAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGAke25vdElzb2xhdGVkLmxlbmd0aH0gbm90IGlzb2xhdGVkIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtiYXRjaC5sZW5ndGh9IG9iamVjdHMgdG90YWxgKSk7XG5cbiAgICAgICAgbGV0IGRlbGV0YWJsZXM6IE9iamVjdEFzc2V0W10gPSBpc29sYXRlZDtcbiAgICAgICAgbGV0IHRhZ2dhYmxlczogT2JqZWN0QXNzZXRbXSA9IFtdO1xuICAgICAgICBsZXQgdW50YWdnYWJsZXM6IE9iamVjdEFzc2V0W10gPSBbXTtcblxuICAgICAgICBpZiAoZ3JhY2VEYXlzID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgJ0ZpbHRlcmluZyBvdXQgYXNzZXRzIHRoYXQgYXJlIG5vdCBvbGQgZW5vdWdoIHRvIGRlbGV0ZScpKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsUmVhZEFsbFRhZ3MoczMsIGJhdGNoKTtcblxuICAgICAgICAgIC8vIFdlIGRlbGV0ZSBvYmplY3RzIHRoYXQgYXJlIG5vdCByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgaGF2ZSB0aGUgSXNvbGF0ZWQgVGFnIHdpdGggYSBkYXRlXG4gICAgICAgICAgLy8gZWFybGllciB0aGFuIHRoZSBjdXJyZW50IHRpbWUgLSBncmFjZSBwZXJpb2QuXG4gICAgICAgICAgZGVsZXRhYmxlcyA9IGlzb2xhdGVkLmZpbHRlcihvYmogPT4gb2JqLmlzb2xhdGVkVGFnQmVmb3JlKG5ldyBEYXRlKGN1cnJlbnRUaW1lIC0gKGdyYWNlRGF5cyAqIERBWSkpKSk7XG5cbiAgICAgICAgICAvLyBXZSB0YWcgb2JqZWN0cyB0aGF0IGFyZSBub3QgcmVmZXJlbmNlZCBpbiBBY3RpdmVBc3NldHMgYW5kIGRvIG5vdCBoYXZlIHRoZSBJc29sYXRlZCBUYWcuXG4gICAgICAgICAgdGFnZ2FibGVzID0gaXNvbGF0ZWQuZmlsdGVyKG9iaiA9PiAhb2JqLmhhc0lzb2xhdGVkVGFnKCkpO1xuXG4gICAgICAgICAgLy8gV2UgdW50YWcgb2JqZWN0cyB0aGF0IGFyZSByZWZlcmVuY2VkIGluIEFjdGl2ZUFzc2V0cyBhbmQgY3VycmVudGx5IGhhdmUgdGhlIElzb2xhdGVkIFRhZy5cbiAgICAgICAgICB1bnRhZ2dhYmxlcyA9IG5vdElzb2xhdGVkLmZpbHRlcihvYmogPT4gb2JqLmhhc0lzb2xhdGVkVGFnKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHtkZWxldGFibGVzLmxlbmd0aH0gZGVsZXRhYmxlIGFzc2V0c2ApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgJHt0YWdnYWJsZXMubGVuZ3RofSB0YWdnYWJsZSBhc3NldHNgKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYCR7dW50YWdnYWJsZXMubGVuZ3RofSBhc3NldHMgdG8gdW50YWdgKSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGVybWlzc2lvblRvRGVsZXRlICYmIGRlbGV0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMuY29uZmlybWF0aW9uUHJvbXB0KHByaW50ZXIsIGRlbGV0YWJsZXMsICdvYmplY3QnKTtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsRGVsZXRlUzMoczMsIGJ1Y2tldCwgZGVsZXRhYmxlcywgcHJpbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9UYWcgJiYgdGFnZ2FibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnBhcmFsbGVsVGFnUzMoczMsIGJ1Y2tldCwgdGFnZ2FibGVzLCBjdXJyZW50VGltZSwgcHJpbnRlcik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5wZXJtaXNzaW9uVG9UYWcgJiYgdW50YWdnYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGF3YWl0IHRoaXMucGFyYWxsZWxVbnRhZ1MzKHMzLCBidWNrZXQsIHVudGFnZ2FibGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaW50ZXIucmVwb3J0U2Nhbm5lZEFzc2V0KGJhdGNoLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoZXJyKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJpbnRlci5zdG9wKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbFJlYWRBbGxUYWdzKHMzOiBJUzNDbGllbnQsIG9iamVjdHM6IE9iamVjdEFzc2V0W10pIHtcbiAgICBjb25zdCBsaW1pdCA9IHBMaW1pdChQX0xJTUlUKTtcblxuICAgIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdHMpIHtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+IG9iai5hbGxUYWdzKHMzKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVudGFnIGFzc2V0cyB0aGF0IHdlcmUgcHJldmlvdXNseSB0YWdnZWQsIGJ1dCBub3cgY3VycmVudGx5IHJlZmVyZW5jZWQuXG4gICAqIFNpbmNlIHRoaXMgaXMgdHJlYXRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHdlIGRvIG5vdCBwcmludCB0aGUgcmVzdWx0cyBpbiB0aGUgcHJpbnRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxVbnRhZ0VjcihlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZywgdW50YWdnYWJsZXM6IEltYWdlQXNzZXRbXSkge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBpbWcgb2YgdW50YWdnYWJsZXMpIHtcbiAgICAgIGNvbnN0IHRhZyA9IGltZy5nZXRJc29sYXRlZFRhZygpO1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT5cbiAgICAgICAgZWNyLmJhdGNoRGVsZXRlSW1hZ2Uoe1xuICAgICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICAgIGltYWdlSWRzOiBbe1xuICAgICAgICAgICAgaW1hZ2VUYWc6IHRhZyxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFVudGFnZ2VkICR7dW50YWdnYWJsZXMubGVuZ3RofSBhc3NldHNgKSk7XG4gIH1cblxuICAvKipcbiAgICogVW50YWcgYXNzZXRzIHRoYXQgd2VyZSBwcmV2aW91c2x5IHRhZ2dlZCwgYnV0IG5vdyBjdXJyZW50bHkgcmVmZXJlbmNlZC5cbiAgICogU2luY2UgdGhpcyBpcyB0cmVhdGVkIGFzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCwgd2UgZG8gbm90IHByaW50IHRoZSByZXN1bHRzIGluIHRoZSBwcmludGVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbFVudGFnUzMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIHVudGFnZ2FibGVzOiBPYmplY3RBc3NldFtdKSB7XG4gICAgY29uc3QgbGltaXQgPSBwTGltaXQoUF9MSU1JVCk7XG5cbiAgICBmb3IgKGNvbnN0IG9iaiBvZiB1bnRhZ2dhYmxlcykge1xuICAgICAgY29uc3QgdGFncyA9IGF3YWl0IG9iai5hbGxUYWdzKHMzKSA/PyBbXTtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUYWdzID0gdGFncy5maWx0ZXIoKHRhZzogVGFnKSA9PiB0YWcuS2V5ICE9PSBTM19JU09MQVRFRF9UQUcpO1xuICAgICAgYXdhaXQgbGltaXQoKCkgPT5cbiAgICAgICAgczMuZGVsZXRlT2JqZWN0VGFnZ2luZyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgS2V5OiBvYmoua2V5LFxuXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICAgIGF3YWl0IGxpbWl0KCgpID0+XG4gICAgICAgIHMzLnB1dE9iamVjdFRhZ2dpbmcoe1xuICAgICAgICAgIEJ1Y2tldDogYnVja2V0LFxuICAgICAgICAgIEtleTogb2JqLmtleSxcbiAgICAgICAgICBUYWdnaW5nOiB7XG4gICAgICAgICAgICBUYWdTZXQ6IHVwZGF0ZWRUYWdzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBhd2FpdCB0aGlzLmlvSG9zdC5ub3RpZnkoZGVidWcodGhpcy5hY3Rpb24sIGBVbnRhZ2dlZCAke3VudGFnZ2FibGVzLmxlbmd0aH0gYXNzZXRzYCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRhZyBpbWFnZXMgaW4gcGFyYWxsZWwgdXNpbmcgcC1saW1pdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbFRhZ0VjcihlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZywgdGFnZ2FibGVzOiBJbWFnZUFzc2V0W10sIHByaW50ZXI6IFByb2dyZXNzUHJpbnRlcikge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YWdnYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGltZyA9IHRhZ2dhYmxlc1tpXTtcbiAgICAgIGNvbnN0IHRhZ0VjciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBlY3IucHV0SW1hZ2Uoe1xuICAgICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgICBpbWFnZURpZ2VzdDogaW1nLmRpZ2VzdCxcbiAgICAgICAgICAgIGltYWdlTWFuaWZlc3Q6IGltZy5tYW5pZmVzdCxcbiAgICAgICAgICAgIGltYWdlVGFnOiBpbWcuYnVpbGRJbWFnZVRhZyhpKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgZmFsc2UgbmVnYXRpdmUgLS0gYW4gaXNvbGF0ZWQgYXNzZXQgaXMgdW50YWdnZWRcbiAgICAgICAgICAvLyBsaWtlbHkgZHVlIHRvIGFuIGltYWdlVGFnIGNvbGxpc2lvbi4gV2UgY2FuIHNhZmVseSBpZ25vcmUsXG4gICAgICAgICAgLy8gYW5kIHRoZSBpc29sYXRlZCBhc3NldCB3aWxsIGJlIHRhZ2dlZCBuZXh0IHRpbWUuXG4gICAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgV2FybmluZzogdW5hYmxlIHRvIHRhZyBpbWFnZSAke0pTT04uc3RyaW5naWZ5KGltZy50YWdzKX0gd2l0aCAke2ltZy5idWlsZEltYWdlVGFnKGkpfSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcjogJHtlcnJvcn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PiB0YWdFY3IoKSk7XG4gICAgfVxuXG4gICAgcHJpbnRlci5yZXBvcnRUYWdnZWRBc3NldCh0YWdnYWJsZXMpO1xuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFRhZ2dlZCAke3RhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUYWcgb2JqZWN0cyBpbiBwYXJhbGxlbCB1c2luZyBwLWxpbWl0LiBUaGUgcHV0T2JqZWN0VGFnZ2luZyBBUEkgZG9lcyBub3RcbiAgICogc3VwcG9ydCBiYXRjaCB0YWdnaW5nIHNvIHdlIG11c3QgaGFuZGxlIHRoZSBwYXJhbGxlbGlzbSBjbGllbnQtc2lkZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxUYWdTMyhzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZywgdGFnZ2FibGVzOiBPYmplY3RBc3NldFtdLCBkYXRlOiBudW1iZXIsIHByaW50ZXI6IFByb2dyZXNzUHJpbnRlcikge1xuICAgIGNvbnN0IGxpbWl0ID0gcExpbWl0KFBfTElNSVQpO1xuXG4gICAgZm9yIChjb25zdCBvYmogb2YgdGFnZ2FibGVzKSB7XG4gICAgICBhd2FpdCBsaW1pdCgoKSA9PlxuICAgICAgICBzMy5wdXRPYmplY3RUYWdnaW5nKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBLZXk6IG9iai5rZXksXG4gICAgICAgICAgVGFnZ2luZzoge1xuICAgICAgICAgICAgVGFnU2V0OiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBLZXk6IFMzX0lTT0xBVEVEX1RBRyxcbiAgICAgICAgICAgICAgICBWYWx1ZTogU3RyaW5nKGRhdGUpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpbnRlci5yZXBvcnRUYWdnZWRBc3NldCh0YWdnYWJsZXMpO1xuICAgIGF3YWl0IHRoaXMuaW9Ib3N0Lm5vdGlmeShkZWJ1Zyh0aGlzLmFjdGlvbiwgYFRhZ2dlZCAke3RhZ2dhYmxlcy5sZW5ndGh9IGFzc2V0c2ApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgaW1hZ2VzIGluIHBhcmFsbGVsLiBUaGUgZGVsZXRlSW1hZ2UgQVBJIHN1cHBvcnRzIGJhdGNoZXMgb2YgMTAwLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJhbGxlbERlbGV0ZUVjcihlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZywgZGVsZXRhYmxlczogSW1hZ2VBc3NldFtdLCBwcmludGVyOiBQcm9ncmVzc1ByaW50ZXIpIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSAxMDA7XG4gICAgY29uc3QgaW1hZ2VzVG9EZWxldGUgPSBkZWxldGFibGVzLm1hcChpbWcgPT4gKHtcbiAgICAgIGltYWdlRGlnZXN0OiBpbWcuZGlnZXN0LFxuICAgIH0pKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBiYXRjaGVzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlc1RvRGVsZXRlLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgICAgYmF0Y2hlcy5wdXNoKGltYWdlc1RvRGVsZXRlLnNsaWNlKGksIGkgKyBiYXRjaFNpemUpKTtcbiAgICAgIH1cbiAgICAgIC8vIERlbGV0ZSBpbWFnZXMgaW4gYmF0Y2hlc1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiBiYXRjaGVzKSB7XG4gICAgICAgIGF3YWl0IGVjci5iYXRjaERlbGV0ZUltYWdlKHtcbiAgICAgICAgICBpbWFnZUlkczogYmF0Y2gsXG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGJhdGNoLmxlbmd0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgRGVsZXRlZCAke2RlbGV0ZWRDb3VudH0gYXNzZXRzYCkpO1xuICAgICAgICBwcmludGVyLnJlcG9ydERlbGV0ZWRBc3NldChkZWxldGFibGVzLnNsaWNlKDAsIGRlbGV0ZWRDb3VudCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGluZm8odGhpcy5hY3Rpb24sIGNoYWxrLnJlZChgRXJyb3IgZGVsZXRpbmcgaW1hZ2VzOiAke2Vycn1gKSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgb2JqZWN0cyBpbiBwYXJhbGxlbC4gVGhlIGRlbGV0ZU9iamVjdHMgQVBJIHN1cHBvcnRzIGJhdGNoZXMgb2YgMTAwMC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcGFyYWxsZWxEZWxldGVTMyhzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZywgZGVsZXRhYmxlczogT2JqZWN0QXNzZXRbXSwgcHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyKSB7XG4gICAgY29uc3QgYmF0Y2hTaXplID0gMTAwMDtcbiAgICBjb25zdCBvYmplY3RzVG9EZWxldGUgPSBkZWxldGFibGVzLm1hcChhc3NldCA9PiAoe1xuICAgICAgS2V5OiBhc3NldC5rZXksXG4gICAgfSkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb2JqZWN0c1RvRGVsZXRlLmxlbmd0aDsgaSArPSBiYXRjaFNpemUpIHtcbiAgICAgICAgYmF0Y2hlcy5wdXNoKG9iamVjdHNUb0RlbGV0ZS5zbGljZShpLCBpICsgYmF0Y2hTaXplKSk7XG4gICAgICB9XG4gICAgICAvLyBEZWxldGUgb2JqZWN0cyBpbiBiYXRjaGVzXG4gICAgICBmb3IgKGNvbnN0IGJhdGNoIG9mIGJhdGNoZXMpIHtcbiAgICAgICAgYXdhaXQgczMuZGVsZXRlT2JqZWN0cyh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgICAgRGVsZXRlOiB7XG4gICAgICAgICAgICBPYmplY3RzOiBiYXRjaCxcbiAgICAgICAgICAgIFF1aWV0OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGRlbGV0ZWRDb3VudCA9IGJhdGNoLmxlbmd0aDtcbiAgICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBgRGVsZXRlZCAke2RlbGV0ZWRDb3VudH0gYXNzZXRzYCkpO1xuICAgICAgICBwcmludGVyLnJlcG9ydERlbGV0ZWRBc3NldChkZWxldGFibGVzLnNsaWNlKDAsIGRlbGV0ZWRDb3VudCkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgYXdhaXQgdGhpcy5pb0hvc3Qubm90aWZ5KGRlYnVnKHRoaXMuYWN0aW9uLCBjaGFsay5yZWQoYEVycm9yIGRlbGV0aW5nIG9iamVjdHM6ICR7ZXJyfWApKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBCdWNrZXROYW1lKHNkazogU0RLLCBib290c3RyYXBTdGFja05hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdG9vbGtpdEluZm8gPSBhd2FpdCBUb29sa2l0SW5mby5sb29rdXAodGhpcy5wcm9wcy5yZXNvbHZlZEVudmlyb25tZW50LCBzZGssIHRoaXMucHJvcHMubXNnLCBib290c3RyYXBTdGFja05hbWUpO1xuICAgIHJldHVybiB0b29sa2l0SW5mby5idWNrZXROYW1lO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXBSZXBvc2l0b3J5TmFtZShzZGs6IFNESywgYm9vdHN0cmFwU3RhY2tOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHRvb2xraXRJbmZvID0gYXdhaXQgVG9vbGtpdEluZm8ubG9va3VwKHRoaXMucHJvcHMucmVzb2x2ZWRFbnZpcm9ubWVudCwgc2RrLCB0aGlzLnByb3BzLm1zZywgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8ucmVwb3NpdG9yeU5hbWU7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJvb3RzdHJhcFF1YWxpZmllcihzZGs6IFNESywgYm9vdHN0cmFwU3RhY2tOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHRvb2xraXRJbmZvID0gYXdhaXQgVG9vbGtpdEluZm8ubG9va3VwKHRoaXMucHJvcHMucmVzb2x2ZWRFbnZpcm9ubWVudCwgc2RrLCB0aGlzLnByb3BzLm1zZywgYm9vdHN0cmFwU3RhY2tOYW1lKTtcbiAgICByZXR1cm4gdG9vbGtpdEluZm8uYm9vdHN0cmFwU3RhY2sucGFyYW1ldGVycy5RdWFsaWZpZXI7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG51bU9iamVjdHNJbkJ1Y2tldChzMzogSVMzQ2xpZW50LCBidWNrZXQ6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICAgIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5saXN0T2JqZWN0c1YyKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXQsXG4gICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbENvdW50ICs9IHJlc3BvbnNlLktleUNvdW50ID8/IDA7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IHJlc3BvbnNlLk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG5cbiAgICByZXR1cm4gdG90YWxDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbnVtSW1hZ2VzSW5SZXBvKGVjcjogSUVDUkNsaWVudCwgcmVwbzogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBsZXQgdG90YWxDb3VudCA9IDA7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgZG8ge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlY3IubGlzdEltYWdlcyh7XG4gICAgICAgIHJlcG9zaXRvcnlOYW1lOiByZXBvLFxuICAgICAgICBuZXh0VG9rZW46IG5leHRUb2tlbixcbiAgICAgIH0pO1xuXG4gICAgICB0b3RhbENvdW50ICs9IHJlc3BvbnNlLmltYWdlSWRzPy5sZW5ndGggPz8gMDtcbiAgICAgIG5leHRUb2tlbiA9IHJlc3BvbnNlLm5leHRUb2tlbjtcbiAgICB9IHdoaWxlIChuZXh0VG9rZW4pO1xuXG4gICAgcmV0dXJuIHRvdGFsQ291bnQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jICpyZWFkUmVwb0luQmF0Y2hlcyhlY3I6IElFQ1JDbGllbnQsIHJlcG86IHN0cmluZywgYmF0Y2hTaXplOiBudW1iZXIgPSAxMDAwLCBjdXJyZW50VGltZTogbnVtYmVyKTogQXN5bmNHZW5lcmF0b3I8SW1hZ2VBc3NldFtdPiB7XG4gICAgbGV0IGNvbnRpbnVhdGlvblRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICBkbyB7XG4gICAgICBjb25zdCBiYXRjaDogSW1hZ2VBc3NldFtdID0gW107XG5cbiAgICAgIHdoaWxlIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBlY3IubGlzdEltYWdlcyh7XG4gICAgICAgICAgcmVwb3NpdG9yeU5hbWU6IHJlcG8sXG4gICAgICAgICAgbmV4dFRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTm8gaW1hZ2VzIGluIHRoZSByZXBvc2l0b3J5XG4gICAgICAgIGlmICghcmVzcG9uc2UuaW1hZ2VJZHMgfHwgcmVzcG9uc2UuaW1hZ2VJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtYXAgdW5pcXVlIGltYWdlIGRpZ2VzdCB0byAocG9zc2libHkgbXVsdGlwbGUpIHRhZ3NcbiAgICAgICAgY29uc3QgaW1hZ2VzID0gaW1hZ2VNYXAocmVzcG9uc2UuaW1hZ2VJZHMgPz8gW10pO1xuXG4gICAgICAgIGNvbnN0IGltYWdlSWRzID0gT2JqZWN0LmtleXMoaW1hZ2VzKS5tYXAoa2V5ID0+ICh7XG4gICAgICAgICAgaW1hZ2VEaWdlc3Q6IGtleSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGNvbnN0IGRlc2NyaWJlSW1hZ2VJbmZvID0gYXdhaXQgZWNyLmRlc2NyaWJlSW1hZ2VzKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogaW1hZ2VJZHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGdldEltYWdlSW5mbyA9IGF3YWl0IGVjci5iYXRjaEdldEltYWdlKHtcbiAgICAgICAgICByZXBvc2l0b3J5TmFtZTogcmVwbyxcbiAgICAgICAgICBpbWFnZUlkczogaW1hZ2VJZHMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbWJpbmVkSW1hZ2VJbmZvID0gZGVzY3JpYmVJbWFnZUluZm8uaW1hZ2VEZXRhaWxzPy5tYXAoaW1hZ2VEZXRhaWwgPT4ge1xuICAgICAgICAgIGNvbnN0IG1hdGNoaW5nSW1hZ2UgPSBnZXRJbWFnZUluZm8uaW1hZ2VzPy5maW5kKFxuICAgICAgICAgICAgaW1nID0+IGltZy5pbWFnZUlkPy5pbWFnZURpZ2VzdCA9PT0gaW1hZ2VEZXRhaWwuaW1hZ2VEaWdlc3QsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5pbWFnZURldGFpbCxcbiAgICAgICAgICAgIG1hbmlmZXN0OiBtYXRjaGluZ0ltYWdlPy5pbWFnZU1hbmlmZXN0LFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgaW1hZ2Ugb2YgY29tYmluZWRJbWFnZUluZm8gPz8gW10pIHtcbiAgICAgICAgICBjb25zdCBsYXN0TW9kaWZpZWQgPSBpbWFnZS5pbWFnZVB1c2hlZEF0ID8/IG5ldyBEYXRlKGN1cnJlbnRUaW1lKTtcbiAgICAgICAgICAvLyBTdG9yZSB0aGUgaW1hZ2UgaWYgaXQgd2FzIHB1c2hlZCBlYXJsaWVyIHRoYW4gdG9kYXkgLSBjcmVhdGVkQnVmZmVyRGF5c1xuICAgICAgICAgIGlmIChpbWFnZS5pbWFnZURpZ2VzdCAmJiBsYXN0TW9kaWZpZWQgPCBuZXcgRGF0ZShjdXJyZW50VGltZSAtICh0aGlzLnByb3BzLmNyZWF0ZWRCdWZmZXJEYXlzICogREFZKSkpIHtcbiAgICAgICAgICAgIGJhdGNoLnB1c2gobmV3IEltYWdlQXNzZXQoaW1hZ2UuaW1hZ2VEaWdlc3QsIGltYWdlLmltYWdlU2l6ZUluQnl0ZXMgPz8gMCwgaW1hZ2UuaW1hZ2VUYWdzID8/IFtdLCBpbWFnZS5tYW5pZmVzdCA/PyAnJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UubmV4dFRva2VuO1xuXG4gICAgICAgIGlmICghY29udGludWF0aW9uVG9rZW4pIGJyZWFrOyAvLyBObyBtb3JlIGltYWdlcyB0byBmZXRjaFxuICAgICAgfVxuXG4gICAgICBpZiAoYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICB5aWVsZCBiYXRjaDtcbiAgICAgIH1cbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdG9yIGZ1bmN0aW9uIHRoYXQgcmVhZHMgb2JqZWN0cyBmcm9tIHRoZSBTMyBCdWNrZXQgaW4gYmF0Y2hlcy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgKnJlYWRCdWNrZXRJbkJhdGNoZXMoczM6IElTM0NsaWVudCwgYnVja2V0OiBzdHJpbmcsIGJhdGNoU2l6ZTogbnVtYmVyID0gMTAwMCwgY3VycmVudFRpbWU6IG51bWJlcik6IEFzeW5jR2VuZXJhdG9yPE9iamVjdEFzc2V0W10+IHtcbiAgICBsZXQgY29udGludWF0aW9uVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIGRvIHtcbiAgICAgIGNvbnN0IGJhdGNoOiBPYmplY3RBc3NldFtdID0gW107XG5cbiAgICAgIHdoaWxlIChiYXRjaC5sZW5ndGggPCBiYXRjaFNpemUpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzMy5saXN0T2JqZWN0c1YyKHtcbiAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldCxcbiAgICAgICAgICBDb250aW51YXRpb25Ub2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlLkNvbnRlbnRzPy5mb3JFYWNoKChvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGtleSA9IG9iai5LZXkgPz8gJyc7XG4gICAgICAgICAgY29uc3Qgc2l6ZSA9IG9iai5TaXplID8/IDA7XG4gICAgICAgICAgY29uc3QgbGFzdE1vZGlmaWVkID0gb2JqLkxhc3RNb2RpZmllZCA/PyBuZXcgRGF0ZShjdXJyZW50VGltZSk7XG4gICAgICAgICAgLy8gU3RvcmUgdGhlIG9iamVjdCBpZiBpdCBoYXMgYSBLZXkgYW5kXG4gICAgICAgICAgLy8gaWYgaXQgaGFzIG5vdCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRvZGF5IC0gY3JlYXRlZEJ1ZmZlckRheXNcbiAgICAgICAgICBpZiAoa2V5ICYmIGxhc3RNb2RpZmllZCA8IG5ldyBEYXRlKGN1cnJlbnRUaW1lIC0gKHRoaXMucHJvcHMuY3JlYXRlZEJ1ZmZlckRheXMgKiBEQVkpKSkge1xuICAgICAgICAgICAgYmF0Y2gucHVzaChuZXcgT2JqZWN0QXNzZXQoYnVja2V0LCBrZXksIHNpemUpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnRpbnVhdGlvblRva2VuID0gcmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuO1xuXG4gICAgICAgIGlmICghY29udGludWF0aW9uVG9rZW4pIGJyZWFrOyAvLyBObyBtb3JlIG9iamVjdHMgdG8gZmV0Y2hcbiAgICAgIH1cblxuICAgICAgaWYgKGJhdGNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgeWllbGQgYmF0Y2g7XG4gICAgICB9XG4gICAgfSB3aGlsZSAoY29udGludWF0aW9uVG9rZW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25maXJtYXRpb25Qcm9tcHQocHJpbnRlcjogUHJvZ3Jlc3NQcmludGVyLCBkZWxldGFibGVzOiBHY0Fzc2V0W10sIHR5cGU6IHN0cmluZykge1xuICAgIGNvbnN0IHBsdXJhbGl6ZSA9IChuYW1lOiBzdHJpbmcsIGNvdW50OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIGNvdW50ID09PSAxID8gbmFtZSA6IGAke25hbWV9c2A7XG4gICAgfTtcblxuICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAgIGBGb3VuZCAke2RlbGV0YWJsZXMubGVuZ3RofSAke3BsdXJhbGl6ZSh0eXBlLCBkZWxldGFibGVzLmxlbmd0aCl9IHRvIGRlbGV0ZSBiYXNlZCBvZmYgb2YgdGhlIGZvbGxvd2luZyBjcml0ZXJpYTpgLFxuICAgICAgICBgLSAke3R5cGV9cyBoYXZlIGJlZW4gaXNvbGF0ZWQgZm9yID4gJHt0aGlzLnByb3BzLnJvbGxiYWNrQnVmZmVyRGF5c30gZGF5c2AsXG4gICAgICAgIGAtICR7dHlwZX1zIHdlcmUgY3JlYXRlZCA+ICR7dGhpcy5wcm9wcy5jcmVhdGVkQnVmZmVyRGF5c30gZGF5cyBhZ29gLFxuICAgICAgICAnJyxcbiAgICAgICAgJ0RlbGV0ZSB0aGlzIGJhdGNoICh5ZXMvbm8vZGVsZXRlLWFsbCk/JyxcbiAgICAgIF0uam9pbignXFxuJyk7XG4gICAgICBwcmludGVyLnBhdXNlKCk7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHByb21wdGx5LnByb21wdChtZXNzYWdlLFxuICAgICAgICB7IHRyaW06IHRydWUgfSxcbiAgICAgICk7XG5cbiAgICAgIC8vIEFueXRoaW5nIG90aGVyIHRoYW4geWVzL3kvZGVsZXRlLWFsbCBpcyB0cmVhdGVkIGFzIG5vXG4gICAgICBpZiAoIXJlc3BvbnNlIHx8ICFbJ3llcycsICd5JywgJ2RlbGV0ZS1hbGwnXS5pbmNsdWRlcyhyZXNwb25zZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdEZWxldGlvbiBhYm9ydGVkIGJ5IHVzZXInKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UudG9Mb3dlckNhc2UoKSA9PSAnZGVsZXRlLWFsbCcpIHtcbiAgICAgICAgdGhpcy5jb25maXJtID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHByaW50ZXIucmVzdW1lKCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcGFydGl0aW9uPEE+KHhzOiBJdGVyYWJsZTxBPiwgcHJlZDogKHg6IEEpID0+IGJvb2xlYW4pOiB7IGluY2x1ZGVkOiBBW107IGV4Y2x1ZGVkOiBBW10gfSB7XG4gIGNvbnN0IHJlc3VsdCA9IHtcbiAgICBpbmNsdWRlZDogW10gYXMgQVtdLFxuICAgIGV4Y2x1ZGVkOiBbXSBhcyBBW10sXG4gIH07XG5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKHByZWQoeCkpIHtcbiAgICAgIHJlc3VsdC5pbmNsdWRlZC5wdXNoKHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQuZXhjbHVkZWQucHVzaCh4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbWFnZU1hcChpbWFnZUlkczogSW1hZ2VJZGVudGlmaWVyW10pIHtcbiAgY29uc3QgaW1hZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcbiAgZm9yIChjb25zdCBpbWFnZSBvZiBpbWFnZUlkcyA/PyBbXSkge1xuICAgIGlmICghaW1hZ2UuaW1hZ2VEaWdlc3QgfHwgIWltYWdlLmltYWdlVGFnKSB7IGNvbnRpbnVlOyB9XG4gICAgaWYgKCFpbWFnZXNbaW1hZ2UuaW1hZ2VEaWdlc3RdKSB7XG4gICAgICBpbWFnZXNbaW1hZ2UuaW1hZ2VEaWdlc3RdID0gW107XG4gICAgfVxuICAgIGltYWdlc1tpbWFnZS5pbWFnZURpZ2VzdF0ucHVzaChpbWFnZS5pbWFnZVRhZyk7XG4gIH1cbiAgcmV0dXJuIGltYWdlcztcbn1cbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './garbage-collector';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./garbage-collector"), exports);
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsc0RBQW9DIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9nYXJiYWdlLWNvbGxlY3Rvcic7XG4iXX0=
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { GcAsset as GCAsset } from './garbage-collector';
|
|
2
|
+
import { IoMessaging } from '../../toolkit/cli-io-host';
|
|
2
3
|
export declare class ProgressPrinter {
|
|
4
|
+
private ioHost;
|
|
5
|
+
private action;
|
|
3
6
|
private totalAssets;
|
|
4
7
|
private assetsScanned;
|
|
5
8
|
private taggedAsset;
|
|
@@ -9,7 +12,7 @@ export declare class ProgressPrinter {
|
|
|
9
12
|
private interval;
|
|
10
13
|
private setInterval?;
|
|
11
14
|
private isPaused;
|
|
12
|
-
constructor(totalAssets: number, interval?: number);
|
|
15
|
+
constructor(msg: IoMessaging, totalAssets: number, interval?: number);
|
|
13
16
|
reportScannedAsset(amt: number): void;
|
|
14
17
|
reportTaggedAsset(assets: GCAsset[]): void;
|
|
15
18
|
reportDeletedAsset(assets: GCAsset[]): void;
|