UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

573 lines 68 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); // ------------------------------------------------------------- // WARNING: this file is used by both the client and the server. // Do not use any browser or node-specific API! // ------------------------------------------------------------- const types_1 = require("../types"); // Base //-------------------------------------------------------------------- class TestRunErrorBase { constructor(code) { this.code = code; this.isTestCafeError = true; this.callsite = null; } } class ActionOptionErrorBase extends TestRunErrorBase { constructor(code, optionName, actualValue) { super(code); this.optionName = optionName; this.actualValue = actualValue; } } class ActionArgumentErrorBase extends TestRunErrorBase { constructor(code, argumentName, actualValue) { super(code); this.argumentName = argumentName; this.actualValue = actualValue; } } // Synchronization errors //-------------------------------------------------------------------- class MissingAwaitError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.missingAwaitError); this.callsite = callsite; } } exports.MissingAwaitError = MissingAwaitError; // Client function errors //-------------------------------------------------------------------- class ClientFunctionExecutionInterruptionError extends TestRunErrorBase { constructor(instantiationCallsiteName) { super(types_1.TEST_RUN_ERRORS.clientFunctionExecutionInterruptionError); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.ClientFunctionExecutionInterruptionError = ClientFunctionExecutionInterruptionError; class DomNodeClientFunctionResultError extends TestRunErrorBase { constructor(instantiationCallsiteName) { super(types_1.TEST_RUN_ERRORS.domNodeClientFunctionResultError); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.DomNodeClientFunctionResultError = DomNodeClientFunctionResultError; // Selector errors //-------------------------------------------------------------------- class SelectorErrorBase extends TestRunErrorBase { constructor(code, { apiFnChain, apiFnIndex }) { super(code); this.apiFnChain = apiFnChain; this.apiFnIndex = apiFnIndex; } } class InvalidSelectorResultError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.invalidSelectorResultError); } } exports.InvalidSelectorResultError = InvalidSelectorResultError; class CannotObtainInfoForElementSpecifiedBySelectorError extends SelectorErrorBase { constructor(callsite, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.cannotObtainInfoForElementSpecifiedBySelectorError, apiFnArgs); this.callsite = callsite; } } exports.CannotObtainInfoForElementSpecifiedBySelectorError = CannotObtainInfoForElementSpecifiedBySelectorError; // Page errors //-------------------------------------------------------------------- class PageLoadError extends TestRunErrorBase { constructor(errMsg, url) { super(types_1.TEST_RUN_ERRORS.pageLoadError); this.url = url; this.errMsg = errMsg; } } exports.PageLoadError = PageLoadError; // Uncaught errors //-------------------------------------------------------------------- class UncaughtErrorOnPage extends TestRunErrorBase { constructor(errStack, pageDestUrl) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorOnPage); this.errStack = errStack; this.pageDestUrl = pageDestUrl; } } exports.UncaughtErrorOnPage = UncaughtErrorOnPage; class UncaughtErrorInTestCode extends TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInTestCode); this.errMsg = String(err.rawMessage || err); this.callsite = err.callsite || callsite; this.originError = err; } } exports.UncaughtErrorInTestCode = UncaughtErrorInTestCode; class UncaughtNonErrorObjectInTestCode extends TestRunErrorBase { constructor(obj) { super(types_1.TEST_RUN_ERRORS.uncaughtNonErrorObjectInTestCode); this.objType = typeof obj; this.objStr = String(obj); } } exports.UncaughtNonErrorObjectInTestCode = UncaughtNonErrorObjectInTestCode; class UncaughtErrorInClientFunctionCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInClientFunctionCode); this.errMsg = String(err); this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInClientFunctionCode = UncaughtErrorInClientFunctionCode; class UncaughtErrorInCustomDOMPropertyCode extends TestRunErrorBase { constructor(instantiationCallsiteName, err, prop) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomDOMPropertyCode, err, prop); this.errMsg = String(err); this.property = prop; this.instantiationCallsiteName = instantiationCallsiteName; } } exports.UncaughtErrorInCustomDOMPropertyCode = UncaughtErrorInCustomDOMPropertyCode; class UnhandledPromiseRejectionError extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.unhandledPromiseRejection); this.errMsg = String(err); } } exports.UnhandledPromiseRejectionError = UnhandledPromiseRejectionError; class UncaughtExceptionError extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.uncaughtException); this.errMsg = String(err); } } exports.UncaughtExceptionError = UncaughtExceptionError; class UncaughtErrorInCustomClientScriptCode extends TestRunErrorBase { constructor(err) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCode); this.errMsg = String(err); } } exports.UncaughtErrorInCustomClientScriptCode = UncaughtErrorInCustomClientScriptCode; class UncaughtErrorInCustomClientScriptLoadedFromModule extends TestRunErrorBase { constructor(err, moduleName) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomClientScriptCodeLoadedFromModule); this.errMsg = String(err); this.moduleName = moduleName; } } exports.UncaughtErrorInCustomClientScriptLoadedFromModule = UncaughtErrorInCustomClientScriptLoadedFromModule; // Assertion errors //-------------------------------------------------------------------- class ExternalAssertionLibraryError extends TestRunErrorBase { constructor(err, callsite) { super(types_1.TEST_RUN_ERRORS.externalAssertionLibraryError); this.errMsg = String(err); this.callsite = callsite; } } exports.ExternalAssertionLibraryError = ExternalAssertionLibraryError; class AssertionExecutableArgumentError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.assertionExecutableArgumentError, argumentName, argumentValue); this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.AssertionExecutableArgumentError = AssertionExecutableArgumentError; class AssertionWithoutMethodCallError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionWithoutMethodCallError); this.callsite = callsite; } } exports.AssertionWithoutMethodCallError = AssertionWithoutMethodCallError; class AssertionUnawaitedPromiseError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.assertionUnawaitedPromiseError); this.callsite = callsite; } } exports.AssertionUnawaitedPromiseError = AssertionUnawaitedPromiseError; // Action parameters errors //-------------------------------------------------------------------- // Options errors class ActionIntegerOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionIntegerOptionError, optionName, actualValue); } } exports.ActionIntegerOptionError = ActionIntegerOptionError; class ActionPositiveIntegerOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerOptionError, optionName, actualValue); } } exports.ActionPositiveIntegerOptionError = ActionPositiveIntegerOptionError; class ActionBooleanOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionBooleanOptionError, optionName, actualValue); } } exports.ActionBooleanOptionError = ActionBooleanOptionError; class ActionBooleanArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionBooleanArgumentError, argumentName, actualValue); } } exports.ActionBooleanArgumentError = ActionBooleanArgumentError; class ActionSpeedOptionError extends ActionOptionErrorBase { constructor(optionName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionSpeedOptionError, optionName, actualValue); } } exports.ActionSpeedOptionError = ActionSpeedOptionError; class ActionOptionsTypeError extends TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.actionOptionsTypeError); this.actualType = actualType; } } exports.ActionOptionsTypeError = ActionOptionsTypeError; // Arguments errors class ActionStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringArgumentError, argumentName, actualValue); } } exports.ActionStringArgumentError = ActionStringArgumentError; class ActionNullableStringArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionNullableStringArgumentError, argumentName, actualValue); } } exports.ActionNullableStringArgumentError = ActionNullableStringArgumentError; class ActionIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionIntegerArgumentError, argumentName, actualValue); } } exports.ActionIntegerArgumentError = ActionIntegerArgumentError; class ActionRoleArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionRoleArgumentError, argumentName, actualValue); } } exports.ActionRoleArgumentError = ActionRoleArgumentError; class ActionPositiveIntegerArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionPositiveIntegerArgumentError, argumentName, actualValue); } } exports.ActionPositiveIntegerArgumentError = ActionPositiveIntegerArgumentError; class ActionStringOrStringArrayArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.actionStringOrStringArrayArgumentError, argumentName, actualValue); } } exports.ActionStringOrStringArrayArgumentError = ActionStringOrStringArrayArgumentError; class ActionStringArrayElementError extends ActionArgumentErrorBase { constructor(argumentName, actualValue, elementIndex) { super(types_1.TEST_RUN_ERRORS.actionStringArrayElementError, argumentName, actualValue); this.elementIndex = elementIndex; } } exports.ActionStringArrayElementError = ActionStringArrayElementError; class SetTestSpeedArgumentError extends ActionArgumentErrorBase { constructor(argumentName, actualValue) { super(types_1.TEST_RUN_ERRORS.setTestSpeedArgumentError, argumentName, actualValue); } } exports.SetTestSpeedArgumentError = SetTestSpeedArgumentError; class ActionUnsupportedDeviceTypeError extends ActionArgumentErrorBase { constructor(argumentName, argumentValue) { super(types_1.TEST_RUN_ERRORS.actionUnsupportedDeviceTypeError, argumentName, argumentValue); } } exports.ActionUnsupportedDeviceTypeError = ActionUnsupportedDeviceTypeError; // Selector errors class ActionSelectorError extends TestRunErrorBase { constructor(selectorName, err, isAPIError) { super(types_1.TEST_RUN_ERRORS.actionSelectorError); this.selectorName = selectorName; this.errMsg = isAPIError ? err.rawMessage : err.message; this.originError = err; } } exports.ActionSelectorError = ActionSelectorError; // Action execution errors //-------------------------------------------------------------------- class ActionElementNotFoundError extends SelectorErrorBase { constructor(apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionElementNotFoundError, apiFnArgs); } } exports.ActionElementNotFoundError = ActionElementNotFoundError; class ActionElementIsInvisibleError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementIsInvisibleError); } } exports.ActionElementIsInvisibleError = ActionElementIsInvisibleError; class ActionSelectorMatchesWrongNodeTypeError extends TestRunErrorBase { constructor(nodeDescription) { super(types_1.TEST_RUN_ERRORS.actionSelectorMatchesWrongNodeTypeError); this.nodeDescription = nodeDescription; } } exports.ActionSelectorMatchesWrongNodeTypeError = ActionSelectorMatchesWrongNodeTypeError; class ActionAdditionalElementNotFoundError extends SelectorErrorBase { constructor(argumentName, apiFnArgs) { super(types_1.TEST_RUN_ERRORS.actionAdditionalElementNotFoundError, apiFnArgs); this.argumentName = argumentName; } } exports.ActionAdditionalElementNotFoundError = ActionAdditionalElementNotFoundError; class ActionAdditionalElementIsInvisibleError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionAdditionalElementIsInvisibleError); this.argumentName = argumentName; } } exports.ActionAdditionalElementIsInvisibleError = ActionAdditionalElementIsInvisibleError; class ActionAdditionalSelectorMatchesWrongNodeTypeError extends TestRunErrorBase { constructor(argumentName, nodeDescription) { super(types_1.TEST_RUN_ERRORS.actionAdditionalSelectorMatchesWrongNodeTypeError); this.argumentName = argumentName; this.nodeDescription = nodeDescription; } } exports.ActionAdditionalSelectorMatchesWrongNodeTypeError = ActionAdditionalSelectorMatchesWrongNodeTypeError; class ActionElementNonEditableError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNonEditableError); } } exports.ActionElementNonEditableError = ActionElementNonEditableError; class ActionElementNotTextAreaError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNotTextAreaError); } } exports.ActionElementNotTextAreaError = ActionElementNotTextAreaError; class ActionElementNonContentEditableError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionElementNonContentEditableError); this.argumentName = argumentName; } } exports.ActionElementNonContentEditableError = ActionElementNonContentEditableError; class ActionRootContainerNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionRootContainerNotFoundError); } } exports.ActionRootContainerNotFoundError = ActionRootContainerNotFoundError; class ActionIncorrectKeysError extends TestRunErrorBase { constructor(argumentName) { super(types_1.TEST_RUN_ERRORS.actionIncorrectKeysError); this.argumentName = argumentName; } } exports.ActionIncorrectKeysError = ActionIncorrectKeysError; class ActionCannotFindFileToUploadError extends TestRunErrorBase { constructor(filePaths, scannedFilePaths) { super(types_1.TEST_RUN_ERRORS.actionCannotFindFileToUploadError); this.filePaths = filePaths; this.scannedFilePaths = scannedFilePaths; } } exports.ActionCannotFindFileToUploadError = ActionCannotFindFileToUploadError; class ActionElementIsNotFileInputError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementIsNotFileInputError); } } exports.ActionElementIsNotFileInputError = ActionElementIsNotFileInputError; class ActionInvalidScrollTargetError extends TestRunErrorBase { constructor(scrollTargetXValid, scrollTargetYValid) { super(types_1.TEST_RUN_ERRORS.actionInvalidScrollTargetError); if (!scrollTargetXValid) { if (!scrollTargetYValid) this.properties = 'scrollTargetX and scrollTargetY properties'; else this.properties = 'scrollTargetX property'; } else this.properties = 'scrollTargetY property'; } } exports.ActionInvalidScrollTargetError = ActionInvalidScrollTargetError; class UncaughtErrorInCustomScript extends TestRunErrorBase { constructor(err, expression, line, column, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInCustomScript); this.callsite = callsite; this.expression = expression; this.line = line; this.column = column; this.originError = err; this.errMsg = err.message || String(err); } } exports.UncaughtErrorInCustomScript = UncaughtErrorInCustomScript; class UncaughtTestCafeErrorInCustomScript extends TestRunErrorBase { constructor(err, expression, line, column, callsite) { super(types_1.TEST_RUN_ERRORS.uncaughtTestCafeErrorInCustomScript); this.callsite = callsite; this.expression = expression; this.line = line; this.column = column; this.originError = err; this.errCallsite = err.callsite; } } exports.UncaughtTestCafeErrorInCustomScript = UncaughtTestCafeErrorInCustomScript; class WindowDimensionsOverflowError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.windowDimensionsOverflowError); this.callsite = callsite; } } exports.WindowDimensionsOverflowError = WindowDimensionsOverflowError; class InvalidElementScreenshotDimensionsError extends TestRunErrorBase { constructor(width, height) { super(types_1.TEST_RUN_ERRORS.invalidElementScreenshotDimensionsError); const widthIsInvalid = width <= 0; const heightIsInvalid = height <= 0; if (widthIsInvalid) { if (heightIsInvalid) { this.verb = 'are'; this.dimensions = 'width and height'; } else { this.verb = 'is'; this.dimensions = 'width'; } } else { this.verb = 'is'; this.dimensions = 'height'; } } } exports.InvalidElementScreenshotDimensionsError = InvalidElementScreenshotDimensionsError; class ForbiddenCharactersInScreenshotPathError extends TestRunErrorBase { constructor(screenshotPath, forbiddenCharsList) { super(types_1.TEST_RUN_ERRORS.forbiddenCharactersInScreenshotPathError); this.screenshotPath = screenshotPath; this.forbiddenCharsList = forbiddenCharsList; } } exports.ForbiddenCharactersInScreenshotPathError = ForbiddenCharactersInScreenshotPathError; class RoleSwitchInRoleInitializerError extends TestRunErrorBase { constructor(callsite) { super(types_1.TEST_RUN_ERRORS.roleSwitchInRoleInitializerError); this.callsite = callsite; } } exports.RoleSwitchInRoleInitializerError = RoleSwitchInRoleInitializerError; // Iframe errors class ActionElementNotIframeError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionElementNotIframeError); } } exports.ActionElementNotIframeError = ActionElementNotIframeError; class ActionIframeIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.actionIframeIsNotLoadedError); } } exports.ActionIframeIsNotLoadedError = ActionIframeIsNotLoadedError; class CurrentIframeIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeIsNotLoadedError); } } exports.CurrentIframeIsNotLoadedError = CurrentIframeIsNotLoadedError; class ChildWindowNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowNotFoundError); } } exports.ChildWindowNotFoundError = ChildWindowNotFoundError; class ChildWindowIsNotLoadedError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowIsNotLoadedError); } } exports.ChildWindowIsNotLoadedError = ChildWindowIsNotLoadedError; class CannotSwitchToWindowError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.cannotSwitchToWindowError); } } exports.CannotSwitchToWindowError = CannotSwitchToWindowError; class CloseChildWindowError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.closeChildWindowError); } } exports.CloseChildWindowError = CloseChildWindowError; class CurrentIframeNotFoundError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeNotFoundError); } } exports.CurrentIframeNotFoundError = CurrentIframeNotFoundError; class CurrentIframeIsInvisibleError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.currentIframeIsInvisibleError); } } exports.CurrentIframeIsInvisibleError = CurrentIframeIsInvisibleError; // Native dialog errors class NativeDialogNotHandledError extends TestRunErrorBase { constructor(dialogType, url) { super(types_1.TEST_RUN_ERRORS.nativeDialogNotHandledError); this.dialogType = dialogType; this.pageUrl = url; } } exports.NativeDialogNotHandledError = NativeDialogNotHandledError; class UncaughtErrorInNativeDialogHandler extends TestRunErrorBase { constructor(dialogType, errMsg, url) { super(types_1.TEST_RUN_ERRORS.uncaughtErrorInNativeDialogHandler); this.dialogType = dialogType; this.errMsg = errMsg; this.pageUrl = url; } } exports.UncaughtErrorInNativeDialogHandler = UncaughtErrorInNativeDialogHandler; class SetNativeDialogHandlerCodeWrongTypeError extends TestRunErrorBase { constructor(actualType) { super(types_1.TEST_RUN_ERRORS.setNativeDialogHandlerCodeWrongTypeError); this.actualType = actualType; } } exports.SetNativeDialogHandlerCodeWrongTypeError = SetNativeDialogHandlerCodeWrongTypeError; class RequestHookUnhandledError extends TestRunErrorBase { constructor(err, hookClassName, methodName) { super(types_1.TEST_RUN_ERRORS.requestHookUnhandledError); this.errMsg = String(err); this.hookClassName = hookClassName; this.methodName = methodName; } } exports.RequestHookUnhandledError = RequestHookUnhandledError; class RequestHookNotImplementedMethodError extends TestRunErrorBase { constructor(methodName, hookClassName) { super(types_1.TEST_RUN_ERRORS.requestHookNotImplementedError); this.methodName = methodName; this.hookClassName = hookClassName; } } exports.RequestHookNotImplementedMethodError = RequestHookNotImplementedMethodError; class ChildWindowClosedBeforeSwitchingError extends TestRunErrorBase { constructor() { super(types_1.TEST_RUN_ERRORS.childWindowClosedBeforeSwitchingError); } } exports.ChildWindowClosedBeforeSwitchingError = ChildWindowClosedBeforeSwitchingError; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvZXJyb3JzL3Rlc3QtcnVuL2luZGV4LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsZ0VBQWdFO0FBQ2hFLGdFQUFnRTtBQUNoRSwrQ0FBK0M7QUFDL0MsZ0VBQWdFO0FBQ2hFLG9DQUEyQztBQUUzQyxPQUFPO0FBQ1Asc0VBQXNFO0FBQ3RFLE1BQU0sZ0JBQWdCO0lBQ2xCLFlBQWEsSUFBSTtRQUNiLElBQUksQ0FBQyxJQUFJLEdBQWMsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQVUsSUFBSSxDQUFDO0lBQ2hDLENBQUM7Q0FDSjtBQUVELE1BQU0scUJBQXNCLFNBQVEsZ0JBQWdCO0lBQ2hELFlBQWEsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXO1FBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxVQUFVLEdBQUksVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ25DLENBQUM7Q0FDSjtBQUVELE1BQU0sdUJBQXdCLFNBQVEsZ0JBQWdCO0lBQ2xELFlBQWEsSUFBSSxFQUFFLFlBQVksRUFBRSxXQUFXO1FBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVaLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUksV0FBVyxDQUFDO0lBQ3BDLENBQUM7Q0FDSjtBQUVELHlCQUF5QjtBQUN6QixzRUFBc0U7QUFDdEUsTUFBYSxpQkFBa0IsU0FBUSxnQkFBZ0I7SUFDbkQsWUFBYSxRQUFRO1FBQ2pCLEtBQUssQ0FBQyx1QkFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDN0IsQ0FBQztDQUNK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LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXQVJOSU5HOiB0aGlzIGZpbGUgaXMgdXNlZCBieSBib3RoIHRoZSBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuXG4vLyBEbyBub3QgdXNlIGFueSBicm93c2VyIG9yIG5vZGUtc3BlY2lmaWMgQVBJIVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuaW1wb3J0IHsgVEVTVF9SVU5fRVJST1JTIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vLyBCYXNlXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jbGFzcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29kZSkge1xuICAgICAgICB0aGlzLmNvZGUgICAgICAgICAgICA9IGNvZGU7XG4gICAgICAgIHRoaXMuaXNUZXN0Q2FmZUVycm9yID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jYWxsc2l0ZSAgICAgICAgPSBudWxsO1xuICAgIH1cbn1cblxuY2xhc3MgQWN0aW9uT3B0aW9uRXJyb3JCYXNlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNvZGUsIG9wdGlvbk5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKGNvZGUpO1xuXG4gICAgICAgIHRoaXMub3B0aW9uTmFtZSAgPSBvcHRpb25OYW1lO1xuICAgICAgICB0aGlzLmFjdHVhbFZhbHVlID0gYWN0dWFsVmFsdWU7XG4gICAgfVxufVxuXG5jbGFzcyBBY3Rpb25Bcmd1bWVudEVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCBhcmd1bWVudE5hbWUsIGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIHN1cGVyKGNvZGUpO1xuXG4gICAgICAgIHRoaXMuYXJndW1lbnROYW1lID0gYXJndW1lbnROYW1lO1xuICAgICAgICB0aGlzLmFjdHVhbFZhbHVlICA9IGFjdHVhbFZhbHVlO1xuICAgIH1cbn1cblxuLy8gU3luY2hyb25pemF0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIE1pc3NpbmdBd2FpdEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGNhbGxzaXRlKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5taXNzaW5nQXdhaXRFcnJvcik7XG5cbiAgICAgICAgdGhpcy5jYWxsc2l0ZSA9IGNhbGxzaXRlO1xuICAgIH1cbn1cblxuXG4vLyBDbGllbnQgZnVuY3Rpb24gZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgQ2xpZW50RnVuY3Rpb25FeGVjdXRpb25JbnRlcnJ1cHRpb25FcnJvciBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5jbGllbnRGdW5jdGlvbkV4ZWN1dGlvbkludGVycnVwdGlvbkVycm9yKTtcblxuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIERvbU5vZGVDbGllbnRGdW5jdGlvblJlc3VsdEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmRvbU5vZGVDbGllbnRGdW5jdGlvblJlc3VsdEVycm9yKTtcblxuICAgICAgICB0aGlzLmluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUgPSBpbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lO1xuICAgIH1cbn1cblxuLy8gU2VsZWN0b3IgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5jbGFzcyBTZWxlY3RvckVycm9yQmFzZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjb2RlLCB7IGFwaUZuQ2hhaW4sIGFwaUZuSW5kZXggfSkge1xuICAgICAgICBzdXBlcihjb2RlKTtcblxuICAgICAgICB0aGlzLmFwaUZuQ2hhaW4gPSBhcGlGbkNoYWluO1xuICAgICAgICB0aGlzLmFwaUZuSW5kZXggPSBhcGlGbkluZGV4O1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEludmFsaWRTZWxlY3RvclJlc3VsdEVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMuaW52YWxpZFNlbGVjdG9yUmVzdWx0RXJyb3IpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhbm5vdE9idGFpbkluZm9Gb3JFbGVtZW50U3BlY2lmaWVkQnlTZWxlY3RvckVycm9yIGV4dGVuZHMgU2VsZWN0b3JFcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChjYWxsc2l0ZSwgYXBpRm5BcmdzKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy5jYW5ub3RPYnRhaW5JbmZvRm9yRWxlbWVudFNwZWNpZmllZEJ5U2VsZWN0b3JFcnJvciwgYXBpRm5BcmdzKTtcblxuICAgICAgICB0aGlzLmNhbGxzaXRlID0gY2FsbHNpdGU7XG4gICAgfVxufVxuXG4vLyBQYWdlIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIFBhZ2VMb2FkRXJyb3IgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoZXJyTXNnLCB1cmwpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnBhZ2VMb2FkRXJyb3IpO1xuXG4gICAgICAgIHRoaXMudXJsICAgID0gdXJsO1xuICAgICAgICB0aGlzLmVyck1zZyA9IGVyck1zZztcbiAgICB9XG59XG5cblxuLy8gVW5jYXVnaHQgZXJyb3JzXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvck9uUGFnZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnJTdGFjaywgcGFnZURlc3RVcmwpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JPblBhZ2UpO1xuXG4gICAgICAgIHRoaXMuZXJyU3RhY2sgICAgPSBlcnJTdGFjaztcbiAgICAgICAgdGhpcy5wYWdlRGVzdFVybCA9IHBhZ2VEZXN0VXJsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFVuY2F1Z2h0RXJyb3JJblRlc3RDb2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyciwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJblRlc3RDb2RlKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgICAgID0gU3RyaW5nKGVyci5yYXdNZXNzYWdlIHx8IGVycik7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgICAgPSBlcnIuY2FsbHNpdGUgfHwgY2FsbHNpdGU7XG4gICAgICAgIHRoaXMub3JpZ2luRXJyb3IgPSBlcnI7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHROb25FcnJvck9iamVjdEluVGVzdENvZGUgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAob2JqKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodE5vbkVycm9yT2JqZWN0SW5UZXN0Q29kZSk7XG5cbiAgICAgICAgdGhpcy5vYmpUeXBlID0gdHlwZW9mIG9iajtcbiAgICAgICAgdGhpcy5vYmpTdHIgID0gU3RyaW5nKG9iaik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ2xpZW50RnVuY3Rpb25Db2RlIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWUsIGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFcnJvckluQ2xpZW50RnVuY3Rpb25Db2RlKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgICAgICAgICAgICAgICAgICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5pbnN0YW50aWF0aW9uQ2FsbHNpdGVOYW1lID0gaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGUgZXh0ZW5kcyBUZXN0UnVuRXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSwgZXJyLCBwcm9wKSB7XG4gICAgICAgIHN1cGVyKFRFU1RfUlVOX0VSUk9SUy51bmNhdWdodEVycm9ySW5DdXN0b21ET01Qcm9wZXJ0eUNvZGUsIGVyciwgcHJvcCk7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgICAgICAgICAgICAgICAgICAgID0gU3RyaW5nKGVycik7XG4gICAgICAgIHRoaXMucHJvcGVydHkgICAgICAgICAgICAgICAgICA9IHByb3A7XG4gICAgICAgIHRoaXMuaW5zdGFudGlhdGlvbkNhbGxzaXRlTmFtZSA9IGluc3RhbnRpYXRpb25DYWxsc2l0ZU5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbik7XG5cbiAgICAgICAgdGhpcy5lcnJNc2cgPSBTdHJpbmcoZXJyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVbmNhdWdodEV4Y2VwdGlvbkVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVycikge1xuICAgICAgICBzdXBlcihURVNUX1JVTl9FUlJPUlMudW5jYXVnaHRFeGNlcHRpb24pO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnID0gU3RyaW5nKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0Q29kZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkN1c3RvbUNsaWVudFNjcmlwdENvZGUpO1xuXG4gICAgICAgIHRoaXMuZXJyTXNnID0gU3RyaW5nKGVycik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5jYXVnaHRFcnJvckluQ3VzdG9tQ2xpZW50U2NyaXB0TG9hZGVkRnJvbU1vZHVsZSBleHRlbmRzIFRlc3RSdW5FcnJvckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yIChlcnIsIG1vZHVsZU5hbWUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLnVuY2F1Z2h0RXJyb3JJbkN1c3RvbUNsaWVudFNjcmlwdENvZGVMb2FkZWRGcm9tTW9kdWxlKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgICAgPSBTdHJpbmcoZXJyKTtcbiAgICAgICAgdGhpcy5tb2R1bGVOYW1lID0gbW9kdWxlTmFtZTtcbiAgICB9XG59XG5cblxuLy8gQXNzZXJ0aW9uIGVycm9yc1xuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuZXhwb3J0IGNsYXNzIEV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yIGV4dGVuZHMgVGVzdFJ1bkVycm9yQmFzZSB7XG4gICAgY29uc3RydWN0b3IgKGVyciwgY2FsbHNpdGUpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmV4dGVybmFsQXNzZXJ0aW9uTGlicmFyeUVycm9yKTtcblxuICAgICAgICB0aGlzLmVyck1zZyAgID0gU3RyaW5nKGVycik7XG4gICAgICAgIHRoaXMuY2FsbHNpdGUgPSBjYWxsc2l0ZTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3NlcnRpb25FeGVjdXRhYmxlQXJndW1lbnRFcnJvciBleHRlbmRzIEFjdGlvbkFyZ3VtZW50RXJyb3JCYXNlIHtcbiAgICBjb25zdHJ1Y3RvciAoYXJndW1lbnROYW1lLCBhcmd1bWVudFZhbHVlLCBlcnIsIGlzQVBJRXJyb3IpIHtcbiAgICAgICAgc3VwZXIoVEVTVF9SVU5fRVJST1JTLmFzc2Vy