@anansi/webpack-config
Version:
Production ready webpack for React
191 lines (189 loc) • 21.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = makeProdConfig;
var _preloadWebpackPlugin = _interopRequireDefault(require("@vue/preload-webpack-plugin"));
var _cleanWebpackPlugin = require("clean-webpack-plugin");
var _cssMinimizerWebpackPlugin = _interopRequireDefault(require("css-minimizer-webpack-plugin"));
var _htmlWebpackPlugin = _interopRequireDefault(require("html-webpack-plugin"));
var _semver = _interopRequireDefault(require("semver"));
var _terserWebpackPlugin = _interopRequireDefault(require("terser-webpack-plugin"));
var _webpack = _interopRequireDefault(require("webpack"));
var _webpackRemoveEmptyScripts = _interopRequireDefault(require("webpack-remove-empty-scripts"));
var _base = require("./base");
//import CrittersPlugin from 'critters-webpack-plugin';
function makeProdConfig(baseConfig, {
rootPath,
basePath,
libraryInclude,
libraryExclude,
argv = {},
env = {},
htmlOptions = {
title: '',
scriptLoading: 'defer'
},
terserOptions,
sassOptions,
sassResources,
cssModulesOptions,
globalStyleDir,
fontPreload,
svgoOptions,
nohash,
cssExtractOptions
}) {
const config = {
...baseConfig
};
const reactVersion = getReactVersion(rootPath);
config.mode = 'production';
config.bail = true; // this helps automatic build tools not waste time
if (!argv?.target?.includes?.('node')) {
config.plugins.push(new _webpack.default.IgnorePlugin({
resourceRegExp: /DevTools/
}), new _cleanWebpackPlugin.CleanWebpackPlugin(), new _webpack.default.LoaderOptionsPlugin({
minimize: true,
debug: false
}), new _webpackRemoveEmptyScripts.default());
if (htmlOptions) {
config.plugins.unshift(new _htmlWebpackPlugin.default(htmlOptions)
//new CrittersPlugin({}),
//new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime-.+[.]js/]), this is a bad idea until CSP nonce can be added
);
if (fontPreload) {
if (!['preload', 'prefetch'].includes(fontPreload)) throw new Error(`fontPreload: '${fontPreload}' is not valid.\nUse 'preload' or 'prefetch'`);
config.plugins.unshift(new _preloadWebpackPlugin.default({
rel: fontPreload,
include: 'allAssets',
fileWhitelist: [/\.(otf|woff|ttf)/],
as
}));
}
}
}
if (svgoOptions !== false) {
config.module.rules.push({
test: /\.svg(\?v=\d+\.\d+\.\d+)?$/,
issuer: {
not: [/\.(j|t)sx?$/]
},
enforce: 'pre',
use: [{
loader: require.resolve('svgo-loader'),
options: svgoOptions
}]
});
}
config.optimization = {
splitChunks: {
chunks: 'async',
maxInitialRequests: 30,
maxAsyncRequests: 30,
cacheGroups: {
react: {
test: /[\\/]node_modules[\\/](react|react-dom|scheduler|object-assign|loose-envify)[\\/]/,
name: 'react',
chunks: 'all'
},
polyfill: {
test: /[\\/]node_modules[\\/](core-js|core-js-pure|@babel\/runtime|@babel\/runtime-corejs3|regenerator-runtime|ric-shim|babel-runtime)[\\/].*/,
name: 'polyfill',
chunks: 'all'
},
styles: {
test: new RegExp(`${globalStyleDir}/.*\\.scss$`),
name: 'style',
type: 'css/mini-extract',
chunks: 'all'
}
}
},
// https://webpack.js.org/configuration/optimization/#optimizationruntimechunk
runtimeChunk: {
name: 'webpack-runtime'
}
};
if (nohash) {
config.optimization.chunkIds = 'named';
}
if (!env?.readable) {
config.optimization.minimizer = [new _terserWebpackPlugin.default({
terserOptions: {
parse: {
ecma: 9
},
compress: {
ecma: 6,
warnings: false,
// Pending further investigation:
// https://github.com/mishoo/UglifyJS2/issues/2011
comparisons: false,
// Pending futher investigation:
// https://github.com/terser-js/terser/issues/120
inline: 2
},
mangle: {
safari10: true
},
output: {
ecma: 6,
comments: false,
ascii_only: true
},
...terserOptions,
keep_classnames: !!env?.profile || (terserOptions?.keep_classnames ?? true),
keep_fnames: !!env?.profile || terserOptions?.keep_fnames
},
extractComments: true
}),
// cssnano on node_modules as well as our loaders
new _cssMinimizerWebpackPlugin.default()];
} else {
config.optimization.minimize = false;
}
config.performance = {
maxEntrypointSize: 300000,
assetFilter(assetFilename) {
return !/\.(map|LICENSE)$/.test(assetFilename);
}
};
const styleRules = (0, _base.getStyleRules)({
rootPath,
basePath,
libraryInclude,
libraryExclude,
sassOptions,
sassResources,
cssModulesOptions,
globalStyleDir,
target: argv?.target,
cssExtractOptions
});
config.module.rules = [...config.module.rules, styleRules];
if (env?.profile) {
let reactClient = 'react-dom/client$';
if (reactVersion && _semver.default.lt(reactVersion, '19.0.0')) {
reactClient = 'react-dom$';
}
config.resolve.alias = {
...config?.resolve?.alias,
[reactClient]: 'react-dom/profiling',
'scheduler/tracing': 'scheduler/tracing-profiling'
};
}
return config;
}
function as(entry) {
if (/\.css$/.test(entry)) return 'style';
if (/\.(otf|eot|woff2|woff|ttf)$/.test(entry)) return 'font';
if (/\.(svg|apng|png|jpg|gif|ico|webp|avif|cur|ani)$/.test(entry)) return 'image';
return 'script';
}
function getReactVersion(rootPath) {
const react = require(require.resolve('react', {
paths: [rootPath]
}));
return react ? react.version : null;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcHJlbG9hZFdlYnBhY2tQbHVnaW4iLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jbGVhbldlYnBhY2tQbHVnaW4iLCJfY3NzTWluaW1pemVyV2VicGFja1BsdWdpbiIsIl9odG1sV2VicGFja1BsdWdpbiIsIl9zZW12ZXIiLCJfdGVyc2VyV2VicGFja1BsdWdpbiIsIl93ZWJwYWNrIiwiX3dlYnBhY2tSZW1vdmVFbXB0eVNjcmlwdHMiLCJfYmFzZSIsIm1ha2VQcm9kQ29uZmlnIiwiYmFzZUNvbmZpZyIsInJvb3RQYXRoIiwiYmFzZVBhdGgiLCJsaWJyYXJ5SW5jbHVkZSIsImxpYnJhcnlFeGNsdWRlIiwiYXJndiIsImVudiIsImh0bWxPcHRpb25zIiwidGl0bGUiLCJzY3JpcHRMb2FkaW5nIiwidGVyc2VyT3B0aW9ucyIsInNhc3NPcHRpb25zIiwic2Fzc1Jlc291cmNlcyIsImNzc01vZHVsZXNPcHRpb25zIiwiZ2xvYmFsU3R5bGVEaXIiLCJmb250UHJlbG9hZCIsInN2Z29PcHRpb25zIiwibm9oYXNoIiwiY3NzRXh0cmFjdE9wdGlvbnMiLCJjb25maWciLCJyZWFjdFZlcnNpb24iLCJnZXRSZWFjdFZlcnNpb24iLCJtb2RlIiwiYmFpbCIsInRhcmdldCIsImluY2x1ZGVzIiwicGx1Z2lucyIsInB1c2giLCJ3ZWJwYWNrIiwiSWdub3JlUGx1Z2luIiwicmVzb3VyY2VSZWdFeHAiLCJDbGVhbldlYnBhY2tQbHVnaW4iLCJMb2FkZXJPcHRpb25zUGx1Z2luIiwibWluaW1pemUiLCJkZWJ1ZyIsIlJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbiIsInVuc2hpZnQiLCJIdG1sV2VicGFja1BsdWdpbiIsIkVycm9yIiwiUHJlbG9hZFdlYnBhY2tQbHVnaW4iLCJyZWwiLCJpbmNsdWRlIiwiZmlsZVdoaXRlbGlzdCIsImFzIiwibW9kdWxlIiwicnVsZXMiLCJ0ZXN0IiwiaXNzdWVyIiwibm90IiwiZW5mb3JjZSIsInVzZSIsImxvYWRlciIsInJlc29sdmUiLCJvcHRpb25zIiwib3B0aW1pemF0aW9uIiwic3BsaXRDaHVua3MiLCJjaHVua3MiLCJtYXhJbml0aWFsUmVxdWVzdHMiLCJtYXhBc3luY1JlcXVlc3RzIiwiY2FjaGVHcm91cHMiLCJyZWFjdCIsIm5hbWUiLCJwb2x5ZmlsbCIsInN0eWxlcyIsIlJlZ0V4cCIsInR5cGUiLCJydW50aW1lQ2h1bmsiLCJjaHVua0lkcyIsInJlYWRhYmxlIiwibWluaW1pemVyIiwiVGVyc2VyUGx1Z2luIiwicGFyc2UiLCJlY21hIiwiY29tcHJlc3MiLCJ3YXJuaW5ncyIsImNvbXBhcmlzb25zIiwiaW5saW5lIiwibWFuZ2xlIiwic2FmYXJpMTAiLCJvdXRwdXQiLCJjb21tZW50cyIsImFzY2lpX29ubHkiLCJrZWVwX2NsYXNzbmFtZXMiLCJwcm9maWxlIiwia2VlcF9mbmFtZXMiLCJleHRyYWN0Q29tbWVudHMiLCJDc3NNaW5pbWl6ZXJQbHVnaW4iLCJwZXJmb3JtYW5jZSIsIm1heEVudHJ5cG9pbnRTaXplIiwiYXNzZXRGaWx0ZXIiLCJhc3NldEZpbGVuYW1lIiwic3R5bGVSdWxlcyIsImdldFN0eWxlUnVsZXMiLCJyZWFjdENsaWVudCIsInNlbXZlciIsImx0IiwiYWxpYXMiLCJlbnRyeSIsInBhdGhzIiwidmVyc2lvbiJdLCJzb3VyY2VzIjpbIi4uL3NyYy9wcm9kLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcmVsb2FkV2VicGFja1BsdWdpbiBmcm9tICdAdnVlL3ByZWxvYWQtd2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IHsgQ2xlYW5XZWJwYWNrUGx1Z2luIH0gZnJvbSAnY2xlYW4td2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IENzc01pbmltaXplclBsdWdpbiBmcm9tICdjc3MtbWluaW1pemVyLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBIdG1sV2VicGFja1BsdWdpbiBmcm9tICdodG1sLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCBUZXJzZXJQbHVnaW4gZnJvbSAndGVyc2VyLXdlYnBhY2stcGx1Z2luJztcbmltcG9ydCB3ZWJwYWNrIGZyb20gJ3dlYnBhY2snO1xuLy9pbXBvcnQgQ3JpdHRlcnNQbHVnaW4gZnJvbSAnY3JpdHRlcnMtd2VicGFjay1wbHVnaW4nO1xuaW1wb3J0IFJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbiBmcm9tICd3ZWJwYWNrLXJlbW92ZS1lbXB0eS1zY3JpcHRzJztcblxuaW1wb3J0IHsgZ2V0U3R5bGVSdWxlcyB9IGZyb20gJy4vYmFzZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIG1ha2VQcm9kQ29uZmlnKFxuICBiYXNlQ29uZmlnLFxuICB7XG4gICAgcm9vdFBhdGgsXG4gICAgYmFzZVBhdGgsXG4gICAgbGlicmFyeUluY2x1ZGUsXG4gICAgbGlicmFyeUV4Y2x1ZGUsXG4gICAgYXJndiA9IHt9LFxuICAgIGVudiA9IHt9LFxuICAgIGh0bWxPcHRpb25zID0geyB0aXRsZTogJycsIHNjcmlwdExvYWRpbmc6ICdkZWZlcicgfSxcbiAgICB0ZXJzZXJPcHRpb25zLFxuICAgIHNhc3NPcHRpb25zLFxuICAgIHNhc3NSZXNvdXJjZXMsXG4gICAgY3NzTW9kdWxlc09wdGlvbnMsXG4gICAgZ2xvYmFsU3R5bGVEaXIsXG4gICAgZm9udFByZWxvYWQsXG4gICAgc3Znb09wdGlvbnMsXG4gICAgbm9oYXNoLFxuICAgIGNzc0V4dHJhY3RPcHRpb25zLFxuICB9LFxuKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHsgLi4uYmFzZUNvbmZpZyB9O1xuICBjb25zdCByZWFjdFZlcnNpb24gPSBnZXRSZWFjdFZlcnNpb24ocm9vdFBhdGgpO1xuXG4gIGNvbmZpZy5tb2RlID0gJ3Byb2R1Y3Rpb24nO1xuICBjb25maWcuYmFpbCA9IHRydWU7IC8vIHRoaXMgaGVscHMgYXV0b21hdGljIGJ1aWxkIHRvb2xzIG5vdCB3YXN0ZSB0aW1lXG4gIGlmICghYXJndj8udGFyZ2V0Py5pbmNsdWRlcz8uKCdub2RlJykpIHtcbiAgICBjb25maWcucGx1Z2lucy5wdXNoKFxuICAgICAgbmV3IHdlYnBhY2suSWdub3JlUGx1Z2luKHsgcmVzb3VyY2VSZWdFeHA6IC9EZXZUb29scy8gfSksXG4gICAgICBuZXcgQ2xlYW5XZWJwYWNrUGx1Z2luKCksXG4gICAgICBuZXcgd2VicGFjay5Mb2FkZXJPcHRpb25zUGx1Z2luKHtcbiAgICAgICAgbWluaW1pemU6IHRydWUsXG4gICAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICAgIH0pLFxuICAgICAgbmV3IFJlbW92ZUVtcHR5U2NyaXB0c1BsdWdpbigpLFxuICAgICk7XG4gICAgaWYgKGh0bWxPcHRpb25zKSB7XG4gICAgICBjb25maWcucGx1Z2lucy51bnNoaWZ0KFxuICAgICAgICBuZXcgSHRtbFdlYnBhY2tQbHVnaW4oaHRtbE9wdGlvbnMpLFxuICAgICAgICAvL25ldyBDcml0dGVyc1BsdWdpbih7fSksXG4gICAgICAgIC8vbmV3IElubGluZUNodW5rSHRtbFBsdWdpbihIdG1sV2VicGFja1BsdWdpbiwgWy9ydW50aW1lLS4rWy5danMvXSksIHRoaXMgaXMgYSBiYWQgaWRlYSB1bnRpbCBDU1Agbm9uY2UgY2FuIGJlIGFkZGVkXG4gICAgICApO1xuICAgICAgaWYgKGZvbnRQcmVsb2FkKSB7XG4gICAgICAgIGlmICghWydwcmVsb2FkJywgJ3ByZWZldGNoJ10uaW5jbHVkZXMoZm9udFByZWxvYWQpKVxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBmb250UHJlbG9hZDogJyR7Zm9udFByZWxvYWR9JyBpcyBub3QgdmFsaWQuXFxuVXNlICdwcmVsb2FkJyBvciAncHJlZmV0Y2gnYCxcbiAgICAgICAgICApO1xuICAgICAgICBjb25maWcucGx1Z2lucy51bnNoaWZ0KFxuICAgICAgICAgIG5ldyBQcmVsb2FkV2VicGFja1BsdWdpbih7XG4gICAgICAgICAgICByZWw6IGZvbnRQcmVsb2FkLFxuICAgICAgICAgICAgaW5jbHVkZTogJ2FsbEFzc2V0cycsXG4gICAgICAgICAgICBmaWxlV2hpdGVsaXN0OiBbL1xcLihvdGZ8d29mZnx0dGYpL10sXG4gICAgICAgICAgICBhcyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHN2Z29PcHRpb25zICE9PSBmYWxzZSkge1xuICAgIGNvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICB0ZXN0OiAvXFwuc3ZnKFxcP3Y9XFxkK1xcLlxcZCtcXC5cXGQrKT8kLyxcbiAgICAgIGlzc3Vlcjoge1xuICAgICAgICBub3Q6IFsvXFwuKGp8dClzeD8kL10sXG4gICAgICB9LFxuICAgICAgZW5mb3JjZTogJ3ByZScsXG4gICAgICB1c2U6IFtcbiAgICAgICAge1xuICAgICAgICAgIGxvYWRlcjogcmVxdWlyZS5yZXNvbHZlKCdzdmdvLWxvYWRlcicpLFxuICAgICAgICAgIG9wdGlvbnM6IHN2Z29PcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxuICBjb25maWcub3B0aW1pemF0aW9uID0ge1xuICAgIHNwbGl0Q2h1bmtzOiB7XG4gICAgICBjaHVua3M6ICdhc3luYycsXG4gICAgICBtYXhJbml0aWFsUmVxdWVzdHM6IDMwLFxuICAgICAgbWF4QXN5bmNSZXF1ZXN0czogMzAsXG4gICAgICBjYWNoZUdyb3Vwczoge1xuICAgICAgICByZWFjdDoge1xuICAgICAgICAgIHRlc3Q6IC9bXFxcXC9dbm9kZV9tb2R1bGVzW1xcXFwvXShyZWFjdHxyZWFjdC1kb218c2NoZWR1bGVyfG9iamVjdC1hc3NpZ258bG9vc2UtZW52aWZ5KVtcXFxcL10vLFxuICAgICAgICAgIG5hbWU6ICdyZWFjdCcsXG4gICAgICAgICAgY2h1bmtzOiAnYWxsJyxcbiAgICAgICAgfSxcbiAgICAgICAgcG9seWZpbGw6IHtcbiAgICAgICAgICB0ZXN0OiAvW1xcXFwvXW5vZGVfbW9kdWxlc1tcXFxcL10oY29yZS1qc3xjb3JlLWpzLXB1cmV8QGJhYmVsXFwvcnVudGltZXxAYmFiZWxcXC9ydW50aW1lLWNvcmVqczN8cmVnZW5lcmF0b3ItcnVudGltZXxyaWMtc2hpbXxiYWJlbC1ydW50aW1lKVtcXFxcL10uKi8sXG4gICAgICAgICAgbmFtZTogJ3BvbHlmaWxsJyxcbiAgICAgICAgICBjaHVua3M6ICdhbGwnLFxuICAgICAgICB9LFxuICAgICAgICBzdHlsZXM6IHtcbiAgICAgICAgICB0ZXN0OiBuZXcgUmVnRXhwKGAke2dsb2JhbFN0eWxlRGlyfS8uKlxcXFwuc2NzcyRgKSxcbiAgICAgICAgICBuYW1lOiAnc3R5bGUnLFxuICAgICAgICAgIHR5cGU6ICdjc3MvbWluaS1leHRyYWN0JyxcbiAgICAgICAgICBjaHVua3M6ICdhbGwnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vd2VicGFjay5qcy5vcmcvY29uZmlndXJhdGlvbi9vcHRpbWl6YXRpb24vI29wdGltaXphdGlvbnJ1bnRpbWVjaHVua1xuICAgIHJ1bnRpbWVDaHVuazoge1xuICAgICAgbmFtZTogJ3dlYnBhY2stcnVudGltZScsXG4gICAgfSxcbiAgfTtcbiAgaWYgKG5vaGFzaCkge1xuICAgIGNvbmZpZy5vcHRpbWl6YXRpb24uY2h1bmtJZHMgPSAnbmFtZWQnO1xuICB9XG4gIGlmICghZW52Py5yZWFkYWJsZSkge1xuICAgIGNvbmZpZy5vcHRpbWl6YXRpb24ubWluaW1pemVyID0gW1xuICAgICAgbmV3IFRlcnNlclBsdWdpbih7XG4gICAgICAgIHRlcnNlck9wdGlvbnM6IHtcbiAgICAgICAgICBwYXJzZToge1xuICAgICAgICAgICAgZWNtYTogOSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNvbXByZXNzOiB7XG4gICAgICAgICAgICBlY21hOiA2LFxuICAgICAgICAgICAgd2FybmluZ3M6IGZhbHNlLFxuICAgICAgICAgICAgLy8gUGVuZGluZyBmdXJ0aGVyIGludmVzdGlnYXRpb246XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbWlzaG9vL1VnbGlmeUpTMi9pc3N1ZXMvMjAxMVxuICAgICAgICAgICAgY29tcGFyaXNvbnM6IGZhbHNlLFxuICAgICAgICAgICAgLy8gUGVuZGluZyBmdXRoZXIgaW52ZXN0aWdhdGlvbjpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZXJzZXItanMvdGVyc2VyL2lzc3Vlcy8xMjBcbiAgICAgICAgICAgIGlubGluZTogMixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hbmdsZToge1xuICAgICAgICAgICAgc2FmYXJpMTA6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvdXRwdXQ6IHtcbiAgICAgICAgICAgIGVjbWE6IDYsXG4gICAgICAgICAgICBjb21tZW50czogZmFsc2UsXG4gICAgICAgICAgICBhc2NpaV9vbmx5OiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4udGVyc2VyT3B0aW9ucyxcbiAgICAgICAgICBrZWVwX2NsYXNzbmFtZXM6XG4gICAgICAgICAgICAhIWVudj8ucHJvZmlsZSB8fCAodGVyc2VyT3B0aW9ucz8ua2VlcF9jbGFzc25hbWVzID8/IHRydWUpLFxuICAgICAgICAgIGtlZXBfZm5hbWVzOiAhIWVudj8ucHJvZmlsZSB8fCB0ZXJzZXJPcHRpb25zPy5rZWVwX2ZuYW1lcyxcbiAgICAgICAgfSxcbiAgICAgICAgZXh0cmFjdENvbW1lbnRzOiB0cnVlLFxuICAgICAgfSksXG4gICAgICAvLyBjc3NuYW5vIG9uIG5vZGVfbW9kdWxlcyBhcyB3ZWxsIGFzIG91ciBsb2FkZXJzXG4gICAgICBuZXcgQ3NzTWluaW1pemVyUGx1Z2luKCksXG4gICAgXTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcub3B0aW1pemF0aW9uLm1pbmltaXplID0gZmFsc2U7XG4gIH1cbiAgY29uZmlnLnBlcmZvcm1hbmNlID0ge1xuICAgIG1heEVudHJ5cG9pbnRTaXplOiAzMDAwMDAsXG4gICAgYXNzZXRGaWx0ZXIoYXNzZXRGaWxlbmFtZSkge1xuICAgICAgcmV0dXJuICEvXFwuKG1hcHxMSUNFTlNFKSQvLnRlc3QoYXNzZXRGaWxlbmFtZSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBzdHlsZVJ1bGVzID0gZ2V0U3R5bGVSdWxlcyh7XG4gICAgcm9vdFBhdGgsXG4gICAgYmFzZVBhdGgsXG4gICAgbGlicmFyeUluY2x1ZGUsXG4gICAgbGlicmFyeUV4Y2x1ZGUsXG4gICAgc2Fzc09wdGlvbnMsXG4gICAgc2Fzc1Jlc291cmNlcyxcbiAgICBjc3NNb2R1bGVzT3B0aW9ucyxcbiAgICBnbG9iYWxTdHlsZURpcixcbiAgICB0YXJnZXQ6IGFyZ3Y/LnRhcmdldCxcbiAgICBjc3NFeHRyYWN0T3B0aW9ucyxcbiAgfSk7XG4gIGNvbmZpZy5tb2R1bGUucnVsZXMgPSBbLi4uY29uZmlnLm1vZHVsZS5ydWxlcywgc3R5bGVSdWxlc107XG5cbiAgaWYgKGVudj8ucHJvZmlsZSkge1xuICAgIGxldCByZWFjdENsaWVudCA9ICdyZWFjdC1kb20vY2xpZW50JCc7XG4gICAgaWYgKHJlYWN0VmVyc2lvbiAmJiBzZW12ZXIubHQocmVhY3RWZXJzaW9uLCAnMTkuMC4wJykpIHtcbiAgICAgIHJlYWN0Q2xpZW50ID0gJ3JlYWN0LWRvbSQnO1xuICAgIH1cbiAgICBjb25maWcucmVzb2x2ZS5hbGlhcyA9IHtcbiAgICAgIC4uLmNvbmZpZz8ucmVzb2x2ZT8uYWxpYXMsXG4gICAgICBbcmVhY3RDbGllbnRdOiAncmVhY3QtZG9tL3Byb2ZpbGluZycsXG4gICAgICAnc2NoZWR1bGVyL3RyYWNpbmcnOiAnc2NoZWR1bGVyL3RyYWNpbmctcHJvZmlsaW5nJyxcbiAgICB9O1xuICB9XG4gIHJldHVybiBjb25maWc7XG59XG5cbmZ1bmN0aW9uIGFzKGVudHJ5KSB7XG4gIGlmICgvXFwuY3NzJC8udGVzdChlbnRyeSkpIHJldHVybiAnc3R5bGUnO1xuICBpZiAoL1xcLihvdGZ8ZW90fHdvZmYyfHdvZmZ8dHRmKSQvLnRlc3QoZW50cnkpKSByZXR1cm4gJ2ZvbnQnO1xuICBpZiAoL1xcLihzdmd8YXBuZ3xwbmd8anBnfGdpZnxpY298d2VicHxhdmlmfGN1cnxhbmkpJC8udGVzdChlbnRyeSkpXG4gICAgcmV0dXJuICdpbWFnZSc7XG4gIHJldHVybiAnc2NyaXB0Jztcbn1cblxuZnVuY3Rpb24gZ2V0UmVhY3RWZXJzaW9uKHJvb3RQYXRoKSB7XG4gIGNvbnN0IHJlYWN0ID0gcmVxdWlyZShcbiAgICByZXF1aXJlLnJlc29sdmUoJ3JlYWN0Jywge1xuICAgICAgcGF0aHM6IFtyb290UGF0aF0sXG4gICAgfSksXG4gICk7XG4gIHJldHVybiByZWFjdCA/IHJlYWN0LnZlcnNpb24gOiBudWxsO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQUFBLHFCQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxtQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsMEJBQUEsR0FBQUgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFHLGtCQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxvQkFBQSxHQUFBTixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQU0sUUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQU8sMEJBQUEsR0FBQVIsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFRLEtBQUEsR0FBQVIsT0FBQTtBQUhBOztBQUtlLFNBQVNTLGNBQWNBLENBQ3BDQyxVQUFVLEVBQ1Y7RUFDRUMsUUFBUTtFQUNSQyxRQUFRO0VBQ1JDLGNBQWM7RUFDZEMsY0FBYztFQUNkQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0VBQ1RDLEdBQUcsR0FBRyxDQUFDLENBQUM7RUFDUkMsV0FBVyxHQUFHO0lBQUVDLEtBQUssRUFBRSxFQUFFO0lBQUVDLGFBQWEsRUFBRTtFQUFRLENBQUM7RUFDbkRDLGFBQWE7RUFDYkMsV0FBVztFQUNYQyxhQUFhO0VBQ2JDLGlCQUFpQjtFQUNqQkMsY0FBYztFQUNk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QUFDNEMsYUFBYSxDQUFDO0lBQ2hEO0VBQ0YsQ0FBQztFQUVELE1BQU1DLFVBQVUsR0FBRyxJQUFBQyxtQkFBYSxFQUFDO0lBQy9CM0YsUUFBUTtJQUNSQyxRQUFRO0lBQ1JDLGNBQWM7SUFDZEMsY0FBYztJQUNkTyxXQUFXO0lBQ1hDLGFBQWE7SUFDYkMsaUJBQWlCO0lBQ2pCQyxjQUFjO0lBQ2RVLE1BQU0sRUFBRW5CLElBQUksRUFBRW1CLE1BQU07SUFDcEJOO0VBQ0YsQ0FBQyxDQUFDO0VBQ0ZDLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQ0MsS0FBSyxHQUFHLENBQUMsR0FBRzFCLE1BQU0sQ0FBQ3lCLE1BQU0sQ0FBQ0MsS0FBSyxFQUFFOEMsVUFBVSxDQUFDO0VBRTFELElBQUlyRixHQUFHLEVBQUU2RSxPQUFPLEVBQUU7SUFDaEIsSUFBSVUsV0FBVyxHQUFHLG1CQUFtQjtJQUNyQyxJQUFJekUsWUFBWSxJQUFJMEUsZUFBTSxDQUFDQyxFQUFFLENBQUMzRSxZQUFZLEVBQUUsUUFBUSxDQUFDLEVBQUU7TUFDckR5RSxXQUFXLEdBQUcsWUFBWTtJQUM1QjtJQUNBMUUsTUFBTSxDQUFDaUMsT0FBTyxDQUFDNEMsS0FBSyxHQUFHO01BQ3JCLEdBQUc3RSxNQUFNLEVBQUVpQyxPQUFPLEVBQUU0QyxLQUFLO01BQ3pCLENBQUNILFdBQVcsR0FBRyxxQkFBcUI7TUFDcEMsbUJBQW1CLEVBQUU7SUFDdkIsQ0FBQztFQUNIO0VBQ0EsT0FBTzFFLE1BQU07QUFDZjtBQUVBLFNBQVN3QixFQUFFQSxDQUFDc0QsS0FBSyxFQUFFO0VBQ2pCLElBQUksUUFBUSxDQUFDbkQsSUFBSSxDQUFDbUQsS0FBSyxDQUFDLEVBQUUsT0FBTyxPQUFPO0VBQ3hDLElBQUksNkJBQTZCLENBQUNuRCxJQUFJLENBQUNtRCxLQUFLLENBQUMsRUFBRSxPQUFPLE1BQU07RUFDNUQsSUFBSSxpREFBaUQsQ0FBQ25ELElBQUksQ0FBQ21ELEtBQUssQ0FBQyxFQUMvRCxPQUFPLE9BQU87RUFDaEIsT0FBTyxRQUFRO0FBQ2pCO0FBRUEsU0FBUzVFLGVBQWVBLENBQUNwQixRQUFRLEVBQUU7RUFDakMsTUFBTTJELEtBQUssR0FBR3RFLE9BQU8sQ0FDbkJBLE9BQU8sQ0FBQzhELE9BQU8sQ0FBQyxPQUFPLEVBQUU7SUFDdkI4QyxLQUFLLEVBQUUsQ0FBQ2pHLFFBQVE7RUFDbEIsQ0FBQyxDQUNILENBQUM7RUFDRCxPQUFPMkQsS0FBSyxHQUFHQSxLQUFLLENBQUN1QyxPQUFPLEdBQUcsSUFBSTtBQUNyQyIsImlnbm9yZUxpc3QiOltdfQ==