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 _got = _interopRequireDefault(require("got"));
|
|
11
|
-
|
|
12
9
|
var _OxygenModule = _interopRequireDefault(require("../core/OxygenModule"));
|
|
13
|
-
|
|
14
10
|
var _OxygenError = _interopRequireDefault(require("../errors/OxygenError"));
|
|
15
|
-
|
|
16
11
|
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
17
|
-
|
|
18
12
|
var _utils = _interopRequireDefault(require("./utils"));
|
|
19
|
-
|
|
20
13
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
21
|
-
|
|
22
14
|
/*
|
|
23
15
|
* Copyright (C) 2015-present CloudBeat Limited
|
|
24
16
|
*
|
|
@@ -32,9 +24,9 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
32
24
|
* @name http
|
|
33
25
|
* @description Provides methods for working with HTTP(S)
|
|
34
26
|
*/
|
|
27
|
+
|
|
35
28
|
const MODULE_NAME = 'http';
|
|
36
29
|
const RESPONSE_TIMEOUT = 1000 * 60; // in ms
|
|
37
|
-
|
|
38
30
|
const DAFAULT_HTTP2 = false;
|
|
39
31
|
const DEFAULT_HTTP_OPTIONS = {
|
|
40
32
|
decompress: true,
|
|
@@ -54,79 +46,69 @@ const DEFAULT_HTTP_OPTIONS = {
|
|
|
54
46
|
dnsLookupIpVersion: 'ipv4'
|
|
55
47
|
};
|
|
56
48
|
const CONTENT_TYPE_HEADER = 'content-type';
|
|
57
|
-
|
|
58
49
|
class HttpModule extends _OxygenModule.default {
|
|
59
50
|
constructor(options, context, rs, logger, modules, services) {
|
|
60
51
|
super(options, context, rs, logger, modules, services);
|
|
61
52
|
this._alwaysInitialized = true;
|
|
62
53
|
this._lastResponse = null;
|
|
63
54
|
this._baseUrl = null;
|
|
64
|
-
this._userHttpOptions = {};
|
|
65
|
-
|
|
55
|
+
this._userHttpOptions = {};
|
|
56
|
+
// pre-initialize the module
|
|
66
57
|
this._isInitialized = true;
|
|
67
58
|
}
|
|
59
|
+
|
|
68
60
|
/*
|
|
69
61
|
* @summary Gets module name
|
|
70
62
|
* @function name
|
|
71
63
|
* @return {String} Constant value "http".
|
|
72
64
|
*/
|
|
73
|
-
|
|
74
|
-
|
|
75
65
|
get name() {
|
|
76
66
|
return MODULE_NAME;
|
|
77
67
|
}
|
|
68
|
+
|
|
78
69
|
/**
|
|
79
70
|
* @summary Sets user defined HTTP options (such as proxy, decompress and etc.)
|
|
80
71
|
* @function setOptions
|
|
81
72
|
* @param {Object} opts - HTTP request options object, see [Request Options](https://github.com/sindresorhus/got/blob/main/documentation/2-options.md).
|
|
82
73
|
* In addition to the options listed in the linked document, 'deflateRaw' option can be used when server returns Deflate-compressed stream without headers.
|
|
83
74
|
*/
|
|
84
|
-
|
|
85
|
-
|
|
86
75
|
setOptions(opts) {
|
|
87
76
|
this._userHttpOptions = opts;
|
|
88
|
-
|
|
89
77
|
if (opts.deflateRaw) {
|
|
90
78
|
this._userHttpOptions.decompress = false; // decompress=true in default options so we override it
|
|
91
79
|
}
|
|
92
80
|
}
|
|
81
|
+
|
|
93
82
|
/**
|
|
94
83
|
* @summary Sets proxy url to be used for connections with the service.
|
|
95
84
|
* @function setProxy
|
|
96
85
|
* @param {String} url - Proxy server URL. Not passing this argument will reset the proxy settings.
|
|
97
86
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
87
|
setProxy(url) {
|
|
101
88
|
if (url) {
|
|
102
89
|
const {
|
|
103
90
|
bootstrap
|
|
104
91
|
} = require('global-agent');
|
|
105
|
-
|
|
106
92
|
const {
|
|
107
93
|
parse
|
|
108
94
|
} = require('url');
|
|
109
|
-
|
|
110
95
|
const parsedUrl = parse(url);
|
|
111
|
-
|
|
112
96
|
if (!parsedUrl.hostname) {
|
|
113
97
|
throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Hostname in undefined');
|
|
114
98
|
}
|
|
115
|
-
|
|
116
99
|
if (!parsedUrl.port) {
|
|
117
100
|
throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Port in undefined');
|
|
118
101
|
}
|
|
119
|
-
|
|
120
102
|
if (!parsedUrl.protocol) {
|
|
121
103
|
throw new _OxygenError.default(_helper.default.errorCode.HTTP_ERROR, 'Protocol in undefined');
|
|
122
104
|
}
|
|
123
|
-
|
|
124
105
|
bootstrap();
|
|
125
106
|
global.GLOBAL_AGENT.HTTP_PROXY = url;
|
|
126
107
|
} else {
|
|
127
108
|
global.GLOBAL_AGENT.HTTP_PROXY = false;
|
|
128
109
|
}
|
|
129
110
|
}
|
|
111
|
+
|
|
130
112
|
/**
|
|
131
113
|
* @summary Performs HTTP GET
|
|
132
114
|
* @function get
|
|
@@ -150,10 +132,9 @@ class HttpModule extends _OxygenModule.default {
|
|
|
150
132
|
* var response = http.get('https://FOO.BAR');
|
|
151
133
|
* log.info(response.body);
|
|
152
134
|
*/
|
|
153
|
-
|
|
154
|
-
|
|
155
135
|
async get(url, headers) {
|
|
156
|
-
const httpOpts = {
|
|
136
|
+
const httpOpts = {
|
|
137
|
+
...DEFAULT_HTTP_OPTIONS,
|
|
157
138
|
...(this._userHttpOptions || {}),
|
|
158
139
|
url: url,
|
|
159
140
|
method: 'GET',
|
|
@@ -161,6 +142,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
161
142
|
};
|
|
162
143
|
return await this._httpRequestSync(httpOpts);
|
|
163
144
|
}
|
|
145
|
+
|
|
164
146
|
/**
|
|
165
147
|
* @summary Performs HTTP POST
|
|
166
148
|
* @function post
|
|
@@ -169,12 +151,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
169
151
|
* @param {Object=} headers - HTTP headers.
|
|
170
152
|
* @return {Object} Response object.
|
|
171
153
|
*/
|
|
172
|
-
|
|
173
|
-
|
|
174
154
|
async post(url, data, headers) {
|
|
175
155
|
const resolvedData = this._resolveData(data);
|
|
176
|
-
|
|
177
|
-
|
|
156
|
+
const httpOpts = {
|
|
157
|
+
...DEFAULT_HTTP_OPTIONS,
|
|
178
158
|
...(this._userHttpOptions || {}),
|
|
179
159
|
url: url,
|
|
180
160
|
method: 'POST',
|
|
@@ -183,6 +163,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
183
163
|
};
|
|
184
164
|
return await this._httpRequestSync(httpOpts);
|
|
185
165
|
}
|
|
166
|
+
|
|
186
167
|
/**
|
|
187
168
|
* @summary Performs HTTP PUT
|
|
188
169
|
* @function put
|
|
@@ -191,12 +172,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
191
172
|
* @param {Object=} headers - HTTP headers.
|
|
192
173
|
* @return {Object} Response object.
|
|
193
174
|
*/
|
|
194
|
-
|
|
195
|
-
|
|
196
175
|
async put(url, data, headers) {
|
|
197
176
|
const resolvedData = this._resolveData(data);
|
|
198
|
-
|
|
199
|
-
|
|
177
|
+
const httpOpts = {
|
|
178
|
+
...DEFAULT_HTTP_OPTIONS,
|
|
200
179
|
...(this._userHttpOptions || {}),
|
|
201
180
|
url: url,
|
|
202
181
|
method: 'PUT',
|
|
@@ -205,6 +184,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
205
184
|
};
|
|
206
185
|
return await this._httpRequestSync(httpOpts);
|
|
207
186
|
}
|
|
187
|
+
|
|
208
188
|
/**
|
|
209
189
|
* @summary Performs HTTP PATCH
|
|
210
190
|
* @function patch
|
|
@@ -213,12 +193,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
213
193
|
* @param {Object=} headers - HTTP headers.
|
|
214
194
|
* @return {Object} Response object.
|
|
215
195
|
*/
|
|
216
|
-
|
|
217
|
-
|
|
218
196
|
async patch(url, data, headers) {
|
|
219
197
|
const resolvedData = this._resolveData(data);
|
|
220
|
-
|
|
221
|
-
|
|
198
|
+
const httpOpts = {
|
|
199
|
+
...DEFAULT_HTTP_OPTIONS,
|
|
222
200
|
...(this._userHttpOptions || {}),
|
|
223
201
|
url: url,
|
|
224
202
|
method: 'PATCH',
|
|
@@ -227,6 +205,7 @@ class HttpModule extends _OxygenModule.default {
|
|
|
227
205
|
};
|
|
228
206
|
return await this._httpRequestSync(httpOpts);
|
|
229
207
|
}
|
|
208
|
+
|
|
230
209
|
/**
|
|
231
210
|
* @summary Performs HTTP DELETE
|
|
232
211
|
* @function delete
|
|
@@ -235,12 +214,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
235
214
|
* @param {Object} data - Data.
|
|
236
215
|
* @return {Object} Response object.
|
|
237
216
|
*/
|
|
238
|
-
|
|
239
|
-
|
|
240
217
|
async delete(url, headers, data) {
|
|
241
218
|
const resolvedData = this._resolveData(data);
|
|
242
|
-
|
|
243
|
-
|
|
219
|
+
const httpOpts = {
|
|
220
|
+
...DEFAULT_HTTP_OPTIONS,
|
|
244
221
|
...(this._userHttpOptions || {}),
|
|
245
222
|
url: url,
|
|
246
223
|
method: 'DELETE',
|
|
@@ -249,159 +226,137 @@ class HttpModule extends _OxygenModule.default {
|
|
|
249
226
|
};
|
|
250
227
|
return await this._httpRequestSync(httpOpts);
|
|
251
228
|
}
|
|
229
|
+
|
|
252
230
|
/**
|
|
253
231
|
* @summary Returns last response object
|
|
254
232
|
* @function getResponse
|
|
255
233
|
* @return {Object} Response object.
|
|
256
234
|
*/
|
|
257
|
-
|
|
258
|
-
|
|
259
235
|
getResponse() {
|
|
260
236
|
return this._lastResponse;
|
|
261
237
|
}
|
|
238
|
+
|
|
262
239
|
/**
|
|
263
240
|
* @summary Returns last response body
|
|
264
241
|
* @function getResponseBody
|
|
265
242
|
* @return {String} Response body.
|
|
266
243
|
*/
|
|
267
|
-
|
|
268
|
-
|
|
269
244
|
getResponseBody() {
|
|
270
245
|
return this._lastResponse && this._lastResponse.body ? this._lastResponse.body : null;
|
|
271
246
|
}
|
|
247
|
+
|
|
272
248
|
/**
|
|
273
249
|
* @summary Returns response headers
|
|
274
250
|
* @function getResponseHeaders
|
|
275
251
|
* @return {Object} Response headers.
|
|
276
252
|
*/
|
|
277
|
-
|
|
278
|
-
|
|
279
253
|
getResponseHeaders() {
|
|
280
254
|
if (!this._lastResponse) {
|
|
281
255
|
return null;
|
|
282
256
|
}
|
|
283
|
-
|
|
284
257
|
return this._lastResponse.headers;
|
|
285
258
|
}
|
|
259
|
+
|
|
286
260
|
/**
|
|
287
261
|
* @summary Returns response URL
|
|
288
262
|
* @function getResponseUrl
|
|
289
263
|
* @return {String} Response URL.
|
|
290
264
|
*/
|
|
291
|
-
|
|
292
|
-
|
|
293
265
|
getResponseUrl() {
|
|
294
266
|
if (!this._lastResponse) {
|
|
295
267
|
return null;
|
|
296
268
|
}
|
|
297
|
-
|
|
298
269
|
return this._lastResponse.url;
|
|
299
270
|
}
|
|
271
|
+
|
|
300
272
|
/**
|
|
301
273
|
* @summary Assert whether the specified pattern is present in the response body.
|
|
302
274
|
* @function assertText
|
|
303
275
|
* @param {String} pattern - Pattern to assert.
|
|
304
276
|
*/
|
|
305
|
-
|
|
306
|
-
|
|
307
277
|
assertText(pattern) {
|
|
308
278
|
if (!this._lastResponse) {
|
|
309
279
|
return false;
|
|
310
280
|
}
|
|
311
|
-
|
|
312
281
|
if (!this._lastResponse.body) {
|
|
313
282
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, 'Response body is empty');
|
|
314
283
|
}
|
|
315
|
-
|
|
316
284
|
const respContent = typeof this._lastResponse.body === 'string' ? this._lastResponse.body : JSON.stringify(this._lastResponse.body);
|
|
317
|
-
|
|
318
285
|
if (!_utils.default.matchPattern(respContent, pattern)) {
|
|
319
286
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `Expected HTTP response content to match: "${pattern}" but got: "${respContent}"`);
|
|
320
287
|
}
|
|
321
|
-
|
|
322
288
|
return true;
|
|
323
289
|
}
|
|
290
|
+
|
|
324
291
|
/**
|
|
325
292
|
* @summary Assert response time
|
|
326
293
|
* @function assertResponseTime
|
|
327
294
|
* @param {Number} maxTime - Maximum response time in milliseconds.
|
|
328
295
|
*/
|
|
329
|
-
|
|
330
|
-
|
|
331
296
|
assertResponseTime(maxTime) {
|
|
332
297
|
throw new Error('Not implemented');
|
|
333
298
|
}
|
|
299
|
+
|
|
334
300
|
/**
|
|
335
301
|
* @summary Assert if HTTP header is presented in the response
|
|
336
302
|
* @function assertHeader
|
|
337
303
|
* @param {String} headerName - A HTTP header name.
|
|
338
304
|
* @param {String=} headerValuePattern - An optional HTTP header value pattern.
|
|
339
305
|
*/
|
|
340
|
-
|
|
341
|
-
|
|
342
306
|
assertHeader(headerName, headerValuePattern = null) {
|
|
343
307
|
if (!headerName || typeof headerName !== 'string' || headerName.length == 0) {
|
|
344
308
|
return false;
|
|
345
309
|
}
|
|
346
|
-
|
|
347
310
|
headerName = headerName.toLowerCase();
|
|
348
311
|
const headers = this._lastResponse.headers;
|
|
349
|
-
|
|
350
312
|
if (!headers[headerName]) {
|
|
351
313
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, 'Expected HTTP header "${headerName}" to be present');
|
|
352
314
|
} else if (headerValuePattern && typeof headerValuePattern === 'string') {
|
|
353
315
|
const actualHeaderValue = headers[headerName];
|
|
354
|
-
|
|
355
316
|
if (!_utils.default.matchPattern(actualHeaderValue, headerValuePattern)) {
|
|
356
317
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `Expected HTTP header "${headerName}" value to match: "${headerValuePattern}" but got: "${actualHeaderValue}"`);
|
|
357
318
|
}
|
|
358
319
|
}
|
|
359
320
|
}
|
|
321
|
+
|
|
360
322
|
/**
|
|
361
323
|
* @summary Assert if HTTP cookie is presented in the response
|
|
362
324
|
* @function assertCookie
|
|
363
325
|
* @param {String} cookieName - A HTTP cookie name.
|
|
364
326
|
* @param {String=} cookieValuePattern - An optional HTTP cookie value pattern.
|
|
365
327
|
*/
|
|
366
|
-
|
|
367
|
-
|
|
368
328
|
assertCookie(cookieName, cookieValuePattern) {
|
|
369
329
|
throw new Error('Not implemented');
|
|
370
330
|
}
|
|
331
|
+
|
|
371
332
|
/**
|
|
372
333
|
* @summary Assert the last HTTP response's status code
|
|
373
334
|
* @function assertStatus
|
|
374
335
|
* @param {Number|Array} codeList - A single status code or a list of codes.
|
|
375
336
|
*/
|
|
376
|
-
|
|
377
|
-
|
|
378
337
|
assertStatus(codeList) {
|
|
379
338
|
if (!this._lastResponse || !codeList) {
|
|
380
339
|
return false;
|
|
381
|
-
}
|
|
382
|
-
|
|
383
|
-
|
|
340
|
+
}
|
|
341
|
+
// if we got a single value, then convert it to an array
|
|
384
342
|
if (!Array.isArray(codeList)) {
|
|
385
343
|
codeList = [codeList];
|
|
386
344
|
}
|
|
387
|
-
|
|
388
345
|
const statusCode = this._lastResponse.statusCode;
|
|
389
|
-
|
|
390
346
|
if (!codeList.includes(statusCode)) {
|
|
391
347
|
throw new _OxygenError.default(_helper.default.errorCode.ASSERT_ERROR, `Expected HTTP status to be: "${codeList}" but got: "${statusCode}"`);
|
|
392
348
|
}
|
|
393
|
-
|
|
394
349
|
return true;
|
|
395
350
|
}
|
|
351
|
+
|
|
396
352
|
/**
|
|
397
353
|
* @summary Assert HTTP 200 OK status
|
|
398
354
|
* @function assertStatusOk
|
|
399
355
|
*/
|
|
400
|
-
|
|
401
|
-
|
|
402
356
|
assertStatusOk() {
|
|
403
357
|
return this.assertStatus(200);
|
|
404
358
|
}
|
|
359
|
+
|
|
405
360
|
/**
|
|
406
361
|
* @summary Opens new transaction.
|
|
407
362
|
* @description The transaction will persist till a new one is opened. Transaction names must be
|
|
@@ -409,49 +364,38 @@ class HttpModule extends _OxygenModule.default {
|
|
|
409
364
|
* @function transaction
|
|
410
365
|
* @param {String} name - The transaction name.
|
|
411
366
|
*/
|
|
412
|
-
|
|
413
|
-
|
|
414
367
|
async transaction(name) {
|
|
415
368
|
global._lastTransactionName = name;
|
|
416
369
|
}
|
|
417
|
-
|
|
418
370
|
_resolveData(data) {
|
|
419
371
|
const dataResolver = {};
|
|
420
|
-
|
|
421
372
|
if (data instanceof Object) {
|
|
422
373
|
_utils.default.assertCircular(data);
|
|
423
|
-
|
|
424
374
|
dataResolver.json = data;
|
|
425
375
|
} else {
|
|
426
376
|
dataResolver.body = data;
|
|
427
377
|
}
|
|
428
|
-
|
|
429
378
|
return dataResolver;
|
|
430
379
|
}
|
|
431
|
-
|
|
432
380
|
async _httpRequestSync(httpOpts) {
|
|
433
381
|
let result;
|
|
434
|
-
|
|
435
382
|
try {
|
|
436
383
|
result = await (0, _got.default)(httpOpts);
|
|
437
|
-
|
|
438
384
|
if (httpOpts.deflateRaw && result.headers['content-encoding'] === 'deflate') {
|
|
439
385
|
const zlib = require('zlib');
|
|
440
|
-
|
|
441
386
|
const decomp = zlib.createInflateRaw();
|
|
442
387
|
decomp.write(result.body);
|
|
443
388
|
await (() => {
|
|
444
389
|
return new Promise((resolve, reject) => {
|
|
445
390
|
decomp.on('data', data => {
|
|
446
391
|
result.body = data.toString();
|
|
447
|
-
|
|
448
392
|
if (result.headers[CONTENT_TYPE_HEADER] && result.headers[CONTENT_TYPE_HEADER].includes('application/json')) {
|
|
449
393
|
try {
|
|
450
394
|
result.body = JSON.parse(result.body);
|
|
451
|
-
} catch (e) {
|
|
395
|
+
} catch (e) {
|
|
396
|
+
// if parsing fails just return the original string
|
|
452
397
|
}
|
|
453
398
|
}
|
|
454
|
-
|
|
455
399
|
resolve();
|
|
456
400
|
});
|
|
457
401
|
});
|
|
@@ -460,23 +404,18 @@ class HttpModule extends _OxygenModule.default {
|
|
|
460
404
|
if (result.headers[CONTENT_TYPE_HEADER] && result.headers[CONTENT_TYPE_HEADER].includes('application/json')) {
|
|
461
405
|
try {
|
|
462
406
|
result.body = JSON.parse(result.body);
|
|
463
|
-
} catch (e) {
|
|
407
|
+
} catch (e) {
|
|
408
|
+
// if parsing fails just return the original string
|
|
464
409
|
}
|
|
465
410
|
}
|
|
466
411
|
}
|
|
467
412
|
} catch (e) {
|
|
468
413
|
result = e;
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
this._lastResponse = result;
|
|
473
|
-
|
|
414
|
+
}
|
|
474
415
|
if (result instanceof Error) {
|
|
475
416
|
let body = null;
|
|
476
|
-
|
|
477
417
|
if (result.response && result.response.body) {
|
|
478
418
|
body = result.response.body;
|
|
479
|
-
|
|
480
419
|
if (typeof body === 'string') {
|
|
481
420
|
try {
|
|
482
421
|
body = JSON.parse(body);
|
|
@@ -485,7 +424,6 @@ class HttpModule extends _OxygenModule.default {
|
|
|
485
424
|
}
|
|
486
425
|
}
|
|
487
426
|
}
|
|
488
|
-
|
|
489
427
|
result = {
|
|
490
428
|
errorMessage: result.message,
|
|
491
429
|
headers: result.response ? result.response.headers : null,
|
|
@@ -513,10 +451,10 @@ class HttpModule extends _OxygenModule.default {
|
|
|
513
451
|
};
|
|
514
452
|
}
|
|
515
453
|
|
|
454
|
+
// store last response to allow further assertions and validations
|
|
455
|
+
this._lastResponse = result;
|
|
516
456
|
return result;
|
|
517
457
|
}
|
|
518
|
-
|
|
519
458
|
}
|
|
520
|
-
|
|
521
459
|
exports.default = HttpModule;
|
|
522
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9veF9tb2R1bGVzL21vZHVsZS1odHRwLmpzIl0sIm5hbWVzIjpbIk1PRFVMRV9OQU1FIiwiUkVTUE9OU0VfVElNRU9VVCIsIkRBRkFVTFRfSFRUUDIiLCJERUZBVUxUX0hUVFBfT1BUSU9OUyIsImRlY29tcHJlc3MiLCJyZXNwb25zZVR5cGUiLCJ0aW1lb3V0IiwibG9va3VwIiwiY29ubmVjdCIsInNlY3VyZUNvbm5lY3QiLCJzb2NrZXQiLCJzZW5kIiwicmVzcG9uc2UiLCJodHRwMiIsImh0dHBzIiwicmVqZWN0VW5hdXRob3JpemVkIiwiZG5zTG9va3VwSXBWZXJzaW9uIiwiQ09OVEVOVF9UWVBFX0hFQURFUiIsIkh0dHBNb2R1bGUiLCJPeHlnZW5Nb2R1bGUiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJjb250ZXh0IiwicnMiLCJsb2dnZXIiLCJtb2R1bGVzIiwic2VydmljZXMiLCJfYWx3YXlzSW5pdGlhbGl6ZWQiLCJfbGFzdFJlc3BvbnNlIiwiX2Jhc2VVcmwiLCJfdXNlckh0dHBPcHRpb25zIiwiX2lzSW5pdGlhbGl6ZWQiLCJuYW1lIiwic2V0T3B0aW9ucyIsIm9wdHMiLCJkZWZsYXRlUmF3Iiwic2V0UHJveHkiLCJ1cmwiLCJib290c3RyYXAiLCJyZXF1aXJlIiwicGFyc2UiLCJwYXJzZWRVcmwiLCJob3N0bmFtZSIsIk94RXJyb3IiLCJlcnJIZWxwZXIiLCJlcnJvckNvZGUiLCJIVFRQX0VSUk9SIiwicG9ydCIsInByb3RvY29sIiwiZ2xvYmFsIiwiR0xPQkFMX0FHRU5UIiwiSFRUUF9QUk9YWSIsImdldCIsImhlYWRlcnMiLCJodHRwT3B0cyIsIm1ldGhvZCIsIl9odHRwUmVxdWVzdFN5bmMiLCJwb3N0IiwiZGF0YSIsInJlc29sdmVkRGF0YSIsIl9yZXNvbHZlRGF0YSIsInB1dCIsInBhdGNoIiwiZGVsZXRlIiwiZ2V0UmVzcG9uc2UiLCJnZXRSZXNwb25zZUJvZHkiLCJib2R5IiwiZ2V0UmVzcG9uc2VIZWFkZXJzIiwiZ2V0UmVzcG9uc2VVcmwiLCJhc3NlcnRUZXh0IiwicGF0dGVybiIsIkFTU0VSVF9FUlJPUiIsInJlc3BDb250ZW50IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1vZFV0aWxzIiwibWF0Y2hQYXR0ZXJuIiwiYXNzZXJ0UmVzcG9uc2VUaW1lIiwibWF4VGltZSIsIkVycm9yIiwiYXNzZXJ0SGVhZGVyIiwiaGVhZGVyTmFtZSIsImhlYWRlclZhbHVlUGF0dGVybiIsImxlbmd0aCIsInRvTG93ZXJDYXNlIiwiYWN0dWFsSGVhZGVyVmFsdWUiLCJhc3NlcnRDb29raWUiLCJjb29raWVOYW1lIiwiY29va2llVmFsdWVQYXR0ZXJuIiwiYXNzZXJ0U3RhdHVzIiwiY29kZUxpc3QiLCJBcnJheSIsImlzQXJyYXkiLCJzdGF0dXNDb2RlIiwiaW5jbHVkZXMiLCJhc3NlcnRTdGF0dXNPayIsInRyYW5zYWN0aW9uIiwiX2xhc3RUcmFuc2FjdGlvbk5hbWUiLCJkYXRhUmVzb2x2ZXIiLCJPYmplY3QiLCJhc3NlcnRDaXJjdWxhciIsImpzb24iLCJyZXN1bHQiLCJ6bGliIiwiZGVjb21wIiwiY3JlYXRlSW5mbGF0ZVJhdyIsIndyaXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJvbiIsInRvU3RyaW5nIiwiZSIsImVycm9yTWVzc2FnZSIsIm1lc3NhZ2UiLCJzdGF0dXNNZXNzYWdlIiwicmF3Qm9keSIsImh0dHBWZXJzaW9uIiwidXBncmFkZSIsInRpbWluZ3MiLCJyZXF1ZXN0VXJsIiwicmVkaXJlY3RVcmxzIiwiaXNGcm9tQ2FjaGUiLCJpcCIsInJldHJ5Q291bnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQWFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFPQSxNQUFNQSxXQUFXLEdBQUcsTUFBcEI7QUFDQSxNQUFNQyxnQkFBZ0IsR0FBRyxPQUFPLEVBQWhDLEMsQ0FBc0M7O0FBQ3RD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QUFFTGhFLFFBQUFBLE9BQU8sRUFBRWlELE1BQU0sQ0FBQ2pELE9BRlg7QUFHTGlFLFFBQUFBLE9BQU8sRUFBRWhCLE1BQU0sQ0FBQ2dCLE9BSFg7QUFJTGpGLFFBQUFBLEdBQUcsRUFBRWlFLE1BQU0sQ0FBQ2pFLEdBSlA7QUFLTGtCLFFBQUFBLE1BQU0sRUFBRStDLE1BQU0sQ0FBQy9DLE1BTFY7QUFNTHNDLFFBQUFBLFVBQVUsRUFBRVMsTUFBTSxDQUFDVCxVQU5kO0FBT0xzQixRQUFBQSxhQUFhLEVBQUViLE1BQU0sQ0FBQ2EsYUFQakI7QUFRTEksUUFBQUEsT0FBTyxFQUFFakIsTUFBTSxDQUFDaUIsT0FSWDtBQVNMQyxRQUFBQSxVQUFVLEVBQUVsQixNQUFNLENBQUNrQixVQVRkO0FBVUxDLFFBQUFBLFlBQVksRUFBRW5CLE1BQU0sQ0FBQ21CLFlBVmhCO0FBV0xDLFFBQUFBLFdBQVcsRUFBRXBCLE1BQU0sQ0FBQ29CLFdBWGY7QUFZTEMsUUFBQUEsRUFBRSxFQUFFckIsTUFBTSxDQUFDcUIsRUFaTjtBQWFMQyxRQUFBQSxVQUFVLEVBQUV0QixNQUFNLENBQUNzQixVQWJkO0FBY0wxRCxRQUFBQSxJQUFJLEVBQUVvQyxNQUFNLENBQUNwQztBQWRSLE9BQVQ7QUFnQkg7O0FBRUQsV0FBT29DLE1BQVA7QUFDSDs7QUF6YWdEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IE94eWdlbk1vZHVsZSBmcm9tICcuLi9jb3JlL094eWdlbk1vZHVsZSc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ2h0dHAnO1xyXG5jb25zdCBSRVNQT05TRV9USU1FT1VUID0gMTAwMCAqIDYwOyAgIC8vIGluIG1zXHJcbmNvbnN0IERBRkFVTFRfSFRUUDIgPSBmYWxzZTtcclxuY29uc3QgREVGQVVMVF9IVFRQX09QVElPTlMgPSB7XHJcbiAgICBkZWNvbXByZXNzOiB0cnVlLFxyXG4gICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICB0aW1lb3V0OiB7XHJcbiAgICAgICAgbG9va3VwOiAxMDAwLFxyXG4gICAgICAgIGNvbm5lY3Q6IDUwMCxcclxuICAgICAgICBzZWN1cmVDb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc29ja2V0OiAxMDAwMDAsXHJcbiAgICAgICAgc2VuZDogMTAwMDAwLFxyXG4gICAgICAgIHJlc3BvbnNlOiBSRVNQT05TRV9USU1FT1VUXHJcbiAgICB9LFxyXG4gICAgaHR0cDI6IERBRkFVTFRfSFRUUDIsXHJcbiAgICBodHRwczoge1xyXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICBkbnNMb29rdXBJcFZlcnNpb246ICdpcHY0J1xyXG59O1xyXG5jb25zdCBDT05URU5UX1RZUEVfSEVBREVSID0gJ2NvbnRlbnQtdHlwZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwTW9kdWxlIGV4dGVuZHMgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMuX2Fsd2F5c0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdICYmIHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gc3RvcmUgbGFzdCByZXNwb25zZSB0byBhbGxvdyBmdXJ0aGVyIGFzc2VydGlvbnMgYW5kIHZhbGlkYXRpb25zXHJcbiAgICAgICAgdGhpcy5fbGFzdFJlc3BvbnNlID0gcmVzdWx0O1xyXG5cclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGJvZHkgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZS5ib2R5XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5oZWFkZXJzIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNDb2RlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNNZXNzYWdlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJhd0JvZHk6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5yYXdCb2R5IDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBodHRwVmVyc2lvbjogcmVzdWx0Lmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICB1cGdyYWRlOiByZXN1bHQudXBncmFkZSxcclxuICAgICAgICAgICAgICAgIHVybDogcmVzdWx0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogcmVzdWx0Lm1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnN0YXR1c01lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICB0aW1pbmdzOiByZXN1bHQudGltaW5ncyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RVcmw6IHJlc3VsdC5yZXF1ZXN0VXJsLFxyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVcmxzOiByZXN1bHQucmVkaXJlY3RVcmxzLFxyXG4gICAgICAgICAgICAgICAgaXNGcm9tQ2FjaGU6IHJlc3VsdC5pc0Zyb21DYWNoZSxcclxuICAgICAgICAgICAgICAgIGlwOiByZXN1bHQuaXAsXHJcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50OiByZXN1bHQucmV0cnlDb3VudCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHJlc3VsdC5ib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG59Il19
|
|
460
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0RVTEVfTkFNRSIsIlJFU1BPTlNFX1RJTUVPVVQiLCJEQUZBVUxUX0hUVFAyIiwiREVGQVVMVF9IVFRQX09QVElPTlMiLCJkZWNvbXByZXNzIiwicmVzcG9uc2VUeXBlIiwidGltZW91dCIsImxvb2t1cCIsImNvbm5lY3QiLCJzZWN1cmVDb25uZWN0Iiwic29ja2V0Iiwic2VuZCIsInJlc3BvbnNlIiwiaHR0cDIiLCJodHRwcyIsInJlamVjdFVuYXV0aG9yaXplZCIsImRuc0xvb2t1cElwVmVyc2lvbiIsIkNPTlRFTlRfVFlQRV9IRUFERVIiLCJIdHRwTW9kdWxlIiwiT3h5Z2VuTW9kdWxlIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwiY29udGV4dCIsInJzIiwibG9nZ2VyIiwibW9kdWxlcyIsInNlcnZpY2VzIiwiX2Fsd2F5c0luaXRpYWxpemVkIiwiX2xhc3RSZXNwb25zZSIsIl9iYXNlVXJsIiwiX3VzZXJIdHRwT3B0aW9ucyIsIl9pc0luaXRpYWxpemVkIiwibmFtZSIsInNldE9wdGlvbnMiLCJvcHRzIiwiZGVmbGF0ZVJhdyIsInNldFByb3h5IiwidXJsIiwiYm9vdHN0cmFwIiwicmVxdWlyZSIsInBhcnNlIiwicGFyc2VkVXJsIiwiaG9zdG5hbWUiLCJPeEVycm9yIiwiZXJySGVscGVyIiwiZXJyb3JDb2RlIiwiSFRUUF9FUlJPUiIsInBvcnQiLCJwcm90b2NvbCIsImdsb2JhbCIsIkdMT0JBTF9BR0VOVCIsIkhUVFBfUFJPWFkiLCJnZXQiLCJoZWFkZXJzIiwiaHR0cE9wdHMiLCJtZXRob2QiLCJfaHR0cFJlcXVlc3RTeW5jIiwicG9zdCIsImRhdGEiLCJyZXNvbHZlZERhdGEiLCJfcmVzb2x2ZURhdGEiLCJwdXQiLCJwYXRjaCIsImRlbGV0ZSIsImdldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2VCb2R5IiwiYm9keSIsImdldFJlc3BvbnNlSGVhZGVycyIsImdldFJlc3BvbnNlVXJsIiwiYXNzZXJ0VGV4dCIsInBhdHRlcm4iLCJBU1NFUlRfRVJST1IiLCJyZXNwQ29udGVudCIsIkpTT04iLCJzdHJpbmdpZnkiLCJtb2RVdGlscyIsIm1hdGNoUGF0dGVybiIsImFzc2VydFJlc3BvbnNlVGltZSIsIm1heFRpbWUiLCJFcnJvciIsImFzc2VydEhlYWRlciIsImhlYWRlck5hbWUiLCJoZWFkZXJWYWx1ZVBhdHRlcm4iLCJsZW5ndGgiLCJ0b0xvd2VyQ2FzZSIsImFjdHVhbEhlYWRlclZhbHVlIiwiYXNzZXJ0Q29va2llIiwiY29va2llTmFtZSIsImNvb2tpZVZhbHVlUGF0dGVybiIsImFzc2VydFN0YXR1cyIsImNvZGVMaXN0IiwiQXJyYXkiLCJpc0FycmF5Iiwic3RhdHVzQ29kZSIsImluY2x1ZGVzIiwiYXNzZXJ0U3RhdHVzT2siLCJ0cmFuc2FjdGlvbiIsIl9sYXN0VHJhbnNhY3Rpb25OYW1lIiwiZGF0YVJlc29sdmVyIiwiT2JqZWN0IiwiYXNzZXJ0Q2lyY3VsYXIiLCJqc29uIiwicmVzdWx0IiwiZ290IiwiemxpYiIsImRlY29tcCIsImNyZWF0ZUluZmxhdGVSYXciLCJ3cml0ZSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0Iiwib24iLCJ0b1N0cmluZyIsImUiLCJlcnJvck1lc3NhZ2UiLCJtZXNzYWdlIiwic3RhdHVzTWVzc2FnZSIsInJhd0JvZHkiLCJodHRwVmVyc2lvbiIsInVwZ3JhZGUiLCJ0aW1pbmdzIiwicmVxdWVzdFVybCIsInJlZGlyZWN0VXJscyIsImlzRnJvbUNhY2hlIiwiaXAiLCJyZXRyeUNvdW50Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL294X21vZHVsZXMvbW9kdWxlLWh0dHAuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKipcclxuICogQG5hbWUgaHR0cFxyXG4gKiBAZGVzY3JpcHRpb24gUHJvdmlkZXMgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIEhUVFAoUylcclxuICovXHJcbmltcG9ydCBnb3QgZnJvbSAnZ290JztcclxuaW1wb3J0IE94eWdlbk1vZHVsZSBmcm9tICcuLi9jb3JlL094eWdlbk1vZHVsZSc7XHJcbmltcG9ydCBPeEVycm9yIGZyb20gJy4uL2Vycm9ycy9PeHlnZW5FcnJvcic7XHJcbmltcG9ydCBlcnJIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBtb2RVdGlscyBmcm9tICcuL3V0aWxzJztcclxuXHJcbmNvbnN0IE1PRFVMRV9OQU1FID0gJ2h0dHAnO1xyXG5jb25zdCBSRVNQT05TRV9USU1FT1VUID0gMTAwMCAqIDYwOyAgIC8vIGluIG1zXHJcbmNvbnN0IERBRkFVTFRfSFRUUDIgPSBmYWxzZTtcclxuY29uc3QgREVGQVVMVF9IVFRQX09QVElPTlMgPSB7XHJcbiAgICBkZWNvbXByZXNzOiB0cnVlLFxyXG4gICAgcmVzcG9uc2VUeXBlOiAndGV4dCcsXHJcbiAgICB0aW1lb3V0OiB7XHJcbiAgICAgICAgbG9va3VwOiAxMDAwLFxyXG4gICAgICAgIGNvbm5lY3Q6IDUwMCxcclxuICAgICAgICBzZWN1cmVDb25uZWN0OiA1MDAsXHJcbiAgICAgICAgc29ja2V0OiAxMDAwMDAsXHJcbiAgICAgICAgc2VuZDogMTAwMDAwLFxyXG4gICAgICAgIHJlc3BvbnNlOiBSRVNQT05TRV9USU1FT1VUXHJcbiAgICB9LFxyXG4gICAgaHR0cDI6IERBRkFVTFRfSFRUUDIsXHJcbiAgICBodHRwczoge1xyXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogZmFsc2VcclxuICAgIH0sXHJcbiAgICBkbnNMb29rdXBJcFZlcnNpb246ICdpcHY0J1xyXG59O1xyXG5jb25zdCBDT05URU5UX1RZUEVfSEVBREVSID0gJ2NvbnRlbnQtdHlwZSc7XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIdHRwTW9kdWxlIGV4dGVuZHMgT3h5Z2VuTW9kdWxlIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMsIGNvbnRleHQsIHJzLCBsb2dnZXIsIG1vZHVsZXMsIHNlcnZpY2VzKSB7XHJcbiAgICAgICAgc3VwZXIob3B0aW9ucywgY29udGV4dCwgcnMsIGxvZ2dlciwgbW9kdWxlcywgc2VydmljZXMpO1xyXG4gICAgICAgIHRoaXMuX2Fsd2F5c0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX2Jhc2VVcmwgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucyA9IHt9O1xyXG4gICAgICAgIC8vIHByZS1pbml0aWFsaXplIHRoZSBtb2R1bGVcclxuICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKlxyXG4gICAgICogQHN1bW1hcnkgR2V0cyBtb2R1bGUgbmFtZVxyXG4gICAgICogQGZ1bmN0aW9uIG5hbWVcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gQ29uc3RhbnQgdmFsdWUgXCJodHRwXCIuXHJcbiAgICAgKi9cclxuICAgIGdldCBuYW1lKCkge1xyXG4gICAgICAgIHJldHVybiBNT0RVTEVfTkFNRTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFNldHMgdXNlciBkZWZpbmVkIEhUVFAgb3B0aW9ucyAoc3VjaCBhcyBwcm94eSwgZGVjb21wcmVzcyBhbmQgZXRjLilcclxuICAgICAqIEBmdW5jdGlvbiBzZXRPcHRpb25zXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIEhUVFAgcmVxdWVzdCBvcHRpb25zIG9iamVjdCwgc2VlIFtSZXF1ZXN0IE9wdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvZ290L2Jsb2IvbWFpbi9kb2N1bWVudGF0aW9uLzItb3B0aW9ucy5tZCkuIFxyXG4gICAgICogSW4gYWRkaXRpb24gdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGluIHRoZSBsaW5rZWQgZG9jdW1lbnQsICdkZWZsYXRlUmF3JyBvcHRpb24gY2FuIGJlIHVzZWQgd2hlbiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgc2V0T3B0aW9ucyhvcHRzKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlckh0dHBPcHRpb25zID0gb3B0cztcclxuICAgICAgICBpZiAob3B0cy5kZWZsYXRlUmF3KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3VzZXJIdHRwT3B0aW9ucy5kZWNvbXByZXNzID0gZmFsc2U7ICAgICAvLyBkZWNvbXByZXNzPXRydWUgaW4gZGVmYXVsdCBvcHRpb25zIHNvIHdlIG92ZXJyaWRlIGl0XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgU2V0cyBwcm94eSB1cmwgdG8gYmUgdXNlZCBmb3IgY29ubmVjdGlvbnMgd2l0aCB0aGUgc2VydmljZS5cclxuICAgICAqIEBmdW5jdGlvbiBzZXRQcm94eVxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCAtIFByb3h5IHNlcnZlciBVUkwuIE5vdCBwYXNzaW5nIHRoaXMgYXJndW1lbnQgd2lsbCByZXNldCB0aGUgcHJveHkgc2V0dGluZ3MuXHJcbiAgICAgKi9cclxuICAgIHNldFByb3h5KHVybCkge1xyXG4gICAgICAgIGlmICh1cmwpIHtcclxuICAgICAgICAgICAgY29uc3Qge1xyXG4gICAgICAgICAgICAgICAgYm9vdHN0cmFwXHJcbiAgICAgICAgICAgIH0gPSByZXF1aXJlKCdnbG9iYWwtYWdlbnQnKTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHsgcGFyc2UgfSA9IHJlcXVpcmUoJ3VybCcpO1xyXG4gICAgICAgICAgICBjb25zdCBwYXJzZWRVcmwgPSBwYXJzZSh1cmwpO1xyXG5cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwuaG9zdG5hbWUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ0hvc3RuYW1lIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghcGFyc2VkVXJsLnBvcnQpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1BvcnQgaW4gdW5kZWZpbmVkJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFwYXJzZWRVcmwucHJvdG9jb2wpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuSFRUUF9FUlJPUiwgJ1Byb3RvY29sIGluIHVuZGVmaW5lZCcpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBib290c3RyYXAoKTtcclxuICAgICAgICAgICAgZ2xvYmFsLkdMT0JBTF9BR0VOVC5IVFRQX1BST1hZID0gdXJsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGdsb2JhbC5HTE9CQUxfQUdFTlQuSFRUUF9QUk9YWSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgR0VUXHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj5bamF2YXNjcmlwdF0gVXNhZ2UgZXhhbXBsZTwvY2FwdGlvbj5cclxuICAgICAqIC8vIEJhc2ljIHVzYWdlIGV4YW1wbGU6XHJcbiAgICAgKiB2YXIgcmVzcG9uc2UgPSBodHRwLmdldChcclxuICAgICAqICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL294eWdlbmhxL294eWdlbi1pZGUvcmVsZWFzZXMnLCBcclxuICAgICAqIHtcclxuICAgICAqICAgJ0FjY2VwdC1FbmNvZGluZyc6ICdnemlwLCBkZWZsYXRlJyxcclxuICAgICAqICAgJ1VzZXItQWdlbnQnOiAnTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NDsgcnY6ODYuMCkgR2Vja28vMjAxMDAxMDEgRmlyZWZveC84Ni4wJ1xyXG4gICAgICogfSk7XHJcbiAgICAgKiBsb2cuaW5mbyhyZXNwb25zZS5ib2R5KTtcclxuICAgICAqXHJcbiAgICAgKiAvLyBJZiBzZXJ2ZXIgcmV0dXJucyBEZWZsYXRlLWNvbXByZXNzZWQgc3RyZWFtIHdpdGhvdXQgaGVhZGVycywgYGRlZmxhdGVSYXdgIGNhbiBiZSB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGNvbnRlbnQuXHJcbiAgICAgKiBodHRwLnNldE9wdGlvbnMoe1xyXG4gICAgICogICBkZWZsYXRlUmF3OiB0cnVlXHJcbiAgICAgKiB9KTtcclxuICAgICAqIHZhciByZXNwb25zZSA9IGh0dHAuZ2V0KCdodHRwczovL0ZPTy5CQVInKTtcclxuICAgICAqIGxvZy5pbmZvKHJlc3BvbnNlLmJvZHkpO1xyXG4gICAgICovXHJcbiAgICBhc3luYyBnZXQodXJsLCBoZWFkZXJzKSB7XHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9XHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUE9TVFxyXG4gICAgICogQGZ1bmN0aW9uIHBvc3RcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSB1cmwgLSBVUkwuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSAtIERhdGEuXHJcbiAgICAgKiBAcGFyYW0ge09iamVjdD19IGhlYWRlcnMgLSBIVFRQIGhlYWRlcnMuXHJcbiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJlc3BvbnNlIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgYXN5bmMgcG9zdCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgUFVUXHJcbiAgICAgKiBAZnVuY3Rpb24gcHV0XHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHB1dCh1cmwsIGRhdGEsIGhlYWRlcnMpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuXHJcbiAgICAgICAgY29uc3QgaHR0cE9wdHMgPSB7XHJcbiAgICAgICAgICAgIC4uLkRFRkFVTFRfSFRUUF9PUFRJT05TLFxyXG4gICAgICAgICAgICAuLi50aGlzLl91c2VySHR0cE9wdGlvbnMgfHwge30sXHJcbiAgICAgICAgICAgIHVybDogdXJsLFxyXG4gICAgICAgICAgICBtZXRob2Q6ICdQVVQnLFxyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzIHx8IHt9LFxyXG4gICAgICAgICAgICAuLi5yZXNvbHZlZERhdGFcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLl9odHRwUmVxdWVzdFN5bmMoaHR0cE9wdHMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUGVyZm9ybXMgSFRUUCBQQVRDSFxyXG4gICAgICogQGZ1bmN0aW9uIHBhdGNoXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIHBhdGNoKHVybCwgZGF0YSwgaGVhZGVycykge1xyXG4gICAgICAgIGNvbnN0IHJlc29sdmVkRGF0YSA9IHRoaXMuX3Jlc29sdmVEYXRhKGRhdGEpO1xyXG5cclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ1BBVENIJyxcclxuICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycyB8fCB7fSxcclxuICAgICAgICAgICAgLi4ucmVzb2x2ZWREYXRhXHJcbiAgICAgICAgfTtcclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5faHR0cFJlcXVlc3RTeW5jKGh0dHBPcHRzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IFBlcmZvcm1zIEhUVFAgREVMRVRFXHJcbiAgICAgKiBAZnVuY3Rpb24gZGVsZXRlXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdXJsIC0gVVJMLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3Q9fSBoZWFkZXJzIC0gSFRUUCBoZWFkZXJzLlxyXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBEYXRhLlxyXG4gICAgICogQHJldHVybiB7T2JqZWN0fSBSZXNwb25zZSBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIGRlbGV0ZSh1cmwsIGhlYWRlcnMsIGRhdGEpIHtcclxuICAgICAgICBjb25zdCByZXNvbHZlZERhdGEgPSB0aGlzLl9yZXNvbHZlRGF0YShkYXRhKTtcclxuICAgICAgICBjb25zdCBodHRwT3B0cyA9IHtcclxuICAgICAgICAgICAgLi4uREVGQVVMVF9IVFRQX09QVElPTlMsXHJcbiAgICAgICAgICAgIC4uLnRoaXMuX3VzZXJIdHRwT3B0aW9ucyB8fCB7fSxcclxuICAgICAgICAgICAgdXJsOiB1cmwsXHJcbiAgICAgICAgICAgIG1ldGhvZDogJ0RFTEVURScsXHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMgfHwge30sXHJcbiAgICAgICAgICAgIC4uLnJlc29sdmVkRGF0YVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIGxhc3QgcmVzcG9uc2Ugb2JqZWN0XHJcbiAgICAgKiBAZnVuY3Rpb24gZ2V0UmVzcG9uc2VcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2Ugb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBnZXRSZXNwb25zZSgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBsYXN0IHJlc3BvbnNlIGJvZHlcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUJvZHlcclxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gUmVzcG9uc2UgYm9keS5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VCb2R5KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UgJiYgdGhpcy5fbGFzdFJlc3BvbnNlLmJvZHkgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIGhlYWRlcnNcclxuICAgICAqIEBmdW5jdGlvbiBnZXRSZXNwb25zZUhlYWRlcnNcclxuICAgICAqIEByZXR1cm4ge09iamVjdH0gUmVzcG9uc2UgaGVhZGVycy5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VIZWFkZXJzKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFJlc3BvbnNlLmhlYWRlcnM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHJlc3BvbnNlIFVSTFxyXG4gICAgICogQGZ1bmN0aW9uIGdldFJlc3BvbnNlVXJsXHJcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IFJlc3BvbnNlIFVSTC5cclxuICAgICAqL1xyXG4gICAgZ2V0UmVzcG9uc2VVcmwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9sYXN0UmVzcG9uc2UudXJsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IHdoZXRoZXIgdGhlIHNwZWNpZmllZCBwYXR0ZXJuIGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlIGJvZHkuXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0VGV4dFxyXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHBhdHRlcm4gLSBQYXR0ZXJuIHRvIGFzc2VydC5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0VGV4dChwYXR0ZXJuKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIXRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBPeEVycm9yKGVyckhlbHBlci5lcnJvckNvZGUuQVNTRVJUX0VSUk9SLCAnUmVzcG9uc2UgYm9keSBpcyBlbXB0eScpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCByZXNwQ29udGVudCA9IHR5cGVvZiB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA9PT0gJ3N0cmluZycgPyB0aGlzLl9sYXN0UmVzcG9uc2UuYm9keSA6IEpTT04uc3RyaW5naWZ5KHRoaXMuX2xhc3RSZXNwb25zZS5ib2R5KTtcclxuICAgICAgICBpZiAoIW1vZFV0aWxzLm1hdGNoUGF0dGVybihyZXNwQ29udGVudCwgcGF0dGVybikpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHJlc3BvbnNlIGNvbnRlbnQgdG8gbWF0Y2g6IFwiJHtwYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHtyZXNwQ29udGVudH1cImApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCByZXNwb25zZSB0aW1lXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0UmVzcG9uc2VUaW1lXHJcbiAgICAgKiBAcGFyYW0ge051bWJlcn0gbWF4VGltZSAtIE1heGltdW0gcmVzcG9uc2UgdGltZSBpbiBtaWxsaXNlY29uZHMuXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFJlc3BvbnNlVGltZShtYXhUaW1lKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCBpZiBIVFRQIGhlYWRlciBpcyBwcmVzZW50ZWQgaW4gdGhlIHJlc3BvbnNlXHJcbiAgICAgKiBAZnVuY3Rpb24gYXNzZXJ0SGVhZGVyXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaGVhZGVyTmFtZSAtIEEgSFRUUCBoZWFkZXIgbmFtZS5cclxuICAgICAqIEBwYXJhbSB7U3RyaW5nPX0gaGVhZGVyVmFsdWVQYXR0ZXJuIC0gQW4gb3B0aW9uYWwgSFRUUCBoZWFkZXIgdmFsdWUgcGF0dGVybi5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0SGVhZGVyKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlUGF0dGVybiA9IG51bGwpIHtcclxuICAgICAgICBpZiAoIWhlYWRlck5hbWUgfHwgdHlwZW9mIGhlYWRlck5hbWUgIT09ICdzdHJpbmcnIHx8IGhlYWRlck5hbWUubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLl9sYXN0UmVzcG9uc2UuaGVhZGVycztcclxuICAgICAgICBpZiAoIWhlYWRlcnNbaGVhZGVyTmFtZV0pIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsICdFeHBlY3RlZCBIVFRQIGhlYWRlciBcIiR7aGVhZGVyTmFtZX1cIiB0byBiZSBwcmVzZW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKGhlYWRlclZhbHVlUGF0dGVybiAmJiB0eXBlb2YgaGVhZGVyVmFsdWVQYXR0ZXJuID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICBjb25zdCBhY3R1YWxIZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyTmFtZV07XHJcbiAgICAgICAgICAgIGlmICghbW9kVXRpbHMubWF0Y2hQYXR0ZXJuKGFjdHVhbEhlYWRlclZhbHVlLCBoZWFkZXJWYWx1ZVBhdHRlcm4pKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3hFcnJvcihlcnJIZWxwZXIuZXJyb3JDb2RlLkFTU0VSVF9FUlJPUiwgYEV4cGVjdGVkIEhUVFAgaGVhZGVyIFwiJHtoZWFkZXJOYW1lfVwiIHZhbHVlIHRvIG1hdGNoOiBcIiR7aGVhZGVyVmFsdWVQYXR0ZXJufVwiIGJ1dCBnb3Q6IFwiJHthY3R1YWxIZWFkZXJWYWx1ZX1cImApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IGlmIEhUVFAgY29va2llIGlzIHByZXNlbnRlZCBpbiB0aGUgcmVzcG9uc2VcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRDb29raWVcclxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBjb29raWVOYW1lIC0gQSBIVFRQIGNvb2tpZSBuYW1lLlxyXG4gICAgICogQHBhcmFtIHtTdHJpbmc9fSBjb29raWVWYWx1ZVBhdHRlcm4gLSBBbiBvcHRpb25hbCBIVFRQIGNvb2tpZSB2YWx1ZSBwYXR0ZXJuLlxyXG4gICAgICovXHJcbiAgICBhc3NlcnRDb29raWUoY29va2llTmFtZSwgY29va2llVmFsdWVQYXR0ZXJuKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQnKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBzdW1tYXJ5IEFzc2VydCB0aGUgbGFzdCBIVFRQIHJlc3BvbnNlJ3Mgc3RhdHVzIGNvZGVcclxuICAgICAqIEBmdW5jdGlvbiBhc3NlcnRTdGF0dXNcclxuICAgICAqIEBwYXJhbSB7TnVtYmVyfEFycmF5fSBjb2RlTGlzdCAtIEEgc2luZ2xlIHN0YXR1cyBjb2RlIG9yIGEgbGlzdCBvZiBjb2Rlcy5cclxuICAgICAqL1xyXG4gICAgYXNzZXJ0U3RhdHVzKGNvZGVMaXN0KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl9sYXN0UmVzcG9uc2UgfHwgIWNvZGVMaXN0KSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgd2UgZ290IGEgc2luZ2xlIHZhbHVlLCB0aGVuIGNvbnZlcnQgaXQgdG8gYW4gYXJyYXlcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29kZUxpc3QpKSB7XHJcbiAgICAgICAgICAgIGNvZGVMaXN0ID0gW2NvZGVMaXN0XTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHRoaXMuX2xhc3RSZXNwb25zZS5zdGF0dXNDb2RlO1xyXG4gICAgICAgIGlmICghY29kZUxpc3QuaW5jbHVkZXMoc3RhdHVzQ29kZSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IE94RXJyb3IoZXJySGVscGVyLmVycm9yQ29kZS5BU1NFUlRfRVJST1IsIGBFeHBlY3RlZCBIVFRQIHN0YXR1cyB0byBiZTogXCIke2NvZGVMaXN0fVwiIGJ1dCBnb3Q6IFwiJHtzdGF0dXNDb2RlfVwiYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgQXNzZXJ0IEhUVFAgMjAwIE9LIHN0YXR1c1xyXG4gICAgICogQGZ1bmN0aW9uIGFzc2VydFN0YXR1c09rXHJcbiAgICAgKi9cclxuICAgIGFzc2VydFN0YXR1c09rKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmFzc2VydFN0YXR1cygyMDApO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHN1bW1hcnkgT3BlbnMgbmV3IHRyYW5zYWN0aW9uLlxyXG4gICAgICogQGRlc2NyaXB0aW9uIFRoZSB0cmFuc2FjdGlvbiB3aWxsIHBlcnNpc3QgdGlsbCBhIG5ldyBvbmUgaXMgb3BlbmVkLiBUcmFuc2FjdGlvbiBuYW1lcyBtdXN0IGJlXHJcbiAgICAgKiAgICAgICAgICAgICAgdW5pcXVlLlxyXG4gICAgICogQGZ1bmN0aW9uIHRyYW5zYWN0aW9uXHJcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSAtIFRoZSB0cmFuc2FjdGlvbiBuYW1lLlxyXG4gICAgICovXHJcbiAgICBhc3luYyB0cmFuc2FjdGlvbihuYW1lKSB7XHJcbiAgICAgICAgZ2xvYmFsLl9sYXN0VHJhbnNhY3Rpb25OYW1lID0gbmFtZTtcclxuICAgIH1cclxuXHJcbiAgICBfcmVzb2x2ZURhdGEoZGF0YSkge1xyXG4gICAgICAgIGNvbnN0IGRhdGFSZXNvbHZlciA9IHt9O1xyXG5cclxuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgICAgICBtb2RVdGlscy5hc3NlcnRDaXJjdWxhcihkYXRhKTtcclxuICAgICAgICAgICAgZGF0YVJlc29sdmVyLmpzb24gPSBkYXRhO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRhdGFSZXNvbHZlci5ib2R5ID0gZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBkYXRhUmVzb2x2ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2h0dHBSZXF1ZXN0U3luYyhodHRwT3B0cykge1xyXG4gICAgICAgIGxldCByZXN1bHQ7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IGdvdChodHRwT3B0cyk7XHJcbiAgICAgICAgICAgIGlmIChodHRwT3B0cy5kZWZsYXRlUmF3ICYmIHJlc3VsdC5oZWFkZXJzWydjb250ZW50LWVuY29kaW5nJ10gPT09ICdkZWZsYXRlJykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgemxpYiA9IHJlcXVpcmUoJ3psaWInKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGRlY29tcCA9IHpsaWIuY3JlYXRlSW5mbGF0ZVJhdygpO1xyXG4gICAgICAgICAgICAgICAgZGVjb21wLndyaXRlKHJlc3VsdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIGF3YWl0ICgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb21wLm9uKCdkYXRhJywgKGRhdGEpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gZGF0YS50b1N0cmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdICYmIHJlc3VsdC5oZWFkZXJzW0NPTlRFTlRfVFlQRV9IRUFERVJdLmluY2x1ZGVzKCdhcHBsaWNhdGlvbi9qc29uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYm9keSA9IEpTT04ucGFyc2UocmVzdWx0LmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgcGFyc2luZyBmYWlscyBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0gJiYgcmVzdWx0LmhlYWRlcnNbQ09OVEVOVF9UWVBFX0hFQURFUl0uaW5jbHVkZXMoJ2FwcGxpY2F0aW9uL2pzb24nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5ib2R5ID0gSlNPTi5wYXJzZShyZXN1bHQuYm9keSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBwYXJzaW5nIGZhaWxzIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmdcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlc3VsdCA9IGU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICAgICAgbGV0IGJvZHkgPSBudWxsO1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQucmVzcG9uc2UgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5yZXNwb25zZS5ib2R5XHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSBKU09OLnBhcnNlKGJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IHJlc3VsdC5yZXNwb25zZS5ib2R5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiByZXN1bHQubWVzc2FnZSxcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5oZWFkZXJzIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNDb2RlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c01lc3NhZ2U6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5zdGF0dXNNZXNzYWdlIDogbnVsbCxcclxuICAgICAgICAgICAgICAgIHJhd0JvZHk6IHJlc3VsdC5yZXNwb25zZSA/IHJlc3VsdC5yZXNwb25zZS5yYXdCb2R5IDogbnVsbCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IGJvZHlcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXN1bHQgPSB7XHJcbiAgICAgICAgICAgICAgICBodHRwVmVyc2lvbjogcmVzdWx0Lmh0dHBWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVzdWx0LmhlYWRlcnMsXHJcbiAgICAgICAgICAgICAgICB1cGdyYWRlOiByZXN1bHQudXBncmFkZSxcclxuICAgICAgICAgICAgICAgIHVybDogcmVzdWx0LnVybCxcclxuICAgICAgICAgICAgICAgIG1ldGhvZDogcmVzdWx0Lm1ldGhvZCxcclxuICAgICAgICAgICAgICAgIHN0YXR1c0NvZGU6IHJlc3VsdC5zdGF0dXNDb2RlLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzTWVzc2FnZTogcmVzdWx0LnN0YXR1c01lc3NhZ2UsXHJcbiAgICAgICAgICAgICAgICB0aW1pbmdzOiByZXN1bHQudGltaW5ncyxcclxuICAgICAgICAgICAgICAgIHJlcXVlc3RVcmw6IHJlc3VsdC5yZXF1ZXN0VXJsLFxyXG4gICAgICAgICAgICAgICAgcmVkaXJlY3RVcmxzOiByZXN1bHQucmVkaXJlY3RVcmxzLFxyXG4gICAgICAgICAgICAgICAgaXNGcm9tQ2FjaGU6IHJlc3VsdC5pc0Zyb21DYWNoZSxcclxuICAgICAgICAgICAgICAgIGlwOiByZXN1bHQuaXAsXHJcbiAgICAgICAgICAgICAgICByZXRyeUNvdW50OiByZXN1bHQucmV0cnlDb3VudCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IHJlc3VsdC5ib2R5XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBzdG9yZSBsYXN0IHJlc3BvbnNlIHRvIGFsbG93IGZ1cnRoZXIgYXNzZXJ0aW9ucyBhbmQgdmFsaWRhdGlvbnNcclxuICAgICAgICB0aGlzLl9sYXN0UmVzcG9uc2UgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQStCO0FBakIvQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQU9BLE1BQU1BLFdBQVcsR0FBRyxNQUFNO0FBQzFCLE1BQU1DLGdCQUFnQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBRztBQUN0QyxNQUFNQyxhQUFhLEdBQUcsS0FBSztBQUMzQixNQUFNQyxvQkFBb0IsR0FBRztFQUN6QkMsVUFBVSxFQUFFLElBQUk7RUFDaEJDLFlBQVksRUFBRSxNQUFNO0VBQ3BCQyxPQUFPLEVBQUU7SUFDTEMsTUFBTSxFQUFFLElBQUk7SUFDWkMsT0FBTyxFQUFFLEdBQUc7SUFDWkMsYUFBYSxFQUFFLEdBQUc7SUFDbEJDLE1BQU0sRUFBRSxNQUFNO0lBQ2RDLElBQUksRUFBRSxNQUFNO0lBQ1pDLFFBQVEsRUFBRVg7RUFDZCxDQUFDO0VBQ0RZLEtBQUssRUFBRVgsYUFBYTtFQUNwQlksS0FBSyxFQUFFO0lBQ0hDLGtCQUFrQixFQUFF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
|