@angular-devkit/build-angular
Version:
Angular Webpack Build Facade
135 lines • 19.4 kB
JavaScript
;
/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const remapping_1 = __importDefault(require("@ampproject/remapping"));
const terser_1 = require("terser");
const esbuild_executor_1 = require("./esbuild-executor");
/**
* The cached esbuild executor.
* This will automatically use the native or WASM version based on platform and availability
* with the native version given priority due to its superior performance.
*/
let esbuild;
/**
* Handles optimization requests sent from the main thread via the `JavaScriptOptimizerPlugin`.
*/
async function default_1({ asset, options }) {
// esbuild is used as a first pass
const esbuildResult = await optimizeWithEsbuild(asset.code, asset.name, options);
if (isEsBuildFailure(esbuildResult)) {
return {
name: asset.name,
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
errors: await esbuild.formatMessages(esbuildResult.errors, { kind: 'error' }),
};
}
// terser is used as a second pass
const terserResult = await optimizeWithTerser(asset.name, esbuildResult.code, options.sourcemap, options.advanced);
// Merge intermediate sourcemaps with input sourcemap if enabled
let fullSourcemap;
if (options.sourcemap) {
const partialSourcemaps = [];
if (esbuildResult.map) {
partialSourcemaps.unshift(JSON.parse(esbuildResult.map));
}
if (terserResult.map) {
partialSourcemaps.unshift(terserResult.map);
}
if (asset.map) {
partialSourcemaps.push(asset.map);
}
fullSourcemap = (0, remapping_1.default)(partialSourcemaps, () => null);
}
return { name: asset.name, code: terserResult.code, map: fullSourcemap };
}
exports.default = default_1;
/**
* Optimizes a JavaScript asset using esbuild.
*
* @param content The JavaScript asset source content to optimize.
* @param name The name of the JavaScript asset. Used to generate source maps.
* @param options The optimization request options to apply to the content.
* @returns A promise that resolves with the optimized code, source map, and any warnings.
*/
async function optimizeWithEsbuild(content, name, options) {
if (!esbuild) {
esbuild = new esbuild_executor_1.EsbuildExecutor(options.alwaysUseWasm);
}
try {
return await esbuild.transform(content, {
minifyIdentifiers: !options.keepIdentifierNames,
minifySyntax: true,
// NOTE: Disabling whitespace ensures unused pure annotations are kept
minifyWhitespace: false,
pure: ['forwardRef'],
legalComments: options.removeLicenses ? 'none' : 'inline',
sourcefile: name,
sourcemap: options.sourcemap && 'external',
define: options.define,
target: options.target,
});
}
catch (error) {
if (isEsBuildFailure(error)) {
return error;
}
throw error;
}
}
/**
* Optimizes a JavaScript asset using terser.
*
* @param name The name of the JavaScript asset. Used to generate source maps.
* @param code The JavaScript asset source content to optimize.
* @param sourcemaps If true, generate an output source map for the optimized code.
* @param advanced Controls advanced optimizations.
* @returns A promise that resolves with the optimized code and source map.
*/
async function optimizeWithTerser(name, code, sourcemaps, advanced) {
const result = await (0, terser_1.minify)({ [name]: code }, {
compress: {
passes: advanced ? 2 : 1,
pure_getters: advanced,
},
// Set to ES2015 to prevent higher level features from being introduced when browserslist
// contains older browsers. The build system requires browsers to support ES2015 at a minimum.
ecma: 2015,
// esbuild in the first pass is used to minify identifiers instead of mangle here
mangle: false,
// esbuild in the first pass is used to minify function names
keep_fnames: true,
format: {
// ASCII output is enabled here as well to prevent terser from converting back to UTF-8
ascii_only: true,
wrap_func_args: false,
},
sourceMap: sourcemaps &&
{
asObject: true,
// typings don't include asObject option
// eslint-disable-next-line @typescript-eslint/no-explicit-any
},
});
if (typeof result.code !== 'string') {
throw new Error('Terser failed for unknown reason.');
}
return { code: result.code, map: result.map };
}
/**
* Determines if an unknown value is an esbuild BuildFailure error object thrown by esbuild.
* @param value A potential esbuild BuildFailure error object.
* @returns `true` if the object is determined to be a BuildFailure object; otherwise, `false`.
*/
function isEsBuildFailure(value) {
return !!value && typeof value === 'object' && 'errors' in value && 'warnings' in value;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YXNjcmlwdC1vcHRpbWl6ZXItd29ya2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYW5ndWxhcl9kZXZraXQvYnVpbGRfYW5ndWxhci9zcmMvdG9vbHMvd2VicGFjay9wbHVnaW5zL2phdmFzY3JpcHQtb3B0aW1pemVyLXdvcmtlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7OztHQU1HOzs7OztBQUVILHNFQUE4QztBQUU5QyxtQ0FBZ0M7QUFDaEMseURBQXFEO0FBMEVyRDs7OztHQUlHO0FBQ0gsSUFBSSxPQUFvQyxDQUFDO0FBRXpDOztHQUVHO0FBQ1ksS0FBSyxvQkFBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQW1CO0lBQ2hFLGtDQUFrQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxNQUFNLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNqRixJQUFJLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFO1FBQ25DLE9BQU87WUFDTCxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsb0VBQW9FO1lBQ3BFLE1BQU0sRUFBRSxNQUFNLE9BQVEsQ0FBQyxjQUFjLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsQ0FBQztTQUMvRSxDQUFDO0tBQ0g7SUFFRCxrQ0FBa0M7SUFDbEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxrQkFBa0IsQ0FDM0MsS0FBSyxDQUFDLElBQUksRUFDVixhQUFhLENBQUMsSUFBSSxFQUNsQixPQUFPLENBQUMsU0FBUyxFQUNqQixPQUFPLENBQUMsUUFBUSxDQUNqQixDQUFDO0lBRUYsZ0VBQWdFO0lBQ2hFLElBQUksYUFBYSxDQUFDO0lBQ2xCLElBQUksT0FBTyxDQUFDLFNBQVMsRUFBRTtRQUNyQixNQUFNLGlC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LEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO0tBQ3REO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBYSxFQUFFLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQWM7SUFDdEMsT0FBTyxDQUFDLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksS0FBSyxJQUFJLFVBQVUsSUFBSSxLQUFLLENBQUM7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgcmVtYXBwaW5nIGZyb20gJ0BhbXBwcm9qZWN0L3JlbWFwcGluZyc7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkRmFpbHVyZSwgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgeyBtaW5pZnkgfSBmcm9tICd0ZXJzZXInO1xuaW1wb3J0IHsgRXNidWlsZEV4ZWN1dG9yIH0gZnJvbSAnLi9lc2J1aWxkLWV4ZWN1dG9yJztcblxuLyoqXG4gKiBUaGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBvcHRpbWl6aW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGltaXplUmVxdWVzdE9wdGlvbnMge1xuICAvKipcbiAgICogQ29udHJvbHMgYWR2YW5jZWQgb3B0aW1pemF0aW9ucy5cbiAgICogQ3VycmVudGx5IHRoZXNlIGFyZSBvbmx5IHRlcnNlciByZWxhdGVkOlxuICAgKiAqIHRlcnNlciBjb21wcmVzcyBwYXNzZXMgYXJlIHNldCB0byAyXG4gICAqICogdGVyc2VyIHB1cmVfZ2V0dGVycyBvcHRpb24gaXMgZW5hYmxlZFxuICAgKi9cbiAgYWR2YW5jZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBzdHJpbmcgdG9rZW5zIHRoYXQgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggYSBkZWZpbmVkIHZhbHVlLlxuICAgKi9cbiAgZGVmaW5lPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIENvbnRyb2xzIHdoZXRoZXIgY2xhc3MsIGZ1bmN0aW9uLCBhbmQgdmFyaWFibGUgbmFtZXMgc2hvdWxkIGJlIGxlZnQgaW50YWN0XG4gICAqIHRocm91Z2hvdXQgdGhlIG91dHB1dCBjb2RlLlxuICAgKi9cbiAga2VlcElkZW50aWZpZXJOYW1lczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBsaWNlbnNlIHRleHQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBvdXRwdXQgY29kZS5cbiAgICogV2l0aGluIHRoZSBDTEksIHRoaXMgb3B0aW9uIGlzIGxpbmtlZCB0byB0aGUgbGljZW5zZSBleHRyYWN0aW9uIGZ1bmN0aW9uYWxpdHkuXG4gICAqL1xuICByZW1vdmVMaWNlbnNlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDb250cm9scyB3aGV0aGVyIHNvdXJjZSBtYXBzIHNob3VsZCBiZSBnZW5lcmF0ZWQuXG4gICAqL1xuICBzb3VyY2VtYXA/OiBib29sZWFuO1xuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBlc2J1aWxkIHRhcmdldHMuXG4gICAqIEBzZWU6IGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyN0YXJnZXRcbiAgICovXG4gIHRhcmdldD86IHN0cmluZ1tdO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciBlc2J1aWxkIHNob3VsZCBvbmx5IHVzZSB0aGUgV0FTTS12YXJpYW50IGluc3RlYWQgb2YgdHJ5aW5nIHRvXG4gICAqIHVzZSB0aGUgbmF0aXZlIHZhcmlhbnQuIFNvbWUgcGxhdGZvcm1zIG1heSBub3Qgc3VwcG9ydCB0aGUgbmF0aXZlLXZhcmlhbnQgYW5kXG4gICAqIHRoaXMgb3B0aW9uIGFsbG93cyBvbmUgc3VwcG9ydCB0ZXN0IHRvIGJlIGNvbmR1Y3RlZCBwcmlvciB0byBhbGwgdGhlIHdvcmtlcnMgc3RhcnRpbmcuXG4gICAqL1xuICBhbHdheXNVc2VXYXNtOiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVxdWVzdCB0byBvcHRpbWl6ZSBKYXZhU2NyaXB0IHVzaW5nIHRoZSBzdXBwbGllZCBvcHRpb25zLlxuICovXG5pbnRlcmZhY2UgT3B0aW1pemVSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIG9wdGltaXppbmcuXG4gICAqL1xuICBvcHRpb25zOiBPcHRpbWl6ZVJlcXVlc3RPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBUaGUgSmF2YVNjcmlwdCBhc3NldCB0byBvcHRpbWl6ZS5cbiAgICovXG4gIGFzc2V0OiB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIEphdmFTY3JpcHQgYXNzZXQgKHR5cGljYWxseSB0aGUgZmlsZW5hbWUpLlxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc291cmNlIGNvbnRlbnQgb2YgdGhlIEphdmFTY3JpcHQgYXNzZXQuXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzb3VyY2UgbWFwIG9mIHRoZSBKYXZhU2NyaXB0IGFzc2V0LCBpZiBhdmFpbGFibGUuXG4gICAgICogVGhpcyBtYXAgaXMgbWVyZ2VkIHdpdGggYWxsIGludGVybWVkaWF0ZSBzb3VyY2UgbWFwcyBkdXJpbmcgb3B0aW1pemF0aW9uLlxuICAgICAqL1xuICAgIG1hcDogb2JqZWN0O1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBjYWNoZWQgZXNidWlsZCBleGVjdXRvci5cbiAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHVzZSB0aGUgbmF0aXZlIG9yIFdBU00gdmVyc2lvbiBiYXNlZCBvbiBwbGF0Zm9ybSBhbmQgYXZhaWxhYmlsaXR5XG4gKiB3aXRoIHRoZSBuYXRpdmUgdmVyc2lvbiBnaXZlbiBwcmlvcml0eSBkdWUgdG8gaXRzIHN1cGVyaW9yIHBlcmZvcm1hbmNlLlxuICovXG5sZXQgZXNidWlsZDogRXNidWlsZEV4ZWN1dG9yIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIEhhbmRsZXMgb3B0aW1pemF0aW9uIHJlcXVlc3RzIHNlbnQgZnJvbSB0aGUgbWFpbiB0aHJlYWQgdmlhIHRoZSBgSmF2YVNjcmlwdE9wdGltaXplclBsdWdpbmAuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uICh7IGFzc2V0LCBvcHRpb25zIH06IE9wdGltaXplUmVxdWVzdCkge1xuICAvLyBlc2J1aWxkIGlzIHVzZWQgYXMgYSBmaXJzdCBwYXNzXG4gIGNvbnN0IGVzYnVpbGRSZXN1bHQgPSBhd2FpdCBvcHRpbWl6ZVdpdGhFc2J1aWxkKGFzc2V0LmNvZGUsIGFzc2V0Lm5hbWUsIG9wdGlvbnMpO1xuICBpZiAoaXNFc0J1aWxkRmFpbHVyZShlc2J1aWxkUmVzdWx0KSkge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBhc3NldC5uYW1lLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgIGVycm9yczogYXdhaXQgZXNidWlsZCEuZm9ybWF0TWVzc2FnZXMoZXNidWlsZFJlc3VsdC5lcnJvcnMsIHsga2luZDogJ2Vycm9yJyB9KSxcbiAgICB9O1xuICB9XG5cbiAgLy8gdGVyc2VyIGlzIHVzZWQgYXMgYSBzZWNvbmQgcGFzc1xuICBjb25zdCB0ZXJzZXJSZXN1bHQgPSBhd2FpdCBvcHRpbWl6ZVdpdGhUZXJzZXIoXG4gICAgYXNzZXQubmFtZSxcbiAgICBlc2J1aWxkUmVzdWx0LmNvZGUsXG4gICAgb3B0aW9ucy5zb3VyY2VtYXAsXG4gICAgb3B0aW9ucy5hZHZhbmNlZCxcbiAgKTtcblxuICAvLyBNZXJnZSBpbnRlcm1lZGlhdGUgc291cmNlbWFwcyB3aXRoIGlucHV0IHNvdXJjZW1hcCBpZiBlbmFibGVkXG4gIGxldCBmdWxsU291cmNlbWFwO1xuICBpZiAob3B0aW9ucy5zb3VyY2VtYXApIHtcbiAgICBjb25zdCBwYXJ0aWFsU291cmNlbWFwcyA9IFtdO1xuXG4gICAgaWYgKGVzYnVpbGRSZXN1bHQubWFwKSB7XG4gICAgICBwYXJ0aWFsU291cmNlbWFwcy51bnNoaWZ0KEpTT04ucGFyc2UoZXNidWlsZFJlc3VsdC5tYXApKTtcbiAgICB9XG5cbiAgICBpZiAodGVyc2VyUmVzdWx0Lm1hcCkge1xuICAgICAgcGFydGlhbFNvdXJjZW1hcHMudW5zaGlmdCh0ZXJzZXJSZXN1bHQubWFwKTtcbiAgICB9XG5cbiAgICBpZiAoYXNzZXQubWFwKSB7XG4gICAgICBwYXJ0aWFsU291cmNlbWFwcy5wdXNoKGFzc2V0Lm1hcCk7XG4gICAgfVxuXG4gICAgZnVsbFNvdXJjZW1hcCA9IHJlbWFwcGluZyhwYXJ0aWFsU291cmNlbWFwcywgKCkgPT4gbnVsbCk7XG4gIH1cblxuICByZXR1cm4geyBuYW1lOiBhc3NldC5uYW1lLCBjb2RlOiB0ZXJzZXJSZXN1bHQuY29kZSwgbWFwOiBmdWxsU291cmNlbWFwIH07XG59XG5cbi8qKlxuICogT3B0aW1pemVzIGEgSmF2YVNjcmlwdCBhc3NldCB1c2luZyBlc2J1aWxkLlxuICpcbiAqIEBwYXJhbSBjb250ZW50IFRoZSBKYXZhU2NyaXB0IGFzc2V0IHNvdXJjZSBjb250ZW50IHRvIG9wdGltaXplLlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIEphdmFTY3JpcHQgYXNzZXQuIFVzZWQgdG8gZ2VuZXJhdGUgc291cmNlIG1hcHMuXG4gKiBAcGFyYW0gb3B0aW9ucyBUaGUgb3B0aW1pemF0aW9uIHJlcXVlc3Qgb3B0aW9ucyB0byBhcHBseSB0byB0aGUgY29udGVudC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG9wdGltaXplZCBjb2RlLCBzb3VyY2UgbWFwLCBhbmQgYW55IHdhcm5pbmdzLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcHRpbWl6ZVdpdGhFc2J1aWxkKFxuICBjb250ZW50OiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgb3B0aW9uczogT3B0aW1pemVSZXF1ZXN0WydvcHRpb25zJ10sXG4pOiBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdCB8IEJ1aWxkRmFpbHVyZT4ge1xuICBpZiAoIWVzYnVpbGQpIHtcbiAgICBlc2J1aWxkID0gbmV3IEVzYnVpbGRFeGVjdXRvcihvcHRpb25zLmFsd2F5c1VzZVdhc20pO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZXNidWlsZC50cmFuc2Zvcm0oY29udGVudCwge1xuICAgICAgbWluaWZ5SWRlbnRpZmllcnM6ICFvcHRpb25zLmtlZXBJZGVudGlmaWVyTmFtZXMsXG4gICAgICBtaW5pZnlTeW50YXg6IHRydWUsXG4gICAgICAvLyBOT1RFOiBEaXNhYmxpbmcgd2hpdGVzcGFjZSBlbnN1cmVzIHVudXNlZCBwdXJlIGFubm90YXRpb25zIGFyZSBrZXB0XG4gICAgICBtaW5pZnlXaGl0ZXNwYWNlOiBmYWxzZSxcbiAgICAgIHB1cmU6IFsnZm9yd2FyZFJlZiddLFxuICAgICAgbGVnYWxDb21tZW50czogb3B0aW9ucy5yZW1vdmVMaWNlbnNlcyA/ICdub25lJyA6ICdpbmxpbmUnLFxuICAgICAgc291cmNlZmlsZTogbmFtZSxcbiAgICAgIHNvdXJjZW1hcDogb3B0aW9ucy5zb3VyY2VtYXAgJiYgJ2V4dGVybmFsJyxcbiAgICAgIGRlZmluZTogb3B0aW9ucy5kZWZpbmUsXG4gICAgICB0YXJnZXQ6IG9wdGlvbnMudGFyZ2V0LFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChpc0VzQnVpbGRGYWlsdXJlKGVycm9yKSkge1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH1cblxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbi8qKlxuICogT3B0aW1pemVzIGEgSmF2YVNjcmlwdCBhc3NldCB1c2luZyB0ZXJzZXIuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIEphdmFTY3JpcHQgYXNzZXQuIFVzZWQgdG8gZ2VuZXJhdGUgc291cmNlIG1hcHMuXG4gKiBAcGFyYW0gY29kZSBUaGUgSmF2YVNjcmlwdCBhc3NldCBzb3VyY2UgY29udGVudCB0byBvcHRpbWl6ZS5cbiAqIEBwYXJhbSBzb3VyY2VtYXBzIElmIHRydWUsIGdlbmVyYXRlIGFuIG91dHB1dCBzb3VyY2UgbWFwIGZvciB0aGUgb3B0aW1pemVkIGNvZGUuXG4gKiBAcGFyYW0gYWR2YW5jZWQgQ29udHJvbHMgYWR2YW5jZWQgb3B0aW1pemF0aW9ucy5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIG9wdGltaXplZCBjb2RlIGFuZCBzb3VyY2UgbWFwLlxuICovXG5hc3luYyBmdW5jdGlvbiBvcHRpbWl6ZVdpdGhUZXJzZXIoXG4gIG5hbWU6IHN0cmluZyxcbiAgY29kZTogc3RyaW5nLFxuICBzb3VyY2VtYXBzOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuICBhZHZhbmNlZDogYm9vbGVhbiB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8eyBjb2RlOiBzdHJpbmc7IG1hcD86IG9iamVjdCB9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG1pbmlmeShcbiAgICB7IFtuYW1lXTogY29kZSB9LFxuICAgIHtcbiAgICAgIGNvbXByZXNzOiB7XG4gICAgICAgIHBhc3NlczogYWR2YW5jZWQgPyAyIDogMSxcbiAgICAgICAgcHVyZV9nZXR0ZXJzOiBhZHZhbmNlZCxcbiAgICAgIH0sXG4gICAgICAvLyBTZXQgdG8gRVMyMDE1IHRvIHByZXZlbnQgaGlnaGVyIGxldmVsIGZlYXR1cmVzIGZyb20gYmVpbmcgaW50cm9kdWNlZCB3aGVuIGJyb3dzZXJzbGlzdFxuICAgICAgLy8gY29udGFpbnMgb2xkZXIgYnJvd3NlcnMuIFRoZSBidWlsZCBzeXN0ZW0gcmVxdWlyZXMgYnJvd3NlcnMgdG8gc3VwcG9ydCBFUzIwMTUgYXQgYSBtaW5pbXVtLlxuICAgICAgZWNtYTogMjAxNSxcbiAgICAgIC8vIGVzYnVpbGQgaW4gdGhlIGZpcnN0IHBhc3MgaXMgdXNlZCB0byBtaW5pZnkgaWRlbnRpZmllcnMgaW5zdGVhZCBvZiBtYW5nbGUgaGVyZVxuICAgICAgbWFuZ2xlOiBmYWxzZSxcbiAgICAgIC8vIGVzYnVpbGQgaW4gdGhlIGZpcnN0IHBhc3MgaXMgdXNlZCB0byBtaW5pZnkgZnVuY3Rpb24gbmFtZXNcbiAgICAgIGtlZXBfZm5hbWVzOiB0cnVlLFxuICAgICAgZm9ybWF0OiB7XG4gICAgICAgIC8vIEFTQ0lJIG91dHB1dCBpcyBlbmFibGVkIGhlcmUgYXMgd2VsbCB0byBwcmV2ZW50IHRlcnNlciBmcm9tIGNvbnZlcnRpbmcgYmFjayB0byBVVEYtOFxuICAgICAgICBhc2NpaV9vbmx5OiB0cnVlLFxuICAgICAgICB3cmFwX2Z1bmNfYXJnczogZmFsc2UsXG4gICAgICB9LFxuICAgICAgc291cmNlTWFwOlxuICAgICAgICBzb3VyY2VtYXBzICYmXG4gICAgICAgICh7XG4gICAgICAgICAgYXNPYmplY3Q6IHRydWUsXG4gICAgICAgICAgLy8gdHlwaW5ncyBkb24ndCBpbmNsdWRlIGFzT2JqZWN0IG9wdGlvblxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIH0gYXMgYW55KSxcbiAgICB9LFxuICApO1xuXG4gIGlmICh0eXBlb2YgcmVzdWx0LmNvZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdUZXJzZXIgZmFpbGVkIGZvciB1bmtub3duIHJlYXNvbi4nKTtcbiAgfVxuXG4gIHJldHVybiB7IGNvZGU6IHJlc3VsdC5jb2RlLCBtYXA6IHJlc3VsdC5tYXAgYXMgb2JqZWN0IH07XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiB1bmtub3duIHZhbHVlIGlzIGFuIGVzYnVpbGQgQnVpbGRGYWlsdXJlIGVycm9yIG9iamVjdCB0aHJvd24gYnkgZXNidWlsZC5cbiAqIEBwYXJhbSB2YWx1ZSBBIHBvdGVudGlhbCBlc2J1aWxkIEJ1aWxkRmFpbHVyZSBlcnJvciBvYmplY3QuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdCBpcyBkZXRlcm1pbmVkIHRvIGJlIGEgQnVpbGRGYWlsdXJlIG9iamVjdDsgb3RoZXJ3aXNlLCBgZmFsc2VgLlxuICovXG5mdW5jdGlvbiBpc0VzQnVpbGRGYWlsdXJlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgQnVpbGRGYWlsdXJlIHtcbiAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAnZXJyb3JzJyBpbiB2YWx1ZSAmJiAnd2FybmluZ3MnIGluIHZhbHVlO1xufVxuIl19