oxygen-cli 1.27.1 → 1.27.4
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 +8 -0
- package/build/lib/cli.js +1 -1
- package/build/ox_modules/module-mob/commands/alertAccept.js +8 -3
- package/build/ox_modules/module-mob/commands/alertDismiss.js +8 -3
- package/build/ox_modules/module-mob/commands/assertAlert.js +8 -3
- package/build/ox_modules/module-mob/commands/assertText.js +8 -3
- package/build/ox_modules/module-mob/commands/assertTitle.js +8 -3
- package/build/ox_modules/module-mob/commands/assertValue.js +8 -3
- package/build/ox_modules/module-mob/commands/back.js +8 -3
- package/build/ox_modules/module-mob/commands/clear.js +8 -3
- package/build/ox_modules/module-mob/commands/click.js +8 -3
- package/build/ox_modules/module-mob/commands/clickHidden.js +8 -3
- package/build/ox_modules/module-mob/commands/clickLong.js +8 -3
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +8 -3
- package/build/ox_modules/module-mob/commands/closeApp.js +8 -3
- package/build/ox_modules/module-mob/commands/debug.js +8 -3
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +8 -3
- package/build/ox_modules/module-mob/commands/enableNetwork.js +8 -3
- package/build/ox_modules/module-mob/commands/execute.js +8 -3
- package/build/ox_modules/module-mob/commands/findElement.js +8 -3
- package/build/ox_modules/module-mob/commands/findElements.js +8 -3
- package/build/ox_modules/module-mob/commands/getAlertText.js +8 -3
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +8 -3
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +8 -3
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +8 -3
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +8 -3
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +8 -3
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +8 -3
- package/build/ox_modules/module-mob/commands/getLocation.js +8 -3
- package/build/ox_modules/module-mob/commands/getSource.js +8 -3
- package/build/ox_modules/module-mob/commands/getText.js +8 -3
- package/build/ox_modules/module-mob/commands/getTitle.js +8 -3
- package/build/ox_modules/module-mob/commands/getUrl.js +8 -3
- package/build/ox_modules/module-mob/commands/getValue.js +8 -3
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +8 -3
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +8 -3
- package/build/ox_modules/module-mob/commands/index.js +949 -586
- package/build/ox_modules/module-mob/commands/installApp.js +8 -3
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +8 -3
- package/build/ox_modules/module-mob/commands/isCheckable.js +8 -3
- package/build/ox_modules/module-mob/commands/isChecked.js +8 -3
- package/build/ox_modules/module-mob/commands/isClickable.js +8 -3
- package/build/ox_modules/module-mob/commands/isExist.js +8 -3
- package/build/ox_modules/module-mob/commands/isSelected.js +8 -3
- package/build/ox_modules/module-mob/commands/isVisible.js +8 -3
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +8 -3
- package/build/ox_modules/module-mob/commands/launchApp.js +8 -3
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +8 -3
- package/build/ox_modules/module-mob/commands/open.js +8 -3
- package/build/ox_modules/module-mob/commands/pause.js +8 -3
- package/build/ox_modules/module-mob/commands/removeApp.js +8 -3
- package/build/ox_modules/module-mob/commands/resetApp.js +8 -3
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +8 -3
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +8 -3
- package/build/ox_modules/module-mob/commands/select.js +8 -3
- package/build/ox_modules/module-mob/commands/selectFrame.js +8 -3
- package/build/ox_modules/module-mob/commands/selectWindow.js +8 -3
- package/build/ox_modules/module-mob/commands/sendKeys.js +8 -3
- package/build/ox_modules/module-mob/commands/setContext.js +8 -3
- package/build/ox_modules/module-mob/commands/setNativeContext.js +8 -3
- package/build/ox_modules/module-mob/commands/setTimeout.js +8 -3
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +8 -3
- package/build/ox_modules/module-mob/commands/shake.js +8 -3
- package/build/ox_modules/module-mob/commands/smsClickLink.js +8 -3
- package/build/ox_modules/module-mob/commands/smsGetText.js +8 -3
- package/build/ox_modules/module-mob/commands/swipe.js +8 -3
- package/build/ox_modules/module-mob/commands/swipeElement.js +8 -3
- package/build/ox_modules/module-mob/commands/swipeScreen.js +12 -7
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +8 -3
- package/build/ox_modules/module-mob/commands/tap.js +8 -3
- package/build/ox_modules/module-mob/commands/type.js +8 -3
- package/build/ox_modules/module-mob/commands/unlockPattern.js +8 -3
- package/build/ox_modules/module-mob/commands/waitForExist.js +8 -3
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +8 -3
- package/build/ox_modules/module-mob/commands/waitForVisible.js +8 -3
- package/build/ox_modules/module-utils.js +10 -10
- package/build/ox_modules/module-web/commands/alertAccept.js +8 -3
- package/build/ox_modules/module-web/commands/alertDismiss.js +8 -3
- package/build/ox_modules/module-web/commands/assertAlert.js +8 -3
- package/build/ox_modules/module-web/commands/assertExist.js +8 -3
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +8 -3
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +8 -3
- package/build/ox_modules/module-web/commands/assertText.js +8 -3
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +8 -3
- package/build/ox_modules/module-web/commands/assertTextPresent.js +8 -3
- package/build/ox_modules/module-web/commands/assertTitle.js +8 -3
- package/build/ox_modules/module-web/commands/assertValue.js +8 -3
- package/build/ox_modules/module-web/commands/back.js +8 -3
- package/build/ox_modules/module-web/commands/clear.js +8 -3
- package/build/ox_modules/module-web/commands/click.js +8 -3
- package/build/ox_modules/module-web/commands/clickHidden.js +8 -3
- package/build/ox_modules/module-web/commands/closeWindow.js +8 -3
- package/build/ox_modules/module-web/commands/debug.js +8 -3
- package/build/ox_modules/module-web/commands/deleteCookies.js +8 -3
- package/build/ox_modules/module-web/commands/deselect.js +8 -3
- package/build/ox_modules/module-web/commands/doubleClick.js +8 -3
- package/build/ox_modules/module-web/commands/dragAndDrop.js +8 -3
- package/build/ox_modules/module-web/commands/execute.js +8 -3
- package/build/ox_modules/module-web/commands/fileBrowse.js +8 -3
- package/build/ox_modules/module-web/commands/findElement.js +8 -3
- package/build/ox_modules/module-web/commands/findElements.js +8 -3
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +8 -3
- package/build/ox_modules/module-web/commands/getAlertText.js +8 -3
- package/build/ox_modules/module-web/commands/getAttribute.js +8 -3
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +8 -3
- package/build/ox_modules/module-web/commands/getCookies.js +8 -3
- package/build/ox_modules/module-web/commands/getCssValue.js +8 -3
- package/build/ox_modules/module-web/commands/getElementCount.js +8 -3
- package/build/ox_modules/module-web/commands/getHTML.js +8 -3
- package/build/ox_modules/module-web/commands/getSource.js +8 -3
- package/build/ox_modules/module-web/commands/getText.js +8 -3
- package/build/ox_modules/module-web/commands/getTitle.js +8 -3
- package/build/ox_modules/module-web/commands/getUrl.js +8 -3
- package/build/ox_modules/module-web/commands/getValue.js +8 -3
- package/build/ox_modules/module-web/commands/getWindowHandles.js +8 -3
- package/build/ox_modules/module-web/commands/getWindowSize.js +8 -3
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +8 -3
- package/build/ox_modules/module-web/commands/index.js +1027 -634
- package/build/ox_modules/module-web/commands/isAlertPresent.js +8 -3
- package/build/ox_modules/module-web/commands/isChecked.js +8 -3
- package/build/ox_modules/module-web/commands/isExist.js +8 -3
- package/build/ox_modules/module-web/commands/isInteractable.js +8 -3
- package/build/ox_modules/module-web/commands/isSelected.js +8 -3
- package/build/ox_modules/module-web/commands/isVisible.js +8 -3
- package/build/ox_modules/module-web/commands/makeVisible.js +8 -3
- package/build/ox_modules/module-web/commands/maximizeWindow.js +8 -3
- package/build/ox_modules/module-web/commands/minimizeWindow.js +8 -3
- package/build/ox_modules/module-web/commands/newWindow.js +8 -3
- package/build/ox_modules/module-web/commands/open.js +8 -3
- package/build/ox_modules/module-web/commands/pause.js +8 -3
- package/build/ox_modules/module-web/commands/point.js +8 -3
- package/build/ox_modules/module-web/commands/pointJS.js +8 -3
- package/build/ox_modules/module-web/commands/refresh.js +8 -3
- package/build/ox_modules/module-web/commands/rightClick.js +8 -3
- package/build/ox_modules/module-web/commands/rightClickActions.js +8 -3
- package/build/ox_modules/module-web/commands/scrollToElement.js +8 -3
- package/build/ox_modules/module-web/commands/select.js +8 -3
- package/build/ox_modules/module-web/commands/selectFrame.js +8 -3
- package/build/ox_modules/module-web/commands/selectWindow.js +8 -3
- package/build/ox_modules/module-web/commands/sendKeys.js +8 -3
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +8 -3
- package/build/ox_modules/module-web/commands/setTimeout.js +8 -3
- package/build/ox_modules/module-web/commands/setWindowSize.js +8 -3
- package/build/ox_modules/module-web/commands/takeScreenshot.js +8 -3
- package/build/ox_modules/module-web/commands/type.js +8 -3
- package/build/ox_modules/module-web/commands/waitForAngular.js +8 -3
- package/build/ox_modules/module-web/commands/waitForExist.js +8 -3
- package/build/ox_modules/module-web/commands/waitForInteractable.js +8 -3
- package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -3
- package/build/ox_modules/module-web/commands/waitForNotText.js +8 -3
- package/build/ox_modules/module-web/commands/waitForNotValue.js +8 -3
- package/build/ox_modules/module-web/commands/waitForText.js +8 -3
- package/build/ox_modules/module-web/commands/waitForValue.js +8 -3
- package/build/ox_modules/module-web/commands/waitForVisible.js +8 -3
- package/build/ox_modules/module-web/commands/waitForWindow.js +8 -3
- package/build/ox_modules/module-web.js +16 -12
- package/build/ox_modules/module-win/commands/assertText.js +8 -3
- package/build/ox_modules/module-win/commands/assertTitle.js +8 -3
- package/build/ox_modules/module-win/commands/assertValue.js +8 -3
- package/build/ox_modules/module-win/commands/back.js +8 -3
- package/build/ox_modules/module-win/commands/clear.js +8 -3
- package/build/ox_modules/module-win/commands/click.js +8 -3
- package/build/ox_modules/module-win/commands/clickLong.js +8 -3
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +8 -3
- package/build/ox_modules/module-win/commands/findElement.js +8 -3
- package/build/ox_modules/module-win/commands/findElements.js +8 -3
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +8 -3
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +8 -3
- package/build/ox_modules/module-win/commands/getLocation.js +8 -3
- package/build/ox_modules/module-win/commands/getSource.js +8 -3
- package/build/ox_modules/module-win/commands/getText.js +8 -3
- package/build/ox_modules/module-win/commands/getValue.js +8 -3
- package/build/ox_modules/module-win/commands/getWindowHandles.js +8 -3
- package/build/ox_modules/module-win/commands/index.js +468 -290
- package/build/ox_modules/module-win/commands/isCheckable.js +8 -3
- package/build/ox_modules/module-win/commands/isChecked.js +8 -3
- package/build/ox_modules/module-win/commands/isClickable.js +8 -3
- package/build/ox_modules/module-win/commands/isExist.js +8 -3
- package/build/ox_modules/module-win/commands/isSelected.js +8 -3
- package/build/ox_modules/module-win/commands/isVisible.js +8 -3
- package/build/ox_modules/module-win/commands/open.js +8 -3
- package/build/ox_modules/module-win/commands/pause.js +8 -3
- package/build/ox_modules/module-win/commands/rightClick.js +8 -3
- package/build/ox_modules/module-win/commands/selectWindow.js +8 -3
- package/build/ox_modules/module-win/commands/sendKeys.js +8 -3
- package/build/ox_modules/module-win/commands/setTimeout.js +8 -3
- package/build/ox_modules/module-win/commands/takeScreenshot.js +8 -3
- package/build/ox_modules/module-win/commands/tap.js +8 -3
- package/build/ox_modules/module-win/commands/type.js +8 -3
- package/build/ox_modules/module-win/commands/waitForExist.js +8 -3
- package/build/ox_modules/module-win/commands/waitForInteractable.js +8 -3
- package/build/ox_modules/module-win/commands/waitForVisible.js +8 -3
- package/build/runners/WorkerProcess.js +40 -13
- package/build/runners/oxygen/OxygenWorker.js +7 -3
- package/build/runners/oxygen/index.js +80 -80
- package/build/runners/oxygen/worker.js +4 -1
- package/package.json +21 -12
- package/types/index.d.ts +71 -0
- package/types/module-eyes.d.ts +39 -0
- package/types/module-http.d.ts +163 -0
- package/types/module-log.d.ts +35 -0
- package/types/module-mob.d.ts +967 -0
- package/types/module-pdf.d.ts +41 -0
- package/types/module-proxy.d.ts +100 -0
- package/types/module-shell.d.ts +24 -0
- package/types/module-utils.d.ts +99 -0
- package/types/module-web.d.ts +1050 -0
- package/types/module-win.d.ts +352 -0
- package/types/oxygen.d.ts +53 -0
|
@@ -45,6 +45,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
45
45
|
|
|
46
46
|
const log = (0, _logger.default)('OxygenRunner');
|
|
47
47
|
const DEFAULT_ISSUER = 'user';
|
|
48
|
+
const MAX_RERUNS = 2;
|
|
48
49
|
|
|
49
50
|
const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
50
51
|
|
|
@@ -161,11 +162,13 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
161
162
|
this._isDisposing = true;
|
|
162
163
|
|
|
163
164
|
try {
|
|
165
|
+
this._worker && (await this._worker.stopDebugger());
|
|
166
|
+
|
|
164
167
|
if (this._worker && this._worker.isRunning) {
|
|
165
168
|
await this._worker.stop(status);
|
|
166
169
|
}
|
|
167
170
|
} catch (e) {
|
|
168
|
-
console.log('
|
|
171
|
+
console.log('Error when disposing Runner', e);
|
|
169
172
|
log.warn('Error when disposing Runner:', e);
|
|
170
173
|
}
|
|
171
174
|
|
|
@@ -366,6 +369,7 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
366
369
|
showSuiteIterationsMessages = true;
|
|
367
370
|
}
|
|
368
371
|
|
|
372
|
+
const reRunOnFailure = this._options.reRunOnFailed || false;
|
|
369
373
|
const suiteIterations = [];
|
|
370
374
|
|
|
371
375
|
for (let suiteIteration = 1; suiteIteration <= suite.iterationCount; suiteIteration++) {
|
|
@@ -407,37 +411,26 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
407
411
|
this._reporter.onIterationStart(this._id, caseIteration, 'Case');
|
|
408
412
|
}
|
|
409
413
|
|
|
410
|
-
|
|
411
|
-
let caseResult = await this._runCase(suite, caze, suiteIteration, caseIteration, false);
|
|
414
|
+
this._reporter.onCaseStart(this._id, suite.uri || suite.id, caze.uri || caze.id || caze.path, caze);
|
|
412
415
|
|
|
413
|
-
|
|
414
|
-
continue;
|
|
415
|
-
}
|
|
416
|
+
let caseResult;
|
|
416
417
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
await (this._worker && this._worker_DisposeModules('passed'));
|
|
420
|
-
caseResult = await this._runCase(suite, caze, suiteIteration, caseIteration, true);
|
|
418
|
+
for (let reRunCount = 0; reRunCount < MAX_RERUNS; reRunCount++) {
|
|
419
|
+
caseResult = await this._runCase(suite, caze, suiteIteration, caseIteration, reRunCount);
|
|
421
420
|
|
|
422
|
-
if (!caseResult) {
|
|
423
|
-
|
|
421
|
+
if ((!caseResult || caseResult.status === _status.default.FAILED) && !reRunOnFailure) {
|
|
422
|
+
break;
|
|
423
|
+
} else if (caseResult && caseResult.status !== _status.default.FAILED) {
|
|
424
|
+
break;
|
|
424
425
|
}
|
|
425
426
|
}
|
|
426
427
|
|
|
427
|
-
|
|
428
|
+
this._reporter.onCaseEnd(this._id, suite.uri || suite.id, caze.uri || caze.id, caseResult);
|
|
428
429
|
|
|
429
430
|
if (showCaseIterationsMessages) {
|
|
430
431
|
this._reporter.onIterationEnd(this._id, caseResult, 'Case');
|
|
431
432
|
}
|
|
432
433
|
|
|
433
|
-
await this._worker_callAfterCaseHook(caze, caseResult);
|
|
434
|
-
|
|
435
|
-
this._reporter.onCaseEnd(this._id, suite.uri || suite.id, caze.uri || caze.id, caseResult);
|
|
436
|
-
|
|
437
|
-
if (typeof this._options.autoDispose !== 'boolean' || this._options.autoDispose === true) {
|
|
438
|
-
await (this._worker && this._worker_DisposeModules(caseResult.status));
|
|
439
|
-
}
|
|
440
|
-
|
|
441
434
|
suiteResult.cases.push(caseResult);
|
|
442
435
|
|
|
443
436
|
if (caseResult.status === _status.default.FAILED) {
|
|
@@ -461,27 +454,24 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
461
454
|
return suiteIterations;
|
|
462
455
|
}
|
|
463
456
|
|
|
464
|
-
async _runCase(suite, caze, suiteIteration, caseIteration,
|
|
457
|
+
async _runCase(suite, caze, suiteIteration, caseIteration, reRunCount = 0) {
|
|
465
458
|
const params = {};
|
|
459
|
+
const reRun = reRunCount > 0;
|
|
466
460
|
|
|
467
461
|
if (suite.paramManager) {
|
|
468
|
-
if (reRun) {
|
|
469
|
-
suite.paramManager.readPrev();
|
|
470
|
-
}
|
|
471
|
-
|
|
472
462
|
_lodash.default.extend(params, suite.paramManager.getValues());
|
|
473
463
|
|
|
474
|
-
|
|
464
|
+
if (!reRun) {
|
|
465
|
+
suite.paramManager.readNext();
|
|
466
|
+
}
|
|
475
467
|
}
|
|
476
468
|
|
|
477
469
|
if (caze.paramManager) {
|
|
478
|
-
if (reRun) {
|
|
479
|
-
caze.paramManager.readPrev();
|
|
480
|
-
}
|
|
481
|
-
|
|
482
470
|
_lodash.default.extend(params, caze.paramManager.getValues());
|
|
483
471
|
|
|
484
|
-
|
|
472
|
+
if (!reRun) {
|
|
473
|
+
caze.paramManager.readNext();
|
|
474
|
+
}
|
|
485
475
|
}
|
|
486
476
|
|
|
487
477
|
if (this._debugMode && this._worker && this._worker.debugger && caze.breakpoints) {
|
|
@@ -493,74 +483,74 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
493
483
|
}
|
|
494
484
|
|
|
495
485
|
await this._worker_callBeforeCaseHook(caze);
|
|
496
|
-
|
|
497
|
-
this._reporter.onCaseStart(this._id, suite.uri || suite.id, caze.uri || caze.id || caze.path, caze);
|
|
498
|
-
|
|
499
486
|
const caseResult = new _caseResult.default();
|
|
500
487
|
caseResult.name = caze.name;
|
|
501
488
|
caseResult.location = caze.path;
|
|
502
489
|
caseResult.iterationNum = caseIteration;
|
|
490
|
+
caseResult.reRunCount = reRunCount;
|
|
503
491
|
|
|
504
492
|
try {
|
|
505
493
|
await (!this._worker && this._worker_InitOxygen());
|
|
494
|
+
|
|
495
|
+
if (!this._worker) {
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
506
498
|
} catch (e) {
|
|
507
499
|
log.error('_worker_InitOxygen() thrown an error:', e);
|
|
508
500
|
caseResult.startTime = caseResult.endTime = _util.default.getTimeStamp();
|
|
509
501
|
caseResult.duration = 0;
|
|
510
502
|
caseResult.failure = _helper.default.getFailureFromError(e);
|
|
511
503
|
caseResult.status = _status.default.FAILED;
|
|
512
|
-
|
|
513
|
-
this._reporter.onCaseEnd(this._id, suite.uri || suite.id, caze.uri || caze.id, caseResult);
|
|
514
|
-
|
|
515
504
|
return caseResult;
|
|
516
505
|
}
|
|
517
506
|
|
|
507
|
+
await this._worker_startSession();
|
|
508
|
+
|
|
518
509
|
try {
|
|
519
510
|
caseResult.startTime = _util.default.getTimeStamp();
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
caseResult.status = _status.default.FAILED;
|
|
553
|
-
caseResult.steps = _util.default.makeTransactionFailedIfStepFailed(caseResult.steps);
|
|
554
|
-
}
|
|
555
|
-
} else {
|
|
556
|
-
return;
|
|
511
|
+
const {
|
|
512
|
+
resultStore,
|
|
513
|
+
context,
|
|
514
|
+
moduleCaps,
|
|
515
|
+
error
|
|
516
|
+
} = await this._worker_Run(suite, caze, suiteIteration, caseIteration, params);
|
|
517
|
+
|
|
518
|
+
this._processTestResults({
|
|
519
|
+
resultStore,
|
|
520
|
+
context,
|
|
521
|
+
error,
|
|
522
|
+
moduleCaps
|
|
523
|
+
});
|
|
524
|
+
|
|
525
|
+
caseResult.endTime = _util.default.getTimeStamp();
|
|
526
|
+
caseResult.duration = caseResult.endTime - caseResult.startTime;
|
|
527
|
+
caseResult.context = context;
|
|
528
|
+
caseResult.steps = resultStore && resultStore.steps ? resultStore.steps : [];
|
|
529
|
+
caseResult.logs = resultStore && resultStore.logs ? resultStore.logs : [];
|
|
530
|
+
caseResult.har = resultStore && resultStore.har ? resultStore.har : null;
|
|
531
|
+
caseResult.testAttributes = resultStore && resultStore.attributes ? resultStore.attributes : null;
|
|
532
|
+
|
|
533
|
+
var failedSteps = _lodash.default.find(caseResult.steps, {
|
|
534
|
+
status: _status.default.FAILED
|
|
535
|
+
});
|
|
536
|
+
|
|
537
|
+
caseResult.status = _lodash.default.isEmpty(failedSteps) && !error ? _status.default.PASSED : _status.default.FAILED;
|
|
538
|
+
|
|
539
|
+
if (error) {
|
|
540
|
+
caseResult.failure = error;
|
|
541
|
+
caseResult.status = _status.default.FAILED;
|
|
542
|
+
caseResult.steps = _util.default.makeTransactionFailedIfStepFailed(caseResult.steps);
|
|
557
543
|
}
|
|
544
|
+
|
|
545
|
+
await this._worker_callAfterCaseHook(caze, caseResult);
|
|
558
546
|
} catch (e) {
|
|
559
547
|
log.error('_worker_Run() thrown an error:', e);
|
|
560
548
|
caseResult.failure = _helper.default.getFailureFromError(e);
|
|
561
549
|
caseResult.status = _status.default.FAILED;
|
|
562
550
|
}
|
|
563
551
|
|
|
552
|
+
const disposeOxygenModules = typeof this._options.autoDispose !== 'boolean' || this._options.autoDispose === true;
|
|
553
|
+
await this._worker_endSession(caseResult.status, disposeOxygenModules);
|
|
564
554
|
return caseResult;
|
|
565
555
|
}
|
|
566
556
|
|
|
@@ -599,12 +589,18 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
599
589
|
}
|
|
600
590
|
|
|
601
591
|
async _worker_InitOxygen() {
|
|
602
|
-
await (this._worker && this._worker.
|
|
592
|
+
await (this._worker && this._worker.initOxygen(this._id, this._options, this._caps));
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
async _worker_startSession() {
|
|
596
|
+
if (this._worker && this._worker.startSession) {
|
|
597
|
+
await this._worker.startSession();
|
|
598
|
+
}
|
|
603
599
|
}
|
|
604
600
|
|
|
605
|
-
async
|
|
606
|
-
if (this._worker && this._worker.
|
|
607
|
-
await this._worker.
|
|
601
|
+
async _worker_endSession(status = null, disposeModules = true) {
|
|
602
|
+
if (this._worker && this._worker.endSession) {
|
|
603
|
+
await this._worker.endSession(status, disposeModules);
|
|
608
604
|
}
|
|
609
605
|
}
|
|
610
606
|
|
|
@@ -760,6 +756,10 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
760
756
|
}
|
|
761
757
|
|
|
762
758
|
_hookWorkerDebuggerEvents() {
|
|
759
|
+
if (!this._worker) {
|
|
760
|
+
return;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
763
|
this._worker.debugger && this._worker.debugger.on('debugger:break', breakpointData => {
|
|
764
764
|
this.emit('breakpoint', breakpointData);
|
|
765
765
|
});
|
|
@@ -853,4 +853,4 @@ class OxygenRunner extends _events.EventEmitter {
|
|
|
853
853
|
}
|
|
854
854
|
|
|
855
855
|
exports.default = OxygenRunner;
|
|
856
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsInNub296ZSIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0IiwiZ2V0U3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZXMiLCJyZXR2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJtYXAiLCJzdWl0ZSIsImNhc2VzIiwiY2F6ZSIsImJyZWFrcG9pbnRzIiwiYnJlYWtwb2ludCIsInB1c2giLCJyZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyIsInJlbW92ZUJyZWFrcG9pbnQiLCJpZHgiLCJmaWxlIiwibGluZSIsInNwbGljZSIsIk94eWdlblJ1bm5lciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsIl9pZCIsIm94dXRpbCIsImdlbmVyYXRlVW5pcXVlSWQiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6aW5nIiwiX2lzRGlzcG9zaW5nIiwiX3dvcmtlciIsIl9kZWJ1Z01vZGUiLCJfd29ya2VyUHJvY0xhc3RFcnJvciIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIm5wbUdSb290RXhlY3V0aW9uIiwiX3N1aXRlIiwiX2VudlZhcnMiLCJfdmFycyIsIl9jYXBzIiwiX21vZENhcHMiLCJfb3B0aW9ucyIsIl9sb2NhbFRpbWUiLCJfdGVzdEtpbGxlZCIsIl9zY3JpcHRDb250ZW50TGluZU9mZnNldCIsIl93aGVuRGlzcG9zZWQiLCJpbml0IiwiY2FwcyIsInJlcG9ydGVyIiwiRXJyb3IiLCJfY3dkIiwiY3dkIiwicHJvY2VzcyIsIl9yZXBvcnRlciIsIl9pc0luaXRpYWxpemVkIiwib3B0RW52IiwiZW52IiwiZW52cyIsIk9iamVjdCIsImtleXMiLCJlbnZWYXJzIiwiX2VudiIsIl9zdWl0ZXMiLCJkZWJ1Z1BvcnRJZGUiLCJkZWJ1Z1BvcnQiLCJfZGVidWdQb3J0Iiwic2NyaXB0Q29udGVudExpbmVPZmZzZXQiLCJsb2NhbFRpbWUiLCJfc3RhcnRXb3JrZXJQcm9jZXNzIiwiX3dvcmtlcl9Jbml0T3h5Z2VuIiwiZGlzcG9zZSIsInN0YXR1cyIsImlzUnVubmluZyIsInN0b3AiLCJlIiwiY29uc29sZSIsIndhcm4iLCJfcmVzZXRHbG9iYWxWYXJpYWJsZXMiLCJydW4iLCJvblJ1bm5lclN0YXJ0IiwiZXJyb3IiLCJyZXN1bHQiLCJfcnVuVGVzdCIsImZhaWx1cmUiLCJvblJ1bm5lckVuZCIsImtpbGwiLCJkZWJ1Z0NvbnRpbnVlIiwiZGVidWdnZXIiLCJjb250aW51ZSIsInVwZGF0ZUJyZWFrcG9pbnRzIiwiZmlsZVBhdGgiLCJzZXRCcmVha3BvaW50c0FjdGl2ZSIsInByb21pc2VzIiwidHNCcmVha3BvaW50cyIsImdldEJyZWFrcG9pbnRzIiwic3VpdGVzQnJlYWtwb2ludHMiLCJzdWl0ZUJwIiwiaW5jbHVkZXMiLCJhY3R1YWxDdXJyZW50QnAiLCJyZW1vdmVCcmVha3BvaW50QnlWYWx1ZSIsInVzZXJTZXRCcCIsInNldEJyZWFrcG9pbnQiLCJwcm9taXNlQWxsUHJvbWlzZSIsImFsbCIsInRoZW4iLCJ2YWx1ZSIsImRlYnVnIiwiYnJlYWtwb2ludHNBZmVyTWFuaXB1bGF0aW9ucyIsInJlcGxDbG9zZSIsIl9zZW5kIiwiZXZlbnQiLCJuYW1lIiwicmVwbFNlbmQiLCJjbWQiLCJjb250ZW50IiwicmVwbFN0YXJ0IiwiaW52b2tlIiwiY2xlYXJCcmVha3BvaW50IiwiVGVzdFJlc3VsdCIsInN0YXJ0VGltZSIsImdldFRpbWVTdGFtcCIsIlN0YXR1cyIsIlBBU1NFRCIsIl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rIiwic3VpdGVSZXN1bHQiLCJfcnVuU3VpdGUiLCJlbmRUaW1lIiwiZHVyYXRpb24iLCJoYXNGYWlsZWRTdWl0ZXMiLCJzb21lIiwic3VpdGVJdGVyYXRpb25zIiwieCIsIkZBSUxFRCIsImVudmlyb25tZW50IiwiY2FwYWJpbGl0aWVzIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayIsInBhdGgiLCJpdGVyYXRpb25Db3VudCIsInNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInN1aXRlSXRlcmF0aW9uIiwib25JdGVyYXRpb25TdGFydCIsIlRlc3RTdWl0ZVJlc3VsdCIsImdldEZpbGVOYW1lV2l0aG91dEV4dCIsIml0ZXJhdGlvbk51bSIsIl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayIsIm9uU3VpdGVTdGFydCIsInVyaSIsImNhc2VJdGVyYXRpb24iLCJzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyIsInJlUnVuQ291bnQiLCJjYXNlUmVzdWx0IiwiX3J1bkNhc2UiLCJyZVJ1bk9uRmFpbGVkIiwiX3dvcmtlcl9EaXNwb3NlTW9kdWxlcyIsIm9uSXRlcmF0aW9uRW5kIiwiX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayIsIm9uQ2FzZUVuZCIsImlkIiwiYXV0b0Rpc3Bvc2UiLCJfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayIsIm9uU3VpdGVFbmQiLCJyZVJ1biIsInBhcmFtcyIsInBhcmFtTWFuYWdlciIsInJlYWRQcmV2IiwiXyIsImV4dGVuZCIsImdldFZhbHVlcyIsInJlYWROZXh0IiwiaSIsIl93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rIiwib25DYXNlU3RhcnQiLCJUZXN0Q2FzZVJlc3VsdCIsImxvY2F0aW9uIiwicmVzdWx0U3RvcmUiLCJjb250ZXh0IiwibW9kdWxlQ2FwcyIsIl93b3JrZXJfUnVuIiwiX3Byb2Nlc3NUZXN0UmVzdWx0cyIsInN0ZXBzIiwibG9ncyIsImhhciIsInRlc3RBdHRyaWJ1dGVzIiwiYXR0cmlidXRlcyIsImZhaWxlZFN0ZXBzIiwiZmluZCIsImlzRW1wdHkiLCJtYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQiLCJfd2hlblRlc3RDYXNlRmluaXNoZWQiLCJyZWplY3QiLCJzY3JpcHROYW1lIiwic2NyaXB0UGF0aCIsInZhcnMiLCJ0ZXN0IiwiY2FzZSIsIml0ZXJhdGlvbiIsInBvRmlsZSIsInBvIiwiZGlzcG9zZU1vZHVsZXMiLCJpbnZva2VUZXN0SG9vayIsIm9uTG9nRW50cnkiLCJ3b3JrZXJQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIldvcmtlclByb2Nlc3MiLCJzdGFydCIsIl9ob29rV29ya2VyRXZlbnRzIiwic3RhcnREZWJ1Z2dlciIsIl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMiLCJfdGhpcyIsInN1YnNjcmliZSIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJvbiIsInBheWxvYWQiLCJleGl0RG9uZSIsImVtaXQiLCJleGl0Q29kZSIsInByb21pc2UiLCJPeHlnZW5FcnJvciIsImVycm9yQ29kZSIsIlNDUklQVF9FUlJPUiIsIm1zZyIsImxldmVsIiwiaW5mbyIsImVyciIsInRpbWUiLCJzcmMiLCJzdGFjayIsIm1ldGhvZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsIm9uU3RlcFN0YXJ0IiwibW9kdWxlIiwib25TdGVwRW5kIiwiX2VtaXRJdGVyYXRpb25FbmQiLCJ0cyIsInRjIiwic3VpdGVJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uTnVtIiwiY2FzZUl0ZXJhdGlvblJlc3VsdCIsIl9zdGF0dXMiLCJfZW1pdFRlc3RFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBOztBQUlBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBaEJBLE1BQU1BLEdBQUcsR0FBRyxxQkFBTyxjQUFQLENBQVo7QUFDQSxNQUFNQyxjQUFjLEdBQUcsTUFBdkI7O0FBa0JBLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQUosQ0FBWUMsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQUQsRUFBVUYsRUFBVixDQUFqQyxDQUFyQjs7QUFFQSxNQUFN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TDtBQUV2QmpLLE1BQUFBLE9BQU8sRUFBRWdLLG1CQUFtQixDQUFDaEssT0FBcEIsSUFBK0IsSUFGakI7QUFHdkJpSCxNQUFBQSxJQUFJLEVBQUU7QUFDRnJDLFFBQUFBLEVBQUUsRUFBRWlGLEVBQUUsQ0FBQ2pGLEVBQUgsSUFBUyxJQURYO0FBRUZoRCxRQUFBQSxJQUFJLEVBQUVpSSxFQUFFLENBQUNqSSxJQUZQO0FBR0ZzRixRQUFBQSxTQUFTLEVBQUU2QyxnQkFIVDtBQUlGdkcsUUFBQUEsY0FBYyxFQUFFcUcsRUFBRSxDQUFDckc7QUFKakIsT0FIaUI7QUFTdkJsSSxNQUFBQSxLQUFLLEVBQUU7QUFDSHNKLFFBQUFBLEVBQUUsRUFBRWdGLEVBQUUsQ0FBQ2hGLEVBQUgsSUFBUyxJQURWO0FBRUhoRCxRQUFBQSxJQUFJLEVBQUVnSSxFQUFFLENBQUNoSSxJQUZOO0FBR0hzRixRQUFBQSxTQUFTLEVBQUU0QyxpQkFIUjtBQUlIdEcsUUFBQUEsY0FBYyxFQUFFb0csRUFBRSxDQUFDcEc7QUFKaEI7QUFUZ0IsS0FBM0I7QUFnQkg7O0FBRUQwRyxFQUFBQSxZQUFZLENBQUNwSyxNQUFELEVBQVM7QUFDakIsU0FBSzBJLElBQUwsQ0FBVSxVQUFWLEVBQXNCMUksTUFBdEI7QUFDSDs7QUF4dkJrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ094eWdlblJ1bm5lcicpO1xyXG5jb25zdCBERUZBVUxUX0lTU1VFUiA9ICd1c2VyJztcclxuXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBfICBmcm9tICdsb2Rhc2gnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcclxuXHJcbmltcG9ydCBUZXN0U3VpdGVSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvc3VpdGUtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RDYXNlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL2Nhc2UtcmVzdWx0JztcclxuaW1wb3J0IFRlc3RSZXN1bHQgZnJvbSAnLi4vLi4vbW9kZWwvdGVzdC1yZXN1bHQnO1xyXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uLy4uL21vZGVsL3N0YXR1cyc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeHlnZW5FcnJvciBmcm9tICcuLi8uLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgUGFyYW1ldGVyTWFuYWdlciBmcm9tICcuLi8uLi9saWIvcGFyYW0tbWFuYWdlci5qcyc7XHJcbmltcG9ydCBXb3JrZXJQcm9jZXNzIGZyb20gJy4uL1dvcmtlclByb2Nlc3MnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbmNvbnN0IGdldFN1aXRlc0JyZWFrcG9pbnRzID0gKHN1aXRlcykgPT4ge1xyXG4gICAgY29uc3QgcmV0dmFsID0gW107XHJcblxyXG4gICAgaWYgKFxyXG4gICAgICAgIHN1aXRlcyAmJlxyXG4gICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGVzKSAmJlxyXG4gICAgICAgIHN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgICBzdWl0ZXMubWFwKChzdWl0ZSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBzdWl0ZSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoc3VpdGUuY2FzZXMpICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubWFwKChjYXplKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYXplLmJyZWFrcG9pbnRzKSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5tYXAoKGJyZWFrcG9pbnQpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbC5wdXNoKGJyZWFrcG9pbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXR2YWw7XHJcbn07XHJcblxyXG5jb25zdCByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyA9IChzdWl0ZXMsIHJlbW92ZUJyZWFrcG9pbnQpID0+IHtcclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50LCBpZHgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmZpbGUgPT09IHJlbW92ZUJyZWFrcG9pbnQuZmlsZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQubGluZSA9PT0gcmVtb3ZlQnJlYWtwb2ludC5saW5lXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59O1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3h5Z2VuUnVubmVyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIC8vIGNsYXNzIHZhcmlhYmxlc1xyXG4gICAgICAgIHRoaXMuX2lkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gbnVsbDtcclxuXHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlO1xyXG4gICAgICAgIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG9wdGlvbnMubnBtR1Jvb3RFeGVjdXRpb247XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBkZWZpbmUgdmFyaWFibGVzIHRvIGl0ZXJhdGUgdGhyb3VnaCB0ZXN0IGNhc2VzIGFuZCB0ZXN0IHN1aXRlIGl0ZXJhdGlvbnNcclxuICAgICAgICB0aGlzLl9zdWl0ZTtcclxuICAgICAgICB0aGlzLl9lbnZWYXJzID0ge307ICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcGFzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRlc3RcclxuICAgICAgICB0aGlzLl92YXJzID0ge307ICAgICAvLyB1c2VyLWRlZmluZWQgdmFyaWFibGVzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBzY3JpcHRzXHJcbiAgICAgICAgdGhpcy5fY2FwcyA9IHt9OyAvLyBkZXNpcmVkIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBwYXNzZWQgdG8gZWFjaCBtb2R1bGVcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gMztcclxuICAgICAgICAvLyBwcm9taXNlc1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcbiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbiAgICAgKiBQdWJsaWMgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuICAgIGFzeW5jIGluaXQob3B0aW9ucywgY2FwcyA9IHt9LCByZXBvcnRlcikge1xyXG4gICAgICAgIC8vIG1ha2Ugc3VyZSBhdCBsZWFzdCBvbmUgdGVzdCBzdWl0ZSBpcyBkZWZpbmVkXHJcbiAgICAgICAgaWYgKCFvcHRpb25zLnN1aXRlcykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0luaXRpYWxpemF0aW9uIGZhaWxlZCAtIG5vIHRlc3Qgc3VpdGVzIGFyZSBkZWZpbmVkLiBZb3UgbXVzdCBkZWZpbmUgXCJzdWl0ZXNcIiBwcm9wZXJ0eSBpbiBPeHlnZW4gb3B0aW9ucy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgICAgIHRoaXMuX2N3ZCA9IHRoaXMuX29wdGlvbnMuY3dkIHx8IHByb2Nlc3MuY3dkKCk7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgPSByZXBvcnRlcjtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG9wdGlvbnMpIHtcclxuICAgICAgICAgICAgLy8gbWVyZ2UgY3VycmVudCBhbmQgdGVzdCBjb25maWd1cmF0aW9uIGJhc2VkIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICBsZXQgb3B0RW52ID0ge307XHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudikge1xyXG4gICAgICAgICAgICAgICAgLy8gJ2Vudicgb3B0aW9uIG1pZ2h0IGJlIGRlZmluZWQgZWl0aGVyIGFzIGEgbmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgb3IgYXMgYW4gb2JqZWN0IHRoYXQgbGlzdHMgYWxsIGVudmlyb25tZW50IHZhcmlhYmxlc1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgJ2VudicgaXMgYSBzdHJpbmcsIHRoZW4gcmVzb2x2ZSB0aGUgYWN0dWFsIHZhcmlhYmxlcyBmcm9tICdlbnZzJyBvYmplY3RcclxuICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5lbnYgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRpb25zLmVudnMgPT09ICdvYmplY3QnICYmIG9wdGlvbnMuZW52c1tvcHRpb25zLmVudl0pIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdO1xyXG5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGFuIG9iamVjdCwgdXNlIHRoZSB2YXJpYWJsZXMgZGVmaW5lZCBpbiBpdFxyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnb2JqZWN0JyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudikpIHtcclxuICAgICAgICAgICAgICAgICAgICBvcHRFbnYgPSBvcHRpb25zLmVudjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW52VmFycyAmJiBPYmplY3Qua2V5cyhvcHRpb25zLmVudlZhcnMpKSB7XHJcbiAgICAgICAgICAgICAgICBvcHRFbnYgPSB7IC4uLm9wdEVudiwgLi4ub3B0aW9ucy5lbnZWYXJzIH07XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIGFzc2lnbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGxhdGVyIHVzZVxyXG4gICAgICAgICAgICB0aGlzLl9lbnYgPSB7XHJcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICAuLi5vcHRFbnZcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7IC4uLmNhcHMgfTsgLy8gYXNzaWduIGNhcHMgZm9yIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX3N1aXRlcyA9IFsgLi4ub3B0aW9ucy5zdWl0ZXMgXTtcclxuICAgICAgICAvLyBzZXQgdXAgZGVidWdnaW5nIG9wdGlvbnNcclxuICAgICAgICAvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIHJlaW1wbGVtZW50ZWQuIEV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBkZWJ1Z2dpbmcgKGluaXRpYWxpemVEZWJ1Z2dlcikgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBPeHlnZW5cclxuICAgICAgICAvLyBhbmQgYWRkZWQgdG8gSURFIGluc3RlYWQuIEkuZS4gdGhlIG9ubHkgdGhpbmcgb3h5Z2VuIHNob3VsZCBkbyBpcyB0byBsYXVuY2ggdGhlIGNoaWxkIHByb2Nlc3Mgd2l0aCB0aGUgZGVidWdnaW5nIHN3aXRjaC5cclxuICAgICAgICB0aGlzLl9kZWJ1Z01vZGUgPSAgb3B0aW9ucy5kZWJ1Z1BvcnRJZGUgfHwgb3B0aW9ucy5kZWJ1Z1BvcnQgPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gb3B0aW9ucy5kZWJ1Z1BvcnQgfHwgb3B0aW9ucy5kZWJ1Z1BvcnRJZGUgfHwgbnVsbDtcclxuICAgICAgICBvcHRpb25zLnNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0ID0gdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQ7XHJcbiAgICAgICAgdGhpcy5fbG9jYWxUaW1lID0gKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5sb2NhbFRpbWUpIHx8IHRoaXMuX2xvY2FsVGltZTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9zdGFydFdvcmtlclByb2Nlc3MoKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfSW5pdE94eWdlbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuX2lzRGlzcG9zaW5nID0gdHJ1ZTtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wKHN0YXR1cyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdydW5uZXIgZGlzcG9zZSBlJywgZSk7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHRoZSBkaXNwb3NlXHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdFcnJvciB3aGVuIGRpc3Bvc2luZyBSdW5uZXI6JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdHVzICE9PSAnQ0FOQ0VMRUQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXppbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5pdGlhbGl6YXRpb24gaGFzbid0IGJlZW4gY29tcGxldGVkIHlldCwgd2FpdCBmb3IgJ2luaXRpYWxpemVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcmV2aW91cyB0ZXN0IGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yICd0ZXN0LWVuZGVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJTdGFydCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwcyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuVGVzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IHJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJFbmQodGhpcy5faWQsIHJlc3VsdCwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBraWxsKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5raWxsKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnQ29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0c0JyZWFrcG9pbnRzID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlc0JyZWFrcG9pbnRzID0gZ2V0U3VpdGVzQnJlYWtwb2ludHModGhpcy5fc3VpdGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYnJlYWtwb2ludHMgZnJvbSBzdWl0ZXMvY2FzZXMgdHJlZVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc3VpdGVCcCBvZiBzdWl0ZXNCcmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtwb2ludHMuaW5jbHVkZXMoc3VpdGVCcC5saW5lKSAmJiAgZmlsZVBhdGggPT09IHN1aXRlQnAuZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyh0aGlzLl9zdWl0ZXMsIHN1aXRlQnApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVsZXRlZCBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYWN0dWFsQ3VycmVudEJwIG9mIHRzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKGFjdHVhbEN1cnJlbnRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGFjdHVhbEN1cnJlbnRCcCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGJyZWFrcG9pbnRzXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1c2VyU2V0QnAgb2YgYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRzQnJlYWtwb2ludHMuaW5jbHVkZXModXNlclNldEJwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGVQYXRoLCB1c2VyU2V0QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygndXBkYXRlQnJlYWtwb2ludHMoKSBkb25lLicpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb21pc2VBbGxQcm9taXNlIDogcHJvbWlzZUFsbFByb21pc2UsIGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgOiBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsQ2xvc2UoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfc3RvcCdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU2VuZChjbWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuX3NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ3JlcGwnLFxyXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9ldmFsJyxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY21kOiBjbWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlKCdyZXBsU3RhcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3N1aXRlICYmIHRoaXMuX3N1aXRlLnRlc3RjYXNlcykge1xyXG4gICAgICAgICAgICBjb25zdCB0YyA9IHRoaXMuX3N1aXRlLnRlc3RjYXNlc1t0Y2luZGV4XTtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKCdveHlnZW4uc2V0QnJlYWtwb2ludDogJyArIChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQpKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQodGMubmFtZSwgbGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckJyZWFrcG9pbnQobGluZSkge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNsZWFyQnJlYWtwb2ludChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQsIG51bGwpO1xyXG4gICAgICAgIH0qL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBhc3luYyBfcnVuVGVzdCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgcmVzdWx0LnN1aXRlcyA9IFtdO1xyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgLy8gY2FsbCBiZWZvcmVUZXN0IGhvb2tcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHN1aXRlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWl0ZSBvZiB0aGlzLl9zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuU3VpdGUoc3VpdGUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5wdXNoKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5kdXJhdGlvbiA9IHJlc3VsdC5lbmRUaW1lIC0gcmVzdWx0LnN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gcmVzdWx0LnN1aXRlcy5zb21lKHN1aXRlSXRlcmF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZUl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShzdWl0ZUl0ZXJhdGlvbnMpICYmIHN1aXRlSXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IGhhc0ZhaWxlZFN1aXRlcyA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5lbnZpcm9ubWVudCA9IHsgLi4udGhpcy5fZW52IH07XHJcbiAgICAgICAgLy8gY29tYmluZSB0ZXN0IGRlZmluZWQgY2FwcyBhbmQgcGVyIG1vZHVsZSBjYXBhYmlsaXRpZXMsIHRoYXQgd2VyZSBwYXNzZWQgYnkgdXNlciBpbiBlYWNoIG1vZHVsZSdzIGluaXQgZnVuY3Rpb25cclxuICAgICAgICByZXN1bHQuY2FwYWJpbGl0aWVzID0geyAuLi50aGlzLl9jYXBzLCAuLi50aGlzLl9tb2RDYXBzIH07ICAgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX2NhcHMgb2JqZWN0XHJcbiAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSB7IC4uLnRoaXMuX29wdGlvbnMgfTsgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX29wdGlvbnMgb2JqZWN0XHJcblxyXG4gICAgICAgIC8vIGlmIGVycm9yIG9jY3VyZWQsIGFkZCBpdCB0byB0aGUgc3VtbWFyeVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuU3VpdGUoc3VpdGUpIHtcclxuICAgICAgICBpZiAoIXN1aXRlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignc3VpdGUgaXMgbnVsbCBpbiBfcnVuU3VpdGUoKSEhIScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgc3VpdGUgd2l0aCBtaXNzaW5nIG1hbmRhdG9yeSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgaWYgKCFzdWl0ZS5uYW1lICYmICFzdWl0ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBzcGVjaWZ5IHN1aXRlLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgaWYgKCFzdWl0ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICBzdWl0ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc3VpdGUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzaW5nbGUgc3VpdGUgbWlnaHQgcHJvZHVjZSBtdWx0aXBsZSByZXN1bHRzLCBiYXNlZCBvbiBhbW91bnQgb2YgZGVmaW5lZCBpdGVyYXRpb25zXHJcbiAgICAgICAgY29uc3Qgc3VpdGVJdGVyYXRpb25zID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgc3VpdGVJdGVyYXRpb249MTsgc3VpdGVJdGVyYXRpb24gPD0gc3VpdGUuaXRlcmF0aW9uQ291bnQ7IHN1aXRlSXRlcmF0aW9uKyspIHtcclxuICAgICAgICAgICAgaWYgKHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25TdGFydCh0aGlzLl9pZCwgc3VpdGVJdGVyYXRpb24sICdTdWl0ZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gbmV3IFRlc3RTdWl0ZVJlc3VsdCgpO1xyXG4gICAgICAgICAgICBzdWl0ZUl0ZXJhdGlvbnMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lm5hbWUgPSBzdWl0ZS5uYW1lIHx8IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoc3VpdGUucGF0aCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgc3VpdGVSZXN1bHQuaXRlcmF0aW9uTnVtID0gc3VpdGVJdGVyYXRpb247XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQmVmb3JlU3VpdGVIb29rKHN1aXRlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25TdWl0ZVN0YXJ0KHRoaXMuX2lkLCBzdWl0ZS51cmksIHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgZm9yIChsZXQgY2F6ZSBvZiBzdWl0ZS5jYXNlcykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGNhc2VzIHdpdGggbWlzc2luZyBtYW5kYXRvcnkgJ3BhdGgnIHByb3BlcnR5IFxyXG4gICAgICAgICAgICAgICAgaWYgKCFjYXplLnBhdGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5uYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F6ZS5uYW1lID0gb3h1dGlsLmdldEZpbGVOYW1lV2l0aG91dEV4dChjYXplLnBhdGgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKCFjYXplLml0ZXJhdGlvbkNvdW50KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2F6ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlSXRlcmF0aW9uPTE7IGNhc2VJdGVyYXRpb24gPD0gY2F6ZS5pdGVyYXRpb25Db3VudDsgY2FzZUl0ZXJhdGlvbisrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaG93Q2FzZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXplICYmIGNhemUuaXRlcmF0aW9uQ291bnQgJiYgY2F6ZS5pdGVyYXRpb25Db3VudCA+IDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25JdGVyYXRpb25TdGFydCh0aGlzLl9pZCwgY2FzZUl0ZXJhdGlvbiwgJ0Nhc2UnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlUnVuQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYXNlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuQ2FzZShzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc2VSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FzZVJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQgJiYgdGhpcy5fb3B0aW9ucy5yZVJ1bk9uRmFpbGVkICYmIHJlUnVuQ291bnQgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVSdW5Db3VudCA9IDE7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhaWxlZCBvbiBjYW5jZWxlZCBzdGF0dXMgbm90IGNsb3NlIGJyb3dzZXIgd2luZG93XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyX0Rpc3Bvc2VNb2R1bGVzKCdwYXNzZWQnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQgPSBhd2FpdCB0aGlzLl9ydW5DYXNlKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgdHJ1ZSk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhc2VSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQucmVSdW5Db3VudCA9IHJlUnVuQ291bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uRW5kKHRoaXMuX2lkLCBjYXNlUmVzdWx0LCAnQ2FzZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2soY2F6ZSwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fb3B0aW9ucy5hdXRvRGlzcG9zZSAhPT0gJ2Jvb2xlYW4nIHx8IHRoaXMuX29wdGlvbnMuYXV0b0Rpc3Bvc2UgPT09IHRydWUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXJfRGlzcG9zZU1vZHVsZXMoY2FzZVJlc3VsdC5zdGF0dXMpKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0LmNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGVzdCBjYXNlIGl0ZXJhdGlvbiBoYXMgZmFpbGVkLCB0aGVuIG1hcmsgdGhlIGVudGlyZSB0ZXN0IGNhc2UgYXMgZmFpbGVkLCBcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGl0ZXJhdGluZyBvdmVyIGl0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgY2FzZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQsICdTdWl0ZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVFbmQodGhpcy5faWQsIHN1aXRlLnVyaSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9ydW5DYXNlKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcmVSdW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHt9O1xyXG4gICAgICAgIC8vIGdldCB0ZXN0IHN1aXRlJ3MgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgLy8gZ2V0IHRoZW0gZmlyc3QgYW5kIHRoZW4gb3ZlcnJpZGUgd2l0aCB0ZXN0IGNhc2UgbGV2ZWwgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHN1aXRlLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICBpZiAocmVSdW4pIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF8uZXh0ZW5kKHBhcmFtcywgc3VpdGUucGFyYW1NYW5hZ2VyLmdldFZhbHVlcygpKTtcclxuICAgICAgICAgICAgc3VpdGUucGFyYW1NYW5hZ2VyLnJlYWROZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlYWQgdGVzdCBjYXNlJ3MgbmV4dCBsaW5lcyBvZiBwYXJhbWV0ZXJzIGlmIHBhcmFtZXRlciBtYW5hZ2VyIGlzIGRlZmluZWRcclxuICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgaWYgKHJlUnVuKSB7XHJcbiAgICAgICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkUHJldigpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIF8uZXh0ZW5kKHBhcmFtcywgY2F6ZS5wYXJhbU1hbmFnZXIuZ2V0VmFsdWVzKCkpO1xyXG4gICAgICAgICAgICBjYXplLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRkIGJyZWFrcG9pbnRzIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHQgaWYgaW4gZGVidWcgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiBjYXplLmJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTwgY2F6ZS5icmVha3BvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gZWRpdG9yIGluZGV4IHN0YXJ0cyBmcm9tIDEsIGJ1dCB3ZSBuZWVkIHplcm8gYmFzZWQgaW5kZXhcclxuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2F6ZS5icmVha3BvaW50c1tpXS5saW5lO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBjYXplLmJyZWFrcG9pbnRzW2ldLmZpbGU7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQoZmlsZSwgbGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy90aGlzLmVtaXQoJ2l0ZXJhdGlvbjpzdGFydCcsIGNhc2VJdGVyYXRpb24pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2soY2F6ZSk7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlU3RhcnQodGhpcy5faWQsIHN1aXRlLnVyaSB8fCBzdWl0ZS5pZCwgY2F6ZS51cmkgfHwgY2F6ZS5pZCB8fCBjYXplLnBhdGgsIGNhemUpO1xyXG4gICAgICAgIGNvbnN0IGNhc2VSZXN1bHQgPSBuZXcgVGVzdENhc2VSZXN1bHQoKTtcclxuICAgICAgICBjYXNlUmVzdWx0Lm5hbWUgPSBjYXplLm5hbWU7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5sb2NhdGlvbiA9IGNhemUucGF0aDtcclxuICAgICAgICBjYXNlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IGNhc2VJdGVyYXRpb247XHJcblxyXG4gICAgICAgIC8vIHRyeSB0byBpbml0aWFsaXplIE94eWdlbiBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICghKHRoaXMuX3dvcmtlcikgJiYgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9Jbml0T3h5Z2VuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXJ0VGltZSA9IGNhc2VSZXN1bHQuZW5kVGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5kdXJhdGlvbiA9IDA7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlRW5kKHRoaXMuX2lkLCBzdWl0ZS51cmkgfHwgc3VpdGUuaWQsIGNhemUudXJpIHx8IGNhemUuaWQsIGNhc2VSZXN1bHQpO1xyXG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcnVuIHRoZSB0ZXN0IGluIHRoZSB3b3JrZXIgcHJvY2VzcyBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB7IHJlc3VsdFN0b3JlLCBjb250ZXh0LCBtb2R1bGVDYXBzLCBlcnJvciB9ID0gYXdhaXQgdGhpcy5fd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgY29udGV4dCwgZXJyb3IsIG1vZHVsZUNhcHMgfSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmR1cmF0aW9uID0gY2FzZVJlc3VsdC5lbmRUaW1lIC0gY2FzZVJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmNvbnRleHQgPSBjb250ZXh0O1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLnN0ZXBzID8gcmVzdWx0U3RvcmUuc3RlcHMgOiBbXTtcclxuICAgICAgICAgICAgICAgIGNhc2VSZXN1bHQubG9ncyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmxvZ3MgPyByZXN1bHRTdG9yZS5sb2dzIDogW107XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmhhciA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLmhhciA/IHJlc3VsdFN0b3JlLmhhciA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnRlc3RBdHRyaWJ1dGVzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuYXR0cmlidXRlcyA/IHJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IGNhc2UgaXRlcmF0aW9uIHN0YXR1cyAtIG1hcmsgaXQgYXMgZmFpbGVkIGlmIGFueSBzdGVwIGhhcyBmYWlsZWRcclxuICAgICAgICAgICAgICAgIHZhciBmYWlsZWRTdGVwcyA9IF8uZmluZChjYXNlUmVzdWx0LnN0ZXBzLCB7c3RhdHVzOiBTdGF0dXMuRkFJTEVEfSk7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IF8uaXNFbXB0eShmYWlsZWRTdGVwcykgJiYgIWVycm9yID8gU3RhdHVzLlBBU1NFRCA6IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvcjtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IG94dXRpbC5tYWtlVHJhbnNhY3Rpb25GYWlsZWRJZlN0ZXBGYWlsZWQoY2FzZVJlc3VsdC5zdGVwcyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlcl9SdW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX1J1bihzdWl0ZSwgY2F6ZSwgc3VpdGVJdGVyYXRpb24sIGNhc2VJdGVyYXRpb24sIHBhcmFtcykge1xyXG4gICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignX3dvcmtlciBpcyBudWxsIGJ1dCBub3Qgc3VwcG9zZSB0byEnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fd2hlblRlc3RDYXNlRmluaXNoZWQucmVqZWN0KG5ldyBFcnJvcignX3dvcmtlciBpcyBudWxsJykpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RhcnQgcnVubmluZyB0aGUgdGVzdFxyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl93b3JrZXIucnVuKHtcclxuICAgICAgICAgICAgc2NyaXB0TmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICBzY3JpcHRQYXRoOiBjYXplLnBhdGgsXHJcbiAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgIHBhcmFtczogcGFyYW1zLFxyXG4gICAgICAgICAgICAgICAgZW52OiB0aGlzLl9lbnYsXHJcbiAgICAgICAgICAgICAgICBjYXBzOiB0aGlzLl9jYXBzLFxyXG4gICAgICAgICAgICAgICAgdmFyczogdGhpcy5fdmFycyxcclxuICAgICAgICAgICAgICAgIHRlc3Q6IHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNhemUubmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBzdWl0ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwb0ZpbGU6IHRoaXMuX29wdGlvbnMucG8gfHwgbnVsbCxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX0luaXRPeHlnZW4oKSB7XHJcbiAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW5pdCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2FwcykpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfRGlzcG9zZU1vZHVsZXMoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRpc3Bvc2VNb2R1bGVzKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kaXNwb3NlTW9kdWxlcyhzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vaygpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVRlc3QnLCBbdGhpcy5faWQsIHRoaXMuX29wdGlvbnMsIHRoaXMuX2NhcHNdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVTdWl0ZUhvb2soc3VpdGUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcyAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZVN1aXRlJywgW3N1aXRlXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2JlZm9yZUNhc2UnLCBbY2F6ZV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJUZXN0SG9vayhyZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJUZXN0JywgW3RoaXMuX2lkLCByZXN1bHRdKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlclRlc3RcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclN1aXRlSG9vayhzdWl0ZSwgcmVzdWx0KSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2soJ2FmdGVyU3VpdGUnLCBbc3VpdGUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyU3VpdGVcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9jYWxsQWZ0ZXJDYXNlSG9vayhjYXplLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDYXNlJywgW2NhemUsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zdGFydFdvcmtlclByb2Nlc3MoKSB7XHJcbiAgICAgICAgY29uc3Qgd29ya2VyUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICd3b3JrZXIuanMnKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIgPSBuZXcgV29ya2VyUHJvY2Vzcyh0aGlzLl9pZCwgd29ya2VyUGF0aCwgdGhpcy5fZGVidWdNb2RlLCB0aGlzLl9kZWJ1Z1BvcnQsICdPeHlnZW4nLCB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbik7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0KCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckV2ZW50cygpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydERlYnVnZ2VyKCk7XHJcbiAgICAgICAgdGhpcy5faG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tXb3JrZXJFdmVudHMoKSB7XHJcbiAgICAgICAgLy8gcHJlc2VydmUgdGhpcyBvYmplY3RcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDpiZWZvcmUnLCB0aGlzLl9oYW5kbGVCZWZvcmVDb21tYW5kLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5zdWJzY3JpYmUoJ2NvbW1hbmQ6YWZ0ZXInLCB0aGlzLl9oYW5kbGVBZnRlckNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdlcnJvcicsIChwYXlsb2FkKSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3IgfSA9IHBheWxvYWQ7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignV29ya2VyIHByb2Nlc3MgZXJyb3I6ICcsIGVycm9yKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXREb25lKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IGVycm9yO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdleGl0JywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5leGl0RG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IHBheWxvYWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXhpdENvZGUgJiYgZXhpdENvZGUgIT09IDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0ZXN0IGlzIHJ1bm5pbmcgb3IgaXMgYmVpbmcgZGlzcG9zZWQgYW5kIHRoZSBjaGlsZCBwcm9jZXNzIGhhcyBkaWVkLFxyXG4gICAgICAgICAgICAgICAgLy8gdGhlbiBlbmQgdGhlIHRlc3Qgb3IgZGlzcG9zYWwgd2l0aCBmYXRhbCBlcnJvclxyXG4gICAgICAgICAgICAgICAgLy8gKGNoaWxkIHByb2Nlc3Mgbm90IHN1cHBvc2UgdG8gZGllIHdpdGggY29kZSA+IDApXHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX2lzRGlzcG9zaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuRGlzcG9zZWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfdGhpcy5faXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZSA9IF90aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBlcnJvciA9IF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICBpZiAoZXhpdENvZGUgPT0gMTM0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBuZXcgT3h5Z2VuRXJyb3IoZXJyb3JIZWxwZXIuZXJyb3JDb2RlLlNDUklQVF9FUlJPUiwgJ091dCBvZiBtZW1vcnkgZXJyb3IuIE1ha2Ugc3VyZSB0aGF0IHlvdSBkb25cXCd0IGhhdmUgYW55IG1lbW9yeSBsZWFrcyBpbiB0aGUgdGVzdCBzY3JpcHQuJyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmICghZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihgV29ya2VyIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZTogJHtleGl0Q29kZX0uYCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgcHJvbWlzZSAmJiBwcm9taXNlLnJlamVjdChlcnJvcik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVzZXRHbG9iYWxWYXJpYWJsZXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5vbignbWVzc2FnZScsIGFzeW5jIChtc2cpID0+IHtcclxuICAgICAgICAgICAgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLmxldmVsID09PSAnREVCVUcnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdJTkZPJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKG1zZy5tc2cpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2cubGV2ZWwgPT09ICdFUlJPUicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZXJyb3IobXNnLm1zZywgbXNnLmVycik7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ1dBUk4nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbG9nJywgbXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5fcmVwb3J0ZXIgJiYgX3RoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobXNnLnRpbWUsIG1zZy5sZXZlbCwgbXNnLm1zZywgbXNnLnNyYyB8fCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xpbmUtdXBkYXRlJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnbGluZS11cGRhdGUnLCBtc2cubGluZSwgbXNnLnN0YWNrLCBtc2cudGltZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3Jlc3VsdC11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCA9PT0gJ2luaXQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgnaW5pdC1kb25lJywgbXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnd29ya2VyRXJyb3InKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnd29ya2VyRXJyb3I6JywgbXNnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmtpbGwoJ2ZhaWxlZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICdyZXBsJykge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuZW1pdCgncmVwbCcsIG1zZyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckRlYnVnZ2VyRXZlbnRzKCkge1xyXG4gICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIub24oJ2RlYnVnZ2VyOmJyZWFrJywgKGJyZWFrcG9pbnREYXRhKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludCcsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5vbignZGVidWdnZXI6YnJlYWtFcnJvcicsIChicmVha0Vycm9yKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnYnJlYWtwb2ludEVycm9yJywgYnJlYWtFcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUJlZm9yZUNvbW1hbmQoZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uU3RlcFN0YXJ0KHRoaXMuX2lkLCBlKTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdiZWZvcmVDb21tYW5kJywgW2VdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZUNvbW1hbmRcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZUFmdGVyQ29tbWFuZChlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25TdGVwRW5kKHRoaXMuX2lkLCBlLnJlc3VsdCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKGUgJiYgZS5tb2R1bGUgJiYgZS5tb2R1bGUgPT09ICdsb2cnKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNvbW1hbmQnLCBbZS5yZXN1bHRdKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9yZXNldEdsb2JhbFZhcmlhYmxlcygpIHtcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0ge307XHJcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6aW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fdGVzdEtpbGxlZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3doZW5EaXNwb3NlZCA9IGRlZmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgX3Byb2Nlc3NUZXN0UmVzdWx0cyh7IHJlc3VsdFN0b3JlLCBtb2R1bGVDYXBzLCBjb250ZXh0ID0ge30sIGVycm9yID0gbnVsbCB9KSB7XHJcbiAgICAgICAgLy8gaWYgdGVzdCB3YXMga2lsbGVkIGJlZm9yZSBhbnkgcmVzdWx0cyB3ZXJlIGdlbmVyYXRlZCwgdGhlbiBqdXN0IGZpbmFsaXplIHRoZSB0ZXN0IHdpdGhvdXQgcHJvY2Vzc2luZyByZXN1bHRzXHJcbiAgICAgICAgaWYgKHRoaXMuX3Rlc3RLaWxsZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Rlc3QtZXJyb3InLCBlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHN0b3JlICd2YXJzJyBwYXJ0IG9mIHRoZSBjb250ZXh0IGZvciBhIGxhdGVyIHVzZVxyXG4gICAgICAgIHRoaXMuX3ZhcnMgPSBjb250ZXh0LnZhcnMgfHwgdGhpcy5fdmFycztcclxuICAgICAgICAvLyBzdG9yZSAnbW9kQ2FwcycgcGFydCBvZiB0aGUgY29udGV4dCBmb3IgYSBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9tb2RDYXBzID0geyAuLi50aGlzLl9tb2RDYXBzLCAuLi5tb2R1bGVDYXBzIHx8IHt9IH07XHJcbiAgICAgICAgLy8gY2xlYW4gdXAgY29udGV4dCBmcm9tIGludGVybmFsIGVsZW1lbnRzLCBub3QgbmVlZCBpbiB0aGUgcmVwb3J0OlxyXG4gICAgICAgIC8vIHJlbW92ZSBjYXBzIGZyb20gdGhlIGNvbnRleHQgYXMgaXQgYWxyZWFkeSBhcHBlYXJzIGluIFRlc3RSZXN1bHQgbm9kZVxyXG4gICAgICAgIGlmIChjb250ZXh0LmNhcHMpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmNhcHM7XHJcbiAgICAgICAgLy8gcmVtb3ZlIGVudiBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC5lbnYpXHJcbiAgICAgICAgICAgIGRlbGV0ZSBjb250ZXh0LmVudjtcclxuICAgICAgICAvLyByZW1vdmUgdGVzdCBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC50ZXN0KVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC50ZXN0O1xyXG4gICAgfVxyXG5cclxuICAgIF9lbWl0SXRlcmF0aW9uRW5kKHRzLCB0Yywgc3VpdGVJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25OdW0sIGNhc2VJdGVyYXRpb25SZXN1bHQpIHtcclxuICAgICAgICB0aGlzLmVtaXQoJ2l0ZXJhdGlvbi1lbmQnLCB7XHJcbiAgICAgICAgICAgIHN0YXR1czogY2FzZUl0ZXJhdGlvblJlc3VsdC5fc3RhdHVzLFxyXG4gICAgICAgICAgICBmYWlsdXJlOiBjYXNlSXRlcmF0aW9uUmVzdWx0LmZhaWx1cmUgfHwgbnVsbCxcclxuICAgICAgICAgICAgY2FzZToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRjLmlkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0Yy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBjYXNlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRjLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICBpZDogdHMuaWQgfHwgbnVsbCxcclxuICAgICAgICAgICAgICAgIG5hbWU6IHRzLm5hbWUsXHJcbiAgICAgICAgICAgICAgICBpdGVyYXRpb246IHN1aXRlSXRlcmF0aW9uTnVtLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uQ291bnQ6IHRzLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBfZW1pdFRlc3RFbmQocmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVuZCcsIHJlc3VsdCk7XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5leHBvcnQgeyBQYXJhbWV0ZXJNYW5hZ2VyIH07Il19
|
|
856
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ydW5uZXJzL294eWdlbi9pbmRleC5qcyJdLCJuYW1lcyI6WyJsb2ciLCJERUZBVUxUX0lTU1VFUiIsIk1BWF9SRVJVTlMiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsImdldFN1aXRlc0JyZWFrcG9pbnRzIiwic3VpdGVzIiwicmV0dmFsIiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwibWFwIiwic3VpdGUiLCJjYXNlcyIsImNhemUiLCJicmVha3BvaW50cyIsImJyZWFrcG9pbnQiLCJwdXNoIiwicmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMiLCJyZW1vdmVCcmVha3BvaW50IiwiaWR4IiwiZmlsZSIsImxpbmUiLCJzcGxpY2UiLCJPeHlnZW5SdW5uZXIiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJfaWQiLCJveHV0aWwiLCJnZW5lcmF0ZVVuaXF1ZUlkIiwiX2lzUnVubmluZyIsIl9pc0luaXRpYWxpemluZyIsIl9pc0Rpc3Bvc2luZyIsIl93b3JrZXIiLCJfZGVidWdNb2RlIiwiX3dvcmtlclByb2NMYXN0RXJyb3IiLCJfbnBtR1Jvb3RFeGVjdXRpb24iLCJucG1HUm9vdEV4ZWN1dGlvbiIsIl9zdWl0ZSIsIl9lbnZWYXJzIiwiX3ZhcnMiLCJfY2FwcyIsIl9tb2RDYXBzIiwiX29wdGlvbnMiLCJfbG9jYWxUaW1lIiwiX3Rlc3RLaWxsZWQiLCJfc2NyaXB0Q29udGVudExpbmVPZmZzZXQiLCJfd2hlbkRpc3Bvc2VkIiwiaW5pdCIsImNhcHMiLCJyZXBvcnRlciIsIkVycm9yIiwiX2N3ZCIsImN3ZCIsInByb2Nlc3MiLCJfcmVwb3J0ZXIiLCJfaXNJbml0aWFsaXplZCIsIm9wdEVudiIsImVudiIsImVudnMiLCJPYmplY3QiLCJrZXlzIiwiZW52VmFycyIsIl9lbnYiLCJfc3VpdGVzIiwiZGVidWdQb3J0SWRlIiwiZGVidWdQb3J0IiwiX2RlYnVnUG9ydCIsInNjcmlwdENvbnRlbnRMaW5lT2Zmc2V0IiwibG9jYWxUaW1lIiwiX3N0YXJ0V29ya2VyUHJvY2VzcyIsIl93b3JrZXJfSW5pdE94eWdlbiIsImRpc3Bvc2UiLCJzdGF0dXMiLCJzdG9wRGVidWdnZXIiLCJpc1J1bm5pbmciLCJzdG9wIiwiZSIsImNvbnNvbGUiLCJ3YXJuIiwiX3Jlc2V0R2xvYmFsVmFyaWFibGVzIiwicnVuIiwib25SdW5uZXJTdGFydCIsImVycm9yIiwicmVzdWx0IiwiX3J1blRlc3QiLCJmYWlsdXJlIiwib25SdW5uZXJFbmQiLCJraWxsIiwiZGVidWdDb250aW51ZSIsImRlYnVnZ2VyIiwiY29udGludWUiLCJ1cGRhdGVCcmVha3BvaW50cyIsImZpbGVQYXRoIiwic2V0QnJlYWtwb2ludHNBY3RpdmUiLCJwcm9taXNlcyIsInRzQnJlYWtwb2ludHMiLCJnZXRCcmVha3BvaW50cyIsInN1aXRlc0JyZWFrcG9pbnRzIiwic3VpdGVCcCIsImluY2x1ZGVzIiwiYWN0dWFsQ3VycmVudEJwIiwicmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUiLCJ1c2VyU2V0QnAiLCJzZXRCcmVha3BvaW50IiwicHJvbWlzZUFsbFByb21pc2UiLCJhbGwiLCJ0aGVuIiwidmFsdWUiLCJkZWJ1ZyIsImJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMiLCJyZXBsQ2xvc2UiLCJfc2VuZCIsImV2ZW50IiwibmFtZSIsInJlcGxTZW5kIiwiY21kIiwiY29udGVudCIsInJlcGxTdGFydCIsImludm9rZSIsImNsZWFyQnJlYWtwb2ludCIsIlRlc3RSZXN1bHQiLCJzdGFydFRpbWUiLCJnZXRUaW1lU3RhbXAiLCJTdGF0dXMiLCJQQVNTRUQiLCJfd29ya2VyX2NhbGxCZWZvcmVUZXN0SG9vayIsInN1aXRlUmVzdWx0IiwiX3J1blN1aXRlIiwiZW5kVGltZSIsImR1cmF0aW9uIiwiaGFzRmFpbGVkU3VpdGVzIiwic29tZSIsInN1aXRlSXRlcmF0aW9ucyIsIngiLCJGQUlMRUQiLCJlbnZpcm9ubWVudCIsImNhcGFiaWxpdGllcyIsImVycm9ySGVscGVyIiwiZ2V0RmFpbHVyZUZyb21FcnJvciIsIl93b3JrZXJfY2FsbEFmdGVyVGVzdEhvb2siLCJwYXRoIiwiaXRlcmF0aW9uQ291bnQiLCJzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMiLCJyZVJ1bk9uRmFpbHVyZSIsInJlUnVuT25GYWlsZWQiLCJzdWl0ZUl0ZXJhdGlvbiIsIm9uSXRlcmF0aW9uU3RhcnQiLCJUZXN0U3VpdGVSZXN1bHQiLCJnZXRGaWxlTmFtZVdpdGhvdXRFeHQiLCJpdGVyYXRpb25OdW0iLCJfd29ya2VyX2NhbGxCZWZvcmVTdWl0ZUhvb2siLCJvblN1aXRlU3RhcnQiLCJ1cmkiLCJjYXNlSXRlcmF0aW9uIiwic2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMiLCJvbkNhc2VTdGFydCIsImlkIiwiY2FzZVJlc3VsdCIsInJlUnVuQ291bnQiLCJfcnVuQ2FzZSIsIm9uQ2FzZUVuZCIsIm9uSXRlcmF0aW9uRW5kIiwiX3dvcmtlcl9jYWxsQWZ0ZXJTdWl0ZUhvb2siLCJvblN1aXRlRW5kIiwicGFyYW1zIiwicmVSdW4iLCJwYXJhbU1hbmFnZXIiLCJfIiwiZXh0ZW5kIiwiZ2V0VmFsdWVzIiwicmVhZE5leHQiLCJpIiwiX3dvcmtlcl9jYWxsQmVmb3JlQ2FzZUhvb2siLCJUZXN0Q2FzZVJlc3VsdCIsImxvY2F0aW9uIiwiX3dvcmtlcl9zdGFydFNlc3Npb24iLCJyZXN1bHRTdG9yZSIsImNvbnRleHQiLCJtb2R1bGVDYXBzIiwiX3dvcmtlcl9SdW4iLCJfcHJvY2Vzc1Rlc3RSZXN1bHRzIiwic3RlcHMiLCJsb2dzIiwiaGFyIiwidGVzdEF0dHJpYnV0ZXMiLCJhdHRyaWJ1dGVzIiwiZmFpbGVkU3RlcHMiLCJmaW5kIiwiaXNFbXB0eSIsIm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZCIsIl93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2siLCJkaXNwb3NlT3h5Z2VuTW9kdWxlcyIsImF1dG9EaXNwb3NlIiwiX3dvcmtlcl9lbmRTZXNzaW9uIiwiX3doZW5UZXN0Q2FzZUZpbmlzaGVkIiwicmVqZWN0Iiwic2NyaXB0TmFtZSIsInNjcmlwdFBhdGgiLCJ2YXJzIiwidGVzdCIsImNhc2UiLCJpdGVyYXRpb24iLCJwb0ZpbGUiLCJwbyIsImluaXRPeHlnZW4iLCJzdGFydFNlc3Npb24iLCJkaXNwb3NlTW9kdWxlcyIsImVuZFNlc3Npb24iLCJpbnZva2VUZXN0SG9vayIsIm9uTG9nRW50cnkiLCJ3b3JrZXJQYXRoIiwiam9pbiIsIl9fZGlybmFtZSIsIldvcmtlclByb2Nlc3MiLCJzdGFydCIsIl9ob29rV29ya2VyRXZlbnRzIiwic3RhcnREZWJ1Z2dlciIsIl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMiLCJfdGhpcyIsInN1YnNjcmliZSIsIl9oYW5kbGVCZWZvcmVDb21tYW5kIiwiYmluZCIsIl9oYW5kbGVBZnRlckNvbW1hbmQiLCJvbiIsInBheWxvYWQiLCJleGl0RG9uZSIsImVtaXQiLCJleGl0Q29kZSIsInByb21pc2UiLCJPeHlnZW5FcnJvciIsImVycm9yQ29kZSIsIlNDUklQVF9FUlJPUiIsIm1zZyIsImxldmVsIiwiaW5mbyIsImVyciIsInRpbWUiLCJzcmMiLCJzdGFjayIsIm1ldGhvZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsIm9uU3RlcFN0YXJ0IiwibW9kdWxlIiwib25TdGVwRW5kIiwiX2VtaXRJdGVyYXRpb25FbmQiLCJ0cyIsInRjIiwic3VpdGVJdGVyYXRpb25OdW0iLCJjYXNlSXRlcmF0aW9uTnVtIiwiY2FzZUl0ZXJhdGlvblJlc3VsdCIsIl9zdGF0dXMiLCJfZW1pdFRlc3RFbmQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQVVBOztBQUtBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBakJBLE1BQU1BLEdBQUcsR0FBRyxxQkFBTyxjQUFQLENBQVo7QUFDQSxNQUFNQyxjQUFjLEdBQUcsTUFBdkI7QUFDQSxNQUFNQyxVQUFVLEdBQUcsQ0FBbkI7O0FBa0JBLE1BQU1DLE1BQU0sR0FBR0MsRUFBRSxJQUFJLElBQUlDLE9BQUosQ0FBWUMsT0FBTyxJQUFJQyxVQUFVLENBQUNELE9BQUQsRUFBVUYsRUFBVixDQUFqQyxDQUFyQjs7QUFFQSxNQUFNSSxvQkFBb0IsR0FBSUMsTUFBRCxJQUFZO0FBQ3JDLFFBQU1DLE1BQU0sR0FBRyxFQUFmOztBQUVBLE1BQ0lELE1BQU0sSUFDTkUsS0FBSyxDQUFDQyxPQUFOLENBQWNILE1BQWQsQ0FEQSxJQUVBQSxNQUFNLENBQUNJLE1BQVAsR0FBZ0IsQ0FIcEIsRUFJRTtBQUNFSixJQUFBQSxNQUFNLENBQUNLLEdBQVAsQ0FBWUMsS0FBRCxJQUFXO0FBQ2xCLFVBQ0lBLEtBQUssSUFDTEEsS0FBSyxDQUFDQyxLQUROLElBRUFMLEtBQUssQ0FBQ0MsT0FBTixDQUFjRyxLQUFLLENBQUNDLEtBQXBCLENBRkEsSUFHQUQsS0FBSyxDQUFDQyxLQUFOLENBQVlILE1BQVosR0FBcUIsQ0FKekIsRUFLRTtBQUNFRSxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUYsR0FBWixDQUFpQkcsSUFBRCxJQUFVO0FBQ3RCLGNBQ0lBLElBQUksSUFDSkEsSUFBSSxDQUFDQyxXQURMLElBRUFQLEtBQUssQ0FBQ0MsT0FBTixDQUFjSyxJQUFJLENBQUNDLFdBQW5CLENBRkEsSUFHQUQsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxNQUFqQixHQUEwQixDQUo5QixFQUtFO0FBQ0VJLFlBQUFBLElBQUksQ0FBQ0MsV0FBTCxDQUFpQkosR0FBakIsQ0FBc0JLLFVBQUQsSUFBZ0I7QUFDakNULGNBQUFBLE1BQU0sQ0FBQ1UsSUFBUCxDQUFZRCxVQUFaO0FBQ0gsYUFGRDtBQUdIO0FBQ0osU0FYRDtBQVlIO0FBQ0osS0FwQkQ7QUFxQkg7O0FBRUQsU0FBT1QsTUFBUDtBQUNILENBaENEOztBQWtDQSxNQUFNVywwQkFBMEIsR0FBRyxDQUFDWixNQUFELEVBQVNhLGdCQUFULEtBQThCO0FBQzdELE1BQ0liLE1BQU0sSUFDTkUsS0FBSyxDQUFDQyxPQUFOLENBQWNILE1BQWQsQ0FEQSxJQUVBQSxNQUFNLENBQUNJLE1BQVAsR0FBZ0IsQ0FIcEIsRUFJRTtBQUNFSixJQUFBQSxNQUFNLENBQUNLLEdBQVAsQ0FBWUMsS0FBRCxJQUFXO0FBQ2xCLFVBQ0lBLEtBQUssSUFDTEEsS0FBSyxDQUFDQyxLQUROLElBRUFMLEtBQUssQ0FBQ0MsT0FBTixDQUFjRyxLQUFLLENBQUNDLEtBQXBCLENBRkEsSUFHQUQsS0FBSyxDQUFDQyxLQUFOLENBQVlILE1BQVosR0FBcUIsQ0FKekIsRUFLRTtBQUNFRSxRQUFBQSxLQUFLLENBQUNDLEtBQU4sQ0FBWUYsR0FBWixDQUFpQkcsSUFBRCxJQUFVO0FBQ3RCLGNBQ0lBLElBQUksSUFDSkEsSUFBSSxDQUFDQyxXQURMLElBRUFQLEtBQUssQ0FBQ0MsT0FBTixDQUFjSyxJQUFJLENBQUNDLFdBQW5CLENBRkEsSUFHQUQsSUFBSSxDQUFDQyxXQUFMLENBQWlCTCxNQUFqQixHQUEwQixDQUo5QixFQUtFO0FBQ0VJLFlBQUFBLElBQUksQ0FBQ0MsV0FBTCxDQUFpQkosR0FBakIsQ0FBcUIsQ0FBQ0ssVUFBRCxFQUFhSSxHQUFiLEtBQXFCO0FBQ3RDLGtCQUNJSixVQUFVLENBQUNLLElBQVgsS0FBb0JGLGdCQUFnQixDQUFDRSxJQUFyQyxJQUNBTCxVQUFVLENBQUNNLElBQVgsS0FBb0JILGdCQUFnQixDQUFDRyxJQUZ6QyxFQUdFO0FBQ0VSLGdCQUFBQSxJQUFJLENBQUNDLFdBQUwsQ0FBaUJRLE1BQWpCLENBQXdCSCxHQUF4QixFQUE2QixDQUE3QjtBQUNIO0FBQ0osYUFQRDtBQVFIO0FBQ0osU0FoQkQ7QUFpQkg7QUFDSixLQXpCRDtBQTBCSDtBQUNKLENBakNEOztBQW1DZSxNQUFNSSxZQUFOLFNBQTJCQyxvQkFBM0IsQ0FBd0M7QUFDbkRDLEVBQUFBLFdBQVcsQ0FBQ0MsT0FBRCxFQUFVO0FBQ2pCO0FBRUEsU0FBS0MsR0FBTCxHQUFXQyxjQUFPQyxnQkFBUCxFQUFYO0FBQ0EsU0FBS0MsVUFBTCxHQUFrQixLQUFsQjtBQUNBLFNBQUtDLGVBQUwsR0FBdUIsS0FBdkI7QUFDQSxTQUFLQyxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0MsT0FBTCxHQUFlLElBQWY7QUFDQSxTQUFLQyxVQUFMLEdBQWtCLEtBQWxCO0FBQ0EsU0FBS0Msb0JBQUwsR0FBNEIsSUFBNUI7QUFFQSxTQUFLQyxrQkFBTCxHQUEwQixJQUExQjs7QUFDQSxRQUFJVixPQUFPLElBQUksT0FBT0EsT0FBTyxDQUFDVyxpQkFBZixLQUFxQyxXQUFwRCxFQUFpRTtBQUM3RCxXQUFLRCxrQkFBTCxHQUEwQlYsT0FBTyxDQUFDVyxpQkFBbEM7QUFDSDs7QUFHRCxTQUFLQyxNQUFMO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixFQUFoQjtBQUNBLFNBQUtDLEtBQUwsR0FBYSxFQUFiO0FBQ0EsU0FBS0MsS0FBTCxHQUFhLEVBQWI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCLEVBQWhCO0FBQ0EsU0FBS0MsUUFBTCxHQUFnQixJQUFoQjtBQUNBLFNBQUtDLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxTQUFLQyxXQUFMLEdBQW1CLEtBQW5CO0FBQ0EsU0FBS0Msd0JBQUwsR0FBZ0MsQ0FBaEM7QUFFQSxTQUFLQyxhQUFMLEdBQXFCLGtCQUFyQjtBQUNIOztBQUlTLFFBQUpDLElBQUksQ0FBQ3RCLE9BQUQsRUFBVXVCLElBQUksR0FBRyxFQUFqQixFQUFxQkMsUUFBckIsRUFBK0I7QUFFckMsUUFBSSxDQUFDeEIsT0FBTyxDQUFDckIsTUFBYixFQUFxQjtBQUNqQixZQUFNLElBQUk4QyxLQUFKLENBQVUsMEdBQVYsQ0FBTjtBQUNIOztBQUVELFNBQUtSLFFBQUwsR0FBZ0JqQixPQUFoQjtBQUNBLFNBQUswQixJQUFMLEdBQVksS0FBS1QsUUFBTCxDQUFjVSxHQUFkLElBQXFCQyxPQUFPLENBQUNELEdBQVIsRUFBakM7QUFDQSxTQUFLRSxTQUFMLEdBQWlCTCxRQUFqQjtBQUNBLFNBQUtNLGNBQUwsR0FBc0IsSUFBdEI7O0FBRUEsUUFBSTlCLE9BQUosRUFBYTtBQUVULFVBQUkrQixNQUFNLEdBQUcsRUFBYjs7QUFDQSxVQUFJL0IsT0FBTyxDQUFDZ0MsR0FBWixFQUFpQjtBQUdiLFlBQUksT0FBT2hDLE9BQU8sQ0FBQ2dDLEdBQWYsS0FBdUIsUUFBdkIsSUFBbUMsT0FBT2hDLE9BQU8sQ0FBQ2lDLElBQWYsS0FBd0IsUUFBM0QsSUFBdUVqQyxPQUFPLENBQUNpQyxJQUFSLENBQWFqQyxPQUFPLENBQUNnQyxHQUFyQixDQUEzRSxFQUFzRztBQUNsR0QsVUFBQUEsTUFBTSxHQUFHL0IsT0FBTyxDQUFDaUMsSUFBUixDQUFhakMsT0FBTyxDQUFDZ0MsR0FBckIsQ0FBVDtBQUVILFNBSEQsTUFLSyxJQUFJLE9BQU9oQyxPQUFPLENBQUNnQyxHQUFmLEtBQXVCLFFBQXZCLElBQW1DRSxNQUFNLENBQUNDLElBQVAsQ0FBWW5DLE9BQU8sQ0FBQ2dDLEdBQXBCLENBQXZDLEVBQWlFO0FBQ2xFRCxZQUFBQSxNQUFNLEdBQUcvQixPQUFPLENBQUNnQyxHQUFqQjtBQUNIO0FBQ0o7O0FBRUQsVUFBSWhDLE9BQU8sQ0FBQ29DLE9BQVIsSUFBbUJGLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZbkMsT0FBTyxDQUFDb0MsT0FBcEIsQ0FBdkIsRUFBcUQ7QUFDakRMLFFBQUFBLE1BQU0sR0FBRyxFQUFFLEdBQUdBLE1BQUw7QUFBYSxhQUFHL0IsT0FBTyxDQUFDb0M7QUFBeEIsU0FBVDtBQUNIOztBQUdELFdBQUtDLElBQUwsR0FBWSxFQUNSLEdBQUcsS0FBS0EsSUFEQTtBQUVSLFdBQUdOO0FBRkssT0FBWjtBQUlIOztBQUVELFNBQUtoQixLQUFMLEdBQWEsRUFBRSxHQUFHUTtBQUFMLEtBQWI7QUFDQSxTQUFLZSxPQUFMLEdBQWUsQ0FBRSxHQUFHdEMsT0FBTyxDQUFDckIsTUFBYixDQUFmO0FBSUEsU0FBSzZCLFVBQUwsR0FBbUJSLE9BQU8sQ0FBQ3VDLFlBQVIsSUFBd0J2QyxPQUFPLENBQUN3QyxTQUFoQyxHQUE0QyxJQUE1QyxHQUFtRCxLQUF0RTtBQUNBLFNBQUtDLFVBQUwsR0FBa0J6QyxPQUFPLENBQUN3QyxTQUFSLElBQXFCeEMsT0FBTyxDQUFDdUMsWUFBN0IsSUFBNkMsSUFBL0Q7QUFDQXZDLElBQUFBLE9BQU8sQ0FBQzBDLHVCQUFSLEdBQWtDLEtBQUt0Qix3QkFBdkM7QUFDQSxTQUFLRixVQUFMLEdBQW1CLEtBQUtELFFBQUwsSUFBaUIsS0FBS0EsUUFBTCxDQUFjMEIsU0FBaEMsSUFBOEMsS0FBS3pCLFVBQXJFO0FBQ0EsVUFBTSxLQUFLMEIsbUJBQUwsRUFBTjtBQUNBLFVBQU0sS0FBS0Msa0JBQUwsRUFBTjtBQUNIOztBQUVZLFFBQVBDLE9BQU8sQ0FBQ0MsTUFBTSxHQUFHLElBQVYsRUFBZ0I7QUFDekIsU0FBS3pDLFlBQUwsR0FBb0IsSUFBcEI7O0FBQ0EsUUFBSTtBQUNBLFdBQUtDLE9BQUwsS0FBZ0IsTUFBTSxLQUFLQSxPQUFMLENBQWF5QyxZQUFiLEVBQXRCOztBQUNBLFVBQUksS0FBS3pDLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhMEMsU0FBakMsRUFBNEM7QUFDeEMsY0FBTSxLQUFLMUMsT0FBTCxDQUFhMkMsSUFBYixDQUFrQkgsTUFBbEIsQ0FBTjtBQUNIO0FBQ0osS0FMRCxDQUtFLE9BQU9JLENBQVAsRUFBVTtBQUNSQyxNQUFBQSxPQUFPLENBQUNsRixHQUFSLENBQVksNkJBQVosRUFBMkNpRixDQUEzQztBQUVBakYsTUFBQUEsR0FBRyxDQUFDbUYsSUFBSixDQUFTLDhCQUFULEVBQXlDRixDQUF6QztBQUNIOztBQUVELFFBQUlKLE1BQU0sS0FBSyxVQUFmLEVBQTJCO0FBQ3ZCLFdBQUtPLHFCQUFMO0FBQ0g7QUFDSjs7QUFFUSxRQUFIQyxHQUFHLEdBQUc7QUFDUixRQUFJLEtBQUtsRCxlQUFULEVBQTBCO0FBQ3RCLFlBQU0sSUFBSW9CLEtBQUosQ0FBVSx3RUFBVixDQUFOO0FBQ0g7O0FBQ0QsUUFBSSxLQUFLckIsVUFBVCxFQUFxQjtBQUNqQixZQUFNLElBQUlxQixLQUFKLENBQVUsNkRBQVYsQ0FBTjtBQUNIOztBQUNELFNBQUtyQixVQUFMLEdBQWtCLElBQWxCOztBQUVBLFNBQUt5QixTQUFMLENBQWUyQixhQUFmLENBQTZCLEtBQUt2RCxHQUFsQyxFQUF1QyxLQUFLZ0IsUUFBNUMsRUFBc0QsS0FBS0YsS0FBM0Q7O0FBRUEsUUFBSTBDLEtBQUssR0FBRyxJQUFaO0FBQ0EsUUFBSUMsTUFBTSxHQUFHLElBQWI7O0FBQ0EsUUFBSTtBQUNBQSxNQUFBQSxNQUFNLEdBQUcsTUFBTSxLQUFLQyxRQUFMLEVBQWY7QUFDSCxLQUZELENBR0EsT0FBT1IsQ0FBUCxFQUFVO0FBQ05NLE1BQUFBLEtBQUssR0FBR04sQ0FBUjtBQUNIOztBQUVELFFBQUksQ0FBQ00sS0FBRCxJQUFVQyxNQUFWLElBQW9CQSxNQUFNLENBQUNFLE9BQS9CLEVBQXdDO0FBQ3BDSCxNQUFBQSxLQUFLLEdBQUdDLE1BQU0sQ0FBQ0UsT0FBZjtBQUNIOztBQUVELFNBQUsvQixTQUFMLENBQWVnQyxXQUFmLENBQTJCLEtBQUs1RCxHQUFoQyxFQUFxQ3lELE1BQXJDLEVBQTZDRCxLQUE3Qzs7QUFDQSxTQUFLckQsVUFBTCxHQUFrQixLQUFsQjs7QUFDQSxRQUFJcUQsS0FBSixFQUFXO0FBQ1AsWUFBTUEsS0FBTjtBQUNIOztBQUNELFdBQU9DLE1BQVA7QUFDSDs7QUFFUyxRQUFKSSxJQUFJLENBQUNmLE1BQU0sR0FBRyxJQUFWLEVBQWdCO0FBQ3RCLFNBQUs1QixXQUFMLEdBQW1CLElBQW5COztBQUVBLFFBQUksS0FBS1osT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWEwQyxTQUFqQyxFQUE0QztBQUN4QyxZQUFNLEtBQUsxQyxPQUFMLENBQWF1RCxJQUFiLENBQWtCZixNQUFsQixDQUFOO0FBQ0g7QUFDSjs7QUFFRGdCLEVBQUFBLGFBQWEsR0FBRztBQUNaLFFBQUksS0FBS3ZELFVBQUwsSUFBbUIsS0FBS0QsT0FBNUIsRUFBcUM7QUFDakMsV0FBS0EsT0FBTCxDQUFheUQsUUFBYixDQUFzQkMsUUFBdEI7QUFDSDtBQUNKOztBQUVzQixRQUFqQkMsaUJBQWlCLENBQUM5RSxXQUFELEVBQWMrRSxRQUFkLEVBQXdCO0FBQzNDLFFBQUk7QUFFQSxVQUFJLEtBQUs1RCxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYXlELFFBQTdCLElBQXlDLEtBQUt6RCxPQUFMLENBQWF5RCxRQUFiLENBQXNCSSxvQkFBbkUsRUFBeUY7QUFDckYsY0FBTSxLQUFLN0QsT0FBTCxDQUFheUQsUUFBYixDQUFzQkksb0JBQXRCLENBQTJDLEtBQTNDLENBQU47QUFDSCxPQUZELE1BRU87QUFDSCxjQUFNL0YsTUFBTSxDQUFDLEdBQUQsQ0FBWjtBQUNBLGVBQU8sTUFBTSxLQUFLNkYsaUJBQUwsQ0FBdUI5RSxXQUF2QixFQUFvQytFLFFBQXBDLENBQWI7QUFDSDs7QUFFRCxVQUFJLEtBQUszRCxVQUFMLElBQW1CLEtBQUtELE9BQUwsQ0FBYXlELFFBQXBDLEVBQThDO0FBQzFDLFlBQUlLLFFBQVEsR0FBRyxFQUFmOztBQUVBLGNBQU1DLGFBQWEsR0FBRyxLQUFLL0QsT0FBTCxDQUFheUQsUUFBYixDQUFzQk8sY0FBdEIsQ0FBcUNKLFFBQXJDLENBQXRCOztBQUNBLGNBQU1LLGlCQUFpQixHQUFHOUYsb0JBQW9CLENBQUMsS0FBSzRELE9BQU4sQ0FBOUM7O0FBR0EsYUFBSyxJQUFJbUMsT0FBVCxJQUFvQkQsaUJBQXBCLEVBQXVDO0FBQ25DLGNBQUksQ0FBQ3BGLFdBQVcsQ0FBQ3NGLFFBQVosQ0FBcUJELE9BQU8sQ0FBQzlFLElBQTdCLENBQUQsSUFBd0N3RSxRQUFRLEtBQUtNLE9BQU8sQ0FBQy9FLElBQWpFLEVBQXVFO0FBQ25FSCxZQUFBQSwwQkFBMEIsQ0FBQyxLQUFLK0MsT0FBTixFQUFlbUMsT0FBZixDQUExQjtBQUNIO0FBQ0o7O0FBR0QsYUFBSyxJQUFJRSxlQUFULElBQTRCTCxhQUE1QixFQUEyQztBQUN2QyxjQUFJLENBQUNsRixXQUFXLENBQUNzRixRQUFaLENBQXFCQyxlQUFyQixDQUFMLEVBQTRDO0FBQ3hDTixZQUFBQSxRQUFRLENBQUMvRSxJQUFULENBQWMsS0FBS2lCLE9BQUwsQ0FBYXlELFFBQWIsQ0FBc0JZLHVCQUF0QixDQUE4Q1QsUUFBOUMsRUFBd0RRLGVBQXhELENBQWQ7QUFDSDtBQUNKOztBQUdELGFBQUssSUFBSUUsU0FBVCxJQUFzQnpGLFdBQXRCLEVBQW1DO0FBQy9CLGNBQUksQ0FBQ2tGLGFBQWEsQ0FBQ0ksUUFBZCxDQUF1QkcsU0FBdkIsQ0FBTCxFQUF3QztBQUNwQ1IsWUFBQUEsUUFBUSxDQUFDL0UsSUFBVCxDQUFjLEtBQUtpQixPQUFMLENBQWF5RCxRQUFiLENBQXNCYyxhQUF0QixDQUFvQ1gsUUFBcEMsRUFBOENVLFNBQTlDLENBQWQ7QUFDSDtBQUNKOztBQUVELFlBQUlFLGlCQUFpQixHQUFHLE1BQU14RyxPQUFPLENBQUN5RyxHQUFSLENBQVlYLFFBQVosRUFBc0JZLElBQXRCLENBQTRCQyxLQUFELElBQVc7QUFDaEUsaUJBQU9BLEtBQVA7QUFDSCxTQUY2QixDQUE5QjtBQUlBLGNBQU0sS0FBSzNFLE9BQUwsQ0FBYXlELFFBQWIsQ0FBc0JJLG9CQUF0QixDQUEyQyxJQUEzQyxDQUFOO0FBRUEsY0FBTS9GLE1BQU0sQ0FBQyxHQUFELENBQVo7QUFFQUgsUUFBQUEsR0FBRyxDQUFDaUgsS0FBSixDQUFVLDJCQUFWOztBQUVBLGNBQU1DLDRCQUE0QixHQUFHLEtBQUs3RSxPQUFMLENBQWF5RCxRQUFiLENBQXNCTyxjQUF0QixDQUFxQ0osUUFBckMsQ0FBckM7O0FBRUEsZUFBTztBQUFFWSxVQUFBQSxpQkFBaUIsRUFBR0EsaUJBQXRCO0FBQXlDSyxVQUFBQSw0QkFBNEIsRUFBR0E7QUFBeEUsU0FBUDtBQUNILE9BeENELE1Bd0NPO0FBQ0gsZUFBTyxJQUFQO0FBQ0g7QUFDSixLQXBERCxDQW9ERSxPQUFPakMsQ0FBUCxFQUFVO0FBQ1JqRixNQUFBQSxHQUFHLENBQUN1RixLQUFKLENBQVUsZ0JBQVYsRUFBNEJOLENBQTVCO0FBQ0g7QUFDSjs7QUFFYyxRQUFUa0MsU0FBUyxHQUFHO0FBQ2QsVUFBTSxLQUFLOUUsT0FBTCxDQUFhK0UsS0FBYixDQUFtQjtBQUNyQkMsTUFBQUEsS0FBSyxFQUFFLE1BRGM7QUFFckJDLE1BQUFBLElBQUksRUFBRTtBQUZlLEtBQW5CLENBQU47QUFJSDs7QUFFYSxRQUFSQyxRQUFRLENBQUNDLEdBQUQsRUFBTTtBQUNoQixVQUFNLEtBQUtuRixPQUFMLENBQWErRSxLQUFiLENBQW1CO0FBQ3JCQyxNQUFBQSxLQUFLLEVBQUUsTUFEYztBQUVyQkMsTUFBQUEsSUFBSSxFQUFFLFdBRmU7QUFHckJHLE1BQUFBLE9BQU8sRUFBRTtBQUNMRCxRQUFBQSxHQUFHLEVBQUVBO0FBREE7QUFIWSxLQUFuQixDQUFOO0FBT0g7O0FBRWMsUUFBVEUsU0FBUyxHQUFHO0FBQ2QsVUFBTSxLQUFLckYsT0FBTCxDQUFhc0YsTUFBYixDQUFvQixXQUFwQixDQUFOO0FBQ0g7O0FBRURmLEVBQUFBLGFBQWEsQ0FBQ25GLElBQUQsRUFBTyxDQU9uQjs7QUFFRG1HLEVBQUFBLGVBQWUsQ0FBQ25HLElBQUQsRUFBTyxDQUtyQjs7QUFNYSxRQUFSZ0UsUUFBUSxHQUFHO0FBQ2IsVUFBTUQsTUFBTSxHQUFHLElBQUlxQyxtQkFBSixFQUFmO0FBQ0FyQyxJQUFBQSxNQUFNLENBQUNzQyxTQUFQLEdBQW1COUYsY0FBTytGLFlBQVAsRUFBbkI7QUFDQXZDLElBQUFBLE1BQU0sQ0FBQ1gsTUFBUCxHQUFnQm1ELGdCQUFPQyxNQUF2QjtBQUNBekMsSUFBQUEsTUFBTSxDQUFDL0UsTUFBUCxHQUFnQixFQUFoQjtBQUNBLFFBQUk4RSxLQUFLLEdBQUcsSUFBWjtBQUVBLFVBQU0sS0FBSzJDLDBCQUFMLEVBQU47O0FBQ0EsUUFBSTtBQUVBLFdBQUssSUFBSW5ILEtBQVQsSUFBa0IsS0FBS3FELE9BQXZCLEVBQWdDO0FBQzVCLGNBQU0rRCxXQUFXLEdBQUcsTUFBTSxLQUFLQyxTQUFMLENBQWVySCxLQUFmLENBQTFCO0FBQ0F5RSxRQUFBQSxNQUFNLENBQUMvRSxNQUFQLENBQWNXLElBQWQsQ0FBbUIrRyxXQUFuQjtBQUNIO0FBQ0osS0FORCxDQU9BLE9BQU9sRCxDQUFQLEVBQVU7QUFDTk0sTUFBQUEsS0FBSyxHQUFHTixDQUFSO0FBQ0g7O0FBQ0RPLElBQUFBLE1BQU0sQ0FBQzZDLE9BQVAsR0FBaUJyRyxjQUFPK0YsWUFBUCxFQUFqQjtBQUNBdkMsSUFBQUEsTUFBTSxDQUFDOEMsUUFBUCxHQUFrQjlDLE1BQU0sQ0FBQzZDLE9BQVAsR0FBaUI3QyxNQUFNLENBQUNzQyxTQUExQztBQUVBLFVBQU1TLGVBQWUsR0FBRy9DLE1BQU0sQ0FBQy9FLE1BQVAsQ0FBYytILElBQWQsQ0FBbUJDLGVBQWUsSUFBSTtBQUMxRCxVQUFJQSxlQUFlLElBQUk5SCxLQUFLLENBQUNDLE9BQU4sQ0FBYzZILGVBQWQsQ0FBbkIsSUFBcURBLGVBQWUsQ0FBQzVILE1BQWhCLEdBQXlCLENBQWxGLEVBQXFGO0FBQ2pGLGVBQU80SCxlQUFlLENBQUNELElBQWhCLENBQXFCRSxDQUFDLElBQUlBLENBQUMsQ0FBQzdELE1BQUYsS0FBYW1ELGdCQUFPVyxNQUE5QyxDQUFQO0FBQ0g7QUFDSixLQUp1QixDQUF4QjtBQU1BbkQsSUFBQUEsTUFBTSxDQUFDWCxNQUFQLEdBQWdCMEQsZUFBZSxHQUFHUCxnQkFBT1csTUFBVixHQUFtQlgsZ0JBQU9DLE1BQXpEO0FBQ0F6QyxJQUFBQSxNQUFNLENBQUNvRCxXQUFQLEdBQXFCLEVBQUUsR0FBRyxLQUFLekU7QUFBVixLQUFyQjtBQUVBcUIsSUFBQUEsTUFBTSxDQUFDcUQsWUFBUCxHQUFzQixFQUFFLEdBQUcsS0FBS2hHLEtBQVY7QUFBaUIsU0FBRyxLQUFLQztBQUF6QixLQUF0QjtBQUNBMEMsSUFBQUEsTUFBTSxDQUFDMUQsT0FBUCxHQUFpQixFQUFFLEdBQUcsS0FBS2lCO0FBQVYsS0FBakI7O0FBR0EsUUFBSXdDLEtBQUosRUFBVztBQUNQQyxNQUFBQSxNQUFNLENBQUNFLE9BQVAsR0FBaUJvRCxnQkFBWUMsbUJBQVosQ0FBZ0N4RCxLQUFoQyxDQUFqQjtBQUNBQyxNQUFBQSxNQUFNLENBQUNYLE1BQVAsR0FBZ0JtRCxnQkFBT1csTUFBdkI7QUFDSDs7QUFDRCxVQUFNLEtBQUtLLHlCQUFMLENBQStCeEQsTUFBL0IsQ0FBTjtBQUNBLFdBQU9BLE1BQVA7QUFDSDs7QUFFYyxRQUFUNEMsU0FBUyxDQUFDckgsS0FBRCxFQUFRO0FBQ25CLFFBQUksQ0FBQ0EsS0FBTCxFQUFZO0FBQ1JmLE1BQUFBLEdBQUcsQ0FBQ3VGLEtBQUosQ0FBVSxpQ0FBVjtBQUNIOztBQUVELFFBQUksQ0FBQ3hFLEtBQUssQ0FBQ3VHLElBQVAsSUFBZSxDQUFDdkcsS0FBSyxDQUFDa0ksSUFBMUIsRUFBZ0M7QUFDNUIsYUFBTyxFQUFQO0FBQ0g7O0FBRUQsUUFBSSxDQUFDbEksS0FBSyxDQUFDbUksY0FBWCxFQUEyQjtBQUN2Qm5JLE1BQUFBLEtBQUssQ0FBQ21JLGNBQU4sR0FBdUIsQ0FBdkI7QUFDSDs7QUFDRCxRQUFJQywyQkFBMkIsR0FBRyxLQUFsQzs7QUFDQSxRQUFJcEksS0FBSyxDQUFDbUksY0FBTixHQUF1QixDQUEzQixFQUE4QjtBQUMxQkMsTUFBQUEsMkJBQTJCLEdBQUcsSUFBOUI7QUFDSDs7QUFFRCxVQUFNQyxjQUFjLEdBQUcsS0FBS3JHLFFBQUwsQ0FBY3NHLGFBQWQsSUFBK0IsS0FBdEQ7QUFHQSxVQUFNWixlQUFlLEdBQUcsRUFBeEI7O0FBQ0EsU0FBSyxJQUFJYSxjQUFjLEdBQUMsQ0FBeEIsRUFBMkJBLGNBQWMsSUFBSXZJLEtBQUssQ0FBQ21JLGNBQW5ELEVBQW1FSSxjQUFjLEVBQWpGLEVBQXFGO0FBQ2pGLFVBQUlILDJCQUFKLEVBQWlDO0FBQzdCLGFBQUt4RixTQUFMLENBQWU0RixnQkFBZixDQUFnQyxLQUFLeEgsR0FBckMsRUFBMEN1SCxjQUExQyxFQUEwRCxPQUExRDtBQUNIOztBQUNELFlBQU1uQixXQUFXLEdBQUcsSUFBSXFCLG9CQUFKLEVBQXBCO0FBQ0FmLE1BQUFBLGVBQWUsQ0FBQ3JILElBQWhCLENBQXFCK0csV0FBckI7QUFDQUEsTUFBQUEsV0FBVyxDQUFDYixJQUFaLEdBQW1CdkcsS0FBSyxDQUFDdUcsSUFBTixJQUFjdEYsY0FBT3lILHFCQUFQLENBQTZCMUksS0FBSyxDQUFDa0ksSUFBbkMsQ0FBakM7QUFDQWQsTUFBQUEsV0FBVyxDQUFDTCxTQUFaLEdBQXdCOUYsY0FBTytGLFlBQVAsRUFBeEI7QUFDQUksTUFBQUEsV0FBVyxDQUFDdUIsWUFBWixHQUEyQkosY0FBM0I7QUFDQW5CLE1BQUFBLFdBQVcsQ0FBQ3RELE1BQVosR0FBcUJtRCxnQkFBT0MsTUFBNUI7QUFDQSxZQUFNLEtBQUswQiwyQkFBTCxDQUFpQzVJLEtBQWpDLENBQU47O0FBQ0EsV0FBSzRDLFNBQUwsQ0FBZWlHLFlBQWYsQ0FBNEIsS0FBSzdILEdBQWpDLEVBQXNDaEIsS0FBSyxDQUFDOEksR0FBNUMsRUFBaUQxQixXQUFqRDs7QUFDQSxXQUFLLElBQUlsSCxJQUFULElBQWlCRixLQUFLLENBQUNDLEtBQXZCLEVBQThCO0FBRTFCLFlBQUksQ0FBQ0MsSUFBSSxDQUFDZ0ksSUFBVixFQUFnQjtBQUNaO0FBQ0g7O0FBQ0QsWUFBSSxDQUFDaEksSUFBSSxDQUFDcUcsSUFBVixFQUFnQjtBQUNackcsVUFBQUEsSUFBSSxDQUFDcUcsSUFBTCxHQUFZdEYsY0FBT3lILHFCQUFQLENBQTZCeEksSUFBSSxDQUFDZ0ksSUFBbEMsQ0FBWjtBQUNIOztBQUNELFlBQUksQ0FBQ2hJLElBQUksQ0FBQ2lJLGNBQVYsRUFBMEI7QUFDdEJqSSxVQUFBQSxJQUFJLENBQUNpSSxjQUFMLEdBQXNCLENBQXRCO0FBQ0g7O0FBQ0QsYUFBSyxJQUFJWSxhQUFhLEdBQUMsQ0FBdkIsRUFBMEJBLGFBQWEsSUFBSTdJLElBQUksQ0FBQ2lJLGNBQWhELEVBQWdFWSxhQUFhLEVBQTdFLEVBQWlGO0FBRTdFLGNBQUlDLDBCQUEwQixHQUFHLEtBQWpDOztBQUNBLGNBQUk5SSxJQUFJLElBQUlBLElBQUksQ0FBQ2lJLGNBQWIsSUFBK0JqSSxJQUFJLENBQUNpSSxjQUFMLEdBQXNCLENBQXpELEVBQTREO0FBQ3hEYSxZQUFBQSwwQkFBMEIsR0FBRyxJQUE3QjtBQUNIOztBQUNELGNBQUlBLDBCQUFKLEVBQWdDO0FBQzVCLGlCQUFLcEcsU0FBTCxDQUFlNEYsZ0JBQWYsQ0FBZ0MsS0FBS3hILEdBQXJDLEVBQTBDK0gsYUFBMUMsRUFBeUQsTUFBekQ7QUFDSDs7QUFFRCxlQUFLbkcsU0FBTCxDQUFlcUcsV0FBZixDQUEyQixLQUFLakksR0FBaEMsRUFBcUNoQixLQUFLLENBQUM4SSxHQUFOLElBQWE5SSxLQUFLLENBQUNrSixFQUF4RCxFQUE0RGhKLElBQUksQ0FBQzRJLEdBQUwsSUFBWTVJLElBQUksQ0FBQ2dKLEVBQWpCLElBQXVCaEosSUFBSSxDQUFDZ0ksSUFBeEYsRUFBOEZoSSxJQUE5Rjs7QUFFQSxjQUFJaUosVUFBSjs7QUFFQSxlQUFLLElBQUlDLFVBQVUsR0FBRyxDQUF0QixFQUF5QkEsVUFBVSxHQUFHakssVUFBdEMsRUFBa0RpSyxVQUFVLEVBQTVELEVBQWdFO0FBQzVERCxZQUFBQSxVQUFVLEdBQUcsTUFBTSxLQUFLRSxRQUFMLENBQWNySixLQUFkLEVBQXFCRSxJQUFyQixFQUEyQnFJLGNBQTNCLEVBQTJDUSxhQUEzQyxFQUEwREssVUFBMUQsQ0FBbkI7O0FBQ0EsZ0JBQUksQ0FBQyxDQUFDRCxVQUFELElBQWVBLFVBQVUsQ0FBQ3JGLE1BQVgsS0FBc0JtRCxnQkFBT1csTUFBN0MsS0FBd0QsQ0FBQ1MsY0FBN0QsRUFBNkU7QUFDekU7QUFDSCxhQUZELE1BR0ssSUFBSWMsVUFBVSxJQUFJQSxVQUFVLENBQUNyRixNQUFYLEtBQXNCbUQsZ0JBQU9XLE1BQS9DLEVBQXVEO0FBQ3hEO0FBQ0g7QUFDSjs7QUFFRCxlQUFLaEYsU0FBTCxDQUFlMEcsU0FBZixDQUF5QixLQUFLdEksR0FBOUIsRUFBbUNoQixLQUFLLENBQUM4SSxHQUFOLElBQWE5SSxLQUFLLENBQUNrSixFQUF0RCxFQUEwRGhKLElBQUksQ0FBQzRJLEdBQUwsSUFBWTVJLElBQUksQ0FBQ2dKLEVBQTNFLEVBQStFQyxVQUEvRTs7QUFDQSxjQUFJSCwwQkFBSixFQUFnQztBQUM1QixpQkFBS3BHLFNBQUwsQ0FBZTJHLGNBQWYsQ0FBOEIsS0FBS3ZJLEdBQW5DLEVBQXdDbUksVUFBeEMsRUFBb0QsTUFBcEQ7QUFDSDs7QUFFRC9CLFVBQUFBLFdBQVcsQ0FBQ25ILEtBQVosQ0FBa0JJLElBQWxCLENBQXVCOEksVUFBdkI7O0FBR0EsY0FBSUEsVUFBVSxDQUFDckYsTUFBWCxLQUFzQm1ELGdCQUFPVyxNQUFqQyxFQUF5QztBQUNyQ1IsWUFBQUEsV0FBVyxDQUFDdEQsTUFBWixHQUFxQm1ELGdCQUFPVyxNQUE1QjtBQUNIO0FBQ0o7QUFDSjs7QUFDRFIsTUFBQUEsV0FBVyxDQUFDRSxPQUFaLEdBQXNCckcsY0FBTytGLFlBQVAsRUFBdEI7QUFDQUksTUFBQUEsV0FBVyxDQUFDRyxRQUFaLEdBQXVCSCxXQUFXLENBQUNFLE9BQVosR0FBc0JGLFdBQVcsQ0FBQ0wsU0FBekQ7O0FBRUEsVUFBSXFCLDJCQUFKLEVBQWlDO0FBQzdCLGFBQUt4RixTQUFMLENBQWUyRyxjQUFmLENBQThCLEtBQUt2SSxHQUFuQyxFQUF3Q29HLFdBQXhDLEVBQXFELE9BQXJEO0FBQ0g7O0FBRUQsWUFBTSxLQUFLb0MsMEJBQUwsQ0FBZ0N4SixLQUFoQyxFQUF1Q29ILFdBQXZDLENBQU47O0FBQ0EsV0FBS3hFLFNBQUwsQ0FBZTZHLFVBQWYsQ0FBMEIsS0FBS3pJLEdBQS9CLEVBQW9DaEIsS0FBSyxDQUFDOEksR0FBMUMsRUFBK0MxQixXQUEvQztBQUNIOztBQUNELFdBQU9NLGVBQVA7QUFDSDs7QUFFYSxRQUFSMkIsUUFBUSxDQUFDckosS0FBRCxFQUFRRSxJQUFSLEVBQWNxSSxjQUFkLEVBQThCUSxhQUE5QixFQUE2Q0ssVUFBVSxHQUFHLENBQTFELEVBQTZEO0FBQ3ZFLFVBQU1NLE1BQU0sR0FBRyxFQUFmO0FBQ0EsVUFBTUMsS0FBSyxHQUFHUCxVQUFVLEdBQUcsQ0FBM0I7O0FBR0EsUUFBSXBKLEtBQUssQ0FBQzRKLFlBQVYsRUFBd0I7QUFJcEJDLHNCQUFFQyxNQUFGLENBQVNKLE1BQVQsRUFBaUIxSixLQUFLLENBQUM0SixZQUFOLENBQW1CRyxTQUFuQixFQUFqQjs7QUFDQSxVQUFJLENBQUNKLEtBQUwsRUFBWTtBQUNSM0osUUFBQUEsS0FBSyxDQUFDNEosWUFBTixDQUFtQkksUUFBbkI7QUFDSDtBQUNKOztBQUVELFFBQUk5SixJQUFJLENBQUMwSixZQUFULEVBQXVCO0FBSW5CQyxzQkFBRUMsTUFBRixDQUFTSixNQUFULEVBQWlCeEosSUFBSSxDQUFDMEosWUFBTCxDQUFrQkcsU0FBbEIsRUFBakI7O0FBQ0EsVUFBSSxDQUFDSixLQUFMLEVBQVk7QUFDUnpKLFFBQUFBLElBQUksQ0FBQzBKLFlBQUwsQ0FBa0JJLFFBQWxCO0FBQ0g7QUFDSjs7QUFHRCxRQUFJLEtBQUt6SSxVQUFMLElBQW1CLEtBQUtELE9BQXhCLElBQW1DLEtBQUtBLE9BQUwsQ0FBYXlELFFBQWhELElBQTREN0UsSUFBSSxDQUFDQyxXQUFyRSxFQUFrRjtBQUM5RSxXQUFLLElBQUk4SixDQUFDLEdBQUMsQ0FBWCxFQUFjQSxDQUFDLEdBQUUvSixJQUFJLENBQUNDLFdBQUwsQ0FBaUJMLE1BQWxDLEVBQTBDbUssQ0FBQyxFQUEzQyxFQUErQztBQUUzQyxZQUFJdkosSUFBSSxHQUFHUixJQUFJLENBQUNDLFdBQUwsQ0FBaUI4SixDQUFqQixFQUFvQnZKLElBQS9CO0FBQ0EsWUFBSUQsSUFBSSxHQUFHUCxJQUFJLENBQUNDLFdBQUwsQ0FBaUI4SixDQUFqQixFQUFvQnhKLElBQS9CO0FBRUEsY0FBTSxLQUFLYSxPQUFMLENBQWF5RCxRQUFiLENBQXNCYyxhQUF0QixDQUFvQ3BGLElBQXBDLEVBQTBDQyxJQUExQyxDQUFOO0FBQ0g7QUFDSjs7QUFDRCxVQUFNLEtBQUt3SiwwQkFBTCxDQUFnQ2hLLElBQWhDLENBQU47QUFDQSxVQUFNaUosVUFBVSxHQUFHLElBQUlnQixtQkFBSixFQUFuQjtBQUNBaEIsSUFBQUEsVUFBVSxDQUFDNUMsSUFBWCxHQUFrQnJHLElBQUksQ0FBQ3FHLElBQXZCO0FBQ0E0QyxJQUFBQSxVQUFVLENBQUNpQixRQUFYLEdBQXNCbEssSUFBSSxDQUFDZ0ksSUFBM0I7QUFDQWlCLElBQUFBLFVBQVUsQ0FBQ1IsWUFBWCxHQUEwQkksYUFBMUI7QUFDQUksSUFBQUEsVUFBVSxDQUFDQyxVQUFYLEdBQXdCQSxVQUF4Qjs7QUFHQSxRQUFJO0FBQ0EsYUFBTyxDQUFFLEtBQUs5SCxPQUFQLElBQW1CLEtBQUtzQyxrQkFBTCxFQUExQjs7QUFDQSxVQUFJLENBQUMsS0FBS3RDLE9BQVYsRUFBbUI7QUFDZjtBQUNIO0FBQ0osS0FMRCxDQU1BLE9BQU80QyxDQUFQLEVBQVU7QUFDTmpGLE1BQUFBLEdBQUcsQ0FBQ3VGLEtBQUosQ0FBVSx1Q0FBVixFQUFtRE4sQ0FBbkQ7QUFDQWlGLE1BQUFBLFVBQVUsQ0FBQ3BDLFNBQVgsR0FBdUJvQyxVQUFVLENBQUM3QixPQUFYLEdBQXFCckcsY0FBTytGLFlBQVAsRUFBNUM7QUFDQW1DLE1BQUFBLFVBQVUsQ0FBQzVCLFFBQVgsR0FBc0IsQ0FBdEI7QUFDQTRCLE1BQUFBLFVBQVUsQ0FBQ3hFLE9BQVgsR0FBcUJvRCxnQkFBWUMsbUJBQVosQ0FBZ0M5RCxDQUFoQyxDQUFyQjtBQUNBaUYsTUFBQUEsVUFBVSxDQUFDckYsTUFBWCxHQUFvQm1ELGdCQUFPVyxNQUEzQjtBQUNBLGFBQU91QixVQUFQO0FBQ0g7O0FBRUQsVUFBTSxLQUFLa0Isb0JBQUwsRUFBTjs7QUFFQSxRQUFJO0FBQ0FsQixNQUFBQSxVQUFVLENBQUNwQyxTQUFYLEdBQXVCOUYsY0FBTytGLFlBQVAsRUFBdkI7QUFDQSxZQUFNO0FBQUVzRCxRQUFBQSxXQUFGO0FBQWVDLFFBQUFBLE9BQWY7QUFBd0JDLFFBQUFBLFVBQXhCO0FBQW9DaEcsUUFBQUE7QUFBcEMsVUFBOEMsTUFBTSxLQUFLaUcsV0FBTCxDQUFpQnpLLEtBQWpCLEVBQXdCRSxJQUF4QixFQUE4QnFJLGNBQTlCLEVBQThDUSxhQUE5QyxFQUE2RFcsTUFBN0QsQ0FBMUQ7O0FBQ0EsV0FBS2dCLG1CQUFMLENBQXlCO0FBQUVKLFFBQUFBLFdBQUY7QUFBZUMsUUFBQUEsT0FBZjtBQUF3Qi9GLFFBQUFBLEtBQXhCO0FBQStCZ0csUUFBQUE7QUFBL0IsT0FBekI7O0FBQ0FyQixNQUFBQSxVQUFVLENBQUM3QixPQUFYLEdBQXFCckcsY0FBTytGLFlBQVAsRUFBckI7QUFDQW1DLE1BQUFBLFVBQVUsQ0FBQzVCLFFBQVgsR0FBc0I0QixVQUFVLENBQUM3QixPQUFYLEdBQXFCNkIsVUFBVSxDQUFDcEMsU0FBdEQ7QUFDQW9DLE1BQUFBLFVBQVUsQ0FBQ29CLE9BQVgsR0FBcUJBLE9BQXJCO0FBQ0FwQixNQUFBQSxVQUFVLENBQUN3QixLQUFYLEdBQW1CTCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0ssS0FBM0IsR0FBbUNMLFdBQVcsQ0FBQ0ssS0FBL0MsR0FBdUQsRUFBMUU7QUFDQXhCLE1BQUFBLFVBQVUsQ0FBQ3lCLElBQVgsR0FBa0JOLFdBQVcsSUFBSUEsV0FBVyxDQUFDTSxJQUEzQixHQUFrQ04sV0FBVyxDQUFDTSxJQUE5QyxHQUFxRCxFQUF2RTtBQUNBekIsTUFBQUEsVUFBVSxDQUFDMEIsR0FBWCxHQUFpQlAsV0FBVyxJQUFJQSxXQUFXLENBQUNPLEdBQTNCLEdBQWlDUCxXQUFXLENBQUNPLEdBQTdDLEdBQW1ELElBQXBFO0FBQ0ExQixNQUFBQSxVQUFVLENBQUMyQixjQUFYLEdBQTRCUixXQUFXLElBQUlBLFdBQVcsQ0FBQ1MsVUFBM0IsR0FBd0NULFdBQVcsQ0FBQ1MsVUFBcEQsR0FBaUUsSUFBN0Y7O0FBR0EsVUFBSUMsV0FBVyxHQUFHbkIsZ0JBQUVvQixJQUFGLENBQU85QixVQUFVLENBQUN3QixLQUFsQixFQUF5QjtBQUFDN0csUUFBQUEsTUFBTSxFQUFFbUQsZ0JBQU9XO0FBQWhCLE9BQXpCLENBQWxCOztBQUNBdUIsTUFBQUEsVUFBVSxDQUFDckYsTUFBWCxHQUFvQitGLGdCQUFFcUIsT0FBRixDQUFVRixXQUFWLEtBQTBCLENBQUN4RyxLQUEzQixHQUFtQ3lDLGdCQUFPQyxNQUExQyxHQUFtREQsZ0JBQU9XLE1BQTlFOztBQUNBLFVBQUlwRCxLQUFKLEVBQVc7QUFDUDJFLFFBQUFBLFVBQVUsQ0FBQ3hFLE9BQVgsR0FBcUJILEtBQXJCO0FBQ0EyRSxRQUFBQSxVQUFVLENBQUNyRixNQUFYLEdBQW9CbUQsZ0JBQU9XLE1BQTNCO0FBQ0F1QixRQUFBQSxVQUFVLENBQUN3QixLQUFYLEdBQW1CMUosY0FBT2tLLGlDQUFQLENBQXlDaEMsVUFBVSxDQUFDd0IsS0FBcEQsQ0FBbkI7QUFDSDs7QUFDRCxZQUFNLEtBQUtTLHlCQUFMLENBQStCbEwsSUFBL0IsRUFBcUNpSixVQUFyQyxDQUFOO0FBQ0gsS0FyQkQsQ0FxQkUsT0FBT2pGLENBQVAsRUFBVTtBQUNSakYsTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLGdDQUFWLEVBQTRDTixDQUE1QztBQUNBaUYsTUFBQUEsVUFBVSxDQUFDeEUsT0FBWCxHQUFxQm9ELGdCQUFZQyxtQkFBWixDQUFnQzlELENBQWhDLENBQXJCO0FBQ0FpRixNQUFBQSxVQUFVLENBQUNyRixNQUFYLEdBQW9CbUQsZ0JBQU9XLE1BQTNCO0FBRUg7O0FBQ0QsVUFBTXlELG9CQUFvQixHQUFHLE9BQU8sS0FBS3JKLFFBQUwsQ0FBY3NKLFdBQXJCLEtBQXFDLFNBQXJDLElBQWtELEtBQUt0SixRQUFMLENBQWNzSixXQUFkLEtBQThCLElBQTdHO0FBRUEsVUFBTSxLQUFLQyxrQkFBTCxDQUF3QnBDLFVBQVUsQ0FBQ3JGLE1BQW5DLEVBQTJDdUgsb0JBQTNDLENBQU47QUFFQSxXQUFPbEMsVUFBUDtBQUNIOztBQUVnQixRQUFYc0IsV0FBVyxDQUFDekssS0FBRCxFQUFRRSxJQUFSLEVBQWNxSSxjQUFkLEVBQThCUSxhQUE5QixFQUE2Q1csTUFBN0MsRUFBcUQ7QUFDbEUsUUFBSSxDQUFDLEtBQUtwSSxPQUFWLEVBQW1CO0FBQ2ZyQyxNQUFBQSxHQUFHLENBQUN1RixLQUFKLENBQVUscUNBQVY7O0FBRUEsVUFBSSxLQUFLZ0gscUJBQVQsRUFBZ0M7QUFDNUIsYUFBS0EscUJBQUwsQ0FBMkJDLE1BQTNCLENBQWtDLElBQUlqSixLQUFKLENBQVUsaUJBQVYsQ0FBbEM7QUFDSDs7QUFDRDtBQUNIOztBQUVELFdBQU8sTUFBTSxLQUFLbEIsT0FBTCxDQUFhZ0QsR0FBYixDQUFpQjtBQUMxQm9ILE1BQUFBLFVBQVUsRUFBRXhMLElBQUksQ0FBQ3FHLElBRFM7QUFFMUJvRixNQUFBQSxVQUFVLEVBQUV6TCxJQUFJLENBQUNnSSxJQUZTO0FBRzFCcUMsTUFBQUEsT0FBTyxFQUFFO0FBQ0xiLFFBQUFBLE1BQU0sRUFBRUEsTUFESDtBQUVMM0csUUFBQUEsR0FBRyxFQUFFLEtBQUtLLElBRkw7QUFHTGQsUUFBQUEsSUFBSSxFQUFFLEtBQUtSLEtBSE47QUFJTDhKLFFBQUFBLElBQUksRUFBRSxLQUFLL0osS0FKTjtBQUtMZ0ssUUFBQUEsSUFBSSxFQUFFO0FBQ0ZDLFVBQUFBLElBQUksRUFBRTtBQUNGdkYsWUFBQUEsSUFBSSxFQUFFckcsSUFBSSxDQUFDcUcsSUFEVDtBQUVGd0YsWUFBQUEsU0FBUyxFQUFFaEQ7QUFGVCxXQURKO0FBS0YvSSxVQUFBQSxLQUFLLEVBQUU7QUFDSHVHLFlBQUFBLElBQUksRUFBRXZHLEtBQUssQ0FBQ3VHLElBRFQ7QUFFSHdGLFlBQUFBLFNBQVMsRUFBRXhEO0FBRlI7QUFMTDtBQUxELE9BSGlCO0FBbUIxQnlELE1BQUFBLE1BQU0sRUFBRSxLQUFLaEssUUFBTCxDQUFjaUssRUFBZCxJQUFvQjtBQW5CRixLQUFqQixDQUFiO0FBcUJIOztBQUV1QixRQUFsQnJJLGtCQUFrQixHQUFHO0FBQ3ZCLFdBQU8sS0FBS3RDLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhNEssVUFBYixDQUF3QixLQUFLbEwsR0FBN0IsRUFBa0MsS0FBS2dCLFFBQXZDLEVBQWlELEtBQUtGLEtBQXRELENBQXZCO0FBQ0g7O0FBRXlCLFFBQXBCdUksb0JBQW9CLEdBQUc7QUFDekIsUUFBSSxLQUFLL0ksT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWE2SyxZQUFqQyxFQUErQztBQUMzQyxZQUFNLEtBQUs3SyxPQUFMLENBQWE2SyxZQUFiLEVBQU47QUFDSDtBQUNKOztBQUV1QixRQUFsQlosa0JBQWtCLENBQUN6SCxNQUFNLEdBQUcsSUFBVixFQUFnQnNJLGNBQWMsR0FBRyxJQUFqQyxFQUF1QztBQUMzRCxRQUFJLEtBQUs5SyxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYStLLFVBQWpDLEVBQTZDO0FBQ3pDLFlBQU0sS0FBSy9LLE9BQUwsQ0FBYStLLFVBQWIsQ0FBd0J2SSxNQUF4QixFQUFnQ3NJLGNBQWhDLENBQU47QUFDSDtBQUNKOztBQUUrQixRQUExQmpGLDBCQUEwQixHQUFHO0FBQy9CLFFBQUk7QUFDQSxVQUFJLFFBQVEsS0FBSzdGLE9BQWIsSUFBd0IsS0FBS0EsT0FBTCxDQUFhZ0wsY0FBekMsRUFBeUQ7QUFDckQsY0FBTSxLQUFLaEwsT0FBTCxDQUFhZ0wsY0FBYixDQUE0QixZQUE1QixFQUEwQyxDQUFDLEtBQUt0TCxHQUFOLEVBQVcsS0FBS2dCLFFBQWhCLEVBQTBCLEtBQUtGLEtBQS9CLENBQTFDLENBQU47QUFDSDtBQUNKLEtBSkQsQ0FLQSxPQUFPb0MsQ0FBUCxFQUFVO0FBQ05qRixNQUFBQSxHQUFHLENBQUN1RixLQUFKLENBQVUsMkJBQVYsRUFBdUNOLENBQXZDO0FBQ0EsV0FBS3RCLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlMkosVUFBZixDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3Qyw4QkFBNEJySSxDQUFwRSxFQUF1RWhGLGNBQXZFLENBQWxCO0FBQ0g7QUFDSjs7QUFFZ0MsUUFBM0IwSiwyQkFBMkIsQ0FBQzVJLEtBQUQsRUFBUTtBQUNyQyxRQUFJO0FBQ0EsVUFBSSxRQUFRLEtBQUtzQixPQUFiLElBQXdCLEtBQUtBLE9BQUwsQ0FBYWdMLGNBQXpDLEVBQXlEO0FBQ3JELGNBQU0sS0FBS2hMLE9BQUwsQ0FBYWdMLGNBQWIsQ0FBNEIsYUFBNUIsRUFBMkMsQ0FBQ3RNLEtBQUQsQ0FBM0MsQ0FBTjtBQUNIO0FBQ0osS0FKRCxDQUtBLE9BQU9rRSxDQUFQLEVBQVU7QUFDTmpGLE1BQUFBLEdBQUcsQ0FBQ3VGLEtBQUosQ0FBVSw0QkFBVixFQUF3Q04sQ0FBeEM7QUFDQSxXQUFLdEIsU0FBTCxJQUFrQixLQUFLQSxTQUFMLENBQWUySixVQUFmLENBQTBCLElBQTFCLEVBQWdDLE1BQWhDLEVBQXdDLCtCQUE2QnJJLENBQXJFLEVBQXdFaEYsY0FBeEUsQ0FBbEI7QUFDSDtBQUNKOztBQUUrQixRQUExQmdMLDBCQUEwQixDQUFDaEssSUFBRCxFQUFPO0FBQ25DLFFBQUk7QUFDQSxhQUFPLEtBQUtvQixPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYWdMLGNBQWIsQ0FBNEIsWUFBNUIsRUFBMEMsQ0FBQ3BNLElBQUQsQ0FBMUMsQ0FBdkI7QUFDSCxLQUZELENBR0EsT0FBT2dFLENBQVAsRUFBVTtBQUNOakYsTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLDJCQUFWLEVBQXVDTixDQUF2QztBQUNBLFdBQUt0QixTQUFMLElBQWtCLEtBQUtBLFNBQUwsQ0FBZTJKLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsOEJBQTRCckksQ0FBcEUsRUFBdUVoRixjQUF2RSxDQUFsQjtBQUNIO0FBQ0o7O0FBRThCLFFBQXpCK0kseUJBQXlCLENBQUN4RCxNQUFELEVBQVM7QUFDcEMsUUFBSTtBQUNBLGFBQU8sS0FBS25ELE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhZ0wsY0FBYixDQUE0QixXQUE1QixFQUF5QyxDQUFDLEtBQUt0TCxHQUFOLEVBQVd5RCxNQUFYLENBQXpDLENBQXZCO0FBQ0gsS0FGRCxDQUdBLE9BQU9QLENBQVAsRUFBVTtBQUNOakYsTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLDBCQUFWLEVBQXNDTixDQUF0QztBQUNBLFdBQUt0QixTQUFMLElBQWtCLEtBQUtBLFNBQUwsQ0FBZTJKLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsNkJBQTJCckksQ0FBbkUsRUFBc0VoRixjQUF0RSxDQUFsQjtBQUNIO0FBQ0o7O0FBRStCLFFBQTFCc0ssMEJBQTBCLENBQUN4SixLQUFELEVBQVF5RSxNQUFSLEVBQWdCO0FBQzVDLFFBQUk7QUFDQSxhQUFPLEtBQUtuRCxPQUFMLElBQWdCLEtBQUtBLE9BQUwsQ0FBYWdMLGNBQWIsQ0FBNEIsWUFBNUIsRUFBMEMsQ0FBQ3RNLEtBQUQsRUFBUXlFLE1BQVIsQ0FBMUMsQ0FBdkI7QUFDSCxLQUZELENBR0EsT0FBT1AsQ0FBUCxFQUFVO0FBQ05qRixNQUFBQSxHQUFHLENBQUN1RixLQUFKLENBQVUsMkJBQVYsRUFBdUNOLENBQXZDO0FBQ0EsV0FBS3RCLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlMkosVUFBZixDQUEwQixJQUExQixFQUFnQyxNQUFoQyxFQUF3Qyw4QkFBNEJySSxDQUFwRSxFQUF1RWhGLGNBQXZFLENBQWxCO0FBQ0g7QUFDSjs7QUFFOEIsUUFBekJrTSx5QkFBeUIsQ0FBQ2xMLElBQUQsRUFBT3VFLE1BQVAsRUFBZTtBQUMxQyxRQUFJO0FBQ0EsYUFBTyxLQUFLbkQsT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWFnTCxjQUFiLENBQTRCLFdBQTVCLEVBQXlDLENBQUNwTSxJQUFELEVBQU91RSxNQUFQLENBQXpDLENBQXZCO0FBQ0gsS0FGRCxDQUdBLE9BQU9QLENBQVAsRUFBVTtBQUNOakYsTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLDBCQUFWLEVBQXNDTixDQUF0QztBQUNBLFdBQUt0QixTQUFMLElBQWtCLEtBQUtBLFNBQUwsQ0FBZTJKLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsNkJBQTJCckksQ0FBbkUsRUFBc0VoRixjQUF0RSxDQUFsQjtBQUNIO0FBQ0o7O0FBRXdCLFFBQW5CeUUsbUJBQW1CLEdBQUc7QUFDeEIsVUFBTTZJLFVBQVUsR0FBR3RFLGNBQUt1RSxJQUFMLENBQVVDLFNBQVYsRUFBcUIsV0FBckIsQ0FBbkI7O0FBQ0EsU0FBS3BMLE9BQUwsR0FBZSxJQUFJcUwsc0JBQUosQ0FBa0IsS0FBSzNMLEdBQXZCLEVBQTRCd0wsVUFBNUIsRUFBd0MsS0FBS2pMLFVBQTdDLEVBQXlELEtBQUtpQyxVQUE5RCxFQUEwRSxRQUExRSxFQUFvRixLQUFLL0Isa0JBQXpGLENBQWY7QUFDQSxVQUFNLEtBQUtILE9BQUwsQ0FBYXNMLEtBQWIsRUFBTjs7QUFDQSxTQUFLQyxpQkFBTDs7QUFDQSxVQUFNLEtBQUt2TCxPQUFMLENBQWF3TCxhQUFiLEVBQU47O0FBQ0EsU0FBS0MseUJBQUw7QUFDSDs7QUFFREYsRUFBQUEsaUJBQWlCLEdBQUc7QUFFaEIsVUFBTUcsS0FBSyxHQUFHLElBQWQ7O0FBQ0EsU0FBSzFMLE9BQUwsQ0FBYTJMLFNBQWIsQ0FBdUIsZ0JBQXZCLEVBQXlDLEtBQUtDLG9CQUFMLENBQTBCQyxJQUExQixDQUErQixJQUEvQixDQUF6Qzs7QUFDQSxTQUFLN0wsT0FBTCxDQUFhMkwsU0FBYixDQUF1QixlQUF2QixFQUF3QyxLQUFLRyxtQkFBTCxDQUF5QkQsSUFBekIsQ0FBOEIsSUFBOUIsQ0FBeEM7O0FBQ0EsU0FBSzdMLE9BQUwsQ0FBYStMLEVBQWIsQ0FBZ0IsT0FBaEIsRUFBMEJDLE9BQUQsSUFBYTtBQUNsQyxZQUFNO0FBQUU5SSxRQUFBQTtBQUFGLFVBQVk4SSxPQUFsQjtBQUNBck8sTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLHdCQUFWLEVBQW9DQSxLQUFwQzs7QUFFQSxVQUFJLEtBQUsrSSxRQUFULEVBQW1CO0FBQ2YsYUFBS0MsSUFBTCxDQUFVLFlBQVYsRUFBd0JoSixLQUF4QjtBQUNILE9BRkQsTUFFTztBQUNId0ksUUFBQUEsS0FBSyxDQUFDeEwsb0JBQU4sR0FBNkJnRCxLQUE3QjtBQUNIO0FBQ0osS0FURDs7QUFVQSxTQUFLbEQsT0FBTCxDQUFhK0wsRUFBYixDQUFnQixNQUFoQixFQUF5QkMsT0FBRCxJQUFhO0FBQ2pDLFdBQUtDLFFBQUwsR0FBZ0IsSUFBaEI7QUFDQSxZQUFNO0FBQUVFLFFBQUFBO0FBQUYsVUFBZUgsT0FBckI7O0FBRUEsVUFBSUcsUUFBUSxJQUFJQSxRQUFRLEtBQUssQ0FBN0IsRUFBZ0M7QUFJNUIsWUFBSUMsT0FBTyxHQUFHLElBQWQ7O0FBQ0EsWUFBSVYsS0FBSyxDQUFDM0wsWUFBVixFQUF3QjtBQUNwQnFNLFVBQUFBLE9BQU8sR0FBR1YsS0FBSyxDQUFDNUssYUFBaEI7QUFDSCxTQUZELE1BR0ssSUFBSTRLLEtBQUssQ0FBQzdMLFVBQVYsRUFBc0I7QUFDdkJ1TSxVQUFBQSxPQUFPLEdBQUdWLEtBQUssQ0FBQ3hCLHFCQUFoQjtBQUNIOztBQUNELFlBQUloSCxLQUFLLEdBQUd3SSxLQUFLLENBQUN4TCxvQkFBTixJQUE4QixJQUExQzs7QUFDQSxZQUFJaU0sUUFBUSxJQUFJLEdBQWhCLEVBQXFCO0FBQ2pCakosVUFBQUEsS0FBSyxHQUFHLElBQUltSixvQkFBSixDQUFnQjVGLGdCQUFZNkYsU0FBWixDQUFzQkMsWUFBdEMsRUFBb0QsMEZBQXBELENBQVI7QUFDSCxTQUZELE1BR0ssSUFBSSxDQUFDckosS0FBTCxFQUFZO0FBQ2JBLFVBQUFBLEtBQUssR0FBRyxJQUFJbUosb0JBQUosQ0FBaUIsb0NBQW1DRixRQUFTLEdBQTdELENBQVI7QUFDSDs7QUFFREMsUUFBQUEsT0FBTyxJQUFJQSxPQUFPLENBQUNqQyxNQUFSLENBQWVqSCxLQUFmLENBQVg7O0FBQ0F3SSxRQUFBQSxLQUFLLENBQUMzSSxxQkFBTjtBQUNIO0FBQ0osS0ExQkQ7O0FBMkJBLFNBQUsvQyxPQUFMLENBQWErTCxFQUFiLENBQWdCLFNBQWhCLEVBQTJCLE1BQU9TLEdBQVAsSUFBZTtBQUN0QyxVQUFJQSxHQUFHLENBQUN4SCxLQUFKLElBQWF3SCxHQUFHLENBQUN4SCxLQUFKLEtBQWMsS0FBL0IsRUFBc0M7QUFDbEMsWUFBSXdILEdBQUcsQ0FBQ0MsS0FBSixLQUFjLE9BQWxCLEVBQTJCO0FBQ3ZCOU8sVUFBQUEsR0FBRyxDQUFDaUgsS0FBSixDQUFVNEgsR0FBRyxDQUFDQSxHQUFkO0FBQ0gsU0FGRCxNQUVPLElBQUlBLEdBQUcsQ0FBQ0MsS0FBSixLQUFjLE1BQWxCLEVBQTBCO0FBQzdCOU8sVUFBQUEsR0FBRyxDQUFDK08sSUFBSixDQUFTRixHQUFHLENBQUNBLEdBQWI7QUFDSCxTQUZNLE1BRUEsSUFBSUEsR0FBRyxDQUFDQyxLQUFKLEtBQWMsT0FBbEIsRUFBMkI7QUFDOUI5TyxVQUFBQSxHQUFHLENBQUN1RixLQUFKLENBQVVzSixHQUFHLENBQUNBLEdBQWQsRUFBbUJBLEdBQUcsQ0FBQ0csR0FBdkI7QUFDSCxTQUZNLE1BRUEsSUFBSUgsR0FBRyxDQUFDQyxLQUFKLEtBQWMsTUFBbEIsRUFBMEI7QUFDN0I5TyxVQUFBQSxHQUFHLENBQUNtRixJQUFKLENBQVMwSixHQUFHLENBQUNBLEdBQWI7QUFDSDs7QUFFRGQsUUFBQUEsS0FBSyxDQUFDUSxJQUFOLENBQVcsS0FBWCxFQUFrQk0sR0FBRyxDQUFDSSxJQUF0QixFQUE0QkosR0FBRyxDQUFDQyxLQUFoQyxFQUF1Q0QsR0FBRyxDQUFDQSxHQUEzQyxFQUFnREEsR0FBRyxDQUFDSyxHQUFKLElBQVdqUCxjQUEzRDs7QUFDQThOLFFBQUFBLEtBQUssQ0FBQ3BLLFNBQU4sSUFBbUJvSyxLQUFLLENBQUNwSyxTQUFOLENBQWdCMkosVUFBaEIsQ0FBMkJ1QixHQUFHLENBQUNJLElBQS9CLEVBQXFDSixHQUFHLENBQUNDLEtBQXpDLEVBQWdERCxHQUFHLENBQUNBLEdBQXBELEVBQXlEQSxHQUFHLENBQUNLLEdBQUosSUFBV2pQLGNBQXBFLENBQW5CO0FBQ0gsT0FiRCxNQWNLLElBQUk0TyxHQUFHLENBQUN4SCxLQUFKLElBQWF3SCxHQUFHLENBQUN4SCxLQUFKLEtBQWMsYUFBL0IsRUFBOEM7QUFDL0MwRyxRQUFBQSxLQUFLLENBQUNRLElBQU4sQ0FBVyxhQUFYLEVBQTBCTSxHQUFHLENBQUNwTixJQUE5QixFQUFvQ29OLEdBQUcsQ0FBQ00sS0FBeEMsRUFBK0NOLEdBQUcsQ0FBQ0ksSUFBbkQ7QUFDSCxPQUZJLE1BR0EsSUFBSUosR0FBRyxDQUFDeEgsS0FBSixJQUFhd0gsR0FBRyxDQUFDeEgsS0FBSixLQUFjLGVBQS9CLEVBQWdEO0FBQ2pELFlBQUl3SCxHQUFHLENBQUNPLE1BQUosS0FBZSxNQUFuQixFQUEyQjtBQUN2QnJCLFVBQUFBLEtBQUssQ0FBQ1EsSUFBTixDQUFXLFdBQVgsRUFBd0JNLEdBQXhCO0FBQ0g7QUFDSixPQUpJLE1BS0EsSUFBSUEsR0FBRyxDQUFDeEgsS0FBSixJQUFhd0gsR0FBRyxDQUFDeEgsS0FBSixLQUFjLGFBQS9CLEVBQThDO0FBQy9DbkMsUUFBQUEsT0FBTyxDQUFDbEYsR0FBUixDQUFZLGNBQVosRUFBNEI2TyxHQUE1QjtBQUNBLGNBQU0sS0FBS2pLLE9BQUwsQ0FBYSxRQUFiLENBQU47QUFDQSxjQUFNLEtBQUtnQixJQUFMLENBQVUsUUFBVixDQUFOO0FBQ0gsT0FKSSxNQUtBLElBQUlpSixHQUFHLENBQUN4SCxLQUFKLElBQWF3SCxHQUFHLENBQUN4SCxLQUFKLEtBQWMsTUFBL0IsRUFBdUM7QUFDeEMwRyxRQUFBQSxLQUFLLENBQUNRLElBQU4sQ0FBVyxNQUFYLEVBQW1CTSxHQUFuQjtBQUNIO0FBQ0osS0EvQkQ7QUFnQ0g7O0FBRURmLEVBQUFBLHlCQUF5QixHQUFHO0FBQ3hCLFFBQUksQ0FBQyxLQUFLekwsT0FBVixFQUFtQjtBQUNmO0FBQ0g7O0FBQ0QsU0FBS0EsT0FBTCxDQUFheUQsUUFBYixJQUF5QixLQUFLekQsT0FBTCxDQUFheUQsUUFBYixDQUFzQnNJLEVBQXRCLENBQXlCLGdCQUF6QixFQUE0Q2lCLGNBQUQsSUFBb0I7QUFDcEYsV0FBS2QsSUFBTCxDQUFVLFlBQVYsRUFBd0JjLGNBQXhCO0FBQ0gsS0FGd0IsQ0FBekI7QUFJQSxTQUFLaE4sT0FBTCxDQUFheUQsUUFBYixJQUF5QixLQUFLekQsT0FBTCxDQUFheUQsUUFBYixDQUFzQnNJLEVBQXRCLENBQXlCLHFCQUF6QixFQUFpRGtCLFVBQUQsSUFBZ0I7QUFDckYsV0FBS2YsSUFBTCxDQUFVLGlCQUFWLEVBQTZCZSxVQUE3QjtBQUNILEtBRndCLENBQXpCO0FBR0g7O0FBRXlCLFFBQXBCckIsb0JBQW9CLENBQUNoSixDQUFELEVBQUk7QUFDMUIsU0FBS3RCLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlNEwsV0FBZixDQUEyQixLQUFLeE4sR0FBaEMsRUFBcUNrRCxDQUFyQyxDQUFsQjs7QUFFQSxRQUFJO0FBQ0EsVUFBSUEsQ0FBQyxJQUFJQSxDQUFDLENBQUN1SyxNQUFQLElBQWlCdkssQ0FBQyxDQUFDdUssTUFBRixLQUFhLEtBQWxDLEVBQXlDLENBRXhDLENBRkQsTUFFTztBQUNILGVBQU8sS0FBS25OLE9BQUwsSUFBZ0IsS0FBS0EsT0FBTCxDQUFhZ0wsY0FBYixDQUE0QixlQUE1QixFQUE2QyxDQUFDcEksQ0FBRCxDQUE3QyxDQUF2QjtBQUNIO0FBQ0osS0FORCxDQU9BLE9BQU9BLENBQVAsRUFBVTtBQUNOakYsTUFBQUEsR0FBRyxDQUFDdUYsS0FBSixDQUFVLDhCQUFWLEVBQTBDTixDQUExQztBQUNBLFdBQUt0QixTQUFMLElBQWtCLEtBQUtBLFNBQUwsQ0FBZTJKLFVBQWYsQ0FBMEIsSUFBMUIsRUFBZ0MsTUFBaEMsRUFBd0MsaUNBQStCckksQ0FBdkUsRUFBMEVoRixjQUExRSxDQUFsQjtBQUNIO0FBQ0o7O0FBRXdCLFFBQW5Ca08sbUJBQW1CLENBQUNsSixDQUFELEVBQUk7QUFDekIsU0FBS3RCLFNBQUwsSUFBa0IsS0FBS0EsU0FBTCxDQUFlOEwsU0FBZixDQUF5QixLQUFLMU4sR0FBOUIsRUFBbUNrRCxDQUFDLENBQUNPLE1BQXJDLENBQWxCOztBQUNBLFFBQUk7QUFDQSxVQUFJUCxDQUFDLElBQUlBLENBQUMsQ0FBQ3VLLE1BQVAsSUFBaUJ2SyxDQUFDLENBQUN1SyxNQUFGLEtBQWEsS0FBbEMsRUFBeUMsQ0FFeEMsQ0FGRCxNQUVPO0FBQ0gsZUFBTyxLQUFLbk4sT0FBTCxJQUFnQixLQUFLQSxPQUFMLENBQWFnTCxjQUFiLENBQTRCLGNBQTVCLEVBQTRDLENBQUNwSSxDQUFDLENBQUNPLE1BQUgsQ0FBNUMsQ0FBdkI7QUFDSDtBQUNKLEtBTkQsQ0FPQSxPQUFPUCxDQUFQLEVBQVU7QUFDTmpGLE1BQUFBLEdBQUcsQ0FBQ3VGLEtBQUosQ0FBVSw2QkFBVixFQUF5Q04sQ0FBekM7QUFDQSxXQUFLdEIsU0FBTCxJQUFrQixLQUFLQSxTQUFMLENBQWUySixVQUFmLENBQTBCLElBQTFCLEVBQWdDLE1BQWhDLEVBQXdDLGdDQUE4QnJJLENBQXRFLEVBQXlFaEYsY0FBekUsQ0FBbEI7QUFDSDtBQUNKOztBQUVEbUYsRUFBQUEscUJBQXFCLEdBQUc7QUFDcEIsU0FBS3RDLFFBQUwsR0FBZ0IsRUFBaEI7QUFDQSxTQUFLVCxPQUFMLEdBQWUsSUFBZjtBQUNBLFNBQUtILFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxTQUFLRSxZQUFMLEdBQW9CLEtBQXBCO0FBQ0EsU0FBS0QsZUFBTCxHQUF1QixLQUF2QjtBQUNBLFNBQUtjLFdBQUwsR0FBbUIsS0FBbkI7QUFDQSxTQUFLRSxhQUFMLEdBQXFCLGtCQUFyQjtBQUNIOztBQUVEc0ksRUFBQUEsbUJBQW1CLENBQUM7QUFBRUosSUFBQUEsV0FBRjtBQUFlRSxJQUFBQSxVQUFmO0FBQTJCRCxJQUFBQSxPQUFPLEdBQUcsRUFBckM7QUFBeUMvRixJQUFBQSxLQUFLLEdBQUc7QUFBakQsR0FBRCxFQUEwRDtBQUV6RSxRQUFJLEtBQUt0QyxXQUFULEVBQXNCO0FBQ2xCLGFBQU8sSUFBUDtBQUNIOztBQUNELFFBQUlzQyxLQUFKLEVBQVc7QUFDUCxXQUFLZ0osSUFBTCxDQUFVLFlBQVYsRUFBd0JoSixLQUF4QjtBQUNIOztBQUVELFNBQUszQyxLQUFMLEdBQWEwSSxPQUFPLENBQUNxQixJQUFSLElBQWdCLEtBQUsvSixLQUFsQztBQUVBLFNBQUtFLFFBQUwsR0FBZ0IsRUFBRSxHQUFHLEtBQUtBLFFBQVY7QUFBb0IsVUFBR3lJLFVBQVUsSUFBSSxFQUFqQjtBQUFwQixLQUFoQjtBQUdBLFFBQUlELE9BQU8sQ0FBQ2pJLElBQVosRUFDSSxPQUFPaUksT0FBTyxDQUFDakksSUFBZjtBQUVKLFFBQUlpSSxPQUFPLENBQUN4SCxHQUFaLEVBQ0ksT0FBT3dILE9BQU8sQ0FBQ3hILEdBQWY7QUFFSixRQUFJd0gsT0FBTyxDQUFDc0IsSUFBWixFQUNJLE9BQU90QixPQUFPLENBQUNzQixJQUFmO0FBQ1A7O0FBRUQ4QyxFQUFBQSxpQkFBaUIsQ0FBQ0MsRUFBRCxFQUFLQyxFQUFMLEVBQVNDLGlCQUFULEVBQTRCQyxnQkFBNUIsRUFBOENDLG1CQUE5QyxFQUFtRTtBQUNoRixTQUFLeEIsSUFBTCxDQUFVLGVBQVYsRUFBMkI7QUFDdkIxSixNQUFBQSxNQUFNLEVBQUVrTCxtQkFBbUIsQ0FBQ0MsT0FETDtBQUV2QnRLLE1BQUFBLE9BQU8sRUFBRXFLLG1CQUFtQixDQUFDckssT0FBcEIsSUFBK0IsSUFGakI7QUFHdkJtSCxNQUFBQSxJQUFJLEVBQUU7QUFDRjVDLFFBQUFBLEVBQUUsRUFBRTJGLEVBQUUsQ0FBQzNGLEVBQUgsSUFBUyxJQURYO0FBRUYzQyxRQUFBQSxJQUFJLEVBQUVzSSxFQUFFLENBQUN0SSxJQUZQO0FBR0Z3RixRQUFBQSxTQUFTLEVBQUVnRCxnQkFIVDtBQUlGNUcsUUFBQUEsY0FBYyxFQUFFMEcsRUFBRSxDQUFDMUc7QUFKakIsT0FIaUI7QUFTdkJuSSxNQUFBQSxLQUFLLEVBQUU7QUFDSGtKLFFBQUFBLEVBQUUsRUFBRTBGLEVBQUUsQ0FBQzFGLEVBQUgsSUFBUyxJQURWO0FBRUgzQyxRQUFBQSxJQUFJLEVBQUVxSSxFQUFFLENBQUNySSxJQUZOO0FBR0h3RixRQUFBQSxTQUFTLEVBQUUrQyxpQkFIUjtBQUlIM0csUUFBQUEsY0FBYyxFQUFFeUcsRUFBRSxDQUFDekc7QUFKaEI7QUFUZ0IsS0FBM0I7QUFnQkg7O0FBRUQrRyxFQUFBQSxZQUFZLENBQUN6SyxNQUFELEVBQVM7QUFDakIsU0FBSytJLElBQUwsQ0FBVSxVQUFWLEVBQXNCL0ksTUFBdEI7QUFDSDs7QUF0d0JrRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3IgKi9cclxuLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uLy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ094eWdlblJ1bm5lcicpO1xyXG5jb25zdCBERUZBVUxUX0lTU1VFUiA9ICd1c2VyJztcclxuY29uc3QgTUFYX1JFUlVOUyA9IDI7XHJcblxyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgXyAgZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcblxyXG5pbXBvcnQgVGVzdFN1aXRlUmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3N1aXRlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0Q2FzZVJlc3VsdCBmcm9tICcuLi8uLi9tb2RlbC9jYXNlLXJlc3VsdCc7XHJcbmltcG9ydCBUZXN0UmVzdWx0IGZyb20gJy4uLy4uL21vZGVsL3Rlc3QtcmVzdWx0JztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi8uLi9tb2RlbC9zdGF0dXMnO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uLy4uL2xpYi91dGlsJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uLy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3h5Z2VuRXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuaW1wb3J0IFBhcmFtZXRlck1hbmFnZXIgZnJvbSAnLi4vLi4vbGliL3BhcmFtLW1hbmFnZXIuanMnO1xyXG5pbXBvcnQgV29ya2VyUHJvY2VzcyBmcm9tICcuLi9Xb3JrZXJQcm9jZXNzJztcclxuXHJcbi8vIHNub296ZSBmdW5jdGlvbiAtIGFzeW5jIHdyYXBwZXIgYXJvdW5kIHNldFRpbWVvdXQgZnVuY3Rpb25cclxuY29uc3Qgc25vb3plID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG5jb25zdCBnZXRTdWl0ZXNCcmVha3BvaW50cyA9IChzdWl0ZXMpID0+IHtcclxuICAgIGNvbnN0IHJldHZhbCA9IFtdO1xyXG5cclxuICAgIGlmIChcclxuICAgICAgICBzdWl0ZXMgJiZcclxuICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlcykgJiZcclxuICAgICAgICBzdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgICAgc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgc3VpdGUgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzICYmXHJcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHN1aXRlLmNhc2VzKSAmJlxyXG4gICAgICAgICAgICAgICAgc3VpdGUuY2FzZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLm1hcCgoY2F6ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZSAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2F6ZS5icmVha3BvaW50cykgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubWFwKChicmVha3BvaW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwucHVzaChicmVha3BvaW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmV0dmFsO1xyXG59O1xyXG5cclxuY29uc3QgcmVtb3ZlQnJlYWtwb2ludEZyb21TdWl0ZXMgPSAoc3VpdGVzLCByZW1vdmVCcmVha3BvaW50KSA9PiB7XHJcbiAgICBpZiAoXHJcbiAgICAgICAgc3VpdGVzICYmXHJcbiAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZXMpICYmXHJcbiAgICAgICAgc3VpdGVzLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICAgIHN1aXRlcy5tYXAoKHN1aXRlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHN1aXRlICYmXHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShzdWl0ZS5jYXNlcykgJiZcclxuICAgICAgICAgICAgICAgIHN1aXRlLmNhc2VzLmxlbmd0aCA+IDBcclxuICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICBzdWl0ZS5jYXNlcy5tYXAoKGNhemUpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhemUuYnJlYWtwb2ludHMpICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhemUuYnJlYWtwb2ludHMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXplLmJyZWFrcG9pbnRzLm1hcCgoYnJlYWtwb2ludCwgaWR4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludC5maWxlID09PSByZW1vdmVCcmVha3BvaW50LmZpbGUgJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50LmxpbmUgPT09IHJlbW92ZUJyZWFrcG9pbnQubGluZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F6ZS5icmVha3BvaW50cy5zcGxpY2UoaWR4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE94eWdlblJ1bm5lciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyBjbGFzcyB2YXJpYWJsZXNcclxuICAgICAgICB0aGlzLl9pZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXppbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUHJvY0xhc3RFcnJvciA9IG51bGw7XHJcblxyXG4gICAgICAgIHRoaXMuX25wbUdSb290RXhlY3V0aW9uID0gdHJ1ZTtcclxuICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5ucG1HUm9vdEV4ZWN1dGlvbiAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBvcHRpb25zLm5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gZGVmaW5lIHZhcmlhYmxlcyB0byBpdGVyYXRlIHRocm91Z2ggdGVzdCBjYXNlcyBhbmQgdGVzdCBzdWl0ZSBpdGVyYXRpb25zXHJcbiAgICAgICAgdGhpcy5fc3VpdGU7XHJcbiAgICAgICAgdGhpcy5fZW52VmFycyA9IHt9OyAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGVzIHBhc3NlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0XHJcbiAgICAgICAgdGhpcy5fdmFycyA9IHt9OyAgICAgLy8gdXNlci1kZWZpbmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgc2NyaXB0c1xyXG4gICAgICAgIHRoaXMuX2NhcHMgPSB7fTsgLy8gZGVzaXJlZCBjYXBhYmlsaXRpZXMgdGhhdCBhcmUgcGFzc2VkIHRvIGVhY2ggbW9kdWxlXHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RLaWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IDM7XHJcbiAgICAgICAgLy8gcHJvbWlzZXNcclxuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xyXG4gICAgfVxyXG4gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxyXG4gICAgICogUHVibGljIG1ldGhvZHNcclxuICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXHJcbiAgICBhc3luYyBpbml0KG9wdGlvbnMsIGNhcHMgPSB7fSwgcmVwb3J0ZXIpIHtcclxuICAgICAgICAvLyBtYWtlIHN1cmUgYXQgbGVhc3Qgb25lIHRlc3Qgc3VpdGUgaXMgZGVmaW5lZFxyXG4gICAgICAgIGlmICghb3B0aW9ucy5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbml0aWFsaXphdGlvbiBmYWlsZWQgLSBubyB0ZXN0IHN1aXRlcyBhcmUgZGVmaW5lZC4gWW91IG11c3QgZGVmaW5lIFwic3VpdGVzXCIgcHJvcGVydHkgaW4gT3h5Z2VuIG9wdGlvbnMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9vcHRpb25zID0gb3B0aW9ucztcclxuICAgICAgICB0aGlzLl9jd2QgPSB0aGlzLl9vcHRpb25zLmN3ZCB8fCBwcm9jZXNzLmN3ZCgpO1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyID0gcmVwb3J0ZXI7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChvcHRpb25zKSB7XHJcbiAgICAgICAgICAgIC8vIG1lcmdlIGN1cnJlbnQgYW5kIHRlc3QgY29uZmlndXJhdGlvbiBiYXNlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgbGV0IG9wdEVudiA9IHt9O1xyXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5lbnYpIHtcclxuICAgICAgICAgICAgICAgIC8vICdlbnYnIG9wdGlvbiBtaWdodCBiZSBkZWZpbmVkIGVpdGhlciBhcyBhIG5hbWUgb2YgdGhlIGVudmlyb25tZW50IG9yIGFzIGFuIG9iamVjdCB0aGF0IGxpc3RzIGFsbCBlbnZpcm9ubWVudCB2YXJpYWJsZXNcclxuICAgICAgICAgICAgICAgIC8vIGlmICdlbnYnIGlzIGEgc3RyaW5nLCB0aGVuIHJlc29sdmUgdGhlIGFjdHVhbCB2YXJpYWJsZXMgZnJvbSAnZW52cycgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMuZW52ID09PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3B0aW9ucy5lbnZzID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLmVudnNbb3B0aW9ucy5lbnZdKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnZzW29wdGlvbnMuZW52XTtcclxuXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAvLyBpZiAnZW52JyBpcyBhbiBvYmplY3QsIHVzZSB0aGUgdmFyaWFibGVzIGRlZmluZWQgaW4gaXRcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLmVudiA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnYpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgb3B0RW52ID0gb3B0aW9ucy5lbnY7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmVudlZhcnMgJiYgT2JqZWN0LmtleXMob3B0aW9ucy5lbnZWYXJzKSkge1xyXG4gICAgICAgICAgICAgICAgb3B0RW52ID0geyAuLi5vcHRFbnYsIC4uLm9wdGlvbnMuZW52VmFycyB9O1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBhc3NpZ24gZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciBsYXRlciB1c2VcclxuICAgICAgICAgICAgdGhpcy5fZW52ID0ge1xyXG4gICAgICAgICAgICAgICAgLi4udGhpcy5fZW52LFxyXG4gICAgICAgICAgICAgICAgLi4ub3B0RW52XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9jYXBzID0geyAuLi5jYXBzIH07IC8vIGFzc2lnbiBjYXBzIGZvciBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl9zdWl0ZXMgPSBbIC4uLm9wdGlvbnMuc3VpdGVzIF07XHJcbiAgICAgICAgLy8gc2V0IHVwIGRlYnVnZ2luZyBvcHRpb25zXHJcbiAgICAgICAgLy8gVE9ETzogdGhpcyBuZWVkcyB0byBiZSByZWltcGxlbWVudGVkLiBFdmVyeXRoaW5nIHJlbGF0ZWQgdG8gZGVidWdnaW5nIChpbml0aWFsaXplRGVidWdnZXIpIHNob3VsZCBiZSByZW1vdmVkIGZyb20gT3h5Z2VuXHJcbiAgICAgICAgLy8gYW5kIGFkZGVkIHRvIElERSBpbnN0ZWFkLiBJLmUuIHRoZSBvbmx5IHRoaW5nIG94eWdlbiBzaG91bGQgZG8gaXMgdG8gbGF1bmNoIHRoZSBjaGlsZCBwcm9jZXNzIHdpdGggdGhlIGRlYnVnZ2luZyBzd2l0Y2guXHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gIG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG9wdGlvbnMuZGVidWdQb3J0ID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IG9wdGlvbnMuZGVidWdQb3J0IHx8IG9wdGlvbnMuZGVidWdQb3J0SWRlIHx8IG51bGw7XHJcbiAgICAgICAgb3B0aW9ucy5zY3JpcHRDb250ZW50TGluZU9mZnNldCA9IHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0O1xyXG4gICAgICAgIHRoaXMuX2xvY2FsVGltZSA9ICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMubG9jYWxUaW1lKSB8fCB0aGlzLl9sb2NhbFRpbWU7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc3RhcnRXb3JrZXJQcm9jZXNzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9pc0Rpc3Bvc2luZyA9IHRydWU7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyICYmIGF3YWl0IHRoaXMuX3dvcmtlci5zdG9wRGVidWdnZXIoKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RvcChzdGF0dXMpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRXJyb3Igd2hlbiBkaXNwb3NpbmcgUnVubmVyJywgZSk7XHJcbiAgICAgICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZHVyaW5nIHRoZSBkaXNwb3NlXHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdFcnJvciB3aGVuIGRpc3Bvc2luZyBSdW5uZXI6JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc3RhdHVzICE9PSAnQ0FOQ0VMRUQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jlc2V0R2xvYmFsVmFyaWFibGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bigpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXppbmcpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW5pdGlhbGl6YXRpb24gaGFzbid0IGJlZW4gY29tcGxldGVkIHlldCwgd2FpdCBmb3IgJ2luaXRpYWxpemVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2lzUnVubmluZykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJQcmV2aW91cyB0ZXN0IGlzIHN0aWxsIHJ1bm5pbmcsIHdhaXQgZm9yICd0ZXN0LWVuZGVkJyBldmVudFwiKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJTdGFydCh0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwcyk7XHJcblxyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuVGVzdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIWVycm9yICYmIHJlc3VsdCAmJiByZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IHJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25SdW5uZXJFbmQodGhpcy5faWQsIHJlc3VsdCwgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBraWxsKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICB0aGlzLl90ZXN0S2lsbGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaXNSdW5uaW5nKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5raWxsKHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlYnVnQ29udGludWUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCkge1xyXG4gICAgICAgIHRyeSB7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIuc2V0QnJlYWtwb2ludHNBY3RpdmUpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50c0FjdGl2ZShmYWxzZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBzbm9vemUoNTAwKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwZGF0ZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzLCBmaWxlUGF0aCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJvbWlzZXMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zdCB0c0JyZWFrcG9pbnRzID0gdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmdldEJyZWFrcG9pbnRzKGZpbGVQYXRoKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlc0JyZWFrcG9pbnRzID0gZ2V0U3VpdGVzQnJlYWtwb2ludHModGhpcy5fc3VpdGVzKTtcclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYnJlYWtwb2ludHMgZnJvbSBzdWl0ZXMvY2FzZXMgdHJlZVxyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgc3VpdGVCcCBvZiBzdWl0ZXNCcmVha3BvaW50cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghYnJlYWtwb2ludHMuaW5jbHVkZXMoc3VpdGVCcC5saW5lKSAmJiAgZmlsZVBhdGggPT09IHN1aXRlQnAuZmlsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVCcmVha3BvaW50RnJvbVN1aXRlcyh0aGlzLl9zdWl0ZXMsIHN1aXRlQnApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZGVsZXRlZCBicmVha3BvaW50c1xyXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgYWN0dWFsQ3VycmVudEJwIG9mIHRzQnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJyZWFrcG9pbnRzLmluY2x1ZGVzKGFjdHVhbEN1cnJlbnRCcCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl93b3JrZXIuZGVidWdnZXIucmVtb3ZlQnJlYWtwb2ludEJ5VmFsdWUoZmlsZVBhdGgsIGFjdHVhbEN1cnJlbnRCcCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGJyZWFrcG9pbnRzXHJcbiAgICAgICAgICAgICAgICBmb3IgKHZhciB1c2VyU2V0QnAgb2YgYnJlYWtwb2ludHMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRzQnJlYWtwb2ludHMuaW5jbHVkZXModXNlclNldEJwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX3dvcmtlci5kZWJ1Z2dlci5zZXRCcmVha3BvaW50KGZpbGVQYXRoLCB1c2VyU2V0QnApKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHByb21pc2VBbGxQcm9taXNlID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpLnRoZW4oKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnRzQWN0aXZlKHRydWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHNub296ZSg1MDApO1xyXG5cclxuICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygndXBkYXRlQnJlYWtwb2ludHMoKSBkb25lLicpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNvbnN0IGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgPSB0aGlzLl93b3JrZXIuZGVidWdnZXIuZ2V0QnJlYWtwb2ludHMoZmlsZVBhdGgpO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB7IHByb21pc2VBbGxQcm9taXNlIDogcHJvbWlzZUFsbFByb21pc2UsIGJyZWFrcG9pbnRzQWZlck1hbmlwdWxhdGlvbnMgOiBicmVha3BvaW50c0FmZXJNYW5pcHVsYXRpb25zIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdEZWJ1Z2dlciBlcnJvcicsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsQ2xvc2UoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLl9zZW5kKHtcclxuICAgICAgICAgICAgZXZlbnQ6ICdyZXBsJyxcclxuICAgICAgICAgICAgbmFtZTogJ3JlcGxfc3RvcCdcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBsU2VuZChjbWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuX3NlbmQoe1xyXG4gICAgICAgICAgICBldmVudDogJ3JlcGwnLFxyXG4gICAgICAgICAgICBuYW1lOiAncmVwbF9ldmFsJyxcclxuICAgICAgICAgICAgY29udGVudDoge1xyXG4gICAgICAgICAgICAgICAgY21kOiBjbWRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcGxTdGFydCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuaW52b2tlKCdyZXBsU3RhcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRCcmVha3BvaW50KGxpbmUpIHtcclxuICAgICAgICAvKlxyXG4gICAgICAgIGlmICh0aGlzLmRlYnVnTW9kZSAmJiB0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyICYmIHRoaXMuX3N1aXRlICYmIHRoaXMuX3N1aXRlLnRlc3RjYXNlcykge1xyXG4gICAgICAgICAgICBjb25zdCB0YyA9IHRoaXMuX3N1aXRlLnRlc3RjYXNlc1t0Y2luZGV4XTtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKCdveHlnZW4uc2V0QnJlYWtwb2ludDogJyArIChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQpKTtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQodGMubmFtZSwgbGluZSArIHRoaXMuX3NjcmlwdENvbnRlbnRMaW5lT2Zmc2V0KTtcclxuICAgICAgICB9Ki9cclxuICAgIH1cclxuXHJcbiAgICBjbGVhckJyZWFrcG9pbnQobGluZSkge1xyXG4gICAgICAgIC8qXHJcbiAgICAgICAgaWYgKHRoaXMuZGVidWdNb2RlICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLmNsZWFyQnJlYWtwb2ludChsaW5lICsgdGhpcy5fc2NyaXB0Q29udGVudExpbmVPZmZzZXQsIG51bGwpO1xyXG4gICAgICAgIH0qL1xyXG4gICAgfVxyXG5cclxuICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuICAgICAqIFByaXZhdGUgbWV0aG9kc1xyXG4gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cclxuXHJcbiAgICBhc3luYyBfcnVuVGVzdCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5QQVNTRUQ7XHJcbiAgICAgICAgcmVzdWx0LnN1aXRlcyA9IFtdO1xyXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XHJcbiAgICAgICAgLy8gY2FsbCBiZWZvcmVUZXN0IGhvb2tcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCk7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHN1aXRlc1xyXG4gICAgICAgICAgICBmb3IgKGxldCBzdWl0ZSBvZiB0aGlzLl9zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHN1aXRlUmVzdWx0ID0gYXdhaXQgdGhpcy5fcnVuU3VpdGUoc3VpdGUpO1xyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5wdXNoKHN1aXRlUmVzdWx0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBlcnJvciA9IGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgIHJlc3VsdC5kdXJhdGlvbiA9IHJlc3VsdC5lbmRUaW1lIC0gcmVzdWx0LnN0YXJ0VGltZTtcclxuXHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gcmVzdWx0LnN1aXRlcy5zb21lKHN1aXRlSXRlcmF0aW9ucyA9PiB7XHJcbiAgICAgICAgICAgIGlmIChzdWl0ZUl0ZXJhdGlvbnMgJiYgQXJyYXkuaXNBcnJheShzdWl0ZUl0ZXJhdGlvbnMpICYmIHN1aXRlSXRlcmF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IGhhc0ZhaWxlZFN1aXRlcyA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgIHJlc3VsdC5lbnZpcm9ubWVudCA9IHsgLi4udGhpcy5fZW52IH07XHJcbiAgICAgICAgLy8gY29tYmluZSB0ZXN0IGRlZmluZWQgY2FwcyBhbmQgcGVyIG1vZHVsZSBjYXBhYmlsaXRpZXMsIHRoYXQgd2VyZSBwYXNzZWQgYnkgdXNlciBpbiBlYWNoIG1vZHVsZSdzIGluaXQgZnVuY3Rpb25cclxuICAgICAgICByZXN1bHQuY2FwYWJpbGl0aWVzID0geyAuLi50aGlzLl9jYXBzLCAuLi50aGlzLl9tb2RDYXBzIH07ICAgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX2NhcHMgb2JqZWN0XHJcbiAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSB7IC4uLnRoaXMuX29wdGlvbnMgfTsgIC8vIGFzc2lnbiBhIGNvcHkgb2YgX29wdGlvbnMgb2JqZWN0XHJcblxyXG4gICAgICAgIC8vIGlmIGVycm9yIG9jY3VyZWQsIGFkZCBpdCB0byB0aGUgc3VtbWFyeVxyXG4gICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXN1bHQuZmFpbHVyZSA9IGVycm9ySGVscGVyLmdldEZhaWx1cmVGcm9tRXJyb3IoZXJyb3IpO1xyXG4gICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfcnVuU3VpdGUoc3VpdGUpIHtcclxuICAgICAgICBpZiAoIXN1aXRlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignc3VpdGUgaXMgbnVsbCBpbiBfcnVuU3VpdGUoKSEhIScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBpZ25vcmUgc3VpdGUgd2l0aCBtaXNzaW5nIG1hbmRhdG9yeSBwcm9wZXJ0aWVzXHJcbiAgICAgICAgaWYgKCFzdWl0ZS5uYW1lICYmICFzdWl0ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gbWFrZSBzdXJlIHRvIGFsd2F5cyBzcGVjaWZ5IHN1aXRlLml0ZXJhdGlvbkNvdW50XHJcbiAgICAgICAgaWYgKCFzdWl0ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICBzdWl0ZS5pdGVyYXRpb25Db3VudCA9IDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICBpZiAoc3VpdGUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgIHNob3dTdWl0ZUl0ZXJhdGlvbnNNZXNzYWdlcyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCByZVJ1bk9uRmFpbHVyZSA9IHRoaXMuX29wdGlvbnMucmVSdW5PbkZhaWxlZCB8fCBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gc2luZ2xlIHN1aXRlIG1pZ2h0IHByb2R1Y2UgbXVsdGlwbGUgcmVzdWx0cywgYmFzZWQgb24gYW1vdW50IG9mIGRlZmluZWQgaXRlcmF0aW9uc1xyXG4gICAgICAgIGNvbnN0IHN1aXRlSXRlcmF0aW9ucyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IHN1aXRlSXRlcmF0aW9uPTE7IHN1aXRlSXRlcmF0aW9uIDw9IHN1aXRlLml0ZXJhdGlvbkNvdW50OyBzdWl0ZUl0ZXJhdGlvbisrKSB7XHJcbiAgICAgICAgICAgIGlmIChzaG93U3VpdGVJdGVyYXRpb25zTWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIHN1aXRlSXRlcmF0aW9uLCAnU3VpdGUnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZVJlc3VsdCA9IG5ldyBUZXN0U3VpdGVSZXN1bHQoKTtcclxuICAgICAgICAgICAgc3VpdGVJdGVyYXRpb25zLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5uYW1lID0gc3VpdGUubmFtZSB8fCBveHV0aWwuZ2V0RmlsZU5hbWVXaXRob3V0RXh0KHN1aXRlLnBhdGgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHN1aXRlUmVzdWx0Lml0ZXJhdGlvbk51bSA9IHN1aXRlSXRlcmF0aW9uO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVTdGFydCh0aGlzLl9pZCwgc3VpdGUudXJpLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNhemUgb2Ygc3VpdGUuY2FzZXMpIHtcclxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBjYXNlcyB3aXRoIG1pc3NpbmcgbWFuZGF0b3J5ICdwYXRoJyBwcm9wZXJ0eSBcclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5wYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoIWNhemUubmFtZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUubmFtZSA9IG94dXRpbC5nZXRGaWxlTmFtZVdpdGhvdXRFeHQoY2F6ZS5wYXRoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmICghY2F6ZS5pdGVyYXRpb25Db3VudCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhemUuaXRlcmF0aW9uQ291bnQgPSAxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZUl0ZXJhdGlvbj0xOyBjYXNlSXRlcmF0aW9uIDw9IGNhemUuaXRlcmF0aW9uQ291bnQ7IGNhc2VJdGVyYXRpb24rKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd0Nhc2VJdGVyYXRpb25zTWVzc2FnZXMgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2F6ZSAmJiBjYXplLml0ZXJhdGlvbkNvdW50ICYmIGNhemUuaXRlcmF0aW9uQ291bnQgPiAxKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uU3RhcnQodGhpcy5faWQsIGNhc2VJdGVyYXRpb24sICdDYXNlJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydCBjYXNlIHN0YXJ0IGV2ZW50XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIub25DYXNlU3RhcnQodGhpcy5faWQsIHN1aXRlLnVyaSB8fCBzdWl0ZS5pZCwgY2F6ZS51cmkgfHwgY2F6ZS5pZCB8fCBjYXplLnBhdGgsIGNhemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vbGV0IHJlUnVuQ291bnQgPSAwO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjYXNlUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIHJ1biBvciByZS1ydW4gdGhlIGN1cnJlbnQgdGVzdCBjYXNlXHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcmVSdW5Db3VudCA9IDA7IHJlUnVuQ291bnQgPCBNQVhfUkVSVU5TOyByZVJ1bkNvdW50KyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVJlc3VsdCA9IGF3YWl0IHRoaXMuX3J1bkNhc2Uoc3VpdGUsIGNhemUsIHN1aXRlSXRlcmF0aW9uLCBjYXNlSXRlcmF0aW9uLCByZVJ1bkNvdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghY2FzZVJlc3VsdCB8fCBjYXNlUmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkgJiYgIXJlUnVuT25GYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjYXNlUmVzdWx0ICYmIGNhc2VSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyByZXBvcnQgY2FzZSBlbmQgZXZlbnRcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkNhc2VFbmQodGhpcy5faWQsIHN1aXRlLnVyaSB8fCBzdWl0ZS5pZCwgY2F6ZS51cmkgfHwgY2F6ZS5pZCwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDYXNlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uSXRlcmF0aW9uRW5kKHRoaXMuX2lkLCBjYXNlUmVzdWx0LCAnQ2FzZScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAvLyBhZGQgY2FzZSByZXN1bHQgdG8gdGhlIHN1aXRlIHJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlUmVzdWx0LmNhc2VzLnB1c2goY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGVzdCBjYXNlIGl0ZXJhdGlvbiBoYXMgZmFpbGVkLCB0aGVuIG1hcmsgdGhlIGVudGlyZSB0ZXN0IGNhc2UgYXMgZmFpbGVkLCBcclxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIGl0ZXJhdGluZyBvdmVyIGl0IGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHRlc3QgY2FzZVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBzdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IHN1aXRlUmVzdWx0LmVuZFRpbWUgLSBzdWl0ZVJlc3VsdC5zdGFydFRpbWU7XHJcblxyXG4gICAgICAgICAgICBpZiAoc2hvd1N1aXRlSXRlcmF0aW9uc01lc3NhZ2VzKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9yZXBvcnRlci5vbkl0ZXJhdGlvbkVuZCh0aGlzLl9pZCwgc3VpdGVSZXN1bHQsICdTdWl0ZScpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCBzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyLm9uU3VpdGVFbmQodGhpcy5faWQsIHN1aXRlLnVyaSwgc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc3VpdGVJdGVyYXRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9ydW5DYXNlKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcmVSdW5Db3VudCA9IDApIHtcclxuICAgICAgICBjb25zdCBwYXJhbXMgPSB7fTtcclxuICAgICAgICBjb25zdCByZVJ1biA9IHJlUnVuQ291bnQgPiAwO1xyXG4gICAgICAgIC8vIGdldCB0ZXN0IHN1aXRlJ3MgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgLy8gZ2V0IHRoZW0gZmlyc3QgYW5kIHRoZW4gb3ZlcnJpZGUgd2l0aCB0ZXN0IGNhc2UgbGV2ZWwgcGFyYW1ldGVycyBpZiBkZWZpbmVkXHJcbiAgICAgICAgaWYgKHN1aXRlLnBhcmFtTWFuYWdlcikge1xyXG4gICAgICAgICAgICAvKmlmIChyZVJ1bikge1xyXG4gICAgICAgICAgICAgICAgc3VpdGUucGFyYW1NYW5hZ2VyLnJlYWRQcmV2KCk7XHJcbiAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIHN1aXRlLnBhcmFtTWFuYWdlci5nZXRWYWx1ZXMoKSk7XHJcbiAgICAgICAgICAgIGlmICghcmVSdW4pIHtcclxuICAgICAgICAgICAgICAgIHN1aXRlLnBhcmFtTWFuYWdlci5yZWFkTmV4dCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIHJlYWQgdGVzdCBjYXNlJ3MgbmV4dCBsaW5lcyBvZiBwYXJhbWV0ZXJzIGlmIHBhcmFtZXRlciBtYW5hZ2VyIGlzIGRlZmluZWRcclxuICAgICAgICBpZiAoY2F6ZS5wYXJhbU1hbmFnZXIpIHtcclxuICAgICAgICAgICAgLyppZiAocmVSdW4pIHtcclxuICAgICAgICAgICAgICAgIGNhemUucGFyYW1NYW5hZ2VyLnJlYWRQcmV2KCk7XHJcbiAgICAgICAgICAgIH0qL1xyXG4gICAgICAgICAgICBfLmV4dGVuZChwYXJhbXMsIGNhemUucGFyYW1NYW5hZ2VyLmdldFZhbHVlcygpKTtcclxuICAgICAgICAgICAgaWYgKCFyZVJ1bikge1xyXG4gICAgICAgICAgICAgICAgY2F6ZS5wYXJhbU1hbmFnZXIucmVhZE5leHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gYWRkIGJyZWFrcG9pbnRzIGJlZm9yZSBydW5uaW5nIHRoZSBzY3JpcHQgaWYgaW4gZGVidWcgbW9kZVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUgJiYgdGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiBjYXplLmJyZWFrcG9pbnRzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTwgY2F6ZS5icmVha3BvaW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgLy8gZWRpdG9yIGluZGV4IHN0YXJ0cyBmcm9tIDEsIGJ1dCB3ZSBuZWVkIHplcm8gYmFzZWQgaW5kZXhcclxuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gY2F6ZS5icmVha3BvaW50c1tpXS5saW5lO1xyXG4gICAgICAgICAgICAgICAgbGV0IGZpbGUgPSBjYXplLmJyZWFrcG9pbnRzW2ldLmZpbGU7XHJcblxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLnNldEJyZWFrcG9pbnQoZmlsZSwgbGluZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyX2NhbGxCZWZvcmVDYXNlSG9vayhjYXplKTtcclxuICAgICAgICBjb25zdCBjYXNlUmVzdWx0ID0gbmV3IFRlc3RDYXNlUmVzdWx0KCk7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5uYW1lID0gY2F6ZS5uYW1lO1xyXG4gICAgICAgIGNhc2VSZXN1bHQubG9jYXRpb24gPSBjYXplLnBhdGg7XHJcbiAgICAgICAgY2FzZVJlc3VsdC5pdGVyYXRpb25OdW0gPSBjYXNlSXRlcmF0aW9uO1xyXG4gICAgICAgIGNhc2VSZXN1bHQucmVSdW5Db3VudCA9IHJlUnVuQ291bnQ7XHJcblxyXG4gICAgICAgIC8vIHRyeSB0byBpbml0aWFsaXplIE94eWdlbiBhbmQgaGFuZGxlIGFueSBwb3NzaWJsZSBlcnJvclxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICghKHRoaXMuX3dvcmtlcikgJiYgdGhpcy5fd29ya2VyX0luaXRPeHlnZW4oKSk7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5fd29ya2VyKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyX0luaXRPeHlnZW4oKSB0aHJvd24gYW4gZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuc3RhcnRUaW1lID0gY2FzZVJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmR1cmF0aW9uID0gMDtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihlKTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gc3RhcnQgbmV3IHRlc3Qgc2Vzc2lvblxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9zdGFydFNlc3Npb24oKTtcclxuICAgICAgICAvLyBydW4gdGhlIHRlc3QgaW4gdGhlIHdvcmtlciBwcm9jZXNzIGFuZCBoYW5kbGUgYW55IHBvc3NpYmxlIGVycm9yXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0U3RvcmUsIGNvbnRleHQsIG1vZHVsZUNhcHMsIGVycm9yIH0gPSBhd2FpdCB0aGlzLl93b3JrZXJfUnVuKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcGFyYW1zKTtcclxuICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc1Rlc3RSZXN1bHRzKHsgcmVzdWx0U3RvcmUsIGNvbnRleHQsIGVycm9yLCBtb2R1bGVDYXBzIH0pO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIGNhc2VSZXN1bHQuZHVyYXRpb24gPSBjYXNlUmVzdWx0LmVuZFRpbWUgLSBjYXNlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5jb250ZXh0ID0gY29udGV4dDtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5zdGVwcyA9IHJlc3VsdFN0b3JlICYmIHJlc3VsdFN0b3JlLnN0ZXBzID8gcmVzdWx0U3RvcmUuc3RlcHMgOiBbXTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5sb2dzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUubG9ncyA/IHJlc3VsdFN0b3JlLmxvZ3MgOiBbXTtcclxuICAgICAgICAgICAgY2FzZVJlc3VsdC5oYXIgPSByZXN1bHRTdG9yZSAmJiByZXN1bHRTdG9yZS5oYXIgPyByZXN1bHRTdG9yZS5oYXIgOiBudWxsO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnRlc3RBdHRyaWJ1dGVzID0gcmVzdWx0U3RvcmUgJiYgcmVzdWx0U3RvcmUuYXR0cmlidXRlcyA/IHJlc3VsdFN0b3JlLmF0dHJpYnV0ZXMgOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3QgY2FzZSBpdGVyYXRpb24gc3RhdHVzIC0gbWFyayBpdCBhcyBmYWlsZWQgaWYgYW55IHN0ZXAgaGFzIGZhaWxlZFxyXG4gICAgICAgICAgICB2YXIgZmFpbGVkU3RlcHMgPSBfLmZpbmQoY2FzZVJlc3VsdC5zdGVwcywge3N0YXR1czogU3RhdHVzLkZBSUxFRH0pO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IF8uaXNFbXB0eShmYWlsZWRTdGVwcykgJiYgIWVycm9yID8gU3RhdHVzLlBBU1NFRCA6IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgIGlmIChlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5mYWlsdXJlID0gZXJyb3I7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LnN0ZXBzID0gb3h1dGlsLm1ha2VUcmFuc2FjdGlvbkZhaWxlZElmU3RlcEZhaWxlZChjYXNlUmVzdWx0LnN0ZXBzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXJfY2FsbEFmdGVyQ2FzZUhvb2soY2F6ZSwgY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ193b3JrZXJfUnVuKCkgdGhyb3duIGFuIGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LmZhaWx1cmUgPSBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGUpO1xyXG4gICAgICAgICAgICBjYXNlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBkaXNwb3NlT3h5Z2VuTW9kdWxlcyA9IHR5cGVvZiB0aGlzLl9vcHRpb25zLmF1dG9EaXNwb3NlICE9PSAnYm9vbGVhbicgfHwgdGhpcy5fb3B0aW9ucy5hdXRvRGlzcG9zZSA9PT0gdHJ1ZTtcclxuICAgICAgICAvLyBlbmQgc2Vzc2lvbiBhbmQgZGlzcG9zZSBPeHlnZW4gbW9kdWxlcyBpZiByZXF1aXJlZFxyXG4gICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlcl9lbmRTZXNzaW9uKGNhc2VSZXN1bHQuc3RhdHVzLCBkaXNwb3NlT3h5Z2VuTW9kdWxlcyk7XHJcblxyXG4gICAgICAgIHJldHVybiBjYXNlUmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfUnVuKHN1aXRlLCBjYXplLCBzdWl0ZUl0ZXJhdGlvbiwgY2FzZUl0ZXJhdGlvbiwgcGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdfd29ya2VyIGlzIG51bGwgYnV0IG5vdCBzdXBwb3NlIHRvIScpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuVGVzdENhc2VGaW5pc2hlZC5yZWplY3QobmV3IEVycm9yKCdfd29ya2VyIGlzIG51bGwnKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdGFydCBydW5uaW5nIHRoZSB0ZXN0XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX3dvcmtlci5ydW4oe1xyXG4gICAgICAgICAgICBzY3JpcHROYW1lOiBjYXplLm5hbWUsXHJcbiAgICAgICAgICAgIHNjcmlwdFBhdGg6IGNhemUucGF0aCxcclxuICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBwYXJhbXMsXHJcbiAgICAgICAgICAgICAgICBlbnY6IHRoaXMuX2VudixcclxuICAgICAgICAgICAgICAgIGNhcHM6IHRoaXMuX2NhcHMsXHJcbiAgICAgICAgICAgICAgICB2YXJzOiB0aGlzLl92YXJzLFxyXG4gICAgICAgICAgICAgICAgdGVzdDoge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2U6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY2F6ZS5uYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRpb246IGNhc2VJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN1aXRlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogc3VpdGVJdGVyYXRpb25cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHBvRmlsZTogdGhpcy5fb3B0aW9ucy5wbyB8fCBudWxsLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfSW5pdE94eWdlbigpIHtcclxuICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbml0T3h5Z2VuKHRoaXMuX2lkLCB0aGlzLl9vcHRpb25zLCB0aGlzLl9jYXBzKSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9zdGFydFNlc3Npb24oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuc3RhcnRTZXNzaW9uKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5zdGFydFNlc3Npb24oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3dvcmtlcl9lbmRTZXNzaW9uKHN0YXR1cyA9IG51bGwsIGRpc3Bvc2VNb2R1bGVzID0gdHJ1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmVuZFNlc3Npb24pIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLmVuZFNlc3Npb24oc3RhdHVzLCBkaXNwb3NlTW9kdWxlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVRlc3RIb29rKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlVGVzdCcsIFt0aGlzLl9pZCwgdGhpcy5fb3B0aW9ucywgdGhpcy5fY2Fwc10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZVN1aXRlSG9vayhzdWl0ZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzICYmIHRoaXMuX3dvcmtlciAmJiB0aGlzLl93b3JrZXIuaW52b2tlVGVzdEhvb2spIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlU3VpdGUnLCBbc3VpdGVdKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlU3VpdGVcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImJlZm9yZVN1aXRlXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEJlZm9yZUNhc2VIb29rKGNhemUpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlQ2FzZScsIFtjYXplXSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYmVmb3JlQ2FzZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlclRlc3RIb29rKHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlclRlc3QnLCBbdGhpcy5faWQsIHJlc3VsdF0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdcImFmdGVyVGVzdFwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJUZXN0XCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF93b3JrZXJfY2FsbEFmdGVyU3VpdGVIb29rKHN1aXRlLCByZXN1bHQpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJTdWl0ZScsIFtzdWl0ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicsIGUpO1xyXG4gICAgICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vbkxvZ0VudHJ5KG51bGwsICdXQVJOJywgJ1wiYWZ0ZXJTdWl0ZVwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfd29ya2VyX2NhbGxBZnRlckNhc2VIb29rKGNhemUsIHJlc3VsdCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0ICh0aGlzLl93b3JrZXIgJiYgdGhpcy5fd29ya2VyLmludm9rZVRlc3RIb29rKCdhZnRlckNhc2UnLCBbY2F6ZSwgcmVzdWx0XSkpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ1wiYWZ0ZXJDYXNlXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJhZnRlckNhc2VcIiBob29rIGZhaWxlZDonK2UsIERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3N0YXJ0V29ya2VyUHJvY2VzcygpIHtcclxuICAgICAgICBjb25zdCB3b3JrZXJQYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ3dvcmtlci5qcycpO1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG5ldyBXb3JrZXJQcm9jZXNzKHRoaXMuX2lkLCB3b3JrZXJQYXRoLCB0aGlzLl9kZWJ1Z01vZGUsIHRoaXMuX2RlYnVnUG9ydCwgJ094eWdlbicsIHRoaXMuX25wbUdSb290RXhlY3V0aW9uKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl93b3JrZXIuc3RhcnQoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRXZlbnRzKCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fd29ya2VyLnN0YXJ0RGVidWdnZXIoKTtcclxuICAgICAgICB0aGlzLl9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKTtcclxuICAgIH1cclxuXHJcbiAgICBfaG9va1dvcmtlckV2ZW50cygpIHtcclxuICAgICAgICAvLyBwcmVzZXJ2ZSB0aGlzIG9iamVjdFxyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICB0aGlzLl93b3JrZXIuc3Vic2NyaWJlKCdjb21tYW5kOmJlZm9yZScsIHRoaXMuX2hhbmRsZUJlZm9yZUNvbW1hbmQuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLnN1YnNjcmliZSgnY29tbWFuZDphZnRlcicsIHRoaXMuX2hhbmRsZUFmdGVyQ29tbWFuZC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2Vycm9yJywgKHBheWxvYWQpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgeyBlcnJvciB9ID0gcGF5bG9hZDtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdXb3JrZXIgcHJvY2VzcyBlcnJvcjogJywgZXJyb3IpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpdERvbmUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgndGVzdC1lcnJvcicsIGVycm9yKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl93b3JrZXJQcm9jTGFzdEVycm9yID0gZXJyb3I7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl93b3JrZXIub24oJ2V4aXQnLCAocGF5bG9hZCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4aXREb25lID0gdHJ1ZTtcclxuICAgICAgICAgICAgY29uc3QgeyBleGl0Q29kZSB9ID0gcGF5bG9hZDtcclxuXHJcbiAgICAgICAgICAgIGlmIChleGl0Q29kZSAmJiBleGl0Q29kZSAhPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRlc3QgaXMgcnVubmluZyBvciBpcyBiZWluZyBkaXNwb3NlZCBhbmQgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGRpZWQsXHJcbiAgICAgICAgICAgICAgICAvLyB0aGVuIGVuZCB0aGUgdGVzdCBvciBkaXNwb3NhbCB3aXRoIGZhdGFsIGVycm9yXHJcbiAgICAgICAgICAgICAgICAvLyAoY2hpbGQgcHJvY2VzcyBub3Qgc3VwcG9zZSB0byBkaWUgd2l0aCBjb2RlID4gMClcclxuICAgICAgICAgICAgICAgIGxldCBwcm9taXNlID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5faXNEaXNwb3NpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5EaXNwb3NlZDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKF90aGlzLl9pc1J1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICBwcm9taXNlID0gX3RoaXMuX3doZW5UZXN0Q2FzZUZpbmlzaGVkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbGV0IGVycm9yID0gX3RoaXMuX3dvcmtlclByb2NMYXN0RXJyb3IgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgIGlmIChleGl0Q29kZSA9PSAxMzQpIHtcclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IG5ldyBPeHlnZW5FcnJvcihlcnJvckhlbHBlci5lcnJvckNvZGUuU0NSSVBUX0VSUk9SLCAnT3V0IG9mIG1lbW9yeSBlcnJvci4gTWFrZSBzdXJlIHRoYXQgeW91IGRvblxcJ3QgaGF2ZSBhbnkgbWVtb3J5IGxlYWtzIGluIHRoZSB0ZXN0IHNjcmlwdC4nKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFlcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gbmV3IE94eWdlbkVycm9yKGBXb3JrZXIgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlOiAke2V4aXRDb2RlfS5gKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBwcm9taXNlICYmIHByb21pc2UucmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXNldEdsb2JhbFZhcmlhYmxlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyLm9uKCdtZXNzYWdlJywgYXN5bmMgKG1zZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ2xvZycpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubGV2ZWwgPT09ICdERUJVRycpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcobXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0lORk8nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8obXNnLm1zZyk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5sZXZlbCA9PT0gJ0VSUk9SJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxvZy5lcnJvcihtc2cubXNnLCBtc2cuZXJyKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobXNnLmxldmVsID09PSAnV0FSTicpIHtcclxuICAgICAgICAgICAgICAgICAgICBsb2cud2Fybihtc2cubXNnKTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsb2cnLCBtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9yZXBvcnRlciAmJiBfdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShtc2cudGltZSwgbXNnLmxldmVsLCBtc2cubXNnLCBtc2cuc3JjIHx8IERFRkFVTFRfSVNTVUVSKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAnbGluZS11cGRhdGUnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdsaW5lLXVwZGF0ZScsIG1zZy5saW5lLCBtc2cuc3RhY2ssIG1zZy50aW1lKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChtc2cuZXZlbnQgJiYgbXNnLmV2ZW50ID09PSAncmVzdWx0LXVwZGF0ZScpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtc2cubWV0aG9kID09PSAnaW5pdCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdpbml0LWRvbmUnLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKG1zZy5ldmVudCAmJiBtc2cuZXZlbnQgPT09ICd3b3JrZXJFcnJvcicpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd3b3JrZXJFcnJvcjonLCBtc2cpO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNwb3NlKCdmYWlsZWQnKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMua2lsbCgnZmFpbGVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSBpZiAobXNnLmV2ZW50ICYmIG1zZy5ldmVudCA9PT0gJ3JlcGwnKSB7XHJcbiAgICAgICAgICAgICAgICBfdGhpcy5lbWl0KCdyZXBsJywgbXNnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rV29ya2VyRGVidWdnZXJFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl93b3JrZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl93b3JrZXIuZGVidWdnZXIgJiYgdGhpcy5fd29ya2VyLmRlYnVnZ2VyLm9uKCdkZWJ1Z2dlcjpicmVhaycsIChicmVha3BvaW50RGF0YSkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrcG9pbnQnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuX3dvcmtlci5kZWJ1Z2dlciAmJiB0aGlzLl93b3JrZXIuZGVidWdnZXIub24oJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCAoYnJlYWtFcnJvcikgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2JyZWFrcG9pbnRFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVCZWZvcmVDb21tYW5kKGUpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlciAmJiB0aGlzLl9yZXBvcnRlci5vblN0ZXBTdGFydCh0aGlzLl9pZCwgZSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubW9kdWxlICYmIGUubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYmVmb3JlQ29tbWFuZCcsIFtlXSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJiZWZvcmVDb21tYW5kXCIgaG9vayBmYWlsZWQ6JywgZSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uTG9nRW50cnkobnVsbCwgJ1dBUk4nLCAnXCJiZWZvcmVDb21tYW5kXCIgaG9vayBmYWlsZWQ6JytlLCBERUZBVUxUX0lTU1VFUik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVBZnRlckNvbW1hbmQoZSkge1xyXG4gICAgICAgIHRoaXMuX3JlcG9ydGVyICYmIHRoaXMuX3JlcG9ydGVyLm9uU3RlcEVuZCh0aGlzLl9pZCwgZS5yZXN1bHQpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChlICYmIGUubW9kdWxlICYmIGUubW9kdWxlID09PSAnbG9nJykge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCAodGhpcy5fd29ya2VyICYmIHRoaXMuX3dvcmtlci5pbnZva2VUZXN0SG9vaygnYWZ0ZXJDb21tYW5kJywgW2UucmVzdWx0XSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignXCJhZnRlckNvbW1hbmRcIiBob29rIGZhaWxlZDonLCBlKTtcclxuICAgICAgICAgICAgdGhpcy5fcmVwb3J0ZXIgJiYgdGhpcy5fcmVwb3J0ZXIub25Mb2dFbnRyeShudWxsLCAnV0FSTicsICdcImFmdGVyQ29tbWFuZFwiIGhvb2sgZmFpbGVkOicrZSwgREVGQVVMVF9JU1NVRVIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXRHbG9iYWxWYXJpYWJsZXMoKSB7XHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHt9O1xyXG4gICAgICAgIHRoaXMuX3dvcmtlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNEaXNwb3NpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Rlc3RLaWxsZWQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl93aGVuRGlzcG9zZWQgPSBkZWZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIF9wcm9jZXNzVGVzdFJlc3VsdHMoeyByZXN1bHRTdG9yZSwgbW9kdWxlQ2FwcywgY29udGV4dCA9IHt9LCBlcnJvciA9IG51bGwgfSkge1xyXG4gICAgICAgIC8vIGlmIHRlc3Qgd2FzIGtpbGxlZCBiZWZvcmUgYW55IHJlc3VsdHMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4ganVzdCBmaW5hbGl6ZSB0aGUgdGVzdCB3aXRob3V0IHByb2Nlc3NpbmcgcmVzdWx0c1xyXG4gICAgICAgIGlmICh0aGlzLl90ZXN0S2lsbGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXJyb3IpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCd0ZXN0LWVycm9yJywgZXJyb3IpO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBzdG9yZSAndmFycycgcGFydCBvZiB0aGUgY29udGV4dCBmb3IgYSBsYXRlciB1c2VcclxuICAgICAgICB0aGlzLl92YXJzID0gY29udGV4dC52YXJzIHx8IHRoaXMuX3ZhcnM7XHJcbiAgICAgICAgLy8gc3RvcmUgJ21vZENhcHMnIHBhcnQgb2YgdGhlIGNvbnRleHQgZm9yIGEgbGF0ZXIgdXNlXHJcbiAgICAgICAgdGhpcy5fbW9kQ2FwcyA9IHsgLi4udGhpcy5fbW9kQ2FwcywgLi4ubW9kdWxlQ2FwcyB8fCB7fSB9O1xyXG4gICAgICAgIC8vIGNsZWFuIHVwIGNvbnRleHQgZnJvbSBpbnRlcm5hbCBlbGVtZW50cywgbm90IG5lZWQgaW4gdGhlIHJlcG9ydDpcclxuICAgICAgICAvLyByZW1vdmUgY2FwcyBmcm9tIHRoZSBjb250ZXh0IGFzIGl0IGFscmVhZHkgYXBwZWFycyBpbiBUZXN0UmVzdWx0IG5vZGVcclxuICAgICAgICBpZiAoY29udGV4dC5jYXBzKVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5jYXBzO1xyXG4gICAgICAgIC8vIHJlbW92ZSBlbnYgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQuZW52KVxyXG4gICAgICAgICAgICBkZWxldGUgY29udGV4dC5lbnY7XHJcbiAgICAgICAgLy8gcmVtb3ZlIHRlc3QgZnJvbSB0aGUgY29udGV4dCBhcyBpdCBhbHJlYWR5IGFwcGVhcnMgaW4gVGVzdFJlc3VsdCBub2RlXHJcbiAgICAgICAgaWYgKGNvbnRleHQudGVzdClcclxuICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQudGVzdDtcclxuICAgIH1cclxuXHJcbiAgICBfZW1pdEl0ZXJhdGlvbkVuZCh0cywgdGMsIHN1aXRlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uTnVtLCBjYXNlSXRlcmF0aW9uUmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdpdGVyYXRpb24tZW5kJywge1xyXG4gICAgICAgICAgICBzdGF0dXM6IGNhc2VJdGVyYXRpb25SZXN1bHQuX3N0YXR1cyxcclxuICAgICAgICAgICAgZmFpbHVyZTogY2FzZUl0ZXJhdGlvblJlc3VsdC5mYWlsdXJlIHx8IG51bGwsXHJcbiAgICAgICAgICAgIGNhc2U6IHtcclxuICAgICAgICAgICAgICAgIGlkOiB0Yy5pZCB8fCBudWxsLFxyXG4gICAgICAgICAgICAgICAgbmFtZTogdGMubmFtZSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbjogY2FzZUl0ZXJhdGlvbk51bSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50OiB0Yy5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzdWl0ZToge1xyXG4gICAgICAgICAgICAgICAgaWQ6IHRzLmlkIHx8IG51bGwsXHJcbiAgICAgICAgICAgICAgICBuYW1lOiB0cy5uYW1lLFxyXG4gICAgICAgICAgICAgICAgaXRlcmF0aW9uOiBzdWl0ZUl0ZXJhdGlvbk51bSxcclxuICAgICAgICAgICAgICAgIGl0ZXJhdGlvbkNvdW50OiB0cy5pdGVyYXRpb25Db3VudFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2VtaXRUZXN0RW5kKHJlc3VsdCkge1xyXG4gICAgICAgIHRoaXMuZW1pdCgndGVzdC1lbmQnLCByZXN1bHQpO1xyXG4gICAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IHsgUGFyYW1ldGVyTWFuYWdlciB9OyJdfQ==
|