UNPKG

42 kBJavaScriptView Raw
1"use strict";
2// tslint:disable:no-any
3// tslint:disable:no-unsafe-any
4Object.defineProperty(exports, "__esModule", { value: true });
5const fs_1 = require("fs");
6const path = require("path");
7const node_1 = require("@angular-devkit/core/node");
8const build_context_1 = require("../build-context");
9const helpers_1 = require("../helpers");
10const errors_1 = require("../models/errors");
11const utils_1 = require("../utils");
12const app_1 = require("./app");
13const lib_1 = require("./lib");
14// tslint:disable:max-func-body-length
15function getWebpackConfigFromAngularBuildConfig(configPath, env, argv) {
16 let startTime = Date.now();
17 if (!configPath || !configPath.length) {
18 throw new errors_1.InvalidConfigError("The 'configPath' is required.");
19 }
20 if (!/\.json$/i.test(configPath)) {
21 throw new errors_1.InvalidConfigError(`Invalid config file, path: ${configPath}.`);
22 }
23 if (!fs_1.existsSync(configPath)) {
24 throw new errors_1.InvalidConfigError(`The angular-build.json config file does not exist at ${configPath}.`);
25 }
26 let buildOptions = { environment: {} };
27 const buildCommandOptions = argv && typeof argv === 'object' ? argv : {};
28 if (env) {
29 buildOptions.environment = helpers_1.normalizeEnvironment(env, buildCommandOptions.prod);
30 }
31 const fromBuiltInCli = buildCommandOptions._fromBuiltInCli;
32 const cliRootPath = fromBuiltInCli && buildCommandOptions._cliRootPath ? buildCommandOptions._cliRootPath : undefined;
33 const cliIsGlobal = fromBuiltInCli && buildCommandOptions._cliIsGlobal ? true : false;
34 const cliVersion = fromBuiltInCli && buildCommandOptions._cliVersion ? buildCommandOptions._cliVersion : undefined;
35 const verbose = buildCommandOptions.verbose;
36 if (verbose) {
37 buildOptions.logLevel = 'debug';
38 }
39 buildOptions.watch = (buildCommandOptions.watch || buildCommandOptions.w) ? true : false;
40 buildOptions.progress = buildCommandOptions.progress ? true : false;
41 const filteredConfigNames = [];
42 if (fromBuiltInCli) {
43 buildOptions.beep = buildCommandOptions.beep;
44 if (buildCommandOptions._startTime) {
45 startTime = buildCommandOptions._startTime;
46 }
47 buildOptions.cleanOutDir = buildCommandOptions.clean || buildCommandOptions.cleanOutDirs ||
48 buildCommandOptions.cleanOutputPath || buildCommandOptions.deleteOutputPath
49 ? true
50 : false;
51 if (buildCommandOptions.filter && buildCommandOptions.filter.length) {
52 filteredConfigNames.push(...prepareFilterNames(buildCommandOptions.filter));
53 }
54 }
55 else {
56 if ((buildCommandOptions.configName || buildCommandOptions['config-name'])) {
57 filteredConfigNames.push((buildCommandOptions.configName || buildCommandOptions['config-name']));
58 }
59 if (!env && process.env.WEBPACK_ENV) {
60 const rawEnvStr = process.env.WEBPACK_ENV;
61 const rawEnv = typeof rawEnvStr === 'string'
62 ? JSON.parse(rawEnvStr)
63 : rawEnvStr;
64 buildOptions.environment = Object.assign({}, buildOptions.environment, helpers_1.normalizeEnvironment(rawEnv, buildCommandOptions.prod));
65 }
66 if (buildCommandOptions.mode) {
67 if (buildCommandOptions.mode === 'production') {
68 buildOptions.environment.prod = true;
69 buildOptions.environment.production = true;
70 if (buildOptions.environment.dev) {
71 buildOptions.environment.dev = false;
72 }
73 if (buildOptions.environment.development) {
74 buildOptions.environment.development = false;
75 }
76 }
77 else if (buildCommandOptions.mode === 'development') {
78 buildOptions.environment.dev = true;
79 buildOptions.environment.development = true;
80 if (buildOptions.environment.prod) {
81 buildOptions.environment.prod = false;
82 }
83 if (buildOptions.environment.production) {
84 buildOptions.environment.production = false;
85 }
86 }
87 }
88 if (buildOptions.environment.buildOptions) {
89 if (typeof buildOptions.environment.buildOptions === 'object') {
90 buildOptions = Object.assign({}, buildOptions, (buildOptions.environment.buildOptions));
91 }
92 delete buildOptions.environment.buildOptions;
93 }
94 }
95 let angularBuildConfig = null;
96 try {
97 angularBuildConfig = utils_1.readJsonSync(configPath);
98 }
99 catch (jsonErr) {
100 throw new errors_1.InvalidConfigError(`Invalid configuration, error: ${jsonErr.message || jsonErr}.`);
101 }
102 // Validate schema
103 const schemaFileName = 'schema.json';
104 let schemaPath = '';
105 if (fs_1.existsSync(path.resolve(__dirname, `../schemas/${schemaFileName}`))) {
106 schemaPath = `../schemas/${schemaFileName}`;
107 }
108 else if (fs_1.existsSync(path.resolve(__dirname, `../../schemas/${schemaFileName}`))) {
109 schemaPath = `../../schemas/${schemaFileName}`;
110 }
111 if (!schemaPath) {
112 throw new errors_1.InternalError("The angular-build schema file doesn't exist.");
113 }
114 // tslint:disable-next-line:non-literal-require
115 const schema = require(schemaPath);
116 if (schema.$schema) {
117 delete schema.$schema;
118 }
119 if (angularBuildConfig.$schema) {
120 delete angularBuildConfig.$schema;
121 }
122 const errors = utils_1.validateSchema(schema, angularBuildConfig);
123 if (errors.length) {
124 const errMsg = errors.map(err => utils_1.formatValidationError(schema, err)).join('\n');
125 throw new errors_1.InvalidConfigError(`Invalid configuration.\n\n${errMsg}`);
126 }
127 // Set angular build defaults
128 const angularBuildConfigInternal = angularBuildConfig;
129 angularBuildConfigInternal._schema = schema;
130 angularBuildConfigInternal._configPath = configPath;
131 angularBuildConfigInternal.libs = angularBuildConfigInternal.libs || [];
132 angularBuildConfigInternal.apps = angularBuildConfigInternal.apps || [];
133 for (let i = 0; i < angularBuildConfigInternal.libs.length; i++) {
134 const libConfig = angularBuildConfigInternal.libs[i];
135 libConfig._index = i;
136 libConfig._projectType = 'lib';
137 libConfig._configPath = configPath;
138 }
139 for (let i = 0; i < angularBuildConfigInternal.apps.length; i++) {
140 const appConfig = angularBuildConfigInternal.apps[i];
141 appConfig._index = i;
142 appConfig._projectType = 'app';
143 appConfig._configPath = configPath;
144 }
145 if (angularBuildConfigInternal.libs.length === 0 && angularBuildConfigInternal.apps.length === 0) {
146 throw new errors_1.InvalidConfigError('No app or lib project is available.');
147 }
148 const staticBuildContextOptions = {
149 workspaceRoot: path.dirname(configPath),
150 filteredConfigNames: filteredConfigNames,
151 startTime: startTime,
152 fromBuiltInCli: fromBuiltInCli,
153 angularBuildConfig: angularBuildConfigInternal,
154 cliRootPath: cliRootPath,
155 cliVersion: cliVersion,
156 cliIsGlobal: cliIsGlobal
157 };
158 return getWebpackConfigsInternal(angularBuildConfigInternal, buildOptions, staticBuildContextOptions);
159}
160exports.getWebpackConfigFromAngularBuildConfig = getWebpackConfigFromAngularBuildConfig;
161function prepareFilterNames(filter) {
162 const filterNames = [];
163 if (filter &&
164 (Array.isArray(filter) || typeof filter === 'string')) {
165 if (Array.isArray(filter)) {
166 (filter).forEach(filterName => {
167 if (filterName && filterName.trim() && !filterNames.includes(filterName.trim())) {
168 filterNames.push(filterName.trim());
169 }
170 });
171 }
172 else if (filter && filter.trim()) {
173 filterNames.push(filter);
174 }
175 }
176 return filterNames;
177}
178function getWebpackConfigsInternal(angularBuildConfigInternal, buildOptions, staticBuildContextOptions) {
179 const webpackConfigs = [];
180 const workspaceRoot = staticBuildContextOptions.workspaceRoot;
181 const filterNames = staticBuildContextOptions.filteredConfigNames || [];
182 if (angularBuildConfigInternal.libs.length > 0) {
183 let filteredLibConfigs = angularBuildConfigInternal.libs
184 .filter(projectConfig => (filterNames.length === 0 ||
185 (filterNames.length > 0 &&
186 (filterNames.includes('libs') ||
187 (projectConfig.name && filterNames.includes(projectConfig.name))))));
188 if (filterNames.length &&
189 filterNames.filter(configName => configName === 'apps').length === filterNames.length) {
190 filteredLibConfigs = [];
191 }
192 if (filteredLibConfigs.length > 0) {
193 for (const filteredLibConfig of filteredLibConfigs) {
194 const libConfig = JSON.parse(JSON.stringify(filteredLibConfig));
195 // extends
196 helpers_1.applyProjectConfigExtends(libConfig, angularBuildConfigInternal.libs);
197 const clonedLibConfig = JSON.parse(JSON.stringify(libConfig));
198 // apply env
199 helpers_1.applyProjectConfigWithEnvironment(clonedLibConfig, buildOptions.environment);
200 if (clonedLibConfig.skip) {
201 continue;
202 }
203 const angularBuildContext = new build_context_1.AngularBuildContext(Object.assign({ projectConfigWithoutEnvApplied: libConfig, projectConfig: clonedLibConfig, buildOptions: buildOptions, workspaceRoot: workspaceRoot, host: new node_1.NodeJsSyncHost() }, staticBuildContextOptions));
204 const wpConfig = lib_1.getLibWebpackConfig(angularBuildContext);
205 if (wpConfig) {
206 webpackConfigs.push(wpConfig);
207 }
208 }
209 }
210 }
211 if (angularBuildConfigInternal.apps.length > 0) {
212 let filteredAppConfigs = angularBuildConfigInternal.apps
213 .filter(projectConfig => (filterNames.length === 0 ||
214 (filterNames.length > 0 &&
215 (filterNames.includes('apps') ||
216 (projectConfig.name && filterNames.includes(projectConfig.name))))));
217 if (filterNames.length &&
218 filterNames.filter(configName => configName === 'libs').length === filterNames.length) {
219 filteredAppConfigs = [];
220 }
221 if (filteredAppConfigs.length > 0) {
222 for (const filteredAppConfig of filteredAppConfigs) {
223 const appConfig = JSON.parse(JSON.stringify(filteredAppConfig));
224 // extends
225 helpers_1.applyProjectConfigExtends(appConfig, angularBuildConfigInternal.apps);
226 const clonedAppConfig = JSON.parse(JSON.stringify(appConfig));
227 // apply env
228 helpers_1.applyProjectConfigWithEnvironment(clonedAppConfig, buildOptions.environment);
229 if (clonedAppConfig.skip) {
230 continue;
231 }
232 const angularBuildContext = new build_context_1.AngularBuildContext(Object.assign({ projectConfigWithoutEnvApplied: appConfig, projectConfig: clonedAppConfig, buildOptions: buildOptions, workspaceRoot: workspaceRoot, host: new node_1.NodeJsSyncHost() }, staticBuildContextOptions));
233 const wpConfig = app_1.getAppWebpackConfig(angularBuildContext);
234 if (wpConfig) {
235 webpackConfigs.push(wpConfig);
236 }
237 }
238 }
239 }
240 if (webpackConfigs.length === 0) {
241 throw new errors_1.InvalidConfigError('No app or lib project is available.');
242 }
243 return webpackConfigs;
244}
245//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiQzovcHJvamVjdHMvYW5ndWxhci1idWlsZC8iLCJzb3VyY2VzIjpbInNyYy93ZWJwYWNrLWNvbmZpZ3MvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHdCQUF3QjtBQUN4QiwrQkFBK0I7O0FBRS9CLDJCQUFnQztBQUNoQyw2QkFBNkI7QUFFN0Isb0RBQTJEO0FBRzNELG9EQUF1RDtBQUN2RCx3Q0FJb0I7QUFFcEIsNkNBQXFFO0FBU3JFLG9DQUErRTtBQUUvRSwrQkFBNEM7QUFDNUMsK0JBQTRDO0FBRTVDLHNDQUFzQztBQUN0QyxnREFBdUQsVUFBa0IsRUFBRSxHQUFTLEVBQUUsSUFBVTtJQUM1RixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDbkMsTUFBTSxJQUFJLDJCQUFrQixDQUFDLCtCQUErQixDQUFDLENBQUM7S0FDakU7SUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksMkJBQWtCLENBQUMsOEJBQThCLFVBQVUsR0FBRyxDQUFDLENBQUM7S0FDN0U7SUFFRCxJQUFJLENBQUMsZUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQyx3REFBd0QsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUN2RztJQUVELElBQUksWUFBWSxHQUF5QixFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUM3RCxNQUFNLG1CQUFtQixHQUFHLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQTJCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVoRyxJQUFJLEdBQUcsRUFBRTtRQUNMLFlBQVksQ0FBQyxXQUFXLEdBQUcsOEJBQW9CLENB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SUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUNqQzthQUNKO1NBQ0o7S0FDSjtJQUVELElBQUksY0FBYyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxJQUFJLDJCQUFrQixDQUFDLHFDQUFxQyxDQUFDLENBQUM7S0FDdkU7SUFFRCxPQUFPLGNBQWMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby11bnNhZmUtYW55XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBOb2RlSnNTeW5jSG9zdCB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9jb3JlL25vZGUnO1xuaW1wb3J0ICogYXMgd2VicGFjayBmcm9tICd3ZWJwYWNrJztcblxuaW1wb3J0IHsgQW5ndWxhckJ1aWxkQ29udGV4dCB9IGZyb20gJy4uL2J1aWxkLWNvbnRleHQnO1xuaW1wb3J0IHtcbiAgICBhcHBseVByb2plY3RDb25maWdFeHRlbmRzLFxuICAgIGFwcGx5UHJvamVjdENvbmZpZ1dpdGhFbnZpcm9ubWVudCxcbiAgICBub3JtYWxpemVFbnZpcm9ubWVudFxufSBmcm9tICcuLi9oZWxwZXJzJztcbmltcG9ydCB7IEFuZ3VsYXJCdWlsZENvbmZpZyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJbnRlcm5hbEVycm9yLCBJbnZhbGlkQ29uZmlnRXJyb3IgfSBmcm9tICcuLi9tb2RlbHMvZXJyb3JzJztcbmltcG9ydCB7XG4gICAgQW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwsXG4gICAgQXBwUHJvamVjdENvbmZpZ0ludGVybmFsLFxuICAgIEJ1aWxkQ29tbWFuZE9wdGlvbnMsXG4gICAgQnVpbGRDb250ZXh0U3RhdGljT3B0aW9ucyxcbiAgICBCdWlsZE9wdGlvbnNJbnRlcm5hbCxcbiAgICBMaWJQcm9qZWN0Q29uZmlnSW50ZXJuYWwsXG59IGZyb20gJy4uL21vZGVscy9pbnRlcm5hbHMnO1xuaW1wb3J0IHsgZm9ybWF0VmFsaWRhdGlvbkVycm9yLCByZWFkSnNvblN5bmMsIHZhbGlkYXRlU2NoZW1hIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG5pbXBvcnQgeyBnZXRBcHBXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9hcHAnO1xuaW1wb3J0IHsgZ2V0TGliV2VicGFja0NvbmZpZyB9IGZyb20gJy4vbGliJztcblxuLy8gdHNsaW50OmRpc2FibGU6bWF4LWZ1bmMtYm9keS1sZW5ndGhcbmV4cG9ydCBmdW5jdGlvbiBnZXRXZWJwYWNrQ29uZmlnRnJvbUFuZ3VsYXJCdWlsZENvbmZpZyhjb25maWdQYXRoOiBzdHJpbmcsIGVudj86IGFueSwgYXJndj86IGFueSk6IHdlYnBhY2suQ29uZmlndXJhdGlvbltdIHtcbiAgICBsZXQgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBpZiAoIWNvbmZpZ1BhdGggfHwgIWNvbmZpZ1BhdGgubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoXCJUaGUgJ2NvbmZpZ1BhdGgnIGlzIHJlcXVpcmVkLlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIS9cXC5qc29uJC9pLnRlc3QoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWdFcnJvcihgSW52YWxpZCBjb25maWcgZmlsZSwgcGF0aDogJHtjb25maWdQYXRofS5gKTtcbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEludmFsaWRDb25maWdFcnJvcihgVGhlIGFuZ3VsYXItYnVpbGQuanNvbiBjb25maWcgZmlsZSBkb2VzIG5vdCBleGlzdCBhdCAke2NvbmZpZ1BhdGh9LmApO1xuICAgIH1cblxuICAgIGxldCBidWlsZE9wdGlvbnM6IEJ1aWxkT3B0aW9uc0ludGVybmFsID0geyBlbnZpcm9ubWVudDoge30gfTtcbiAgICBjb25zdCBidWlsZENvbW1hbmRPcHRpb25zID0gYXJndiAmJiB0eXBlb2YgYXJndiA9PT0gJ29iamVjdCcgPyBhcmd2IGFzIEJ1aWxkQ29tbWFuZE9wdGlvbnMgOiB7fTtcblxuICAgIGlmIChlbnYpIHtcbiAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50ID0gbm9ybWFsaXplRW52aXJvbm1lbnQoZW52LCBidWlsZENvbW1hbmRPcHRpb25zLnByb2QpO1xuICAgIH1cblxuICAgIGNvbnN0IGZyb21CdWlsdEluQ2xpID0gYnVpbGRDb21tYW5kT3B0aW9ucy5fZnJvbUJ1aWx0SW5DbGk7XG4gICAgY29uc3QgY2xpUm9vdFBhdGggPSBmcm9tQnVpbHRJbkNsaSAmJiBidWlsZENvbW1hbmRPcHRpb25zLl9jbGlSb290UGF0aCA/IGJ1aWxkQ29tbWFuZE9wdGlvbnMuX2NsaVJvb3RQYXRoIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNsaUlzR2xvYmFsID0gZnJvbUJ1aWx0SW5DbGkgJiYgYnVpbGRDb21tYW5kT3B0aW9ucy5fY2xpSXNHbG9iYWwgPyB0cnVlIDogZmFsc2U7XG4gICAgY29uc3QgY2xpVmVyc2lvbiA9IGZyb21CdWlsdEluQ2xpICYmIGJ1aWxkQ29tbWFuZE9wdGlvbnMuX2NsaVZlcnNpb24gPyBidWlsZENvbW1hbmRPcHRpb25zLl9jbGlWZXJzaW9uIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHZlcmJvc2UgPSBidWlsZENvbW1hbmRPcHRpb25zLnZlcmJvc2U7XG5cbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICBidWlsZE9wdGlvbnMubG9nTGV2ZWwgPSAnZGVidWcnO1xuICAgIH1cblxuICAgIGJ1aWxkT3B0aW9ucy53YXRjaCA9IChidWlsZENvbW1hbmRPcHRpb25zLndhdGNoIHx8IChidWlsZENvbW1hbmRPcHRpb25zIGFzIGFueSkudykgPyB0cnVlIDogZmFsc2U7XG4gICAgYnVpbGRPcHRpb25zLnByb2dyZXNzID0gYnVpbGRDb21tYW5kT3B0aW9ucy5wcm9ncmVzcyA/IHRydWUgOiBmYWxzZTtcblxuICAgIGNvbnN0IGZpbHRlcmVkQ29uZmlnTmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBpZiAoZnJvbUJ1aWx0SW5DbGkpIHtcbiAgICAgICAgYnVpbGRPcHRpb25zLmJlZXAgPSBidWlsZENvbW1hbmRPcHRpb25zLmJlZXA7XG5cbiAgICAgICAgaWYgKGJ1aWxkQ29tbWFuZE9wdGlvbnMuX3N0YXJ0VGltZSkge1xuICAgICAgICAgICAgc3RhcnRUaW1lID0gYnVpbGRDb21tYW5kT3B0aW9ucy5fc3RhcnRUaW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgYnVpbGRPcHRpb25zLmNsZWFuT3V0RGlyID0gYnVpbGRDb21tYW5kT3B0aW9ucy5jbGVhbiB8fCAoYnVpbGRDb21tYW5kT3B0aW9ucyBhcyBhbnkpLmNsZWFuT3V0RGlycyB8fFxuICAgICAgICAgICAgKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5jbGVhbk91dHB1dFBhdGggfHwgKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5kZWxldGVPdXRwdXRQYXRoXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIGlmIChidWlsZENvbW1hbmRPcHRpb25zLmZpbHRlciAmJiBidWlsZENvbW1hbmRPcHRpb25zLmZpbHRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZpbHRlcmVkQ29uZmlnTmFtZXMucHVzaCguLi5wcmVwYXJlRmlsdGVyTmFtZXMoYnVpbGRDb21tYW5kT3B0aW9ucy5maWx0ZXIpKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5jb25maWdOYW1lIHx8IChidWlsZENvbW1hbmRPcHRpb25zIGFzIGFueSlbJ2NvbmZpZy1uYW1lJ10pKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZENvbmZpZ05hbWVzLnB1c2goKChidWlsZENvbW1hbmRPcHRpb25zIGFzIGFueSkuY29uZmlnTmFtZSB8fCAoYnVpbGRDb21tYW5kT3B0aW9ucyBhcyBhbnkpWydjb25maWctbmFtZSddKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWVudiAmJiBwcm9jZXNzLmVudi5XRUJQQUNLX0VOVikge1xuICAgICAgICAgICAgY29uc3QgcmF3RW52U3RyID0gcHJvY2Vzcy5lbnYuV0VCUEFDS19FTlYgYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgcmF3RW52OiBhbnkgPSB0eXBlb2YgcmF3RW52U3RyID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgID8gSlNPTi5wYXJzZShyYXdFbnZTdHIpXG4gICAgICAgICAgICAgICAgOiByYXdFbnZTdHI7XG4gICAgICAgICAgICBidWlsZE9wdGlvbnMuZW52aXJvbm1lbnQgPSB7IC4uLmJ1aWxkT3B0aW9ucy5lbnZpcm9ubWVudCwgLi4ubm9ybWFsaXplRW52aXJvbm1lbnQocmF3RW52LCBidWlsZENvbW1hbmRPcHRpb25zLnByb2QpIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5tb2RlKSB7XG4gICAgICAgICAgICBpZiAoKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5tb2RlID09PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgICAgICBidWlsZE9wdGlvbnMuZW52aXJvbm1lbnQucHJvZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50LnByb2R1Y3Rpb24gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgaWYgKGJ1aWxkT3B0aW9ucy5lbnZpcm9ubWVudC5kZXYpIHtcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50LmRldiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnVpbGRPcHRpb25zLmVudmlyb25tZW50LmRldmVsb3BtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGJ1aWxkT3B0aW9ucy5lbnZpcm9ubWVudC5kZXZlbG9wbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGJ1aWxkQ29tbWFuZE9wdGlvbnMgYXMgYW55KS5tb2RlID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50LmRldiA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50LmRldmVsb3BtZW50ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGlmIChidWlsZE9wdGlvbnMuZW52aXJvbm1lbnQucHJvZCkge1xuICAgICAgICAgICAgICAgICAgICBidWlsZE9wdGlvbnMuZW52aXJvbm1lbnQucHJvZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYnVpbGRPcHRpb25zLmVudmlyb25tZW50LnByb2R1Y3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zLmVudmlyb25tZW50LnByb2R1Y3Rpb24gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYnVpbGRPcHRpb25zLmVudmlyb25tZW50LmJ1aWxkT3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBidWlsZE9wdGlvbnMuZW52aXJvbm1lbnQuYnVpbGRPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGJ1aWxkT3B0aW9ucyA9IHsgLi4uYnVpbGRPcHRpb25zLCAuLi4oKGJ1aWxkT3B0aW9ucyBhcyBhbnkpLmVudmlyb25tZW50LmJ1aWxkT3B0aW9ucykgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIGJ1aWxkT3B0aW9ucy5lbnZpcm9ubWVudC5idWlsZE9wdGlvbnM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgYW5ndWxhckJ1aWxkQ29uZmlnOiBBbmd1bGFyQnVpbGRDb25maWcgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICAgIGFuZ3VsYXJCdWlsZENvbmZpZyA9IHJlYWRKc29uU3luYyhjb25maWdQYXRoKSBhcyBBbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbDtcbiAgICB9IGNhdGNoIChqc29uRXJyKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoYEludmFsaWQgY29uZmlndXJhdGlvbiwgZXJyb3I6ICR7anNvbkVyci5tZXNzYWdlIHx8IGpzb25FcnJ9LmApO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHNjaGVtYVxuICAgIGNvbnN0IHNjaGVtYUZpbGVOYW1lID0gJ3NjaGVtYS5qc29uJztcbiAgICBsZXQgc2NoZW1hUGF0aCA9ICcnO1xuICAgIGlmIChleGlzdHNTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIGAuLi9zY2hlbWFzLyR7c2NoZW1hRmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIHNjaGVtYVBhdGggPSBgLi4vc2NoZW1hcy8ke3NjaGVtYUZpbGVOYW1lfWA7XG4gICAgfSBlbHNlIGlmIChleGlzdHNTeW5jKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsIGAuLi8uLi9zY2hlbWFzLyR7c2NoZW1hRmlsZU5hbWV9YCkpKSB7XG4gICAgICAgIHNjaGVtYVBhdGggPSBgLi4vLi4vc2NoZW1hcy8ke3NjaGVtYUZpbGVOYW1lfWA7XG4gICAgfVxuXG4gICAgaWYgKCFzY2hlbWFQYXRoKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiVGhlIGFuZ3VsYXItYnVpbGQgc2NoZW1hIGZpbGUgZG9lc24ndCBleGlzdC5cIik7XG4gICAgfVxuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vbi1saXRlcmFsLXJlcXVpcmVcbiAgICBjb25zdCBzY2hlbWEgPSByZXF1aXJlKHNjaGVtYVBhdGgpO1xuICAgIGlmIChzY2hlbWEuJHNjaGVtYSkge1xuICAgICAgICBkZWxldGUgc2NoZW1hLiRzY2hlbWE7XG4gICAgfVxuICAgIGlmIChhbmd1bGFyQnVpbGRDb25maWcuJHNjaGVtYSkge1xuICAgICAgICBkZWxldGUgYW5ndWxhckJ1aWxkQ29uZmlnLiRzY2hlbWE7XG4gICAgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gdmFsaWRhdGVTY2hlbWEoc2NoZW1hLCBhbmd1bGFyQnVpbGRDb25maWcpO1xuICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGVyck1zZyA9IGVycm9ycy5tYXAoZXJyID0+IGZvcm1hdFZhbGlkYXRpb25FcnJvcihzY2hlbWEsIGVycikpLmpvaW4oJ1xcbicpO1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKFxuICAgICAgICAgICAgYEludmFsaWQgY29uZmlndXJhdGlvbi5cXG5cXG4ke1xuICAgICAgICAgICAgZXJyTXNnfWApO1xuICAgIH1cblxuICAgIC8vIFNldCBhbmd1bGFyIGJ1aWxkIGRlZmF1bHRzXG4gICAgY29uc3QgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwgPSBhbmd1bGFyQnVpbGRDb25maWcgYXMgQW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWw7XG4gICAgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwuX3NjaGVtYSA9IHNjaGVtYTtcbiAgICBhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5fY29uZmlnUGF0aCA9IGNvbmZpZ1BhdGg7XG4gICAgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwubGlicyA9IGFuZ3VsYXJCdWlsZENvbmZpZ0ludGVybmFsLmxpYnMgfHwgW107XG4gICAgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwuYXBwcyA9IGFuZ3VsYXJCdWlsZENvbmZpZ0ludGVybmFsLmFwcHMgfHwgW107XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFuZ3VsYXJCdWlsZENvbmZpZ0ludGVybmFsLmxpYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbGliQ29uZmlnID0gYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwubGlic1tpXTtcblxuICAgICAgICBsaWJDb25maWcuX2luZGV4ID0gaTtcbiAgICAgICAgbGliQ29uZmlnLl9wcm9qZWN0VHlwZSA9ICdsaWInO1xuICAgICAgICBsaWJDb25maWcuX2NvbmZpZ1BhdGggPSBjb25maWdQYXRoO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwuYXBwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhcHBDb25maWcgPSBhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5hcHBzW2ldO1xuICAgICAgICBhcHBDb25maWcuX2luZGV4ID0gaTtcbiAgICAgICAgYXBwQ29uZmlnLl9wcm9qZWN0VHlwZSA9ICdhcHAnO1xuICAgICAgICBhcHBDb25maWcuX2NvbmZpZ1BhdGggPSBjb25maWdQYXRoO1xuICAgIH1cblxuICAgIGlmIChhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5saWJzLmxlbmd0aCA9PT0gMCAmJiBhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5hcHBzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZENvbmZpZ0Vycm9yKCdObyBhcHAgb3IgbGliIHByb2plY3QgaXMgYXZhaWxhYmxlLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRpY0J1aWxkQ29udGV4dE9wdGlvbnM6IEJ1aWxkQ29udGV4dFN0YXRpY09wdGlvbnMgPSB7XG4gICAgICAgIHdvcmtzcGFjZVJvb3Q6IHBhdGguZGlybmFtZShjb25maWdQYXRoKSxcbiAgICAgICAgZmlsdGVyZWRDb25maWdOYW1lczogZmlsdGVyZWRDb25maWdOYW1lcyxcbiAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWUsXG4gICAgICAgIGZyb21CdWlsdEluQ2xpOiBmcm9tQnVpbHRJbkNsaSxcbiAgICAgICAgYW5ndWxhckJ1aWxkQ29uZmlnOiBhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbCxcbiAgICAgICAgY2xpUm9vdFBhdGg6IGNsaVJvb3RQYXRoLFxuICAgICAgICBjbGlWZXJzaW9uOiBjbGlWZXJzaW9uLFxuICAgICAgICBjbGlJc0dsb2JhbDogY2xpSXNHbG9iYWxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGdldFdlYnBhY2tDb25maWdzSW50ZXJuYWwoYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwsIGJ1aWxkT3B0aW9ucywgc3RhdGljQnVpbGRDb250ZXh0T3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVGaWx0ZXJOYW1lcyhmaWx0ZXI6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGZpbHRlck5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKGZpbHRlciAmJlxuICAgICAgICAoQXJyYXkuaXNBcnJheShmaWx0ZXIpIHx8IHR5cGVvZiBmaWx0ZXIgPT09ICdzdHJpbmcnKSkge1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgICAgICAoZmlsdGVyKS5mb3JFYWNoKGZpbHRlck5hbWUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWx0ZXJOYW1lICYmIGZpbHRlck5hbWUudHJpbSgpICYmICFmaWx0ZXJOYW1lcy5pbmNsdWRlcyhmaWx0ZXJOYW1lLnRyaW0oKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyTmFtZXMucHVzaChmaWx0ZXJOYW1lLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyICYmIGZpbHRlci50cmltKCkpIHtcbiAgICAgICAgICAgIGZpbHRlck5hbWVzLnB1c2goZmlsdGVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmaWx0ZXJOYW1lcztcbn1cblxuZnVuY3Rpb24gZ2V0V2VicGFja0NvbmZpZ3NJbnRlcm5hbChhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbDogQW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwsXG4gICAgYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnNJbnRlcm5hbCxcbiAgICBzdGF0aWNCdWlsZENvbnRleHRPcHRpb25zOiBCdWlsZENvbnRleHRTdGF0aWNPcHRpb25zKTogd2VicGFjay5Db25maWd1cmF0aW9uW10ge1xuXG4gICAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IHdlYnBhY2suQ29uZmlndXJhdGlvbltdID0gW107XG5cbiAgICBjb25zdCB3b3Jrc3BhY2VSb290ID0gc3RhdGljQnVpbGRDb250ZXh0T3B0aW9ucy53b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGZpbHRlck5hbWVzID0gc3RhdGljQnVpbGRDb250ZXh0T3B0aW9ucy5maWx0ZXJlZENvbmZpZ05hbWVzIHx8IFtdO1xuXG4gICAgaWYgKGFuZ3VsYXJCdWlsZENvbmZpZ0ludGVybmFsLmxpYnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgZmlsdGVyZWRMaWJDb25maWdzID0gYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwubGlic1xuICAgICAgICAgICAgLmZpbHRlcihwcm9qZWN0Q29uZmlnID0+XG4gICAgICAgICAgICAgICAgKGZpbHRlck5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgICAgICAoZmlsdGVyTmFtZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlck5hbWVzLmluY2x1ZGVzKCdsaWJzJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvamVjdENvbmZpZy5uYW1lICYmIGZpbHRlck5hbWVzLmluY2x1ZGVzKHByb2plY3RDb25maWcubmFtZSkpKSkpKTtcblxuICAgICAgICBpZiAoZmlsdGVyTmFtZXMubGVuZ3RoICYmXG4gICAgICAgICAgICBmaWx0ZXJOYW1lcy5maWx0ZXIoY29uZmlnTmFtZSA9PiBjb25maWdOYW1lID09PSAnYXBwcycpLmxlbmd0aCA9PT0gZmlsdGVyTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBmaWx0ZXJlZExpYkNvbmZpZ3MgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmaWx0ZXJlZExpYkNvbmZpZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBmaWx0ZXJlZExpYkNvbmZpZyBvZiBmaWx0ZXJlZExpYkNvbmZpZ3MpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaWJDb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGZpbHRlcmVkTGliQ29uZmlnKSkgYXMgTGliUHJvamVjdENvbmZpZ0ludGVybmFsO1xuXG4gICAgICAgICAgICAgICAgLy8gZXh0ZW5kc1xuICAgICAgICAgICAgICAgIGFwcGx5UHJvamVjdENvbmZpZ0V4dGVuZHMobGliQ29uZmlnLCBhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5saWJzKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lZExpYkNvbmZpZyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobGliQ29uZmlnKSkgYXMgTGliUHJvamVjdENvbmZpZ0ludGVybmFsO1xuXG4gICAgICAgICAgICAgICAgLy8gYXBwbHkgZW52XG4gICAgICAgICAgICAgICAgYXBwbHlQcm9qZWN0Q29uZmlnV2l0aEVudmlyb25tZW50KGNsb25lZExpYkNvbmZpZywgYnVpbGRPcHRpb25zLmVudmlyb25tZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChjbG9uZWRMaWJDb25maWcuc2tpcCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmd1bGFyQnVpbGRDb250ZXh0ID0gbmV3IEFuZ3VsYXJCdWlsZENvbnRleHQoe1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0Q29uZmlnV2l0aG91dEVudkFwcGxpZWQ6IGxpYkNvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdENvbmZpZzogY2xvbmVkTGliQ29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBidWlsZE9wdGlvbnM6IGJ1aWxkT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgd29ya3NwYWNlUm9vdDogd29ya3NwYWNlUm9vdCxcbiAgICAgICAgICAgICAgICAgICAgaG9zdDogbmV3IE5vZGVKc1N5bmNIb3N0KCksXG4gICAgICAgICAgICAgICAgICAgIC4uLnN0YXRpY0J1aWxkQ29udGV4dE9wdGlvbnNcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHdwQ29uZmlnID0gZ2V0TGliV2VicGFja0NvbmZpZyhhbmd1bGFyQnVpbGRDb250ZXh0KSBhcyAod2VicGFjay5Db25maWd1cmF0aW9uIHwgbnVsbCk7XG4gICAgICAgICAgICAgICAgaWYgKHdwQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHdlYnBhY2tDb25maWdzLnB1c2god3BDb25maWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbmd1bGFyQnVpbGRDb25maWdJbnRlcm5hbC5hcHBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGZpbHRlcmVkQXBwQ29uZmlncyA9IGFuZ3VsYXJCdWlsZENvbmZpZ0ludGVybmFsLmFwcHNcbiAgICAgICAgICAgIC5maWx0ZXIocHJvamVjdENvbmZpZyA9PlxuICAgICAgICAgICAgICAgIChmaWx0ZXJOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgKGZpbHRlck5hbWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXJOYW1lcy5pbmNsdWRlcygnYXBwcycpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2plY3RDb25maWcubmFtZSAmJiBmaWx0ZXJOYW1lcy5pbmNsdWRlcyhwcm9qZWN0Q29uZmlnLm5hbWUpKSkpKSk7XG5cbiAgICAgICAgaWYgKGZpbHRlck5hbWVzLmxlbmd0aCAmJlxuICAgICAgICAgICAgZmlsdGVyTmFtZXMuZmlsdGVyKGNvbmZpZ05hbWUgPT4gY29uZmlnTmFtZSA9PT0gJ2xpYnMnKS5sZW5ndGggPT09IGZpbHRlck5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgZmlsdGVyZWRBcHBDb25maWdzID0gW107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmlsdGVyZWRBcHBDb25maWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZmlsdGVyZWRBcHBDb25maWcgb2YgZmlsdGVyZWRBcHBDb25maWdzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXBwQ29uZmlnID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShmaWx0ZXJlZEFwcENvbmZpZykpIGFzIEFwcFByb2plY3RDb25maWdJbnRlcm5hbDtcblxuICAgICAgICAgICAgICAgIC8vIGV4dGVuZHNcbiAgICAgICAgICAgICAgICBhcHBseVByb2plY3RDb25maWdFeHRlbmRzKGFwcENvbmZpZywgYW5ndWxhckJ1aWxkQ29uZmlnSW50ZXJuYWwuYXBwcyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjbG9uZWRBcHBDb25maWcgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGFwcENvbmZpZykpIGFzIEFwcFByb2plY3RDb25maWdJbnRlcm5hbDtcblxuICAgICAgICAgICAgICAgIC8vIGFwcGx5IGVudlxuICAgICAgICAgICAgICAgIGFwcGx5UHJvamVjdENvbmZpZ1dpdGhFbnZpcm9ubWVudChjbG9uZWRBcHBDb25maWcsIGJ1aWxkT3B0aW9ucy5lbnZpcm9ubWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xvbmVkQXBwQ29uZmlnLnNraXApIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgYW5ndWxhckJ1aWxkQ29udGV4dCA9IG5ldyBBbmd1bGFyQnVpbGRDb250ZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdENvbmZpZ1dpdGhvdXRFbnZBcHBsaWVkOiBhcHBDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIHByb2plY3RDb25maWc6IGNsb25lZEFwcENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYnVpbGRPcHRpb25zOiBidWlsZE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtzcGFjZVJvb3Q6IHdvcmtzcGFjZVJvb3QsXG4gICAgICAgICAgICAgICAgICAgIGhvc3Q6IG5ldyBOb2RlSnNTeW5jSG9zdCgpLFxuICAgICAgICAgICAgICAgICAgICAuLi5zdGF0aWNCdWlsZENvbnRleHRPcHRpb25zXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB3cENvbmZpZyA9IGdldEFwcFdlYnBhY2tDb25maWcoYW5ndWxhckJ1aWxkQ29udGV4dCkgYXMgKHdlYnBhY2suQ29uZmlndXJhdGlvbiB8IG51bGwpO1xuICAgICAgICAgICAgICAgIGlmICh3cENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB3ZWJwYWNrQ29uZmlncy5wdXNoKHdwQ29uZmlnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAod2VicGFja0NvbmZpZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkQ29uZmlnRXJyb3IoJ05vIGFwcCBvciBsaWIgcHJvamVjdCBpcyBhdmFpbGFibGUuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdlYnBhY2tDb25maWdzO1xufVxuIl19
\No newline at end of file