UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

149 lines 21.4 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.requestHooksArgument = exports.skipJsErrorOptions = exports.urlArgument = exports.urlsArgument = exports.setCookiesArgument = exports.cookiesArgument = exports.functionArgument = exports.screenshotPathArgument = exports.resizeWindowDeviceArgument = exports.stringOrStringArrayArgument = exports.pageUrlArgument = exports.nullableStringArgument = exports.nonEmptyStringArgument = exports.stringArgument = exports.actionOptions = exports.actionRoleArgument = exports.setSpeedArgument = exports.booleanArgument = exports.positiveIntegerArgument = exports.integerArgument = void 0; const device_specs_1 = require("device-specs"); const marker_symbol_1 = __importDefault(require("../../../role/marker-symbol")); const factories_1 = require("./factories"); const test_run_1 = require("../../../errors/test-run"); const url_1 = require("url"); const test_page_url_1 = require("../../../api/test-page-url"); const check_file_path_1 = __importDefault(require("../../../utils/check-file-path")); const lodash_1 = require("lodash"); const assert_type_1 = __importDefault(require("../../../api/request-hooks/assert-type")); // Validators exports.integerArgument = (0, factories_1.createIntegerValidator)(test_run_1.ActionIntegerArgumentError); exports.positiveIntegerArgument = (0, factories_1.createPositiveIntegerValidator)(test_run_1.ActionPositiveIntegerArgumentError); exports.booleanArgument = (0, factories_1.createBooleanValidator)(test_run_1.ActionBooleanArgumentError); exports.setSpeedArgument = (0, factories_1.createSpeedValidator)(test_run_1.SetTestSpeedArgumentError); function actionRoleArgument(name, val) { if (!val || !val[marker_symbol_1.default]) throw new test_run_1.ActionRoleArgumentError(name, typeof val); } exports.actionRoleArgument = actionRoleArgument; function actionOptions(name, val) { const type = typeof val; if (type !== 'object' && val !== null && val !== void 0) throw new test_run_1.ActionOptionsTypeError(type); } exports.actionOptions = actionOptions; function stringArgument(argument, val, createError) { if (!createError) createError = actualValue => new test_run_1.ActionStringArgumentError(argument, actualValue); const type = typeof val; if (type !== 'string') throw createError(type); } exports.stringArgument = stringArgument; function nonEmptyStringArgument(argument, val, createError) { if (!createError) createError = actualValue => new test_run_1.ActionStringArgumentError(argument, actualValue); stringArgument(argument, val, createError); if (!val.length) throw createError('""'); } exports.nonEmptyStringArgument = nonEmptyStringArgument; function nullableStringArgument(argument, val) { const type = typeof val; if (type !== 'string' && val !== null) throw new test_run_1.ActionNullableStringArgumentError(argument, type); } exports.nullableStringArgument = nullableStringArgument; function pageUrlArgument(name, val) { nonEmptyStringArgument(name, val); (0, test_page_url_1.assertPageUrl)(val.trim(), 'navigateTo'); } exports.pageUrlArgument = pageUrlArgument; function stringOrStringArrayArgument(argument, val) { const type = typeof val; if (type === 'string') { if (!val.length) throw new test_run_1.ActionStringOrStringArrayArgumentError(argument, '""'); } else if (Array.isArray(val)) { if (!val.length) throw new test_run_1.ActionStringOrStringArrayArgumentError(argument, '[]'); const validateElement = elementIndex => nonEmptyStringArgument(argument, val[elementIndex], actualValue => new test_run_1.ActionStringArrayElementError(argument, actualValue, elementIndex)); for (let i = 0; i < val.length; i++) validateElement(i); } else throw new test_run_1.ActionStringOrStringArrayArgumentError(argument, type); } exports.stringOrStringArrayArgument = stringOrStringArrayArgument; function resizeWindowDeviceArgument(name, val) { nonEmptyStringArgument(name, val); if (!(0, device_specs_1.isValidDeviceName)(val)) throw new test_run_1.ActionUnsupportedDeviceTypeError(name, val); } exports.resizeWindowDeviceArgument = resizeWindowDeviceArgument; function screenshotPathArgument(name, val) { nonEmptyStringArgument(name, val); const forbiddenCharsList = (0, check_file_path_1.default)(val); if (forbiddenCharsList.length) throw new test_run_1.ForbiddenCharactersInScreenshotPathError(val, forbiddenCharsList); } exports.screenshotPathArgument = screenshotPathArgument; function functionArgument(name, val) { if (typeof val !== 'function') throw new test_run_1.ActionFunctionArgumentError(name, val); } exports.functionArgument = functionArgument; function isValidCookie(cookie) { return !!cookie && (typeof cookie === 'object' || typeof cookie === 'string'); } function cookiesArgument(name, val) { const cookiesLength = val.length; for (const [i, value] of val.entries()) { if (!isValidCookie(value)) { throw cookiesLength === 1 ? new test_run_1.ActionCookieArgumentError() : new test_run_1.ActionCookieArgumentsError(i, value); } } } exports.cookiesArgument = cookiesArgument; function setCookiesArgument(name, val) { if (!val.length) throw new test_run_1.ActionRequiredCookieArguments(); cookiesArgument(name, val); } exports.setCookiesArgument = setCookiesArgument; function isValidUrl(url) { try { return new url_1.URL(url) && true; } catch (_a) { return false; } } function urlsArgument(name, val) { const castVal = (0, lodash_1.castArray)(val); for (const [i, value] of castVal.entries()) { if (!isValidUrl(value)) { throw castVal.length === 1 ? new test_run_1.ActionUrlCookieArgumentError() : new test_run_1.ActionUrlsCookieArgumentError(i, value); } } } exports.urlsArgument = urlsArgument; function urlArgument(name, val) { const valType = typeof val; if (valType !== 'string' && !(val instanceof url_1.URL)) throw new test_run_1.ActionUrlArgumentError(name, valType); } exports.urlArgument = urlArgument; function skipJsErrorOptions(name, val) { const valType = typeof val; if (valType !== 'undefined' && valType !== 'object' && valType !== 'boolean' && valType !== 'function') throw new test_run_1.ActionSkipJsErrorsArgumentTypeError(name, valType); } exports.skipJsErrorOptions = skipJsErrorOptions; function requestHooksArgument(name, val) { (0, assert_type_1.default)(val); } exports.requestHooksArgument = requestHooksArgument; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJndW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdGVzdC1ydW4vY29tbWFuZHMvdmFsaWRhdGlvbnMvYXJndW1lbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsK0NBQWlEO0FBQ2pELGdGQUEyRDtBQUUzRCwyQ0FLcUI7QUFFckIsdURBcUJrQztBQUVsQyw2QkFBMEI7QUFDMUIsOERBQTJEO0FBQzNELHFGQUEyRDtBQUMzRCxtQ0FBbUM7QUFDbkMseUZBQTJFO0FBRTNFLGFBQWE7QUFDQSxRQUFBLGVBQWUsR0FBVyxJQUFBLGtDQUFzQixFQUFDLHFDQUEwQixDQUFDLENBQUM7QUFDN0UsUUFBQSx1QkFBdUIsR0FBRyxJQUFBLDBDQUE4QixFQUFDLDZDQUFrQyxDQUFDLENBQUM7QUFDN0YsUUFBQSxlQUFlLEdBQVcsSUFBQSxrQ0FBc0IsRUFBQyxxQ0FBMEIsQ0FBQyxDQUFDO0FBQzdFLFFBQUEsZ0JBQWdCLEdBQVUsSUFBQSxnQ0FBb0IsRUFBQyxvQ0FBeUIsQ0FBQyxDQUFDO0FBR3ZGLFNBQWdCLGtCQUFrQixDQUFFLElBQUksRUFBRSxHQUFHO0lBQ3pDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsdUJBQWdCLENBQUM7UUFDOUIsTUFBTSxJQUFJLGtDQUF1QixDQUFDLElBQUksRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFIRCxnREFHQztBQUVELFNBQWdCLGFBQWEsQ0FBRSxJQUFJLEVBQUUsR0FBRztJQUNwQyxNQUFNLElBQUksR0FBRyxPQUFPLEdBQUcsQ0FBQztJQUV4QixJQUFJLElBQUksS0FBSyxRQUFRLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssS0FBSyxDQUFDO1FBQ25ELE1BQU0sSUFBSSxpQ0FBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBTEQsc0NBS0M7QUFFRCxTQUFnQixjQUFjLENB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QUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxVQUFVO1FBQ2xHLE1BQU0sSUFBSSw4Q0FBbUMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUxELGdEQUtDO0FBRUQsU0FBZ0Isb0JBQW9CLENBQUUsSUFBSSxFQUFFLEdBQUc7SUFDM0MsSUFBQSxxQkFBcUIsRUFBQyxHQUFHLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRkQsb0RBRUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc1ZhbGlkRGV2aWNlTmFtZSB9IGZyb20gJ2RldmljZS1zcGVjcyc7XG5pbXBvcnQgcm9sZU1hcmtlclN5bWJvbCBmcm9tICcuLi8uLi8uLi9yb2xlL21hcmtlci1zeW1ib2wnO1xuXG5pbXBvcnQge1xuICAgIGNyZWF0ZUJvb2xlYW5WYWxpZGF0b3IsXG4gICAgY3JlYXRlSW50ZWdlclZhbGlkYXRvcixcbiAgICBjcmVhdGVQb3NpdGl2ZUludGVnZXJWYWxpZGF0b3IsXG4gICAgY3JlYXRlU3BlZWRWYWxpZGF0b3IsXG59IGZyb20gJy4vZmFjdG9yaWVzJztcblxuaW1wb3J0IHtcbiAgICBBY3Rpb25PcHRpb25zVHlwZUVycm9yLFxuICAgIEFjdGlvbkJvb2xlYW5Bcmd1bWVudEVycm9yLFxuICAgIEFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IsXG4gICAgQWN0aW9uTnVsbGFibGVTdHJpbmdBcmd1bWVudEVycm9yLFxuICAgIEFjdGlvbkludGVnZXJBcmd1bWVudEVycm9yLFxuICAgIEFjdGlvblJvbGVBcmd1bWVudEVycm9yLFxuICAgIEFjdGlvblBvc2l0aXZlSW50ZWdlckFyZ3VtZW50RXJyb3IsXG4gICAgQWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3IsXG4gICAgQWN0aW9uU3RyaW5nQXJyYXlFbGVtZW50RXJyb3IsXG4gICAgQWN0aW9uVW5zdXBwb3J0ZWREZXZpY2VUeXBlRXJyb3IsXG4gICAgQWN0aW9uRnVuY3Rpb25Bcmd1bWVudEVycm9yLFxuICAgIFNldFRlc3RTcGVlZEFyZ3VtZW50RXJyb3IsXG4gICAgRm9yYmlkZGVuQ2hhcmFjdGVyc0luU2NyZWVuc2hvdFBhdGhFcnJvcixcbiAgICBBY3Rpb25Db29raWVBcmd1bWVudEVycm9yLFxuICAgIEFjdGlvbkNvb2tpZUFyZ3VtZW50c0Vycm9yLFxuICAgIEFjdGlvblVybENvb2tpZUFyZ3VtZW50RXJyb3IsXG4gICAgQWN0aW9uVXJsc0Nvb2tpZUFyZ3VtZW50RXJyb3IsXG4gICAgQWN0aW9uUmVxdWlyZWRDb29raWVBcmd1bWVudHMsXG4gICAgQWN0aW9uVXJsQXJndW1lbnRFcnJvcixcbiAgICBBY3Rpb25Ta2lwSnNFcnJvcnNBcmd1bWVudFR5cGVFcnJvcixcbn0gZnJvbSAnLi4vLi4vLi4vZXJyb3JzL3Rlc3QtcnVuJztcblxuaW1wb3J0IHsgVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IGFzc2VydFBhZ2VVcmwgfSBmcm9tICcuLi8uLi8uLi9hcGkvdGVzdC1wYWdlLXVybCc7XG5pbXBvcnQgY2hlY2tGaWxlUGF0aCBmcm9tICcuLi8uLi8uLi91dGlscy9jaGVjay1maWxlLXBhdGgnO1xuaW1wb3J0IHsgY2FzdEFycmF5IH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBhc3NlcnRSZXF1ZXN0SG9va1R5cGUgZnJvbSAnLi4vLi4vLi4vYXBpL3JlcXVlc3QtaG9va3MvYXNzZXJ0LXR5cGUnO1xuXG4vLyBWYWxpZGF0b3JzXG5leHBvcnQgY29uc3QgaW50ZWdlckFyZ3VtZW50ICAgICAgICAgPSBjcmVhdGVJbnRlZ2VyVmFsaWRhdG9yKEFjdGlvbkludGVnZXJBcmd1bWVudEVycm9yKTtcbmV4cG9ydCBjb25zdCBwb3NpdGl2ZUludGVnZXJBcmd1bWVudCA9IGNyZWF0ZVBvc2l0aXZlSW50ZWdlclZhbGlkYXRvcihBY3Rpb25Qb3NpdGl2ZUludGVnZXJBcmd1bWVudEVycm9yKTtcbmV4cG9ydCBjb25zdCBib29sZWFuQXJndW1lbnQgICAgICAgICA9IGNyZWF0ZUJvb2xlYW5WYWxpZGF0b3IoQWN0aW9uQm9vbGVhbkFyZ3VtZW50RXJyb3IpO1xuZXhwb3J0IGNvbnN0IHNldFNwZWVkQXJndW1lbnQgICAgICAgID0gY3JlYXRlU3BlZWRWYWxpZGF0b3IoU2V0VGVzdFNwZWVkQXJndW1lbnRFcnJvcik7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGFjdGlvblJvbGVBcmd1bWVudCAobmFtZSwgdmFsKSB7XG4gICAgaWYgKCF2YWwgfHwgIXZhbFtyb2xlTWFya2VyU3ltYm9sXSlcbiAgICAgICAgdGhyb3cgbmV3IEFjdGlvblJvbGVBcmd1bWVudEVycm9yKG5hbWUsIHR5cGVvZiB2YWwpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYWN0aW9uT3B0aW9ucyAobmFtZSwgdmFsKSB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG5cbiAgICBpZiAodHlwZSAhPT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmIHZhbCAhPT0gdm9pZCAwKVxuICAgICAgICB0aHJvdyBuZXcgQWN0aW9uT3B0aW9uc1R5cGVFcnJvcih0eXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0FyZ3VtZW50IChhcmd1bWVudCwgdmFsLCBjcmVhdGVFcnJvcikge1xuICAgIGlmICghY3JlYXRlRXJyb3IpXG4gICAgICAgIGNyZWF0ZUVycm9yID0gYWN0dWFsVmFsdWUgPT4gbmV3IEFjdGlvblN0cmluZ0FyZ3VtZW50RXJyb3IoYXJndW1lbnQsIGFjdHVhbFZhbHVlKTtcblxuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnKVxuICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcih0eXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vbkVtcHR5U3RyaW5nQXJndW1lbnQgKGFyZ3VtZW50LCB2YWwsIGNyZWF0ZUVycm9yKSB7XG4gICAgaWYgKCFjcmVhdGVFcnJvcilcbiAgICAgICAgY3JlYXRlRXJyb3IgPSBhY3R1YWxWYWx1ZSA9PiBuZXcgQWN0aW9uU3RyaW5nQXJndW1lbnRFcnJvcihhcmd1bWVudCwgYWN0dWFsVmFsdWUpO1xuXG4gICAgc3RyaW5nQXJndW1lbnQoYXJndW1lbnQsIHZhbCwgY3JlYXRlRXJyb3IpO1xuXG4gICAgaWYgKCF2YWwubGVuZ3RoKVxuICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcignXCJcIicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbnVsbGFibGVTdHJpbmdBcmd1bWVudCAoYXJndW1lbnQsIHZhbCkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gICAgaWYgKHR5cGUgIT09ICdzdHJpbmcnICYmIHZhbCAhPT0gbnVsbClcbiAgICAgICAgdGhyb3cgbmV3IEFjdGlvbk51bGxhYmxlU3RyaW5nQXJndW1lbnRFcnJvcihhcmd1bWVudCwgdHlwZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWdlVXJsQXJndW1lbnQgKG5hbWUsIHZhbCkge1xuICAgIG5vbkVtcHR5U3RyaW5nQXJndW1lbnQobmFtZSwgdmFsKTtcblxuICAgIGFzc2VydFBhZ2VVcmwodmFsLnRyaW0oKSwgJ25hdmlnYXRlVG8nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudCAoYXJndW1lbnQsIHZhbCkge1xuICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmICghdmFsLmxlbmd0aClcbiAgICAgICAgICAgIHRocm93IG5ldyBBY3Rpb25TdHJpbmdPclN0cmluZ0FycmF5QXJndW1lbnRFcnJvcihhcmd1bWVudCwgJ1wiXCInKTtcbiAgICB9XG5cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAgaWYgKCF2YWwubGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEFjdGlvblN0cmluZ09yU3RyaW5nQXJyYXlBcmd1bWVudEVycm9yKGFyZ3VtZW50LCAnW10nKTtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZUVsZW1lbnQgPSBlbGVtZW50SW5kZXggPT4gbm9uRW1wdHlTdHJpbmdBcmd1bWVudChcbiAgICAgICAgICAgIGFyZ3VtZW50LFxuICAgICAgICAgICAgdmFsW2VsZW1lbnRJbmRleF0sXG4gICAgICAgICAgICBhY3R1YWxWYWx1ZSA9PiBuZXcgQWN0aW9uU3RyaW5nQXJyYXlFbGVtZW50RXJyb3IoYXJndW1lbnQsIGFjdHVhbFZhbHVlLCBlbGVtZW50SW5kZXgpXG4gICAgICAgICk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyBpKyspXG4gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaSk7XG4gICAgfVxuXG4gICAgZWxzZVxuICAgICAgICB0aHJvdyBuZXcgQWN0aW9uU3RyaW5nT3JTdHJpbmdBcnJheUFyZ3VtZW50RXJyb3IoYXJndW1lbnQsIHR5cGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplV2luZG93RGV2aWNlQXJndW1lbnQgKG5hbWUsIHZhbCkge1xuICAgIG5vbkVtcHR5U3RyaW5nQXJndW1lbnQobmFtZSwgdmFsKTtcblxuICAgIGlmICghaXNWYWxpZERldmljZU5hbWUodmFsKSlcbiAgICAgICAgdGhyb3cgbmV3IEFjdGlvblVuc3VwcG9ydGVkRGV2aWNlVHlwZUVycm9yKG5hbWUsIHZhbCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzY3JlZW5zaG90UGF0aEFyZ3VtZW50IChuYW1lLCB2YWwpIHtcbiAgICBub25FbXB0eVN0cmluZ0FyZ3VtZW50KG5hbWUsIHZhbCk7XG5cbiAgICBjb25zdCBmb3JiaWRkZW5DaGFyc0xpc3QgPSBjaGVja0ZpbGVQYXRoKHZhbCk7XG5cbiAgICBpZiAoZm9yYmlkZGVuQ2hhcnNMaXN0Lmxlbmd0aClcbiAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkNoYXJhY3RlcnNJblNjcmVlbnNob3RQYXRoRXJyb3IodmFsLCBmb3JiaWRkZW5DaGFyc0xpc3QpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZnVuY3Rpb25Bcmd1bWVudCAobmFtZSwgdmFsKSB7XG4gICAgaWYgKHR5cGVvZiB2YWwgIT09ICdmdW5jdGlvbicpXG4gICAgICAgIHRocm93IG5ldyBBY3Rpb25GdW5jdGlvbkFyZ3VtZW50RXJyb3IobmFtZSwgdmFsKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZENvb2tpZSAoY29va2llKSB7XG4gICAgcmV0dXJuICEhY29va2llICYmICh0eXBlb2YgY29va2llID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgY29va2llID09PSAnc3RyaW5nJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb29raWVzQXJndW1lbnQgKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IGNvb2tpZXNMZW5ndGggPSB2YWwubGVuZ3RoO1xuXG4gICAgZm9yIChjb25zdCBbaSwgdmFsdWVdIG9mIHZhbC5lbnRyaWVzKCkpIHtcbiAgICAgICAgaWYgKCFpc1ZhbGlkQ29va2llKHZhbHVlKSkge1xuICAgICAgICAgICAgdGhyb3cgY29va2llc0xlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgID8gbmV3IEFjdGlvbkNvb2tpZUFyZ3VtZW50RXJyb3IoKVxuICAgICAgICAgICAgICAgIDogbmV3IEFjdGlvbkNvb2tpZUFyZ3VtZW50c0Vycm9yKGksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldENvb2tpZXNBcmd1bWVudCAobmFtZSwgdmFsKSB7XG4gICAgaWYgKCF2YWwubGVuZ3RoKVxuICAgICAgICB0aHJvdyBuZXcgQWN0aW9uUmVxdWlyZWRDb29raWVBcmd1bWVudHMoKTtcblxuICAgIGNvb2tpZXNBcmd1bWVudChuYW1lLCB2YWwpO1xufVxuXG5mdW5jdGlvbiBpc1ZhbGlkVXJsICh1cmwpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gbmV3IFVSTCh1cmwpICYmIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVybHNBcmd1bWVudCAobmFtZSwgdmFsKSB7XG4gICAgY29uc3QgY2FzdFZhbCA9IGNhc3RBcnJheSh2YWwpO1xuXG4gICAgZm9yIChjb25zdCBbaSwgdmFsdWVdIG9mIGNhc3RWYWwuZW50cmllcygpKSB7XG4gICAgICAgIGlmICghaXNWYWxpZFVybCh2YWx1ZSkpIHtcbiAgICAgICAgICAgIHRocm93IGNhc3RWYWwubGVuZ3RoID09PSAxXG4gICAgICAgICAgICAgICAgPyBuZXcgQWN0aW9uVXJsQ29va2llQXJndW1lbnRFcnJvcigpXG4gICAgICAgICAgICAgICAgOiBuZXcgQWN0aW9uVXJsc0Nvb2tpZUFyZ3VtZW50RXJyb3IoaSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdXJsQXJndW1lbnQgKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IHZhbFR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gICAgaWYgKHZhbFR5cGUgIT09ICdzdHJpbmcnICYmICEodmFsIGluc3RhbmNlb2YgVVJMKSlcbiAgICAgICAgdGhyb3cgbmV3IEFjdGlvblVybEFyZ3VtZW50RXJyb3IobmFtZSwgdmFsVHlwZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBza2lwSnNFcnJvck9wdGlvbnMgKG5hbWUsIHZhbCkge1xuICAgIGNvbnN0IHZhbFR5cGUgPSB0eXBlb2YgdmFsO1xuXG4gICAgaWYgKHZhbFR5cGUgIT09ICd1bmRlZmluZWQnICYmIHZhbFR5cGUgIT09ICdvYmplY3QnICYmIHZhbFR5cGUgIT09ICdib29sZWFuJyAmJiB2YWxUeXBlICE9PSAnZnVuY3Rpb24nKVxuICAgICAgICB0aHJvdyBuZXcgQWN0aW9uU2tpcEpzRXJyb3JzQXJndW1lbnRUeXBlRXJyb3IobmFtZSwgdmFsVHlwZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0SG9va3NBcmd1bWVudCAobmFtZSwgdmFsKSB7XG4gICAgYXNzZXJ0UmVxdWVzdEhvb2tUeXBlKHZhbCk7XG59XG4iXX0=