@analogjs/vitest-angular 2.0.0-beta.9 → 2.0.1-beta.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/vitest-angular",
3
- "version": "2.0.0-beta.9",
3
+ "version": "2.0.1-beta.1",
4
4
  "description": "Vitest Builder for Angular",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -36,7 +36,7 @@
36
36
  "peerDependencies": {
37
37
  "@analogjs/vite-plugin-angular": "*",
38
38
  "@angular-devkit/architect": ">=0.1500.0 < 0.2100.0",
39
- "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0"
39
+ "vitest": "^1.3.1 || ^2.0.0 || ^3.0.0 || ^4.0.0"
40
40
  },
41
41
  "ng-update": {
42
42
  "packageGroup": [
@@ -1,5 +1,6 @@
1
1
  import { createBuilder } from '@angular-devkit/architect';
2
2
  import * as path from 'path';
3
+ import { globSync } from 'tinyglobby';
3
4
  import { createAngularMemoryPlugin } from './plugins/angular-memory-plugin';
4
5
  import { esbuildDownlevelPlugin } from './plugins/esbuild-downlevel-plugin';
5
6
  import { getBuildApplicationFunction } from './devkit';
@@ -125,14 +126,49 @@ export async function getExtraArgs(options) {
125
126
  }
126
127
  return extraArgs;
127
128
  }
129
+ /**
130
+ * Finds test files to include in the Vitest run using tinyglobby pattern matching.
131
+ *
132
+ * This function:
133
+ * 1. Normalizes the project root path to ensure consistent path separators
134
+ * 2. Constructs glob patterns by prepending the project root to each include pattern
135
+ * 3. Uses globSync from tinyglobby to find all files matching the patterns while respecting exclusions
136
+ *
137
+ * @param options Configuration object containing workspace and project paths, include/exclude patterns
138
+ * @returns Array of absolute file paths that match the include patterns
139
+ *
140
+ * Sample output paths:
141
+ * - /workspace/apps/my-app/src/app/app.component.spec.ts
142
+ * - /workspace/apps/my-app/src/app/services/data.service.spec.ts
143
+ * - /workspace/apps/my-app/src/app/components/header/header.component.test.ts
144
+ * - /workspace/apps/my-app/src/app/utils/helpers.spec.ts
145
+ *
146
+ * tinyglobby vs fast-glob comparison:
147
+ * - Both support the same glob patterns and ignore functionality
148
+ * - Both are fast and efficient for file matching
149
+ * - tinyglobby is a lighter alternative with similar API
150
+ * - tinyglobby's globSync returns absolute paths by default when absolute: true is set
151
+ * - tinyglobby has fewer dependencies and smaller bundle size
152
+ *
153
+ * globSync options explained:
154
+ * - dot: true - Includes files/directories that start with a dot (e.g., .env.test)
155
+ * - absolute: true - Returns absolute file paths instead of relative paths
156
+ * - ignore: options.exclude - Excludes files matching the exclude patterns
157
+ */
128
158
  function findIncludes(options) {
129
- const fg = require('fast-glob');
130
159
  const { normalizePath } = require('vite');
160
+ // Normalize project root path to ensure consistent path separators across platforms
131
161
  const projectRoot = normalizePath(path.resolve(options.workspaceRoot, options.projectRoot));
162
+ // Construct glob patterns by prepending project root to each include pattern
163
+ // Example: if include=['**/*.spec.ts'] and projectRoot='/workspace/apps/my-app'
164
+ // Result: ['/workspace/apps/my-app/**/*.spec.ts']
132
165
  const globs = [...options.include.map((glob) => `${projectRoot}/${glob}`)];
133
- return fg.sync(globs, {
134
- dot: true,
135
- ignore: options.exclude,
166
+ // Use globSync from tinyglobby to find all files matching the patterns
167
+ // Returns absolute file paths that match the include patterns while respecting exclusions
168
+ return globSync(globs, {
169
+ dot: true, // Include files/directories starting with dot (e.g., .env.test)
170
+ absolute: true, // Return absolute file paths
171
+ ignore: options.exclude, // Exclude files matching these patterns
136
172
  });
137
173
  }
138
174
  function generateEntryPoints({ projectRoot, testFiles, context, angularVersion, }) {
@@ -158,4 +194,4 @@ function generateEntryPoints({ projectRoot, testFiles, context, angularVersion,
158
194
  }));
159
195
  }
160
196
  export default createBuilder(vitestApplicationBuilder);
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL2J1aWxkZXJzL2J1aWxkL3ZpdGVzdC5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQU03QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkQsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixpREFBTyxDQUFBO0lBQ1AsMkNBQUksQ0FBQTtJQUNKLHlEQUFXLENBQUE7SUFDWCxpRUFBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxVQUFVLEtBQVYsVUFBVSxRQUtyQjtBQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsR0FBRyxNQUFNLENBQUM7QUFFaEQsS0FBSyxTQUFTLENBQUMsQ0FBQyx3QkFBd0IsQ0FDdEMsT0FBcUIsRUFDckIsT0FBWTtJQUVaLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBRS9CLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsR0FDaEQsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFPLFFBQVEsQ0FDckMsOEJBQThCLENBQy9CLEVBQTRDLENBQUM7SUFFOUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxP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RSxDQUFDO1lBQzVCLFVBQVUsR0FBRyxHQUFHLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxFQUFFLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxlQUFlLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgVml0ZXN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB0eXBlIHsgVXNlckNvbmZpZyBhcyBWaXRlc3RDb25maWcgfSBmcm9tICd2aXRlc3Qvbm9kZSc7XG5cbmltcG9ydCB7IFZpdGVzdFNjaGVtYSB9IGZyb20gJy4vc2NoZW1hJztcbmltcG9ydCB7IGNyZWF0ZUFuZ3VsYXJNZW1vcnlQbHVnaW4gfSBmcm9tICcuL3BsdWdpbnMvYW5ndWxhci1tZW1vcnktcGx1Z2luJztcbmltcG9ydCB7IGVzYnVpbGREb3dubGV2ZWxQbHVnaW4gfSBmcm9tICcuL3BsdWdpbnMvZXNidWlsZC1kb3dubGV2ZWwtcGx1Z2luJztcbmltcG9ydCB7IGdldEJ1aWxkQXBwbGljYXRpb25GdW5jdGlvbiB9IGZyb20gJy4vZGV2a2l0JztcblxuZXhwb3J0IGVudW0gUmVzdWx0S2luZCB7XG4gIEZhaWx1cmUsXG4gIEZ1bGwsXG4gIEluY3JlbWVudGFsLFxuICBDb21wb25lbnRVcGRhdGUsXG59XG5cbnByb2Nlc3MuZW52WydWSVRFX0NKU19JR05PUkVfV0FSTklORyddID0gJ3RydWUnO1xuXG5hc3luYyBmdW5jdGlvbiogdml0ZXN0QXBwbGljYXRpb25CdWlsZGVyKFxuICBvcHRpb25zOiBWaXRlc3RTY2hlbWEsXG4gIGNvbnRleHQ6IGFueSxcbik6IEFzeW5jSXRlcmFibGU8eyBzdWNjZXNzOiBib29sZWFuIH0+IHtcbiAgcHJvY2Vzcy5lbnZbJ1RFU1QnXSA9ICd0cnVlJztcbiAgcHJvY2Vzcy5lbnZbJ1ZJVEVTVCddID0gJ3RydWUnO1xuXG4gIGNvbnN0IHsgYnVpbGRBcHBsaWNhdGlvbkludGVybmFsLCBhbmd1bGFyVmVyc2lvbiB9ID1cbiAgICBhd2FpdCBnZXRCdWlsZEFwcGxpY2F0aW9uRnVuY3Rpb24oKTtcbiAgY29uc3QgeyBzdGFydFZpdGVzdCB9ID0gYXdhaXQgKEZ1bmN0aW9uKFxuICAgICdyZXR1cm4gaW1wb3J0KFwidml0ZXN0L25vZGVcIiknLFxuICApKCkgYXMgUHJvbWlzZTx0eXBlb2YgaW1wb3J0KCd2aXRlc3Qvbm9kZScpPik7XG5cbiAgY29uc3QgcHJvamVjdENvbmZpZyA9IGF3YWl0IGNvbnRleHQuZ2V0UHJvamVjdE1ldGFkYXRhKGNvbnRleHQudGFyZ2V0KTtcbiAgY29uc3QgZXh0cmFBcmdzID0gYXdhaXQgZ2V0RXh0cmFBcmdzKG9wdGlvbnMpO1xuICBjb25zdCB3b3Jrc3BhY2VSb290ID0gY29udGV4dC53b3Jrc3BhY2VSb290O1xuICBjb25zdCBwcm9qZWN0Um9vdCA9IHByb2plY3RDb25maWdbJ3Jvb3QnXTtcbiAgY29uc3Qgc2V0dXBGaWxlID0gcGF0aC5yZWxhdGl2ZShwcm9qZWN0Um9vdCwgb3B0aW9ucy5zZXR1cEZpbGUpO1xuXG4gIGNvbnN0IGNvbmZpZzogVml0ZXN0Q29uZmlnID0ge1xuICAgIHJvb3Q6IGAke3Byb2plY3RSb290IHx8ICcuJ31gLFxuICAgIHdhdGNoOiBvcHRpb25zLndhdGNoID09PSB0cnVlLFxuICAgIGNvbmZpZzogb3B0aW9ucy5jb25maWdGaWxlLFxuICAgIHNldHVwRmlsZXM6IFtzZXR1cEZpbGVdLFxuICAgIGdsb2JhbHM6IHRydWUsXG4gICAgcG9vbDogJ3ZtVGhyZWFkcycsXG4gICAgcmVwb3J0ZXJzOiBbJ2RlZmF1bHQnXSxcbiAgICBlbnZpcm9ubWVudDogJ2pzZG9tJyxcbiAgICBleGNsdWRlOiBvcHRpb25zPy5leGNsdWRlIHx8IFtdLFxuICAgIC4uLmV4dHJhQXJncyxcbiAgfTtcblxuICBjb25zdCBpbmNsdWRlczogc3RyaW5nW10gPSBmaW5kSW5jbHVkZXMoe1xuICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgcHJvamVjdFJvb3QsXG4gICAgaW5jbHVkZTogb3B0aW9ucy5pbmNsdWRlLFxuICAgIGV4Y2x1ZGU6IG9wdGlvbnMuZXhjbHVkZSB8fCBbXSxcbiAgfSk7XG5cbiAgY29uc3QgdGVzdEZpbGVzID0gW1xuICAgIHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgb3B0aW9ucy5zZXR1cEZpbGUpLFxuICAgIC4uLmluY2x1ZGVzLm1hcCgoaW5jKSA9PiBwYXRoLnJlbGF0aXZlKHdvcmtzcGFjZVJvb3QsIGluYykpLFxuICBdO1xuXG4gIGNvbnN0IGVudHJ5UG9pbnRzID0gZ2VuZXJhdGVFbnRyeVBvaW50cyh7XG4gICAgcHJvamVjdFJvb3Q6IHByb2plY3RSb290LFxuICAgIHRlc3RGaWxlcyxcbiAgICBjb250ZXh0LFxuICAgIGFuZ3VsYXJWZXJzaW9uLFxuICB9KTtcblxuICBjb25zdCBvdXRwdXRGaWxlcyA9IG5ldyBNYXAoKTtcblxuICBjb25zdCB2aXRlQ29uZmlnOiBhbnkgPSB7XG4gICAgcGx1Z2luczogW1xuICAgICAgKGF3YWl0IGNyZWF0ZUFuZ3VsYXJNZW1vcnlQbHVnaW4oe1xuICAgICAgICBhbmd1bGFyVmVyc2lvbixcbiAgICAgICAgd29ya3NwYWNlUm9vdCxcbiAgICAgICAgb3V0cHV0RmlsZXMsXG4gICAgICB9KSkgYXMgUGx1Z2luLFxuICAgICAgYXdhaXQgZXNidWlsZERvd25sZXZlbFBsdWdpbigpLFxuICAgIF0sXG4gIH07XG5cbiAgbGV0IHNlcnZlcjogVml0ZXN0IHwgdW5kZWZpbmVkO1xuICBmb3IgYXdhaXQgKGNvbnN0IGJ1aWxkT3V0cHV0IG9mIGJ1aWxkQXBwbGljYXRpb25JbnRlcm5hbChcbiAgICB7XG4gICAgICBhb3Q6IGZhbHNlLFxuICAgICAgaW5kZXg6IGZhbHNlLFxuICAgICAgcHJvZ3Jlc3M6IGZhbHNlLFxuICAgICAgcHJlcmVuZGVyOiBmYWxzZSxcbiAgICAgIG9wdGltaXphdGlvbjogZmFsc2UsXG4gICAgICBvdXRwdXRQYXRoOiBgLmFuZ3VsYXIvLnZpdGVzdC8ke3Byb2plY3RDb25maWdbJ25hbWUnXX1gLFxuICAgICAgb3V0RXh0ZW5zaW9uOiAnbWpzJyxcbiAgICAgIG91dHB1dEhhc2hpbmc6IDIsIC8vIE5vbmVcbiAgICAgIHRzQ29uZmlnOiBwYXRoLnJlbGF0aXZlKHdvcmtzcGFjZVJvb3QsIG9wdGlvbnMudHNDb25maWcpLFxuICAgICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2ggPT09IHRydWUsXG4gICAgICBlbnRyeVBvaW50cyxcbiAgICAgIGFsbG93ZWRDb21tb25Kc0RlcGVuZGVuY2llczogWydAYW5hbG9nanMvdml0ZXN0LWFuZ3VsYXIvc2V0dXAtem9uZSddLFxuICAgICAgc291cmNlTWFwOiB7XG4gICAgICAgIHNjcmlwdHM6IHRydWUsXG4gICAgICAgIHN0eWxlczogZmFsc2UsXG4gICAgICAgIHZlbmRvcjogZmFsc2UsXG4gICAgICB9LFxuICAgIH0sXG4gICAgY29udGV4dCxcbiAgKSkge1xuICAgIGlmIChidWlsZE91dHB1dC5raW5kID09PSBSZXN1bHRLaW5kLkZhaWx1cmUpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuSW5jcmVtZW50YWwgfHxcbiAgICAgIGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuRnVsbFxuICAgICkge1xuICAgICAgaWYgKGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuRnVsbCkge1xuICAgICAgICBvdXRwdXRGaWxlcy5jbGVhcigpO1xuICAgICAgICBPYmplY3Qua2V5cyhidWlsZE91dHB1dC5maWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgb3V0cHV0RmlsZXMuc2V0KGtleSwgYnVpbGRPdXRwdXQuZmlsZXNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmtleXMoYnVpbGRPdXRwdXQuZmlsZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIG91dHB1dEZpbGVzLnNldChrZXksIGJ1aWxkT3V0cHV0LmZpbGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy53YXRjaCkge1xuICAgICAgaWYgKCFzZXJ2ZXIpIHtcbiAgICAgICAgc2VydmVyID0gYXdhaXQgc3RhcnRWaXRlc3QoJ3Rlc3QnLCBbXSwgY29uZmlnLCB2aXRlQ29uZmlnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IHNlcnZlci5zdGFydChbXSk7XG4gICAgICB9XG5cbiAgICAgIHlpZWxkIHsgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFZpdGVzdCgndGVzdCcsIFtdLCBjb25maWcsIHZpdGVDb25maWcpO1xuXG4gICAgICBjb25zdCBzdWNjZXNzID0gc2VydmVyPy5zdGF0ZS5nZXRDb3VudE9mRmFpbGVkVGVzdHMoKSA9PT0gMDtcblxuICAgICAgeWllbGQgeyBzdWNjZXNzIH07XG4gICAgfVxuICB9XG5cbiAgeWllbGQgeyBzdWNjZXNzOiB0cnVlIH07XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRFeHRyYUFyZ3MoXG4gIG9wdGlvbnM6IFZpdGVzdFNjaGVtYSxcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgYW55Pj4ge1xuICAvLyBzdXBwb3J0IHBhc3NpbmcgZXh0cmEgYXJncyB0byBWaXRlc3QgQ0xJXG4gIGNvbnN0IHNjaGVtYSA9IGF3YWl0IGltcG9ydCgnLi9zY2hlbWEuanNvbicsIHsgd2l0aDogeyB0eXBlOiAnanNvbicgfSB9KTtcbiAgY29uc3QgZXh0cmFBcmdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9wdGlvbnMpKSB7XG4gICAgaWYgKCEoc2NoZW1hIGFzIGFueSkuZGVmYXVsdC5wcm9wZXJ0aWVzW2tleV0pIHtcbiAgICAgIGV4dHJhQXJnc1trZXldID0gKG9wdGlvbnMgYXMgYW55KVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHRyYUFyZ3M7XG59XG5cbmZ1bmN0aW9uIGZpbmRJbmNsdWRlcyhvcHRpb25zOiB7XG4gIHdvcmtzcGFjZVJvb3Q6IHN0cmluZztcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgaW5jbHVkZTogc3RyaW5nW107XG4gIGV4Y2x1ZGU6IHN0cmluZ1tdO1xufSkge1xuICBjb25zdCBmZyA9IHJlcXVpcmUoJ2Zhc3QtZ2xvYicpO1xuICBjb25zdCB7IG5vcm1hbGl6ZVBhdGggfSA9IHJlcXVpcmUoJ3ZpdGUnKTtcblxuICBjb25zdCBwcm9qZWN0Um9vdCA9IG5vcm1hbGl6ZVBhdGgoXG4gICAgcGF0aC5yZXNvbHZlKG9wdGlvbnMud29ya3NwYWNlUm9vdCwgb3B0aW9ucy5wcm9qZWN0Um9vdCksXG4gICk7XG4gIGNvbnN0IGdsb2JzID0gWy4uLm9wdGlvbnMuaW5jbHVkZS5tYXAoKGdsb2IpID0+IGAke3Byb2plY3RSb290fS8ke2dsb2J9YCldO1xuXG4gIHJldHVybiBmZy5zeW5jKGdsb2JzLCB7XG4gICAgZG90OiB0cnVlLFxuICAgIGlnbm9yZTogb3B0aW9ucy5leGNsdWRlLFxuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVFbnRyeVBvaW50cyh7XG4gIHByb2plY3RSb290LFxuICB0ZXN0RmlsZXMsXG4gIGNvbnRleHQsXG4gIGFuZ3VsYXJWZXJzaW9uLFxufToge1xuICBwcm9qZWN0Um9vdDogc3RyaW5nO1xuICB0ZXN0RmlsZXM6IHN0cmluZ1tdO1xuICBjb250ZXh0OiBhbnk7XG4gIGFuZ3VsYXJWZXJzaW9uOiBudW1iZXI7XG59KSB7XG4gIGlmIChhbmd1bGFyVmVyc2lvbiA8IDE5KSB7XG4gICAgcmV0dXJuIHRlc3RGaWxlcztcbiAgfVxuXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0KCk7XG5cbiAgcmV0dXJuIG5ldyBNYXAoXG4gICAgQXJyYXkuZnJvbSh0ZXN0RmlsZXMsICh0ZXN0RmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aFxuICAgICAgICAucmVsYXRpdmUoXG4gICAgICAgICAgdGVzdEZpbGUuc3RhcnRzV2l0aChwcm9qZWN0Um9vdClcbiAgICAgICAgICAgID8gcHJvamVjdFJvb3RcbiAgICAgICAgICAgIDogY29udGV4dC53b3Jrc3BhY2VSb290LFxuICAgICAgICAgIHRlc3RGaWxlLFxuICAgICAgICApXG4gICAgICAgIC5yZXBsYWNlKC9eWy4vXSsvLCAnXycpXG4gICAgICAgIC5yZXBsYWNlKC9cXC8vZywgJy0nKTtcblxuICAgICAgbGV0IHVuaXF1ZU5hbWUgPSBgc3BlYy0ke3BhdGguYmFzZW5hbWUoXG4gICAgICAgIHJlbGF0aXZlUGF0aCxcbiAgICAgICAgcGF0aC5leHRuYW1lKHJlbGF0aXZlUGF0aCksXG4gICAgICApfWA7XG4gICAgICBsZXQgc3VmZml4ID0gMjtcbiAgICAgIHdoaWxlIChzZWVuLmhhcyh1bmlxdWVOYW1lKSkge1xuICAgICAgICB1bmlxdWVOYW1lID0gYCR7cmVsYXRpdmVQYXRofS0ke3N1ZmZpeH1gO1xuICAgICAgICArK3N1ZmZpeDtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKHVuaXF1ZU5hbWUpO1xuXG4gICAgICByZXR1cm4gW3VuaXF1ZU5hbWUsIHRlc3RGaWxlXTtcbiAgICB9KSxcbiAgKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY3JlYXRlQnVpbGRlcih2aXRlc3RBcHBsaWNhdGlvbkJ1aWxkZXIpIGFzIHVua25vd247XG4iXX0=
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL2J1aWxkZXJzL2J1aWxkL3ZpdGVzdC5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUk3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3RDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2RCxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLGlEQUFPLENBQUE7SUFDUCwyQ0FBSSxDQUFBO0lBQ0oseURBQVcsQ0FBQTtJQUNYLGlFQUFlLENBQUE7QUFDakIsQ0FBQyxFQUxXLFVBQVUsS0FBVixVQUFVLFFBS3JCO0FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUVoRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QixDQUN0QyxPQUFxQixFQUNyQixPQUFZO0lBRVosT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7SUFFL0IsTUFBTSxFQUFFLHdCQUF3QixFQUFFLGNBQWMsRUFBRSxHQUNoRCxNQUFNLDJCQUEyQixFQUFFLENBQUM7SUFDdEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU8sUUFBUSxDQUNyQyw4QkFBOEIsQ0FD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QUFHLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FDcEMsWUFBWSxFQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQzNCLEVBQUUsQ0FBQztRQUNKLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVCLFVBQVUsR0FBRyxHQUFHLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxFQUFFLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxlQUFlLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgVml0ZXN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFVzZXJDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCB0eXBlIHsgVGVzdFVzZXJDb25maWcgYXMgVml0ZXN0Q29uZmlnIH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tICd0aW55Z2xvYmJ5JztcblxuaW1wb3J0IHsgVml0ZXN0U2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgY3JlYXRlQW5ndWxhck1lbW9yeVBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucy9hbmd1bGFyLW1lbW9yeS1wbHVnaW4nO1xuaW1wb3J0IHsgZXNidWlsZERvd25sZXZlbFBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucy9lc2J1aWxkLWRvd25sZXZlbC1wbHVnaW4nO1xuaW1wb3J0IHsgZ2V0QnVpbGRBcHBsaWNhdGlvbkZ1bmN0aW9uIH0gZnJvbSAnLi9kZXZraXQnO1xuXG5leHBvcnQgZW51bSBSZXN1bHRLaW5kIHtcbiAgRmFpbHVyZSxcbiAgRnVsbCxcbiAgSW5jcmVtZW50YWwsXG4gIENvbXBvbmVudFVwZGF0ZSxcbn1cblxucHJvY2Vzcy5lbnZbJ1ZJVEVfQ0pTX0lHTk9SRV9XQVJOSU5HJ10gPSAndHJ1ZSc7XG5cbmFzeW5jIGZ1bmN0aW9uKiB2aXRlc3RBcHBsaWNhdGlvbkJ1aWxkZXIoXG4gIG9wdGlvbnM6IFZpdGVzdFNjaGVtYSxcbiAgY29udGV4dDogYW55LFxuKTogQXN5bmNJdGVyYWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICBwcm9jZXNzLmVudlsnVEVTVCddID0gJ3RydWUnO1xuICBwcm9jZXNzLmVudlsnVklURVNUJ10gPSAndHJ1ZSc7XG5cbiAgY29uc3QgeyBidWlsZEFwcGxpY2F0aW9uSW50ZXJuYWwsIGFuZ3VsYXJWZXJzaW9uIH0gPVxuICAgIGF3YWl0IGdldEJ1aWxkQXBwbGljYXRpb25GdW5jdGlvbigpO1xuICBjb25zdCB7IHN0YXJ0Vml0ZXN0IH0gPSBhd2FpdCAoRnVuY3Rpb24oXG4gICAgJ3JldHVybiBpbXBvcnQoXCJ2aXRlc3Qvbm9kZVwiKScsXG4gICkoKSBhcyBQcm9taXNlPHR5cGVvZiBpbXBvcnQoJ3ZpdGVzdC9ub2RlJyk+KTtcblxuICBjb25zdCBwcm9qZWN0Q29uZmlnID0gYXdhaXQgY29udGV4dC5nZXRQcm9qZWN0TWV0YWRhdGEoY29udGV4dC50YXJnZXQpO1xuICBjb25zdCBleHRyYUFyZ3MgPSBhd2FpdCBnZXRFeHRyYUFyZ3Mob3B0aW9ucyk7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBjb250ZXh0LndvcmtzcGFjZVJvb3Q7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvamVjdENvbmZpZ1sncm9vdCddO1xuICBjb25zdCBzZXR1cEZpbGUgPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBvcHRpb25zLnNldHVwRmlsZSk7XG5cbiAgY29uc3QgY29uZmlnOiBWaXRlc3RDb25maWcgPSB7XG4gICAgcm9vdDogYCR7cHJvamVjdFJvb3QgfHwgJy4nfWAsXG4gICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2ggPT09IHRydWUsXG4gICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZ0ZpbGUsXG4gICAgc2V0dXBGaWxlczogW3NldHVwRmlsZV0sXG4gICAgZ2xvYmFsczogdHJ1ZSxcbiAgICBwb29sOiAndm1UaHJlYWRzJyxcbiAgICByZXBvcnRlcnM6IFsnZGVmYXVsdCddLFxuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IG9wdGlvbnM/LmV4Y2x1ZGUgfHwgW10sXG4gICAgLi4uZXh0cmFBcmdzLFxuICB9O1xuXG4gIGNvbnN0IGluY2x1ZGVzOiBzdHJpbmdbXSA9IGZpbmRJbmNsdWRlcyh7XG4gICAgd29ya3NwYWNlUm9vdCxcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBpbmNsdWRlOiBvcHRpb25zLmluY2x1ZGUsXG4gICAgZXhjbHVkZTogb3B0aW9ucy5leGNsdWRlIHx8IFtdLFxuICB9KTtcblxuICBjb25zdCB0ZXN0RmlsZXMgPSBbXG4gICAgcGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBvcHRpb25zLnNldHVwRmlsZSksXG4gICAgLi4uaW5jbHVkZXMubWFwKChpbmMpID0+IHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgaW5jKSksXG4gIF07XG5cbiAgY29uc3QgZW50cnlQb2ludHMgPSBnZW5lcmF0ZUVudHJ5UG9pbnRzKHtcbiAgICBwcm9qZWN0Um9vdDogcHJvamVjdFJvb3QsXG4gICAgdGVzdEZpbGVzLFxuICAgIGNvbnRleHQsXG4gICAgYW5ndWxhclZlcnNpb24sXG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dEZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IHZpdGVDb25maWc6IGFueSA9IHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAoYXdhaXQgY3JlYXRlQW5ndWxhck1lbW9yeVBsdWdpbih7XG4gICAgICAgIGFuZ3VsYXJWZXJzaW9uLFxuICAgICAgICB3b3Jrc3BhY2VSb290LFxuICAgICAgICBvdXRwdXRGaWxlcyxcbiAgICAgIH0pKSBhcyBQbHVnaW4sXG4gICAgICBhd2FpdCBlc2J1aWxkRG93bmxldmVsUGx1Z2luKCksXG4gICAgXSxcbiAgfTtcblxuICBsZXQgc2VydmVyOiBWaXRlc3QgfCB1bmRlZmluZWQ7XG4gIGZvciBhd2FpdCAoY29uc3QgYnVpbGRPdXRwdXQgb2YgYnVpbGRBcHBsaWNhdGlvbkludGVybmFsKFxuICAgIHtcbiAgICAgIGFvdDogZmFsc2UsXG4gICAgICBpbmRleDogZmFsc2UsXG4gICAgICBwcm9ncmVzczogZmFsc2UsXG4gICAgICBwcmVyZW5kZXI6IGZhbHNlLFxuICAgICAgb3B0aW1pemF0aW9uOiBmYWxzZSxcbiAgICAgIG91dHB1dFBhdGg6IGAuYW5ndWxhci8udml0ZXN0LyR7cHJvamVjdENvbmZpZ1snbmFtZSddfWAsXG4gICAgICBvdXRFeHRlbnNpb246ICdtanMnLFxuICAgICAgb3V0cHV0SGFzaGluZzogMiwgLy8gTm9uZVxuICAgICAgdHNDb25maWc6IHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgb3B0aW9ucy50c0NvbmZpZyksXG4gICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCA9PT0gdHJ1ZSxcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgYWxsb3dlZENvbW1vbkpzRGVwZW5kZW5jaWVzOiBbJ0BhbmFsb2dqcy92aXRlc3QtYW5ndWxhci9zZXR1cC16b25lJ10sXG4gICAgICBzb3VyY2VNYXA6IHtcbiAgICAgICAgc2NyaXB0czogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiBmYWxzZSxcbiAgICAgICAgdmVuZG9yOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250ZXh0LFxuICApKSB7XG4gICAgaWYgKGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuRmFpbHVyZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5JbmNyZW1lbnRhbCB8fFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsXG4gICAgKSB7XG4gICAgICBpZiAoYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsKSB7XG4gICAgICAgIG91dHB1dEZpbGVzLmNsZWFyKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkT3V0cHV0LmZpbGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBvdXRwdXRGaWxlcy5zZXQoa2V5LCBidWlsZE91dHB1dC5maWxlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhidWlsZE91dHB1dC5maWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgb3V0cHV0RmlsZXMuc2V0KGtleSwgYnVpbGRPdXRwdXQuZmlsZXNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFZpdGVzdCgndGVzdCcsIFtdLCBjb25maWcsIHZpdGVDb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KFtdKTtcbiAgICAgIH1cblxuICAgICAgeWllbGQgeyBzdWNjZXNzOiB0cnVlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlciA9IGF3YWl0IHN0YXJ0Vml0ZXN0KCd0ZXN0JywgW10sIGNvbmZpZywgdml0ZUNvbmZpZyk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXJ2ZXI/LnN0YXRlLmdldENvdW50T2ZGYWlsZWRUZXN0cygpID09PSAwO1xuXG4gICAgICB5aWVsZCB7IHN1Y2Nlc3MgfTtcbiAgICB9XG4gIH1cblxuICB5aWVsZCB7IHN1Y2Nlc3M6IHRydWUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhQXJncyhcbiAgb3B0aW9uczogVml0ZXN0U2NoZW1hLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIC8vIHN1cHBvcnQgcGFzc2luZyBleHRyYSBhcmdzIHRvIFZpdGVzdCBDTElcbiAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW1wb3J0KCcuL3NjaGVtYS5qc29uJywgeyB3aXRoOiB7IHR5cGU6ICdqc29uJyB9IH0pO1xuICBjb25zdCBleHRyYUFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICBpZiAoIShzY2hlbWEgYXMgYW55KS5kZWZhdWx0LnByb3BlcnRpZXNba2V5XSkge1xuICAgICAgZXh0cmFBcmdzW2tleV0gPSAob3B0aW9ucyBhcyBhbnkpW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4dHJhQXJncztcbn1cblxuLyoqXG4gKiBGaW5kcyB0ZXN0IGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFZpdGVzdCBydW4gdXNpbmcgdGlueWdsb2JieSBwYXR0ZXJuIG1hdGNoaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBOb3JtYWxpemVzIHRoZSBwcm9qZWN0IHJvb3QgcGF0aCB0byBlbnN1cmUgY29uc2lzdGVudCBwYXRoIHNlcGFyYXRvcnNcbiAqIDIuIENvbnN0cnVjdHMgZ2xvYiBwYXR0ZXJucyBieSBwcmVwZW5kaW5nIHRoZSBwcm9qZWN0IHJvb3QgdG8gZWFjaCBpbmNsdWRlIHBhdHRlcm5cbiAqIDMuIFVzZXMgZ2xvYlN5bmMgZnJvbSB0aW55Z2xvYmJ5IHRvIGZpbmQgYWxsIGZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJucyB3aGlsZSByZXNwZWN0aW5nIGV4Y2x1c2lvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBwYXRocywgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zXG4gKiBAcmV0dXJucyBBcnJheSBvZiBhYnNvbHV0ZSBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnNcbiAqXG4gKiBTYW1wbGUgb3V0cHV0IHBhdGhzOlxuICogLSAvd29ya3NwYWNlL2FwcHMvbXktYXBwL3NyYy9hcHAvYXBwLmNvbXBvbmVudC5zcGVjLnRzXG4gKiAtIC93b3Jrc3BhY2UvYXBwcy9teS1hcHAvc3JjL2FwcC9zZXJ2aWNlcy9kYXRhLnNlcnZpY2Uuc3BlYy50c1xuICogLSAvd29ya3NwYWNlL2FwcHMvbXktYXBwL3NyYy9hcHAvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC50ZXN0LnRzXG4gKiAtIC93b3Jrc3BhY2UvYXBwcy9teS1hcHAvc3JjL2FwcC91dGlscy9oZWxwZXJzLnNwZWMudHNcbiAqXG4gKiB0aW55Z2xvYmJ5IHZzIGZhc3QtZ2xvYiBjb21wYXJpc29uOlxuICogLSBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgZ2xvYiBwYXR0ZXJucyBhbmQgaWdub3JlIGZ1bmN0aW9uYWxpdHlcbiAqIC0gQm90aCBhcmUgZmFzdCBhbmQgZWZmaWNpZW50IGZvciBmaWxlIG1hdGNoaW5nXG4gKiAtIHRpbnlnbG9iYnkgaXMgYSBsaWdodGVyIGFsdGVybmF0aXZlIHdpdGggc2ltaWxhciBBUElcbiAqIC0gdGlueWdsb2JieSdzIGdsb2JTeW5jIHJldHVybnMgYWJzb2x1dGUgcGF0aHMgYnkgZGVmYXVsdCB3aGVuIGFic29sdXRlOiB0cnVlIGlzIHNldFxuICogLSB0aW55Z2xvYmJ5IGhhcyBmZXdlciBkZXBlbmRlbmNpZXMgYW5kIHNtYWxsZXIgYnVuZGxlIHNpemVcbiAqXG4gKiBnbG9iU3luYyBvcHRpb25zIGV4cGxhaW5lZDpcbiAqIC0gZG90OiB0cnVlIC0gSW5jbHVkZXMgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzdGFydCB3aXRoIGEgZG90IChlLmcuLCAuZW52LnRlc3QpXG4gKiAtIGFic29sdXRlOiB0cnVlIC0gUmV0dXJucyBhYnNvbHV0ZSBmaWxlIHBhdGhzIGluc3RlYWQgb2YgcmVsYXRpdmUgcGF0aHNcbiAqIC0gaWdub3JlOiBvcHRpb25zLmV4Y2x1ZGUgLSBFeGNsdWRlcyBmaWxlcyBtYXRjaGluZyB0aGUgZXhjbHVkZSBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBmaW5kSW5jbHVkZXMob3B0aW9uczoge1xuICB3b3Jrc3BhY2VSb290OiBzdHJpbmc7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBleGNsdWRlOiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgeyBub3JtYWxpemVQYXRoIH0gPSByZXF1aXJlKCd2aXRlJyk7XG5cbiAgLy8gTm9ybWFsaXplIHByb2plY3Qgcm9vdCBwYXRoIHRvIGVuc3VyZSBjb25zaXN0ZW50IHBhdGggc2VwYXJhdG9ycyBhY3Jvc3MgcGxhdGZvcm1zXG4gIGNvbnN0IHByb2plY3RSb290ID0gbm9ybWFsaXplUGF0aChcbiAgICBwYXRoLnJlc29sdmUob3B0aW9ucy53b3Jrc3BhY2VSb290LCBvcHRpb25zLnByb2plY3RSb290KSxcbiAgKTtcblxuICAvLyBDb25zdHJ1Y3QgZ2xvYiBwYXR0ZXJucyBieSBwcmVwZW5kaW5nIHByb2plY3Qgcm9vdCB0byBlYWNoIGluY2x1ZGUgcGF0dGVyblxuICAvLyBFeGFtcGxlOiBpZiBpbmNsdWRlPVsnKiovKi5zcGVjLnRzJ10gYW5kIHByb2plY3RSb290PScvd29ya3NwYWNlL2FwcHMvbXktYXBwJ1xuICAvLyBSZXN1bHQ6IFsnL3dvcmtzcGFjZS9hcHBzL215LWFwcC8qKi8qLnNwZWMudHMnXVxuICBjb25zdCBnbG9icyA9IFsuLi5vcHRpb25zLmluY2x1ZGUubWFwKChnbG9iKSA9PiBgJHtwcm9qZWN0Um9vdH0vJHtnbG9ifWApXTtcblxuICAvLyBVc2UgZ2xvYlN5bmMgZnJvbSB0aW55Z2xvYmJ5IHRvIGZpbmQgYWxsIGZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuc1xuICAvLyBSZXR1cm5zIGFic29sdXRlIGZpbGUgcGF0aHMgdGhhdCBtYXRjaCB0aGUgaW5jbHVkZSBwYXR0ZXJucyB3aGlsZSByZXNwZWN0aW5nIGV4Y2x1c2lvbnNcbiAgcmV0dXJuIGdsb2JTeW5jKGdsb2JzLCB7XG4gICAgZG90OiB0cnVlLCAvLyBJbmNsdWRlIGZpbGVzL2RpcmVjdG9yaWVzIHN0YXJ0aW5nIHdpdGggZG90IChlLmcuLCAuZW52LnRlc3QpXG4gICAgYWJzb2x1dGU6IHRydWUsIC8vIFJldHVybiBhYnNvbHV0ZSBmaWxlIHBhdGhzXG4gICAgaWdub3JlOiBvcHRpb25zLmV4Y2x1ZGUsIC8vIEV4Y2x1ZGUgZmlsZXMgbWF0Y2hpbmcgdGhlc2UgcGF0dGVybnNcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW50cnlQb2ludHMoe1xuICBwcm9qZWN0Um9vdCxcbiAgdGVzdEZpbGVzLFxuICBjb250ZXh0LFxuICBhbmd1bGFyVmVyc2lvbixcbn06IHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgdGVzdEZpbGVzOiBzdHJpbmdbXTtcbiAgY29udGV4dDogYW55O1xuICBhbmd1bGFyVmVyc2lvbjogbnVtYmVyO1xufSkge1xuICBpZiAoYW5ndWxhclZlcnNpb24gPCAxOSkge1xuICAgIHJldHVybiB0ZXN0RmlsZXM7XG4gIH1cblxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuXG4gIHJldHVybiBuZXcgTWFwKFxuICAgIEFycmF5LmZyb20odGVzdEZpbGVzLCAodGVzdEZpbGUpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGhcbiAgICAgICAgLnJlbGF0aXZlKFxuICAgICAgICAgIHRlc3RGaWxlLnN0YXJ0c1dpdGgocHJvamVjdFJvb3QpXG4gICAgICAgICAgICA/IHByb2plY3RSb290XG4gICAgICAgICAgICA6IGNvbnRleHQud29ya3NwYWNlUm9vdCxcbiAgICAgICAgICB0ZXN0RmlsZSxcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgvXlsuL10rLywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICctJyk7XG5cbiAgICAgIGxldCB1bmlxdWVOYW1lID0gYHNwZWMtJHtwYXRoLmJhc2VuYW1lKFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHBhdGguZXh0bmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgKX1gO1xuICAgICAgbGV0IHN1ZmZpeCA9IDI7XG4gICAgICB3aGlsZSAoc2Vlbi5oYXModW5pcXVlTmFtZSkpIHtcbiAgICAgICAgdW5pcXVlTmFtZSA9IGAke3JlbGF0aXZlUGF0aH0tJHtzdWZmaXh9YDtcbiAgICAgICAgKytzdWZmaXg7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZCh1bmlxdWVOYW1lKTtcblxuICAgICAgcmV0dXJuIFt1bmlxdWVOYW1lLCB0ZXN0RmlsZV07XG4gICAgfSksXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUJ1aWxkZXIodml0ZXN0QXBwbGljYXRpb25CdWlsZGVyKSBhcyB1bmtub3duO1xuIl19