oxygen-cli 1.25.0-beta.2 → 1.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.husky/pre-commit +4 -0
- package/CHANGELOG.md +65 -0
- package/build/core/OxygenCore.js +36 -257
- package/build/core/OxygenEvents.js +1 -11
- package/build/core/OxygenModule.js +1 -14
- package/build/core/OxygenService.js +1 -12
- package/build/core/OxygenSubModule.js +1 -10
- package/build/core/WebDriverModule.js +1 -30
- package/build/core/utils.js +1 -17
- package/build/errors/HookError.js +1 -7
- package/build/errors/ModuleError.js +1 -7
- package/build/errors/ModuleUnavailableError.js +1 -3
- package/build/errors/OxygenError.js +1 -33
- package/build/errors/ScriptNotFound.js +1 -7
- package/build/errors/helper.js +46 -77
- package/build/index.js +6 -18
- package/build/lib/cli-util.js +28 -90
- package/build/lib/cli.js +1 -23
- package/build/lib/debugger.js +1 -144
- package/build/lib/img-merge.js +1 -15
- package/build/lib/launcher.js +1 -28
- package/build/lib/moduleRequire.js +1 -4
- package/build/lib/param-manager.js +1 -28
- package/build/lib/param-reader-csv.js +1 -15
- package/build/lib/param-reader-excel.js +1 -14
- package/build/lib/param-reader-json.js +1 -10
- package/build/lib/util.js +3 -58
- package/build/model/case-result.js +1 -2
- package/build/model/failure.js +1 -2
- package/build/model/status.js +1 -2
- package/build/model/step-result.js +1 -2
- package/build/model/suite-result.js +1 -2
- package/build/model/test-result.js +1 -2
- package/build/model/testcase.js +1 -2
- package/build/model/testsuite.js +1 -2
- package/build/ox_modules/index.js +13 -33
- package/build/ox_modules/module-assert.js +8 -24
- package/build/ox_modules/module-date.js +3 -8
- package/build/ox_modules/module-db.js +7 -28
- package/build/ox_modules/module-email.js +10 -36
- package/build/ox_modules/module-eyes.js +5 -46
- package/build/ox_modules/module-http.js +42 -104
- package/build/ox_modules/module-log.js +5 -22
- package/build/ox_modules/module-mailinator.js +10 -32
- package/build/ox_modules/module-mob/commands/alertAccept.js +1 -2
- package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -2
- package/build/ox_modules/module-mob/commands/assertAlert.js +1 -6
- package/build/ox_modules/module-mob/commands/assertText.js +1 -3
- package/build/ox_modules/module-mob/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-mob/commands/assertValue.js +9 -15
- package/build/ox_modules/module-mob/commands/back.js +1 -2
- package/build/ox_modules/module-mob/commands/clear.js +1 -4
- package/build/ox_modules/module-mob/commands/click.js +3 -4
- package/build/ox_modules/module-mob/commands/clickHidden.js +3 -9
- package/build/ox_modules/module-mob/commands/clickLong.js +1 -2
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -4
- package/build/ox_modules/module-mob/commands/closeApp.js +1 -2
- package/build/ox_modules/module-mob/commands/debug.js +2 -2
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -2
- package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -12
- package/build/ox_modules/module-mob/commands/execute.js +1 -2
- package/build/ox_modules/module-mob/commands/findElement.js +1 -3
- package/build/ox_modules/module-mob/commands/findElements.js +1 -4
- package/build/ox_modules/module-mob/commands/getAlertText.js +1 -2
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -2
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -10
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -2
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -2
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -9
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -2
- package/build/ox_modules/module-mob/commands/getLocation.js +1 -2
- package/build/ox_modules/module-mob/commands/getSource.js +1 -2
- package/build/ox_modules/module-mob/commands/getText.js +1 -4
- package/build/ox_modules/module-mob/commands/getTitle.js +1 -2
- package/build/ox_modules/module-mob/commands/getUrl.js +1 -2
- package/build/ox_modules/module-mob/commands/getValue.js +5 -9
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -2
- package/build/ox_modules/module-mob/commands/index.js +19 -94
- package/build/ox_modules/module-mob/commands/installApp.js +1 -2
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -2
- package/build/ox_modules/module-mob/commands/isCheckable.js +1 -2
- package/build/ox_modules/module-mob/commands/isChecked.js +1 -2
- package/build/ox_modules/module-mob/commands/isClickable.js +1 -2
- package/build/ox_modules/module-mob/commands/isExist.js +1 -3
- package/build/ox_modules/module-mob/commands/isSelected.js +1 -2
- package/build/ox_modules/module-mob/commands/isVisible.js +1 -3
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -2
- package/build/ox_modules/module-mob/commands/launchApp.js +1 -2
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -2
- package/build/ox_modules/module-mob/commands/open.js +1 -3
- package/build/ox_modules/module-mob/commands/pause.js +1 -2
- package/build/ox_modules/module-mob/commands/removeApp.js +1 -2
- package/build/ox_modules/module-mob/commands/resetApp.js +1 -2
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -6
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -2
- package/build/ox_modules/module-mob/commands/select.js +1 -4
- package/build/ox_modules/module-mob/commands/selectFrame.js +1 -4
- package/build/ox_modules/module-mob/commands/selectWindow.js +5 -26
- package/build/ox_modules/module-mob/commands/sendKeys.js +6 -9
- package/build/ox_modules/module-mob/commands/setContext.js +1 -2
- package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -2
- package/build/ox_modules/module-mob/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -6
- package/build/ox_modules/module-mob/commands/shake.js +1 -2
- package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -2
- package/build/ox_modules/module-mob/commands/smsGetText.js +3 -6
- package/build/ox_modules/module-mob/commands/swipe.js +1 -2
- package/build/ox_modules/module-mob/commands/swipeElement.js +1 -2
- package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -2
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -2
- package/build/ox_modules/module-mob/commands/tap.js +1 -2
- package/build/ox_modules/module-mob/commands/type.js +3 -7
- package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -10
- package/build/ox_modules/module-mob/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -3
- package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-mob.js +72 -142
- package/build/ox_modules/module-pdf.js +23 -62
- package/build/ox_modules/module-proxy.js +8 -68
- package/build/ox_modules/module-serial.js +7 -32
- package/build/ox_modules/module-shell.js +8 -27
- package/build/ox_modules/module-soap.js +14 -47
- package/build/ox_modules/module-twilio.js +10 -53
- package/build/ox_modules/module-utils.js +16 -51
- package/build/ox_modules/module-web/commands/alertAccept.js +1 -2
- package/build/ox_modules/module-web/commands/alertDismiss.js +1 -2
- package/build/ox_modules/module-web/commands/assertAlert.js +1 -6
- package/build/ox_modules/module-web/commands/assertExist.js +1 -2
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -4
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -3
- package/build/ox_modules/module-web/commands/assertText.js +1 -3
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -6
- package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -6
- package/build/ox_modules/module-web/commands/assertTitle.js +1 -3
- package/build/ox_modules/module-web/commands/assertValue.js +1 -3
- package/build/ox_modules/module-web/commands/back.js +1 -2
- package/build/ox_modules/module-web/commands/clear.js +1 -5
- package/build/ox_modules/module-web/commands/click.js +4 -13
- package/build/ox_modules/module-web/commands/clickHidden.js +2 -7
- package/build/ox_modules/module-web/commands/closeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/debug.js +2 -2
- package/build/ox_modules/module-web/commands/deleteCookies.js +1 -2
- package/build/ox_modules/module-web/commands/deselect.js +1 -2
- package/build/ox_modules/module-web/commands/doubleClick.js +3 -9
- package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -2
- package/build/ox_modules/module-web/commands/execute.js +1 -2
- package/build/ox_modules/module-web/commands/fileBrowse.js +4 -10
- package/build/ox_modules/module-web/commands/findElement.js +1 -3
- package/build/ox_modules/module-web/commands/findElements.js +1 -4
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -2
- package/build/ox_modules/module-web/commands/getAlertText.js +1 -2
- package/build/ox_modules/module-web/commands/getAttribute.js +1 -4
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -3
- package/build/ox_modules/module-web/commands/getCookies.js +1 -2
- package/build/ox_modules/module-web/commands/getCssValue.js +1 -4
- package/build/ox_modules/module-web/commands/getElementCount.js +1 -2
- package/build/ox_modules/module-web/commands/getHTML.js +1 -2
- package/build/ox_modules/module-web/commands/getSource.js +1 -2
- package/build/ox_modules/module-web/commands/getText.js +1 -4
- package/build/ox_modules/module-web/commands/getTitle.js +1 -2
- package/build/ox_modules/module-web/commands/getUrl.js +1 -2
- package/build/ox_modules/module-web/commands/getValue.js +1 -5
- package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-web/commands/getWindowSize.js +1 -2
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -5
- package/build/ox_modules/module-web/commands/index.js +26 -99
- package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -2
- package/build/ox_modules/module-web/commands/isChecked.js +1 -2
- package/build/ox_modules/module-web/commands/isExist.js +1 -3
- package/build/ox_modules/module-web/commands/isInteractable.js +33 -0
- package/build/ox_modules/module-web/commands/isSelected.js +1 -2
- package/build/ox_modules/module-web/commands/isVisible.js +1 -3
- package/build/ox_modules/module-web/commands/makeVisible.js +2 -10
- package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -2
- package/build/ox_modules/module-web/commands/newWindow.js +1 -2
- package/build/ox_modules/module-web/commands/open.js +1 -4
- package/build/ox_modules/module-web/commands/pause.js +1 -2
- package/build/ox_modules/module-web/commands/point.js +1 -2
- package/build/ox_modules/module-web/commands/pointJS.js +2 -8
- package/build/ox_modules/module-web/commands/refresh.js +1 -2
- package/build/ox_modules/module-web/commands/rightClick.js +3 -8
- package/build/ox_modules/module-web/commands/rightClickActions.js +1 -2
- package/build/ox_modules/module-web/commands/scrollToElement.js +1 -2
- package/build/ox_modules/module-web/commands/select.js +1 -5
- package/build/ox_modules/module-web/commands/selectFrame.js +1 -3
- package/build/ox_modules/module-web/commands/selectWindow.js +5 -26
- package/build/ox_modules/module-web/commands/sendKeys.js +3 -6
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
- package/build/ox_modules/module-web/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-web/commands/setWindowSize.js +1 -2
- package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -5
- package/build/ox_modules/module-web/commands/type.js +1 -5
- package/build/ox_modules/module-web/commands/waitForAngular.js +6 -11
- package/build/ox_modules/module-web/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -2
- package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -8
- package/build/ox_modules/module-web/commands/waitForNotText.js +3 -5
- package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -5
- package/build/ox_modules/module-web/commands/waitForText.js +3 -5
- package/build/ox_modules/module-web/commands/waitForValue.js +3 -5
- package/build/ox_modules/module-web/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-web/commands/waitForWindow.js +4 -21
- package/build/ox_modules/module-web.js +86 -192
- package/build/ox_modules/module-win/commands/assertText.js +1 -3
- package/build/ox_modules/module-win/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-win/commands/assertValue.js +9 -15
- package/build/ox_modules/module-win/commands/back.js +1 -2
- package/build/ox_modules/module-win/commands/clear.js +1 -4
- package/build/ox_modules/module-win/commands/click.js +1 -2
- package/build/ox_modules/module-win/commands/clickLong.js +1 -2
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -4
- package/build/ox_modules/module-win/commands/findElement.js +1 -3
- package/build/ox_modules/module-win/commands/findElements.js +1 -4
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -2
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -2
- package/build/ox_modules/module-win/commands/getLocation.js +1 -2
- package/build/ox_modules/module-win/commands/getSource.js +1 -2
- package/build/ox_modules/module-win/commands/getText.js +1 -4
- package/build/ox_modules/module-win/commands/getValue.js +5 -9
- package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -2
- package/build/ox_modules/module-win/commands/index.js +5 -43
- package/build/ox_modules/module-win/commands/isCheckable.js +1 -2
- package/build/ox_modules/module-win/commands/isChecked.js +1 -2
- package/build/ox_modules/module-win/commands/isClickable.js +1 -2
- package/build/ox_modules/module-win/commands/isExist.js +1 -3
- package/build/ox_modules/module-win/commands/isSelected.js +1 -2
- package/build/ox_modules/module-win/commands/isVisible.js +1 -3
- package/build/ox_modules/module-win/commands/open.js +1 -2
- package/build/ox_modules/module-win/commands/pause.js +1 -2
- package/build/ox_modules/module-win/commands/rightClick.js +1 -2
- package/build/ox_modules/module-win/commands/selectWindow.js +1 -15
- package/build/ox_modules/module-win/commands/sendKeys.js +1 -4
- package/build/ox_modules/module-win/commands/setTimeout.js +1 -2
- package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -2
- package/build/ox_modules/module-win/commands/tap.js +1 -2
- package/build/ox_modules/module-win/commands/type.js +1 -4
- package/build/ox_modules/module-win/commands/waitForExist.js +1 -2
- package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -4
- package/build/ox_modules/module-win/commands/waitForVisible.js +1 -2
- package/build/ox_modules/module-win.js +48 -87
- package/build/ox_modules/utils.js +22 -76
- package/build/ox_reporters/reporter-excel.js +1 -58
- package/build/ox_reporters/reporter-html.js +1 -28
- package/build/ox_reporters/reporter-json.js +1 -14
- package/build/ox_reporters/reporter-junit.js +1 -24
- package/build/ox_reporters/reporter-pdf.js +1 -19
- package/build/ox_reporters/reporter-xml.js +1 -17
- package/build/ox_services/service-devtools/submodule-network.js +3 -84
- package/build/ox_services/service-devtools.js +1 -23
- package/build/reporter/FileReporterBase.js +5 -44
- package/build/reporter/ReportAggregator.js +1 -65
- package/build/reporter/ReporterBase.js +1 -6
- package/build/runners/WorkerProcess.js +1 -99
- package/build/runners/cucumber/CucumberEventListener.js +4 -29
- package/build/runners/cucumber/CucumberReporter.js +1 -56
- package/build/runners/cucumber/CucumberWorker.js +1 -66
- package/build/runners/cucumber/index.js +1 -30
- package/build/runners/cucumber/worker.js +1 -18
- package/build/runners/index.js +1 -6
- package/build/runners/oxygen/OxygenWorker.js +20 -54
- package/build/runners/oxygen/index.js +17 -177
- package/build/runners/oxygen/worker.js +2 -25
- package/package.json +28 -29
|
@@ -4,19 +4,14 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
class ReporterBase {
|
|
11
9
|
constructor(options) {
|
|
12
10
|
this.options = options;
|
|
13
11
|
}
|
|
14
|
-
|
|
15
12
|
generate(results) {
|
|
16
13
|
throw new Error('Abstract class, method not implemented');
|
|
17
14
|
}
|
|
18
|
-
|
|
19
15
|
}
|
|
20
|
-
|
|
21
16
|
exports.default = ReporterBase;
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZXBvcnRlckJhc2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJnZW5lcmF0ZSIsInJlc3VsdHMiLCJFcnJvciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRlckJhc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKlxyXG4gKiBPeHlnZW4gUmVwb3J0ZXIgYWJzdHJhY3QgY2xhc3NcclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydGVyQmFzZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuICAgIGdlbmVyYXRlKHJlc3VsdHMpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Fic3RyYWN0IGNsYXNzLCBtZXRob2Qgbm90IGltcGxlbWVudGVkJyk7XHJcbiAgICB9XHJcbn1cclxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBWWUsTUFBTUEsWUFBWSxDQUFDO0VBQzlCQyxXQUFXLENBQUNDLE9BQU8sRUFBRTtJQUNqQixJQUFJLENBQUNBLE9BQU8sR0FBR0EsT0FBTztFQUMxQjtFQUNBQyxRQUFRLENBQUNDLE9BQU8sRUFBRTtJQUNkLE1BQU0sSUFBSUMsS0FBSyxDQUFDLHdDQUF3QyxDQUFDO0VBQzdEO0FBQ0o7QUFBQyJ9
|
|
@@ -4,27 +4,16 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = void 0;
|
|
7
|
-
|
|
8
7
|
require("source-map-support/register");
|
|
9
|
-
|
|
10
8
|
var _child_process = require("child_process");
|
|
11
|
-
|
|
12
9
|
var _events = require("events");
|
|
13
|
-
|
|
14
10
|
var _when = require("when");
|
|
15
|
-
|
|
16
11
|
var _logger = _interopRequireDefault(require("../lib/logger"));
|
|
17
|
-
|
|
18
12
|
var _debugger = _interopRequireDefault(require("../lib/debugger"));
|
|
19
|
-
|
|
20
13
|
var _util = _interopRequireDefault(require("../lib/util"));
|
|
21
|
-
|
|
22
14
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
23
|
-
|
|
24
15
|
const log = (0, _logger.default)('WorkerProcess');
|
|
25
|
-
|
|
26
16
|
const snooze = ms => new Promise(resolve => setTimeout(resolve, ms));
|
|
27
|
-
|
|
28
17
|
class WorkerProcess extends _events.EventEmitter {
|
|
29
18
|
constructor(pid, workerPath, debugMode, debugPort, name = null, npmGRootExecution = true) {
|
|
30
19
|
super();
|
|
@@ -42,7 +31,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
42
31
|
this._calls = {};
|
|
43
32
|
this._eventHandlers = {};
|
|
44
33
|
}
|
|
45
|
-
|
|
46
34
|
async start() {
|
|
47
35
|
const env = Object.assign(process.env, {
|
|
48
36
|
OX_WORKER: true,
|
|
@@ -56,17 +44,13 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
56
44
|
execArgv: [],
|
|
57
45
|
detached: false
|
|
58
46
|
};
|
|
59
|
-
|
|
60
47
|
if (this._debugPort) {
|
|
61
48
|
forkOpts.execArgv = Object.assign(forkOpts.execArgv, ['--inspect-brk=' + this._debugPort]);
|
|
62
49
|
}
|
|
63
|
-
|
|
64
50
|
forkOpts.execArgv.push('--trace-warnings');
|
|
65
|
-
|
|
66
51
|
if (this._npmGRootExecution) {
|
|
67
52
|
try {
|
|
68
53
|
let globalNpmModulesPath;
|
|
69
|
-
|
|
70
54
|
if (process.platform === 'darwin') {
|
|
71
55
|
await (() => {
|
|
72
56
|
return new Promise((resolve, reject) => {
|
|
@@ -78,7 +62,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
78
62
|
console.log('darwin npm root error:', err);
|
|
79
63
|
resolve();
|
|
80
64
|
}
|
|
81
|
-
|
|
82
65
|
if (stdout && stdout.toString) {
|
|
83
66
|
globalNpmModulesPath = stdout.toString().trim();
|
|
84
67
|
resolve();
|
|
@@ -91,12 +74,10 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
91
74
|
})();
|
|
92
75
|
} else {
|
|
93
76
|
const execResult = (0, _child_process.execSync)('npm root -g');
|
|
94
|
-
|
|
95
77
|
if (execResult && execResult.toString) {
|
|
96
78
|
globalNpmModulesPath = execResult.toString().trim();
|
|
97
79
|
}
|
|
98
80
|
}
|
|
99
|
-
|
|
100
81
|
if (globalNpmModulesPath && forkOpts && forkOpts.env) {
|
|
101
82
|
forkOpts.env.NODE_PATH = globalNpmModulesPath;
|
|
102
83
|
}
|
|
@@ -104,21 +85,16 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
104
85
|
console.log('npm root error:', e);
|
|
105
86
|
}
|
|
106
87
|
}
|
|
107
|
-
|
|
108
88
|
this._childProc = (0, _child_process.fork)(this._workerPath, forkOpts);
|
|
109
|
-
|
|
110
89
|
this._hookChildProcEvents();
|
|
111
|
-
|
|
112
90
|
this._isRunning = true;
|
|
113
91
|
return this._childProc;
|
|
114
92
|
}
|
|
115
|
-
|
|
116
93
|
async startDebugger() {
|
|
117
94
|
if (this._debugMode) {
|
|
118
95
|
await this._initializeDebugger();
|
|
119
96
|
}
|
|
120
97
|
}
|
|
121
|
-
|
|
122
98
|
async stop(status = null) {
|
|
123
99
|
if (this._isInitialized && this._childProc) {
|
|
124
100
|
if (this._debugger && this._debugger._paused) {
|
|
@@ -128,33 +104,26 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
128
104
|
await this._debugger.resumeTerminate();
|
|
129
105
|
}
|
|
130
106
|
}
|
|
131
|
-
|
|
132
107
|
await this.invoke('dispose', status);
|
|
133
108
|
await snooze(100);
|
|
134
109
|
} else if (this._childProc) {
|
|
135
110
|
await snooze(100);
|
|
136
111
|
}
|
|
137
|
-
|
|
138
112
|
if (this._debugger) {
|
|
139
113
|
await this._debugger.close();
|
|
140
114
|
}
|
|
141
|
-
|
|
142
115
|
this._send({
|
|
143
116
|
type: 'exit',
|
|
144
117
|
status: status
|
|
145
118
|
});
|
|
146
|
-
|
|
147
119
|
this.kill();
|
|
148
|
-
|
|
149
120
|
this._reset();
|
|
150
121
|
}
|
|
151
|
-
|
|
152
122
|
kill() {
|
|
153
123
|
if (this._childProc) {
|
|
154
124
|
this._childProc.kill('SIGINT');
|
|
155
125
|
}
|
|
156
126
|
}
|
|
157
|
-
|
|
158
127
|
async init(rid, options, caps) {
|
|
159
128
|
if (!this._isInitialized) {
|
|
160
129
|
const beforeTime = new Date().getTime();
|
|
@@ -163,125 +132,97 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
163
132
|
const duration = afterTime - beforeTime;
|
|
164
133
|
this._isInitialized = true;
|
|
165
134
|
let start = '';
|
|
166
|
-
|
|
167
135
|
if (this._name) {
|
|
168
136
|
start = this._name + ' ';
|
|
169
137
|
}
|
|
170
|
-
|
|
171
138
|
log.info(start + 'Worker initialized in ' + duration + ' ms');
|
|
172
139
|
}
|
|
173
140
|
}
|
|
174
|
-
|
|
175
141
|
async dispose(status = null) {
|
|
176
142
|
if (this._debugger) {
|
|
177
143
|
await this._debugger.close();
|
|
178
144
|
}
|
|
179
|
-
|
|
180
145
|
if (this._isInitialized && this._childProc) {
|
|
181
146
|
this._isInitialized = false;
|
|
182
147
|
await this.invoke('dispose', status);
|
|
183
|
-
|
|
184
148
|
this._send({
|
|
185
149
|
type: 'exit',
|
|
186
150
|
status: status
|
|
187
151
|
});
|
|
188
|
-
|
|
189
152
|
this.kill();
|
|
190
153
|
} else if (this._childProc) {
|
|
191
154
|
this._isInitialized = false;
|
|
192
|
-
|
|
193
155
|
this._send({
|
|
194
156
|
type: 'exit',
|
|
195
157
|
status: status
|
|
196
158
|
});
|
|
197
|
-
|
|
198
159
|
this.kill();
|
|
199
160
|
}
|
|
200
161
|
}
|
|
201
|
-
|
|
202
162
|
async disposeModules(status = null) {
|
|
203
163
|
if (this._debugger) {
|
|
204
164
|
await this._debugger.close();
|
|
205
165
|
}
|
|
206
|
-
|
|
207
166
|
if (this._childProc) {
|
|
208
167
|
await this.invoke('disposeModules', status);
|
|
209
168
|
}
|
|
210
169
|
}
|
|
211
|
-
|
|
212
170
|
get debugger() {
|
|
213
171
|
return this._debugger;
|
|
214
172
|
}
|
|
215
|
-
|
|
216
173
|
get isRunning() {
|
|
217
174
|
return this._isRunning;
|
|
218
175
|
}
|
|
219
|
-
|
|
220
176
|
get isInitialized() {
|
|
221
177
|
return this._isInitialized;
|
|
222
178
|
}
|
|
223
|
-
|
|
224
179
|
async run(runOpts) {
|
|
225
180
|
return await this.invoke('run', runOpts);
|
|
226
181
|
}
|
|
227
|
-
|
|
228
182
|
subscribe(eventName, handler) {
|
|
229
183
|
if (!this._eventHandlers[eventName] && typeof handler === 'function') {
|
|
230
184
|
this._eventHandlers[eventName] = handler;
|
|
231
|
-
|
|
232
185
|
this._send({
|
|
233
186
|
type: 'subscribe',
|
|
234
187
|
event: eventName
|
|
235
188
|
});
|
|
236
189
|
}
|
|
237
190
|
}
|
|
238
|
-
|
|
239
191
|
async invoke(method) {
|
|
240
192
|
let args = Array.prototype.slice.call(arguments);
|
|
241
|
-
|
|
242
193
|
if (args.length > 0) {
|
|
243
194
|
args.shift();
|
|
244
195
|
}
|
|
245
|
-
|
|
246
196
|
if (this._childProc) {
|
|
247
197
|
const callId = _util.default.generateUniqueId();
|
|
248
|
-
|
|
249
198
|
this._send({
|
|
250
199
|
type: 'invoke',
|
|
251
200
|
method: method,
|
|
252
201
|
callId: callId,
|
|
253
202
|
args: args
|
|
254
203
|
});
|
|
255
|
-
|
|
256
204
|
this._calls[callId] = (0, _when.defer)();
|
|
257
205
|
return this._calls[callId].promise;
|
|
258
206
|
}
|
|
259
207
|
}
|
|
260
|
-
|
|
261
208
|
async invokeTestHook(hookName, hookArgs) {
|
|
262
209
|
const callId = _util.default.generateUniqueId();
|
|
263
|
-
|
|
264
210
|
this._send({
|
|
265
211
|
type: 'invoke:hook',
|
|
266
212
|
method: hookName,
|
|
267
213
|
callId: callId,
|
|
268
214
|
args: hookArgs
|
|
269
215
|
});
|
|
270
|
-
|
|
271
216
|
this._calls[callId] = (0, _when.defer)();
|
|
272
217
|
return this._calls[callId].promise;
|
|
273
218
|
}
|
|
274
|
-
|
|
275
219
|
_send(message) {
|
|
276
220
|
if (!this._childProc) {
|
|
277
221
|
return false;
|
|
278
222
|
}
|
|
279
|
-
|
|
280
223
|
this._childProc.send(message);
|
|
281
|
-
|
|
282
224
|
return true;
|
|
283
225
|
}
|
|
284
|
-
|
|
285
226
|
_reset() {
|
|
286
227
|
this._childProc = null;
|
|
287
228
|
this._debugger = null;
|
|
@@ -293,43 +234,31 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
293
234
|
this._whenModulesDisposed = null;
|
|
294
235
|
this._isInitialized = false;
|
|
295
236
|
}
|
|
296
|
-
|
|
297
237
|
_hookChildProcEvents() {
|
|
298
238
|
if (!this._childProc) {
|
|
299
239
|
return;
|
|
300
240
|
}
|
|
301
|
-
|
|
302
241
|
this._childProc.on('message', this._handleChildMessage.bind(this));
|
|
303
|
-
|
|
304
242
|
this._childProc.on('error', this._handleChildError.bind(this));
|
|
305
|
-
|
|
306
243
|
this._childProc.on('exit', this._handleChildExit.bind(this));
|
|
307
|
-
|
|
308
244
|
this._childProc.on('disconnect', this._handleChildDisconnect.bind(this));
|
|
309
|
-
|
|
310
245
|
this._childProc.on('uncaughtException', this._handleChildUncaughtException.bind(this));
|
|
311
|
-
|
|
312
246
|
this._childProc.on('SIGINT', this._handleChildSigInt.bind(this));
|
|
313
247
|
}
|
|
314
|
-
|
|
315
248
|
_handleChildMessage(msg) {
|
|
316
249
|
if (msg.event) {
|
|
317
250
|
switch (msg.event) {
|
|
318
251
|
case 'invoke:result':
|
|
319
252
|
if (msg.callId && Object.prototype.hasOwnProperty.call(this._calls, msg.callId)) {
|
|
320
253
|
const promise = this._calls[msg.callId];
|
|
321
|
-
|
|
322
254
|
if (msg.error) {
|
|
323
255
|
promise.reject(msg.error);
|
|
324
256
|
} else {
|
|
325
257
|
promise.resolve(msg.retval);
|
|
326
258
|
}
|
|
327
|
-
|
|
328
259
|
delete this._calls[msg.callId];
|
|
329
260
|
}
|
|
330
|
-
|
|
331
261
|
break;
|
|
332
|
-
|
|
333
262
|
case 'reporter':
|
|
334
263
|
if (msg.method) {
|
|
335
264
|
this.emit('reporter', {
|
|
@@ -338,21 +267,16 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
338
267
|
args: msg.args
|
|
339
268
|
});
|
|
340
269
|
}
|
|
341
|
-
|
|
342
270
|
break;
|
|
343
|
-
|
|
344
271
|
case 'event':
|
|
345
272
|
this._handleWorkerEvent(msg.name, msg.args);
|
|
346
|
-
|
|
347
273
|
break;
|
|
348
274
|
}
|
|
349
275
|
}
|
|
350
|
-
|
|
351
276
|
this.emit('message', Object.assign(msg, {
|
|
352
277
|
pid: this._pid
|
|
353
278
|
}));
|
|
354
279
|
}
|
|
355
|
-
|
|
356
280
|
async _handleWorkerEvent(name, args) {
|
|
357
281
|
if (name && this._eventHandlers && this._eventHandlers[name]) {
|
|
358
282
|
try {
|
|
@@ -362,7 +286,6 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
362
286
|
}
|
|
363
287
|
}
|
|
364
288
|
}
|
|
365
|
-
|
|
366
289
|
_handleChildError(error) {
|
|
367
290
|
log.debug(`Worker ${this._pid} thrown an error: ${error}.`);
|
|
368
291
|
this.emit('error', Object.assign({
|
|
@@ -371,28 +294,21 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
371
294
|
pid: this._pid
|
|
372
295
|
}));
|
|
373
296
|
}
|
|
374
|
-
|
|
375
297
|
_handleChildExit(exitCode, signal) {
|
|
376
298
|
log.debug(`Worker ${this._pid} finished with exit code ${exitCode} and signal ${signal}.`);
|
|
377
|
-
|
|
378
299
|
this._reset();
|
|
379
|
-
|
|
380
300
|
this.emit('exit', {
|
|
381
301
|
pid: this._pid,
|
|
382
302
|
exitCode,
|
|
383
303
|
signal
|
|
384
304
|
});
|
|
385
305
|
}
|
|
386
|
-
|
|
387
306
|
_handleChildDisconnect() {
|
|
388
307
|
log.debug(`Worker ${this._pid} disconnected.`);
|
|
389
308
|
}
|
|
390
|
-
|
|
391
309
|
_handleChildUncaughtException(error) {
|
|
392
310
|
log.debug(`Worker ${this._pid} thrown an uncaught error: ${error}.`);
|
|
393
|
-
|
|
394
311
|
this._reset();
|
|
395
|
-
|
|
396
312
|
this.emit('error', Object.assign({
|
|
397
313
|
error: error
|
|
398
314
|
}, {
|
|
@@ -403,50 +319,39 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
403
319
|
exitCode: 1
|
|
404
320
|
});
|
|
405
321
|
}
|
|
406
|
-
|
|
407
322
|
_handleChildSigInt() {
|
|
408
323
|
log.debug(`Worker ${this._pid} received SIGINT signal.`);
|
|
409
324
|
}
|
|
410
|
-
|
|
411
325
|
async _initializeDebugger() {
|
|
412
326
|
this._debugger = new _debugger.default(this._pid);
|
|
413
327
|
let whenDebuggerReady = (0, _when.defer)();
|
|
414
|
-
|
|
415
328
|
const _this = this;
|
|
416
|
-
|
|
417
329
|
this._debugger.on('ready', function (err) {
|
|
418
330
|
if (_this._debugger && _this._debugger.continue) {
|
|
419
331
|
_this._debugger.continue();
|
|
420
332
|
}
|
|
421
|
-
|
|
422
333
|
whenDebuggerReady.resolve();
|
|
423
334
|
});
|
|
424
|
-
|
|
425
335
|
this._debugger.on('error', function (err) {
|
|
426
336
|
log.error('debugger on error :', err);
|
|
427
337
|
this.emit('debugger:error', Object.assign(err, {
|
|
428
338
|
pid: this._pid
|
|
429
339
|
}));
|
|
430
|
-
|
|
431
340
|
if (!whenDebuggerReady.isResolved) {
|
|
432
341
|
whenDebuggerReady.reject(err.message);
|
|
433
342
|
}
|
|
434
343
|
});
|
|
435
|
-
|
|
436
344
|
this._debugger.on('break', function (breakpointData) {
|
|
437
345
|
this.emit('debugger:break', breakpointData);
|
|
438
346
|
});
|
|
439
|
-
|
|
440
347
|
this._debugger.on('breakError', async function (breakError) {
|
|
441
348
|
if (breakError && breakError.message) {
|
|
442
349
|
if (_this._breakpointErrors.includes(breakError.message)) {} else {
|
|
443
350
|
_this._breakpointErrors.push(breakError.message);
|
|
444
|
-
|
|
445
351
|
this.emit('debugger:breakError', breakError);
|
|
446
352
|
}
|
|
447
353
|
}
|
|
448
354
|
});
|
|
449
|
-
|
|
450
355
|
try {
|
|
451
356
|
log.info(`Connecting to debugger on port ${this._debugPort}...`);
|
|
452
357
|
await this._debugger.connect(this._debugPort, '127.0.0.1');
|
|
@@ -455,11 +360,8 @@ class WorkerProcess extends _events.EventEmitter {
|
|
|
455
360
|
const message = 'Cannot connect to the debugger: ' + e.message;
|
|
456
361
|
whenDebuggerReady.reject(message);
|
|
457
362
|
}
|
|
458
|
-
|
|
459
363
|
return whenDebuggerReady.promise;
|
|
460
364
|
}
|
|
461
|
-
|
|
462
365
|
}
|
|
463
|
-
|
|
464
366
|
exports.default = WorkerProcess;
|
|
465
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwibmFtZXMiOlsibG9nIiwic25vb3plIiwibXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNldFRpbWVvdXQiLCJXb3JrZXJQcm9jZXNzIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJwaWQiLCJ3b3JrZXJQYXRoIiwiZGVidWdNb2RlIiwiZGVidWdQb3J0IiwibmFtZSIsIm5wbUdSb290RXhlY3V0aW9uIiwiX25hbWUiLCJfaXNSdW5uaW5nIiwiX2lzSW5pdGlhbGl6ZWQiLCJfc3RvcHBlZEJ5VXNlciIsIl9waWQiLCJfY2hpbGRQcm9jIiwiX2RlYnVnTW9kZSIsIl9kZWJ1Z1BvcnQiLCJfd29ya2VyUGF0aCIsIl9ucG1HUm9vdEV4ZWN1dGlvbiIsIl9icmVha3BvaW50RXJyb3JzIiwiX2NhbGxzIiwiX2V2ZW50SGFuZGxlcnMiLCJzdGFydCIsImVudiIsIk9iamVjdCIsImFzc2lnbiIsInByb2Nlc3MiLCJPWF9XT1JLRVIiLCJERUJVRyIsImlzTmFOIiwiTk9fVVBEQVRFX05PVElGSUVSIiwiaW5mbyIsImZvcmtPcHRzIiwiY3dkIiwiZXhlY0FyZ3YiLCJkZXRhY2hlZCIsInB1c2giLCJnbG9iYWxOcG1Nb2R1bGVzUGF0aCIsInBsYXRmb3JtIiwicmVqZWN0IiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiTk9ERV9QQVRIIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3AiLCJzdGF0dXMiLCJfZGVidWdnZXIiLCJfcGF1c2VkIiwiZGlzYWJsZSIsInJlc3VtZVRlcm1pbmF0ZSIsImludm9rZSIsImNsb3NlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXQiLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwiZGlzcG9zZSIsImRpc3Bvc2VNb2R1bGVzIiwiZGVidWdnZXIiLCJpc1J1bm5pbmciLCJpc0luaXRpYWxpemVkIiwicnVuIiwicnVuT3B0cyIsInN1YnNjcmliZSIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJldmVudCIsIm1ldGhvZCIsImFyZ3MiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNoaWZ0IiwiY2FsbElkIiwib3h1dGlsIiwiZ2VuZXJhdGVVbmlxdWVJZCIsInByb21pc2UiLCJpbnZva2VUZXN0SG9vayIsImhvb2tOYW1lIiwiaG9va0FyZ3MiLCJtZXNzYWdlIiwic2VuZCIsIl93aGVuT3h5Z2VuRGlzcG9zZWQiLCJfd2hlbk94eWdlbkluaXRpYWxpemVkIiwiX3doZW5Nb2R1bGVzRGlzcG9zZWQiLCJvbiIsIl9oYW5kbGVDaGlsZE1lc3NhZ2UiLCJiaW5kIiwiX2hhbmRsZUNoaWxkRXJyb3IiLCJfaGFuZGxlQ2hpbGRFeGl0IiwiX2hhbmRsZUNoaWxkRGlzY29ubmVjdCIsIl9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uIiwiX2hhbmRsZUNoaWxkU2lnSW50IiwibXNnIiwiaGFzT3duUHJvcGVydHkiLCJlcnJvciIsInJldHZhbCIsImVtaXQiLCJfaGFuZGxlV29ya2VyRXZlbnQiLCJhcHBseSIsInVuZGVmaW5lZCIsImRlYnVnIiwiZXhpdENvZGUiLCJzaWduYWwiLCJEZWJ1Z2dlciIsIndoZW5EZWJ1Z2dlclJlYWR5IiwiX3RoaXMiLCJjb250aW51ZSIsImlzUmVzb2x2ZWQiLCJicmVha3BvaW50RGF0YSIsImJyZWFrRXJyb3IiLCJpbmNsdWRlcyIsImNvbm5lY3QiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUdBOztBQUdBOztBQUNBOzs7O0FBSEEsTUFBTUEsR0FBRyxHQUFHLHFCQUFPLGVBQVAsQ0FBWjs7QUFNQSxN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QUFBQSxpQkFBaUIsQ0FBQ3JGLE1BQWxCLENBQXlCNEQsT0FBekI7QUFDSDs7QUFFRCxXQUFPeUIsaUJBQWlCLENBQUM3QixPQUF6QjtBQUNIOztBQTlYbUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JrLCBleGVjU3luYywgZXhlYyB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xyXG5pbXBvcnQgeyBFdmVudEVtaXR0ZXIgfSBmcm9tICdldmVudHMnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gc2V0dXAgbG9nZ2VyXHJcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi4vbGliL2xvZ2dlcic7XHJcbmNvbnN0IGxvZyA9IGxvZ2dlcignV29ya2VyUHJvY2VzcycpO1xyXG5cclxuaW1wb3J0IERlYnVnZ2VyIGZyb20gJy4uL2xpYi9kZWJ1Z2dlcic7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxuLy8gc25vb3plIGZ1bmN0aW9uIC0gYXN5bmMgd3JhcHBlciBhcm91bmQgc2V0VGltZW91dCBmdW5jdGlvblxyXG5jb25zdCBzbm9vemUgPSBtcyA9PiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcclxuXHJcbi8qKlxyXG4gKiBXb3JrZXJQcm9jZXNzIHJlc3BvbnNpYmxlIGZvciBzcGF3bmluZyBhIHdvcmtlciBwcm9jZXNzIHRoZSB0ZXN0IGluc3RhbmNlLlxyXG4gKi9cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgV29ya2VyUHJvY2VzcyBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihwaWQsIHdvcmtlclBhdGgsIGRlYnVnTW9kZSwgZGVidWdQb3J0LCBuYW1lID0gbnVsbCwgbnBtR1Jvb3RFeGVjdXRpb24gPSB0cnVlKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTtcclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc3RvcHBlZEJ5VXNlciA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcGlkID0gcGlkO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gZGVidWdNb2RlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnUG9ydCA9IGRlYnVnUG9ydDtcclxuICAgICAgICB0aGlzLl93b3JrZXJQYXRoID0gd29ya2VyUGF0aDtcclxuICAgICAgICB0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbiA9IG5wbUdSb290RXhlY3V0aW9uO1xyXG4gICAgICAgIHRoaXMuX2JyZWFrcG9pbnRFcnJvcnMgPSBbXTtcclxuICAgICAgICAvLyBob2xkIHRoZSByZW1vdGUgaW52b2NhdGlvbiBwcm9taXNlXHJcbiAgICAgICAgdGhpcy5fY2FsbHMgPSB7fTtcclxuICAgICAgICB0aGlzLl9ldmVudEhhbmRsZXJzID0ge307XHJcbiAgICB9XHJcbiAgICBhc3luYyBzdGFydCgpIHtcclxuICAgICAgICBjb25zdCBlbnYgPSBPYmplY3QuYXNzaWduKHByb2Nlc3MuZW52LCB7XHJcbiAgICAgICAgICAgIE9YX1dPUktFUjogdHJ1ZSxcclxuICAgICAgICAgICAgREVCVUc6ICFpc05hTih0aGlzLl9kZWJ1Z1BvcnQpLFxyXG4gICAgICAgICAgICBOT19VUERBVEVfTk9USUZJRVI6IHRydWVcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbG9nLmluZm8oYFN0YXJ0aW5nIHdvcmtlciBwcm9jZXNzICR7dGhpcy5fcGlkfS5gKTtcclxuICAgICAgICBsZXQgZm9ya09wdHMgPSB7XHJcbiAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcclxuICAgICAgICAgICAgZW52LFxyXG4gICAgICAgICAgICBleGVjQXJndjogW10sXHJcbiAgICAgICAgICAgIGRldGFjaGVkOiBmYWxzZSxcclxuICAgICAgICAgICAgLy9zaWxlbnQ6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdQb3J0KSB7XHJcbiAgICAgICAgICAgIC8vIGFkZCAtLWluc3BlY3QtYnJrIGFyZ3VtZW50IGlmIGRlYnVnIHBvcnQgaXMgc3BlY2lmaWVkXHJcbiAgICAgICAgICAgIGZvcmtPcHRzLmV4ZWNBcmd2ID0gT2JqZWN0LmFzc2lnbihmb3JrT3B0cy5leGVjQXJndiwgWyctLWluc3BlY3QtYnJrPScgKyB0aGlzLl9kZWJ1Z1BvcnRdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIHByaW50IG1vcmUgaW5mb3JtYXRpb24gZm9yIG5vZGVqcyBlcnJvcnNcclxuICAgICAgICBmb3JrT3B0cy5leGVjQXJndi5wdXNoKCctLXRyYWNlLXdhcm5pbmdzJyk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLl9ucG1HUm9vdEV4ZWN1dGlvbikge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgbGV0IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ25wbSByb290IC1nJywge2N3ZDogcHJvY2Vzcy5jd2QoKX0sIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnZGFyd2luIG5wbSByb290IGVycm9yOicsIGVycik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZG91dCAmJiBzdGRvdXQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gc3Rkb3V0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KSgpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGVjUmVzdWx0ID0gZXhlY1N5bmMoJ25wbSByb290IC1nJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChleGVjUmVzdWx0ICYmIGV4ZWNSZXN1bHQudG9TdHJpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggPSBleGVjUmVzdWx0LnRvU3RyaW5nKCkudHJpbSgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsTnBtTW9kdWxlc1BhdGggJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cyAmJlxyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudlxyXG4gICAgICAgICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMuZW52Lk5PREVfUEFUSCA9IGdsb2JhbE5wbU1vZHVsZXNQYXRoO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnbnBtIHJvb3QgZXJyb3I6JywgZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGZvcmsgd29ya2VyXHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gZm9yayh0aGlzLl93b3JrZXJQYXRoLCBmb3JrT3B0cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2hvb2tDaGlsZFByb2NFdmVudHMoKTtcclxuICAgICAgICAvLyBpZiB3ZSBhcmUgaW4gZGVidWcgbW9kZSwgaW5pdGlhbGl6ZSBkZWJ1Z2dlciBhbmQgb25seSB0aGVuIHN0YXJ0IG1vZHVsZXMgJ2luaXQnXHJcblxyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUHJvYztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydERlYnVnZ2VyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z01vZGUpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5faW5pdGlhbGl6ZURlYnVnZ2VyKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHN0b3Aoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIgJiYgdGhpcy5fZGVidWdnZXIuX3BhdXNlZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCdDQU5DRUxFRCcgPT09IHN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmRpc2FibGUoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIucmVzdW1lVGVybWluYXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCBzbm9vemUoMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLmtpbGwoKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGtpbGwoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9jaGlsZFByb2Mua2lsbCgnU0lHSU5UJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQocmlkLCBvcHRpb25zLCBjYXBzKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGJlZm9yZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2luaXQnLCByaWQsIG9wdGlvbnMsIGNhcHMpO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYWZ0ZXJUaW1lIC0gYmVmb3JlVGltZTtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBzdGFydCA9ICcnO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fbmFtZSkge1xyXG4gICAgICAgICAgICAgICAgc3RhcnQgPSB0aGlzLl9uYW1lKycgJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsb2cuaW5mbyhzdGFydCsnV29ya2VyIGluaXRpYWxpemVkIGluICcgKyBkdXJhdGlvbiArICcgbXMnKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9pc0luaXRpYWxpemVkICYmIHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZScsIHN0YXR1cyk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2V4aXQnLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmtpbGwoKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2VNb2R1bGVzKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdnZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZGVidWdnZXIuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2NoaWxkUHJvYykge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmludm9rZSgnZGlzcG9zZU1vZHVsZXMnLCBzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZGVidWdnZXIgKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9kZWJ1Z2dlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNSdW5uaW5nICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNSdW5uaW5nO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9pc0luaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJ1bihydW5PcHRzKSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuaW52b2tlKCdydW4nLCBydW5PcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdWJzY3JpYmUoZXZlbnROYW1lLCBoYW5kbGVyKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9ldmVudEhhbmRsZXJzW2V2ZW50TmFtZV0gJiYgdHlwZW9mIGhhbmRsZXIgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdID0gaGFuZGxlcjtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3Vic2NyaWJlJyxcclxuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbnZva2UobWV0aG9kKSB7XHJcbiAgICAgICAgbGV0IGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xyXG4gICAgICAgIC8vIGlnbm9yZSBmaXJzdCBhcmd1bWVudCAtIGUuZy4gbWV0aG9kXHJcbiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBhcmdzLnNoaWZ0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnaW52b2tlJyxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgICAgICBhcmdzOiBhcmdzXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9jYWxsc1tjYWxsSWRdID0gZGVmZXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlVGVzdEhvb2soaG9va05hbWUsIGhvb2tBcmdzKSB7XHJcbiAgICAgICAgY29uc3QgY2FsbElkID0gb3h1dGlsLmdlbmVyYXRlVW5pcXVlSWQoKTtcclxuICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgdHlwZTogJ2ludm9rZTpob29rJyxcclxuICAgICAgICAgICAgbWV0aG9kOiBob29rTmFtZSxcclxuICAgICAgICAgICAgY2FsbElkOiBjYWxsSWQsXHJcbiAgICAgICAgICAgIGFyZ3M6IGhvb2tBcmdzXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGxzW2NhbGxJZF0ucHJvbWlzZTtcclxuICAgIH1cclxuXHJcbiAgICBfc2VuZChtZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Muc2VuZChtZXNzYWdlKTtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzZXQoKSB7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZGVidWdNb2RlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5EaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk94eWdlbkluaXRpYWxpemVkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuTW9kdWxlc0Rpc3Bvc2VkID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX2hvb2tDaGlsZFByb2NFdmVudHMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ21lc3NhZ2UnLCB0aGlzLl9oYW5kbGVDaGlsZE1lc3NhZ2UuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdlcnJvcicsIHRoaXMuX2hhbmRsZUNoaWxkRXJyb3IuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdleGl0JywgdGhpcy5faGFuZGxlQ2hpbGRFeGl0LmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZGlzY29ubmVjdCcsIHRoaXMuX2hhbmRsZUNoaWxkRGlzY29ubmVjdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy5faGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbi5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ1NJR0lOVCcsIHRoaXMuX2hhbmRsZUNoaWxkU2lnSW50LmJpbmQodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZE1lc3NhZ2UobXNnKSB7XHJcbiAgICAgICAgaWYgKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG1zZy5ldmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnaW52b2tlOnJlc3VsdCc6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jYWxsSWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2NhbGxzLCBtc2cuY2FsbElkKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gdGhpcy5fY2FsbHNbbXNnLmNhbGxJZF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZXJyb3IpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2UucmVqZWN0KG1zZy5lcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlc29sdmUobXNnLnJldHZhbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgJ3JlcG9ydGVyJzpcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLm1ldGhvZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlcG9ydGVyJywgeyBwaWQ6IHRoaXMuX3BpZCwgbWV0aG9kOiBtc2cubWV0aG9kLCBhcmdzOiBtc2cuYXJncyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdldmVudCc6XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlV29ya2VyRXZlbnQobXNnLm5hbWUsIG1zZy5hcmdzKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVtaXQoJ21lc3NhZ2UnLCBPYmplY3QuYXNzaWduKG1zZywgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2hhbmRsZVdvcmtlckV2ZW50KG5hbWUsIGFyZ3MpIHtcclxuICAgICAgICBpZiAobmFtZSAmJiB0aGlzLl9ldmVudEhhbmRsZXJzICYmIHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2V2ZW50SGFuZGxlcnNbbmFtZV0uYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB0aHJvd24gYnkgd29ya2VyIGV2ZW50IGhhbmRsZXIgXCIke25hbWV9OicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEVycm9yKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZEV4aXQoZXhpdENvZGUsIHNpZ25hbCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSBmaW5pc2hlZCB3aXRoIGV4aXQgY29kZSAke2V4aXRDb2RlfSBhbmQgc2lnbmFsICR7c2lnbmFsfS5gKTtcclxuICAgICAgICB0aGlzLl9yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlLCBzaWduYWwgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkRGlzY29ubmVjdCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZGlzY29ubmVjdGVkLmApO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFVuY2F1Z2h0RXhjZXB0aW9uKGVycm9yKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IHRocm93biBhbiB1bmNhdWdodCBlcnJvcjogJHtlcnJvcn0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgT2JqZWN0LmFzc2lnbih7IGVycm9yIDogZXJyb3IgfSwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdleGl0JywgeyBwaWQ6IHRoaXMuX3BpZCwgZXhpdENvZGU6IDEgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgX2hhbmRsZUNoaWxkU2lnSW50KCkge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSByZWNlaXZlZCBTSUdJTlQgc2lnbmFsLmApO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9pbml0aWFsaXplRGVidWdnZXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBuZXcgRGVidWdnZXIodGhpcy5fcGlkKTtcclxuICAgICAgICBsZXQgd2hlbkRlYnVnZ2VyUmVhZHkgPSBkZWZlcigpO1xyXG4gICAgICAgIGNvbnN0IF90aGlzID0gdGhpcztcclxuICAgICAgICAvLyBoYW5kbGUgZGVidWdnZXIgZXZlbnRzXHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ3JlYWR5JywgZnVuY3Rpb24oZXJyKSB7XHJcbiAgICAgICAgICAgIC8vIHJlc3VtZSB0aGUgZmlyc3QgYnJlYWtwb2ludCB3aGljaCBpcyBhdXRvbWF0aWNhbGx5IGFkZGVkIGJ5IHRoZSBkZWJ1Z2dlclxyXG4gICAgICAgICAgICBpZiAoX3RoaXMuX2RlYnVnZ2VyICYmIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSkge1xyXG4gICAgICAgICAgICAgICAgX3RoaXMuX2RlYnVnZ2VyLmNvbnRpbnVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVzb2x2ZSgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdlcnJvcicsIGZ1bmN0aW9uKGVycikge1xyXG5cclxuICAgICAgICAgICAgbG9nLmVycm9yKCdkZWJ1Z2dlciBvbiBlcnJvciA6JywgZXJyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6ZXJyb3InLCBPYmplY3QuYXNzaWduKGVyciwgeyBwaWQ6IHRoaXMuX3BpZCB9KSk7XHJcbiAgICAgICAgICAgIC8vIHJlamVjdCB0aGUgcHJvbWlzZSBvbmx5IGlmIHdlIGdvdCBhbiBlcnJvciByaWdodCBhZnRlciBfZGVidWdnZXIuY29ubmVjdCgpIGNhbGwgYmVsb3cgLSB3ZSBuZWVkIHRoaXMgdG8gaW5kaWNhdGUgZGVidWdnZXIgaW5pdGlhbGl6YXRpb24gZXJyb3JcclxuICAgICAgICAgICAgaWYgKCF3aGVuRGVidWdnZXJSZWFkeS5pc1Jlc29sdmVkKSB7XHJcbiAgICAgICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QoZXJyLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrJywgZnVuY3Rpb24oYnJlYWtwb2ludERhdGEpIHtcclxuICAgICAgICAgICAgdGhpcy5lbWl0KCdkZWJ1Z2dlcjpicmVhaycsIGJyZWFrcG9pbnREYXRhKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignYnJlYWtFcnJvcicsIGFzeW5jIGZ1bmN0aW9uKGJyZWFrRXJyb3IpIHtcclxuXHJcbiAgICAgICAgICAgIGlmIChicmVha0Vycm9yICYmIGJyZWFrRXJyb3IubWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKF90aGlzLl9icmVha3BvaW50RXJyb3JzLmluY2x1ZGVzKGJyZWFrRXJyb3IubWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2JyZWFrcG9pbnRFcnJvcnMucHVzaChicmVha0Vycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWtFcnJvcicsIGJyZWFrRXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGxvZy5pbmZvKGBDb25uZWN0aW5nIHRvIGRlYnVnZ2VyIG9uIHBvcnQgJHt0aGlzLl9kZWJ1Z1BvcnR9Li4uYCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNvbm5lY3QodGhpcy5fZGVidWdQb3J0LCAnMTI3LjAuMC4xJyk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBsb2cuZXJyb3IoJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJywgZSk7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSAnQ2Fubm90IGNvbm5lY3QgdG8gdGhlIGRlYnVnZ2VyOiAnICsgZS5tZXNzYWdlO1xyXG4gICAgICAgICAgICB3aGVuRGVidWdnZXJSZWFkeS5yZWplY3QobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gd2hlbkRlYnVnZ2VyUmVhZHkucHJvbWlzZTtcclxuICAgIH1cclxufSJdfQ==
|
|
367
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJzbm9vemUiLCJtcyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsIldvcmtlclByb2Nlc3MiLCJFdmVudEVtaXR0ZXIiLCJjb25zdHJ1Y3RvciIsInBpZCIsIndvcmtlclBhdGgiLCJkZWJ1Z01vZGUiLCJkZWJ1Z1BvcnQiLCJuYW1lIiwibnBtR1Jvb3RFeGVjdXRpb24iLCJfbmFtZSIsIl9pc1J1bm5pbmciLCJfaXNJbml0aWFsaXplZCIsIl9zdG9wcGVkQnlVc2VyIiwiX3BpZCIsIl9jaGlsZFByb2MiLCJfZGVidWdNb2RlIiwiX2RlYnVnUG9ydCIsIl93b3JrZXJQYXRoIiwiX25wbUdSb290RXhlY3V0aW9uIiwiX2JyZWFrcG9pbnRFcnJvcnMiLCJfY2FsbHMiLCJfZXZlbnRIYW5kbGVycyIsInN0YXJ0IiwiZW52IiwiT2JqZWN0IiwiYXNzaWduIiwicHJvY2VzcyIsIk9YX1dPUktFUiIsIkRFQlVHIiwiaXNOYU4iLCJOT19VUERBVEVfTk9USUZJRVIiLCJpbmZvIiwiZm9ya09wdHMiLCJjd2QiLCJleGVjQXJndiIsImRldGFjaGVkIiwicHVzaCIsImdsb2JhbE5wbU1vZHVsZXNQYXRoIiwicGxhdGZvcm0iLCJyZWplY3QiLCJleGVjIiwiZXJyIiwic3Rkb3V0IiwiY29uc29sZSIsInRvU3RyaW5nIiwidHJpbSIsImUiLCJleGVjUmVzdWx0IiwiZXhlY1N5bmMiLCJOT0RFX1BBVEgiLCJmb3JrIiwiX2hvb2tDaGlsZFByb2NFdmVudHMiLCJzdGFydERlYnVnZ2VyIiwiX2luaXRpYWxpemVEZWJ1Z2dlciIsInN0b3AiLCJzdGF0dXMiLCJfZGVidWdnZXIiLCJfcGF1c2VkIiwiZGlzYWJsZSIsInJlc3VtZVRlcm1pbmF0ZSIsImludm9rZSIsImNsb3NlIiwiX3NlbmQiLCJ0eXBlIiwia2lsbCIsIl9yZXNldCIsImluaXQiLCJyaWQiLCJvcHRpb25zIiwiY2FwcyIsImJlZm9yZVRpbWUiLCJEYXRlIiwiZ2V0VGltZSIsImFmdGVyVGltZSIsImR1cmF0aW9uIiwiZGlzcG9zZSIsImRpc3Bvc2VNb2R1bGVzIiwiZGVidWdnZXIiLCJpc1J1bm5pbmciLCJpc0luaXRpYWxpemVkIiwicnVuIiwicnVuT3B0cyIsInN1YnNjcmliZSIsImV2ZW50TmFtZSIsImhhbmRsZXIiLCJldmVudCIsIm1ldGhvZCIsImFyZ3MiLCJBcnJheSIsInByb3RvdHlwZSIsInNsaWNlIiwiY2FsbCIsImFyZ3VtZW50cyIsImxlbmd0aCIsInNoaWZ0IiwiY2FsbElkIiwib3h1dGlsIiwiZ2VuZXJhdGVVbmlxdWVJZCIsImRlZmVyIiwicHJvbWlzZSIsImludm9rZVRlc3RIb29rIiwiaG9va05hbWUiLCJob29rQXJncyIsIm1lc3NhZ2UiLCJzZW5kIiwiX3doZW5PeHlnZW5EaXNwb3NlZCIsIl93aGVuT3h5Z2VuSW5pdGlhbGl6ZWQiLCJfd2hlbk1vZHVsZXNEaXNwb3NlZCIsIm9uIiwiX2hhbmRsZUNoaWxkTWVzc2FnZSIsImJpbmQiLCJfaGFuZGxlQ2hpbGRFcnJvciIsIl9oYW5kbGVDaGlsZEV4aXQiLCJfaGFuZGxlQ2hpbGREaXNjb25uZWN0IiwiX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24iLCJfaGFuZGxlQ2hpbGRTaWdJbnQiLCJtc2ciLCJoYXNPd25Qcm9wZXJ0eSIsImVycm9yIiwicmV0dmFsIiwiZW1pdCIsIl9oYW5kbGVXb3JrZXJFdmVudCIsImFwcGx5IiwidW5kZWZpbmVkIiwiZGVidWciLCJleGl0Q29kZSIsInNpZ25hbCIsIkRlYnVnZ2VyIiwid2hlbkRlYnVnZ2VyUmVhZHkiLCJfdGhpcyIsImNvbnRpbnVlIiwiaXNSZXNvbHZlZCIsImJyZWFrcG9pbnREYXRhIiwiYnJlYWtFcnJvciIsImluY2x1ZGVzIiwiY29ubmVjdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW5uZXJzL1dvcmtlclByb2Nlc3MuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZm9yaywgZXhlY1N5bmMsIGV4ZWMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuaW1wb3J0IHsgZGVmZXIgfSBmcm9tICd3aGVuJztcclxuXHJcbi8vIHNldHVwIGxvZ2dlclxyXG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4uL2xpYi9sb2dnZXInO1xyXG5jb25zdCBsb2cgPSBsb2dnZXIoJ1dvcmtlclByb2Nlc3MnKTtcclxuXHJcbmltcG9ydCBEZWJ1Z2dlciBmcm9tICcuLi9saWIvZGVidWdnZXInO1xyXG5pbXBvcnQgb3h1dGlsIGZyb20gJy4uL2xpYi91dGlsJztcclxuXHJcbi8vIHNub296ZSBmdW5jdGlvbiAtIGFzeW5jIHdyYXBwZXIgYXJvdW5kIHNldFRpbWVvdXQgZnVuY3Rpb25cclxuY29uc3Qgc25vb3plID0gbXMgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XHJcblxyXG4vKipcclxuICogV29ya2VyUHJvY2VzcyByZXNwb25zaWJsZSBmb3Igc3Bhd25pbmcgYSB3b3JrZXIgcHJvY2VzcyB0aGUgdGVzdCBpbnN0YW5jZS5cclxuICovXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdvcmtlclByb2Nlc3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3IocGlkLCB3b3JrZXJQYXRoLCBkZWJ1Z01vZGUsIGRlYnVnUG9ydCwgbmFtZSA9IG51bGwsIG5wbUdSb290RXhlY3V0aW9uID0gdHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7XHJcbiAgICAgICAgdGhpcy5faXNSdW5uaW5nID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3N0b3BwZWRCeVVzZXIgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3BpZCA9IHBpZDtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2MgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IGRlYnVnTW9kZTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z1BvcnQgPSBkZWJ1Z1BvcnQ7XHJcbiAgICAgICAgdGhpcy5fd29ya2VyUGF0aCA9IHdvcmtlclBhdGg7XHJcbiAgICAgICAgdGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24gPSBucG1HUm9vdEV4ZWN1dGlvbjtcclxuICAgICAgICB0aGlzLl9icmVha3BvaW50RXJyb3JzID0gW107XHJcbiAgICAgICAgLy8gaG9sZCB0aGUgcmVtb3RlIGludm9jYXRpb24gcHJvbWlzZVxyXG4gICAgICAgIHRoaXMuX2NhbGxzID0ge307XHJcbiAgICAgICAgdGhpcy5fZXZlbnRIYW5kbGVycyA9IHt9O1xyXG4gICAgfVxyXG4gICAgYXN5bmMgc3RhcnQoKSB7XHJcbiAgICAgICAgY29uc3QgZW52ID0gT2JqZWN0LmFzc2lnbihwcm9jZXNzLmVudiwge1xyXG4gICAgICAgICAgICBPWF9XT1JLRVI6IHRydWUsXHJcbiAgICAgICAgICAgIERFQlVHOiAhaXNOYU4odGhpcy5fZGVidWdQb3J0KSxcclxuICAgICAgICAgICAgTk9fVVBEQVRFX05PVElGSUVSOiB0cnVlXHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxvZy5pbmZvKGBTdGFydGluZyB3b3JrZXIgcHJvY2VzcyAke3RoaXMuX3BpZH0uYCk7XHJcbiAgICAgICAgbGV0IGZvcmtPcHRzID0ge1xyXG4gICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXHJcbiAgICAgICAgICAgIGVudixcclxuICAgICAgICAgICAgZXhlY0FyZ3Y6IFtdLFxyXG4gICAgICAgICAgICBkZXRhY2hlZDogZmFsc2UsXHJcbiAgICAgICAgICAgIC8vc2lsZW50OiBmYWxzZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnUG9ydCkge1xyXG4gICAgICAgICAgICAvLyBhZGQgLS1pbnNwZWN0LWJyayBhcmd1bWVudCBpZiBkZWJ1ZyBwb3J0IGlzIHNwZWNpZmllZFxyXG4gICAgICAgICAgICBmb3JrT3B0cy5leGVjQXJndiA9IE9iamVjdC5hc3NpZ24oZm9ya09wdHMuZXhlY0FyZ3YsIFsnLS1pbnNwZWN0LWJyaz0nICsgdGhpcy5fZGVidWdQb3J0XSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBwcmludCBtb3JlIGluZm9ybWF0aW9uIGZvciBub2RlanMgZXJyb3JzXHJcbiAgICAgICAgZm9ya09wdHMuZXhlY0FyZ3YucHVzaCgnLS10cmFjZS13YXJuaW5ncycpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fbnBtR1Jvb3RFeGVjdXRpb24pIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGxldCBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjKCducG0gcm9vdCAtZycsIHtjd2Q6IHByb2Nlc3MuY3dkKCl9LCBmdW5jdGlvbiAoZXJyLCBzdGRvdXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2RhcndpbiBucG0gcm9vdCBlcnJvcjonLCBlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGRvdXQgJiYgc3Rkb3V0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxOcG1Nb2R1bGVzUGF0aCA9IHN0ZG91dC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhlY1Jlc3VsdCA9IGV4ZWNTeW5jKCducG0gcm9vdCAtZycpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoZXhlY1Jlc3VsdCAmJiBleGVjUmVzdWx0LnRvU3RyaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoID0gZXhlY1Jlc3VsdC50b1N0cmluZygpLnRyaW0oKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGdsb2JhbE5wbU1vZHVsZXNQYXRoICYmXHJcbiAgICAgICAgICAgICAgICAgICAgZm9ya09wdHMgJiZcclxuICAgICAgICAgICAgICAgICAgICBmb3JrT3B0cy5lbnZcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvcmtPcHRzLmVudi5OT0RFX1BBVEggPSBnbG9iYWxOcG1Nb2R1bGVzUGF0aDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ25wbSByb290IGVycm9yOicsIGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBmb3JrIHdvcmtlclxyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IGZvcmsodGhpcy5fd29ya2VyUGF0aCwgZm9ya09wdHMpO1xyXG5cclxuICAgICAgICB0aGlzLl9ob29rQ2hpbGRQcm9jRXZlbnRzKCk7XHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIGluIGRlYnVnIG1vZGUsIGluaXRpYWxpemUgZGVidWdnZXIgYW5kIG9ubHkgdGhlbiBzdGFydCBtb2R1bGVzICdpbml0J1xyXG5cclxuICAgICAgICB0aGlzLl9pc1J1bm5pbmcgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFByb2M7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnREZWJ1Z2dlcigpIHtcclxuICAgICAgICBpZiAodGhpcy5fZGVidWdNb2RlKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2luaXRpYWxpemVEZWJ1Z2dlcigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdG9wKHN0YXR1cyA9IG51bGwpIHtcclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyICYmIHRoaXMuX2RlYnVnZ2VyLl9wYXVzZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmICgnQ0FOQ0VMRUQnID09PSBzdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5kaXNhYmxlKCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLnJlc3VtZVRlcm1pbmF0ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdkaXNwb3NlJywgc3RhdHVzKTtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDEwMCk7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgYXdhaXQgc25vb3plKDEwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5raWxsKCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgIH1cclxuXHJcbiAgICBraWxsKCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5fY2hpbGRQcm9jLmtpbGwoJ1NJR0lOVCcpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBpbml0KHJpZCwgb3B0aW9ucywgY2Fwcykge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICBjb25zdCBiZWZvcmVUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuaW52b2tlKCdpbml0JywgcmlkLCBvcHRpb25zLCBjYXBzKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IGFmdGVyVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGFmdGVyVGltZSAtIGJlZm9yZVRpbWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBsZXQgc3RhcnQgPSAnJztcclxuICAgICAgICAgICAgaWYgKHRoaXMuX25hbWUpIHtcclxuICAgICAgICAgICAgICAgIHN0YXJ0ID0gdGhpcy5fbmFtZSsnICc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbG9nLmluZm8oc3RhcnQrJ1dvcmtlciBpbml0aWFsaXplZCBpbiAnICsgZHVyYXRpb24gKyAnIG1zJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzID0gbnVsbCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9kZWJ1Z2dlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jbG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCAmJiB0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2UnLCBzdGF0dXMpO1xyXG4gICAgICAgICAgICB0aGlzLl9zZW5kKHtcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdleGl0JyxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5raWxsKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgICAgICB0eXBlOiAnZXhpdCcsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyxcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMua2lsbCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkaXNwb3NlTW9kdWxlcyhzdGF0dXMgPSBudWxsKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlYnVnZ2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RlYnVnZ2VyLmNsb3NlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9jaGlsZFByb2MpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnZva2UoJ2Rpc3Bvc2VNb2R1bGVzJywgc3RhdHVzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGRlYnVnZ2VyICgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fZGVidWdnZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGlzUnVubmluZyAoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUnVubmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgaXNJbml0aWFsaXplZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5faXNJbml0aWFsaXplZDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBydW4ocnVuT3B0cykge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmludm9rZSgncnVuJywgcnVuT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgc3Vic2NyaWJlKGV2ZW50TmFtZSwgaGFuZGxlcikge1xyXG4gICAgICAgIGlmICghdGhpcy5fZXZlbnRIYW5kbGVyc1tldmVudE5hbWVdICYmIHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50SGFuZGxlcnNbZXZlbnROYW1lXSA9IGhhbmRsZXI7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1YnNjcmliZScsXHJcbiAgICAgICAgICAgICAgICBldmVudDogZXZlbnROYW1lLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW52b2tlKG1ldGhvZCkge1xyXG4gICAgICAgIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcclxuICAgICAgICAvLyBpZ25vcmUgZmlyc3QgYXJndW1lbnQgLSBlLmcuIG1ldGhvZFxyXG4gICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgYXJncy5zaGlmdCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NlbmQoe1xyXG4gICAgICAgICAgICAgICAgdHlwZTogJ2ludm9rZScsXHJcbiAgICAgICAgICAgICAgICBtZXRob2Q6IG1ldGhvZCxcclxuICAgICAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICAgICAgYXJnczogYXJnc1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5fY2FsbHNbY2FsbElkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGludm9rZVRlc3RIb29rKGhvb2tOYW1lLCBob29rQXJncykge1xyXG4gICAgICAgIGNvbnN0IGNhbGxJZCA9IG94dXRpbC5nZW5lcmF0ZVVuaXF1ZUlkKCk7XHJcbiAgICAgICAgdGhpcy5fc2VuZCh7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnZva2U6aG9vaycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogaG9va05hbWUsXHJcbiAgICAgICAgICAgIGNhbGxJZDogY2FsbElkLFxyXG4gICAgICAgICAgICBhcmdzOiBob29rQXJnc1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2NhbGxzW2NhbGxJZF0gPSBkZWZlcigpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsc1tjYWxsSWRdLnByb21pc2U7XHJcbiAgICB9XHJcblxyXG4gICAgX3NlbmQobWVzc2FnZSkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgX3Jlc2V0KCkge1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYyA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2lzUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnTW9kZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZGVidWdQb3J0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl93aGVuT3h5Z2VuRGlzcG9zZWQgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3doZW5PeHlnZW5Jbml0aWFsaXplZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fd2hlbk1vZHVsZXNEaXNwb3NlZCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIF9ob29rQ2hpbGRQcm9jRXZlbnRzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fY2hpbGRQcm9jKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdtZXNzYWdlJywgdGhpcy5faGFuZGxlQ2hpbGRNZXNzYWdlLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXJyb3InLCB0aGlzLl9oYW5kbGVDaGlsZEVycm9yLmJpbmQodGhpcykpO1xyXG4gICAgICAgIHRoaXMuX2NoaWxkUHJvYy5vbignZXhpdCcsIHRoaXMuX2hhbmRsZUNoaWxkRXhpdC5iaW5kKHRoaXMpKTtcclxuICAgICAgICB0aGlzLl9jaGlsZFByb2Mub24oJ2Rpc2Nvbm5lY3QnLCB0aGlzLl9oYW5kbGVDaGlsZERpc2Nvbm5lY3QuYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCd1bmNhdWdodEV4Y2VwdGlvbicsIHRoaXMuX2hhbmRsZUNoaWxkVW5jYXVnaHRFeGNlcHRpb24uYmluZCh0aGlzKSk7XHJcbiAgICAgICAgdGhpcy5fY2hpbGRQcm9jLm9uKCdTSUdJTlQnLCB0aGlzLl9oYW5kbGVDaGlsZFNpZ0ludC5iaW5kKHRoaXMpKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRNZXNzYWdlKG1zZykge1xyXG4gICAgICAgIGlmIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgc3dpdGNoIChtc2cuZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGNhc2UgJ2ludm9rZTpyZXN1bHQnOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtc2cuY2FsbElkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLl9jYWxscywgbXNnLmNhbGxJZCkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvbWlzZSA9IHRoaXMuX2NhbGxzW21zZy5jYWxsSWRdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlLnJlamVjdChtc2cuZXJyb3IpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS5yZXNvbHZlKG1zZy5yZXR2YWwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9jYWxsc1ttc2cuY2FsbElkXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlICdyZXBvcnRlcic6XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5tZXRob2QpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdyZXBvcnRlcicsIHsgcGlkOiB0aGlzLl9waWQsIG1ldGhvZDogbXNnLm1ldGhvZCwgYXJnczogbXNnLmFyZ3MgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgY2FzZSAnZXZlbnQnOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZVdvcmtlckV2ZW50KG1zZy5uYW1lLCBtc2cuYXJncyk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lbWl0KCdtZXNzYWdlJywgT2JqZWN0LmFzc2lnbihtc2csIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9oYW5kbGVXb3JrZXJFdmVudChuYW1lLCBhcmdzKSB7XHJcbiAgICAgICAgaWYgKG5hbWUgJiYgdGhpcy5fZXZlbnRIYW5kbGVycyAmJiB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdKSB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9ldmVudEhhbmRsZXJzW25hbWVdLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGxvZy5lcnJvcignRXJyb3IgdGhyb3duIGJ5IHdvcmtlciBldmVudCBoYW5kbGVyIFwiJHtuYW1lfTonLCBlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFcnJvcihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBPYmplY3QuYXNzaWduKHsgZXJyb3IgOiBlcnJvciB9LCB7IHBpZDogdGhpcy5fcGlkIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRFeGl0KGV4aXRDb2RlLCBzaWduYWwpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gZmluaXNoZWQgd2l0aCBleGl0IGNvZGUgJHtleGl0Q29kZX0gYW5kIHNpZ25hbCAke3NpZ25hbH0uYCk7XHJcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2V4aXQnLCB7IHBpZDogdGhpcy5fcGlkLCBleGl0Q29kZSwgc2lnbmFsIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZERpc2Nvbm5lY3QoKSB7XHJcbiAgICAgICAgbG9nLmRlYnVnKGBXb3JrZXIgJHt0aGlzLl9waWR9IGRpc2Nvbm5lY3RlZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBfaGFuZGxlQ2hpbGRVbmNhdWdodEV4Y2VwdGlvbihlcnJvcikge1xyXG4gICAgICAgIGxvZy5kZWJ1ZyhgV29ya2VyICR7dGhpcy5fcGlkfSB0aHJvd24gYW4gdW5jYXVnaHQgZXJyb3I6ICR7ZXJyb3J9LmApO1xyXG4gICAgICAgIHRoaXMuX3Jlc2V0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyBlcnJvciA6IGVycm9yIH0sIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgIHRoaXMuZW1pdCgnZXhpdCcsIHsgcGlkOiB0aGlzLl9waWQsIGV4aXRDb2RlOiAxIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIF9oYW5kbGVDaGlsZFNpZ0ludCgpIHtcclxuICAgICAgICBsb2cuZGVidWcoYFdvcmtlciAke3RoaXMuX3BpZH0gcmVjZWl2ZWQgU0lHSU5UIHNpZ25hbC5gKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaW5pdGlhbGl6ZURlYnVnZ2VyKCkge1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyID0gbmV3IERlYnVnZ2VyKHRoaXMuX3BpZCk7XHJcbiAgICAgICAgbGV0IHdoZW5EZWJ1Z2dlclJlYWR5ID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XHJcbiAgICAgICAgLy8gaGFuZGxlIGRlYnVnZ2VyIGV2ZW50c1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdyZWFkeScsIGZ1bmN0aW9uKGVycikge1xyXG4gICAgICAgICAgICAvLyByZXN1bWUgdGhlIGZpcnN0IGJyZWFrcG9pbnQgd2hpY2ggaXMgYXV0b21hdGljYWxseSBhZGRlZCBieSB0aGUgZGVidWdnZXJcclxuICAgICAgICAgICAgaWYgKF90aGlzLl9kZWJ1Z2dlciAmJiBfdGhpcy5fZGVidWdnZXIuY29udGludWUpIHtcclxuICAgICAgICAgICAgICAgIF90aGlzLl9kZWJ1Z2dlci5jb250aW51ZSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHdoZW5EZWJ1Z2dlclJlYWR5LnJlc29sdmUoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLl9kZWJ1Z2dlci5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcclxuXHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignZGVidWdnZXIgb24gZXJyb3IgOicsIGVycik7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmVycm9yJywgT2JqZWN0LmFzc2lnbihlcnIsIHsgcGlkOiB0aGlzLl9waWQgfSkpO1xyXG4gICAgICAgICAgICAvLyByZWplY3QgdGhlIHByb21pc2Ugb25seSBpZiB3ZSBnb3QgYW4gZXJyb3IgcmlnaHQgYWZ0ZXIgX2RlYnVnZ2VyLmNvbm5lY3QoKSBjYWxsIGJlbG93IC0gd2UgbmVlZCB0aGlzIHRvIGluZGljYXRlIGRlYnVnZ2VyIGluaXRpYWxpemF0aW9uIGVycm9yXHJcbiAgICAgICAgICAgIGlmICghd2hlbkRlYnVnZ2VyUmVhZHkuaXNSZXNvbHZlZCkge1xyXG4gICAgICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KGVyci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuX2RlYnVnZ2VyLm9uKCdicmVhaycsIGZ1bmN0aW9uKGJyZWFrcG9pbnREYXRhKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVidWdnZXI6YnJlYWsnLCBicmVha3BvaW50RGF0YSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5fZGVidWdnZXIub24oJ2JyZWFrRXJyb3InLCBhc3luYyBmdW5jdGlvbihicmVha0Vycm9yKSB7XHJcblxyXG4gICAgICAgICAgICBpZiAoYnJlYWtFcnJvciAmJiBicmVha0Vycm9yLm1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fYnJlYWtwb2ludEVycm9ycy5pbmNsdWRlcyhicmVha0Vycm9yLm1lc3NhZ2UpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlXHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIF90aGlzLl9icmVha3BvaW50RXJyb3JzLnB1c2goYnJlYWtFcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlYnVnZ2VyOmJyZWFrRXJyb3InLCBicmVha0Vycm9yKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBsb2cuaW5mbyhgQ29ubmVjdGluZyB0byBkZWJ1Z2dlciBvbiBwb3J0ICR7dGhpcy5fZGVidWdQb3J0fS4uLmApO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9kZWJ1Z2dlci5jb25uZWN0KHRoaXMuX2RlYnVnUG9ydCwgJzEyNy4wLjAuMScpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdDYW5ub3QgY29ubmVjdCB0byB0aGUgZGVidWdnZXI6ICcsIGUpO1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gJ0Nhbm5vdCBjb25uZWN0IHRvIHRoZSBkZWJ1Z2dlcjogJyArIGUubWVzc2FnZTtcclxuICAgICAgICAgICAgd2hlbkRlYnVnZ2VyUmVhZHkucmVqZWN0KG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHdoZW5EZWJ1Z2dlclJlYWR5LnByb21pc2U7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFHQTtBQUdBO0FBQ0E7QUFBaUM7QUFIakMsTUFBTUEsR0FBRyxHQUFHLElBQUFDLGVBQU0sRUFBQyxlQUFlLENBQUM7QUFNbkMsTUFBTUMsTUFBTSxHQUFHQyxFQUFFLElBQUksSUFBSUMsT0FBTyxDQUFDQyxPQUFPLElBQUlDLFVBQVUs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
|