UNPKG

testcafe

Version:

Automated browser testing for the modern web development stack.

124 lines 19 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const runtime_1 = require("./errors/runtime"); const types_1 = require("./errors/types"); const content_types_1 = __importDefault(require("./assets/content-types")); const option_names_1 = __importDefault(require("./configuration/option-names")); const INJECTABLES = __importStar(require("./assets/injectables")); const setup_sourcemap_support_1 = require("./utils/setup-sourcemap-support"); const status_1 = __importDefault(require("./browser/connection/gateway/status")); const lazyRequire = require('import-lazy')(require); const hammerhead = lazyRequire('testcafe-hammerhead'); const loadAssets = lazyRequire('./load-assets'); const errorHandlers = lazyRequire('./utils/handle-errors'); const BrowserConnectionGateway = lazyRequire('./browser/connection/gateway'); const BrowserConnection = lazyRequire('./browser/connection'); const browserProviderPool = lazyRequire('./browser/provider/pool'); const Runner = lazyRequire('./runner'); const LiveModeRunner = lazyRequire('./live/test-runner'); // NOTE: CoffeeScript can't be loaded lazily, because it will break stack traces require('coffeescript'); class TestCafe { constructor(configuration) { (0, setup_sourcemap_support_1.setupSourceMapSupport)(); errorHandlers.registerErrorHandlers(); this.closed = false; this.proxy = new hammerhead.Proxy(); this.runners = []; this.configuration = configuration; this.browserConnectionGateway = new BrowserConnectionGateway(this.proxy, this.configuration.browserConnectionGatewayOptions); const developmentMode = configuration.getOption(option_names_1.default.developmentMode); this.browserConnectionGateway.on('initialized', () => { this._registerAssets(developmentMode); }); } _registerAssets(developmentMode) { const { favIcon, coreScript, driverScript, uiScript, uiStyle, uiSprite, uiSpriteSvg, automationScript, legacyRunnerScript } = loadAssets(developmentMode); this.proxy.GET(INJECTABLES.TESTCAFE_CORE, { content: coreScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_DRIVER, { content: driverScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_LEGACY_RUNNER, { content: legacyRunnerScript, contentType: content_types_1.default.javascript, }); this.proxy.GET(INJECTABLES.TESTCAFE_AUTOMATION, { content: automationScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_UI, { content: uiScript, contentType: content_types_1.default.javascript }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE, { content: uiSprite, contentType: content_types_1.default.png }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_SPRITE_SVG, { content: uiSpriteSvg, contentType: content_types_1.default.svg }); this.proxy.GET(INJECTABLES.DEFAULT_FAVICON_PATH, { content: favIcon, contentType: content_types_1.default.icon }); this.proxy.GET(INJECTABLES.TESTCAFE_UI_STYLES, { content: uiStyle, contentType: content_types_1.default.css, isShadowUIStylesheet: true, }); } _createRunner(isLiveMode) { const Ctor = isLiveMode ? LiveModeRunner : Runner; const newRunner = new Ctor({ proxy: this.proxy, browserConnectionGateway: this.browserConnectionGateway, configuration: this.configuration.clone(option_names_1.default.hooks), }); this.runners.push(newRunner); return newRunner; } async initializeBrowserConnectionGateway() { await this.configuration.ensureHostname(); if (this.browserConnectionGateway.status === status_1.default.uninitialized) this.browserConnectionGateway.initialize(this.configuration.startOptions); } // API async createBrowserConnection() { const browserInfo = await browserProviderPool.getBrowserInfo('remote'); // NOTE: 'remote' browser connection cannot be in the 'native automation' mode. this.configuration.mergeOptions({ disableNativeAutomation: true }); await this.initializeBrowserConnectionGateway(); const connection = new BrowserConnection(this.browserConnectionGateway, browserInfo, true, this.configuration.remoteBrowserConnectionOptions); connection.initialize(); return connection; } createRunner() { return this._createRunner(false); } createLiveModeRunner() { if (this.runners.some(runner => runner instanceof LiveModeRunner)) throw new runtime_1.GeneralError(types_1.RUNTIME_ERRORS.cannotCreateMultipleLiveModeRunners); return this._createRunner(true); } async close() { if (this.closed) return; this.closed = true; await Promise.all(this.runners.map(runner => runner.stop())); await browserProviderPool.dispose(); await this.browserConnectionGateway.close(); } } exports.default = TestCafe; module.exports = exports.default; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdGNhZmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGVzdGNhZmUuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDhDQUFnRDtBQUNoRCwwQ0FBZ0Q7QUFDaEQsMkVBQW1EO0FBQ25ELGdGQUF3RDtBQUN4RCxrRUFBb0Q7QUFDcEQsNkVBQXdFO0FBQ3hFLGlGQUFpRjtBQUVqRixNQUFNLFdBQVcsR0FBZ0IsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ2pFLE1BQU0sVUFBVSxHQUFpQixXQUFXLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUNwRSxNQUFNLFVBQVUsR0FBaUIsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQzlELE1BQU0sYUFBYSxHQUFjLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0FBQ3RFLE1BQU0sd0JBQXdCLEdBQUcsV0FBVyxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFDN0UsTUFBTSxpQkFBaUIsR0FBVSxXQUFXLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUNyRSxNQUFNLG1CQUFtQixHQUFRLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBQ3hFLE1BQU0sTUFBTSxHQUFxQixXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDekQsTUFBTSxjQUFjLEdBQWEsV0FBVyxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUFFbkUsZ0ZBQWdGO0FBQ2hGLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUV4QixNQUFxQixRQUFRO0lBQ3pCLFlBQWEsYUFBYTtRQUN0QixJQUFBLCtDQUFxQixHQUFFLENBQUM7UUFDeEIsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFFdEMsSUFBSSxDQUFDLE1BQU0sR0FBVSxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBVyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUUs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QUFLLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLFlBQVksY0FBYyxDQUFDO1lBQzdELE1BQU0sSUFBSSxzQkFBWSxDQUFDLHNCQUFjLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUUvRSxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxLQUFLO1FBQ1AsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUNYLE9BQU87UUFFWCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUVuQixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTdELE1BQU0sbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDcEMsTUFBTSxJQUFJLENBQUMsd0JBQXdCLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUNKO0FBdEdELDJCQXNHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdlbmVyYWxFcnJvciB9IGZyb20gJy4vZXJyb3JzL3J1bnRpbWUnO1xuaW1wb3J0IHsgUlVOVElNRV9FUlJPUlMgfSBmcm9tICcuL2Vycm9ycy90eXBlcyc7XG5pbXBvcnQgQ09OVEVOVF9UWVBFUyBmcm9tICcuL2Fzc2V0cy9jb250ZW50LXR5cGVzJztcbmltcG9ydCBPUFRJT05fTkFNRVMgZnJvbSAnLi9jb25maWd1cmF0aW9uL29wdGlvbi1uYW1lcyc7XG5pbXBvcnQgKiBhcyBJTkpFQ1RBQkxFUyBmcm9tICcuL2Fzc2V0cy9pbmplY3RhYmxlcyc7XG5pbXBvcnQgeyBzZXR1cFNvdXJjZU1hcFN1cHBvcnQgfSBmcm9tICcuL3V0aWxzL3NldHVwLXNvdXJjZW1hcC1zdXBwb3J0JztcbmltcG9ydCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXlTdGF0dXMgZnJvbSAnLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheS9zdGF0dXMnO1xuXG5jb25zdCBsYXp5UmVxdWlyZSAgICAgICAgICAgICAgPSByZXF1aXJlKCdpbXBvcnQtbGF6eScpKHJlcXVpcmUpO1xuY29uc3QgaGFtbWVyaGVhZCAgICAgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJ3Rlc3RjYWZlLWhhbW1lcmhlYWQnKTtcbmNvbnN0IGxvYWRBc3NldHMgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL2xvYWQtYXNzZXRzJyk7XG5jb25zdCBlcnJvckhhbmRsZXJzICAgICAgICAgICAgPSBsYXp5UmVxdWlyZSgnLi91dGlscy9oYW5kbGUtZXJyb3JzJyk7XG5jb25zdCBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL2Nvbm5lY3Rpb24vZ2F0ZXdheScpO1xuY29uc3QgQnJvd3NlckNvbm5lY3Rpb24gICAgICAgID0gbGF6eVJlcXVpcmUoJy4vYnJvd3Nlci9jb25uZWN0aW9uJyk7XG5jb25zdCBicm93c2VyUHJvdmlkZXJQb29sICAgICAgPSBsYXp5UmVxdWlyZSgnLi9icm93c2VyL3Byb3ZpZGVyL3Bvb2wnKTtcbmNvbnN0IFJ1bm5lciAgICAgICAgICAgICAgICAgICA9IGxhenlSZXF1aXJlKCcuL3J1bm5lcicpO1xuY29uc3QgTGl2ZU1vZGVSdW5uZXIgICAgICAgICAgID0gbGF6eVJlcXVpcmUoJy4vbGl2ZS90ZXN0LXJ1bm5lcicpO1xuXG4vLyBOT1RFOiBDb2ZmZWVTY3JpcHQgY2FuJ3QgYmUgbG9hZGVkIGxhemlseSwgYmVjYXVzZSBpdCB3aWxsIGJyZWFrIHN0YWNrIHRyYWNlc1xucmVxdWlyZSgnY29mZmVlc2NyaXB0Jyk7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRlc3RDYWZlIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlndXJhdGlvbikge1xuICAgICAgICBzZXR1cFNvdXJjZU1hcFN1cHBvcnQoKTtcbiAgICAgICAgZXJyb3JIYW5kbGVycy5yZWdpc3RlckVycm9ySGFuZGxlcnMoKTtcblxuICAgICAgICB0aGlzLmNsb3NlZCAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wcm94eSAgICAgICAgID0gbmV3IGhhbW1lcmhlYWQuUHJveHkoKTtcbiAgICAgICAgdGhpcy5ydW5uZXJzICAgICAgID0gW107XG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG5cbiAgICAgICAgdGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgPSBuZXcgQnJvd3NlckNvbm5lY3Rpb25HYXRld2F5KHRoaXMucHJveHksIHRoaXMuY29uZmlndXJhdGlvbi5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXlPcHRpb25zKTtcblxuICAgICAgICBjb25zdCBkZXZlbG9wbWVudE1vZGUgPSBjb25maWd1cmF0aW9uLmdldE9wdGlvbihPUFRJT05fTkFNRVMuZGV2ZWxvcG1lbnRNb2RlKTtcblxuICAgICAgICB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5vbignaW5pdGlhbGl6ZWQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZWdpc3RlckFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfcmVnaXN0ZXJBc3NldHMgKGRldmVsb3BtZW50TW9kZSkge1xuICAgICAgICBjb25zdCB7IGZhdkljb24sIGNvcmVTY3JpcHQsIGRyaXZlclNjcmlwdCwgdWlTY3JpcHQsXG4gICAgICAgICAgICB1aVN0eWxlLCB1aVNwcml0ZSwgdWlTcHJpdGVTdmcsIGF1dG9tYXRpb25TY3JpcHQsIGxlZ2FjeVJ1bm5lclNjcmlwdCB9ID0gbG9hZEFzc2V0cyhkZXZlbG9wbWVudE1vZGUpO1xuXG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX0NPUkUsIHsgY29udGVudDogY29yZVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfRFJJVkVSLCB7IGNvbnRlbnQ6IGRyaXZlclNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9MRUdBQ1lfUlVOTkVSLCB7XG4gICAgICAgICAgICBjb250ZW50OiAgICAgbGVnYWN5UnVubmVyU2NyaXB0LFxuICAgICAgICAgICAgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfQVVUT01BVElPTiwgeyBjb250ZW50OiBhdXRvbWF0aW9uU2NyaXB0LCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5qYXZhc2NyaXB0IH0pO1xuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSSwgeyBjb250ZW50OiB1aVNjcmlwdCwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuamF2YXNjcmlwdCB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuVEVTVENBRkVfVUlfU1BSSVRFLCB7IGNvbnRlbnQ6IHVpU3ByaXRlLCBjb250ZW50VHlwZTogQ09OVEVOVF9UWVBFUy5wbmcgfSk7XG4gICAgICAgIHRoaXMucHJveHkuR0VUKElOSkVDVEFCTEVTLlRFU1RDQUZFX1VJX1NQUklURV9TVkcsIHsgY29udGVudDogdWlTcHJpdGVTdmcsIGNvbnRlbnRUeXBlOiBDT05URU5UX1RZUEVTLnN2ZyB9KTtcbiAgICAgICAgdGhpcy5wcm94eS5HRVQoSU5KRUNUQUJMRVMuREVGQVVMVF9GQVZJQ09OX1BBVEgsIHsgY29udGVudDogZmF2SWNvbiwgY29udGVudFR5cGU6IENPTlRFTlRfVFlQRVMuaWNvbiB9KTtcblxuICAgICAgICB0aGlzLnByb3h5LkdFVChJTkpFQ1RBQkxFUy5URVNUQ0FGRV9VSV9TVFlMRVMsIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICAgICAgICAgICAgICB1aVN0eWxlLFxuICAgICAgICAgICAgY29udGVudFR5cGU6ICAgICAgICAgIENPTlRFTlRfVFlQRVMuY3NzLFxuICAgICAgICAgICAgaXNTaGFkb3dVSVN0eWxlc2hlZXQ6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9jcmVhdGVSdW5uZXIgKGlzTGl2ZU1vZGUpIHtcbiAgICAgICAgY29uc3QgQ3RvciAgICAgID0gaXNMaXZlTW9kZSA/IExpdmVNb2RlUnVubmVyIDogUnVubmVyO1xuICAgICAgICBjb25zdCBuZXdSdW5uZXIgPSBuZXcgQ3Rvcih7XG4gICAgICAgICAgICBwcm94eTogICAgICAgICAgICAgICAgICAgIHRoaXMucHJveHksXG4gICAgICAgICAgICBicm93c2VyQ29ubmVjdGlvbkdhdGV3YXk6IHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LFxuICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uY2xvbmUoT1BUSU9OX05BTUVTLmhvb2tzKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5ydW5uZXJzLnB1c2gobmV3UnVubmVyKTtcblxuICAgICAgICByZXR1cm4gbmV3UnVubmVyO1xuICAgIH1cblxuICAgIGFzeW5jIGluaXRpYWxpemVCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXkgKCkge1xuICAgICAgICBhd2FpdCB0aGlzLmNvbmZpZ3VyYXRpb24uZW5zdXJlSG9zdG5hbWUoKTtcblxuICAgICAgICBpZiAodGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXkuc3RhdHVzID09PSBCcm93c2VyQ29ubmVjdGlvbkdhdGV3YXlTdGF0dXMudW5pbml0aWFsaXplZClcbiAgICAgICAgICAgIHRoaXMuYnJvd3NlckNvbm5lY3Rpb25HYXRld2F5LmluaXRpYWxpemUodGhpcy5jb25maWd1cmF0aW9uLnN0YXJ0T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gQVBJXG4gICAgYXN5bmMgY3JlYXRlQnJvd3NlckNvbm5lY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBicm93c2VySW5mbyA9IGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZ2V0QnJvd3NlckluZm8oJ3JlbW90ZScpO1xuXG4gICAgICAgIC8vIE5PVEU6ICdyZW1vdGUnIGJyb3dzZXIgY29ubmVjdGlvbiBjYW5ub3QgYmUgaW4gdGhlICduYXRpdmUgYXV0b21hdGlvbicgbW9kZS5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLm1lcmdlT3B0aW9ucyh7IGRpc2FibGVOYXRpdmVBdXRvbWF0aW9uOiB0cnVlIH0pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBuZXcgQnJvd3NlckNvbm5lY3Rpb24odGhpcy5icm93c2VyQ29ubmVjdGlvbkdhdGV3YXksIGJyb3dzZXJJbmZvLCB0cnVlLCB0aGlzLmNvbmZpZ3VyYXRpb24ucmVtb3RlQnJvd3NlckNvbm5lY3Rpb25PcHRpb25zKTtcblxuICAgICAgICBjb25uZWN0aW9uLmluaXRpYWxpemUoKTtcblxuICAgICAgICByZXR1cm4gY29ubmVjdGlvbjtcbiAgICB9XG5cbiAgICBjcmVhdGVSdW5uZXIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlUnVubmVyKGZhbHNlKTtcbiAgICB9XG5cbiAgICBjcmVhdGVMaXZlTW9kZVJ1bm5lciAoKSB7XG4gICAgICAgIGlmICh0aGlzLnJ1bm5lcnMuc29tZShydW5uZXIgPT4gcnVubmVyIGluc3RhbmNlb2YgTGl2ZU1vZGVSdW5uZXIpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEdlbmVyYWxFcnJvcihSVU5USU1FX0VSUk9SUy5jYW5ub3RDcmVhdGVNdWx0aXBsZUxpdmVNb2RlUnVubmVycyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NyZWF0ZVJ1bm5lcih0cnVlKTtcbiAgICB9XG5cbiAgICBhc3luYyBjbG9zZSAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNsb3NlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodGhpcy5ydW5uZXJzLm1hcChydW5uZXIgPT4gcnVubmVyLnN0b3AoKSkpO1xuXG4gICAgICAgIGF3YWl0IGJyb3dzZXJQcm92aWRlclBvb2wuZGlzcG9zZSgpO1xuICAgICAgICBhd2FpdCB0aGlzLmJyb3dzZXJDb25uZWN0aW9uR2F0ZXdheS5jbG9zZSgpO1xuICAgIH1cbn1cbiJdfQ==