@nlabs/lex 1.54.2 → 1.55.0

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 (58) hide show
  1. package/.github/copilot-instructions.md +4 -4
  2. package/README.md +25 -25
  3. package/__mocks__/LexConfig.js +9 -9
  4. package/__mocks__/boxen.js +1 -1
  5. package/__mocks__/build.js +6 -6
  6. package/__mocks__/compare-versions.js +1 -1
  7. package/__mocks__/compile.js +2 -2
  8. package/__mocks__/execa.js +2 -2
  9. package/__mocks__/latest-version.js +1 -1
  10. package/__mocks__/ora.js +13 -13
  11. package/__mocks__/versions.js +4 -4
  12. package/config.json +2 -2
  13. package/examples/lex.config.js +4 -4
  14. package/lex.config.js +4 -4
  15. package/lib/Button.stories.js +1 -1
  16. package/lib/LexConfig.d.ts +2 -9
  17. package/lib/LexConfig.js +2 -2
  18. package/lib/commands/ai/ai.js +2 -2
  19. package/lib/commands/clean/clean.js +1 -1
  20. package/lib/commands/config/config.js +14 -8
  21. package/lib/commands/copy/copy.js +1 -1
  22. package/lib/commands/create/create.js +1 -1
  23. package/lib/commands/dev/dev.js +1 -1
  24. package/lib/commands/init/init.js +1 -1
  25. package/lib/commands/link/link.js +1 -1
  26. package/lib/commands/lint/lint.js +1 -1
  27. package/lib/commands/migrate/migrate.js +2 -2
  28. package/lib/commands/serverless/serverless.js +1 -1
  29. package/lib/commands/storybook/storybook.js +1 -1
  30. package/lib/commands/test/test.d.ts +2 -0
  31. package/lib/commands/test/test.js +130 -117
  32. package/lib/commands/versions/versions.d.ts +1 -1
  33. package/lib/commands/versions/versions.js +3 -3
  34. package/lib/create/changelog.js +1 -1
  35. package/lib/lex.js +2 -2
  36. package/lib/test-react/index.d.ts +1 -1
  37. package/lib/test-react/index.js +2 -2
  38. package/lib/types.d.ts +1 -1
  39. package/lib/types.js +1 -1
  40. package/lib/utils/aiService.js +1 -1
  41. package/lib/utils/app.js +2 -2
  42. package/lib/vitest.d.js +3 -0
  43. package/package.json +41 -53
  44. package/resolver.cjs +11 -9
  45. package/tsconfig/reactNative.json +3 -2
  46. package/tsconfig.build.json +3 -3
  47. package/tsconfig.json +4 -3
  48. package/tsconfig.lint.json +3 -2
  49. package/tsconfig.template.json +3 -2
  50. package/tsconfig.test.json +4 -3
  51. package/vitest.config.d.mts +2 -0
  52. package/vitest.config.mjs +61 -0
  53. package/vitest.config.template.cjs +66 -0
  54. package/vitest.setup.template.js +19 -0
  55. package/jest.config.d.mts +0 -50
  56. package/jest.config.mjs +0 -72
  57. package/jest.config.template.cjs +0 -71
  58. package/jest.setup.template.js +0 -18
@@ -24,7 +24,7 @@ const detectESM = (cwd)=>{
24
24
  return false;
25
25
  };
26
26
  const defaultExit = (code)=>{
27
- if (process.env.JEST_WORKER_ID || process.env.NODE_ENV === 'test') {
27
+ if (process.env.VITEST || process.env.VITEST_WORKER_ID || process.env.NODE_ENV === 'test') {
28
28
  return undefined;
29
29
  }
30
30
  process.exit(code);
@@ -87,7 +87,7 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
87
87
  files = filesOrCallback;
88
88
  callback = callbackParam || defaultExit;
89
89
  }
90
- const { analyze = false, aiAnalyze = false, aiDebug = false, aiGenerate = false, bail, changedFilesWithAncestor, changedSince, ci, cliName = 'Lex', collectCoverageFrom, colors, config, debug = false, debugTests = false, detectOpenHandles, env, errorOnDeprecated, expand, forceExit, generate = false, json, lastCommit, listTests, logHeapUsage, maxWorkers, noStackTrace, notify, onlyChanged, outputFile, passWithNoTests, quiet, removeCache, runInBand, setup, showConfig, silent, testLocationInResults, testNamePattern, testPathPattern, update, useStderr, verbose, watch, watchAll } = options;
90
+ const { analyze = false, aiAnalyze = false, aiDebug = false, aiGenerate = false, bail, changedFilesWithAncestor, changedSince, ci, clearCache, cliName = 'Lex', collectCoverageFrom, colors, config, debug = false, debugTests = false, detectOpenHandles, environment, env, errorOnDeprecated, expand, forceExit, generate = false, json, lastCommit, listTests, logHeapUsage, maxWorkers, noStackTrace, notify, onlyChanged, outputFile, passWithNoTests, quiet, removeCache, runInBand, setup, showConfig, silent, testLocationInResults, testNamePattern, testPathPattern, update, useStderr, verbose, watch, watchAll } = options;
91
91
  const useGenerate = generate || aiGenerate;
92
92
  const useAnalyze = analyze || aiAnalyze;
93
93
  const useDebug = debugTests || aiDebug;
@@ -112,7 +112,7 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
112
112
  await aiFunction({
113
113
  context: true,
114
114
  file: targetFile,
115
- prompt: `Generate Jest unit tests for this file: ${targetFile}\n\n${readFileSync(targetFile, 'utf-8')}\n\nPlease create comprehensive tests that cover the main functionality. Include test fixtures and mocks where necessary.`,
115
+ prompt: `Generate Vitest unit tests for this file: ${targetFile}\n\n${readFileSync(targetFile, 'utf-8')}\n\nPlease create comprehensive tests that cover the main functionality. Include test fixtures and mocks where necessary.`,
116
116
  quiet,
117
117
  task: 'test'
118
118
  });
@@ -128,80 +128,88 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
128
128
  }
129
129
  }
130
130
  }
131
- const projectJestBin = pathResolve(process.cwd(), 'node_modules/.bin/jest');
132
- let jestPath;
133
- if (existsSync(projectJestBin)) {
134
- jestPath = projectJestBin;
131
+ const projectVitestBin = pathResolve(process.cwd(), 'node_modules/.bin/vitest');
132
+ let vitestPath;
133
+ if (existsSync(projectVitestBin)) {
134
+ vitestPath = projectVitestBin;
135
135
  } else {
136
- jestPath = resolveBinaryPath('jest');
136
+ vitestPath = resolveBinaryPath('vitest');
137
137
  }
138
- if (!jestPath) {
139
- log(`\n${cliName} Error: Jest binary not found in Lex's node_modules or monorepo root`, 'error', quiet);
138
+ if (!vitestPath) {
139
+ log(`\n${cliName} Error: Vitest binary not found in Lex's node_modules or monorepo root`, 'error', quiet);
140
140
  log('Please reinstall Lex or check your installation.', 'info', quiet);
141
141
  return 1;
142
142
  }
143
- let jestConfigFile;
144
- let projectJestConfig = null;
143
+ let vitestConfigFile;
144
+ let projectVitestConfig = null;
145
145
  if (config) {
146
- jestConfigFile = config;
146
+ vitestConfigFile = config;
147
147
  } else {
148
- const projectJestConfigPath = pathResolve(process.cwd(), 'jest.config.js');
149
- const projectJestConfigCjsPath = pathResolve(process.cwd(), 'jest.config.cjs');
150
- const projectJestConfigMjsPath = pathResolve(process.cwd(), 'jest.config.mjs');
151
- const projectJestConfigJsonPath = pathResolve(process.cwd(), 'jest.config.json');
152
- if (existsSync(projectJestConfigPath)) {
153
- jestConfigFile = projectJestConfigPath;
148
+ const projectVitestConfigPaths = [
149
+ pathResolve(process.cwd(), 'vitest.config.ts'),
150
+ pathResolve(process.cwd(), 'vitest.config.mts'),
151
+ pathResolve(process.cwd(), 'vitest.config.js'),
152
+ pathResolve(process.cwd(), 'vitest.config.mjs'),
153
+ pathResolve(process.cwd(), 'vitest.config.cjs')
154
+ ];
155
+ const existingConfigPath = projectVitestConfigPaths.find((configPath)=>existsSync(configPath));
156
+ if (existingConfigPath) {
157
+ vitestConfigFile = existingConfigPath;
154
158
  if (debug) {
155
- log(`Using project Jest config file: ${jestConfigFile}`, 'info', quiet);
156
- }
157
- } else if (existsSync(projectJestConfigCjsPath)) {
158
- jestConfigFile = projectJestConfigCjsPath;
159
- if (debug) {
160
- log(`Using project Jest config file (CJS): ${jestConfigFile}`, 'info', quiet);
161
- }
162
- } else if (existsSync(projectJestConfigMjsPath)) {
163
- jestConfigFile = projectJestConfigMjsPath;
164
- if (debug) {
165
- log(`Using project Jest config file (MJS): ${jestConfigFile}`, 'info', quiet);
166
- }
167
- } else if (existsSync(projectJestConfigJsonPath)) {
168
- jestConfigFile = projectJestConfigJsonPath;
169
- if (debug) {
170
- log(`Using project Jest config file (JSON): ${jestConfigFile}`, 'info', quiet);
159
+ log(`Using project Vitest config file: ${vitestConfigFile}`, 'info', quiet);
171
160
  }
172
161
  } else {
173
- // No Jest config file exists in the project
174
- // Check if there's a Jest config in lex.config.cjs
175
- projectJestConfig = LexConfig.config.jest;
162
+ // No Vitest config file exists in the project
163
+ // Check if there's a Vitest config in lex.config.cjs
164
+ projectVitestConfig = LexConfig.config.vitest;
176
165
  const lexDir = LexConfig.getLexDir();
177
- const lexJestConfig = pathResolve(lexDir, 'jest.config.mjs');
166
+ const lexVitestConfig = pathResolve(lexDir, 'vitest.config.mjs');
178
167
  if (debug) {
179
- log(`Looking for Jest config at: ${lexJestConfig}`, 'info', quiet);
180
- log(`File exists: ${existsSync(lexJestConfig)}`, 'info', quiet);
168
+ log(`Looking for Vitest config at: ${lexVitestConfig}`, 'info', quiet);
169
+ log(`File exists: ${existsSync(lexVitestConfig)}`, 'info', quiet);
181
170
  }
182
- if (existsSync(lexJestConfig)) {
183
- jestConfigFile = lexJestConfig;
184
- if (projectJestConfig && Object.keys(projectJestConfig).length > 0) {
185
- if (debug) {
186
- log(`Using Lex Jest config with project Jest config from lex.config.cjs: ${jestConfigFile}`, 'info', quiet);
187
- }
188
- } else {
171
+ if (existsSync(lexVitestConfig)) {
172
+ vitestConfigFile = lexVitestConfig;
173
+ if (projectVitestConfig && Object.keys(projectVitestConfig).length > 0) {
189
174
  if (debug) {
190
- log(`Using Lex Jest config (no project Jest config found): ${jestConfigFile}`, 'info', quiet);
175
+ log(`Using Lex Vitest config with project Vitest config from lex.config.cjs: ${vitestConfigFile}`, 'info', quiet);
191
176
  }
177
+ } else if (debug) {
178
+ log(`Using Lex Vitest config (no project Vitest config found): ${vitestConfigFile}`, 'info', quiet);
192
179
  }
193
180
  } else {
194
181
  if (debug) {
195
- log('No Jest config found in project or Lex', 'warn', quiet);
182
+ log('No Vitest config found in project or Lex', 'warn', quiet);
196
183
  }
197
- jestConfigFile = '';
198
184
  }
199
185
  }
200
186
  }
201
- const jestSetupFile = setup || pathResolve(process.cwd(), 'jest.setup.js');
202
- const jestOptions = [
203
- '--no-cache'
204
- ];
187
+ if (showConfig) {
188
+ if (vitestConfigFile) {
189
+ const resolvedConfig = await import(vitestConfigFile);
190
+ log(JSON.stringify(resolvedConfig.default ?? resolvedConfig, null, 2), 'info', quiet);
191
+ } else {
192
+ log(JSON.stringify({
193
+ test: projectVitestConfig ?? {}
194
+ }, null, 2), 'info', quiet);
195
+ }
196
+ callback(0);
197
+ return 0;
198
+ }
199
+ const vitestSetupFile = setup || pathResolve(process.cwd(), 'vitest.setup.js');
200
+ const vitestArgs = [];
201
+ const vitestOptions = [];
202
+ const reporters = new Set();
203
+ const filters = [];
204
+ const watchMode = Boolean(watch || watchAll);
205
+ const listMode = Boolean(listTests);
206
+ if (listMode) {
207
+ vitestArgs.push('list');
208
+ } else if (watchMode) {
209
+ vitestArgs.push('watch');
210
+ } else {
211
+ vitestArgs.push('run');
212
+ }
205
213
  const isESM = detectESM(process.cwd());
206
214
  let nodeOptions = process.env.NODE_OPTIONS || '';
207
215
  if (isESM) {
@@ -210,126 +218,122 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
210
218
  }
211
219
  log('ESM project detected, using --experimental-vm-modules in NODE_OPTIONS', 'info', quiet);
212
220
  }
213
- if (jestConfigFile) {
214
- jestOptions.push('--config', jestConfigFile);
221
+ if (vitestConfigFile) {
222
+ vitestOptions.push('--config', vitestConfigFile);
215
223
  }
216
224
  if (bail) {
217
- jestOptions.push('--bail');
225
+ vitestOptions.push('--bail', '1');
218
226
  }
219
227
  if (changedFilesWithAncestor) {
220
- jestOptions.push('--changedFilesWithAncestor');
228
+ vitestOptions.push('--changed');
221
229
  }
222
230
  if (changedSince) {
223
- jestOptions.push('--changedSince');
231
+ vitestOptions.push('--changed', changedSince);
224
232
  }
225
233
  if (ci) {
226
- jestOptions.push('--ci');
234
+ vitestOptions.push('--run');
227
235
  }
228
236
  if (collectCoverageFrom) {
229
- jestOptions.push('--collectCoverageFrom', collectCoverageFrom);
230
- }
231
- if (colors) {
232
- jestOptions.push('--colors');
237
+ vitestOptions.push('--coverage', '--coverage.include', collectCoverageFrom);
233
238
  }
234
239
  if (debug) {
235
- jestOptions.push('--debug');
240
+ vitestOptions.push('--inspect');
236
241
  }
237
242
  if (detectOpenHandles) {
238
- jestOptions.push('--detectOpenHandles');
243
+ reporters.add('hanging-process');
239
244
  }
240
- if (env) {
241
- jestOptions.push('--env');
245
+ const environmentName = environment || env;
246
+ if (environmentName) {
247
+ vitestOptions.push('--environment', environmentName);
242
248
  }
243
249
  if (errorOnDeprecated) {
244
- jestOptions.push('--errorOnDeprecated');
250
+ log('Vitest does not support --errorOnDeprecated; option ignored.', 'warn', quiet);
245
251
  }
246
252
  if (expand) {
247
- jestOptions.push('--expand');
253
+ vitestOptions.push('--expandSnapshotDiff');
248
254
  }
249
255
  if (forceExit) {
250
- jestOptions.push('--forceExit');
251
- }
252
- if (json) {
253
- jestOptions.push('--json');
256
+ log('Vitest does not support --forceExit; option ignored.', 'warn', quiet);
254
257
  }
255
258
  if (lastCommit) {
256
- jestOptions.push('--lastCommit');
257
- }
258
- if (listTests) {
259
- jestOptions.push('--listTests');
259
+ vitestOptions.push('--changed');
260
260
  }
261
261
  if (logHeapUsage) {
262
- jestOptions.push('--logHeapUsage');
262
+ vitestOptions.push('--logHeapUsage');
263
263
  }
264
264
  if (maxWorkers) {
265
- jestOptions.push('--maxWorkers', maxWorkers);
265
+ vitestOptions.push('--maxWorkers', maxWorkers);
266
266
  }
267
267
  if (noStackTrace) {
268
- jestOptions.push('--noStackTrace');
268
+ log('Vitest does not support --noStackTrace; option ignored.', 'warn', quiet);
269
269
  }
270
270
  if (notify) {
271
- jestOptions.push('--notify');
271
+ log('Vitest does not support --notify; option ignored.', 'warn', quiet);
272
272
  }
273
273
  if (onlyChanged) {
274
- jestOptions.push('--onlyChanged');
274
+ vitestOptions.push('--changed');
275
275
  }
276
276
  let tempOutputFile = outputFile;
277
- if ((useAnalyze || useDebug) && !outputFile) {
278
- tempOutputFile = '.lex-test-results.json';
279
- jestOptions.push('--json', '--outputFile', tempOutputFile);
280
- } else if (outputFile) {
281
- jestOptions.push('--outputFile', outputFile);
277
+ const shouldWriteJson = json || useAnalyze || useDebug || Boolean(outputFile);
278
+ if (shouldWriteJson) {
279
+ tempOutputFile = outputFile || '.lex-test-results.json';
280
+ vitestOptions.push('--outputFile', tempOutputFile);
281
+ reporters.add('json');
282
282
  }
283
283
  if (passWithNoTests) {
284
- jestOptions.push('--passWithNoTests');
284
+ vitestOptions.push('--passWithNoTests');
285
285
  }
286
286
  if (runInBand) {
287
- jestOptions.push('--runInBand');
288
- }
289
- if (showConfig) {
290
- jestOptions.push('--showConfig');
287
+ vitestOptions.push('--no-file-parallelism', '--maxWorkers', '1');
291
288
  }
292
289
  if (silent) {
293
- jestOptions.push('--silent');
290
+ vitestOptions.push('--silent');
294
291
  }
295
292
  if (testLocationInResults) {
296
- jestOptions.push('--testLocationInResults');
293
+ vitestOptions.push('--includeTaskLocation');
297
294
  }
298
295
  if (testNamePattern) {
299
- jestOptions.push('--testNamePattern', testNamePattern);
296
+ vitestOptions.push('--testNamePattern', testNamePattern);
300
297
  }
301
298
  if (testPathPattern) {
302
- jestOptions.push('--testPathPattern', testPathPattern);
299
+ filters.push(testPathPattern);
303
300
  }
304
301
  if (useStderr) {
305
- jestOptions.push('--useStderr');
302
+ log('Vitest does not support --useStderr; option ignored.', 'warn', quiet);
306
303
  }
307
304
  if (verbose) {
308
- jestOptions.push('--verbose');
309
- }
310
- if (watchAll) {
311
- jestOptions.push('--watchAll');
305
+ reporters.add('verbose');
312
306
  }
313
- if (removeCache) {
314
- jestOptions.push('--no-cache');
315
- }
316
- if (jestSetupFile && existsSync(jestSetupFile)) {
317
- jestOptions.push(`--setupFilesAfterEnv=${jestSetupFile}`);
307
+ if (removeCache || clearCache) {
308
+ vitestOptions.push('--clearCache');
318
309
  }
319
310
  if (update) {
320
- jestOptions.push('--updateSnapshot');
311
+ vitestOptions.push('--update');
321
312
  }
322
313
  if (watch) {
323
- jestOptions.push('--watch', watch);
314
+ filters.push(watch);
324
315
  }
325
316
  if (args) {
326
- jestOptions.push(...args);
317
+ vitestOptions.push(...args);
327
318
  }
328
319
  if (files && files.length > 0) {
329
- jestOptions.push(...files);
320
+ filters.push(...files);
321
+ }
322
+ if (reporters.size > 0) {
323
+ const reporterList = Array.from(reporters);
324
+ if (reporterList.includes('json') && !reporterList.includes('verbose')) {
325
+ // Keep console output while writing JSON results.
326
+ reporterList.unshift('default');
327
+ }
328
+ reporterList.forEach((reporter)=>vitestOptions.push('--reporter', reporter));
330
329
  }
330
+ const finalArgs = [
331
+ ...vitestArgs,
332
+ ...vitestOptions,
333
+ ...filters
334
+ ];
331
335
  if (debug) {
332
- log(`Jest options: ${jestOptions.join(' ')}`, 'info', quiet);
336
+ log(`Vitest options: ${finalArgs.join(' ')}`, 'info', quiet);
333
337
  log(`NODE_OPTIONS: ${nodeOptions}`, 'info', quiet);
334
338
  }
335
339
  try {
@@ -337,7 +341,16 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
337
341
  ...process.env,
338
342
  NODE_OPTIONS: nodeOptions
339
343
  };
340
- await execa(jestPath, jestOptions, {
344
+ if (colors) {
345
+ env.FORCE_COLOR = '1';
346
+ }
347
+ if (ci) {
348
+ env.CI = 'true';
349
+ }
350
+ if (vitestSetupFile && existsSync(vitestSetupFile)) {
351
+ env.LEX_VITEST_SETUP = vitestSetupFile;
352
+ }
353
+ await execa(vitestPath, finalArgs, {
341
354
  encoding: 'utf8',
342
355
  env,
343
356
  stdio: 'inherit'
@@ -350,7 +363,7 @@ export const test = async (options, args, filesOrCallback, callbackParam)=>{
350
363
  const filePatterns = getTestFilePatterns(testPathPattern);
351
364
  await aiFunction({
352
365
  context: true,
353
- prompt: `Analyze these Jest test results and suggest test coverage improvements:
366
+ prompt: `Analyze these Vitest test results and suggest test coverage improvements:
354
367
 
355
368
  ${JSON.stringify(testResults, null, 2)}
356
369
 
@@ -384,7 +397,7 @@ Please provide:
384
397
  const testResults = processTestResults(tempOutputFile);
385
398
  await aiFunction({
386
399
  context: true,
387
- prompt: `Debug these failed Jest tests and suggest fixes:
400
+ prompt: `Debug these failed Vitest tests and suggest fixes:
388
401
 
389
402
  ${JSON.stringify(error.message, null, 2)}
390
403
 
@@ -413,4 +426,4 @@ Please provide:
413
426
  };
414
427
  export default test;
415
428
 
416
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy90ZXN0L3Rlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRofSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtyZXNvbHZlQmluYXJ5UGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi4vYWkvYWkuanMnO1xuXG5jb25zdCBkZXRlY3RFU00gPSAoY3dkOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aFJlc29sdmUoY3dkLCAncGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYWlEZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpR2VuZXJhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBhaUFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBiYWlsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZFNpbmNlPzogc3RyaW5nO1xuICByZWFkb25seSBjaT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbGxlY3RDb3ZlcmFnZUZyb20/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbG9ycz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkZWJ1Z1Rlc3RzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGV0ZWN0T3BlbkhhbmRsZXM/OiBib29sZWFuO1xuICByZWFkb25seSBlbnY/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVycm9yT25EZXByZWNhdGVkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZXhwYW5kPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZm9yY2VFeGl0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZ2VuZXJhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBqc29uPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGFzdENvbW1pdD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxpc3RUZXN0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxvZ0hlYXBVc2FnZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1heFdvcmtlcnM/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG5vU3RhY2tUcmFjZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG5vdGlmeT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IG9ubHlDaGFuZ2VkPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb3V0cHV0RmlsZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcGFzc1dpdGhOb1Rlc3RzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcXVpZXQ/OiBib29sZWFuO1xuICByZWFkb25seSByZW1vdmVDYWNoZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJ1bkluQmFuZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHNldHVwPzogc3RyaW5nO1xuICByZWFkb25seSBzaG93Q29uZmlnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2lsZW50PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdExvY2F0aW9uSW5SZXN1bHRzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdGVzdE5hbWVQYXR0ZXJuPzogc3RyaW5nO1xuICByZWFkb25seSB0ZXN0UGF0aFBhdHRlcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHVwZGF0ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHVzZVN0ZGVycj86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZlcmJvc2U/OiBib29sZWFuO1xuICByZWFkb25seSB3YXRjaD86IHN0cmluZztcbiAgcmVhZG9ubHkgd2F0Y2hBbGw/OiBib29sZWFuO1xufVxuXG5leHBvcnQgdHlwZSBUZXN0Q2FsbGJhY2sgPSB0eXBlb2YgcHJvY2Vzcy5leGl0O1xuXG5jb25zdCBkZWZhdWx0RXhpdCA9ICgoY29kZT86IG51bWJlcikgPT4ge1xuICBpZihwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Rlc3QnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBuZXZlcjtcbiAgfVxuXG4gIHByb2Nlc3MuZXhpdChjb2RlKTtcbn0pIGFzIHR5cGVvZiBwcm9jZXNzLmV4aXQ7XG5cbmV4cG9ydCBjb25zdCBnZXRUZXN0RmlsZVBhdHRlcm5zID0gKHRlc3RQYXRoUGF0dGVybj86IHN0cmluZyk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3QgZGVmYXVsdFBhdHRlcm5zID0gWycqKi8qLnRlc3QuKicsICcqKi8qLnNwZWMuKicsICcqKi8qLmludGVncmF0aW9uLionXTtcblxuICBpZighdGVzdFBhdGhQYXR0ZXJuKSB7XG4gICAgcmV0dXJuIGRlZmF1bHRQYXR0ZXJucztcbiAgfVxuXG4gIHJldHVybiBbdGVzdFBhdGhQYXR0ZXJuXTtcbn07XG5cbmNvbnN0IGZpbmRVbmNvdmVyZWRTb3VyY2VGaWxlcyA9ICgpOiBzdHJpbmdbXSA9PiB7XG4gIGNvbnN0IHNvdXJjZUZpbGVzID0gZ2xvYlN5bmMoJ3NyYy8qKi8qLnt0cyx0c3gsanMsanN4fScsIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKicsICcqKi8qLnRlc3QuKicsICcqKi8qLnNwZWMuKiddXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RGaWxlcyA9IGdsb2JTeW5jKCcqKi8qLnt0ZXN0LHNwZWN9Lnt0cyx0c3gsanMsanN4fScsIHtcbiAgICBjd2Q6IHByb2Nlc3MuY3dkKCksXG4gICAgaWdub3JlOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi9kaXN0LyoqJywgJyoqL2xpYi8qKiddXG4gIH0pO1xuXG4gIHJldHVybiBzb3VyY2VGaWxlcy5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBiYXNlTmFtZSA9IHNvdXJjZUZpbGUucmVwbGFjZSgvXFwuW14vLl0rJC8sICcnKTtcbiAgICByZXR1cm4gIXRlc3RGaWxlcy5zb21lKCh0ZXN0RmlsZSkgPT4gdGVzdEZpbGUuaW5jbHVkZXMoYmFzZU5hbWUpKTtcbiAgfSk7XG59O1xuXG5jb25zdCBwcm9jZXNzVGVzdFJlc3VsdHMgPSAob3V0cHV0RmlsZT86IHN0cmluZyk6IGFueSA9PiB7XG4gIGlmKCFvdXRwdXRGaWxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZVN5bmMob3V0cHV0RmlsZSwgJ3V0Zi04Jyk7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoY29udGVudCk7XG4gIH0gY2F0Y2goX2Vycm9yKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0ZXN0ID0gYXN5bmMgKFxuICBvcHRpb25zOiBUZXN0T3B0aW9ucyxcbiAgYXJncz86IHN0cmluZ1tdLFxuICBmaWxlc09yQ2FsbGJhY2s/OiBzdHJpbmdbXSB8IFRlc3RDYWxsYmFjayxcbiAgY2FsbGJhY2tQYXJhbT86IFRlc3RDYWxsYmFja1xuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgLy8gQmFja3dhcmQtY29tcGF0IGFyZ3VtZW50IG5vcm1hbGl6YXRpb246IGFsbG93IGNhbGxiYWNrIGFzIHRoaXJkIHBhcmFtXG4gIGxldCBmaWxlczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gIGxldCBjYWxsYmFjazogVGVzdENhbGxiYWNrID0gZGVmYXVsdEV4aXQ7XG5cbiAgaWYodHlwZW9mIGZpbGVzT3JDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGNhbGxiYWNrID0gZmlsZXNPckNhbGxiYWNrIGFzIFRlc3RDYWxsYmFjaztcbiAgfSBlbHNlIHtcbiAgICBmaWxlcyA9IGZpbGVzT3JDYWxsYmFjayBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBjYWxsYmFjayA9IGNhbGxiYWNrUGFyYW0gfHwgZGVmYXVsdEV4aXQ7XG4gIH1cbiAgY29uc3Qge1xuICAgIGFuYWx5emUgPSBmYWxzZSxcbiAgICBhaUFuYWx5emUgPSBmYWxzZSxcbiAgICBhaURlYnVnID0gZmFsc2UsXG4gICAgYWlHZW5lcmF0ZSA9IGZhbHNlLFxuICAgIGJhaWwsXG4gICAgY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yLFxuICAgIGNoYW5nZWRTaW5jZSxcbiAgICBjaSxcbiAgICBjbGlOYW1lID0gJ0xleCcsXG4gICAgY29sbGVjdENvdmVyYWdlRnJvbSxcbiAgICBjb2xvcnMsXG4gICAgY29uZmlnLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgZGVidWdUZXN0cyA9IGZhbHNlLFxuICAgIGRldGVjdE9wZW5IYW5kbGVzLFxuICAgIGVudixcbiAgICBlcnJvck9uRGVwcmVjYXRlZCxcbiAgICBleHBhbmQsXG4gICAgZm9yY2VFeGl0LFxuICAgIGdlbmVyYXRlID0gZmFsc2UsXG4gICAganNvbixcbiAgICBsYXN0Q29tbWl0LFxuICAgIGxpc3RUZXN0cyxcbiAgICBsb2dIZWFwVXNhZ2UsXG4gICAgbWF4V29ya2VycyxcbiAgICBub1N0YWNrVHJhY2UsXG4gICAgbm90aWZ5LFxuICAgIG9ubHlDaGFuZ2VkLFxuICAgIG91dHB1dEZpbGUsXG4gICAgcGFzc1dpdGhOb1Rlc3RzLFxuICAgIHF1aWV0LFxuICAgIHJlbW92ZUNhY2hlLFxuICAgIHJ1bkluQmFuZCxcbiAgICBzZXR1cCxcbiAgICBzaG93Q29uZmlnLFxuICAgIHNpbGVudCxcbiAgICB0ZXN0TG9jYXRpb25JblJlc3VsdHMsXG4gICAgdGVzdE5hbWVQYXR0ZXJuLFxuICAgIHRlc3RQYXRoUGF0dGVybixcbiAgICB1cGRhdGUsXG4gICAgdXNlU3RkZXJyLFxuICAgIHZlcmJvc2UsXG4gICAgd2F0Y2gsXG4gICAgd2F0Y2hBbGxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgdXNlR2VuZXJhdGUgPSBnZW5lcmF0ZSB8fCBhaUdlbmVyYXRlO1xuICBjb25zdCB1c2VBbmFseXplID0gYW5hbHl6ZSB8fCBhaUFuYWx5emU7XG4gIGNvbnN0IHVzZURlYnVnID0gZGVidWdUZXN0cyB8fCBhaURlYnVnO1xuXG4gIGxvZyhgJHtjbGlOYW1lfSB0ZXN0aW5nLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgY29uc3Qgc3Bpbm5lciA9IGNyZWF0ZVNwaW5uZXIocXVpZXQpO1xuXG4gIGF3YWl0IExleENvbmZpZy5wYXJzZUNvbmZpZyhvcHRpb25zKTtcblxuICBjb25zdCB7dXNlVHlwZXNjcmlwdH0gPSBMZXhDb25maWcuY29uZmlnO1xuXG4gIGlmKHVzZVR5cGVzY3JpcHQpIHtcbiAgICBjb25zdCB0ZXN0Q29uZmlnUGF0aCA9IGdldFR5cGVTY3JpcHRDb25maWdQYXRoKCd0c2NvbmZpZy50ZXN0Lmpzb24nKTtcbiAgICBpZihleGlzdHNTeW5jKHRlc3RDb25maWdQYXRoKSkge1xuICAgICAgbG9nKCdVc2luZyB0c2NvbmZpZy50ZXN0Lmpzb24gZm9yIHRlc3RpbmcuLi4nLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgTGV4Q29uZmlnLmNoZWNrVGVzdFR5cGVzY3JpcHRDb25maWcoKTtcbiAgICB9XG4gIH1cblxuICBpZih1c2VHZW5lcmF0ZSkge1xuICAgIHNwaW5uZXIuc3RhcnQoJ0FJIGlzIGFuYWx5emluZyBjb2RlIHRvIGdlbmVyYXRlIHRlc3QgY2FzZXMuLi4nKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1bmNvdmVyZWRGaWxlcyA9IGZpbmRVbmNvdmVyZWRTb3VyY2VGaWxlcygpO1xuXG4gICAgICBpZih1bmNvdmVyZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldEZpbGUgPSB1bmNvdmVyZWRGaWxlc1swXTtcblxuICAgICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIGZpbGU6IHRhcmdldEZpbGUsXG4gICAgICAgICAgcHJvbXB0OiBgR2VuZXJhdGUgSmVzdCB1bml0IHRlc3RzIGZvciB0aGlzIGZpbGU6ICR7dGFyZ2V0RmlsZX1cXG5cXG4ke3JlYWRGaWxlU3luYyh0YXJnZXRGaWxlLCAndXRmLTgnKX1cXG5cXG5QbGVhc2UgY3JlYXRlIGNvbXByZWhlbnNpdmUgdGVzdHMgdGhhdCBjb3ZlciB0aGUgbWFpbiBmdW5jdGlvbmFsaXR5LiBJbmNsdWRlIHRlc3QgZml4dHVyZXMgYW5kIG1vY2tzIHdoZXJlIG5lY2Vzc2FyeS5gLFxuICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgIHRhc2s6ICd0ZXN0J1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYEFJIHRlc3QgZ2VuZXJhdGlvbiBzdWdnZXN0aW9ucyBwcm92aWRlZCBmb3IgJHt0YXJnZXRGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBbGwgc291cmNlIGZpbGVzIGFwcGVhciB0byBoYXZlIGNvcnJlc3BvbmRpbmcgdGVzdCBmaWxlcycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgdGVzdCBzdWdnZXN0aW9ucycpO1xuICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIHRlc3QgZ2VuZXJhdGlvbiBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0SmVzdEJpbiA9IHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvLmJpbi9qZXN0Jyk7XG4gIGxldCBqZXN0UGF0aDogc3RyaW5nO1xuXG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdEplc3RCaW4pKSB7XG4gICAgamVzdFBhdGggPSBwcm9qZWN0SmVzdEJpbjtcbiAgfSBlbHNlIHtcbiAgICBqZXN0UGF0aCA9IHJlc29sdmVCaW5hcnlQYXRoKCdqZXN0Jyk7XG4gIH1cblxuICBpZighamVzdFBhdGgpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IEplc3QgYmluYXJ5IG5vdCBmb3VuZCBpbiBMZXgncyBub2RlX21vZHVsZXMgb3IgbW9ub3JlcG8gcm9vdGAsICdlcnJvcicsIHF1aWV0KTtcbiAgICBsb2coJ1BsZWFzZSByZWluc3RhbGwgTGV4IG9yIGNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLicsICdpbmZvJywgcXVpZXQpO1xuICAgIHJldHVybiAxO1xuICB9XG5cbiAgbGV0IGplc3RDb25maWdGaWxlOiBzdHJpbmc7XG4gIGxldCBwcm9qZWN0SmVzdENvbmZpZzogYW55ID0gbnVsbDtcblxuICBpZihjb25maWcpIHtcbiAgICBqZXN0Q29uZmlnRmlsZSA9IGNvbmZpZztcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwcm9qZWN0SmVzdENvbmZpZ1BhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnamVzdC5jb25maWcuanMnKTtcbiAgICBjb25zdCBwcm9qZWN0SmVzdENvbmZpZ0Nqc1BhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnamVzdC5jb25maWcuY2pzJyk7XG4gICAgY29uc3QgcHJvamVjdEplc3RDb25maWdNanNQYXRoID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ2plc3QuY29uZmlnLm1qcycpO1xuICAgIGNvbnN0IHByb2plY3RKZXN0Q29uZmlnSnNvblBhdGggPSBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnamVzdC5jb25maWcuanNvbicpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhwcm9qZWN0SmVzdENvbmZpZ1BhdGgpKSB7XG4gICAgICBqZXN0Q29uZmlnRmlsZSA9IHByb2plY3RKZXN0Q29uZmlnUGF0aDtcbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgVXNpbmcgcHJvamVjdCBKZXN0IGNvbmZpZyBmaWxlOiAke2plc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZihleGlzdHNTeW5jKHByb2plY3RKZXN0Q29uZmlnQ2pzUGF0aCkpIHtcbiAgICAgIGplc3RDb25maWdGaWxlID0gcHJvamVjdEplc3RDb25maWdDanNQYXRoO1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBVc2luZyBwcm9qZWN0IEplc3QgY29uZmlnIGZpbGUgKENKUyk6ICR7amVzdENvbmZpZ0ZpbGV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmKGV4aXN0c1N5bmMocHJvamVjdEplc3RDb25maWdNanNQYXRoKSkge1xuICAgICAgamVzdENvbmZpZ0ZpbGUgPSBwcm9qZWN0SmVzdENvbmZpZ01qc1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIHByb2plY3QgSmVzdCBjb25maWcgZmlsZSAoTUpTKTogJHtqZXN0Q29uZmlnRmlsZX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYoZXhpc3RzU3luYyhwcm9qZWN0SmVzdENvbmZpZ0pzb25QYXRoKSkge1xuICAgICAgamVzdENvbmZpZ0ZpbGUgPSBwcm9qZWN0SmVzdENvbmZpZ0pzb25QYXRoO1xuICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgbG9nKGBVc2luZyBwcm9qZWN0IEplc3QgY29uZmlnIGZpbGUgKEpTT04pOiAke2plc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBObyBKZXN0IGNvbmZpZyBmaWxlIGV4aXN0cyBpbiB0aGUgcHJvamVjdFxuICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUncyBhIEplc3QgY29uZmlnIGluIGxleC5jb25maWcuY2pzXG4gICAgICBwcm9qZWN0SmVzdENvbmZpZyA9IExleENvbmZpZy5jb25maWcuamVzdDtcblxuICAgICAgY29uc3QgbGV4RGlyID0gTGV4Q29uZmlnLmdldExleERpcigpO1xuICAgICAgY29uc3QgbGV4SmVzdENvbmZpZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJ2plc3QuY29uZmlnLm1qcycpO1xuXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYExvb2tpbmcgZm9yIEplc3QgY29uZmlnIGF0OiAke2xleEplc3RDb25maWd9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgRmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhsZXhKZXN0Q29uZmlnKX1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIH1cblxuICAgICAgaWYoZXhpc3RzU3luYyhsZXhKZXN0Q29uZmlnKSkge1xuICAgICAgICBqZXN0Q29uZmlnRmlsZSA9IGxleEplc3RDb25maWc7XG4gICAgICAgIGlmKHByb2plY3RKZXN0Q29uZmlnICYmIE9iamVjdC5rZXlzKHByb2plY3RKZXN0Q29uZmlnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgTGV4IEplc3QgY29uZmlnIHdpdGggcHJvamVjdCBKZXN0IGNvbmZpZyBmcm9tIGxleC5jb25maWcuY2pzOiAke2plc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgbG9nKGBVc2luZyBMZXggSmVzdCBjb25maWcgKG5vIHByb2plY3QgSmVzdCBjb25maWcgZm91bmQpOiAke2plc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICBsb2coJ05vIEplc3QgY29uZmlnIGZvdW5kIGluIHByb2plY3Qgb3IgTGV4JywgJ3dhcm4nLCBxdWlldCk7XG4gICAgICAgIH1cbiAgICAgICAgamVzdENvbmZpZ0ZpbGUgPSAnJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBqZXN0U2V0dXBGaWxlOiBzdHJpbmcgPSBzZXR1cCB8fCBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnamVzdC5zZXR1cC5qcycpO1xuICBjb25zdCBqZXN0T3B0aW9uczogc3RyaW5nW10gPSBbJy0tbm8tY2FjaGUnXTtcblxuICBjb25zdCBpc0VTTSA9IGRldGVjdEVTTShwcm9jZXNzLmN3ZCgpKTtcbiAgbGV0IG5vZGVPcHRpb25zID0gcHJvY2Vzcy5lbnYuTk9ERV9PUFRJT05TIHx8ICcnO1xuICBpZihpc0VTTSkge1xuICAgIGlmKCFub2RlT3B0aW9ucy5pbmNsdWRlcygnLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcycpKSB7XG4gICAgICBub2RlT3B0aW9ucyA9IGAke25vZGVPcHRpb25zfSAtLWV4cGVyaW1lbnRhbC12bS1tb2R1bGVzYC50cmltKCk7XG4gICAgfVxuICAgIGxvZygnRVNNIHByb2plY3QgZGV0ZWN0ZWQsIHVzaW5nIC0tZXhwZXJpbWVudGFsLXZtLW1vZHVsZXMgaW4gTk9ERV9PUFRJT05TJywgJ2luZm8nLCBxdWlldCk7XG4gIH1cblxuICBpZihqZXN0Q29uZmlnRmlsZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY29uZmlnJywgamVzdENvbmZpZ0ZpbGUpO1xuICB9XG5cbiAgaWYoYmFpbCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tYmFpbCcpO1xuICB9XG5cbiAgaWYoY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1jaGFuZ2VkRmlsZXNXaXRoQW5jZXN0b3InKTtcbiAgfVxuXG4gIGlmKGNoYW5nZWRTaW5jZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY2hhbmdlZFNpbmNlJyk7XG4gIH1cblxuICBpZihjaSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY2knKTtcbiAgfVxuXG4gIGlmKGNvbGxlY3RDb3ZlcmFnZUZyb20pIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWNvbGxlY3RDb3ZlcmFnZUZyb20nLCBjb2xsZWN0Q292ZXJhZ2VGcm9tKTtcbiAgfVxuXG4gIGlmKGNvbG9ycykge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tY29sb3JzJyk7XG4gIH1cblxuICBpZihkZWJ1Zykge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZGVidWcnKTtcbiAgfVxuXG4gIGlmKGRldGVjdE9wZW5IYW5kbGVzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1kZXRlY3RPcGVuSGFuZGxlcycpO1xuICB9XG5cbiAgaWYoZW52KSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1lbnYnKTtcbiAgfVxuXG4gIGlmKGVycm9yT25EZXByZWNhdGVkKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1lcnJvck9uRGVwcmVjYXRlZCcpO1xuICB9XG5cbiAgaWYoZXhwYW5kKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1leHBhbmQnKTtcbiAgfVxuXG4gIGlmKGZvcmNlRXhpdCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tZm9yY2VFeGl0Jyk7XG4gIH1cblxuICBpZihqc29uKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1qc29uJyk7XG4gIH1cblxuICBpZihsYXN0Q29tbWl0KSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1sYXN0Q29tbWl0Jyk7XG4gIH1cblxuICBpZihsaXN0VGVzdHMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLWxpc3RUZXN0cycpO1xuICB9XG5cbiAgaWYobG9nSGVhcFVzYWdlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1sb2dIZWFwVXNhZ2UnKTtcbiAgfVxuXG4gIGlmKG1heFdvcmtlcnMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW1heFdvcmtlcnMnLCBtYXhXb3JrZXJzKTtcbiAgfVxuXG4gIGlmKG5vU3RhY2tUcmFjZSkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tbm9TdGFja1RyYWNlJyk7XG4gIH1cblxuICBpZihub3RpZnkpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW5vdGlmeScpO1xuICB9XG5cbiAgaWYob25seUNoYW5nZWQpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW9ubHlDaGFuZ2VkJyk7XG4gIH1cblxuICBsZXQgdGVtcE91dHB1dEZpbGUgPSBvdXRwdXRGaWxlO1xuXG4gIGlmKCh1c2VBbmFseXplIHx8IHVzZURlYnVnKSAmJiAhb3V0cHV0RmlsZSkge1xuICAgIHRlbXBPdXRwdXRGaWxlID0gJy5sZXgtdGVzdC1yZXN1bHRzLmpzb24nO1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tanNvbicsICctLW91dHB1dEZpbGUnLCB0ZW1wT3V0cHV0RmlsZSk7XG4gIH0gZWxzZSBpZihvdXRwdXRGaWxlKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1vdXRwdXRGaWxlJywgb3V0cHV0RmlsZSk7XG4gIH1cblxuICBpZihwYXNzV2l0aE5vVGVzdHMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXBhc3NXaXRoTm9UZXN0cycpO1xuICB9XG5cbiAgaWYocnVuSW5CYW5kKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS1ydW5JbkJhbmQnKTtcbiAgfVxuXG4gIGlmKHNob3dDb25maWcpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXNob3dDb25maWcnKTtcbiAgfVxuXG4gIGlmKHNpbGVudCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0tc2lsZW50Jyk7XG4gIH1cblxuICBpZih0ZXN0TG9jYXRpb25JblJlc3VsdHMpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXRlc3RMb2NhdGlvbkluUmVzdWx0cycpO1xuICB9XG5cbiAgaWYodGVzdE5hbWVQYXR0ZXJuKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS10ZXN0TmFtZVBhdHRlcm4nLCB0ZXN0TmFtZVBhdHRlcm4pO1xuICB9XG5cbiAgaWYodGVzdFBhdGhQYXR0ZXJuKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS10ZXN0UGF0aFBhdHRlcm4nLCB0ZXN0UGF0aFBhdHRlcm4pO1xuICB9XG5cbiAgaWYodXNlU3RkZXJyKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS11c2VTdGRlcnInKTtcbiAgfVxuXG4gIGlmKHZlcmJvc2UpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXZlcmJvc2UnKTtcbiAgfVxuXG4gIGlmKHdhdGNoQWxsKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCgnLS13YXRjaEFsbCcpO1xuICB9XG5cbiAgaWYocmVtb3ZlQ2FjaGUpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLW5vLWNhY2hlJyk7XG4gIH1cblxuICBpZihqZXN0U2V0dXBGaWxlICYmIGV4aXN0c1N5bmMoamVzdFNldHVwRmlsZSkpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKGAtLXNldHVwRmlsZXNBZnRlckVudj0ke2plc3RTZXR1cEZpbGV9YCk7XG4gIH1cblxuICBpZih1cGRhdGUpIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKCctLXVwZGF0ZVNuYXBzaG90Jyk7XG4gIH1cblxuICBpZih3YXRjaCkge1xuICAgIGplc3RPcHRpb25zLnB1c2goJy0td2F0Y2gnLCB3YXRjaCk7XG4gIH1cblxuICBpZihhcmdzKSB7XG4gICAgamVzdE9wdGlvbnMucHVzaCguLi5hcmdzKTtcbiAgfVxuXG4gIGlmKGZpbGVzICYmIGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICBqZXN0T3B0aW9ucy5wdXNoKC4uLmZpbGVzKTtcbiAgfVxuXG4gIGlmKGRlYnVnKSB7XG4gICAgbG9nKGBKZXN0IG9wdGlvbnM6ICR7amVzdE9wdGlvbnMuam9pbignICcpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgIGxvZyhgTk9ERV9PUFRJT05TOiAke25vZGVPcHRpb25zfWAsICdpbmZvJywgcXVpZXQpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnY6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIE5PREVfT1BUSU9OUzogbm9kZU9wdGlvbnNcbiAgICB9O1xuXG4gICAgYXdhaXQgZXhlY2EoamVzdFBhdGgsIGplc3RPcHRpb25zLCB7XG4gICAgICBlbmNvZGluZzogJ3V0ZjgnLFxuICAgICAgZW52LFxuICAgICAgc3RkaW86ICdpbmhlcml0J1xuICAgIH0pO1xuXG4gICAgc3Bpbm5lci5zdWNjZWVkKCdUZXN0aW5nIGNvbXBsZXRlZCEnKTtcblxuICAgIGlmKHVzZUFuYWx5emUpIHtcbiAgICAgIHNwaW5uZXIuc3RhcnQoJ0FJIGlzIGFuYWx5emluZyB0ZXN0IGNvdmVyYWdlIGFuZCBzdWdnZXN0aW5nIGltcHJvdmVtZW50cy4uLicpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCB0ZXN0UmVzdWx0cyA9IHByb2Nlc3NUZXN0UmVzdWx0cyh0ZW1wT3V0cHV0RmlsZSk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXR0ZXJucyA9IGdldFRlc3RGaWxlUGF0dGVybnModGVzdFBhdGhQYXR0ZXJuKTtcblxuICAgICAgICBhd2FpdCBhaUZ1bmN0aW9uKHtcbiAgICAgICAgICBjb250ZXh0OiB0cnVlLFxuICAgICAgICAgIHByb21wdDogYEFuYWx5emUgdGhlc2UgSmVzdCB0ZXN0IHJlc3VsdHMgYW5kIHN1Z2dlc3QgdGVzdCBjb3ZlcmFnZSBpbXByb3ZlbWVudHM6XG5cbiR7SlNPTi5zdHJpbmdpZnkodGVzdFJlc3VsdHMsIG51bGwsIDIpfVxuXG5UZXN0IHBhdHRlcm5zOiAke2ZpbGVQYXR0ZXJucy5qb2luKCcsICcpfVxuXG5QbGVhc2UgcHJvdmlkZTpcbjEuIEFuYWx5c2lzIG9mIGN1cnJlbnQgY292ZXJhZ2UgZ2Fwc1xuMi4gU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0ZXN0IGNhc2VzXG4zLiBSZWNvbW1lbmRhdGlvbnMgZm9yIGFkZGl0aW9uYWwgaW50ZWdyYXRpb24gdGVzdCBzY2VuYXJpb3NcbjQuIEJlc3QgcHJhY3RpY2VzIGZvciBpbmNyZWFzaW5nIHRlc3QgZWZmZWN0aXZlbmVzc2AsXG4gICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgdGFzazogJ29wdGltaXplJ1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIHRlc3QgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSB0ZXN0IGFuYWx5c2lzJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2hlY2sgZm9yIHVuaXQgdGVzdCBlcnJvcnMgYW5kL29yIGNvdmVyYWdlLmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnVGVzdGluZyBmYWlsZWQhJyk7XG5cbiAgICBpZih1c2VEZWJ1Zykge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRlc3QgZmFpbHVyZXMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuXG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgICAgcHJvbXB0OiBgRGVidWcgdGhlc2UgZmFpbGVkIEplc3QgdGVzdHMgYW5kIHN1Z2dlc3QgZml4ZXM6XG5cbiR7SlNPTi5zdHJpbmdpZnkoZXJyb3IubWVzc2FnZSwgbnVsbCwgMil9XG5cblRlc3QgcmVzdWx0czogJHtKU09OLnN0cmluZ2lmeSh0ZXN0UmVzdWx0cywgbnVsbCwgMil9XG5cblBsZWFzZSBwcm92aWRlOlxuMS4gQW5hbHlzaXMgb2Ygd2h5IHRoZSB0ZXN0cyBhcmUgZmFpbGluZ1xuMi4gU3BlY2lmaWMgc3VnZ2VzdGlvbnMgdG8gZml4IGVhY2ggZmFpbGluZyB0ZXN0XG4zLiBBbnkgcG90ZW50aWFsIGlzc3VlcyB3aXRoIHRlc3QgZml4dHVyZXMgb3IgbW9ja3NcbjQuIENvZGUgZXhhbXBsZXMgZm9yIHNvbHV0aW9uc2AsXG4gICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgdGFzazogJ2hlbHAnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnQUkgZGVidWdnaW5nIGFzc2lzdGFuY2UgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSBkZWJ1Z2dpbmcgYXNzaXN0YW5jZScpO1xuICAgICAgICBpZighcXVpZXQpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIGRlYnVnZ2luZyBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNhbGxiYWNrKDEpO1xuICAgIHJldHVybiAxO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB0ZXN0OyJdLCJuYW1lcyI6WyJleGVjYSIsImV4aXN0c1N5bmMiLCJyZWFkRmlsZVN5bmMiLCJzeW5jIiwiZ2xvYlN5bmMiLCJyZXNvbHZlIiwicGF0aFJlc29sdmUiLCJMZXhDb25maWciLCJnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aCIsImNyZWF0ZVNwaW5uZXIiLCJyZXNvbHZlQmluYXJ5UGF0aCIsImxvZyIsImFpRnVuY3Rpb24iLCJkZXRlY3RFU00iLCJjd2QiLCJwYWNrYWdlSnNvblBhdGgiLCJwYWNrYWdlSnNvbkNvbnRlbnQiLCJwYWNrYWdlSnNvbiIsIkpTT04iLCJwYXJzZSIsInR5cGUiLCJfZXJyb3IiLCJkZWZhdWx0RXhpdCIsImNvZGUiLCJwcm9jZXNzIiwiZW52IiwiSkVTVF9XT1JLRVJfSUQiLCJOT0RFX0VOViIsInVuZGVmaW5lZCIsImV4aXQiLCJnZXRUZXN0RmlsZVBhdHRlcm5zIiwidGVzdFBhdGhQYXR0ZXJuIiwiZGVmYXVsdFBhdHRlcm5zIiwiZmluZFVuY292ZXJlZFNvdXJjZUZpbGVzIiwic291cmNlRmlsZXMiLCJpZ25vcmUiLCJ0ZXN0RmlsZXMiLCJmaWx0ZXIiLCJzb3VyY2VGaWxlIiwiYmFzZU5hbWUiLCJyZXBsYWNlIiwic29tZSIsInRlc3RGaWxlIiwiaW5jbHVkZXMiLCJwcm9jZXNzVGVzdFJlc3VsdHMiLCJvdXRwdXRGaWxlIiwiY29udGVudCIsInRlc3QiLCJvcHRpb25zIiwiYXJncyIsImZpbGVzT3JDYWxsYmFjayIsImNhbGxiYWNrUGFyYW0iLCJmaWxlcyIsImNhbGxiYWNrIiwiYW5hbHl6ZSIsImFpQW5hbHl6ZSIsImFpRGVidWciLCJhaUdlbmVyYXRlIiwiYmFpbCIsImNoYW5nZWRGaWxlc1dpdGhBbmNlc3RvciIsImNoYW5nZWRTaW5jZSIsImNpIiwiY2xpTmFtZSIsImNvbGxlY3RDb3ZlcmFnZUZyb20iLCJjb2xvcnMiLCJjb25maWciLCJkZWJ1ZyIsImRlYnVnVGVzdHMiLCJkZXRlY3RPcGVuSGFuZGxlcyIsImVycm9yT25EZXByZWNhdGVkIiwiZXhwYW5kIiwiZm9yY2VFeGl0IiwiZ2VuZXJhdGUiLCJqc29uIiwibGFzdENvbW1pdCIsImxpc3RUZXN0cyIsImxvZ0hlYXBVc2FnZSIsIm1heFdvcmtlcnMiLCJub1N0YWNrVHJhY2UiLCJub3RpZnkiLCJvbmx5Q2hhbmdlZCIsInBhc3NXaXRoTm9UZXN0cyIsInF1aWV0IiwicmVtb3ZlQ2FjaGUiLCJydW5JbkJhbmQiLCJzZXR1cCIsInNob3dDb25maWciLCJzaWxlbnQiLCJ0ZXN0TG9jYXRpb25JblJlc3VsdHMiLCJ0ZXN0TmFtZVBhdHRlcm4iLCJ1cGRhdGUiLCJ1c2VTdGRlcnIiLCJ2ZXJib3NlIiwid2F0Y2giLCJ3YXRjaEFsbCIsInVzZUdlbmVyYXRlIiwidXNlQW5hbHl6ZSIsInVzZURlYnVnIiwic3Bpbm5lciIsInBhcnNlQ29uZmlnIiwidXNlVHlwZXNjcmlwdCIsInRlc3RDb25maWdQYXRoIiwiY2hlY2tUZXN0VHlwZXNjcmlwdENvbmZpZyIsInN0YXJ0IiwidW5jb3ZlcmVkRmlsZXMiLCJsZW5ndGgiLCJ0YXJnZXRGaWxlIiwiY29udGV4dCIsImZpbGUiLCJwcm9tcHQiLCJ0YXNrIiwic3VjY2VlZCIsImFpRXJyb3IiLCJmYWlsIiwiY29uc29sZSIsImVycm9yIiwicHJvamVjdEplc3RCaW4iLCJqZXN0UGF0aCIsImplc3RDb25maWdGaWxlIiwicHJvamVjdEplc3RDb25maWciLCJwcm9qZWN0SmVzdENvbmZpZ1BhdGgiLCJwcm9qZWN0SmVzdENvbmZpZ0Nqc1BhdGgiLCJwcm9qZWN0SmVzdENvbmZpZ01qc1BhdGgiLCJwcm9qZWN0SmVzdENvbmZpZ0pzb25QYXRoIiwiamVzdCIsImxleERpciIsImdldExleERpciIsImxleEplc3RDb25maWciLCJPYmplY3QiLCJrZXlzIiwiamVzdFNldHVwRmlsZSIsImplc3RPcHRpb25zIiwiaXNFU00iLCJub2RlT3B0aW9ucyIsIk5PREVfT1BUSU9OUyIsInRyaW0iLCJwdXNoIiwidGVtcE91dHB1dEZpbGUiLCJqb2luIiwiZW5jb2RpbmciLCJzdGRpbyIsInRlc3RSZXN1bHRzIiwiZmlsZVBhdHRlcm5zIiwic3RyaW5naWZ5IiwibWVzc2FnZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsS0FBSyxRQUFPLFFBQVE7QUFDNUIsU0FBUUMsVUFBVSxFQUFFQyxZQUFZLFFBQU8sS0FBSztBQUM1QyxTQUFRQyxRQUFRQyxRQUFRLFFBQU8sT0FBTztBQUN0QyxTQUFRQyxXQUFXQyxXQUFX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
429
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy90ZXN0L3Rlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCB7ZXhlY2F9IGZyb20gJ2V4ZWNhJztcbmltcG9ydCB7ZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge3N5bmMgYXMgZ2xvYlN5bmN9IGZyb20gJ2dsb2InO1xuaW1wb3J0IHtyZXNvbHZlIGFzIHBhdGhSZXNvbHZlfSBmcm9tICdwYXRoJztcblxuaW1wb3J0IHtMZXhDb25maWcsIGdldFR5cGVTY3JpcHRDb25maWdQYXRofSBmcm9tICcuLi8uLi9MZXhDb25maWcuanMnO1xuaW1wb3J0IHtjcmVhdGVTcGlubmVyfSBmcm9tICcuLi8uLi91dGlscy9hcHAuanMnO1xuaW1wb3J0IHtyZXNvbHZlQmluYXJ5UGF0aH0gZnJvbSAnLi4vLi4vdXRpbHMvZmlsZS5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcbmltcG9ydCB7YWlGdW5jdGlvbn0gZnJvbSAnLi4vYWkvYWkuanMnO1xuXG5jb25zdCBkZXRlY3RFU00gPSAoY3dkOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aFJlc29sdmUoY3dkLCAncGFja2FnZS5qc29uJyk7XG5cbiAgaWYoZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhY2thZ2VKc29uQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Db250ZW50KTtcbiAgICAgIHJldHVybiBwYWNrYWdlSnNvbi50eXBlID09PSAnbW9kdWxlJztcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVzdE9wdGlvbnMge1xuICByZWFkb25seSBhbmFseXplPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYWlEZWJ1Zz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGFpR2VuZXJhdGU/OiBib29sZWFuO1xuICByZWFkb25seSBhaUFuYWx5emU/OiBib29sZWFuO1xuICByZWFkb25seSBiYWlsPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgY2hhbmdlZFNpbmNlPzogc3RyaW5nO1xuICByZWFkb25seSBjaT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGNsZWFyQ2FjaGU/OiBib29sZWFuO1xuICByZWFkb25seSBjbGlOYW1lPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xsZWN0Q292ZXJhZ2VGcm9tPzogc3RyaW5nO1xuICByZWFkb25seSBjb2xvcnM/OiBib29sZWFuO1xuICByZWFkb25seSBjb25maWc/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZGVidWdUZXN0cz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGRldGVjdE9wZW5IYW5kbGVzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGVudj86IHN0cmluZztcbiAgcmVhZG9ubHkgZXJyb3JPbkRlcHJlY2F0ZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBleHBhbmQ/OiBib29sZWFuO1xuICByZWFkb25seSBmb3JjZUV4aXQ/OiBib29sZWFuO1xuICByZWFkb25seSBnZW5lcmF0ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGpzb24/OiBib29sZWFuO1xuICByZWFkb25seSBsYXN0Q29tbWl0PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbGlzdFRlc3RzPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbG9nSGVhcFVzYWdlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbWF4V29ya2Vycz86IHN0cmluZztcbiAgcmVhZG9ubHkgbm9TdGFja1RyYWNlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbm90aWZ5PzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgb25seUNoYW5nZWQ/OiBib29sZWFuO1xuICByZWFkb25seSBvdXRwdXRGaWxlPzogc3RyaW5nO1xuICByZWFkb25seSBwYXNzV2l0aE5vVGVzdHM/OiBib29sZWFuO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZUNhY2hlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcnVuSW5CYW5kPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgc2V0dXA/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHNob3dDb25maWc/OiBib29sZWFuO1xuICByZWFkb25seSBzaWxlbnQ/OiBib29sZWFuO1xuICByZWFkb25seSB0ZXN0TG9jYXRpb25JblJlc3VsdHM/OiBib29sZWFuO1xuICByZWFkb25seSB0ZXN0TmFtZVBhdHRlcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRlc3RQYXRoUGF0dGVybj86IHN0cmluZztcbiAgcmVhZG9ubHkgdXBkYXRlPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdXNlU3RkZXJyPzogYm9vbGVhbjtcbiAgcmVhZG9ubHkgdmVyYm9zZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdhdGNoPzogc3RyaW5nO1xuICByZWFkb25seSB3YXRjaEFsbD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFRlc3RDYWxsYmFjayA9IHR5cGVvZiBwcm9jZXNzLmV4aXQ7XG5cbmNvbnN0IGRlZmF1bHRFeGl0ID0gKChjb2RlPzogbnVtYmVyKSA9PiB7XG4gIGlmKHByb2Nlc3MuZW52LlZJVEVTVCB8fCBwcm9jZXNzLmVudi5WSVRFU1RfV09SS0VSX0lEIHx8IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAndGVzdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIG5ldmVyO1xuICB9XG5cbiAgcHJvY2Vzcy5leGl0KGNvZGUpO1xufSkgYXMgdHlwZW9mIHByb2Nlc3MuZXhpdDtcblxuZXhwb3J0IGNvbnN0IGdldFRlc3RGaWxlUGF0dGVybnMgPSAodGVzdFBhdGhQYXR0ZXJuPzogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBkZWZhdWx0UGF0dGVybnMgPSBbJyoqLyoudGVzdC4qJywgJyoqLyouc3BlYy4qJywgJyoqLyouaW50ZWdyYXRpb24uKiddO1xuXG4gIGlmKCF0ZXN0UGF0aFBhdHRlcm4pIHtcbiAgICByZXR1cm4gZGVmYXVsdFBhdHRlcm5zO1xuICB9XG5cbiAgcmV0dXJuIFt0ZXN0UGF0aFBhdHRlcm5dO1xufTtcblxuY29uc3QgZmluZFVuY292ZXJlZFNvdXJjZUZpbGVzID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgY29uc3Qgc291cmNlRmlsZXMgPSBnbG9iU3luYygnc3JjLyoqLyoue3RzLHRzeCxqcyxqc3h9Jywge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqL2Rpc3QvKionLCAnKiovbGliLyoqJywgJyoqLyoudGVzdC4qJywgJyoqLyouc3BlYy4qJ11cbiAgfSk7XG5cbiAgY29uc3QgdGVzdEZpbGVzID0gZ2xvYlN5bmMoJyoqLyoue3Rlc3Qsc3BlY30ue3RzLHRzeCxqcyxqc3h9Jywge1xuICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICBpZ25vcmU6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqL2Rpc3QvKionLCAnKiovbGliLyoqJ11cbiAgfSk7XG5cbiAgcmV0dXJuIHNvdXJjZUZpbGVzLmZpbHRlcigoc291cmNlRmlsZSkgPT4ge1xuICAgIGNvbnN0IGJhc2VOYW1lID0gc291cmNlRmlsZS5yZXBsYWNlKC9cXC5bXi8uXSskLywgJycpO1xuICAgIHJldHVybiAhdGVzdEZpbGVzLnNvbWUoKHRlc3RGaWxlKSA9PiB0ZXN0RmlsZS5pbmNsdWRlcyhiYXNlTmFtZSkpO1xuICB9KTtcbn07XG5cbmNvbnN0IHByb2Nlc3NUZXN0UmVzdWx0cyA9IChvdXRwdXRGaWxlPzogc3RyaW5nKTogYW55ID0+IHtcbiAgaWYoIW91dHB1dEZpbGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyhvdXRwdXRGaWxlLCAndXRmLTgnKTtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgfSBjYXRjaChfZXJyb3IpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHRlc3QgPSBhc3luYyAoXG4gIG9wdGlvbnM6IFRlc3RPcHRpb25zLFxuICBhcmdzPzogc3RyaW5nW10sXG4gIGZpbGVzT3JDYWxsYmFjaz86IHN0cmluZ1tdIHwgVGVzdENhbGxiYWNrLFxuICBjYWxsYmFja1BhcmFtPzogVGVzdENhbGxiYWNrXG4pOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICAvLyBCYWNrd2FyZC1jb21wYXQgYXJndW1lbnQgbm9ybWFsaXphdGlvbjogYWxsb3cgY2FsbGJhY2sgYXMgdGhpcmQgcGFyYW1cbiAgbGV0IGZpbGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgbGV0IGNhbGxiYWNrOiBUZXN0Q2FsbGJhY2sgPSBkZWZhdWx0RXhpdDtcblxuICBpZih0eXBlb2YgZmlsZXNPckNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2FsbGJhY2sgPSBmaWxlc09yQ2FsbGJhY2sgYXMgVGVzdENhbGxiYWNrO1xuICB9IGVsc2Uge1xuICAgIGZpbGVzID0gZmlsZXNPckNhbGxiYWNrIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGNhbGxiYWNrID0gY2FsbGJhY2tQYXJhbSB8fCBkZWZhdWx0RXhpdDtcbiAgfVxuICBjb25zdCB7XG4gICAgYW5hbHl6ZSA9IGZhbHNlLFxuICAgIGFpQW5hbHl6ZSA9IGZhbHNlLFxuICAgIGFpRGVidWcgPSBmYWxzZSxcbiAgICBhaUdlbmVyYXRlID0gZmFsc2UsXG4gICAgYmFpbCxcbiAgICBjaGFuZ2VkRmlsZXNXaXRoQW5jZXN0b3IsXG4gICAgY2hhbmdlZFNpbmNlLFxuICAgIGNpLFxuICAgIGNsZWFyQ2FjaGUsXG4gICAgY2xpTmFtZSA9ICdMZXgnLFxuICAgIGNvbGxlY3RDb3ZlcmFnZUZyb20sXG4gICAgY29sb3JzLFxuICAgIGNvbmZpZyxcbiAgICBkZWJ1ZyA9IGZhbHNlLFxuICAgIGRlYnVnVGVzdHMgPSBmYWxzZSxcbiAgICBkZXRlY3RPcGVuSGFuZGxlcyxcbiAgICBlbnZpcm9ubWVudCxcbiAgICBlbnYsXG4gICAgZXJyb3JPbkRlcHJlY2F0ZWQsXG4gICAgZXhwYW5kLFxuICAgIGZvcmNlRXhpdCxcbiAgICBnZW5lcmF0ZSA9IGZhbHNlLFxuICAgIGpzb24sXG4gICAgbGFzdENvbW1pdCxcbiAgICBsaXN0VGVzdHMsXG4gICAgbG9nSGVhcFVzYWdlLFxuICAgIG1heFdvcmtlcnMsXG4gICAgbm9TdGFja1RyYWNlLFxuICAgIG5vdGlmeSxcbiAgICBvbmx5Q2hhbmdlZCxcbiAgICBvdXRwdXRGaWxlLFxuICAgIHBhc3NXaXRoTm9UZXN0cyxcbiAgICBxdWlldCxcbiAgICByZW1vdmVDYWNoZSxcbiAgICBydW5JbkJhbmQsXG4gICAgc2V0dXAsXG4gICAgc2hvd0NvbmZpZyxcbiAgICBzaWxlbnQsXG4gICAgdGVzdExvY2F0aW9uSW5SZXN1bHRzLFxuICAgIHRlc3ROYW1lUGF0dGVybixcbiAgICB0ZXN0UGF0aFBhdHRlcm4sXG4gICAgdXBkYXRlLFxuICAgIHVzZVN0ZGVycixcbiAgICB2ZXJib3NlLFxuICAgIHdhdGNoLFxuICAgIHdhdGNoQWxsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IHVzZUdlbmVyYXRlID0gZ2VuZXJhdGUgfHwgYWlHZW5lcmF0ZTtcbiAgY29uc3QgdXNlQW5hbHl6ZSA9IGFuYWx5emUgfHwgYWlBbmFseXplO1xuICBjb25zdCB1c2VEZWJ1ZyA9IGRlYnVnVGVzdHMgfHwgYWlEZWJ1ZztcblxuICBsb2coYCR7Y2xpTmFtZX0gdGVzdGluZy4uLmAsICdpbmZvJywgcXVpZXQpO1xuXG4gIGNvbnN0IHNwaW5uZXIgPSBjcmVhdGVTcGlubmVyKHF1aWV0KTtcblxuICBhd2FpdCBMZXhDb25maWcucGFyc2VDb25maWcob3B0aW9ucyk7XG5cbiAgY29uc3Qge3VzZVR5cGVzY3JpcHR9ID0gTGV4Q29uZmlnLmNvbmZpZztcblxuICBpZih1c2VUeXBlc2NyaXB0KSB7XG4gICAgY29uc3QgdGVzdENvbmZpZ1BhdGggPSBnZXRUeXBlU2NyaXB0Q29uZmlnUGF0aCgndHNjb25maWcudGVzdC5qc29uJyk7XG4gICAgaWYoZXhpc3RzU3luYyh0ZXN0Q29uZmlnUGF0aCkpIHtcbiAgICAgIGxvZygnVXNpbmcgdHNjb25maWcudGVzdC5qc29uIGZvciB0ZXN0aW5nLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIExleENvbmZpZy5jaGVja1Rlc3RUeXBlc2NyaXB0Q29uZmlnKCk7XG4gICAgfVxuICB9XG5cbiAgaWYodXNlR2VuZXJhdGUpIHtcbiAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgY29kZSB0byBnZW5lcmF0ZSB0ZXN0IGNhc2VzLi4uJyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdW5jb3ZlcmVkRmlsZXMgPSBmaW5kVW5jb3ZlcmVkU291cmNlRmlsZXMoKTtcblxuICAgICAgaWYodW5jb3ZlcmVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCB0YXJnZXRGaWxlID0gdW5jb3ZlcmVkRmlsZXNbMF07XG5cbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBmaWxlOiB0YXJnZXRGaWxlLFxuICAgICAgICAgIHByb21wdDogYEdlbmVyYXRlIFZpdGVzdCB1bml0IHRlc3RzIGZvciB0aGlzIGZpbGU6ICR7dGFyZ2V0RmlsZX1cXG5cXG4ke3JlYWRGaWxlU3luYyh0YXJnZXRGaWxlLCAndXRmLTgnKX1cXG5cXG5QbGVhc2UgY3JlYXRlIGNvbXByZWhlbnNpdmUgdGVzdHMgdGhhdCBjb3ZlciB0aGUgbWFpbiBmdW5jdGlvbmFsaXR5LiBJbmNsdWRlIHRlc3QgZml4dHVyZXMgYW5kIG1vY2tzIHdoZXJlIG5lY2Vzc2FyeS5gLFxuICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgIHRhc2s6ICd0ZXN0J1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoYEFJIHRlc3QgZ2VuZXJhdGlvbiBzdWdnZXN0aW9ucyBwcm92aWRlZCBmb3IgJHt0YXJnZXRGaWxlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBbGwgc291cmNlIGZpbGVzIGFwcGVhciB0byBoYXZlIGNvcnJlc3BvbmRpbmcgdGVzdCBmaWxlcycpO1xuICAgICAgfVxuICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdDb3VsZCBub3QgZ2VuZXJhdGUgQUkgdGVzdCBzdWdnZXN0aW9ucycpO1xuICAgICAgaWYoIXF1aWV0KSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0FJIHRlc3QgZ2VuZXJhdGlvbiBlcnJvcjonLCBhaUVycm9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBwcm9qZWN0Vml0ZXN0QmluID0gcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy8uYmluL3ZpdGVzdCcpO1xuICBsZXQgdml0ZXN0UGF0aDogc3RyaW5nO1xuXG4gIGlmKGV4aXN0c1N5bmMocHJvamVjdFZpdGVzdEJpbikpIHtcbiAgICB2aXRlc3RQYXRoID0gcHJvamVjdFZpdGVzdEJpbjtcbiAgfSBlbHNlIHtcbiAgICB2aXRlc3RQYXRoID0gcmVzb2x2ZUJpbmFyeVBhdGgoJ3ZpdGVzdCcpO1xuICB9XG5cbiAgaWYoIXZpdGVzdFBhdGgpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6IFZpdGVzdCBiaW5hcnkgbm90IGZvdW5kIGluIExleCdzIG5vZGVfbW9kdWxlcyBvciBtb25vcmVwbyByb290YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgIGxvZygnUGxlYXNlIHJlaW5zdGFsbCBMZXggb3IgY2hlY2sgeW91ciBpbnN0YWxsYXRpb24uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICBsZXQgdml0ZXN0Q29uZmlnRmlsZTogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcHJvamVjdFZpdGVzdENvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsID0gbnVsbDtcblxuICBpZihjb25maWcpIHtcbiAgICB2aXRlc3RDb25maWdGaWxlID0gY29uZmlnO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb2plY3RWaXRlc3RDb25maWdQYXRocyA9IFtcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd2aXRlc3QuY29uZmlnLnRzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAndml0ZXN0LmNvbmZpZy5tdHMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd2aXRlc3QuY29uZmlnLmpzJyksXG4gICAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAndml0ZXN0LmNvbmZpZy5tanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICd2aXRlc3QuY29uZmlnLmNqcycpXG4gICAgXTtcbiAgICBjb25zdCBleGlzdGluZ0NvbmZpZ1BhdGggPSBwcm9qZWN0Vml0ZXN0Q29uZmlnUGF0aHMuZmluZCgoY29uZmlnUGF0aCkgPT4gZXhpc3RzU3luYyhjb25maWdQYXRoKSk7XG5cbiAgICBpZihleGlzdGluZ0NvbmZpZ1BhdGgpIHtcbiAgICAgIHZpdGVzdENvbmZpZ0ZpbGUgPSBleGlzdGluZ0NvbmZpZ1BhdGg7XG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYFVzaW5nIHByb2plY3QgVml0ZXN0IGNvbmZpZyBmaWxlOiAke3ZpdGVzdENvbmZpZ0ZpbGV9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIFZpdGVzdCBjb25maWcgZmlsZSBleGlzdHMgaW4gdGhlIHByb2plY3RcbiAgICAgIC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBWaXRlc3QgY29uZmlnIGluIGxleC5jb25maWcuY2pzXG4gICAgICBwcm9qZWN0Vml0ZXN0Q29uZmlnID0gTGV4Q29uZmlnLmNvbmZpZy52aXRlc3Q7XG5cbiAgICAgIGNvbnN0IGxleERpciA9IExleENvbmZpZy5nZXRMZXhEaXIoKTtcbiAgICAgIGNvbnN0IGxleFZpdGVzdENvbmZpZyA9IHBhdGhSZXNvbHZlKGxleERpciwgJ3ZpdGVzdC5jb25maWcubWpzJyk7XG5cbiAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgIGxvZyhgTG9va2luZyBmb3IgVml0ZXN0IGNvbmZpZyBhdDogJHtsZXhWaXRlc3RDb25maWd9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgICAgIGxvZyhgRmlsZSBleGlzdHM6ICR7ZXhpc3RzU3luYyhsZXhWaXRlc3RDb25maWcpfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgfVxuXG4gICAgICBpZihleGlzdHNTeW5jKGxleFZpdGVzdENvbmZpZykpIHtcbiAgICAgICAgdml0ZXN0Q29uZmlnRmlsZSA9IGxleFZpdGVzdENvbmZpZztcbiAgICAgICAgaWYocHJvamVjdFZpdGVzdENvbmZpZyAmJiBPYmplY3Qua2V5cyhwcm9qZWN0Vml0ZXN0Q29uZmlnKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgaWYoZGVidWcpIHtcbiAgICAgICAgICAgIGxvZyhgVXNpbmcgTGV4IFZpdGVzdCBjb25maWcgd2l0aCBwcm9qZWN0IFZpdGVzdCBjb25maWcgZnJvbSBsZXguY29uZmlnLmNqczogJHt2aXRlc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmKGRlYnVnKSB7XG4gICAgICAgICAgbG9nKGBVc2luZyBMZXggVml0ZXN0IGNvbmZpZyAobm8gcHJvamVjdCBWaXRlc3QgY29uZmlnIGZvdW5kKTogJHt2aXRlc3RDb25maWdGaWxlfWAsICdpbmZvJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZygnTm8gVml0ZXN0IGNvbmZpZyBmb3VuZCBpbiBwcm9qZWN0IG9yIExleCcsICd3YXJuJywgcXVpZXQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYoc2hvd0NvbmZpZykge1xuICAgIGlmKHZpdGVzdENvbmZpZ0ZpbGUpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkQ29uZmlnID0gYXdhaXQgaW1wb3J0KHZpdGVzdENvbmZpZ0ZpbGUpO1xuICAgICAgbG9nKEpTT04uc3RyaW5naWZ5KHJlc29sdmVkQ29uZmlnLmRlZmF1bHQgPz8gcmVzb2x2ZWRDb25maWcsIG51bGwsIDIpLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nKEpTT04uc3RyaW5naWZ5KHt0ZXN0OiBwcm9qZWN0Vml0ZXN0Q29uZmlnID8/IHt9fSwgbnVsbCwgMiksICdpbmZvJywgcXVpZXQpO1xuICAgIH1cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIGNvbnN0IHZpdGVzdFNldHVwRmlsZTogc3RyaW5nID0gc2V0dXAgfHwgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJ3ZpdGVzdC5zZXR1cC5qcycpO1xuICBjb25zdCB2aXRlc3RBcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB2aXRlc3RPcHRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCByZXBvcnRlcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgZmlsdGVyczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgd2F0Y2hNb2RlID0gQm9vbGVhbih3YXRjaCB8fCB3YXRjaEFsbCk7XG4gIGNvbnN0IGxpc3RNb2RlID0gQm9vbGVhbihsaXN0VGVzdHMpO1xuXG4gIGlmKGxpc3RNb2RlKSB7XG4gICAgdml0ZXN0QXJncy5wdXNoKCdsaXN0Jyk7XG4gIH0gZWxzZSBpZih3YXRjaE1vZGUpIHtcbiAgICB2aXRlc3RBcmdzLnB1c2goJ3dhdGNoJyk7XG4gIH0gZWxzZSB7XG4gICAgdml0ZXN0QXJncy5wdXNoKCdydW4nKTtcbiAgfVxuXG4gIGNvbnN0IGlzRVNNID0gZGV0ZWN0RVNNKHByb2Nlc3MuY3dkKCkpO1xuICBsZXQgbm9kZU9wdGlvbnMgPSBwcm9jZXNzLmVudi5OT0RFX09QVElPTlMgfHwgJyc7XG4gIGlmKGlzRVNNKSB7XG4gICAgaWYoIW5vZGVPcHRpb25zLmluY2x1ZGVzKCctLWV4cGVyaW1lbnRhbC12bS1tb2R1bGVzJykpIHtcbiAgICAgIG5vZGVPcHRpb25zID0gYCR7bm9kZU9wdGlvbnN9IC0tZXhwZXJpbWVudGFsLXZtLW1vZHVsZXNgLnRyaW0oKTtcbiAgICB9XG4gICAgbG9nKCdFU00gcHJvamVjdCBkZXRlY3RlZCwgdXNpbmcgLS1leHBlcmltZW50YWwtdm0tbW9kdWxlcyBpbiBOT0RFX09QVElPTlMnLCAnaW5mbycsIHF1aWV0KTtcbiAgfVxuXG4gIGlmKHZpdGVzdENvbmZpZ0ZpbGUpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tY29uZmlnJywgdml0ZXN0Q29uZmlnRmlsZSk7XG4gIH1cblxuICBpZihiYWlsKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWJhaWwnLCAnMScpO1xuICB9XG5cbiAgaWYoY2hhbmdlZEZpbGVzV2l0aEFuY2VzdG9yKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWNoYW5nZWQnKTtcbiAgfVxuXG4gIGlmKGNoYW5nZWRTaW5jZSkge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS1jaGFuZ2VkJywgY2hhbmdlZFNpbmNlKTtcbiAgfVxuXG4gIGlmKGNpKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLXJ1bicpO1xuICB9XG5cbiAgaWYoY29sbGVjdENvdmVyYWdlRnJvbSkge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS1jb3ZlcmFnZScsICctLWNvdmVyYWdlLmluY2x1ZGUnLCBjb2xsZWN0Q292ZXJhZ2VGcm9tKTtcbiAgfVxuXG4gIGlmKGRlYnVnKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWluc3BlY3QnKTtcbiAgfVxuXG4gIGlmKGRldGVjdE9wZW5IYW5kbGVzKSB7XG4gICAgcmVwb3J0ZXJzLmFkZCgnaGFuZ2luZy1wcm9jZXNzJyk7XG4gIH1cblxuICBjb25zdCBlbnZpcm9ubWVudE5hbWUgPSBlbnZpcm9ubWVudCB8fCBlbnY7XG4gIGlmKGVudmlyb25tZW50TmFtZSkge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS1lbnZpcm9ubWVudCcsIGVudmlyb25tZW50TmFtZSk7XG4gIH1cblxuICBpZihlcnJvck9uRGVwcmVjYXRlZCkge1xuICAgIGxvZygnVml0ZXN0IGRvZXMgbm90IHN1cHBvcnQgLS1lcnJvck9uRGVwcmVjYXRlZDsgb3B0aW9uIGlnbm9yZWQuJywgJ3dhcm4nLCBxdWlldCk7XG4gIH1cblxuICBpZihleHBhbmQpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tZXhwYW5kU25hcHNob3REaWZmJyk7XG4gIH1cblxuICBpZihmb3JjZUV4aXQpIHtcbiAgICBsb2coJ1ZpdGVzdCBkb2VzIG5vdCBzdXBwb3J0IC0tZm9yY2VFeGl0OyBvcHRpb24gaWdub3JlZC4nLCAnd2FybicsIHF1aWV0KTtcbiAgfVxuXG4gIGlmKGxhc3RDb21taXQpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tY2hhbmdlZCcpO1xuICB9XG5cbiAgaWYobG9nSGVhcFVzYWdlKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWxvZ0hlYXBVc2FnZScpO1xuICB9XG5cbiAgaWYobWF4V29ya2Vycykge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS1tYXhXb3JrZXJzJywgbWF4V29ya2Vycyk7XG4gIH1cblxuICBpZihub1N0YWNrVHJhY2UpIHtcbiAgICBsb2coJ1ZpdGVzdCBkb2VzIG5vdCBzdXBwb3J0IC0tbm9TdGFja1RyYWNlOyBvcHRpb24gaWdub3JlZC4nLCAnd2FybicsIHF1aWV0KTtcbiAgfVxuXG4gIGlmKG5vdGlmeSkge1xuICAgIGxvZygnVml0ZXN0IGRvZXMgbm90IHN1cHBvcnQgLS1ub3RpZnk7IG9wdGlvbiBpZ25vcmVkLicsICd3YXJuJywgcXVpZXQpO1xuICB9XG5cbiAgaWYob25seUNoYW5nZWQpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tY2hhbmdlZCcpO1xuICB9XG5cbiAgbGV0IHRlbXBPdXRwdXRGaWxlID0gb3V0cHV0RmlsZTtcbiAgY29uc3Qgc2hvdWxkV3JpdGVKc29uID0ganNvbiB8fCB1c2VBbmFseXplIHx8IHVzZURlYnVnIHx8IEJvb2xlYW4ob3V0cHV0RmlsZSk7XG5cbiAgaWYoc2hvdWxkV3JpdGVKc29uKSB7XG4gICAgdGVtcE91dHB1dEZpbGUgPSBvdXRwdXRGaWxlIHx8ICcubGV4LXRlc3QtcmVzdWx0cy5qc29uJztcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tb3V0cHV0RmlsZScsIHRlbXBPdXRwdXRGaWxlKTtcbiAgICByZXBvcnRlcnMuYWRkKCdqc29uJyk7XG4gIH1cblxuICBpZihwYXNzV2l0aE5vVGVzdHMpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tcGFzc1dpdGhOb1Rlc3RzJyk7XG4gIH1cblxuICBpZihydW5JbkJhbmQpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goJy0tbm8tZmlsZS1wYXJhbGxlbGlzbScsICctLW1heFdvcmtlcnMnLCAnMScpO1xuICB9XG5cbiAgaWYoc2lsZW50KSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLXNpbGVudCcpO1xuICB9XG5cbiAgaWYodGVzdExvY2F0aW9uSW5SZXN1bHRzKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWluY2x1ZGVUYXNrTG9jYXRpb24nKTtcbiAgfVxuXG4gIGlmKHRlc3ROYW1lUGF0dGVybikge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS10ZXN0TmFtZVBhdHRlcm4nLCB0ZXN0TmFtZVBhdHRlcm4pO1xuICB9XG5cbiAgaWYodGVzdFBhdGhQYXR0ZXJuKSB7XG4gICAgZmlsdGVycy5wdXNoKHRlc3RQYXRoUGF0dGVybik7XG4gIH1cblxuICBpZih1c2VTdGRlcnIpIHtcbiAgICBsb2coJ1ZpdGVzdCBkb2VzIG5vdCBzdXBwb3J0IC0tdXNlU3RkZXJyOyBvcHRpb24gaWdub3JlZC4nLCAnd2FybicsIHF1aWV0KTtcbiAgfVxuXG4gIGlmKHZlcmJvc2UpIHtcbiAgICByZXBvcnRlcnMuYWRkKCd2ZXJib3NlJyk7XG4gIH1cblxuICBpZihyZW1vdmVDYWNoZSB8fCBjbGVhckNhY2hlKSB7XG4gICAgdml0ZXN0T3B0aW9ucy5wdXNoKCctLWNsZWFyQ2FjaGUnKTtcbiAgfVxuXG4gIGlmKHVwZGF0ZSkge1xuICAgIHZpdGVzdE9wdGlvbnMucHVzaCgnLS11cGRhdGUnKTtcbiAgfVxuXG4gIGlmKHdhdGNoKSB7XG4gICAgZmlsdGVycy5wdXNoKHdhdGNoKTtcbiAgfVxuXG4gIGlmKGFyZ3MpIHtcbiAgICB2aXRlc3RPcHRpb25zLnB1c2goLi4uYXJncyk7XG4gIH1cblxuICBpZihmaWxlcyAmJiBmaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgZmlsdGVycy5wdXNoKC4uLmZpbGVzKTtcbiAgfVxuXG4gIGlmKHJlcG9ydGVycy5zaXplID4gMCkge1xuICAgIGNvbnN0IHJlcG9ydGVyTGlzdCA9IEFycmF5LmZyb20ocmVwb3J0ZXJzKTtcbiAgICBpZihyZXBvcnRlckxpc3QuaW5jbHVkZXMoJ2pzb24nKSAmJiAhcmVwb3J0ZXJMaXN0LmluY2x1ZGVzKCd2ZXJib3NlJykpIHtcbiAgICAgIC8vIEtlZXAgY29uc29sZSBvdXRwdXQgd2hpbGUgd3JpdGluZyBKU09OIHJlc3VsdHMuXG4gICAgICByZXBvcnRlckxpc3QudW5zaGlmdCgnZGVmYXVsdCcpO1xuICAgIH1cbiAgICByZXBvcnRlckxpc3QuZm9yRWFjaCgocmVwb3J0ZXIpID0+IHZpdGVzdE9wdGlvbnMucHVzaCgnLS1yZXBvcnRlcicsIHJlcG9ydGVyKSk7XG4gIH1cblxuICBjb25zdCBmaW5hbEFyZ3MgPSBbLi4udml0ZXN0QXJncywgLi4udml0ZXN0T3B0aW9ucywgLi4uZmlsdGVyc107XG5cbiAgaWYoZGVidWcpIHtcbiAgICBsb2coYFZpdGVzdCBvcHRpb25zOiAke2ZpbmFsQXJncy5qb2luKCcgJyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgbG9nKGBOT0RFX09QVElPTlM6ICR7bm9kZU9wdGlvbnN9YCwgJ2luZm8nLCBxdWlldCk7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgTk9ERV9PUFRJT05TOiBub2RlT3B0aW9uc1xuICAgIH07XG5cbiAgICBpZihjb2xvcnMpIHtcbiAgICAgIGVudi5GT1JDRV9DT0xPUiA9ICcxJztcbiAgICB9XG5cbiAgICBpZihjaSkge1xuICAgICAgZW52LkNJID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGlmKHZpdGVzdFNldHVwRmlsZSAmJiBleGlzdHNTeW5jKHZpdGVzdFNldHVwRmlsZSkpIHtcbiAgICAgIGVudi5MRVhfVklURVNUX1NFVFVQID0gdml0ZXN0U2V0dXBGaWxlO1xuICAgIH1cblxuICAgIGF3YWl0IGV4ZWNhKHZpdGVzdFBhdGgsIGZpbmFsQXJncywge1xuICAgICAgZW5jb2Rpbmc6ICd1dGY4JyxcbiAgICAgIGVudixcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCdcbiAgICB9KTtcblxuICAgIHNwaW5uZXIuc3VjY2VlZCgnVGVzdGluZyBjb21wbGV0ZWQhJyk7XG5cbiAgICBpZih1c2VBbmFseXplKSB7XG4gICAgICBzcGlubmVyLnN0YXJ0KCdBSSBpcyBhbmFseXppbmcgdGVzdCBjb3ZlcmFnZSBhbmQgc3VnZ2VzdGluZyBpbXByb3ZlbWVudHMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuICAgICAgICBjb25zdCBmaWxlUGF0dGVybnMgPSBnZXRUZXN0RmlsZVBhdHRlcm5zKHRlc3RQYXRoUGF0dGVybik7XG5cbiAgICAgICAgYXdhaXQgYWlGdW5jdGlvbih7XG4gICAgICAgICAgY29udGV4dDogdHJ1ZSxcbiAgICAgICAgICBwcm9tcHQ6IGBBbmFseXplIHRoZXNlIFZpdGVzdCB0ZXN0IHJlc3VsdHMgYW5kIHN1Z2dlc3QgdGVzdCBjb3ZlcmFnZSBpbXByb3ZlbWVudHM6XG5cbiR7SlNPTi5zdHJpbmdpZnkodGVzdFJlc3VsdHMsIG51bGwsIDIpfVxuXG5UZXN0IHBhdHRlcm5zOiAke2ZpbGVQYXR0ZXJucy5qb2luKCcsICcpfVxuXG5QbGVhc2UgcHJvdmlkZTpcbjEuIEFuYWx5c2lzIG9mIGN1cnJlbnQgY292ZXJhZ2UgZ2Fwc1xuMi4gU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmluZyB0ZXN0IGNhc2VzXG4zLiBSZWNvbW1lbmRhdGlvbnMgZm9yIGFkZGl0aW9uYWwgaW50ZWdyYXRpb24gdGVzdCBzY2VuYXJpb3NcbjQuIEJlc3QgcHJhY3RpY2VzIGZvciBpbmNyZWFzaW5nIHRlc3QgZWZmZWN0aXZlbmVzc2AsXG4gICAgICAgICAgcXVpZXQsXG4gICAgICAgICAgdGFzazogJ29wdGltaXplJ1xuICAgICAgICB9KTtcblxuICAgICAgICBzcGlubmVyLnN1Y2NlZWQoJ0FJIHRlc3QgYW5hbHlzaXMgY29tcGxldGUnKTtcbiAgICAgIH0gY2F0Y2goYWlFcnJvcikge1xuICAgICAgICBzcGlubmVyLmZhaWwoJ0NvdWxkIG5vdCBnZW5lcmF0ZSBBSSB0ZXN0IGFuYWx5c2lzJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgYW5hbHlzaXMgZXJyb3I6JywgYWlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYWxsYmFjaygwKTtcbiAgICByZXR1cm4gMDtcbiAgfSBjYXRjaChlcnJvcikge1xuICAgIGxvZyhgXFxuJHtjbGlOYW1lfSBFcnJvcjogQ2hlY2sgZm9yIHVuaXQgdGVzdCBlcnJvcnMgYW5kL29yIGNvdmVyYWdlLmAsICdlcnJvcicsIHF1aWV0KTtcblxuICAgIHNwaW5uZXIuZmFpbCgnVGVzdGluZyBmYWlsZWQhJyk7XG5cbiAgICBpZih1c2VEZWJ1Zykge1xuICAgICAgc3Bpbm5lci5zdGFydCgnQUkgaXMgYW5hbHl6aW5nIHRlc3QgZmFpbHVyZXMuLi4nKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdGVzdFJlc3VsdHMgPSBwcm9jZXNzVGVzdFJlc3VsdHModGVtcE91dHB1dEZpbGUpO1xuXG4gICAgICAgIGF3YWl0IGFpRnVuY3Rpb24oe1xuICAgICAgICAgIGNvbnRleHQ6IHRydWUsXG4gICAgICAgICAgcHJvbXB0OiBgRGVidWcgdGhlc2UgZmFpbGVkIFZpdGVzdCB0ZXN0cyBhbmQgc3VnZ2VzdCBmaXhlczpcblxuJHtKU09OLnN0cmluZ2lmeShlcnJvci5tZXNzYWdlLCBudWxsLCAyKX1cblxuVGVzdCByZXN1bHRzOiAke0pTT04uc3RyaW5naWZ5KHRlc3RSZXN1bHRzLCBudWxsLCAyKX1cblxuUGxlYXNlIHByb3ZpZGU6XG4xLiBBbmFseXNpcyBvZiB3aHkgdGhlIHRlc3RzIGFyZSBmYWlsaW5nXG4yLiBTcGVjaWZpYyBzdWdnZXN0aW9ucyB0byBmaXggZWFjaCBmYWlsaW5nIHRlc3RcbjMuIEFueSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggdGVzdCBmaXh0dXJlcyBvciBtb2Nrc1xuNC4gQ29kZSBleGFtcGxlcyBmb3Igc29sdXRpb25zYCxcbiAgICAgICAgICBxdWlldCxcbiAgICAgICAgICB0YXNrOiAnaGVscCdcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdBSSBkZWJ1Z2dpbmcgYXNzaXN0YW5jZSBjb21wbGV0ZScpO1xuICAgICAgfSBjYXRjaChhaUVycm9yKSB7XG4gICAgICAgIHNwaW5uZXIuZmFpbCgnQ291bGQgbm90IGdlbmVyYXRlIEFJIGRlYnVnZ2luZyBhc3Npc3RhbmNlJyk7XG4gICAgICAgIGlmKCFxdWlldCkge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgY29uc29sZS5lcnJvcignQUkgZGVidWdnaW5nIGVycm9yOicsIGFpRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHRlc3Q7XG4iXSwibmFtZXMiOlsiZXhlY2EiLCJleGlzdHNTeW5jIiwicmVhZEZpbGVTeW5jIiwic3luYyIsImdsb2JTeW5jIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiTGV4Q29uZmlnIiwiZ2V0VHlwZVNjcmlwdENvbmZpZ1BhdGgiLCJjcmVhdGVTcGlubmVyIiwicmVzb2x2ZUJpbmFyeVBhdGgiLCJsb2ciLCJhaUZ1bmN0aW9uIiwiZGV0ZWN0RVNNIiwiY3dkIiwicGFja2FnZUpzb25QYXRoIiwicGFja2FnZUpzb25Db250ZW50IiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJ0eXBlIiwiX2Vycm9yIiwiZGVmYXVsdEV4aXQiLCJjb2RlIiwicHJvY2VzcyIsImVudiIsIlZJVEVTVCIsIlZJVEVTVF9XT1JLRVJfSUQiLCJOT0RFX0VOViIsInVuZGVmaW5lZCIsImV4aXQiLCJnZXRUZXN0RmlsZVBhdHRlcm5zIiwidGVzdFBhdGhQYXR0ZXJuIiwiZGVmYXVsdFBhdHRlcm5zIiwiZmluZFVuY292ZXJlZFNvdXJjZUZpbGVzIiwic291cmNlRmlsZXMiLCJpZ25vcmUiLCJ0ZXN0RmlsZXMiLCJmaWx0ZXIiLCJzb3VyY2VGaWxlIiwiYmFzZU5hbWUiLCJyZXBsYWNlIiwic29tZSIsInRlc3RGaWxlIiwiaW5jbHVkZXMiLCJwcm9jZXNzVGVzdFJlc3VsdHMiLCJvdXRwdXRGaWxlIiwiY29udGVudCIsInRlc3QiLCJvcHRpb25zIiwiYXJncyIsImZpbGVzT3JDYWxsYmFjayIsImNhbGxiYWNrUGFyYW0iLCJmaWxlcyIsImNhbGxiYWNrIiwiYW5hbHl6ZSIsImFpQW5hbHl6ZSIsImFpRGVidWciLCJhaUdlbmVyYXRlIiwiYmFpbCIsImNoYW5nZWRGaWxlc1dpdGhBbmNlc3RvciIsImNoYW5nZWRTaW5jZSIsImNpIiwiY2xlYXJDYWNoZSIsImNsaU5hbWUiLCJjb2xsZWN0Q292ZXJhZ2VGcm9tIiwiY29sb3JzIiwiY29uZmlnIiwiZGVidWciLCJkZWJ1Z1Rlc3RzIiwiZGV0ZWN0T3BlbkhhbmRsZXMiLCJlbnZpcm9ubWVudCIsImVycm9yT25EZXByZWNhdGVkIiwiZXhwYW5kIiwiZm9yY2VFeGl0IiwiZ2VuZXJhdGUiLCJqc29uIiwibGFzdENvbW1pdCIsImxpc3RUZXN0cyIsImxvZ0hlYXBVc2FnZSIsIm1heFdvcmtlcnMiLCJub1N0YWNrVHJhY2UiLCJub3RpZnkiLCJvbmx5Q2hhbmdlZCIsInBhc3NXaXRoTm9UZXN0cyIsInF1aWV0IiwicmVtb3ZlQ2FjaGUiLCJydW5JbkJhbmQiLCJzZXR1cCIsInNob3dDb25maWciLCJzaWxlbnQiLCJ0ZXN0TG9jYXRpb25JblJlc3VsdHMiLCJ0ZXN0TmFtZVBhdHRlcm4iLCJ1cGRhdGUiLCJ1c2VTdGRlcnIiLCJ2ZXJib3NlIiwid2F0Y2giLCJ3YXRjaEFsbCIsInVzZUdlbmVyYXRlIiwidXNlQW5hbHl6ZSIsInVzZURlYnVnIiwic3Bpbm5lciIsInBhcnNlQ29uZmlnIiwidXNlVHlwZXNjcmlwdCIsInRlc3RDb25maWdQYXRoIiwiY2hlY2tUZXN0VHlwZXNjcmlwdENvbmZpZyIsInN0YXJ0IiwidW5jb3ZlcmVkRmlsZXMiLCJsZW5ndGgiLCJ0YXJnZXRGaWxlIiwiY29udGV4dCIsImZpbGUiLCJwcm9tcHQiLCJ0YXNrIiwic3VjY2VlZCIsImFpRXJyb3IiLCJmYWlsIiwiY29uc29sZSIsImVycm9yIiwicHJvamVjdFZpdGVzdEJpbiIsInZpdGVzdFBhdGgiLCJ2aXRlc3RDb25maWdGaWxlIiwicHJvamVjdFZpdGVzdENvbmZpZyIsInByb2plY3RWaXRlc3RDb25maWdQYXRocyIsImV4aXN0aW5nQ29uZmlnUGF0aCIsImZpbmQiLCJjb25maWdQYXRoIiwidml0ZXN0IiwibGV4RGlyIiwiZ2V0TGV4RGlyIiwibGV4Vml0ZXN0Q29uZmlnIiwiT2JqZWN0Iiwia2V5cyIsInJlc29sdmVkQ29uZmlnIiwic3RyaW5naWZ5IiwiZGVmYXVsdCIsInZpdGVzdFNldHVwRmlsZSIsInZpdGVzdEFyZ3MiLCJ2aXRlc3RPcHRpb25zIiwicmVwb3J0ZXJzIiwiU2V0IiwiZmlsdGVycyIsIndhdGNoTW9kZSIsIkJvb2xlYW4iLCJsaXN0TW9kZSIsInB1c2giLCJpc0VTTSIsIm5vZGVPcHRpb25zIiwiTk9ERV9PUFRJT05TIiwidHJpbSIsImFkZCIsImVudmlyb25tZW50TmFtZSIsInRlbXBPdXRwdXRGaWxlIiwic2hvdWxkV3JpdGVKc29uIiwic2l6ZSIsInJlcG9ydGVyTGlzdCIsIkFycmF5IiwiZnJvbSIsInVuc2hpZnQiLCJmb3JFYWNoIiwicmVwb3J0ZXIiLCJmaW5hbEFyZ3MiLCJqb2luIiwiRk9SQ0VfQ09MT1IiLCJDSSIsIkxFWF9WSVRFU1RfU0VUVVAiLCJlbmNvZGluZyIsInN0ZGlvIiwidGVzdFJlc3VsdHMiLCJmaWxlUGF0dGVybnMiLCJtZXNzYWdlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxLQUFLLFFBQU8sUUFBUTtBQUM1QixTQUFRQyxVQUFVLEVBQUVDLFlBQVksUUFBTyxLQUFLO0FBQzVDLFNBQVFDLFFBQVFDLFFBQVEsUUFBTyxPQUFPO0FBQ3RDLFNBQVFDLFdBQVdDLFdBQVcsUUFBTyxPQUFPO0FBRTVDLFNBQVFDLFNBQVMsRUFBRUMsdUJBQXVCLFFBQU8scUJBQXFCO0FBQ3RFLFNBQVFDLGFBQWEsUUFBTyxxQkFBcUI7QUFDakQsU0FBUUMsaUJBQWlCLFFBQU8sc0JBQXNCO0FBQ3RELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFDdkMsU0FBUUMsVUFBVSxRQUFPLGNBQWM7QUFFdkMsTUFBTUMsWUFBWSxDQUFDQztJQUNqQixNQUFNQyxrQkFBa0JULFlBQVlRLEtBQUs7SUFFekMsSUFBR2IsV0FBV2Msa0JBQWtCO1FBQzlCLElBQUk7WUFDRixNQUFNQyxxQkFBcUJkLGFBQWFhLGlCQUFpQjtZQUN6RCxNQUFNRSxjQUFjQyxLQUFLQyxLQUFLLENBQUNIO1lBQy9CLE9BQU9DLFlBQVlHLElBQUksS0FBSztRQUM5QixFQUFFLE9BQU1DLFFBQVE7WUFDZCxPQUFPO1FBQ1Q7SUFDRjtJQUVBLE9BQU87QUFDVDtBQXFEQSxNQUFNQyxjQUFlLENBQUNDO0lBQ3BCLElBQUdDLFFBQVFDLEdBQUcsQ0FBQ0MsTUFBTSxJQUFJRixRQUFRQyxHQUFHLENBQUNFLGdCQUFnQixJQUFJSCxRQUFRQyxHQUFHLENBQUNHLFFBQVEsS0FBSyxRQUFRO1FBQ3hGLE9BQU9DO0lBQ1Q7SUFFQUwsUUFBUU0sSUFBSSxDQUFDUDtBQUNmO0FBRUEsT0FBTyxNQUFNUSxzQkFBc0IsQ0FBQ0M7SUFDbEMsTUFBTUMsa0JBQWtCO1FBQUM7UUFBZTtRQUFlO0tBQXFCO0lBRTVFLElBQUcs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
@@ -1,9 +1,9 @@
1
1
  export declare const parseVersion: (packageVersion: string) => string;
2
2
  export declare const packages: {
3
- jest: string;
4
3
  lex: any;
5
4
  swc: string;
6
5
  typescript: string;
6
+ vitest: string;
7
7
  webpack: string;
8
8
  };
9
9
  export declare const jsonVersions: (lexPackages: any) => {};
@@ -8,10 +8,10 @@ const packagePath = getLexPackageJsonPath();
8
8
  const packageJson = JSON.parse(readFileSync(packagePath, 'utf8'));
9
9
  export const parseVersion = (packageVersion)=>packageVersion?.replace(/\^/g, '') || 'N/A';
10
10
  export const packages = {
11
- jest: parseVersion(packageJson?.dependencies?.jest),
12
11
  lex: packageJson.version,
13
12
  swc: parseVersion(packageJson?.dependencies?.['@swc/core']),
14
13
  typescript: parseVersion(packageJson?.dependencies?.typescript),
14
+ vitest: parseVersion(packageJson?.dependencies?.vitest),
15
15
  webpack: parseVersion(packageJson?.dependencies?.webpack)
16
16
  };
17
17
  export const jsonVersions = (lexPackages)=>Object.keys(lexPackages).reduce((list, key)=>{
@@ -26,7 +26,7 @@ export const versions = (cmd, callback)=>{
26
26
  log(` Lex: ${packages.lex}`, 'info', false);
27
27
  log(' ----------', 'note', false);
28
28
  log(` SWC: ${packages.swc}`, 'info', false);
29
- log(` Jest: ${packages.jest}`, 'info', false);
29
+ log(` Vitest: ${packages.vitest}`, 'info', false);
30
30
  log(` Typescript: ${packages.typescript}`, 'info', false);
31
31
  log(` Webpack: ${packages.webpack}`, 'info', false);
32
32
  }
@@ -36,4 +36,4 @@ export const versions = (cmd, callback)=>{
36
36
  return Promise.resolve(0);
37
37
  };
38
38
 
39
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy92ZXJzaW9ucy92ZXJzaW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHtnZXRMZXhQYWNrYWdlSnNvblBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IHBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhY2thZ2VQYXRoLCAndXRmOCcpKTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVmVyc2lvbiA9IChwYWNrYWdlVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHBhY2thZ2VWZXJzaW9uPy5yZXBsYWNlKC9cXF4vZywgJycpIHx8ICdOL0EnO1xuXG5leHBvcnQgY29uc3QgcGFja2FnZXMgPSB7XG4gIGplc3Q6IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5qZXN0KSxcbiAgbGV4OiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuICBzd2M6IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy5bJ0Bzd2MvY29yZSddKSxcbiAgdHlwZXNjcmlwdDogcGFyc2VWZXJzaW9uKHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LnR5cGVzY3JpcHQpLFxuICB3ZWJwYWNrOiBwYXJzZVZlcnNpb24ocGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8ud2VicGFjaylcbn07XG5cbmV4cG9ydCBjb25zdCBqc29uVmVyc2lvbnMgPSAobGV4UGFja2FnZXMpID0+IE9iamVjdC5rZXlzKGxleFBhY2thZ2VzKS5yZWR1Y2UoKGxpc3QsIGtleSkgPT4ge1xuICBsaXN0W2tleV0gPSBwYWNrYWdlc1trZXldO1xuICByZXR1cm4gbGlzdDtcbn0sIHt9KTtcblxuZXhwb3J0IGludGVyZmFjZSBWZXJzaW9uc0NtZCB7XG4gIHJlYWRvbmx5IGpzb24/OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgdmVyc2lvbnMgPSAoY21kOiBWZXJzaW9uc0NtZCwgY2FsbGJhY2s6IChzdGF0dXM6IG51bWJlcik9PiB2b2lkKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgaWYoY21kLmpzb24pIHtcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShqc29uVmVyc2lvbnMocGFja2FnZXMpKSk7XG4gIH0gZWxzZSB7XG4gICAgbG9nKCdWZXJzaW9uczonLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coYCAgTGV4OiAke3BhY2thZ2VzLmxleH1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coJyAgLS0tLS0tLS0tLScsICdub3RlJywgZmFsc2UpO1xuICAgIGxvZyhgICBTV0M6ICR7cGFja2FnZXMuc3djfWAsICdpbmZvJywgZmFsc2UpO1xuICAgIGxvZyhgICBKZXN0OiAke3BhY2thZ2VzLmplc3R9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgbG9nKGAgIFR5cGVzY3JpcHQ6ICR7cGFja2FnZXMudHlwZXNjcmlwdH1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coYCAgV2VicGFjazogJHtwYWNrYWdlcy53ZWJwYWNrfWAsICdpbmZvJywgZmFsc2UpO1xuICB9XG5cbiAgaWYoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygwKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG59OyJdLCJuYW1lcyI6WyJyZWFkRmlsZVN5bmMiLCJnZXRMZXhQYWNrYWdlSnNvblBhdGgiLCJsb2ciLCJwYWNrYWdlUGF0aCIsInBhY2thZ2VKc29uIiwiSlNPTiIsInBhcnNlIiwicGFyc2VWZXJzaW9uIiwicGFja2FnZVZlcnNpb24iLCJyZXBsYWNlIiwicGFja2FnZXMiLCJqZXN0IiwiZGVwZW5kZW5jaWVzIiwibGV4IiwidmVyc2lvbiIsInN3YyIsInR5cGVzY3JpcHQiLCJ3ZWJwYWNrIiwianNvblZlcnNpb25zIiwibGV4UGFja2FnZXMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwibGlzdCIsImtleSIsInZlcnNpb25zIiwiY21kIiwiY2FsbGJhY2siLCJqc29uIiwiY29uc29sZSIsInN0cmluZ2lmeSIsIlByb21pc2UiLCJyZXNvbHZlIl0sIm1hcHBpbmdzIjoiQUFBQTs7O0NBR0MsR0FDRCxTQUFRQSxZQUFZLFFBQU8sS0FBSztBQUVoQyxTQUFRQyxxQkFBcUIsUUFBTyxzQkFBc0I7QUFDMUQsU0FBUUMsR0FBRyxRQUFPLHFCQUFxQjtBQUV2QyxNQUFNQyxjQUFjRjtBQUNwQixNQUFNRyxjQUFjQyxLQUFLQyxLQUFLLENBQUNOLGFBQWFHLGFBQWE7QUFFekQsT0FBTyxNQUFNSSxlQUFlLENBQUNDLGlCQUFtQ0EsZ0JBQWdCQyxRQUFRLE9BQU8sT0FBTyxNQUFNO0FBRTVHLE9BQU8sTUFBTUMsV0FBVztJQUN0QkMsTUFBTUosYUFBYUgsYUFBYVEsY0FBY0Q7SUFDOUNFLEtBQUtULFlBQVlVLE9BQU87SUFDeEJDLEtBQUtSLGFBQWFILGFBQWFRLGNBQWMsQ0FBQyxZQUFZO0lBQzFESSxZQUFZVCxhQUFhSCxhQUFhUSxjQUFjSTtJQUNwREMsU0FBU1YsYUFBYUgsYUFBYVEsY0FBY0s7QUFDbkQsRUFBRTtBQUVGLE9BQU8sTUFBTUMsZUFBZSxDQUFDQyxjQUFnQkMsT0FBT0MsSUFBSSxDQUFDRixhQUFhRyxNQUFNLENBQUMsQ0FBQ0MsTUFBTUM7UUFDbEZELElBQUksQ0FBQ0MsSUFBSSxHQUFHZCxRQUFRLENBQUNjLElBQUk7UUFDekIsT0FBT0Q7SUFDVCxHQUFHLENBQUMsR0FBRztBQU1QLE9BQU8sTUFBTUUsV0FBVyxDQUFDQyxLQUFrQkM7SUFDekMsSUFBR0QsSUFBSUUsSUFBSSxFQUFFO1FBQ1hDLFFBQVEzQixHQUFHLENBQUNHLEtBQUt5QixTQUFTLENBQUNaLGFBQWFSO0lBQzFDLE9BQU87UUFDTFIsSUFBSSxhQUFhLFFBQVE7UUFDekJBLElBQUksQ0FBQyxPQUFPLEVBQUVRLFNBQVNHLEdBQUcsRUFBRSxFQUFFLFFBQVE7UUFDdENYLElBQUksZ0JBQWdCLFFBQVE7UUFDNUJBLElBQUksQ0FBQyxPQUFPLEVBQUVRLFNBQVNLLEdBQUcsRUFBRSxFQUFFLFFBQVE7UUFDdENiLElBQUksQ0FBQyxRQUFRLEVBQUVRLFNBQVNDLElBQUksRUFBRSxFQUFFLFFBQVE7UUFDeENULElBQUksQ0FBQyxjQUFjLEVBQUVRLFNBQVNNLFVBQVUsRUFBRSxFQUFFLFFBQVE7UUFDcERkLElBQUksQ0FBQyxXQUFXLEVBQUVRLFNBQVNPLE9BQU8sRUFBRSxFQUFFLFFBQVE7SUFDaEQ7SUFFQSxJQUFHVSxVQUFVO1FBQ1hBLFNBQVM7SUFDWDtJQUVBLE9BQU9JLFFBQVFDLE9BQU8sQ0FBQztBQUN6QixFQUFFIn0=
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy92ZXJzaW9ucy92ZXJzaW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtyZWFkRmlsZVN5bmN9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHtnZXRMZXhQYWNrYWdlSnNvblBhdGh9IGZyb20gJy4uLy4uL3V0aWxzL2ZpbGUuanMnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uLy4uL3V0aWxzL2xvZy5qcyc7XG5cbmNvbnN0IHBhY2thZ2VQYXRoID0gZ2V0TGV4UGFja2FnZUpzb25QYXRoKCk7XG5jb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhY2thZ2VQYXRoLCAndXRmOCcpKTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlVmVyc2lvbiA9IChwYWNrYWdlVmVyc2lvbjogc3RyaW5nKTogc3RyaW5nID0+IHBhY2thZ2VWZXJzaW9uPy5yZXBsYWNlKC9cXF4vZywgJycpIHx8ICdOL0EnO1xuXG5leHBvcnQgY29uc3QgcGFja2FnZXMgPSB7XG4gIGxleDogcGFja2FnZUpzb24udmVyc2lvbixcbiAgc3djOiBwYXJzZVZlcnNpb24ocGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8uWydAc3djL2NvcmUnXSksXG4gIHR5cGVzY3JpcHQ6IHBhcnNlVmVyc2lvbihwYWNrYWdlSnNvbj8uZGVwZW5kZW5jaWVzPy50eXBlc2NyaXB0KSxcbiAgdml0ZXN0OiBwYXJzZVZlcnNpb24ocGFja2FnZUpzb24/LmRlcGVuZGVuY2llcz8udml0ZXN0KSxcbiAgd2VicGFjazogcGFyc2VWZXJzaW9uKHBhY2thZ2VKc29uPy5kZXBlbmRlbmNpZXM/LndlYnBhY2spXG59O1xuXG5leHBvcnQgY29uc3QganNvblZlcnNpb25zID0gKGxleFBhY2thZ2VzKSA9PiBPYmplY3Qua2V5cyhsZXhQYWNrYWdlcykucmVkdWNlKChsaXN0LCBrZXkpID0+IHtcbiAgbGlzdFtrZXldID0gcGFja2FnZXNba2V5XTtcbiAgcmV0dXJuIGxpc3Q7XG59LCB7fSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbnNDbWQge1xuICByZWFkb25seSBqc29uPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IHZlcnNpb25zID0gKGNtZDogVmVyc2lvbnNDbWQsIGNhbGxiYWNrOiAoc3RhdHVzOiBudW1iZXIpID0+IHZvaWQpOiBQcm9taXNlPG51bWJlcj4gPT4ge1xuICBpZihjbWQuanNvbikge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGpzb25WZXJzaW9ucyhwYWNrYWdlcykpKTtcbiAgfSBlbHNlIHtcbiAgICBsb2coJ1ZlcnNpb25zOicsICdpbmZvJywgZmFsc2UpO1xuICAgIGxvZyhgICBMZXg6ICR7cGFja2FnZXMubGV4fWAsICdpbmZvJywgZmFsc2UpO1xuICAgIGxvZygnICAtLS0tLS0tLS0tJywgJ25vdGUnLCBmYWxzZSk7XG4gICAgbG9nKGAgIFNXQzogJHtwYWNrYWdlcy5zd2N9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgbG9nKGAgIFZpdGVzdDogJHtwYWNrYWdlcy52aXRlc3R9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgbG9nKGAgIFR5cGVzY3JpcHQ6ICR7cGFja2FnZXMudHlwZXNjcmlwdH1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICBsb2coYCAgV2VicGFjazogJHtwYWNrYWdlcy53ZWJwYWNrfWAsICdpbmZvJywgZmFsc2UpO1xuICB9XG5cbiAgaWYoY2FsbGJhY2spIHtcbiAgICBjYWxsYmFjaygwKTtcbiAgfVxuXG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUoMCk7XG59O1xuIl0sIm5hbWVzIjpbInJlYWRGaWxlU3luYyIsImdldExleFBhY2thZ2VKc29uUGF0aCIsImxvZyIsInBhY2thZ2VQYXRoIiwicGFja2FnZUpzb24iLCJKU09OIiwicGFyc2UiLCJwYXJzZVZlcnNpb24iLCJwYWNrYWdlVmVyc2lvbiIsInJlcGxhY2UiLCJwYWNrYWdlcyIsImxleCIsInZlcnNpb24iLCJzd2MiLCJkZXBlbmRlbmNpZXMiLCJ0eXBlc2NyaXB0Iiwidml0ZXN0Iiwid2VicGFjayIsImpzb25WZXJzaW9ucyIsImxleFBhY2thZ2VzIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImxpc3QiLCJrZXkiLCJ2ZXJzaW9ucyIsImNtZCIsImNhbGxiYWNrIiwianNvbiIsImNvbnNvbGUiLCJzdHJpbmdpZnkiLCJQcm9taXNlIiwicmVzb2x2ZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsU0FBUUEsWUFBWSxRQUFPLEtBQUs7QUFFaEMsU0FBUUMscUJBQXFCLFFBQU8sc0JBQXNCO0FBQzFELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFFdkMsTUFBTUMsY0FBY0Y7QUFDcEIsTUFBTUcsY0FBY0MsS0FBS0MsS0FBSyxDQUFDTixhQUFhRyxhQUFhO0FBRXpELE9BQU8sTUFBTUksZUFBZSxDQUFDQyxpQkFBbUNBLGdCQUFnQkMsUUFBUSxPQUFPLE9BQU8sTUFBTTtBQUU1RyxPQUFPLE1BQU1DLFdBQVc7SUFDdEJDLEtBQUtQLFlBQVlRLE9BQU87SUFDeEJDLEtBQUtOLGFBQWFILGFBQWFVLGNBQWMsQ0FBQyxZQUFZO0lBQzFEQyxZQUFZUixhQUFhSCxhQUFhVSxjQUFjQztJQUNwREMsUUFBUVQsYUFBYUgsYUFBYVUsY0FBY0U7SUFDaERDLFNBQVNWLGFBQWFILGFBQWFVLGNBQWNHO0FBQ25ELEVBQUU7QUFFRixPQUFPLE1BQU1DLGVBQWUsQ0FBQ0MsY0FBZ0JDLE9BQU9DLElBQUksQ0FBQ0YsYUFBYUcsTUFBTSxDQUFDLENBQUNDLE1BQU1DO1FBQ2xGRCxJQUFJLENBQUNDLElBQUksR0FBR2QsUUFBUSxDQUFDYyxJQUFJO1FBQ3pCLE9BQU9EO0lBQ1QsR0FBRyxDQUFDLEdBQUc7QUFNUCxPQUFPLE1BQU1FLFdBQVcsQ0FBQ0MsS0FBa0JDO0lBQ3pDLElBQUdELElBQUlFLElBQUksRUFBRTtRQUNYQyxRQUFRM0IsR0FBRyxDQUFDRyxLQUFLeUIsU0FBUyxDQUFDWixhQUFhUjtJQUMxQyxPQUFPO1FBQ0xSLElBQUksYUFBYSxRQUFRO1FBQ3pCQSxJQUFJLENBQUMsT0FBTyxFQUFFUSxTQUFTQyxHQUFHLEVBQUUsRUFBRSxRQUFRO1FBQ3RDVCxJQUFJLGdCQUFnQixRQUFRO1FBQzVCQSxJQUFJLENBQUMsT0FBTyxFQUFFUSxTQUFTRyxHQUFHLEVBQUUsRUFBRSxRQUFRO1FBQ3RDWCxJQUFJLENBQUMsVUFBVSxFQUFFUSxTQUFTTSxNQUFNLEVBQUUsRUFBRSxRQUFRO1FBQzVDZCxJQUFJLENBQUMsY0FBYyxFQUFFUSxTQUFTSyxVQUFVLEVBQUUsRUFBRSxRQUFRO1FBQ3BEYixJQUFJLENBQUMsV0FBVyxFQUFFUSxTQUFTTyxPQUFPLEVBQUUsRUFBRSxRQUFRO0lBQ2hEO0lBRUEsSUFBR1UsVUFBVTtRQUNYQSxTQUFTO0lBQ1g7SUFFQSxPQUFPSSxRQUFRQyxPQUFPLENBQUM7QUFDekIsRUFBRSJ9