UNPKG

lib-tools

Version:

The lib-tools helps you simplify the build, bundle, test and npm packaging workflows for Typescript, JavaScript, Angular library projects and assets module projects.

155 lines 21.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const webpack = require("webpack"); const webpackDevMiddleware = require("webpack-dev-middleware"); const yargs = require("yargs"); const helpers_1 = require("../helpers"); const utils_1 = require("../utils"); const configs_1 = require("../webpack/configs"); const failure_karma_webpack_plugin_1 = require("../webpack/plugins/failure-karma-webpack-plugin"); const turn_off_watch_webpack_plugin_1 = require("../webpack/plugins/turn-off-watch-webpack-plugin"); let blocked = []; let isBlocked = false; let webpackMiddleware; function requestBlocker() { return (_1, _2, next) => { if (isBlocked) { blocked.push(next); } else { next(); } }; } function fallbackMiddleware() { return (req, res, next) => { if (webpackMiddleware) { const webpackUrl = `/_karma_webpack_${req.url}`; const webpackReq = Object.assign(Object.assign({}, req), { url: webpackUrl }); webpackMiddleware(webpackReq, res, next); } else { next(); } }; } const init = async (config, emitter, customFileHandlers) => { const logger = new utils_1.Logger({ logLevel: 'info' }); config.customContextFile = `${__dirname}/karma-context.html`; config.customDebugFile = `${__dirname}/karma-debug.html`; config.beforeMiddleware = config.beforeMiddleware || []; config.beforeMiddleware.push('lib-tools--blocker'); config.middleware = config.middleware || []; config.middleware.push('lib-tools--fallback'); const webpackMiddlewareConfig = { publicPath: '/_karma_webpack_/' }; const compilationErrorCallback = (_, errors) => { emitter.emit('compile_error', errors); emitter.emit('run_complete', [], { exitCode: 1 }); unblock(); }; let webpackConfig; if (config.webpackConfig) { webpackConfig = config.webpackConfig; } else { const args = process.argv.length > 4 && /(\\|\/)?karma(\.js)?$/i.test(process.argv[1]) ? process.argv.slice(4) : []; const commandOptions = yargs(args) .option('browsers', { type: 'string' }) .option('reporters', { type: 'string' }) .option('codeCoverageExclude', { type: 'string' }).argv; const testConfig = await helpers_1.getTestConfigFromKarma(config, commandOptions); if (!testConfig) { throw new Error('Could not load workflow test config.'); } if (commandOptions.reporters == null && testConfig.reporters != null) { config.reporters = testConfig.reporters; } if (commandOptions.browsers == null && testConfig.browsers != null) { config.browsers = testConfig.browsers; } webpackConfig = await configs_1.getWebpackTestConfig(testConfig, commandOptions); } webpackConfig.plugins = webpackConfig.plugins || []; webpackConfig.plugins.push(new failure_karma_webpack_plugin_1.FailureKarmaWebpackPlugin(compilationErrorCallback)); webpackConfig.watch = !config.singleRun; if (config.singleRun) { webpackConfig.plugins.unshift(new turn_off_watch_webpack_plugin_1.TurnOffWatchWebpackPlugin()); } function unblock() { isBlocked = false; blocked.forEach((cb) => cb()); blocked = []; } let compiler; try { compiler = webpack(webpackConfig); } catch (e) { logger.error(e.stack || e); if (e.details) { logger.error(e.details); } throw e; } function handler(callback) { isBlocked = true; if (typeof callback === 'function') { callback(); } } compiler.hooks.invalid.tap('karma', () => handler()); compiler.hooks.watchRun.tapAsync('karma', (_, callback) => handler(callback)); compiler.hooks.run.tapAsync('karma', (_, callback) => handler(callback)); let lastCompilationHash; compiler.hooks.done.tap('karma', (stats) => { if (stats.compilation.errors.length > 0) { logger.error(stats.toString('errors-only')); lastCompilationHash = undefined; } else if (stats.hash !== lastCompilationHash) { lastCompilationHash = stats.hash; emitter.refreshFiles(); } unblock(); }); webpackMiddleware = webpackDevMiddleware(compiler, webpackMiddlewareConfig); customFileHandlers.push({ urlRegex: /^\/_karma_webpack_\/.*/, handler: (req, res) => { webpackMiddleware(req, res, function () { const alwaysServe = [ '/_karma_webpack_/runtime.js', '/_karma_webpack_/polyfills.js', '/_karma_webpack_/vendor.js' ]; if (alwaysServe.includes(req.url)) { res.statusCode = 200; res.end(); } else { res.statusCode = 404; res.end('Not found'); } }); } }); emitter.on('exit', (done) => { webpackMiddleware.close(); done(); }); }; init.$inject = ['config', 'emitter', 'customFileHandlers']; module.exports = { 'framework:lib-tools': ['factory', init], 'middleware:lib-tools--blocker': ['factory', requestBlocker], 'middleware:lib-tools--fallback': ['factory', fallbackMiddleware] }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiLi8iLCJzb3VyY2VzIjpbImthcm1hLXBsdWdpbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLG1DQUFtQztBQUNuQywrREFBK0Q7QUFDL0QsK0JBQStCO0FBRS9CLHdDQUFvRDtBQUNwRCxvQ0FBa0M7QUFFbEMsZ0RBQTBEO0FBQzFELGtHQUE0RjtBQUM1RixvR0FBNkY7QUFVN0YsSUFBSSxPQUFPLEdBQW1CLEVBQUUsQ0FBQztBQUNqQyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFDdEIsSUFBSSxpQkFBaUYsQ0FBQztBQUV0RixTQUFTLGNBQWM7SUFDbkIsT0FBTyxDQUFDLEVBQW1CLEVBQUUsRUFBdUIsRUFBRSxJQUFnQixFQUFFLEVBQUU7UUFDdEUsSUFBSSxTQUFTLEVBQUU7WUFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3RCO2FBQU07WUFDSCxJQUFJLEVBQUUsQ0FBQztTQUNWO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELFNBQVMsa0JBQWtCO0lBQ3ZCLE9BQU8sQ0FBQyxHQUFvQixFQUFFLEdBQXdCLEVBQUUsSUFBZ0IsRUFBRSxFQUFFO1FBQ3hFLElBQUksaUJBQWlCLEVBQUU7WUFDbkIsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNoRCxNQUFNLFVBQVUsbUNBQVEsR0FBRyxLQUFFLEdBQUcsRUFBRSxVQUFVLEdBQUUsQ0FBQztZQUMvQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzVDO2FBQU07WUFDSCxJQUFJLEVBQUUsQ0FBQztTQUNWO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQztBQUVELE1BQU0sSUFBSSxHQUFHLEtBQUssRUFDZCxNQUFxQixFQUNyQixPQUlDLEVBQ0Qsa0JBQXVFLEVBQ3pFLEVBQUU7SUFDQSxNQUFNLE1BQU0sR0FBRyxJ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QU07b0JBQ0gsR0FBRyxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7b0JBQ3JCLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7aUJBQ3hCO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0tBQ0osQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtRQUN4QixpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQixJQUFJLEVBQUUsQ0FBQztJQUNYLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFDO0FBRUYsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUUzRCxNQUFNLENBQUMsT0FBTyxHQUFHO0lBQ2IscUJBQXFCLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDO0lBQ3hDLCtCQUErQixFQUFFLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQztJQUM1RCxnQ0FBZ0MsRUFBRSxDQUFDLFNBQVMsRUFBRSxrQkFBa0IsQ0FBQztDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuaW1wb3J0IHsgQ29uZmlnT3B0aW9ucyBhcyBLYXJtYUNvbmZpZ09wdGlvbnMgfSBmcm9tICdrYXJtYSc7XG5pbXBvcnQgKiBhcyB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0ICogYXMgd2VicGFja0Rldk1pZGRsZXdhcmUgZnJvbSAnd2VicGFjay1kZXYtbWlkZGxld2FyZSc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5cbmltcG9ydCB7IGdldFRlc3RDb25maWdGcm9tS2FybWEgfSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzJztcblxuaW1wb3J0IHsgZ2V0V2VicGFja1Rlc3RDb25maWcgfSBmcm9tICcuLi93ZWJwYWNrL2NvbmZpZ3MnO1xuaW1wb3J0IHsgRmFpbHVyZUthcm1hV2VicGFja1BsdWdpbiB9IGZyb20gJy4uL3dlYnBhY2svcGx1Z2lucy9mYWlsdXJlLWthcm1hLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB7IFR1cm5PZmZXYXRjaFdlYnBhY2tQbHVnaW4gfSBmcm9tICcuLi93ZWJwYWNrL3BsdWdpbnMvdHVybi1vZmYtd2F0Y2gtd2VicGFjay1wbHVnaW4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFBsdWdpbk9wdGlvbnMgZXh0ZW5kcyBLYXJtYUNvbmZpZ09wdGlvbnMge1xuICAgIGNvbmZpZ0ZpbGU6IHN0cmluZztcbiAgICB3ZWJwYWNrQ29uZmlnPzogd2VicGFjay5Db25maWd1cmF0aW9uO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IHR5cGUgTmV4dEhhbmRsZUZ1bmN0aW9uID0gKHJlcTogYW55LCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6IChlcnI/OiB1bmtub3duKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG5sZXQgYmxvY2tlZDogKCgpID0+IHZvaWQpW10gPSBbXTtcbmxldCBpc0Jsb2NrZWQgPSBmYWxzZTtcbmxldCB3ZWJwYWNrTWlkZGxld2FyZTogd2VicGFja0Rldk1pZGRsZXdhcmUuV2VicGFja0Rldk1pZGRsZXdhcmUgJiBOZXh0SGFuZGxlRnVuY3Rpb247XG5cbmZ1bmN0aW9uIHJlcXVlc3RCbG9ja2VyKCkge1xuICAgIHJldHVybiAoXzE6IHsgdXJsOiBzdHJpbmcgfSwgXzI6IGh0dHAuU2VydmVyUmVzcG9uc2UsIG5leHQ6ICgpID0+IHZvaWQpID0+IHtcbiAgICAgICAgaWYgKGlzQmxvY2tlZCkge1xuICAgICAgICAgICAgYmxvY2tlZC5wdXNoKG5leHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dCgpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuZnVuY3Rpb24gZmFsbGJhY2tNaWRkbGV3YXJlKCkge1xuICAgIHJldHVybiAocmVxOiB7IHVybDogc3RyaW5nIH0sIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZSwgbmV4dDogKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBpZiAod2VicGFja01pZGRsZXdhcmUpIHtcbiAgICAgICAgICAgIGNvbnN0IHdlYnBhY2tVcmwgPSBgL19rYXJtYV93ZWJwYWNrXyR7cmVxLnVybH1gO1xuICAgICAgICAgICAgY29uc3Qgd2VicGFja1JlcSA9IHsgLi4ucmVxLCB1cmw6IHdlYnBhY2tVcmwgfTtcbiAgICAgICAgICAgIHdlYnBhY2tNaWRkbGV3YXJlKHdlYnBhY2tSZXEsIHJlcywgbmV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG5jb25zdCBpbml0ID0gYXN5bmMgKFxuICAgIGNvbmZpZzogUGx1Z2luT3B0aW9ucyxcbiAgICBlbWl0dGVyOiB7XG4gICAgICAgIG9uOiAoZXZlbnROYW1lOiBzdHJpbmcsIGNiOiAoZG9uZUZuOiAoKSA9PiB2b2lkKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgICAgICBlbWl0OiAoZXZlbnROYW1lOiBzdHJpbmcsIG1lc3NhZ2VzOiBzdHJpbmdbXSwgb3B0aW9ucz86IHsgZXhpdENvZGU6IG51bWJlciB9KSA9PiB2b2lkO1xuICAgICAgICByZWZyZXNoRmlsZXM6ICgpID0+IHZvaWQ7XG4gICAgfSxcbiAgICBjdXN0b21GaWxlSGFuZGxlcnM6IHsgdXJsUmVnZXg6IFJlZ0V4cDsgaGFuZGxlcjogTmV4dEhhbmRsZUZ1bmN0aW9uIH1bXVxuKSA9PiB7XG4gICAgY29uc3QgbG9nZ2VyID0gbmV3IExvZ2dlcih7IGxvZ0xldmVsOiAnaW5mbycgfSk7XG5cbiAgICBjb25maWcuY3VzdG9tQ29udGV4dEZpbGUgPSBgJHtfX2Rpcm5hbWV9L2thcm1hLWNvbnRleHQuaHRtbGA7XG4gICAgY29uZmlnLmN1c3RvbURlYnVnRmlsZSA9IGAke19fZGlybmFtZX0va2FybWEtZGVidWcuaHRtbGA7XG5cbiAgICBjb25maWcuYmVmb3JlTWlkZGxld2FyZSA9IGNvbmZpZy5iZWZvcmVNaWRkbGV3YXJlIHx8IFtdO1xuICAgIGNvbmZpZy5iZWZvcmVNaWRkbGV3YXJlLnB1c2goJ2xpYi10b29scy0tYmxvY2tlcicpO1xuICAgIGNvbmZpZy5taWRkbGV3YXJlID0gY29uZmlnLm1pZGRsZXdhcmUgfHwgW107XG4gICAgY29uZmlnLm1pZGRsZXdhcmUucHVzaCgnbGliLXRvb2xzLS1mYWxsYmFjaycpO1xuXG4gICAgY29uc3Qgd2VicGFja01pZGRsZXdhcmVDb25maWc6IHdlYnBhY2tEZXZNaWRkbGV3YXJlLk9wdGlvbnMgPSB7XG4gICAgICAgIHB1YmxpY1BhdGg6ICcvX2thcm1hX3dlYnBhY2tfLydcbiAgICB9O1xuXG4gICAgY29uc3QgY29tcGlsYXRpb25FcnJvckNhbGxiYWNrID0gKF86IHN0cmluZyB8IHVuZGVmaW5lZCwgZXJyb3JzOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ2NvbXBpbGVfZXJyb3InLCBlcnJvcnMpO1xuICAgICAgICBlbWl0dGVyLmVtaXQoJ3J1bl9jb21wbGV0ZScsIFtdLCB7IGV4aXRDb2RlOiAxIH0pO1xuICAgICAgICB1bmJsb2NrKCk7XG4gICAgfTtcblxuICAgIGxldCB3ZWJwYWNrQ29uZmlnOiB3ZWJwYWNrLkNvbmZpZ3VyYXRpb247XG5cbiAgICBpZiAoY29uZmlnLndlYnBhY2tDb25maWcpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZyA9IGNvbmZpZy53ZWJwYWNrQ29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPVxuICAgICAgICAgICAgcHJvY2Vzcy5hcmd2Lmxlbmd0aCA+IDQgJiYgLyhcXFxcfFxcLyk/a2FybWEoXFwuanMpPyQvaS50ZXN0KHByb2Nlc3MuYXJndlsxXSkgPyBwcm9jZXNzLmFyZ3Yuc2xpY2UoNCkgOiBbXTtcblxuICAgICAgICBjb25zdCBjb21tYW5kT3B0aW9ucyA9IHlhcmdzKGFyZ3MpXG4gICAgICAgICAgICAub3B0aW9uKCdicm93c2VycycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vcHRpb24oJ3JlcG9ydGVycycsIHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vcHRpb24oJ2NvZGVDb3ZlcmFnZUV4Y2x1ZGUnLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3N0cmluZydcbiAgICAgICAgICAgIH0pLmFyZ3Y7XG5cbiAgICAgICAgY29uc3QgdGVzdENvbmZpZyA9IGF3YWl0IGdldFRlc3RDb25maWdGcm9tS2FybWEoY29uZmlnLCBjb21tYW5kT3B0aW9ucyk7XG4gICAgICAgIGlmICghdGVzdENvbmZpZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb3VsZCBub3QgbG9hZCB3b3JrZmxvdyB0ZXN0IGNvbmZpZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb21tYW5kT3B0aW9ucy5yZXBvcnRlcnMgPT0gbnVsbCAmJiB0ZXN0Q29uZmlnLnJlcG9ydGVycyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcucmVwb3J0ZXJzID0gdGVzdENvbmZpZy5yZXBvcnRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29tbWFuZE9wdGlvbnMuYnJvd3NlcnMgPT0gbnVsbCAmJiB0ZXN0Q29uZmlnLmJyb3dzZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbmZpZy5icm93c2VycyA9IHRlc3RDb25maWcuYnJvd3NlcnM7XG4gICAgICAgIH1cblxuICAgICAgICB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja1Rlc3RDb25maWcodGVzdENvbmZpZywgY29tbWFuZE9wdGlvbnMpO1xuICAgIH1cblxuICAgIHdlYnBhY2tDb25maWcucGx1Z2lucyA9IHdlYnBhY2tDb25maWcucGx1Z2lucyB8fCBbXTtcbiAgICB3ZWJwYWNrQ29uZmlnLnBsdWdpbnMucHVzaChuZXcgRmFpbHVyZUthcm1hV2VicGFja1BsdWdpbihjb21waWxhdGlvbkVycm9yQ2FsbGJhY2spKTtcbiAgICB3ZWJwYWNrQ29uZmlnLndhdGNoID0gIWNvbmZpZy5zaW5nbGVSdW47XG4gICAgaWYgKGNvbmZpZy5zaW5nbGVSdW4pIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5wbHVnaW5zLnVuc2hpZnQobmV3IFR1cm5PZmZXYXRjaFdlYnBhY2tQbHVnaW4oKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5ibG9jaygpOiB2b2lkIHtcbiAgICAgICAgaXNCbG9ja2VkID0gZmFsc2U7XG4gICAgICAgIGJsb2NrZWQuZm9yRWFjaCgoY2IpID0+IGNiKCkpO1xuICAgICAgICBibG9ja2VkID0gW107XG4gICAgfVxuXG4gICAgbGV0IGNvbXBpbGVyOiB3ZWJwYWNrLkNvbXBpbGVyO1xuICAgIHRyeSB7XG4gICAgICAgIGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcigoZSBhcyBFcnJvcikuc3RhY2sgfHwgZSk7XG4gICAgICAgIGlmICgoZSBhcyB7IGRldGFpbHM6IHN0cmluZyB9KS5kZXRhaWxzKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoKGUgYXMgeyBkZXRhaWxzOiBzdHJpbmcgfSkuZGV0YWlscyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGhhbmRsZXIoY2FsbGJhY2s/OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIGlzQmxvY2tlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBpbGVyLmhvb2tzLmludmFsaWQudGFwKCdrYXJtYScsICgpID0+IGhhbmRsZXIoKSk7XG4gICAgY29tcGlsZXIuaG9va3Mud2F0Y2hSdW4udGFwQXN5bmMoJ2thcm1hJywgKF8sIGNhbGxiYWNrOiAoKSA9PiB2b2lkKSA9PiBoYW5kbGVyKGNhbGxiYWNrKSk7XG4gICAgY29tcGlsZXIuaG9va3MucnVuLnRhcEFzeW5jKCdrYXJtYScsIChfLCBjYWxsYmFjazogKCkgPT4gdm9pZCkgPT4gaGFuZGxlcihjYWxsYmFjaykpO1xuXG4gICAgbGV0IGxhc3RDb21waWxhdGlvbkhhc2g6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBjb21waWxlci5ob29rcy5kb25lLnRhcCgna2FybWEnLCAoc3RhdHMpID0+IHtcbiAgICAgICAgaWYgKHN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc3RhdHMudG9TdHJpbmcoJ2Vycm9ycy1vbmx5JykpO1xuICAgICAgICAgICAgbGFzdENvbXBpbGF0aW9uSGFzaCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0cy5oYXNoICE9PSBsYXN0Q29tcGlsYXRpb25IYXNoKSB7XG4gICAgICAgICAgICBsYXN0Q29tcGlsYXRpb25IYXNoID0gc3RhdHMuaGFzaDtcbiAgICAgICAgICAgIGVtaXR0ZXIucmVmcmVzaEZpbGVzKCk7XG4gICAgICAgIH1cblxuICAgICAgICB1bmJsb2NrKCk7XG4gICAgfSk7XG5cbiAgICB3ZWJwYWNrTWlkZGxld2FyZSA9IHdlYnBhY2tEZXZNaWRkbGV3YXJlKGNvbXBpbGVyLCB3ZWJwYWNrTWlkZGxld2FyZUNvbmZpZyk7XG5cbiAgICBjdXN0b21GaWxlSGFuZGxlcnMucHVzaCh7XG4gICAgICAgIHVybFJlZ2V4OiAvXlxcL19rYXJtYV93ZWJwYWNrX1xcLy4qLyxcbiAgICAgICAgaGFuZGxlcjogKHJlcTogeyB1cmw6IHN0cmluZyB9LCByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgIHdlYnBhY2tNaWRkbGV3YXJlKHJlcSwgcmVzLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYWx3YXlzU2VydmUgPSBbXG4gICAgICAgICAgICAgICAgICAgICcvX2thcm1hX3dlYnBhY2tfL3J1bnRpbWUuanMnLFxuICAgICAgICAgICAgICAgICAgICAnL19rYXJtYV93ZWJwYWNrXy9wb2x5ZmlsbHMuanMnLFxuICAgICAgICAgICAgICAgICAgICAnL19rYXJtYV93ZWJwYWNrXy92ZW5kb3IuanMnXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAoYWx3YXlzU2VydmUuaW5jbHVkZXMocmVxLnVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSAyMDA7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgICAgICAgICAgICAgcmVzLmVuZCgnTm90IGZvdW5kJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGVtaXR0ZXIub24oJ2V4aXQnLCAoZG9uZSkgPT4ge1xuICAgICAgICB3ZWJwYWNrTWlkZGxld2FyZS5jbG9zZSgpO1xuICAgICAgICBkb25lKCk7XG4gICAgfSk7XG59O1xuXG5pbml0LiRpbmplY3QgPSBbJ2NvbmZpZycsICdlbWl0dGVyJywgJ2N1c3RvbUZpbGVIYW5kbGVycyddO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICAnZnJhbWV3b3JrOmxpYi10b29scyc6IFsnZmFjdG9yeScsIGluaXRdLFxuICAgICdtaWRkbGV3YXJlOmxpYi10b29scy0tYmxvY2tlcic6IFsnZmFjdG9yeScsIHJlcXVlc3RCbG9ja2VyXSxcbiAgICAnbWlkZGxld2FyZTpsaWItdG9vbHMtLWZhbGxiYWNrJzogWydmYWN0b3J5JywgZmFsbGJhY2tNaWRkbGV3YXJlXVxufTtcbiJdfQ==