oxygen-cli 1.25.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/core/OxygenCore.js +266 -37
- package/build/core/OxygenEvents.js +11 -1
- package/build/core/OxygenModule.js +14 -1
- package/build/core/OxygenService.js +12 -1
- package/build/core/OxygenSubModule.js +10 -1
- package/build/core/WebDriverModule.js +30 -1
- package/build/core/utils.js +17 -1
- package/build/errors/HookError.js +7 -1
- package/build/errors/ModuleError.js +7 -1
- package/build/errors/ModuleUnavailableError.js +3 -1
- package/build/errors/OxygenError.js +33 -1
- package/build/errors/ScriptNotFound.js +7 -1
- package/build/errors/helper.js +77 -45
- package/build/index.js +18 -6
- package/build/lib/cli-util.js +90 -28
- package/build/lib/cli.js +23 -1
- package/build/lib/debugger.js +144 -1
- package/build/lib/img-merge.js +15 -1
- package/build/lib/launcher.js +28 -1
- package/build/lib/moduleRequire.js +4 -1
- package/build/lib/param-manager.js +28 -1
- package/build/lib/param-reader-csv.js +15 -1
- package/build/lib/param-reader-excel.js +14 -1
- package/build/lib/param-reader-json.js +10 -1
- package/build/lib/text-to-image.js +183 -0
- package/build/lib/util.js +58 -3
- package/build/model/case-result.js +4 -2
- package/build/model/failure.js +2 -1
- package/build/model/status.js +2 -1
- package/build/model/step-result.js +2 -1
- package/build/model/suite-result.js +2 -1
- package/build/model/test-result.js +2 -1
- package/build/model/testcase.js +2 -1
- package/build/model/testsuite.js +2 -1
- package/build/ox_modules/index.js +33 -13
- package/build/ox_modules/module-assert.js +24 -8
- package/build/ox_modules/module-date.js +8 -3
- package/build/ox_modules/module-db.js +28 -7
- package/build/ox_modules/module-email.js +36 -10
- package/build/ox_modules/module-eyes.js +46 -5
- package/build/ox_modules/module-http.js +102 -41
- package/build/ox_modules/module-log.js +22 -5
- package/build/ox_modules/module-mailinator.js +32 -10
- package/build/ox_modules/module-mob/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-mob/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-mob/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-mob/commands/assertText.js +3 -1
- package/build/ox_modules/module-mob/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-mob/commands/assertValue.js +15 -9
- package/build/ox_modules/module-mob/commands/back.js +2 -1
- package/build/ox_modules/module-mob/commands/clear.js +4 -1
- package/build/ox_modules/module-mob/commands/click.js +4 -3
- package/build/ox_modules/module-mob/commands/clickHidden.js +9 -3
- package/build/ox_modules/module-mob/commands/clickLong.js +2 -1
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-mob/commands/closeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/debug.js +2 -2
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-mob/commands/enableNetwork.js +12 -4
- package/build/ox_modules/module-mob/commands/execute.js +2 -1
- package/build/ox_modules/module-mob/commands/findElement.js +3 -1
- package/build/ox_modules/module-mob/commands/findElements.js +4 -1
- package/build/ox_modules/module-mob/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +10 -1
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +2 -1
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +2 -1
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +9 -1
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +2 -1
- package/build/ox_modules/module-mob/commands/getLocation.js +2 -1
- package/build/ox_modules/module-mob/commands/getSource.js +2 -1
- package/build/ox_modules/module-mob/commands/getText.js +4 -1
- package/build/ox_modules/module-mob/commands/getTitle.js +2 -1
- package/build/ox_modules/module-mob/commands/getUrl.js +2 -1
- package/build/ox_modules/module-mob/commands/getValue.js +9 -5
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +2 -1
- package/build/ox_modules/module-mob/commands/index.js +94 -19
- package/build/ox_modules/module-mob/commands/installApp.js +2 -1
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +2 -1
- package/build/ox_modules/module-mob/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-mob/commands/isChecked.js +2 -1
- package/build/ox_modules/module-mob/commands/isClickable.js +2 -1
- package/build/ox_modules/module-mob/commands/isExist.js +3 -1
- package/build/ox_modules/module-mob/commands/isSelected.js +2 -1
- package/build/ox_modules/module-mob/commands/isVisible.js +3 -1
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +2 -1
- package/build/ox_modules/module-mob/commands/launchApp.js +2 -1
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +2 -1
- package/build/ox_modules/module-mob/commands/open.js +3 -1
- package/build/ox_modules/module-mob/commands/pause.js +2 -1
- package/build/ox_modules/module-mob/commands/removeApp.js +2 -1
- package/build/ox_modules/module-mob/commands/resetApp.js +2 -1
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +6 -1
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +2 -1
- package/build/ox_modules/module-mob/commands/select.js +4 -1
- package/build/ox_modules/module-mob/commands/selectFrame.js +4 -1
- package/build/ox_modules/module-mob/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-mob/commands/sendKeys.js +9 -6
- package/build/ox_modules/module-mob/commands/setContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setNativeContext.js +2 -1
- package/build/ox_modules/module-mob/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +6 -3
- package/build/ox_modules/module-mob/commands/shake.js +2 -1
- package/build/ox_modules/module-mob/commands/smsClickLink.js +2 -1
- package/build/ox_modules/module-mob/commands/smsGetText.js +6 -3
- package/build/ox_modules/module-mob/commands/swipe.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeElement.js +2 -1
- package/build/ox_modules/module-mob/commands/swipeScreen.js +2 -1
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-mob/commands/tap.js +2 -1
- package/build/ox_modules/module-mob/commands/type.js +7 -3
- package/build/ox_modules/module-mob/commands/unlockPattern.js +10 -9
- package/build/ox_modules/module-mob/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +3 -1
- package/build/ox_modules/module-mob/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-mob.js +141 -72
- package/build/ox_modules/module-pdf.js +62 -23
- package/build/ox_modules/module-proxy.js +68 -8
- package/build/ox_modules/module-serial.js +32 -7
- package/build/ox_modules/module-shell.js +27 -8
- package/build/ox_modules/module-soap.js +47 -14
- package/build/ox_modules/module-twilio.js +53 -10
- package/build/ox_modules/module-utils.js +51 -16
- package/build/ox_modules/module-web/commands/alertAccept.js +2 -1
- package/build/ox_modules/module-web/commands/alertDismiss.js +2 -1
- package/build/ox_modules/module-web/commands/assertAlert.js +6 -1
- package/build/ox_modules/module-web/commands/assertExist.js +2 -1
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +4 -1
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +3 -1
- package/build/ox_modules/module-web/commands/assertText.js +3 -1
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTextPresent.js +6 -1
- package/build/ox_modules/module-web/commands/assertTitle.js +3 -1
- package/build/ox_modules/module-web/commands/assertValue.js +3 -1
- package/build/ox_modules/module-web/commands/back.js +2 -1
- package/build/ox_modules/module-web/commands/clear.js +5 -1
- package/build/ox_modules/module-web/commands/click.js +13 -4
- package/build/ox_modules/module-web/commands/clickHidden.js +7 -2
- package/build/ox_modules/module-web/commands/closeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/debug.js +2 -2
- package/build/ox_modules/module-web/commands/deleteCookies.js +2 -1
- package/build/ox_modules/module-web/commands/deselect.js +2 -1
- package/build/ox_modules/module-web/commands/doubleClick.js +9 -3
- package/build/ox_modules/module-web/commands/dragAndDrop.js +2 -1
- package/build/ox_modules/module-web/commands/execute.js +2 -1
- package/build/ox_modules/module-web/commands/fileBrowse.js +10 -4
- package/build/ox_modules/module-web/commands/findElement.js +3 -1
- package/build/ox_modules/module-web/commands/findElements.js +4 -1
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +2 -1
- package/build/ox_modules/module-web/commands/getAlertText.js +2 -1
- package/build/ox_modules/module-web/commands/getAttribute.js +4 -1
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +3 -1
- package/build/ox_modules/module-web/commands/getCookies.js +2 -1
- package/build/ox_modules/module-web/commands/getCssValue.js +4 -1
- package/build/ox_modules/module-web/commands/getElementCount.js +2 -1
- package/build/ox_modules/module-web/commands/getHTML.js +2 -1
- package/build/ox_modules/module-web/commands/getSource.js +2 -1
- package/build/ox_modules/module-web/commands/getText.js +4 -1
- package/build/ox_modules/module-web/commands/getTitle.js +2 -1
- package/build/ox_modules/module-web/commands/getUrl.js +2 -1
- package/build/ox_modules/module-web/commands/getValue.js +5 -1
- package/build/ox_modules/module-web/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-web/commands/getWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +5 -1
- package/build/ox_modules/module-web/commands/index.js +100 -19
- package/build/ox_modules/module-web/commands/isAlertPresent.js +2 -1
- package/build/ox_modules/module-web/commands/isChecked.js +2 -1
- package/build/ox_modules/module-web/commands/isExist.js +3 -1
- package/build/ox_modules/module-web/commands/isInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/isSelected.js +2 -1
- package/build/ox_modules/module-web/commands/isVisible.js +3 -1
- package/build/ox_modules/module-web/commands/makeVisible.js +10 -2
- package/build/ox_modules/module-web/commands/maximizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/minimizeWindow.js +2 -1
- package/build/ox_modules/module-web/commands/newWindow.js +2 -1
- package/build/ox_modules/module-web/commands/open.js +4 -1
- package/build/ox_modules/module-web/commands/pause.js +2 -1
- package/build/ox_modules/module-web/commands/point.js +2 -1
- package/build/ox_modules/module-web/commands/pointJS.js +8 -2
- package/build/ox_modules/module-web/commands/refresh.js +2 -1
- package/build/ox_modules/module-web/commands/rightClick.js +8 -3
- package/build/ox_modules/module-web/commands/rightClickActions.js +2 -1
- package/build/ox_modules/module-web/commands/scrollToElement.js +2 -1
- package/build/ox_modules/module-web/commands/select.js +5 -1
- package/build/ox_modules/module-web/commands/selectFrame.js +3 -1
- package/build/ox_modules/module-web/commands/selectWindow.js +26 -5
- package/build/ox_modules/module-web/commands/sendKeys.js +6 -3
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -2
- package/build/ox_modules/module-web/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-web/commands/setWindowSize.js +2 -1
- package/build/ox_modules/module-web/commands/takeScreenshot.js +5 -3
- package/build/ox_modules/module-web/commands/type.js +5 -1
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -6
- package/build/ox_modules/module-web/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-web/commands/waitForInteractable.js +2 -1
- package/build/ox_modules/module-web/commands/waitForNotExist.js +8 -1
- package/build/ox_modules/module-web/commands/waitForNotText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForNotValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForText.js +3 -1
- package/build/ox_modules/module-web/commands/waitForValue.js +3 -1
- package/build/ox_modules/module-web/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-web/commands/waitForWindow.js +21 -4
- package/build/ox_modules/module-web.js +181 -82
- package/build/ox_modules/module-win/commands/assertText.js +3 -1
- package/build/ox_modules/module-win/commands/assertTitle.js +4 -1
- package/build/ox_modules/module-win/commands/assertValue.js +15 -9
- package/build/ox_modules/module-win/commands/back.js +2 -1
- package/build/ox_modules/module-win/commands/clear.js +4 -1
- package/build/ox_modules/module-win/commands/click.js +2 -1
- package/build/ox_modules/module-win/commands/clickLong.js +2 -1
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +4 -1
- package/build/ox_modules/module-win/commands/findElement.js +3 -1
- package/build/ox_modules/module-win/commands/findElements.js +4 -1
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +2 -1
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +2 -1
- package/build/ox_modules/module-win/commands/getLocation.js +2 -1
- package/build/ox_modules/module-win/commands/getSource.js +2 -1
- package/build/ox_modules/module-win/commands/getText.js +4 -1
- package/build/ox_modules/module-win/commands/getValue.js +9 -5
- package/build/ox_modules/module-win/commands/getWindowHandles.js +2 -1
- package/build/ox_modules/module-win/commands/index.js +43 -5
- package/build/ox_modules/module-win/commands/isCheckable.js +2 -1
- package/build/ox_modules/module-win/commands/isChecked.js +2 -1
- package/build/ox_modules/module-win/commands/isClickable.js +2 -1
- package/build/ox_modules/module-win/commands/isExist.js +3 -1
- package/build/ox_modules/module-win/commands/isSelected.js +2 -1
- package/build/ox_modules/module-win/commands/isVisible.js +3 -1
- package/build/ox_modules/module-win/commands/open.js +2 -1
- package/build/ox_modules/module-win/commands/pause.js +2 -1
- package/build/ox_modules/module-win/commands/rightClick.js +2 -1
- package/build/ox_modules/module-win/commands/selectWindow.js +15 -1
- package/build/ox_modules/module-win/commands/sendKeys.js +4 -1
- package/build/ox_modules/module-win/commands/setTimeout.js +2 -1
- package/build/ox_modules/module-win/commands/takeScreenshot.js +2 -1
- package/build/ox_modules/module-win/commands/tap.js +2 -1
- package/build/ox_modules/module-win/commands/type.js +4 -1
- package/build/ox_modules/module-win/commands/waitForExist.js +2 -1
- package/build/ox_modules/module-win/commands/waitForInteractable.js +4 -1
- package/build/ox_modules/module-win/commands/waitForVisible.js +2 -1
- package/build/ox_modules/module-win.js +87 -48
- package/build/ox_modules/utils.js +76 -22
- package/build/ox_reporters/reporter-excel.js +58 -1
- package/build/ox_reporters/reporter-html.js +28 -1
- package/build/ox_reporters/reporter-json.js +14 -1
- package/build/ox_reporters/reporter-junit.js +24 -1
- package/build/ox_reporters/reporter-pdf.js +19 -1
- package/build/ox_reporters/reporter-xml.js +17 -1
- package/build/ox_services/service-devtools/submodule-network.js +91 -4
- package/build/ox_services/service-devtools.js +23 -1
- package/build/reporter/FileReporterBase.js +44 -5
- package/build/reporter/ReportAggregator.js +65 -1
- package/build/reporter/ReporterBase.js +6 -1
- package/build/runners/WorkerProcess.js +99 -1
- package/build/runners/cucumber/CucumberEventListener.js +29 -4
- package/build/runners/cucumber/CucumberReporter.js +56 -1
- package/build/runners/cucumber/CucumberWorker.js +66 -1
- package/build/runners/cucumber/index.js +30 -1
- package/build/runners/cucumber/worker.js +18 -1
- package/build/runners/index.js +6 -1
- package/build/runners/oxygen/OxygenWorker.js +60 -3
- package/build/runners/oxygen/index.js +178 -17
- package/build/runners/oxygen/worker.js +25 -2
- package/package.json +8 -8
- package/.babelrc +0 -28
- package/.eslintrc.json +0 -25
- package/.husky/pre-commit +0 -4
- package/CONTRIBUTE.md +0 -1
|
@@ -6,26 +6,35 @@
|
|
|
6
6
|
* the Free Software Foundation, either version 3 of the License, or
|
|
7
7
|
* (at your option) any later version.
|
|
8
8
|
*/
|
|
9
|
-
|
|
10
9
|
'use strict';
|
|
11
|
-
|
|
12
10
|
/**
|
|
13
11
|
* @name proxy
|
|
14
12
|
* @description Provides methods for intercepting network traffic via mitmproxy.
|
|
15
13
|
*/
|
|
14
|
+
|
|
16
15
|
Object.defineProperty(exports, "__esModule", {
|
|
17
16
|
value: true
|
|
18
17
|
});
|
|
19
18
|
exports.default = void 0;
|
|
19
|
+
|
|
20
20
|
require("source-map-support/register");
|
|
21
|
+
|
|
21
22
|
var _util = _interopRequireDefault(require("../lib/util"));
|
|
23
|
+
|
|
22
24
|
var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
|
|
25
|
+
|
|
23
26
|
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
27
|
+
|
|
24
28
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
29
|
+
|
|
25
30
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
31
|
+
|
|
26
32
|
var _mitmproxyNode = _interopRequireDefault(require("@oxygenhq/mitmproxy-node"));
|
|
33
|
+
|
|
27
34
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
35
|
+
|
|
28
36
|
const MODULE_NAME = 'proxy';
|
|
37
|
+
|
|
29
38
|
class ProxyModule extends _OxygenModule.default {
|
|
30
39
|
constructor(options, context, rs, logger, modules, services) {
|
|
31
40
|
super(options, context, rs, logger, modules, services);
|
|
@@ -37,10 +46,10 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
37
46
|
this._proxyExternalyLaunched = true;
|
|
38
47
|
this._isInitialized = false;
|
|
39
48
|
}
|
|
49
|
+
|
|
40
50
|
get name() {
|
|
41
51
|
return MODULE_NAME;
|
|
42
52
|
}
|
|
43
|
-
|
|
44
53
|
/**
|
|
45
54
|
* @function init
|
|
46
55
|
* @summary Initializes proxy.
|
|
@@ -52,6 +61,8 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
52
61
|
* @example <caption>[shell] Launching mitmproxy manually</caption>
|
|
53
62
|
* mitmdump --anticache -s mitmproxy-node\scripts\proxy.py --ssl-insecure --set httpCommPort=8765
|
|
54
63
|
*/
|
|
64
|
+
|
|
65
|
+
|
|
55
66
|
async init(proxyPort, proxyCommPort = null, saveRequestBody = false, saveResponseBody = false) {
|
|
56
67
|
this._saveRequestBody = saveRequestBody;
|
|
57
68
|
this._saveResponseBody = saveResponseBody;
|
|
@@ -61,11 +72,12 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
61
72
|
this._proxyExternalyLaunched = !!proxyCommPort;
|
|
62
73
|
return true;
|
|
63
74
|
}
|
|
64
|
-
|
|
65
75
|
/**
|
|
66
76
|
* @function dispose
|
|
67
77
|
* @summary Disposes this module.
|
|
68
78
|
*/
|
|
79
|
+
|
|
80
|
+
|
|
69
81
|
async dispose(status) {
|
|
70
82
|
try {
|
|
71
83
|
if (this._proxy) {
|
|
@@ -75,6 +87,7 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
75
87
|
} catch (e) {
|
|
76
88
|
console.log('Failed to dispose the proxy', e);
|
|
77
89
|
}
|
|
90
|
+
|
|
78
91
|
this._proxy = null;
|
|
79
92
|
this._networkTraffic = [];
|
|
80
93
|
super.dispose();
|
|
@@ -100,6 +113,8 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
100
113
|
* return request.status === '200' && request.url === 'https://www.yourwebsite.com/foo/bar';
|
|
101
114
|
* });
|
|
102
115
|
*/
|
|
116
|
+
|
|
117
|
+
|
|
103
118
|
start() {
|
|
104
119
|
this._collectData = true;
|
|
105
120
|
this._networkTraffic = [];
|
|
@@ -108,6 +123,8 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
108
123
|
* @summary Stop collecting network requests.
|
|
109
124
|
* @function stop
|
|
110
125
|
*/
|
|
126
|
+
|
|
127
|
+
|
|
111
128
|
stop() {
|
|
112
129
|
this._collectData = false;
|
|
113
130
|
}
|
|
@@ -116,6 +133,8 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
116
133
|
* @function getRequests
|
|
117
134
|
* @return {Object[]} Array containing network requests.
|
|
118
135
|
*/
|
|
136
|
+
|
|
137
|
+
|
|
119
138
|
getRequests() {
|
|
120
139
|
return this._networkTraffic;
|
|
121
140
|
}
|
|
@@ -126,27 +145,35 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
126
145
|
* @param {Number=} timeout - Timeout. Default is 60 seconds.
|
|
127
146
|
* @return {Object} Network request details if the network request was found.
|
|
128
147
|
*/
|
|
148
|
+
|
|
149
|
+
|
|
129
150
|
async waitForUrl(pattern, timeout = 60 * 1000) {
|
|
130
151
|
if (!this._isInitialized) {
|
|
131
152
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
|
|
132
153
|
}
|
|
154
|
+
|
|
133
155
|
if (!this._collectData) {
|
|
134
156
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
|
|
135
157
|
}
|
|
158
|
+
|
|
136
159
|
_utils.default.assertArgument(pattern, 'pattern');
|
|
160
|
+
|
|
137
161
|
_utils.default.assertArgumentTimeout(timeout, 'timeout');
|
|
162
|
+
|
|
138
163
|
const start = Date.now();
|
|
164
|
+
|
|
139
165
|
while (Date.now() - start < timeout) {
|
|
140
166
|
for (let req of this._networkTraffic) {
|
|
141
167
|
if (pattern.constructor.name === 'RegExp' && pattern.test(req.url) || pattern === req.url) {
|
|
142
168
|
return req;
|
|
143
169
|
}
|
|
144
170
|
}
|
|
171
|
+
|
|
145
172
|
await _util.default.sleep(500);
|
|
146
173
|
}
|
|
174
|
+
|
|
147
175
|
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, `No request matching the URL "${pattern}" was found.`);
|
|
148
176
|
}
|
|
149
|
-
|
|
150
177
|
/**
|
|
151
178
|
* @summary Wait for a network request.
|
|
152
179
|
* @function waitFor
|
|
@@ -154,27 +181,35 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
154
181
|
* @param {Number=} timeout - Timeout. Default is 60 seconds.
|
|
155
182
|
* @return {Object} Network request details if the network request was found.
|
|
156
183
|
*/
|
|
184
|
+
|
|
185
|
+
|
|
157
186
|
async waitFor(matcher, timeout = 60 * 1000) {
|
|
158
187
|
if (!this._isInitialized || !this._parent) {
|
|
159
188
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
|
|
160
189
|
}
|
|
190
|
+
|
|
161
191
|
if (!this._collectData) {
|
|
162
192
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
|
|
163
193
|
}
|
|
194
|
+
|
|
164
195
|
this._parent.helpers.assertArgument(matcher, 'matcher');
|
|
196
|
+
|
|
165
197
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
198
|
+
|
|
166
199
|
const start = Date.now();
|
|
200
|
+
|
|
167
201
|
while (Date.now() - start < timeout) {
|
|
168
202
|
for (var req of this._networkTraffic) {
|
|
169
203
|
if (matcher(req)) {
|
|
170
204
|
return req;
|
|
171
205
|
}
|
|
172
206
|
}
|
|
207
|
+
|
|
173
208
|
await _util.default.sleep(500);
|
|
174
209
|
}
|
|
210
|
+
|
|
175
211
|
throw new _OxygenError.default(_helper.default.errorCode.TIMEOUT, 'No request found using the provided matcher.');
|
|
176
212
|
}
|
|
177
|
-
|
|
178
213
|
/**
|
|
179
214
|
* @summary Assert if network request matching the specified URL.
|
|
180
215
|
* @function assertUrl
|
|
@@ -182,27 +217,35 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
182
217
|
* @param {Number=} timeout - Timeout. Default is 60 seconds.
|
|
183
218
|
* @return {Object} Network request details if the network request was found.
|
|
184
219
|
*/
|
|
220
|
+
|
|
221
|
+
|
|
185
222
|
async assertUrl(url, timeout = 60 * 1000) {
|
|
186
223
|
if (!this._isInitialized || !this._parent) {
|
|
187
224
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
|
|
188
225
|
}
|
|
226
|
+
|
|
189
227
|
if (!this._collectData) {
|
|
190
228
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
|
|
191
229
|
}
|
|
230
|
+
|
|
192
231
|
this._parent.helpers.assertArgument(url, 'url');
|
|
232
|
+
|
|
193
233
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
234
|
+
|
|
194
235
|
const start = Date.now();
|
|
236
|
+
|
|
195
237
|
while (Date.now() - start < timeout) {
|
|
196
238
|
for (let req of this._networkTraffic) {
|
|
197
239
|
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
198
240
|
return req;
|
|
199
241
|
}
|
|
200
242
|
}
|
|
243
|
+
|
|
201
244
|
await _util.default.sleep(500);
|
|
202
245
|
}
|
|
246
|
+
|
|
203
247
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
204
248
|
}
|
|
205
|
-
|
|
206
249
|
/**
|
|
207
250
|
* @summary Assert whether HTTP response status code matches the specified value.
|
|
208
251
|
* @function assertStatusCode
|
|
@@ -212,18 +255,26 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
212
255
|
* @param {Number=} timeout - Timeout. Default is 60 seconds.
|
|
213
256
|
* @return {Object} Network request details if the network request was found.
|
|
214
257
|
*/
|
|
258
|
+
|
|
259
|
+
|
|
215
260
|
async assertStatusCode(url, statusCode, failureMessage = null, timeout = 60 * 1000) {
|
|
216
261
|
if (!this._isInitialized || !this._parent) {
|
|
217
262
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy` module is not initialized.');
|
|
218
263
|
}
|
|
264
|
+
|
|
219
265
|
if (!this._collectData) {
|
|
220
266
|
throw new _OxygenError.default(_helper.default.errorCode.MODULE_NOT_INITIALIZED_ERROR, '`proxy.start()` must be executed prior to using `proxy` commands.');
|
|
221
267
|
}
|
|
268
|
+
|
|
222
269
|
this._parent.helpers.assertArgument(url, 'url');
|
|
270
|
+
|
|
223
271
|
this._parent.helpers.assertArgument(statusCode, 'statusCode');
|
|
272
|
+
|
|
224
273
|
this._parent.helpers.assertArgumentTimeout(timeout, 'timeout');
|
|
274
|
+
|
|
225
275
|
const start = Date.now();
|
|
226
276
|
let matchedReq = null;
|
|
277
|
+
|
|
227
278
|
while (Date.now() - start < timeout && !matchedReq) {
|
|
228
279
|
for (let req of this._networkTraffic) {
|
|
229
280
|
if (url.constructor.name === 'RegExp' && url.test(req.url) || url === req.url) {
|
|
@@ -231,16 +282,20 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
231
282
|
break;
|
|
232
283
|
}
|
|
233
284
|
}
|
|
285
|
+
|
|
234
286
|
!matchedReq && (await _util.default.sleep(500));
|
|
235
287
|
}
|
|
288
|
+
|
|
236
289
|
if (!matchedReq) {
|
|
237
290
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `No request matching the URL "${url}" was found.`);
|
|
238
291
|
}
|
|
292
|
+
|
|
239
293
|
if (statusCode !== matchedReq.status) {
|
|
240
294
|
const message = failureMessage || `The expected status code "${statusCode}" does not match "${matchedReq.status}".`;
|
|
241
295
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, message);
|
|
242
296
|
}
|
|
243
297
|
}
|
|
298
|
+
|
|
244
299
|
_onNetworkIntercept(msg) {
|
|
245
300
|
if (this._collectData) {
|
|
246
301
|
let obj = {
|
|
@@ -250,15 +305,20 @@ class ProxyModule extends _OxygenModule.default {
|
|
|
250
305
|
requestHeaders: msg.request.headers,
|
|
251
306
|
responseHeaders: msg.response.headers
|
|
252
307
|
};
|
|
308
|
+
|
|
253
309
|
if (this._saveRequestBody) {
|
|
254
310
|
obj.requestBody = msg.request.body;
|
|
255
311
|
}
|
|
312
|
+
|
|
256
313
|
if (this._saveResponseBody) {
|
|
257
314
|
obj.responseBody = msg.response.body;
|
|
258
315
|
}
|
|
316
|
+
|
|
259
317
|
this._networkTraffic.push(obj);
|
|
260
318
|
}
|
|
261
319
|
}
|
|
320
|
+
|
|
262
321
|
}
|
|
322
|
+
|
|
263
323
|
exports.default = ProxyModule;
|
|
264
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlByb3h5TW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX25ldHdvcmtUcmFmZmljIiwiX2NvbGxlY3REYXRhIiwiX3NhdmVSZXF1ZXN0Qm9keSIsIl9zYXZlUmVzcG9uc2VCb2R5IiwiX3Byb3h5IiwiX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJpbml0IiwicHJveHlQb3J0IiwicHJveHlDb21tUG9ydCIsInNhdmVSZXF1ZXN0Qm9keSIsInNhdmVSZXNwb25zZUJvZHkiLCJNSVRNUHJveHkiLCJDcmVhdGUiLCJfb25OZXR3b3JrSW50ZXJjZXB0IiwiYmluZCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTWl0bSIsInNodXRkb3duIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbid1c2Ugc3RyaWN0JztcclxuLyoqXHJcbiAqIEBuYW1lIHByb3h5XHJcbiAqIEBkZXNjcmlwdGlvbiBQcm92aWRlcyBtZXRob2RzIGZvciBpbnRlcmNlcHRpbmcgbmV0d29yayB0cmFmZmljIHZpYSBtaXRtcHJveHkuXHJcbiAqL1xyXG5cclxuaW1wb3J0IGxpYlV0aWxzIGZyb20gJy4uL2xpYi91dGlsJztcclxuaW1wb3J0IE94eWdlbk1vZHVsZSBmcm9tICcuLi9jb3JlL094eWdlbk1vZHVsZSc7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBoZWxwZXJzIGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgTUlUTVByb3h5IGZyb20gJ0BveHlnZW5ocS9taXRtcHJveHktbm9kZSc7XHJcblxyXG5jb25zdCBNT0RVTEVfTkFNRSA9ICdwcm94eSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm94eU1vZHVsZSBleHRlbmRzIE94eWdlbk1vZHVsZSB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcykge1xyXG4gICAgICAgIHN1cGVyKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKTtcclxuICAgICAgICB0aGlzLl9uZXR3b3JrVHJhZmZpYyA9IFtdO1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlcXVlc3RCb2R5ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlc3BvbnNlQm9keSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG5hbWUoKSB7XHJcbiAgICAgICAgcmV0dXJuIE1PRFVMRV9OQU1FO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGZ1bmN0aW9uIGluaXRcclxuICAgICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHByb3h5LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHByb3h5UG9ydCAtIFByb3h5IHBvcnQuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHByb3h5Q29tbVBvcnQgLSBQb3J0IGZvciBpbnRlcm5hbCBwcm94eSBjb21tdW5pY2F0aW9uLiBJZiBzcGVjaWZpZWQsIHRoZW4gbWl0bXByb3h5IHNob3VsZCBiZSBsYXVuY2hlZCBtYW51YWxseS5cclxuICAgICAqIE90aGVyd2lzZSBtaXRtcG94eSB3aWxsIGJlIGxhdW5jaGVkIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW49fSBzYXZlUmVxdWVzdEJvZHkgLSBTYXZlIHJlcXVlc3QgYm9kaWVzLlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlc3BvbnNlQm9keSAtIFNhdmUgcmVzcG9uc2UgYm9kaWVzLlxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W3NoZWxsXSBMYXVuY2hpbmcgbWl0bXByb3h5IG1hbnVhbGx5PC9jYXB0aW9uPlxyXG4gICAgICogbWl0bWR1bXAgLS1hbnRpY2FjaGUgLXMgbWl0bXByb3h5LW5vZGVcXHNjcmlwdHNcXHByb3h5LnB5IC0tc3NsLWluc2VjdXJlIC0tc2V0IGh0dHBDb21tUG9ydD04NzY1XHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGluaXQocHJveHlQb3J0LCBwcm94eUNvbW1Qb3J0ID0gbnVsbCwgc2F2ZVJlcXVlc3RCb2R5ID0gZmFsc2UsIHNhdmVSZXNwb25zZUJvZHkgPSBmYWxzZSkge1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSA9IHNhdmVSZXF1ZXN0Qm9keTtcclxuICAgICAgICB0aGlzLl9zYXZlUmVzcG9uc2VCb2R5ID0gc2F2ZVJlc3BvbnNlQm9keTtcclxuXHJcbiAgICAgICAgdGhpcy5fcHJveHkgPSBhd2FpdCBNSVRNUHJveHkuQ3JlYXRlKHRoaXMuX29uTmV0d29ya0ludGVyY2VwdC5iaW5kKHRoaXMpLCBwcm94eVBvcnQsIHByb3h5Q29tbVBvcnQsIFsnL2V2YWwnXSwgdHJ1ZSwgZmFsc2UpO1xyXG5cclxuICAgICAgICBzdXBlci5pbml0KCk7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9ICEhcHJveHlDb21tUG9ydDtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBkaXNwb3NlXHJcbiAgICAgKiBAc3VtbWFyeSBEaXNwb3NlcyB0aGlzIG1vZHVsZS5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgZGlzcG9zZShzdGF0dXMpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fcHJveHkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRpc3Bvc2VNaXRtID0gIXRoaXMuX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQ7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9wcm94eS5zaHV0ZG93bihkaXNwb3NlTWl0bSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdGYWlsZWQgdG8gZGlzcG9zZSB0aGUgcHJveHknLCBlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9uZXR3b3JrVHJhZmZpYyA9IFtdO1xyXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQmVnaW4gY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIEFueSBwcmV2aW91c2x5IGNvbGxlY3RlZCByZXF1ZXN0cyB3aWxsIGJlIGRpc2NhcmRlZC5cclxuICAgICAqIEBmdW5jdGlvbiBzdGFydFxyXG4gICAgICogQGV4YW1wbGUgPGNhcHRpb24+W2phdmFzY3JpcHRdIFVzYWdlIGV4YW1wbGU8L2NhcHRpb24+XHJcbiAgICAgKiBwcm94eS5pbml0KDgwODApO1xyXG4gICAgICogcHJveHkuc3RhcnQoKTtcclxuICAgICAqIC8vIHByaW50IHRoZSBjb2xsZWN0ZWQgcmVxdWVzdCBzbyBmYXI6XHJcbiAgICAgKiBsZXQgcmVxdWVzdHMgPSBwcm94eS5nZXRSZXF1ZXN0cygpO1xyXG4gICAgICogZm9yIChsZXQgcmVxIG9mIHJlcXVlc3RzKSB7XHJcbiAgICAgKiAgIGxvZy5pbmZvKHJlcSk7XHJcbiAgICAgKiB9XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSB2ZXJiYXRpbSBVUkwgbWF0Y2g6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKCdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2JhcicpO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgcmVndWxhciBleHByZXNzaW9uIFVSTCBtYXRjaDpcclxuICAgICAqIHByb3h5LndhaXRGb3JVcmwoL2h0dHBzOlxcL1xcLy4qXFwvZm9vXFwvYmFyLyk7XHJcbiAgICAgKiAvLyB3YWl0IGZvciBhIHJlcXVlc3QgdXNpbmcgYSBjdXN0b20gbWF0Y2hlcjpcclxuICAgICAqIHByb3h5LndhaXRGb3IoZnVuY3Rpb24gKHJlcXVlc3QpIHtcclxuICAgICAqICAgcmV0dXJuIHJlcXVlc3Quc3RhdHVzID09PSAnMjAwJyAmJiByZXF1ZXN0LnVybCA9PT0gJ2h0dHBzOi8vd3d3LnlvdXJ3ZWJzaXRlLmNvbS9mb28vYmFyJztcclxuICAgICAqIH0pO1xyXG4gICAgICovXHJcbiAgICBzdGFydCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU3RvcCBjb2xsZWN0aW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RvcFxyXG4gICAgICovXHJcbiAgICBzdG9wKCkge1xyXG4gICAgICAgIHRoaXMuX2NvbGxlY3REYXRhID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFJldHVybiBhbGwgdGhlIGNvbGxlY3RlZCBuZXR3b3JrIHJlcXVlc3RzIHNvIGZhci5cclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXF1ZXN0c1xyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IGNvbnRhaW5pbmcgbmV0d29yayByZXF1ZXN0cy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVxdWVzdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX25ldHdvcmtUcmFmZmljO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXYWl0IGZvciBhIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVXJsXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHBhdHRlcm4gLSBBbiBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yVXJsKHBhdHRlcm4sIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eWAgbW9kdWxlIGlzIG5vdCBpbml0aWFsaXplZC4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5LnN0YXJ0KClgIG11c3QgYmUgZXhlY3V0ZWQgcHJpb3IgdG8gdXNpbmcgYHByb3h5YCBjb21tYW5kcy4nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGhlbHBlcnMuYXNzZXJ0QXJndW1lbnQocGF0dGVybiwgJ3BhdHRlcm4nKTtcclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCByZXEgb2YgdGhpcy5fbmV0d29ya1RyYWZmaWMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHBhdHRlcm4udGVzdChyZXEudXJsKSB8fCBwYXR0ZXJuID09PSByZXEudXJsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3BhdHRlcm59XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclxyXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gbWF0Y2hlciAtIE1hdGNoaW5nIGZ1bmN0aW9uLiBTaG91bGQgcmV0dXJuIHRydWUgb24gbWF0Y2gsIG9yIGZhbHNlIG90aGVyd2lzZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHdhaXRGb3IobWF0Y2hlciwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChtYXRjaGVyLCAnbWF0Y2hlcicpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB3aGlsZSAoRGF0ZS5ub3coKSAtIHN0YXJ0IDwgdGltZW91dCkge1xyXG4gICAgICAgICAgICBmb3IgKHZhciByZXEgb2YgdGhpcy5fbmV0d29ya1RyYWZmaWMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVyKHJlcSkpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuVElNRU9VVCwgJ05vIHJlcXVlc3QgZm91bmQgdXNpbmcgdGhlIHByb3ZpZGVkIG1hdGNoZXIuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgaWYgbmV0d29yayByZXF1ZXN0IG1hdGNoaW5nIHRoZSBzcGVjaWZpZWQgVVJMLlxyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0VXJsKHVybCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBObyByZXF1ZXN0IG1hdGNoaW5nIHRoZSBVUkwgXCIke3VybH1cIiB3YXMgZm91bmQuYCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBBc3NlcnQgd2hldGhlciBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlIG1hdGNoZXMgdGhlIHNwZWNpZmllZCB2YWx1ZS5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNDb2RlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xSZWdFeHB9IHVybCAtIEEgcmVxdWVzdCBVUkwgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gc3RhdHVzQ29kZSAtIEEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgdG8gbWF0Y2ggdmVyYmF0aW0gb3IgYSBSZWdFeHAuXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZz19IGZhaWx1cmVNZXNzYWdlIC0gQW4gb3B0aW9uYWwgZmFpbHVyZSBtZXNzYWdlLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgYXNzZXJ0U3RhdHVzQ29kZSh1cmwsIHN0YXR1c0NvZGUsIGZhaWx1cmVNZXNzYWdlID0gbnVsbCwgdGltZW91dCA9IDYwKjEwMDApIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2lzSW5pdGlhbGl6ZWQgfHwgIXRoaXMuX3BhcmVudCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudCh1cmwsICd1cmwnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudChzdGF0dXNDb2RlLCAnc3RhdHVzQ29kZScpO1xyXG4gICAgICAgIHRoaXMuX3BhcmVudC5oZWxwZXJzLmFzc2VydEFyZ3VtZW50VGltZW91dCh0aW1lb3V0LCAndGltZW91dCcpO1xyXG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBsZXQgbWF0Y2hlZFJlcSA9IG51bGw7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQgJiYgIW1hdGNoZWRSZXEpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodXJsLmNvbnN0cnVjdG9yLm5hbWUgPT09ICdSZWdFeHAnICYmIHVybC50ZXN0KHJlcS51cmwpIHx8IHVybCA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRSZXEgPSByZXE7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgIW1hdGNoZWRSZXEgJiYgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc3RhdHVzQ29kZSAhPT0gbWF0Y2hlZFJlcS5zdGF0dXMpIHtcclxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGZhaWx1cmVNZXNzYWdlIHx8IGBUaGUgZXhwZWN0ZWQgc3RhdHVzIGNvZGUgXCIke3N0YXR1c0NvZGV9XCIgZG9lcyBub3QgbWF0Y2ggXCIke21hdGNoZWRSZXEuc3RhdHVzfVwiLmA7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX29uTmV0d29ya0ludGVyY2VwdChtc2cpIHtcclxuICAgICAgICBpZiAodGhpcy5fY29sbGVjdERhdGEpIHtcclxuICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgIHVybDogbXNnLnJlcXVlc3QudXJsLFxyXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtc2cucmVxdWVzdC5tZXRob2QsXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IG1zZy5yZXNwb25zZS5zdGF0dXNfY29kZSxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RIZWFkZXJzOiBtc2cucmVxdWVzdC5oZWFkZXJzLFxyXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiBtc2cucmVzcG9uc2UuaGVhZGVyc1xyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSkge1xyXG4gICAgICAgICAgICAgICAgb2JqLnJlcXVlc3RCb2R5ID0gbXNnLnJlcXVlc3QuYm9keTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NhdmVSZXNwb25zZUJvZHkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5yZXNwb25zZUJvZHkgPSBtc2cucmVzcG9uc2UuYm9keTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFlBQVk7O0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFIQTtFQUFBO0FBQUE7QUFBQTtBQUFBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQWlEO0FBRWpELE1BQU1BLFdBQVcsR0FBRyxPQUFPO0FBRVosTUFBTUMsV0FBVyxTQUFTQyxxQkFBWSxDQUFDO0VBQ2xEQyxXQUFXLENBQUNDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxFQUFFLEVBQUVDLE1BQU0sRUFBRUMsT0FBTyxFQUFFQyxRQUFRLEVBQUU7SUFDekQsS0FBSyxDQUFDTCxPQUFPLEVBQUVDLE9BQU8sRUFBRUMsRUFBRSxFQUFFQyxNQUFNLEVBQUVDLE9BQU8sRUFBRUMsUUFBUSxDQUFDO0lBQ3RELElBQUksQ0FBQ0MsZUFBZSxHQUFHLEVBQUU7SUFDekIsSUFBSSxDQUFDQyxZQUFZLEdBQUcsS0FBSztJQUN6QixJQUFJLENBQUNDLGdCQUFnQixHQUFHLEtBQUs7SUFDN0IsSUFBSSxDQUFDQyxpQkFBaUIsR0FBRyxLQUFLO0lBQzlCLElBQUksQ0FBQ0MsTUFBTSxHQUFHLElBQUk7SUFDbEIsSUFBSSxDQUFDQyx1QkFBdUIsR0FBRyxJQUFJO0lBQ25DLElBQUksQ0FBQ0MsY0FBYyxHQUFHLEtBQUs7RUFDL0I7RUFFQSxJQUFJQyxJQUFJLEdBQUc7SUFDUCxPQUFPakIsV0FBVztFQUN0Qjs7RUFFQTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksTUFBTWtCLElBQUksQ0FBQ0MsU0FBUyxFQUFFQyxhQUFhLEdBQUcsSUFBSSxFQUFFQyxlQUFlLEdBQUcsS0FBSyxFQUFFQyxnQkFBZ0IsR0FBRyxLQUFLLEVBQUU7SUFDM0YsSUFBSSxDQUFDVixnQkFBZ0IsR0FB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
|
|
324
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1wcm94eS5qcyJdLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlByb3h5TW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX25ldHdvcmtUcmFmZmljIiwiX2NvbGxlY3REYXRhIiwiX3NhdmVSZXF1ZXN0Qm9keSIsIl9zYXZlUmVzcG9uc2VCb2R5IiwiX3Byb3h5IiwiX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQiLCJfaXNJbml0aWFsaXplZCIsIm5hbWUiLCJpbml0IiwicHJveHlQb3J0IiwicHJveHlDb21tUG9ydCIsInNhdmVSZXF1ZXN0Qm9keSIsInNhdmVSZXNwb25zZUJvZHkiLCJNSVRNUHJveHkiLCJDcmVhdGUiLCJfb25OZXR3b3JrSW50ZXJjZXB0IiwiYmluZCIsImRpc3Bvc2UiLCJzdGF0dXMiLCJkaXNwb3NlTWl0bSIsInNodXRkb3duIiwiZSIsImNvbnNvbGUiLCJsb2ciLCJzdGFydCIsInN0b3AiLCJnZXRSZXF1ZXN0cyIsIndhaXRGb3JVcmwiLCJwYXR0ZXJuIiwidGltZW91dCIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJNT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SIiwiaGVscGVycyIsImFzc2VydEFyZ3VtZW50IiwiYXNzZXJ0QXJndW1lbnRUaW1lb3V0IiwiRGF0ZSIsIm5vdyIsInJlcSIsInRlc3QiLCJ1cmwiLCJsaWJVdGlscyIsInNsZWVwIiwiVElNRU9VVCIsIndhaXRGb3IiLCJtYXRjaGVyIiwiX3BhcmVudCIsImFzc2VydFVybCIsIkFTU0VSVF9FUlJPUiIsImFzc2VydFN0YXR1c0NvZGUiLCJzdGF0dXNDb2RlIiwiZmFpbHVyZU1lc3NhZ2UiLCJtYXRjaGVkUmVxIiwibWVzc2FnZSIsIm1zZyIsIm9iaiIsInJlcXVlc3QiLCJtZXRob2QiLCJyZXNwb25zZSIsInN0YXR1c19jb2RlIiwicmVxdWVzdEhlYWRlcnMiLCJoZWFkZXJzIiwicmVzcG9uc2VIZWFkZXJzIiwicmVxdWVzdEJvZHkiLCJib2R5IiwicmVzcG9uc2VCb2R5IiwicHVzaCJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsV0FBVyxHQUFHLE9BQXBCOztBQUVlLE1BQU1DLFdBQU4sU0FBMEJDLHFCQUExQixDQUF1QztBQUNsREMsRUFBQUEsV0FBVyxDQUFDQyxPQUFELEVBQVVDLE9BQVYsRUFBbUJDLEVBQW5CLEVBQXVCQyxNQUF2QixFQUErQkMsT0FBL0IsRUFBd0NDLFFBQXhDLEVBQWtEO0FBQ3pELFVBQU1MLE9BQU4sRUFBZUMsT0FBZixFQUF3QkMsRUFBeEIsRUFBNEJDLE1BQTVCLEVBQW9DQyxPQUFwQyxFQUE2Q0MsUUFBN0M7QUFDQSxTQUFLQyxlQUFMLEdBQXVCLEVBQXZCO0FBQ0EsU0FBS0MsWUFBTCxHQUFvQixLQUFwQjtBQUNBLFNBQUtDLGdCQUFMLEdBQXdCLEtBQXhCO0FBQ0EsU0FBS0MsaUJBQUwsR0FBeUIsS0FBekI7QUFDQSxTQUFLQyxNQUFMLEdBQWMsSUFBZDtBQUNBLFNBQUtDLHVCQUFMLEdBQStCLElBQS9CO0FBQ0EsU0FBS0MsY0FBTCxHQUFzQixLQUF0QjtBQUNIOztBQUVPLE1BQUpDLElBQUksR0FBRztBQUNQLFdBQU9qQixXQUFQO0FBQ0g7QUFFRDtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDYyxRQUFKa0IsSUFBSSxDQUFDQyxTQUFELEVBQVlDLGFBQWEsR0FBRyxJQUE1QixFQUFrQ0MsZUFBZSxHQUFHLEtBQXBELEVBQTJEQyxnQkFBZ0IsR0FBRyxLQUE5RSxFQUFxRjtBQUMzRixTQUFLVixn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QjtBQUN2QnNELFFBQUFBLEdBQUcsQ0FBQ1EsV0FBSixHQUFrQlQsR0FBRyxDQUFDRSxPQUFKLENBQVlRLElBQTlCO0FBQ0g7O0FBRUQsVUFBSSxLQUFLOUQsaUJBQVQsRUFBNEI7QUFDeEJxRCxRQUFBQSxHQUFHLENBQUNVLFlBQUosR0FBbUJYLEdBQUcsQ0FBQ0ksUUFBSixDQUFhTSxJQUFoQztBQUNIOztBQUVELFdBQUtqRSxlQUFMLENBQXFCbUUsSUFBckIsQ0FBMEJYLEdBQTFCO0FBQ0g7QUFDSjs7QUF4UGlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcbi8qKlxyXG4gKiBAbmFtZSBwcm94eVxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3IgaW50ZXJjZXB0aW5nIG5ldHdvcmsgdHJhZmZpYyB2aWEgbWl0bXByb3h5LlxyXG4gKi9cclxuXHJcbmltcG9ydCBsaWJVdGlscyBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCBPeHlnZW5Nb2R1bGUgZnJvbSAnLi4vY29yZS9PeHlnZW5Nb2R1bGUnO1xyXG5pbXBvcnQgZXJySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG5pbXBvcnQgaGVscGVycyBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IE1JVE1Qcm94eSBmcm9tICdAb3h5Z2VuaHEvbWl0bXByb3h5LW5vZGUnO1xyXG5cclxuY29uc3QgTU9EVUxFX05BTUUgPSAncHJveHknO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJveHlNb2R1bGUgZXh0ZW5kcyBPeHlnZW5Nb2R1bGUge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpIHtcclxuICAgICAgICBzdXBlcihvcHRpb25zLCBjb250ZXh0LCBycywgbG9nZ2VyLCBtb2R1bGVzLCBzZXJ2aWNlcyk7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX3NhdmVSZXNwb25zZUJvZHkgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fcHJveHlFeHRlcm5hbHlMYXVuY2hlZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBmdW5jdGlvbiBpbml0XHJcbiAgICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBwcm94eS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcm94eVBvcnQgLSBQcm94eSBwb3J0LlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSBwcm94eUNvbW1Qb3J0IC0gUG9ydCBmb3IgaW50ZXJuYWwgcHJveHkgY29tbXVuaWNhdGlvbi4gSWYgc3BlY2lmaWVkLCB0aGVuIG1pdG1wcm94eSBzaG91bGQgYmUgbGF1bmNoZWQgbWFudWFsbHkuXHJcbiAgICAgKiBPdGhlcndpc2UgbWl0bXBveHkgd2lsbCBiZSBsYXVuY2hlZCBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICogQHBhcmFtIHtCb29sZWFuPX0gc2F2ZVJlcXVlc3RCb2R5IC0gU2F2ZSByZXF1ZXN0IGJvZGllcy5cclxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbj19IHNhdmVSZXNwb25zZUJvZHkgLSBTYXZlIHJlc3BvbnNlIGJvZGllcy5cclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltzaGVsbF0gTGF1bmNoaW5nIG1pdG1wcm94eSBtYW51YWxseTwvY2FwdGlvbj5cclxuICAgICAqIG1pdG1kdW1wIC0tYW50aWNhY2hlIC1zIG1pdG1wcm94eS1ub2RlXFxzY3JpcHRzXFxwcm94eS5weSAtLXNzbC1pbnNlY3VyZSAtLXNldCBodHRwQ29tbVBvcnQ9ODc2NVxyXG4gICAgICovXHJcbiAgICBhc3luYyBpbml0KHByb3h5UG9ydCwgcHJveHlDb21tUG9ydCA9IG51bGwsIHNhdmVSZXF1ZXN0Qm9keSA9IGZhbHNlLCBzYXZlUmVzcG9uc2VCb2R5ID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLl9zYXZlUmVxdWVzdEJvZHkgPSBzYXZlUmVxdWVzdEJvZHk7XHJcbiAgICAgICAgdGhpcy5fc2F2ZVJlc3BvbnNlQm9keSA9IHNhdmVSZXNwb25zZUJvZHk7XHJcblxyXG4gICAgICAgIHRoaXMuX3Byb3h5ID0gYXdhaXQgTUlUTVByb3h5LkNyZWF0ZSh0aGlzLl9vbk5ldHdvcmtJbnRlcmNlcHQuYmluZCh0aGlzKSwgcHJveHlQb3J0LCBwcm94eUNvbW1Qb3J0LCBbJy9ldmFsJ10sIHRydWUsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgc3VwZXIuaW5pdCgpO1xyXG4gICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX3Byb3h5RXh0ZXJuYWx5TGF1bmNoZWQgPSAhIXByb3h5Q29tbVBvcnQ7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAZnVuY3Rpb24gZGlzcG9zZVxyXG4gICAgICogQHN1bW1hcnkgRGlzcG9zZXMgdGhpcyBtb2R1bGUuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRpc3Bvc2Uoc3RhdHVzKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3Byb3h5KSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkaXNwb3NlTWl0bSA9ICF0aGlzLl9wcm94eUV4dGVybmFseUxhdW5jaGVkO1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fcHJveHkuc2h1dGRvd24oZGlzcG9zZU1pdG0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmFpbGVkIHRvIGRpc3Bvc2UgdGhlIHByb3h5JywgZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLl9wcm94eSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5fbmV0d29ya1RyYWZmaWMgPSBbXTtcclxuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEJlZ2luIGNvbGxlY3RpbmcgbmV0d29yayByZXF1ZXN0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBBbnkgcHJldmlvdXNseSBjb2xsZWN0ZWQgcmVxdWVzdHMgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKiBAZnVuY3Rpb24gc3RhcnRcclxuICAgICAqIEBleGFtcGxlIDxjYXB0aW9uPltqYXZhc2NyaXB0XSBVc2FnZSBleGFtcGxlPC9jYXB0aW9uPlxyXG4gICAgICogcHJveHkuaW5pdCg4MDgwKTtcclxuICAgICAqIHByb3h5LnN0YXJ0KCk7XHJcbiAgICAgKiAvLyBwcmludCB0aGUgY29sbGVjdGVkIHJlcXVlc3Qgc28gZmFyOlxyXG4gICAgICogbGV0IHJlcXVlc3RzID0gcHJveHkuZ2V0UmVxdWVzdHMoKTtcclxuICAgICAqIGZvciAobGV0IHJlcSBvZiByZXF1ZXN0cykge1xyXG4gICAgICogICBsb2cuaW5mbyhyZXEpO1xyXG4gICAgICogfVxyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgdmVyYmF0aW0gVVJMIG1hdGNoOlxyXG4gICAgICogcHJveHkud2FpdEZvclVybCgnaHR0cHM6Ly93d3cueW91cndlYnNpdGUuY29tL2Zvby9iYXInKTtcclxuICAgICAqIC8vIHdhaXQgZm9yIGEgcmVxdWVzdCB1c2luZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBVUkwgbWF0Y2g6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yVXJsKC9odHRwczpcXC9cXC8uKlxcL2Zvb1xcL2Jhci8pO1xyXG4gICAgICogLy8gd2FpdCBmb3IgYSByZXF1ZXN0IHVzaW5nIGEgY3VzdG9tIG1hdGNoZXI6XHJcbiAgICAgKiBwcm94eS53YWl0Rm9yKGZ1bmN0aW9uIChyZXF1ZXN0KSB7XHJcbiAgICAgKiAgIHJldHVybiByZXF1ZXN0LnN0YXR1cyA9PT0gJzIwMCcgJiYgcmVxdWVzdC51cmwgPT09ICdodHRwczovL3d3dy55b3Vyd2Vic2l0ZS5jb20vZm9vL2Jhcic7XHJcbiAgICAgKiB9KTtcclxuICAgICAqL1xyXG4gICAgc3RhcnQoKSB7XHJcbiAgICAgICAgdGhpcy5fY29sbGVjdERhdGEgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljID0gW107XHJcbiAgICB9XHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFN0b3AgY29sbGVjdGluZyBuZXR3b3JrIHJlcXVlc3RzLlxyXG4gICAgICogQGZ1bmN0aW9uIHN0b3BcclxuICAgICAqL1xyXG4gICAgc3RvcCgpIHtcclxuICAgICAgICB0aGlzLl9jb2xsZWN0RGF0YSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYWxsIHRoZSBjb2xsZWN0ZWQgbmV0d29yayByZXF1ZXN0cyBzbyBmYXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVxdWVzdHNcclxuICAgICAqIEByZXR1cm4ge09iamVjdFtdfSBBcnJheSBjb250YWluaW5nIG5ldHdvcmsgcmVxdWVzdHMuXHJcbiAgICAgKi9cclxuICAgIGdldFJlcXVlc3RzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9uZXR3b3JrVHJhZmZpYztcclxuICAgIH1cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgV2FpdCBmb3IgYSBuZXR3b3JrIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBVUkwuXHJcbiAgICAgKiBAZnVuY3Rpb24gd2FpdEZvclVybFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSBwYXR0ZXJuIC0gQW4gVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXI9fSB0aW1lb3V0IC0gVGltZW91dC4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBOZXR3b3JrIHJlcXVlc3QgZGV0YWlscyBpZiB0aGUgbmV0d29yayByZXF1ZXN0IHdhcyBmb3VuZC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgd2FpdEZvclVybChwYXR0ZXJuLCB0aW1lb3V0ID0gNjAqMTAwMCkge1xyXG4gICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsaXplZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHlgIG1vZHVsZSBpcyBub3QgaW5pdGlhbGl6ZWQuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuTU9EVUxFX05PVF9JTklUSUFMSVpFRF9FUlJPUiwgJ2Bwcm94eS5zdGFydCgpYCBtdXN0IGJlIGV4ZWN1dGVkIHByaW9yIHRvIHVzaW5nIGBwcm94eWAgY29tbWFuZHMuJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBoZWxwZXJzLmFzc2VydEFyZ3VtZW50KHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiBwYXR0ZXJuLnRlc3QocmVxLnVybCkgfHwgcGF0dGVybiA9PT0gcmVxLnVybCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXE7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgYXdhaXQgbGliVXRpbHMuc2xlZXAoNTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VULCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHtwYXR0ZXJufVwiIHdhcyBmb3VuZC5gKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXQgZm9yIGEgbmV0d29yayByZXF1ZXN0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdhaXRGb3JcclxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1hdGNoZXIgLSBNYXRjaGluZyBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIG9uIG1hdGNoLCBvciBmYWxzZSBvdGhlcndpc2UuXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0LiBEZWZhdWx0IGlzIDYwIHNlY29uZHMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE5ldHdvcmsgcmVxdWVzdCBkZXRhaWxzIGlmIHRoZSBuZXR3b3JrIHJlcXVlc3Qgd2FzIGZvdW5kLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB3YWl0Rm9yKG1hdGNoZXIsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQobWF0Y2hlciwgJ21hdGNoZXInKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgLSBzdGFydCA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgZm9yICh2YXIgcmVxIG9mIHRoaXMuX25ldHdvcmtUcmFmZmljKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcihyZXEpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLlRJTUVPVVQsICdObyByZXF1ZXN0IGZvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBtYXRjaGVyLicpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIG5ldHdvcmsgcmVxdWVzdCBtYXRjaGluZyB0aGUgc3BlY2lmaWVkIFVSTC5cclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRVcmxcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfFJlZ0V4cH0gdXJsIC0gQSByZXF1ZXN0IFVSTCB0byBtYXRjaCB2ZXJiYXRpbSBvciBhIFJlZ0V4cC5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFVybCh1cmwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnRUaW1lb3V0KHRpbWVvdXQsICd0aW1lb3V0Jyk7XHJcbiAgICAgICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0KSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCBgTm8gcmVxdWVzdCBtYXRjaGluZyB0aGUgVVJMIFwiJHt1cmx9XCIgd2FzIGZvdW5kLmApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgSFRUUCByZXNwb25zZSBzdGF0dXMgY29kZSBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0U3RhdHVzQ29kZVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd8UmVnRXhwfSB1cmwgLSBBIHJlcXVlc3QgVVJMIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IHN0YXR1c0NvZGUgLSBBIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHRvIG1hdGNoIHZlcmJhdGltIG9yIGEgUmVnRXhwLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBmYWlsdXJlTWVzc2FnZSAtIEFuIG9wdGlvbmFsIGZhaWx1cmUgbWVzc2FnZS5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gdGltZW91dCAtIFRpbWVvdXQuIERlZmF1bHQgaXMgNjAgc2Vjb25kcy5cclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gTmV0d29yayByZXF1ZXN0IGRldGFpbHMgaWYgdGhlIG5ldHdvcmsgcmVxdWVzdCB3YXMgZm91bmQuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGFzc2VydFN0YXR1c0NvZGUodXJsLCBzdGF0dXNDb2RlLCBmYWlsdXJlTWVzc2FnZSA9IG51bGwsIHRpbWVvdXQgPSA2MCoxMDAwKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9pc0luaXRpYWxpemVkIHx8ICF0aGlzLl9wYXJlbnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5NT0RVTEVfTk9UX0lOSVRJQUxJWkVEX0VSUk9SLCAnYHByb3h5YCBtb2R1bGUgaXMgbm90IGluaXRpYWxpemVkLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCF0aGlzLl9jb2xsZWN0RGF0YSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLk1PRFVMRV9OT1RfSU5JVElBTElaRURfRVJST1IsICdgcHJveHkuc3RhcnQoKWAgbXVzdCBiZSBleGVjdXRlZCBwcmlvciB0byB1c2luZyBgcHJveHlgIGNvbW1hbmRzLicpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQodXJsLCAndXJsJyk7XHJcbiAgICAgICAgdGhpcy5fcGFyZW50LmhlbHBlcnMuYXNzZXJ0QXJndW1lbnQoc3RhdHVzQ29kZSwgJ3N0YXR1c0NvZGUnKTtcclxuICAgICAgICB0aGlzLl9wYXJlbnQuaGVscGVycy5hc3NlcnRBcmd1bWVudFRpbWVvdXQodGltZW91dCwgJ3RpbWVvdXQnKTtcclxuICAgICAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XHJcbiAgICAgICAgbGV0IG1hdGNoZWRSZXEgPSBudWxsO1xyXG4gICAgICAgIHdoaWxlIChEYXRlLm5vdygpIC0gc3RhcnQgPCB0aW1lb3V0ICYmICFtYXRjaGVkUmVxKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IHJlcSBvZiB0aGlzLl9uZXR3b3JrVHJhZmZpYykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVybC5jb25zdHJ1Y3Rvci5uYW1lID09PSAnUmVnRXhwJyAmJiB1cmwudGVzdChyZXEudXJsKSB8fCB1cmwgPT09IHJlcS51cmwpIHtcclxuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkUmVxID0gcmVxO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICFtYXRjaGVkUmVxICYmIGF3YWl0IGxpYlV0aWxzLnNsZWVwKDUwMCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghbWF0Y2hlZFJlcSkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYE5vIHJlcXVlc3QgbWF0Y2hpbmcgdGhlIFVSTCBcIiR7dXJsfVwiIHdhcyBmb3VuZC5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHN0YXR1c0NvZGUgIT09IG1hdGNoZWRSZXEuc3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBmYWlsdXJlTWVzc2FnZSB8fCBgVGhlIGV4cGVjdGVkIHN0YXR1cyBjb2RlIFwiJHtzdGF0dXNDb2RlfVwiIGRvZXMgbm90IG1hdGNoIFwiJHttYXRjaGVkUmVxLnN0YXR1c31cIi5gO1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgbWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIF9vbk5ldHdvcmtJbnRlcmNlcHQobXNnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NvbGxlY3REYXRhKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgICAgICB1cmw6IG1zZy5yZXF1ZXN0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogbXNnLnJlcXVlc3QubWV0aG9kLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiBtc2cucmVzcG9uc2Uuc3RhdHVzX2NvZGUsXHJcbiAgICAgICAgICAgICAgICByZXF1ZXN0SGVhZGVyczogbXNnLnJlcXVlc3QuaGVhZGVycyxcclxuICAgICAgICAgICAgICAgIHJlc3BvbnNlSGVhZGVyczogbXNnLnJlc3BvbnNlLmhlYWRlcnNcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVxdWVzdEJvZHkpIHtcclxuICAgICAgICAgICAgICAgIG9iai5yZXF1ZXN0Qm9keSA9IG1zZy5yZXF1ZXN0LmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9zYXZlUmVzcG9uc2VCb2R5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmoucmVzcG9uc2VCb2R5ID0gbXNnLnJlc3BvbnNlLmJvZHk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX25ldHdvcmtUcmFmZmljLnB1c2gob2JqKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
require("source-map-support/register");
|
|
4
|
+
|
|
4
5
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
6
|
+
|
|
5
7
|
var _util = _interopRequireDefault(require("../lib/util"));
|
|
8
|
+
|
|
6
9
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
|
|
7
11
|
/*
|
|
8
12
|
* Copyright (C) 2015-present CloudBeat Limited
|
|
9
13
|
*
|
|
@@ -17,17 +21,19 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
17
21
|
* @name serial
|
|
18
22
|
* @description Provides methods for working with serial ports.
|
|
19
23
|
*/
|
|
20
|
-
|
|
21
24
|
var errHelper = require('../errors/helper');
|
|
25
|
+
|
|
22
26
|
module.exports = function () {
|
|
23
27
|
var SerialPort = require('serialport');
|
|
28
|
+
|
|
24
29
|
var utils = require('./utils');
|
|
30
|
+
|
|
25
31
|
var serialPort;
|
|
26
32
|
var stringBuffer;
|
|
33
|
+
|
|
27
34
|
module.isInitialized = function () {
|
|
28
35
|
return serialPort !== undefined;
|
|
29
36
|
};
|
|
30
|
-
|
|
31
37
|
/**
|
|
32
38
|
* @summary Returns list of available ports.
|
|
33
39
|
* @description See https://github.com/EmergingTechnologyAdvisors/node-serialport#module_serialport--SerialPort.list
|
|
@@ -35,10 +41,11 @@ module.exports = function () {
|
|
|
35
41
|
* @function list
|
|
36
42
|
* @return {Object[]} Array of port descriptions.
|
|
37
43
|
*/
|
|
44
|
+
|
|
45
|
+
|
|
38
46
|
module.list = async function () {
|
|
39
47
|
return await SerialPort.list();
|
|
40
48
|
};
|
|
41
|
-
|
|
42
49
|
/**
|
|
43
50
|
* @summary Opens a serial port.
|
|
44
51
|
* @description Data from the opened port will be automatically read line by line into a circular buffer.
|
|
@@ -61,9 +68,12 @@ module.exports = function () {
|
|
|
61
68
|
* xany: false
|
|
62
69
|
* }
|
|
63
70
|
*/
|
|
71
|
+
|
|
72
|
+
|
|
64
73
|
module.open = function (port, opts, bufferSize = 65536) {
|
|
65
74
|
utils.assertArgumentNonEmptyString(port, 'port');
|
|
66
75
|
utils.assertArgumentNumberNonNegative(bufferSize, 'bufferSize');
|
|
76
|
+
|
|
67
77
|
if (port) {
|
|
68
78
|
return new Promise((resolve, reject) => {
|
|
69
79
|
serialPort = new SerialPort(port, opts);
|
|
@@ -81,7 +91,6 @@ module.exports = function () {
|
|
|
81
91
|
});
|
|
82
92
|
}
|
|
83
93
|
};
|
|
84
|
-
|
|
85
94
|
/**
|
|
86
95
|
* @summary Waits for text to appear in the input data buffer.
|
|
87
96
|
* @description Text pattern can be any of the supported
|
|
@@ -90,28 +99,34 @@ module.exports = function () {
|
|
|
90
99
|
* @param {String} pattern - Text pattern.
|
|
91
100
|
* @param {Number=} timeout - Timeout in milliseconds. Default is 60 seconds.
|
|
92
101
|
*/
|
|
102
|
+
|
|
103
|
+
|
|
93
104
|
module.waitForText = async function (pattern, timeout = 60000) {
|
|
94
105
|
utils.assertArgumentNonEmptyString(pattern, 'pattern');
|
|
95
106
|
utils.assertArgumentNumberNonNegative(timeout, 'timeout');
|
|
107
|
+
|
|
96
108
|
if (stringBuffer) {
|
|
97
109
|
var now = new Date().getTime();
|
|
98
110
|
let done = false;
|
|
111
|
+
|
|
99
112
|
while (!done && Date.now() - now < timeout) {
|
|
100
113
|
var i;
|
|
114
|
+
|
|
101
115
|
for (i = stringBuffer.length; i >= 0; i--) {
|
|
102
116
|
if (utils.matchPattern(stringBuffer[i], pattern)) {
|
|
103
117
|
done = true;
|
|
104
118
|
break;
|
|
105
119
|
}
|
|
106
120
|
}
|
|
121
|
+
|
|
107
122
|
await _util.default.sleep(500);
|
|
108
123
|
}
|
|
124
|
+
|
|
109
125
|
if (new Date().getTime() - now >= timeout) {
|
|
110
126
|
throw new _OxygenError.default(errHelper.errorCode.TIMEOUT);
|
|
111
127
|
}
|
|
112
128
|
}
|
|
113
129
|
};
|
|
114
|
-
|
|
115
130
|
/**
|
|
116
131
|
* @summary Write data to the port.
|
|
117
132
|
* @function write
|
|
@@ -119,8 +134,11 @@ module.exports = function () {
|
|
|
119
134
|
* @example <caption>[javascript] Usage example</caption>
|
|
120
135
|
* serial.write('Hello\r\n');
|
|
121
136
|
*/
|
|
137
|
+
|
|
138
|
+
|
|
122
139
|
module.write = function (data) {
|
|
123
140
|
utils.assertArgument(data, 'data');
|
|
141
|
+
|
|
124
142
|
if (serialPort) {
|
|
125
143
|
return new Promise((resolve, reject) => {
|
|
126
144
|
serialPort.write(data);
|
|
@@ -130,33 +148,40 @@ module.exports = function () {
|
|
|
130
148
|
});
|
|
131
149
|
}
|
|
132
150
|
};
|
|
133
|
-
|
|
134
151
|
/**
|
|
135
152
|
* @summary Return data buffer.
|
|
136
153
|
* @function getBuffer
|
|
137
154
|
* @return {CircularStringBuffer} Data buffer.
|
|
138
155
|
*/
|
|
156
|
+
|
|
157
|
+
|
|
139
158
|
module.getBuffer = function () {
|
|
140
159
|
return stringBuffer;
|
|
141
160
|
};
|
|
161
|
+
|
|
142
162
|
module.dispose = function () {
|
|
143
163
|
if (serialPort) {
|
|
144
164
|
serialPort.close();
|
|
145
165
|
}
|
|
146
166
|
};
|
|
167
|
+
|
|
147
168
|
function CircularStringBuffer(maxSize) {
|
|
148
169
|
this.maxSize = maxSize;
|
|
149
170
|
this.size = 0;
|
|
150
171
|
}
|
|
172
|
+
|
|
151
173
|
CircularStringBuffer.prototype = Object.create(Array.prototype);
|
|
174
|
+
|
|
152
175
|
CircularStringBuffer.prototype.push = function (string) {
|
|
153
176
|
while (this.size + string.length > this.maxSize) {
|
|
154
177
|
this.size -= string.length;
|
|
155
178
|
this.shift();
|
|
156
179
|
}
|
|
180
|
+
|
|
157
181
|
Array.prototype.push.call(this, string);
|
|
158
182
|
this.size += string.length;
|
|
159
183
|
};
|
|
184
|
+
|
|
160
185
|
return module;
|
|
161
186
|
};
|
|
162
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJIZWxwZXIiLCJyZXF1aXJlIiwibW9kdWxlIiwiZXhwb3J0cyIsIlNlcmlhbFBvcnQiLCJ1dGlscyIsInNlcmlhbFBvcnQiLCJzdHJpbmdCdWZmZXIiLCJpc0luaXRpYWxpemVkIiwidW5kZWZpbmVkIiwibGlzdCIsIm9wZW4iLCJwb3J0Iiwib3B0cyIsImJ1ZmZlclNpemUiLCJhc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nIiwiYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJlcnIiLCJPeEVycm9yIiwiZXJyb3JDb2RlIiwiU0VSSUFMX1BPUlRfRVJST1IiLCJtZXNzYWdlIiwicGFyc2VyIiwicGlwZSIsInBhcnNlcnMiLCJSZWFkbGluZSIsIkNpcmN1bGFyU3RyaW5nQnVmZmVyIiwiZGF0YSIsInB1c2giLCJ0b1N0cmluZyIsIndhaXRGb3JUZXh0IiwicGF0dGVybiIsInRpbWVvdXQiLCJub3ciLCJEYXRlIiwiZ2V0VGltZSIsImRvbmUiLCJpIiwibGVuZ3RoIiwibWF0Y2hQYXR0ZXJuIiwibGliVXRpbHMiLCJzbGVlcCIsIlRJTUVPVVQiLCJ3cml0ZSIsImFzc2VydEFyZ3VtZW50IiwiZHJhaW4iLCJnZXRCdWZmZXIiLCJkaXNwb3NlIiwiY2xvc2UiLCJtYXhTaXplIiwic2l6ZSIsInByb3RvdHlwZSIsIk9iamVjdCIsImNyZWF0ZSIsIkFycmF5Iiwic3RyaW5nIiwic2hpZnQiLCJjYWxsIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL294X21vZHVsZXMvbW9kdWxlLXNlcmlhbC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBzZXJpYWxcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBzZXJpYWwgcG9ydHMuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG52YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBTZXJpYWxQb3J0ID0gcmVxdWlyZSgnc2VyaWFscG9ydCcpO1xyXG4gICAgdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xyXG5cclxuICAgIHZhciBzZXJpYWxQb3J0O1xyXG4gICAgdmFyIHN0cmluZ0J1ZmZlcjtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBzZXJpYWxQb3J0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBwb3J0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0VtZXJnaW5nVGVjaG5vbG9neUFkdmlzb3JzL25vZGUtc2VyaWFscG9ydCNtb2R1bGVfc2VyaWFscG9ydC0tU2VyaWFsUG9ydC5saXN0XHJcbiAgICAgKiAgICAgICAgICAgICAgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiByZXR1cm5lZCB2YWx1ZXMuXHJcbiAgICAgKiBAZnVuY3Rpb24gbGlzdFxyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IG9mIHBvcnQgZGVzY3JpcHRpb25zLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUubGlzdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBTZXJpYWxQb3J0Lmxpc3QoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBhIHNlcmlhbCBwb3J0LlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERhdGEgZnJvbSB0aGUgb3BlbmVkIHBvcnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlYWQgbGluZSBieSBsaW5lIGludG8gYSBjaXJjdWxhciBidWZmZXIuXHJcbiAgICAgKiAgICAgICAgICAgICAgT25jZSB0aGUgYnVmZmVyIHJlYWNoZXMgaXQncyBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmllZCBieSBgYnVmZmVyU2l6ZWAgYXJndW1lbnQsIGVsZGVzdCBlbnRyaWVzIGFyZSBcclxuICAgICAqICAgICAgICAgICAgICBldmljdGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGRhdGEuXHJcbiAgICAgKiBAZnVuY3Rpb24gb3BlblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBvcnQgLSBQYXRoIHRvIHNlcmlhbCBwb3J0LiBFLmcuICcvZGV2L3R0eS11c2JzZXJpYWwxJywgJ0NPTTUnLCBldGMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFBvcnQgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gYnVmZmVyU2l6ZSAtIFNpemUgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLiBEZWZhdWx0IGlzIDY1NTM2IGJ5dGVzLlxyXG4gICAgICogQHJldHVybiB7U2VyaWFsUG9ydH0gU2VyaWFsUG9ydCBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gU2VyaWFsIHBvcnQgcHJvcGVydGllcyB3aXRoIGRlZmF1bHQgdmFsdWVzPC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBiYXVkUmF0ZTogOTYwMCxcclxuICAgICAqICAgZGF0YUJpdHM6IDgsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogOCwgNywgNiwgb3IgNS5cclxuICAgICAqICAgc3RvcEJpdHM6IDEsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogMSBvciAyLlxyXG4gICAgICogICBwYXJpdHk6ICdub25lJyAgICAgIC8vIE11c3QgYmUgb25lIG9mOiAnbm9uZScsICdldmVuJywgJ21hcmsnLCAnb2RkJywgJ3NwYWNlJy5cclxuICAgICAqICAgcnRzY3RzOiBmYWxzZSxcclxuICAgICAqICAgeG9uOiBmYWxzZSxcclxuICAgICAqICAgeG9mZjogZmFsc2UsXHJcbiAgICAgKiAgIHhhbnk6IGZhbHNlXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5vcGVuID0gZnVuY3Rpb24ocG9ydCwgb3B0cywgYnVmZmVyU2l6ZSA9IDY1NTM2KSB7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhwb3J0LCAncG9ydCcpO1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUoYnVmZmVyU2l6ZSwgJ2J1ZmZlclNpemUnKTtcclxuXHJcbiAgICAgICAgaWYgKHBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmlhbFBvcnQgPSBuZXcgU2VyaWFsUG9ydChwb3J0LCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdvcGVuJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VyaWFsUG9ydCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TRVJJQUxfUE9SVF9FUlJPUiwgZXJyLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBzZXJpYWxQb3J0LnBpcGUobmV3IFNlcmlhbFBvcnQucGFyc2Vycy5SZWFkbGluZSgpKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlciA9IG5ldyBDaXJjdWxhclN0cmluZ0J1ZmZlcihidWZmZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIHBhcnNlci5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLnB1c2goZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXRzIGZvciB0ZXh0IHRvIGFwcGVhciBpbiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGV4dCBwYXR0ZXJuIGNhbiBiZSBhbnkgb2YgdGhlIHN1cHBvcnRlZCBcclxuICAgICAqICBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnMob24gdGhlIHRvcCBvZiBwYWdlKS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBUZXh0IHBhdHRlcm4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUud2FpdEZvclRleHQgPSBhc3luYyBmdW5jdGlvbihwYXR0ZXJuLCB0aW1lb3V0ID0gNjAwMDApIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG5cclxuICAgICAgICBpZiAoc3RyaW5nQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSAobmV3IERhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFkb25lICYmIChEYXRlLm5vdygpIC0gbm93KSA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gc3RyaW5nQnVmZmVyLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMubWF0Y2hQYXR0ZXJuKHN0cmluZ0J1ZmZlcltpXSwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoKG5ldyBEYXRlKS5nZXRUaW1lKCkgLSBub3cgPj0gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXcml0ZSBkYXRhIHRvIHRoZSBwb3J0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0geyhTdHJpbmd8QXJyYXkpfSBkYXRhIC0gRGF0YSB0byBzZW5kLiBFaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHNlcmlhbC53cml0ZSgnSGVsbG9cXHJcXG4nKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50KGRhdGEsICdkYXRhJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0LndyaXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc2VyaWFsUG9ydC5kcmFpbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0QnVmZmVyXHJcbiAgICAgKiBAcmV0dXJuIHtDaXJjdWxhclN0cmluZ0J1ZmZlcn0gRGF0YSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHNlcmlhbFBvcnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIENpcmN1bGFyU3RyaW5nQnVmZmVyKG1heFNpemUpIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgQ2lyY3VsYXJTdHJpbmdCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xyXG5cclxuICAgIENpcmN1bGFyU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuc2l6ZSArIHN0cmluZy5sZW5ndGggPiB0aGlzLm1heFNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplIC09IHN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSArPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXSwibWFwcGluZ3MiOiI7OztBQWFBO0FBRUE7QUFBbUM7QUFmbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJQSxTQUFTLEdBQUdDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztBQUczQ0MsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBVztFQUN4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
|
|
187
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1zZXJpYWwuanMiXSwibmFtZXMiOlsiZXJySGVscGVyIiwicmVxdWlyZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJTZXJpYWxQb3J0IiwidXRpbHMiLCJzZXJpYWxQb3J0Iiwic3RyaW5nQnVmZmVyIiwiaXNJbml0aWFsaXplZCIsInVuZGVmaW5lZCIsImxpc3QiLCJvcGVuIiwicG9ydCIsIm9wdHMiLCJidWZmZXJTaXplIiwiYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyIsImFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIiwiZXJyIiwiT3hFcnJvciIsImVycm9yQ29kZSIsIlNFUklBTF9QT1JUX0VSUk9SIiwibWVzc2FnZSIsInBhcnNlciIsInBpcGUiLCJwYXJzZXJzIiwiUmVhZGxpbmUiLCJDaXJjdWxhclN0cmluZ0J1ZmZlciIsImRhdGEiLCJwdXNoIiwidG9TdHJpbmciLCJ3YWl0Rm9yVGV4dCIsInBhdHRlcm4iLCJ0aW1lb3V0Iiwibm93IiwiRGF0ZSIsImdldFRpbWUiLCJkb25lIiwiaSIsImxlbmd0aCIsIm1hdGNoUGF0dGVybiIsImxpYlV0aWxzIiwic2xlZXAiLCJUSU1FT1VUIiwid3JpdGUiLCJhc3NlcnRBcmd1bWVudCIsImRyYWluIiwiZ2V0QnVmZmVyIiwiZGlzcG9zZSIsImNsb3NlIiwibWF4U2l6ZSIsInNpemUiLCJwcm90b3R5cGUiLCJPYmplY3QiLCJjcmVhdGUiLCJBcnJheSIsInN0cmluZyIsInNoaWZ0IiwiY2FsbCJdLCJtYXBwaW5ncyI6Ijs7OztBQWFBOztBQUVBOzs7O0FBZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUVBLElBQUlBLFNBQVMsR0FBR0MsT0FBTyxDQUFDLGtCQUFELENBQXZCOztBQUdBQyxNQUFNLENBQUNDLE9BQVAsR0FB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QUFDeEIsUUFBSTdDLFVBQUosRUFBZ0I7QUFDWkEsTUFBQUEsVUFBVSxDQUFDOEMsS0FBWDtBQUNIO0FBQ0osR0FKRDs7QUFNQSxXQUFTdEIsb0JBQVQsQ0FBOEJ1QixPQUE5QixFQUF1QztBQUNuQyxTQUFLQSxPQUFMLEdBQWVBLE9BQWY7QUFDQSxTQUFLQyxJQUFMLEdBQVksQ0FBWjtBQUNIOztBQUVEeEIsRUFBQUEsb0JBQW9CLENBQUN5QixTQUFyQixHQUFpQ0MsTUFBTSxDQUFDQyxNQUFQLENBQWNDLEtBQUssQ0FBQ0gsU0FBcEIsQ0FBakM7O0FBRUF6QixFQUFBQSxvQkFBb0IsQ0FBQ3lCLFNBQXJCLENBQStCdkIsSUFBL0IsR0FBc0MsVUFBUzJCLE1BQVQsRUFBaUI7QUFDbkQsV0FBTyxLQUFLTCxJQUFMLEdBQVlLLE1BQU0sQ0FBQ2pCLE1BQW5CLEdBQTRCLEtBQUtXLE9BQXhDLEVBQWlEO0FBQzdDLFdBQUtDLElBQUwsSUFBYUssTUFBTSxDQUFDakIsTUFBcEI7QUFDQSxXQUFLa0IsS0FBTDtBQUNIOztBQUNERixJQUFBQSxLQUFLLENBQUNILFNBQU4sQ0FBZ0J2QixJQUFoQixDQUFxQjZCLElBQXJCLENBQTBCLElBQTFCLEVBQWdDRixNQUFoQztBQUNBLFNBQUtMLElBQUwsSUFBYUssTUFBTSxDQUFDakIsTUFBcEI7QUFDSCxHQVBEOztBQVNBLFNBQU94QyxNQUFQO0FBQ0gsQ0EzSkQiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUtcHJlc2VudCBDbG91ZEJlYXQgTGltaXRlZFxyXG4gKlxyXG4gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeVxyXG4gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieVxyXG4gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvclxyXG4gKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLlxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBAbmFtZSBzZXJpYWxcclxuICogQGRlc2NyaXB0aW9uIFByb3ZpZGVzIG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCBzZXJpYWwgcG9ydHMuXHJcbiAqL1xyXG5pbXBvcnQgT3hFcnJvciBmcm9tICcuLi9lcnJvcnMvT3h5Z2VuRXJyb3InO1xyXG52YXIgZXJySGVscGVyID0gcmVxdWlyZSgnLi4vZXJyb3JzL2hlbHBlcicpO1xyXG5pbXBvcnQgbGliVXRpbHMgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcclxuICAgIHZhciBTZXJpYWxQb3J0ID0gcmVxdWlyZSgnc2VyaWFscG9ydCcpO1xyXG4gICAgdmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xyXG5cclxuICAgIHZhciBzZXJpYWxQb3J0O1xyXG4gICAgdmFyIHN0cmluZ0J1ZmZlcjtcclxuXHJcbiAgICBtb2R1bGUuaXNJbml0aWFsaXplZCA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBzZXJpYWxQb3J0ICE9PSB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBwb3J0cy5cclxuICAgICAqIEBkZXNjcmlwdGlvbiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0VtZXJnaW5nVGVjaG5vbG9neUFkdmlzb3JzL25vZGUtc2VyaWFscG9ydCNtb2R1bGVfc2VyaWFscG9ydC0tU2VyaWFsUG9ydC5saXN0XHJcbiAgICAgKiAgICAgICAgICAgICAgZm9yIGRldGFpbHMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZiByZXR1cm5lZCB2YWx1ZXMuXHJcbiAgICAgKiBAZnVuY3Rpb24gbGlzdFxyXG4gICAgICogQHJldHVybiB7T2JqZWN0W119IEFycmF5IG9mIHBvcnQgZGVzY3JpcHRpb25zLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUubGlzdCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiBhd2FpdCBTZXJpYWxQb3J0Lmxpc3QoKTtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBPcGVucyBhIHNlcmlhbCBwb3J0LlxyXG4gICAgICogQGRlc2NyaXB0aW9uIERhdGEgZnJvbSB0aGUgb3BlbmVkIHBvcnQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlYWQgbGluZSBieSBsaW5lIGludG8gYSBjaXJjdWxhciBidWZmZXIuXHJcbiAgICAgKiAgICAgICAgICAgICAgT25jZSB0aGUgYnVmZmVyIHJlYWNoZXMgaXQncyBtYXhpbXVtIGNhcGFjaXR5IHNwZWNpZmllZCBieSBgYnVmZmVyU2l6ZWAgYXJndW1lbnQsIGVsZGVzdCBlbnRyaWVzIGFyZSBcclxuICAgICAqICAgICAgICAgICAgICBldmljdGVkIHRvIG1ha2Ugcm9vbSBmb3IgbmV3IGRhdGEuXHJcbiAgICAgKiBAZnVuY3Rpb24gb3BlblxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBvcnQgLSBQYXRoIHRvIHNlcmlhbCBwb3J0LiBFLmcuICcvZGV2L3R0eS11c2JzZXJpYWwxJywgJ0NPTTUnLCBldGMuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIFBvcnQgcHJvcGVydGllcy5cclxuICAgICAqIEBwYXJhbSB7TnVtYmVyPX0gYnVmZmVyU2l6ZSAtIFNpemUgb2YgdGhlIGlucHV0IGRhdGEgYnVmZmVyLiBEZWZhdWx0IGlzIDY1NTM2IGJ5dGVzLlxyXG4gICAgICogQHJldHVybiB7U2VyaWFsUG9ydH0gU2VyaWFsUG9ydCBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5banNvbl0gU2VyaWFsIHBvcnQgcHJvcGVydGllcyB3aXRoIGRlZmF1bHQgdmFsdWVzPC9jYXB0aW9uPlxyXG4gICAgICoge1xyXG4gICAgICogICBiYXVkUmF0ZTogOTYwMCxcclxuICAgICAqICAgZGF0YUJpdHM6IDgsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogOCwgNywgNiwgb3IgNS5cclxuICAgICAqICAgc3RvcEJpdHM6IDEsICAgICAgICAvLyBNdXN0IGJlIG9uZSBvZjogMSBvciAyLlxyXG4gICAgICogICBwYXJpdHk6ICdub25lJyAgICAgIC8vIE11c3QgYmUgb25lIG9mOiAnbm9uZScsICdldmVuJywgJ21hcmsnLCAnb2RkJywgJ3NwYWNlJy5cclxuICAgICAqICAgcnRzY3RzOiBmYWxzZSxcclxuICAgICAqICAgeG9uOiBmYWxzZSxcclxuICAgICAqICAgeG9mZjogZmFsc2UsXHJcbiAgICAgKiAgIHhhbnk6IGZhbHNlXHJcbiAgICAgKiB9XHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5vcGVuID0gZnVuY3Rpb24ocG9ydCwgb3B0cywgYnVmZmVyU2l6ZSA9IDY1NTM2KSB7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROb25FbXB0eVN0cmluZyhwb3J0LCAncG9ydCcpO1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50TnVtYmVyTm9uTmVnYXRpdmUoYnVmZmVyU2l6ZSwgJ2J1ZmZlclNpemUnKTtcclxuXHJcbiAgICAgICAgaWYgKHBvcnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgIHNlcmlhbFBvcnQgPSBuZXcgU2VyaWFsUG9ydChwb3J0LCBvcHRzKTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdvcGVuJywgKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2VyaWFsUG9ydCk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0Lm9uKCdlcnJvcicsIChlcnIpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZWplY3QobmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5TRVJJQUxfUE9SVF9FUlJPUiwgZXJyLm1lc3NhZ2UpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwYXJzZXIgPSBzZXJpYWxQb3J0LnBpcGUobmV3IFNlcmlhbFBvcnQucGFyc2Vycy5SZWFkbGluZSgpKTtcclxuICAgICAgICAgICAgICAgIHN0cmluZ0J1ZmZlciA9IG5ldyBDaXJjdWxhclN0cmluZ0J1ZmZlcihidWZmZXJTaXplKTtcclxuICAgICAgICAgICAgICAgIHBhcnNlci5vbignZGF0YScsIChkYXRhKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5nQnVmZmVyLnB1c2goZGF0YS50b1N0cmluZygpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgfTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFdhaXRzIGZvciB0ZXh0IHRvIGFwcGVhciBpbiB0aGUgaW5wdXQgZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZGVzY3JpcHRpb24gVGV4dCBwYXR0ZXJuIGNhbiBiZSBhbnkgb2YgdGhlIHN1cHBvcnRlZCBcclxuICAgICAqICBzdHJpbmcgbWF0Y2hpbmcgcGF0dGVybnMob24gdGhlIHRvcCBvZiBwYWdlKS5cclxuICAgICAqIEBmdW5jdGlvbiB3YWl0Rm9yVGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBUZXh0IHBhdHRlcm4uXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcj19IHRpbWVvdXQgLSBUaW1lb3V0IGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCBpcyA2MCBzZWNvbmRzLlxyXG4gICAgICovXHJcbiAgICBtb2R1bGUud2FpdEZvclRleHQgPSBhc3luYyBmdW5jdGlvbihwYXR0ZXJuLCB0aW1lb3V0ID0gNjAwMDApIHtcclxuICAgICAgICB1dGlscy5hc3NlcnRBcmd1bWVudE5vbkVtcHR5U3RyaW5nKHBhdHRlcm4sICdwYXR0ZXJuJyk7XHJcbiAgICAgICAgdXRpbHMuYXNzZXJ0QXJndW1lbnROdW1iZXJOb25OZWdhdGl2ZSh0aW1lb3V0LCAndGltZW91dCcpO1xyXG5cclxuICAgICAgICBpZiAoc3RyaW5nQnVmZmVyKSB7XHJcbiAgICAgICAgICAgIHZhciBub3cgPSAobmV3IERhdGUpLmdldFRpbWUoKTtcclxuICAgICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcclxuICAgICAgICAgICAgd2hpbGUgKCFkb25lICYmIChEYXRlLm5vdygpIC0gbm93KSA8IHRpbWVvdXQpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpO1xyXG4gICAgICAgICAgICAgICAgZm9yIChpID0gc3RyaW5nQnVmZmVyLmxlbmd0aDsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodXRpbHMubWF0Y2hQYXR0ZXJuKHN0cmluZ0J1ZmZlcltpXSwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBhd2FpdCBsaWJVdGlscy5zbGVlcCg1MDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoKG5ldyBEYXRlKS5nZXRUaW1lKCkgLSBub3cgPj0gdGltZW91dCkge1xyXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5USU1FT1VUKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBXcml0ZSBkYXRhIHRvIHRoZSBwb3J0LlxyXG4gICAgICogQGZ1bmN0aW9uIHdyaXRlXHJcbiAgICAgKiBAcGFyYW0geyhTdHJpbmd8QXJyYXkpfSBkYXRhIC0gRGF0YSB0byBzZW5kLiBFaXRoZXIgYSBzdHJpbmcgb3IgYW4gYXJyYXkgb2YgYnl0ZXMuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIHNlcmlhbC53cml0ZSgnSGVsbG9cXHJcXG4nKTtcclxuICAgICAqL1xyXG4gICAgbW9kdWxlLndyaXRlID0gZnVuY3Rpb24oZGF0YSkge1xyXG4gICAgICAgIHV0aWxzLmFzc2VydEFyZ3VtZW50KGRhdGEsICdkYXRhJyk7XHJcblxyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBzZXJpYWxQb3J0LndyaXRlKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgc2VyaWFsUG9ydC5kcmFpbigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm4gZGF0YSBidWZmZXIuXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0QnVmZmVyXHJcbiAgICAgKiBAcmV0dXJuIHtDaXJjdWxhclN0cmluZ0J1ZmZlcn0gRGF0YSBidWZmZXIuXHJcbiAgICAgKi9cclxuICAgIG1vZHVsZS5nZXRCdWZmZXIgPSBmdW5jdGlvbigpIHtcclxuICAgICAgICByZXR1cm4gc3RyaW5nQnVmZmVyO1xyXG4gICAgfTtcclxuXHJcbiAgICBtb2R1bGUuZGlzcG9zZSA9IGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGlmIChzZXJpYWxQb3J0KSB7XHJcbiAgICAgICAgICAgIHNlcmlhbFBvcnQuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGZ1bmN0aW9uIENpcmN1bGFyU3RyaW5nQnVmZmVyKG1heFNpemUpIHtcclxuICAgICAgICB0aGlzLm1heFNpemUgPSBtYXhTaXplO1xyXG4gICAgICAgIHRoaXMuc2l6ZSA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgQ2lyY3VsYXJTdHJpbmdCdWZmZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShBcnJheS5wcm90b3R5cGUpO1xyXG5cclxuICAgIENpcmN1bGFyU3RyaW5nQnVmZmVyLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24oc3RyaW5nKSB7XHJcbiAgICAgICAgd2hpbGUgKHRoaXMuc2l6ZSArIHN0cmluZy5sZW5ndGggPiB0aGlzLm1heFNpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5zaXplIC09IHN0cmluZy5sZW5ndGg7XHJcbiAgICAgICAgICAgIHRoaXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBzdHJpbmcpO1xyXG4gICAgICAgIHRoaXMuc2l6ZSArPSBzdHJpbmcubGVuZ3RoO1xyXG4gICAgfTtcclxuXHJcbiAgICByZXR1cm4gbW9kdWxlO1xyXG59O1xyXG4iXX0=
|