1 | ;
|
2 | // tslint:disable:no-any
|
3 | // tslint:disable:no-unsafe-any
|
4 | Object.defineProperty(exports, "__esModule", { value: true });
|
5 | const fs_1 = require("fs");
|
6 | const path = require("path");
|
7 | const node_1 = require("@angular-devkit/core/node");
|
8 | const build_context_1 = require("../build-context");
|
9 | const helpers_1 = require("../helpers");
|
10 | const errors_1 = require("../models/errors");
|
11 | const utils_1 = require("../utils");
|
12 | const app_1 = require("./app");
|
13 | const lib_1 = require("./lib");
|
14 | // tslint:disable:max-func-body-length
|
15 | function 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 | }
|
160 | exports.getWebpackConfigFromAngularBuildConfig = getWebpackConfigFromAngularBuildConfig;
|
161 | function 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 | }
|
178 | function 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 |