"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const chalk_1 = __importDefault(require("chalk")); const runtime_1 = require("../errors/runtime"); const types_1 = require("../errors/types"); const argument_parser_1 = __importDefault(require("./argument-parser")); const termination_handler_1 = __importDefault(require("./termination-handler")); const log_1 = __importDefault(require("./log")); const remotes_wizard_1 = __importDefault(require("./remotes-wizard")); const correct_browsers_and_sources_1 = __importDefault(require("./correct-browsers-and-sources")); const __1 = __importDefault(require("../")); const debug_1 = __importDefault(require("debug")); const log_entry_1 = __importDefault(require("../utils/log-entry")); const dashboard_1 = __importDefault(require("../dashboard")); const LOGGER = (0, debug_1.default)('testcafe:cli'); // NOTE: Load the provider pool lazily to reduce startup time const lazyRequire = require('import-lazy')(require); const browserProviderPool = lazyRequire('../browser/provider/pool'); let showMessageOnExit = true; let exitMessageShown = false; let exiting = false; function exitHandler(terminationLevel) { if (showMessageOnExit && !exitMessageShown) { exitMessageShown = true; log_1.default.write('Stopping TestCafe...'); process.on('exit', () => log_1.default.hideSpinner(true)); } if (exiting || terminationLevel < 2) return; exiting = true; exit(0); } function exit(code) { log_1.default.hideSpinner(true); // NOTE: give a process time to flush the output. // It's necessary in some environments. setTimeout(() => process.exit(code), 0); } function error(err) { log_1.default.hideSpinner(); let message = null; if (err instanceof runtime_1.GeneralError) message = err.message; else if (err instanceof runtime_1.APIError) message = err.coloredStack; else message = err.stack; log_1.default.write(chalk_1.default.red('ERROR ') + message + '\n'); log_1.default.write(chalk_1.default.gray('Type "testcafe -h" for help.')); exit(1); } async function runTests(argParser) { const opts = argParser.opts; const port1 = opts.ports && opts.ports[0]; const port2 = opts.ports && opts.ports[1]; const proxy = opts.proxy; const proxyBypass = opts.proxyBypass; const configFile = opts.configFile; log_1.default.showSpinner(); const { hostname, ssl, dev, experimentalDebug, retryTestPages, cache, disableHttp2, v8Flags, experimentalProxyless, disableCrossDomain, experimentalEsm, } = opts; const testCafe = await (0, __1.default)({ developmentMode: dev, isCli: true, hostname, port1, port2, ssl, experimentalDebug, retryTestPages, cache, configFile, disableHttp2, v8Flags, experimentalProxyless, disableCrossDomain, experimentalEsm, }); const correctedBrowsersAndSources = await (0, correct_browsers_and_sources_1.default)(argParser, testCafe.configuration); const automatedBrowsers = correctedBrowsersAndSources.browsers; const remoteBrowsers = await (0, remotes_wizard_1.default)(testCafe, argParser.remoteCount, opts.qrCode); const browsers = automatedBrowsers.concat(remoteBrowsers); const sources = correctedBrowsersAndSources.sources; const runner = opts.live ? testCafe.createLiveModeRunner() : testCafe.createRunner(); let failed = 0; runner .useProxy(proxy, proxyBypass) .src(sources) .tsConfigPath(argParser.opts.tsConfigPath) .browsers(browsers) .reporter(argParser.opts.reporter) .concurrency(argParser.opts.concurrency) .filter(argParser.opts.filter) .video(opts.video, opts.videoOptions, opts.videoEncodingOptions) .screenshots(opts.screenshots) .startApp(opts.app, opts.appInitDelay) .clientScripts(argParser.opts.clientScripts) .compilerOptions(argParser.opts.compilerOptions); runner.once('done-bootstrapping', () => log_1.default.hideSpinner()); try { const runOpts = argParser.getRunOptions(); failed = await runner.run(runOpts); } finally { showMessageOnExit = false; await testCafe.close(); } exit(failed); } async function runDashboardIntegration(state) { await (0, dashboard_1.default)(state); exit(0); } async function listBrowsers(providerName) { const provider = await browserProviderPool.getProvider(providerName); if (!provider) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.browserProviderNotFound, providerName); if (provider.isMultiBrowser) { const browserNames = await provider.getBrowserList(); await browserProviderPool.dispose(); if (providerName === 'locally-installed') console.log(browserNames.join('\n')); else console.log(browserNames.map(browserName => `"${providerName}:${browserName}"`).join('\n')); } else console.log(`"${providerName}"`); exit(0); } (async function cli() { const terminationHandler = new termination_handler_1.default(); terminationHandler.on(termination_handler_1.default.TERMINATION_LEVEL_INCREASED_EVENT, exitHandler); try { const argParser = new argument_parser_1.default(); (0, log_entry_1.default)(LOGGER, process.argv); await argParser.parse(process.argv); (0, log_entry_1.default)(LOGGER, argParser.opts); if (argParser.isDashboardCommand) await runDashboardIntegration(argParser.sendReportState); else if (argParser.opts.listBrowsers) await listBrowsers(argParser.opts.providerName); else await runTests(argParser); } catch (err) { showMessageOnExit = false; error(err); } })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS9jbGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxrREFBMEI7QUFDMUIsK0NBQTJEO0FBQzNELDJDQUFpRDtBQUNqRCx3RUFBa0Q7QUFDbEQsZ0ZBQXVEO0FBQ3ZELGdEQUF3QjtBQUN4QixzRUFBNkM7QUFDN0Msa0dBQXVFO0FBQ3ZFLDRDQUFpQztBQUNqQyxrREFBMEI7QUFDMUIsbUVBQTBDO0FBQzFDLDZEQUFnRDtBQUVoRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGVBQUssRUFBQyxjQUFjLENBQUMsQ0FBQztBQUVyQyw2REFBNkQ7QUFDN0QsTUFBTSxXQUFXLEdBQVcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzVELE1BQU0sbUJBQW1CLEdBQUcsV0FBVyxDQUFDLDBCQUEwQixDQUFDLENBQUM7QUFFcEUsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDN0IsSUFBSSxnQkFBZ0IsR0FBSSxLQUFLLENBQUM7QUFDOUIsSUFBSSxPQUFPLEdBQWEsS0FBSyxDQUFDO0FBRTlCLFNBQVMsV0FBVyxDQUFFLGdCQUFnQjtJQUNsQyxJQUFJLGlCQUFpQixJQUFJLENBQUMsZ0JBQWdCLEVBQUU7UUFDeEMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXhCLGFBQUcsQ0FBQyxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUVsQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDbkQ7SUFFRCxJQUFJLE9BQU8sSUFBSSxnQkFBZ0IsR0FBRyxDQUFDO1FBQy9CLE9BQU87SUFFWCxPQUFPLEdBQUcsSUFBSSxDQUFDO0lBRWYsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ1osQ0FBQztBQUVELFNBQVMsSUFBSSxD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QUFNLFNBQVMsR0FBRyxJQUFJLHlCQUFpQixFQUFFLENBQUM7UUFFMUMsSUFBQSxtQkFBUSxFQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFL0IsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwQyxJQUFBLG1CQUFRLEVBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVqQyxJQUFJLFNBQVMsQ0FBQyxrQkFBa0I7WUFDNUIsTUFBTSx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7YUFDeEQsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVk7WUFDaEMsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQzs7WUFFaEQsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDakM7SUFDRCxPQUFPLEdBQUcsRUFBRTtRQUNSLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMxQixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDZDtBQUNMLENBQUMsQ0FBQyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgR2VuZXJhbEVycm9yLCBBUElFcnJvciB9IGZyb20gJy4uL2Vycm9ycy9ydW50aW1lJztcbmltcG9ydCB7IFJVTlRJTUVfRVJST1JTIH0gZnJvbSAnLi4vZXJyb3JzL3R5cGVzJztcbmltcG9ydCBDbGlBcmd1bWVudFBhcnNlciBmcm9tICcuL2FyZ3VtZW50LXBhcnNlcic7XG5pbXBvcnQgVGVybWluYXRpb25IYW5kbGVyIGZyb20gJy4vdGVybWluYXRpb24taGFuZGxlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCByZW1vdGVzV2l6YXJkIGZyb20gJy4vcmVtb3Rlcy13aXphcmQnO1xuaW1wb3J0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMgZnJvbSAnLi9jb3JyZWN0LWJyb3dzZXJzLWFuZC1zb3VyY2VzJztcbmltcG9ydCBjcmVhdGVUZXN0Q2FmZSBmcm9tICcuLi8nO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCBsb2dFbnRyeSBmcm9tICcuLi91dGlscy9sb2ctZW50cnknO1xuaW1wb3J0IGRhc2hib2FyZEludGVncmF0aW9uIGZyb20gJy4uL2Rhc2hib2FyZCc7XG5cbmNvbnN0IExPR0dFUiA9IGRlYnVnKCd0ZXN0Y2FmZTpjbGknKTtcblxuLy8gTk9URTogTG9hZCB0aGUgcHJvdmlkZXIgcG9vbCBsYXppbHkgdG8gcmVkdWNlIHN0YXJ0dXAgdGltZVxuY29uc3QgbGF6eVJlcXVpcmUgICAgICAgICA9IHJlcXVpcmUoJ2ltcG9ydC1sYXp5JykocmVxdWlyZSk7XG5jb25zdCBicm93c2VyUHJvdmlkZXJQb29sID0gbGF6eVJlcXVpcmUoJy4uL2Jyb3dzZXIvcHJvdmlkZXIvcG9vbCcpO1xuXG5sZXQgc2hvd01lc3NhZ2VPbkV4aXQgPSB0cnVlO1xubGV0IGV4aXRNZXNzYWdlU2hvd24gID0gZmFsc2U7XG5sZXQgZXhpdGluZyAgICAgICAgICAgPSBmYWxzZTtcblxuZnVuY3Rpb24gZXhpdEhhbmRsZXIgKHRlcm1pbmF0aW9uTGV2ZWwpIHtcbiAgICBpZiAoc2hvd01lc3NhZ2VPbkV4aXQgJiYgIWV4aXRNZXNzYWdlU2hvd24pIHtcbiAgICAgICAgZXhpdE1lc3NhZ2VTaG93biA9IHRydWU7XG5cbiAgICAgICAgbG9nLndyaXRlKCdTdG9wcGluZyBUZXN0Q2FmZS4uLicpO1xuXG4gICAgICAgIHByb2Nlc3Mub24oJ2V4aXQnLCAoKSA9PiBsb2cuaGlkZVNwaW5uZXIodHJ1ZSkpO1xuICAgIH1cblxuICAgIGlmIChleGl0aW5nIHx8IHRlcm1pbmF0aW9uTGV2ZWwgPCAyKVxuICAgICAgICByZXR1cm47XG5cbiAgICBleGl0aW5nID0gdHJ1ZTtcblxuICAgIGV4aXQoMCk7XG59XG5cbmZ1bmN0aW9uIGV4aXQgKGNvZGUpIHtcbiAgICBsb2cuaGlkZVNwaW5uZXIodHJ1ZSk7XG5cbiAgICAvLyBOT1RFOiBnaXZlIGEgcHJvY2VzcyB0aW1lIHRvIGZsdXNoIHRoZSBvdXRwdXQuXG4gICAgLy8gSXQncyBuZWNlc3NhcnkgaW4gc29tZSBlbnZpcm9ubWVudHMuXG4gICAgc2V0VGltZW91dCgoKSA9PiBwcm9jZXNzLmV4aXQoY29kZSksIDApO1xufVxuXG5mdW5jdGlvbiBlcnJvciAoZXJyKSB7XG4gICAgbG9nLmhpZGVTcGlubmVyKCk7XG5cbiAgICBsZXQgbWVzc2FnZSA9IG51bGw7XG5cbiAgICBpZiAoZXJyIGluc3RhbmNlb2YgR2VuZXJhbEVycm9yKVxuICAgICAgICBtZXNzYWdlID0gZXJyLm1lc3NhZ2U7XG5cbiAgICBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBBUElFcnJvcilcbiAgICAgICAgbWVzc2FnZSA9IGVyci5jb2xvcmVkU3RhY2s7XG5cbiAgICBlbHNlXG4gICAgICAgIG1lc3NhZ2UgPSBlcnIuc3RhY2s7XG5cbiAgICBsb2cud3JpdGUoY2hhbGsucmVkKCdFUlJPUiAnKSArIG1lc3NhZ2UgKyAnXFxuJyk7XG4gICAgbG9nLndyaXRlKGNoYWxrLmdyYXkoJ1R5cGUgXCJ0ZXN0Y2FmZSAtaFwiIGZvciBoZWxwLicpKTtcblxuICAgIGV4aXQoMSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blRlc3RzIChhcmdQYXJzZXIpIHtcbiAgICBjb25zdCBvcHRzICAgICAgICA9IGFyZ1BhcnNlci5vcHRzO1xuICAgIGNvbnN0IHBvcnQxICAgICAgID0gb3B0cy5wb3J0cyAmJiBvcHRzLnBvcnRzWzBdO1xuICAgIGNvbnN0IHBvcnQyICAgICAgID0gb3B0cy5wb3J0cyAmJiBvcHRzLnBvcnRzWzFdO1xuICAgIGNvbnN0IHByb3h5ICAgICAgID0gb3B0cy5wcm94eTtcbiAgICBjb25zdCBwcm94eUJ5cGFzcyA9IG9wdHMucHJveHlCeXBhc3M7XG4gICAgY29uc3QgY29uZmlnRmlsZSAgPSBvcHRzLmNvbmZpZ0ZpbGU7XG5cbiAgICBsb2cuc2hvd1NwaW5uZXIoKTtcblxuICAgIGNvbnN0IHtcbiAgICAgICAgaG9zdG5hbWUsXG4gICAgICAgIHNzbCxcbiAgICAgICAgZGV2LFxuICAgICAgICBleHBlcmltZW50YWxEZWJ1ZyxcbiAgICAgICAgcmV0cnlUZXN0UGFnZXMsXG4gICAgICAgIGNhY2hlLFxuICAgICAgICBkaXNhYmxlSHR0cDIsXG4gICAgICAgIHY4RmxhZ3MsXG4gICAgICAgIGV4cGVyaW1lbnRhbFByb3h5bGVzcyxcbiAgICAgICAgZGlzYWJsZUNyb3NzRG9tYWluLFxuICAgICAgICBleHBlcmltZW50YWxFc20sXG4gICAgfSA9IG9wdHM7XG5cbiAgICBjb25zdCB0ZXN0Q2FmZSA9IGF3YWl0IGNyZWF0ZVRlc3RDYWZlKHtcbiAgICAgICAgZGV2ZWxvcG1lbnRNb2RlOiBkZXYsXG4gICAgICAgIGlzQ2xpOiAgICAgICAgICAgdHJ1ZSxcblxuICAgICAgICBob3N0bmFtZSxcbiAgICAgICAgcG9ydDEsXG4gICAgICAgIHBvcnQyLFxuICAgICAgICBzc2wsXG4gICAgICAgIGV4cGVyaW1lbnRhbERlYnVnLFxuICAgICAgICByZXRyeVRlc3RQYWdlcyxcbiAgICAgICAgY2FjaGUsXG4gICAgICAgIGNvbmZpZ0ZpbGUsXG4gICAgICAgIGRpc2FibGVIdHRwMixcbiAgICAgICAgdjhGbGFncyxcbiAgICAgICAgZXhwZXJpbWVudGFsUHJveHlsZXNzLFxuICAgICAgICBkaXNhYmxlQ3Jvc3NEb21haW4sXG4gICAgICAgIGV4cGVyaW1lbnRhbEVzbSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZEJyb3dzZXJzQW5kU291cmNlcyA9IGF3YWl0IGNvcnJlY3RCcm93c2Vyc0FuZFNvdXJjZXMoYXJnUGFyc2VyLCB0ZXN0Q2FmZS5jb25maWd1cmF0aW9uKTtcbiAgICBjb25zdCBhdXRvbWF0ZWRCcm93c2VycyAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuYnJvd3NlcnM7XG4gICAgY29uc3QgcmVtb3RlQnJvd3NlcnMgICAgICAgICAgICAgID0gYXdhaXQgcmVtb3Rlc1dpemFyZCh0ZXN0Q2FmZSwgYXJnUGFyc2VyLnJlbW90ZUNvdW50LCBvcHRzLnFyQ29kZSk7XG4gICAgY29uc3QgYnJvd3NlcnMgICAgICAgICAgICAgICAgICAgID0gYXV0b21hdGVkQnJvd3NlcnMuY29uY2F0KHJlbW90ZUJyb3dzZXJzKTtcbiAgICBjb25zdCBzb3VyY2VzICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRCcm93c2Vyc0FuZFNvdXJjZXMuc291cmNlcztcblxuICAgIGNvbnN0IHJ1bm5lciA9IG9wdHMubGl2ZSA/IHRlc3RDYWZlLmNyZWF0ZUxpdmVNb2RlUnVubmVyKCkgOiB0ZXN0Q2FmZS5jcmVhdGVSdW5uZXIoKTtcblxuICAgIGxldCBmYWlsZWQgPSAwO1xuXG4gICAgcnVubmVyXG4gICAgICAgIC51c2VQcm94eShwcm94eSwgcHJveHlCeXBhc3MpXG4gICAgICAgIC5zcmMoc291cmNlcylcbiAgICAgICAgLnRzQ29uZmlnUGF0aChhcmdQYXJzZXIub3B0cy50c0NvbmZpZ1BhdGgpXG4gICAgICAgIC5icm93c2Vycyhicm93c2VycylcbiAgICAgICAgLnJlcG9ydGVyKGFyZ1BhcnNlci5vcHRzLnJlcG9ydGVyKVxuICAgICAgICAuY29uY3VycmVuY3koYXJnUGFyc2VyLm9wdHMuY29uY3VycmVuY3kpXG4gICAgICAgIC5maWx0ZXIoYXJnUGFyc2VyLm9wdHMuZmlsdGVyKVxuICAgICAgICAudmlkZW8ob3B0cy52aWRlbywgb3B0cy52aWRlb09wdGlvbnMsIG9wdHMudmlkZW9FbmNvZGluZ09wdGlvbnMpXG4gICAgICAgIC5zY3JlZW5zaG90cyhvcHRzLnNjcmVlbnNob3RzKVxuICAgICAgICAuc3RhcnRBcHAob3B0cy5hcHAsIG9wdHMuYXBwSW5pdERlbGF5KVxuICAgICAgICAuY2xpZW50U2NyaXB0cyhhcmdQYXJzZXIub3B0cy5jbGllbnRTY3JpcHRzKVxuICAgICAgICAuY29tcGlsZXJPcHRpb25zKGFyZ1BhcnNlci5vcHRzLmNvbXBpbGVyT3B0aW9ucyk7XG5cbiAgICBydW5uZXIub25jZSgnZG9uZS1ib290c3RyYXBwaW5nJywgKCkgPT4gbG9nLmhpZGVTcGlubmVyKCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcnVuT3B0cyA9IGFyZ1BhcnNlci5nZXRSdW5PcHRpb25zKCk7XG5cbiAgICAgICAgZmFpbGVkID0gYXdhaXQgcnVubmVyLnJ1bihydW5PcHRzKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGF3YWl0IHRlc3RDYWZlLmNsb3NlKCk7XG4gICAgfVxuXG4gICAgZXhpdChmYWlsZWQpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5EYXNoYm9hcmRJbnRlZ3JhdGlvbiAoc3RhdGUpIHtcbiAgICBhd2FpdCBkYXNoYm9hcmRJbnRlZ3JhdGlvbihzdGF0ZSk7XG5cbiAgICBleGl0KDApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBsaXN0QnJvd3NlcnMgKHByb3ZpZGVyTmFtZSkge1xuICAgIGNvbnN0IHByb3ZpZGVyID0gYXdhaXQgYnJvd3NlclByb3ZpZGVyUG9vbC5nZXRQcm92aWRlcihwcm92aWRlck5hbWUpO1xuXG4gICAgaWYgKCFwcm92aWRlcilcbiAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5icm93c2VyUHJvdmlkZXJOb3RGb3VuZCwgcHJvdmlkZXJOYW1lKTtcblxuICAgIGlmIChwcm92aWRlci5pc011bHRpQnJvd3Nlcikge1xuICAgICAgICBjb25zdCBicm93c2VyTmFtZXMgPSBhd2FpdCBwcm92aWRlci5nZXRCcm93c2VyTGlzdCgpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuXG4gICAgICAgIGlmIChwcm92aWRlck5hbWUgPT09ICdsb2NhbGx5LWluc3RhbGxlZCcpXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMuam9pbignXFxuJykpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhicm93c2VyTmFtZXMubWFwKGJyb3dzZXJOYW1lID0+IGBcIiR7IHByb3ZpZGVyTmFtZSB9OiR7IGJyb3dzZXJOYW1lIH1cImApLmpvaW4oJ1xcbicpKTtcbiAgICB9XG4gICAgZWxzZVxuICAgICAgICBjb25zb2xlLmxvZyhgXCIkeyBwcm92aWRlck5hbWUgfVwiYCk7XG5cbiAgICBleGl0KDApO1xufVxuXG4oYXN5bmMgZnVuY3Rpb24gY2xpICgpIHtcbiAgICBjb25zdCB0ZXJtaW5hdGlvbkhhbmRsZXIgPSBuZXcgVGVybWluYXRpb25IYW5kbGVyKCk7XG5cbiAgICB0ZXJtaW5hdGlvbkhhbmRsZXIub24oVGVybWluYXRpb25IYW5kbGVyLlRFUk1JTkFUSU9OX0xFVkVMX0lOQ1JFQVNFRF9FVkVOVCwgZXhpdEhhbmRsZXIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXJnUGFyc2VyID0gbmV3IENsaUFyZ3VtZW50UGFyc2VyKCk7XG5cbiAgICAgICAgbG9nRW50cnkoTE9HR0VSLCBwcm9jZXNzLmFyZ3YpO1xuXG4gICAgICAgIGF3YWl0IGFyZ1BhcnNlci5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG4gICAgICAgIGxvZ0VudHJ5KExPR0dFUiwgYXJnUGFyc2VyLm9wdHMpO1xuXG4gICAgICAgIGlmIChhcmdQYXJzZXIuaXNEYXNoYm9hcmRDb21tYW5kKVxuICAgICAgICAgICAgYXdhaXQgcnVuRGFzaGJvYXJkSW50ZWdyYXRpb24oYXJnUGFyc2VyLnNlbmRSZXBvcnRTdGF0ZSk7XG4gICAgICAgIGVsc2UgaWYgKGFyZ1BhcnNlci5vcHRzLmxpc3RCcm93c2VycylcbiAgICAgICAgICAgIGF3YWl0IGxpc3RCcm93c2VycyhhcmdQYXJzZXIub3B0cy5wcm92aWRlck5hbWUpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICBhd2FpdCBydW5UZXN0cyhhcmdQYXJzZXIpO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNob3dNZXNzYWdlT25FeGl0ID0gZmFsc2U7XG4gICAgICAgIGVycm9yKGVycik7XG4gICAgfVxufSkoKTtcblxuIl19