@workflow/next 5.0.0-beta.1 → 5.0.0-beta.11

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/dist/index.js CHANGED
@@ -4,26 +4,248 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withWorkflow = withWorkflow;
7
+ const node_fs_1 = require("node:fs");
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_path_1 = require("node:path");
7
10
  const semver_1 = __importDefault(require("semver"));
8
11
  const builder_js_1 = require("./builder.js");
12
+ const environment_flag_js_1 = require("./environment-flag.js");
13
+ const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
14
+ const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
15
+ '@vercel/queue',
16
+ '@vercel/oidc',
17
+ '@vercel/cli-auth',
18
+ '@napi-rs/keyring',
19
+ ];
20
+ const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
21
+ VERCEL_WORLD_PACKAGE,
22
+ ...VERCEL_WORLD_DEPENDENCY_PACKAGES,
23
+ ];
24
+ const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
25
+ const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
26
+ const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
27
+ const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
28
+ const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
29
+ const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
30
+ const warnedAutoRemovedServerExternalPackages = new Set();
31
+ function isPlainObject(value) {
32
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
33
+ }
34
+ function isResolvablePackageSpecifier(specifier) {
35
+ if (specifier.startsWith('.') || specifier.startsWith('/')) {
36
+ return false;
37
+ }
38
+ if (specifier.startsWith('$')) {
39
+ return false;
40
+ }
41
+ if (specifier.includes('*') || specifier.includes(':')) {
42
+ return false;
43
+ }
44
+ return true;
45
+ }
46
+ function detectWorkflowPatterns(source) {
47
+ const hasUseWorkflow = useWorkflowPattern.test(source);
48
+ const hasUseStep = useStepPattern.test(source);
49
+ const hasSerdeImport = workflowSerdeImportPattern.test(source);
50
+ const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
51
+ const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
52
+ return {
53
+ hasUseWorkflow,
54
+ hasUseStep,
55
+ hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
56
+ };
57
+ }
58
+ function getIssueLabels(detected) {
59
+ const issues = [];
60
+ if (detected.hasUseWorkflow) {
61
+ issues.push('"use workflow" functions');
62
+ }
63
+ if (detected.hasUseStep) {
64
+ issues.push('"use step" functions');
65
+ }
66
+ if (detected.hasSerde) {
67
+ issues.push('serialization classes');
68
+ }
69
+ return issues;
70
+ }
71
+ function hasWorkflowSerdeDependency(packageJson) {
72
+ if (!isPlainObject(packageJson)) {
73
+ return false;
74
+ }
75
+ const dependencies = isPlainObject(packageJson.dependencies)
76
+ ? packageJson.dependencies
77
+ : {};
78
+ const peerDependencies = isPlainObject(packageJson.peerDependencies)
79
+ ? packageJson.peerDependencies
80
+ : {};
81
+ return (Object.hasOwn(dependencies, '@workflow/serde') ||
82
+ Object.hasOwn(peerDependencies, '@workflow/serde'));
83
+ }
84
+ async function detectServerExternalPackage(packageName, workingDir) {
85
+ if (!isResolvablePackageSpecifier(packageName)) {
86
+ return null;
87
+ }
88
+ let hasUseWorkflow = false;
89
+ let hasUseStep = false;
90
+ let hasSerde = false;
91
+ try {
92
+ const packageJsonPath = require.resolve(`${packageName}/package.json`, {
93
+ paths: [workingDir],
94
+ });
95
+ const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
96
+ const packageJson = JSON.parse(packageJsonSource);
97
+ hasSerde = hasWorkflowSerdeDependency(packageJson);
98
+ }
99
+ catch {
100
+ // Best-effort only. Continue to source scanning.
101
+ }
102
+ try {
103
+ const entryPath = require.resolve(packageName, {
104
+ paths: [workingDir],
105
+ });
106
+ const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
107
+ const patterns = detectWorkflowPatterns(source);
108
+ hasUseWorkflow = patterns.hasUseWorkflow;
109
+ hasUseStep = patterns.hasUseStep;
110
+ hasSerde ||= patterns.hasSerde;
111
+ }
112
+ catch {
113
+ // Best-effort only. Use whichever signal we already have.
114
+ }
115
+ if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
116
+ return null;
117
+ }
118
+ return {
119
+ packageName,
120
+ hasUseWorkflow,
121
+ hasUseStep,
122
+ hasSerde,
123
+ };
124
+ }
125
+ function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
126
+ const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
127
+ return !warnedAutoRemovedServerExternalPackages.has(packageName);
128
+ });
129
+ if (newlyDetectedPackages.length === 0) {
130
+ return;
131
+ }
132
+ for (const { packageName } of newlyDetectedPackages) {
133
+ warnedAutoRemovedServerExternalPackages.add(packageName);
134
+ }
135
+ const packageDescriptions = newlyDetectedPackages
136
+ .map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
137
+ .join(', ');
138
+ const packageNames = newlyDetectedPackages
139
+ .map((detected) => `"${detected.packageName}"`)
140
+ .join(', ');
141
+ console.warn(`\n⚠ Workflow removed ${packageDescriptions} from serverExternalPackages for this build.` +
142
+ `\n These packages contain workflow code and must be transformed by the workflow compiler.` +
143
+ `\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
144
+ }
9
145
  function resolveNextVersion(workingDir) {
10
- const fallbackVersion = require('next/package.json').version;
146
+ const errors = [];
147
+ // Try resolving from the consuming project's working directory first.
148
+ // This handles monorepo setups where `next` may not be hoisted to the
149
+ // same location as `@workflow/next`.
11
150
  try {
12
151
  const packageJsonPath = require.resolve('next/package.json', {
13
152
  paths: [workingDir],
14
153
  });
15
154
  const resolvedPackageJson = require(packageJsonPath);
16
- return typeof resolvedPackageJson.version === 'string'
17
- ? resolvedPackageJson.version
18
- : fallbackVersion;
155
+ if (typeof resolvedPackageJson.version === 'string') {
156
+ return resolvedPackageJson.version;
157
+ }
158
+ }
159
+ catch (e) {
160
+ errors.push(e);
161
+ }
162
+ // Fall back to resolving relative to this package's location.
163
+ try {
164
+ const version = require('next/package.json')
165
+ .version;
166
+ if (typeof version === 'string') {
167
+ return version;
168
+ }
169
+ }
170
+ catch (e) {
171
+ errors.push(e);
172
+ }
173
+ throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
174
+ }
175
+ function fileExists(path) {
176
+ try {
177
+ const stats = (0, node_fs_1.statSync)(path);
178
+ return stats.isFile();
19
179
  }
20
180
  catch {
21
- return fallbackVersion;
181
+ return false;
182
+ }
183
+ }
184
+ function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
185
+ const manifestCandidates = [
186
+ (0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
187
+ (0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
188
+ (0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
189
+ ];
190
+ const manifestPath = manifestCandidates.find(fileExists);
191
+ if (!manifestPath) {
192
+ return;
193
+ }
194
+ const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
195
+ ? distDir
196
+ : (0, node_path_1.join)(projectDir, distDir);
197
+ const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
198
+ return { manifestPath, diagnosticsManifestPath };
199
+ }
200
+ async function copyWorkflowDiagnosticsManifest(metadata) {
201
+ const paths = getWorkflowManifestCopyPaths(metadata);
202
+ if (!paths) {
203
+ return;
204
+ }
205
+ const { manifestPath, diagnosticsManifestPath } = paths;
206
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
207
+ await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
208
+ }
209
+ function copyWorkflowDiagnosticsManifestSync(metadata) {
210
+ const paths = getWorkflowManifestCopyPaths(metadata);
211
+ if (!paths) {
212
+ return;
213
+ }
214
+ const { manifestPath, diagnosticsManifestPath } = paths;
215
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
216
+ (0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
217
+ }
218
+ function registerWorkflowDiagnosticsManifestCopy(metadata) {
219
+ const marker = '__workflowDiagnosticsManifestCopies';
220
+ const globalWithMarker = globalThis;
221
+ if (!globalWithMarker[marker]) {
222
+ globalWithMarker[marker] = [];
223
+ process.once('exit', () => {
224
+ for (const copyMetadata of globalWithMarker[marker] || []) {
225
+ copyWorkflowDiagnosticsManifestSync(copyMetadata);
226
+ }
227
+ });
22
228
  }
229
+ globalWithMarker[marker].push(metadata);
23
230
  }
24
231
  function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
25
- if (workflows?.lazyDiscovery) {
26
- process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
232
+ // lazyDiscovery defaults to true; pass `lazyDiscovery: false` to force eager
233
+ // discovery (scanning the project at startup) instead of deferring workflow
234
+ // discovery until files are requested. The `WORKFLOW_NEXT_LAZY_DISCOVERY`
235
+ // environment variable, if set, takes precedence over the option.
236
+ const lazyDiscoveryOverride = (0, environment_flag_js_1.parseEnvironmentFlag)(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
237
+ if (lazyDiscoveryOverride === undefined) {
238
+ if (workflows?.lazyDiscovery === false) {
239
+ delete process.env.WORKFLOW_NEXT_LAZY_DISCOVERY;
240
+ }
241
+ else {
242
+ process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
243
+ }
244
+ }
245
+ else {
246
+ process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = lazyDiscoveryOverride
247
+ ? '1'
248
+ : '0';
27
249
  }
28
250
  if (!process.env.VERCEL_DEPLOYMENT_ID) {
29
251
  if (!process.env.WORKFLOW_TARGET_WORLD) {
@@ -52,6 +274,45 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
52
274
  }
53
275
  // shallow clone to avoid read-only on top-level
54
276
  nextConfig = Object.assign({}, nextConfig);
277
+ nextConfig.serverExternalPackages = [
278
+ ...new Set([
279
+ ...(nextConfig.serverExternalPackages || []),
280
+ // Keep the Vercel world and its native-prone dependencies external so
281
+ // local builds do not try to parse @vercel/queue's keyring dependency
282
+ // tree.
283
+ ...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
284
+ ]),
285
+ ];
286
+ const existingCompiler = nextConfig.compiler ?? {};
287
+ const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
288
+ const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
289
+ ? nextConfig.serverExternalPackages
290
+ : [];
291
+ let effectiveServerExternalPackages = configuredServerExternalPackages;
292
+ if (configuredServerExternalPackages.length > 0) {
293
+ const detectedWorkflowPackages = [];
294
+ for (const packageName of configuredServerExternalPackages) {
295
+ if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
296
+ continue;
297
+ }
298
+ try {
299
+ const detected = await detectServerExternalPackage(packageName, process.cwd());
300
+ if (detected) {
301
+ detectedWorkflowPackages.push(detected);
302
+ }
303
+ }
304
+ catch {
305
+ // Best-effort only. Never block config generation.
306
+ }
307
+ }
308
+ if (detectedWorkflowPackages.length > 0) {
309
+ const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
310
+ effectiveServerExternalPackages =
311
+ configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
312
+ nextConfig.serverExternalPackages = effectiveServerExternalPackages;
313
+ warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
314
+ }
315
+ }
55
316
  // configure the loader if turbopack is being used
56
317
  if (!nextConfig.turbopack) {
57
318
  nextConfig.turbopack = {};
@@ -68,6 +329,17 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
68
329
  const shouldApplyTurboCondition = supportsTurboCondition && !useDeferredBuilder;
69
330
  const shouldWatch = process.env.NODE_ENV === 'development';
70
331
  let workflowBuilderPromise;
332
+ const distDir = nextConfig.distDir || '.next';
333
+ nextConfig.compiler = {
334
+ ...existingCompiler,
335
+ runAfterProductionCompile: async (metadata) => {
336
+ if (existingRunAfterProductionCompile) {
337
+ await existingRunAfterProductionCompile(metadata);
338
+ }
339
+ await copyWorkflowDiagnosticsManifest(metadata);
340
+ registerWorkflowDiagnosticsManifestCopy(metadata);
341
+ },
342
+ };
71
343
  const getWorkflowBuilder = async () => {
72
344
  if (!workflowBuilderPromise) {
73
345
  workflowBuilderPromise = (async () => {
@@ -78,11 +350,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
78
350
  dirs: ['pages', 'app', 'src/pages', 'src/app'],
79
351
  projectRoot: nextConfig.outputFileTracingRoot,
80
352
  workingDir: process.cwd(),
81
- distDir: nextConfig.distDir || '.next',
353
+ distDir,
354
+ diagnosticsDir: `${distDir}/diagnostics`,
82
355
  buildTarget: 'next',
83
356
  workflowsBundlePath: '', // not used in base
84
357
  stepsBundlePath: '', // not used in base
85
358
  webhookBundlePath: '', // node used in base
359
+ sourcemap: workflows?.sourcemap,
86
360
  suppressCreateWorkflowsBundleLogs: useDeferredBuilder,
87
361
  suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
88
362
  suppressCreateWebhookBundleLogs: useDeferredBuilder,
@@ -94,7 +368,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
94
368
  // See: https://nextjs.org/docs/app/getting-started/server-and-client-components
95
369
  'server-only',
96
370
  'client-only',
97
- ...(nextConfig.serverExternalPackages || []),
371
+ ...effectiveServerExternalPackages,
98
372
  ],
99
373
  });
100
374
  })();
@@ -184,7 +458,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
184
458
  loader: loaderPath,
185
459
  });
186
460
  return existingWebpackModify
187
- ? existingWebpackModify(...args)
461
+ ? (existingWebpackModify(...args) ?? webpackConfig)
188
462
  : webpackConfig;
189
463
  };
190
464
  // only run this in the main process so it only runs once
@@ -198,4 +472,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
198
472
  return nextConfig;
199
473
  };
200
474
  }
201
- //# sourceMappingURL=index.js.map
475
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE2VEEsb0NBNFRDO0FBem5CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUV0RCxvREFBNEI7QUFDNUIsNkNBSXNCO0FBQ3RCLCtEQUE2RDtBQUU3RCxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFlbEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxTQUFpQjtJQUNyRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENB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QUNwQixDQUFDLENBQUM7UUFDRix5REFBeUQ7UUFDekQsdURBQXVEO1FBQ3ZELElBQ0UsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtZQUN4QyxLQUFLLEtBQUsseUJBQXlCLEVBQ25DLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7WUFFbkQsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxHQUFHLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIG1rZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNvcHlGaWxlLCBta2RpciwgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICBnZXROZXh0QnVpbGRlcixcbiAgc2hvdWxkVXNlRGVmZXJyZWRCdWlsZGVyLFxuICBXT1JLRkxPV19ERUZFUlJFRF9FTlRSSUVTLFxufSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFbnZpcm9ubWVudEZsYWcgfSBmcm9tICcuL2Vudmlyb25tZW50LWZsYWcuanMnO1xuXG5jb25zdCBWRVJDRUxfV09STERfUEFDS0FHRSA9ICdAd29ya2Zsb3cvd29ybGQtdmVyY2VsJztcbmNvbnN0IFZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTID0gW1xuICAnQHZlcmNlbC9xdWV1ZScsXG4gICdAdmVyY2VsL29pZGMnLFxuICAnQHZlcmNlbC9jbGktYXV0aCcsXG4gICdAbmFwaS1ycy9rZXlyaW5nJyxcbl07XG5jb25zdCBWRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTID0gW1xuICBWRVJDRUxfV09STERfUEFDS0FHRSxcbiAgLi4uVkVSQ0VMX1dPUkxEX0RFUEVOREVOQ1lfUEFDS0FHRVMsXG5dO1xuXG5jb25zdCB1c2VXb3JrZmxvd1BhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHdvcmtmbG93XFwxOz9cXHMqJC9tO1xuY29uc3QgdXNlU3RlcFBhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHN0ZXBcXDE7P1xccyokL207XG5jb25zdCB3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybiA9IC9mcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMS87XG5jb25zdCB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybiA9XG4gIC9TeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwxXFxzKlxcKS87XG5jb25zdCB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4gPVxuICAvXFxbXFxzKldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSlcXHMqXFxdLztcblxuY29uc3QgUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTID0gbmV3IFNldChbJ3NlcnZlci1vbmx5JywgJ2NsaWVudC1vbmx5J10pO1xuY29uc3Qgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmludGVyZmFjZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIGhhc1VzZVdvcmtmbG93OiBib29sZWFuO1xuICBoYXNVc2VTdGVwOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLmluY2x1ZGVzKCcqJykgfHwgc3BlY2lmaWVyLmluY2x1ZGVzKCc6JykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgY29uc3QgaGFzVXNlV29ya2Zsb3cgPSB1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNVc2VTdGVwID0gdXNlU3RlcFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUltcG9ydCA9IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVTeW1ib2wgPSB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSA9XG4gICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKTtcblxuICByZXR1cm4ge1xuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGU6IGhhc1NlcmRlSW1wb3J0IHx8IGhhc1NlcmRlU3ltYm9sIHx8IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SXNzdWVMYWJlbHMoZGV0ZWN0ZWQ6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VXb3JrZmxvdykge1xuICAgIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VTdGVwKSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgfVxuICBpZiAoZGV0ZWN0ZWQuaGFzU2VyZGUpIHtcbiAgICBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG4gIH1cbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuZnVuY3Rpb24gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb246IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzXG4gICAgOiB7fTtcbiAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcylcbiAgICA/IHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuXG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihkZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKSB8fFxuICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdFNlcnZlckV4dGVybmFsUGFja2FnZShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHwgbnVsbD4ge1xuICBpZiAoIWlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIocGFja2FnZU5hbWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgaGFzVXNlV29ya2Zsb3cgPSBmYWxzZTtcbiAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgbGV0IGhhc1NlcmRlID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmAsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3QgcGFja2FnZUpzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblNvdXJjZSkgYXMgdW5rbm93bjtcbiAgICBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gQ29udGludWUgdG8gc291cmNlIHNjYW5uaW5nLlxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZW50cnlQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICBoYXNVc2VXb3JrZmxvdyA9IHBhdHRlcm5zLmhhc1VzZVdvcmtmbG93O1xuICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgIGhhc1NlcmRlIHx8PSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gVXNlIHdoaWNoZXZlciBzaWduYWwgd2UgYWxyZWFkeSBoYXZlLlxuICB9XG5cbiAgaWYgKCFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzVXNlU3RlcCAmJiAhaGFzU2VyZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFja2FnZU5hbWUsXG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0QXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzKFxuICBkZXRlY3RlZFBhY2thZ2VzOiBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZVtdXG4pOiB2b2lkIHtcbiAgY29uc3QgbmV3bHlEZXRlY3RlZFBhY2thZ2VzID0gZGV0ZWN0ZWRQYWNrYWdlcy5maWx0ZXIoKHsgcGFja2FnZU5hbWUgfSkgPT4ge1xuICAgIHJldHVybiAhd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSk7XG4gIH0pO1xuXG4gIGlmIChuZXdseURldGVjdGVkUGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCB7IHBhY2thZ2VOYW1lIH0gb2YgbmV3bHlEZXRlY3RlZFBhY2thZ2VzKSB7XG4gICAgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlRGVzY3JpcHRpb25zID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcChcbiAgICAgIChkZXRlY3RlZCkgPT5cbiAgICAgICAgYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cIiAoJHtnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZCkuam9pbignLCAnKX0pYFxuICAgIClcbiAgICAuam9pbignLCAnKTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcCgoZGV0ZWN0ZWQpID0+IGBcIiR7ZGV0ZWN0ZWQucGFja2FnZU5hbWV9XCJgKVxuICAgIC5qb2luKCcsICcpO1xuXG4gIGNvbnNvbGUud2FybihcbiAgICBgXFxu4pqgIFdvcmtmbG93IHJlbW92ZWQgJHtwYWNrYWdlRGVzY3JpcHRpb25zfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgZm9yIHRoaXMgYnVpbGQuYCArXG4gICAgICBgXFxuICBUaGVzZSBwYWNrYWdlcyBjb250YWluIHdvcmtmbG93IGNvZGUgYW5kIG11c3QgYmUgdHJhbnNmb3JtZWQgYnkgdGhlIHdvcmtmbG93IGNvbXBpbGVyLmAgK1xuICAgICAgYFxcbiAgUmVtb3ZlICR7cGFja2FnZU5hbWVzfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgaW4gbmV4dC5jb25maWcgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcuXFxuYFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBUcnkgcmVzb2x2aW5nIGZyb20gdGhlIGNvbnN1bWluZyBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb25vcmVwbyBzZXR1cHMgd2hlcmUgYG5leHRgIG1heSBub3QgYmUgaG9pc3RlZCB0byB0aGVcbiAgLy8gc2FtZSBsb2NhdGlvbiBhcyBgQHdvcmtmbG93L25leHRgLlxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnbmV4dC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkUGFja2FnZUpzb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkgYXMge1xuICAgICAgdmVyc2lvbj86IHVua25vd247XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHRoaXMgcGFja2FnZSdzIGxvY2F0aW9uLlxuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSAocmVxdWlyZSgnbmV4dC9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiB1bmtub3duIH0pXG4gICAgICAudmVyc2lvbjtcbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICBlcnJvcnMsXG4gICAgYENvdWxkIG5vdCByZXNvbHZlIE5leHQuanMgdmVyc2lvbi4gRW5zdXJlIFxcYG5leHRcXGAgaXMgaW5zdGFsbGVkIGluIHlvdXIgcHJvamVjdCAod29ya2luZyBkaXJlY3Rvcnk6ICR7d29ya2luZ0Rpcn0pLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMoe1xuICBwcm9qZWN0RGlyLFxuICBkaXN0RGlyLFxufToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB7IG1hbmlmZXN0UGF0aDogc3RyaW5nOyBkaWFnbm9zdGljc01hbmlmZXN0UGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdENhbmRpZGF0ZXMgPSBbXG4gICAgam9pbihwcm9qZWN0RGlyLCAnYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdzcmMvYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICBdO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdENhbmRpZGF0ZXMuZmluZChmaWxlRXhpc3RzKTtcblxuICBpZiAoIW1hbmlmZXN0UGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlzdERpciA9IGlzQWJzb2x1dGUoZGlzdERpcilcbiAgICA/IGRpc3REaXJcbiAgICA6IGpvaW4ocHJvamVjdERpciwgZGlzdERpcik7XG4gIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gam9pbihcbiAgICByZXNvbHZlZERpc3REaXIsXG4gICAgJ2RpYWdub3N0aWNzJyxcbiAgICAnd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICk7XG4gIHJldHVybiB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY29weUZpbGUobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29weUZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IG1hcmtlciA9ICdfX3dvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcGllcyc7XG4gIGNvbnN0IGdsb2JhbFdpdGhNYXJrZXIgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFttYXJrZXJdPzogQXJyYXk8eyBwcm9qZWN0RGlyOiBzdHJpbmc7IGRpc3REaXI6IHN0cmluZyB9PjtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSkge1xuICAgIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSA9IFtdO1xuICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29weU1ldGFkYXRhIG9mIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSB8fCBbXSkge1xuICAgICAgICBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhjb3B5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdLnB1c2gobWV0YWRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFdvcmtmbG93KFxuICBuZXh0Q29uZmlnT3JGbjpcbiAgICB8IE5leHRDb25maWdcbiAgICB8ICgoXG4gICAgICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgICAgIGN0eDogeyBkZWZhdWx0Q29uZmlnOiBOZXh0Q29uZmlnIH1cbiAgICAgICkgPT4gUHJvbWlzZTxOZXh0Q29uZmlnPiksXG4gIHtcbiAgICB3b3JrZmxvd3MsXG4gIH06IHtcbiAgICB3b3JrZmxvd3M/OiB7XG4gICAgICBsYXp5RGlzY292ZXJ5PzogYm9vbGVhbjtcbiAgICAgIGxvY2FsPzoge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzXG4gICAgICAgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgZXNidWlsZCdzIGBzb3VyY2VtYXBgIG9wdGlvbjogYHRydWVgL2AnaW5saW5lJ2BcbiAgICAgICAqIChkZWZhdWx0KSwgYCdsaW5rZWQnYCwgYCdleHRlcm5hbCdgLCBgJ2JvdGgnYCwgb3IgYGZhbHNlYCB0byBvbWl0XG4gICAgICAgKiBzb3VyY2UgbWFwcy4gQ2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGBcbiAgICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgICAgICovXG4gICAgICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG4gICAgfTtcbiAgfSA9IHt9XG4pIHtcbiAgLy8gbGF6eURpc2NvdmVyeSBkZWZhdWx0cyB0byB0cnVlOyBwYXNzIGBsYXp5RGlzY292ZXJ5OiBmYWxzZWAgdG8gZm9yY2UgZWFnZXJcbiAgLy8gZGlzY292ZXJ5IChzY2FubmluZyB0aGUgcHJvamVjdCBhdCBzdGFydHVwKSBpbnN0ZWFkIG9mIGRlZmVycmluZyB3b3JrZmxvd1xuICAvLyBkaXNjb3ZlcnkgdW50aWwgZmlsZXMgYXJlIHJlcXVlc3RlZC4gVGhlIGBXT1JLRkxPV19ORVhUX0xBWllfRElTQ09WRVJZYFxuICAvLyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIG9wdGlvbi5cbiAgY29uc3QgbGF6eURpc2NvdmVyeU92ZXJyaWRlID0gcGFyc2VFbnZpcm9ubWVudEZsYWcoXG4gICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTkVYVF9MQVpZX0RJU0NPVkVSWVxuICApO1xuICBpZiAobGF6eURpc2NvdmVyeU92ZXJyaWRlID09PSB1bmRlZmluZWQpIHtcbiAgICBpZiAod29ya2Zsb3dzPy5sYXp5RGlzY292ZXJ5ID09PSBmYWxzZSkge1xuICAgICAgZGVsZXRlIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlkgPSAnMSc7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUlkgPSBsYXp5RGlzY292ZXJ5T3ZlcnJpZGVcbiAgICAgID8gJzEnXG4gICAgICA6ICcwJztcbiAgfVxuXG4gIGlmICghcHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQpIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCkge1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEID0gJ2xvY2FsJztcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0RBVEFfRElSID0gJy5uZXh0L3dvcmtmbG93LWRhdGEnO1xuICAgIH1cbiAgICBjb25zdCBtYXliZVBvcnQgPSB3b3JrZmxvd3M/LmxvY2FsPy5wb3J0O1xuICAgIGlmIChtYXliZVBvcnQpIHtcbiAgICAgIHByb2Nlc3MuZW52LlBPUlQgPSBtYXliZVBvcnQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQpIHtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCA9ICd2ZXJjZWwnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBidWlsZENvbmZpZyhcbiAgICBwaGFzZTogc3RyaW5nLFxuICAgIGN0eDogeyBkZWZhdWx0Q29uZmlnOiBOZXh0Q29uZmlnIH1cbiAgKSB7XG4gICAgY29uc3QgbG9hZGVyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9sb2FkZXInKTtcbiAgICBsZXQgcnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjazogKCgpID0+IFByb21pc2U8dm9pZD4pIHwgdW5kZWZpbmVkO1xuXG4gICAgbGV0IG5leHRDb25maWc6IE5leHRDb25maWc7XG5cbiAgICBpZiAodHlwZW9mIG5leHRDb25maWdPckZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBuZXh0Q29uZmlnID0gYXdhaXQgbmV4dENvbmZpZ09yRm4ocGhhc2UsIGN0eCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRDb25maWcgPSBuZXh0Q29uZmlnT3JGbjtcbiAgICB9XG4gICAgLy8gc2hhbGxvdyBjbG9uZSB0byBhdm9pZCByZWFkLW9ubHkgb24gdG9wLWxldmVsXG4gICAgbmV4dENvbmZpZyA9IE9iamVjdC5hc3NpZ24oe30sIG5leHRDb25maWcpO1xuICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAuLi4obmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzIHx8IFtdKSxcbiAgICAgICAgLy8gS2VlcCB0aGUgVmVyY2VsIHdvcmxkIGFuZCBpdHMgbmF0aXZlLXByb25lIGRlcGVuZGVuY2llcyBleHRlcm5hbCBzb1xuICAgICAgICAvLyBsb2NhbCBidWlsZHMgZG8gbm90IHRyeSB0byBwYXJzZSBAdmVyY2VsL3F1ZXVlJ3Mga2V5cmluZyBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHRyZWUuXG4gICAgICAgIC4uLlZFUkNFTF9XT1JMRF9TRVJWRVJfRVhURVJOQUxfUEFDS0FHRVMsXG4gICAgICBdKSxcbiAgICBdO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29tcGlsZXIgPSBuZXh0Q29uZmlnLmNvbXBpbGVyID8/IHt9O1xuICAgIGNvbnN0IGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZSA9IChcbiAgICAgIGV4aXN0aW5nQ29tcGlsZXIgYXMge1xuICAgICAgICBydW5BZnRlclByb2R1Y3Rpb25Db21waWxlPzogKG1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvamVjdERpcjogc3RyaW5nO1xuICAgICAgICAgIGRpc3REaXI6IHN0cmluZztcbiAgICAgICAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgIH1cbiAgICApLnJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU7XG5cbiAgICBjb25zdCBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IEFycmF5LmlzQXJyYXkoXG4gICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICApXG4gICAgICA/IG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlc1xuICAgICAgOiBbXTtcbiAgICBsZXQgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlczogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcykge1xuICAgICAgICBpZiAoUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTLmhhcyhwYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSBhd2FpdCBkZXRlY3RTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UoXG4gICAgICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLnB1c2goZGV0ZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQgb25seS4gTmV2ZXIgYmxvY2sgY29uZmlnIGdlbmVyYXRpb24uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IG5ldyBTZXQoXG4gICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLm1hcCgoZGV0ZWN0ZWQpID0+IGRldGVjdGVkLnBhY2thZ2VOYW1lKVxuICAgICAgICApO1xuICAgICAgICBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID1cbiAgICAgICAgICBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAocGFja2FnZU5hbWUpID0+ICFyZW1vdmVkUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKVxuICAgICAgICAgICk7XG4gICAgICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXM7XG4gICAgICAgIHdhcm5BYm91dEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyhkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGlmIHR1cmJvcGFjayBpcyBiZWluZyB1c2VkXG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjaykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMgPSB7fTtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmdSdWxlcyA9IG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzIGFzIGFueTtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IHJlc29sdmVOZXh0VmVyc2lvbihwcm9jZXNzLmN3ZCgpKTtcbiAgICBjb25zdCBzdXBwb3J0c1R1cmJvQ29uZGl0aW9uID0gc2VtdmVyLmd0ZShuZXh0VmVyc2lvbiwgJ3YxNi4wLjAnKTtcbiAgICBjb25zdCB1c2VEZWZlcnJlZEJ1aWxkZXIgPSBzaG91bGRVc2VEZWZlcnJlZEJ1aWxkZXIobmV4dFZlcnNpb24pO1xuXG4gICAgLy8gRGVmZXJyZWQgYnVpbGRlciBkaXNjb3ZlcnMgZmlsZXMgdmlhIGxvYWRlciBzb2NrZXQgbm90aWZpY2F0aW9ucywgc29cbiAgICAvLyB0dXJib3BhY2sgY29udGVudCBjb25kaXRpb25zIGFyZSBvbmx5IG5lZWRlZCB3aXRoIHRoZSBlYWdlciBidWlsZGVyLlxuICAgIGNvbnN0IHNob3VsZEFwcGx5VHVyYm9Db25kaXRpb24gPVxuICAgICAgc3VwcG9ydHNUdXJib0NvbmRpdGlvbiAmJiAhdXNlRGVmZXJyZWRCdWlsZGVyO1xuICAgIGNvbnN0IHNob3VsZFdhdGNoID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gICAgbGV0IHdvcmtmbG93QnVpbGRlclByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkaXN0RGlyID0gbmV4dENvbmZpZy5kaXN0RGlyIHx8ICcubmV4dCc7XG5cbiAgICBuZXh0Q29uZmlnLmNvbXBpbGVyID0ge1xuICAgICAgLi4uZXhpc3RpbmdDb21waWxlcixcbiAgICAgIHJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU6IGFzeW5jIChtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKSB7XG4gICAgICAgICAgYXdhaXQgZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0KG1ldGFkYXRhKTtcbiAgICAgICAgcmVnaXN0ZXJXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3B5KG1ldGFkYXRhKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGdldFdvcmtmbG93QnVpbGRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSkge1xuICAgICAgICB3b3JrZmxvd0J1aWxkZXJQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBOZXh0QnVpbGRlciA9IGF3YWl0IGdldE5leHRCdWlsZGVyKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3IE5leHRCdWlsZGVyKHtcbiAgICAgICAgICAgIHdhdGNoOiBzaG91bGRXYXRjaCxcbiAgICAgICAgICAgIC8vIGRpc2NvdmVyIHdvcmtmbG93cyBmcm9tIHBhZ2VzL2FwcCBlbnRyaWVzXG4gICAgICAgICAgICBkaXJzOiBbJ3BhZ2VzJywgJ2FwcCcsICdzcmMvcGFnZXMnLCAnc3JjL2FwcCddLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IG5leHRDb25maWcub3V0cHV0RmlsZVRyYWNpbmdSb290LFxuICAgICAgICAgICAgd29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIGRpc3REaXIsXG4gICAgICAgICAgICBkaWFnbm9zdGljc0RpcjogYCR7ZGlzdERpcn0vZGlhZ25vc3RpY3NgLFxuICAgICAgICAgICAgYnVpbGRUYXJnZXQ6ICduZXh0JyxcbiAgICAgICAgICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzdGVwc0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICB3ZWJob29rQnVuZGxlUGF0aDogJycsIC8vIG5vZGUgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzb3VyY2VtYXA6IHdvcmtmbG93cz8uc291cmNlbWFwLFxuICAgICAgICAgICAgc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVMb2dzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZVdvcmtmbG93c0J1bmRsZVdhcm5pbmdzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZVdlYmhvb2tCdW5kbGVMb2dzOiB1c2VEZWZlcnJlZEJ1aWxkZXIsXG4gICAgICAgICAgICBzdXBwcmVzc0NyZWF0ZU1hbmlmZXN0TG9nczogdXNlRGVmZXJyZWRCdWlsZGVyLFxuICAgICAgICAgICAgZXh0ZXJuYWxQYWNrYWdlczogW1xuICAgICAgICAgICAgICAvLyBzZXJ2ZXItb25seSBhbmQgY2xpZW50LW9ubHkgYXJlIHBzZXVkby1wYWNrYWdlcyBoYW5kbGVkIGJ5IE5leHQuanNcbiAgICAgICAgICAgICAgLy8gZHVyaW5nIGl0cyBidWlsZCBwcm9jZXNzLiBXZSBtYXJrIHRoZW0gYXMgZXh0ZXJuYWwgdG8gcHJldmVudCBlc2J1aWxkXG4gICAgICAgICAgICAgIC8vIGZyb20gZmFpbGluZyB3aGVuIGJ1bmRsaW5nIGNvZGUgdGhhdCBpbXBvcnRzIHRoZW0uXG4gICAgICAgICAgICAgIC8vIFNlZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2dldHRpbmctc3RhcnRlZC9zZXJ2ZXItYW5kLWNsaWVudC1jb21wb25lbnRzXG4gICAgICAgICAgICAgICdzZXJ2ZXItb25seScsXG4gICAgICAgICAgICAgICdjbGllbnQtb25seScsXG4gICAgICAgICAgICAgIC4uLmVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd29ya2Zsb3dCdWlsZGVyUHJvbWlzZTtcbiAgICB9O1xuXG4gICAgaWYgKHVzZURlZmVycmVkQnVpbGRlcikge1xuICAgICAgcnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjayA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dCdWlsZGVyID0gYXdhaXQgZ2V0V29ya2Zsb3dCdWlsZGVyKCk7XG4gICAgICAgIGlmICh0eXBlb2Ygd29ya2Zsb3dCdWlsZGVyLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dCdWlsZGVyLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nRXhwZXJpbWVudGFsID0gKG5leHRDb25maWcuZXhwZXJpbWVudGFsID8/IHt9KSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgYW55XG4gICAgICA+O1xuICAgICAgY29uc3QgZXhpc3RpbmdEZWZlcnJlZEVudHJpZXMgPSBBcnJheS5pc0FycmF5KFxuICAgICAgICBleGlzdGluZ0V4cGVyaW1lbnRhbC5kZWZlcnJlZEVudHJpZXNcbiAgICAgIClcbiAgICAgICAgPyBleGlzdGluZ0V4cGVyaW1lbnRhbC5kZWZlcnJlZEVudHJpZXNcbiAgICAgICAgOiBbXTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMgPVxuICAgICAgICB0eXBlb2YgZXhpc3RpbmdFeHBlcmltZW50YWwub25CZWZvcmVEZWZlcnJlZEVudHJpZXMgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGV4aXN0aW5nRXhwZXJpbWVudGFsLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIG5leHRDb25maWcuZXhwZXJpbWVudGFsID0ge1xuICAgICAgICAuLi5leGlzdGluZ0V4cGVyaW1lbnRhbCxcblxuICAgICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vVHNJZ25vcmU6IGV4cGVjdC1lcnJvciBpcyB3cm9uZyBhcyBpdCB3aWxsIHdvcmsgb24gdmFsaWQgdmVyc2lvblxuICAgICAgICAvLyBAdHMtaWdub3JlIHRoaXMgaXMgb25seSBhdmFpbGFibGUgaW4gY2FuYXJ5IE5leHQuanNcbiAgICAgICAgZGVmZXJyZWRFbnRyaWVzOiBbXG4gICAgICAgICAgLi4ubmV3IFNldChbXG4gICAgICAgICAgICAuLi5leGlzdGluZ0RlZmVycmVkRW50cmllcyxcbiAgICAgICAgICAgIC4uLldPUktGTE9XX0RFRkVSUkVEX0VOVFJJRVMsXG4gICAgICAgICAgXSksXG4gICAgICAgIF0sXG4gICAgICAgIG9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzOiBhc3luYyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgaWYgKGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMpIHtcbiAgICAgICAgICAgIGF3YWl0IGV4aXN0aW5nT25CZWZvcmVEZWZlcnJlZEVudHJpZXMoLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChydW5EZWZlcnJlZEJ1aWxkRnJvbUNhbGxiYWNrKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5EZWZlcnJlZEJ1aWxkRnJvbUNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbXG4gICAgICAnKi50c3gnLFxuICAgICAgJyoudHMnLFxuICAgICAgJyouanN4JyxcbiAgICAgICcqLmpzJyxcbiAgICAgICcqLm1qcycsXG4gICAgICAnKi5tdHMnLFxuICAgICAgJyouY2pzJyxcbiAgICAgICcqLmN0cycsXG4gICAgXSkge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXNba2V5XSA9IHtcbiAgICAgICAgLi4uKHNob3VsZEFwcGx5VHVyYm9Db25kaXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlICdhbGwnIHRvIGNvbWJpbmU6IG11c3QgbWF0Y2ggY29udGVudCBBTkQgbXVzdCBOT1QgYmUgaW4gZ2VuZXJhdGVkIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBNZXJnZSB3aXRoIGFueSBleGlzdGluZyAnYWxsJyBjb25kaXRpb25zIGZyb20gdXNlciBjb25maWdcbiAgICAgICAgICAgICAgICBhbGw6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ1J1bGVzW2tleV0/LmNvbmRpdGlvbj8uYWxsIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzIGZyb20gdHJhbnNmb3JtYXRpb25cbiAgICAgICAgICAgICAgICAgIHsgbm90OiB7IHBhdGg6IC9bL1xcXFxdXFwud2VsbC1rbm93blsvXFxcXF13b3JrZmxvd1svXFxcXF0vIH0gfSxcbiAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIGZpbGVzIHdpdGggd29ya2Zsb3cgZGlyZWN0aXZlcyBvciBjdXN0b20gc2VyaWFsaXphdGlvbiBwYXR0ZXJuc1xuICAgICAgICAgICAgICAgICAgLy8gVXNlcyBiYWNrcmVmZXJlbmNlcyAoXFwyLCBcXDMpIHRvIGVuc3VyZSBtYXRjaGluZyBxdW90ZSB0eXBlc1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OlxuICAgICAgICAgICAgICAgICAgICAgIC8odXNlIHdvcmtmbG93fHVzZSBzdGVwfGZyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwyfFN5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDNcXHMqXFwpKS8sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGxvYWRlcnM6IFsuLi4oZXhpc3RpbmdSdWxlc1trZXldPy5sb2FkZXJzIHx8IFtdKSwgbG9hZGVyUGF0aF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGZvciB3ZWJwYWNrXG4gICAgY29uc3QgZXhpc3RpbmdXZWJwYWNrTW9kaWZ5ID0gbmV4dENvbmZpZy53ZWJwYWNrO1xuICAgIG5leHRDb25maWcud2VicGFjayA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBjb25zdCBbd2VicGFja0NvbmZpZ10gPSBhcmdzO1xuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZSkge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZSA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcykge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcyA9IFtdO1xuICAgICAgfVxuICAgICAgLy8gbG9hZGVycyBpbiB3ZWJwYWNrIGFwcGx5IGJvdHRvbS0+dXAgc28gZW5zdXJlXG4gICAgICAvLyBvdXJzIGNvbWVzIGJlZm9yZSB0aGUgZGVmYXVsdCBzd2MgdHJhbnNmb3JtXG4gICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcy5wdXNoKHtcbiAgICAgICAgdGVzdDogLy4qXFwuKG1qc3xjanN8Y3RzfHRzfHRzeHxqc3xqc3gpJC8sXG4gICAgICAgIGxvYWRlcjogbG9hZGVyUGF0aCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZXhpc3RpbmdXZWJwYWNrTW9kaWZ5XG4gICAgICAgID8gKGV4aXN0aW5nV2VicGFja01vZGlmeSguLi5hcmdzKSA/PyB3ZWJwYWNrQ29uZmlnKVxuICAgICAgICA6IHdlYnBhY2tDb25maWc7XG4gICAgfTtcbiAgICAvLyBvbmx5IHJ1biB0aGlzIGluIHRoZSBtYWluIHByb2Nlc3Mgc28gaXQgb25seSBydW5zIG9uY2VcbiAgICAvLyBhcyBOZXh0LmpzIHVzZXMgY2hpbGQgcHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgYnVpbGRzXG4gICAgaWYgKFxuICAgICAgIXByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCAmJlxuICAgICAgcGhhc2UgIT09ICdwaGFzZS1wcm9kdWN0aW9uLXNlcnZlcidcbiAgICApIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93QnVpbGRlciA9IGF3YWl0IGdldFdvcmtmbG93QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCB3b3JrZmxvd0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCA9ICcxJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AA2mBA,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CA6KjC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAooBA,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CA+IjC"}