oxygen-cli 1.39.3 → 1.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/core/OxygenCore.js +2 -2
- package/build/errors/helper.js +2 -4
- package/build/lib/cli-util.js +5 -4
- package/build/lib/cli.js +4 -1
- package/build/lib/parallel-launcher.js +11 -2
- package/build/ox_modules/module-web.js +6 -9
- package/build/ox_reporters/reporter-rp.js +63 -31
- package/build/reporter/ReportAggregator.js +29 -8
- package/build/runners/oxygen/index.js +4 -3
- package/package.json +1 -1
|
@@ -55,7 +55,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
55
55
|
this.results = [];
|
|
56
56
|
this.runnerEndPromises = {};
|
|
57
57
|
this.options = options;
|
|
58
|
-
this.instantiateReporters();
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
getExitCode() {
|
|
@@ -74,7 +73,7 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
74
73
|
return exitCode;
|
|
75
74
|
}
|
|
76
75
|
|
|
77
|
-
|
|
76
|
+
async init() {
|
|
78
77
|
this.reporters = [];
|
|
79
78
|
const generalReportingOpts = this.options.reporting || {};
|
|
80
79
|
|
|
@@ -94,10 +93,14 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
94
93
|
const reporter = new Reporters[reporterName](this.options, reporterOpts, this);
|
|
95
94
|
|
|
96
95
|
if (reporter.init) {
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
try {
|
|
97
|
+
await reporter.init();
|
|
98
|
+
} catch (err) {
|
|
99
|
+
console.log(`Failed to initialize "${reporterName}" reporter: ${err.message}`);
|
|
100
|
+
}
|
|
100
101
|
}
|
|
102
|
+
|
|
103
|
+
this.reporters.push(reporter);
|
|
101
104
|
}
|
|
102
105
|
}
|
|
103
106
|
}
|
|
@@ -142,6 +145,22 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
142
145
|
}
|
|
143
146
|
}
|
|
144
147
|
|
|
148
|
+
async onLaunchStart(options) {
|
|
149
|
+
const eventArgs = {
|
|
150
|
+
options
|
|
151
|
+
};
|
|
152
|
+
await this._invokeReportersHook('onLaunchStart', eventArgs);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async onLaunchEnd() {
|
|
156
|
+
const results = this.groupResults();
|
|
157
|
+
const eventArgs = {
|
|
158
|
+
results
|
|
159
|
+
};
|
|
160
|
+
this.emit('launch:end', results);
|
|
161
|
+
await this._invokeReportersHook('onLaunchEnd', eventArgs);
|
|
162
|
+
}
|
|
163
|
+
|
|
145
164
|
async onRunnerStart(rid, opts, caps) {
|
|
146
165
|
if (!rid) {
|
|
147
166
|
throw new Error('"rid" cannot be empty.');
|
|
@@ -286,11 +305,12 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
286
305
|
await this._invokeReportersHook('onSuiteEnd', eventArgs);
|
|
287
306
|
}
|
|
288
307
|
|
|
289
|
-
async onCaseStart(rid, suiteId, caseId, caseDef) {
|
|
308
|
+
async onCaseStart(rid, suiteId, suiteRefId, caseId, caseDef) {
|
|
290
309
|
console.log(`- Case "${caseDef.name}" has started...`);
|
|
291
310
|
const eventArgs = {
|
|
292
311
|
rid,
|
|
293
312
|
suiteId,
|
|
313
|
+
suiteRefId,
|
|
294
314
|
caseId,
|
|
295
315
|
case: caseDef
|
|
296
316
|
};
|
|
@@ -298,12 +318,13 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
298
318
|
await this._invokeReportersHook('onCaseStart', eventArgs);
|
|
299
319
|
}
|
|
300
320
|
|
|
301
|
-
async onCaseEnd(rid, suiteId, caseId, caseResult) {
|
|
321
|
+
async onCaseEnd(rid, suiteId, suiteRefId, caseId, caseResult) {
|
|
302
322
|
console.log(`- Case "${caseResult.name}" has ended with status: ${caseResult.status.toUpperCase()}.`);
|
|
303
323
|
await this._saveTestCaseVideoAttachment(caseResult);
|
|
304
324
|
const eventArgs = {
|
|
305
325
|
rid,
|
|
306
326
|
suiteId,
|
|
327
|
+
suiteRefId,
|
|
307
328
|
caseId,
|
|
308
329
|
result: caseResult
|
|
309
330
|
};
|
|
@@ -575,4 +596,4 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
575
596
|
}
|
|
576
597
|
|
|
577
598
|
exports.default = ReportAggregator;
|
|
578
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsInJwIiwiUmVwb3J0UG9ydGFsUmVwb3J0ZXIiLCJERUZBVUxUX1RFU1RfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVJTIiwiUmVwb3J0QWdncmVnYXRvciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInJlc3VsdHMiLCJydW5uZXJFbmRQcm9taXNlcyIsImluc3RhbnRpYXRlUmVwb3J0ZXJzIiwiZ2V0RXhpdENvZGUiLCJleGl0Q29kZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInRlc3RGYWlsZGVkIiwiZmluZCIsIml0ZW0iLCJzdGF0dXMiLCJyZXBvcnRlcnMiLCJnZW5lcmFsUmVwb3J0aW5nT3B0cyIsInJlcG9ydGluZyIsInJlcG9ydGVyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVwb3J0ZXJOYW1lIiwibmFtZSIsInJlcG9ydGVyT3B0cyIsInVuZGVmaW5lZCIsImVuYWJsZWQiLCJpbml0IiwidGhlbiIsInB1c2giLCJjYXRjaCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJtZXNzYWdlIiwiZ2V0UmVzdWx0cyIsImdlbmVyYXRlUmVwb3J0cyIsImdyb3VwZWRSZXN1bHRzIiwiZ3JvdXBSZXN1bHRzIiwicmVwb3J0UGF0aCIsImdlbmVyYXRlIiwiZSIsImVycm9yIiwid2FpdEZvclJlc3VsdCIsInJpZCIsIndhaXRGb3JSZXN1bHRzIiwiUHJvbWlzZSIsImFsbCIsIm9uUnVubmVyU3RhcnQiLCJvcHRzIiwiY2FwcyIsIkVycm9yIiwidGVzdFJlc3VsdCIsIlRlc3RSZXN1bHQiLCJzdGFydFRpbWUiLCJveHV0aWwiLCJnZXRUaW1lU3RhbXAiLCJjYXBhYmlsaXRpZXMiLCJlbnZpcm9ubWVudCIsImVudlZhcnMiLCJldmVudEFyZ3MiLCJlbWl0IiwiX2ludm9rZVJlcG9ydGVyc0hvb2siLCJvblJ1bm5lckVuZCIsImZpbmFsUmVzdWx0IiwiZmF0YWxFcnJvciIsIngiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzIiwiU3RhdHVzIiwiRkFJTEVEIiwiZmFpbHVyZSIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl9nZXRGaXJzdEZhaWx1cmUiLCJ0eXBlIiwibG9jYXRpb24iLCJ0b1VwcGVyQ2FzZSIsInJlc3VsdCIsInByb2Nlc3MiLCJuZXh0VGljayIsInJlc29sdmUiLCJoYXNGYWlsZWRTdWl0ZXMiLCJzdWl0ZXMiLCJzb21lIiwiaGFzV2FybmluZ1N1aXRlcyIsIldBUk5JTkciLCJhbGxTdWl0ZXNTa2lwcGVkIiwiZXZlcnkiLCJTS0lQUEVEIiwiUEFTU0VEIiwib25JdGVyYXRpb25TdGFydCIsIml0ZXJhdGlvbiIsInN0YXJ0IiwibXNnIiwib25Mb2dFbnRyeSIsIm9uSXRlcmF0aW9uRW5kIiwiaXRlcmF0aW9uTnVtIiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwib25TdWl0ZUVuZCIsInN1aXRlUmVzdWx0Iiwib25DYXNlU3RhcnQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY2FzZSIsIm9uQ2FzZUVuZCIsImNhc2VSZXN1bHQiLCJfc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50Iiwib25TdGVwU3RhcnQiLCJzdGVwIiwicm9vdFBhdGgiLCJmcmFtZXdvcmsiLCJmdWxsUGF0aCIsInBhdGgiLCJvblN0ZXBFbmQiLCJzdGVwUmVzdWx0IiwidGltZSIsImxldmVsIiwic3JjIiwic3RlcElkIiwiRGF0ZSIsIm5vdyIsImNhc2VzIiwic3RlcHMiLCJ1bmdyb3VwZWRSZXN1bHRzIiwiX2dyb3VwUmVzdWx0IiwicmVzdWx0S2V5Iiwic3VpdGVLZXkiLCJncm91cGVkUmVzdWx0IiwiTWF0aCIsIm1pbiIsIm1heCIsImN1cnJlbnRTdWl0ZVJlc3VsdCIsImdyb3VwS2V5IiwiZ3JvdXBlZFN1aXRlUmVzdWx0IiwiX3N1aXRlc0hhc2giLCJjIiwiZ3JvdXBlZFJlc3VsdHNMaXN0Iiwia2V5cyIsIm1hcCIsInN1aXRlR3JvdXBLZXkiLCJmaXJzdEZhaWxlZFN1aXRlIiwicyIsImZpcnN0U3VpdGVXaXRoV2FybmluZyIsInJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzIiwidmFsaWRhdGVSZXN1bHQiLCJmYWlsZWQiLCJ1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMiLCJpbmNsdWRlcyIsIndhcm4iLCJob29rTmFtZSIsImF0dGFjaG1lbnRzIiwiYXR0YWNobWVudHNUb1JlbW92ZSIsImkiLCJhdHRhY2htZW50IiwiX3VybCIsInZpZGVvRmlsZVBhdGgiLCJkb3dubG9hZFZpZGVvIiwiZmlsZU5hbWUiLCJmaWxlUGF0aCIsImVsbUluZGV4VG9SZW1vdmUiLCJpbmRleE9mIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLFNBQVMsR0FBRztBQUNkQyxFQUFBQSxJQUFJLEVBQUVDLHFCQURRO0FBRWRDLEVBQUFBLEtBQUssRUFBRUMsc0JBRk87QUFHZEMsRUFBQUEsSUFBSSxFQUFFQyxxQkFIUTtBQUlkQyxFQUFBQSxLQUFLLEVBQUVDLHNCQUpPO0FBS2RDLEVBQUFBLEdBQUcsRUFBRUMsb0JBTFM7QUFNZEMsRUFBQUEsR0FBRyxFQUFFQyxvQkFOUztBQU9kQyxFQUFBQSxFQUFFLEVBQUVDO0FBUFUsQ0FBbEI7QUFVQSxNQUFNQyxpQkFBaUIsR0FBRyxhQUExQjtBQUNBLE1BQU1DLGlC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QXVCVSxPQUF2QixDQUErQlQsbUJBQW1CLENBQUNDLENBQUQsQ0FBbEQsQ0FBekI7O0FBQ0EsVUFBSSxDQUFDTyxnQkFBRCxHQUFvQixDQUFDLENBQXpCLEVBQTRCO0FBQ3hCdEQsUUFBQUEsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QlcsTUFBdkIsQ0FBOEJGLGdCQUE5QixFQUFnRCxDQUFoRDtBQUNIO0FBQ0o7QUFDSjs7QUF0Z0JzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IFJlcG9ydFBvcnRhbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1ycCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi9tb2RlbC9zdGF0dXMnO1xyXG5cclxuY29uc3QgUmVwb3J0ZXJzID0ge1xyXG4gICAganNvbjogSnNvblJlcG9ydGVyLFxyXG4gICAganVuaXQ6IEpVbml0UmVwb3J0ZXIsXHJcbiAgICBodG1sOiBIdG1sUmVwb3J0ZXIsXHJcbiAgICBleGNlbDogRXhjZWxSZXBvcnRlcixcclxuICAgIHBkZjogUGRmUmVwb3J0ZXIsXHJcbiAgICB4bWw6IFhtbFJlcG9ydGVyLFxyXG4gICAgcnA6IFJlcG9ydFBvcnRhbFJlcG9ydGVyLFxyXG59O1xyXG5cclxuY29uc3QgREVGQVVMVF9URVNUX05BTUUgPSAnT3h5Z2VuIFRlc3QnO1xyXG5jb25zdCBERUZBVUxUX1JFUE9SVEVSUyA9IFtdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0QWdncmVnYXRvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyByZXN1bHRzIGhhc2ggdGFibGUgYmFzZWQgb24gcnVubmVyIGlkIGtleVxyXG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIC8vIGEgaGFzaCBsaXN0IG9mIHJ1bm5lckVuZCBldmVudCBwcm9taXNlcywga2V5ZWQgYnkgcnVubmVyIGlkXHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0ZVJlcG9ydGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4aXRDb2RlKCkge1xyXG4gICAgICAgIGxldCBleGl0Q29kZSA9IDA7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RmFpbGRlZCA9IHRoaXMucmVzdWx0cy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3RGYWlsZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJyb2tlbiA/XHJcbiAgICAgICAgICAgIGV4aXRDb2RlID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgaW5zdGFudGlhdGVSZXBvcnRlcnMoKSB7XHJcbiAgICAgICAgdGhpcy5yZXBvcnRlcnMgPSBbXTtcclxuICAgICAgICBjb25zdCBnZW5lcmFsUmVwb3J0aW5nT3B0cyA9IHRoaXMub3B0aW9ucy5yZXBvcnRpbmcgfHwge307XHJcbiAgICAgICAgZm9yIChsZXQgcmVwb3J0ZXIgb2YgZ2VuZXJhbFJlcG9ydGluZ09wdHMucmVwb3J0ZXJzIHx8IERFRkFVTFRfUkVQT1JURVJTKSB7XHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVwb3J0ZXIgIT09ICdzdHJpbmcnICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVwb3J0ZXIsICduYW1lJykpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSByZXBvcnRlcnMgdGhhdCBkbyBub3QgaGF2ZSAnbmFtZScgcHJvcGVydHkgYXMgaXQncyBlc3NlbnRpYWwgdG8gbG9hZCB0aGUgY29ycmVzcG9uZGluZyBSZXBvcnRlciBjbGFzc1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyTmFtZSA9IHR5cGVvZiByZXBvcnRlciA9PT0gJ3N0cmluZycgPyByZXBvcnRlciA6IHJlcG9ydGVyLm5hbWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyT3B0cyA9IHR5cGVvZiByZXBvcnRlciA9PT0gJ29iamVjdCcgPyByZXBvcnRlciA6IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoUmVwb3J0ZXJzLCByZXBvcnRlck5hbWUpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiByZXBvcnRlciBcImVuYWJsZWRcIiBwcm9wZXJ0eSBpcyBcImZhbHNlXCIgdGhlbiBza2lwIHRoZSByZXBvcnRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydGVyT3B0cyAmJiB0eXBlb2YgcmVwb3J0ZXJPcHRzLmVuYWJsZWQgPT09ICdib29sZWFuJyAmJiAhcmVwb3J0ZXJPcHRzLmVuYWJsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyc1tyZXBvcnRlck5hbWVdKHRoaXMub3B0aW9ucywgcmVwb3J0ZXJPcHRzLCB0aGlzKTtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXBvcnRlciBoYXMgXCJpbml0XCIgZnVuY3Rpb24sIHVzZSBpdCB0byBpbml0aWFsaXplIHRoZSByZXBvcnRlclxyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydGVyLmluaXQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXBvcnRlci5pbml0KClcclxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKCk9PiB0aGlzLnJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnIpPT4gY29uc29sZS5sb2coYEZhaWxlZCB0byBpbml0aWFsaXplIFwiJHtyZXBvcnRlck5hbWV9XCIgcmVwb3J0ZXI6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXBvcnRlcnMucHVzaChyZXBvcnRlcik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UmVzdWx0cygpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdlbmVyYXRlUmVwb3J0cygpIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXBvcnRlcnMpIHx8IHRoaXMucmVwb3J0ZXJzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHMgPSB0aGlzLmdyb3VwUmVzdWx0cygpO1xyXG4gICAgICAgIGZvciAobGV0IHJlcG9ydGVyIG9mIHRoaXMucmVwb3J0ZXJzKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRQYXRoID0gYXdhaXQgcmVwb3J0ZXIuZ2VuZXJhdGUoZ3JvdXBlZFJlc3VsdHMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHJlcG9ydFBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgWW91ciByZXBvcnQgaXMgcmVhZHk6ICR7cmVwb3J0UGF0aH1gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgUmVwb3J0IGdlbmVyYXRpb24gZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yUmVzdWx0KHJpZCkge1xyXG4gICAgICAgIGlmICghcmlkIHx8ICF0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF0pIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF07XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd2FpdEZvclJlc3VsdHMoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucnVubmVyRW5kUHJvbWlzZXMgJiYgdGhpcy5ydW5uZXJFbmRQcm9taXNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHRoaXMucnVubmVyRW5kUHJvbWlzZXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHJpZCwgb3B0cywgY2Fwcykge1xyXG4gICAgICAgIGlmICghcmlkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCJyaWRcIiBjYW5ub3QgYmUgZW1wdHkuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHRlc3RSZXN1bHQucmlkID0gcmlkO1xyXG4gICAgICAgIHRlc3RSZXN1bHQubmFtZSA9IG9wdHMubmFtZSB8fCBERUZBVUxUX1RFU1RfTkFNRTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGNhcHM7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5lbnZpcm9ubWVudCA9IG9wdHMuZW52VmFycyB8fCB7fTtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciBsYXRlciB0byBiZSByZXNvbHZlZCBvbiBydW5uZXI6ZW5kIGV2ZW50XHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgVGVzdCAke3JpZH0gaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgb3B0cyxcclxuICAgICAgICAgICAgY2Fwc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdydW5uZXI6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHJpZCwgZmluYWxSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gdGhpcy5yZXN1bHRzLmZpbmQoeCA9PiB4LnJpZCA9PT0gcmlkKTtcclxuICAgICAgICBpZiAodGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHRlc3RSZXN1bHQuZHVyYXRpb24gPSB0ZXN0UmVzdWx0LmVuZFRpbWUgLSB0ZXN0UmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3Qgc3RhdHVzIGJhc2VkIG9uIHN1aXRlcyBzdGF0dXNlc1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LnN0YXR1cyA9IHRoaXMuX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKTtcclxuICAgICAgICAgICAgLy8gdGVzdFJlc3VsdC5zdGF0dXMgPSBmYXRhbEVycm9yID8gU3RhdHVzLkZBSUxFRCA6ICh0ZXN0UmVzdWx0LnN1aXRlcy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgZmF0YWxFcnJvciBpcyBub3QgaW5oZXJpdGVkIGZyb20gRXJyb3IgY2xhc3MgdGhlbiB3ZSBhbHJlYWR5IGdvdCBPeHlnZW4gRmFpbHVyZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSBmYXRhbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGZhdGFsRXJyb3IpIDogZmF0YWxFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZmFpbHVyZSA9IHRoaXMuX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgJiYgZmluYWxSZXN1bHQuY2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlLnR5cGUgJiYgdGVzdFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfSBhdCAke3Rlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbn0uYCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGVzdFJlc3VsdC5mYWlsdXJlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmV9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBmaW5pc2hlZCB3aXRoIHN0YXR1czogJHt0ZXN0UmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogdGVzdFJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25SdW5uZXJFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF0pIHtcclxuICAgICAgICAgICAgLy8gY2FsbGluZyBuZXh0VGljaygpIHdpbGwgaGVscCB1cyB0byBpbnN1cmUgdGhhdCB3ZSByZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIGVtaXQoJ3J1bm5lcjplbmQnKSBoYXMgY29tcGxldGVkXHJcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdLnJlc29sdmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzKHRlc3RSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICBpZiAoaGFzRmFpbGVkU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBoYXNXYXJuaW5nU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgaWYgKGhhc1dhcm5pbmdTdWl0ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhbGxTdWl0ZXNTa2lwcGVkID0gdGVzdFJlc3VsdC5zdWl0ZXMuZXZlcnkoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLlNLSVBQRUQpO1xyXG4gICAgICAgIGlmIChhbGxTdWl0ZXNTa2lwcGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU0tJUFBFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTRUQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25TdGFydChyaWQsIGl0ZXJhdGlvbiwgc3RhcnQpIHtcclxuICAgICAgICBpZiAoaXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7aXRlcmF0aW9ufSBzdGFydGVkLi4uYDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkxvZ0VudHJ5KG51bGwsICdJTkZPJywgbXNnLCAndXNlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkl0ZXJhdGlvbkVuZChyaWQsIHJlc3VsdCwgc3RhcnQpIHtcclxuICAgICAgICBpZiAocmVzdWx0Py5pdGVyYXRpb25OdW0gJiYgcmVzdWx0LnN0YXR1cz8udG9VcHBlckNhc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7c3RhcnR9IEl0ZXJhdGlvbiAjJHtyZXN1bHQuaXRlcmF0aW9uTnVtfSBlbmRlZCB3aXRoIHN0YXR1czogJHtyZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgU3VpdGUgXCIke3N1aXRlLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBsZXQgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQ6IHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlOiBzdWl0ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3VpdGU6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtzdWl0ZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogc3VpdGVSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdWl0ZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIGNhc2VEZWYpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgLSBDYXNlIFwiJHtjYXNlRGVmLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBjYXNlOiBjYXNlRGVmLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkNhc2VTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHJpZCwgc3VpdGVJZCwgY2FzZUlkLCBjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtjYXNlUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgcmVzdWx0OiBjYXNlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBTdGFydChyaWQsIHN1aXRlSWQsIGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5yb290UGF0aCAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrICYmIHRoaXMub3B0aW9ucy5mcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLnJvb3RQYXRoLCBzdGVwLmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGZ1bGxQYXRoKyc6MSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXAsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3RlcFN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBFbmQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBSZXN1bHQpIHtcclxuICAgICAgICAvL2NvbnN0IHN0YXR1cyA9IHN0ZXBSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy9jb25zdCBkdXJhdGlvbiA9IHN0ZXBSZXN1bHQuZHVyYXRpb24gPyAoc3RlcFJlc3VsdC5kdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMikgOiAwO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwUmVzdWx0Lm5hbWV9XCIgaGFzIGVuZGVkIGluICR7ZHVyYXRpb259cyB3aXRoIHN0YXR1czogJHtzdGF0dXN9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXBSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6ZW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTG9nRW50cnkodGltZSwgbGV2ZWwsIG1zZywgc3JjID0gbnVsbCwgeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCB9ID0ge30pIHtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgc3RlcElkLFxyXG4gICAgICAgICAgICBsZXZlbCxcclxuICAgICAgICAgICAgbXNnLFxyXG4gICAgICAgICAgICB0aW1lLFxyXG4gICAgICAgICAgICBzcmNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbG9nJywgZXZlbnRBcmdzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aW1lKSB7XHJcbiAgICAgICAgICAgIGV2ZW50QXJncy50aW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uTG9nJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGZhaWx1cmUgb2JqZWN0IGluIG9uZSBvZiB0ZXN0IHJlc3VsdCdzIGVudGl0aWVzLiBcclxuICAgICAqIEBwYXJhbSB7VGVzdFJlc3VsdH0gdGVzdFJlc3VsdCBcclxuICAgICAqL1xyXG4gICAgX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0UmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGVSZXN1bHQgb2YgdGVzdFJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlUmVzdWx0IG9mIHN1aXRlUmVzdWx0LmNhc2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1aXRlUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdGVwUmVzdWx0IG9mIGNhc2VSZXN1bHQuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFJlc3VsdC5mYWlsdXJlIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwUmVzdWx0cygpIHtcclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHVuZ3JvdXBlZFJlc3VsdHMgPSBbXTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSB8fCB0aGlzLnJlc3VsdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgdGhpcy5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0IHx8ICFyZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICB1bmdyb3VwZWRSZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5yZXN1bHRLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlS2V5ID0gcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnN1aXRlS2V5O1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV07XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogW10sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1aXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUgPSBNYXRoLm1pbihncm91cGVkUmVzdWx0LnN0YXJ0VGltZSwgcmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmVuZFRpbWUgPSBNYXRoLm1heChncm91cGVkUmVzdWx0LmVuZFRpbWUsIHJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZHVyYXRpb24gPSBncm91cGVkUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBncm91cGluZyBpcyBieSByZXN1bHQgb25seSwgdGhlbiBqdXN0IGFwcGVuZCBjdXJyZW50IHJlc3VsdCdzIHN1aXRlcyB0byB0aGUgZ3JvdXAncyBzdWl0ZXNcclxuICAgICAgICAgICAgaWYgKCFzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFN1aXRlUmVzdWx0IG9mIHJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cEtleSA9IGAke3N1aXRlS2V5fS0ke2N1cnJlbnRTdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW19YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkU3VpdGVSZXN1bHQgPSBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRTdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XSA9IHsgLi4uY3VycmVudFN1aXRlUmVzdWx0IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSwgY3VycmVudFN1aXRlUmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3VpdGVSZXN1bHQuY2FzZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWl0ZVJlc3VsdC5jYXNlcy5zb21lKGMgPT4gYy5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb252ZXJ0IGdyb3VwZWQgcmVzdWx0cyBoYXNoIHRvIGFuIGFycmF5XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHNMaXN0ID0gT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdHMpLm1hcChcclxuICAgICAgICAgICAgZ3JvdXBLZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkubWFwKHN1aXRlR3JvdXBLZXkgPT4gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtzdWl0ZUdyb3VwS2V5XSlcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZhaWxlZFN1aXRlID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdEZhaWxlZFN1aXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0RmFpbGVkU3VpdGUuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1aXRlV2l0aFdhcm5pbmcgPSBncm91cGVkUmVzdWx0LnN1aXRlcy5maW5kKHMgPT4gcy5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTdWl0ZVdpdGhXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0U3VpdGVXaXRoV2FybmluZy5mYWlsdXJlIHx8IGdyb3VwZWRSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVzdWx0cyA9IFsuLi5ncm91cGVkUmVzdWx0c0xpc3QsIC4uLnVuZ3JvdXBlZFJlc3VsdHNdO1xyXG4gICAgICAgIC8vIGNoYW5nZSByZXN1bHRzIHN0YXR1cyB0byBmYWlkZWQgaWYgZmFpbGVkIHN1aXRlcyBhcmUgZmluZGVkXHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cyk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXN1bHQocmVzdWx0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHJlc3VsdCAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQuc3VpdGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkID0gcmVzdWx0LnN1aXRlcy5maW5kKChzdWl0ZSkgPT4gc3VpdGUuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMgPSBbXTtcclxuXHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2ludm9rZVJlcG9ydGVyc0hvb2soaG9va05hbWUsIGV2ZW50QXJncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0ZXJbaG9va05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyW2hvb2tOYW1lXShldmVudEFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBpbnZva2UgcmVwb3J0ZXIgaG9vayBcIiR7aG9va05hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGlmICghY2FzZVJlc3VsdCB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cyB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50c1RvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuX3VybCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRmlsZVBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG94dXRpbC5kb3dubG9hZFZpZGVvKGF0dGFjaG1lbnQuZmlsZU5hbWUsIGF0dGFjaG1lbnQuX3VybCwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmlkZW9GaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZVBhdGggPSB2aWRlb0ZpbGVQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRhY2htZW50WydfdXJsJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGRvd25sb2FkIHZpZGVvIGZpbGU6ICcsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c1RvUmVtb3ZlLnB1c2goYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHZpZGVvIGF0dGFjaG1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZG93bmxvYWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTwgYXR0YWNobWVudHNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbG1JbmRleFRvUmVtb3ZlID0gY2FzZVJlc3VsdC5hdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnRzVG9SZW1vdmVbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIWVsbUluZGV4VG9SZW1vdmUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cy5zcGxpY2UoZWxtSW5kZXhUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
599
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsInJwIiwiUmVwb3J0UG9ydGFsUmVwb3J0ZXIiLCJERUZBVUxUX1RFU1RfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVJTIiwiUmVwb3J0QWdncmVnYXRvciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInJlc3VsdHMiLCJydW5uZXJFbmRQcm9taXNlcyIsImdldEV4aXRDb2RlIiwiZXhpdENvZGUiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ0ZXN0RmFpbGRlZCIsImZpbmQiLCJpdGVtIiwic3RhdHVzIiwiaW5pdCIsInJlcG9ydGVycyIsImdlbmVyYWxSZXBvcnRpbmdPcHRzIiwicmVwb3J0aW5nIiwicmVwb3J0ZXIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZXBvcnRlck5hbWUiLCJuYW1lIiwicmVwb3J0ZXJPcHRzIiwidW5kZWZpbmVkIiwiZW5hYmxlZCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJtZXNzYWdlIiwicHVzaCIsImdldFJlc3VsdHMiLCJnZW5lcmF0ZVJlcG9ydHMiLCJncm91cGVkUmVzdWx0cyIsImdyb3VwUmVzdWx0cyIsInJlcG9ydFBhdGgiLCJnZW5lcmF0ZSIsImUiLCJlcnJvciIsIndhaXRGb3JSZXN1bHQiLCJyaWQiLCJ3YWl0Rm9yUmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJvbkxhdW5jaFN0YXJ0IiwiZXZlbnRBcmdzIiwiX2ludm9rZVJlcG9ydGVyc0hvb2siLCJvbkxhdW5jaEVuZCIsImVtaXQiLCJvblJ1bm5lclN0YXJ0Iiwib3B0cyIsImNhcHMiLCJFcnJvciIsInRlc3RSZXN1bHQiLCJUZXN0UmVzdWx0Iiwic3RhcnRUaW1lIiwib3h1dGlsIiwiZ2V0VGltZVN0YW1wIiwiY2FwYWJpbGl0aWVzIiwiZW52aXJvbm1lbnQiLCJlbnZWYXJzIiwib25SdW5uZXJFbmQiLCJmaW5hbFJlc3VsdCIsImZhdGFsRXJyb3IiLCJ4IiwiZW5kVGltZSIsImR1cmF0aW9uIiwiX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyIsIlN0YXR1cyIsIkZBSUxFRCIsImZhaWx1cmUiLCJlcnJvckhlbHBlciIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfZ2V0Rmlyc3RGYWlsdXJlIiwidHlwZSIsImxvY2F0aW9uIiwidG9VcHBlckNhc2UiLCJyZXN1bHQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJyZXNvbHZlIiwiaGFzRmFpbGVkU3VpdGVzIiwic3VpdGVzIiwic29tZSIsImhhc1dhcm5pbmdTdWl0ZXMiLCJXQVJOSU5HIiwiYWxsU3VpdGVzU2tpcHBlZCIsImV2ZXJ5IiwiU0tJUFBFRCIsIlBBU1NFRCIsIm9uSXRlcmF0aW9uU3RhcnQiLCJpdGVyYXRpb24iLCJzdGFydCIsIm1zZyIsIm9uTG9nRW50cnkiLCJvbkl0ZXJhdGlvbkVuZCIsIml0ZXJhdGlvbk51bSIsIm9uU3VpdGVTdGFydCIsInN1aXRlSWQiLCJzdWl0ZSIsIm9uU3VpdGVFbmQiLCJzdWl0ZVJlc3VsdCIsIm9uQ2FzZVN0YXJ0Iiwic3VpdGVSZWZJZCIsImNhc2VJZCIsImNhc2VEZWYiLCJjYXNlIiwib25DYXNlRW5kIiwiY2FzZVJlc3VsdCIsIl9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQiLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJyb290UGF0aCIsImZyYW1ld29yayIsImZ1bGxQYXRoIiwicGF0aCIsIm9uU3RlcEVuZCIsInN0ZXBSZXN1bHQiLCJ0aW1lIiwibGV2ZWwiLCJzcmMiLCJzdGVwSWQiLCJEYXRlIiwibm93IiwiY2FzZXMiLCJzdGVwcyIsInVuZ3JvdXBlZFJlc3VsdHMiLCJfZ3JvdXBSZXN1bHQiLCJyZXN1bHRLZXkiLCJzdWl0ZUtleSIsImdyb3VwZWRSZXN1bHQiLCJNYXRoIiwibWluIiwibWF4IiwiY3VycmVudFN1aXRlUmVzdWx0IiwiZ3JvdXBLZXkiLCJncm91cGVkU3VpdGVSZXN1bHQiLCJfc3VpdGVzSGFzaCIsImMiLCJncm91cGVkUmVzdWx0c0xpc3QiLCJrZXlzIiwibWFwIiwic3VpdGVHcm91cEtleSIsImZpcnN0RmFpbGVkU3VpdGUiLCJzIiwiZmlyc3RTdWl0ZVdpdGhXYXJuaW5nIiwicmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMiLCJ2YWxpZGF0ZVJlc3VsdCIsImZhaWxlZCIsInVuaXF1ZVN1aXRlc0l0ZXJhdGlvbklkcyIsImluY2x1ZGVzIiwid2FybiIsImhvb2tOYW1lIiwiYXR0YWNobWVudHMiLCJhdHRhY2htZW50c1RvUmVtb3ZlIiwiaSIsImF0dGFjaG1lbnQiLCJfdXJsIiwidmlkZW9GaWxlUGF0aCIsImRvd25sb2FkVmlkZW8iLCJmaWxlTmFtZSIsImZpbGVQYXRoIiwiZWxtSW5kZXhUb1JlbW92ZSIsImluZGV4T2YiLCJzcGxpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsU0FBUyxHQUFHO0FBQ2RDLEVBQUFBLElBQUksRUFBRUMscUJBRFE7QUFFZEMsRUFBQUEsS0FBSyxFQUFFQyxzQkFGTztBQUdkQyxFQUFBQSxJQUFJLEVBQUVDLHFCQUhRO0FBSWRDLEVBQUFBLEtBQUssRUFBRUMsc0JBSk87QUFLZEMsRUFBQUEsR0FBRyxFQUFFQyxvQkFMUztBQU1kQyxFQUFBQSxHQUFHLEVBQUVDLG9CQU5TO0FBT2RDLEVBQUFBLEVBQUUsRUFBRUM7QUFQVSxDQUFsQjtBQVVBLE1BQU1DLGlCQUFpQixHQUFHLGFBQTFCO0FBQ0EsTUFBTUMsaUJBQWlCLEdBQUcsRUFBMUI7O0FBRWUsTUFBTUMsZ0JBQU4sU0FBK0JDLG9CQUEvQixDQUE0QztBQUN2REMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVU7QUFDakI7QUFFQSxTQUFLQyxPQUFMLEdBQWUsRUFBZjtBQUVBLFNBQUtDLGlCQUFMLEdBQXlCLEVBQXpCO0FBQ0EsU0FBS0YsT0FBTCxHQUFlQSxPQUFmO0FBRUg7O0FBRURHLEVBQUFBLFdBQVcsR0FBRztBQUNWLFFBQUlDLFFBQVEsR0FBRyxDQUFmOztBQUVBLFFBQ0ksS0FBS0gsT0FBTCxJQUNBSSxLQUFLLENBQUNDLE9BQU4sQ0FBYyxLQUFLTCxPQUFuQixDQURBLElBRUEsS0FBS0EsT0FBTCxDQUFhTSxNQUFiLEdBQXNCLENBSDFCLEVBSUU7QUFDRSxZQUFNQyxXQUFXLEdBQUcsS0FBS1AsT0FBTCxDQUFhUSxJQUFiLENBQW1CQyxJQUFELElBQVVBLElBQUksQ0FBQ0MsTUFBTCxLQUFnQixRQUE1QyxDQUFwQjs7QUFFQSxVQUFJSCxXQUFKLEVBQWlCO0FBQ2JKLFFBQUFBLFFBQVEsR0FBRyxDQUFDLENBQVo7QUFDSDtBQUNKLEtBVkQsTUFVTztBQUVIQSxNQUFBQSxRQUFRLEdBQUcsQ0FBQyxDQUFaO0FBQ0g7O0FBRUQsV0FBT0EsUUFBUDtBQUNIOztBQUVTLFFBQUpRLElBQUksR0FBRztBQUNULFNBQUtDLFNBQUwsR0FBaUIsRUFBakI7QUFDQSxVQUFNQyxvQkFBb0IsR0FBRyxLQUFLZCxPQUFMLENBQWFlLFNBQWIsSUFBMEIsRUFBdkQ7O0FBQ0EsU0FBSyxJQUFJQyxRQUFULElBQXFCRixvQkFBb0IsQ0FBQ0QsU0FBckIsSUFBa0NqQixpQkFBdkQsRUFBMEU7QUFDdEUsVUFBSSxPQUFPb0IsUUFBUCxLQUFvQixRQUFwQixJQUFnQyxDQUFDQyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLGNBQWpCLENBQWdDQyxJQUFoQyxDQUFxQ0osUUFBckMsRUFBK0MsTUFBL0MsQ0FBckMsRUFBNkY7QUFFekY7QUFDSDs7QUFFRCxZQUFNSyxZQUFZLEdBQUcsT0FBT0wsUUFBUCxLQUFvQixRQUFwQixHQUErQkEsUUFBL0IsR0FBMENBLFFBQVEsQ0FBQ00sSUFBeEU7QUFDQSxZQUFNQyxZQUFZLEdBQUcsT0FBT1AsUUFBUCxLQUFvQixRQUFwQixHQUErQkEsUUFBL0IsR0FBMENRLFNBQS9EOztBQUVBLFVBQUlQLE1BQU0sQ0FBQ0MsU0FBUCxDQUFpQkMsY0FBakIsQ0FBZ0NDLElBQWhDLENBQXFDeEMsU0FBckMsRUFBZ0R5QyxZQUFoRCxDQUFKLEVBQW1FO0FBRS9ELFlBQUlFLFlBQVksSUFBSSxPQUFPQSxZQUFZLENBQUNFLE9BQXBCLEtBQWdDLFNBQWhELElBQTZELENBQUNGLFlBQVksQ0FBQ0UsT0FBL0UsRUFBd0Y7QUFDcEY7QUFDSDs7QUFDRCxjQUFNVCxRQUFRLEdBQUcsSUFBSXBDLFNBQVMsQ0FBQ3lDLFlBQUQsQ0FBYixDQUE0QixLQUFLckIsT0FBakMsRUFBMEN1QixZQUExQyxFQUF3RCxJQUF4RCxDQUFqQjs7QUFFQSxZQUFJUCxRQUFRLENBQUNKLElBQWIsRUFBbUI7QUFDZixjQUFJO0FBQ0Esa0JBQU1JLFFBQVEsQ0FBQ0osSUFBVCxFQUFOO0FBQ0gsV0FGRCxDQUdBLE9BQU9jLEdBQVAsRUFBWTtBQUNSQyxZQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSx5QkFBd0JQLFlBQWEsZUFBY0ssR0FBRyxDQUFDRyxPQUFRLEVBQTVFO0FBQ0g7QUFDSjs7QUFDRCxhQUFLaEIsU0FBTCxDQUFlaUIsSUFBZixDQUFvQmQsUUFBcEI7QUFDSDtBQUNKO0FBQ0o7O0FBRURlLEVBQUFBLFVBQVUsR0FBRztBQUNULFdBQU8sS0FBSzlCLE9BQVo7QUFDSDs7QUFFb0IsUUFBZitCLGVBQWUsR0FBRztBQUNwQixRQUFJLENBQUMzQixLQUFLLENBQUNDLE9BQU4sQ0FBYyxLQUFLTyxTQUFuQixDQUFELElBQWtDLEtBQUtBLFNBQUwsQ0FBZU4sTUFBZixJQUF5QixDQUEvRCxFQUFrRTtBQUM5RCxhQUFPLEtBQVA7QUFDSDs7QUFDRCxVQUFNMEIsY0FBYyxHQUFHLEtBQUtDLFlBQUwsRUFBdkI7O0FBQ0EsU0FBSyxJQUFJbEIsUUFBVCxJQUFxQixLQUFLSCxTQUExQixFQUFxQztBQUNqQyxVQUFJO0FBQ0EsY0FBTXNCLFVBQVUsR0FBRyxNQUFNbkIsUUFBUSxDQUFDb0IsUUFBVCxDQUFrQkgsY0FBbEIsQ0FBekI7O0FBQ0EsWUFBSUUsVUFBSixFQUFnQjtBQUNaUixVQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSx5QkFBd0JPLFVBQVcsRUFBaEQ7QUFDSDtBQUNKLE9BTEQsQ0FNQSxPQUFPRSxDQUFQLEVBQVU7QUFDTlYsUUFBQUEsT0FBTyxDQUFDVyxLQUFSLENBQWUsNkJBQTRCRCxDQUFDLENBQUNSLE9BQVEsRUFBckQ7QUFDSDtBQUNKOztBQUNELFdBQU8sSUFBUDtBQUNIOztBQUVrQixRQUFiVSxhQUFhLENBQUNDLEdBQUQsRUFBTTtBQUNyQixRQUFJLENBQUNBLEdBQUQsSUFBUSxDQUFDLEtBQUt0QyxpQkFBTCxDQUF1QnNDLEdBQXZCLENBQWIsRUFBMEM7QUFDdEMsYUFBTyxJQUFQO0FBQ0g7O0FBQ0QsV0FBTyxLQUFLdEMsaUJBQUwsQ0FBdUJzQyxHQUF2QixDQUFQO0FBQ0g7O0FBRW1CLFFBQWRDLGNBQWMsR0FBRztBQUNuQixRQUFJLEtBQUt2QyxpQkFBTCxJQUEwQixLQUFLQSxpQkFBTCxDQUF1QkssTUFBckQsRUFBNkQ7QUFDekQsYUFBT21DLE9BQU8sQ0FBQ0MsR0FBUixDQUFZLEtBQUt6QyxpQkFBakIsQ0FBUDtBQUNIO0FBQ0o7O0FBRWtCLFFBQWIwQyxhQUFhLENBQUM1QyxPQUFELEVBQVU7QUFDekIsVUFBTTZDLFNBQVMsR0FBRztBQUNkN0MsTUFBQUE7QUFEYyxLQUFsQjtBQUdBLFVBQU0sS0FBSzhDLG9CQUFMLENBQTBCLGVBQTFCLEVBQTJDRCxTQUEzQyxDQUFOO0FBQ0g7O0FBRWdCLFFBQVhFLFdBQVcsR0FBRztBQUNoQixVQUFNOUMsT0FBTyxHQUFHLEtBQUtpQyxZQUFMLEVBQWhCO0FBQ0EsVUFBTVcsU0FBUyxHQUFHO0FBQ2Q1QyxNQUFBQTtBQURjLEtBQWxCO0FBR0EsU0FBSytDLElBQUwsQ0FBVSxZQUFWLEVBQXdCL0MsT0FBeEI7QUFDQSxVQUFNLEtBQUs2QyxvQkFBTCxDQUEwQixhQUExQixFQUF5Q0QsU0FBekMsQ0FBTjtBQUNIOztBQUVrQixRQUFiSSxhQUFhLENBQUNULEdBQUQsRUFBTVUsSUFBTixFQUFZQyxJQUFaLEVBQWtCO0FBQ2pDLFFBQUksQ0FBQ1gsR0FBTCxFQUFVO0FBQ04sWUFBTSxJQUFJWSxLQUFKLENBQVUsd0JBQVYsQ0FBTjtBQUNIOztBQUNELFVBQU1DLFVBQVUsR0FBRyxJQUFJQyxtQkFBSixFQUFuQjtBQUNBRCxJQUFBQSxVQUFVLENBQUNiLEdBQVgsR0FBaUJBLEdBQWpCO0FBQ0FhLElBQUFBLFVBQVUsQ0FBQy9CLElBQVgsR0FBa0I0QixJQUFJLENBQUM1QixJQUFMLElBQWEzQixpQkFBL0I7QUFDQTBELElBQUFBLFVBQVUsQ0FBQ0UsU0FBWCxHQUF1QkMsY0FBT0MsWUFBUCxFQUF2QjtBQUNBSixJQUFBQSxVQUFVLENBQUNLLFlBQVgsR0FBMEJQLElBQTFCO0FBQ0FFLElBQUFBLFVBQVUsQ0FBQ00sV0FBWCxHQUF5QlQsSUFBSSxDQUFDVSxPQUFMLElBQWdCLEVBQXpDO0FBQ0FQLElBQUFBLFVBQVUsQ0FBQ3JELE9BQVgsR0FBcUJrRCxJQUFyQjtBQUNBLFNBQUtqRCxPQUFMLENBQWE2QixJQUFiLENBQWtCdUIsVUFBbEI7QUFFQSxTQUFLbkQsaUJBQUwsQ0FBdUJzQyxHQUF2QixJQUE4QixrQkFBOUI7QUFDQWIsSUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQWEsUUFBT1ksR0FBSSxpQkFBeEI7QUFDQSxVQUFNSyxTQUFTLEdBQUc7QUFDZEwsTUFBQUEsR0FEYztBQUVkVSxNQUFBQSxJQUZjO0FBR2RDLE1BQUFBO0FBSGMsS0FBbEI7QUFLQSxTQUFLSCxJQUFMLENBQVUsY0FBVixFQUEwQkgsU0FBMUI7QUFDQSxVQUFNLEtBQUtDLG9CQUFMLENBQTBCLGVBQTFCLEVBQTJDRCxTQUEzQyxDQUFOO0FBQ0g7O0FBRWdCLFFBQVhnQixXQUFXLENBQUNyQixHQUFELEVBQU1zQixXQUFOLEVBQW1CQyxVQUFuQixFQUErQjtBQUM1QyxVQUFNVixVQUFVLEdBQUcsS0FBS3BELE9BQUwsQ0FBYVEsSUFBYixDQUFrQnVELENBQUMsSUFBSUEsQ0FBQyxDQUFDeEIsR0FBRixLQUFVQSxHQUFqQyxDQUFuQjs7QUFDQSxRQUFJYSxVQUFKLEVBQWdCO0FBQ1pBLE1BQUFBLFVBQVUsQ0FBQ1ksT0FBWCxHQUFxQlQsY0FBT0MsWUFBUCxFQUFyQjtBQUNBSixNQUFBQSxVQUFVLENBQUNhLFFBQVgsR0FBc0JiLFVBQVUsQ0FBQ1ksT0FBWCxHQUFxQlosVUFBVSxDQUFDRSxTQUF0RDtBQUVBRixNQUFBQSxVQUFVLENBQUMxQyxNQUFYLEdBQW9CLEtBQUt3RCw0QkFBTCxDQUFrQ2QsVUFBbEMsRUFBOENVLFVBQTlDLENBQXBCOztBQUVBLFVBQUlWLFVBQVUsQ0FBQzFDLE1BQVgsS0FBc0J5RCxnQkFBT0MsTUFBakMsRUFBeUM7QUFDckMsWUFBSU4sVUFBSixFQUFnQjtBQUVaVixVQUFBQSxVQUFVLENBQUNpQixPQUFYLEdBQXFCUCxVQUFVLFlBQVlYLEtBQXRCLEdBQThCbUIsZ0JBQVlDLG1CQUFaLENBQWdDVCxVQUFoQyxDQUE5QixHQUE0RUEsVUFBakc7QUFDSCxTQUhELE1BSUs7QUFDRFYsVUFBQUEsVUFBVSxDQUFDaUIsT0FBWCxHQUFxQixLQUFLRyxnQkFBTCxDQUFzQnBCLFVBQXRCLENBQXJCO0FBQ0g7QUFDSjs7QUFDRCxVQUFJUyxXQUFXLElBQUlBLFdBQVcsQ0FBQ0osWUFBL0IsRUFBNkM7QUFDekNMLFFBQUFBLFVBQVUsQ0FBQ0ssWUFBWCxHQUEwQkksV0FBVyxDQUFDSixZQUF0QztBQUNIOztBQUNELFVBQUlMLFVBQVUsQ0FBQ2lCLE9BQWYsRUFBd0I7QUFDcEIsWUFBSWpCLFVBQVUsQ0FBQ2lCLE9BQVgsQ0FBbUJJLElBQW5CLElBQTJCckIsVUFBVSxDQUFDaUIsT0FBWCxDQUFtQkssUUFBbEQsRUFBNEQ7QUFDeERoRCxVQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxVQUFTeUIsVUFBVSxDQUFDaUIsT0FBWCxDQUFtQkksSUFBSyxPQUFNckIsVUFBVSxDQUFDaUIsT0FBWCxDQUFtQkssUUFBUyxHQUFoRjtBQUNILFNBRkQsTUFFTyxJQUFJdEIsVUFBVSxDQUFDaUIsT0FBWCxDQUFtQkksSUFBdkIsRUFBNkI7QUFDaEMvQyxVQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxVQUFTeUIsVUFBVSxDQUFDaUIsT0FBWCxDQUFtQkksSUFBSyxFQUE5QztBQUNILFNBRk0sTUFFQSxJQUFJLE9BQU9yQixVQUFVLENBQUNpQixPQUFsQixLQUE4QixRQUFsQyxFQUE0QztBQUMvQzNDLFVBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFVBQVN5QixVQUFVLENBQUNpQixPQUFRLEVBQXpDO0FBQ0g7QUFDSjs7QUFDRDNDLE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFFBQU9ZLEdBQUksOEJBQTZCYSxVQUFVLENBQUMxQyxNQUFYLENBQWtCaUUsV0FBbEIsRUFBZ0MsR0FBckY7QUFDSDs7QUFDRCxVQUFNL0IsU0FBUyxHQUFHO0FBQ2RMLE1BQUFBLEdBRGM7QUFFZHFDLE1BQUFBLE1BQU0sRUFBRXhCO0FBRk0sS0FBbEI7QUFJQSxTQUFLTCxJQUFMLENBQVUsWUFBVixFQUF3QkgsU0FBeEI7QUFDQSxVQUFNLEtBQUtDLG9CQUFMLENBQTBCLGFBQTFCLEVBQXlDRCxTQUF6QyxDQUFOOztBQUNBLFFBQUksS0FBSzNDLGlCQUFMLENBQXVCc0MsR0FBdkIsQ0FBSixFQUFpQztBQUU3QnNDLE1BQUFBLE9BQU8sQ0FBQ0MsUUFBUixDQUFpQixNQUFNO0FBQ25CLGFBQUs3RSxpQkFBTCxDQUF1QnNDLEdBQXZCLEVBQTRCd0MsT0FBNUIsQ0FBb0MzQixVQUFwQztBQUNILE9BRkQ7QUFHSDtBQUNKOztBQUVEYyxFQUFBQSw0QkFBNEIsQ0FBQ2QsVUFBRCxFQUFhVSxVQUFiLEVBQXlCO0FBQ2pELFFBQUlBLFVBQUosRUFBZ0I7QUFDWixhQUFPSyxnQkFBT0MsTUFBZDtBQUNIOztBQUNELFVBQU1ZLGVBQWUsR0FBRzVCLFVBQVUsQ0FBQzZCLE1BQVgsQ0FBa0JDLElBQWxCLENBQXVCbkIsQ0FBQyxJQUFJQSxDQUFDLENBQUNyRCxNQUFGLEtBQWF5RCxnQkFBT0MsTUFBaEQsQ0FBeEI7O0FBQ0EsUUFBSVksZUFBSixFQUFxQjtBQUNqQixhQUFPYixnQkFBT0MsTUFBZDtBQUNIOztBQUNELFVBQU1lLGdCQUFnQixHQUFHL0IsVUFBVSxDQUFDNkIsTUFBWCxDQUFrQkMsSUFBbEIsQ0FBdUJuQixDQUFDLElBQUlBLENBQUMsQ0FBQ3JELE1BQUYsS0FBYXlELGdCQUFPaUIsT0FBaEQsQ0FBekI7O0FBQ0EsUUFBSUQsZ0JBQUosRUFBc0I7QUFDbEIsYUFBT2hCLGdCQUFPaUIsT0FBZDtBQUNIOztBQUNELFVBQU1DLGdCQUFnQixHQUFHakMsVUFBVSxDQUFDNkIsTUFBWCxDQUFrQkssS0FBbEIsQ0FBd0J2QixDQUFDLElBQUlBLENBQUMsQ0FBQ3JELE1BQUYsS0FBYXlELGdCQUFPb0IsT0FBakQsQ0FBekI7O0FBQ0EsUUFBSUYsZ0JBQUosRUFBc0I7QUFDbEIsYUFBT2xCLGdCQUFPb0IsT0FBZDtBQUNIOztBQUNELFdBQU9wQixnQkFBT3FCLE1BQWQ7QUFDSDs7QUFFcUIsUUFBaEJDLGdCQUFnQixDQUFDbEQsR0FBRCxFQUFNbUQsU0FBTixFQUFpQkMsS0FBakIsRUFBd0I7QUFDMUMsUUFBSUQsU0FBSixFQUFlO0FBQ1gsWUFBTUUsR0FBRyxHQUFJLEdBQUVELEtBQU0sZUFBY0QsU0FBVSxhQUE3QztBQUNBaEUsTUFBQUEsT0FBTyxDQUFDQyxHQUFSLENBQVlpRSxHQUFaO0FBQ0EsWUFBTSxLQUFLQyxVQUFMLENBQWdCLElBQWhCLEVBQXNCLE1BQXRCLEVBQThCRCxHQUE5QixFQUFtQyxNQUFuQyxDQUFOO0FBQ0g7QUFDSjs7QUFFbUIsUUFBZEUsY0FBYyxDQUFDdkQsR0FBRCxFQUFNcUMsTUFBTixFQUFjZSxLQUFkLEVBQXFCO0FBQUE7O0FBQ3JDLFFBQUlmLE1BQU0sU0FBTixJQUFBQSxNQUFNLFdBQU4sSUFBQUEsTUFBTSxDQUFFbUIsWUFBUixzQkFBd0JuQixNQUFNLENBQUNsRSxNQUEvQiwyQ0FBd0IsZUFBZWlFLFdBQTNDLEVBQXdEO0FBQ3BELFlBQU1pQixHQUFHLEdBQUksR0FBRUQsS0FBTSxlQUFjZixNQUFNLENBQUNtQixZQUFhLHVCQUFzQm5CLE1BQU0sQ0FBQ2xFLE1BQVAsQ0FBY2lFLFdBQWQsRUFBNEIsR0FBekc7QUFDQWpELE1BQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFZaUUsR0FBWjtBQUNBLFlBQU0sS0FBS0MsVUFBTCxDQUFnQixJQUFoQixFQUFzQixNQUF0QixFQUE4QkQsR0FBOUIsRUFBbUMsTUFBbkMsQ0FBTjtBQUNIO0FBQ0o7O0FBRWlCLFFBQVpJLFlBQVksQ0FBQ3pELEdBQUQsRUFBTTBELE9BQU4sRUFBZUMsS0FBZixFQUFzQjtBQUNwQ3hFLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFVBQVN1RSxLQUFLLENBQUM3RSxJQUFLLGtCQUFqQztBQUNBLFFBQUl1QixTQUFTLEdBQUc7QUFDWkwsTUFBQUEsR0FEWTtBQUVaMEQsTUFBQUEsT0FBTyxFQUFFQSxPQUZHO0FBR1pDLE1BQUFBLEtBQUssRUFBRUE7QUFISyxLQUFoQjtBQUtBLFNBQUtuRCxJQUFMLENBQVUsYUFBVixFQUF5QkgsU0FBekI7QUFDQSxVQUFNLEtBQUtDLG9CQUFMLENBQTBCLGNBQTFCLEVBQTBDRCxTQUExQyxDQUFOO0FBQ0g7O0FBRWUsUUFBVnVELFVBQVUsQ0FBQzVELEdBQUQsRUFBTTBELE9BQU4sRUFBZUcsV0FBZixFQUE0QjtBQUN4QyxVQUFNaEQsVUFBVSxHQUFHLEtBQUtwRCxPQUFMLENBQWFRLElBQWIsQ0FBa0J1RCxDQUFDLElBQUlBLENBQUMsQ0FBQ3hCLEdBQUYsS0FBVUEsR0FBakMsQ0FBbkI7O0FBQ0EsUUFBSSxDQUFDYSxVQUFMLEVBQWlCO0FBQ2I7QUFDSDs7QUFDREEsSUFBQUEsVUFBVSxDQUFDNkIsTUFBWCxDQUFrQnBELElBQWxCLENBQXVCdUUsV0FBdkI7QUFDQTFFLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFVBQVN5RSxXQUFXLENBQUMvRSxJQUFLLDRCQUEyQitFLFdBQVcsQ0FBQzFGLE1BQVosQ0FBbUJpRSxXQUFuQixFQUFpQyxHQUFuRztBQUNBLFVBQU0vQixTQUFTLEdBQUc7QUFDZEwsTUFBQUEsR0FEYztBQUVkMEQsTUFBQUEsT0FGYztBQUdkckIsTUFBQUEsTUFBTSxFQUFFd0I7QUFITSxLQUFsQjtBQUtBLFNBQUtyRCxJQUFMLENBQVUsV0FBVixFQUF1QkgsU0FBdkI7QUFDQSxVQUFNLEtBQUtDLG9CQUFMLENBQTBCLFlBQTFCLEVBQXdDRCxTQUF4QyxDQUFOO0FBQ0g7O0FBRWdCLFFBQVh5RCxXQUFXLENBQUM5RCxHQUFELEVBQU0wRCxPQUFOLEVBQWVLLFVBQWYsRUFBMkJDLE1BQTNCLEVBQW1DQyxPQUFuQyxFQUE0QztBQUN6RDlFLElBQUFBLE9BQU8sQ0FBQ0MsR0FBUixDQUFhLFdBQVU2RSxPQUFPLENBQUNuRixJQUFLLGtCQUFwQztBQUNBLFVBQU11QixTQUFTLEdBQUc7QUFDZEwsTUFBQUEsR0FEYztBQUVkMEQsTUFBQUEsT0FGYztBQUdkSyxNQUFBQSxVQUhjO0FBSWRDLE1BQUFBLE1BSmM7QUFLZEUsTUFBQUEsSUFBSSxFQUFFRDtBQUxRLEtBQWxCO0FBT0EsU0FBS3pELElBQUwsQ0FBVSxZQUFWLEVBQXdCSCxTQUF4QjtBQUNBLFVBQU0sS0FBS0Msb0JBQUwsQ0FBMEIsYUFBMUIsRUFBeUNELFNBQXpDLENBQU47QUFDSDs7QUFFYyxRQUFUOEQsU0FBUyxDQUFDbkUsR0FBRCxFQUFNMEQsT0FBTixFQUFlSyxVQUFmLEVBQTJCQyxNQUEzQixFQUFtQ0ksVUFBbkMsRUFBK0M7QUFDMURqRixJQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBYSxXQUFVZ0YsVUFBVSxDQUFDdEYsSUFBSyw0QkFBMkJzRixVQUFVLENBQUNqRyxNQUFYLENBQWtCaUUsV0FBbEIsRUFBZ0MsR0FBbEc7QUFDQSxVQUFNLEtBQUtpQyw0QkFBTCxDQUFrQ0QsVUFBbEMsQ0FBTjtBQUNBLFVBQU0vRCxTQUFTLEdBQUc7QUFDZEwsTUFBQUEsR0FEYztBQUVkMEQsTUFBQUEsT0FGYztBQUdkSyxNQUFBQSxVQUhjO0FBSWRDLE1BQUFBLE1BSmM7QUFLZDNCLE1BQUFBLE1BQU0sRUFBRStCO0FBTE0sS0FBbEI7QUFPQSxTQUFLNUQsSUFBTCxDQUFVLFVBQVYsRUFBc0JILFNBQXRCO0FBQ0EsVUFBTSxLQUFLQyxvQkFBTCxDQUEwQixXQUExQixFQUF1Q0QsU0FBdkMsQ0FBTjtBQUNIOztBQUVnQixRQUFYaUUsV0FBVyxDQUFDdEUsR0FBRCxFQUFNMEQsT0FBTixFQUFlTSxNQUFmLEVBQXVCTyxJQUF2QixFQUE2QjtBQUUxQyxRQUFJLEtBQUsvRyxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYWdILFFBQTdCLElBQXlDLEtBQUtoSCxPQUFMLENBQWFpSCxTQUF0RCxJQUFtRSxLQUFLakgsT0FBTCxDQUFhaUgsU0FBYixLQUEyQixVQUFsRyxFQUE4RztBQUMxRyxZQUFNQyxRQUFRLEdBQUdDLGNBQUtuQyxPQUFMLENBQWEsS0FBS2hGLE9BQUwsQ0FBYWdILFFBQTFCLEVBQW9DRCxJQUFJLENBQUNwQyxRQUF6QyxDQUFqQjs7QUFDQW9DLE1BQUFBLElBQUksQ0FBQ3BDLFFBQUwsR0FBZ0J1QyxRQUFRLEdBQUMsSUFBekI7QUFDSDs7QUFDRCxVQUFNckUsU0FBUyxHQUFHO0FBQ2RMLE1BQUFBLEdBRGM7QUFFZDBELE1BQUFBLE9BRmM7QUFHZE0sTUFBQUEsTUFIYztBQUlkTyxNQUFBQSxJQUFJLEVBQUVBO0FBSlEsS0FBbEI7QUFNQSxTQUFLL0QsSUFBTCxDQUFVLFlBQVYsRUFBd0JILFNBQXhCO0FBQ0EsVUFBTSxLQUFLQyxvQkFBTCxDQUEwQixhQUExQixFQUF5Q0QsU0FBekMsQ0FBTjtBQUNIOztBQUVjLFFBQVR1RSxTQUFTLENBQUM1RSxHQUFELEVBQU0wRCxPQUFOLEVBQWVNLE1BQWYsRUFBdUJhLFVBQXZCLEVBQW1DO0FBSTlDLFVBQU14RSxTQUFTLEdBQUc7QUFDZEwsTUFBQUEsR0FEYztBQUVkMEQsTUFBQUEsT0FGYztBQUdkTSxNQUFBQSxNQUhjO0FBSWRPLE1BQUFBLElBQUksRUFBRU07QUFKUSxLQUFsQjtBQU1BLFNBQUtyRSxJQUFMLENBQVUsVUFBVixFQUFzQkgsU0FBdEI7QUFDQSxVQUFNLEtBQUtDLG9CQUFMLENBQTBCLFdBQTFCLEVBQXVDRCxTQUF2QyxDQUFOO0FBQ0g7O0FBRWUsUUFBVmlELFVBQVUsQ0FBQ3dCLElBQUQsRUFBT0MsS0FBUCxFQUFjMUIsR0FBZCxFQUFtQjJCLEdBQUcsR0FBRyxJQUF6QixFQUErQjtBQUFFdEIsSUFBQUEsT0FBRjtBQUFXTSxJQUFBQSxNQUFYO0FBQW1CaUIsSUFBQUE7QUFBbkIsTUFBOEIsRUFBN0QsRUFBaUU7QUFDN0UsVUFBTTVFLFNBQVMsR0FBRztBQUNkcUQsTUFBQUEsT0FEYztBQUVkTSxNQUFBQSxNQUZjO0FBR2RpQixNQUFBQSxNQUhjO0FBSWRGLE1BQUFBLEtBSmM7QUFLZDFCLE1BQUFBLEdBTGM7QUFNZHlCLE1BQUFBLElBTmM7QUFPZEUsTUFBQUE7QUFQYyxLQUFsQjtBQVNBLFNBQUt4RSxJQUFMLENBQVUsS0FBVixFQUFpQkgsU0FBakI7O0FBRUEsUUFBSSxDQUFDeUUsSUFBTCxFQUFXO0FBQ1B6RSxNQUFBQSxTQUFTLENBQUN5RSxJQUFWLEdBQWlCSSxJQUFJLENBQUNDLEdBQUwsRUFBakI7QUFDSDs7QUFFRCxVQUFNLEtBQUs3RSxvQkFBTCxDQUEwQixPQUExQixFQUFtQ0QsU0FBbkMsQ0FBTjtBQUNIOztBQU1ENEIsRUFBQUEsZ0JBQWdCLENBQUNwQixVQUFELEVBQWE7QUFDekIsUUFBSUEsVUFBVSxDQUFDMUMsTUFBWCxLQUFzQnlELGdCQUFPQyxNQUFqQyxFQUF5QztBQUNyQyxVQUFJaEIsVUFBVSxDQUFDaUIsT0FBZixFQUF3QjtBQUNwQixlQUFPakIsVUFBVSxDQUFDaUIsT0FBbEI7QUFDSDs7QUFDRCxXQUFLLElBQUkrQixXQUFULElBQXdCaEQsVUFBVSxDQUFDNkIsTUFBbkMsRUFBMkM7QUFDdkMsWUFBSW1CLFdBQVcsQ0FBQzFGLE1BQVosS0FBdUJ5RCxnQkFBT0MsTUFBbEMsRUFBMEM7QUFDdEM7QUFDSDs7QUFDRCxZQUFJZ0MsV0FBVyxDQUFDL0IsT0FBaEIsRUFBeUI7QUFDckIsaUJBQU8rQixXQUFXLENBQUMvQixPQUFuQjtBQUNIOztBQUNELGFBQUssSUFBSXNDLFVBQVQsSUFBdUJQLFdBQVcsQ0FBQ3VCLEtBQW5DLEVBQTBDO0FBQ3RDLGNBQUl2QixXQUFXLENBQUMxRixNQUFaLEtBQXVCeUQsZ0JBQU9DLE1BQWxDLEVBQTBDO0FBQ3RDO0FBQ0g7O0FBQ0QsY0FBSXVDLFVBQVUsQ0FBQ3RDLE9BQWYsRUFBd0I7QUFDcEIsbUJBQU9zQyxVQUFVLENBQUN0QyxPQUFsQjtBQUNIOztBQUNELGVBQUssSUFBSStDLFVBQVQsSUFBdUJULFVBQVUsQ0FBQ2lCLEtBQWxDLEVBQXlDO0FBQ3JDLGdCQUFJUixVQUFVLENBQUMxRyxNQUFYLEtBQXNCeUQsZ0JBQU9DLE1BQWpDLEVBQXlDO0FBQ3JDO0FBQ0g7O0FBQ0QsbUJBQU9nRCxVQUFVLENBQUMvQyxPQUFYLElBQXNCLElBQTdCO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBQ0QsV0FBTyxJQUFQO0FBQ0g7O0FBRURwQyxFQUFBQSxZQUFZLEdBQUc7QUFDWCxVQUFNRCxjQUFjLEdBQUcsRUFBdkI7QUFDQSxVQUFNNkYsZ0JBQWdCLEdBQUcsRUFBekI7O0FBQ0EsUUFBSSxDQUFDekgsS0FBSyxDQUFDQyxPQUFOLENBQWMsS0FBS0wsT0FBbkIsQ0FBRCxJQUFnQyxLQUFLQSxPQUFMLENBQWFNLE1BQWIsSUFBdUIsQ0FBM0QsRUFBOEQ7QUFDMUQsYUFBTyxLQUFQO0FBQ0g7O0FBQ0QsU0FBSyxJQUFJc0UsTUFBVCxJQUFtQixLQUFLNUUsT0FBeEIsRUFBaUM7QUFDN0IsVUFBSSxDQUFDNEUsTUFBTSxDQUFDN0UsT0FBUCxDQUFlK0gsWUFBaEIsSUFBZ0MsQ0FBQ2xELE1BQU0sQ0FBQzdFLE9BQVAsQ0FBZStILFlBQWYsQ0FBNEJDLFNBQWpFLEVBQTRFO0FBQ3hFRixRQUFBQSxnQkFBZ0IsQ0FBQ2hHLElBQWpCLENBQXNCK0MsTUFBdEI7QUFDQTtBQUNIOztBQUNELFlBQU1tRCxTQUFTLEdBQUduRCxNQUFNLENBQUM3RSxPQUFQLENBQWUrSCxZQUFmLENBQTRCQyxTQUE5QztBQUNBLFlBQU1DLFFBQVEsR0FBR3BELE1BQU0sQ0FBQzdFLE9BQVAsQ0FBZStILFlBQWYsQ0FBNEJFLFFBQTdDO0FBQ0EsVUFBSUMsYUFBYSxHQUFHakcsY0FBYyxDQUFDK0YsU0FBRCxDQUFsQzs7QUFDQSxVQUFJLENBQUNFLGFBQUwsRUFBb0I7QUFDaEJBLFFBQUFBLGFBQWEsR0FBR2pHLGNBQWMsQ0FBQytGLFNBQUQsQ0FBZCxHQUE0QixFQUN4QyxHQUFHbkQsTUFEcUM7QUFFeENLLFVBQUFBLE1BQU0sRUFBRTtBQUZnQyxTQUE1Qzs7QUFJQSxZQUFJK0MsUUFBSixFQUFjO0FBQ1ZDLFVBQUFBLGFBQWEsQ0FBQyxhQUFELENBQWIsR0FBK0IsRUFBL0I7QUFDSDtBQUNKLE9BUkQsTUFTSztBQUNEQSxRQUFBQSxhQUFhLENBQUMzRSxTQUFkLEdBQTBCNEUsSUFBSSxDQUFDQyxHQUFMLENBQVNGLGFBQWEsQ0FBQzNFLFNBQXZCLEVBQWtDc0IsTUFBTSxDQUFDdEIsU0FBekMsQ0FBMUI7QUFDQTJFLFFBQUFBLGFBQWEsQ0FBQ2pFLE9BQWQsR0FBd0JrRSxJQUFJLENBQUNFLEdBQUwsQ0FBU0gsYUFBYSxDQUFDakUsT0FBdkIsRUFBZ0NZLE1BQU0sQ0FBQ1osT0FBdkMsQ0FBeEI7QUFDQWlFLFFBQUFBLGFBQWEsQ0FBQ2hFLFFBQWQsR0FBeUJnRSxhQUFhLENBQUNqRSxPQUFkLEdBQXdCaUUsYUFBYSxDQUFDM0UsU0FBL0Q7QUFDSDs7QUFFRCxVQUFJLENBQUMwRSxRQUFMLEVBQWU7QUFDWEMsUUFBQUEsYUFBYSxDQUFDaEQsTUFBZCxHQUF1QixDQUNuQixHQUFHZ0QsYUFBYSxDQUFDaEQsTUFERSxFQUVuQixHQUFHTCxNQUFNLENBQUNLLE1BRlMsQ0FBdkI7QUFJSCxPQUxELE1BTUs7QUFDRCxhQUFLLE1BQU1vRCxrQkFBWCxJQUFpQ3pELE1BQU0sQ0FBQ0ssTUFBeEMsRUFBZ0Q7QUFDNUMsZ0JBQU1xRCxRQUFRLEdBQUksR0FBRU4sUUFBUyxJQUFHSyxrQkFBa0IsQ0FBQ3RDLFlBQWEsRUFBaEU7QUFDQSxnQkFBTXdDLGtCQUFrQixHQUFHTixhQUFhLENBQUNPLFdBQWQsQ0FBMEJGLFFBQTFCLENBQTNCOztBQUNBLGNBQUksQ0FBQ0Msa0JBQUwsRUFBeUI7QUFDckJOLFlBQUFBLGFBQWEsQ0FBQ08sV0FBZCxDQUEwQkYsUUFBMUIsSUFBc0MsRUFBRSxHQUFHRDtBQUFMLGFBQXRDO0FBQ0gsV0FGRCxNQUdLO0FBQ0RFLFlBQUFBLGtCQUFrQixDQUFDakYsU0FBbkIsR0FBK0I0RSxJQUFJLENBQUNDLEdBQUwsQ0FBU0ksa0JBQWtCLENBQUNqRixTQUE1QixFQUF1QytFLGtCQUFrQixDQUFDL0UsU0FBMUQsQ0FBL0I7QUFDQWlGLFlBQUFBLGtCQUFrQixDQUFDdkUsT0FBbkIsR0FBNkJrRSxJQUFJLENBQUNFLEdBQUwsQ0FBU0csa0JBQWtCLENBQUN2RSxPQUE1QixFQUFxQ3FFLGtCQUFrQixDQUFDckUsT0FBeEQsQ0FBN0I7QUFDQXVFLFlBQUFBLGtCQUFrQixDQUFDdEUsUUFBbkIsR0FBOEJzRSxrQkFBa0IsQ0FBQ3ZFLE9BQW5CLEdBQTZCdUUsa0JBQWtCLENBQUNqRixTQUE5RTtBQUNBaUYsWUFBQUEsa0JBQWtCLENBQUNaLEtBQW5CLEdBQTJCLENBQ3ZCLEdBQUdZLGtCQUFrQixDQUFDWixLQURDLEVBRXZCLEdBQUdVLGtCQUFrQixDQUFDVixLQUZDLENBQTNCOztBQUlBLGdCQUFJVSxrQkFBa0IsQ0FBQ1YsS0FBbkIsQ0FBeUJ6QyxJQUF6QixDQUE4QnVELENBQUMsSUFBSUEsQ0FBQyxDQUFDL0gsTUFBRixLQUFheUQsZ0JBQU9DLE1BQXZELENBQUosRUFBb0U7QUFDaEVtRSxjQUFBQSxrQkFBa0IsQ0FBQzdILE1BQW5CLEdBQTRCeUQsZ0JBQU9DLE1BQW5DO0FBQ0gsYUFGRCxNQUdLLElBQUlpRSxrQkFBa0IsQ0FBQ1YsS0FBbkIsQ0FBeUJ6QyxJQUF6QixDQUE4QnVELENBQUMsSUFBSUEsQ0FBQyxDQUFDL0gsTUFBRixLQUFheUQsZ0JBQU9pQixPQUF2RCxDQUFKLEVBQXFFO0FBQ3RFbUQsY0FBQUEsa0JBQWtCLENBQUM3SCxNQUFuQixHQUE0QnlELGdCQUFPaUIsT0FBbkM7QUFDSDtBQUNKO0FBQ0o7QUFDSjtBQUNKOztBQUVELFVBQU1zRCxrQkFBa0IsR0FBRzFILE1BQU0sQ0FBQzJILElBQVAsQ0FBWTNHLGNBQVosRUFBNEI0RyxHQUE1QixDQUN2Qk4sUUFBUSxJQUFJO0FBQ1IsWUFBTUwsYUFBYSxHQUFHakcsY0FBYyxDQUFDc0csUUFBRCxDQUFwQzs7QUFDQSxVQUFJLENBQUNMLGFBQWEsQ0FBQ08sV0FBbkIsRUFBZ0M7QUFDNUIsZUFBT1AsYUFBUDtBQUNIOztBQUNEQSxNQUFBQSxhQUFhLENBQUNoRCxNQUFkLEdBQXVCLENBQ25CLEdBQUdnRCxhQUFhLENBQUNoRCxNQURFLEVBRW5CLEdBQUdqRSxNQUFNLENBQUMySCxJQUFQLENBQVlWLGFBQWEsQ0FBQ08sV0FBMUIsRUFBdUNJLEdBQXZDLENBQTJDQyxhQUFhLElBQUlaLGFBQWEsQ0FBQ08sV0FBZCxDQUEwQkssYUFBMUIsQ0FBNUQsQ0FGZ0IsQ0FBdkI7QUFJQSxZQUFNQyxnQkFBZ0IsR0FBR2IsYUFBYSxDQUFDaEQsTUFBZCxDQUFxQnpFLElBQXJCLENBQTBCdUksQ0FBQyxJQUFJQSxDQUFDLENBQUNySSxNQUFGLEtBQWF5RCxnQkFBT0MsTUFBbkQsQ0FBekI7O0FBQ0EsVUFBSTBFLGdCQUFKLEVBQXNCO0FBQ2xCYixRQUFBQSxhQUFhLENBQUN2SCxNQUFkLEdBQXVCeUQsZ0JBQU9DLE1BQTlCO0FBQ0E2RCxRQUFBQSxhQUFhLENBQUM1RCxPQUFkLEdBQXdCeUUsZ0JBQWdCLENBQUN6RSxPQUFqQixJQUE0QjRELGFBQWEsQ0FBQzVELE9BQWxFO0FBQ0gsT0FIRCxNQUlLO0FBQ0QsY0FBTTJFLHFCQUFxQixHQUFHZixhQUFhLENBQUNoRCxNQUFkLENBQXFCekUsSUFBckIsQ0FBMEJ1SSxDQUFDLElBQUlBLENBQUMsQ0FBQ3JJLE1BQUYsS0FBYXlELGdCQUFPaUIsT0FBbkQsQ0FBOUI7O0FBQ0EsWUFBSTRELHFCQUFKLEVBQTJCO0FBQ3ZCZixVQUFBQSxhQUFhLENBQUN2SCxNQUFkLEdBQXVCeUQsZ0JBQU9pQixPQUE5QjtBQUNBNkMsVUFBQUEsYUFBYSxDQUFDNUQsT0FBZCxHQUF3QjJFLHFCQUFxQixDQUFDM0UsT0FBdEIsSUFBaUM0RCxhQUFhLENBQUM1RCxPQUF2RTtBQUNIO0FBQ0o7O0FBQ0QsYUFBTzRELGFBQWEsQ0FBQyxhQUFELENBQXBCO0FBQ0EsYUFBT0EsYUFBUDtBQUNILEtBeEJzQixDQUEzQjtBQTBCQSxRQUFJakksT0FBTyxHQUFHLENBQUMsR0FBRzBJLGtCQUFKLEVBQXdCLEdBQUdiLGdCQUEzQixDQUFkO0FBRUE3SCxJQUFBQSxPQUFPLEdBQUcsS0FBS2lKLDBCQUFMLENBQWdDakosT0FBaEMsQ0FBVjtBQUVBLFNBQUtrSixjQUFMLENBQW9CbEosT0FBcEI7QUFDQSxXQUFPQSxPQUFQO0FBQ0g7O0FBRURpSixFQUFBQSwwQkFBMEIsQ0FBQ2pKLE9BQUQsRUFBVTtBQUNoQyxXQUFPQSxPQUFPLENBQUM0SSxHQUFSLENBQWFoRSxNQUFELElBQVk7QUFDM0IsVUFDSUEsTUFBTSxJQUNOQSxNQUFNLENBQUNLLE1BRFAsSUFFQTdFLEtBQUssQ0FBQ0MsT0FBTixDQUFjdUUsTUFBTSxDQUFDSyxNQUFyQixDQUZBLElBR0FMLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjM0UsTUFBZCxHQUF1QixDQUozQixFQUtFO0FBQ0UsY0FBTTZJLE1BQU0sR0FBR3ZFLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjekUsSUFBZCxDQUFvQjBGLEtBQUQsSUFBV0EsS0FBSyxDQUFDeEYsTUFBTixLQUFpQnlELGdCQUFPQyxNQUF0RCxDQUFmOztBQUNBLFlBQUkrRSxNQUFKLEVBQVk7QUFDUnZFLFVBQUFBLE1BQU0sQ0FBQ2xFLE1BQVAsR0FBZ0J5RCxnQkFBT0MsTUFBdkI7QUFDSCxTQUZELE1BR0ssSUFBSVEsTUFBTSxDQUFDSyxNQUFQLENBQWN6RSxJQUFkLENBQW9CMEYsS0FBRCxJQUFXQSxLQUFLLENBQUN4RixNQUFOLEtBQWlCeUQsZ0JBQU9pQixPQUF0RCxDQUFKLEVBQW9FO0FBQ3JFUixVQUFBQSxNQUFNLENBQUNsRSxNQUFQLEdBQWdCeUQsZ0JBQU9pQixPQUF2QjtBQUNIO0FBQ0o7O0FBRUQsYUFBT1IsTUFBUDtBQUNILEtBakJNLENBQVA7QUFrQkg7O0FBRURzRSxFQUFBQSxjQUFjLENBQUNsSixPQUFELEVBQVU7QUFDcEIsVUFBTW9KLHdCQUF3QixHQUFHLEVBQWpDO0FBQ0FwSixJQUFBQSxPQUFPLENBQUM0SSxHQUFSLENBQWFoRSxNQUFELElBQVk7QUFDcEJBLE1BQUFBLE1BQU0sQ0FBQ0ssTUFBUCxDQUFjMkQsR0FBZCxDQUFtQjFDLEtBQUQsSUFBVztBQUN6QixZQUFJa0Qsd0JBQXdCLENBQUNDLFFBQXpCLENBQWtDbkQsS0FBSyxDQUFDSCxZQUF4QyxDQUFKLEVBQTJEO0FBQ3ZEckUsVUFBQUEsT0FBTyxDQUFDNEgsSUFBUixDQUFhLG9CQUFiLEVBQW1DcEQsS0FBSyxDQUFDSCxZQUF6QyxFQUF1RCxhQUF2RDtBQUNILFNBRkQsTUFFTztBQUNIcUQsVUFBQUEsd0JBQXdCLENBQUN2SCxJQUF6QixDQUE4QnFFLEtBQUssQ0FBQ0gsWUFBcEM7QUFDSDtBQUNKLE9BTkQ7QUFPSCxLQVJEO0FBU0g7O0FBRXlCLFFBQXBCbEQsb0JBQW9CLENBQUMwRyxRQUFELEVBQVczRyxTQUFYLEVBQXNCO0FBQzVDLFFBQUksQ0FBQ3hDLEtBQUssQ0FBQ0MsT0FBTixDQUFjLEtBQUtPLFNBQW5CLENBQUQsSUFBa0MsS0FBS0EsU0FBTCxDQUFlTixNQUFmLElBQXlCLENBQS9ELEVBQWtFO0FBQzlELGFBQU8sS0FBUDtBQUNIOztBQUNELFNBQUssSUFBSVMsUUFBVCxJQUFxQixLQUFLSCxTQUExQixFQUFxQztBQUNqQyxVQUFJRyxRQUFRLENBQUN3SSxRQUFELENBQVosRUFBd0I7QUFDcEIsWUFBSTtBQUNBLGdCQUFNeEksUUFBUSxDQUFDd0ksUUFBRCxDQUFSLENBQW1CM0csU0FBbkIsQ0FBTjtBQUNILFNBRkQsQ0FHQSxPQUFPUixDQUFQLEVBQVU7QUFDTlYsVUFBQUEsT0FBTyxDQUFDNEgsSUFBUixDQUFjLG1DQUFrQ0MsUUFBUyxNQUFLbkgsQ0FBQyxDQUFDUixPQUFRLEVBQXhFO0FBQ0g7QUFDSjtBQUNKO0FBQ0o7O0FBRWlDLFFBQTVCZ0YsNEJBQTRCLENBQUNELFVBQUQsRUFBYTtBQUMzQyxRQUFJLENBQUNBLFVBQUQsSUFBZSxDQUFDQSxVQUFVLENBQUM2QyxXQUEzQixJQUEwQyxDQUFDN0MsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QmxKLE1BQXRFLEVBQThFO0FBQzFFO0FBQ0g7O0FBQ0QsVUFBTW1KLG1CQUFtQixHQUFHLEVBQTVCOztBQUNBLFNBQUssSUFBSUMsQ0FBQyxHQUFDLENBQVgsRUFBY0EsQ0FBQyxHQUFFL0MsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QmxKLE1BQXhDLEVBQWdEb0osQ0FBQyxFQUFqRCxFQUFxRDtBQUNqRCxZQUFNQyxVQUFVLEdBQUdoRCxVQUFVLENBQUM2QyxXQUFYLENBQXVCRSxDQUF2QixDQUFuQjs7QUFDQSxVQUFJLENBQUNDLFVBQVUsQ0FBQ0MsSUFBaEIsRUFBc0I7QUFDbEI7QUFDSDs7QUFDRCxVQUFJO0FBQ0EsY0FBTUMsYUFBYSxHQUNmLE1BQU10RyxjQUFPdUcsYUFBUCxDQUFxQkgsVUFBVSxDQUFDSSxRQUFoQyxFQUEwQ0osVUFBVSxDQUFDQyxJQUFyRCxFQUEyRCxLQUFLN0osT0FBaEUsQ0FEVjs7QUFFQSxZQUFJLENBQUM4SixhQUFMLEVBQW9CO0FBQ2hCSixVQUFBQSxtQkFBbUIsQ0FBQzVILElBQXBCLENBQXlCOEgsVUFBekI7QUFDSCxTQUZELE1BR0s7QUFDREEsVUFBQUEsVUFBVSxDQUFDSyxRQUFYLEdBQXNCSCxhQUF0QjtBQUNBLGlCQUFPRixVQUFVLENBQUMsTUFBRCxDQUFqQjtBQUNIO0FBQ0osT0FWRCxDQVdBLE9BQU92SCxDQUFQLEVBQVU7QUFDTlYsUUFBQUEsT0FBTyxDQUFDNEgsSUFBUixDQUFhLGlDQUFiLEVBQWdEbEgsQ0FBQyxDQUFDUixPQUFsRDtBQUNBNkgsUUFBQUEsbUJBQW1CLENBQUM1SCxJQUFwQixDQUF5QjhILFVBQXpCO0FBQ0g7QUFDSjs7QUFFRCxTQUFLLElBQUlELENBQUMsR0FBQyxDQUFYLEVBQWNBLENBQUMsR0FBRUQsbUJBQW1CLENBQUNuSixNQUFyQyxFQUE2Q29KLENBQUMsRUFBOUMsRUFBa0Q7QUFDOUMsWUFBTU8sZ0JBQWdCLEdBQUd0RCxVQUFVLENBQUM2QyxXQUFYLENBQXVCVSxPQUF2QixDQUErQlQsbUJBQW1CLENBQUNDLENBQUQsQ0FBbEQsQ0FBekI7O0FBQ0EsVUFBSSxDQUFDTyxnQkFBRCxHQUFvQixDQUFDLENBQXpCLEVBQTRCO0FBQ3hCdEQsUUFBQUEsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QlcsTUFBdkIsQ0FBOEJGLGdCQUE5QixFQUFnRCxDQUFoRDtBQUNIO0FBQ0o7QUFDSjs7QUF4aEJzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IFJlcG9ydFBvcnRhbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1ycCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi9tb2RlbC9zdGF0dXMnO1xyXG5cclxuY29uc3QgUmVwb3J0ZXJzID0ge1xyXG4gICAganNvbjogSnNvblJlcG9ydGVyLFxyXG4gICAganVuaXQ6IEpVbml0UmVwb3J0ZXIsXHJcbiAgICBodG1sOiBIdG1sUmVwb3J0ZXIsXHJcbiAgICBleGNlbDogRXhjZWxSZXBvcnRlcixcclxuICAgIHBkZjogUGRmUmVwb3J0ZXIsXHJcbiAgICB4bWw6IFhtbFJlcG9ydGVyLFxyXG4gICAgcnA6IFJlcG9ydFBvcnRhbFJlcG9ydGVyLFxyXG59O1xyXG5cclxuY29uc3QgREVGQVVMVF9URVNUX05BTUUgPSAnT3h5Z2VuIFRlc3QnO1xyXG5jb25zdCBERUZBVUxUX1JFUE9SVEVSUyA9IFtdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0QWdncmVnYXRvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyByZXN1bHRzIGhhc2ggdGFibGUgYmFzZWQgb24gcnVubmVyIGlkIGtleVxyXG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIC8vIGEgaGFzaCBsaXN0IG9mIHJ1bm5lckVuZCBldmVudCBwcm9taXNlcywga2V5ZWQgYnkgcnVubmVyIGlkXHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgLy8gdGhpcy5pbnN0YW50aWF0ZVJlcG9ydGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4aXRDb2RlKCkge1xyXG4gICAgICAgIGxldCBleGl0Q29kZSA9IDA7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RmFpbGRlZCA9IHRoaXMucmVzdWx0cy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3RGYWlsZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJyb2tlbiA/XHJcbiAgICAgICAgICAgIGV4aXRDb2RlID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVycyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYWxSZXBvcnRpbmdPcHRzID0gdGhpcy5vcHRpb25zLnJlcG9ydGluZyB8fCB7fTtcclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiBnZW5lcmFsUmVwb3J0aW5nT3B0cy5yZXBvcnRlcnMgfHwgREVGQVVMVF9SRVBPUlRFUlMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBvcnRlciAhPT0gJ3N0cmluZycgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXBvcnRlciwgJ25hbWUnKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHJlcG9ydGVycyB0aGF0IGRvIG5vdCBoYXZlICduYW1lJyBwcm9wZXJ0eSBhcyBpdCdzIGVzc2VudGlhbCB0byBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIFJlcG9ydGVyIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJOYW1lID0gdHlwZW9mIHJlcG9ydGVyID09PSAnc3RyaW5nJyA/IHJlcG9ydGVyIDogcmVwb3J0ZXIubmFtZTtcclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJPcHRzID0gdHlwZW9mIHJlcG9ydGVyID09PSAnb2JqZWN0JyA/IHJlcG9ydGVyIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSZXBvcnRlcnMsIHJlcG9ydGVyTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHJlcG9ydGVyIFwiZW5hYmxlZFwiIHByb3BlcnR5IGlzIFwiZmFsc2VcIiB0aGVuIHNraXAgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXJPcHRzICYmIHR5cGVvZiByZXBvcnRlck9wdHMuZW5hYmxlZCA9PT0gJ2Jvb2xlYW4nICYmICFyZXBvcnRlck9wdHMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXJzW3JlcG9ydGVyTmFtZV0odGhpcy5vcHRpb25zLCByZXBvcnRlck9wdHMsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcG9ydGVyIGhhcyBcImluaXRcIiBmdW5jdGlvbiwgdXNlIGl0IHRvIGluaXRpYWxpemUgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXIuaW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyLmluaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgXCIke3JlcG9ydGVyTmFtZX1cIiByZXBvcnRlcjogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXN1bHRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2VuZXJhdGVSZXBvcnRzKCkge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgcmVwb3J0ZXIgb2YgdGhpcy5yZXBvcnRlcnMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSBhd2FpdCByZXBvcnRlci5nZW5lcmF0ZShncm91cGVkUmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0UGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBZb3VyIHJlcG9ydCBpcyByZWFkeTogJHtyZXBvcnRQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JSZXN1bHQocmlkKSB7XHJcbiAgICAgICAgaWYgKCFyaWQgfHwgIXRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yUmVzdWx0cygpIHtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlcyAmJiB0aGlzLnJ1bm5lckVuZFByb21pc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5ydW5uZXJFbmRQcm9taXNlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTGF1bmNoU3RhcnQob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25MYXVuY2hTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25MYXVuY2hFbmQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByZXN1bHRzXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xhdW5jaDplbmQnLCByZXN1bHRzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxhdW5jaEVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25SdW5uZXJTdGFydChyaWQsIG9wdHMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXJpZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmlkXCIgY2Fubm90IGJlIGVtcHR5LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnJpZCA9IHJpZDtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm5hbWUgPSBvcHRzLm5hbWUgfHwgREVGQVVMVF9URVNUX05BTUU7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBjYXBzO1xyXG4gICAgICAgIHRlc3RSZXN1bHQuZW52aXJvbm1lbnQgPSBvcHRzLmVudlZhcnMgfHwge307XHJcbiAgICAgICAgdGVzdFJlc3VsdC5vcHRpb25zID0gb3B0cztcclxuICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcHJvbWlzZSBmb3IgbGF0ZXIgdG8gYmUgcmVzb2x2ZWQgb24gcnVubmVyOmVuZCBldmVudFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIG9wdHMsXHJcbiAgICAgICAgICAgIGNhcHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblJ1bm5lclN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lckVuZChyaWQsIGZpbmFsUmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQpIHtcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmR1cmF0aW9uID0gdGVzdFJlc3VsdC5lbmRUaW1lIC0gdGVzdFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IHN0YXR1cyBiYXNlZCBvbiBzdWl0ZXMgc3RhdHVzZXNcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5zdGF0dXMgPSB0aGlzLl9kZXRlcm1pbmVUZXN0U3RhdHVzQnlTdWl0ZXModGVzdFJlc3VsdCwgZmF0YWxFcnJvcik7XHJcbiAgICAgICAgICAgIC8vIHRlc3RSZXN1bHQuc3RhdHVzID0gZmF0YWxFcnJvciA/IFN0YXR1cy5GQUlMRUQgOiAodGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlmIGZhdGFsRXJyb3IgaXMgbm90IGluaGVyaXRlZCBmcm9tIEVycm9yIGNsYXNzIHRoZW4gd2UgYWxyZWFkeSBnb3QgT3h5Z2VuIEZhaWx1cmUgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5mYWlsdXJlID0gZmF0YWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihmYXRhbEVycm9yKSA6IGZhdGFsRXJyb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSB0aGlzLl9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICYmIGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmaW5hbFJlc3VsdC5jYXBhYmlsaXRpZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlICYmIHRlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX0gYXQgJHt0ZXN0UmVzdWx0LmZhaWx1cmUubG9jYXRpb259LmApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRlc3RSZXN1bHQuZmFpbHVyZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3I6ICR7dGVzdFJlc3VsdC5mYWlsdXJlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUZXN0ICR7cmlkfSBoYXMgZmluaXNoZWQgd2l0aCBzdGF0dXM6ICR7dGVzdFJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHRlc3RSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3J1bm5lcjplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyRW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgbmV4dFRpY2soKSB3aWxsIGhlbHAgdXMgdG8gaW5zdXJlIHRoYXQgd2UgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBlbWl0KCdydW5uZXI6ZW5kJykgaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXS5yZXNvbHZlKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGZhdGFsRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN1aXRlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzV2FybmluZ1N1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpO1xyXG4gICAgICAgIGlmIChoYXNXYXJuaW5nU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuV0FSTklORztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3VpdGVzU2tpcHBlZCA9IHRlc3RSZXN1bHQuc3VpdGVzLmV2ZXJ5KHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5TS0lQUEVEKTtcclxuICAgICAgICBpZiAoYWxsU3VpdGVzU2tpcHBlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLlNLSVBQRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uSXRlcmF0aW9uU3RhcnQocmlkLCBpdGVyYXRpb24sIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKGl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtzdGFydH0gSXRlcmF0aW9uICMke2l0ZXJhdGlvbn0gc3RhcnRlZC4uLmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25FbmQocmlkLCByZXN1bHQsIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdD8uaXRlcmF0aW9uTnVtICYmIHJlc3VsdC5zdGF0dXM/LnRvVXBwZXJDYXNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7cmVzdWx0Lml0ZXJhdGlvbk51bX0gZW5kZWQgd2l0aCBzdGF0dXM6ICR7cmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uTG9nRW50cnkobnVsbCwgJ0lORk8nLCBtc2csICd1c2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVTdGFydChyaWQsIHN1aXRlSWQsIHN1aXRlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZS5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgbGV0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkOiBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZTogc3VpdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN1aXRlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQocmlkLCBzdWl0ZUlkLCBzdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSB0aGlzLnJlc3VsdHMuZmluZCh4ID0+IHgucmlkID09PSByaWQpO1xyXG4gICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRlc3RSZXN1bHQuc3VpdGVzLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWl0ZSBcIiR7c3VpdGVSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7c3VpdGVSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHN1aXRlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdWl0ZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCBjYXNlRGVmKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZURlZi5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlUmVmSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgY2FzZTogY2FzZURlZixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTpzdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVmSWQsIGNhc2VJZCwgY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAtIENhc2UgXCIke2Nhc2VSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7Y2FzZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50KGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZVJlZklkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogY2FzZVJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uQ2FzZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcC5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucm9vdFBhdGggJiYgdGhpcy5vcHRpb25zLmZyYW1ld29yayAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5yb290UGF0aCwgc3RlcC5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgIHN0ZXAubG9jYXRpb24gPSBmdWxsUGF0aCsnOjEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwRW5kKHJpZCwgc3VpdGVJZCwgY2FzZUlkLCBzdGVwUmVzdWx0KSB7XHJcbiAgICAgICAgLy9jb25zdCBzdGF0dXMgPSBzdGVwUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIC8vY29uc3QgZHVyYXRpb24gPSBzdGVwUmVzdWx0LmR1cmF0aW9uID8gKHN0ZXBSZXN1bHQuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDIpIDogMDtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcFJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCBpbiAke2R1cmF0aW9ufXMgd2l0aCBzdGF0dXM6ICR7c3RhdHVzfS5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdGVwRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkxvZ0VudHJ5KHRpbWUsIGxldmVsLCBtc2csIHNyYyA9IG51bGwsIHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQgfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXBJZCxcclxuICAgICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICAgIG1zZyxcclxuICAgICAgICAgICAgdGltZSxcclxuICAgICAgICAgICAgc3JjXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xvZycsIGV2ZW50QXJncyk7XHJcblxyXG4gICAgICAgIGlmICghdGltZSkge1xyXG4gICAgICAgICAgICBldmVudEFyZ3MudGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxvZycsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmYWlsdXJlIG9iamVjdCBpbiBvbmUgb2YgdGVzdCByZXN1bHQncyBlbnRpdGllcy4gXHJcbiAgICAgKiBAcGFyYW0ge1Rlc3RSZXN1bHR9IHRlc3RSZXN1bHQgXHJcbiAgICAgKi9cclxuICAgIF9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCkge1xyXG4gICAgICAgIGlmICh0ZXN0UmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHN1aXRlUmVzdWx0IG9mIHRlc3RSZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZVJlc3VsdCBvZiBzdWl0ZVJlc3VsdC5jYXNlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3RlcFJlc3VsdCBvZiBjYXNlUmVzdWx0LnN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZXN1bHQuZmFpbHVyZSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBncm91cFJlc3VsdHMoKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHMgPSB7fTtcclxuICAgICAgICBjb25zdCB1bmdyb3VwZWRSZXN1bHRzID0gW107XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVzdWx0cykgfHwgdGhpcy5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHRoaXMucmVzdWx0cykge1xyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdCB8fCAhcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnJlc3VsdEtleSkge1xyXG4gICAgICAgICAgICAgICAgdW5ncm91cGVkUmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRLZXkgPSByZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5O1xyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZUtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5zdWl0ZUtleTtcclxuICAgICAgICAgICAgbGV0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldO1xyXG4gICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUsIHJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFJlc3VsdC5lbmRUaW1lLCByZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgZ3JvdXBpbmcgaXMgYnkgcmVzdWx0IG9ubHksIHRoZW4ganVzdCBhcHBlbmQgY3VycmVudCByZXN1bHQncyBzdWl0ZXMgdG8gdGhlIGdyb3VwJ3Mgc3VpdGVzXHJcbiAgICAgICAgICAgIGlmICghc3VpdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdC5zdWl0ZXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRTdWl0ZVJlc3VsdCBvZiByZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBLZXkgPSBgJHtzdWl0ZUtleX0tJHtjdXJyZW50U3VpdGVSZXN1bHQuaXRlcmF0aW9uTnVtfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFN1aXRlUmVzdWx0ID0gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cGVkU3VpdGVSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV0gPSB7IC4uLmN1cnJlbnRTdWl0ZVJlc3VsdCB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSA9IE1hdGgubWluKGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGFydFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuZW5kVGltZSA9IE1hdGgubWF4KGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lLCBjdXJyZW50U3VpdGVSZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29udmVydCBncm91cGVkIHJlc3VsdHMgaGFzaCB0byBhbiBhcnJheVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHRzTGlzdCA9IE9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHRzKS5tYXAoXHJcbiAgICAgICAgICAgIGdyb3VwS2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpLm1hcChzdWl0ZUdyb3VwS2V5ID0+IGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2hbc3VpdGVHcm91cEtleV0pXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RGYWlsZWRTdWl0ZSA9IGdyb3VwZWRSZXN1bHQuc3VpdGVzLmZpbmQocyA9PiBzLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RGYWlsZWRTdWl0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdEZhaWxlZFN1aXRlLmZhaWx1cmUgfHwgZ3JvdXBlZFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTdWl0ZVdpdGhXYXJuaW5nID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0U3VpdGVXaXRoV2FybmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdFN1aXRlV2l0aFdhcm5pbmcuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbLi4uZ3JvdXBlZFJlc3VsdHNMaXN0LCAuLi51bmdyb3VwZWRSZXN1bHRzXTtcclxuICAgICAgICAvLyBjaGFuZ2UgcmVzdWx0cyBzdGF0dXMgdG8gZmFpZGVkIGlmIGZhaWxlZCBzdWl0ZXMgYXJlIGZpbmRlZFxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0LnN1aXRlcykgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3VpdGVzLmZpbmQoKHN1aXRlKSA9PiBzdWl0ZS5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVJlc3VsdChyZXN1bHRzKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzID0gW107XHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2ludm9rZVJlcG9ydGVyc0hvb2soaG9va05hbWUsIGV2ZW50QXJncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0ZXJbaG9va05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyW2hvb2tOYW1lXShldmVudEFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBpbnZva2UgcmVwb3J0ZXIgaG9vayBcIiR7aG9va05hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGlmICghY2FzZVJlc3VsdCB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cyB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50c1RvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuX3VybCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRmlsZVBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG94dXRpbC5kb3dubG9hZFZpZGVvKGF0dGFjaG1lbnQuZmlsZU5hbWUsIGF0dGFjaG1lbnQuX3VybCwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmlkZW9GaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZVBhdGggPSB2aWRlb0ZpbGVQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRhY2htZW50WydfdXJsJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGRvd25sb2FkIHZpZGVvIGZpbGU6ICcsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c1RvUmVtb3ZlLnB1c2goYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHZpZGVvIGF0dGFjaG1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZG93bmxvYWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTwgYXR0YWNobWVudHNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbG1JbmRleFRvUmVtb3ZlID0gY2FzZVJlc3VsdC5hdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnRzVG9SZW1vdmVbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIWVsbUluZGV4VG9SZW1vdmUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cy5zcGxpY2UoZWxtSW5kZXhUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|