oxygen-cli 1.40.2 → 1.42.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 +13 -0
- package/build/core/OxygenCore.js +41 -274
- package/build/core/OxygenEvents.js +2 -12
- package/build/core/OxygenModule.js +1 -16
- package/build/core/OxygenService.js +1 -12
- package/build/core/OxygenSubModule.js +1 -10
- package/build/core/WebDriverModule.js +2 -32
- package/build/core/utils.js +2 -21
- package/build/errors/HookError.js +2 -8
- package/build/errors/ModuleError.js +2 -8
- package/build/errors/ModuleUnavailableError.js +1 -3
- package/build/errors/OxygenError.js +3 -36
- package/build/errors/ScriptNotFound.js +2 -8
- package/build/errors/helper.js +51 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +39 -105
- package/build/lib/cli.js +3 -30
- package/build/lib/debugger.js +2 -145
- package/build/lib/img-merge.js +2 -16
- package/build/lib/launcher.js +3 -31
- package/build/lib/moduleRequire.js +1 -4
- package/build/lib/parallel-launcher.js +44 -84
- package/build/lib/param-manager.js +2 -29
- 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/text-to-image.js +5 -26
- package/build/lib/util.js +4 -75
- 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 +21 -34
- package/build/ox_modules/module-assert.js +9 -28
- package/build/ox_modules/module-date.js +3 -8
- package/build/ox_modules/module-db.js +8 -29
- package/build/ox_modules/module-email.js +14 -45
- package/build/ox_modules/module-eyes.js +6 -47
- package/build/ox_modules/module-http/ntlm-util.js +3 -7
- package/build/ox_modules/module-http/ntlm.js +9 -78
- package/build/ox_modules/module-http.js +69 -172
- package/build/ox_modules/module-log.js +10 -23
- package/build/ox_modules/module-mailinator.js +11 -33
- package/build/ox_modules/module-mob/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-mob/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-mob/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-mob/commands/assertText.js +1 -4
- package/build/ox_modules/module-mob/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-mob/commands/assertValue.js +9 -17
- package/build/ox_modules/module-mob/commands/back.js +1 -3
- package/build/ox_modules/module-mob/commands/clear.js +1 -5
- package/build/ox_modules/module-mob/commands/click.js +3 -5
- package/build/ox_modules/module-mob/commands/clickHidden.js +3 -10
- package/build/ox_modules/module-mob/commands/clickLong.js +1 -3
- package/build/ox_modules/module-mob/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-mob/commands/closeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/debug.js +2 -3
- package/build/ox_modules/module-mob/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-mob/commands/enableNetwork.js +4 -13
- package/build/ox_modules/module-mob/commands/execute.js +1 -3
- package/build/ox_modules/module-mob/commands/findElement.js +1 -4
- package/build/ox_modules/module-mob/commands/findElements.js +1 -5
- package/build/ox_modules/module-mob/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-mob/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-mob/commands/getBrowserLogs.js +1 -11
- package/build/ox_modules/module-mob/commands/getCurrentActivity.js +1 -3
- package/build/ox_modules/module-mob/commands/getCurrentPackage.js +1 -3
- package/build/ox_modules/module-mob/commands/getDeviceLogs.js +1 -10
- package/build/ox_modules/module-mob/commands/getDeviceTime.js +1 -3
- package/build/ox_modules/module-mob/commands/getLocation.js +1 -3
- package/build/ox_modules/module-mob/commands/getSource.js +1 -3
- package/build/ox_modules/module-mob/commands/getText.js +1 -5
- package/build/ox_modules/module-mob/commands/getTitle.js +1 -3
- package/build/ox_modules/module-mob/commands/getUrl.js +1 -3
- package/build/ox_modules/module-mob/commands/getValue.js +5 -10
- package/build/ox_modules/module-mob/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-mob/commands/hideKeyboard.js +1 -3
- package/build/ox_modules/module-mob/commands/index.js +1 -148
- package/build/ox_modules/module-mob/commands/installApp.js +1 -3
- package/build/ox_modules/module-mob/commands/isAppInstalled.js +1 -3
- package/build/ox_modules/module-mob/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-mob/commands/isChecked.js +1 -3
- package/build/ox_modules/module-mob/commands/isClickable.js +1 -3
- package/build/ox_modules/module-mob/commands/isExist.js +1 -4
- package/build/ox_modules/module-mob/commands/isSelected.js +1 -3
- package/build/ox_modules/module-mob/commands/isVisible.js +1 -4
- package/build/ox_modules/module-mob/commands/isWebViewContext.js +1 -3
- package/build/ox_modules/module-mob/commands/launchApp.js +1 -3
- package/build/ox_modules/module-mob/commands/longPressKeyCode.js +1 -3
- package/build/ox_modules/module-mob/commands/open.js +1 -4
- package/build/ox_modules/module-mob/commands/pause.js +1 -3
- package/build/ox_modules/module-mob/commands/removeApp.js +1 -3
- package/build/ox_modules/module-mob/commands/resetApp.js +1 -3
- package/build/ox_modules/module-mob/commands/scrollIntoElement.js +1 -7
- package/build/ox_modules/module-mob/commands/scrollIntoView.js +1 -3
- package/build/ox_modules/module-mob/commands/select.js +1 -5
- package/build/ox_modules/module-mob/commands/selectFrame.js +1 -5
- package/build/ox_modules/module-mob/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-mob/commands/sendKeys.js +6 -10
- package/build/ox_modules/module-mob/commands/setContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setNativeContext.js +1 -3
- package/build/ox_modules/module-mob/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-mob/commands/setWebViewContext.js +3 -7
- package/build/ox_modules/module-mob/commands/shake.js +1 -3
- package/build/ox_modules/module-mob/commands/smsClickLink.js +1 -3
- package/build/ox_modules/module-mob/commands/smsGetText.js +3 -7
- package/build/ox_modules/module-mob/commands/swipe.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeElement.js +1 -3
- package/build/ox_modules/module-mob/commands/swipeScreen.js +1 -3
- package/build/ox_modules/module-mob/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-mob/commands/tap.js +1 -3
- package/build/ox_modules/module-mob/commands/type.js +3 -8
- package/build/ox_modules/module-mob/commands/unlockPattern.js +9 -11
- package/build/ox_modules/module-mob/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-mob/commands/waitForInteractable.js +1 -4
- package/build/ox_modules/module-mob/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-mob.js +74 -216
- package/build/ox_modules/module-mongo.js +265 -0
- package/build/ox_modules/module-pdf.js +24 -65
- package/build/ox_modules/module-proxy.js +9 -69
- package/build/ox_modules/module-serial.js +8 -33
- package/build/ox_modules/module-shell.js +10 -30
- package/build/ox_modules/module-soap.js +17 -52
- package/build/ox_modules/module-twilio.js +11 -54
- package/build/ox_modules/module-utils.js +22 -58
- package/build/ox_modules/module-web/commands/alertAccept.js +1 -3
- package/build/ox_modules/module-web/commands/alertDismiss.js +1 -3
- package/build/ox_modules/module-web/commands/assertAlert.js +1 -7
- package/build/ox_modules/module-web/commands/assertExist.js +1 -3
- package/build/ox_modules/module-web/commands/assertSelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/assertSelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/assertText.js +1 -4
- package/build/ox_modules/module-web/commands/assertTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/assertTitle.js +1 -4
- package/build/ox_modules/module-web/commands/assertValue.js +1 -4
- package/build/ox_modules/module-web/commands/back.js +1 -3
- package/build/ox_modules/module-web/commands/clear.js +1 -6
- package/build/ox_modules/module-web/commands/click.js +4 -15
- package/build/ox_modules/module-web/commands/clickHidden.js +2 -8
- package/build/ox_modules/module-web/commands/closeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/debug.js +2 -3
- package/build/ox_modules/module-web/commands/deleteCookies.js +1 -3
- package/build/ox_modules/module-web/commands/deselect.js +1 -3
- package/build/ox_modules/module-web/commands/doubleClick.js +3 -10
- package/build/ox_modules/module-web/commands/dragAndDrop.js +1 -3
- package/build/ox_modules/module-web/commands/execute.js +1 -3
- package/build/ox_modules/module-web/commands/fileBrowse.js +4 -11
- package/build/ox_modules/module-web/commands/findElement.js +1 -4
- package/build/ox_modules/module-web/commands/findElements.js +1 -5
- package/build/ox_modules/module-web/commands/fullscreenWindow.js +1 -3
- package/build/ox_modules/module-web/commands/getAlertText.js +1 -3
- package/build/ox_modules/module-web/commands/getAttribute.js +1 -5
- package/build/ox_modules/module-web/commands/getBrowserLogs.js +1 -4
- package/build/ox_modules/module-web/commands/getCookies.js +1 -3
- package/build/ox_modules/module-web/commands/getCssValue.js +1 -5
- package/build/ox_modules/module-web/commands/getElementCount.js +1 -3
- package/build/ox_modules/module-web/commands/getHTML.js +1 -3
- package/build/ox_modules/module-web/commands/getSource.js +1 -3
- package/build/ox_modules/module-web/commands/getText.js +1 -5
- package/build/ox_modules/module-web/commands/getTitle.js +1 -3
- package/build/ox_modules/module-web/commands/getUrl.js +1 -3
- package/build/ox_modules/module-web/commands/getValue.js +1 -6
- package/build/ox_modules/module-web/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-web/commands/getWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/getXMLPageSource.js +1 -6
- package/build/ox_modules/module-web/commands/index.js +1 -184
- package/build/ox_modules/module-web/commands/isAlertPresent.js +1 -3
- package/build/ox_modules/module-web/commands/isChecked.js +1 -3
- package/build/ox_modules/module-web/commands/isExist.js +1 -4
- package/build/ox_modules/module-web/commands/isInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/isSelected.js +1 -3
- package/build/ox_modules/module-web/commands/isVisible.js +1 -4
- package/build/ox_modules/module-web/commands/makeVisible.js +2 -11
- package/build/ox_modules/module-web/commands/maximizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/minimizeWindow.js +1 -3
- package/build/ox_modules/module-web/commands/mock.js +1 -3
- package/build/ox_modules/module-web/commands/mockClearAll.js +1 -3
- package/build/ox_modules/module-web/commands/mockRestoreAll.js +1 -3
- package/build/ox_modules/module-web/commands/newWindow.js +1 -3
- package/build/ox_modules/module-web/commands/open.js +1 -5
- package/build/ox_modules/module-web/commands/pause.js +1 -3
- package/build/ox_modules/module-web/commands/point.js +1 -3
- package/build/ox_modules/module-web/commands/pointJS.js +2 -9
- package/build/ox_modules/module-web/commands/refresh.js +1 -3
- package/build/ox_modules/module-web/commands/rightClick.js +3 -9
- package/build/ox_modules/module-web/commands/rightClickActions.js +1 -3
- package/build/ox_modules/module-web/commands/scrollToElement.js +1 -3
- package/build/ox_modules/module-web/commands/select.js +1 -6
- package/build/ox_modules/module-web/commands/selectFrame.js +1 -4
- package/build/ox_modules/module-web/commands/selectWindow.js +5 -27
- package/build/ox_modules/module-web/commands/sendKeys.js +3 -7
- package/build/ox_modules/module-web/commands/setAutoWaitForAngular.js +2 -3
- package/build/ox_modules/module-web/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-web/commands/setWindowSize.js +1 -3
- package/build/ox_modules/module-web/commands/takeScreenshot.js +3 -6
- package/build/ox_modules/module-web/commands/type.js +1 -6
- package/build/ox_modules/module-web/commands/verifyAlert.js +1 -7
- package/build/ox_modules/module-web/commands/verifyExist.js +2 -7
- package/build/ox_modules/module-web/commands/verifySelectedLabel.js +1 -5
- package/build/ox_modules/module-web/commands/verifySelectedValue.js +1 -4
- package/build/ox_modules/module-web/commands/verifyText.js +1 -4
- package/build/ox_modules/module-web/commands/verifyTextNotPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTextPresent.js +1 -7
- package/build/ox_modules/module-web/commands/verifyTitle.js +1 -4
- package/build/ox_modules/module-web/commands/verifyValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForAngular.js +11 -14
- package/build/ox_modules/module-web/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-web/commands/waitForInteractable.js +1 -3
- package/build/ox_modules/module-web/commands/waitForNotExist.js +1 -9
- package/build/ox_modules/module-web/commands/waitForNotText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForNotValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForText.js +1 -4
- package/build/ox_modules/module-web/commands/waitForValue.js +1 -4
- package/build/ox_modules/module-web/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-web/commands/waitForWindow.js +4 -22
- package/build/ox_modules/module-web/webdriver/ChromeWDM.js +287 -0
- package/build/ox_modules/module-web/webdriver/auto-start.js +25 -0
- package/build/ox_modules/module-web.js +112 -232
- package/build/ox_modules/module-win/commands/assertText.js +1 -4
- package/build/ox_modules/module-win/commands/assertTitle.js +1 -5
- package/build/ox_modules/module-win/commands/assertValue.js +9 -17
- package/build/ox_modules/module-win/commands/back.js +1 -3
- package/build/ox_modules/module-win/commands/clear.js +1 -5
- package/build/ox_modules/module-win/commands/click.js +1 -3
- package/build/ox_modules/module-win/commands/clickLong.js +1 -3
- package/build/ox_modules/module-win/commands/clickMultipleTimes.js +1 -5
- package/build/ox_modules/module-win/commands/findElement.js +1 -4
- package/build/ox_modules/module-win/commands/findElements.js +1 -5
- package/build/ox_modules/module-win/commands/getAppiumLogs.js +1 -3
- package/build/ox_modules/module-win/commands/getCurrentWindowHandle.js +1 -3
- package/build/ox_modules/module-win/commands/getLocation.js +1 -3
- package/build/ox_modules/module-win/commands/getSource.js +1 -3
- package/build/ox_modules/module-win/commands/getText.js +1 -5
- package/build/ox_modules/module-win/commands/getValue.js +5 -10
- package/build/ox_modules/module-win/commands/getWindowHandles.js +1 -3
- package/build/ox_modules/module-win/commands/index.js +1 -74
- package/build/ox_modules/module-win/commands/isCheckable.js +1 -3
- package/build/ox_modules/module-win/commands/isChecked.js +1 -3
- package/build/ox_modules/module-win/commands/isClickable.js +1 -3
- package/build/ox_modules/module-win/commands/isExist.js +1 -4
- package/build/ox_modules/module-win/commands/isSelected.js +1 -3
- package/build/ox_modules/module-win/commands/isVisible.js +1 -4
- package/build/ox_modules/module-win/commands/open.js +1 -3
- package/build/ox_modules/module-win/commands/pause.js +1 -3
- package/build/ox_modules/module-win/commands/rightClick.js +1 -3
- package/build/ox_modules/module-win/commands/selectWindow.js +1 -16
- package/build/ox_modules/module-win/commands/sendKeys.js +1 -5
- package/build/ox_modules/module-win/commands/setTimeout.js +1 -3
- package/build/ox_modules/module-win/commands/takeScreenshot.js +1 -3
- package/build/ox_modules/module-win/commands/tap.js +1 -3
- package/build/ox_modules/module-win/commands/type.js +1 -5
- package/build/ox_modules/module-win/commands/waitForExist.js +1 -3
- package/build/ox_modules/module-win/commands/waitForInteractable.js +1 -5
- package/build/ox_modules/module-win/commands/waitForVisible.js +1 -3
- package/build/ox_modules/module-win.js +54 -95
- package/build/ox_modules/utils.js +91 -79
- package/build/ox_reporters/reporter-excel.js +2 -59
- package/build/ox_reporters/reporter-html.js +2 -29
- package/build/ox_reporters/reporter-json.js +2 -15
- package/build/ox_reporters/reporter-junit.js +2 -25
- package/build/ox_reporters/reporter-pdf.js +2 -20
- package/build/ox_reporters/reporter-rp.js +2 -91
- package/build/ox_reporters/reporter-xml.js +2 -18
- package/build/ox_services/service-devtools/submodule-network.js +4 -86
- package/build/ox_services/service-devtools.js +2 -24
- package/build/reporter/FileReporterBase.js +6 -45
- package/build/reporter/ReportAggregator.js +14 -120
- package/build/reporter/ReporterBase.js +1 -6
- package/build/reporter/WebSocketReporter.js +1 -39
- package/build/runners/WorkerProcess.js +2 -107
- package/build/runners/cucumber/CucumberEventListener.js +4 -29
- package/build/runners/cucumber/CucumberReporter.js +2 -57
- package/build/runners/cucumber/CucumberWorker.js +3 -69
- package/build/runners/cucumber/index.js +2 -31
- package/build/runners/cucumber/worker.js +2 -19
- package/build/runners/index.js +4 -11
- package/build/runners/oxygen/OxygenWorker.js +3 -61
- package/build/runners/oxygen/index.js +18 -179
- package/build/runners/oxygen/worker.js +3 -27
- package/package.json +5 -1
|
@@ -4,51 +4,32 @@ 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 _events = require("events");
|
|
11
|
-
|
|
12
9
|
var _path = _interopRequireDefault(require("path"));
|
|
13
|
-
|
|
14
10
|
var _testResult = _interopRequireDefault(require("../model/test-result"));
|
|
15
|
-
|
|
16
11
|
var _util = _interopRequireDefault(require("../lib/util"));
|
|
17
|
-
|
|
18
12
|
var _when = require("when");
|
|
19
|
-
|
|
20
13
|
var _reporterJson = _interopRequireDefault(require("../ox_reporters/reporter-json"));
|
|
21
|
-
|
|
22
14
|
var _reporterJunit = _interopRequireDefault(require("../ox_reporters/reporter-junit"));
|
|
23
|
-
|
|
24
15
|
var _reporterHtml = _interopRequireDefault(require("../ox_reporters/reporter-html"));
|
|
25
|
-
|
|
26
16
|
var _reporterExcel = _interopRequireDefault(require("../ox_reporters/reporter-excel"));
|
|
27
|
-
|
|
28
17
|
var _reporterPdf = _interopRequireDefault(require("../ox_reporters/reporter-pdf"));
|
|
29
|
-
|
|
30
18
|
var _reporterXml = _interopRequireDefault(require("../ox_reporters/reporter-xml"));
|
|
31
|
-
|
|
32
|
-
var _reporterRp = _interopRequireDefault(require("../ox_reporters/reporter-rp"));
|
|
33
|
-
|
|
34
19
|
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
35
|
-
|
|
36
20
|
var _status = _interopRequireDefault(require("../model/status"));
|
|
37
|
-
|
|
38
|
-
function
|
|
39
|
-
|
|
21
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
40
23
|
const Reporters = {
|
|
41
24
|
json: _reporterJson.default,
|
|
42
25
|
junit: _reporterJunit.default,
|
|
43
26
|
html: _reporterHtml.default,
|
|
44
27
|
excel: _reporterExcel.default,
|
|
45
28
|
pdf: _reporterPdf.default,
|
|
46
|
-
xml: _reporterXml.default
|
|
47
|
-
rp: _reporterRp.default
|
|
29
|
+
xml: _reporterXml.default
|
|
48
30
|
};
|
|
49
31
|
const DEFAULT_TEST_NAME = 'Oxygen Test';
|
|
50
32
|
const DEFAULT_REPORTERS = [];
|
|
51
|
-
|
|
52
33
|
class ReportAggregator extends _events.EventEmitter {
|
|
53
34
|
constructor(options) {
|
|
54
35
|
super();
|
|
@@ -56,42 +37,38 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
56
37
|
this.runnerEndPromises = {};
|
|
57
38
|
this.options = options;
|
|
58
39
|
}
|
|
59
|
-
|
|
60
40
|
getExitCode() {
|
|
61
41
|
let exitCode = 0;
|
|
62
|
-
|
|
63
42
|
if (this.results && Array.isArray(this.results) && this.results.length > 0) {
|
|
64
43
|
const testFailded = this.results.find(item => item.status === 'failed');
|
|
65
|
-
|
|
66
44
|
if (testFailded) {
|
|
67
45
|
exitCode = -1;
|
|
68
46
|
}
|
|
69
47
|
} else {
|
|
70
48
|
exitCode = -1;
|
|
71
49
|
}
|
|
72
|
-
|
|
73
50
|
return exitCode;
|
|
74
51
|
}
|
|
75
|
-
|
|
76
52
|
async init() {
|
|
53
|
+
if (!this.options._oxide) {
|
|
54
|
+
const {
|
|
55
|
+
default: ReportPortalReporter
|
|
56
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require('../ox_reporters/reporter-rp')));
|
|
57
|
+
Reporters.rp = ReportPortalReporter;
|
|
58
|
+
}
|
|
77
59
|
this.reporters = [];
|
|
78
60
|
const generalReportingOpts = this.options.reporting || {};
|
|
79
|
-
|
|
80
61
|
for (let reporter of generalReportingOpts.reporters || DEFAULT_REPORTERS) {
|
|
81
62
|
if (typeof reporter !== 'string' && !Object.prototype.hasOwnProperty.call(reporter, 'name')) {
|
|
82
63
|
continue;
|
|
83
64
|
}
|
|
84
|
-
|
|
85
65
|
const reporterName = typeof reporter === 'string' ? reporter : reporter.name;
|
|
86
66
|
const reporterOpts = typeof reporter === 'object' ? reporter : undefined;
|
|
87
|
-
|
|
88
67
|
if (Object.prototype.hasOwnProperty.call(Reporters, reporterName)) {
|
|
89
68
|
if (reporterOpts && typeof reporterOpts.enabled === 'boolean' && !reporterOpts.enabled) {
|
|
90
69
|
continue;
|
|
91
70
|
}
|
|
92
|
-
|
|
93
71
|
const reporter = new Reporters[reporterName](this.options, reporterOpts, this);
|
|
94
|
-
|
|
95
72
|
if (reporter.init) {
|
|
96
73
|
try {
|
|
97
74
|
await reporter.init();
|
|
@@ -99,27 +76,21 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
99
76
|
console.log(`Failed to initialize "${reporterName}" reporter: ${err.message}`);
|
|
100
77
|
}
|
|
101
78
|
}
|
|
102
|
-
|
|
103
79
|
this.reporters.push(reporter);
|
|
104
80
|
}
|
|
105
81
|
}
|
|
106
82
|
}
|
|
107
|
-
|
|
108
83
|
getResults() {
|
|
109
84
|
return this.results;
|
|
110
85
|
}
|
|
111
|
-
|
|
112
86
|
async generateReports() {
|
|
113
87
|
if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
|
|
114
88
|
return false;
|
|
115
89
|
}
|
|
116
|
-
|
|
117
90
|
const groupedResults = this.groupResults();
|
|
118
|
-
|
|
119
91
|
for (let reporter of this.reporters) {
|
|
120
92
|
try {
|
|
121
93
|
const reportPath = await reporter.generate(groupedResults);
|
|
122
|
-
|
|
123
94
|
if (reportPath) {
|
|
124
95
|
console.log(`Your report is ready: ${reportPath}`);
|
|
125
96
|
}
|
|
@@ -127,31 +98,25 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
127
98
|
console.error(`Report generation failed: ${e.message}`);
|
|
128
99
|
}
|
|
129
100
|
}
|
|
130
|
-
|
|
131
101
|
return true;
|
|
132
102
|
}
|
|
133
|
-
|
|
134
103
|
async waitForResult(rid) {
|
|
135
104
|
if (!rid || !this.runnerEndPromises[rid]) {
|
|
136
105
|
return null;
|
|
137
106
|
}
|
|
138
|
-
|
|
139
107
|
return this.runnerEndPromises[rid];
|
|
140
108
|
}
|
|
141
|
-
|
|
142
109
|
async waitForResults() {
|
|
143
110
|
if (this.runnerEndPromises && this.runnerEndPromises.length) {
|
|
144
111
|
return Promise.all(this.runnerEndPromises);
|
|
145
112
|
}
|
|
146
113
|
}
|
|
147
|
-
|
|
148
114
|
async onLaunchStart(options) {
|
|
149
115
|
const eventArgs = {
|
|
150
116
|
options
|
|
151
117
|
};
|
|
152
118
|
await this._invokeReportersHook('onLaunchStart', eventArgs);
|
|
153
119
|
}
|
|
154
|
-
|
|
155
120
|
async onLaunchEnd() {
|
|
156
121
|
const results = this.groupResults();
|
|
157
122
|
const eventArgs = {
|
|
@@ -160,12 +125,10 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
160
125
|
this.emit('launch:end', results);
|
|
161
126
|
await this._invokeReportersHook('onLaunchEnd', eventArgs);
|
|
162
127
|
}
|
|
163
|
-
|
|
164
128
|
async onRunnerStart(rid, opts, caps) {
|
|
165
129
|
if (!rid) {
|
|
166
130
|
throw new Error('"rid" cannot be empty.');
|
|
167
131
|
}
|
|
168
|
-
|
|
169
132
|
const testResult = new _testResult.default();
|
|
170
133
|
testResult.rid = rid;
|
|
171
134
|
testResult.name = opts.name || DEFAULT_TEST_NAME;
|
|
@@ -184,15 +147,12 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
184
147
|
this.emit('runner:start', eventArgs);
|
|
185
148
|
await this._invokeReportersHook('onRunnerStart', eventArgs);
|
|
186
149
|
}
|
|
187
|
-
|
|
188
150
|
async onRunnerEnd(rid, finalResult, fatalError) {
|
|
189
151
|
const testResult = this.results.find(x => x.rid === rid);
|
|
190
|
-
|
|
191
152
|
if (testResult) {
|
|
192
153
|
testResult.endTime = _util.default.getTimeStamp();
|
|
193
154
|
testResult.duration = testResult.endTime - testResult.startTime;
|
|
194
155
|
testResult.status = this._determineTestStatusBySuites(testResult, fatalError);
|
|
195
|
-
|
|
196
156
|
if (testResult.status === _status.default.FAILED) {
|
|
197
157
|
if (fatalError) {
|
|
198
158
|
testResult.failure = fatalError instanceof Error ? _helper.default.getFailureFromError(fatalError) : fatalError;
|
|
@@ -200,11 +160,9 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
200
160
|
testResult.failure = this._getFirstFailure(testResult);
|
|
201
161
|
}
|
|
202
162
|
}
|
|
203
|
-
|
|
204
163
|
if (finalResult && finalResult.capabilities) {
|
|
205
164
|
testResult.capabilities = finalResult.capabilities;
|
|
206
165
|
}
|
|
207
|
-
|
|
208
166
|
if (testResult.failure) {
|
|
209
167
|
if (testResult.failure.type && testResult.failure.location) {
|
|
210
168
|
console.log(`Error: ${testResult.failure.type} at ${testResult.failure.location}.`);
|
|
@@ -214,50 +172,38 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
214
172
|
console.log(`Error: ${testResult.failure}`);
|
|
215
173
|
}
|
|
216
174
|
}
|
|
217
|
-
|
|
218
175
|
console.log(`Test ${rid} has finished with status: ${testResult.status.toUpperCase()}.`);
|
|
219
176
|
}
|
|
220
|
-
|
|
221
177
|
const eventArgs = {
|
|
222
178
|
rid,
|
|
223
179
|
result: testResult
|
|
224
180
|
};
|
|
225
181
|
this.emit('runner:end', eventArgs);
|
|
226
182
|
await this._invokeReportersHook('onRunnerEnd', eventArgs);
|
|
227
|
-
|
|
228
183
|
if (this.runnerEndPromises[rid]) {
|
|
229
184
|
process.nextTick(() => {
|
|
230
185
|
this.runnerEndPromises[rid].resolve(testResult);
|
|
231
186
|
});
|
|
232
187
|
}
|
|
233
188
|
}
|
|
234
|
-
|
|
235
189
|
_determineTestStatusBySuites(testResult, fatalError) {
|
|
236
190
|
if (fatalError) {
|
|
237
191
|
return _status.default.FAILED;
|
|
238
192
|
}
|
|
239
|
-
|
|
240
193
|
const hasFailedSuites = testResult.suites.some(x => x.status === _status.default.FAILED);
|
|
241
|
-
|
|
242
194
|
if (hasFailedSuites) {
|
|
243
195
|
return _status.default.FAILED;
|
|
244
196
|
}
|
|
245
|
-
|
|
246
197
|
const hasWarningSuites = testResult.suites.some(x => x.status === _status.default.WARNING);
|
|
247
|
-
|
|
248
198
|
if (hasWarningSuites) {
|
|
249
199
|
return _status.default.WARNING;
|
|
250
200
|
}
|
|
251
|
-
|
|
252
201
|
const allSuitesSkipped = testResult.suites.every(x => x.status === _status.default.SKIPPED);
|
|
253
|
-
|
|
254
202
|
if (allSuitesSkipped) {
|
|
255
203
|
return _status.default.SKIPPED;
|
|
256
204
|
}
|
|
257
|
-
|
|
258
205
|
return _status.default.PASSED;
|
|
259
206
|
}
|
|
260
|
-
|
|
261
207
|
async onIterationStart(rid, iteration, start) {
|
|
262
208
|
if (iteration) {
|
|
263
209
|
const msg = `${start} Iteration #${iteration} started...`;
|
|
@@ -265,17 +211,14 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
265
211
|
await this.onLogEntry(null, 'INFO', msg, 'user');
|
|
266
212
|
}
|
|
267
213
|
}
|
|
268
|
-
|
|
269
214
|
async onIterationEnd(rid, result, start) {
|
|
270
215
|
var _result$status;
|
|
271
|
-
|
|
272
216
|
if (result !== null && result !== void 0 && result.iterationNum && (_result$status = result.status) !== null && _result$status !== void 0 && _result$status.toUpperCase) {
|
|
273
217
|
const msg = `${start} Iteration #${result.iterationNum} ended with status: ${result.status.toUpperCase()}.`;
|
|
274
218
|
console.log(msg);
|
|
275
219
|
await this.onLogEntry(null, 'INFO', msg, 'user');
|
|
276
220
|
}
|
|
277
221
|
}
|
|
278
|
-
|
|
279
222
|
async onSuiteStart(rid, suiteId, suite) {
|
|
280
223
|
console.log(`Suite "${suite.name}" has started...`);
|
|
281
224
|
let eventArgs = {
|
|
@@ -286,14 +229,11 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
286
229
|
this.emit('suite:start', eventArgs);
|
|
287
230
|
await this._invokeReportersHook('onSuiteStart', eventArgs);
|
|
288
231
|
}
|
|
289
|
-
|
|
290
232
|
async onSuiteEnd(rid, suiteId, suiteResult) {
|
|
291
233
|
const testResult = this.results.find(x => x.rid === rid);
|
|
292
|
-
|
|
293
234
|
if (!testResult) {
|
|
294
235
|
return;
|
|
295
236
|
}
|
|
296
|
-
|
|
297
237
|
testResult.suites.push(suiteResult);
|
|
298
238
|
console.log(`Suite "${suiteResult.name}" has ended with status: ${suiteResult.status.toUpperCase()}.`);
|
|
299
239
|
const eventArgs = {
|
|
@@ -304,7 +244,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
304
244
|
this.emit('suite:end', eventArgs);
|
|
305
245
|
await this._invokeReportersHook('onSuiteEnd', eventArgs);
|
|
306
246
|
}
|
|
307
|
-
|
|
308
247
|
async onCaseStart(rid, suiteId, suiteRefId, caseId, caseDef) {
|
|
309
248
|
console.log(`- Case "${caseDef.name}" has started...`);
|
|
310
249
|
const eventArgs = {
|
|
@@ -317,7 +256,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
317
256
|
this.emit('case:start', eventArgs);
|
|
318
257
|
await this._invokeReportersHook('onCaseStart', eventArgs);
|
|
319
258
|
}
|
|
320
|
-
|
|
321
259
|
async onCaseEnd(rid, suiteId, suiteRefId, caseId, caseResult) {
|
|
322
260
|
console.log(`- Case "${caseResult.name}" has ended with status: ${caseResult.status.toUpperCase()}.`);
|
|
323
261
|
await this._saveTestCaseVideoAttachment(caseResult);
|
|
@@ -331,14 +269,11 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
331
269
|
this.emit('case:end', eventArgs);
|
|
332
270
|
await this._invokeReportersHook('onCaseEnd', eventArgs);
|
|
333
271
|
}
|
|
334
|
-
|
|
335
272
|
async onStepStart(rid, suiteId, caseId, step) {
|
|
336
273
|
if (this.options && this.options.rootPath && this.options.framework && this.options.framework === 'cucumber') {
|
|
337
274
|
const fullPath = _path.default.resolve(this.options.rootPath, step.location);
|
|
338
|
-
|
|
339
275
|
step.location = fullPath + ':1';
|
|
340
276
|
}
|
|
341
|
-
|
|
342
277
|
const eventArgs = {
|
|
343
278
|
rid,
|
|
344
279
|
suiteId,
|
|
@@ -348,7 +283,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
348
283
|
this.emit('step:start', eventArgs);
|
|
349
284
|
await this._invokeReportersHook('onStepStart', eventArgs);
|
|
350
285
|
}
|
|
351
|
-
|
|
352
286
|
async onStepEnd(rid, suiteId, caseId, stepResult) {
|
|
353
287
|
const eventArgs = {
|
|
354
288
|
rid,
|
|
@@ -359,7 +293,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
359
293
|
this.emit('step:end', eventArgs);
|
|
360
294
|
await this._invokeReportersHook('onStepEnd', eventArgs);
|
|
361
295
|
}
|
|
362
|
-
|
|
363
296
|
async onLogEntry(time, level, msg, src = null, {
|
|
364
297
|
suiteId,
|
|
365
298
|
caseId,
|
|
@@ -375,75 +308,60 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
375
308
|
src
|
|
376
309
|
};
|
|
377
310
|
this.emit('log', eventArgs);
|
|
378
|
-
|
|
379
311
|
if (!time) {
|
|
380
312
|
eventArgs.time = Date.now();
|
|
381
313
|
}
|
|
382
|
-
|
|
383
314
|
await this._invokeReportersHook('onLog', eventArgs);
|
|
384
315
|
}
|
|
385
|
-
|
|
386
316
|
_getFirstFailure(testResult) {
|
|
387
317
|
if (testResult.status === _status.default.FAILED) {
|
|
388
318
|
if (testResult.failure) {
|
|
389
319
|
return testResult.failure;
|
|
390
320
|
}
|
|
391
|
-
|
|
392
321
|
for (let suiteResult of testResult.suites) {
|
|
393
322
|
if (suiteResult.status !== _status.default.FAILED) {
|
|
394
323
|
continue;
|
|
395
324
|
}
|
|
396
|
-
|
|
397
325
|
if (suiteResult.failure) {
|
|
398
326
|
return suiteResult.failure;
|
|
399
327
|
}
|
|
400
|
-
|
|
401
328
|
for (let caseResult of suiteResult.cases) {
|
|
402
329
|
if (suiteResult.status !== _status.default.FAILED) {
|
|
403
330
|
continue;
|
|
404
331
|
}
|
|
405
|
-
|
|
406
332
|
if (caseResult.failure) {
|
|
407
333
|
return caseResult.failure;
|
|
408
334
|
}
|
|
409
|
-
|
|
410
335
|
for (let stepResult of caseResult.steps) {
|
|
411
336
|
if (stepResult.status !== _status.default.FAILED) {
|
|
412
337
|
continue;
|
|
413
338
|
}
|
|
414
|
-
|
|
415
339
|
return stepResult.failure || null;
|
|
416
340
|
}
|
|
417
341
|
}
|
|
418
342
|
}
|
|
419
343
|
}
|
|
420
|
-
|
|
421
344
|
return null;
|
|
422
345
|
}
|
|
423
|
-
|
|
424
346
|
groupResults() {
|
|
425
347
|
const groupedResults = {};
|
|
426
348
|
const ungroupedResults = [];
|
|
427
|
-
|
|
428
349
|
if (!Array.isArray(this.results) || this.results.length == 0) {
|
|
429
350
|
return false;
|
|
430
351
|
}
|
|
431
|
-
|
|
432
352
|
for (let result of this.results) {
|
|
433
353
|
if (!result.options._groupResult || !result.options._groupResult.resultKey) {
|
|
434
354
|
ungroupedResults.push(result);
|
|
435
355
|
continue;
|
|
436
356
|
}
|
|
437
|
-
|
|
438
357
|
const resultKey = result.options._groupResult.resultKey;
|
|
439
358
|
const suiteKey = result.options._groupResult.suiteKey;
|
|
440
359
|
let groupedResult = groupedResults[resultKey];
|
|
441
|
-
|
|
442
360
|
if (!groupedResult) {
|
|
443
|
-
groupedResult = groupedResults[resultKey] = {
|
|
361
|
+
groupedResult = groupedResults[resultKey] = {
|
|
362
|
+
...result,
|
|
444
363
|
suites: []
|
|
445
364
|
};
|
|
446
|
-
|
|
447
365
|
if (suiteKey) {
|
|
448
366
|
groupedResult['_suitesHash'] = {};
|
|
449
367
|
}
|
|
@@ -452,23 +370,21 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
452
370
|
groupedResult.endTime = Math.max(groupedResult.endTime, result.endTime);
|
|
453
371
|
groupedResult.duration = groupedResult.endTime - groupedResult.startTime;
|
|
454
372
|
}
|
|
455
|
-
|
|
456
373
|
if (!suiteKey) {
|
|
457
374
|
groupedResult.suites = [...groupedResult.suites, ...result.suites];
|
|
458
375
|
} else {
|
|
459
376
|
for (const currentSuiteResult of result.suites) {
|
|
460
377
|
const groupKey = `${suiteKey}-${currentSuiteResult.iterationNum}`;
|
|
461
378
|
const groupedSuiteResult = groupedResult._suitesHash[groupKey];
|
|
462
|
-
|
|
463
379
|
if (!groupedSuiteResult) {
|
|
464
|
-
groupedResult._suitesHash[groupKey] = {
|
|
380
|
+
groupedResult._suitesHash[groupKey] = {
|
|
381
|
+
...currentSuiteResult
|
|
465
382
|
};
|
|
466
383
|
} else {
|
|
467
384
|
groupedSuiteResult.startTime = Math.min(groupedSuiteResult.startTime, currentSuiteResult.startTime);
|
|
468
385
|
groupedSuiteResult.endTime = Math.max(groupedSuiteResult.endTime, currentSuiteResult.endTime);
|
|
469
386
|
groupedSuiteResult.duration = groupedSuiteResult.endTime - groupedSuiteResult.startTime;
|
|
470
387
|
groupedSuiteResult.cases = [...groupedSuiteResult.cases, ...currentSuiteResult.cases];
|
|
471
|
-
|
|
472
388
|
if (currentSuiteResult.cases.some(c => c.status === _status.default.FAILED)) {
|
|
473
389
|
groupedSuiteResult.status = _status.default.FAILED;
|
|
474
390
|
} else if (currentSuiteResult.cases.some(c => c.status === _status.default.WARNING)) {
|
|
@@ -478,29 +394,23 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
478
394
|
}
|
|
479
395
|
}
|
|
480
396
|
}
|
|
481
|
-
|
|
482
397
|
const groupedResultsList = Object.keys(groupedResults).map(groupKey => {
|
|
483
398
|
const groupedResult = groupedResults[groupKey];
|
|
484
|
-
|
|
485
399
|
if (!groupedResult._suitesHash) {
|
|
486
400
|
return groupedResult;
|
|
487
401
|
}
|
|
488
|
-
|
|
489
402
|
groupedResult.suites = [...groupedResult.suites, ...Object.keys(groupedResult._suitesHash).map(suiteGroupKey => groupedResult._suitesHash[suiteGroupKey])];
|
|
490
403
|
const firstFailedSuite = groupedResult.suites.find(s => s.status === _status.default.FAILED);
|
|
491
|
-
|
|
492
404
|
if (firstFailedSuite) {
|
|
493
405
|
groupedResult.status = _status.default.FAILED;
|
|
494
406
|
groupedResult.failure = firstFailedSuite.failure || groupedResult.failure;
|
|
495
407
|
} else {
|
|
496
408
|
const firstSuiteWithWarning = groupedResult.suites.find(s => s.status === _status.default.WARNING);
|
|
497
|
-
|
|
498
409
|
if (firstSuiteWithWarning) {
|
|
499
410
|
groupedResult.status = _status.default.WARNING;
|
|
500
411
|
groupedResult.failure = firstSuiteWithWarning.failure || groupedResult.failure;
|
|
501
412
|
}
|
|
502
413
|
}
|
|
503
|
-
|
|
504
414
|
delete groupedResult['_suitesHash'];
|
|
505
415
|
return groupedResult;
|
|
506
416
|
});
|
|
@@ -509,23 +419,19 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
509
419
|
this.validateResult(results);
|
|
510
420
|
return results;
|
|
511
421
|
}
|
|
512
|
-
|
|
513
422
|
recalculateResultForStatus(results) {
|
|
514
423
|
return results.map(result => {
|
|
515
424
|
if (result && result.suites && Array.isArray(result.suites) && result.suites.length > 0) {
|
|
516
425
|
const failed = result.suites.find(suite => suite.status === _status.default.FAILED);
|
|
517
|
-
|
|
518
426
|
if (failed) {
|
|
519
427
|
result.status = _status.default.FAILED;
|
|
520
428
|
} else if (result.suites.find(suite => suite.status === _status.default.WARNING)) {
|
|
521
429
|
result.status = _status.default.WARNING;
|
|
522
430
|
}
|
|
523
431
|
}
|
|
524
|
-
|
|
525
432
|
return result;
|
|
526
433
|
});
|
|
527
434
|
}
|
|
528
|
-
|
|
529
435
|
validateResult(results) {
|
|
530
436
|
const uniqueSuitesIterationIds = [];
|
|
531
437
|
results.map(result => {
|
|
@@ -538,12 +444,10 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
538
444
|
});
|
|
539
445
|
});
|
|
540
446
|
}
|
|
541
|
-
|
|
542
447
|
async _invokeReportersHook(hookName, eventArgs) {
|
|
543
448
|
if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
|
|
544
449
|
return false;
|
|
545
450
|
}
|
|
546
|
-
|
|
547
451
|
for (let reporter of this.reporters) {
|
|
548
452
|
if (reporter[hookName]) {
|
|
549
453
|
try {
|
|
@@ -554,24 +458,18 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
554
458
|
}
|
|
555
459
|
}
|
|
556
460
|
}
|
|
557
|
-
|
|
558
461
|
async _saveTestCaseVideoAttachment(caseResult) {
|
|
559
462
|
if (!caseResult || !caseResult.attachments || !caseResult.attachments.length) {
|
|
560
463
|
return;
|
|
561
464
|
}
|
|
562
|
-
|
|
563
465
|
const attachmentsToRemove = [];
|
|
564
|
-
|
|
565
466
|
for (let i = 0; i < caseResult.attachments.length; i++) {
|
|
566
467
|
const attachment = caseResult.attachments[i];
|
|
567
|
-
|
|
568
468
|
if (!attachment._url) {
|
|
569
469
|
continue;
|
|
570
470
|
}
|
|
571
|
-
|
|
572
471
|
try {
|
|
573
472
|
const videoFilePath = await _util.default.downloadVideo(attachment.fileName, attachment._url, this.options);
|
|
574
|
-
|
|
575
473
|
if (!videoFilePath) {
|
|
576
474
|
attachmentsToRemove.push(attachment);
|
|
577
475
|
} else {
|
|
@@ -583,17 +481,13 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
583
481
|
attachmentsToRemove.push(attachment);
|
|
584
482
|
}
|
|
585
483
|
}
|
|
586
|
-
|
|
587
484
|
for (let i = 0; i < attachmentsToRemove.length; i++) {
|
|
588
485
|
const elmIndexToRemove = caseResult.attachments.indexOf(attachmentsToRemove[i]);
|
|
589
|
-
|
|
590
486
|
if (!elmIndexToRemove > -1) {
|
|
591
487
|
caseResult.attachments.splice(elmIndexToRemove, 1);
|
|
592
488
|
}
|
|
593
489
|
}
|
|
594
490
|
}
|
|
595
|
-
|
|
596
491
|
}
|
|
597
|
-
|
|
598
492
|
exports.default = ReportAggregator;
|
|
599
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsInJwIiwiUmVwb3J0UG9ydGFsUmVwb3J0ZXIiLCJERUZBVUxUX1RFU1RfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVJTIiwiUmVwb3J0QWdncmVnYXRvciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInJlc3VsdHMiLCJydW5uZXJFbmRQcm9taXNlcyIsImdldEV4aXRDb2RlIiwiZXhpdENvZGUiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ0ZXN0RmFpbGRlZCIsImZpbmQiLCJpdGVtIiwic3RhdHVzIiwiaW5pdCIsInJlcG9ydGVycyIsImdlbmVyYWxSZXBvcnRpbmdPcHRzIiwicmVwb3J0aW5nIiwicmVwb3J0ZXIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJyZXBvcnRlck5hbWUiLCJuYW1lIiwicmVwb3J0ZXJPcHRzIiwidW5kZWZpbmVkIiwiZW5hYmxlZCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJtZXNzYWdlIiwicHVzaCIsImdldFJlc3VsdHMiLCJnZW5lcmF0ZVJlcG9ydHMiLCJncm91cGVkUmVzdWx0cyIsImdyb3VwUmVzdWx0cyIsInJlcG9ydFBhdGgiLCJnZW5lcmF0ZSIsImUiLCJlcnJvciIsIndhaXRGb3JSZXN1bHQiLCJyaWQiLCJ3YWl0Rm9yUmVzdWx0cyIsIlByb21pc2UiLCJhbGwiLCJvbkxhdW5jaFN0YXJ0IiwiZXZlbnRBcmdzIiwiX2ludm9rZVJlcG9ydGVyc0hvb2siLCJvbkxhdW5jaEVuZCIsImVtaXQiLCJvblJ1bm5lclN0YXJ0Iiwib3B0cyIsImNhcHMiLCJFcnJvciIsInRlc3RSZXN1bHQiLCJUZXN0UmVzdWx0Iiwic3RhcnRUaW1lIiwib3h1dGlsIiwiZ2V0VGltZVN0YW1wIiwiY2FwYWJpbGl0aWVzIiwiZW52aXJvbm1lbnQiLCJlbnZWYXJzIiwib25SdW5uZXJFbmQiLCJmaW5hbFJlc3VsdCIsImZhdGFsRXJyb3IiLCJ4IiwiZW5kVGltZSIsImR1cmF0aW9uIiwiX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyIsIlN0YXR1cyIsIkZBSUxFRCIsImZhaWx1cmUiLCJlcnJvckhlbHBlciIsImdldEZhaWx1cmVGcm9tRXJyb3IiLCJfZ2V0Rmlyc3RGYWlsdXJlIiwidHlwZSIsImxvY2F0aW9uIiwidG9VcHBlckNhc2UiLCJyZXN1bHQiLCJwcm9jZXNzIiwibmV4dFRpY2siLCJyZXNvbHZlIiwiaGFzRmFpbGVkU3VpdGVzIiwic3VpdGVzIiwic29tZSIsImhhc1dhcm5pbmdTdWl0ZXMiLCJXQVJOSU5HIiwiYWxsU3VpdGVzU2tpcHBlZCIsImV2ZXJ5IiwiU0tJUFBFRCIsIlBBU1NFRCIsIm9uSXRlcmF0aW9uU3RhcnQiLCJpdGVyYXRpb24iLCJzdGFydCIsIm1zZyIsIm9uTG9nRW50cnkiLCJvbkl0ZXJhdGlvbkVuZCIsIml0ZXJhdGlvbk51bSIsIm9uU3VpdGVTdGFydCIsInN1aXRlSWQiLCJzdWl0ZSIsIm9uU3VpdGVFbmQiLCJzdWl0ZVJlc3VsdCIsIm9uQ2FzZVN0YXJ0Iiwic3VpdGVSZWZJZCIsImNhc2VJZCIsImNhc2VEZWYiLCJjYXNlIiwib25DYXNlRW5kIiwiY2FzZVJlc3VsdCIsIl9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQiLCJvblN0ZXBTdGFydCIsInN0ZXAiLCJyb290UGF0aCIsImZyYW1ld29yayIsImZ1bGxQYXRoIiwicGF0aCIsIm9uU3RlcEVuZCIsInN0ZXBSZXN1bHQiLCJ0aW1lIiwibGV2ZWwiLCJzcmMiLCJzdGVwSWQiLCJEYXRlIiwibm93IiwiY2FzZXMiLCJzdGVwcyIsInVuZ3JvdXBlZFJlc3VsdHMiLCJfZ3JvdXBSZXN1bHQiLCJyZXN1bHRLZXkiLCJzdWl0ZUtleSIsImdyb3VwZWRSZXN1bHQiLCJNYXRoIiwibWluIiwibWF4IiwiY3VycmVudFN1aXRlUmVzdWx0IiwiZ3JvdXBLZXkiLCJncm91cGVkU3VpdGVSZXN1bHQiLCJfc3VpdGVzSGFzaCIsImMiLCJncm91cGVkUmVzdWx0c0xpc3QiLCJrZXlzIiwibWFwIiwic3VpdGVHcm91cEtleSIsImZpcnN0RmFpbGVkU3VpdGUiLCJzIiwiZmlyc3RTdWl0ZVdpdGhXYXJuaW5nIiwicmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMiLCJ2YWxpZGF0ZVJlc3VsdCIsImZhaWxlZCIsInVuaXF1ZVN1aXRlc0l0ZXJhdGlvbklkcyIsImluY2x1ZGVzIiwid2FybiIsImhvb2tOYW1lIiwiYXR0YWNobWVudHMiLCJhdHRhY2htZW50c1RvUmVtb3ZlIiwiaSIsImF0dGFjaG1lbnQiLCJfdXJsIiwidmlkZW9GaWxlUGF0aCIsImRvd25sb2FkVmlkZW8iLCJmaWxlTmFtZSIsImZpbGVQYXRoIiwiZWxtSW5kZXhUb1JlbW92ZSIsImluZGV4T2YiLCJzcGxpY2UiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVlBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0FBRUEsTUFBTUEsU0FBUyxHQUFHO0FBQ2RDLEVBQUFBLElBQUksRUFBRUMscUJBRFE7QUFFZEMsRUFBQUEsS0FBSyxFQUFFQyxzQkFGTztBQUdkQyxFQUFBQSxJQUFJLEVBQUVDLHFCQUhRO0FBSWRDLEVBQUFBLEtBQUssRUFBRUMsc0JBSk87QUFLZEMsRUFBQUEsR0FBRyxFQUFFQyxvQkFMUztBQU1kQyxFQUFBQSxHQUFHLEVBQUVDLG9CQU5TO0FBT2RDLEVBQUFBLEVBQUUsRUFBRUM7QUFQVSxDQUFsQjtBQVVBLE1BQU1DLGlCQUFpQixHQUFHLGFBQTFCO0FBQ0EsTUFB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QjtBQUNBLGlCQUFPRixVQUFVLENBQUMsTUFBRCxDQUFqQjtBQUNIO0FBQ0osT0FWRCxDQVdBLE9BQU92SCxDQUFQLEVBQVU7QUFDTlYsUUFBQUEsT0FBTyxDQUFDNEgsSUFBUixDQUFhLGlDQUFiLEVBQWdEbEgsQ0FBQyxDQUFDUixPQUFsRDtBQUNBNkgsUUFBQUEsbUJBQW1CLENBQUM1SCxJQUFwQixDQUF5QjhILFVBQXpCO0FBQ0g7QUFDSjs7QUFFRCxTQUFLLElBQUlELENBQUMsR0FBQyxDQUFYLEVBQWNBLENBQUMsR0FBRUQsbUJBQW1CLENBQUNuSixNQUFyQyxFQUE2Q29KLENBQUMsRUFBOUMsRUFBa0Q7QUFDOUMsWUFBTU8sZ0JBQWdCLEdBQUd0RCxVQUFVLENBQUM2QyxXQUFYLENBQXVCVSxPQUF2QixDQUErQlQsbUJBQW1CLENBQUNDLENBQUQsQ0FBbEQsQ0FBekI7O0FBQ0EsVUFBSSxDQUFDTyxnQkFBRCxHQUFvQixDQUFDLENBQXpCLEVBQTRCO0FBQ3hCdEQsUUFBQUEsVUFBVSxDQUFDNkMsV0FBWCxDQUF1QlcsTUFBdkIsQ0FBOEJGLGdCQUE5QixFQUFnRCxDQUFoRDtBQUNIO0FBQ0o7QUFDSjs7QUF4aEJzRCIsInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IFJlcG9ydFBvcnRhbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1ycCc7XHJcbmltcG9ydCBlcnJvckhlbHBlciBmcm9tICcuLi9lcnJvcnMvaGVscGVyJztcclxuaW1wb3J0IFN0YXR1cyBmcm9tICcuLi9tb2RlbC9zdGF0dXMnO1xyXG5cclxuY29uc3QgUmVwb3J0ZXJzID0ge1xyXG4gICAganNvbjogSnNvblJlcG9ydGVyLFxyXG4gICAganVuaXQ6IEpVbml0UmVwb3J0ZXIsXHJcbiAgICBodG1sOiBIdG1sUmVwb3J0ZXIsXHJcbiAgICBleGNlbDogRXhjZWxSZXBvcnRlcixcclxuICAgIHBkZjogUGRmUmVwb3J0ZXIsXHJcbiAgICB4bWw6IFhtbFJlcG9ydGVyLFxyXG4gICAgcnA6IFJlcG9ydFBvcnRhbFJlcG9ydGVyLFxyXG59O1xyXG5cclxuY29uc3QgREVGQVVMVF9URVNUX05BTUUgPSAnT3h5Z2VuIFRlc3QnO1xyXG5jb25zdCBERUZBVUxUX1JFUE9SVEVSUyA9IFtdO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVwb3J0QWdncmVnYXRvciBleHRlbmRzIEV2ZW50RW1pdHRlciB7XHJcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XHJcbiAgICAgICAgc3VwZXIoKTtcclxuICAgICAgICAvLyByZXN1bHRzIGhhc2ggdGFibGUgYmFzZWQgb24gcnVubmVyIGlkIGtleVxyXG4gICAgICAgIHRoaXMucmVzdWx0cyA9IFtdO1xyXG4gICAgICAgIC8vIGEgaGFzaCBsaXN0IG9mIHJ1bm5lckVuZCBldmVudCBwcm9taXNlcywga2V5ZWQgYnkgcnVubmVyIGlkXHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlcyA9IHt9O1xyXG4gICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XHJcbiAgICAgICAgLy8gdGhpcy5pbnN0YW50aWF0ZVJlcG9ydGVycygpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4aXRDb2RlKCkge1xyXG4gICAgICAgIGxldCBleGl0Q29kZSA9IDA7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RmFpbGRlZCA9IHRoaXMucmVzdWx0cy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3RGYWlsZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJyb2tlbiA/XHJcbiAgICAgICAgICAgIGV4aXRDb2RlID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICB0aGlzLnJlcG9ydGVycyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYWxSZXBvcnRpbmdPcHRzID0gdGhpcy5vcHRpb25zLnJlcG9ydGluZyB8fCB7fTtcclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiBnZW5lcmFsUmVwb3J0aW5nT3B0cy5yZXBvcnRlcnMgfHwgREVGQVVMVF9SRVBPUlRFUlMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBvcnRlciAhPT0gJ3N0cmluZycgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXBvcnRlciwgJ25hbWUnKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHJlcG9ydGVycyB0aGF0IGRvIG5vdCBoYXZlICduYW1lJyBwcm9wZXJ0eSBhcyBpdCdzIGVzc2VudGlhbCB0byBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIFJlcG9ydGVyIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJOYW1lID0gdHlwZW9mIHJlcG9ydGVyID09PSAnc3RyaW5nJyA/IHJlcG9ydGVyIDogcmVwb3J0ZXIubmFtZTtcclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJPcHRzID0gdHlwZW9mIHJlcG9ydGVyID09PSAnb2JqZWN0JyA/IHJlcG9ydGVyIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSZXBvcnRlcnMsIHJlcG9ydGVyTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHJlcG9ydGVyIFwiZW5hYmxlZFwiIHByb3BlcnR5IGlzIFwiZmFsc2VcIiB0aGVuIHNraXAgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXJPcHRzICYmIHR5cGVvZiByZXBvcnRlck9wdHMuZW5hYmxlZCA9PT0gJ2Jvb2xlYW4nICYmICFyZXBvcnRlck9wdHMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXJzW3JlcG9ydGVyTmFtZV0odGhpcy5vcHRpb25zLCByZXBvcnRlck9wdHMsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcG9ydGVyIGhhcyBcImluaXRcIiBmdW5jdGlvbiwgdXNlIGl0IHRvIGluaXRpYWxpemUgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXIuaW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyLmluaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgXCIke3JlcG9ydGVyTmFtZX1cIiByZXBvcnRlcjogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXN1bHRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2VuZXJhdGVSZXBvcnRzKCkge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgcmVwb3J0ZXIgb2YgdGhpcy5yZXBvcnRlcnMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSBhd2FpdCByZXBvcnRlci5nZW5lcmF0ZShncm91cGVkUmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0UGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBZb3VyIHJlcG9ydCBpcyByZWFkeTogJHtyZXBvcnRQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JSZXN1bHQocmlkKSB7XHJcbiAgICAgICAgaWYgKCFyaWQgfHwgIXRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yUmVzdWx0cygpIHtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlcyAmJiB0aGlzLnJ1bm5lckVuZFByb21pc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5ydW5uZXJFbmRQcm9taXNlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTGF1bmNoU3RhcnQob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25MYXVuY2hTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25MYXVuY2hFbmQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByZXN1bHRzXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xhdW5jaDplbmQnLCByZXN1bHRzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxhdW5jaEVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25SdW5uZXJTdGFydChyaWQsIG9wdHMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXJpZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmlkXCIgY2Fubm90IGJlIGVtcHR5LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnJpZCA9IHJpZDtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm5hbWUgPSBvcHRzLm5hbWUgfHwgREVGQVVMVF9URVNUX05BTUU7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBjYXBzO1xyXG4gICAgICAgIHRlc3RSZXN1bHQuZW52aXJvbm1lbnQgPSBvcHRzLmVudlZhcnMgfHwge307XHJcbiAgICAgICAgdGVzdFJlc3VsdC5vcHRpb25zID0gb3B0cztcclxuICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcHJvbWlzZSBmb3IgbGF0ZXIgdG8gYmUgcmVzb2x2ZWQgb24gcnVubmVyOmVuZCBldmVudFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIG9wdHMsXHJcbiAgICAgICAgICAgIGNhcHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblJ1bm5lclN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lckVuZChyaWQsIGZpbmFsUmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQpIHtcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmR1cmF0aW9uID0gdGVzdFJlc3VsdC5lbmRUaW1lIC0gdGVzdFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IHN0YXR1cyBiYXNlZCBvbiBzdWl0ZXMgc3RhdHVzZXNcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5zdGF0dXMgPSB0aGlzLl9kZXRlcm1pbmVUZXN0U3RhdHVzQnlTdWl0ZXModGVzdFJlc3VsdCwgZmF0YWxFcnJvcik7XHJcbiAgICAgICAgICAgIC8vIHRlc3RSZXN1bHQuc3RhdHVzID0gZmF0YWxFcnJvciA/IFN0YXR1cy5GQUlMRUQgOiAodGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlmIGZhdGFsRXJyb3IgaXMgbm90IGluaGVyaXRlZCBmcm9tIEVycm9yIGNsYXNzIHRoZW4gd2UgYWxyZWFkeSBnb3QgT3h5Z2VuIEZhaWx1cmUgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5mYWlsdXJlID0gZmF0YWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihmYXRhbEVycm9yKSA6IGZhdGFsRXJyb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSB0aGlzLl9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICYmIGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmaW5hbFJlc3VsdC5jYXBhYmlsaXRpZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlICYmIHRlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX0gYXQgJHt0ZXN0UmVzdWx0LmZhaWx1cmUubG9jYXRpb259LmApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRlc3RSZXN1bHQuZmFpbHVyZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3I6ICR7dGVzdFJlc3VsdC5mYWlsdXJlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUZXN0ICR7cmlkfSBoYXMgZmluaXNoZWQgd2l0aCBzdGF0dXM6ICR7dGVzdFJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHRlc3RSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3J1bm5lcjplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyRW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgbmV4dFRpY2soKSB3aWxsIGhlbHAgdXMgdG8gaW5zdXJlIHRoYXQgd2UgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBlbWl0KCdydW5uZXI6ZW5kJykgaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXS5yZXNvbHZlKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGZhdGFsRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN1aXRlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzV2FybmluZ1N1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpO1xyXG4gICAgICAgIGlmIChoYXNXYXJuaW5nU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuV0FSTklORztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3VpdGVzU2tpcHBlZCA9IHRlc3RSZXN1bHQuc3VpdGVzLmV2ZXJ5KHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5TS0lQUEVEKTtcclxuICAgICAgICBpZiAoYWxsU3VpdGVzU2tpcHBlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLlNLSVBQRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uSXRlcmF0aW9uU3RhcnQocmlkLCBpdGVyYXRpb24sIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKGl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtzdGFydH0gSXRlcmF0aW9uICMke2l0ZXJhdGlvbn0gc3RhcnRlZC4uLmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25FbmQocmlkLCByZXN1bHQsIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdD8uaXRlcmF0aW9uTnVtICYmIHJlc3VsdC5zdGF0dXM/LnRvVXBwZXJDYXNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7cmVzdWx0Lml0ZXJhdGlvbk51bX0gZW5kZWQgd2l0aCBzdGF0dXM6ICR7cmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uTG9nRW50cnkobnVsbCwgJ0lORk8nLCBtc2csICd1c2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVTdGFydChyaWQsIHN1aXRlSWQsIHN1aXRlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZS5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgbGV0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkOiBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZTogc3VpdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN1aXRlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQocmlkLCBzdWl0ZUlkLCBzdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSB0aGlzLnJlc3VsdHMuZmluZCh4ID0+IHgucmlkID09PSByaWQpO1xyXG4gICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRlc3RSZXN1bHQuc3VpdGVzLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWl0ZSBcIiR7c3VpdGVSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7c3VpdGVSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHN1aXRlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdWl0ZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCBjYXNlRGVmKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZURlZi5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlUmVmSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgY2FzZTogY2FzZURlZixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTpzdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVmSWQsIGNhc2VJZCwgY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAtIENhc2UgXCIke2Nhc2VSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7Y2FzZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50KGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZVJlZklkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogY2FzZVJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uQ2FzZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcC5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucm9vdFBhdGggJiYgdGhpcy5vcHRpb25zLmZyYW1ld29yayAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5yb290UGF0aCwgc3RlcC5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgIHN0ZXAubG9jYXRpb24gPSBmdWxsUGF0aCsnOjEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwRW5kKHJpZCwgc3VpdGVJZCwgY2FzZUlkLCBzdGVwUmVzdWx0KSB7XHJcbiAgICAgICAgLy9jb25zdCBzdGF0dXMgPSBzdGVwUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIC8vY29uc3QgZHVyYXRpb24gPSBzdGVwUmVzdWx0LmR1cmF0aW9uID8gKHN0ZXBSZXN1bHQuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDIpIDogMDtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcFJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCBpbiAke2R1cmF0aW9ufXMgd2l0aCBzdGF0dXM6ICR7c3RhdHVzfS5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdGVwRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkxvZ0VudHJ5KHRpbWUsIGxldmVsLCBtc2csIHNyYyA9IG51bGwsIHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQgfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXBJZCxcclxuICAgICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICAgIG1zZyxcclxuICAgICAgICAgICAgdGltZSxcclxuICAgICAgICAgICAgc3JjXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xvZycsIGV2ZW50QXJncyk7XHJcblxyXG4gICAgICAgIGlmICghdGltZSkge1xyXG4gICAgICAgICAgICBldmVudEFyZ3MudGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxvZycsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmYWlsdXJlIG9iamVjdCBpbiBvbmUgb2YgdGVzdCByZXN1bHQncyBlbnRpdGllcy4gXHJcbiAgICAgKiBAcGFyYW0ge1Rlc3RSZXN1bHR9IHRlc3RSZXN1bHQgXHJcbiAgICAgKi9cclxuICAgIF9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCkge1xyXG4gICAgICAgIGlmICh0ZXN0UmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHN1aXRlUmVzdWx0IG9mIHRlc3RSZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZVJlc3VsdCBvZiBzdWl0ZVJlc3VsdC5jYXNlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3RlcFJlc3VsdCBvZiBjYXNlUmVzdWx0LnN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZXN1bHQuZmFpbHVyZSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBncm91cFJlc3VsdHMoKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHMgPSB7fTtcclxuICAgICAgICBjb25zdCB1bmdyb3VwZWRSZXN1bHRzID0gW107XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVzdWx0cykgfHwgdGhpcy5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHRoaXMucmVzdWx0cykge1xyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdCB8fCAhcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnJlc3VsdEtleSkge1xyXG4gICAgICAgICAgICAgICAgdW5ncm91cGVkUmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRLZXkgPSByZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5O1xyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZUtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5zdWl0ZUtleTtcclxuICAgICAgICAgICAgbGV0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldO1xyXG4gICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUsIHJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFJlc3VsdC5lbmRUaW1lLCByZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgZ3JvdXBpbmcgaXMgYnkgcmVzdWx0IG9ubHksIHRoZW4ganVzdCBhcHBlbmQgY3VycmVudCByZXN1bHQncyBzdWl0ZXMgdG8gdGhlIGdyb3VwJ3Mgc3VpdGVzXHJcbiAgICAgICAgICAgIGlmICghc3VpdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdC5zdWl0ZXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRTdWl0ZVJlc3VsdCBvZiByZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBLZXkgPSBgJHtzdWl0ZUtleX0tJHtjdXJyZW50U3VpdGVSZXN1bHQuaXRlcmF0aW9uTnVtfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFN1aXRlUmVzdWx0ID0gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cGVkU3VpdGVSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV0gPSB7IC4uLmN1cnJlbnRTdWl0ZVJlc3VsdCB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSA9IE1hdGgubWluKGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGFydFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuZW5kVGltZSA9IE1hdGgubWF4KGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lLCBjdXJyZW50U3VpdGVSZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29udmVydCBncm91cGVkIHJlc3VsdHMgaGFzaCB0byBhbiBhcnJheVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHRzTGlzdCA9IE9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHRzKS5tYXAoXHJcbiAgICAgICAgICAgIGdyb3VwS2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpLm1hcChzdWl0ZUdyb3VwS2V5ID0+IGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2hbc3VpdGVHcm91cEtleV0pXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RGYWlsZWRTdWl0ZSA9IGdyb3VwZWRSZXN1bHQuc3VpdGVzLmZpbmQocyA9PiBzLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RGYWlsZWRTdWl0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdEZhaWxlZFN1aXRlLmZhaWx1cmUgfHwgZ3JvdXBlZFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTdWl0ZVdpdGhXYXJuaW5nID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0U3VpdGVXaXRoV2FybmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdFN1aXRlV2l0aFdhcm5pbmcuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbLi4uZ3JvdXBlZFJlc3VsdHNMaXN0LCAuLi51bmdyb3VwZWRSZXN1bHRzXTtcclxuICAgICAgICAvLyBjaGFuZ2UgcmVzdWx0cyBzdGF0dXMgdG8gZmFpZGVkIGlmIGZhaWxlZCBzdWl0ZXMgYXJlIGZpbmRlZFxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0LnN1aXRlcykgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3VpdGVzLmZpbmQoKHN1aXRlKSA9PiBzdWl0ZS5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVJlc3VsdChyZXN1bHRzKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzID0gW107XHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2ludm9rZVJlcG9ydGVyc0hvb2soaG9va05hbWUsIGV2ZW50QXJncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0ZXJbaG9va05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyW2hvb2tOYW1lXShldmVudEFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBpbnZva2UgcmVwb3J0ZXIgaG9vayBcIiR7aG9va05hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGlmICghY2FzZVJlc3VsdCB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cyB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50c1RvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuX3VybCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRmlsZVBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG94dXRpbC5kb3dubG9hZFZpZGVvKGF0dGFjaG1lbnQuZmlsZU5hbWUsIGF0dGFjaG1lbnQuX3VybCwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmlkZW9GaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZVBhdGggPSB2aWRlb0ZpbGVQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRhY2htZW50WydfdXJsJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGRvd25sb2FkIHZpZGVvIGZpbGU6ICcsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c1RvUmVtb3ZlLnB1c2goYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHZpZGVvIGF0dGFjaG1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZG93bmxvYWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTwgYXR0YWNobWVudHNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbG1JbmRleFRvUmVtb3ZlID0gY2FzZVJlc3VsdC5hdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnRzVG9SZW1vdmVbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIWVsbUluZGV4VG9SZW1vdmUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cy5zcGxpY2UoZWxtSW5kZXhUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
493
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfZXZlbnRzIiwicmVxdWlyZSIsIl9wYXRoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl90ZXN0UmVzdWx0IiwiX3V0aWwiLCJfd2hlbiIsIl9yZXBvcnRlckpzb24iLCJfcmVwb3J0ZXJKdW5pdCIsIl9yZXBvcnRlckh0bWwiLCJfcmVwb3J0ZXJFeGNlbCIsIl9yZXBvcnRlclBkZiIsIl9yZXBvcnRlclhtbCIsIl9oZWxwZXIiLCJfc3RhdHVzIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJ0IiwiV2Vha01hcCIsInIiLCJuIiwibyIsImkiLCJmIiwiX19wcm90b19fIiwiaGFzIiwiZ2V0Iiwic2V0IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJSZXBvcnRlcnMiLCJqc29uIiwiSnNvblJlcG9ydGVyIiwianVuaXQiLCJKVW5pdFJlcG9ydGVyIiwiaHRtbCIsIkh0bWxSZXBvcnRlciIsImV4Y2VsIiwiRXhjZWxSZXBvcnRlciIsInBkZiIsIlBkZlJlcG9ydGVyIiwieG1sIiwiWG1sUmVwb3J0ZXIiLCJERUZBVUxUX1RFU1RfTkFNRSIsIkRFRkFVTFRfUkVQT1JURVJTIiwiUmVwb3J0QWdncmVnYXRvciIsIkV2ZW50RW1pdHRlciIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInJlc3VsdHMiLCJydW5uZXJFbmRQcm9taXNlcyIsImdldEV4aXRDb2RlIiwiZXhpdENvZGUiLCJBcnJheSIsImlzQXJyYXkiLCJsZW5ndGgiLCJ0ZXN0RmFpbGRlZCIsImZpbmQiLCJpdGVtIiwic3RhdHVzIiwiaW5pdCIsIl9veGlkZSIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwiUHJvbWlzZSIsInJlc29sdmUiLCJ0aGVuIiwicnAiLCJyZXBvcnRlcnMiLCJnZW5lcmFsUmVwb3J0aW5nT3B0cyIsInJlcG9ydGluZyIsInJlcG9ydGVyIiwicHJvdG90eXBlIiwicmVwb3J0ZXJOYW1lIiwibmFtZSIsInJlcG9ydGVyT3B0cyIsInVuZGVmaW5lZCIsImVuYWJsZWQiLCJlcnIiLCJjb25zb2xlIiwibG9nIiwibWVzc2FnZSIsInB1c2giLCJnZXRSZXN1bHRzIiwiZ2VuZXJhdGVSZXBvcnRzIiwiZ3JvdXBlZFJlc3VsdHMiLCJncm91cFJlc3VsdHMiLCJyZXBvcnRQYXRoIiwiZ2VuZXJhdGUiLCJlcnJvciIsIndhaXRGb3JSZXN1bHQiLCJyaWQiLCJ3YWl0Rm9yUmVzdWx0cyIsImFsbCIsIm9uTGF1bmNoU3RhcnQiLCJldmVudEFyZ3MiLCJfaW52b2tlUmVwb3J0ZXJzSG9vayIsIm9uTGF1bmNoRW5kIiwiZW1pdCIsIm9uUnVubmVyU3RhcnQiLCJvcHRzIiwiY2FwcyIsIkVycm9yIiwidGVzdFJlc3VsdCIsIlRlc3RSZXN1bHQiLCJzdGFydFRpbWUiLCJveHV0aWwiLCJnZXRUaW1lU3RhbXAiLCJjYXBhYmlsaXRpZXMiLCJlbnZpcm9ubWVudCIsImVudlZhcnMiLCJkZWZlciIsIm9uUnVubmVyRW5kIiwiZmluYWxSZXN1bHQiLCJmYXRhbEVycm9yIiwieCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsIl9kZXRlcm1pbmVUZXN0U3RhdHVzQnlTdWl0ZXMiLCJTdGF0dXMiLCJGQUlMRUQiLCJmYWlsdXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX2dldEZpcnN0RmFpbHVyZSIsInR5cGUiLCJsb2NhdGlvbiIsInRvVXBwZXJDYXNlIiwicmVzdWx0IiwicHJvY2VzcyIsIm5leHRUaWNrIiwiaGFzRmFpbGVkU3VpdGVzIiwic3VpdGVzIiwic29tZSIsImhhc1dhcm5pbmdTdWl0ZXMiLCJXQVJOSU5HIiwiYWxsU3VpdGVzU2tpcHBlZCIsImV2ZXJ5IiwiU0tJUFBFRCIsIlBBU1NFRCIsIm9uSXRlcmF0aW9uU3RhcnQiLCJpdGVyYXRpb24iLCJzdGFydCIsIm1zZyIsIm9uTG9nRW50cnkiLCJvbkl0ZXJhdGlvbkVuZCIsIl9yZXN1bHQkc3RhdHVzIiwiaXRlcmF0aW9uTnVtIiwib25TdWl0ZVN0YXJ0Iiwic3VpdGVJZCIsInN1aXRlIiwib25TdWl0ZUVuZCIsInN1aXRlUmVzdWx0Iiwib25DYXNlU3RhcnQiLCJzdWl0ZVJlZklkIiwiY2FzZUlkIiwiY2FzZURlZiIsImNhc2UiLCJvbkNhc2VFbmQiLCJjYXNlUmVzdWx0IiwiX3NhdmVUZXN0Q2FzZVZpZGVvQXR0YWNobWVudCIsIm9uU3RlcFN0YXJ0Iiwic3RlcCIsInJvb3RQYXRoIiwiZnJhbWV3b3JrIiwiZnVsbFBhdGgiLCJwYXRoIiwib25TdGVwRW5kIiwic3RlcFJlc3VsdCIsInRpbWUiLCJsZXZlbCIsInNyYyIsInN0ZXBJZCIsIkRhdGUiLCJub3ciLCJjYXNlcyIsInN0ZXBzIiwidW5ncm91cGVkUmVzdWx0cyIsIl9ncm91cFJlc3VsdCIsInJlc3VsdEtleSIsInN1aXRlS2V5IiwiZ3JvdXBlZFJlc3VsdCIsIk1hdGgiLCJtaW4iLCJtYXgiLCJjdXJyZW50U3VpdGVSZXN1bHQiLCJncm91cEtleSIsImdyb3VwZWRTdWl0ZVJlc3VsdCIsIl9zdWl0ZXNIYXNoIiwiYyIsImdyb3VwZWRSZXN1bHRzTGlzdCIsImtleXMiLCJtYXAiLCJzdWl0ZUdyb3VwS2V5IiwiZmlyc3RGYWlsZWRTdWl0ZSIsInMiLCJmaXJzdFN1aXRlV2l0aFdhcm5pbmciLCJyZWNhbGN1bGF0ZVJlc3VsdEZvclN0YXR1cyIsInZhbGlkYXRlUmVzdWx0IiwiZmFpbGVkIiwidW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzIiwiaW5jbHVkZXMiLCJ3YXJuIiwiaG9va05hbWUiLCJhdHRhY2htZW50cyIsImF0dGFjaG1lbnRzVG9SZW1vdmUiLCJhdHRhY2htZW50IiwiX3VybCIsInZpZGVvRmlsZVBhdGgiLCJkb3dubG9hZFZpZGVvIiwiZmlsZU5hbWUiLCJmaWxlUGF0aCIsImVsbUluZGV4VG9SZW1vdmUiLCJpbmRleE9mIiwic3BsaWNlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXHJcbiAqIENvcHlyaWdodCAoQykgMjAxNS1wcmVzZW50IENsb3VkQmVhdCBMaW1pdGVkXHJcbiAqXHJcbiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5XHJcbiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5XHJcbiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yXHJcbiAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uXHJcbiAqL1xyXG5cclxuLypcclxuICogUmVwb3J0IGFnZ3JlZ2F0b3JcclxuICovXHJcbmltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ2V2ZW50cyc7XHJcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgVGVzdFJlc3VsdCBmcm9tICcuLi9tb2RlbC90ZXN0LXJlc3VsdCc7XHJcbmltcG9ydCBveHV0aWwgZnJvbSAnLi4vbGliL3V0aWwnO1xyXG5pbXBvcnQgeyBkZWZlciB9IGZyb20gJ3doZW4nO1xyXG5cclxuLy8gaW1wb3J0IGFsbCBidWlsdC1pbiByZXBvcnRlcnNcclxuaW1wb3J0IEpzb25SZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItanNvbic7XHJcbmltcG9ydCBKVW5pdFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qdW5pdCc7XHJcbmltcG9ydCBIdG1sUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWh0bWwnO1xyXG5pbXBvcnQgRXhjZWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItZXhjZWwnO1xyXG5pbXBvcnQgUGRmUmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXBkZic7XHJcbmltcG9ydCBYbWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXIteG1sJztcclxuaW1wb3J0IGVycm9ySGVscGVyIGZyb20gJy4uL2Vycm9ycy9oZWxwZXInO1xyXG5pbXBvcnQgU3RhdHVzIGZyb20gJy4uL21vZGVsL3N0YXR1cyc7XHJcblxyXG5jb25zdCBSZXBvcnRlcnMgPSB7XHJcbiAgICBqc29uOiBKc29uUmVwb3J0ZXIsXHJcbiAgICBqdW5pdDogSlVuaXRSZXBvcnRlcixcclxuICAgIGh0bWw6IEh0bWxSZXBvcnRlcixcclxuICAgIGV4Y2VsOiBFeGNlbFJlcG9ydGVyLFxyXG4gICAgcGRmOiBQZGZSZXBvcnRlcixcclxuICAgIHhtbDogWG1sUmVwb3J0ZXIsXHJcbn07XHJcblxyXG5jb25zdCBERUZBVUxUX1RFU1RfTkFNRSA9ICdPeHlnZW4gVGVzdCc7XHJcbmNvbnN0IERFRkFVTFRfUkVQT1JURVJTID0gW107XHJcblxyXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBvcnRBZ2dyZWdhdG9yIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIC8vIHJlc3VsdHMgaGFzaCB0YWJsZSBiYXNlZCBvbiBydW5uZXIgaWQga2V5XHJcbiAgICAgICAgdGhpcy5yZXN1bHRzID0gW107XHJcbiAgICAgICAgLy8gYSBoYXNoIGxpc3Qgb2YgcnVubmVyRW5kIGV2ZW50IHByb21pc2VzLCBrZXllZCBieSBydW5uZXIgaWRcclxuICAgICAgICB0aGlzLnJ1bm5lckVuZFByb21pc2VzID0ge307XHJcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXRFeGl0Q29kZSgpIHtcclxuICAgICAgICBsZXQgZXhpdENvZGUgPSAwO1xyXG5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMucmVzdWx0cyAmJlxyXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMucmVzdWx0cykgJiZcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzLmxlbmd0aCA+IDBcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgY29uc3QgdGVzdEZhaWxkZWQgPSB0aGlzLnJlc3VsdHMuZmluZCgoaXRlbSkgPT4gaXRlbS5zdGF0dXMgPT09ICdmYWlsZWQnKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0ZXN0RmFpbGRlZCkge1xyXG4gICAgICAgICAgICAgICAgZXhpdENvZGUgPSAtMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIHNvbWV0aGluZyBicm9rZW4gP1xyXG4gICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGV4aXRDb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGluaXQoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuX294aWRlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHsgZGVmYXVsdDogUmVwb3J0UG9ydGFsUmVwb3J0ZXIgfSA9IGF3YWl0IGltcG9ydCgnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLXJwJyk7XHJcbiAgICAgICAgICAgIFJlcG9ydGVycy5ycCA9IFJlcG9ydFBvcnRhbFJlcG9ydGVyO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnJlcG9ydGVycyA9IFtdO1xyXG4gICAgICAgIGNvbnN0IGdlbmVyYWxSZXBvcnRpbmdPcHRzID0gdGhpcy5vcHRpb25zLnJlcG9ydGluZyB8fCB7fTtcclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiBnZW5lcmFsUmVwb3J0aW5nT3B0cy5yZXBvcnRlcnMgfHwgREVGQVVMVF9SRVBPUlRFUlMpIHtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXBvcnRlciAhPT0gJ3N0cmluZycgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChyZXBvcnRlciwgJ25hbWUnKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIHJlcG9ydGVycyB0aGF0IGRvIG5vdCBoYXZlICduYW1lJyBwcm9wZXJ0eSBhcyBpdCdzIGVzc2VudGlhbCB0byBsb2FkIHRoZSBjb3JyZXNwb25kaW5nIFJlcG9ydGVyIGNsYXNzXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJOYW1lID0gdHlwZW9mIHJlcG9ydGVyID09PSAnc3RyaW5nJyA/IHJlcG9ydGVyIDogcmVwb3J0ZXIubmFtZTtcclxuICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXJPcHRzID0gdHlwZW9mIHJlcG9ydGVyID09PSAnb2JqZWN0JyA/IHJlcG9ydGVyIDogdW5kZWZpbmVkO1xyXG5cclxuICAgICAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChSZXBvcnRlcnMsIHJlcG9ydGVyTmFtZSkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHJlcG9ydGVyIFwiZW5hYmxlZFwiIHByb3BlcnR5IGlzIFwiZmFsc2VcIiB0aGVuIHNraXAgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXJPcHRzICYmIHR5cGVvZiByZXBvcnRlck9wdHMuZW5hYmxlZCA9PT0gJ2Jvb2xlYW4nICYmICFyZXBvcnRlck9wdHMuZW5hYmxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgUmVwb3J0ZXJzW3JlcG9ydGVyTmFtZV0odGhpcy5vcHRpb25zLCByZXBvcnRlck9wdHMsIHRoaXMpO1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcG9ydGVyIGhhcyBcImluaXRcIiBmdW5jdGlvbiwgdXNlIGl0IHRvIGluaXRpYWxpemUgdGhlIHJlcG9ydGVyXHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0ZXIuaW5pdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyLmluaXQoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIGluaXRpYWxpemUgXCIke3JlcG9ydGVyTmFtZX1cIiByZXBvcnRlcjogJHtlcnIubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlcG9ydGVycy5wdXNoKHJlcG9ydGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRSZXN1bHRzKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZ2VuZXJhdGVSZXBvcnRzKCkge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgZm9yIChsZXQgcmVwb3J0ZXIgb2YgdGhpcy5yZXBvcnRlcnMpIHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcG9ydFBhdGggPSBhd2FpdCByZXBvcnRlci5nZW5lcmF0ZShncm91cGVkUmVzdWx0cyk7XHJcbiAgICAgICAgICAgICAgICBpZiAocmVwb3J0UGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBZb3VyIHJlcG9ydCBpcyByZWFkeTogJHtyZXBvcnRQYXRofWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBSZXBvcnQgZ2VuZXJhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JSZXN1bHQocmlkKSB7XHJcbiAgICAgICAgaWYgKCFyaWQgfHwgIXRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yUmVzdWx0cygpIHtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlcyAmJiB0aGlzLnJ1bm5lckVuZFByb21pc2VzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5ydW5uZXJFbmRQcm9taXNlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTGF1bmNoU3RhcnQob3B0aW9ucykge1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgb3B0aW9uc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25MYXVuY2hTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25MYXVuY2hFbmQoKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZ3JvdXBSZXN1bHRzKCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByZXN1bHRzXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xhdW5jaDplbmQnLCByZXN1bHRzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxhdW5jaEVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25SdW5uZXJTdGFydChyaWQsIG9wdHMsIGNhcHMpIHtcclxuICAgICAgICBpZiAoIXJpZCkge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1wicmlkXCIgY2Fubm90IGJlIGVtcHR5LicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gbmV3IFRlc3RSZXN1bHQoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnJpZCA9IHJpZDtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm5hbWUgPSBvcHRzLm5hbWUgfHwgREVGQVVMVF9URVNUX05BTUU7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdGFydFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBjYXBzO1xyXG4gICAgICAgIHRlc3RSZXN1bHQuZW52aXJvbm1lbnQgPSBvcHRzLmVudlZhcnMgfHwge307XHJcbiAgICAgICAgdGVzdFJlc3VsdC5vcHRpb25zID0gb3B0cztcclxuICAgICAgICB0aGlzLnJlc3VsdHMucHVzaCh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAvLyBjcmVhdGUgYSBuZXcgcHJvbWlzZSBmb3IgbGF0ZXIgdG8gYmUgcmVzb2x2ZWQgb24gcnVubmVyOmVuZCBldmVudFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXSA9IGRlZmVyKCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIG9wdHMsXHJcbiAgICAgICAgICAgIGNhcHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblJ1bm5lclN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lckVuZChyaWQsIGZpbmFsUmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQpIHtcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5lbmRUaW1lID0gb3h1dGlsLmdldFRpbWVTdGFtcCgpO1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmR1cmF0aW9uID0gdGVzdFJlc3VsdC5lbmRUaW1lIC0gdGVzdFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIC8vIGRldGVybWluZSB0ZXN0IHN0YXR1cyBiYXNlZCBvbiBzdWl0ZXMgc3RhdHVzZXNcclxuICAgICAgICAgICAgdGVzdFJlc3VsdC5zdGF0dXMgPSB0aGlzLl9kZXRlcm1pbmVUZXN0U3RhdHVzQnlTdWl0ZXModGVzdFJlc3VsdCwgZmF0YWxFcnJvcik7XHJcbiAgICAgICAgICAgIC8vIHRlc3RSZXN1bHQuc3RhdHVzID0gZmF0YWxFcnJvciA/IFN0YXR1cy5GQUlMRUQgOiAodGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkgPyBTdGF0dXMuRkFJTEVEIDogU3RhdHVzLlBBU1NFRDtcclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc3VtZSB0aGF0IGlmIGZhdGFsRXJyb3IgaXMgbm90IGluaGVyaXRlZCBmcm9tIEVycm9yIGNsYXNzIHRoZW4gd2UgYWxyZWFkeSBnb3QgT3h5Z2VuIEZhaWx1cmUgb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5mYWlsdXJlID0gZmF0YWxFcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3JIZWxwZXIuZ2V0RmFpbHVyZUZyb21FcnJvcihmYXRhbEVycm9yKSA6IGZhdGFsRXJyb3I7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSB0aGlzLl9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICYmIGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcykge1xyXG4gICAgICAgICAgICAgICAgdGVzdFJlc3VsdC5jYXBhYmlsaXRpZXMgPSBmaW5hbFJlc3VsdC5jYXBhYmlsaXRpZXM7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlICYmIHRlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX0gYXQgJHt0ZXN0UmVzdWx0LmZhaWx1cmUubG9jYXRpb259LmApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmUudHlwZX1gKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRlc3RSZXN1bHQuZmFpbHVyZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgRXJyb3I6ICR7dGVzdFJlc3VsdC5mYWlsdXJlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUZXN0ICR7cmlkfSBoYXMgZmluaXNoZWQgd2l0aCBzdGF0dXM6ICR7dGVzdFJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHRlc3RSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3J1bm5lcjplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyRW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBpZiAodGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIC8vIGNhbGxpbmcgbmV4dFRpY2soKSB3aWxsIGhlbHAgdXMgdG8gaW5zdXJlIHRoYXQgd2UgcmVzb2x2ZSB0aGUgcHJvbWlzZSBhZnRlciBlbWl0KCdydW5uZXI6ZW5kJykgaGFzIGNvbXBsZXRlZFxyXG4gICAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXNbcmlkXS5yZXNvbHZlKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgaWYgKGZhdGFsRXJyb3IpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGhhc0ZhaWxlZFN1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgaWYgKGhhc0ZhaWxlZFN1aXRlcykge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzV2FybmluZ1N1aXRlcyA9IHRlc3RSZXN1bHQuc3VpdGVzLnNvbWUoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpO1xyXG4gICAgICAgIGlmIChoYXNXYXJuaW5nU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuV0FSTklORztcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgYWxsU3VpdGVzU2tpcHBlZCA9IHRlc3RSZXN1bHQuc3VpdGVzLmV2ZXJ5KHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5TS0lQUEVEKTtcclxuICAgICAgICBpZiAoYWxsU3VpdGVzU2tpcHBlZCkge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLlNLSVBQRUQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uSXRlcmF0aW9uU3RhcnQocmlkLCBpdGVyYXRpb24sIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKGl0ZXJhdGlvbikge1xyXG4gICAgICAgICAgICBjb25zdCBtc2cgPSBgJHtzdGFydH0gSXRlcmF0aW9uICMke2l0ZXJhdGlvbn0gc3RhcnRlZC4uLmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25FbmQocmlkLCByZXN1bHQsIHN0YXJ0KSB7XHJcbiAgICAgICAgaWYgKHJlc3VsdD8uaXRlcmF0aW9uTnVtICYmIHJlc3VsdC5zdGF0dXM/LnRvVXBwZXJDYXNlKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7cmVzdWx0Lml0ZXJhdGlvbk51bX0gZW5kZWQgd2l0aCBzdGF0dXM6ICR7cmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhtc2cpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLm9uTG9nRW50cnkobnVsbCwgJ0lORk8nLCBtc2csICd1c2VyJyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVTdGFydChyaWQsIHN1aXRlSWQsIHN1aXRlKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZS5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgbGV0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkOiBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZTogc3VpdGUsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN1aXRlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uU3VpdGVFbmQocmlkLCBzdWl0ZUlkLCBzdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSB0aGlzLnJlc3VsdHMuZmluZCh4ID0+IHgucmlkID09PSByaWQpO1xyXG4gICAgICAgIGlmICghdGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRlc3RSZXN1bHQuc3VpdGVzLnB1c2goc3VpdGVSZXN1bHQpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWl0ZSBcIiR7c3VpdGVSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7c3VpdGVSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICByZXN1bHQ6IHN1aXRlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdWl0ZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCBjYXNlRGVmKSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZURlZi5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlUmVmSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgY2FzZTogY2FzZURlZixcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTpzdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uQ2FzZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVmSWQsIGNhc2VJZCwgY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGAtIENhc2UgXCIke2Nhc2VSZXN1bHQubmFtZX1cIiBoYXMgZW5kZWQgd2l0aCBzdGF0dXM6ICR7Y2FzZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50KGNhc2VSZXN1bHQpO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBzdWl0ZVJlZklkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogY2FzZVJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnY2FzZTplbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uQ2FzZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwU3RhcnQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXApIHtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcC5uYW1lfVwiIGhhcyBzdGFydGVkLi4uYCk7XHJcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucm9vdFBhdGggJiYgdGhpcy5vcHRpb25zLmZyYW1ld29yayAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrID09PSAnY3VjdW1iZXInKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5yZXNvbHZlKHRoaXMub3B0aW9ucy5yb290UGF0aCwgc3RlcC5sb2NhdGlvbik7XHJcbiAgICAgICAgICAgIHN0ZXAubG9jYXRpb24gPSBmdWxsUGF0aCsnOjEnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdGVwRW5kKHJpZCwgc3VpdGVJZCwgY2FzZUlkLCBzdGVwUmVzdWx0KSB7XHJcbiAgICAgICAgLy9jb25zdCBzdGF0dXMgPSBzdGVwUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgIC8vY29uc3QgZHVyYXRpb24gPSBzdGVwUmVzdWx0LmR1cmF0aW9uID8gKHN0ZXBSZXN1bHQuZHVyYXRpb24gLyAxMDAwKS50b0ZpeGVkKDIpIDogMDtcclxuICAgICAgICAvL2NvbnNvbGUubG9nKGAgIC0gU3RlcCBcIiR7c3RlcFJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCBpbiAke2R1cmF0aW9ufXMgd2l0aCBzdGF0dXM6ICR7c3RhdHVzfS5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBzdGVwOiBzdGVwUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdzdGVwOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdGVwRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkxvZ0VudHJ5KHRpbWUsIGxldmVsLCBtc2csIHNyYyA9IG51bGwsIHsgc3VpdGVJZCwgY2FzZUlkLCBzdGVwSWQgfSA9IHt9KSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXBJZCxcclxuICAgICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICAgIG1zZyxcclxuICAgICAgICAgICAgdGltZSxcclxuICAgICAgICAgICAgc3JjXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ2xvZycsIGV2ZW50QXJncyk7XHJcblxyXG4gICAgICAgIGlmICghdGltZSkge1xyXG4gICAgICAgICAgICBldmVudEFyZ3MudGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxvZycsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBmYWlsdXJlIG9iamVjdCBpbiBvbmUgb2YgdGVzdCByZXN1bHQncyBlbnRpdGllcy4gXHJcbiAgICAgKiBAcGFyYW0ge1Rlc3RSZXN1bHR9IHRlc3RSZXN1bHQgXHJcbiAgICAgKi9cclxuICAgIF9nZXRGaXJzdEZhaWx1cmUodGVzdFJlc3VsdCkge1xyXG4gICAgICAgIGlmICh0ZXN0UmVzdWx0LnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGZvciAobGV0IHN1aXRlUmVzdWx0IG9mIHRlc3RSZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpZiAoc3VpdGVSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdWl0ZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgY2FzZVJlc3VsdCBvZiBzdWl0ZVJlc3VsdC5jYXNlcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXNlUmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhc2VSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3RlcFJlc3VsdCBvZiBjYXNlUmVzdWx0LnN0ZXBzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGVwUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBSZXN1bHQuZmFpbHVyZSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBncm91cFJlc3VsdHMoKSB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHMgPSB7fTtcclxuICAgICAgICBjb25zdCB1bmdyb3VwZWRSZXN1bHRzID0gW107XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVzdWx0cykgfHwgdGhpcy5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZm9yIChsZXQgcmVzdWx0IG9mIHRoaXMucmVzdWx0cykge1xyXG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdCB8fCAhcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnJlc3VsdEtleSkge1xyXG4gICAgICAgICAgICAgICAgdW5ncm91cGVkUmVzdWx0cy5wdXNoKHJlc3VsdCk7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCByZXN1bHRLZXkgPSByZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5O1xyXG4gICAgICAgICAgICBjb25zdCBzdWl0ZUtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5zdWl0ZUtleTtcclxuICAgICAgICAgICAgbGV0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldO1xyXG4gICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tyZXN1bHRLZXldID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdCxcclxuICAgICAgICAgICAgICAgICAgICBzdWl0ZXM6IFtdLFxyXG4gICAgICAgICAgICAgICAgfTtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUsIHJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFJlc3VsdC5lbmRUaW1lLCByZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLy8gaWYgZ3JvdXBpbmcgaXMgYnkgcmVzdWx0IG9ubHksIHRoZW4ganVzdCBhcHBlbmQgY3VycmVudCByZXN1bHQncyBzdWl0ZXMgdG8gdGhlIGdyb3VwJ3Mgc3VpdGVzXHJcbiAgICAgICAgICAgIGlmICghc3VpdGVLZXkpIHtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdC5zdWl0ZXNcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGN1cnJlbnRTdWl0ZVJlc3VsdCBvZiByZXN1bHQuc3VpdGVzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBLZXkgPSBgJHtzdWl0ZUtleX0tJHtjdXJyZW50U3VpdGVSZXN1bHQuaXRlcmF0aW9uTnVtfWA7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFN1aXRlUmVzdWx0ID0gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cGVkU3VpdGVSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtncm91cEtleV0gPSB7IC4uLmN1cnJlbnRTdWl0ZVJlc3VsdCB9O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSA9IE1hdGgubWluKGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGFydFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5zdGFydFRpbWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuZW5kVGltZSA9IE1hdGgubWF4KGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lLCBjdXJyZW50U3VpdGVSZXN1bHQuZW5kVGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5kdXJhdGlvbiA9IGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lIC0gZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFN1aXRlUmVzdWx0LmNhc2VzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudFN1aXRlUmVzdWx0LmNhc2VzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gY29udmVydCBncm91cGVkIHJlc3VsdHMgaGFzaCB0byBhbiBhcnJheVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHRzTGlzdCA9IE9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHRzKS5tYXAoXHJcbiAgICAgICAgICAgIGdyb3VwS2V5ID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHQgPSBncm91cGVkUmVzdWx0c1tncm91cEtleV07XHJcbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3VpdGVzID0gW1xyXG4gICAgICAgICAgICAgICAgICAgIC4uLmdyb3VwZWRSZXN1bHQuc3VpdGVzLFxyXG4gICAgICAgICAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2gpLm1hcChzdWl0ZUdyb3VwS2V5ID0+IGdyb3VwZWRSZXN1bHQuX3N1aXRlc0hhc2hbc3VpdGVHcm91cEtleV0pXHJcbiAgICAgICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RGYWlsZWRTdWl0ZSA9IGdyb3VwZWRSZXN1bHQuc3VpdGVzLmZpbmQocyA9PiBzLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RGYWlsZWRTdWl0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdEZhaWxlZFN1aXRlLmZhaWx1cmUgfHwgZ3JvdXBlZFJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RTdWl0ZVdpdGhXYXJuaW5nID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0U3VpdGVXaXRoV2FybmluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmZhaWx1cmUgPSBmaXJzdFN1aXRlV2l0aFdhcm5pbmcuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlIGdyb3VwZWRSZXN1bHRbJ19zdWl0ZXNIYXNoJ107XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbLi4uZ3JvdXBlZFJlc3VsdHNMaXN0LCAuLi51bmdyb3VwZWRSZXN1bHRzXTtcclxuICAgICAgICAvLyBjaGFuZ2UgcmVzdWx0cyBzdGF0dXMgdG8gZmFpZGVkIGlmIGZhaWxlZCBzdWl0ZXMgYXJlIGZpbmRlZFxyXG4gICAgICAgIHJlc3VsdHMgPSB0aGlzLnJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpO1xyXG5cclxuICAgICAgICB0aGlzLnZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpO1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIHJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzKHJlc3VsdHMpIHtcclxuICAgICAgICByZXR1cm4gcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICByZXN1bHQgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMgJiZcclxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkocmVzdWx0LnN1aXRlcykgJiZcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMubGVuZ3RoID4gMFxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLkZBSUxFRCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZmFpbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5GQUlMRUQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXN1bHQuc3VpdGVzLmZpbmQoKHN1aXRlKSA9PiBzdWl0ZS5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB2YWxpZGF0ZVJlc3VsdChyZXN1bHRzKSB7XHJcbiAgICAgICAgY29uc3QgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzID0gW107XHJcbiAgICAgICAgcmVzdWx0cy5tYXAoKHJlc3VsdCkgPT4ge1xyXG4gICAgICAgICAgICByZXN1bHQuc3VpdGVzLm1hcCgoc3VpdGUpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMuaW5jbHVkZXMoc3VpdGUuaXRlcmF0aW9uTnVtKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybignc3VpdGUuaXRlcmF0aW9uTnVtJywgc3VpdGUuaXRlcmF0aW9uTnVtLCAnIG5vdCB1bmlxdWUnKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlU3VpdGVzSXRlcmF0aW9uSWRzLnB1c2goc3VpdGUuaXRlcmF0aW9uTnVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX2ludm9rZVJlcG9ydGVyc0hvb2soaG9va05hbWUsIGV2ZW50QXJncykge1xyXG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0aGlzLnJlcG9ydGVycykgfHwgdGhpcy5yZXBvcnRlcnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICBpZiAocmVwb3J0ZXJbaG9va05hbWVdKSB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHJlcG9ydGVyW2hvb2tOYW1lXShldmVudEFyZ3MpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBpbnZva2UgcmVwb3J0ZXIgaG9vayBcIiR7aG9va05hbWV9XCI6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIF9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCkge1xyXG4gICAgICAgIGlmICghY2FzZVJlc3VsdCB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cyB8fCAhY2FzZVJlc3VsdC5hdHRhY2htZW50cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhdHRhY2htZW50c1RvUmVtb3ZlID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnQgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzW2ldO1xyXG4gICAgICAgICAgICBpZiAoIWF0dGFjaG1lbnQuX3VybCkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZGVvRmlsZVBhdGggPVxyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG94dXRpbC5kb3dubG9hZFZpZGVvKGF0dGFjaG1lbnQuZmlsZU5hbWUsIGF0dGFjaG1lbnQuX3VybCwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgICAgICAgICAgIGlmICghdmlkZW9GaWxlUGF0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGF0dGFjaG1lbnQuZmlsZVBhdGggPSB2aWRlb0ZpbGVQYXRoO1xyXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBhdHRhY2htZW50WydfdXJsJ107XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGRvd25sb2FkIHZpZGVvIGZpbGU6ICcsIGUubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhdHRhY2htZW50c1RvUmVtb3ZlLnB1c2goYXR0YWNobWVudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcmVtb3ZlIHZpZGVvIGF0dGFjaG1lbnRzIHRoYXQgY291bGRuJ3QgYmUgZG93bmxvYWRlZFxyXG4gICAgICAgIGZvciAobGV0IGk9MDsgaTwgYXR0YWNobWVudHNUb1JlbW92ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBlbG1JbmRleFRvUmVtb3ZlID0gY2FzZVJlc3VsdC5hdHRhY2htZW50cy5pbmRleE9mKGF0dGFjaG1lbnRzVG9SZW1vdmVbaV0pO1xyXG4gICAgICAgICAgICBpZiAoIWVsbUluZGV4VG9SZW1vdmUgPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZVJlc3VsdC5hdHRhY2htZW50cy5zcGxpY2UoZWxtSW5kZXhUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFZQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxLQUFBLEdBQUFDLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBRyxXQUFBLEdBQUFELHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFGLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBSyxLQUFBLEdBQUFMLE9BQUE7QUFHQSxJQUFBTSxhQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxjQUFBLEdBQUFMLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUSxhQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxjQUFBLEdBQUFQLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVSxZQUFBLEdBQUFSLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBVyxZQUFBLEdBQUFULHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBWSxPQUFBLEdBQUFWLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBYSxPQUFBLEdBQUFYLHNCQUFBLENBQUFGLE9BQUE7QUFBcUMsU0FBQUUsdUJBQUFZLENBQUEsV0FBQUEsQ0FBQSxJQUFBQSxDQUFBLENB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
|