@workflow/builders 5.0.0-beta.20 → 5.0.0-beta.22

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.
@@ -0,0 +1,665 @@
1
+ import { access, readFile } from 'node:fs/promises';
2
+ import { builtinModules, createRequire } from 'node:module';
3
+ import { dirname, extname, isAbsolute, join, resolve } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ import enhancedResolveOriginal from 'enhanced-resolve';
6
+ import { findUp } from 'find-up';
7
+ import JSON5 from 'json5';
8
+ import { importParents } from './discover-entries-esbuild-plugin.js';
9
+ import { detectWorkflowPatterns } from './transform-utils.js';
10
+ const FAST_DISCOVERY_SOURCE_EXTENSIONS = [
11
+ '.ts',
12
+ '.tsx',
13
+ '.mts',
14
+ '.cts',
15
+ '.js',
16
+ '.jsx',
17
+ '.mjs',
18
+ '.cjs',
19
+ ];
20
+ const FAST_DISCOVERY_SOURCE_EXTENSION_SET = new Set(FAST_DISCOVERY_SOURCE_EXTENSIONS);
21
+ const fastDiscoveryResolve = promisify(enhancedResolveOriginal.create({
22
+ extensions: [...FAST_DISCOVERY_SOURCE_EXTENSIONS, '.json', '.node'],
23
+ fullySpecified: false,
24
+ conditionNames: ['node', 'import', 'require'],
25
+ }));
26
+ const require = createRequire(import.meta.url);
27
+ const FAST_DISCOVERY_READ_CONCURRENCY = 32;
28
+ const FAST_DISCOVERY_RESOLVE_CONCURRENCY = 32;
29
+ const FAST_DISCOVERY_FILE_CONCURRENCY = 128;
30
+ const PACKAGE_JSON = 'package.json';
31
+ const NODE_BUILTIN_SPECIFIERS = new Set([
32
+ ...builtinModules,
33
+ ...builtinModules.map((moduleName) => `node:${moduleName}`),
34
+ ]);
35
+ const IMPORT_SPECIFIER_PATTERNS = [
36
+ /\bfrom\s+['"]([^'"]+)['"]/g,
37
+ /(?:^|[;\n])\s*import\s+['"]([^'"]+)['"]/g,
38
+ /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
39
+ /\brequire\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
40
+ ];
41
+ function createLimiter(concurrency) {
42
+ let activeCount = 0;
43
+ const queue = [];
44
+ const acquire = async () => {
45
+ await new Promise((resolve) => {
46
+ const run = () => {
47
+ activeCount++;
48
+ resolve();
49
+ };
50
+ if (activeCount < concurrency) {
51
+ run();
52
+ }
53
+ else {
54
+ queue.push(run);
55
+ }
56
+ });
57
+ };
58
+ const release = () => {
59
+ activeCount--;
60
+ const next = queue.shift();
61
+ if (next) {
62
+ next();
63
+ }
64
+ };
65
+ return async function limit(fn) {
66
+ await acquire();
67
+ try {
68
+ return await fn();
69
+ }
70
+ finally {
71
+ release();
72
+ }
73
+ };
74
+ }
75
+ function normalizePath(filePath) {
76
+ return filePath.replace(/\\/g, '/');
77
+ }
78
+ function isJsTsFile(filePath) {
79
+ return FAST_DISCOVERY_SOURCE_EXTENSION_SET.has(extname(filePath));
80
+ }
81
+ function isRelativeOrAbsoluteSpecifier(specifier) {
82
+ return specifier.startsWith('.') || isAbsolute(specifier);
83
+ }
84
+ function getPackageNameFromSpecifier(specifier) {
85
+ const strippedSpecifier = stripImportSpecifierQuery(specifier);
86
+ if (isRelativeOrAbsoluteSpecifier(strippedSpecifier)) {
87
+ return null;
88
+ }
89
+ if (strippedSpecifier.startsWith('@')) {
90
+ const [scope, name] = strippedSpecifier.split('/');
91
+ return scope && name ? `${scope}/${name}` : null;
92
+ }
93
+ return strippedSpecifier.split('/')[0] || null;
94
+ }
95
+ function stripImportSpecifierQuery(specifier) {
96
+ const queryIndex = specifier.indexOf('?');
97
+ const hashIndex = specifier.indexOf('#');
98
+ const endIndex = queryIndex === -1
99
+ ? hashIndex
100
+ : hashIndex === -1
101
+ ? queryIndex
102
+ : Math.min(queryIndex, hashIndex);
103
+ return endIndex === -1 ? specifier : specifier.slice(0, endIndex);
104
+ }
105
+ function shouldSkipFastDiscoveryImport(specifier) {
106
+ if (NODE_BUILTIN_SPECIFIERS.has(specifier)) {
107
+ return true;
108
+ }
109
+ const pathLikeSpecifier = stripImportSpecifierQuery(specifier);
110
+ if (!pathLikeSpecifier.startsWith('.') &&
111
+ !isAbsolute(pathLikeSpecifier) &&
112
+ !pathLikeSpecifier.includes('/')) {
113
+ return false;
114
+ }
115
+ const extension = extname(pathLikeSpecifier);
116
+ return (extension !== '' && !FAST_DISCOVERY_SOURCE_EXTENSION_SET.has(extension));
117
+ }
118
+ function matchTsconfigPathAlias(specifier, alias) {
119
+ if (alias.patternParts.length === 1) {
120
+ return specifier === alias.pattern ? [] : null;
121
+ }
122
+ const captures = [];
123
+ let position = 0;
124
+ const firstPart = alias.patternParts[0];
125
+ if (!specifier.startsWith(firstPart)) {
126
+ return null;
127
+ }
128
+ position = firstPart.length;
129
+ for (let i = 1; i < alias.patternParts.length; i++) {
130
+ const part = alias.patternParts[i];
131
+ if (i === alias.patternParts.length - 1) {
132
+ if (!specifier.endsWith(part)) {
133
+ return null;
134
+ }
135
+ captures.push(specifier.slice(position, specifier.length - part.length));
136
+ return captures;
137
+ }
138
+ const nextIndex = specifier.indexOf(part, position);
139
+ if (nextIndex === -1) {
140
+ return null;
141
+ }
142
+ captures.push(specifier.slice(position, nextIndex));
143
+ position = nextIndex + part.length;
144
+ }
145
+ return captures;
146
+ }
147
+ function applyTsconfigPathTarget(target, captures) {
148
+ if (target.parts.length === 1) {
149
+ return target.template;
150
+ }
151
+ let resolved = target.parts[0];
152
+ for (let i = 1; i < target.parts.length; i++) {
153
+ resolved += (captures[i - 1] ?? '') + target.parts[i];
154
+ }
155
+ return resolved;
156
+ }
157
+ function isGeneratedBuildArtifactPath(filePath) {
158
+ const normalizedPath = normalizePath(filePath);
159
+ return (normalizedPath.includes('/.nitro/') ||
160
+ normalizedPath.includes('/.output/') ||
161
+ normalizedPath.includes('/.next/') ||
162
+ normalizedPath.includes('/.nuxt/') ||
163
+ normalizedPath.includes('/.svelte-kit/') ||
164
+ normalizedPath.includes('/.vercel/') ||
165
+ normalizedPath.includes('/.well-known/workflow/'));
166
+ }
167
+ function isNodeModulesPath(filePath) {
168
+ const normalizedPath = normalizePath(filePath);
169
+ return (normalizedPath.includes('/node_modules/') ||
170
+ normalizedPath.includes('/.pnpm/'));
171
+ }
172
+ function addImportParent(parent, child) {
173
+ const normalizedParent = normalizePath(parent);
174
+ const normalizedChild = normalizePath(child);
175
+ let children = importParents.get(normalizedParent);
176
+ if (!children) {
177
+ children = new Set();
178
+ importParents.set(normalizedParent, children);
179
+ }
180
+ children.add(normalizedChild);
181
+ }
182
+ function extractImportSpecifiers(source) {
183
+ if (!source.includes('import') &&
184
+ !source.includes('require') &&
185
+ !source.includes('from')) {
186
+ return [];
187
+ }
188
+ const specifiers = new Set();
189
+ for (const importPattern of IMPORT_SPECIFIER_PATTERNS) {
190
+ for (const match of source.matchAll(importPattern)) {
191
+ const specifier = match[1];
192
+ if (specifier) {
193
+ specifiers.add(specifier);
194
+ }
195
+ }
196
+ }
197
+ return Array.from(specifiers);
198
+ }
199
+ function hasWorkflowDependency(dependencies) {
200
+ if (typeof dependencies !== 'object' ||
201
+ dependencies === null ||
202
+ Array.isArray(dependencies)) {
203
+ return false;
204
+ }
205
+ return Object.keys(dependencies).some((dependency) => dependency === 'workflow' || dependency.startsWith('@workflow/'));
206
+ }
207
+ function stripComments(source) {
208
+ return source
209
+ .replace(/\/\*[\s\S]*?\*\//g, '')
210
+ .replace(/(^|[^:])\/\/.*$/gm, '$1');
211
+ }
212
+ function hasLikelySerdeClass(source) {
213
+ if (!source.includes('static') || !source.includes('[')) {
214
+ return false;
215
+ }
216
+ const uncommentedSource = stripComments(source);
217
+ if (/static\s+\[\s*(?:WORKFLOW_(?:SERIALIZE|DESERIALIZE)|Symbol\.for\s*\(\s*['"]workflow-(?:serialize|deserialize)['"]\s*\))\s*\]\s*\(/.test(uncommentedSource)) {
218
+ return true;
219
+ }
220
+ if (!/from\s+['"]@workflow\/serde['"]|require\s*\(\s*['"]@workflow\/serde['"]\s*\)/.test(uncommentedSource)) {
221
+ return false;
222
+ }
223
+ return /static\s+\[\s*[$A-Z_a-z][$\w]*\s*\]\s*\(/.test(uncommentedSource);
224
+ }
225
+ async function loadTsconfigPathAliases(tsconfigPath, seen = new Set()) {
226
+ if (!tsconfigPath) {
227
+ return [];
228
+ }
229
+ return (await loadTsconfigPathAliasConfig(tsconfigPath, seen)).aliases;
230
+ }
231
+ async function loadTsconfigPathAliasConfig(tsconfigPath, seen) {
232
+ const normalizedTsconfigPath = resolve(tsconfigPath);
233
+ if (seen.has(normalizedTsconfigPath)) {
234
+ return { aliases: [], baseUrl: undefined };
235
+ }
236
+ seen.add(normalizedTsconfigPath);
237
+ try {
238
+ const source = await readFile(normalizedTsconfigPath, 'utf8');
239
+ const parsed = JSON5.parse(source);
240
+ const compilerOptions = parsed.compilerOptions;
241
+ let baseConfig = {
242
+ aliases: [],
243
+ baseUrl: undefined,
244
+ };
245
+ if (typeof parsed.extends === 'string') {
246
+ const baseTsconfigPath = await resolveTsconfigExtendsPath(parsed.extends, normalizedTsconfigPath);
247
+ if (baseTsconfigPath) {
248
+ baseConfig = await loadTsconfigPathAliasConfig(baseTsconfigPath, seen);
249
+ }
250
+ }
251
+ const baseUrl = typeof compilerOptions?.baseUrl === 'string'
252
+ ? resolve(dirname(normalizedTsconfigPath), compilerOptions.baseUrl)
253
+ : baseConfig.baseUrl;
254
+ if (!compilerOptions ||
255
+ typeof compilerOptions.paths !== 'object' ||
256
+ compilerOptions.paths === null ||
257
+ Array.isArray(compilerOptions.paths)) {
258
+ return {
259
+ aliases: baseConfig.aliases,
260
+ baseUrl,
261
+ };
262
+ }
263
+ const baseDir = baseUrl ?? dirname(normalizedTsconfigPath);
264
+ const aliases = [];
265
+ for (const [pattern, rawTargets] of Object.entries(compilerOptions.paths)) {
266
+ if (!Array.isArray(rawTargets)) {
267
+ continue;
268
+ }
269
+ const targets = rawTargets
270
+ .filter((target) => typeof target === 'string')
271
+ .map((target) => {
272
+ const template = resolve(baseDir, target);
273
+ return {
274
+ template,
275
+ parts: template.split('*'),
276
+ };
277
+ });
278
+ if (targets.length === 0) {
279
+ continue;
280
+ }
281
+ aliases.push({
282
+ pattern,
283
+ patternParts: pattern.split('*'),
284
+ targets,
285
+ });
286
+ }
287
+ return { aliases, baseUrl };
288
+ }
289
+ catch {
290
+ return { aliases: [], baseUrl: undefined };
291
+ }
292
+ finally {
293
+ seen.delete(normalizedTsconfigPath);
294
+ }
295
+ }
296
+ async function resolveTsconfigExtendsPath(extendsValue, tsconfigPath) {
297
+ const configDir = dirname(tsconfigPath);
298
+ if (extendsValue.startsWith('.') || isAbsolute(extendsValue)) {
299
+ const resolved = isAbsolute(extendsValue)
300
+ ? extendsValue
301
+ : resolve(configDir, extendsValue);
302
+ return findExistingTsconfigPath(resolved);
303
+ }
304
+ try {
305
+ return require.resolve(extendsValue, { paths: [configDir] });
306
+ }
307
+ catch { }
308
+ try {
309
+ return require.resolve(`${extendsValue}/tsconfig.json`, {
310
+ paths: [configDir],
311
+ });
312
+ }
313
+ catch {
314
+ return undefined;
315
+ }
316
+ }
317
+ async function findExistingTsconfigPath(candidatePath) {
318
+ const candidates = extname(candidatePath) === ''
319
+ ? [
320
+ `${candidatePath}.json`,
321
+ join(candidatePath, 'tsconfig.json'),
322
+ candidatePath,
323
+ ]
324
+ : [candidatePath];
325
+ for (const candidate of candidates) {
326
+ try {
327
+ await access(candidate);
328
+ return candidate;
329
+ }
330
+ catch { }
331
+ }
332
+ return undefined;
333
+ }
334
+ async function findPackageInfo(filePath, packageInfoCache) {
335
+ let currentDir = dirname(filePath);
336
+ while (currentDir && currentDir !== dirname(currentDir)) {
337
+ const cached = packageInfoCache.get(currentDir);
338
+ if (cached) {
339
+ const cachedInfo = await cached;
340
+ if (cachedInfo) {
341
+ return cachedInfo;
342
+ }
343
+ currentDir = dirname(currentDir);
344
+ continue;
345
+ }
346
+ const packageJsonPath = join(currentDir, PACKAGE_JSON);
347
+ const packageInfoPromise = readFile(packageJsonPath, 'utf8')
348
+ .then((source) => {
349
+ const parsed = JSON.parse(source);
350
+ const packageName = typeof parsed.name === 'string' ? parsed.name : '';
351
+ return {
352
+ root: normalizePath(currentDir),
353
+ hasWorkflowDependency: packageName === 'workflow' ||
354
+ packageName.startsWith('@workflow/') ||
355
+ hasWorkflowDependency(parsed.dependencies) ||
356
+ hasWorkflowDependency(parsed.peerDependencies) ||
357
+ hasWorkflowDependency(parsed.optionalDependencies) ||
358
+ hasWorkflowDependency(parsed.devDependencies),
359
+ };
360
+ })
361
+ .catch(() => null);
362
+ packageInfoCache.set(currentDir, packageInfoPromise);
363
+ const packageInfo = await packageInfoPromise;
364
+ if (packageInfo) {
365
+ return packageInfo;
366
+ }
367
+ currentDir = dirname(currentDir);
368
+ }
369
+ return null;
370
+ }
371
+ export async function fastDiscoverEntries({ entryPoints, state, defaultTsconfigPath, workingDir, }) {
372
+ const readLimit = createLimiter(FAST_DISCOVERY_READ_CONCURRENCY);
373
+ const resolveLimit = createLimiter(FAST_DISCOVERY_RESOLVE_CONCURRENCY);
374
+ const resolveCache = new Map();
375
+ const fileExistsCache = new Map();
376
+ const tsconfigPathByDirCache = new Map();
377
+ const tsconfigAliasesCache = new Map();
378
+ const packageInfoCache = new Map();
379
+ const packageSpecifierInfoCache = new Map();
380
+ const queuedFiles = new Set();
381
+ const processedFiles = new Set();
382
+ const queue = [];
383
+ const enqueueFile = (filePath) => {
384
+ if (!filePath)
385
+ return;
386
+ const normalizedPath = normalizePath(filePath);
387
+ if (queuedFiles.has(normalizedPath) ||
388
+ processedFiles.has(normalizedPath) ||
389
+ !isJsTsFile(normalizedPath) ||
390
+ isGeneratedBuildArtifactPath(normalizedPath)) {
391
+ return;
392
+ }
393
+ queuedFiles.add(normalizedPath);
394
+ queue.push(normalizedPath);
395
+ };
396
+ const readSource = async (filePath) => {
397
+ return await readLimit(async () => {
398
+ try {
399
+ return await readFile(filePath, 'utf8');
400
+ }
401
+ catch {
402
+ return null;
403
+ }
404
+ });
405
+ };
406
+ const fileExists = (filePath) => {
407
+ const cached = fileExistsCache.get(filePath);
408
+ if (cached) {
409
+ return cached;
410
+ }
411
+ const promise = readLimit(async () => {
412
+ try {
413
+ await access(filePath);
414
+ return true;
415
+ }
416
+ catch {
417
+ return false;
418
+ }
419
+ });
420
+ fileExistsCache.set(filePath, promise);
421
+ return promise;
422
+ };
423
+ const findTsconfigPathForImporter = (importer) => {
424
+ if (isNodeModulesPath(importer)) {
425
+ return Promise.resolve(defaultTsconfigPath);
426
+ }
427
+ const importerDir = dirname(importer);
428
+ const cached = tsconfigPathByDirCache.get(importerDir);
429
+ if (cached) {
430
+ return cached;
431
+ }
432
+ const promise = findUp(['tsconfig.json', 'jsconfig.json'], {
433
+ cwd: importerDir,
434
+ }).then((found) => found ?? defaultTsconfigPath);
435
+ tsconfigPathByDirCache.set(importerDir, promise);
436
+ return promise;
437
+ };
438
+ const loadAliasesForTsconfig = (configPath) => {
439
+ if (!configPath) {
440
+ return Promise.resolve([]);
441
+ }
442
+ const cached = tsconfigAliasesCache.get(configPath);
443
+ if (cached) {
444
+ return cached;
445
+ }
446
+ const promise = loadTsconfigPathAliases(configPath);
447
+ tsconfigAliasesCache.set(configPath, promise);
448
+ return promise;
449
+ };
450
+ const resolvePathLikeSpecifier = async (importer, specifier) => {
451
+ const strippedSpecifier = stripImportSpecifierQuery(specifier);
452
+ const basePath = isAbsolute(strippedSpecifier)
453
+ ? strippedSpecifier
454
+ : resolve(dirname(importer), strippedSpecifier);
455
+ const extension = extname(basePath);
456
+ if (extension !== '') {
457
+ return FAST_DISCOVERY_SOURCE_EXTENSION_SET.has(extension) &&
458
+ (await fileExists(basePath))
459
+ ? normalizePath(basePath)
460
+ : null;
461
+ }
462
+ for (const candidate of [
463
+ ...FAST_DISCOVERY_SOURCE_EXTENSIONS.map((candidateExtension) => `${basePath}${candidateExtension}`),
464
+ ...FAST_DISCOVERY_SOURCE_EXTENSIONS.map((candidateExtension) => join(basePath, `index${candidateExtension}`)),
465
+ ]) {
466
+ if (await fileExists(candidate)) {
467
+ return normalizePath(candidate);
468
+ }
469
+ }
470
+ return null;
471
+ };
472
+ const resolveWithTsconfigPaths = async (importer, specifier) => {
473
+ if (specifier.startsWith('.') || isAbsolute(specifier)) {
474
+ return null;
475
+ }
476
+ const tsconfigPath = await findTsconfigPathForImporter(importer);
477
+ const tsconfigPathAliases = await loadAliasesForTsconfig(tsconfigPath);
478
+ if (tsconfigPathAliases.length === 0) {
479
+ return null;
480
+ }
481
+ for (const alias of tsconfigPathAliases) {
482
+ const captures = matchTsconfigPathAlias(specifier, alias);
483
+ if (!captures) {
484
+ continue;
485
+ }
486
+ for (const target of alias.targets) {
487
+ const targetPath = applyTsconfigPathTarget(target, captures);
488
+ try {
489
+ const resolved = await resolvePathLikeSpecifier(importer, targetPath);
490
+ if (resolved) {
491
+ return resolved;
492
+ }
493
+ }
494
+ catch { }
495
+ }
496
+ }
497
+ return null;
498
+ };
499
+ const findPackageInfoBySpecifier = (packageName) => {
500
+ const cached = packageSpecifierInfoCache.get(packageName);
501
+ if (cached) {
502
+ return cached;
503
+ }
504
+ const packageInfoPromise = (async () => {
505
+ let packageJsonPath;
506
+ try {
507
+ packageJsonPath = require.resolve(`${packageName}/package.json`, {
508
+ paths: [workingDir],
509
+ });
510
+ }
511
+ catch {
512
+ return null;
513
+ }
514
+ try {
515
+ const source = await readLimit(() => readFile(packageJsonPath, 'utf8'));
516
+ const parsed = JSON.parse(source);
517
+ const parsedPackageName = typeof parsed.name === 'string' ? parsed.name : packageName;
518
+ return {
519
+ root: normalizePath(dirname(packageJsonPath)),
520
+ hasWorkflowDependency: parsedPackageName === 'workflow' ||
521
+ parsedPackageName.startsWith('@workflow/') ||
522
+ hasWorkflowDependency(parsed.dependencies) ||
523
+ hasWorkflowDependency(parsed.peerDependencies) ||
524
+ hasWorkflowDependency(parsed.optionalDependencies) ||
525
+ hasWorkflowDependency(parsed.devDependencies),
526
+ };
527
+ }
528
+ catch {
529
+ return null;
530
+ }
531
+ })();
532
+ packageSpecifierInfoCache.set(packageName, packageInfoPromise);
533
+ return packageInfoPromise;
534
+ };
535
+ const shouldResolveBareSpecifier = async (specifier) => {
536
+ const packageName = getPackageNameFromSpecifier(specifier);
537
+ if (!packageName) {
538
+ return true;
539
+ }
540
+ if (packageName === 'workflow' || packageName.startsWith('@workflow/')) {
541
+ return true;
542
+ }
543
+ const packageInfo = await findPackageInfoBySpecifier(packageName);
544
+ if (!packageInfo) {
545
+ return true;
546
+ }
547
+ if (packageInfo.hasWorkflowDependency) {
548
+ return true;
549
+ }
550
+ return false;
551
+ };
552
+ const resolveImport = (importer, specifier) => {
553
+ const cacheKey = `${dirname(importer)}\0${specifier}`;
554
+ const cached = resolveCache.get(cacheKey);
555
+ if (cached) {
556
+ return cached;
557
+ }
558
+ const resolvedPromise = resolveLimit(async () => {
559
+ if (isRelativeOrAbsoluteSpecifier(specifier)) {
560
+ return resolvePathLikeSpecifier(importer, specifier);
561
+ }
562
+ const resolvedAlias = await resolveWithTsconfigPaths(importer, specifier);
563
+ if (resolvedAlias) {
564
+ return resolvedAlias;
565
+ }
566
+ if (!(await shouldResolveBareSpecifier(specifier))) {
567
+ return null;
568
+ }
569
+ try {
570
+ const resolved = await fastDiscoveryResolve(dirname(importer), specifier);
571
+ return typeof resolved === 'string' ? normalizePath(resolved) : null;
572
+ }
573
+ catch {
574
+ return null;
575
+ }
576
+ });
577
+ resolveCache.set(cacheKey, resolvedPromise);
578
+ return resolvedPromise;
579
+ };
580
+ const shouldFollowImportsFromFile = async (importer, forceFollow) => {
581
+ if (forceFollow) {
582
+ return true;
583
+ }
584
+ if (!isNodeModulesPath(importer)) {
585
+ return true;
586
+ }
587
+ const packageInfo = await findPackageInfo(importer, packageInfoCache);
588
+ return packageInfo?.hasWorkflowDependency === true;
589
+ };
590
+ const processImportSpecifier = async (filePath, specifier, forceFollowImports) => {
591
+ if (shouldSkipFastDiscoveryImport(specifier)) {
592
+ return;
593
+ }
594
+ if (!(await shouldFollowImportsFromFile(filePath, forceFollowImports))) {
595
+ return;
596
+ }
597
+ const resolved = await resolveImport(filePath, specifier);
598
+ if (!resolved) {
599
+ return;
600
+ }
601
+ addImportParent(filePath, resolved);
602
+ if (!isJsTsFile(resolved) || isGeneratedBuildArtifactPath(resolved)) {
603
+ return;
604
+ }
605
+ if (specifier.startsWith('.')) {
606
+ enqueueFile(resolved);
607
+ return;
608
+ }
609
+ enqueueFile(resolved);
610
+ };
611
+ const processFile = async (filePath) => {
612
+ queuedFiles.delete(filePath);
613
+ if (processedFiles.has(filePath)) {
614
+ return;
615
+ }
616
+ processedFiles.add(filePath);
617
+ const source = await readSource(filePath);
618
+ if (source === null) {
619
+ return;
620
+ }
621
+ const patterns = detectWorkflowPatterns(source);
622
+ if (patterns.hasUseWorkflow) {
623
+ state.discoveredWorkflows.add(filePath);
624
+ }
625
+ if (patterns.hasUseStep) {
626
+ state.discoveredSteps.add(filePath);
627
+ }
628
+ if (patterns.hasSerde && hasLikelySerdeClass(source)) {
629
+ state.discoveredSerdeFiles.add(filePath);
630
+ }
631
+ const forceFollowImports = patterns.hasDirective || patterns.hasSerde;
632
+ if (!forceFollowImports &&
633
+ !(await shouldFollowImportsFromFile(filePath, false))) {
634
+ return;
635
+ }
636
+ const specifiers = extractImportSpecifiers(source);
637
+ if (specifiers.length === 0) {
638
+ return;
639
+ }
640
+ await Promise.all(specifiers.map((specifier) => processImportSpecifier(filePath, specifier, forceFollowImports)));
641
+ };
642
+ for (const entryPoint of entryPoints) {
643
+ enqueueFile(entryPoint);
644
+ }
645
+ const inFlight = new Set();
646
+ const scheduleFiles = () => {
647
+ while (queue.length > 0 &&
648
+ inFlight.size < FAST_DISCOVERY_FILE_CONCURRENCY) {
649
+ const filePath = queue.shift();
650
+ if (!filePath) {
651
+ continue;
652
+ }
653
+ const promise = processFile(filePath).finally(() => {
654
+ inFlight.delete(promise);
655
+ });
656
+ inFlight.add(promise);
657
+ }
658
+ };
659
+ scheduleFiles();
660
+ while (inFlight.size > 0) {
661
+ await Promise.race(inFlight);
662
+ scheduleFiles();
663
+ }
664
+ }
665
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC1kaXNjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZmFzdC1kaXNjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUN4RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sdUJBQXVCLE1BQU0sa0JBQWtCLENBQUM7QUFDdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsS0FBSztJQUNMLE1BQU07SUFDTixNQUFNO0lBQ04sTUFBTTtJQUNOLEtBQUs7SUFDTCxNQUFNO0lBQ04sTUFBTTtJQUNOLE1BQU07Q0FDUCxDQUFDO0FBQ0YsTUFBTSxtQ0FBbUMsR0FBRyxJQUFJLEdBQUcsQ0FDakQsZ0NBQWdDLENBQ2pDLENBQUM7QUFDRixNQUFNLG9CQUFvQixHQUFHLFNBQVMsQ0FDcEMsdUJBQXVCLENBQUMsTUFBTSxDQUFDO0lBQzdCLFVBQVUsRUFBRSxDQUFDLEdBQUcsZ0NBQWdDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztJQUNuRSxjQUFjLEVBQUUsS0FBSztJQUNyQixjQUFjLEVBQUUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztDQUM5QyxD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VyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pELFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7WUFDSCxRQUFRLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hCLENBQUM7SUFDSCxDQUFDLENBQUM7SUFFRixhQUFhLEVBQUUsQ0FBQztJQUNoQixPQUFPLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdCLGFBQWEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWNjZXNzLCByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgYnVpbHRpbk1vZHVsZXMsIGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBpc0Fic29sdXRlLCBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgZW5oYW5jZWRSZXNvbHZlT3JpZ2luYWwgZnJvbSAnZW5oYW5jZWQtcmVzb2x2ZSc7XG5pbXBvcnQgeyBmaW5kVXAgfSBmcm9tICdmaW5kLXVwJztcbmltcG9ydCBKU09ONSBmcm9tICdqc29uNSc7XG5pbXBvcnQgeyBpbXBvcnRQYXJlbnRzIH0gZnJvbSAnLi9kaXNjb3Zlci1lbnRyaWVzLWVzYnVpbGQtcGx1Z2luLmpzJztcbmltcG9ydCB7IGRldGVjdFdvcmtmbG93UGF0dGVybnMgfSBmcm9tICcuL3RyYW5zZm9ybS11dGlscy5qcyc7XG5cbmNvbnN0IEZBU1RfRElTQ09WRVJZX1NPVVJDRV9FWFRFTlNJT05TID0gW1xuICAnLnRzJyxcbiAgJy50c3gnLFxuICAnLm10cycsXG4gICcuY3RzJyxcbiAgJy5qcycsXG4gICcuanN4JyxcbiAgJy5tanMnLFxuICAnLmNqcycsXG5dO1xuY29uc3QgRkFTVF9ESVNDT1ZFUllfU09VUkNFX0VYVEVOU0lPTl9TRVQgPSBuZXcgU2V0KFxuICBGQVNUX0RJU0NPVkVSWV9TT1VSQ0VfRVhURU5TSU9OU1xuKTtcbmNvbnN0IGZhc3REaXNjb3ZlcnlSZXNvbHZlID0gcHJvbWlzaWZ5KFxuICBlbmhhbmNlZFJlc29sdmVPcmlnaW5hbC5jcmVhdGUoe1xuICAgIGV4dGVuc2lvbnM6IFsuLi5GQVNUX0RJU0NPVkVSWV9TT1VSQ0VfRVhURU5TSU9OUywgJy5qc29uJywgJy5ub2RlJ10sXG4gICAgZnVsbHlTcGVjaWZpZWQ6IGZhbHNlLFxuICAgIGNvbmRpdGlvbk5hbWVzOiBbJ25vZGUnLCAnaW1wb3J0JywgJ3JlcXVpcmUnXSxcbiAgfSlcbik7XG5jb25zdCByZXF1aXJlID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuXG5jb25zdCBGQVNUX0RJU0NPVkVSWV9SRUFEX0NPTkNVUlJFTkNZID0gMzI7XG5jb25zdCBGQVNUX0RJU0NPVkVSWV9SRVNPTFZFX0NPTkNVUlJFTkNZID0gMzI7XG5jb25zdCBGQVNUX0RJU0NPVkVSWV9GSUxFX0NPTkNVUlJFTkNZID0gMTI4O1xuY29uc3QgUEFDS0FHRV9KU09OID0gJ3BhY2thZ2UuanNvbic7XG5jb25zdCBOT0RFX0JVSUxUSU5fU1BFQ0lGSUVSUyA9IG5ldyBTZXQoW1xuICAuLi5idWlsdGluTW9kdWxlcyxcbiAgLi4uYnVpbHRpbk1vZHVsZXMubWFwKChtb2R1bGVOYW1lKSA9PiBgbm9kZToke21vZHVsZU5hbWV9YCksXG5dKTtcbmNvbnN0IElNUE9SVF9TUEVDSUZJRVJfUEFUVEVSTlMgPSBbXG4gIC9cXGJmcm9tXFxzK1snXCJdKFteJ1wiXSspWydcIl0vZyxcbiAgLyg/Ol58WztcXG5dKVxccyppbXBvcnRcXHMrWydcIl0oW14nXCJdKylbJ1wiXS9nLFxuICAvXFxiaW1wb3J0XFxzKlxcKFxccypbJ1wiXShbXidcIl0rKVsnXCJdXFxzKlxcKS9nLFxuICAvXFxicmVxdWlyZVxccypcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccypcXCkvZyxcbl07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY292ZXJlZEVudHJpZXMge1xuICBkaXNjb3ZlcmVkU3RlcHM6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBTZXQ8c3RyaW5nPjtcbiAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IFNldDxzdHJpbmc+O1xufVxuXG5pbnRlcmZhY2UgRmFzdERpc2NvdmVyRW50cmllc09wdGlvbnMge1xuICBlbnRyeVBvaW50czogc3RyaW5nW107XG4gIHN0YXRlOiBEaXNjb3ZlcmVkRW50cmllcztcbiAgZGVmYXVsdFRzY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB3b3JraW5nRGlyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBQYWNrYWdlSW5mbyB7XG4gIHJvb3Q6IHN0cmluZztcbiAgaGFzV29ya2Zsb3dEZXBlbmRlbmN5OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVHNjb25maWdQYXRoQWxpYXMge1xuICBwYXR0ZXJuOiBzdHJpbmc7XG4gIHBhdHRlcm5QYXJ0czogc3RyaW5nW107XG4gIHRhcmdldHM6IEFycmF5PHtcbiAgICB0ZW1wbGF0ZTogc3RyaW5nO1xuICAgIHBhcnRzOiBzdHJpbmdbXTtcbiAgfT47XG59XG5cbmludGVyZmFjZSBUc2NvbmZpZ1BhdGhBbGlhc0xvYWRSZXN1bHQge1xuICBhbGlhc2VzOiBUc2NvbmZpZ1BhdGhBbGlhc1tdO1xuICBiYXNlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUxpbWl0ZXIoY29uY3VycmVuY3k6IG51bWJlcikge1xuICBsZXQgYWN0aXZlQ291bnQgPSAwO1xuICBjb25zdCBxdWV1ZTogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblxuICBjb25zdCBhY3F1aXJlID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBjb25zdCBydW4gPSAoKSA9PiB7XG4gICAgICAgIGFjdGl2ZUNvdW50Kys7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChhY3RpdmVDb3VudCA8IGNvbmN1cnJlbmN5KSB7XG4gICAgICAgIHJ1bigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWUucHVzaChydW4pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgYWN0aXZlQ291bnQtLTtcbiAgICBjb25zdCBuZXh0ID0gcXVldWUuc2hpZnQoKTtcbiAgICBpZiAobmV4dCkge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gbGltaXQ8VD4oZm46ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICBhd2FpdCBhY3F1aXJlKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmbigpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICByZWxlYXNlKCk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gZmlsZVBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuXG5mdW5jdGlvbiBpc0pzVHNGaWxlKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIEZBU1RfRElTQ09WRVJZX1NPVVJDRV9FWFRFTlNJT05fU0VULmhhcyhleHRuYW1lKGZpbGVQYXRoKSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVsYXRpdmVPckFic29sdXRlU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpIHx8IGlzQWJzb2x1dGUoc3BlY2lmaWVyKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2FnZU5hbWVGcm9tU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHN0cmlwcGVkU3BlY2lmaWVyID0gc3RyaXBJbXBvcnRTcGVjaWZpZXJRdWVyeShzcGVjaWZpZXIpO1xuICBpZiAoaXNSZWxhdGl2ZU9yQWJzb2x1dGVTcGVjaWZpZXIoc3RyaXBwZWRTcGVjaWZpZXIpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoc3RyaXBwZWRTcGVjaWZpZXIuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgY29uc3QgW3Njb3BlLCBuYW1lXSA9IHN0cmlwcGVkU3BlY2lmaWVyLnNwbGl0KCcvJyk7XG4gICAgcmV0dXJuIHNjb3BlICYmIG5hbWUgPyBgJHtzY29wZX0vJHtuYW1lfWAgOiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHN0cmlwcGVkU3BlY2lmaWVyLnNwbGl0KCcvJylbMF0gfHwgbnVsbDtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbXBvcnRTcGVjaWZpZXJRdWVyeShzcGVjaWZpZXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHF1ZXJ5SW5kZXggPSBzcGVjaWZpZXIuaW5kZXhPZignPycpO1xuICBjb25zdCBoYXNoSW5kZXggPSBzcGVjaWZpZXIuaW5kZXhPZignIycpO1xuICBjb25zdCBlbmRJbmRleCA9XG4gICAgcXVlcnlJbmRleCA9PT0gLTFcbiAgICAgID8gaGFzaEluZGV4XG4gICAgICA6IGhhc2hJbmRleCA9PT0gLTFcbiAgICAgICAgPyBxdWVyeUluZGV4XG4gICAgICAgIDogTWF0aC5taW4ocXVlcnlJbmRleCwgaGFzaEluZGV4KTtcbiAgcmV0dXJuIGVuZEluZGV4ID09PSAtMSA/IHNwZWNpZmllciA6IHNwZWNpZmllci5zbGljZSgwLCBlbmRJbmRleCk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFNraXBGYXN0RGlzY292ZXJ5SW1wb3J0KHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChOT0RFX0JVSUxUSU5fU1BFQ0lGSUVSUy5oYXMoc3BlY2lmaWVyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcGF0aExpa2VTcGVjaWZpZXIgPSBzdHJpcEltcG9ydFNwZWNpZmllclF1ZXJ5KHNwZWNpZmllcik7XG4gIGlmIChcbiAgICAhcGF0aExpa2VTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpICYmXG4gICAgIWlzQWJzb2x1dGUocGF0aExpa2VTcGVjaWZpZXIpICYmXG4gICAgIXBhdGhMaWtlU3BlY2lmaWVyLmluY2x1ZGVzKCcvJylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShwYXRoTGlrZVNwZWNpZmllcik7XG4gIHJldHVybiAoXG4gICAgZXh0ZW5zaW9uICE9PSAnJyAmJiAhRkFTVF9ESVNDT1ZFUllfU09VUkNFX0VYVEVOU0lPTl9TRVQuaGFzKGV4dGVuc2lvbilcbiAgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hUc2NvbmZpZ1BhdGhBbGlhcyhcbiAgc3BlY2lmaWVyOiBzdHJpbmcsXG4gIGFsaWFzOiBUc2NvbmZpZ1BhdGhBbGlhc1xuKTogc3RyaW5nW10gfCBudWxsIHtcbiAgaWYgKGFsaWFzLnBhdHRlcm5QYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gc3BlY2lmaWVyID09PSBhbGlhcy5wYXR0ZXJuID8gW10gOiBudWxsO1xuICB9XG5cbiAgY29uc3QgY2FwdHVyZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBwb3NpdGlvbiA9IDA7XG4gIGNvbnN0IGZpcnN0UGFydCA9IGFsaWFzLnBhdHRlcm5QYXJ0c1swXTtcbiAgaWYgKCFzcGVjaWZpZXIuc3RhcnRzV2l0aChmaXJzdFBhcnQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcG9zaXRpb24gPSBmaXJzdFBhcnQubGVuZ3RoO1xuXG4gIGZvciAobGV0IGkgPSAxOyBpIDwgYWxpYXMucGF0dGVyblBhcnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFydCA9IGFsaWFzLnBhdHRlcm5QYXJ0c1tpXTtcbiAgICBpZiAoaSA9PT0gYWxpYXMucGF0dGVyblBhcnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmICghc3BlY2lmaWVyLmVuZHNXaXRoKHBhcnQpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FwdHVyZXMucHVzaChzcGVjaWZpZXIuc2xpY2UocG9zaXRpb24sIHNwZWNpZmllci5sZW5ndGggLSBwYXJ0Lmxlbmd0aCkpO1xuICAgICAgcmV0dXJuIGNhcHR1cmVzO1xuICAgIH1cblxuICAgIGNvbnN0IG5leHRJbmRleCA9IHNwZWNpZmllci5pbmRleE9mKHBhcnQsIHBvc2l0aW9uKTtcbiAgICBpZiAobmV4dEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNhcHR1cmVzLnB1c2goc3BlY2lmaWVyLnNsaWNlKHBvc2l0aW9uLCBuZXh0SW5kZXgpKTtcbiAgICBwb3NpdGlvbiA9IG5leHRJbmRleCArIHBhcnQubGVuZ3RoO1xuICB9XG5cbiAgcmV0dXJuIGNhcHR1cmVzO1xufVxuXG5mdW5jdGlvbiBhcHBseVRzY29uZmlnUGF0aFRhcmdldChcbiAgdGFyZ2V0OiBUc2NvbmZpZ1BhdGhBbGlhc1sndGFyZ2V0cyddW251bWJlcl0sXG4gIGNhcHR1cmVzOiBzdHJpbmdbXVxuKTogc3RyaW5nIHtcbiAgaWYgKHRhcmdldC5wYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gdGFyZ2V0LnRlbXBsYXRlO1xuICB9XG5cbiAgbGV0IHJlc29sdmVkID0gdGFyZ2V0LnBhcnRzWzBdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHRhcmdldC5wYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgIHJlc29sdmVkICs9IChjYXB0dXJlc1tpIC0gMV0gPz8gJycpICsgdGFyZ2V0LnBhcnRzW2ldO1xuICB9XG4gIHJldHVybiByZXNvbHZlZDtcbn1cblxuZnVuY3Rpb24gaXNHZW5lcmF0ZWRCdWlsZEFydGlmYWN0UGF0aChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChmaWxlUGF0aCk7XG4gIHJldHVybiAoXG4gICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy8ubml0cm8vJykgfHxcbiAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy5vdXRwdXQvJykgfHxcbiAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy5uZXh0LycpIHx8XG4gICAgbm9ybWFsaXplZFBhdGguaW5jbHVkZXMoJy8ubnV4dC8nKSB8fFxuICAgIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvLnN2ZWx0ZS1raXQvJykgfHxcbiAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy52ZXJjZWwvJykgfHxcbiAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnLy53ZWxsLWtub3duL3dvcmtmbG93LycpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTm9kZU1vZHVsZXNQYXRoKGZpbGVQYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKGZpbGVQYXRoKTtcbiAgcmV0dXJuIChcbiAgICBub3JtYWxpemVkUGF0aC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSB8fFxuICAgIG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKCcvLnBucG0vJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRkSW1wb3J0UGFyZW50KHBhcmVudDogc3RyaW5nLCBjaGlsZDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXJlbnQgPSBub3JtYWxpemVQYXRoKHBhcmVudCk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRDaGlsZCA9IG5vcm1hbGl6ZVBhdGgoY2hpbGQpO1xuICBsZXQgY2hpbGRyZW4gPSBpbXBvcnRQYXJlbnRzLmdldChub3JtYWxpemVkUGFyZW50KTtcbiAgaWYgKCFjaGlsZHJlbikge1xuICAgIGNoaWxkcmVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgaW1wb3J0UGFyZW50cy5zZXQobm9ybWFsaXplZFBhcmVudCwgY2hpbGRyZW4pO1xuICB9XG4gIGNoaWxkcmVuLmFkZChub3JtYWxpemVkQ2hpbGQpO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0SW1wb3J0U3BlY2lmaWVycyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgaWYgKFxuICAgICFzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCcpICYmXG4gICAgIXNvdXJjZS5pbmNsdWRlcygncmVxdWlyZScpICYmXG4gICAgIXNvdXJjZS5pbmNsdWRlcygnZnJvbScpXG4gICkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGNvbnN0IHNwZWNpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IGltcG9ydFBhdHRlcm4gb2YgSU1QT1JUX1NQRUNJRklFUl9QQVRURVJOUykge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKGltcG9ydFBhdHRlcm4pKSB7XG4gICAgICBjb25zdCBzcGVjaWZpZXIgPSBtYXRjaFsxXTtcbiAgICAgIGlmIChzcGVjaWZpZXIpIHtcbiAgICAgICAgc3BlY2lmaWVycy5hZGQoc3BlY2lmaWVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gQXJyYXkuZnJvbShzcGVjaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gaGFzV29ya2Zsb3dEZXBlbmRlbmN5KGRlcGVuZGVuY2llczogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgdHlwZW9mIGRlcGVuZGVuY2llcyAhPT0gJ29iamVjdCcgfHxcbiAgICBkZXBlbmRlbmNpZXMgPT09IG51bGwgfHxcbiAgICBBcnJheS5pc0FycmF5KGRlcGVuZGVuY2llcylcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGRlcGVuZGVuY2llcykuc29tZShcbiAgICAoZGVwZW5kZW5jeSkgPT5cbiAgICAgIGRlcGVuZGVuY3kgPT09ICd3b3JrZmxvdycgfHwgZGVwZW5kZW5jeS5zdGFydHNXaXRoKCdAd29ya2Zsb3cvJylcbiAgKTtcbn1cblxuZnVuY3Rpb24gc3RyaXBDb21tZW50cyhzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzb3VyY2VcbiAgICAucmVwbGFjZSgvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nLCAnJylcbiAgICAucmVwbGFjZSgvKF58W146XSlcXC9cXC8uKiQvZ20sICckMScpO1xufVxuXG5mdW5jdGlvbiBoYXNMaWtlbHlTZXJkZUNsYXNzKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghc291cmNlLmluY2x1ZGVzKCdzdGF0aWMnKSB8fCAhc291cmNlLmluY2x1ZGVzKCdbJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB1bmNvbW1lbnRlZFNvdXJjZSA9IHN0cmlwQ29tbWVudHMoc291cmNlKTtcbiAgaWYgKFxuICAgIC9zdGF0aWNcXHMrXFxbXFxzKig/OldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSl8U3ltYm9sXFwuZm9yXFxzKlxcKFxccypbJ1wiXXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlbJ1wiXVxccypcXCkpXFxzKlxcXVxccypcXCgvLnRlc3QoXG4gICAgICB1bmNvbW1lbnRlZFNvdXJjZVxuICAgIClcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoXG4gICAgIS9mcm9tXFxzK1snXCJdQHdvcmtmbG93XFwvc2VyZGVbJ1wiXXxyZXF1aXJlXFxzKlxcKFxccypbJ1wiXUB3b3JrZmxvd1xcL3NlcmRlWydcIl1cXHMqXFwpLy50ZXN0KFxuICAgICAgdW5jb21tZW50ZWRTb3VyY2VcbiAgICApXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAvc3RhdGljXFxzK1xcW1xccypbJEEtWl9hLXpdWyRcXHddKlxccypcXF1cXHMqXFwoLy50ZXN0KHVuY29tbWVudGVkU291cmNlKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZFRzY29uZmlnUGF0aEFsaWFzZXMoXG4gIHRzY29uZmlnUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZWVuID0gbmV3IFNldDxzdHJpbmc+KClcbik6IFByb21pc2U8VHNjb25maWdQYXRoQWxpYXNbXT4ge1xuICBpZiAoIXRzY29uZmlnUGF0aCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHJldHVybiAoYXdhaXQgbG9hZFRzY29uZmlnUGF0aEFsaWFzQ29uZmlnKHRzY29uZmlnUGF0aCwgc2VlbikpLmFsaWFzZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRUc2NvbmZpZ1BhdGhBbGlhc0NvbmZpZyhcbiAgdHNjb25maWdQYXRoOiBzdHJpbmcsXG4gIHNlZW46IFNldDxzdHJpbmc+XG4pOiBQcm9taXNlPFRzY29uZmlnUGF0aEFsaWFzTG9hZFJlc3VsdD4ge1xuICBjb25zdCBub3JtYWxpemVkVHNjb25maWdQYXRoID0gcmVzb2x2ZSh0c2NvbmZpZ1BhdGgpO1xuICBpZiAoc2Vlbi5oYXMobm9ybWFsaXplZFRzY29uZmlnUGF0aCkpIHtcbiAgICByZXR1cm4geyBhbGlhc2VzOiBbXSwgYmFzZVVybDogdW5kZWZpbmVkIH07XG4gIH1cblxuICBzZWVuLmFkZChub3JtYWxpemVkVHNjb25maWdQYXRoKTtcblxuICB0cnkge1xuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKG5vcm1hbGl6ZWRUc2NvbmZpZ1BhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgcGFyc2VkID0gSlNPTjUucGFyc2Uoc291cmNlKSBhcyB7XG4gICAgICBleHRlbmRzPzogdW5rbm93bjtcbiAgICAgIGNvbXBpbGVyT3B0aW9ucz86IHtcbiAgICAgICAgYmFzZVVybD86IHVua25vd247XG4gICAgICAgIHBhdGhzPzogdW5rbm93bjtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBjb21waWxlck9wdGlvbnMgPSBwYXJzZWQuY29tcGlsZXJPcHRpb25zO1xuXG4gICAgbGV0IGJhc2VDb25maWc6IFRzY29uZmlnUGF0aEFsaWFzTG9hZFJlc3VsdCA9IHtcbiAgICAgIGFsaWFzZXM6IFtdLFxuICAgICAgYmFzZVVybDogdW5kZWZpbmVkLFxuICAgIH07XG4gICAgaWYgKHR5cGVvZiBwYXJzZWQuZXh0ZW5kcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGJhc2VUc2NvbmZpZ1BhdGggPSBhd2FpdCByZXNvbHZlVHNjb25maWdFeHRlbmRzUGF0aChcbiAgICAgICAgcGFyc2VkLmV4dGVuZHMsXG4gICAgICAgIG5vcm1hbGl6ZWRUc2NvbmZpZ1BhdGhcbiAgICAgICk7XG4gICAgICBpZiAoYmFzZVRzY29uZmlnUGF0aCkge1xuICAgICAgICBiYXNlQ29uZmlnID0gYXdhaXQgbG9hZFRzY29uZmlnUGF0aEFsaWFzQ29uZmlnKGJhc2VUc2NvbmZpZ1BhdGgsIHNlZW4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGJhc2VVcmwgPVxuICAgICAgdHlwZW9mIGNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybCA9PT0gJ3N0cmluZydcbiAgICAgICAgPyByZXNvbHZlKGRpcm5hbWUobm9ybWFsaXplZFRzY29uZmlnUGF0aCksIGNvbXBpbGVyT3B0aW9ucy5iYXNlVXJsKVxuICAgICAgICA6IGJhc2VDb25maWcuYmFzZVVybDtcblxuICAgIGlmIChcbiAgICAgICFjb21waWxlck9wdGlvbnMgfHxcbiAgICAgIHR5cGVvZiBjb21waWxlck9wdGlvbnMucGF0aHMgIT09ICdvYmplY3QnIHx8XG4gICAgICBjb21waWxlck9wdGlvbnMucGF0aHMgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoY29tcGlsZXJPcHRpb25zLnBhdGhzKVxuICAgICkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYWxpYXNlczogYmFzZUNvbmZpZy5hbGlhc2VzLFxuICAgICAgICBiYXNlVXJsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlRGlyID0gYmFzZVVybCA/PyBkaXJuYW1lKG5vcm1hbGl6ZWRUc2NvbmZpZ1BhdGgpO1xuICAgIGNvbnN0IGFsaWFzZXM6IFRzY29uZmlnUGF0aEFsaWFzW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgW3BhdHRlcm4sIHJhd1RhcmdldHNdIG9mIE9iamVjdC5lbnRyaWVzKGNvbXBpbGVyT3B0aW9ucy5wYXRocykpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShyYXdUYXJnZXRzKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgdGFyZ2V0cyA9IHJhd1RhcmdldHNcbiAgICAgICAgLmZpbHRlcigodGFyZ2V0KTogdGFyZ2V0IGlzIHN0cmluZyA9PiB0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJylcbiAgICAgICAgLm1hcCgodGFyZ2V0KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSByZXNvbHZlKGJhc2VEaXIsIHRhcmdldCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgcGFydHM6IHRlbXBsYXRlLnNwbGl0KCcqJyksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICBpZiAodGFyZ2V0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGFsaWFzZXMucHVzaCh7XG4gICAgICAgIHBhdHRlcm4sXG4gICAgICAgIHBhdHRlcm5QYXJ0czogcGF0dGVybi5zcGxpdCgnKicpLFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWxpYXNlcywgYmFzZVVybCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBhbGlhc2VzOiBbXSwgYmFzZVVybDogdW5kZWZpbmVkIH07XG4gIH0gZmluYWxseSB7XG4gICAgc2Vlbi5kZWxldGUobm9ybWFsaXplZFRzY29uZmlnUGF0aCk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVRzY29uZmlnRXh0ZW5kc1BhdGgoXG4gIGV4dGVuZHNWYWx1ZTogc3RyaW5nLFxuICB0c2NvbmZpZ1BhdGg6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY29uZmlnRGlyID0gZGlybmFtZSh0c2NvbmZpZ1BhdGgpO1xuICBpZiAoZXh0ZW5kc1ZhbHVlLnN0YXJ0c1dpdGgoJy4nKSB8fCBpc0Fic29sdXRlKGV4dGVuZHNWYWx1ZSkpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGlzQWJzb2x1dGUoZXh0ZW5kc1ZhbHVlKVxuICAgICAgPyBleHRlbmRzVmFsdWVcbiAgICAgIDogcmVzb2x2ZShjb25maWdEaXIsIGV4dGVuZHNWYWx1ZSk7XG4gICAgcmV0dXJuIGZpbmRFeGlzdGluZ1RzY29uZmlnUGF0aChyZXNvbHZlZCk7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlLnJlc29sdmUoZXh0ZW5kc1ZhbHVlLCB7IHBhdGhzOiBbY29uZmlnRGlyXSB9KTtcbiAgfSBjYXRjaCB7fVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUucmVzb2x2ZShgJHtleHRlbmRzVmFsdWV9L3RzY29uZmlnLmpzb25gLCB7XG4gICAgICBwYXRoczogW2NvbmZpZ0Rpcl0sXG4gICAgfSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZEV4aXN0aW5nVHNjb25maWdQYXRoKFxuICBjYW5kaWRhdGVQYXRoOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNhbmRpZGF0ZXMgPVxuICAgIGV4dG5hbWUoY2FuZGlkYXRlUGF0aCkgPT09ICcnXG4gICAgICA/IFtcbiAgICAgICAgICBgJHtjYW5kaWRhdGVQYXRofS5qc29uYCxcbiAgICAgICAgICBqb2luKGNhbmRpZGF0ZVBhdGgsICd0c2NvbmZpZy5qc29uJyksXG4gICAgICAgICAgY2FuZGlkYXRlUGF0aCxcbiAgICAgICAgXVxuICAgICAgOiBbY2FuZGlkYXRlUGF0aF07XG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhY2Nlc3MoY2FuZGlkYXRlKTtcbiAgICAgIHJldHVybiBjYW5kaWRhdGU7XG4gICAgfSBjYXRjaCB7fVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZFBhY2thZ2VJbmZvKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwYWNrYWdlSW5mb0NhY2hlOiBNYXA8c3RyaW5nLCBQcm9taXNlPFBhY2thZ2VJbmZvIHwgbnVsbD4+XG4pOiBQcm9taXNlPFBhY2thZ2VJbmZvIHwgbnVsbD4ge1xuICBsZXQgY3VycmVudERpciA9IGRpcm5hbWUoZmlsZVBhdGgpO1xuXG4gIHdoaWxlIChjdXJyZW50RGlyICYmIGN1cnJlbnREaXIgIT09IGRpcm5hbWUoY3VycmVudERpcikpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBwYWNrYWdlSW5mb0NhY2hlLmdldChjdXJyZW50RGlyKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBjYWNoZWRJbmZvID0gYXdhaXQgY2FjaGVkO1xuICAgICAgaWYgKGNhY2hlZEluZm8pIHtcbiAgICAgICAgcmV0dXJuIGNhY2hlZEluZm87XG4gICAgICB9XG4gICAgICBjdXJyZW50RGlyID0gZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IGpvaW4oY3VycmVudERpciwgUEFDS0FHRV9KU09OKTtcbiAgICBjb25zdCBwYWNrYWdlSW5mb1Byb21pc2UgPSByZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGY4JylcbiAgICAgIC50aGVuKChzb3VyY2UpOiBQYWNrYWdlSW5mbyA9PiB7XG4gICAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2Uoc291cmNlKSBhcyB7XG4gICAgICAgICAgbmFtZT86IHVua25vd247XG4gICAgICAgICAgZGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICBwZWVyRGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICBvcHRpb25hbERlcGVuZGVuY2llcz86IHVua25vd247XG4gICAgICAgICAgZGV2RGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcGFja2FnZU5hbWUgPSB0eXBlb2YgcGFyc2VkLm5hbWUgPT09ICdzdHJpbmcnID8gcGFyc2VkLm5hbWUgOiAnJztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICByb290OiBub3JtYWxpemVQYXRoKGN1cnJlbnREaXIpLFxuICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeTpcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lID09PSAnd29ya2Zsb3cnIHx8XG4gICAgICAgICAgICBwYWNrYWdlTmFtZS5zdGFydHNXaXRoKCdAd29ya2Zsb3cvJykgfHxcbiAgICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeShwYXJzZWQuZGVwZW5kZW5jaWVzKSB8fFxuICAgICAgICAgICAgaGFzV29ya2Zsb3dEZXBlbmRlbmN5KHBhcnNlZC5wZWVyRGVwZW5kZW5jaWVzKSB8fFxuICAgICAgICAgICAgaGFzV29ya2Zsb3dEZXBlbmRlbmN5KHBhcnNlZC5vcHRpb25hbERlcGVuZGVuY2llcykgfHxcbiAgICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeShwYXJzZWQuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgICAgfTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4gbnVsbCk7XG5cbiAgICBwYWNrYWdlSW5mb0NhY2hlLnNldChjdXJyZW50RGlyLCBwYWNrYWdlSW5mb1Byb21pc2UpO1xuICAgIGNvbnN0IHBhY2thZ2VJbmZvID0gYXdhaXQgcGFja2FnZUluZm9Qcm9taXNlO1xuICAgIGlmIChwYWNrYWdlSW5mbykge1xuICAgICAgcmV0dXJuIHBhY2thZ2VJbmZvO1xuICAgIH1cblxuICAgIGN1cnJlbnREaXIgPSBkaXJuYW1lKGN1cnJlbnREaXIpO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmYXN0RGlzY292ZXJFbnRyaWVzKHtcbiAgZW50cnlQb2ludHMsXG4gIHN0YXRlLFxuICBkZWZhdWx0VHNjb25maWdQYXRoLFxuICB3b3JraW5nRGlyLFxufTogRmFzdERpc2NvdmVyRW50cmllc09wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVhZExpbWl0ID0gY3JlYXRlTGltaXRlcihGQVNUX0RJU0NPVkVSWV9SRUFEX0NPTkNVUlJFTkNZKTtcbiAgY29uc3QgcmVzb2x2ZUxpbWl0ID0gY3JlYXRlTGltaXRlcihGQVNUX0RJU0NPVkVSWV9SRVNPTFZFX0NPTkNVUlJFTkNZKTtcbiAgY29uc3QgcmVzb2x2ZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nIHwgbnVsbD4+KCk7XG4gIGNvbnN0IGZpbGVFeGlzdHNDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPGJvb2xlYW4+PigpO1xuICBjb25zdCB0c2NvbmZpZ1BhdGhCeURpckNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcbiAgY29uc3QgdHNjb25maWdBbGlhc2VzQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxUc2NvbmZpZ1BhdGhBbGlhc1tdPj4oKTtcbiAgY29uc3QgcGFja2FnZUluZm9DYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPFBhY2thZ2VJbmZvIHwgbnVsbD4+KCk7XG4gIGNvbnN0IHBhY2thZ2VTcGVjaWZpZXJJbmZvQ2FjaGUgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBQcm9taXNlPFBhY2thZ2VJbmZvIHwgbnVsbD5cbiAgPigpO1xuICBjb25zdCBxdWV1ZWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBwcm9jZXNzZWRGaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBxdWV1ZTogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZW5xdWV1ZUZpbGUgPSAoZmlsZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCB8IG51bGwpOiB2b2lkID0+IHtcbiAgICBpZiAoIWZpbGVQYXRoKSByZXR1cm47XG4gICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKGZpbGVQYXRoKTtcbiAgICBpZiAoXG4gICAgICBxdWV1ZWRGaWxlcy5oYXMobm9ybWFsaXplZFBhdGgpIHx8XG4gICAgICBwcm9jZXNzZWRGaWxlcy5oYXMobm9ybWFsaXplZFBhdGgpIHx8XG4gICAgICAhaXNKc1RzRmlsZShub3JtYWxpemVkUGF0aCkgfHxcbiAgICAgIGlzR2VuZXJhdGVkQnVpbGRBcnRpZmFjdFBhdGgobm9ybWFsaXplZFBhdGgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHF1ZXVlZEZpbGVzLmFkZChub3JtYWxpemVkUGF0aCk7XG4gICAgcXVldWUucHVzaChub3JtYWxpemVkUGF0aCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZFNvdXJjZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IHJlYWRMaW1pdChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgcmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgZmlsZUV4aXN0cyA9IChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gZmlsZUV4aXN0c0NhY2hlLmdldChmaWxlUGF0aCk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gcmVhZExpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFjY2VzcyhmaWxlUGF0aCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmaWxlRXhpc3RzQ2FjaGUuc2V0KGZpbGVQYXRoLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcblxuICBjb25zdCBmaW5kVHNjb25maWdQYXRoRm9ySW1wb3J0ZXIgPSAoXG4gICAgaW1wb3J0ZXI6IHN0cmluZ1xuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4ge1xuICAgIGlmIChpc05vZGVNb2R1bGVzUGF0aChpbXBvcnRlcikpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZGVmYXVsdFRzY29uZmlnUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0ZXJEaXIgPSBkaXJuYW1lKGltcG9ydGVyKTtcbiAgICBjb25zdCBjYWNoZWQgPSB0c2NvbmZpZ1BhdGhCeURpckNhY2hlLmdldChpbXBvcnRlckRpcik7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gZmluZFVwKFsndHNjb25maWcuanNvbicsICdqc2NvbmZpZy5qc29uJ10sIHtcbiAgICAgIGN3ZDogaW1wb3J0ZXJEaXIsXG4gICAgfSkudGhlbigoZm91bmQpID0+IGZvdW5kID8/IGRlZmF1bHRUc2NvbmZpZ1BhdGgpO1xuICAgIHRzY29uZmlnUGF0aEJ5RGlyQ2FjaGUuc2V0KGltcG9ydGVyRGlyLCBwcm9taXNlKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcblxuICBjb25zdCBsb2FkQWxpYXNlc0ZvclRzY29uZmlnID0gKFxuICAgIGNvbmZpZ1BhdGg6IHN0cmluZyB8IHVuZGVmaW5lZFxuICApOiBQcm9taXNlPFRzY29uZmlnUGF0aEFsaWFzW10+ID0+IHtcbiAgICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgIH1cblxuICAgIGNvbnN0IGNhY2hlZCA9IHRzY29uZmlnQWxpYXNlc0NhY2hlLmdldChjb25maWdQYXRoKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHByb21pc2UgPSBsb2FkVHNjb25maWdQYXRoQWxpYXNlcyhjb25maWdQYXRoKTtcbiAgICB0c2NvbmZpZ0FsaWFzZXNDYWNoZS5zZXQoY29uZmlnUGF0aCwgcHJvbWlzZSk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZVBhdGhMaWtlU3BlY2lmaWVyID0gYXN5bmMgKFxuICAgIGltcG9ydGVyOiBzdHJpbmcsXG4gICAgc3BlY2lmaWVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgY29uc3Qgc3RyaXBwZWRTcGVjaWZpZXIgPSBzdHJpcEltcG9ydFNwZWNpZmllclF1ZXJ5KHNwZWNpZmllcik7XG4gICAgY29uc3QgYmFzZVBhdGggPSBpc0Fic29sdXRlKHN0cmlwcGVkU3BlY2lmaWVyKVxuICAgICAgPyBzdHJpcHBlZFNwZWNpZmllclxuICAgICAgOiByZXNvbHZlKGRpcm5hbWUoaW1wb3J0ZXIpLCBzdHJpcHBlZFNwZWNpZmllcik7XG4gICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShiYXNlUGF0aCk7XG4gICAgaWYgKGV4dGVuc2lvbiAhPT0gJycpIHtcbiAgICAgIHJldHVybiBGQVNUX0RJU0NPVkVSWV9TT1VSQ0VfRVhURU5TSU9OX1NFVC5oYXMoZXh0ZW5zaW9uKSAmJlxuICAgICAgICAoYXdhaXQgZmlsZUV4aXN0cyhiYXNlUGF0aCkpXG4gICAgICAgID8gbm9ybWFsaXplUGF0aChiYXNlUGF0aClcbiAgICAgICAgOiBudWxsO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIFtcbiAgICAgIC4uLkZBU1RfRElTQ09WRVJZX1NPVVJDRV9FWFRFTlNJT05TLm1hcChcbiAgICAgICAgKGNhbmRpZGF0ZUV4dGVuc2lvbikgPT4gYCR7YmFzZVBhdGh9JHtjYW5kaWRhdGVFeHRlbnNpb259YFxuICAgICAgKSxcbiAgICAgIC4uLkZBU1RfRElTQ09WRVJZX1NPVVJDRV9FWFRFTlNJT05TLm1hcCgoY2FuZGlkYXRlRXh0ZW5zaW9uKSA9PlxuICAgICAgICBqb2luKGJhc2VQYXRoLCBgaW5kZXgke2NhbmRpZGF0ZUV4dGVuc2lvbn1gKVxuICAgICAgKSxcbiAgICBdKSB7XG4gICAgICBpZiAoYXdhaXQgZmlsZUV4aXN0cyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybiBub3JtYWxpemVQYXRoKGNhbmRpZGF0ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZVdpdGhUc2NvbmZpZ1BhdGhzID0gYXN5bmMgKFxuICAgIGltcG9ydGVyOiBzdHJpbmcsXG4gICAgc3BlY2lmaWVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgaXNBYnNvbHV0ZShzcGVjaWZpZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCB0c2NvbmZpZ1BhdGggPSBhd2FpdCBmaW5kVHNjb25maWdQYXRoRm9ySW1wb3J0ZXIoaW1wb3J0ZXIpO1xuICAgIGNvbnN0IHRzY29uZmlnUGF0aEFsaWFzZXMgPSBhd2FpdCBsb2FkQWxpYXNlc0ZvclRzY29uZmlnKHRzY29uZmlnUGF0aCk7XG4gICAgaWYgKHRzY29uZmlnUGF0aEFsaWFzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIHRzY29uZmlnUGF0aEFsaWFzZXMpIHtcbiAgICAgIGNvbnN0IGNhcHR1cmVzID0gbWF0Y2hUc2NvbmZpZ1BhdGhBbGlhcyhzcGVjaWZpZXIsIGFsaWFzKTtcbiAgICAgIGlmICghY2FwdHVyZXMpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGFsaWFzLnRhcmdldHMpIHtcbiAgICAgICAgY29uc3QgdGFyZ2V0UGF0aCA9IGFwcGx5VHNjb25maWdQYXRoVGFyZ2V0KHRhcmdldCwgY2FwdHVyZXMpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVBhdGhMaWtlU3BlY2lmaWVyKGltcG9ydGVyLCB0YXJnZXRQYXRoKTtcbiAgICAgICAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge31cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBmaW5kUGFja2FnZUluZm9CeVNwZWNpZmllciA9IChcbiAgICBwYWNrYWdlTmFtZTogc3RyaW5nXG4gICk6IFByb21pc2U8UGFja2FnZUluZm8gfCBudWxsPiA9PiB7XG4gICAgY29uc3QgY2FjaGVkID0gcGFja2FnZVNwZWNpZmllckluZm9DYWNoZS5nZXQocGFja2FnZU5hbWUpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZUluZm9Qcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIGxldCBwYWNrYWdlSnNvblBhdGg6IHN0cmluZztcbiAgICAgIHRyeSB7XG4gICAgICAgIHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCwge1xuICAgICAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgICAgIH0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkTGltaXQoKCkgPT4gcmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcbiAgICAgICAgY29uc3QgcGFyc2VkID0gSlNPTi5wYXJzZShzb3VyY2UpIGFzIHtcbiAgICAgICAgICBuYW1lPzogdW5rbm93bjtcbiAgICAgICAgICBkZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIHBlZXJEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzPzogdW5rbm93bjtcbiAgICAgICAgICBkZXZEZXBlbmRlbmNpZXM/OiB1bmtub3duO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBwYXJzZWRQYWNrYWdlTmFtZSA9XG4gICAgICAgICAgdHlwZW9mIHBhcnNlZC5uYW1lID09PSAnc3RyaW5nJyA/IHBhcnNlZC5uYW1lIDogcGFja2FnZU5hbWU7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcm9vdDogbm9ybWFsaXplUGF0aChkaXJuYW1lKHBhY2thZ2VKc29uUGF0aCkpLFxuICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeTpcbiAgICAgICAgICAgIHBhcnNlZFBhY2thZ2VOYW1lID09PSAnd29ya2Zsb3cnIHx8XG4gICAgICAgICAgICBwYXJzZWRQYWNrYWdlTmFtZS5zdGFydHNXaXRoKCdAd29ya2Zsb3cvJykgfHxcbiAgICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeShwYXJzZWQuZGVwZW5kZW5jaWVzKSB8fFxuICAgICAgICAgICAgaGFzV29ya2Zsb3dEZXBlbmRlbmN5KHBhcnNlZC5wZWVyRGVwZW5kZW5jaWVzKSB8fFxuICAgICAgICAgICAgaGFzV29ya2Zsb3dEZXBlbmRlbmN5KHBhcnNlZC5vcHRpb25hbERlcGVuZGVuY2llcykgfHxcbiAgICAgICAgICAgIGhhc1dvcmtmbG93RGVwZW5kZW5jeShwYXJzZWQuZGV2RGVwZW5kZW5jaWVzKSxcbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHBhY2thZ2VTcGVjaWZpZXJJbmZvQ2FjaGUuc2V0KHBhY2thZ2VOYW1lLCBwYWNrYWdlSW5mb1Byb21pc2UpO1xuICAgIHJldHVybiBwYWNrYWdlSW5mb1Byb21pc2U7XG4gIH07XG5cbiAgY29uc3Qgc2hvdWxkUmVzb2x2ZUJhcmVTcGVjaWZpZXIgPSBhc3luYyAoXG4gICAgc3BlY2lmaWVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgY29uc3QgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZUZyb21TcGVjaWZpZXIoc3BlY2lmaWVyKTtcbiAgICBpZiAoIXBhY2thZ2VOYW1lKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhY2thZ2VOYW1lID09PSAnd29ya2Zsb3cnIHx8IHBhY2thZ2VOYW1lLnN0YXJ0c1dpdGgoJ0B3b3JrZmxvdy8nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBmaW5kUGFja2FnZUluZm9CeVNwZWNpZmllcihwYWNrYWdlTmFtZSk7XG4gICAgaWYgKCFwYWNrYWdlSW5mbykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChwYWNrYWdlSW5mby5oYXNXb3JrZmxvd0RlcGVuZGVuY3kpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCByZXNvbHZlSW1wb3J0ID0gKFxuICAgIGltcG9ydGVyOiBzdHJpbmcsXG4gICAgc3BlY2lmaWVyOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiA9PiB7XG4gICAgY29uc3QgY2FjaGVLZXkgPSBgJHtkaXJuYW1lKGltcG9ydGVyKX1cXDAke3NwZWNpZmllcn1gO1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlc29sdmVDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb2x2ZWRQcm9taXNlID0gcmVzb2x2ZUxpbWl0KGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChpc1JlbGF0aXZlT3JBYnNvbHV0ZVNwZWNpZmllcihzcGVjaWZpZXIpKSB7XG4gICAgICAgIHJldHVybiByZXNvbHZlUGF0aExpa2VTcGVjaWZpZXIoaW1wb3J0ZXIsIHNwZWNpZmllcik7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlc29sdmVkQWxpYXMgPSBhd2FpdCByZXNvbHZlV2l0aFRzY29uZmlnUGF0aHMoaW1wb3J0ZXIsIHNwZWNpZmllcik7XG4gICAgICBpZiAocmVzb2x2ZWRBbGlhcykge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZWRBbGlhcztcbiAgICAgIH1cblxuICAgICAgaWYgKCEoYXdhaXQgc2hvdWxkUmVzb2x2ZUJhcmVTcGVjaWZpZXIoc3BlY2lmaWVyKSkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZmFzdERpc2NvdmVyeVJlc29sdmUoXG4gICAgICAgICAgZGlybmFtZShpbXBvcnRlciksXG4gICAgICAgICAgc3BlY2lmaWVyXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnID8gbm9ybWFsaXplUGF0aChyZXNvbHZlZCkgOiBudWxsO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJlc29sdmVDYWNoZS5zZXQoY2FjaGVLZXksIHJlc29sdmVkUHJvbWlzZSk7XG4gICAgcmV0dXJuIHJlc29sdmVkUHJvbWlzZTtcbiAgfTtcblxuICBjb25zdCBzaG91bGRGb2xsb3dJbXBvcnRzRnJvbUZpbGUgPSBhc3luYyAoXG4gICAgaW1wb3J0ZXI6IHN0cmluZyxcbiAgICBmb3JjZUZvbGxvdzogYm9vbGVhblxuICApOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICBpZiAoZm9yY2VGb2xsb3cpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzTm9kZU1vZHVsZXNQYXRoKGltcG9ydGVyKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgcGFja2FnZUluZm8gPSBhd2FpdCBmaW5kUGFja2FnZUluZm8oaW1wb3J0ZXIsIHBhY2thZ2VJbmZvQ2FjaGUpO1xuICAgIHJldHVybiBwYWNrYWdlSW5mbz8uaGFzV29ya2Zsb3dEZXBlbmRlbmN5ID09PSB0cnVlO1xuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NJbXBvcnRTcGVjaWZpZXIgPSBhc3luYyAoXG4gICAgZmlsZVBhdGg6IHN0cmluZyxcbiAgICBzcGVjaWZpZXI6IHN0cmluZyxcbiAgICBmb3JjZUZvbGxvd0ltcG9ydHM6IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgaWYgKHNob3VsZFNraXBGYXN0RGlzY292ZXJ5SW1wb3J0KHNwZWNpZmllcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCEoYXdhaXQgc2hvdWxkRm9sbG93SW1wb3J0c0Zyb21GaWxlKGZpbGVQYXRoLCBmb3JjZUZvbGxvd0ltcG9ydHMpKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZUltcG9ydChmaWxlUGF0aCwgc3BlY2lmaWVyKTtcbiAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYWRkSW1wb3J0UGFyZW50KGZpbGVQYXRoLCByZXNvbHZlZCk7XG4gICAgaWYgKCFpc0pzVHNGaWxlKHJlc29sdmVkKSB8fCBpc0dlbmVyYXRlZEJ1aWxkQXJ0aWZhY3RQYXRoKHJlc29sdmVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICBlbnF1ZXVlRmlsZShyZXNvbHZlZCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZW5xdWV1ZUZpbGUocmVzb2x2ZWQpO1xuICB9O1xuXG4gIGNvbnN0IHByb2Nlc3NGaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBxdWV1ZWRGaWxlcy5kZWxldGUoZmlsZVBhdGgpO1xuICAgIGlmIChwcm9jZXNzZWRGaWxlcy5oYXMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHByb2Nlc3NlZEZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZFNvdXJjZShmaWxlUGF0aCk7XG4gICAgaWYgKHNvdXJjZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgIGlmIChwYXR0ZXJucy5oYXNVc2VXb3JrZmxvdykge1xuICAgICAgc3RhdGUuZGlzY292ZXJlZFdvcmtmbG93cy5hZGQoZmlsZVBhdGgpO1xuICAgIH1cbiAgICBpZiAocGF0dGVybnMuaGFzVXNlU3RlcCkge1xuICAgICAgc3RhdGUuZGlzY292ZXJlZFN0ZXBzLmFkZChmaWxlUGF0aCk7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJucy5oYXNTZXJkZSAmJiBoYXNMaWtlbHlTZXJkZUNsYXNzKHNvdXJjZSkpIHtcbiAgICAgIHN0YXRlLmRpc2NvdmVyZWRTZXJkZUZpbGVzLmFkZChmaWxlUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgZm9yY2VGb2xsb3dJbXBvcnRzID0gcGF0dGVybnMuaGFzRGlyZWN0aXZlIHx8IHBhdHRlcm5zLmhhc1NlcmRlO1xuICAgIGlmIChcbiAgICAgICFmb3JjZUZvbGxvd0ltcG9ydHMgJiZcbiAgICAgICEoYXdhaXQgc2hvdWxkRm9sbG93SW1wb3J0c0Zyb21GaWxlKGZpbGVQYXRoLCBmYWxzZSkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3BlY2lmaWVycyA9IGV4dHJhY3RJbXBvcnRTcGVjaWZpZXJzKHNvdXJjZSk7XG4gICAgaWYgKHNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBzcGVjaWZpZXJzLm1hcCgoc3BlY2lmaWVyKSA9PlxuICAgICAgICBwcm9jZXNzSW1wb3J0U3BlY2lmaWVyKGZpbGVQYXRoLCBzcGVjaWZpZXIsIGZvcmNlRm9sbG93SW1wb3J0cylcbiAgICAgIClcbiAgICApO1xuICB9O1xuXG4gIGZvciAoY29uc3QgZW50cnlQb2ludCBvZiBlbnRyeVBvaW50cykge1xuICAgIGVucXVldWVGaWxlKGVudHJ5UG9pbnQpO1xuICB9XG5cbiAgY29uc3QgaW5GbGlnaHQgPSBuZXcgU2V0PFByb21pc2U8dm9pZD4+KCk7XG4gIGNvbnN0IHNjaGVkdWxlRmlsZXMgPSAoKSA9PiB7XG4gICAgd2hpbGUgKFxuICAgICAgcXVldWUubGVuZ3RoID4gMCAmJlxuICAgICAgaW5GbGlnaHQuc2l6ZSA8IEZBU1RfRElTQ09WRVJZX0ZJTEVfQ09OQ1VSUkVOQ1lcbiAgICApIHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcXVldWUuc2hpZnQoKTtcbiAgICAgIGlmICghZmlsZVBhdGgpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSBwcm9jZXNzRmlsZShmaWxlUGF0aCkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGluRmxpZ2h0LmRlbGV0ZShwcm9taXNlKTtcbiAgICAgIH0pO1xuICAgICAgaW5GbGlnaHQuYWRkKHByb21pc2UpO1xuICAgIH1cbiAgfTtcblxuICBzY2hlZHVsZUZpbGVzKCk7XG4gIHdoaWxlIChpbkZsaWdodC5zaXplID4gMCkge1xuICAgIGF3YWl0IFByb21pc2UucmFjZShpbkZsaWdodCk7XG4gICAgc2NoZWR1bGVGaWxlcygpO1xuICB9XG59XG4iXX0=