oxygen-cli 1.41.0 → 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 +8 -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 +50 -82
- package/build/index.js +8 -22
- package/build/lib/cli-util.js +35 -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 +20 -41
- 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 +14 -51
- 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 +7 -121
- 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 +3 -1
|
@@ -4,41 +4,22 @@ 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
19
|
var _helper = _interopRequireDefault(require("../errors/helper"));
|
|
33
|
-
|
|
34
20
|
var _status = _interopRequireDefault(require("../model/status"));
|
|
35
|
-
|
|
36
|
-
function
|
|
37
|
-
|
|
38
|
-
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
39
|
-
|
|
40
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
41
|
-
|
|
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); }
|
|
42
23
|
const Reporters = {
|
|
43
24
|
json: _reporterJson.default,
|
|
44
25
|
junit: _reporterJunit.default,
|
|
@@ -49,7 +30,6 @@ const Reporters = {
|
|
|
49
30
|
};
|
|
50
31
|
const DEFAULT_TEST_NAME = 'Oxygen Test';
|
|
51
32
|
const DEFAULT_REPORTERS = [];
|
|
52
|
-
|
|
53
33
|
class ReportAggregator extends _events.EventEmitter {
|
|
54
34
|
constructor(options) {
|
|
55
35
|
super();
|
|
@@ -57,23 +37,18 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
57
37
|
this.runnerEndPromises = {};
|
|
58
38
|
this.options = options;
|
|
59
39
|
}
|
|
60
|
-
|
|
61
40
|
getExitCode() {
|
|
62
41
|
let exitCode = 0;
|
|
63
|
-
|
|
64
42
|
if (this.results && Array.isArray(this.results) && this.results.length > 0) {
|
|
65
43
|
const testFailded = this.results.find(item => item.status === 'failed');
|
|
66
|
-
|
|
67
44
|
if (testFailded) {
|
|
68
45
|
exitCode = -1;
|
|
69
46
|
}
|
|
70
47
|
} else {
|
|
71
48
|
exitCode = -1;
|
|
72
49
|
}
|
|
73
|
-
|
|
74
50
|
return exitCode;
|
|
75
51
|
}
|
|
76
|
-
|
|
77
52
|
async init() {
|
|
78
53
|
if (!this.options._oxide) {
|
|
79
54
|
const {
|
|
@@ -81,25 +56,19 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
81
56
|
} = await Promise.resolve().then(() => _interopRequireWildcard(require('../ox_reporters/reporter-rp')));
|
|
82
57
|
Reporters.rp = ReportPortalReporter;
|
|
83
58
|
}
|
|
84
|
-
|
|
85
59
|
this.reporters = [];
|
|
86
60
|
const generalReportingOpts = this.options.reporting || {};
|
|
87
|
-
|
|
88
61
|
for (let reporter of generalReportingOpts.reporters || DEFAULT_REPORTERS) {
|
|
89
62
|
if (typeof reporter !== 'string' && !Object.prototype.hasOwnProperty.call(reporter, 'name')) {
|
|
90
63
|
continue;
|
|
91
64
|
}
|
|
92
|
-
|
|
93
65
|
const reporterName = typeof reporter === 'string' ? reporter : reporter.name;
|
|
94
66
|
const reporterOpts = typeof reporter === 'object' ? reporter : undefined;
|
|
95
|
-
|
|
96
67
|
if (Object.prototype.hasOwnProperty.call(Reporters, reporterName)) {
|
|
97
68
|
if (reporterOpts && typeof reporterOpts.enabled === 'boolean' && !reporterOpts.enabled) {
|
|
98
69
|
continue;
|
|
99
70
|
}
|
|
100
|
-
|
|
101
71
|
const reporter = new Reporters[reporterName](this.options, reporterOpts, this);
|
|
102
|
-
|
|
103
72
|
if (reporter.init) {
|
|
104
73
|
try {
|
|
105
74
|
await reporter.init();
|
|
@@ -107,27 +76,21 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
107
76
|
console.log(`Failed to initialize "${reporterName}" reporter: ${err.message}`);
|
|
108
77
|
}
|
|
109
78
|
}
|
|
110
|
-
|
|
111
79
|
this.reporters.push(reporter);
|
|
112
80
|
}
|
|
113
81
|
}
|
|
114
82
|
}
|
|
115
|
-
|
|
116
83
|
getResults() {
|
|
117
84
|
return this.results;
|
|
118
85
|
}
|
|
119
|
-
|
|
120
86
|
async generateReports() {
|
|
121
87
|
if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
|
|
122
88
|
return false;
|
|
123
89
|
}
|
|
124
|
-
|
|
125
90
|
const groupedResults = this.groupResults();
|
|
126
|
-
|
|
127
91
|
for (let reporter of this.reporters) {
|
|
128
92
|
try {
|
|
129
93
|
const reportPath = await reporter.generate(groupedResults);
|
|
130
|
-
|
|
131
94
|
if (reportPath) {
|
|
132
95
|
console.log(`Your report is ready: ${reportPath}`);
|
|
133
96
|
}
|
|
@@ -135,31 +98,25 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
135
98
|
console.error(`Report generation failed: ${e.message}`);
|
|
136
99
|
}
|
|
137
100
|
}
|
|
138
|
-
|
|
139
101
|
return true;
|
|
140
102
|
}
|
|
141
|
-
|
|
142
103
|
async waitForResult(rid) {
|
|
143
104
|
if (!rid || !this.runnerEndPromises[rid]) {
|
|
144
105
|
return null;
|
|
145
106
|
}
|
|
146
|
-
|
|
147
107
|
return this.runnerEndPromises[rid];
|
|
148
108
|
}
|
|
149
|
-
|
|
150
109
|
async waitForResults() {
|
|
151
110
|
if (this.runnerEndPromises && this.runnerEndPromises.length) {
|
|
152
111
|
return Promise.all(this.runnerEndPromises);
|
|
153
112
|
}
|
|
154
113
|
}
|
|
155
|
-
|
|
156
114
|
async onLaunchStart(options) {
|
|
157
115
|
const eventArgs = {
|
|
158
116
|
options
|
|
159
117
|
};
|
|
160
118
|
await this._invokeReportersHook('onLaunchStart', eventArgs);
|
|
161
119
|
}
|
|
162
|
-
|
|
163
120
|
async onLaunchEnd() {
|
|
164
121
|
const results = this.groupResults();
|
|
165
122
|
const eventArgs = {
|
|
@@ -168,12 +125,10 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
168
125
|
this.emit('launch:end', results);
|
|
169
126
|
await this._invokeReportersHook('onLaunchEnd', eventArgs);
|
|
170
127
|
}
|
|
171
|
-
|
|
172
128
|
async onRunnerStart(rid, opts, caps) {
|
|
173
129
|
if (!rid) {
|
|
174
130
|
throw new Error('"rid" cannot be empty.');
|
|
175
131
|
}
|
|
176
|
-
|
|
177
132
|
const testResult = new _testResult.default();
|
|
178
133
|
testResult.rid = rid;
|
|
179
134
|
testResult.name = opts.name || DEFAULT_TEST_NAME;
|
|
@@ -192,15 +147,12 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
192
147
|
this.emit('runner:start', eventArgs);
|
|
193
148
|
await this._invokeReportersHook('onRunnerStart', eventArgs);
|
|
194
149
|
}
|
|
195
|
-
|
|
196
150
|
async onRunnerEnd(rid, finalResult, fatalError) {
|
|
197
151
|
const testResult = this.results.find(x => x.rid === rid);
|
|
198
|
-
|
|
199
152
|
if (testResult) {
|
|
200
153
|
testResult.endTime = _util.default.getTimeStamp();
|
|
201
154
|
testResult.duration = testResult.endTime - testResult.startTime;
|
|
202
155
|
testResult.status = this._determineTestStatusBySuites(testResult, fatalError);
|
|
203
|
-
|
|
204
156
|
if (testResult.status === _status.default.FAILED) {
|
|
205
157
|
if (fatalError) {
|
|
206
158
|
testResult.failure = fatalError instanceof Error ? _helper.default.getFailureFromError(fatalError) : fatalError;
|
|
@@ -208,11 +160,9 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
208
160
|
testResult.failure = this._getFirstFailure(testResult);
|
|
209
161
|
}
|
|
210
162
|
}
|
|
211
|
-
|
|
212
163
|
if (finalResult && finalResult.capabilities) {
|
|
213
164
|
testResult.capabilities = finalResult.capabilities;
|
|
214
165
|
}
|
|
215
|
-
|
|
216
166
|
if (testResult.failure) {
|
|
217
167
|
if (testResult.failure.type && testResult.failure.location) {
|
|
218
168
|
console.log(`Error: ${testResult.failure.type} at ${testResult.failure.location}.`);
|
|
@@ -222,50 +172,38 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
222
172
|
console.log(`Error: ${testResult.failure}`);
|
|
223
173
|
}
|
|
224
174
|
}
|
|
225
|
-
|
|
226
175
|
console.log(`Test ${rid} has finished with status: ${testResult.status.toUpperCase()}.`);
|
|
227
176
|
}
|
|
228
|
-
|
|
229
177
|
const eventArgs = {
|
|
230
178
|
rid,
|
|
231
179
|
result: testResult
|
|
232
180
|
};
|
|
233
181
|
this.emit('runner:end', eventArgs);
|
|
234
182
|
await this._invokeReportersHook('onRunnerEnd', eventArgs);
|
|
235
|
-
|
|
236
183
|
if (this.runnerEndPromises[rid]) {
|
|
237
184
|
process.nextTick(() => {
|
|
238
185
|
this.runnerEndPromises[rid].resolve(testResult);
|
|
239
186
|
});
|
|
240
187
|
}
|
|
241
188
|
}
|
|
242
|
-
|
|
243
189
|
_determineTestStatusBySuites(testResult, fatalError) {
|
|
244
190
|
if (fatalError) {
|
|
245
191
|
return _status.default.FAILED;
|
|
246
192
|
}
|
|
247
|
-
|
|
248
193
|
const hasFailedSuites = testResult.suites.some(x => x.status === _status.default.FAILED);
|
|
249
|
-
|
|
250
194
|
if (hasFailedSuites) {
|
|
251
195
|
return _status.default.FAILED;
|
|
252
196
|
}
|
|
253
|
-
|
|
254
197
|
const hasWarningSuites = testResult.suites.some(x => x.status === _status.default.WARNING);
|
|
255
|
-
|
|
256
198
|
if (hasWarningSuites) {
|
|
257
199
|
return _status.default.WARNING;
|
|
258
200
|
}
|
|
259
|
-
|
|
260
201
|
const allSuitesSkipped = testResult.suites.every(x => x.status === _status.default.SKIPPED);
|
|
261
|
-
|
|
262
202
|
if (allSuitesSkipped) {
|
|
263
203
|
return _status.default.SKIPPED;
|
|
264
204
|
}
|
|
265
|
-
|
|
266
205
|
return _status.default.PASSED;
|
|
267
206
|
}
|
|
268
|
-
|
|
269
207
|
async onIterationStart(rid, iteration, start) {
|
|
270
208
|
if (iteration) {
|
|
271
209
|
const msg = `${start} Iteration #${iteration} started...`;
|
|
@@ -273,17 +211,14 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
273
211
|
await this.onLogEntry(null, 'INFO', msg, 'user');
|
|
274
212
|
}
|
|
275
213
|
}
|
|
276
|
-
|
|
277
214
|
async onIterationEnd(rid, result, start) {
|
|
278
215
|
var _result$status;
|
|
279
|
-
|
|
280
216
|
if (result !== null && result !== void 0 && result.iterationNum && (_result$status = result.status) !== null && _result$status !== void 0 && _result$status.toUpperCase) {
|
|
281
217
|
const msg = `${start} Iteration #${result.iterationNum} ended with status: ${result.status.toUpperCase()}.`;
|
|
282
218
|
console.log(msg);
|
|
283
219
|
await this.onLogEntry(null, 'INFO', msg, 'user');
|
|
284
220
|
}
|
|
285
221
|
}
|
|
286
|
-
|
|
287
222
|
async onSuiteStart(rid, suiteId, suite) {
|
|
288
223
|
console.log(`Suite "${suite.name}" has started...`);
|
|
289
224
|
let eventArgs = {
|
|
@@ -294,14 +229,11 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
294
229
|
this.emit('suite:start', eventArgs);
|
|
295
230
|
await this._invokeReportersHook('onSuiteStart', eventArgs);
|
|
296
231
|
}
|
|
297
|
-
|
|
298
232
|
async onSuiteEnd(rid, suiteId, suiteResult) {
|
|
299
233
|
const testResult = this.results.find(x => x.rid === rid);
|
|
300
|
-
|
|
301
234
|
if (!testResult) {
|
|
302
235
|
return;
|
|
303
236
|
}
|
|
304
|
-
|
|
305
237
|
testResult.suites.push(suiteResult);
|
|
306
238
|
console.log(`Suite "${suiteResult.name}" has ended with status: ${suiteResult.status.toUpperCase()}.`);
|
|
307
239
|
const eventArgs = {
|
|
@@ -312,7 +244,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
312
244
|
this.emit('suite:end', eventArgs);
|
|
313
245
|
await this._invokeReportersHook('onSuiteEnd', eventArgs);
|
|
314
246
|
}
|
|
315
|
-
|
|
316
247
|
async onCaseStart(rid, suiteId, suiteRefId, caseId, caseDef) {
|
|
317
248
|
console.log(`- Case "${caseDef.name}" has started...`);
|
|
318
249
|
const eventArgs = {
|
|
@@ -325,7 +256,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
325
256
|
this.emit('case:start', eventArgs);
|
|
326
257
|
await this._invokeReportersHook('onCaseStart', eventArgs);
|
|
327
258
|
}
|
|
328
|
-
|
|
329
259
|
async onCaseEnd(rid, suiteId, suiteRefId, caseId, caseResult) {
|
|
330
260
|
console.log(`- Case "${caseResult.name}" has ended with status: ${caseResult.status.toUpperCase()}.`);
|
|
331
261
|
await this._saveTestCaseVideoAttachment(caseResult);
|
|
@@ -339,14 +269,11 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
339
269
|
this.emit('case:end', eventArgs);
|
|
340
270
|
await this._invokeReportersHook('onCaseEnd', eventArgs);
|
|
341
271
|
}
|
|
342
|
-
|
|
343
272
|
async onStepStart(rid, suiteId, caseId, step) {
|
|
344
273
|
if (this.options && this.options.rootPath && this.options.framework && this.options.framework === 'cucumber') {
|
|
345
274
|
const fullPath = _path.default.resolve(this.options.rootPath, step.location);
|
|
346
|
-
|
|
347
275
|
step.location = fullPath + ':1';
|
|
348
276
|
}
|
|
349
|
-
|
|
350
277
|
const eventArgs = {
|
|
351
278
|
rid,
|
|
352
279
|
suiteId,
|
|
@@ -356,7 +283,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
356
283
|
this.emit('step:start', eventArgs);
|
|
357
284
|
await this._invokeReportersHook('onStepStart', eventArgs);
|
|
358
285
|
}
|
|
359
|
-
|
|
360
286
|
async onStepEnd(rid, suiteId, caseId, stepResult) {
|
|
361
287
|
const eventArgs = {
|
|
362
288
|
rid,
|
|
@@ -367,7 +293,6 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
367
293
|
this.emit('step:end', eventArgs);
|
|
368
294
|
await this._invokeReportersHook('onStepEnd', eventArgs);
|
|
369
295
|
}
|
|
370
|
-
|
|
371
296
|
async onLogEntry(time, level, msg, src = null, {
|
|
372
297
|
suiteId,
|
|
373
298
|
caseId,
|
|
@@ -383,75 +308,60 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
383
308
|
src
|
|
384
309
|
};
|
|
385
310
|
this.emit('log', eventArgs);
|
|
386
|
-
|
|
387
311
|
if (!time) {
|
|
388
312
|
eventArgs.time = Date.now();
|
|
389
313
|
}
|
|
390
|
-
|
|
391
314
|
await this._invokeReportersHook('onLog', eventArgs);
|
|
392
315
|
}
|
|
393
|
-
|
|
394
316
|
_getFirstFailure(testResult) {
|
|
395
317
|
if (testResult.status === _status.default.FAILED) {
|
|
396
318
|
if (testResult.failure) {
|
|
397
319
|
return testResult.failure;
|
|
398
320
|
}
|
|
399
|
-
|
|
400
321
|
for (let suiteResult of testResult.suites) {
|
|
401
322
|
if (suiteResult.status !== _status.default.FAILED) {
|
|
402
323
|
continue;
|
|
403
324
|
}
|
|
404
|
-
|
|
405
325
|
if (suiteResult.failure) {
|
|
406
326
|
return suiteResult.failure;
|
|
407
327
|
}
|
|
408
|
-
|
|
409
328
|
for (let caseResult of suiteResult.cases) {
|
|
410
329
|
if (suiteResult.status !== _status.default.FAILED) {
|
|
411
330
|
continue;
|
|
412
331
|
}
|
|
413
|
-
|
|
414
332
|
if (caseResult.failure) {
|
|
415
333
|
return caseResult.failure;
|
|
416
334
|
}
|
|
417
|
-
|
|
418
335
|
for (let stepResult of caseResult.steps) {
|
|
419
336
|
if (stepResult.status !== _status.default.FAILED) {
|
|
420
337
|
continue;
|
|
421
338
|
}
|
|
422
|
-
|
|
423
339
|
return stepResult.failure || null;
|
|
424
340
|
}
|
|
425
341
|
}
|
|
426
342
|
}
|
|
427
343
|
}
|
|
428
|
-
|
|
429
344
|
return null;
|
|
430
345
|
}
|
|
431
|
-
|
|
432
346
|
groupResults() {
|
|
433
347
|
const groupedResults = {};
|
|
434
348
|
const ungroupedResults = [];
|
|
435
|
-
|
|
436
349
|
if (!Array.isArray(this.results) || this.results.length == 0) {
|
|
437
350
|
return false;
|
|
438
351
|
}
|
|
439
|
-
|
|
440
352
|
for (let result of this.results) {
|
|
441
353
|
if (!result.options._groupResult || !result.options._groupResult.resultKey) {
|
|
442
354
|
ungroupedResults.push(result);
|
|
443
355
|
continue;
|
|
444
356
|
}
|
|
445
|
-
|
|
446
357
|
const resultKey = result.options._groupResult.resultKey;
|
|
447
358
|
const suiteKey = result.options._groupResult.suiteKey;
|
|
448
359
|
let groupedResult = groupedResults[resultKey];
|
|
449
|
-
|
|
450
360
|
if (!groupedResult) {
|
|
451
|
-
groupedResult = groupedResults[resultKey] = {
|
|
361
|
+
groupedResult = groupedResults[resultKey] = {
|
|
362
|
+
...result,
|
|
452
363
|
suites: []
|
|
453
364
|
};
|
|
454
|
-
|
|
455
365
|
if (suiteKey) {
|
|
456
366
|
groupedResult['_suitesHash'] = {};
|
|
457
367
|
}
|
|
@@ -460,23 +370,21 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
460
370
|
groupedResult.endTime = Math.max(groupedResult.endTime, result.endTime);
|
|
461
371
|
groupedResult.duration = groupedResult.endTime - groupedResult.startTime;
|
|
462
372
|
}
|
|
463
|
-
|
|
464
373
|
if (!suiteKey) {
|
|
465
374
|
groupedResult.suites = [...groupedResult.suites, ...result.suites];
|
|
466
375
|
} else {
|
|
467
376
|
for (const currentSuiteResult of result.suites) {
|
|
468
377
|
const groupKey = `${suiteKey}-${currentSuiteResult.iterationNum}`;
|
|
469
378
|
const groupedSuiteResult = groupedResult._suitesHash[groupKey];
|
|
470
|
-
|
|
471
379
|
if (!groupedSuiteResult) {
|
|
472
|
-
groupedResult._suitesHash[groupKey] = {
|
|
380
|
+
groupedResult._suitesHash[groupKey] = {
|
|
381
|
+
...currentSuiteResult
|
|
473
382
|
};
|
|
474
383
|
} else {
|
|
475
384
|
groupedSuiteResult.startTime = Math.min(groupedSuiteResult.startTime, currentSuiteResult.startTime);
|
|
476
385
|
groupedSuiteResult.endTime = Math.max(groupedSuiteResult.endTime, currentSuiteResult.endTime);
|
|
477
386
|
groupedSuiteResult.duration = groupedSuiteResult.endTime - groupedSuiteResult.startTime;
|
|
478
387
|
groupedSuiteResult.cases = [...groupedSuiteResult.cases, ...currentSuiteResult.cases];
|
|
479
|
-
|
|
480
388
|
if (currentSuiteResult.cases.some(c => c.status === _status.default.FAILED)) {
|
|
481
389
|
groupedSuiteResult.status = _status.default.FAILED;
|
|
482
390
|
} else if (currentSuiteResult.cases.some(c => c.status === _status.default.WARNING)) {
|
|
@@ -486,29 +394,23 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
486
394
|
}
|
|
487
395
|
}
|
|
488
396
|
}
|
|
489
|
-
|
|
490
397
|
const groupedResultsList = Object.keys(groupedResults).map(groupKey => {
|
|
491
398
|
const groupedResult = groupedResults[groupKey];
|
|
492
|
-
|
|
493
399
|
if (!groupedResult._suitesHash) {
|
|
494
400
|
return groupedResult;
|
|
495
401
|
}
|
|
496
|
-
|
|
497
402
|
groupedResult.suites = [...groupedResult.suites, ...Object.keys(groupedResult._suitesHash).map(suiteGroupKey => groupedResult._suitesHash[suiteGroupKey])];
|
|
498
403
|
const firstFailedSuite = groupedResult.suites.find(s => s.status === _status.default.FAILED);
|
|
499
|
-
|
|
500
404
|
if (firstFailedSuite) {
|
|
501
405
|
groupedResult.status = _status.default.FAILED;
|
|
502
406
|
groupedResult.failure = firstFailedSuite.failure || groupedResult.failure;
|
|
503
407
|
} else {
|
|
504
408
|
const firstSuiteWithWarning = groupedResult.suites.find(s => s.status === _status.default.WARNING);
|
|
505
|
-
|
|
506
409
|
if (firstSuiteWithWarning) {
|
|
507
410
|
groupedResult.status = _status.default.WARNING;
|
|
508
411
|
groupedResult.failure = firstSuiteWithWarning.failure || groupedResult.failure;
|
|
509
412
|
}
|
|
510
413
|
}
|
|
511
|
-
|
|
512
414
|
delete groupedResult['_suitesHash'];
|
|
513
415
|
return groupedResult;
|
|
514
416
|
});
|
|
@@ -517,23 +419,19 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
517
419
|
this.validateResult(results);
|
|
518
420
|
return results;
|
|
519
421
|
}
|
|
520
|
-
|
|
521
422
|
recalculateResultForStatus(results) {
|
|
522
423
|
return results.map(result => {
|
|
523
424
|
if (result && result.suites && Array.isArray(result.suites) && result.suites.length > 0) {
|
|
524
425
|
const failed = result.suites.find(suite => suite.status === _status.default.FAILED);
|
|
525
|
-
|
|
526
426
|
if (failed) {
|
|
527
427
|
result.status = _status.default.FAILED;
|
|
528
428
|
} else if (result.suites.find(suite => suite.status === _status.default.WARNING)) {
|
|
529
429
|
result.status = _status.default.WARNING;
|
|
530
430
|
}
|
|
531
431
|
}
|
|
532
|
-
|
|
533
432
|
return result;
|
|
534
433
|
});
|
|
535
434
|
}
|
|
536
|
-
|
|
537
435
|
validateResult(results) {
|
|
538
436
|
const uniqueSuitesIterationIds = [];
|
|
539
437
|
results.map(result => {
|
|
@@ -546,12 +444,10 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
546
444
|
});
|
|
547
445
|
});
|
|
548
446
|
}
|
|
549
|
-
|
|
550
447
|
async _invokeReportersHook(hookName, eventArgs) {
|
|
551
448
|
if (!Array.isArray(this.reporters) || this.reporters.length == 0) {
|
|
552
449
|
return false;
|
|
553
450
|
}
|
|
554
|
-
|
|
555
451
|
for (let reporter of this.reporters) {
|
|
556
452
|
if (reporter[hookName]) {
|
|
557
453
|
try {
|
|
@@ -562,24 +458,18 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
562
458
|
}
|
|
563
459
|
}
|
|
564
460
|
}
|
|
565
|
-
|
|
566
461
|
async _saveTestCaseVideoAttachment(caseResult) {
|
|
567
462
|
if (!caseResult || !caseResult.attachments || !caseResult.attachments.length) {
|
|
568
463
|
return;
|
|
569
464
|
}
|
|
570
|
-
|
|
571
465
|
const attachmentsToRemove = [];
|
|
572
|
-
|
|
573
466
|
for (let i = 0; i < caseResult.attachments.length; i++) {
|
|
574
467
|
const attachment = caseResult.attachments[i];
|
|
575
|
-
|
|
576
468
|
if (!attachment._url) {
|
|
577
469
|
continue;
|
|
578
470
|
}
|
|
579
|
-
|
|
580
471
|
try {
|
|
581
472
|
const videoFilePath = await _util.default.downloadVideo(attachment.fileName, attachment._url, this.options);
|
|
582
|
-
|
|
583
473
|
if (!videoFilePath) {
|
|
584
474
|
attachmentsToRemove.push(attachment);
|
|
585
475
|
} else {
|
|
@@ -591,17 +481,13 @@ class ReportAggregator extends _events.EventEmitter {
|
|
|
591
481
|
attachmentsToRemove.push(attachment);
|
|
592
482
|
}
|
|
593
483
|
}
|
|
594
|
-
|
|
595
484
|
for (let i = 0; i < attachmentsToRemove.length; i++) {
|
|
596
485
|
const elmIndexToRemove = caseResult.attachments.indexOf(attachmentsToRemove[i]);
|
|
597
|
-
|
|
598
486
|
if (!elmIndexToRemove > -1) {
|
|
599
487
|
caseResult.attachments.splice(elmIndexToRemove, 1);
|
|
600
488
|
}
|
|
601
489
|
}
|
|
602
490
|
}
|
|
603
|
-
|
|
604
491
|
}
|
|
605
|
-
|
|
606
492
|
exports.default = ReportAggregator;
|
|
607
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZXBvcnRlci9SZXBvcnRBZ2dyZWdhdG9yLmpzIl0sIm5hbWVzIjpbIlJlcG9ydGVycyIsImpzb24iLCJKc29uUmVwb3J0ZXIiLCJqdW5pdCIsIkpVbml0UmVwb3J0ZXIiLCJodG1sIiwiSHRtbFJlcG9ydGVyIiwiZXhjZWwiLCJFeGNlbFJlcG9ydGVyIiwicGRmIiwiUGRmUmVwb3J0ZXIiLCJ4bWwiLCJYbWxSZXBvcnRlciIsIkRFRkFVTFRfVEVTVF9OQU1FIiwiREVGQVVMVF9SRVBPUlRFUlMiLCJSZXBvcnRBZ2dyZWdhdG9yIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJvcHRpb25zIiwicmVzdWx0cyIsInJ1bm5lckVuZFByb21pc2VzIiwiZ2V0RXhpdENvZGUiLCJleGl0Q29kZSIsIkFycmF5IiwiaXNBcnJheSIsImxlbmd0aCIsInRlc3RGYWlsZGVkIiwiZmluZCIsIml0ZW0iLCJzdGF0dXMiLCJpbml0IiwiX294aWRlIiwiZGVmYXVsdCIsIlJlcG9ydFBvcnRhbFJlcG9ydGVyIiwicnAiLCJyZXBvcnRlcnMiLCJnZW5lcmFsUmVwb3J0aW5nT3B0cyIsInJlcG9ydGluZyIsInJlcG9ydGVyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVwb3J0ZXJOYW1lIiwibmFtZSIsInJlcG9ydGVyT3B0cyIsInVuZGVmaW5lZCIsImVuYWJsZWQiLCJlcnIiLCJjb25zb2xlIiwibG9nIiwibWVzc2FnZSIsInB1c2giLCJnZXRSZXN1bHRzIiwiZ2VuZXJhdGVSZXBvcnRzIiwiZ3JvdXBlZFJlc3VsdHMiLCJncm91cFJlc3VsdHMiLCJyZXBvcnRQYXRoIiwiZ2VuZXJhdGUiLCJlIiwiZXJyb3IiLCJ3YWl0Rm9yUmVzdWx0IiwicmlkIiwid2FpdEZvclJlc3VsdHMiLCJQcm9taXNlIiwiYWxsIiwib25MYXVuY2hTdGFydCIsImV2ZW50QXJncyIsIl9pbnZva2VSZXBvcnRlcnNIb29rIiwib25MYXVuY2hFbmQiLCJlbWl0Iiwib25SdW5uZXJTdGFydCIsIm9wdHMiLCJjYXBzIiwiRXJyb3IiLCJ0ZXN0UmVzdWx0IiwiVGVzdFJlc3VsdCIsInN0YXJ0VGltZSIsIm94dXRpbCIsImdldFRpbWVTdGFtcCIsImNhcGFiaWxpdGllcyIsImVudmlyb25tZW50IiwiZW52VmFycyIsIm9uUnVubmVyRW5kIiwiZmluYWxSZXN1bHQiLCJmYXRhbEVycm9yIiwieCIsImVuZFRpbWUiLCJkdXJhdGlvbiIsIl9kZXRlcm1pbmVUZXN0U3RhdHVzQnlTdWl0ZXMiLCJTdGF0dXMiLCJGQUlMRUQiLCJmYWlsdXJlIiwiZXJyb3JIZWxwZXIiLCJnZXRGYWlsdXJlRnJvbUVycm9yIiwiX2dldEZpcnN0RmFpbHVyZSIsInR5cGUiLCJsb2NhdGlvbiIsInRvVXBwZXJDYXNlIiwicmVzdWx0IiwicHJvY2VzcyIsIm5leHRUaWNrIiwicmVzb2x2ZSIsImhhc0ZhaWxlZFN1aXRlcyIsInN1aXRlcyIsInNvbWUiLCJoYXNXYXJuaW5nU3VpdGVzIiwiV0FSTklORyIsImFsbFN1aXRlc1NraXBwZWQiLCJldmVyeSIsIlNLSVBQRUQiLCJQQVNTRUQiLCJvbkl0ZXJhdGlvblN0YXJ0IiwiaXRlcmF0aW9uIiwic3RhcnQiLCJtc2ciLCJvbkxvZ0VudHJ5Iiwib25JdGVyYXRpb25FbmQiLCJpdGVyYXRpb25OdW0iLCJvblN1aXRlU3RhcnQiLCJzdWl0ZUlkIiwic3VpdGUiLCJvblN1aXRlRW5kIiwic3VpdGVSZXN1bHQiLCJvbkNhc2VTdGFydCIsInN1aXRlUmVmSWQiLCJjYXNlSWQiLCJjYXNlRGVmIiwiY2FzZSIsIm9uQ2FzZUVuZCIsImNhc2VSZXN1bHQiLCJfc2F2ZVRlc3RDYXNlVmlkZW9BdHRhY2htZW50Iiwib25TdGVwU3RhcnQiLCJzdGVwIiwicm9vdFBhdGgiLCJmcmFtZXdvcmsiLCJmdWxsUGF0aCIsInBhdGgiLCJvblN0ZXBFbmQiLCJzdGVwUmVzdWx0IiwidGltZSIsImxldmVsIiwic3JjIiwic3RlcElkIiwiRGF0ZSIsIm5vdyIsImNhc2VzIiwic3RlcHMiLCJ1bmdyb3VwZWRSZXN1bHRzIiwiX2dyb3VwUmVzdWx0IiwicmVzdWx0S2V5Iiwic3VpdGVLZXkiLCJncm91cGVkUmVzdWx0IiwiTWF0aCIsIm1pbiIsIm1heCIsImN1cnJlbnRTdWl0ZVJlc3VsdCIsImdyb3VwS2V5IiwiZ3JvdXBlZFN1aXRlUmVzdWx0IiwiX3N1aXRlc0hhc2giLCJjIiwiZ3JvdXBlZFJlc3VsdHNMaXN0Iiwia2V5cyIsIm1hcCIsInN1aXRlR3JvdXBLZXkiLCJmaXJzdEZhaWxlZFN1aXRlIiwicyIsImZpcnN0U3VpdGVXaXRoV2FybmluZyIsInJlY2FsY3VsYXRlUmVzdWx0Rm9yU3RhdHVzIiwidmFsaWRhdGVSZXN1bHQiLCJmYWlsZWQiLCJ1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMiLCJpbmNsdWRlcyIsIndhcm4iLCJob29rTmFtZSIsImF0dGFjaG1lbnRzIiwiYXR0YWNobWVudHNUb1JlbW92ZSIsImkiLCJhdHRhY2htZW50IiwiX3VybCIsInZpZGVvRmlsZVBhdGgiLCJkb3dubG9hZFZpZGVvIiwiZmlsZU5hbWUiLCJmaWxlUGF0aCIsImVsbUluZGV4VG9SZW1vdmUiLCJpbmRleE9mIiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFZQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7QUFFQSxNQUFNQSxTQUFTLEdBQUc7QUFDZEMsRUFBQUEsSUFBSSxFQUFFQyxxQkFEUTtBQUVkQyxFQUFBQSxLQUFLLEVBQUVDLHNCQUZPO0FBR2RDLEVBQUFBLElBQUksRUFBRUMscUJBSFE7QUFJZEMsRUFBQUEsS0FBSyxFQUFFQyxzQkFKTztBQUtkQyxFQUFBQSxHQUFHLEVBQUVDLG9CQUxTO0FBTWRDLEVBQUFBLEdBQUcsRUFBRUM7QUFOUyxDQUFsQjtBQVNBLE1BQU1DLGlCQUFpQixHQUFHLGFBQTFCO0FBQ0EsTUFBTUMsaUJBQWlCLEdB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QUtqSyxPQUFoRSxDQURWOztBQUVBLFlBQUksQ0FBQ2tLLGFBQUwsRUFBb0I7QUFDaEJKLFVBQUFBLG1CQUFtQixDQUFDNUgsSUFBcEIsQ0FBeUI4SCxVQUF6QjtBQUNILFNBRkQsTUFHSztBQUNEQSxVQUFBQSxVQUFVLENBQUNLLFFBQVgsR0FBc0JILGFBQXRCO0FBQ0EsaUJBQU9GLFVBQVUsQ0FBQyxNQUFELENBQWpCO0FBQ0g7QUFDSixPQVZELENBV0EsT0FBT3ZILENBQVAsRUFBVTtBQUNOVixRQUFBQSxPQUFPLENBQUM0SCxJQUFSLENBQWEsaUNBQWIsRUFBZ0RsSCxDQUFDLENBQUNSLE9BQWxEO0FBQ0E2SCxRQUFBQSxtQkFBbUIsQ0FBQzVILElBQXBCLENBQXlCOEgsVUFBekI7QUFDSDtBQUNKOztBQUVELFNBQUssSUFBSUQsQ0FBQyxHQUFDLENBQVgsRUFBY0EsQ0FBQyxHQUFFRCxtQkFBbUIsQ0FBQ3ZKLE1BQXJDLEVBQTZDd0osQ0FBQyxFQUE5QyxFQUFrRDtBQUM5QyxZQUFNTyxnQkFBZ0IsR0FBR3RELFVBQVUsQ0FBQzZDLFdBQVgsQ0FBdUJVLE9BQXZCLENBQStCVCxtQkFBbUIsQ0FBQ0MsQ0FBRCxDQUFsRCxDQUF6Qjs7QUFDQSxVQUFJLENBQUNPLGdCQUFELEdBQW9CLENBQUMsQ0FBekIsRUFBNEI7QUFDeEJ0RCxRQUFBQSxVQUFVLENBQUM2QyxXQUFYLENBQXVCVyxNQUF2QixDQUE4QkYsZ0JBQTlCLEVBQWdELENBQWhEO0FBQ0g7QUFDSjtBQUNKOztBQTNoQnNEIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChDKSAyMDE1LXByZXNlbnQgQ2xvdWRCZWF0IExpbWl0ZWRcclxuICpcclxuICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnlcclxuICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnlcclxuICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3JcclxuICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cclxuICovXHJcblxyXG4vKlxyXG4gKiBSZXBvcnQgYWdncmVnYXRvclxyXG4gKi9cclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnZXZlbnRzJztcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XHJcbmltcG9ydCBUZXN0UmVzdWx0IGZyb20gJy4uL21vZGVsL3Rlc3QtcmVzdWx0JztcclxuaW1wb3J0IG94dXRpbCBmcm9tICcuLi9saWIvdXRpbCc7XHJcbmltcG9ydCB7IGRlZmVyIH0gZnJvbSAnd2hlbic7XHJcblxyXG4vLyBpbXBvcnQgYWxsIGJ1aWx0LWluIHJlcG9ydGVyc1xyXG5pbXBvcnQgSnNvblJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1qc29uJztcclxuaW1wb3J0IEpVbml0UmVwb3J0ZXIgZnJvbSAnLi4vb3hfcmVwb3J0ZXJzL3JlcG9ydGVyLWp1bml0JztcclxuaW1wb3J0IEh0bWxSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItaHRtbCc7XHJcbmltcG9ydCBFeGNlbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci1leGNlbCc7XHJcbmltcG9ydCBQZGZSZXBvcnRlciBmcm9tICcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcGRmJztcclxuaW1wb3J0IFhtbFJlcG9ydGVyIGZyb20gJy4uL294X3JlcG9ydGVycy9yZXBvcnRlci14bWwnO1xyXG5pbXBvcnQgZXJyb3JIZWxwZXIgZnJvbSAnLi4vZXJyb3JzL2hlbHBlcic7XHJcbmltcG9ydCBTdGF0dXMgZnJvbSAnLi4vbW9kZWwvc3RhdHVzJztcclxuXHJcbmNvbnN0IFJlcG9ydGVycyA9IHtcclxuICAgIGpzb246IEpzb25SZXBvcnRlcixcclxuICAgIGp1bml0OiBKVW5pdFJlcG9ydGVyLFxyXG4gICAgaHRtbDogSHRtbFJlcG9ydGVyLFxyXG4gICAgZXhjZWw6IEV4Y2VsUmVwb3J0ZXIsXHJcbiAgICBwZGY6IFBkZlJlcG9ydGVyLFxyXG4gICAgeG1sOiBYbWxSZXBvcnRlcixcclxufTtcclxuXHJcbmNvbnN0IERFRkFVTFRfVEVTVF9OQU1FID0gJ094eWdlbiBUZXN0JztcclxuY29uc3QgREVGQVVMVF9SRVBPUlRFUlMgPSBbXTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlcG9ydEFnZ3JlZ2F0b3IgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xyXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucykge1xyXG4gICAgICAgIHN1cGVyKCk7XHJcbiAgICAgICAgLy8gcmVzdWx0cyBoYXNoIHRhYmxlIGJhc2VkIG9uIHJ1bm5lciBpZCBrZXlcclxuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcclxuICAgICAgICAvLyBhIGhhc2ggbGlzdCBvZiBydW5uZXJFbmQgZXZlbnQgcHJvbWlzZXMsIGtleWVkIGJ5IHJ1bm5lciBpZFxyXG4gICAgICAgIHRoaXMucnVubmVyRW5kUHJvbWlzZXMgPSB7fTtcclxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEV4aXRDb2RlKCkge1xyXG4gICAgICAgIGxldCBleGl0Q29kZSA9IDA7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5yZXN1bHRzICYmXHJcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSAmJlxyXG4gICAgICAgICAgICB0aGlzLnJlc3VsdHMubGVuZ3RoID4gMFxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjb25zdCB0ZXN0RmFpbGRlZCA9IHRoaXMucmVzdWx0cy5maW5kKChpdGVtKSA9PiBpdGVtLnN0YXR1cyA9PT0gJ2ZhaWxlZCcpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRlc3RGYWlsZGVkKSB7XHJcbiAgICAgICAgICAgICAgICBleGl0Q29kZSA9IC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gc29tZXRoaW5nIGJyb2tlbiA/XHJcbiAgICAgICAgICAgIGV4aXRDb2RlID0gLTE7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZXhpdENvZGU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5fb3hpZGUpIHtcclxuICAgICAgICAgICAgY29uc3QgeyBkZWZhdWx0OiBSZXBvcnRQb3J0YWxSZXBvcnRlciB9ID0gYXdhaXQgaW1wb3J0KCcuLi9veF9yZXBvcnRlcnMvcmVwb3J0ZXItcnAnKTtcclxuICAgICAgICAgICAgUmVwb3J0ZXJzLnJwID0gUmVwb3J0UG9ydGFsUmVwb3J0ZXI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVwb3J0ZXJzID0gW107XHJcbiAgICAgICAgY29uc3QgZ2VuZXJhbFJlcG9ydGluZ09wdHMgPSB0aGlzLm9wdGlvbnMucmVwb3J0aW5nIHx8IHt9O1xyXG4gICAgICAgIGZvciAobGV0IHJlcG9ydGVyIG9mIGdlbmVyYWxSZXBvcnRpbmdPcHRzLnJlcG9ydGVycyB8fCBERUZBVUxUX1JFUE9SVEVSUykge1xyXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlcG9ydGVyICE9PSAnc3RyaW5nJyAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHJlcG9ydGVyLCAnbmFtZScpKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgcmVwb3J0ZXJzIHRoYXQgZG8gbm90IGhhdmUgJ25hbWUnIHByb3BlcnR5IGFzIGl0J3MgZXNzZW50aWFsIHRvIGxvYWQgdGhlIGNvcnJlc3BvbmRpbmcgUmVwb3J0ZXIgY2xhc3NcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRlck5hbWUgPSB0eXBlb2YgcmVwb3J0ZXIgPT09ICdzdHJpbmcnID8gcmVwb3J0ZXIgOiByZXBvcnRlci5uYW1lO1xyXG4gICAgICAgICAgICBjb25zdCByZXBvcnRlck9wdHMgPSB0eXBlb2YgcmVwb3J0ZXIgPT09ICdvYmplY3QnID8gcmVwb3J0ZXIgOiB1bmRlZmluZWQ7XHJcblxyXG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKFJlcG9ydGVycywgcmVwb3J0ZXJOYW1lKSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSWYgcmVwb3J0ZXIgXCJlbmFibGVkXCIgcHJvcGVydHkgaXMgXCJmYWxzZVwiIHRoZW4gc2tpcCB0aGUgcmVwb3J0ZXJcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRlck9wdHMgJiYgdHlwZW9mIHJlcG9ydGVyT3B0cy5lbmFibGVkID09PSAnYm9vbGVhbicgJiYgIXJlcG9ydGVyT3B0cy5lbmFibGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjb25zdCByZXBvcnRlciA9IG5ldyBSZXBvcnRlcnNbcmVwb3J0ZXJOYW1lXSh0aGlzLm9wdGlvbnMsIHJlcG9ydGVyT3B0cywgdGhpcyk7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcmVwb3J0ZXIgaGFzIFwiaW5pdFwiIGZ1bmN0aW9uLCB1c2UgaXQgdG8gaW5pdGlhbGl6ZSB0aGUgcmVwb3J0ZXJcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRlci5pbml0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVwb3J0ZXIuaW5pdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBcIiR7cmVwb3J0ZXJOYW1lfVwiIHJlcG9ydGVyOiAke2Vyci5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0ZXJzLnB1c2gocmVwb3J0ZXIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldFJlc3VsdHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVzdWx0cztcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBnZW5lcmF0ZVJlcG9ydHMoKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVwb3J0ZXJzKSB8fCB0aGlzLnJlcG9ydGVycy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGdyb3VwZWRSZXN1bHRzID0gdGhpcy5ncm91cFJlc3VsdHMoKTtcclxuICAgICAgICBmb3IgKGxldCByZXBvcnRlciBvZiB0aGlzLnJlcG9ydGVycykge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgcmVwb3J0UGF0aCA9IGF3YWl0IHJlcG9ydGVyLmdlbmVyYXRlKGdyb3VwZWRSZXN1bHRzKTtcclxuICAgICAgICAgICAgICAgIGlmIChyZXBvcnRQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFlvdXIgcmVwb3J0IGlzIHJlYWR5OiAke3JlcG9ydFBhdGh9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlcG9ydCBnZW5lcmF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgd2FpdEZvclJlc3VsdChyaWQpIHtcclxuICAgICAgICBpZiAoIXJpZCB8fCAhdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JSZXN1bHRzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckVuZFByb21pc2VzICYmIHRoaXMucnVubmVyRW5kUHJvbWlzZXMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbCh0aGlzLnJ1bm5lckVuZFByb21pc2VzKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25MYXVuY2hTdGFydChvcHRpb25zKSB7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICBvcHRpb25zXHJcbiAgICAgICAgfTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkxhdW5jaFN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkxhdW5jaEVuZCgpIHtcclxuICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5ncm91cFJlc3VsdHMoKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJlc3VsdHNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbGF1bmNoOmVuZCcsIHJlc3VsdHMpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uTGF1bmNoRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblJ1bm5lclN0YXJ0KHJpZCwgb3B0cywgY2Fwcykge1xyXG4gICAgICAgIGlmICghcmlkKSB7XHJcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignXCJyaWRcIiBjYW5ub3QgYmUgZW1wdHkuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRlc3RSZXN1bHQgPSBuZXcgVGVzdFJlc3VsdCgpO1xyXG4gICAgICAgIHRlc3RSZXN1bHQucmlkID0gcmlkO1xyXG4gICAgICAgIHRlc3RSZXN1bHQubmFtZSA9IG9wdHMubmFtZSB8fCBERUZBVUxUX1RFU1RfTkFNRTtcclxuICAgICAgICB0ZXN0UmVzdWx0LnN0YXJ0VGltZSA9IG94dXRpbC5nZXRUaW1lU3RhbXAoKTtcclxuICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGNhcHM7XHJcbiAgICAgICAgdGVzdFJlc3VsdC5lbnZpcm9ubWVudCA9IG9wdHMuZW52VmFycyB8fCB7fTtcclxuICAgICAgICB0ZXN0UmVzdWx0Lm9wdGlvbnMgPSBvcHRzO1xyXG4gICAgICAgIHRoaXMucmVzdWx0cy5wdXNoKHRlc3RSZXN1bHQpO1xyXG4gICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBwcm9taXNlIGZvciBsYXRlciB0byBiZSByZXNvbHZlZCBvbiBydW5uZXI6ZW5kIGV2ZW50XHJcbiAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdID0gZGVmZXIoKTtcclxuICAgICAgICBjb25zb2xlLmxvZyhgVGVzdCAke3JpZH0gaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgb3B0cyxcclxuICAgICAgICAgICAgY2Fwc1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdydW5uZXI6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uUnVubmVyU3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uUnVubmVyRW5kKHJpZCwgZmluYWxSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0ID0gdGhpcy5yZXN1bHRzLmZpbmQoeCA9PiB4LnJpZCA9PT0gcmlkKTtcclxuICAgICAgICBpZiAodGVzdFJlc3VsdCkge1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LmVuZFRpbWUgPSBveHV0aWwuZ2V0VGltZVN0YW1wKCk7XHJcbiAgICAgICAgICAgIHRlc3RSZXN1bHQuZHVyYXRpb24gPSB0ZXN0UmVzdWx0LmVuZFRpbWUgLSB0ZXN0UmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIHRlc3Qgc3RhdHVzIGJhc2VkIG9uIHN1aXRlcyBzdGF0dXNlc1xyXG4gICAgICAgICAgICB0ZXN0UmVzdWx0LnN0YXR1cyA9IHRoaXMuX2RldGVybWluZVRlc3RTdGF0dXNCeVN1aXRlcyh0ZXN0UmVzdWx0LCBmYXRhbEVycm9yKTtcclxuICAgICAgICAgICAgLy8gdGVzdFJlc3VsdC5zdGF0dXMgPSBmYXRhbEVycm9yID8gU3RhdHVzLkZBSUxFRCA6ICh0ZXN0UmVzdWx0LnN1aXRlcy5zb21lKHggPT4geC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSA/IFN0YXR1cy5GQUlMRUQgOiBTdGF0dXMuUEFTU0VEO1xyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChmYXRhbEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gYXNzdW1lIHRoYXQgaWYgZmF0YWxFcnJvciBpcyBub3QgaW5oZXJpdGVkIGZyb20gRXJyb3IgY2xhc3MgdGhlbiB3ZSBhbHJlYWR5IGdvdCBPeHlnZW4gRmFpbHVyZSBvYmplY3RcclxuICAgICAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmZhaWx1cmUgPSBmYXRhbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckhlbHBlci5nZXRGYWlsdXJlRnJvbUVycm9yKGZhdGFsRXJyb3IpIDogZmF0YWxFcnJvcjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRlc3RSZXN1bHQuZmFpbHVyZSA9IHRoaXMuX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgJiYgZmluYWxSZXN1bHQuY2FwYWJpbGl0aWVzKSB7XHJcbiAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0LmNhcGFiaWxpdGllcyA9IGZpbmFsUmVzdWx0LmNhcGFiaWxpdGllcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGVzdFJlc3VsdC5mYWlsdXJlLnR5cGUgJiYgdGVzdFJlc3VsdC5mYWlsdXJlLmxvY2F0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfSBhdCAke3Rlc3RSZXN1bHQuZmFpbHVyZS5sb2NhdGlvbn0uYCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRlc3RSZXN1bHQuZmFpbHVyZS50eXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYEVycm9yOiAke3Rlc3RSZXN1bHQuZmFpbHVyZS50eXBlfWApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGVzdFJlc3VsdC5mYWlsdXJlID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFcnJvcjogJHt0ZXN0UmVzdWx0LmZhaWx1cmV9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFRlc3QgJHtyaWR9IGhhcyBmaW5pc2hlZCB3aXRoIHN0YXR1czogJHt0ZXN0UmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogdGVzdFJlc3VsdCxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgncnVubmVyOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25SdW5uZXJFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGlmICh0aGlzLnJ1bm5lckVuZFByb21pc2VzW3JpZF0pIHtcclxuICAgICAgICAgICAgLy8gY2FsbGluZyBuZXh0VGljaygpIHdpbGwgaGVscCB1cyB0byBpbnN1cmUgdGhhdCB3ZSByZXNvbHZlIHRoZSBwcm9taXNlIGFmdGVyIGVtaXQoJ3J1bm5lcjplbmQnKSBoYXMgY29tcGxldGVkXHJcbiAgICAgICAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5ydW5uZXJFbmRQcm9taXNlc1tyaWRdLnJlc29sdmUodGVzdFJlc3VsdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBfZGV0ZXJtaW5lVGVzdFN0YXR1c0J5U3VpdGVzKHRlc3RSZXN1bHQsIGZhdGFsRXJyb3IpIHtcclxuICAgICAgICBpZiAoZmF0YWxFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaGFzRmFpbGVkU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICBpZiAoaGFzRmFpbGVkU3VpdGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBoYXNXYXJuaW5nU3VpdGVzID0gdGVzdFJlc3VsdC5zdWl0ZXMuc29tZSh4ID0+IHguc3RhdHVzID09PSBTdGF0dXMuV0FSTklORyk7XHJcbiAgICAgICAgaWYgKGhhc1dhcm5pbmdTdWl0ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBhbGxTdWl0ZXNTa2lwcGVkID0gdGVzdFJlc3VsdC5zdWl0ZXMuZXZlcnkoeCA9PiB4LnN0YXR1cyA9PT0gU3RhdHVzLlNLSVBQRUQpO1xyXG4gICAgICAgIGlmIChhbGxTdWl0ZXNTa2lwcGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBTdGF0dXMuU0tJUFBFRDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFN0YXR1cy5QQVNTRUQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25JdGVyYXRpb25TdGFydChyaWQsIGl0ZXJhdGlvbiwgc3RhcnQpIHtcclxuICAgICAgICBpZiAoaXRlcmF0aW9uKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGAke3N0YXJ0fSBJdGVyYXRpb24gIyR7aXRlcmF0aW9ufSBzdGFydGVkLi4uYDtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cobXNnKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5vbkxvZ0VudHJ5KG51bGwsICdJTkZPJywgbXNnLCAndXNlcicpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvbkl0ZXJhdGlvbkVuZChyaWQsIHJlc3VsdCwgc3RhcnQpIHtcclxuICAgICAgICBpZiAocmVzdWx0Py5pdGVyYXRpb25OdW0gJiYgcmVzdWx0LnN0YXR1cz8udG9VcHBlckNhc2UpIHtcclxuICAgICAgICAgICAgY29uc3QgbXNnID0gYCR7c3RhcnR9IEl0ZXJhdGlvbiAjJHtyZXN1bHQuaXRlcmF0aW9uTnVtfSBlbmRlZCB3aXRoIHN0YXR1czogJHtyZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCl9LmA7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1zZyk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMub25Mb2dFbnRyeShudWxsLCAnSU5GTycsIG1zZywgJ3VzZXInKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZVN0YXJ0KHJpZCwgc3VpdGVJZCwgc3VpdGUpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgU3VpdGUgXCIke3N1aXRlLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBsZXQgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQ6IHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlOiBzdWl0ZSxcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnc3VpdGU6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3VpdGVTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25TdWl0ZUVuZChyaWQsIHN1aXRlSWQsIHN1aXRlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdCA9IHRoaXMucmVzdWx0cy5maW5kKHggPT4geC5yaWQgPT09IHJpZCk7XHJcbiAgICAgICAgaWYgKCF0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGVzdFJlc3VsdC5zdWl0ZXMucHVzaChzdWl0ZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc29sZS5sb2coYFN1aXRlIFwiJHtzdWl0ZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtzdWl0ZVJlc3VsdC5zdGF0dXMudG9VcHBlckNhc2UoKX0uYCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHJlc3VsdDogc3VpdGVSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N1aXRlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25TdWl0ZUVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlU3RhcnQocmlkLCBzdWl0ZUlkLCBzdWl0ZVJlZklkLCBjYXNlSWQsIGNhc2VEZWYpIHtcclxuICAgICAgICBjb25zb2xlLmxvZyhgLSBDYXNlIFwiJHtjYXNlRGVmLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHJpZCxcclxuICAgICAgICAgICAgc3VpdGVJZCxcclxuICAgICAgICAgICAgc3VpdGVSZWZJZCxcclxuICAgICAgICAgICAgY2FzZUlkLFxyXG4gICAgICAgICAgICBjYXNlOiBjYXNlRGVmLFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOnN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvbkNhc2VTdGFydCcsIGV2ZW50QXJncyk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgb25DYXNlRW5kKHJpZCwgc3VpdGVJZCwgc3VpdGVSZWZJZCwgY2FzZUlkLCBjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coYC0gQ2FzZSBcIiR7Y2FzZVJlc3VsdC5uYW1lfVwiIGhhcyBlbmRlZCB3aXRoIHN0YXR1czogJHtjYXNlUmVzdWx0LnN0YXR1cy50b1VwcGVyQ2FzZSgpfS5gKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9zYXZlVGVzdENhc2VWaWRlb0F0dGFjaG1lbnQoY2FzZVJlc3VsdCk7XHJcbiAgICAgICAgY29uc3QgZXZlbnRBcmdzID0ge1xyXG4gICAgICAgICAgICByaWQsXHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIHN1aXRlUmVmSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgcmVzdWx0OiBjYXNlUmVzdWx0LFxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5lbWl0KCdjYXNlOmVuZCcsIGV2ZW50QXJncyk7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5faW52b2tlUmVwb3J0ZXJzSG9vaygnb25DYXNlRW5kJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBTdGFydChyaWQsIHN1aXRlSWQsIGNhc2VJZCwgc3RlcCkge1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwLm5hbWV9XCIgaGFzIHN0YXJ0ZWQuLi5gKTtcclxuICAgICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5yb290UGF0aCAmJiB0aGlzLm9wdGlvbnMuZnJhbWV3b3JrICYmIHRoaXMub3B0aW9ucy5mcmFtZXdvcmsgPT09ICdjdWN1bWJlcicpIHtcclxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBwYXRoLnJlc29sdmUodGhpcy5vcHRpb25zLnJvb3RQYXRoLCBzdGVwLmxvY2F0aW9uKTtcclxuICAgICAgICAgICAgc3RlcC5sb2NhdGlvbiA9IGZ1bGxQYXRoKyc6MSc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXAsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6c3RhcnQnLCBldmVudEFyZ3MpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uU3RlcFN0YXJ0JywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBvblN0ZXBFbmQocmlkLCBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBSZXN1bHQpIHtcclxuICAgICAgICAvL2NvbnN0IHN0YXR1cyA9IHN0ZXBSZXN1bHQuc3RhdHVzLnRvVXBwZXJDYXNlKCk7XHJcbiAgICAgICAgLy9jb25zdCBkdXJhdGlvbiA9IHN0ZXBSZXN1bHQuZHVyYXRpb24gPyAoc3RlcFJlc3VsdC5kdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMikgOiAwO1xyXG4gICAgICAgIC8vY29uc29sZS5sb2coYCAgLSBTdGVwIFwiJHtzdGVwUmVzdWx0Lm5hbWV9XCIgaGFzIGVuZGVkIGluICR7ZHVyYXRpb259cyB3aXRoIHN0YXR1czogJHtzdGF0dXN9LmApO1xyXG4gICAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHtcclxuICAgICAgICAgICAgcmlkLFxyXG4gICAgICAgICAgICBzdWl0ZUlkLFxyXG4gICAgICAgICAgICBjYXNlSWQsXHJcbiAgICAgICAgICAgIHN0ZXA6IHN0ZXBSZXN1bHQsXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmVtaXQoJ3N0ZXA6ZW5kJywgZXZlbnRBcmdzKTtcclxuICAgICAgICBhd2FpdCB0aGlzLl9pbnZva2VSZXBvcnRlcnNIb29rKCdvblN0ZXBFbmQnLCBldmVudEFyZ3MpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uTG9nRW50cnkodGltZSwgbGV2ZWwsIG1zZywgc3JjID0gbnVsbCwgeyBzdWl0ZUlkLCBjYXNlSWQsIHN0ZXBJZCB9ID0ge30pIHtcclxuICAgICAgICBjb25zdCBldmVudEFyZ3MgPSB7XHJcbiAgICAgICAgICAgIHN1aXRlSWQsXHJcbiAgICAgICAgICAgIGNhc2VJZCxcclxuICAgICAgICAgICAgc3RlcElkLFxyXG4gICAgICAgICAgICBsZXZlbCxcclxuICAgICAgICAgICAgbXNnLFxyXG4gICAgICAgICAgICB0aW1lLFxyXG4gICAgICAgICAgICBzcmNcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuZW1pdCgnbG9nJywgZXZlbnRBcmdzKTtcclxuXHJcbiAgICAgICAgaWYgKCF0aW1lKSB7XHJcbiAgICAgICAgICAgIGV2ZW50QXJncy50aW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuX2ludm9rZVJlcG9ydGVyc0hvb2soJ29uTG9nJywgZXZlbnRBcmdzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGZhaWx1cmUgb2JqZWN0IGluIG9uZSBvZiB0ZXN0IHJlc3VsdCdzIGVudGl0aWVzLiBcclxuICAgICAqIEBwYXJhbSB7VGVzdFJlc3VsdH0gdGVzdFJlc3VsdCBcclxuICAgICAqL1xyXG4gICAgX2dldEZpcnN0RmFpbHVyZSh0ZXN0UmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKHRlc3RSZXN1bHQuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgIGlmICh0ZXN0UmVzdWx0LmZhaWx1cmUpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0ZXN0UmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZm9yIChsZXQgc3VpdGVSZXN1bHQgb2YgdGVzdFJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5zdGF0dXMgIT09IFN0YXR1cy5GQUlMRUQpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGlmIChzdWl0ZVJlc3VsdC5mYWlsdXJlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1aXRlUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjYXNlUmVzdWx0IG9mIHN1aXRlUmVzdWx0LmNhc2VzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN1aXRlUmVzdWx0LnN0YXR1cyAhPT0gU3RhdHVzLkZBSUxFRCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNhc2VSZXN1bHQuZmFpbHVyZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FzZVJlc3VsdC5mYWlsdXJlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdGVwUmVzdWx0IG9mIGNhc2VSZXN1bHQuc3RlcHMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBSZXN1bHQuc3RhdHVzICE9PSBTdGF0dXMuRkFJTEVEKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFJlc3VsdC5mYWlsdXJlIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIGdyb3VwUmVzdWx0cygpIHtcclxuICAgICAgICBjb25zdCBncm91cGVkUmVzdWx0cyA9IHt9O1xyXG4gICAgICAgIGNvbnN0IHVuZ3JvdXBlZFJlc3VsdHMgPSBbXTtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5yZXN1bHRzKSB8fCB0aGlzLnJlc3VsdHMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IgKGxldCByZXN1bHQgb2YgdGhpcy5yZXN1bHRzKSB7XHJcbiAgICAgICAgICAgIGlmICghcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0IHx8ICFyZXN1bHQub3B0aW9ucy5fZ3JvdXBSZXN1bHQucmVzdWx0S2V5KSB7XHJcbiAgICAgICAgICAgICAgICB1bmdyb3VwZWRSZXN1bHRzLnB1c2gocmVzdWx0KTtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEtleSA9IHJlc3VsdC5vcHRpb25zLl9ncm91cFJlc3VsdC5yZXN1bHRLZXk7XHJcbiAgICAgICAgICAgIGNvbnN0IHN1aXRlS2V5ID0gcmVzdWx0Lm9wdGlvbnMuX2dyb3VwUmVzdWx0LnN1aXRlS2V5O1xyXG4gICAgICAgICAgICBsZXQgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV07XHJcbiAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW3Jlc3VsdEtleV0gPSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LFxyXG4gICAgICAgICAgICAgICAgICAgIHN1aXRlczogW10sXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgaWYgKHN1aXRlS2V5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGFydFRpbWUgPSBNYXRoLm1pbihncm91cGVkUmVzdWx0LnN0YXJ0VGltZSwgcmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0LmVuZFRpbWUgPSBNYXRoLm1heChncm91cGVkUmVzdWx0LmVuZFRpbWUsIHJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZHVyYXRpb24gPSBncm91cGVkUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkUmVzdWx0LnN0YXJ0VGltZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBpZiBncm91cGluZyBpcyBieSByZXN1bHQgb25seSwgdGhlbiBqdXN0IGFwcGVuZCBjdXJyZW50IHJlc3VsdCdzIHN1aXRlcyB0byB0aGUgZ3JvdXAncyBzdWl0ZXNcclxuICAgICAgICAgICAgaWYgKCFzdWl0ZUtleSkge1xyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0LnN1aXRlc1xyXG4gICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3VycmVudFN1aXRlUmVzdWx0IG9mIHJlc3VsdC5zdWl0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cEtleSA9IGAke3N1aXRlS2V5fS0ke2N1cnJlbnRTdWl0ZVJlc3VsdC5pdGVyYXRpb25OdW19YDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cGVkU3VpdGVSZXN1bHQgPSBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWdyb3VwZWRTdWl0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkUmVzdWx0Ll9zdWl0ZXNIYXNoW2dyb3VwS2V5XSA9IHsgLi4uY3VycmVudFN1aXRlUmVzdWx0IH07XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lID0gTWF0aC5taW4oZ3JvdXBlZFN1aXRlUmVzdWx0LnN0YXJ0VGltZSwgY3VycmVudFN1aXRlUmVzdWx0LnN0YXJ0VGltZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5lbmRUaW1lID0gTWF0aC5tYXgoZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUsIGN1cnJlbnRTdWl0ZVJlc3VsdC5lbmRUaW1lKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFN1aXRlUmVzdWx0LmR1cmF0aW9uID0gZ3JvdXBlZFN1aXRlUmVzdWx0LmVuZFRpbWUgLSBncm91cGVkU3VpdGVSZXN1bHQuc3RhcnRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5ncm91cGVkU3VpdGVSZXN1bHQuY2FzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5jdXJyZW50U3VpdGVSZXN1bHQuY2FzZXNcclxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWl0ZVJlc3VsdC5jYXNlcy5zb21lKGMgPT4gYy5zdGF0dXMgPT09IFN0YXR1cy5GQUlMRUQpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cGVkU3VpdGVSZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50U3VpdGVSZXN1bHQuY2FzZXMuc29tZShjID0+IGMuc3RhdHVzID09PSBTdGF0dXMuV0FSTklORykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRTdWl0ZVJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuV0FSTklORztcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBjb252ZXJ0IGdyb3VwZWQgcmVzdWx0cyBoYXNoIHRvIGFuIGFycmF5XHJcbiAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdHNMaXN0ID0gT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdHMpLm1hcChcclxuICAgICAgICAgICAgZ3JvdXBLZXkgPT4ge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IGdyb3VwZWRSZXN1bHRzW2dyb3VwS2V5XTtcclxuICAgICAgICAgICAgICAgIGlmICghZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdWl0ZXMgPSBbXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uZ3JvdXBlZFJlc3VsdC5zdWl0ZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaCkubWFwKHN1aXRlR3JvdXBLZXkgPT4gZ3JvdXBlZFJlc3VsdC5fc3VpdGVzSGFzaFtzdWl0ZUdyb3VwS2V5XSlcclxuICAgICAgICAgICAgICAgIF07XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdEZhaWxlZFN1aXRlID0gZ3JvdXBlZFJlc3VsdC5zdWl0ZXMuZmluZChzID0+IHMuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmaXJzdEZhaWxlZFN1aXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBlZFJlc3VsdC5zdGF0dXMgPSBTdGF0dXMuRkFJTEVEO1xyXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0RmFpbGVkU3VpdGUuZmFpbHVyZSB8fCBncm91cGVkUmVzdWx0LmZhaWx1cmU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFN1aXRlV2l0aFdhcm5pbmcgPSBncm91cGVkUmVzdWx0LnN1aXRlcy5maW5kKHMgPT4gcy5zdGF0dXMgPT09IFN0YXR1cy5XQVJOSU5HKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RTdWl0ZVdpdGhXYXJuaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuc3RhdHVzID0gU3RhdHVzLldBUk5JTkc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwZWRSZXN1bHQuZmFpbHVyZSA9IGZpcnN0U3VpdGVXaXRoV2FybmluZy5mYWlsdXJlIHx8IGdyb3VwZWRSZXN1bHQuZmFpbHVyZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBkZWxldGUgZ3JvdXBlZFJlc3VsdFsnX3N1aXRlc0hhc2gnXTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBncm91cGVkUmVzdWx0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgcmVzdWx0cyA9IFsuLi5ncm91cGVkUmVzdWx0c0xpc3QsIC4uLnVuZ3JvdXBlZFJlc3VsdHNdO1xyXG4gICAgICAgIC8vIGNoYW5nZSByZXN1bHRzIHN0YXR1cyB0byBmYWlkZWQgaWYgZmFpbGVkIHN1aXRlcyBhcmUgZmluZGVkXHJcbiAgICAgICAgcmVzdWx0cyA9IHRoaXMucmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cyk7XHJcblxyXG4gICAgICAgIHRoaXMudmFsaWRhdGVSZXN1bHQocmVzdWx0cyk7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmVjYWxjdWxhdGVSZXN1bHRGb3JTdGF0dXMocmVzdWx0cykge1xyXG4gICAgICAgIHJldHVybiByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgICAgIHJlc3VsdCAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcyAmJlxyXG4gICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQuc3VpdGVzKSAmJlxyXG4gICAgICAgICAgICAgICAgcmVzdWx0LnN1aXRlcy5sZW5ndGggPiAwXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZmFpbGVkID0gcmVzdWx0LnN1aXRlcy5maW5kKChzdWl0ZSkgPT4gc3VpdGUuc3RhdHVzID09PSBTdGF0dXMuRkFJTEVEKTtcclxuICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RhdHVzID0gU3RhdHVzLkZBSUxFRDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdC5zdWl0ZXMuZmluZCgoc3VpdGUpID0+IHN1aXRlLnN0YXR1cyA9PT0gU3RhdHVzLldBUk5JTkcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnN0YXR1cyA9IFN0YXR1cy5XQVJOSU5HO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhbGlkYXRlUmVzdWx0KHJlc3VsdHMpIHtcclxuICAgICAgICBjb25zdCB1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMgPSBbXTtcclxuICAgICAgICByZXN1bHRzLm1hcCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgIHJlc3VsdC5zdWl0ZXMubWFwKChzdWl0ZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHVuaXF1ZVN1aXRlc0l0ZXJhdGlvbklkcy5pbmNsdWRlcyhzdWl0ZS5pdGVyYXRpb25OdW0pKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdzdWl0ZS5pdGVyYXRpb25OdW0nLCBzdWl0ZS5pdGVyYXRpb25OdW0sICcgbm90IHVuaXF1ZScpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB1bmlxdWVTdWl0ZXNJdGVyYXRpb25JZHMucHVzaChzdWl0ZS5pdGVyYXRpb25OdW0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBfaW52b2tlUmVwb3J0ZXJzSG9vayhob29rTmFtZSwgZXZlbnRBcmdzKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMucmVwb3J0ZXJzKSB8fCB0aGlzLnJlcG9ydGVycy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvciAobGV0IHJlcG9ydGVyIG9mIHRoaXMucmVwb3J0ZXJzKSB7XHJcbiAgICAgICAgICAgIGlmIChyZXBvcnRlcltob29rTmFtZV0pIHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVwb3J0ZXJbaG9va05hbWVdKGV2ZW50QXJncyk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGludm9rZSByZXBvcnRlciBob29rIFwiJHtob29rTmFtZX1cIjogJHtlLm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgX3NhdmVUZXN0Q2FzZVZpZGVvQXR0YWNobWVudChjYXNlUmVzdWx0KSB7XHJcbiAgICAgICAgaWYgKCFjYXNlUmVzdWx0IHx8ICFjYXNlUmVzdWx0LmF0dGFjaG1lbnRzIHx8ICFjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzVG9SZW1vdmUgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpPTA7IGk8IGNhc2VSZXN1bHQuYXR0YWNobWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudCA9IGNhc2VSZXN1bHQuYXR0YWNobWVudHNbaV07XHJcbiAgICAgICAgICAgIGlmICghYXR0YWNobWVudC5fdXJsKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgdmlkZW9GaWxlUGF0aCA9XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgb3h1dGlsLmRvd25sb2FkVmlkZW8oYXR0YWNobWVudC5maWxlTmFtZSwgYXR0YWNobWVudC5fdXJsLCB0aGlzLm9wdGlvbnMpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCF2aWRlb0ZpbGVQYXRoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudHNUb1JlbW92ZS5wdXNoKGF0dGFjaG1lbnQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXR0YWNobWVudC5maWxlUGF0aCA9IHZpZGVvRmlsZVBhdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGF0dGFjaG1lbnRbJ191cmwnXTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gZG93bmxvYWQgdmlkZW8gZmlsZTogJywgZS5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGF0dGFjaG1lbnRzVG9SZW1vdmUucHVzaChhdHRhY2htZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLyByZW1vdmUgdmlkZW8gYXR0YWNobWVudHMgdGhhdCBjb3VsZG4ndCBiZSBkb3dubG9hZGVkXHJcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpPCBhdHRhY2htZW50c1RvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsbUluZGV4VG9SZW1vdmUgPSBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLmluZGV4T2YoYXR0YWNobWVudHNUb1JlbW92ZVtpXSk7XHJcbiAgICAgICAgICAgIGlmICghZWxtSW5kZXhUb1JlbW92ZSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlUmVzdWx0LmF0dGFjaG1lbnRzLnNwbGljZShlbG1JbmRleFRvUmVtb3ZlLCAxKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
|
|
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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
|