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,21 +4,13 @@ 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 _OxygenSubModule = require("../../core/OxygenSubModule");
|
|
11
|
-
|
|
12
9
|
var _chromeHar = require("chrome-har");
|
|
13
|
-
|
|
14
10
|
var _helper = _interopRequireDefault(require("../../errors/helper"));
|
|
15
|
-
|
|
16
11
|
var _OxygenError = _interopRequireDefault(require("../../errors/OxygenError"));
|
|
17
|
-
|
|
18
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
|
-
|
|
20
13
|
const observe = ['Page.domContentEventFired', 'Page.fileChooserOpened', 'Page.frameAttached', 'Page.frameDetached', 'Page.frameNavigated', 'Page.interstitialHidden', 'Page.interstitialShown', 'Page.javascriptDialogClosed', 'Page.javascriptDialogOpening', 'Page.lifecycleEvent', 'Page.loadEventFired', 'Page.windowOpen', 'Page.frameClearedScheduledNavigation', 'Page.frameScheduledNavigation', 'Page.compilationCacheProduced', 'Page.downloadProgress', 'Page.downloadWillBegin', 'Page.frameRequestedNavigation', 'Page.frameResized', 'Page.frameStartedLoading', 'Page.frameStoppedLoading', 'Page.navigatedWithinDocument', 'Page.screencastFrame', 'Page.screencastVisibilityChanged', 'Network.dataReceived', 'Network.eventSourceMessageReceived', 'Network.loadingFailed', 'Network.loadingFinished', 'Network.requestServedFromCache', 'Network.requestWillBeSent', 'Network.responseReceived', 'Network.webSocketClosed', 'Network.webSocketCreated', 'Network.webSocketFrameError', 'Network.webSocketFrameReceived', 'Network.webSocketFrameSent', 'Network.webSocketHandshakeResponseReceived', 'Network.webSocketWillSendHandshakeRequest', 'Network.requestWillBeSentExtraInfo', 'Network.resourceChangedPriority', 'Network.responseReceivedExtraInfo', 'Network.signedExchangeReceived', 'Network.requestIntercepted'];
|
|
21
|
-
|
|
22
14
|
class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
23
15
|
constructor(name, parent) {
|
|
24
16
|
super(name, parent);
|
|
@@ -26,13 +18,11 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
|
26
18
|
this._collectData = false;
|
|
27
19
|
this._events = [];
|
|
28
20
|
}
|
|
29
|
-
|
|
30
21
|
init(devTools) {
|
|
31
22
|
if (!devTools || !this._parent || !this._parent.getDriver || typeof this._parent.getDriver !== 'function' || !this._parent.getDriver()) {
|
|
32
23
|
super.init();
|
|
33
24
|
return false;
|
|
34
25
|
}
|
|
35
|
-
|
|
36
26
|
this._devTools = devTools;
|
|
37
27
|
this._driver = this._parent.getDriver();
|
|
38
28
|
observe.forEach(method => {
|
|
@@ -48,7 +38,6 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
|
48
38
|
super.init();
|
|
49
39
|
return true;
|
|
50
40
|
}
|
|
51
|
-
|
|
52
41
|
async dispose() {
|
|
53
42
|
try {
|
|
54
43
|
if (this._driver) {
|
|
@@ -59,56 +48,46 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
|
59
48
|
await this._driver.emit('Network.close');
|
|
60
49
|
}
|
|
61
50
|
} catch (e) {}
|
|
62
|
-
|
|
63
51
|
this._devTools = null;
|
|
64
52
|
this._driver = null;
|
|
65
53
|
this._events = [];
|
|
66
54
|
super.dispose();
|
|
67
55
|
}
|
|
68
|
-
|
|
69
56
|
start() {
|
|
70
57
|
this._collectData = true;
|
|
71
58
|
this._events = [];
|
|
72
59
|
}
|
|
73
|
-
|
|
74
60
|
stop() {
|
|
75
61
|
this._collectData = false;
|
|
76
62
|
}
|
|
77
|
-
|
|
78
63
|
async getRequests() {
|
|
79
64
|
return await this._getEntries();
|
|
80
65
|
}
|
|
81
|
-
|
|
82
66
|
async _getEntries() {
|
|
83
67
|
try {
|
|
84
68
|
const har = (0, _chromeHar.harFromMessages)(this._events);
|
|
85
|
-
|
|
86
69
|
if (har && har.log && har.log.entries && har.log.entries.map) {
|
|
87
70
|
har.log.entries.reverse();
|
|
88
71
|
return await Promise.all(har.log.entries.map(async item => {
|
|
89
72
|
let responseBody = {};
|
|
90
|
-
|
|
91
73
|
try {
|
|
92
74
|
responseBody = await this._driver.cdp('Network', 'getResponseBody', {
|
|
93
75
|
requestId: item._requestId
|
|
94
76
|
});
|
|
95
77
|
} catch (e) {}
|
|
96
|
-
|
|
97
78
|
if (responseBody && responseBody.body) {
|
|
98
79
|
try {
|
|
99
80
|
responseBody.body = JSON.parse(responseBody.body);
|
|
100
81
|
} catch (e) {}
|
|
101
82
|
}
|
|
102
|
-
|
|
103
83
|
let requestPostData = {};
|
|
104
|
-
|
|
105
84
|
try {
|
|
106
85
|
requestPostData = await this._driver.cdp('Network', 'getRequestPostData', {
|
|
107
86
|
requestId: item._requestId
|
|
108
87
|
});
|
|
109
88
|
} catch (e) {}
|
|
110
|
-
|
|
111
|
-
|
|
89
|
+
return {
|
|
90
|
+
...item,
|
|
112
91
|
url: item.request.url,
|
|
113
92
|
requestId: item._requestId,
|
|
114
93
|
...item.response,
|
|
@@ -123,205 +102,147 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
|
123
102
|
return [];
|
|
124
103
|
}
|
|
125
104
|
}
|
|
126
|
-
|
|
127
105
|
async waitForUrl(pattern, timeout = 60 * 1000) {
|
|
128
106
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
129
107
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
130
108
|
}
|
|
131
|
-
|
|
132
109
|
if (!this._collectData) {
|
|
133
110
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
|
|
134
111
|
}
|
|
135
|
-
|
|
136
112
|
this._parent.helpers.assertArgument(pattern, 'pattern');
|
|
137
|
-
|
|
138
113
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
139
|
-
|
|
140
114
|
const start = Date.now();
|
|
141
|
-
|
|
142
115
|
while (Date.now() - start < timeout) {
|
|
143
116
|
const networkRequests = await this._getEntries();
|
|
144
|
-
|
|
145
117
|
for (let req of networkRequests) {
|
|
146
118
|
if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
|
|
147
119
|
return req;
|
|
148
120
|
}
|
|
149
121
|
}
|
|
150
|
-
|
|
151
122
|
await this._driver.pause(500);
|
|
152
123
|
}
|
|
153
|
-
|
|
154
124
|
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
|
|
155
125
|
}
|
|
156
|
-
|
|
157
126
|
async waitForNotUrl(pattern, timeout = 60 * 1000) {
|
|
158
127
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
159
128
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
160
129
|
}
|
|
161
|
-
|
|
162
130
|
if (!this._collectData) {
|
|
163
131
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network.start()` must be executed prior to using `network` commands.');
|
|
164
132
|
}
|
|
165
|
-
|
|
166
133
|
this._parent.helpers.assertArgument(pattern, 'pattern');
|
|
167
|
-
|
|
168
134
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
169
|
-
|
|
170
135
|
const start = Date.now();
|
|
171
|
-
|
|
172
136
|
while (Date.now() - start < timeout) {
|
|
173
137
|
const networkRequests = await this._getEntries();
|
|
174
|
-
|
|
175
138
|
for (let req of networkRequests) {
|
|
176
139
|
if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
|
|
177
140
|
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `A request matching the URL "${pattern}" was found.`);
|
|
178
141
|
}
|
|
179
142
|
}
|
|
180
|
-
|
|
181
143
|
await this._driver.pause(500);
|
|
182
144
|
}
|
|
183
145
|
}
|
|
184
|
-
|
|
185
146
|
async waitFor(matcher, timeout = 60 * 1000) {
|
|
186
147
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
187
148
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` module is not initialized.');
|
|
188
149
|
}
|
|
189
|
-
|
|
190
150
|
if (!this._collectData) {
|
|
191
151
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
192
152
|
}
|
|
193
|
-
|
|
194
153
|
this._parent.helpers.assertArgument(matcher, 'matcher');
|
|
195
|
-
|
|
196
154
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
197
|
-
|
|
198
155
|
const start = Date.now();
|
|
199
|
-
|
|
200
156
|
while (Date.now() - start < timeout) {
|
|
201
157
|
const networkRequests = await this._getEntries();
|
|
202
|
-
|
|
203
158
|
for (var req of networkRequests) {
|
|
204
159
|
if (matcher(req)) {
|
|
205
160
|
return req;
|
|
206
161
|
}
|
|
207
162
|
}
|
|
208
|
-
|
|
209
163
|
await this._driver.pause(500);
|
|
210
164
|
}
|
|
211
|
-
|
|
212
165
|
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
|
|
213
166
|
}
|
|
214
|
-
|
|
215
167
|
async assertUrl(url, timeout = 60 * 1000) {
|
|
216
168
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
217
169
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
218
170
|
}
|
|
219
|
-
|
|
220
171
|
if (!this._collectData) {
|
|
221
172
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
222
173
|
}
|
|
223
|
-
|
|
224
174
|
this._parent.helpers.assertArgument(url, 'url');
|
|
225
|
-
|
|
226
175
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
227
|
-
|
|
228
176
|
const start = Date.now();
|
|
229
|
-
|
|
230
177
|
while (Date.now() - start < timeout) {
|
|
231
178
|
const networkRequests = await this._getEntries();
|
|
232
|
-
|
|
233
179
|
for (let req of networkRequests) {
|
|
234
180
|
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
235
181
|
return req;
|
|
236
182
|
}
|
|
237
183
|
}
|
|
238
|
-
|
|
239
184
|
await this._driver.pause(500);
|
|
240
185
|
}
|
|
241
|
-
|
|
242
186
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
243
187
|
}
|
|
244
|
-
|
|
245
188
|
async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
|
|
246
189
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
247
190
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
248
191
|
}
|
|
249
|
-
|
|
250
192
|
if (!this._collectData) {
|
|
251
193
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
252
194
|
}
|
|
253
|
-
|
|
254
195
|
this._parent.helpers.assertArgument(url, 'url');
|
|
255
|
-
|
|
256
196
|
this._parent.helpers.assertArgument(statusCode, 'statusCode');
|
|
257
|
-
|
|
258
197
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
259
|
-
|
|
260
198
|
const start = Date.now();
|
|
261
199
|
let matchedReq = null;
|
|
262
|
-
|
|
263
200
|
while (Date.now() - start < timeout && !matchedReq) {
|
|
264
201
|
const networkRequests = await this._getEntries();
|
|
265
|
-
|
|
266
202
|
for (let req of networkRequests) {
|
|
267
203
|
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
268
204
|
matchedReq = req;
|
|
269
205
|
break;
|
|
270
206
|
}
|
|
271
207
|
}
|
|
272
|
-
|
|
273
208
|
!matchedReq && (await this._driver.pause(500));
|
|
274
209
|
}
|
|
275
|
-
|
|
276
210
|
if (!matchedReq) {
|
|
277
211
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
278
212
|
}
|
|
279
|
-
|
|
280
213
|
if (statusCode !== matchedReq.status) {
|
|
281
214
|
const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
|
|
282
215
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
|
|
283
216
|
}
|
|
284
217
|
}
|
|
285
|
-
|
|
286
218
|
async assertResponseContent(url, content, failureMessage = null, timeout = 60 * 1000) {
|
|
287
219
|
if (!this._driver || !this._isInitialized || !this._parent) {
|
|
288
220
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`network` or `web` module is not initialized.');
|
|
289
221
|
}
|
|
290
|
-
|
|
291
222
|
if (!this._collectData) {
|
|
292
223
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`web.network.start()` must be executed prior to using `network` commands.');
|
|
293
224
|
}
|
|
294
|
-
|
|
295
225
|
this._parent.helpers.assertArgument(url, 'url');
|
|
296
|
-
|
|
297
226
|
this._parent.helpers.assertArgument(content, 'content');
|
|
298
|
-
|
|
299
227
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
300
|
-
|
|
301
228
|
const start = Date.now();
|
|
302
229
|
let matchedReq = null;
|
|
303
|
-
|
|
304
230
|
while (Date.now() - start < timeout && !matchedReq) {
|
|
305
231
|
const networkRequests = await this._getEntries();
|
|
306
|
-
|
|
307
232
|
for (let req of networkRequests) {
|
|
308
233
|
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
309
234
|
matchedReq = req;
|
|
310
235
|
break;
|
|
311
236
|
}
|
|
312
237
|
}
|
|
313
|
-
|
|
314
238
|
!matchedReq && (await this._driver.pause(500));
|
|
315
239
|
}
|
|
316
|
-
|
|
317
240
|
if (!matchedReq) {
|
|
318
241
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
319
242
|
}
|
|
320
|
-
|
|
321
243
|
const resp = await this._driver.cdp('Network', 'getResponseBody', {
|
|
322
244
|
requestId: matchedReq.requestId
|
|
323
245
|
});
|
|
324
|
-
|
|
325
246
|
if (resp && resp.body && !resp.base64Encoded) {
|
|
326
247
|
if (content.constructor.name === 'RegExp' && (content.test(resp.body) || resp.body.indexOf(content) > -1)) {
|
|
327
248
|
return true;
|
|
@@ -331,8 +252,6 @@ class NetworkSubModule extends _OxygenSubModule.OxygenSubModule {
|
|
|
331
252
|
}
|
|
332
253
|
}
|
|
333
254
|
}
|
|
334
|
-
|
|
335
255
|
}
|
|
336
|
-
|
|
337
256
|
exports.default = NetworkSubModule;
|
|
338
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrLmpzIl0sIm5hbWVzIjpbIm9ic2VydmUiLCJOZXR3b3JrU3ViTW9kdWxlIiwiT3h5Z2VuU3ViTW9kdWxlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwicGFyZW50IiwiX2RldlRvb2xzIiwiX2NvbGxlY3REYXRhIiwiX2V2ZW50cyIsImluaXQiLCJkZXZUb29scyIsIl9wYXJlbnQiLCJnZXREcml2ZXIiLCJfZHJpdmVyIiwiZm9yRWFjaCIsIm1ldGhvZCIsIm9uIiwicGFyYW1zIiwicHVzaCIsImRpc3Bvc2UiLCJyZW1vdmVMaXN0ZW5lciIsImVtaXQiLCJlIiwic3RhcnQiLCJzdG9wIiwiZ2V0UmVxdWVzdHMiLCJfZ2V0RW50cmllcyIsImhhciIsImxvZyIsImVudHJpZXMiLCJtYXAiLCJyZXZlcnNlIiwiUHJvbWlzZSIsImFsbCIsIml0ZW0iLCJyZXNwb25zZUJvZHkiLCJjZHAiLCJyZXF1ZXN0SWQiLCJfcmVxdWVzdElkIiwiYm9keSIsIkpTT04iLCJwYXJzZSIsInJlcXVlc3RQb3N0RGF0YSIsInVybCIsInJlcXVlc3QiLCJyZXNwb25zZSIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIl9pc0luaXRpYWxpemVkIiwiT3hFcnJvciIsImVyckhlbHBlciIsImVycm9yQ29kZSIsIk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IiLCJoZWxwZXJzIiwiYXNzZXJ0QXJndW1lbnQiLCJhc3NlcnRBcmd1bWVudFRpbWVvdXQiLCJEYXRlIiwibm93IiwibmV0d29ya1JlcXVlc3RzIiwicmVxIiwidGVzdCIsInBhdXNlIiwiVElNRU9VVCIsIndhaXRGb3JOb3RVcmwiLCJ3YWl0Rm9yIiwibWF0Y2hlciIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwic3RhdHVzIiwibWVzc2FnZSIsImFzc2VydFJlc3BvbnNlQ29udGVudCIsImNvbnRlbnQiLCJyZXNwIiwiYmFzZTY0RW5jb2RlZCIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsT0FBTyxHQUFHLENBQ1osMkJBRFksRUFFWix3QkFGWSxFQUdaLG9CQUhZLEVBSVosb0JBSlksRUFLWixxQkFMWSxFQU1aLHlCQU5ZLEVBT1osd0JBUFksRUFRWiw2QkFSWSxFQVNaLDhCQVRZLEVBVVoscUJBVlksRUFXWixxQkFYWSxFQVlaLGlCQVpZLEVBYVosc0NBYlksRUFjWiwrQkFkWSxFQWVaLCtCQWZZLEVBZ0JaLHVCQWhCWSxFQWlCWix3QkFqQlksRUFrQlosK0JBbEJZLEVBbUJaLG1CQW5CWSxFQW9CWiwwQkFwQlksRUFxQlosMEJBckJZLEVBc0JaLDhCQXRCWSxFQXVCWixzQkF2QlksRUF3Qlosa0NBeEJZLEVBeUJaLHNCQXpCWSxFQTBCWixvQ0ExQlksRUEyQlosdUJBM0JZLEVBNEJaLHlCQTVCWSxFQTZCWixnQ0E3QlksRUE4QlosMkJBOUJZLEVBK0JaLDBCQS9CWSxFQWdDWix5QkFoQ1ksRUFpQ1osMEJBakNZLEVBa0NaLDZCQWxDWSxFQW1DWixnQ0FuQ1ksRUFvQ1osNEJBcENZLEVBcUNaLDRDQXJDWSxFQXNDWiwyQ0F0Q1ksRUF1Q1osb0NBdkNZLEVBd0NaLGlDQXhDWSxFQXlDWixtQ0F6Q1ksRUEwQ1osZ0NBMUNZLEVBMkNaLDRCQTNDWSxDQUFoQjs7QUE2Q2UsTUFBTUMsZ0JBQU4sU0FBK0JDLGdDQUEvQixDQUErQztBQUMxREMsRUFBQUEsV0FBVyxDQUFDQyxJQUFELEVBQU9DLE1BQVAsRUFBZTtBQUN0QixVQUFNRCxJQUFOLEVBQVlDLE1BQVo7QUFDQSxTQUFLQyxTQUFMLEdBQWlCLElBQWpCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLE9BQUwsR0FBZSxFQUFmO0FBQ0g7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Q0FBaUIsU0FBakIsRUFBMkIsaUJBQTNCLEVBQThDO0FBQzdEQyxNQUFBQSxTQUFTLEVBQUVtQyxVQUFVLENBQUNuQztBQUR1QyxLQUE5QyxDQUFuQjs7QUFHQSxRQUFJd0MsSUFBSSxJQUFJQSxJQUFJLENBQUN0QyxJQUFiLElBQXFCLENBQUNzQyxJQUFJLENBQUNDLGFBQS9CLEVBQThDO0FBQzFDLFVBQUlGLE9BQU8sQ0FBQ3pFLFdBQVIsQ0FBb0JDLElBQXBCLEtBQTZCLFFBQTdCLEtBQTBDd0UsT0FBTyxDQUFDZixJQUFSLENBQWFnQixJQUFJLENBQUN0QyxJQUFsQixLQUEyQnNDLElBQUksQ0FBQ3RDLElBQUwsQ0FBVXdDLE9BQVYsQ0FBa0JILE9BQWxCLElBQTZCLENBQUMsQ0FBbkcsQ0FBSixFQUEyRztBQUN2RyxlQUFPLElBQVA7QUFDSCxPQUZELE1BR0s7QUFDRCxjQUFNRixPQUFPLEdBQUdILGNBQWMsSUFBSyxhQUFZNUIsR0FBSSxrQ0FBaUNpQyxPQUFRLEdBQTVGO0FBQ0EsY0FBTSxJQUFJMUIsb0JBQUosQ0FBWUMsZ0JBQVVDLFNBQVYsQ0FBb0JnQixZQUFoQyxFQUE4Q00sT0FBOUMsQ0FBTjtBQUNIO0FBQ0o7QUFDSjs7QUF0V3lEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXX0=
|
|
257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJvYnNlcnZlIiwiTmV0d29ya1N1Yk1vZHVsZSIsIk94eWdlblN1Yk1vZHVsZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsInBhcmVudCIsIl9kZXZUb29scyIsIl9jb2xsZWN0RGF0YSIsIl9ldmVudHMiLCJpbml0IiwiZGV2VG9vbHMiLCJfcGFyZW50IiwiZ2V0RHJpdmVyIiwiX2RyaXZlciIsImZvckVhY2giLCJtZXRob2QiLCJvbiIsInBhcmFtcyIsInB1c2giLCJkaXNwb3NlIiwicmVtb3ZlTGlzdGVuZXIiLCJlbWl0IiwiZSIsInN0YXJ0Iiwic3RvcCIsImdldFJlcXVlc3RzIiwiX2dldEVudHJpZXMiLCJoYXIiLCJoYXJGcm9tTWVzc2FnZXMiLCJsb2ciLCJlbnRyaWVzIiwibWFwIiwicmV2ZXJzZSIsIlByb21pc2UiLCJhbGwiLCJpdGVtIiwicmVzcG9uc2VCb2R5IiwiY2RwIiwicmVxdWVzdElkIiwiX3JlcXVlc3RJZCIsImJvZHkiLCJKU09OIiwicGFyc2UiLCJyZXF1ZXN0UG9zdERhdGEiLCJ1cmwiLCJyZXF1ZXN0IiwicmVzcG9uc2UiLCJ3YWl0Rm9yVXJsIiwicGF0dGVybiIsInRpbWVvdXQiLCJfaXNJbml0aWFsaXplZCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsIm5ldHdvcmtSZXF1ZXN0cyIsInJlcSIsInRlc3QiLCJwYXVzZSIsIlRJTUVPVVQiLCJ3YWl0Rm9yTm90VXJsIiwid2FpdEZvciIsIm1hdGNoZXIiLCJhc3NlcnRVcmwiLCJBU1NFUlRfRVJST1IiLCJhc3NlcnRTdGF0dXNDb2RlIiwic3RhdHVzQ29kZSIsImZhaWx1cmVNZXNzYWdlIiwibWF0Y2hlZFJlcSIsInN0YXR1cyIsIm1lc3NhZ2UiLCJhc3NlcnRSZXNwb25zZUNvbnRlbnQiLCJjb250ZW50IiwicmVzcCIsImJhc2U2NEVuY29kZWQiLCJpbmRleE9mIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL294X3NlcnZpY2VzL3NlcnZpY2UtZGV2dG9vbHMvc3VibW9kdWxlLW5ldHdvcmsuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogUHJvdmlkZXMgbWV0aG9kcyBmb3IgbW9uaXRvcmluZyBhbmQgYW5hbHl6aW5nIENocm9tZSBicm93c2VyIG5ldHdvcmsgYWN0aXZpdGllcy5cclxuKi9cclxuaW1wb3J0IHsgT3h5Z2VuU3ViTW9kdWxlIH0gZnJvbSAnLi4vLi4vY29yZS9PeHlnZW5TdWJNb2R1bGUnO1xyXG5pbXBvcnQgeyBoYXJGcm9tTWVzc2FnZXMgfSBmcm9tICdjaHJvbWUtaGFyJztcclxuaW1wb3J0IGVyckhlbHBlciBmcm9tICcuLi8uLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IE94RXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL094eWdlbkVycm9yJztcclxuXHJcbmNvbnN0IG9ic2VydmUgPSBbXHJcbiAgICAnUGFnZS5kb21Db250ZW50RXZlbnRGaXJlZCcsXHJcbiAgICAnUGFnZS5maWxlQ2hvb3Nlck9wZW5lZCcsXHJcbiAgICAnUGFnZS5mcmFtZUF0dGFjaGVkJyxcclxuICAgICdQYWdlLmZyYW1lRGV0YWNoZWQnLFxyXG4gICAgJ1BhZ2UuZnJhbWVOYXZpZ2F0ZWQnLFxyXG4gICAgJ1BhZ2UuaW50ZXJzdGl0aWFsSGlkZGVuJyxcclxuICAgICdQYWdlLmludGVyc3RpdGlhbFNob3duJyxcclxuICAgICdQYWdlLmphdmFzY3JpcHREaWFsb2dDbG9zZWQnLFxyXG4gICAgJ1BhZ2UuamF2YXNjcmlwdERpYWxvZ09wZW5pbmcnLFxyXG4gICAgJ1BhZ2UubGlmZWN5Y2xlRXZlbnQnLFxyXG4gICAgJ1BhZ2UubG9hZEV2ZW50RmlyZWQnLFxyXG4gICAgJ1BhZ2Uud2luZG93T3BlbicsXHJcbiAgICAnUGFnZS5mcmFtZUNsZWFyZWRTY2hlZHVsZWROYXZpZ2F0aW9uJyxcclxuICAgICdQYWdlLmZyYW1lU2NoZWR1bGVkTmF2aWdhdGlvbicsXHJcbiAgICAnUGFnZS5jb21waWxhdGlvbkNhY2hlUHJvZHVjZWQnLFxyXG4gICAgJ1BhZ2UuZG93bmxvYWRQcm9ncmVzcycsXHJcbiAgICAnUGFnZS5kb3dubG9hZFdpbGxCZWdpbicsXHJcbiAgICAnUGFnZS5mcmFtZVJlcXVlc3RlZE5hdmlnYXRpb24nLFxyXG4gICAgJ1BhZ2UuZnJhbWVSZXNpemVkJyxcclxuICAgICdQYWdlLmZyYW1lU3RhcnRlZExvYWRpbmcnLFxyXG4gICAgJ1BhZ2UuZnJhbWVTdG9wcGVkTG9hZGluZycsXHJcbiAgICAnUGFnZS5uYXZpZ2F0ZWRXaXRoaW5Eb2N1bWVudCcsXHJcbiAgICAnUGFnZS5zY3JlZW5jYXN0RnJhbWUnLFxyXG4gICAgJ1BhZ2Uuc2NyZWVuY2FzdFZpc2liaWxpdHlDaGFuZ2VkJyxcclxuICAgICdOZXR3b3JrLmRhdGFSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5ldmVudFNvdXJjZU1lc3NhZ2VSZWNlaXZlZCcsXHJcbiAgICAnTmV0d29yay5sb2FkaW5nRmFpbGVkJyxcclxuICAgICdOZXR3b3JrLmxvYWRpbmdGaW5pc2hlZCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0U2VydmVkRnJvbUNhY2hlJyxcclxuICAgICdOZXR3b3JrLnJlcXVlc3RXaWxsQmVTZW50JyxcclxuICAgICdOZXR3b3JrLnJlc3BvbnNlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0Q2xvc2VkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldENyZWF0ZWQnLFxyXG4gICAgJ05ldHdvcmsud2ViU29ja2V0RnJhbWVFcnJvcicsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRGcmFtZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldEZyYW1lU2VudCcsXHJcbiAgICAnTmV0d29yay53ZWJTb2NrZXRIYW5kc2hha2VSZXNwb25zZVJlY2VpdmVkJyxcclxuICAgICdOZXR3b3JrLndlYlNvY2tldFdpbGxTZW5kSGFuZHNoYWtlUmVxdWVzdCcsXHJcbiAgICAnTmV0d29yay5yZXF1ZXN0V2lsbEJlU2VudEV4dHJhSW5mbycsXHJcbiAgICAnTmV0d29yay5yZXNvdXJjZUNoYW5nZWRQcmlvcml0eScsXHJcbiAgICAnTmV0d29yay5yZXNwb25zZVJlY2VpdmVkRXh0cmFJbmZvJyxcclxuICAgICdOZXR3b3JrLnNpZ25lZEV4Y2hhbmdlUmVjZWl2ZWQnLFxyXG4gICAgJ05ldHdvcmsucmVxdWVzdEludGVyY2VwdGVkJ1xyXG5dO1xyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOZXR3b3JrU3ViTW9kdWxlIGV4dGVuZHMgT3h5Z2VuU3ViTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHBhcmVudCkge1xyXG4gICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7XHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdChkZXZUb29scykge1xyXG4gICAgICAgIGlmICghZGV2VG9vbHMgfHwgIXRoaXMuX3BhcmVudCB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlciB8fCB0eXBlb2YgdGhpcy5fcGFyZW50LmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhdGhpcy5fcGFyZW50LmdldERyaXZlcigpKSB7XHJcbiAgICAgICAgICAgIHN1cGVyLmluaXQoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9kZXZUb29scyA9IGRldlRvb2xzO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IHRoaXMuX3BhcmVudC5nZXREcml2ZXIoKTtcclxuXHJcbiAgICAgICAgb2JzZXJ2ZS5mb3JFYWNoKG1ldGhvZCA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5vbihtZXRob2QsIHBhcmFtcyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaCh7IG1ldGhvZCwgcGFyYW1zIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRpc3Bvc2UoKSB7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9kcml2ZXIpIHtcclxuXHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlLmZvckVhY2goYXN5bmMgbWV0aG9kID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIucmVtb3ZlTGlzdGVuZXIobWV0aG9kLCAoKSA9PiB7fSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5kaXNhYmxlJyk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9kcml2ZXIuZW1pdCgnTmV0d29yay5jbG9zZScpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAvLyBpZ25vcmUgZXJyb3JzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV2VG9vbHMgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2RyaXZlciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fZXZlbnRzID0gW107XHJcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC4gTmV0d29yayByZXF1ZXN0IGNvbGxlY3Rpb24gaXMgc3VwcG9ydGVkIG9ubHkgb24gQ2hyb21lIDYzIGFuZCBsYXRlci5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiB3ZWIuaW5pdCgpO1xyXG4gICAgICogd2ViLm5ldHdvcmsuc3RhcnQoKTtcclxuICAgICAqIHdlYi5vcGVuKFwiaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tXCIpO1xyXG4gICAgICogLy8gcHJpbnQgdGhlIGNvbGxlY3RlZCByZXF1ZXN0IHNvIGZhcjpcclxuICAgICAqIGxldCByZXF1ZXN0cyA9IHdlYi5uZXR3b3JrLmdldFJlcXVlc3RzKCk7XHJcbiAgICAgKiBmb3IgKGxldCByZXEgb2YgcmVxdWVzdHMpIHtcclxuICAgICAqICAgbG9nLmluZm8ocmVxKTtcclxuICAgICAqIH1cclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHZlcmJhdGltIFVSTCBtYXRjaDpcclxuICAgICAqIHdlYi5uZXR3b3JrLndhaXRGb3JVcmwoJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24gVVJMIG1hdGNoOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvclVybCgvaHR0cHM6XFwvXFwvLipcXC9mb29cXC9iYXIvKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIGN1c3RvbSBtYXRjaGVyOlxyXG4gICAgICogd2ViLm5ldHdvcmsud2FpdEZvcihmdW5jdGlvbiAocmVxdWVzdCkge1xyXG4gICAgICogICByZXR1cm4gcmVxdWVzdC5zdGF0dXNUZXh0ID09PSAnT0snICYmIHJlcXVlc3QudXJsID09PSAnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInO1xyXG4gICAgICogfSk7XHJcbiAgICAgKi9cclxuICAgIHN0YXJ0KCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9ldmVudHMgPSBbXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGFsbCB0aGUgY29sbGVjdGVkIG5ldHdvcmsgcmVxdWVzdHMgc28gZmFyLlxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlcXVlc3RzXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3RbXX0gQXJyYXkgY29udGFpbmluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXRSZXF1ZXN0cygpIHtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9nZXRFbnRyaWVzKCkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGhhciA9IGhhckZyb21NZXNzYWdlcyh0aGlzLl9ldmVudHMpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGhhciAmJiBoYXIubG9nICYmIGhhci5sb2cuZW50cmllcyAmJiBoYXIubG9nLmVudHJpZXMubWFwKSB7XHJcbiAgICAgICAgICAgICAgICBoYXIubG9nLmVudHJpZXMucmV2ZXJzZSgpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKGhhci5sb2cuZW50cmllcy5tYXAoYXN5bmMgKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZUJvZHkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkgPSBhd2FpdCB0aGlzLl9kcml2ZXIuY2RwKCdOZXR3b3JrJywnZ2V0UmVzcG9uc2VCb2R5Jywge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgZ2V0UmVzcG9uc2VCb2R5IGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlQm9keSAmJiByZXNwb25zZUJvZHkuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VCb2R5LmJvZHkgPSBKU09OLnBhcnNlKHJlc3BvbnNlQm9keS5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHBhcnNlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVxdWVzdFBvc3REYXRhID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhID0gYXdhaXQgdGhpcy5fZHJpdmVyLmNkcCgnTmV0d29yaycsJ2dldFJlcXVlc3RQb3N0RGF0YScsIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZDogaXRlbS5fcmVxdWVzdElkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGdldFJlcXVlc3RQb3N0RGF0YSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXRlbS5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkOiBpdGVtLl9yZXF1ZXN0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLml0ZW0ucmVzcG9uc2UsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFBvc3REYXRhXHJcbiAgICAgICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIH0pKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gcGF0dGVybiAtIEFuIFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3JVcmwocGF0dGVybiwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4uY29uc3RydWN0b3IubmFtZSA9PT0gJ1JlZ0V4cCcgJiYgcGF0dGVybi50ZXN0KHJlcS51cmwpIHx8IHBhdHRlcm4gPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgRmFpbCB0aGUgdGVzdCBpZiByZXF1ZXN0IHdpdGggYSBtYXRjaGluZyBVUkwgd2FzIHJlY2VpdmVkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHRpbWUgZnJhbWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvck5vdFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yTm90VXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChwYXR0ZXJuLCAncGF0dGVybicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBjb25zdCBuZXR3b3JrUmVxdWVzdHMgPSBhd2FpdCB0aGlzLl9nZXRFbnRyaWVzKCk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiBuZXR3b3JrUmVxdWVzdHMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgQSByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIG5ldHdvcmtXYWl0Rm9yXHJcbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtYXRjaGVyIC0gTWF0Y2hpbmcgZnVuY3Rpb24uIFNob3VsZCByZXR1cm4gdHJ1ZSBvbiBtYXRjaCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvcihtYXRjaGVyLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fZHJpdmVyIHx8ICF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYG5ldHdvcmtgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2B3ZWIubmV0d29yay5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBuZXR3b3JrYCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50KG1hdGNoZXIsICdtYXRjaGVyJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIocmVxKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9kcml2ZXIgfHwgIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgbmV0d29ya2Agb3IgYHdlYmAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHdlYi5uZXR3b3JrLnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYG5ldHdvcmtgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ldHdvcmtSZXF1ZXN0cyA9IGF3YWl0IHRoaXMuX2dldEVudHJpZXMoKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIG5ldHdvcmtSZXF1ZXN0cykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IHRoaXMuX2RyaXZlci5wYXVzZSg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzdGF0dXNDb2RlICE9PSBtYXRjaGVkUmVxLnN0YXR1cykge1xyXG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZmFpbHVyZU1lc3NhZ2UgfHwgYFRoZSBleHBlY3RlZCBzdGF0dXMgY29kZSBcIiR7c3RhdHVzQ29kZX1cIiBkb2VzIG5vdCBtYXRjaCBcIiR7bWF0Y2hlZFJlcS5zdGF0dXN9XCIuYDtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIG1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB3aGV0aGVyIEhUVFAgcmVzcG9uc2UgY29udGVudCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgb3IgcGF0dGVybi5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRSZXNwb25zZUNvbnRlbnRcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gY29udGVudCAtIEEgcmVzcG9uc2UgYm9keSBjb250ZW50IHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFJlc3BvbnNlQ29udGVudCh1cmwsIGNvbnRlbnQsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2RyaXZlciB8fCAhdGhpcy5faXNJbml0aWFsaXplZCB8fCAhdGhpcy5fcGFyZW50KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2BuZXR3b3JrYCBvciBgd2ViYCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgd2ViLm5ldHdvcmsuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgbmV0d29ya2AgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChjb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV0d29ya1JlcXVlc3RzID0gYXdhaXQgdGhpcy5fZ2V0RW50cmllcygpO1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgbmV0d29ya1JlcXVlc3RzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgdGhpcy5fZHJpdmVyLnBhdXNlKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHRoaXMuX2RyaXZlci5jZHAoJ05ldHdvcmsnLCdnZXRSZXNwb25zZUJvZHknLCB7XHJcbiAgICAgICAgICAgIHJlcXVlc3RJZDogbWF0Y2hlZFJlcS5yZXF1ZXN0SWRcclxuICAgICAgICB9KTtcclxuICAgICAgICBpZiAocmVzcCAmJiByZXNwLmJvZHkgJiYgIXJlc3AuYmFzZTY0RW5jb2RlZCkge1xyXG4gICAgICAgICAgICBpZiAoY29udGVudC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiAoY29udGVudC50ZXN0KHJlc3AuYm9keSkgfHwgcmVzcC5ib2R5LmluZGV4T2YoY29udGVudCkgPiAtMSkpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBSZXNwb25zZSBcIiR7dXJsfVwiIGJvZHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBcIiR7Y29udGVudH0uYDtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFZQTtBQUNBO0FBQ0E7QUFDQTtBQUErQztBQUUvQyxNQUFNQSxPQUFPLEdBQUcsQ0FDWiwyQkFBMkIsRUFDM0Isd0JBQXdCLEVBQ3hCLG9CQUFvQixFQUNwQixvQkFBb0IsRUFDcEIscUJBQXFCLEVBQ3JCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIsNkJBQTZCLEVBQzdCLDhCQUE4QixFQUM5QixxQkFBcUIsRUFDckIscUJBQXFCLEVBQ3JCLGlCQUFpQixFQUNqQixzQ0FBc0MsRUFDdEMsK0JBQStCLEVBQy9CLCtCQUErQixFQUMvQix1QkFBdUIsRUFDdkIsd0JBQXdCLEVBQ3hCLCtCQUErQixFQUMvQixtQkFBbUIsRUFDbkIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiw4QkFBOEIsRUFDOUIsc0JBQXNCLEVBQ3RCLGtDQUFr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
|
|
@@ -4,66 +4,49 @@ 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 _devtoolsService = _interopRequireDefault(require("@wdio/devtools-service"));
|
|
11
|
-
|
|
12
9
|
var _OxygenService = _interopRequireDefault(require("../core/OxygenService"));
|
|
13
|
-
|
|
14
10
|
var _submoduleNetwork = _interopRequireDefault(require("./service-devtools/submodule-network"));
|
|
15
|
-
|
|
16
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
17
|
-
|
|
18
12
|
const CHROME_BROWSER = 'chrome';
|
|
19
|
-
|
|
20
13
|
class DevToolsService extends _OxygenService.default {
|
|
21
14
|
constructor(options, ctx, results, logger) {
|
|
22
15
|
super(options, ctx, results, logger);
|
|
23
16
|
this._subModules = {};
|
|
24
17
|
this.isServiceInitialized = true;
|
|
25
18
|
}
|
|
26
|
-
|
|
27
19
|
onModuleLoaded(module) {
|
|
28
20
|
if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
|
|
29
21
|
return;
|
|
30
22
|
}
|
|
31
|
-
|
|
32
23
|
const networkSubmodule = new _submoduleNetwork.default('network', module);
|
|
33
24
|
module.addSubModule('network', networkSubmodule);
|
|
34
25
|
this._subModules[module.name] = networkSubmodule;
|
|
35
26
|
}
|
|
36
|
-
|
|
37
27
|
async onModuleInitialized(module) {
|
|
38
28
|
if (!module || !module.getDriver || typeof module.getDriver !== 'function' || !module.getCapabilities || typeof module.getCapabilities !== 'function') {
|
|
39
29
|
return;
|
|
40
30
|
}
|
|
41
|
-
|
|
42
31
|
const submodule = this._subModules[module.name];
|
|
43
|
-
|
|
44
32
|
if (!submodule || submodule.isInitialized) {
|
|
45
33
|
return;
|
|
46
34
|
}
|
|
47
|
-
|
|
48
35
|
let options = {};
|
|
49
36
|
const capabilities = module.getCapabilities() || {};
|
|
50
37
|
const {
|
|
51
38
|
browserName
|
|
52
39
|
} = capabilities;
|
|
53
40
|
this._driver = module.getDriver();
|
|
54
|
-
|
|
55
41
|
if (this._driver && this._driver.capabilities && this._driver.capabilities['goog:chromeOptions'] && this._driver.capabilities['goog:chromeOptions']['debuggerAddress']) {
|
|
56
42
|
options.debuggerAddress = this._driver.capabilities['goog:chromeOptions']['debuggerAddress'];
|
|
57
43
|
}
|
|
58
|
-
|
|
59
44
|
if (this._driver.provider === null && browserName && browserName.toLowerCase() === CHROME_BROWSER) {
|
|
60
45
|
const devToolsSvc = new _devtoolsService.default(options);
|
|
61
46
|
const UNSUPPORTED_ERROR_MESSAGE = devToolsSvc.beforeSession(null, capabilities);
|
|
62
|
-
|
|
63
47
|
if (UNSUPPORTED_ERROR_MESSAGE) {
|
|
64
48
|
console.log('UNSUPPORTED_ERROR_MESSAGE', UNSUPPORTED_ERROR_MESSAGE);
|
|
65
49
|
}
|
|
66
|
-
|
|
67
50
|
if (devToolsSvc._isSupported) {
|
|
68
51
|
global.browser = module.getDriver();
|
|
69
52
|
await devToolsSvc.before(null, null, this._driver);
|
|
@@ -71,18 +54,13 @@ class DevToolsService extends _OxygenService.default {
|
|
|
71
54
|
}
|
|
72
55
|
}
|
|
73
56
|
}
|
|
74
|
-
|
|
75
57
|
onModuleWillDispose(module) {
|
|
76
58
|
const submodule = this._subModules[module.name];
|
|
77
|
-
|
|
78
59
|
if (!submodule) {
|
|
79
60
|
return;
|
|
80
61
|
}
|
|
81
|
-
|
|
82
62
|
submodule.dispose();
|
|
83
63
|
}
|
|
84
|
-
|
|
85
64
|
}
|
|
86
|
-
|
|
87
65
|
exports.default = DevToolsService;
|
|
88
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
66
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVfQlJPV1NFUiIsIkRldlRvb2xzU2VydmljZSIsIk94eWdlblNlcnZpY2UiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjdHgiLCJyZXN1bHRzIiwibG9nZ2VyIiwiX3N1Yk1vZHVsZXMiLCJpc1NlcnZpY2VJbml0aWFsaXplZCIsIm9uTW9kdWxlTG9hZGVkIiwibW9kdWxlIiwiZ2V0RHJpdmVyIiwiZ2V0Q2FwYWJpbGl0aWVzIiwibmV0d29ya1N1Ym1vZHVsZSIsIk5ldHdvcmtTdWJNb2R1bGUiLCJhZGRTdWJNb2R1bGUiLCJuYW1lIiwib25Nb2R1bGVJbml0aWFsaXplZCIsInN1Ym1vZHVsZSIsImlzSW5pdGlhbGl6ZWQiLCJjYXBhYmlsaXRpZXMiLCJicm93c2VyTmFtZSIsIl9kcml2ZXIiLCJkZWJ1Z2dlckFkZHJlc3MiLCJwcm92aWRlciIsInRvTG93ZXJDYXNlIiwiZGV2VG9vbHNTdmMiLCJXRElPRGV2VG9vbHNTZXJ2aWNlIiwiVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSIsImJlZm9yZVNlc3Npb24iLCJjb25zb2xlIiwibG9nIiwiX2lzU3VwcG9ydGVkIiwiZ2xvYmFsIiwiYnJvd3NlciIsImJlZm9yZSIsImluaXQiLCJvbk1vZHVsZVdpbGxEaXNwb3NlIiwiZGlzcG9zZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9zZXJ2aWNlcy9zZXJ2aWNlLWRldnRvb2xzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVucmVhY2hhYmxlICovXHJcbmltcG9ydCBXRElPRGV2VG9vbHNTZXJ2aWNlIGZyb20gJ0B3ZGlvL2RldnRvb2xzLXNlcnZpY2UnO1xyXG5cclxuaW1wb3J0IE94eWdlblNlcnZpY2UgZnJvbSAnLi4vY29yZS9PeHlnZW5TZXJ2aWNlJztcclxuaW1wb3J0IE5ldHdvcmtTdWJNb2R1bGUgZnJvbSAnLi9zZXJ2aWNlLWRldnRvb2xzL3N1Ym1vZHVsZS1uZXR3b3JrJztcclxuXHJcbmNvbnN0IENIUk9NRV9CUk9XU0VSID0gJ2Nocm9tZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEZXZUb29sc1NlcnZpY2UgZXh0ZW5kcyBPeHlnZW5TZXJ2aWNlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGN0eCwgcmVzdWx0cywgbG9nZ2VyKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY3R4LCByZXN1bHRzLCBsb2dnZXIpO1xyXG4gICAgICAgIC8vIGhhc2ggb2Ygd2ViZHJpdmVyIGJhc2VkIG1vZHVsZXNcclxuICAgICAgICB0aGlzLl9zdWJNb2R1bGVzID0ge307XHJcbiAgICAgICAgdGhpcy5pc1NlcnZpY2VJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBvbk1vZHVsZUxvYWRlZChtb2R1bGUpIHtcclxuICAgICAgICAvLyBza2lwIGFueSBtb2R1bGUgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgLmdldERyaXZlcigpIG1ldGhvZCAoZS5nLiBub3Qgd2ViZHJpdmVyIGJhc2VkKVxyXG4gICAgICAgIGlmICghbW9kdWxlIHx8ICFtb2R1bGUuZ2V0RHJpdmVyIHx8IHR5cGVvZiBtb2R1bGUuZ2V0RHJpdmVyICE9PSAnZnVuY3Rpb24nIHx8ICFtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzIHx8IHR5cGVvZiBtb2R1bGUuZ2V0Q2FwYWJpbGl0aWVzICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IG5ldHdvcmtTdWJtb2R1bGUgPSBuZXcgTmV0d29ya1N1Yk1vZHVsZSgnbmV0d29yaycsIG1vZHVsZSk7XHJcbiAgICAgICAgbW9kdWxlLmFkZFN1Yk1vZHVsZSgnbmV0d29yaycsIG5ldHdvcmtTdWJtb2R1bGUpO1xyXG4gICAgICAgIHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdID0gbmV0d29ya1N1Ym1vZHVsZTtcclxuICAgIH1cclxuICAgIGFzeW5jIG9uTW9kdWxlSW5pdGlhbGl6ZWQobW9kdWxlKSB7XHJcbiAgICAgICAgLy8gc2tpcCBhbnkgbW9kdWxlIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGdldERyaXZlciBtZXRob2QgKGUuZy4gbm90IHdlYmRyaXZlciBiYXNlZClcclxuICAgICAgICBpZiAoIW1vZHVsZSB8fCAhbW9kdWxlLmdldERyaXZlciB8fCB0eXBlb2YgbW9kdWxlLmdldERyaXZlciAhPT0gJ2Z1bmN0aW9uJyB8fCAhbW9kdWxlLmdldENhcGFiaWxpdGllcyB8fCB0eXBlb2YgbW9kdWxlLmdldENhcGFiaWxpdGllcyAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHN1Ym1vZHVsZSA9IHRoaXMuX3N1Yk1vZHVsZXNbbW9kdWxlLm5hbWVdO1xyXG4gICAgICAgIGlmICghc3VibW9kdWxlIHx8IHN1Ym1vZHVsZS5pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvcHRpb25zID0ge307XHJcbiAgICAgICAgY29uc3QgY2FwYWJpbGl0aWVzID0gbW9kdWxlLmdldENhcGFiaWxpdGllcygpIHx8IHt9O1xyXG4gICAgICAgIGNvbnN0IHsgYnJvd3Nlck5hbWUgfSA9IGNhcGFiaWxpdGllcztcclxuICAgICAgICB0aGlzLl9kcml2ZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyICYmXHJcbiAgICAgICAgICAgIHRoaXMuX2RyaXZlci5jYXBhYmlsaXRpZXMgJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ10gJiZcclxuICAgICAgICAgICAgdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG9wdGlvbnMuZGVidWdnZXJBZGRyZXNzID0gdGhpcy5fZHJpdmVyLmNhcGFiaWxpdGllc1snZ29vZzpjaHJvbWVPcHRpb25zJ11bJ2RlYnVnZ2VyQWRkcmVzcyddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gaWYgd2UgYXJlIG5vdCB1c2luZyBhbnkgM3JkIHBhcnR5IHByb3ZpZGVyXHJcbiAgICAgICAgaWYgKHRoaXMuX2RyaXZlci5wcm92aWRlciA9PT0gbnVsbCAmJiBicm93c2VyTmFtZSAmJiBicm93c2VyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBDSFJPTUVfQlJPV1NFUikge1xyXG4gICAgICAgICAgICAvLyBpbml0aWFsaXplIERldlRvb2xzU2VydmljZSBhbmQgaG9vayBpdCB0byB0aGUgY3VycmVudCB3ZWJkcml2ZXIgb2JqZWN0XHJcbiAgICAgICAgICAgIGNvbnN0IGRldlRvb2xzU3ZjID0gbmV3IFdESU9EZXZUb29sc1NlcnZpY2Uob3B0aW9ucyk7XHJcbiAgICAgICAgICAgIGNvbnN0IFVOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UgPSBkZXZUb29sc1N2Yy5iZWZvcmVTZXNzaW9uKG51bGwsIGNhcGFiaWxpdGllcyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoVU5TVVBQT1JURURfRVJST1JfTUVTU0FHRSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1VOU1VQUE9SVEVEX0VSUk9SX01FU1NBR0UnLCBVTlNVUFBPUlRFRF9FUlJPUl9NRVNTQUdFKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKGRldlRvb2xzU3ZjLl9pc1N1cHBvcnRlZCkge1xyXG4gICAgICAgICAgICAgICAgLy8gY2hhbmdlIGdsb2JhbC5icm93c2VyIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHdlYmRyaXZlciBpbnN0YW5jZVxyXG4gICAgICAgICAgICAgICAgLy8gY29uc3Qgb3JnR2xvYmFsQnJvd3NlciA9IGdsb2JhbC5icm93c2VyO1xyXG4gICAgICAgICAgICAgICAgZ2xvYmFsLmJyb3dzZXIgPSBtb2R1bGUuZ2V0RHJpdmVyKCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBkZXZUb29sc1N2Yy5iZWZvcmUobnVsbCwgbnVsbCwgdGhpcy5fZHJpdmVyKTtcclxuICAgICAgICAgICAgICAgIHN1Ym1vZHVsZS5pbml0KGRldlRvb2xzU3ZjKTtcclxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbC5icm93c2VyID0gb3JnR2xvYmFsQnJvd3NlcjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIG9uTW9kdWxlV2lsbERpc3Bvc2UobW9kdWxlKSB7XHJcbiAgICAgICAgY29uc3Qgc3VibW9kdWxlID0gdGhpcy5fc3ViTW9kdWxlc1ttb2R1bGUubmFtZV07XHJcbiAgICAgICAgaWYgKCFzdWJtb2R1bGUpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzdWJtb2R1bGUuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG59Il0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQ0E7QUFFQTtBQUNBO0FBQW9FO0FBRXBFLE1BQU1BLGNBQWMsR0FBRyxRQUFRO0FBRWhCLE1BQU1DLGVBQWUsU0FBU0Msc0JBQWEsQ0FBQztFQUN2REMsV0FBVyxDQUFDQyxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUU7SUFDdkMsS0FBSyxDQUFDSCxPQUFPLEVBQUVDLEdBQUcsRUFBRUMsT0FBTyxFQUFFQyxNQUFNLENBQUM7SUFFcEMsSUFBSSxDQUFDQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQ3JCLElBQUksQ0FBQ0Msb0JBQW9CLEdBQUcsSUFBSTtFQUNwQztFQUNBQyxjQUFjLENBQUNDLE1BQU0sRUFBRTtJQUVuQixJQUFJLENBQUNBLE1BQU0sSUFBSSxDQUFDQSxNQUFNLENBQUNDLFNBQVMsSUFBSSxPQUFPRCxNQUFNLENB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
|