UNPKG

@browserstack/testcafe

Version:

Automated browser testing for the modern web development stack.

144 lines 23.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const configuration_base_1 = __importDefault(require("./configuration-base")); const lodash_1 = require("lodash"); const get_options_1 = require("../utils/get-options"); const option_names_1 = __importDefault(require("./option-names")); const get_filter_fn_1 = __importDefault(require("../utils/get-filter-fn")); const prepare_reporters_1 = __importDefault(require("../utils/prepare-reporters")); const string_1 = require("../utils/string"); const render_template_1 = __importDefault(require("../utils/render-template")); const warning_message_1 = __importDefault(require("../notifications/warning-message")); const resolve_path_relatively_cwd_1 = __importDefault(require("../utils/resolve-path-relatively-cwd")); const default_values_1 = require("./default-values"); const option_source_1 = __importDefault(require("./option-source")); const CONFIGURATION_FILENAME = '.testcaferc.json'; const DEFAULT_SCREENSHOTS_DIRECTORY = 'screenshots'; const OPTION_FLAG_NAMES = [ option_names_1.default.skipJsErrors, option_names_1.default.quarantineMode, option_names_1.default.debugMode, option_names_1.default.debugOnFail, option_names_1.default.skipUncaughtErrors, option_names_1.default.stopOnFirstFail, option_names_1.default.takeScreenshotsOnFails, option_names_1.default.disablePageCaching, option_names_1.default.disablePageReloads, option_names_1.default.disableScreenshots, option_names_1.default.allowMultipleWindows ]; const OPTION_INIT_FLAG_NAMES = [ option_names_1.default.developmentMode, option_names_1.default.retryTestPages, ]; class TestCafeConfiguration extends configuration_base_1.default { constructor() { super(CONFIGURATION_FILENAME); } async init(options = {}) { await super.init(); const opts = await this._load(); if (opts) { this._options = configuration_base_1.default._fromObj(opts); await this._normalizeOptionsAfterLoad(); } this.mergeOptions(options); } prepare() { this._prepareFlags(); this._setDefaultValues(); } notifyAboutOverriddenOptions() { if (!this._overriddenOptions.length) return; const optionsStr = string_1.getConcatenatedValuesString(this._overriddenOptions); const optionsSuffix = string_1.getPluralSuffix(this._overriddenOptions); configuration_base_1.default._showConsoleWarning(render_template_1.default(warning_message_1.default.configOptionsWereOverriden, optionsStr, optionsSuffix)); this._overriddenOptions = []; } get startOptions() { const result = { hostname: this.getOption('hostname'), port1: this.getOption('port1'), port2: this.getOption('port2'), options: { ssl: this.getOption('ssl'), developmentMode: this.getOption('developmentMode'), retryTestPages: this.getOption('retryTestPages') } }; if (result.options.retryTestPages) result.options.staticContentCaching = default_values_1.STATIC_CONTENT_CACHING_SETTINGS; return result; } _prepareFlag(name) { const option = this._ensureOption(name, void 0, option_source_1.default.Configuration); option.value = !!option.value; } _prepareFlags() { OPTION_FLAG_NAMES.forEach(name => this._prepareFlag(name)); } _prepareInitFlags() { OPTION_INIT_FLAG_NAMES.forEach(name => this._prepareFlag(name)); } async _normalizeOptionsAfterLoad() { await this._prepareSslOptions(); this._prepareInitFlags(); this._prepareFilterFn(); this._ensureArrayOption(option_names_1.default.src); this._ensureArrayOption(option_names_1.default.browsers); this._ensureArrayOption(option_names_1.default.clientScripts); this._prepareReporters(); } _prepareFilterFn() { const filterOption = this._ensureOption(option_names_1.default.filter, null, option_source_1.default.Configuration); if (!filterOption.value) return; const filterOptionValue = filterOption.value; if (filterOptionValue.testGrep) filterOptionValue.testGrep = get_options_1.getGrepOptions(option_names_1.default.filterTestGrep, filterOptionValue.testGrep); if (filterOptionValue.fixtureGrep) filterOptionValue.fixtureGrep = get_options_1.getGrepOptions(option_names_1.default.filterFixtureGrep, filterOptionValue.fixtureGrep); filterOption.value = get_filter_fn_1.default(filterOption.value); } _ensureScreenshotPath() { const path = resolve_path_relatively_cwd_1.default(DEFAULT_SCREENSHOTS_DIRECTORY); const screenshots = this._ensureOption(option_names_1.default.screenshots, {}, option_source_1.default.Configuration).value; if (!screenshots.path) screenshots.path = path; } _prepareReporters() { const reporterOption = this._options[option_names_1.default.reporter]; if (!reporterOption) return; const optionValue = lodash_1.castArray(reporterOption.value); reporterOption.value = prepare_reporters_1.default(optionValue); } async _prepareSslOptions() { const sslOptions = this._options[option_names_1.default.ssl]; if (!sslOptions) return; sslOptions.value = await get_options_1.getSSLOptions(sslOptions.value); } _setDefaultValues() { this._ensureOptionWithValue(option_names_1.default.selectorTimeout, default_values_1.DEFAULT_TIMEOUT.selector, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.assertionTimeout, default_values_1.DEFAULT_TIMEOUT.assertion, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.pageLoadTimeout, default_values_1.DEFAULT_TIMEOUT.pageLoad, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.speed, default_values_1.DEFAULT_SPEED_VALUE, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.appInitDelay, default_values_1.DEFAULT_APP_INIT_DELAY, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.concurrency, default_values_1.DEFAULT_CONCURRENCY_VALUE, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.src, default_values_1.DEFAULT_SOURCE_DIRECTORIES, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.developmentMode, default_values_1.DEFAULT_DEVELOPMENT_MODE, option_source_1.default.Configuration); this._ensureOptionWithValue(option_names_1.default.retryTestPages, default_values_1.DEFAULT_RETRY_TEST_PAGES, option_source_1.default.Configuration); this._ensureScreenshotPath(); } static get FILENAME() { return CONFIGURATION_FILENAME; } } exports.default = TestCafeConfiguration; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUtY29uZmlndXJhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWd1cmF0aW9uL3Rlc3RjYWZlLWNvbmZpZ3VyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw4RUFBaUQ7QUFDakQsbUNBQW1DO0FBQ25DLHNEQUFxRTtBQUNyRSxrRUFBMEM7QUFDMUMsMkVBQWlEO0FBQ2pELG1GQUEwRDtBQUMxRCw0Q0FBK0U7QUFDL0UsK0VBQXNEO0FBQ3RELHVGQUFnRTtBQUNoRSx1R0FBNEU7QUFFNUUscURBUzBCO0FBRTFCLG9FQUEyQztBQUczQyxNQUFNLHNCQUFzQixHQUFHLGtCQUFrQixDQUFDO0FBRWxELE1BQU0sNkJBQTZCLEdBQUcsYUFBYSxDQUFDO0FBRXBELE1BQU0saUJBQWlCLEdBQUc7SUFDdEIsc0JBQVksQ0FBQyxZQUFZO0lBQ3pCLHNCQUFZLENBQUMsY0FBYztJQUMzQixzQkFBWSxDQUFDLFNBQVM7SUFDdEIsc0JBQVksQ0FBQyxXQUFXO0lBQ3hCLHNCQUFZLENBQUMsa0JBQWtCO0lBQy9CLHNCQUFZLENBQUMsZUFBZTtJQUM1QixzQkFBWSxDQUFDLHNCQUFzQjtJQUNuQyxzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLGtCQUFrQjtJQUMvQixzQkFBWSxDQUFDLG9CQUFvQjtDQUNwQyxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FBRztJQUMzQixzQkFBWSxDQUFDLGVBQWU7SUFDNUIsc0JBQVksQ0FBQyxjQUFjO0NBQzlCLENBQUM7QUFnQkYsTUFBcUIscUJBQXNCLFNBQVEsNEJBQWE7SUFDNUQ7UUFDSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU0sS0FBSyxDQUFDLElBQUksQ0FBRSxPQUFPLEdBQUcsRUFBRTtRQUMzQixNQUFNLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztR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c0IsQ0FBQyxzQkFBWSxDQUFDLEdBQUcsRUFBRSwyQ0FBMEIsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBWSxDQUFDLGVBQWUsRUFBRSx5Q0FBd0IsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2hILElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBWSxDQUFDLGNBQWMsRUFBRSx5Q0FBd0IsRUFBRSx1QkFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRS9HLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTSxNQUFNLEtBQUssUUFBUTtRQUN0QixPQUFPLHNCQUFzQixDQUFDO0lBQ2xDLENBQUM7Q0FDSjtBQTdJRCx3Q0E2SUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2NvbmZpZ3VyYXRpb24tYmFzZSc7XG5pbXBvcnQgeyBjYXN0QXJyYXkgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZ2V0R3JlcE9wdGlvbnMsIGdldFNTTE9wdGlvbnMgfSBmcm9tICcuLi91dGlscy9nZXQtb3B0aW9ucyc7XG5pbXBvcnQgT1BUSU9OX05BTUVTIGZyb20gJy4vb3B0aW9uLW5hbWVzJztcbmltcG9ydCBnZXRGaWx0ZXJGbiBmcm9tICcuLi91dGlscy9nZXQtZmlsdGVyLWZuJztcbmltcG9ydCBwcmVwYXJlUmVwb3J0ZXJzIGZyb20gJy4uL3V0aWxzL3ByZXBhcmUtcmVwb3J0ZXJzJztcbmltcG9ydCB7IGdldENvbmNhdGVuYXRlZFZhbHVlc1N0cmluZywgZ2V0UGx1cmFsU3VmZml4IH0gZnJvbSAnLi4vdXRpbHMvc3RyaW5nJztcbmltcG9ydCByZW5kZXJUZW1wbGF0ZSBmcm9tICcuLi91dGlscy9yZW5kZXItdGVtcGxhdGUnO1xuaW1wb3J0IFdBUk5JTkdfTUVTU0FHRVMgZnJvbSAnLi4vbm90aWZpY2F0aW9ucy93YXJuaW5nLW1lc3NhZ2UnO1xuaW1wb3J0IHJlc29sdmVQYXRoUmVsYXRpdmVseUN3ZCBmcm9tICcuLi91dGlscy9yZXNvbHZlLXBhdGgtcmVsYXRpdmVseS1jd2QnO1xuXG5pbXBvcnQge1xuICAgIERFRkFVTFRfQVBQX0lOSVRfREVMQVksXG4gICAgREVGQVVMVF9DT05DVVJSRU5DWV9WQUxVRSxcbiAgICBERUZBVUxUX1NQRUVEX1ZBTFVFLFxuICAgIERFRkFVTFRfVElNRU9VVCxcbiAgICBERUZBVUxUX1NPVVJDRV9ESVJFQ1RPUklFUyxcbiAgICBERUZBVUxUX0RFVkVMT1BNRU5UX01PREUsXG4gICAgREVGQVVMVF9SRVRSWV9URVNUX1BBR0VTLFxuICAgIFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1Ncbn0gZnJvbSAnLi9kZWZhdWx0LXZhbHVlcyc7XG5cbmltcG9ydCBPcHRpb25Tb3VyY2UgZnJvbSAnLi9vcHRpb24tc291cmNlJztcbmltcG9ydCB7IERpY3Rpb25hcnksIEZpbHRlck9wdGlvbiwgUmVwb3J0ZXJPcHRpb24sIFN0YXRpY0NvbnRlbnRDYWNoaW5nT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5cbmNvbnN0IENPTkZJR1VSQVRJT05fRklMRU5BTUUgPSAnLnRlc3RjYWZlcmMuanNvbic7XG5cbmNvbnN0IERFRkFVTFRfU0NSRUVOU0hPVFNfRElSRUNUT1JZID0gJ3NjcmVlbnNob3RzJztcblxuY29uc3QgT1BUSU9OX0ZMQUdfTkFNRVMgPSBbXG4gICAgT1BUSU9OX05BTUVTLnNraXBKc0Vycm9ycyxcbiAgICBPUFRJT05fTkFNRVMucXVhcmFudGluZU1vZGUsXG4gICAgT1BUSU9OX05BTUVTLmRlYnVnTW9kZSxcbiAgICBPUFRJT05fTkFNRVMuZGVidWdPbkZhaWwsXG4gICAgT1BUSU9OX05BTUVTLnNraXBVbmNhdWdodEVycm9ycyxcbiAgICBPUFRJT05fTkFNRVMuc3RvcE9uRmlyc3RGYWlsLFxuICAgIE9QVElPTl9OQU1FUy50YWtlU2NyZWVuc2hvdHNPbkZhaWxzLFxuICAgIE9QVElPTl9OQU1FUy5kaXNhYmxlUGFnZUNhY2hpbmcsXG4gICAgT1BUSU9OX05BTUVTLmRpc2FibGVQYWdlUmVsb2FkcyxcbiAgICBPUFRJT05fTkFNRVMuZGlzYWJsZVNjcmVlbnNob3RzLFxuICAgIE9QVElPTl9OQU1FUy5hbGxvd011bHRpcGxlV2luZG93c1xuXTtcblxuY29uc3QgT1BUSU9OX0lOSVRfRkxBR19OQU1FUyA9IFtcbiAgICBPUFRJT05fTkFNRVMuZGV2ZWxvcG1lbnRNb2RlLFxuICAgIE9QVElPTl9OQU1FUy5yZXRyeVRlc3RQYWdlcyxcbl07XG5cbmludGVyZmFjZSBUZXN0Q2FmZUFkZGl0aW9uYWxTdGFydE9wdGlvbnMge1xuICAgIHJldHJ5VGVzdFBhZ2VzOiBib29sZWFuO1xuICAgIHNzbDogc3RyaW5nO1xuICAgIHN0YXRpY0NvbnRlbnRDYWNoaW5nPzogU3RhdGljQ29udGVudENhY2hpbmdPcHRpb25zO1xuICAgIGRldmVsb3BtZW50TW9kZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFRlc3RDYWZlU3RhcnRPcHRpb25zIHtcbiAgICBob3N0bmFtZT86IHN0cmluZztcbiAgICBwb3J0MT86IG51bWJlcjtcbiAgICBwb3J0Mj86IG51bWJlcjtcbiAgICBvcHRpb25zOiBUZXN0Q2FmZUFkZGl0aW9uYWxTdGFydE9wdGlvbnM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYWZlQ29uZmlndXJhdGlvbiBleHRlbmRzIENvbmZpZ3VyYXRpb24ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHN1cGVyKENPTkZJR1VSQVRJT05fRklMRU5BTUUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBpbml0IChvcHRpb25zID0ge30pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgYXdhaXQgc3VwZXIuaW5pdCgpO1xuXG4gICAgICAgIGNvbnN0IG9wdHMgPSBhd2FpdCB0aGlzLl9sb2FkKCk7XG5cbiAgICAgICAgaWYgKG9wdHMpIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBDb25maWd1cmF0aW9uLl9mcm9tT2JqKG9wdHMpO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9ub3JtYWxpemVPcHRpb25zQWZ0ZXJMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1lcmdlT3B0aW9ucyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZSAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVGbGFncygpO1xuICAgICAgICB0aGlzLl9zZXREZWZhdWx0VmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeUFib3V0T3ZlcnJpZGRlbk9wdGlvbnMgKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuX292ZXJyaWRkZW5PcHRpb25zLmxlbmd0aClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICBjb25zdCBvcHRpb25zU3RyICAgID0gZ2V0Q29uY2F0ZW5hdGVkVmFsdWVzU3RyaW5nKHRoaXMuX292ZXJyaWRkZW5PcHRpb25zKTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc1N1ZmZpeCA9IGdldFBsdXJhbFN1ZmZpeCh0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5fc2hvd0NvbnNvbGVXYXJuaW5nKHJlbmRlclRlbXBsYXRlKFdBUk5JTkdfTUVTU0FHRVMuY29uZmlnT3B0aW9uc1dlcmVPdmVycmlkZW4sIG9wdGlvbnNTdHIsIG9wdGlvbnNTdWZmaXgpKTtcblxuICAgICAgICB0aGlzLl9vdmVycmlkZGVuT3B0aW9ucyA9IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgc3RhcnRPcHRpb25zICgpOiBUZXN0Q2FmZVN0YXJ0T3B0aW9ucyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogVGVzdENhZmVTdGFydE9wdGlvbnMgPSB7XG4gICAgICAgICAgICBob3N0bmFtZTogdGhpcy5nZXRPcHRpb24oJ2hvc3RuYW1lJykgYXMgc3RyaW5nLFxuICAgICAgICAgICAgcG9ydDE6ICAgIHRoaXMuZ2V0T3B0aW9uKCdwb3J0MScpIGFzIG51bWJlcixcbiAgICAgICAgICAgIHBvcnQyOiAgICB0aGlzLmdldE9wdGlvbigncG9ydDInKSBhcyBudW1iZXIsXG5cbiAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBzc2w6ICAgICAgICAgICAgIHRoaXMuZ2V0T3B0aW9uKCdzc2wnKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiB0aGlzLmdldE9wdGlvbignZGV2ZWxvcG1lbnRNb2RlJykgYXMgYm9vbGVhbixcbiAgICAgICAgICAgICAgICByZXRyeVRlc3RQYWdlczogIHRoaXMuZ2V0T3B0aW9uKCdyZXRyeVRlc3RQYWdlcycpIGFzIGJvb2xlYW5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocmVzdWx0Lm9wdGlvbnMucmV0cnlUZXN0UGFnZXMpXG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucy5zdGF0aWNDb250ZW50Q2FjaGluZyA9IFNUQVRJQ19DT05URU5UX0NBQ0hJTkdfU0VUVElOR1M7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmxhZyAobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHRoaXMuX2Vuc3VyZU9wdGlvbihuYW1lLCB2b2lkIDAsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcblxuICAgICAgICBvcHRpb24udmFsdWUgPSAhIW9wdGlvbi52YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmxhZ3MgKCk6IHZvaWQge1xuICAgICAgICBPUFRJT05fRkxBR19OQU1FUy5mb3JFYWNoKG5hbWUgPT4gdGhpcy5fcHJlcGFyZUZsYWcobmFtZSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVJbml0RmxhZ3MgKCk6IHZvaWQge1xuICAgICAgICBPUFRJT05fSU5JVF9GTEFHX05BTUVTLmZvckVhY2gobmFtZSA9PiB0aGlzLl9wcmVwYXJlRmxhZyhuYW1lKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBfbm9ybWFsaXplT3B0aW9uc0FmdGVyTG9hZCAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGF3YWl0IHRoaXMuX3ByZXBhcmVTc2xPcHRpb25zKCk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVJbml0RmxhZ3MoKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZUZpbHRlckZuKCk7XG4gICAgICAgIHRoaXMuX2Vuc3VyZUFycmF5T3B0aW9uKE9QVElPTl9OQU1FUy5zcmMpO1xuICAgICAgICB0aGlzLl9lbnN1cmVBcnJheU9wdGlvbihPUFRJT05fTkFNRVMuYnJvd3NlcnMpO1xuICAgICAgICB0aGlzLl9lbnN1cmVBcnJheU9wdGlvbihPUFRJT05fTkFNRVMuY2xpZW50U2NyaXB0cyk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVSZXBvcnRlcnMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wcmVwYXJlRmlsdGVyRm4gKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWx0ZXJPcHRpb24gPSB0aGlzLl9lbnN1cmVPcHRpb24oT1BUSU9OX05BTUVTLmZpbHRlciwgbnVsbCwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuXG4gICAgICAgIGlmICghZmlsdGVyT3B0aW9uLnZhbHVlKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGZpbHRlck9wdGlvblZhbHVlID0gZmlsdGVyT3B0aW9uLnZhbHVlIGFzIEZpbHRlck9wdGlvbjtcblxuICAgICAgICBpZiAoZmlsdGVyT3B0aW9uVmFsdWUudGVzdEdyZXApXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb25WYWx1ZS50ZXN0R3JlcCA9IGdldEdyZXBPcHRpb25zKE9QVElPTl9OQU1FUy5maWx0ZXJUZXN0R3JlcCwgZmlsdGVyT3B0aW9uVmFsdWUudGVzdEdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBpZiAoZmlsdGVyT3B0aW9uVmFsdWUuZml4dHVyZUdyZXApXG4gICAgICAgICAgICBmaWx0ZXJPcHRpb25WYWx1ZS5maXh0dXJlR3JlcCA9IGdldEdyZXBPcHRpb25zKE9QVElPTl9OQU1FUy5maWx0ZXJGaXh0dXJlR3JlcCwgZmlsdGVyT3B0aW9uVmFsdWUuZml4dHVyZUdyZXAgYXMgc3RyaW5nKTtcblxuICAgICAgICBmaWx0ZXJPcHRpb24udmFsdWUgPSBnZXRGaWx0ZXJGbihmaWx0ZXJPcHRpb24udmFsdWUpIGFzIEZ1bmN0aW9uO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2Vuc3VyZVNjcmVlbnNob3RQYXRoICgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcGF0aCAgICAgICAgPSByZXNvbHZlUGF0aFJlbGF0aXZlbHlDd2QoREVGQVVMVF9TQ1JFRU5TSE9UU19ESVJFQ1RPUlkpO1xuICAgICAgICBjb25zdCBzY3JlZW5zaG90cyA9IHRoaXMuX2Vuc3VyZU9wdGlvbihPUFRJT05fTkFNRVMuc2NyZWVuc2hvdHMsIHt9LCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbikudmFsdWUgYXMgRGljdGlvbmFyeTxzdHJpbmc+O1xuXG4gICAgICAgIGlmICghc2NyZWVuc2hvdHMucGF0aClcbiAgICAgICAgICAgIHNjcmVlbnNob3RzLnBhdGggPSBwYXRoO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ByZXBhcmVSZXBvcnRlcnMgKCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXBvcnRlck9wdGlvbiA9IHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnJlcG9ydGVyXTtcblxuICAgICAgICBpZiAoIXJlcG9ydGVyT3B0aW9uKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gY2FzdEFycmF5KHJlcG9ydGVyT3B0aW9uLnZhbHVlIGFzIFJlcG9ydGVyT3B0aW9uKTtcblxuICAgICAgICByZXBvcnRlck9wdGlvbi52YWx1ZSA9IHByZXBhcmVSZXBvcnRlcnMob3B0aW9uVmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgX3ByZXBhcmVTc2xPcHRpb25zICgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3Qgc3NsT3B0aW9ucyA9IHRoaXMuX29wdGlvbnNbT1BUSU9OX05BTUVTLnNzbF07XG5cbiAgICAgICAgaWYgKCFzc2xPcHRpb25zKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHNzbE9wdGlvbnMudmFsdWUgPSBhd2FpdCBnZXRTU0xPcHRpb25zKHNzbE9wdGlvbnMudmFsdWUgYXMgc3RyaW5nKSBhcyBEaWN0aW9uYXJ5PHN0cmluZyB8IGJvb2xlYW4gfCBudW1iZXI+O1xuICAgIH1cblxuICAgIHByaXZhdGUgX3NldERlZmF1bHRWYWx1ZXMgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnNlbGVjdG9yVGltZW91dCwgREVGQVVMVF9USU1FT1VULnNlbGVjdG9yLCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuYXNzZXJ0aW9uVGltZW91dCwgREVGQVVMVF9USU1FT1VULmFzc2VydGlvbiwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnBhZ2VMb2FkVGltZW91dCwgREVGQVVMVF9USU1FT1VULnBhZ2VMb2FkLCBPcHRpb25Tb3VyY2UuQ29uZmlndXJhdGlvbik7XG4gICAgICAgIHRoaXMuX2Vuc3VyZU9wdGlvbldpdGhWYWx1ZShPUFRJT05fTkFNRVMuc3BlZWQsIERFRkFVTFRfU1BFRURfVkFMVUUsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5hcHBJbml0RGVsYXksIERFRkFVTFRfQVBQX0lOSVRfREVMQVksIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5jb25jdXJyZW5jeSwgREVGQVVMVF9DT05DVVJSRU5DWV9WQUxVRSwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnNyYywgREVGQVVMVF9TT1VSQ0VfRElSRUNUT1JJRVMsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcbiAgICAgICAgdGhpcy5fZW5zdXJlT3B0aW9uV2l0aFZhbHVlKE9QVElPTl9OQU1FUy5kZXZlbG9wbWVudE1vZGUsIERFRkFVTFRfREVWRUxPUE1FTlRfTU9ERSwgT3B0aW9uU291cmNlLkNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB0aGlzLl9lbnN1cmVPcHRpb25XaXRoVmFsdWUoT1BUSU9OX05BTUVTLnJldHJ5VGVzdFBhZ2VzLCBERUZBVUxUX1JFVFJZX1RFU1RfUEFHRVMsIE9wdGlvblNvdXJjZS5Db25maWd1cmF0aW9uKTtcblxuICAgICAgICB0aGlzLl9lbnN1cmVTY3JlZW5zaG90UGF0aCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0IEZJTEVOQU1FICgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gQ09ORklHVVJBVElPTl9GSUxFTkFNRTtcbiAgICB9XG59XG4iXX0=