@nlabs/lex 1.59.5 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/.storybook/main.ts +3 -47
  2. package/README.md +13 -19
  3. package/__mocks__/build.js +3 -3
  4. package/config.json +3 -1
  5. package/examples/lex.config.js +3 -7
  6. package/lib/LexConfig.d.ts +2 -6
  7. package/lib/LexConfig.js +2 -2
  8. package/lib/commands/ai/ai.js +3 -3
  9. package/lib/commands/build/build.d.ts +5 -3
  10. package/lib/commands/build/build.js +66 -156
  11. package/lib/commands/config/config.js +9 -7
  12. package/lib/commands/dev/dev.d.ts +0 -2
  13. package/lib/commands/dev/dev.js +24 -115
  14. package/lib/commands/migrate/migrate.js +2 -2
  15. package/lib/commands/serverless-dev/serverless-dev.js +2 -2
  16. package/lib/commands/versions/versions.d.ts +1 -1
  17. package/lib/commands/versions/versions.js +4 -4
  18. package/lib/lex.js +10 -11
  19. package/lib/types.d.ts +1 -1
  20. package/lib/types.js +1 -1
  21. package/lib/utils/app.d.ts +0 -2
  22. package/lib/utils/app.js +2 -29
  23. package/lib/utils/{webpack/LexSvgSpritemapPlugin.d.ts → assets/LexSvgSpritemap.d.ts} +6 -8
  24. package/lib/utils/assets/LexSvgSpritemap.js +219 -0
  25. package/lib/utils/file.d.ts +0 -4
  26. package/lib/utils/file.js +4 -100
  27. package/lib/utils/staticSite.d.ts +15 -0
  28. package/lib/utils/staticSite.js +80 -0
  29. package/lib/utils/vite/assets.d.ts +19 -0
  30. package/lib/utils/vite/assets.js +249 -0
  31. package/lib/utils/vite/config.d.ts +12 -0
  32. package/lib/utils/vite/config.js +272 -0
  33. package/package.json +14 -66
  34. package/postcss.config.js +1 -2
  35. package/tsconfig.lint.json +0 -1
  36. package/tsconfig.test.json +0 -1
  37. package/lib/utils/webpack/LexSvgSpritemapPlugin.js +0 -255
  38. package/scripts/test-webpack.js +0 -453
  39. package/webpack.config.d.ts +0 -2
  40. package/webpack.config.js +0 -960
@@ -5,24 +5,19 @@
5
5
  import { execa } from 'execa';
6
6
  import { existsSync, readFileSync } from 'fs';
7
7
  import { sync as globSync } from 'glob';
8
+ import { build as viteBuild, createServer as createViteServer } from 'vite';
8
9
  import { dirname, relative as pathRelative, resolve as pathResolve } from 'path';
9
10
  import { LexConfig } from '../../LexConfig.js';
10
- import { checkLinkedModules, copyConfiguredFiles, createSpinner, handleWebpackProgress, removeFiles } from '../../utils/app.js';
11
- import { resolveWebpackPaths, getLexPackageJsonPath, resolveBinaryPath } from '../../utils/file.js';
11
+ import { checkLinkedModules, copyConfiguredFiles, createSpinner, removeFiles } from '../../utils/app.js';
12
+ import { resolveBinaryPath } from '../../utils/file.js';
12
13
  import { log } from '../../utils/log.js';
14
+ import { renderStaticSite } from '../../utils/staticSite.js';
13
15
  import { processTranslations } from '../../utils/translations.js';
16
+ import { compressLexWebAssets, copyLexWebAssets, optimizeLexWebAssets } from '../../utils/vite/assets.js';
17
+ import { createLexViteConfig } from '../../utils/vite/config.js';
14
18
  import { aiFunction } from '../ai/ai.js';
15
19
  import boxen from 'boxen';
16
20
  import chalk from 'chalk';
17
- let currentFilename;
18
- let currentDirname;
19
- try {
20
- currentFilename = eval('require("url").fileURLToPath(import.meta.url)');
21
- currentDirname = dirname(currentFilename);
22
- } catch {
23
- currentFilename = process.cwd();
24
- currentDirname = process.cwd();
25
- }
26
21
  const displayBuildStatus = (bundler, outputPath, quiet, stats)=>{
27
22
  if (quiet) return;
28
23
  let statsInfo = '';
@@ -107,174 +102,89 @@ export const buildWithSWC = async (spinner, commandOptions, callback)=>{
107
102
  return 1;
108
103
  }
109
104
  };
110
- export const buildWithWebpack = async (spinner, cmd, callback)=>{
111
- const { analyze, cliName = 'Lex', config, configName, defineProcessEnvNodeEnv, devtool, disableInterpret, entry, env, failOnWarnings, json, merge, mode, name, nodeEnv, noDevtool, noStats, noTarget, noWatch, noWatchOptionsStdin, outputPath, quiet = false, stats, target, watch, watchOptionsStdin } = cmd;
105
+ export const buildWithVite = async (spinner, cmd, callback)=>{
106
+ const { analyze, assist, entry, mode = 'production', quiet = false, static: isStatic = false } = cmd;
112
107
  const entryValue = Array.isArray(entry) ? entry[0] : entry;
113
- let webpackConfig;
114
- if (config) {
115
- const isRelativeConfig = config.substr(0, 2) === './';
116
- webpackConfig = isRelativeConfig ? pathResolve(process.cwd(), config) : config;
117
- } else {
118
- const projectConfigPath = pathResolve(process.cwd(), 'webpack.config.js');
119
- const projectConfigPathTs = pathResolve(process.cwd(), 'webpack.config.ts');
120
- const hasProjectConfig = existsSync(projectConfigPath) || existsSync(projectConfigPathTs);
121
- if (hasProjectConfig) {
122
- webpackConfig = existsSync(projectConfigPathTs) ? projectConfigPathTs : projectConfigPath;
123
- } else {
124
- const { webpackConfig: resolvedConfig } = resolveWebpackPaths(currentDirname);
125
- webpackConfig = resolvedConfig;
126
- }
127
- }
128
- if (!existsSync(webpackConfig)) {
129
- const lexPackagePath = getLexPackageJsonPath();
130
- const lexPackageDir = dirname(lexPackagePath);
131
- const lexWebpackConfig = pathResolve(lexPackageDir, 'webpack.config.js');
132
- if (existsSync(lexWebpackConfig)) {
133
- webpackConfig = lexWebpackConfig;
134
- console.log('Using Lex webpack config:', webpackConfig);
135
- } else {
136
- log(`\n${cliName} Error: Could not find webpack.config.js`, 'error', quiet);
137
- spinner.fail('Build failed.');
138
- callback(1);
139
- return 1;
140
- }
141
- }
142
- const webpackOptions = [
143
- '--color',
144
- '--progress',
145
- '--config',
146
- webpackConfig
147
- ];
148
- if (analyze) webpackOptions.push('--analyze');
149
- if (configName) webpackOptions.push('--configName', configName);
150
- if (defineProcessEnvNodeEnv) webpackOptions.push('--defineProcessEnvNodeEnv', defineProcessEnvNodeEnv);
151
- if (devtool) webpackOptions.push('--devtool', devtool);
152
- if (disableInterpret) webpackOptions.push('--disableInterpret');
153
- if (entryValue) webpackOptions.push('--entry', entryValue.toString());
154
- if (env) webpackOptions.push('--env', env);
155
- if (failOnWarnings) webpackOptions.push('--failOnWarnings');
156
- if (json) webpackOptions.push('--json', json);
157
- if (mode) webpackOptions.push('--mode', mode);
158
- if (merge) webpackOptions.push('--merge');
159
- if (name) webpackOptions.push('--name', name);
160
- if (noDevtool) webpackOptions.push('--noDevtool');
161
- if (noStats) webpackOptions.push('--noStats');
162
- if (noTarget) webpackOptions.push('--noTarget');
163
- if (noWatch) webpackOptions.push('--noWatch');
164
- if (noWatchOptionsStdin) webpackOptions.push('--noWatchOptionsStdin');
165
- if (nodeEnv) webpackOptions.push('--nodeEnv', nodeEnv);
166
- if (outputPath) webpackOptions.push('--output-path', outputPath.toString()); // Convert to string
167
- if (stats) webpackOptions.push('--stats', stats);
168
- if (target) webpackOptions.push('--target', target);
169
- if (watch) webpackOptions.push('--watch');
170
- if (watchOptionsStdin) webpackOptions.push('--watchOptionsStdin');
108
+ const outputPath = LexConfig.config.outputFullPath || pathResolve(process.cwd(), './lib');
171
109
  try {
172
- const { webpackPath } = resolveWebpackPaths(currentDirname);
173
- let executablePath = webpackPath;
174
- let finalWebpackOptions;
175
- if (webpackPath === 'npx') {
176
- finalWebpackOptions = [
177
- 'webpack',
178
- ...webpackOptions
179
- ];
180
- } else if (webpackPath.endsWith('.js')) {
181
- executablePath = 'node';
182
- finalWebpackOptions = [
183
- webpackPath,
184
- ...webpackOptions
185
- ];
186
- } else {
187
- finalWebpackOptions = [
188
- ...webpackOptions
189
- ];
190
- }
191
- const childProcess = execa(executablePath, finalWebpackOptions, {
192
- encoding: 'utf8',
193
- stdio: 'pipe'
194
- });
195
- let buildCompleted = false;
196
- let buildStats = {
197
- modules: 0,
198
- assets: 0,
199
- size: '0 B'
200
- };
201
- childProcess.stdout?.on('data', (data)=>{
202
- const output = data.toString();
203
- handleWebpackProgress(output, spinner, quiet, '🏗️', 'Webpack Building');
204
- if (!buildCompleted && output.includes('compiled successfully')) {
205
- buildCompleted = true;
206
- spinner.succeed('Build completed successfully!');
207
- const moduleMatch = output.match(/(\d+) modules/);
208
- const assetMatch = output.match(/(\d+) assets/);
209
- const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
210
- if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
211
- if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
212
- if (sizeMatch) buildStats.size = sizeMatch[1];
213
- displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
214
- }
215
- });
216
- childProcess.stderr?.on('data', (data)=>{
217
- const output = data.toString();
218
- handleWebpackProgress(output, spinner, quiet, '🏗️', 'Webpack Building');
219
- if (!buildCompleted && output.includes('compiled successfully')) {
220
- buildCompleted = true;
221
- spinner.succeed('Build completed successfully!');
222
- const moduleMatch = output.match(/(\d+) modules/);
223
- const assetMatch = output.match(/(\d+) assets/);
224
- const sizeMatch = output.match(/assets by status ([\d.]+ \w+)/) || output.match(/assets by path.*?([\d.]+ \w+)/);
225
- if (moduleMatch) buildStats.modules = parseInt(moduleMatch[1], 10);
226
- if (assetMatch) buildStats.assets = parseInt(assetMatch[1], 10);
227
- if (sizeMatch) buildStats.size = sizeMatch[1];
228
- displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
110
+ spinner.start('Building with Vite...');
111
+ await viteBuild(createLexViteConfig({
112
+ analyze,
113
+ command: 'build',
114
+ entry: entryValue,
115
+ mode,
116
+ quiet
117
+ }));
118
+ await copyLexWebAssets(LexConfig.config);
119
+ await optimizeLexWebAssets(LexConfig.config);
120
+ if (isStatic) {
121
+ const server = await createViteServer({
122
+ ...createLexViteConfig({
123
+ command: 'serve',
124
+ entry: entryValue,
125
+ mode,
126
+ quiet,
127
+ ssr: true
128
+ }),
129
+ server: {
130
+ middlewareMode: true
131
+ }
132
+ });
133
+ try {
134
+ const sourcePath = LexConfig.config.sourceFullPath || pathResolve(process.cwd(), './src');
135
+ const entryPath = pathResolve(sourcePath, entryValue || LexConfig.config.entryJs || 'index.js');
136
+ const module = await server.ssrLoadModule(entryPath);
137
+ const render = module.default || module.render;
138
+ if (typeof render !== 'function') throw new Error(`Static entry "${entryPath}" must export a render function.`);
139
+ const assets = globSync('**/*', {
140
+ cwd: outputPath,
141
+ nodir: true
142
+ }).reduce((result, fileName)=>{
143
+ result[fileName] = `/${fileName}`;
144
+ return result;
145
+ }, {});
146
+ await renderStaticSite({
147
+ assets,
148
+ outputPath,
149
+ render
150
+ });
151
+ } finally{
152
+ await server.close();
229
153
  }
230
- });
231
- await childProcess;
232
- if (!buildCompleted) {
233
- spinner.succeed('Build completed successfully!');
234
- displayBuildStatus('webpack', LexConfig.config.outputFullPath || 'lib', quiet, buildStats);
235
154
  }
155
+ compressLexWebAssets(LexConfig.config);
156
+ spinner.succeed('Build completed successfully!');
157
+ displayBuildStatus('Vite', outputPath, quiet);
236
158
  callback(0);
237
159
  return 0;
238
160
  } catch (error) {
239
- log(`\n${cliName} Error: Webpack build failed`, 'error', quiet);
240
- log(`\nError: ${error.message}`, 'error', quiet);
241
- if (error instanceof Error) {
242
- if (error.stack) {
243
- log(`\nStack Trace:\n${error.stack}`, 'error', quiet);
244
- }
245
- }
246
- log(`\nWebpack Options: ${webpackOptions.slice(0, 5).join(' ')}...`, 'error', quiet);
161
+ const buildError = error instanceof Error ? error : new Error(String(error));
162
+ log(`\n${cmd.cliName || 'Lex'} Error: Vite build failed`, 'error', quiet);
163
+ log(`\nError: ${buildError.message}`, 'error', quiet);
247
164
  spinner.fail('Build failed.');
248
- if (cmd.assist) {
249
- spinner.start('AI is analyzing the webpack error...');
165
+ if (assist) {
250
166
  try {
251
167
  await aiFunction({
252
- prompt: `Fix this webpack build error: ${error.message}\n\nError details:\n${error.toString()}\n\nConfiguration used:\n${JSON.stringify(webpackOptions, null, 2)}`,
168
+ prompt: `Fix this Vite build error: ${buildError.message}\n\n${buildError.stack || ''}`,
253
169
  task: 'help',
254
170
  context: true,
255
171
  quiet
256
172
  });
257
- spinner.succeed('AI analysis complete');
258
173
  } catch (aiError) {
259
- spinner.fail('Could not generate AI assistance');
260
- if (!quiet) {
261
- console.error('AI assistance error:', aiError);
262
- }
174
+ if (!quiet) console.error('AI assistance error:', aiError);
263
175
  }
264
176
  }
265
- if (!quiet) {
266
- console.error('\nFull Error Details:', error);
267
- }
268
177
  callback(1);
269
178
  return 1;
270
179
  }
271
180
  };
272
181
  export const build = async (cmd, callback = ()=>({}))=>{
273
- const { bundler = 'webpack', cliName = 'Lex', quiet = false, remove = false, test = false, translations = false, variables = '{}' } = cmd;
182
+ const { bundler: requestedBundler, cliName = 'Lex', quiet = false, remove = false, test = false, translations = false, variables = '{}' } = cmd;
274
183
  const spinner = createSpinner(quiet);
275
184
  log(`${cliName} building...`, 'info', quiet);
276
185
  await LexConfig.parseConfig(cmd);
277
186
  const { outputFullPath, useTypescript } = LexConfig.config;
187
+ const bundler = requestedBundler || (LexConfig.config.targetEnvironment === 'web' ? 'vite' : 'swc');
278
188
  checkLinkedModules();
279
189
  let variablesObj = {
280
190
  NODE_ENV: 'production'
@@ -321,7 +231,7 @@ export const build = async (cmd, callback = ()=>({}))=>{
321
231
  buildResult = status;
322
232
  });
323
233
  } else {
324
- buildResult = await buildWithWebpack(spinner, cmd, (status)=>{
234
+ buildResult = await buildWithVite(spinner, cmd, (status)=>{
325
235
  buildResult = status;
326
236
  });
327
237
  }
@@ -330,7 +240,7 @@ export const build = async (cmd, callback = ()=>({}))=>{
330
240
  try {
331
241
  const stats = {
332
242
  outputPath: LexConfig.config.outputFullPath,
333
- entryPoints: bundler === 'swc' ? `Source files: ${LexConfig.config.sourceFullPath}/**/*.{ts,js}` : LexConfig.config.webpack?.entry || 'Unknown entry points'
243
+ entryPoints: bundler === 'swc' ? `Source files: ${LexConfig.config.sourceFullPath}/**/*.{ts,js}` : LexConfig.config.entryJs || 'Unknown entry point'
334
244
  };
335
245
  await aiFunction({
336
246
  prompt: `Analyze this build for optimization opportunities:
@@ -440,4 +350,4 @@ What are the key optimization opportunities for this build configuration? Consid
440
350
  };
441
351
  export default build;
442
352
 
443
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7XG4gIGRpcm5hbWUsXG4gIHJlbGF0aXZlIGFzIHBhdGhSZWxhdGl2ZSxcbiAgcmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZVxufSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWd9IGZyb20gJy4uLy4uL0xleENvbmZpZy5qcyc7XG5pbXBvcnQge2NoZWNrTGlua2VkTW9kdWxlcywgY29weUNvbmZpZ3VyZWRGaWxlcywgY3JlYXRlU3Bpbm5lciwgY3JlYXRlUHJvZ3Jlc3NCYXIsIGhhbmRsZVdlYnBhY2tQcm9ncmVzcywgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlV2VicGFja1BhdGhzLFxuICBnZXRMZXhQYWNrYWdlSnNvblBhdGgsXG4gIHJlc29sdmVCaW5hcnlQYXRoXG59IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge3Byb2Nlc3NUcmFuc2xhdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9ucy5qcyc7XG5pbXBvcnQge2FpRnVuY3Rpb259IGZyb20gJy4uL2FpL2FpLmpzJztcbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7U1dDT3B0aW9uc30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB0eXBlIHtTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuXG5sZXQgY3VycmVudEZpbGVuYW1lOiBzdHJpbmc7XG5sZXQgY3VycmVudERpcm5hbWU6IHN0cmluZztcblxudHJ5IHtcbiAgY3VycmVudEZpbGVuYW1lID0gZXZhbCgncmVxdWlyZShcInVybFwiKS5maWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCknKTtcbiAgY3VycmVudERpcm5hbWUgPSBkaXJuYW1lKGN1cnJlbnRGaWxlbmFtZSk7XG59IGNhdGNoIHtcbiAgY3VycmVudEZpbGVuYW1lID0gcHJvY2Vzcy5jd2QoKTtcbiAgY3VycmVudERpcm5hbWUgPSBwcm9jZXNzLmN3ZCgpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2lzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBidW5kbGVyPzogJ3dlYnBhY2snIHwgJ3N3Yyc7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudHJ5Pzogc3RyaW5nO1xuICByZWFkb25seSBmb3JtYXQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9ucz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd2F0Y2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBCdWlsZENhbGxiYWNrID0gKHN0YXR1czogbnVtYmVyKSA9PiB2b2lkO1xuXG5jb25zdCBkaXNwbGF5QnVpbGRTdGF0dXMgPSAoYnVuZGxlcjogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBzdGF0cz86IHttb2R1bGVzPzogbnVtYmVyOyBhc3NldHM/OiBudW1iZXI7IHNpemU/OiBzdHJpbmd9KSA9PiB7XG4gIGlmKHF1aWV0KSByZXR1cm47XG5cbiAgbGV0IHN0YXRzSW5mbyA9ICcnO1xuICBpZihzdGF0cyAmJiBzdGF0cy5tb2R1bGVzICYmIHN0YXRzLmFzc2V0cykge1xuICAgIHN0YXRzSW5mbyA9IGBcXG4ke2NoYWxrLmdyZWVuKCdNb2R1bGVzOicpfSAgICAke2NoYWxrLmN5YW4oc3RhdHMubW9kdWxlcyl9XFxuYCArXG4gICAgICBgJHtjaGFsay5ncmVlbignQXNzZXRzOicpfSAgICAgJHtjaGFsay5jeWFuKHN0YXRzLmFzc2V0cyl9XFxuYCArXG4gICAgICBgJHtjaGFsay5ncmVlbignU2l6ZTonKX0gICAgICAgJHtjaGFsay5jeWFuKHN0YXRzLnNpemUpfVxcbmA7XG4gIH1cblxuICBjb25zdCBzdGF0dXNCb3ggPSBib3hlbihcbiAgICBgJHtjaGFsay5jeWFuLmJvbGQoJ/Cfj5fvuI8gIEJ1aWxkIENvbXBsZXRlZCBTdWNjZXNzZnVsbHkgJyl9XFxuXFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ0J1bmRsZXI6Jyl9ICAgICR7Y2hhbGsuY3lhbihidW5kbGVyKX1cXG5gICtcbiAgICBgJHtjaGFsay5ncmVlbignT3V0cHV0OicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUob3V0cHV0UGF0aCl9JHtzdGF0c0luZm99XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdSZWFkeSBmb3IgZGVwbG95bWVudCEg8J+agCcpfWAsXG4gICAge1xuICAgICAgcGFkZGluZzogMSxcbiAgICAgIG1hcmdpbjogMSxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdncmVlbicsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMWExYTFhJ1xuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZygnXFxuJyArIHN0YXR1c0JveCArICdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZFdpdGhTV0MgPSBhc3luYyAoc3Bpbm5lcjogU3Bpbm5lciwgY29tbWFuZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2spID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0LFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNvbW1hbmRPcHRpb25zO1xuICBjb25zdCB7XG4gICAgb3V0cHV0RnVsbFBhdGgsXG4gICAgc291cmNlRnVsbFBhdGgsXG4gICAgc3djOiBzd2NDb25maWcsXG4gICAgdGFyZ2V0RW52aXJvbm1lbnQsXG4gICAgdXNlR3JhcGhRbCxcbiAgICB1c2VUeXBlc2NyaXB0XG4gIH0gPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBzb3VyY2VEaXI6IHN0cmluZyA9IHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke3NvdXJjZVBhdGh9YCkgOiBzb3VyY2VGdWxsUGF0aCB8fCAnJztcblxuICBjb25zdCBnbG9iT3B0aW9ucyA9IHtcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBjd2Q6IHNvdXJjZURpcixcbiAgICBkb3Q6IGZhbHNlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIG5vc29ydDogdHJ1ZVxuICB9O1xuICBjb25zdCB0c0ZpbGVzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgKiovISgqLnNwZWN8Ki50ZXN0KS5qc2AsIGdsb2JPcHRpb25zKTtcbiAgY29uc3Qgc291cmNlRmlsZXM6IHN0cmluZ1tdID0gWy4uLnRzRmlsZXMsIC4uLmpzRmlsZXNdO1xuXG4gIGNvbnN0IG91dHB1dERpcjogc3RyaW5nID0gb3V0cHV0UGF0aFxuICAgID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3V0cHV0UGF0aClcbiAgICA6IChvdXRwdXRGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9saWInKSk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdCdWlsZGluZyB3aXRoIFNXQy4uLicpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtUHJvbWlzZXMgPSBzb3VyY2VGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVSZWxhdGl2ZVRvU291cmNlID0gcGF0aFJlbGF0aXZlKHNvdXJjZURpciwgZmlsZSk7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gZmlsZTsgLy8gZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlXG4gICAgICBjb25zdCBvdXRwdXRGaWxlID0gZmlsZVJlbGF0aXZlVG9Tb3VyY2UucmVwbGFjZSgvXFwuKHRzfHRzeCkkLywgJy5qcycpO1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgb3V0cHV0RmlsZSk7XG4gICAgICBjb25zdCBvdXRwdXREaXJQYXRoID0gZGlybmFtZShvdXRwdXRQYXRoKTtcblxuICAgICAgaWYoIWV4aXN0c1N5bmMob3V0cHV0RGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3Qge21rZGlyU3luY30gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICAgIG1rZGlyU3luYyhvdXRwdXREaXJQYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSByZWFkRmlsZVN5bmMoc291cmNlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHN3Y09wdGlvbnMgPSB7XG4gICAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgICAgZmlsZW5hbWU6IGZpbGUsXG4gICAgICAgIG1vZHVsZToge1xuICAgICAgICAgIHR5cGU6IGZvcm1hdCA9PT0gJ2NqcycgPyAnY29tbW9uanMnIGFzIGNvbnN0IDogKHN3Y0NvbmZpZz8ubW9kdWxlPy50eXBlIGFzICdlczYnIHx8ICdlczYnKSxcbiAgICAgICAgICAuLi5zd2NDb25maWc/Lm1vZHVsZVxuICAgICAgICB9LFxuICAgICAgfSBhcyBQYXJ0aWFsPFNXQ09wdGlvbnM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlQ29kZSwgc3djT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHt3cml0ZUZpbGVTeW5jfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgcmVzdWx0LmNvZGUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodHJhbnNmb3JtUHJvbWlzZXMpO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgd2l0aCBTV0MnKTtcbiAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ1NXQycsIG91dHB1dERpciwgcXVpZXQgPz8gZmFsc2UpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NvbW1hbmRPcHRpb25zLmNsaU5hbWUgfHwgJ0xleCd9IEVycm9yOiBTV0MgYnVpbGQgZmFpbGVkYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZyhgXFxuRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICBpZihlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZihlcnJvci5zdGFjaykge1xuICAgICAgICBsb2coYFxcblN0YWNrIFRyYWNlOlxcbiR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBpZignZmlsZW5hbWUnIGluIGVycm9yIHx8ICdmaWxlJyBpbiBlcnJvcikge1xuICAgICAgICBsb2coYFxcbkZpbGU6ICR7KGVycm9yIGFzIGFueSkuZmlsZW5hbWUgfHwgKGVycm9yIGFzIGFueSkuZmlsZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQgd2l0aCBTV0MnKTtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcbkZ1bGwgRXJyb3IgRGV0YWlsczonLCBlcnJvcik7XG4gICAgfVxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoV2VicGFjayA9IGFzeW5jIChcbiAgc3Bpbm5lcjogU3Bpbm5lcixcbiAgY21kOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICBjYWxsYmFjazogQnVpbGRDYWxsYmFja1xuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhbmFseXplLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgY29uZmlnTmFtZSxcbiAgICBkZWZpbmVQcm9jZXNzRW52Tm9kZUVudixcbiAgICBkZXZ0b29sLFxuICAgIGRpc2FibGVJbnRlcnByZXQsXG4gICAgZW50cnksXG4gICAgZW52LFxuICAgIGZhaWxPbldhcm5pbmdzLFxuICAgIGpzb24sXG4gICAgbWVyZ2UsXG4gICAgbW9kZSxcbiAgICBuYW1lLFxuICAgIG5vZGVFbnYsXG4gICAgbm9EZXZ0b29sLFxuICAgIG5vU3RhdHMsXG4gICAgbm9UYXJnZXQsXG4gICAgbm9XYXRjaCxcbiAgICBub1dhdGNoT3B0aW9uc1N0ZGluLFxuICAgIG91dHB1dFBhdGgsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICBzdGF0cyxcbiAgICB0YXJnZXQsXG4gICAgd2F0Y2gsXG4gICAgd2F0Y2hPcHRpb25zU3RkaW5cbiAgfSA9IGNtZDtcblxuICBjb25zdCBlbnRyeVZhbHVlID0gQXJyYXkuaXNBcnJheShlbnRyeSkgPyBlbnRyeVswXSA6IGVudHJ5O1xuXG4gIGxldCB3ZWJwYWNrQ29uZmlnOiBzdHJpbmc7XG5cbiAgaWYoY29uZmlnKSB7XG4gICAgY29uc3QgaXNSZWxhdGl2ZUNvbmZpZzogYm9vbGVhbiA9IGNvbmZpZy5zdWJzdHIoMCwgMikgPT09ICcuLyc7XG4gICAgd2VicGFja0NvbmZpZyA9IGlzUmVsYXRpdmVDb25maWcgPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBjb25maWcpIDogY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3dlYnBhY2suY29uZmlnLmpzJyk7XG4gICAgY29uc3QgcHJvamVjdENvbmZpZ1BhdGhUcyA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd3ZWJwYWNrLmNvbmZpZy50cycpO1xuICAgIGNvbnN0IGhhc1Byb2plY3RDb25maWcgPSBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoKSB8fCBleGlzdHNTeW5jKHByb2plY3RDb25maWdQYXRoVHMpO1xuXG4gICAgaWYoaGFzUHJvamVjdENvbmZpZykge1xuICAgICAgd2VicGFja0NvbmZpZyA9IGV4aXN0c1N5bmMocHJvamVjdENvbmZpZ1BhdGhUcykgPyBwcm9qZWN0Q29uZmlnUGF0aFRzIDogcHJvamVjdENvbmZpZ1BhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHt3ZWJwYWNrQ29uZmlnOiByZXNvbHZlZENvbmZpZ30gPSByZXNvbHZlV2VicGFja1BhdGhzKGN1cnJlbnREaXJuYW1lKTtcbiAgICAgIHdlYnBhY2tDb25maWcgPSByZXNvbHZlZENvbmZpZztcbiAgICB9XG4gIH1cblxuICBpZighZXhpc3RzU3luYyh3ZWJwYWNrQ29uZmlnKSkge1xuICAgIGNvbnN0IGxleFBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG4gICAgY29uc3QgbGV4UGFja2FnZURpciA9IGRpcm5hbWUobGV4UGFja2FnZVBhdGgpO1xuICAgIGNvbnN0IGxleFdlYnBhY2tDb25maWcgPSBwYXRoUmVzb2x2ZShsZXhQYWNrYWdlRGlyLCAnd2VicGFjay5jb25maWcuanMnKTtcblxuICAgIGlmKGV4aXN0c1N5bmMobGV4V2VicGFja0NvbmZpZykpIHtcbiAgICAgIHdlYnBhY2tDb25maWcgPSBsZXhXZWJwYWNrQ29uZmlnO1xuICAgICAgY29uc29sZS5sb2coJ1VzaW5nIExleCB3ZWJwYWNrIGNvbmZpZzonLCB3ZWJwYWNrQ29uZmlnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBDb3VsZCBub3QgZmluZCB3ZWJwYWNrLmNvbmZpZy5qc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnQnVpbGQgZmFpbGVkLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrT3B0aW9uczogc3RyaW5nW10gPSBbXG4gICAgJy0tY29sb3InLFxuICAgICctLXByb2dyZXNzJyxcbiAgICAnLS1jb25maWcnLCB3ZWJwYWNrQ29uZmlnXG4gIF07XG5cbiAgaWYoYW5hbHl6ZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1hbmFseXplJyk7XG4gIGlmKGNvbmZpZ05hbWUpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tY29uZmlnTmFtZScsIGNvbmZpZ05hbWUpO1xuICBpZihkZWZpbmVQcm9jZXNzRW52Tm9kZUVudikgd2VicGFja09wdGlvbnMucHVzaCgnLS1kZWZpbmVQcm9jZXNzRW52Tm9kZUVudicsIGRlZmluZVByb2Nlc3NFbnZOb2RlRW52KTtcbiAgaWYoZGV2dG9vbCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1kZXZ0b29sJywgZGV2dG9vbCk7XG4gIGlmKGRpc2FibGVJbnRlcnByZXQpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tZGlzYWJsZUludGVycHJldCcpO1xuICBpZihlbnRyeVZhbHVlKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWVudHJ5JywgZW50cnlWYWx1ZS50b1N0cmluZygpKTtcbiAgaWYoZW52KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWVudicsIGVudik7XG4gIGlmKGZhaWxPbldhcm5pbmdzKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLWZhaWxPbldhcm5pbmdzJyk7XG4gIGlmKGpzb24pIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tanNvbicsIGpzb24pO1xuICBpZihtb2RlKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW1vZGUnLCBtb2RlKTtcbiAgaWYobWVyZ2UpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbWVyZ2UnKTtcbiAgaWYobmFtZSkgd2VicGFja09wdGlvbnMucHVzaCgnLS1uYW1lJywgbmFtZSk7XG4gIGlmKG5vRGV2dG9vbCkgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub0RldnRvb2wnKTtcbiAgaWYobm9TdGF0cykgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub1N0YXRzJyk7XG4gIGlmKG5vVGFyZ2V0KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vVGFyZ2V0Jyk7XG4gIGlmKG5vV2F0Y2gpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tbm9XYXRjaCcpO1xuICBpZihub1dhdGNoT3B0aW9uc1N0ZGluKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLW5vV2F0Y2hPcHRpb25zU3RkaW4nKTtcbiAgaWYobm9kZUVudikgd2VicGFja09wdGlvbnMucHVzaCgnLS1ub2RlRW52Jywgbm9kZUVudik7XG4gIGlmKG91dHB1dFBhdGgpIHdlYnBhY2tPcHRpb25zLnB1c2goJy0tb3V0cHV0LXBhdGgnLCBvdXRwdXRQYXRoLnRvU3RyaW5nKCkpOyAvLyBDb252ZXJ0IHRvIHN0cmluZ1xuICBpZihzdGF0cykgd2VicGFja09wdGlvbnMucHVzaCgnLS1zdGF0cycsIHN0YXRzKTtcbiAgaWYodGFyZ2V0KSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXRhcmdldCcsIHRhcmdldCk7XG4gIGlmKHdhdGNoKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXdhdGNoJyk7XG4gIGlmKHdhdGNoT3B0aW9uc1N0ZGluKSB3ZWJwYWNrT3B0aW9ucy5wdXNoKCctLXdhdGNoT3B0aW9uc1N0ZGluJyk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCB7d2VicGFja1BhdGh9ID0gcmVzb2x2ZVdlYnBhY2tQYXRocyhjdXJyZW50RGlybmFtZSk7XG5cbiAgICBsZXQgZXhlY3V0YWJsZVBhdGggPSB3ZWJwYWNrUGF0aDtcbiAgICBsZXQgZmluYWxXZWJwYWNrT3B0aW9uczogc3RyaW5nW107XG5cbiAgICBpZih3ZWJwYWNrUGF0aCA9PT0gJ25weCcpIHtcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbJ3dlYnBhY2snLCAuLi53ZWJwYWNrT3B0aW9uc107XG4gICAgfSBlbHNlIGlmKHdlYnBhY2tQYXRoLmVuZHNXaXRoKCcuanMnKSkge1xuICAgICAgZXhlY3V0YWJsZVBhdGggPSAnbm9kZSc7XG4gICAgICBmaW5hbFdlYnBhY2tPcHRpb25zID0gW3dlYnBhY2tQYXRoLCAuLi53ZWJwYWNrT3B0aW9uc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFsV2VicGFja09wdGlvbnMgPSBbLi4ud2VicGFja09wdGlvbnNdO1xuICAgIH1cblxuICAgIGNvbnN0IGNoaWxkUHJvY2VzcyA9IGV4ZWNhKGV4ZWN1dGFibGVQYXRoLCBmaW5hbFdlYnBhY2tPcHRpb25zLCB7ZW5jb2Rpbmc6ICd1dGY4Jywgc3RkaW86ICdwaXBlJ30pO1xuXG4gICAgbGV0IGJ1aWxkQ29tcGxldGVkID0gZmFsc2U7XG4gICAgbGV0IGJ1aWxkU3RhdHMgPSB7XG4gICAgICBtb2R1bGVzOiAwLFxuICAgICAgYXNzZXRzOiAwLFxuICAgICAgc2l6ZTogJzAgQidcbiAgICB9O1xuXG4gICAgY2hpbGRQcm9jZXNzLnN0ZG91dD8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICAgIGhhbmRsZVdlYnBhY2tQcm9ncmVzcyhvdXRwdXQsIHNwaW5uZXIsIHF1aWV0LCAn8J+Pl++4jycsICdXZWJwYWNrIEJ1aWxkaW5nJyk7XG5cbiAgICAgIGlmKCFidWlsZENvbXBsZXRlZCAmJiBvdXRwdXQuaW5jbHVkZXMoJ2NvbXBpbGVkIHN1Y2Nlc3NmdWxseScpKSB7XG4gICAgICAgIGJ1aWxkQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC8oXFxkKykgbW9kdWxlcy8pO1xuICAgICAgICBjb25zdCBhc3NldE1hdGNoID0gb3V0cHV0Lm1hdGNoKC8oXFxkKykgYXNzZXRzLyk7XG4gICAgICAgIGNvbnN0IHNpemVNYXRjaCA9IG91dHB1dC5tYXRjaCgvYXNzZXRzIGJ5IHN0YXR1cyAoW1xcZC5dKyBcXHcrKS8pIHx8IG91dHB1dC5tYXRjaCgvYXNzZXRzIGJ5IHBhdGguKj8oW1xcZC5dKyBcXHcrKS8pO1xuXG4gICAgICAgIGlmKG1vZHVsZU1hdGNoKSBidWlsZFN0YXRzLm1vZHVsZXMgPSBwYXJzZUludChtb2R1bGVNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihhc3NldE1hdGNoKSBidWlsZFN0YXRzLmFzc2V0cyA9IHBhcnNlSW50KGFzc2V0TWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgaWYoc2l6ZU1hdGNoKSBidWlsZFN0YXRzLnNpemUgPSBzaXplTWF0Y2hbMV07XG5cbiAgICAgICAgZGlzcGxheUJ1aWxkU3RhdHVzKCd3ZWJwYWNrJywgTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJywgcXVpZXQsIGJ1aWxkU3RhdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY2hpbGRQcm9jZXNzLnN0ZGVycj8ub24oJ2RhdGEnLCAoZGF0YTogQnVmZmVyKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBkYXRhLnRvU3RyaW5nKCk7XG5cbiAgICAgIGhhbmRsZVdlYnBhY2tQcm9ncmVzcyhvdXRwdXQsIHNwaW5uZXIsIHF1aWV0LCAn8J+Pl++4jycsICdXZWJwYWNrIEJ1aWxkaW5nJyk7XG5cbiAgICAgIGlmKCFidWlsZENvbXBsZXRlZCAmJiBvdXRwdXQuaW5jbHVkZXMoJ2NvbXBpbGVkIHN1Y2Nlc3NmdWxseScpKSB7XG4gICAgICAgIGJ1aWxkQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScpO1xuXG4gICAgICAgIGNvbnN0IG1vZHVsZU1hdGNoID0gb3V0cHV0Lm1hdGNoKC8oXFxkKykgbW9kdWxlcy8pO1xuICAgICAgICBjb25zdCBhc3NldE1hdGNoID0gb3V0cHV0Lm1hdGNoKC8oXFxkKykgYXNzZXRzLyk7XG4gICAgICAgIGNvbnN0IHNpemVNYXRjaCA9IG91dHB1dC5tYXRjaCgvYXNzZXRzIGJ5IHN0YXR1cyAoW1xcZC5dKyBcXHcrKS8pIHx8IG91dHB1dC5tYXRjaCgvYXNzZXRzIGJ5IHBhdGguKj8oW1xcZC5dKyBcXHcrKS8pO1xuXG4gICAgICAgIGlmKG1vZHVsZU1hdGNoKSBidWlsZFN0YXRzLm1vZHVsZXMgPSBwYXJzZUludChtb2R1bGVNYXRjaFsxXSwgMTApO1xuICAgICAgICBpZihhc3NldE1hdGNoKSBidWlsZFN0YXRzLmFzc2V0cyA9IHBhcnNlSW50KGFzc2V0TWF0Y2hbMV0sIDEwKTtcbiAgICAgICAgaWYoc2l6ZU1hdGNoKSBidWlsZFN0YXRzLnNpemUgPSBzaXplTWF0Y2hbMV07XG5cbiAgICAgICAgZGlzcGxheUJ1aWxkU3RhdHVzKCd3ZWJwYWNrJywgTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJywgcXVpZXQsIGJ1aWxkU3RhdHMpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYXdhaXQgY2hpbGRQcm9jZXNzO1xuXG4gICAgaWYoIWJ1aWxkQ29tcGxldGVkKSB7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ3dlYnBhY2snLCBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoIHx8ICdsaWInLCBxdWlldCwgYnVpbGRTdGF0cyk7XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFdlYnBhY2sgYnVpbGQgZmFpbGVkYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZyhgXFxuRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICBpZihlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZihlcnJvci5zdGFjaykge1xuICAgICAgICBsb2coYFxcblN0YWNrIFRyYWNlOlxcbiR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxvZyhgXFxuV2VicGFjayBPcHRpb25zOiAke3dlYnBhY2tPcHRpb25zLnNsaWNlKDAsIDUpLmpvaW4oJyAnKX0uLi5gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICBzcGlubmVyLmZhaWwoJ0J1aWxkIGZhaWxlZC4nKTtcblxuICAgIGlmKGNtZC5hc3Npc3QpIHtcbiAgICAgIHNwaW5uZXIuc3RhcnQoJ0FJIGlzIGFuYWx5emluZyB0aGUgd2VicGFjayBlcnJvci4uLicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgICBwcm9tcHQ6IGBGaXggdGhpcyB3ZWJwYWNrIGJ1aWxkIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9XFxuXFxuRXJyb3IgZGV0YWlsczpcXG4ke2Vycm9yLnRvU3RyaW5nKCl9XFxuXFxuQ29uZmlndXJhdGlvbiB1c2VkOlxcbiR7SlNPTi5zdHJpbmdpZnkod2VicGFja09wdGlvbnMsIG51bGwsIDIpfWAsXG4gICAgICAgICAgdGFzazogJ2hlbHAnLFxuICAgICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgICAgcXVpZXRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBhbmFseXNpcyBjb21wbGV0ZScpO1xuICAgICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnQ291bGQgbm90IGdlbmVyYXRlIEFJIGFzc2lzdGFuY2UnKTtcbiAgICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgYXNzaXN0YW5jZSBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmKCFxdWlldCkge1xuICAgICAgY29uc29sZS5lcnJvcignXFxuRnVsbCBFcnJvciBEZXRhaWxzOicsIGVycm9yKTtcbiAgICB9XG5cbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGJ1aWxkID0gYXN5bmMgKGNtZDogQnVpbGRPcHRpb25zLCBjYWxsYmFjazogQnVpbGRDYWxsYmFjayA9ICgpID0+ICh7fSkpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7XG4gICAgYnVuZGxlciA9ICd3ZWJwYWNrJyxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdHJhbnNsYXRpb25zID0gZmFsc2UsXG4gICAgdmFyaWFibGVzID0gJ3t9J1xuICB9ID0gY21kO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBsb2coYCR7Y2xpTmFtZX0gYnVpbGRpbmcuLi5gLCAnaW5mbycsIHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcoY21kKTtcblxuICBjb25zdCB7b3V0cHV0RnVsbFBhdGgsIHVzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBjaGVja0xpbmtlZE1vZHVsZXMoKTtcblxuICBsZXQgdmFyaWFibGVzT2JqOiBvYmplY3QgPSB7Tk9ERV9FTlY6ICdwcm9kdWN0aW9uJ307XG5cbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhcmlhYmxlc09iaiA9IEpTT04ucGFyc2UodmFyaWFibGVzKTtcbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEVudmlyb25tZW50IHZhcmlhYmxlcyBvcHRpb24gaXMgbm90IGEgdmFsaWQgSlNPTiBvYmplY3QuYCwgJ2Vycm9yJywgcXVpZXQpO1xuXG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIHByb2Nlc3MuZW52ID0gey4uLnByb2Nlc3MuZW52LCAuLi52YXJpYWJsZXNPYmp9O1xuXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogQnVpbGQgZW52aXJvbm1lbnQgbG9hZGVkLCBleGl0aW5nJywgJ2luZm8nLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMCk7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBpZih0cmFuc2xhdGlvbnMpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdQcm9jZXNzaW5nIHRyYW5zbGF0aW9ucy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNvdXJjZVBhdGggPSBMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRoIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCAnbGliJztcblxuICAgICAgYXdhaXQgcHJvY2Vzc1RyYW5zbGF0aW9ucyhzb3VyY2VQYXRoLCBvdXRwdXRQYXRoLCBxdWlldCk7XG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ1RyYW5zbGF0aW9ucyBwcm9jZXNzZWQgc3VjY2Vzc2Z1bGx5IScpO1xuICAgIH0gY2F0Y2godHJhbnNsYXRpb25FcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gcHJvY2VzcyB0cmFuc2xhdGlvbnM6ICR7dHJhbnNsYXRpb25FcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zLicpO1xuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBzcGlubmVyLnN0YXJ0KCdCdWlsZGluZyBjb2RlLi4uJyk7XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgYXdhaXQgcmVtb3ZlRmlsZXMob3V0cHV0RnVsbFBhdGggfHwgJycpO1xuICB9XG5cbiAgbGV0IGJ1aWxkUmVzdWx0ID0gMDtcblxuICBpZihidW5kbGVyID09PSAnc3djJykge1xuICAgIGJ1aWxkUmVzdWx0ID0gYXdhaXQgYnVpbGRXaXRoU1dDKHNwaW5uZXIsIGNtZCwgKHN0YXR1cykgPT4ge1xuICAgICAgYnVpbGRSZXN1bHQgPSBzdGF0dXM7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgYnVpbGRSZXN1bHQgPSBhd2FpdCBidWlsZFdpdGhXZWJwYWNrKHNwaW5uZXIsIGNtZCwgKHN0YXR1czogbnVtYmVyKSA9PiB7XG4gICAgICBidWlsZFJlc3VsdCA9IHN0YXR1cztcbiAgICB9KTtcbiAgfVxuXG4gIGlmKGJ1aWxkUmVzdWx0ID09PSAwICYmIGNtZC5hbmFseXplKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRoZSBidWlsZCBvdXRwdXQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RhdHMgPSB7XG4gICAgICAgIG91dHB1dFBhdGg6IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGgsXG4gICAgICAgIGVudHJ5UG9pbnRzOiBidW5kbGVyID09PSAnc3djJyA/XG4gICAgICAgICAgYFNvdXJjZSBmaWxlczogJHtMZXhDb25maWcuY29uZmlnLnNvdXJjZUZ1bGxQYXRofS8qKi8qLnt0cyxqc31gIDpcbiAgICAgICAgICBMZXhDb25maWcuY29uZmlnLndlYnBhY2s/LmVudHJ5IHx8ICdVbmtub3duIGVudHJ5IHBvaW50cydcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICBwcm9tcHQ6IGBBbmFseXplIHRoaXMgYnVpbGQgZm9yIG9wdGltaXphdGlvbiBvcHBvcnR1bml0aWVzOlxuXG5CdWlsZCBUeXBlOiAke2J1bmRsZXJ9XG5Gb3JtYXQ6ICR7Y21kLmZvcm1hdCB8fCAnZGVmYXVsdCd9XG5FbnZpcm9ubWVudDogJHtMZXhDb25maWcuY29uZmlnLnRhcmdldEVudmlyb25tZW50fVxuJHtKU09OLnN0cmluZ2lmeShzdGF0cywgbnVsbCwgMil9XG5cbldoYXQgYXJlIHRoZSBrZXkgb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXMgZm9yIHRoaXMgYnVpbGQgY29uZmlndXJhdGlvbj8gQ29uc2lkZXI6XG4xLiBCdW5kbGUgc2l6ZSBvcHRpbWl6YXRpb24gc3RyYXRlZ2llc1xuMi4gQ29kZSBzcGxpdHRpbmcgcmVjb21tZW5kYXRpb25zXG4zLiBUcmVlLXNoYWtpbmcgaW1wcm92ZW1lbnRzXG40LiBQZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbjUuIERlcGVuZGVuY3kgb3B0aW1pemF0aW9uc2AsXG4gICAgICAgIHRhc2s6ICdvcHRpbWl6ZScsXG4gICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgIHF1aWV0XG4gICAgICB9KTtcblxuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBidWlsZCBhbmFseXNpcyBjb21wbGV0ZScpO1xuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgb3B0aW1pemF0aW9uIGFuYWx5c2lzJyk7XG4gICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYoYnVpbGRSZXN1bHQgPT09IDApIHtcbiAgICB0cnkge1xuICAgICAgaWYodXNlVHlwZXNjcmlwdCAmJiBidW5kbGVyID09PSAnc3djJykge1xuICAgICAgICBjb25zdCB0eXBlc2NyaXB0UGF0aCA9IHJlc29sdmVCaW5hcnlQYXRoKCd0c2MnLCAndHlwZXNjcmlwdCcpO1xuXG4gICAgICAgIGlmKHR5cGVzY3JpcHRQYXRoKSB7XG4gICAgICAgICAgc3Bpbm5lci5zdGFydCgnR2VuZXJhdGluZyBUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucy4uLicpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcuc291cmNlRnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vc3JjJyk7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXRGdWxsUGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vbGliJyk7XG4gICAgICAgICAgICBjb25zdCBnbG9iT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgY3dkOiBzb3VyY2VGdWxsUGF0aCxcbiAgICAgICAgICAgICAgZG90OiBmYWxzZSxcbiAgICAgICAgICAgICAgbm9kaXI6IHRydWUsXG4gICAgICAgICAgICAgIGFic29sdXRlOiB0cnVlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgdHNGaWxlcyA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3R8Ki5pbnRlZ3JhdGlvbnwqLmUyZSkudHNgLCBnbG9iT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCB0c3hGaWxlcyA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3R8Ki5pbnRlZ3JhdGlvbnwqLmUyZSkudHN4YCwgZ2xvYk9wdGlvbnMpO1xuICAgICAgICAgICAgY29uc3QgYWxsU291cmNlRmlsZXMgPSBbLi4udHNGaWxlcywgLi4udHN4RmlsZXNdO1xuICAgICAgICAgICAgY29uc3QgdHlwZXNjcmlwdE9wdGlvbnMgPSBbXG4gICAgICAgICAgICAgIC4uLkxleENvbmZpZy5nZXRUeXBlU2NyaXB0RGVjbGFyYXRpb25GbGFncygpLFxuICAgICAgICAgICAgICAuLi5hbGxTb3VyY2VGaWxlc1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWNhKHR5cGVzY3JpcHRQYXRoLCB0eXBlc2NyaXB0T3B0aW9ucywge1xuICAgICAgICAgICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgICAgICAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgIHJlamVjdDogZmFsc2UsXG4gICAgICAgICAgICAgIGFsbDogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICBjb25zdCBoYXNEZWNsYXJhdGlvbnMgPSByZXN1bHQuYWxsPy5pbmNsdWRlcygnV3JpdGluZycpIHx8IHJlc3VsdC5hbGw/LmluY2x1ZGVzKCdEZWNsYXJhdGlvbicpIHx8IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zdCBlcnJvck91dHB1dCA9IHJlc3VsdC5zdGRlcnIgfHwgcmVzdWx0LnN0ZG91dCB8fCByZXN1bHQuYWxsIHx8ICdVbmtub3duIGVycm9yJztcblxuICAgICAgICAgICAgICBpZighaGFzRGVjbGFyYXRpb25zKSB7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gZmFpbGVkYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgIGxvZyhgXFxuRXhpdCBDb2RlOiAke3Jlc3VsdC5leGl0Q29kZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5UeXBlU2NyaXB0IENvbW1hbmQ6ICR7dHlwZXNjcmlwdFBhdGh9ICR7dHlwZXNjcmlwdE9wdGlvbnMuc2xpY2UoMCwgMTApLmpvaW4oJyAnKX0uLi5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5FcnJvciBPdXRwdXQ6XFxuJHtlcnJvck91dHB1dH1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvckxpbmVzID0gZXJyb3JPdXRwdXQuc3BsaXQoJ1xcbicpLmZpbHRlcihsaW5lID0+XG4gICAgICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCdlcnJvciBUUycpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLmluY2x1ZGVzKCdFcnJvcjonKSB8fFxuICAgICAgICAgICAgICAgICAgbGluZS50cmltKCkuc3RhcnRzV2l0aCgnc3JjLycpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdUUycpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmKGVycm9yTGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgbG9nKGBcXG5LZXkgRXJyb3JzOmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICAgIGVycm9yTGluZXMuc2xpY2UoMCwgMTApLmZvckVhY2gobGluZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgICAke2xpbmV9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICBpZihlcnJvckxpbmVzLmxlbmd0aCA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZyhgICAuLi4gYW5kICR7ZXJyb3JMaW5lcy5sZW5ndGggLSAxMH0gbW9yZSBlcnJvcnNgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3Bpbm5lci5mYWlsKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gaGFkIGVycm9ycyAoY29udGludWluZyBhbnl3YXkpLicpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBXYXJuaW5nOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gY29tcGxldGVkIHdpdGggZXJyb3JzYCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgaWYoIXF1aWV0ICYmIGVycm9yT3V0cHV0KSB7XG4gICAgICAgICAgICAgICAgICBsb2coYFxcbldhcm5pbmdzOlxcbiR7ZXJyb3JPdXRwdXR9YCwgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnVHlwZVNjcmlwdCBkZWNsYXJhdGlvbnMgZ2VuZXJhdGVkICh3aXRoIHdhcm5pbmdzKS4nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQhJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gZXhjZXB0aW9uYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgbG9nKGBcXG5FcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIGlmKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3Iuc3RhY2spIHtcbiAgICAgICAgICAgICAgbG9nKGBcXG5TdGFjazpcXG4ke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNwaW5uZXIuZmFpbCgnVHlwZVNjcmlwdCBkZWNsYXJhdGlvbiBnZW5lcmF0aW9uIGhhZCBpc3N1ZXMgKGNvbnRpbnVpbmcgYW55d2F5KS4nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXdhaXQgY29weUNvbmZpZ3VyZWRGaWxlcyhzcGlubmVyLCBMZXhDb25maWcuY29uZmlnLCBxdWlldCk7XG4gICAgfSBjYXRjaChjb3B5RXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIGNvcHkgY29uZmlndXJlZCBmaWxlczogJHtjb3B5RXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgfVxuXG4gIGNhbGxiYWNrKGJ1aWxkUmVzdWx0KTtcbiAgcmV0dXJuIGJ1aWxkUmVzdWx0O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgYnVpbGQ7XG4iXSwibmFtZXMiOlsidHJhbnNmb3JtIiwiZXhlY2EiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwiZGlybmFtZSIsInJlbGF0aXZlIiwicGF0aFJlbGF0aXZlIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiTGV4Q29uZmlnIiwiY2hlY2tMaW5rZWRNb2R1bGVzIiwiY29weUNvbmZpZ3VyZWRGaWxlcyIsImNyZWF0ZVNwaW5uZXIiLCJoYW5kbGVXZWJwYWNrUHJvZ3Jlc3MiLCJyZW1vdmVGaWxlcyIsInJlc29sdmVXZWJwYWNrUGF0aHMiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJyZXNvbHZlQmluYXJ5UGF0aCIsImxvZyIsInByb2Nlc3NUcmFuc2xhdGlvbnMiLCJhaUZ1bmN0aW9uIiwiYm94ZW4iLCJjaGFsayIsImN1cnJlbnRGaWxlbmFtZSIsImN1cnJlbnREaXJuYW1lIiwiZXZhbCIsInByb2Nlc3MiLCJjd2QiLCJkaXNwbGF5QnVpbGRTdGF0dXMiLCJidW5kbGVyIiwib3V0cHV0UGF0aCIsInF1aWV0Iiwic3RhdHMiLCJzdGF0c0luZm8iLCJtb2R1bGVzIiwiYXNzZXRzIiwiZ3JlZW4iLCJjeWFuIiwic2l6ZSIsInN0YXR1c0JveCIsImJvbGQiLCJ1bmRlcmxpbmUiLCJ5ZWxsb3ciLCJwYWRkaW5nIiwibWFyZ2luIiwiYm9yZGVyU3R5bGUiLCJib3JkZXJDb2xvciIsImJhY2tncm91bmRDb2xvciIsImNvbnNvbGUiLCJidWlsZFdpdGhTV0MiLCJzcGlubmVyIiwiY29tbWFuZE9wdGlvbnMiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJmb3JtYXQiLCJzb3VyY2VQYXRoIiwid2F0Y2giLCJvdXRwdXRGdWxsUGF0aCIsInNvdXJjZUZ1bGxQYXRoIiwic3djIiwic3djQ29uZmlnIiwidGFyZ2V0RW52aXJvbm1lbnQiLCJ1c2VHcmFwaFFsIiwidXNlVHlwZXNjcmlwdCIsImNvbmZpZyIsInNvdXJjZURpciIsImdsb2JPcHRpb25zIiwiYWJzb2x1dGUiLCJkb3QiLCJub2RpciIsIm5vc29ydCIsInRzRmlsZXMiLCJqc0ZpbGVzIiwic291cmNlRmlsZXMiLCJvdXRwdXREaXIiLCJzdGFydCIsInRyYW5zZm9ybVByb21pc2VzIiwibWFwIiwiZmlsZSIsImZpbGVSZWxhdGl2ZVRvU291cmNlIiwib3V0cHV0RmlsZSIsInJlcGxhY2UiLCJvdXRwdXREaXJQYXRoIiwibWtkaXJTeW5jIiwicmVjdXJzaXZlIiwic291cmNlQ29kZSIsInN3Y09wdGlvbnMiLCJmaWxlbmFtZSIsIm1vZHVsZSIsInR5cGUiLCJyZXN1bHQiLCJ3cml0ZUZpbGVTeW5jIiwiY29kZSIsIlByb21pc2UiLCJhbGwiLCJzdWNjZWVkIiwiZXJyb3IiLCJtZXNzYWdlIiwiRXJyb3IiLCJzdGFjayIsImZhaWwiLCJidWlsZFdpdGhXZWJwYWNrIiwiY21kIiwiYW5hbHl6ZSIsImNvbmZpZ05hbWUiLCJkZWZpbmVQcm9jZXNzRW52Tm9kZUVudiIsImRldnRvb2wiLCJkaXNhYmxlSW50ZXJwcmV0IiwiZW50cnkiLCJlbnYiLCJmYWlsT25XYXJuaW5ncyIsImpzb24iLCJtZXJnZSIsIm1vZGUiLCJuYW1lIiwibm9kZUVudiIsIm5vRGV2dG9vbCIsIm5vU3RhdHMiLCJub1RhcmdldCIsIm5vV2F0Y2giLCJub1dhdGNoT3B0aW9uc1N0ZGluIiwidGFyZ2V0Iiwid2F0Y2hPcHRpb25zU3RkaW4iLCJlbnRyeVZhbHVlIiwiQXJyYXkiLCJpc0FycmF5Iiwid2VicGFja0NvbmZpZyIsImlzUmVsYXRpdmVDb25maWciLCJzdWJzdHIiLCJwcm9qZWN0Q29uZmlnUGF0aCIsInByb2plY3RDb25maWdQYXRoVHMiLCJoYXNQcm9qZWN0Q29uZmlnIiwicmVzb2x2ZWRDb25maWciLCJsZXhQYWNrYWdlUGF0aCIsImxleFBhY2thZ2VEaXIiLCJsZXhXZWJwYWNrQ29uZmlnIiwid2VicGFja09wdGlvbnMiLCJwdXNoIiwidG9TdHJpbmciLCJ3ZWJwYWNrUGF0aCIsImV4ZWN1dGFibGVQYXRoIiwiZmluYWxXZWJwYWNrT3B0aW9ucyIsImVuZHNXaXRoIiwiY2hpbGRQcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImJ1aWxkQ29tcGxldGVkIiwiYnVpbGRTdGF0cyIsInN0ZG91dCIsIm9uIiwiZGF0YSIsIm91dHB1dCIsImluY2x1ZGVzIiwibW9kdWxlTWF0Y2giLCJtYXRjaCIsImFzc2V0TWF0Y2giLCJzaXplTWF0Y2giLCJwYXJzZUludCIsInN0ZGVyciIsInNsaWNlIiwiam9pbiIsImFzc2lzdCIsInByb21wdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0YXNrIiwiY29udGV4dCIsImFpRXJyb3IiLCJidWlsZCIsInJlbW92ZSIsInRlc3QiLCJ0cmFuc2xhdGlvbnMiLCJ2YXJpYWJsZXMiLCJwYXJzZUNvbmZpZyIsInZhcmlhYmxlc09iaiIsIk5PREVfRU5WIiwicGFyc2UiLCJ0cmFuc2xhdGlvbkVycm9yIiwiYnVpbGRSZXN1bHQiLCJzdGF0dXMiLCJlbnRyeVBvaW50cyIsIndlYnBhY2siLCJ0eXBlc2NyaXB0UGF0aCIsInRzeEZpbGVzIiwiYWxsU291cmNlRmlsZXMiLCJ0eXBlc2NyaXB0T3B0aW9ucyIsImdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzIiwicmVqZWN0IiwiZXhpdENvZGUiLCJoYXNEZWNsYXJhdGlvbnMiLCJlcnJvck91dHB1dCIsImVycm9yTGluZXMiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsImxlbmd0aCIsImZvckVhY2giLCJjb3B5RXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsUUFBTyxZQUFZO0FBQ3BDLFNBQVFDLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FDRUMsT0FBTyxFQUNQQyxZQUFZQyxZQUFZLEVBQ3hCQyxXQUFXQyxXQUFXLFFBQ2pCLE9BQU87QUFFZCxTQUFRQyxTQUFTLFFBQU8scUJBQXFCO0FBQzdDLFNBQVFDLGtCQUFrQixFQUFFQyxtQkFBbUIsRUFBRUMsYUFBYSxFQUFxQkMscUJBQXFCLEVBQUVDLFdBQVcsUUFBTyxxQkFBcUI7QUFDakosU0FDRUMsbUJBQW1CLEVBQ25CQyxxQkFBcUIsRUFDckJDLGlCQUFpQixRQUNaLHNCQUFzQjtBQUM3QixTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBQ3ZDLFNBQVFDLG1CQUFtQixRQUFPLDhCQUE4QjtBQUNoRSxTQUFRQyxVQUFVLFFBQU8sY0FBYztBQUN2QyxPQUFPQyxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsV0FBVyxRQUFRO0FBSzFCLElBQUlDO0FBQ0osSUFBSUM7QUFFSixJQUFJO0lBQ0ZELGtCQUFrQkUsS0FBSztJQUN2QkQsaUJBQWlCcEIsUUFBUW1CO0FBQzNCLEVBQUUsT0FBTTtJQUNOQSxrQkFBa0JHLFFBQVFDLEdBQUc7SUFDN0JILGlCQUFpQkUsUUFBUUMsR0FBRztBQUM5QjtBQXFCQSxNQUFNQyxxQkFBcUIsQ0FBQ0MsU0FBaUJDLFlBQW9CQyxPQUFnQkM7SUFDL0UsSUFBR0QsT0FBTztJQUVWLElBQUlFLFlBQVk7SUFDaEIsSUFBR0QsU0FBU0EsTUFBTUUsT0FBTyxJQUFJRixNQUFNRyxNQUFNLEVBQUU7UUFDekNGLFlBQVksQ0FBQyxFQUFFLEVBQUVYLE1BQU1jLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRWQsTUFBTWUsSUFBSSxDQUFDTCxNQUFNRSxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQzFFLEdBQUdaLE1BQU1jLEtBQUssQ0FBQyxXQUFXLEtBQUssRUFBRWQsTUFBTWUsSUFBSSxDQUFDTCxNQUFNRyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQzdELEdBQUdiLE1BQU1jLEtBQUssQ0FBQyxTQUFTLE9BQU8sRUFBRWQsTUFBTWUsSUFBSSxDQUFDTCxNQUFNTSxJQUFJLEVBQUUsRUFBRSxDQUFDO0lBQy9EO0lBRUEsTUFBTUMsWUFBWWxCLE1BQ2hCLEdBQUdDLE1BQU1lLElBQUksQ0FBQ0csSUFBSSxDQUFDLHNDQUFzQyxJQUFJLENBQUMsR0FDOUQsR0FBR2xCLE1BQU1jLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRWQsTUFBTWUsSUFBSSxDQUFDUixTQUFTLEVBQUUsQ0FBQyxHQUN4RCxHQUFHUCxNQUFNYyxLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUVkLE1BQU1tQixTQUFTLENBQUNYLGNBQWNHLFVBQVUsRUFBRSxDQUFDLEdBQzVFLEdBQUdYLE1BQU1vQixNQUFNLENBQUMsNkJBQTZCLEVBQzdDO1FBQ0VDLFNBQVM7UUFDVEMsUUFBUTtRQUNSQyxhQUFhO1FBQ2JDLGFBQWE7UUFDYkMsaUJBQWlCO0lBQ25CO0lBR0ZDLFFBQVE5QixHQUFHLENBQUMsT0FBT3FCLFlBQVk7QUFDakM7QUFFQSxPQUFPLE1BQU1VLGVBQWUsT0FBT0MsU0FBa0JDLGdCQUE4QkM7SUFDakYsTUFBTSxFQUNKQyxVQUFVLEtBQUssRUFDZkMsU0FBUyxLQUFLLEVBQ2R4QixVQUFVLEVBQ1ZDLEtBQUssRUFDTHdCLFVBQVUsRUFDVkMsS0FBSyxFQUNOLEdBQUdMO0lBQ0osTUFBTSxFQUNKTSxjQUFjLEVBQ2RDLGNBQWMsRUFDZEMsS0FBS0MsU0FBUyxFQUNkQyxpQkFBaUIsRUFDakJDLFVBQVUsRUFDVkMsYUFBYSxFQUNkLEdBQUd0RCxVQUFVdUQsTUFBTTtJQUNwQixNQUFNQyxZQUFvQlYsYUFBYS9DLFlBQVlrQixRQUFRQyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUU0QixZQUFZLElBQUlHLGtCQUFrQjtJQUV6RyxNQUFNUSxjQUFjO1FBQ2xCQyxVQUFVO1FBQ1Z4QyxLQUFLc0M7UUFDTEcsS0FBSztRQUNMQyxPQUFPO1FBQ1BDLFFBQVE7SUFDVjtJQUNBLE1BQU1DLFVBQW9CcEUsU0FBUyxDQUFDLHVCQUF1QixDQUFDLEVBQUUrRDtJQUM5RCxNQUFNTSxVQUFvQnJFLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFK0Q7SUFDN0QsTUFBTU8sY0FBd0I7V0FBSUY7V0FBWUM7S0FBUTtJQUV0RCxNQUFNRSxZQUFvQjVDLGFBQ3RCdEIsWUFBWWtCLFFBQVFDLEdBQUcsSUFBSUcsY0FDMUIyQixrQkFBa0JqRCxZQUFZa0IsUUFBUUMsR0FBRyxJQUFJO0lBRWxELElBQUk7UUFDRnVCLFFBQVF5QixLQUFLLENBQUM7UUFFZCxNQUFNQyxvQkFBb0JILFlBQVlJLEdBQUcsQ0FBQyxPQUFPQztZQUMvQyxNQUFNQyx1QkFBdUJ6RSxhQUFhMkQsV0FBV2E7WUFDckQsTUFBTXZCLGFBQWF1QixNQUFNLDJCQUEyQjtZQUNwRCxNQUFNRSxhQUFhRCxxQkFBcUJFLE9BQU8sQ0FBQyxlQUFlO1lBQy9ELE1BQU1uRCxhQUFhdEIsWUFBWWtFLFdBQVdNO1lBQzFDLE1BQU1FLGdCQUFnQjlFLFFBQVEwQjtZQUU5QixJQUFHLENBQUM5QixXQUFXa0YsZ0JBQWdCO2dCQUM3QixNQUFNLEVBQUNDLFNBQVMsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDO2dCQUNqQ0EsVUFBVUQsZUFBZTtvQkFBQ0UsV0FBVztnQkFBSTtZQUMzQztZQUVBLE1BQU1DLGFBQWFwRixhQUFhc0QsWUFBWTtZQUM1QyxNQUFNK0IsYUFBYTtnQkFDakIsR0FBRzFCLFNBQVM7Z0JBQ1oyQixVQUFVVDtnQkFDVlUsUUFBUTtvQkFDTkMsTUFBTW5DLFdBQVcsUUFBUSxhQUF1Qk0sV0FBVzRCLFFBQVFDLFFBQWlCO29CQUNwRixHQUFHN0IsV0FBVzRCLE1BQU07Z0JBQ3RCO1lBQ0Y7WUFFQSxNQUFNRSxTQUFTLE1BQU01RixVQUFVdUYsWUFBWUM7WUFFM0MsTUFBTSxFQUFDSyxhQUFhLEVBQUMsR0FBRyxNQUFNLE1BQU0sQ0FBQztZQUNyQ0EsY0FBYzdELFlBQVk0RCxPQUFPRSxJQUFJO1FBQ3ZDO1FBRUEsTUFBTUMsUUFBUUMsR0FBRyxDQUFDbEI7UUFFbEIxQixRQUFRNkMsT0FBTyxDQUFDO1FBQ2hCbkUsbUJBQW1CLE9BQU84QyxXQUFXM0MsU0FBUztRQUM5Q3FCLFNBQVM7UUFDVCxPQUFPO0lBQ1QsRUFBRSxPQUFNNEMsT0FBTztRQUNiOUUsSUFBSSxDQUFDLEVBQUUsRUFBRWlDLGVBQWVFLE9BQU8sSUFBSSxNQUFNLHdCQUF3QixDQUFDLEVBQUUsU0FBU3RCO1FBQzdFYixJQUFJLENBQUMsU0FBUyxFQUFFOEUsTUFBTUMsT0FBTyxFQUFFLEVBQUUsU0FBU2xFO1FBRTFDLElBQUdpRSxpQkFBaUJFLE9BQU87WUFDekIsSUFBR0YsTUFBTUcsS0FBSyxFQUFFO2dCQUNkakYsSUFBSSxDQUFDLGdCQUFnQixFQUFFOEUsTUFBTUcsS0FBSyxFQUFFLEVBQUUsU0FBU3BFO1lBQ2pEO1lBRUEsSUFBRyxjQUFjaUUsU0FBUyxVQUFVQSxPQUFPO2dCQUN6QzlFLElBQUksQ0FBQyxRQUFRLEVBQUUsQUFBQzhFLE1BQWNULFFBQVEsSUFBSSxBQUFDUyxNQUFjbEIsSUFBSSxFQUFFLEVBQUUsU0FBUy9DO1lBQzVFO1FBQ0Y7UUFFQW1CLFFBQVFrRCxJQUFJLENBQUM7UUFDYixJQUFHLENBQUNyRSxPQUFPO1lBQ1RpQixRQUFRZ0QsS0FBSyxDQUFDLHlCQUF5QkE7UUFDekM7UUFDQTVDLFNBQVM7UUFDVCxPQUFPO0lBQ1Q7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNaUQsbUJBQW1CLE9BQzlCbkQsU0FDQW9ELEtBQ0FsRDtJQUVBLE1BQU0sRUFDSm1ELE9BQU8sRUFDUGxELFVBQVUsS0FBSyxFQUNmVyxNQUFNLEVBQ053QyxVQUFVLEVBQ1ZDLHVCQUF1QixFQUN2QkMsT0FBTyxFQUNQQyxnQkFBZ0IsRUFDaEJDLEtBQUssRUFDTEMsR0FBRyxFQUNIQyxjQUFjLEVBQ2RDLElBQUksRUFDSkMsS0FBSyxFQUNMQyxJQUFJLEVBQ0pDLElBQUksRUFDSkMsT0FBTyxFQUNQQyxTQUFTLEVBQ1RDLE9BQU8sRUFDUEMsUUFBUSxFQUNSQyxPQUFPLEVBQ1BDLG1CQUFtQixFQUNuQjFGLFVBQVUsRUFDVkMsUUFBUSxLQUFLLEVBQ2JDLEtBQUssRUFDTHlGLE1BQU0sRUFDTmpFLEtBQUssRUFDTGtFLGlCQUFpQixFQUNsQixHQUFHcEI7SUFFSixNQUFNcUIsYUFBYUMsTUFBTUMsT0FBTyxDQUFDakIsU0FBU0EsS0FBSyxDQUFDLEVBQUUsR0FBR0E7SUFFckQsSUFBSWtCO0lBRUosSUFBRzlELFFBQVE7UUFDVCxNQUFNK0QsbUJBQTRCL0QsT0FBT2dFLE1BQU0sQ0FBQyxHQUFHLE9BQU87UUFDMURGLGdCQUFnQkMsbUJBQW1CdkgsWUFBWWtCLFFBQVFDLEdBQUcsSUFBSXFDLFVBQVVBO0lBQzFFLE9BQU87UUFDTCxNQUFNaUUsb0JBQW9CekgsWUFBWWtCLFFBQVFDLEdBQUcsSUFBSTtRQUNyRCxNQUFNdUcsc0JBQXNCMUgsWUFBWWtCLFFBQVFDLEdBQUcsSUFBSTtRQUN2RCxNQUFNd0csbUJBQW1CbkksV0FBV2lJLHNCQUFzQmpJLFdBQVdrSTtRQUVyRSxJQUFHQyxrQkFBa0I7WUFDbkJMLGdCQUFnQjlILFdBQVdrSSx1QkFBdUJBLHNCQUFzQkQ7UUFDMUUsT0FBTztZQUNMLE1BQU0sRUFBQ0gsZUFBZU0sY0FBYyxFQUFDLEdBQUdySCxvQkFBb0JTO1lBQzVEc0csZ0JBQWdCTTtRQUNsQjtJQUNGO0lBRUEsSUFBRyxDQUFDcEksV0FBVzhILGdCQUFnQjtRQUM3QixNQUFNTyxpQkFBaUJySDtRQUN2QixNQUFNc0gsZ0JBQWdCbEksUUFBUWlJO1FBQzlCLE1BQU1FLG1CQUFtQi9ILFlBQVk4SCxlQUFlO1FBRXBELElBQUd0SSxXQUFXdUksbUJBQW1CO1lBQy9CVCxnQkFBZ0JTO1lBQ2hCdkYsUUFBUTlCLEdBQUcsQ0FBQyw2QkFBNkI0RztRQUMzQyxPQUFPO1lBQ0w1RyxJQUFJLENBQUMsRUFBRSxFQUFFbUMsUUFBUSx3Q0FBd0MsQ0FBQyxFQUFFLFNBQVN0QjtZQUNyRW1CLFFBQVFrRCxJQUFJLENBQUM7WUFDYmhELFNBQVM7WUFDVCxPQUFPO1FBQ1Q7SUFDRjtJQUVBLE1BQU1vRixpQkFBMkI7UUFDL0I7UUFDQTtRQUNBO1FBQVlWO0tBQ2I7SUFFRCxJQUFHdkIsU0FBU2lDLGVBQWVDLElBQUksQ0FBQztJQUNoQyxJQUFHakMsWUFBWWdDLGVBQWVDLElBQUksQ0FBQyxnQkFBZ0JqQztJQUNuRCxJQUFHQyx5QkFBeUIrQixlQUFlQyxJQUFJLENBQUMsNkJBQTZCaEM7SUFDN0UsSUFBR0MsU0FBUzhCLGVBQWVDLElBQUksQ0FBQyxhQUFhL0I7SUFDN0MsSUFBR0Msa0JBQWtCNkIsZUFBZUMsSUFBSSxDQUFDO0lBQ3pDLElBQUdkLFlBQVlhLGVBQWVDLElBQUksQ0FBQyxXQUFXZCxXQUFXZSxRQUFRO0lBQ2pFLElBQUc3QixLQUFLMkIsZUFBZUMsSUFBSSxDQUFDLFNBQVM1QjtJQUNyQyxJQUFHQyxnQkFBZ0IwQixlQUFlQyxJQUFJLENBQUM7SUFDdkMsSUFBRzFCLE1BQU15QixlQUFlQyxJQUFJLENBQUMsVUFBVTFCO0lBQ3ZDLElBQUdFLE1BQU11QixlQUFlQyxJQUFJLENBQUMsVUFBVXhCO0lBQ3ZDLElBQUdELE9BQU93QixlQUFlQyxJQUFJLENBQUM7SUFDOUIsSUFBR3ZCLE1BQU1zQixlQUFlQyxJQUFJLENBQUMsVUFBVXZCO0lBQ3ZDLElBQUdFLFdBQVdvQixlQUFlQyxJQUFJLENBQUM7SUFDbEMsSUFBR3BCLFNBQVNtQixlQUFlQyxJQUFJLENBQUM7SUFDaEMsSUFBR25CLFVBQVVrQixlQUFlQyxJQUFJLENBQUM7SUFDakMsSUFBR2xCLFNBQVNpQixlQUFlQyxJQUFJLENBQUM7SUFDaEMsSUFBR2pCLHFCQUFxQmdCLGVBQWVDLElBQUksQ0FBQztJQUM1QyxJQUFHdEIsU0FBU3FCLGVBQWVDLElBQUksQ0FBQyxhQUFhdEI7SUFDN0MsSUFBR3JGLFlBQVkwRyxlQUFlQyxJQUFJLENBQUMsaUJBQWlCM0csV0FBVzRHLFFBQVEsS0FBSyxvQkFBb0I7SUFDaEcsSUFBRzFHLE9BQU93RyxlQUFlQyxJQUFJLENBQUMsV0FBV3pHO0lBQ3pDLElBQUd5RixRQUFRZSxlQUFlQyxJQUFJLENBQUMsWUFBWWhCO0lBQzNDLElBQUdqRSxPQUFPZ0YsZUFBZUMsSUFBSSxDQUFDO0lBQzlCLElBQUdmLG1CQUFtQmMsZUFBZUMsSUFBSSxDQUFDO0lBRTFDLElBQUk7UUFDRixNQUFNLEVBQUNFLFdBQVcsRUFBQyxHQUFHNUgsb0JBQW9CUztRQUUxQyxJQUFJb0gsaUJBQWlCRDtRQUNyQixJQUFJRTtRQUVKLElBQUdGLGdCQUFnQixPQUFPO1lBQ3hCRSxzQkFBc0I7Z0JBQUM7bUJBQWNMO2FBQWU7UUFDdEQsT0FBTyxJQUFHRyxZQUFZRyxRQUFRLENBQUMsUUFBUTtZQUNyQ0YsaUJBQWlCO1lBQ2pCQyxzQkFBc0I7Z0JBQUNGO21CQUFnQkg7YUFBZTtRQUN4RCxPQUFPO1lBQ0xLLHNCQUFzQjttQkFBSUw7YUFBZTtRQUMzQztRQUVBLE1BQU1PLGVBQWVoSixNQUFNNkksZ0JBQWdCQyxxQkFBcUI7WUFBQ0csVUFBVTtZQUFRQyxPQUFPO1FBQU07UUFFaEcsSUFBSUMsaUJBQWlCO1FBQ3JCLElBQUlDLGFBQWE7WUFDZmpILFNBQVM7WUFDVEMsUUFBUTtZQUNSRyxNQUFNO1FBQ1I7UUFFQXlHLGFBQWFLLE1BQU0sRUFBRUMsR0FBRyxRQUFRLENBQUNDO1lBQy9CLE1BQU1DLFNBQVNELEtBQUtaLFFBQVE7WUFFNUI3SCxzQkFBc0IwSSxRQUFRckcsU0FBU25CLE9BQU8sT0FBTztZQUVyRCxJQUFHLENBQUNtSCxrQkFBa0JLLE9BQU9DLFFBQVEsQ0FBQywwQkFBMEI7Z0JBQzlETixpQkFBaUI7Z0JBQ2pCaEcsUUFBUTZDLE9BQU8sQ0FBQztnQkFFaEIsTUFBTTBELGNBQWNGLE9BQU9HLEtBQUssQ0FBQztnQkFDakMsTUFBTUMsYUFBYUosT0FBT0csS0FBSyxDQUFDO2dCQUNoQyxNQUFNRSxZQUFZTCxPQUFPRyxLQUFLLENBQUMsb0NBQW9DSCxPQUFPRyxLQUFLLENBQUM7Z0JBRWhGLElBQUdELGFBQWFOLFdBQVdqSCxPQUFPLEdBQUcySCxTQUFTSixXQUFXLENBQUMsRUFBRSxFQUFFO2dCQUM5RCxJQUFHRSxZQUFZUixXQUFXaEgsTUFBTSxHQUFHMEgsU0FBU0YsVUFBVSxDQUFDLEVBQUUsRUFBRTtnQkFDM0QsSUFBR0MsV0FBV1QsV0FBVzdHLElBQUksR0FBR3NILFNBQVMsQ0FBQyxFQUFFO2dCQUU1Q2hJLG1CQUFtQixXQUFXbkIsVUFBVXVELE1BQU0sQ0FBQ1AsY0FBYyxJQUFJLE9BQU8xQixPQUFPb0g7WUFDakY7UUFDRjtRQUVBSixhQUFhZSxNQUFNLEVBQUVULEdBQUcsUUFBUSxDQUFDQztZQUMvQixNQUFNQyxTQUFTRCxLQUFLWixRQUFRO1lBRTVCN0gsc0JBQXNCMEksUUFBUXJHLFNBQVNuQixPQUFPLE9BQU87WUFFckQsSUFBRyxDQUFDbUgsa0JBQWtCSyxPQUFPQyxRQUFRLENBQUMsMEJBQTBCO2dCQUM5RE4saUJBQWlCO2dCQUNqQmhHLFFBQVE2QyxPQUFPLENBQUM7Z0JBRWhCLE1BQU0wRCxjQUFjRixPQUFPRyxLQUFLLENBQUM7Z0JBQ2pDLE1BQU1DLGFBQWFKLE9BQU9HLEtBQUssQ0FBQztnQkFDaEMsTUFBTUUsWUFBWUwsT0FBT0csS0FBSyxDQUFDLG9DQUFvQ0gsT0FBT0csS0FBSyxDQUFDO2dCQUVoRixJQUFHRCxhQUFhTixXQUFXakgsT0FBTyxHQUFHMkgsU0FBU0osV0FBVyxDQUFDLEVBQUUsRUFBRTtnQkFDOUQsSUFBR0UsWUFBWVIsV0FBV2hILE1BQU0sR0FBRzBILFNBQVNGLFVBQVUsQ0FBQyxFQUFFLEVBQUU7Z0JBQzNELElBQUdDLFdBQVdULFdBQVc3RyxJQUFJLEdBQUdzSCxTQUFTLENBQUMsRUFBRTtnQkFFNUNoSSxtQkFBbUIsV0FBV25CLFVBQVV1RCxNQUFNLENBQUNQLGNBQWMsSUFBSSxPQUFPMUIsT0FBT29IO1lBQ2pGO1FBQ0Y7UUFFQSxNQUFNSjtRQUVOLElBQUcsQ0FBQ0csZ0JBQWdCO1lBQ2xCaEcsUUFBUTZDLE9BQU8sQ0FBQztZQUNoQm5FLG1CQUFtQixXQUFXbkIsVUFBVXVELE1BQU0sQ0FBQ1AsY0FBYyxJQUFJLE9BQU8xQixPQUFPb0g7UUFDakY7UUFFQS9GLFNBQVM7UUFDVCxPQUFPO0lBQ1QsRUFBRSxPQUFNNEMsT0FBTztRQUNiOUUsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEsNEJBQTRCLENBQUMsRUFBRSxTQUFTdEI7UUFDekRiLElBQUksQ0FBQyxTQUFTLEVBQUU4RSxNQUFNQyxPQUFPLEVBQUUsRUFBRSxTQUFTbEU7UUFFMUMsSUFBR2lFLGlCQUFpQkUsT0FBTztZQUN6QixJQUFHRixNQUFNRyxLQUFLLEVBQUU7Z0JBQ2RqRixJQUFJLENBQUMsZ0JBQWdCLEVBQUU4RSxNQUFNRyxLQUFLLEVBQUUsRUFBRSxTQUFTcEU7WUFDakQ7UUFDRjtRQUVBYixJQUFJLENBQUMsbUJBQW1CLEVBQUVzSCxlQUFldUIsS0FBSyxDQUFDLEdBQUcsR0FBR0MsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLEVBQUUsU0FBU2pJO1FBRTlFbUIsUUFBUWtELElBQUksQ0FBQztRQUViLElBQUdFLElBQUkyRCxNQUFNLEVBQUU7WUFDYi9HLFFBQVF5QixLQUFLLENBQUM7WUFFZCxJQUFJO2dCQUNGLE1BQU12RCxXQUFXO29CQUNmOEksUUFBUSxDQUFDLDhCQUE4QixFQUFFbEUsTUFBTUMsT0FBTyxDQUFDLG9CQUFvQixFQUFFRCxNQUFNMEMsUUFBUSxHQUFHLHlCQUF5QixFQUFFeUIsS0FBS0MsU0FBUyxDQUFDNUIsZ0JBQWdCLE1BQU0sSUFBSTtvQkFDbEs2QixNQUFNO29CQUNOQyxTQUFTO29CQUNUdkk7Z0JBQ0Y7Z0JBRUFtQixRQUFRNkMsT0FBTyxDQUFDO1lBQ2xCLEVBQUUsT0FBTXdFLFNBQVM7Z0JBQ2ZySCxRQUFRa0QsSUFBSSxDQUFDO2dCQUNiLElBQUcsQ0FBQ3JFLE9BQU87b0JBQ1RpQixRQUFRZ0QsS0FBSyxDQUFDLHdCQUF3QnVFO2dCQUN4QztZQUNGO1FBQ0Y7UUFFQSxJQUFHLENBQUN4SSxPQUFPO1lBQ1RpQixRQUFRZ0QsS0FBSyxDQUFDLHlCQUF5QkE7UUFDekM7UUFFQTVDLFNBQVM7UUFDVCxPQUFPO0lBQ1Q7QUFDRixFQUFFO0FBRUYsT0FBTyxNQUFNb0gsUUFBUSxPQUFPbEUsS0FBbUJsRCxXQUEwQixJQUFPLENBQUEsQ0FBQyxDQUFBLENBQUU7SUFDakYsTUFBTSxFQUNKdkIsVUFBVSxTQUFTLEVBQ25Cd0IsVUFBVSxLQUFLLEVBQ2Z0QixRQUFRLEtBQUssRUFDYjBJLFNBQVMsS0FBSyxFQUNkQyxPQUFPLEtBQUssRUFDWkMsZUFBZSxLQUFLLEVBQ3BCQyxZQUFZLElBQUksRUFDakIsR0FBR3RFO0lBRUosTUFBTXBELFVBQVV0QyxjQUFjbUI7SUFFOUJiLElBQUksR0FBR21DLFFBQVEsWUFBWSxDQUFDLEVBQUUsUUFBUXRCO0lBRXRDLE1BQU10QixVQUFVb0ssV0FBVyxDQUFDdkU7SUFFNUIsTUFBTSxFQUFDN0MsY0FBYyxFQUFFTSxhQUFhLEVBQUMsR0FBR3RELFVBQVV1RCxNQUFNO0lBRXhEdEQ7SUFFQSxJQUFJb0ssZUFBdUI7UUFBQ0MsVUFBVTtJQUFZO0lBRWxELElBQUdILFdBQVc7UUFDWixJQUFJO1lBQ0ZFLGVBQWVYLEtBQUthLEtBQUssQ0FBQ0o7UUFDNUIsRUFBRSxPQUFNNUUsT0FBTztZQUNiOUUsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEsZ0VBQWdFLENBQUMsRUFBRSxTQUFTdEI7WUFFN0ZxQixTQUFTO1lBQ1QsT0FBTztRQUNUO0lBQ0Y7SUFFQTFCLFFBQVFtRixHQUFHLEdBQUc7UUFBQyxHQUFHbkYsUUFBUW1GLEdBQUc7UUFBRSxHQUFHaUUsWUFBWTtJQUFBO0lBRTlDLElBQUdKLE1BQU07UUFDUHhKLElBQUksZ0RBQWdELFFBQVFhO1FBQzVEcUIsU0FBUztRQUNULE9BQU87SUFDVDtJQUVBLElBQUd1SCxjQUFjO1FBQ2Z6SCxRQUFReUIsS0FBSyxDQUFDO1FBRWQsSUFBSTtZQUNGLE1BQU1wQixhQUFhOUMsVUFBVXVELE1BQU0sQ0FBQ04sY0FBYyxJQUFJaEMsUUFBUUMsR0FBRztZQUNqRSxNQUFNRyxhQUFhckIsVUFBVXVELE1BQU0sQ0FBQ1AsY0FBYyxJQUFJO1lBRXRELE1BQU10QyxvQkFBb0JvQyxZQUFZekIsWUFBWUM7WUFDbERtQixRQUFRNkMsT0FBTyxDQUFDO1FBQ2xCLEVBQUUsT0FBTWtGLGtCQUFrQjtZQUN4Qi9KLElBQUksQ0FBQyxFQUFFLEVBQUVtQyxRQUFRLHdDQUF3QyxFQUFFNEgsaUJBQWlCaEYsT0FBTyxFQUFFLEVBQUUsU0FBU2xFO1lBQ2hHbUIsUUFBUWtELElBQUksQ0FBQztZQUNiaEQsU0FBUztZQUNULE9BQU87UUFDVDtJQUNGO0lBRUFGLFFBQVF5QixLQUFLLENBQUM7SUFFZCxJQUFHOEYsUUFBUTtRQUNULE1BQU0zSixZQUFZMkMsa0JBQWtCO0lBQ3RDO0lBRUEsSUFBSXlILGNBQWM7SUFFbEIsSUFBR3JKLFlBQVksT0FBTztRQUNwQnFKLGNBQWMsTUFBTWpJLGFBQWFDLFNBQVNvRCxLQUFLLENBQUM2RTtZQUM5Q0QsY0FBY0M7UUFDaEI7SUFDRixPQUFPO1FBQ0xELGNBQWMsTUFBTTdFLGlCQUFpQm5ELFNBQVNvRCxLQUFLLENBQUM2RTtZQUNsREQsY0FBY0M7UUFDaEI7SUFDRjtJQUVBLElBQUdELGdCQUFnQixLQUFLNUUsSUFBSUMsT0FBTyxFQUFFO1FBQ25DckQsUUFBUXlCLEtBQUssQ0FBQztRQUVkLElBQUk7WUFDRixNQUFNM0MsUUFBUTtnQkFDWkYsWUFBWXJCLFVBQVV1RCxNQUFNLENBQUNQLGNBQWM7Z0JBQzNDMkgsYUFBYXZKLFlBQVksUUFDdkIsQ0FBQyxjQUFjLEVBQUVwQixVQUFVdUQsTUFBTSxDQUFDTixjQUFjLENBQUMsYUFBYSxDQUFDLEdBQy9EakQsVUFBVXVELE1BQU0sQ0FBQ3FILE9BQU8sRUFBRXpFLFNBQVM7WUFDdkM7WUFFQSxNQUFNeEYsV0FBVztnQkFDZjhJLFFBQVEsQ0FBQzs7WUFFTCxFQUFFckksUUFBUTtRQUNkLEVBQUV5RSxJQUFJaEQsTUFBTSxJQUFJLFVBQVU7YUFDckIsRUFBRTdDLFVBQVV1RCxNQUFNLENBQUNILGlCQUFpQixDQUFDO0FBQ2xELEVBQUVzRyxLQUFLQyxTQUFTLENBQUNwSSxPQUFPLE1BQU0sR0FBRzs7Ozs7OzsyQkFPTixDQUFDO2dCQUNwQnFJLE1BQU07Z0JBQ05DLFNBQVM7Z0JBQ1R2STtZQUNGO1lBRUFtQixRQUFRNkMsT0FBTyxDQUFDO1FBQ2xCLEVBQUUsT0FBTXdFLFNBQVM7WUFDZnJILFFBQVFrRCxJQUFJLENBQUM7WUFDYixJQUFHLENBQUNyRSxPQUFPO2dCQUNUaUIsUUFBUWdELEtBQUssQ0FBQyxzQkFBc0J1RTtZQUN0QztRQUNGO0lBQ0Y7SUFFQSxJQUFHVyxnQkFBZ0IsR0FBRztRQUNwQixJQUFJO1lBQ0YsSUFBR25ILGlCQUFpQmxDLFlBQVksT0FBTztnQkFDckMsTUFBTXlKLGlCQUFpQnJLLGtCQUFrQixPQUFPO2dCQUVoRCxJQUFHcUssZ0JBQWdCO29CQUNqQnBJLFFBQVF5QixLQUFLLENBQUM7b0JBQ2QsSUFBSTt3QkFDRixNQUFNakIsaUJBQWlCakQsVUFBVXVELE1BQU0sQ0FBQ04sY0FBYyxJQUFJbEQsWUFBWWtCLFFBQVFDLEdBQUcsSUFBSTt3QkFDckYsTUFBTThCLGlCQUFpQmhELFVBQVV1RCxNQUFNLENBQUNQLGNBQWMsSUFBSWpELFlBQVlrQixRQUFRQyxHQUFHLElBQUk7d0JBQ3JGLE1BQU11QyxjQUFjOzRCQUNsQnZDLEtBQUsrQjs0QkFDTFUsS0FBSzs0QkFDTEMsT0FBTzs0QkFDUEYsVUFBVTt3QkFDWjt3QkFDQSxNQUFNSSxVQUFVcEUsU0FBUyxDQUFDLDBDQUEwQyxDQUFDLEVBQUUrRDt3QkFDdkUsTUFBTXFILFdBQVdwTCxTQUFTLENBQUMsMkNBQTJDLENBQUMsRUFBRStEO3dCQUN6RSxNQUFNc0gsaUJBQWlCOytCQUFJakg7K0JBQVlnSDt5QkFBUzt3QkFDaEQsTUFBTUUsb0JBQW9COytCQUNyQmhMLFVBQVVpTCw2QkFBNkI7K0JBQ3ZDRjt5QkFDSjt3QkFDRCxNQUFNOUYsU0FBUyxNQUFNM0YsTUFBTXVMLGdCQUFnQkcsbUJBQW1COzRCQUM1RHpDLFVBQVU7NEJBQ1ZySCxLQUFLRCxRQUFRQyxHQUFHOzRCQUNoQmdLLFFBQVE7NEJBQ1I3RixLQUFLO3dCQUNQO3dCQUVBLElBQUdKLE9BQU9rRyxRQUFRLEtBQUssR0FBRzs0QkFDeEIsTUFBTUMsa0JBQWtCbkcsT0FBT0ksR0FBRyxFQUFFMEQsU0FBUyxjQUFjOUQsT0FBT0ksR0FBRyxFQUFFMEQsU0FBUyxrQkFBa0I7NEJBQ2xHLE1BQU1zQyxjQUFjcEcsT0FBT29FLE1BQU0sSUFBSXBFLE9BQU8wRCxNQUFNLElBQUkxRCxPQUFPSSxHQUFHLElBQUk7NEJBRXBFLElBQUcsQ0FBQytGLGlCQUFpQjtnQ0FDbkIzSyxJQUFJLENBQUMsRUFBRSxFQUFFbUMsUUFBUSxnREFBZ0QsQ0FBQyxFQUFFLFNBQVN0QjtnQ0FDN0ViLElBQUksQ0FBQyxhQUFhLEVBQUV3RSxPQUFPa0csUUFBUSxFQUFFLEVBQUUsU0FBUzdKO2dDQUNoRGIsSUFBSSxDQUFDLHNCQUFzQixFQUFFb0ssZUFBZSxDQUFDLEVBQUVHLGtCQUFrQjFCLEtBQUssQ0FBQyxHQUFHLElBQUlDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFNBQVNqSTtnQ0FDdkdiLElBQUksQ0FBQyxpQkFBaUIsRUFBRTRLLGFBQWEsRUFBRSxTQUFTL0o7Z0NBRWhELE1BQU1nSyxhQUFhRCxZQUFZRSxLQUFLLENBQUMsTUFBTUMsTUFBTSxDQUFDQyxDQUFBQSxPQUNoREEsS0FBSzFDLFFBQVEsQ0FBQyxlQUNkMEMsS0FBSzFDLFFBQVEsQ0FBQyxhQUNkMEMsS0FBS0MsSUFBSSxHQUFHQyxVQUFVLENBQUMsV0FDdkJGLEtBQUtDLElBQUksR0FBR0MsVUFBVSxDQUFDO2dDQUd6QixJQUFHTCxXQUFXTSxNQUFNLEdBQUcsR0FBRztvQ0FDeEJuTCxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBU2E7b0NBQzlCZ0ssV0FBV2hDLEtBQUssQ0FBQyxHQUFHLElBQUl1QyxPQUFPLENBQUNKLENBQUFBO3dDQUM5QmhMLElBQUksQ0FBQyxFQUFFLEVBQUVnTCxNQUFNLEVBQUUsU0FBU25LO29DQUM1QjtvQ0FDQSxJQUFHZ0ssV0FBV00sTUFBTSxHQUFHLElBQUk7d0NBQ3pCbkwsSUFBSSxDQUFDLFVBQVUsRUFBRTZLLFdBQVdNLE1BQU0sR0FBRyxHQUFHLFlBQVksQ0FBQyxFQUFFLFNBQVN0SztvQ0FDbEU7Z0NBQ0Y7Z0NBRUFtQixRQUFRa0QsSUFBSSxDQUFDOzRCQUNmLE9BQU87Z0NBQ0xsRixJQUFJLENBQUMsRUFBRSxFQUFFbUMsUUFBUSxpRUFBaUUsQ0FBQyxFQUFFLFFBQVF0QjtnQ0FDN0YsSUFBRyxDQUFDQSxTQUFTK0osYUFBYTtvQ0FDeEI1SyxJQUFJLENBQUMsYUFBYSxFQUFFNEssYUFBYSxFQUFFLFFBQVEvSjtnQ0FDN0M7Z0NBQ0FtQixRQUFRNkMsT0FBTyxDQUFDOzRCQUNsQjt3QkFDRixPQUFPOzRCQUNMN0MsUUFBUTZDLE9BQU8sQ0FBQzt3QkFDbEI7b0JBQ0YsRUFBRSxPQUFNQyxPQUFPO3dCQUNiOUUsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEsbURBQW1ELENBQUMsRUFBRSxTQUFTdEI7d0JBQ2hGYixJQUFJLENBQUMsU0FBUyxFQUFFOEUsTUFBTUMsT0FBTyxFQUFFLEVBQUUsU0FBU2xFO3dCQUMxQyxJQUFHaUUsaUJBQWlCRSxTQUFTRixNQUFNRyxLQUFLLEVBQUU7NEJBQ3hDakYsSUFBSSxDQUFDLFVBQVUsRUFBRThFLE1BQU1HLEtBQUssRUFBRSxFQUFFLFNBQVNwRTt3QkFDM0M7d0JBQ0FtQixRQUFRa0QsSUFBSSxDQUFDO29CQUNmO2dCQUNGO1lBQ0Y7WUFFQSxNQUFNekYsb0JBQW9CdUMsU0FBU3pDLFVBQVV1RCxNQUFNLEVBQUVqQztRQUN2RCxFQUFFLE9BQU13SyxXQUFXO1lBQ2pCckwsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEseUNBQXlDLEVBQUVrSixVQUFVdEcsT0FBTyxFQUFFLEVBQUUsU0FBU2xFO1lBQzFGcUIsU0FBUztZQUNULE9BQU87UUFDVDtJQUNGO0lBRUFBLFNBQVM4SDtJQUNULE9BQU9BO0FBQ1QsRUFBRTtBQUVGLGVBQWVWLE1BQU0ifQ==
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9idWlsZC9idWlsZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHt0cmFuc2Zvcm19IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQge2V4ZWNhfSBmcm9tICdleGVjYSc7XG5pbXBvcnQge2V4aXN0c1N5bmMsIHJlYWRGaWxlU3luY30gZnJvbSAnZnMnO1xuaW1wb3J0IHtzeW5jIGFzIGdsb2JTeW5jfSBmcm9tICdnbG9iJztcbmltcG9ydCB7YnVpbGQgYXMgdml0ZUJ1aWxkLCBjcmVhdGVTZXJ2ZXIgYXMgY3JlYXRlVml0ZVNlcnZlcn0gZnJvbSAndml0ZSc7XG5pbXBvcnQge1xuICBkaXJuYW1lLFxuICByZWxhdGl2ZSBhcyBwYXRoUmVsYXRpdmUsXG4gIHJlc29sdmUgYXMgcGF0aFJlc29sdmVcbn0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjaGVja0xpbmtlZE1vZHVsZXMsIGNvcHlDb25maWd1cmVkRmlsZXMsIGNyZWF0ZVNwaW5uZXIsIHJlbW92ZUZpbGVzfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZUJpbmFyeVBhdGhcbn0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7cmVuZGVyU3RhdGljU2l0ZX0gZnJvbSAnLi4vLi4vdXRpbHMvc3RhdGljU2l0ZS5qcyc7XG5pbXBvcnQge3Byb2Nlc3NUcmFuc2xhdGlvbnN9IGZyb20gJy4uLy4uL3V0aWxzL3RyYW5zbGF0aW9ucy5qcyc7XG5pbXBvcnQge2NvbXByZXNzTGV4V2ViQXNzZXRzLCBjb3B5TGV4V2ViQXNzZXRzLCBvcHRpbWl6ZUxleFdlYkFzc2V0c30gZnJvbSAnLi4vLi4vdXRpbHMvdml0ZS9hc3NldHMuanMnO1xuaW1wb3J0IHtjcmVhdGVMZXhWaXRlQ29uZmlnfSBmcm9tICcuLi8uLi91dGlscy92aXRlL2NvbmZpZy5qcyc7XG5pbXBvcnQge2FpRnVuY3Rpb259IGZyb20gJy4uL2FpL2FpLmpzJztcbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuXG5pbXBvcnQgdHlwZSB7U1dDT3B0aW9uc30gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB0eXBlIHtTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGFzc2lzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBidW5kbGVyPzogJ3N3YycgfCAndml0ZSc7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudHJ5Pzogc3RyaW5nIHwgc3RyaW5nW107XG4gIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcbiAgcmVhZG9ubHkgbW9kZT86ICdkZXZlbG9wbWVudCcgfCAncHJvZHVjdGlvbic7XG4gIHJlYWRvbmx5IG91dHB1dFBhdGg/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVtb3ZlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc291cmNlUGF0aD86IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhdGljPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRyYW5zbGF0aW9ucz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd2F0Y2g/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBCdWlsZENhbGxiYWNrID0gKHN0YXR1czogbnVtYmVyKSA9PiB2b2lkO1xuXG5jb25zdCBkaXNwbGF5QnVpbGRTdGF0dXMgPSAoYnVuZGxlcjogc3RyaW5nLCBvdXRwdXRQYXRoOiBzdHJpbmcsIHF1aWV0OiBib29sZWFuLCBzdGF0cz86IHttb2R1bGVzPzogbnVtYmVyOyBhc3NldHM/OiBudW1iZXI7IHNpemU/OiBzdHJpbmd9KSA9PiB7XG4gIGlmKHF1aWV0KSByZXR1cm47XG5cbiAgbGV0IHN0YXRzSW5mbyA9ICcnO1xuICBpZihzdGF0cyAmJiBzdGF0cy5tb2R1bGVzICYmIHN0YXRzLmFzc2V0cykge1xuICAgIHN0YXRzSW5mbyA9IGBcXG4ke2NoYWxrLmdyZWVuKCdNb2R1bGVzOicpfSAgICAke2NoYWxrLmN5YW4oc3RhdHMubW9kdWxlcyl9XFxuYCArXG4gICAgICBgJHtjaGFsay5ncmVlbignQXNzZXRzOicpfSAgICAgJHtjaGFsay5jeWFuKHN0YXRzLmFzc2V0cyl9XFxuYCArXG4gICAgICBgJHtjaGFsay5ncmVlbignU2l6ZTonKX0gICAgICAgJHtjaGFsay5jeWFuKHN0YXRzLnNpemUpfVxcbmA7XG4gIH1cblxuICBjb25zdCBzdGF0dXNCb3ggPSBib3hlbihcbiAgICBgJHtjaGFsay5jeWFuLmJvbGQoJ/Cfj5fvuI8gIEJ1aWxkIENvbXBsZXRlZCBTdWNjZXNzZnVsbHkgJyl9XFxuXFxuYCArXG4gICAgYCR7Y2hhbGsuZ3JlZW4oJ0J1bmRsZXI6Jyl9ICAgICR7Y2hhbGsuY3lhbihidW5kbGVyKX1cXG5gICtcbiAgICBgJHtjaGFsay5ncmVlbignT3V0cHV0OicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUob3V0cHV0UGF0aCl9JHtzdGF0c0luZm99XFxuYCArXG4gICAgYCR7Y2hhbGsueWVsbG93KCdSZWFkeSBmb3IgZGVwbG95bWVudCEg8J+agCcpfWAsXG4gICAge1xuICAgICAgcGFkZGluZzogMSxcbiAgICAgIG1hcmdpbjogMSxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdncmVlbicsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjMWExYTFhJ1xuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZygnXFxuJyArIHN0YXR1c0JveCArICdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBidWlsZFdpdGhTV0MgPSBhc3luYyAoc3Bpbm5lcjogU3Bpbm5lciwgY29tbWFuZE9wdGlvbnM6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2spID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBmb3JtYXQgPSAnZXNtJyxcbiAgICBvdXRwdXRQYXRoLFxuICAgIHF1aWV0LFxuICAgIHNvdXJjZVBhdGgsXG4gICAgd2F0Y2hcbiAgfSA9IGNvbW1hbmRPcHRpb25zO1xuICBjb25zdCB7XG4gICAgb3V0cHV0RnVsbFBhdGgsXG4gICAgc291cmNlRnVsbFBhdGgsXG4gICAgc3djOiBzd2NDb25maWcsXG4gICAgdGFyZ2V0RW52aXJvbm1lbnQsXG4gICAgdXNlR3JhcGhRbCxcbiAgICB1c2VUeXBlc2NyaXB0XG4gIH0gPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBzb3VyY2VEaXI6IHN0cmluZyA9IHNvdXJjZVBhdGggPyBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBgLi8ke3NvdXJjZVBhdGh9YCkgOiBzb3VyY2VGdWxsUGF0aCB8fCAnJztcblxuICBjb25zdCBnbG9iT3B0aW9ucyA9IHtcbiAgICBhYnNvbHV0ZTogdHJ1ZSxcbiAgICBjd2Q6IHNvdXJjZURpcixcbiAgICBkb3Q6IGZhbHNlLFxuICAgIG5vZGlyOiB0cnVlLFxuICAgIG5vc29ydDogdHJ1ZVxuICB9O1xuICBjb25zdCB0c0ZpbGVzOiBzdHJpbmdbXSA9IGdsb2JTeW5jKGAqKi8hKCouc3BlY3wqLnRlc3QpLnRzKmAsIGdsb2JPcHRpb25zKTtcbiAgY29uc3QganNGaWxlczogc3RyaW5nW10gPSBnbG9iU3luYyhgKiovISgqLnNwZWN8Ki50ZXN0KS5qc2AsIGdsb2JPcHRpb25zKTtcbiAgY29uc3Qgc291cmNlRmlsZXM6IHN0cmluZ1tdID0gWy4uLnRzRmlsZXMsIC4uLmpzRmlsZXNdO1xuXG4gIGNvbnN0IG91dHB1dERpcjogc3RyaW5nID0gb3V0cHV0UGF0aFxuICAgID8gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3V0cHV0UGF0aClcbiAgICA6IChvdXRwdXRGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9saWInKSk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdCdWlsZGluZyB3aXRoIFNXQy4uLicpO1xuXG4gICAgY29uc3QgdHJhbnNmb3JtUHJvbWlzZXMgPSBzb3VyY2VGaWxlcy5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVSZWxhdGl2ZVRvU291cmNlID0gcGF0aFJlbGF0aXZlKHNvdXJjZURpciwgZmlsZSk7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gZmlsZTsgLy8gZmlsZSBpcyBhbHJlYWR5IGFic29sdXRlXG4gICAgICBjb25zdCBvdXRwdXRGaWxlID0gZmlsZVJlbGF0aXZlVG9Tb3VyY2UucmVwbGFjZSgvXFwuKHRzfHRzeCkkLywgJy5qcycpO1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IHBhdGhSZXNvbHZlKG91dHB1dERpciwgb3V0cHV0RmlsZSk7XG4gICAgICBjb25zdCBvdXRwdXREaXJQYXRoID0gZGlybmFtZShvdXRwdXRQYXRoKTtcblxuICAgICAgaWYoIWV4aXN0c1N5bmMob3V0cHV0RGlyUGF0aCkpIHtcbiAgICAgICAgY29uc3Qge21rZGlyU3luY30gPSBhd2FpdCBpbXBvcnQoJ2ZzJyk7XG4gICAgICAgIG1rZGlyU3luYyhvdXRwdXREaXJQYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSByZWFkRmlsZVN5bmMoc291cmNlUGF0aCwgJ3V0ZjgnKTtcbiAgICAgIGNvbnN0IHN3Y09wdGlvbnMgPSB7XG4gICAgICAgIC4uLnN3Y0NvbmZpZyxcbiAgICAgICAgZmlsZW5hbWU6IGZpbGUsXG4gICAgICAgIG1vZHVsZToge1xuICAgICAgICAgIHR5cGU6IGZvcm1hdCA9PT0gJ2NqcycgPyAnY29tbW9uanMnIGFzIGNvbnN0IDogKHN3Y0NvbmZpZz8ubW9kdWxlPy50eXBlIGFzICdlczYnIHx8ICdlczYnKSxcbiAgICAgICAgICAuLi5zd2NDb25maWc/Lm1vZHVsZVxuICAgICAgICB9LFxuICAgICAgfSBhcyBQYXJ0aWFsPFNXQ09wdGlvbnM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlQ29kZSwgc3djT3B0aW9ucyk7XG5cbiAgICAgIGNvbnN0IHt3cml0ZUZpbGVTeW5jfSA9IGF3YWl0IGltcG9ydCgnZnMnKTtcbiAgICAgIHdyaXRlRmlsZVN5bmMob3V0cHV0UGF0aCwgcmVzdWx0LmNvZGUpO1xuICAgIH0pO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwodHJhbnNmb3JtUHJvbWlzZXMpO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdCdWlsZCBjb21wbGV0ZWQgd2l0aCBTV0MnKTtcbiAgICBkaXNwbGF5QnVpbGRTdGF0dXMoJ1NXQycsIG91dHB1dERpciwgcXVpZXQgPz8gZmFsc2UpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBcXG4ke2NvbW1hbmRPcHRpb25zLmNsaU5hbWUgfHwgJ0xleCd9IEVycm9yOiBTV0MgYnVpbGQgZmFpbGVkYCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZyhgXFxuRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG5cbiAgICBpZihlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBpZihlcnJvci5zdGFjaykge1xuICAgICAgICBsb2coYFxcblN0YWNrIFRyYWNlOlxcbiR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBpZignZmlsZW5hbWUnIGluIGVycm9yIHx8ICdmaWxlJyBpbiBlcnJvcikge1xuICAgICAgICBsb2coYFxcbkZpbGU6ICR7KGVycm9yIGFzIGFueSkuZmlsZW5hbWUgfHwgKGVycm9yIGFzIGFueSkuZmlsZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQgd2l0aCBTV0MnKTtcbiAgICBpZighcXVpZXQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1xcbkZ1bGwgRXJyb3IgRGV0YWlsczonLCBlcnJvcik7XG4gICAgfVxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGRXaXRoVml0ZSA9IGFzeW5jIChzcGlubmVyOiBTcGlubmVyLCBjbWQ6IEJ1aWxkT3B0aW9ucywgY2FsbGJhY2s6IEJ1aWxkQ2FsbGJhY2spOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7YW5hbHl6ZSwgYXNzaXN0LCBlbnRyeSwgbW9kZSA9ICdwcm9kdWN0aW9uJywgcXVpZXQgPSBmYWxzZSwgc3RhdGljOiBpc1N0YXRpYyA9IGZhbHNlfSA9IGNtZDtcbiAgY29uc3QgZW50cnlWYWx1ZSA9IEFycmF5LmlzQXJyYXkoZW50cnkpID8gZW50cnlbMF0gOiBlbnRyeTtcbiAgY29uc3Qgb3V0cHV0UGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4vbGliJyk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdCdWlsZGluZyB3aXRoIFZpdGUuLi4nKTtcbiAgICBhd2FpdCB2aXRlQnVpbGQoY3JlYXRlTGV4Vml0ZUNvbmZpZyh7YW5hbHl6ZSwgY29tbWFuZDogJ2J1aWxkJywgZW50cnk6IGVudHJ5VmFsdWUsIG1vZGUsIHF1aWV0fSkpO1xuICAgIGF3YWl0IGNvcHlMZXhXZWJBc3NldHMoTGV4Q29uZmlnLmNvbmZpZyk7XG4gICAgYXdhaXQgb3B0aW1pemVMZXhXZWJBc3NldHMoTGV4Q29uZmlnLmNvbmZpZyk7XG5cbiAgICBpZihpc1N0YXRpYykge1xuICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgY3JlYXRlVml0ZVNlcnZlcih7XG4gICAgICAgIC4uLmNyZWF0ZUxleFZpdGVDb25maWcoe2NvbW1hbmQ6ICdzZXJ2ZScsIGVudHJ5OiBlbnRyeVZhbHVlLCBtb2RlLCBxdWlldCwgc3NyOiB0cnVlfSksXG4gICAgICAgIHNlcnZlcjoge21pZGRsZXdhcmVNb2RlOiB0cnVlfVxuICAgICAgfSk7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzb3VyY2VQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9zcmMnKTtcbiAgICAgICAgY29uc3QgZW50cnlQYXRoID0gcGF0aFJlc29sdmUoc291cmNlUGF0aCwgZW50cnlWYWx1ZSB8fCBMZXhDb25maWcuY29uZmlnLmVudHJ5SnMgfHwgJ2luZGV4LmpzJyk7XG4gICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IHNlcnZlci5zc3JMb2FkTW9kdWxlKGVudHJ5UGF0aCk7XG4gICAgICAgIGNvbnN0IHJlbmRlciA9IG1vZHVsZS5kZWZhdWx0IHx8IG1vZHVsZS5yZW5kZXI7XG4gICAgICAgIGlmKHR5cGVvZiByZW5kZXIgIT09ICdmdW5jdGlvbicpIHRocm93IG5ldyBFcnJvcihgU3RhdGljIGVudHJ5IFwiJHtlbnRyeVBhdGh9XCIgbXVzdCBleHBvcnQgYSByZW5kZXIgZnVuY3Rpb24uYCk7XG5cbiAgICAgICAgY29uc3QgYXNzZXRzID0gZ2xvYlN5bmMoJyoqLyonLCB7Y3dkOiBvdXRwdXRQYXRoLCBub2RpcjogdHJ1ZX0pLnJlZHVjZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PigocmVzdWx0LCBmaWxlTmFtZSkgPT4ge1xuICAgICAgICAgIHJlc3VsdFtmaWxlTmFtZV0gPSBgLyR7ZmlsZU5hbWV9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9LCB7fSk7XG4gICAgICAgIGF3YWl0IHJlbmRlclN0YXRpY1NpdGUoe2Fzc2V0cywgb3V0cHV0UGF0aCwgcmVuZGVyfSk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wcmVzc0xleFdlYkFzc2V0cyhMZXhDb25maWcuY29uZmlnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ0J1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhJyk7XG4gICAgZGlzcGxheUJ1aWxkU3RhdHVzKCdWaXRlJywgb3V0cHV0UGF0aCwgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgY29uc3QgYnVpbGRFcnJvciA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKTtcbiAgICBsb2coYFxcbiR7Y21kLmNsaU5hbWUgfHwgJ0xleCd9IEVycm9yOiBWaXRlIGJ1aWxkIGZhaWxlZGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coYFxcbkVycm9yOiAke2J1aWxkRXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgc3Bpbm5lci5mYWlsKCdCdWlsZCBmYWlsZWQuJyk7XG5cbiAgICBpZihhc3Npc3QpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe3Byb21wdDogYEZpeCB0aGlzIFZpdGUgYnVpbGQgZXJyb3I6ICR7YnVpbGRFcnJvci5tZXNzYWdlfVxcblxcbiR7YnVpbGRFcnJvci5zdGFjayB8fCAnJ31gLCB0YXNrOiAnaGVscCcsIGNvbnRleHQ6IHRydWUsIHF1aWV0fSk7XG4gICAgICB9IGNhdGNoKGFpRXJyb3IpIHtcbiAgICAgICAgaWYoIXF1aWV0KSBjb25zb2xlLmVycm9yKCdBSSBhc3Npc3RhbmNlIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgYnVpbGQgPSBhc3luYyAoY21kOiBCdWlsZE9wdGlvbnMsIGNhbGxiYWNrOiBCdWlsZENhbGxiYWNrID0gKCkgPT4gKHt9KSk6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVyOiByZXF1ZXN0ZWRCdW5kbGVyLFxuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBxdWlldCA9IGZhbHNlLFxuICAgIHJlbW92ZSA9IGZhbHNlLFxuICAgIHRlc3QgPSBmYWxzZSxcbiAgICB0cmFuc2xhdGlvbnMgPSBmYWxzZSxcbiAgICB2YXJpYWJsZXMgPSAne30nXG4gIH0gPSBjbWQ7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSBidWlsZGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGNvbnN0IHtvdXRwdXRGdWxsUGF0aCwgdXNlVHlwZXNjcmlwdH0gPSBMZXhDb25maWcuY29uZmlnO1xuICBjb25zdCBidW5kbGVyID0gcmVxdWVzdGVkQnVuZGxlciB8fCAoTGV4Q29uZmlnLmNvbmZpZy50YXJnZXRFbnZpcm9ubWVudCA9PT0gJ3dlYicgPyAndml0ZScgOiAnc3djJyk7XG5cbiAgY2hlY2tMaW5rZWRNb2R1bGVzKCk7XG5cbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAncHJvZHVjdGlvbid9O1xuXG4gIGlmKHZhcmlhYmxlcykge1xuICAgIHRyeSB7XG4gICAgICB2YXJpYWJsZXNPYmogPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgY2FsbGJhY2soMSk7XG4gICAgICByZXR1cm4gMTtcbiAgICB9XG4gIH1cblxuICBwcm9jZXNzLmVudiA9IHsuLi5wcm9jZXNzLmVudiwgLi4udmFyaWFibGVzT2JqfTtcblxuICBpZih0ZXN0KSB7XG4gICAgbG9nKCdUZXN0IG1vZGU6IEJ1aWxkIGVudmlyb25tZW50IGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYodHJhbnNsYXRpb25zKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnUHJvY2Vzc2luZyB0cmFuc2xhdGlvbnMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBzb3VyY2VQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgICAgY29uc3Qgb3V0cHV0UGF0aCA9IExleENvbmZpZy5jb25maWcub3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG5cbiAgICAgIGF3YWl0IHByb2Nlc3NUcmFuc2xhdGlvbnMoc291cmNlUGF0aCwgb3V0cHV0UGF0aCwgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUcmFuc2xhdGlvbnMgcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseSEnKTtcbiAgICB9IGNhdGNoKHRyYW5zbGF0aW9uRXJyb3IpIHtcbiAgICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogRmFpbGVkIHRvIHByb2Nlc3MgdHJhbnNsYXRpb25zOiAke3RyYW5zbGF0aW9uRXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICBzcGlubmVyLmZhaWwoJ0ZhaWxlZCB0byBwcm9jZXNzIHRyYW5zbGF0aW9ucy4nKTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgc3Bpbm5lci5zdGFydCgnQnVpbGRpbmcgY29kZS4uLicpO1xuXG4gIGlmKHJlbW92ZSkge1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgfVxuXG4gIGxldCBidWlsZFJlc3VsdCA9IDA7XG5cbiAgaWYoYnVuZGxlciA9PT0gJ3N3YycpIHtcbiAgICBidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkV2l0aFNXQyhzcGlubmVyLCBjbWQsIChzdGF0dXMpID0+IHtcbiAgICAgIGJ1aWxkUmVzdWx0ID0gc3RhdHVzO1xuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGJ1aWxkUmVzdWx0ID0gYXdhaXQgYnVpbGRXaXRoVml0ZShzcGlubmVyLCBjbWQsIChzdGF0dXM6IG51bWJlcikgPT4ge1xuICAgICAgYnVpbGRSZXN1bHQgPSBzdGF0dXM7XG4gICAgfSk7XG4gIH1cblxuICBpZihidWlsZFJlc3VsdCA9PT0gMCAmJiBjbWQuYW5hbHl6ZSkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0FJIGlzIGFuYWx5emluZyB0aGUgYnVpbGQgb3V0cHV0IGZvciBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcy4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXRzID0ge1xuICAgICAgICBvdXRwdXRQYXRoOiBMZXhDb25maWcuY29uZmlnLm91dHB1dEZ1bGxQYXRoLFxuICAgICAgICBlbnRyeVBvaW50czogYnVuZGxlciA9PT0gJ3N3YydcbiAgICAgICAgICA/IGBTb3VyY2UgZmlsZXM6ICR7TGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aH0vKiovKi57dHMsanN9YFxuICAgICAgICAgIDogTGV4Q29uZmlnLmNvbmZpZy5lbnRyeUpzIHx8ICdVbmtub3duIGVudHJ5IHBvaW50J1xuICAgICAgfTtcblxuICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgIHByb21wdDogYEFuYWx5emUgdGhpcyBidWlsZCBmb3Igb3B0aW1pemF0aW9uIG9wcG9ydHVuaXRpZXM6XG5cbkJ1aWxkIFR5cGU6ICR7YnVuZGxlcn1cbkZvcm1hdDogJHtjbWQuZm9ybWF0IHx8ICdkZWZhdWx0J31cbkVudmlyb25tZW50OiAke0xleENvbmZpZy5jb25maWcudGFyZ2V0RW52aXJvbm1lbnR9XG4ke0pTT04uc3RyaW5naWZ5KHN0YXRzLCBudWxsLCAyKX1cblxuV2hhdCBhcmUgdGhlIGtleSBvcHRpbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBmb3IgdGhpcyBidWlsZCBjb25maWd1cmF0aW9uPyBDb25zaWRlcjpcbjEuIEJ1bmRsZSBzaXplIG9wdGltaXphdGlvbiBzdHJhdGVnaWVzXG4yLiBDb2RlIHNwbGl0dGluZyByZWNvbW1lbmRhdGlvbnNcbjMuIFRyZWUtc2hha2luZyBpbXByb3ZlbWVudHNcbjQuIFBlcmZvcm1hbmNlIGVuaGFuY2VtZW50c1xuNS4gRGVwZW5kZW5jeSBvcHRpbWl6YXRpb25zYCxcbiAgICAgICAgdGFzazogJ29wdGltaXplJyxcbiAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgcXVpZXRcbiAgICAgIH0pO1xuXG4gICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIGJ1aWxkIGFuYWx5c2lzIGNvbXBsZXRlJyk7XG4gICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBvcHRpbWl6YXRpb24gYW5hbHlzaXMnKTtcbiAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdBSSBhbmFseXNpcyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZihidWlsZFJlc3VsdCA9PT0gMCkge1xuICAgIHRyeSB7XG4gICAgICBpZih1c2VUeXBlc2NyaXB0ICYmIGJ1bmRsZXIgPT09ICdzd2MnKSB7XG4gICAgICAgIGNvbnN0IHR5cGVzY3JpcHRQYXRoID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ3RzYycsICd0eXBlc2NyaXB0Jyk7XG5cbiAgICAgICAgaWYodHlwZXNjcmlwdFBhdGgpIHtcbiAgICAgICAgICBzcGlubmVyLnN0YXJ0KCdHZW5lcmF0aW5nIFR5cGVTY3JpcHQgZGVjbGFyYXRpb25zLi4uJyk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZUZ1bGxQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5zb3VyY2VGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9zcmMnKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEZ1bGxQYXRoID0gTGV4Q29uZmlnLmNvbmZpZy5vdXRwdXRGdWxsUGF0aCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLi9saWInKTtcbiAgICAgICAgICAgIGNvbnN0IGdsb2JPcHRpb25zID0ge1xuICAgICAgICAgICAgICBjd2Q6IHNvdXJjZUZ1bGxQYXRoLFxuICAgICAgICAgICAgICBkb3Q6IGZhbHNlLFxuICAgICAgICAgICAgICBub2RpcjogdHJ1ZSxcbiAgICAgICAgICAgICAgYWJzb2x1dGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCB0c0ZpbGVzID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdHwqLmludGVncmF0aW9ufCouZTJlKS50c2AsIGdsb2JPcHRpb25zKTtcbiAgICAgICAgICAgIGNvbnN0IHRzeEZpbGVzID0gZ2xvYlN5bmMoYCoqLyEoKi5zcGVjfCoudGVzdHwqLmludGVncmF0aW9ufCouZTJlKS50c3hgLCBnbG9iT3B0aW9ucyk7XG4gICAgICAgICAgICBjb25zdCBhbGxTb3VyY2VGaWxlcyA9IFsuLi50c0ZpbGVzLCAuLi50c3hGaWxlc107XG4gICAgICAgICAgICBjb25zdCB0eXBlc2NyaXB0T3B0aW9ucyA9IFtcbiAgICAgICAgICAgICAgLi4uTGV4Q29uZmlnLmdldFR5cGVTY3JpcHREZWNsYXJhdGlvbkZsYWdzKCksXG4gICAgICAgICAgICAgIC4uLmFsbFNvdXJjZUZpbGVzXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY2EodHlwZXNjcmlwdFBhdGgsIHR5cGVzY3JpcHRPcHRpb25zLCB7XG4gICAgICAgICAgICAgIGVuY29kaW5nOiAndXRmOCcsXG4gICAgICAgICAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgcmVqZWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgYWxsOiB0cnVlXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhhc0RlY2xhcmF0aW9ucyA9IHJlc3VsdC5hbGw/LmluY2x1ZGVzKCdXcml0aW5nJykgfHwgcmVzdWx0LmFsbD8uaW5jbHVkZXMoJ0RlY2xhcmF0aW9uJykgfHwgZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnN0IGVycm9yT3V0cHV0ID0gcmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0IHx8IHJlc3VsdC5hbGwgfHwgJ1Vua25vd24gZXJyb3InO1xuXG4gICAgICAgICAgICAgIGlmKCFoYXNEZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBmYWlsZWRgLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG5FeGl0IENvZGU6ICR7cmVzdWx0LmV4aXRDb2RlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBsb2coYFxcblR5cGVTY3JpcHQgQ29tbWFuZDogJHt0eXBlc2NyaXB0UGF0aH0gJHt0eXBlc2NyaXB0T3B0aW9ucy5zbGljZSgwLCAxMCkuam9pbignICcpfS4uLmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBsb2coYFxcbkVycm9yIE91dHB1dDpcXG4ke2Vycm9yT3V0cHV0fWAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTGluZXMgPSBlcnJvck91dHB1dC5zcGxpdCgnXFxuJykuZmlsdGVyKGxpbmUgPT5cbiAgICAgICAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ2Vycm9yIFRTJykgfHxcbiAgICAgICAgICAgICAgICAgIGxpbmUuaW5jbHVkZXMoJ0Vycm9yOicpIHx8XG4gICAgICAgICAgICAgICAgICBsaW5lLnRyaW0oKS5zdGFydHNXaXRoKCdzcmMvJykgfHxcbiAgICAgICAgICAgICAgICAgIGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoJ1RTJylcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYoZXJyb3JMaW5lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICBsb2coYFxcbktleSBFcnJvcnM6YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgICAgICAgZXJyb3JMaW5lcy5zbGljZSgwLCAxMCkuZm9yRWFjaChsaW5lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGAgICR7bGluZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgIGlmKGVycm9yTGluZXMubGVuZ3RoID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKGAgIC4uLiBhbmQgJHtlcnJvckxpbmVzLmxlbmd0aCAtIDEwfSBtb3JlIGVycm9yc2AsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBzcGlubmVyLmZhaWwoJ1R5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBoYWQgZXJyb3JzIChjb250aW51aW5nIGFueXdheSkuJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IFdhcm5pbmc6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBjb21wbGV0ZWQgd2l0aCBlcnJvcnNgLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICBpZighcXVpZXQgJiYgZXJyb3JPdXRwdXQpIHtcbiAgICAgICAgICAgICAgICAgIGxvZyhgXFxuV2FybmluZ3M6XFxuJHtlcnJvck91dHB1dH1gLCAnd2FybicsIHF1aWV0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9ucyBnZW5lcmF0ZWQgKHdpdGggd2FybmluZ3MpLicpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ1R5cGVTY3JpcHQgZGVjbGFyYXRpb25zIGdlbmVyYXRlZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFR5cGVTY3JpcHQgZGVjbGFyYXRpb24gZ2VuZXJhdGlvbiBleGNlcHRpb25gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgICAgICAgICBsb2coYFxcbkVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5zdGFjaykge1xuICAgICAgICAgICAgICBsb2coYFxcblN0YWNrOlxcbiR7ZXJyb3Iuc3RhY2t9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3Bpbm5lci5mYWlsKCdUeXBlU2NyaXB0IGRlY2xhcmF0aW9uIGdlbmVyYXRpb24gaGFkIGlzc3VlcyAoY29udGludWluZyBhbnl3YXkpLicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBjb3B5Q29uZmlndXJlZEZpbGVzKHNwaW5uZXIsIExleENvbmZpZy5jb25maWcsIHF1aWV0KTtcbiAgICB9IGNhdGNoKGNvcHlFcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBGYWlsZWQgdG8gY29weSBjb25maWd1cmVkIGZpbGVzOiAke2NvcHlFcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgY2FsbGJhY2soYnVpbGRSZXN1bHQpO1xuICByZXR1cm4gYnVpbGRSZXN1bHQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBidWlsZDtcbiJdLCJuYW1lcyI6WyJ0cmFuc2Zvcm0iLCJleGVjYSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJidWlsZCIsInZpdGVCdWlsZCIsImNyZWF0ZVNlcnZlciIsImNyZWF0ZVZpdGVTZXJ2ZXIiLCJkaXJuYW1lIiwicmVsYXRpdmUiLCJwYXRoUmVsYXRpdmUiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJMZXhDb25maWciLCJjaGVja0xpbmtlZE1vZHVsZXMiLCJjb3B5Q29uZmlndXJlZEZpbGVzIiwiY3JlYXRlU3Bpbm5lciIsInJlbW92ZUZpbGVzIiwicmVzb2x2ZUJpbmFyeVBhdGgiLCJsb2ciLCJyZW5kZXJTdGF0aWNTaXRlIiwicHJvY2Vzc1RyYW5zbGF0aW9ucyIsImNvbXByZXNzTGV4V2ViQXNzZXRzIiwiY29weUxleFdlYkFzc2V0cyIsIm9wdGltaXplTGV4V2ViQXNzZXRzIiwiY3JlYXRlTGV4Vml0ZUNvbmZpZyIsImFpRnVuY3Rpb24iLCJib3hlbiIsImNoYWxrIiwiZGlzcGxheUJ1aWxkU3RhdHVzIiwiYnVuZGxlciIsIm91dHB1dFBhdGgiLCJxdWlldCIsInN0YXRzIiwic3RhdHNJbmZvIiwibW9kdWxlcyIsImFzc2V0cyIsImdyZWVuIiwiY3lhbiIsInNpemUiLCJzdGF0dXNCb3giLCJib2xkIiwidW5kZXJsaW5lIiwieWVsbG93IiwicGFkZGluZyIsIm1hcmdpbiIsImJvcmRlclN0eWxlIiwiYm9yZGVyQ29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJjb25zb2xlIiwiYnVpbGRXaXRoU1dDIiwic3Bpbm5lciIsImNvbW1hbmRPcHRpb25zIiwiY2FsbGJhY2siLCJjbGlOYW1lIiwiZm9ybWF0Iiwic291cmNlUGF0aCIsIndhdGNoIiwib3V0cHV0RnVsbFBhdGgiLCJzb3VyY2VGdWxsUGF0aCIsInN3YyIsInN3Y0NvbmZpZyIsInRhcmdldEVudmlyb25tZW50IiwidXNlR3JhcGhRbCIsInVzZVR5cGVzY3JpcHQiLCJjb25maWciLCJzb3VyY2VEaXIiLCJwcm9jZXNzIiwiY3dkIiwiZ2xvYk9wdGlvbnMiLCJhYnNvbHV0ZSIsImRvdCIsIm5vZGlyIiwibm9zb3J0IiwidHNGaWxlcyIsImpzRmlsZXMiLCJzb3VyY2VGaWxlcyIsIm91dHB1dERpciIsInN0YXJ0IiwidHJhbnNmb3JtUHJvbWlzZXMiLCJtYXAiLCJmaWxlIiwiZmlsZVJlbGF0aXZlVG9Tb3VyY2UiLCJvdXRwdXRGaWxlIiwicmVwbGFjZSIsIm91dHB1dERpclBhdGgiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJzb3VyY2VDb2RlIiwic3djT3B0aW9ucyIsImZpbGVuYW1lIiwibW9kdWxlIiwidHlwZSIsInJlc3VsdCIsIndyaXRlRmlsZVN5bmMiLCJjb2RlIiwiUHJvbWlzZSIsImFsbCIsInN1Y2NlZWQiLCJlcnJvciIsIm1lc3NhZ2UiLCJFcnJvciIsInN0YWNrIiwiZmFpbCIsImJ1aWxkV2l0aFZpdGUiLCJjbWQiLCJhbmFseXplIiwiYXNzaXN0IiwiZW50cnkiLCJtb2RlIiwic3RhdGljIiwiaXNTdGF0aWMiLCJlbnRyeVZhbHVlIiwiQXJyYXkiLCJpc0FycmF5IiwiY29tbWFuZCIsInNlcnZlciIsInNzciIsIm1pZGRsZXdhcmVNb2RlIiwiZW50cnlQYXRoIiwiZW50cnlKcyIsInNzckxvYWRNb2R1bGUiLCJyZW5kZXIiLCJkZWZhdWx0IiwicmVkdWNlIiwiZmlsZU5hbWUiLCJjbG9zZSIsImJ1aWxkRXJyb3IiLCJTdHJpbmciLCJwcm9tcHQiLCJ0YXNrIiwiY29udGV4dCIsImFpRXJyb3IiLCJyZXF1ZXN0ZWRCdW5kbGVyIiwicmVtb3ZlIiwidGVzdCIsInRyYW5zbGF0aW9ucyIsInZhcmlhYmxlcyIsInBhcnNlQ29uZmlnIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJKU09OIiwicGFyc2UiLCJlbnYiLCJ0cmFuc2xhdGlvbkVycm9yIiwiYnVpbGRSZXN1bHQiLCJzdGF0dXMiLCJlbnRyeVBvaW50cyIsInN0cmluZ2lmeSIsInR5cGVzY3JpcHRQYXRoIiwidHN4RmlsZXMiLCJhbGxTb3VyY2VGaWxlcyIsInR5cGVzY3JpcHRPcHRpb25zIiwiZ2V0VHlwZVNjcmlwdERlY2xhcmF0aW9uRmxhZ3MiLCJlbmNvZGluZyIsInJlamVjdCIsImV4aXRDb2RlIiwiaGFzRGVjbGFyYXRpb25zIiwiaW5jbHVkZXMiLCJlcnJvck91dHB1dCIsInN0ZGVyciIsInN0ZG91dCIsInNsaWNlIiwiam9pbiIsImVycm9yTGluZXMiLCJzcGxpdCIsImZpbHRlciIsImxpbmUiLCJ0cmltIiwic3RhcnRzV2l0aCIsImxlbmd0aCIsImZvckVhY2giLCJjb3B5RXJyb3IiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLFNBQVMsUUFBTyxZQUFZO0FBQ3BDLFNBQVFDLEtBQUssUUFBTyxRQUFRO0FBQzVCLFNBQVFDLFVBQVUsRUFBRUMsWUFBWSxRQUFPLEtBQUs7QUFDNUMsU0FBUUMsUUFBUUMsUUFBUSxRQUFPLE9BQU87QUFDdEMsU0FBUUMsU0FBU0MsU0FBUyxFQUFFQyxnQkFBZ0JDLGdCQUFnQixRQUFPLE9BQU87QUFDMUUsU0FDRUMsT0FBTyxFQUNQQyxZQUFZQyxZQUFZLEVBQ3hCQyxXQUFXQyxXQUFXLFFBQ2pCLE9BQU87QUFFZCxTQUFRQyxTQUFTLFFBQU8scUJBQXFCO0FBQzdDLFNBQVFDLGtCQUFrQixFQUFFQyxtQkFBbUIsRUFBRUMsYUFBYSxFQUFFQyxXQUFXLFFBQU8scUJBQXFCO0FBQ3ZHLFNBQ0VDLGlCQUFpQixRQUNaLHNCQUFzQjtBQUM3QixTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBQ3ZDLFNBQVFDLGdCQUFnQixRQUFPLDRCQUE0QjtBQUMzRCxTQUFRQyxtQkFBbUIsUUFBTyw4QkFBOEI7QUFDaEUsU0FBUUMsb0JBQW9CLEVBQUVDLGdCQUFnQixFQUFFQyxvQkFBb0IsUUFBTyw2QkFBNkI7QUFDeEcsU0FBUUMsbUJBQW1CLFFBQU8sNkJBQTZCO0FBQy9ELFNBQVFDLFVBQVUsUUFBTyxjQUFjO0FBQ3ZDLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxXQUFXLFFBQVE7QUEwQjFCLE1BQU1DLHFCQUFxQixDQUFDQyxTQUFpQkMsWUFBb0JDLE9BQWdCQztJQUMvRSxJQUFHRCxPQUFPO0lBRVYsSUFBSUUsWUFBWTtJQUNoQixJQUFHRCxTQUFTQSxNQUFNRSxPQUFPLElBQUlGLE1BQU1HLE1BQU0sRUFBRTtRQUN6Q0YsWUFBWSxDQUFDLEVBQUUsRUFBRU4sTUFBTVMsS0FBSyxDQUFDLFlBQVksSUFBSSxFQUFFVCxNQUFNVSxJQUFJLENBQUNMLE1BQU1FLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FDMUUsR0FBR1AsTUFBTVMsS0FBSyxDQUFDLFdBQVcsS0FBSyxFQUFFVCxNQUFNVSxJQUFJLENBQUNMLE1BQU1HLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FDN0QsR0FBR1IsTUFBTVMsS0FBSyxDQUFDLFNBQVMsT0FBTyxFQUFFVCxNQUFNVSxJQUFJLENBQUNMLE1BQU1NLElBQUksRUFBRSxFQUFFLENBQUM7SUFDL0Q7SUFFQSxNQUFNQyxZQUFZYixNQUNoQixHQUFHQyxNQUFNVSxJQUFJLENBQUNHLElBQUksQ0FBQyxzQ0FBc0MsSUFBSSxDQUFDLEdBQzlELEdBQUdiLE1BQU1TLEtBQUssQ0FBQyxZQUFZLElBQUksRUFBRVQsTUFBTVUsSUFBSSxDQUFDUixTQUFTLEVBQUUsQ0FBQyxHQUN4RCxHQUFHRixNQUFNUyxLQUFLLENBQUMsV0FBVyxLQUFLLEVBQUVULE1BQU1jLFNBQVMsQ0FBQ1gsY0FBY0csVUFBVSxFQUFFLENBQUMsR0FDNUUsR0FBR04sTUFBTWUsTUFBTSxDQUFDLDZCQUE2QixFQUM3QztRQUNFQyxTQUFTO1FBQ1RDLFFBQVE7UUFDUkMsYUFBYTtRQUNiQyxhQUFhO1FBQ2JDLGlCQUFpQjtJQUNuQjtJQUdGQyxRQUFROUIsR0FBRyxDQUFDLE9BQU9xQixZQUFZO0FBQ2pDO0FBRUEsT0FBTyxNQUFNVSxlQUFlLE9BQU9DLFNBQWtCQyxnQkFBOEJDO0lBQ2pGLE1BQU0sRUFDSkMsVUFBVSxLQUFLLEVBQ2ZDLFNBQVMsS0FBSyxFQUNkeEIsVUFBVSxFQUNWQyxLQUFLLEVBQ0x3QixVQUFVLEVBQ1ZDLEtBQUssRUFDTixHQUFHTDtJQUNKLE1BQU0sRUFDSk0sY0FBYyxFQUNkQyxjQUFjLEVBQ2RDLEtBQUtDLFNBQVMsRUFDZEMsaUJBQWlCLEVBQ2pCQyxVQUFVLEVBQ1ZDLGFBQWEsRUFDZCxHQUFHbkQsVUFBVW9ELE1BQU07SUFDcEIsTUFBTUMsWUFBb0JWLGFBQWE1QyxZQUFZdUQsUUFBUUMsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFWixZQUFZLElBQUlHLGtCQUFrQjtJQUV6RyxNQUFNVSxjQUFjO1FBQ2xCQyxVQUFVO1FBQ1ZGLEtBQUtGO1FBQ0xLLEtBQUs7UUFDTEMsT0FBTztRQUNQQyxRQUFRO0lBQ1Y7SUFDQSxNQUFNQyxVQUFvQnZFLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFFa0U7SUFDOUQsTUFBTU0sVUFBb0J4RSxTQUFTLENBQUMsc0JBQXNCLENBQUMsRUFBRWtFO0lBQzdELE1BQU1PLGNBQXdCO1dBQUlGO1dBQVlDO0tBQVE7SUFFdEQsTUFBTUUsWUFBb0I5QyxhQUN0Qm5CLFlBQVl1RCxRQUFRQyxHQUFHLElBQUlyQyxjQUMxQjJCLGtCQUFrQjlDLFlBQVl1RCxRQUFRQyxHQUFHLElBQUk7SUFFbEQsSUFBSTtRQUNGakIsUUFBUTJCLEtBQUssQ0FBQztRQUVkLE1BQU1DLG9CQUFvQkgsWUFBWUksR0FBRyxDQUFDLE9BQU9DO1lBQy9DLE1BQU1DLHVCQUF1QnhFLGFBQWF3RCxXQUFXZTtZQUNyRCxNQUFNekIsYUFBYXlCLE1BQU0sMkJBQTJCO1lBQ3BELE1BQU1FLGFBQWFELHFCQUFxQkUsT0FBTyxDQUFDLGVBQWU7WUFDL0QsTUFBTXJELGFBQWFuQixZQUFZaUUsV0FBV007WUFDMUMsTUFBTUUsZ0JBQWdCN0UsUUFBUXVCO1lBRTlCLElBQUcsQ0FBQy9CLFdBQVdxRixnQkFBZ0I7Z0JBQzdCLE1BQU0sRUFBQ0MsU0FBUyxFQUFDLEdBQUcsTUFBTSxNQUFNLENBQUM7Z0JBQ2pDQSxVQUFVRCxlQUFlO29CQUFDRSxXQUFXO2dCQUFJO1lBQzNDO1lBRUEsTUFBTUMsYUFBYXZGLGFBQWF1RCxZQUFZO1lBQzVDLE1BQU1pQyxhQUFhO2dCQUNqQixHQUFHNUIsU0FBUztnQkFDWjZCLFVBQVVUO2dCQUNWVSxRQUFRO29CQUNOQyxNQUFNckMsV0FBVyxRQUFRLGFBQXVCTSxXQUFXOEIsUUFBUUMsUUFBaUI7b0JBQ3BGLEdBQUcvQixXQUFXOEIsTUFBTTtnQkFDdEI7WUFDRjtZQUVBLE1BQU1FLFNBQVMsTUFBTS9GLFVBQVUwRixZQUFZQztZQUUzQyxNQUFNLEVBQUNLLGFBQWEsRUFBQyxHQUFHLE1BQU0sTUFBTSxDQUFDO1lBQ3JDQSxjQUFjL0QsWUFBWThELE9BQU9FLElBQUk7UUFDdkM7UUFFQSxNQUFNQyxRQUFRQyxHQUFHLENBQUNsQjtRQUVsQjVCLFFBQVErQyxPQUFPLENBQUM7UUFDaEJyRSxtQkFBbUIsT0FBT2dELFdBQVc3QyxTQUFTO1FBQzlDcUIsU0FBUztRQUNULE9BQU87SUFDVCxFQUFFLE9BQU04QyxPQUFPO1FBQ2JoRixJQUFJLENBQUMsRUFBRSxFQUFFaUMsZUFBZUUsT0FBTyxJQUFJLE1BQU0sd0JBQXdCLENBQUMsRUFBRSxTQUFTdEI7UUFDN0ViLElBQUksQ0FBQyxTQUFTLEVBQUVnRixNQUFNQyxPQUFPLEVBQUUsRUFBRSxTQUFTcEU7UUFFMUMsSUFBR21FLGlCQUFpQkUsT0FBTztZQUN6QixJQUFHRixNQUFNRyxLQUFLLEVBQUU7Z0JBQ2RuRixJQUFJLENBQUMsZ0JBQWdCLEVBQUVnRixNQUFNRyxLQUFLLEVBQUUsRUFBRSxTQUFTdEU7WUFDakQ7WUFFQSxJQUFHLGNBQWNtRSxTQUFTLFVBQVVBLE9BQU87Z0JBQ3pDaEYsSUFBSSxDQUFDLFFBQVEsRUFBRSxBQUFDZ0YsTUFBY1QsUUFBUSxJQUFJLEFBQUNTLE1BQWNsQixJQUFJLEVBQUUsRUFBRSxTQUFTakQ7WUFDNUU7UUFDRjtRQUVBbUIsUUFBUW9ELElBQUksQ0FBQztRQUNiLElBQUcsQ0FBQ3ZFLE9BQU87WUFDVGlCLFFBQVFrRCxLQUFLLENBQUMseUJBQXlCQTtRQUN6QztRQUNBOUMsU0FBUztRQUNULE9BQU87SUFDVDtBQUNGLEVBQUU7QUFFRixPQUFPLE1BQU1tRCxnQkFBZ0IsT0FBT3JELFNBQWtCc0QsS0FBbUJwRDtJQUN2RSxNQUFNLEVBQUNxRCxPQUFPLEVBQUVDLE1BQU0sRUFBRUMsS0FBSyxFQUFFQyxPQUFPLFlBQVksRUFBRTdFLFFBQVEsS0FBSyxFQUFFOEUsUUFBUUMsV0FBVyxLQUFLLEVBQUMsR0FBR047SUFDL0YsTUFBTU8sYUFBYUMsTUFBTUMsT0FBTyxDQUFDTixTQUFTQSxLQUFLLENBQUMsRUFBRSxHQUFHQTtJQUNyRCxNQUFNN0UsYUFBYWxCLFVBQVVvRCxNQUFNLENBQUNQLGNBQWMsSUFBSTlDLFlBQVl1RCxRQUFRQyxHQUFHLElBQUk7SUFFakYsSUFBSTtRQUNGakIsUUFBUTJCLEtBQUssQ0FBQztRQUNkLE1BQU16RSxVQUFVb0Isb0JBQW9CO1lBQUNpRjtZQUFTUyxTQUFTO1lBQVNQLE9BQU9JO1lBQVlIO1lBQU03RTtRQUFLO1FBQzlGLE1BQU1ULGlCQUFpQlYsVUFBVW9ELE1BQU07UUFDdkMsTUFBTXpDLHFCQUFxQlgsVUFBVW9ELE1BQU07UUFFM0MsSUFBRzhDLFVBQVU7WUFDWCxNQUFNSyxTQUFTLE1BQU03RyxpQkFBaUI7Z0JBQ3BDLEdBQUdrQixvQkFBb0I7b0JBQUMwRixTQUFTO29CQUFTUCxPQUFPSTtvQkFBWUg7b0JBQU03RTtvQkFBT3FGLEtBQUs7Z0JBQUksRUFBRTtnQkFDckZELFFBQVE7b0JBQUNFLGdCQUFnQjtnQkFBSTtZQUMvQjtZQUNBLElBQUk7Z0JBQ0YsTUFBTTlELGFBQWEzQyxVQUFVb0QsTUFBTSxDQUFDTixjQUFjLElBQUkvQyxZQUFZdUQsUUFBUUMsR0FBRyxJQUFJO2dCQUNqRixNQUFNbUQsWUFBWTNHLFlBQVk0QyxZQUFZd0QsY0FBY25HLFVBQVVvRCxNQUFNLENBQUN1RCxPQUFPLElBQUk7Z0JBQ3BGLE1BQU03QixTQUFTLE1BQU15QixPQUFPSyxhQUFhLENBQUNGO2dCQUMxQyxNQUFNRyxTQUFTL0IsT0FBT2dDLE9BQU8sSUFBSWhDLE9BQU8rQixNQUFNO2dCQUM5QyxJQUFHLE9BQU9BLFdBQVcsWUFBWSxNQUFNLElBQUlyQixNQUFNLENBQUMsY0FBYyxFQUFFa0IsVUFBVSxnQ0FBZ0MsQ0FBQztnQkFFN0csTUFBTW5GLFNBQVNqQyxTQUFTLFFBQVE7b0JBQUNpRSxLQUFLckM7b0JBQVl5QyxPQUFPO2dCQUFJLEdBQUdvRCxNQUFNLENBQXlCLENBQUMvQixRQUFRZ0M7b0JBQ3RHaEMsTUFBTSxDQUFDZ0MsU0FBUyxHQUFHLENBQUMsQ0FBQyxFQUFFQSxVQUFVO29CQUNqQyxPQUFPaEM7Z0JBQ1QsR0FBRyxDQUFDO2dCQUNKLE1BQU16RSxpQkFBaUI7b0JBQUNnQjtvQkFBUUw7b0JBQVkyRjtnQkFBTTtZQUNwRCxTQUFVO2dCQUNSLE1BQU1OLE9BQU9VLEtBQUs7WUFDcEI7UUFDRjtRQUVBeEcscUJBQXFCVCxVQUFVb0QsTUFBTTtRQUNyQ2QsUUFBUStDLE9BQU8sQ0FBQztRQUNoQnJFLG1CQUFtQixRQUFRRSxZQUFZQztRQUN2Q3FCLFNBQVM7UUFDVCxPQUFPO0lBQ1QsRUFBRSxPQUFNOEMsT0FBTztRQUNiLE1BQU00QixhQUFhNUIsaUJBQWlCRSxRQUFRRixRQUFRLElBQUlFLE1BQU0yQixPQUFPN0I7UUFDckVoRixJQUFJLENBQUMsRUFBRSxFQUFFc0YsSUFBSW5ELE9BQU8sSUFBSSxNQUFNLHlCQUF5QixDQUFDLEVBQUUsU0FBU3RCO1FBQ25FYixJQUFJLENBQUMsU0FBUyxFQUFFNEcsV0FBVzNCLE9BQU8sRUFBRSxFQUFFLFNBQVNwRTtRQUMvQ21CLFFBQVFvRCxJQUFJLENBQUM7UUFFYixJQUFHSSxRQUFRO1lBQ1QsSUFBSTtnQkFDRixNQUFNakYsV0FBVztvQkFBQ3VHLFFBQVEsQ0FBQywyQkFBMkIsRUFBRUYsV0FBVzNCLE9BQU8sQ0FBQyxJQUFJLEVBQUUyQixXQUFXekIsS0FBSyxJQUFJLElBQUk7b0JBQUU0QixNQUFNO29CQUFRQyxTQUFTO29CQUFNbkc7Z0JBQUs7WUFDL0ksRUFBRSxPQUFNb0csU0FBUztnQkFDZixJQUFHLENBQUNwRyxPQUFPaUIsUUFBUWtELEtBQUssQ0FBQyx3QkFBd0JpQztZQUNuRDtRQUNGO1FBRUEvRSxTQUFTO1FBQ1QsT0FBTztJQUNUO0FBQ0YsRUFBRTtBQUVGLE9BQU8sTUFBTWpELFFBQVEsT0FBT3FHLEtBQW1CcEQsV0FBMEIsSUFBTyxDQUFBLENBQUMsQ0FBQSxDQUFFO0lBQ2pGLE1BQU0sRUFDSnZCLFNBQVN1RyxnQkFBZ0IsRUFDekIvRSxVQUFVLEtBQUssRUFDZnRCLFFBQVEsS0FBSyxFQUNic0csU0FBUyxLQUFLLEVBQ2RDLE9BQU8sS0FBSyxFQUNaQyxlQUFlLEtBQUssRUFDcEJDLFlBQVksSUFBSSxFQUNqQixHQUFHaEM7SUFFSixNQUFNdEQsVUFBVW5DLGNBQWNnQjtJQUU5QmIsSUFBSSxHQUFHbUMsUUFBUSxZQUFZLENBQUMsRUFBRSxRQUFRdEI7SUFFdEMsTUFBTW5CLFVBQVU2SCxXQUFXLENBQUNqQztJQUU1QixNQUFNLEVBQUMvQyxjQUFjLEVBQUVNLGFBQWEsRUFBQyxHQUFHbkQsVUFBVW9ELE1BQU07SUFDeEQsTUFBTW5DLFVBQVV1RyxvQkFBcUJ4SCxDQUFBQSxVQUFVb0QsTUFBTSxDQUFDSCxpQkFBaUIsS0FBSyxRQUFRLFNBQVMsS0FBSTtJQUVqR2hEO0lBRUEsSUFBSTZILGVBQXVCO1FBQUNDLFVBQVU7SUFBWTtJQUVsRCxJQUFHSCxXQUFXO1FBQ1osSUFBSTtZQUNGRSxlQUFlRSxLQUFLQyxLQUFLLENBQUNMO1FBQzVCLEVBQUUsT0FBTXRDLE9BQU87WUFDYmhGLElBQUksQ0FBQyxFQUFFLEVBQUVtQyxRQUFRLGdFQUFnRSxDQUFDLEVBQUUsU0FBU3RCO1lBRTdGcUIsU0FBUztZQUNULE9BQU87UUFDVDtJQUNGO0lBRUFjLFFBQVE0RSxHQUFHLEdBQUc7UUFBQyxHQUFHNUUsUUFBUTRFLEdBQUc7UUFBRSxHQUFHSixZQUFZO0lBQUE7SUFFOUMsSUFBR0osTUFBTTtRQUNQcEgsSUFBSSxnREFBZ0QsUUFBUWE7UUFDNURxQixTQUFTO1FBQ1QsT0FBTztJQUNUO0lBRUEsSUFBR21GLGNBQWM7UUFDZnJGLFFBQVEyQixLQUFLLENBQUM7UUFFZCxJQUFJO1lBQ0YsTUFBTXRCLGFBQWEzQyxVQUFVb0QsTUFBTSxDQUFDTixjQUFjLElBQUlRLFFBQVFDLEdBQUc7WUFDakUsTUFBTXJDLGFBQWFsQixVQUFVb0QsTUFBTSxDQUFDUCxjQUFjLElBQUk7WUFFdEQsTUFBTXJDLG9CQUFvQm1DLFlBQVl6QixZQUFZQztZQUNsRG1CLFFBQVErQyxPQUFPLENBQUM7UUFDbEIsRUFBRSxPQUFNOEMsa0JBQWtCO1lBQ3hCN0gsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEsd0NBQXdDLEVBQUUwRixpQkFBaUI1QyxPQUFPLEVBQUUsRUFBRSxTQUFTcEU7WUFDaEdtQixRQUFRb0QsSUFBSSxDQUFDO1lBQ2JsRCxTQUFTO1lBQ1QsT0FBTztRQUNUO0lBQ0Y7SUFFQUYsUUFBUTJCLEtBQUssQ0FBQztJQUVkLElBQUd3RCxRQUFRO1FBQ1QsTUFBTXJILFlBQVl5QyxrQkFBa0I7SUFDdEM7SUFFQSxJQUFJdUYsY0FBYztJQUVsQixJQUFHbkgsWUFBWSxPQUFPO1FBQ3BCbUgsY0FBYyxNQUFNL0YsYUFBYUMsU0FBU3NELEtBQUssQ0FBQ3lDO1lBQzlDRCxjQUFjQztRQUNoQjtJQUNGLE9BQU87UUFDTEQsY0FBYyxNQUFNekMsY0FBY3JELFNBQVNzRCxLQUFLLENBQUN5QztZQUMvQ0QsY0FBY0M7UUFDaEI7SUFDRjtJQUVBLElBQUdELGdCQUFnQixLQUFLeEMsSUFBSUMsT0FBTyxFQUFFO1FBQ25DdkQsUUFBUTJCLEtBQUssQ0FBQztRQUVkLElBQUk7WUFDRixNQUFNN0MsUUFBUTtnQkFDWkYsWUFBWWxCLFVBQVVvRCxNQUFNLENBQUNQLGNBQWM7Z0JBQzNDeUYsYUFBYXJILFlBQVksUUFDckIsQ0FBQyxjQUFjLEVBQUVqQixVQUFVb0QsTUFBTSxDQUFDTixjQUFjLENBQUMsYUFBYSxDQUFDLEdBQy9EOUMsVUFBVW9ELE1BQU0sQ0FBQ3VELE9BQU8sSUFBSTtZQUNsQztZQUVBLE1BQU05RixXQUFXO2dCQUNmdUcsUUFBUSxDQUFDOztZQUVMLEVBQUVuRyxRQUFRO1FBQ2QsRUFBRTJFLElBQUlsRCxNQUFNLElBQUksVUFBVTthQUNyQixFQUFFMUMsVUFBVW9ELE1BQU0sQ0FBQ0gsaUJBQWlCLENBQUM7QUFDbEQsRUFBRStFLEtBQUtPLFNBQVMsQ0FBQ25ILE9BQU8sTUFBTSxHQUFHOzs7Ozs7OzJCQU9OLENBQUM7Z0JBQ3BCaUcsTUFBTTtnQkFDTkMsU0FBUztnQkFDVG5HO1lBQ0Y7WUFFQW1CLFFBQVErQyxPQUFPLENBQUM7UUFDbEIsRUFBRSxPQUFNa0MsU0FBUztZQUNmakYsUUFBUW9ELElBQUksQ0FBQztZQUNiLElBQUcsQ0FBQ3ZFLE9BQU87Z0JBQ1RpQixRQUFRa0QsS0FBSyxDQUFDLHNCQUFzQmlDO1lBQ3RDO1FBQ0Y7SUFDRjtJQUVBLElBQUdhLGdCQUFnQixHQUFHO1FBQ3BCLElBQUk7WUFDRixJQUFHakYsaUJBQWlCbEMsWUFBWSxPQUFPO2dCQUNyQyxNQUFNdUgsaUJBQWlCbkksa0JBQWtCLE9BQU87Z0JBRWhELElBQUdtSSxnQkFBZ0I7b0JBQ2pCbEcsUUFBUTJCLEtBQUssQ0FBQztvQkFDZCxJQUFJO3dCQUNGLE1BQU1uQixpQkFBaUI5QyxVQUFVb0QsTUFBTSxDQUFDTixjQUFjLElBQUkvQyxZQUFZdUQsUUFBUUMsR0FBRyxJQUFJO3dCQUNyRixNQUFNVixpQkFBaUI3QyxVQUFVb0QsTUFBTSxDQUFDUCxjQUFjLElBQUk5QyxZQUFZdUQsUUFBUUMsR0FBRyxJQUFJO3dCQUNyRixNQUFNQyxjQUFjOzRCQUNsQkQsS0FBS1Q7NEJBQ0xZLEtBQUs7NEJBQ0xDLE9BQU87NEJBQ1BGLFVBQVU7d0JBQ1o7d0JBQ0EsTUFBTUksVUFBVXZFLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFFa0U7d0JBQ3ZFLE1BQU1pRixXQUFXbkosU0FBUyxDQUFDLDJDQUEyQyxDQUFDLEVBQUVrRTt3QkFDekUsTUFBTWtGLGlCQUFpQjsrQkFBSTdFOytCQUFZNEU7eUJBQVM7d0JBQ2hELE1BQU1FLG9CQUFvQjsrQkFDckIzSSxVQUFVNEksNkJBQTZCOytCQUN2Q0Y7eUJBQ0o7d0JBQ0QsTUFBTTFELFNBQVMsTUFBTTlGLE1BQU1zSixnQkFBZ0JHLG1CQUFtQjs0QkFDNURFLFVBQVU7NEJBQ1Z0RixLQUFLRCxRQUFRQyxHQUFHOzRCQUNoQnVGLFFBQVE7NEJBQ1IxRCxLQUFLO3dCQUNQO3dCQUVBLElBQUdKLE9BQU8rRCxRQUFRLEtBQUssR0FBRzs0QkFDeEIsTUFBTUMsa0JBQWtCaEUsT0FBT0ksR0FBRyxFQUFFNkQsU0FBUyxjQUFjakUsT0FBT0ksR0FBRyxFQUFFNkQsU0FBUyxrQkFBa0I7NEJBQ2xHLE1BQU1DLGNBQWNsRSxPQUFPbUUsTUFBTSxJQUFJbkUsT0FBT29FLE1BQU0sSUFBSXBFLE9BQU9JLEdBQUcsSUFBSTs0QkFFcEUsSUFBRyxDQUFDNEQsaUJBQWlCO2dDQUNuQjFJLElBQUksQ0FBQyxFQUFFLEVBQUVtQyxRQUFRLGdEQUFnRCxDQUFDLEVBQUUsU0FBU3RCO2dDQUM3RWIsSUFBSSxDQUFDLGFBQWEsRUFBRTBFLE9BQU8rRCxRQUFRLEVBQUUsRUFBRSxTQUFTNUg7Z0NBQ2hEYixJQUFJLENBQUMsc0JBQXNCLEVBQUVrSSxlQUFlLENBQUMsRUFBRUcsa0JBQWtCVSxLQUFLLENBQUMsR0FBRyxJQUFJQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxTQUFTbkk7Z0NBQ3ZHYixJQUFJLENBQUMsaUJBQWlCLEVBQUU0SSxhQUFhLEVBQUUsU0FBUy9IO2dDQUVoRCxNQUFNb0ksYUFBYUwsWUFBWU0sS0FBSyxDQUFDLE1BQU1DLE1BQU0sQ0FBQ0MsQ0FBQUEsT0FDaERBLEtBQUtULFFBQVEsQ0FBQyxlQUNkUyxLQUFLVCxRQUFRLENBQUMsYUFDZFMsS0FBS0MsSUFBSSxHQUFHQyxVQUFVLENBQUMsV0FDdkJGLEtBQUtDLElBQUksR0FBR0MsVUFBVSxDQUFDO2dDQUd6QixJQUFHTCxXQUFXTSxNQUFNLEdBQUcsR0FBRztvQ0FDeEJ2SixJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsU0FBU2E7b0NBQzlCb0ksV0FBV0YsS0FBSyxDQUFDLEdBQUcsSUFBSVMsT0FBTyxDQUFDSixDQUFBQTt3Q0FDOUJwSixJQUFJLENBQUMsRUFBRSxFQUFFb0osTUFBTSxFQUFFLFNBQVN2STtvQ0FDNUI7b0NBQ0EsSUFBR29JLFdBQVdNLE1BQU0sR0FBRyxJQUFJO3dDQUN6QnZKLElBQUksQ0FBQyxVQUFVLEVBQUVpSixXQUFXTSxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsRUFBRSxTQUFTMUk7b0NBQ2xFO2dDQUNGO2dDQUVBbUIsUUFBUW9ELElBQUksQ0FBQzs0QkFDZixPQUFPO2dDQUNMcEYsSUFBSSxDQUFDLEVBQUUsRUFBRW1DLFFBQVEsaUVBQWlFLENBQUMsRUFBRSxRQUFRdEI7Z0NBQzdGLElBQUcsQ0FBQ0EsU0FBUytILGFBQWE7b0NBQ3hCNUksSUFBSSxDQUFDLGFBQWEsRUFBRTRJLGFBQWEsRUFBRSxRQUFRL0g7Z0NBQzdDO2dDQUNBbUIsUUFBUStDLE9BQU8sQ0FBQzs0QkFDbEI7d0JBQ0YsT0FBTzs0QkFDTC9DLFFBQVErQyxPQUFPLENBQUM7d0JBQ2xCO29CQUNGLEVBQUUsT0FBTUMsT0FBTzt3QkFDYmhGLElBQUksQ0FBQyxFQUFFLEVBQUVtQyxRQUFRLG1EQUFtRCxDQUFDLEVBQUUsU0FBU3RCO3dCQUNoRmIsSUFBSSxDQUFDLFNBQVMsRUFBRWdGLE1BQU1DLE9BQU8sRUFBRSxFQUFFLFNBQVNwRTt3QkFDMUMsSUFBR21FLGlCQUFpQkUsU0FBU0YsTUFBTUcsS0FBSyxFQUFFOzRCQUN4Q25GLElBQUksQ0FBQyxVQUFVLEVBQUVnRixNQUFNRyxLQUFLLEVBQUUsRUFBRSxTQUFTdEU7d0JBQzNDO3dCQUNBbUIsUUFBUW9ELElBQUksQ0FBQztvQkFDZjtnQkFDRjtZQUNGO1lBRUEsTUFBTXhGLG9CQUFvQm9DLFNBQVN0QyxVQUFVb0QsTUFBTSxFQUFFakM7UUFDdkQsRUFBRSxPQUFNNEksV0FBVztZQUNqQnpKLElBQUksQ0FBQyxFQUFFLEVBQUVtQyxRQUFRLHlDQUF5QyxFQUFFc0gsVUFBVXhFLE9BQU8sRUFBRSxFQUFFLFNBQVNwRTtZQUMxRnFCLFNBQVM7WUFDVCxPQUFPO1FBQ1Q7SUFDRjtJQUVBQSxTQUFTNEY7SUFDVCxPQUFPQTtBQUNULEVBQUU7QUFFRixlQUFlN0ksTUFBTSJ9
@@ -7,15 +7,16 @@ import { relative as pathRelative } from 'path';
7
7
  import { LexConfig } from '../../LexConfig.js';
8
8
  import { createSpinner } from '../../utils/app.js';
9
9
  import { log } from '../../utils/log.js';
10
+ import { createLexViteConfig } from '../../utils/vite/config.js';
10
11
  export const config = async (type, cmd, callback = ()=>({}))=>{
11
12
  const { cliName = 'Lex', json, quiet } = cmd;
12
13
  const validTypes = [
13
14
  'app',
14
- 'vitest',
15
- 'webpack'
15
+ 'vite',
16
+ 'vitest'
16
17
  ];
17
18
  if (!validTypes.includes(type)) {
18
- log(`\n${cliName} Error: Option for ${type} not found. Configurations only available for app, vitest, and webpack.`, 'error', quiet);
19
+ log(`\n${cliName} Error: Option for ${type} not found. Configurations only available for app, Vite, and Vitest.`, 'error', quiet);
19
20
  callback(1);
20
21
  return Promise.resolve(1);
21
22
  }
@@ -32,10 +33,11 @@ export const config = async (type, cmd, callback = ()=>({}))=>{
32
33
  configOptions = vistestConfig.default;
33
34
  break;
34
35
  }
35
- case 'webpack':
36
+ case 'vite':
36
37
  {
37
- const webpackConfig = await import('../../../webpack.config.js');
38
- configOptions = webpackConfig.default;
38
+ configOptions = createLexViteConfig({
39
+ command: 'build'
40
+ });
39
41
  break;
40
42
  }
41
43
  }
@@ -50,4 +52,4 @@ export const config = async (type, cmd, callback = ()=>({}))=>{
50
52
  return Promise.resolve(0);
51
53
  };
52
54
 
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jb25maWcvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3dyaXRlRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCBzdGFydENhc2UgZnJvbSAnbG9kYXNoL3N0YXJ0Q2FzZS5qcyc7XG5pbXBvcnQge3JlbGF0aXZlIGFzIHBhdGhSZWxhdGl2ZX0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uZmlnT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGpzb24/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHF1aWV0PzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgQ29uZmlnQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBjb25maWcgPSBhc3luYyAoXG4gIHR5cGU6IHN0cmluZyxcbiAgY21kOiBDb25maWdPcHRpb25zLFxuICBjYWxsYmFjazogQ29uZmlnQ2FsbGJhY2sgPSAoKSA9PiAoe30pXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBjb25zdCB7Y2xpTmFtZSA9ICdMZXgnLCBqc29uLCBxdWlldH0gPSBjbWQ7XG4gIGNvbnN0IHZhbGlkVHlwZXM6IHN0cmluZ1tdID0gWydhcHAnLCAndml0ZXN0JywgJ3dlYnBhY2snXTtcblxuICBpZighdmFsaWRUeXBlcy5pbmNsdWRlcyh0eXBlKSkge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogT3B0aW9uIGZvciAke3R5cGV9IG5vdCBmb3VuZC4gQ29uZmlndXJhdGlvbnMgb25seSBhdmFpbGFibGUgZm9yIGFwcCwgdml0ZXN0LCBhbmQgd2VicGFjay5gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgxKTtcbiAgfVxuXG4gIGxvZyhgJHtjbGlOYW1lfSBnZW5lcmF0aW5nIGNvbmZpZ3VyYXRpb24gZm9yICR7c3RhcnRDYXNlKHR5cGUpfS4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhjbWQpO1xuXG4gIGxldCBjb25maWdPcHRpb25zO1xuXG4gIHN3aXRjaCh0eXBlKSB7XG4gICAgY2FzZSAnYXBwJzpcbiAgICAgIGNvbmZpZ09wdGlvbnMgPSBMZXhDb25maWcuY29uZmlnO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndml0ZXN0Jzoge1xuICAgICAgY29uc3QgdmlzdGVzdENvbmZpZyA9IGF3YWl0IGltcG9ydCgnLi4vLi4vLi4vdml0ZXN0LmNvbmZpZy5tanMnKTtcbiAgICAgIGNvbmZpZ09wdGlvbnMgPSB2aXN0ZXN0Q29uZmlnLmRlZmF1bHQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnd2VicGFjayc6IHtcbiAgICAgIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBpbXBvcnQoJy4uLy4uLy4uL3dlYnBhY2suY29uZmlnLmpzJyk7XG4gICAgICBjb25maWdPcHRpb25zID0gd2VicGFja0NvbmZpZy5kZWZhdWx0O1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgY29uc3QganNvbk91dHB1dDogc3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoY29uZmlnT3B0aW9ucywgbnVsbCwgMik7XG5cbiAgaWYoanNvbikge1xuICAgIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICAgIHNwaW5uZXIuc3RhcnQoJ0NyZWF0aW5nIEpTT04gb3V0cHV0Li4uJyk7XG5cbiAgICB3cml0ZUZpbGVTeW5jKGpzb24sIGpzb25PdXRwdXQpO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKGBTdWNjZXNzZnVsbHkgc2F2ZWQgSlNPTiBvdXRwdXQgdG8gJHtwYXRoUmVsYXRpdmUocHJvY2Vzcy5jd2QoKSwganNvbil9YCk7XG4gIH1cblxuICBjYWxsYmFjaygwKTtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgwKTtcbn07XG4iXSwibmFtZXMiOlsid3JpdGVGaWxlU3luYyIsInN0YXJ0Q2FzZSIsInJlbGF0aXZlIiwicGF0aFJlbGF0aXZlIiwiTGV4Q29uZmlnIiwiY3JlYXRlU3Bpbm5lciIsImxvZyIsImNvbmZpZyIsInR5cGUiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJqc29uIiwicXVpZXQiLCJ2YWxpZFR5cGVzIiwiaW5jbHVkZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInBhcnNlQ29uZmlnIiwiY29uZmlnT3B0aW9ucyIsInZpc3Rlc3RDb25maWciLCJkZWZhdWx0Iiwid2VicGFja0NvbmZpZyIsImpzb25PdXRwdXQiLCJKU09OIiwic3RyaW5naWZ5Iiwic3Bpbm5lciIsInN0YXJ0Iiwic3VjY2VlZCIsInByb2Nlc3MiLCJjd2QiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLGFBQWEsUUFBTyxLQUFLO0FBQ2pDLE9BQU9DLGVBQWUsc0JBQXNCO0FBQzVDLFNBQVFDLFlBQVlDLFlBQVksUUFBTyxPQUFPO0FBRTlDLFNBQVFDLFNBQVMsUUFBTyxxQkFBcUI7QUFDN0MsU0FBUUMsYUFBYSxRQUFPLHFCQUFxQjtBQUNqRCxTQUFRQyxHQUFHLFFBQU8scUJBQXFCO0FBVXZDLE9BQU8sTUFBTUMsU0FBUyxPQUNwQkMsTUFDQUMsS0FDQUMsV0FBMkIsSUFBTyxDQUFBLENBQUMsQ0FBQSxDQUFFO0lBRXJDLE1BQU0sRUFBQ0MsVUFBVSxLQUFLLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFDLEdBQUdKO0lBQ3ZDLE1BQU1LLGFBQXVCO1FBQUM7UUFBTztRQUFVO0tBQVU7SUFFekQsSUFBRyxDQUFDQSxXQUFXQyxRQUFRLENBQUNQLE9BQU87UUFDN0JGLElBQUksQ0FBQyxFQUFFLEVBQUVLLFFBQVEsbUJBQW1CLEVBQUVILEtBQUssdUVBQXVFLENBQUMsRUFBRSxTQUFTSztRQUM5SEgsU0FBUztRQUNULE9BQU9NLFFBQVFDLE9BQU8sQ0FBQztJQUN6QjtJQUVBWCxJQUFJLEdBQUdLLFFBQVEsOEJBQThCLEVBQUVWLFVBQVVPLE1BQU0sR0FBRyxDQUFDLEVBQUUsUUFBUUs7SUFFN0UsTUFBTVQsVUFBVWMsV0FBVyxDQUFDVDtJQUU1QixJQUFJVTtJQUVKLE9BQU9YO1FBQ0wsS0FBSztZQUNIVyxnQkFBZ0JmLFVBQVVHLE1BQU07WUFDaEM7UUFDRixLQUFLO1lBQVU7Z0JBQ2IsTUFBTWEsZ0JBQWdCLE1BQU0sTUFBTSxDQUFDO2dCQUNuQ0QsZ0JBQWdCQyxjQUFjQyxPQUFPO2dCQUNyQztZQUNGO1FBQ0EsS0FBSztZQUFXO2dCQUNkLE1BQU1DLGdCQUFnQixNQUFNLE1BQU0sQ0FBQztnQkFDbkNILGdCQUFnQkcsY0FBY0QsT0FBTztnQkFDckM7WUFDRjtJQUNGO0lBRUEsTUFBTUUsYUFBcUJDLEtBQUtDLFNBQVMsQ0FBQ04sZUFBZSxNQUFNO0lBRS9ELElBQUdQLE1BQU07UUFDUCxNQUFNYyxVQUFVckIsY0FBY1E7UUFFOUJhLFFBQVFDLEtBQUssQ0FBQztRQUVkM0IsY0FBY1ksTUFBTVc7UUFFcEJHLFFBQVFFLE9BQU8sQ0FBQyxDQUFDLGtDQUFrQyxFQUFFekIsYUFBYTBCLFFBQVFDLEdBQUcsSUFBSWxCLE9BQU87SUFDMUY7SUFFQUYsU0FBUztJQUNULE9BQU9NLFFBQVFDLE9BQU8sQ0FBQztBQUN6QixFQUFFIn0=
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jb25maWcvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge3dyaXRlRmlsZVN5bmN9IGZyb20gJ2ZzJztcbmltcG9ydCBzdGFydENhc2UgZnJvbSAnbG9kYXNoL3N0YXJ0Q2FzZS5qcyc7XG5pbXBvcnQge3JlbGF0aXZlIGFzIHBhdGhSZWxhdGl2ZX0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7TGV4Q29uZmlnfSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5pbXBvcnQge2NyZWF0ZUxleFZpdGVDb25maWd9IGZyb20gJy4uLy4uL3V0aWxzL3ZpdGUvY29uZmlnLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBDb25maWdPcHRpb25zIHtcbiAgcmVhZG9ubHkgY2xpTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkganNvbj86IHN0cmluZztcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBDb25maWdDYWxsYmFjayA9IChzdGF0dXM6IG51bWJlcikgPT4gdm9pZDtcblxuZXhwb3J0IGNvbnN0IGNvbmZpZyA9IGFzeW5jIChcbiAgdHlwZTogc3RyaW5nLFxuICBjbWQ6IENvbmZpZ09wdGlvbnMsXG4gIGNhbGxiYWNrOiBDb25maWdDYWxsYmFjayA9ICgpID0+ICh7fSlcbik6IFByb21pc2U8bnVtYmVyPiA9PiB7XG4gIGNvbnN0IHtjbGlOYW1lID0gJ0xleCcsIGpzb24sIHF1aWV0fSA9IGNtZDtcbiAgY29uc3QgdmFsaWRUeXBlczogc3RyaW5nW10gPSBbJ2FwcCcsICd2aXRlJywgJ3ZpdGVzdCddO1xuXG4gIGlmKCF2YWxpZFR5cGVzLmluY2x1ZGVzKHR5cGUpKSB7XG4gICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBPcHRpb24gZm9yICR7dHlwZX0gbm90IGZvdW5kLiBDb25maWd1cmF0aW9ucyBvbmx5IGF2YWlsYWJsZSBmb3IgYXBwLCBWaXRlLCBhbmQgVml0ZXN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBjYWxsYmFjaygxKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKDEpO1xuICB9XG5cbiAgbG9nKGAke2NsaU5hbWV9IGdlbmVyYXRpbmcgY29uZmlndXJhdGlvbiBmb3IgJHtzdGFydENhc2UodHlwZSl9Li4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgbGV0IGNvbmZpZ09wdGlvbnM7XG5cbiAgc3dpdGNoKHR5cGUpIHtcbiAgICBjYXNlICdhcHAnOlxuICAgICAgY29uZmlnT3B0aW9ucyA9IExleENvbmZpZy5jb25maWc7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aXRlc3QnOiB7XG4gICAgICBjb25zdCB2aXN0ZXN0Q29uZmlnID0gYXdhaXQgaW1wb3J0KCcuLi8uLi8uLi92aXRlc3QuY29uZmlnLm1qcycpO1xuICAgICAgY29uZmlnT3B0aW9ucyA9IHZpc3Rlc3RDb25maWcuZGVmYXVsdDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICd2aXRlJzoge1xuICAgICAgY29uZmlnT3B0aW9ucyA9IGNyZWF0ZUxleFZpdGVDb25maWcoe2NvbW1hbmQ6ICdidWlsZCd9KTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGpzb25PdXRwdXQ6IHN0cmluZyA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZ09wdGlvbnMsIG51bGwsIDIpO1xuXG4gIGlmKGpzb24pIHtcbiAgICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgICBzcGlubmVyLnN0YXJ0KCdDcmVhdGluZyBKU09OIG91dHB1dC4uLicpO1xuXG4gICAgd3JpdGVGaWxlU3luYyhqc29uLCBqc29uT3V0cHV0KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZChgU3VjY2Vzc2Z1bGx5IHNhdmVkIEpTT04gb3V0cHV0IHRvICR7cGF0aFJlbGF0aXZlKHByb2Nlc3MuY3dkKCksIGpzb24pfWApO1xuICB9XG5cbiAgY2FsbGJhY2soMCk7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG59O1xuIl0sIm5hbWVzIjpbIndyaXRlRmlsZVN5bmMiLCJzdGFydENhc2UiLCJyZWxhdGl2ZSIsInBhdGhSZWxhdGl2ZSIsIkxleENvbmZpZyIsImNyZWF0ZVNwaW5uZXIiLCJsb2ciLCJjcmVhdGVMZXhWaXRlQ29uZmlnIiwiY29uZmlnIiwidHlwZSIsImNtZCIsImNhbGxiYWNrIiwiY2xpTmFtZSIsImpzb24iLCJxdWlldCIsInZhbGlkVHlwZXMiLCJpbmNsdWRlcyIsIlByb21pc2UiLCJyZXNvbHZlIiwicGFyc2VDb25maWciLCJjb25maWdPcHRpb25zIiwidmlzdGVzdENvbmZpZyIsImRlZmF1bHQiLCJjb21tYW5kIiwianNvbk91dHB1dCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzcGlubmVyIiwic3RhcnQiLCJzdWNjZWVkIiwicHJvY2VzcyIsImN3ZCJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsYUFBYSxRQUFPLEtBQUs7QUFDakMsT0FBT0MsZUFBZSxzQkFBc0I7QUFDNUMsU0FBUUMsWUFBWUMsWUFBWSxRQUFPLE9BQU87QUFFOUMsU0FBUUMsU0FBUyxRQUFPLHFCQUFxQjtBQUM3QyxTQUFRQyxhQUFhLFFBQU8scUJBQXFCO0FBQ2pELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFDdkMsU0FBUUMsbUJBQW1CLFFBQU8sNkJBQTZCO0FBVS9ELE9BQU8sTUFBTUMsU0FBUyxPQUNwQkMsTUFDQUMsS0FDQUMsV0FBMkIsSUFBTyxDQUFBLENBQUMsQ0FBQSxDQUFFO0lBRXJDLE1BQU0sRUFBQ0MsVUFBVSxLQUFLLEVBQUVDLElBQUksRUFBRUMsS0FBSyxFQUFDLEdBQUdKO0lBQ3ZDLE1BQU1LLGFBQXVCO1FBQUM7UUFBTztRQUFRO0tBQVM7SUFFdEQsSUFBRyxDQUFDQSxXQUFXQyxRQUFRLENBQUNQLE9BQU87UUFDN0JILElBQUksQ0FBQyxFQUFFLEVBQUVNLFFBQVEsbUJBQW1CLEVBQUVILEtBQUssb0VBQW9FLENBQUMsRUFBRSxTQUFTSztRQUMzSEgsU0FBUztRQUNULE9BQU9NLFFBQVFDLE9BQU8sQ0FBQztJQUN6QjtJQUVBWixJQUFJLEdBQUdNLFFBQVEsOEJBQThCLEVBQUVYLFVBQVVRLE1BQU0sR0FBRyxDQUFDLEVBQUUsUUFBUUs7SUFFN0UsTUFBTVYsVUFBVWUsV0FBVyxDQUFDVDtJQUU1QixJQUFJVTtJQUVKLE9BQU9YO1FBQ0wsS0FBSztZQUNIVyxnQkFBZ0JoQixVQUFVSSxNQUFNO1lBQ2hDO1FBQ0YsS0FBSztZQUFVO2dCQUNiLE1BQU1hLGdCQUFnQixNQUFNLE1BQU0sQ0FBQztnQkFDbkNELGdCQUFnQkMsY0FBY0MsT0FBTztnQkFDckM7WUFDRjtRQUNBLEtBQUs7WUFBUTtnQkFDWEYsZ0JBQWdCYixvQkFBb0I7b0JBQUNnQixTQUFTO2dCQUFPO2dCQUNyRDtZQUNGO0lBQ0Y7SUFFQSxNQUFNQyxhQUFxQkMsS0FBS0MsU0FBUyxDQUFDTixlQUFlLE1BQU07SUFFL0QsSUFBR1AsTUFBTTtRQUNQLE1BQU1jLFVBQVV0QixjQUFjUztRQUU5QmEsUUFBUUMsS0FBSyxDQUFDO1FBRWQ1QixjQUFjYSxNQUFNVztRQUVwQkcsUUFBUUUsT0FBTyxDQUFDLENBQUMsa0NBQWtDLEVBQUUxQixhQUFhMkIsUUFBUUMsR0FBRyxJQUFJbEIsT0FBTztJQUMxRjtJQUVBRixTQUFTO0lBQ1QsT0FBT00sUUFBUUMsT0FBTyxDQUFDO0FBQ3pCLEVBQUUifQ==
@@ -1,8 +1,6 @@
1
1
  export interface DevOptions {
2
2
  readonly bundleAnalyzer?: boolean;
3
3
  readonly cliName?: string;
4
- readonly config?: string;
5
- readonly format?: string;
6
4
  readonly open?: boolean;
7
5
  readonly port?: number;
8
6
  readonly quiet?: boolean;