@workflow/builders 5.0.0-beta.4 → 5.0.0-beta.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/README.md +26 -0
  2. package/dist/apply-swc-transform.d.ts +7 -2
  3. package/dist/apply-swc-transform.d.ts.map +1 -1
  4. package/dist/apply-swc-transform.js +10 -4
  5. package/dist/base-builder-logging.test.d.ts +2 -0
  6. package/dist/base-builder-logging.test.d.ts.map +1 -0
  7. package/dist/base-builder-logging.test.js +99 -0
  8. package/dist/base-builder.d.ts +132 -13
  9. package/dist/base-builder.d.ts.map +1 -1
  10. package/dist/base-builder.js +788 -92
  11. package/dist/build-queue.js +1 -1
  12. package/dist/config-helpers.d.ts +4 -1
  13. package/dist/config-helpers.d.ts.map +1 -1
  14. package/dist/config-helpers.js +63 -1
  15. package/dist/config-helpers.test.d.ts +2 -0
  16. package/dist/config-helpers.test.d.ts.map +1 -0
  17. package/dist/config-helpers.test.js +17 -0
  18. package/dist/constants.d.ts +66 -5
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +106 -19
  21. package/dist/constants.test.d.ts +2 -0
  22. package/dist/constants.test.d.ts.map +1 -0
  23. package/dist/constants.test.js +90 -0
  24. package/dist/discover-entries-esbuild-plugin.d.ts +3 -1
  25. package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
  26. package/dist/discover-entries-esbuild-plugin.js +24 -4
  27. package/dist/discover-entries-esbuild-plugin.test.js +1 -1
  28. package/dist/esbuild-tsconfig.js +1 -1
  29. package/dist/esbuild-tsconfig.test.js +1 -1
  30. package/dist/external-package-warning.test.d.ts +2 -0
  31. package/dist/external-package-warning.test.d.ts.map +1 -0
  32. package/dist/external-package-warning.test.js +219 -0
  33. package/dist/fast-discovery.d.ts +29 -0
  34. package/dist/fast-discovery.d.ts.map +1 -0
  35. package/dist/fast-discovery.js +771 -0
  36. package/dist/fast-discovery.test.d.ts +2 -0
  37. package/dist/fast-discovery.test.d.ts.map +1 -0
  38. package/dist/fast-discovery.test.js +453 -0
  39. package/dist/get-input-files.test.js +34 -2
  40. package/dist/index.d.ts +7 -4
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +8 -5
  43. package/dist/module-specifier.d.ts +20 -2
  44. package/dist/module-specifier.d.ts.map +1 -1
  45. package/dist/module-specifier.js +92 -17
  46. package/dist/module-specifier.test.js +45 -3
  47. package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
  48. package/dist/node-module-esbuild-plugin.js +73 -23
  49. package/dist/node-module-esbuild-plugin.test.js +97 -1
  50. package/dist/optional-otel-api.d.ts +14 -0
  51. package/dist/optional-otel-api.d.ts.map +1 -0
  52. package/dist/optional-otel-api.js +14 -0
  53. package/dist/optional-typescript-alias.d.ts +2 -0
  54. package/dist/optional-typescript-alias.d.ts.map +1 -0
  55. package/dist/optional-typescript-alias.js +3 -0
  56. package/dist/optional-typescript.d.ts +3 -0
  57. package/dist/optional-typescript.d.ts.map +1 -0
  58. package/dist/optional-typescript.js +9 -0
  59. package/dist/optional-ws-native.d.ts +30 -0
  60. package/dist/optional-ws-native.d.ts.map +1 -0
  61. package/dist/optional-ws-native.js +33 -0
  62. package/dist/pseudo-package-esbuild-plugin.js +1 -1
  63. package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
  64. package/dist/request-converter.js +1 -1
  65. package/dist/resolve-sourcemap.test.d.ts +2 -0
  66. package/dist/resolve-sourcemap.test.d.ts.map +1 -0
  67. package/dist/resolve-sourcemap.test.js +194 -0
  68. package/dist/serde-checker.js +1 -1
  69. package/dist/standalone.d.ts +0 -3
  70. package/dist/standalone.d.ts.map +1 -1
  71. package/dist/standalone.js +17 -41
  72. package/dist/step-source-registration.test.d.ts +2 -0
  73. package/dist/step-source-registration.test.d.ts.map +1 -0
  74. package/dist/step-source-registration.test.js +82 -0
  75. package/dist/swc-esbuild-plugin.d.ts +26 -0
  76. package/dist/swc-esbuild-plugin.d.ts.map +1 -1
  77. package/dist/swc-esbuild-plugin.js +124 -14
  78. package/dist/swc-esbuild-plugin.test.js +475 -6
  79. package/dist/transform-utils.d.ts.map +1 -1
  80. package/dist/transform-utils.js +45 -6
  81. package/dist/transform-utils.test.js +78 -6
  82. package/dist/types.d.ts +73 -2
  83. package/dist/types.d.ts.map +1 -1
  84. package/dist/types.js +1 -1
  85. package/dist/vercel-build-output-api.d.ts +0 -2
  86. package/dist/vercel-build-output-api.d.ts.map +1 -1
  87. package/dist/vercel-build-output-api.js +37 -60
  88. package/dist/workflow-alias.js +1 -1
  89. package/dist/workflow-alias.test.js +2 -2
  90. package/dist/workflows-extractor.js +8 -3
  91. package/dist/workflows-extractor.test.d.ts +2 -0
  92. package/dist/workflows-extractor.test.d.ts.map +1 -0
  93. package/dist/workflows-extractor.test.js +70 -0
  94. package/package.json +8 -7
  95. package/dist/apply-swc-transform.js.map +0 -1
  96. package/dist/base-builder.js.map +0 -1
  97. package/dist/build-queue.js.map +0 -1
  98. package/dist/config-helpers.js.map +0 -1
  99. package/dist/constants.js.map +0 -1
  100. package/dist/discover-entries-esbuild-plugin.js.map +0 -1
  101. package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
  102. package/dist/esbuild-tsconfig.js.map +0 -1
  103. package/dist/esbuild-tsconfig.test.js.map +0 -1
  104. package/dist/get-input-files.test.js.map +0 -1
  105. package/dist/index.js.map +0 -1
  106. package/dist/module-specifier.js.map +0 -1
  107. package/dist/module-specifier.test.js.map +0 -1
  108. package/dist/node-module-esbuild-plugin.js.map +0 -1
  109. package/dist/node-module-esbuild-plugin.test.js.map +0 -1
  110. package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
  111. package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
  112. package/dist/request-converter.js.map +0 -1
  113. package/dist/serde-checker.js.map +0 -1
  114. package/dist/standalone.js.map +0 -1
  115. package/dist/swc-esbuild-plugin.js.map +0 -1
  116. package/dist/swc-esbuild-plugin.test.js.map +0 -1
  117. package/dist/transform-utils.js.map +0 -1
  118. package/dist/transform-utils.test.js.map +0 -1
  119. package/dist/types.js.map +0 -1
  120. package/dist/vercel-build-output-api.js.map +0 -1
  121. package/dist/workflow-alias.js.map +0 -1
  122. package/dist/workflow-alias.test.js.map +0 -1
  123. package/dist/workflows-extractor.js.map +0 -1
@@ -9,6 +9,7 @@ const { applySwcTransformMock } = vi.hoisted(() => ({
9
9
  vi.mock('./apply-swc-transform.js', () => ({
10
10
  applySwcTransform: applySwcTransformMock,
11
11
  }));
12
+ import { createDiscoverEntriesPlugin, importParents, } from './discover-entries-esbuild-plugin.js';
12
13
  import { createSwcPlugin } from './swc-esbuild-plugin.js';
13
14
  const realTmpdir = realpathSync(tmpdir());
14
15
  function writeFile(path, contents = '') {
@@ -19,6 +20,7 @@ describe('createSwcPlugin externalizeNonSteps', () => {
19
20
  let testRoot;
20
21
  beforeEach(() => {
21
22
  testRoot = mkdtempSync(join(realTmpdir, 'workflow-swc-plugin-'));
23
+ importParents.clear();
22
24
  applySwcTransformMock.mockReset();
23
25
  applySwcTransformMock.mockImplementation(async (_filename, source) => ({
24
26
  code: source,
@@ -26,8 +28,180 @@ describe('createSwcPlugin externalizeNonSteps', () => {
26
28
  }));
27
29
  });
28
30
  afterEach(() => {
31
+ importParents.clear();
29
32
  rmSync(testRoot, { recursive: true, force: true });
30
33
  });
34
+ it('reports authoritative transform results to an optional observer', async () => {
35
+ const srcDir = join(testRoot, 'src');
36
+ const stepFile = join(srcDir, 'step.ts');
37
+ const source = 'export const value = 42;';
38
+ const workflowManifest = {
39
+ steps: {
40
+ 'src/step.ts': {
41
+ value: {
42
+ stepId: 'step//src/step//value',
43
+ },
44
+ },
45
+ },
46
+ };
47
+ const onAfterTransform = vi.fn();
48
+ writeFile(stepFile, source);
49
+ applySwcTransformMock.mockResolvedValue({
50
+ code: `${source}\n/* transformed */`,
51
+ workflowManifest,
52
+ });
53
+ await esbuild.build({
54
+ entryPoints: [stepFile],
55
+ absWorkingDir: testRoot,
56
+ outdir: join(testRoot, 'out'),
57
+ bundle: true,
58
+ write: false,
59
+ plugins: [
60
+ createSwcPlugin({
61
+ mode: 'step',
62
+ entriesToBundle: [stepFile],
63
+ onAfterTransform,
64
+ }),
65
+ ],
66
+ });
67
+ expect(onAfterTransform).toHaveBeenCalledOnce();
68
+ expect(onAfterTransform).toHaveBeenCalledWith({
69
+ mode: 'step',
70
+ filename: 'src/step.ts',
71
+ absolutePath: stepFile,
72
+ source,
73
+ code: `${source}\n/* transformed */`,
74
+ workflowManifest,
75
+ });
76
+ });
77
+ it('awaits asynchronous transform observers', async () => {
78
+ const stepFile = join(testRoot, 'src', 'step.ts');
79
+ let markObserverStarted = () => { };
80
+ let releaseObserver = () => { };
81
+ const observerStarted = new Promise((resolve) => {
82
+ markObserverStarted = resolve;
83
+ });
84
+ const observerBlocked = new Promise((resolve) => {
85
+ releaseObserver = resolve;
86
+ });
87
+ let buildCompleted = false;
88
+ writeFile(stepFile, 'export const value = 42;');
89
+ const build = esbuild.build({
90
+ entryPoints: [stepFile],
91
+ absWorkingDir: testRoot,
92
+ outdir: join(testRoot, 'out'),
93
+ bundle: true,
94
+ write: false,
95
+ plugins: [
96
+ createSwcPlugin({
97
+ mode: 'step',
98
+ entriesToBundle: [stepFile],
99
+ onAfterTransform: async () => {
100
+ markObserverStarted();
101
+ await observerBlocked;
102
+ },
103
+ }),
104
+ ],
105
+ });
106
+ void build.then(() => {
107
+ buildCompleted = true;
108
+ });
109
+ await observerStarted;
110
+ await Promise.resolve();
111
+ expect(buildCompleted).toBe(false);
112
+ releaseObserver();
113
+ await build;
114
+ expect(buildCompleted).toBe(true);
115
+ });
116
+ it('fails the build when a transform observer throws', async () => {
117
+ const stepFile = join(testRoot, 'src', 'step.ts');
118
+ writeFile(stepFile, 'export const value = 42;');
119
+ await expect(esbuild.build({
120
+ entryPoints: [stepFile],
121
+ absWorkingDir: testRoot,
122
+ outdir: join(testRoot, 'out'),
123
+ bundle: true,
124
+ write: false,
125
+ plugins: [
126
+ createSwcPlugin({
127
+ mode: 'step',
128
+ entriesToBundle: [stepFile],
129
+ onAfterTransform: () => {
130
+ throw new Error('transform observer failed');
131
+ },
132
+ }),
133
+ ],
134
+ })).rejects.toThrow(/transform observer failed/);
135
+ });
136
+ it('fails the build when two files emit the same step id', async () => {
137
+ const srcDir = join(testRoot, 'src');
138
+ const firstStepFile = join(srcDir, 'confirmation.ts');
139
+ const secondStepFile = join(srcDir, 'reschedule.ts');
140
+ const onAfterTransform = vi.fn();
141
+ writeFile(firstStepFile, `export const first = true;`);
142
+ writeFile(secondStepFile, `export const second = true;`);
143
+ applySwcTransformMock.mockImplementation(async (filename, source) => ({
144
+ code: source,
145
+ workflowManifest: {
146
+ steps: {
147
+ [filename]: {
148
+ sendMessage: {
149
+ stepId: 'step//shared-package@1.0.0//sendMessage',
150
+ },
151
+ },
152
+ },
153
+ },
154
+ }));
155
+ await expect(esbuild.build({
156
+ entryPoints: [firstStepFile, secondStepFile],
157
+ absWorkingDir: testRoot,
158
+ outdir: join(testRoot, 'out'),
159
+ bundle: true,
160
+ format: 'esm',
161
+ platform: 'node',
162
+ write: false,
163
+ plugins: [
164
+ createSwcPlugin({
165
+ mode: 'step',
166
+ onAfterTransform,
167
+ }),
168
+ ],
169
+ })).rejects.toThrow(/Duplicate workflow step ID/);
170
+ expect(onAfterTransform).toHaveBeenCalledOnce();
171
+ });
172
+ it('fails the build when two files emit the same workflow id', async () => {
173
+ const srcDir = join(testRoot, 'src');
174
+ const firstWorkflowFile = join(srcDir, 'confirmation.ts');
175
+ const secondWorkflowFile = join(srcDir, 'reschedule.ts');
176
+ writeFile(firstWorkflowFile, `export const first = true;`);
177
+ writeFile(secondWorkflowFile, `export const second = true;`);
178
+ applySwcTransformMock.mockImplementation(async (filename, source) => ({
179
+ code: source,
180
+ workflowManifest: {
181
+ workflows: {
182
+ [filename]: {
183
+ sendMessage: {
184
+ workflowId: 'workflow//shared-package@1.0.0//sendMessage',
185
+ },
186
+ },
187
+ },
188
+ },
189
+ }));
190
+ await expect(esbuild.build({
191
+ entryPoints: [firstWorkflowFile, secondWorkflowFile],
192
+ absWorkingDir: testRoot,
193
+ outdir: join(testRoot, 'out'),
194
+ bundle: true,
195
+ format: 'esm',
196
+ platform: 'node',
197
+ write: false,
198
+ plugins: [
199
+ createSwcPlugin({
200
+ mode: 'workflow',
201
+ }),
202
+ ],
203
+ })).rejects.toThrow(/Duplicate workflow ID/);
204
+ });
31
205
  it.each([
32
206
  { inputExt: '.ts', outputExt: '.js' },
33
207
  { inputExt: '.tsx', outputExt: '.js' },
@@ -61,12 +235,16 @@ describe('createSwcPlugin externalizeNonSteps', () => {
61
235
  expect(output).toContain(`/dep${outputExt}`);
62
236
  expect(output).not.toContain(`/dep${inputExt}`);
63
237
  });
64
- it('rewrites path-aliased imports to relative paths', async () => {
238
+ it('bundles path-aliased project-local imports inline', async () => {
239
+ // Aliased project-local files must be bundled inline (not externalized
240
+ // as relative paths) because their source on disk may contain further
241
+ // alias imports that Node's ESM loader cannot resolve at runtime.
242
+ // See packages/builders/src/swc-esbuild-plugin.ts for full reasoning.
65
243
  const outdir = join(testRoot, 'out');
66
244
  const srcDir = join(testRoot, 'src');
67
245
  const libDir = join(srcDir, 'lib');
68
246
  const stepFile = join(srcDir, 'step.ts');
69
- writeFile(join(libDir, 'config.ts'), 'export const config = {};');
247
+ writeFile(join(libDir, 'config.ts'), 'export const config = { value: "hello-from-config" };');
70
248
  writeFile(stepFile, `import { config } from '@/lib/config';\nconsole.log(config);`);
71
249
  const result = await esbuild.build({
72
250
  entryPoints: [stepFile],
@@ -88,8 +266,63 @@ describe('createSwcPlugin externalizeNonSteps', () => {
88
266
  });
89
267
  expect(result.errors).toHaveLength(0);
90
268
  const output = result.outputFiles[0].text;
91
- expect(output).toContain('/lib/config.js');
269
+ // The aliased helper should be bundled inline (its content is in the
270
+ // output), not externalized as a relative path or left as a bare alias.
271
+ expect(output).toContain('hello-from-config');
92
272
  expect(output).not.toContain('@/lib/config');
273
+ expect(output).not.toMatch(/from\s+["'][^"']*\/lib\/config\.(js|ts)["']/);
274
+ });
275
+ it('bundles transitive aliased imports inside aliased helpers (Mux self-referencing package regression)', async () => {
276
+ // Regression test for https://github.com/muxinc/ai/pull/193.
277
+ //
278
+ // A package self-references its own subpath via tsconfig `paths` (e.g.
279
+ // `@my-pkg/lib/foo` → `src/lib/foo.ts`). A step file imports a helper
280
+ // via the alias, and that helper imports another helper via the alias.
281
+ //
282
+ // Previously the helpers were externalized as relative paths, but their
283
+ // source on disk still contained `import "@my-pkg/lib/..."`. At runtime,
284
+ // Node's ESM loader didn't know about tsconfig paths, fell through to
285
+ // the package's `exports` map, and threw `Package subpath ... is not
286
+ // defined by "exports"`.
287
+ //
288
+ // With the fix, aliased project-local files are bundled inline, so
289
+ // their alias imports are resolved at build time.
290
+ const outdir = join(testRoot, 'out');
291
+ const srcDir = join(testRoot, 'src');
292
+ const libDir = join(srcDir, 'lib');
293
+ const stepFile = join(srcDir, 'step.ts');
294
+ writeFile(join(libDir, 'providers.ts'), 'export const providerName = "anthropic";');
295
+ writeFile(join(libDir, 'client-factory.ts'),
296
+ // Helper uses the same alias to reach a sibling — this is the case
297
+ // that broke the Mux build with workflow >= 4.2.0-beta.78.
298
+ `import { providerName } from '@my-pkg/lib/providers';
299
+ export const client = { provider: providerName };`);
300
+ writeFile(stepFile, `import { client } from '@my-pkg/lib/client-factory';\nconsole.log(client);`);
301
+ const result = await esbuild.build({
302
+ entryPoints: [stepFile],
303
+ absWorkingDir: testRoot,
304
+ outdir,
305
+ bundle: true,
306
+ format: 'esm',
307
+ platform: 'node',
308
+ write: false,
309
+ alias: { '@my-pkg': srcDir },
310
+ plugins: [
311
+ createSwcPlugin({
312
+ mode: 'step',
313
+ entriesToBundle: [stepFile],
314
+ outdir,
315
+ rewriteTsExtensions: true,
316
+ }),
317
+ ],
318
+ });
319
+ expect(result.errors).toHaveLength(0);
320
+ const output = result.outputFiles[0].text;
321
+ // Both helpers should be bundled inline — no aliased specifiers should
322
+ // leak into the output, where Node's ESM loader would choke on them.
323
+ expect(output).toContain('anthropic');
324
+ expect(output).not.toContain('@my-pkg/lib/providers');
325
+ expect(output).not.toContain('@my-pkg/lib/client-factory');
93
326
  });
94
327
  it('does not relativize Node.js builtin imports', async () => {
95
328
  const outdir = join(testRoot, 'out');
@@ -150,6 +383,39 @@ describe('createSwcPlugin externalizeNonSteps', () => {
150
383
  expect(output).toContain('hello');
151
384
  expect(output).not.toMatch(/from\s+["'].*node_modules/);
152
385
  });
386
+ it('externalizes nested bare package imports that only resolve from a bundled package', async () => {
387
+ const outdir = join(testRoot, 'out');
388
+ const srcDir = join(testRoot, 'src');
389
+ const stepFile = join(srcDir, 'step.ts');
390
+ const parentPkgDir = join(testRoot, 'node_modules', 'parent-pkg');
391
+ const parentPkgIndex = join(parentPkgDir, 'index.js');
392
+ const nativePkgDir = join(parentPkgDir, 'node_modules', 'optional-native');
393
+ writeFile(join(parentPkgDir, 'package.json'), JSON.stringify({ name: 'parent-pkg', main: 'index.js' }));
394
+ writeFile(parentPkgIndex, `const native = require('optional-native');\nexports.value = native.value;`);
395
+ writeFile(join(nativePkgDir, 'package.json'), JSON.stringify({ name: 'optional-native', main: 'binding.node' }));
396
+ writeFile(join(nativePkgDir, 'binding.node'), '');
397
+ writeFile(stepFile, `import { value } from 'parent-pkg';\nconsole.log(value);`);
398
+ const result = await esbuild.build({
399
+ entryPoints: [stepFile],
400
+ absWorkingDir: testRoot,
401
+ outdir,
402
+ bundle: true,
403
+ format: 'esm',
404
+ platform: 'node',
405
+ write: false,
406
+ plugins: [
407
+ createSwcPlugin({
408
+ mode: 'step',
409
+ entriesToBundle: [stepFile, parentPkgIndex],
410
+ outdir,
411
+ }),
412
+ ],
413
+ });
414
+ expect(result.errors).toHaveLength(0);
415
+ const output = result.outputFiles[0].text;
416
+ expect(output).toContain('optional-native');
417
+ expect(output).not.toContain('binding.node');
418
+ });
153
419
  it.each([
154
420
  '.ts',
155
421
  '.tsx',
@@ -181,6 +447,187 @@ describe('createSwcPlugin externalizeNonSteps', () => {
181
447
  const output = result.outputFiles[0].text;
182
448
  expect(output).toContain(`/dep${inputExt}`);
183
449
  });
450
+ it('bundles transitive local TypeScript dependencies with extensionless imports', async () => {
451
+ const outdir = join(testRoot, 'out');
452
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
453
+ const constantsFile = join(testRoot, 'shared', 'constants.ts');
454
+ const helpersFile = join(testRoot, 'shared', 'helpers.ts');
455
+ writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
456
+ writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
457
+ writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
458
+ const state = {
459
+ discoveredSteps: new Set(),
460
+ discoveredWorkflows: new Set(),
461
+ discoveredSerdeFiles: new Set(),
462
+ };
463
+ await esbuild.build({
464
+ entryPoints: [stepFile],
465
+ absWorkingDir: testRoot,
466
+ bundle: true,
467
+ format: 'esm',
468
+ platform: 'node',
469
+ write: false,
470
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
471
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
472
+ });
473
+ const result = await esbuild.build({
474
+ entryPoints: [stepFile],
475
+ absWorkingDir: testRoot,
476
+ outdir,
477
+ bundle: true,
478
+ format: 'esm',
479
+ platform: 'node',
480
+ write: false,
481
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
482
+ plugins: [
483
+ createSwcPlugin({
484
+ mode: 'step',
485
+ entriesToBundle: [stepFile],
486
+ outdir,
487
+ bundleTransitiveLocalStepDependencies: true,
488
+ }),
489
+ ],
490
+ });
491
+ expect(result.errors).toHaveLength(0);
492
+ const output = result.outputFiles[0].text;
493
+ expect(output).toContain('from-helper');
494
+ expect(output).not.toMatch(/from\s+["'][^"']*shared\/constants/);
495
+ expect(output).not.toMatch(/from\s+["'][^"']*shared\/helpers/);
496
+ });
497
+ it('externalizes transitive local TypeScript dependencies by default', async () => {
498
+ const outdir = join(testRoot, 'out');
499
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
500
+ const constantsFile = join(testRoot, 'shared', 'constants.ts');
501
+ const helpersFile = join(testRoot, 'shared', 'helpers.ts');
502
+ writeFile(helpersFile, `export const HELPER_VALUE = "from-helper";`);
503
+ writeFile(constantsFile, `import { HELPER_VALUE } from './helpers';\nexport const CATEGORIES = [HELPER_VALUE];`);
504
+ writeFile(stepFile, `import { CATEGORIES } from '../../shared/constants';\nexport async function myStep() {\n 'use step';\n return CATEGORIES[0];\n}`);
505
+ const state = {
506
+ discoveredSteps: new Set(),
507
+ discoveredWorkflows: new Set(),
508
+ discoveredSerdeFiles: new Set(),
509
+ };
510
+ await esbuild.build({
511
+ entryPoints: [stepFile],
512
+ absWorkingDir: testRoot,
513
+ bundle: true,
514
+ format: 'esm',
515
+ platform: 'node',
516
+ write: false,
517
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
518
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
519
+ });
520
+ const result = await esbuild.build({
521
+ entryPoints: [stepFile],
522
+ absWorkingDir: testRoot,
523
+ outdir,
524
+ bundle: true,
525
+ format: 'esm',
526
+ platform: 'node',
527
+ write: false,
528
+ resolveExtensions: ['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs'],
529
+ plugins: [
530
+ createSwcPlugin({
531
+ mode: 'step',
532
+ entriesToBundle: [stepFile],
533
+ outdir,
534
+ }),
535
+ ],
536
+ });
537
+ expect(result.errors).toHaveLength(0);
538
+ const output = result.outputFiles[0].text;
539
+ expect(output).not.toContain('from-helper');
540
+ expect(output).toMatch(/from\s+["'][^"']*shared\/constants\.ts["']/);
541
+ });
542
+ it('keeps ordinary package dependencies external when reachable from a bundled step', async () => {
543
+ const outdir = join(testRoot, 'out');
544
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
545
+ const pkgDir = join(testRoot, 'node_modules', 'plain-pkg');
546
+ const pkgIndex = join(pkgDir, 'index.js');
547
+ writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'plain-pkg', main: 'index.js' }));
548
+ writeFile(pkgIndex, `export const value = "from-package";`);
549
+ writeFile(stepFile, `import { value } from 'plain-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
550
+ const state = {
551
+ discoveredSteps: new Set(),
552
+ discoveredWorkflows: new Set(),
553
+ discoveredSerdeFiles: new Set(),
554
+ };
555
+ await esbuild.build({
556
+ entryPoints: [stepFile],
557
+ absWorkingDir: testRoot,
558
+ bundle: true,
559
+ format: 'esm',
560
+ platform: 'node',
561
+ write: false,
562
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
563
+ });
564
+ const result = await esbuild.build({
565
+ entryPoints: [stepFile],
566
+ absWorkingDir: testRoot,
567
+ outdir,
568
+ bundle: true,
569
+ format: 'esm',
570
+ platform: 'node',
571
+ write: false,
572
+ plugins: [
573
+ createSwcPlugin({
574
+ mode: 'step',
575
+ entriesToBundle: [stepFile],
576
+ outdir,
577
+ bundleTransitiveLocalStepDependencies: true,
578
+ }),
579
+ ],
580
+ });
581
+ expect(result.errors).toHaveLength(0);
582
+ const output = result.outputFiles[0].text;
583
+ expect(output).toMatch(/from\s+["']plain-pkg["']/);
584
+ expect(output).not.toContain('from-package');
585
+ });
586
+ it('bundles package parents when they lead to discovered workflow-related entries', async () => {
587
+ const outdir = join(testRoot, 'out');
588
+ const stepFile = join(testRoot, 'server', 'workflows', 'my-workflow.ts');
589
+ const pkgDir = join(testRoot, 'node_modules', 'workflow-pkg');
590
+ const pkgIndex = join(pkgDir, 'index.js');
591
+ const pkgSerde = join(pkgDir, 'serde.js');
592
+ writeFile(join(pkgDir, 'package.json'), JSON.stringify({ name: 'workflow-pkg', main: 'index.js' }));
593
+ writeFile(pkgSerde, `export const value = "from-serde";`);
594
+ writeFile(pkgIndex, `export { value } from './serde.js';`);
595
+ writeFile(stepFile, `import { value } from 'workflow-pkg';\nexport async function myStep() {\n 'use step';\n return value;\n}`);
596
+ const state = {
597
+ discoveredSteps: new Set(),
598
+ discoveredWorkflows: new Set(),
599
+ discoveredSerdeFiles: new Set(),
600
+ };
601
+ await esbuild.build({
602
+ entryPoints: [stepFile],
603
+ absWorkingDir: testRoot,
604
+ bundle: true,
605
+ format: 'esm',
606
+ platform: 'node',
607
+ write: false,
608
+ plugins: [createDiscoverEntriesPlugin(state, testRoot)],
609
+ });
610
+ const result = await esbuild.build({
611
+ entryPoints: [stepFile],
612
+ absWorkingDir: testRoot,
613
+ outdir,
614
+ bundle: true,
615
+ format: 'esm',
616
+ platform: 'node',
617
+ write: false,
618
+ plugins: [
619
+ createSwcPlugin({
620
+ mode: 'step',
621
+ entriesToBundle: [stepFile, pkgSerde],
622
+ outdir,
623
+ }),
624
+ ],
625
+ });
626
+ expect(result.errors).toHaveLength(0);
627
+ const output = result.outputFiles[0].text;
628
+ expect(output).toContain('from-serde');
629
+ expect(output).not.toMatch(/from\s+["']workflow-pkg["']/);
630
+ });
184
631
  });
185
632
  describe('createSwcPlugin sideEffectEntries', () => {
186
633
  let testRoot;
@@ -468,7 +915,29 @@ describe('createSwcPlugin projectRoot', () => {
468
915
  ],
469
916
  });
470
917
  expect(result.errors).toHaveLength(0);
471
- expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.appRoot);
918
+ expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.appRoot, fixture.appRoot);
919
+ });
920
+ it('passes an explicit moduleSpecifierRoot separately from projectRoot', async () => {
921
+ const fixture = setupFixture();
922
+ const tracingRoot = testRoot;
923
+ const result = await esbuild.build({
924
+ entryPoints: [fixture.workflowFile],
925
+ absWorkingDir: fixture.packageRoot,
926
+ bundle: true,
927
+ format: 'esm',
928
+ platform: 'node',
929
+ write: false,
930
+ plugins: [
931
+ createSwcPlugin({
932
+ mode: 'workflow',
933
+ projectRoot: tracingRoot,
934
+ moduleSpecifierRoot: fixture.appRoot,
935
+ workflowManifest: {},
936
+ }),
937
+ ],
938
+ });
939
+ expect(result.errors).toHaveLength(0);
940
+ expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, tracingRoot, fixture.appRoot);
472
941
  });
473
942
  it('defaults the transform projectRoot to absWorkingDir', async () => {
474
943
  const fixture = setupFixture();
@@ -487,7 +956,7 @@ describe('createSwcPlugin projectRoot', () => {
487
956
  ],
488
957
  });
489
958
  expect(result.errors).toHaveLength(0);
490
- expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.packageRoot);
959
+ expect(applySwcTransformMock).toHaveBeenCalledWith('src/internal/message/workflow/handle-message.ts', expect.stringContaining('"use workflow"'), 'workflow', fixture.workflowFile, fixture.packageRoot, fixture.packageRoot);
491
960
  });
492
961
  });
493
- //# sourceMappingURL=swc-esbuild-plugin.test.js.map
962
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLWVzYnVpbGQtcGx1Z2luLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxXQUFXLEVBQ1gsWUFBWSxFQUNaLE1BQU0sRUFDTixhQUFhLEdBQ2QsTUFBTSxTQUFTLENBQUM7QUFDakIsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFekUsTUFBTSxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELHFCQUFxQixFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Q0FDL0IsQ0FBQyxDQUFDLENBQUM7QUFFSixFQUFFLENBQUMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekMsaUJBQWlCLEVBQUUscUJBQXFCO0NBQ3pDLENBQUMsQ0FBQyxDQUFDO0FBRUosT0FBTyxFQUNMLDJCQUEyQixFQUMzQixhQUFhLEdBQ2QsTUFBTSxzQ0FBc0MsQ0FBQztBQUM5QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFMUQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFMUMsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLFFBQVEsR0FBRyxFQUFFO0lBQzVDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFD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dCI6WyJpbXBvcnQge1xuICBta2RpclN5bmMsXG4gIG1rZHRlbXBTeW5jLFxuICByZWFscGF0aFN5bmMsXG4gIHJtU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0ICogYXMgZXNidWlsZCBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB7IGFmdGVyRWFjaCwgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcblxuY29uc3QgeyBhcHBseVN3Y1RyYW5zZm9ybU1vY2sgfSA9IHZpLmhvaXN0ZWQoKCkgPT4gKHtcbiAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrOiB2aS5mbigpLFxufSkpO1xuXG52aS5tb2NrKCcuL2FwcGx5LXN3Yy10cmFuc2Zvcm0uanMnLCAoKSA9PiAoe1xuICBhcHBseVN3Y1RyYW5zZm9ybTogYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLFxufSkpO1xuXG5pbXBvcnQge1xuICBjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4sXG4gIGltcG9ydFBhcmVudHMsXG59IGZyb20gJy4vZGlzY292ZXItZW50cmllcy1lc2J1aWxkLXBsdWdpbi5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTd2NQbHVnaW4gfSBmcm9tICcuL3N3Yy1lc2J1aWxkLXBsdWdpbi5qcyc7XG5cbmNvbnN0IHJlYWxUbXBkaXIgPSByZWFscGF0aFN5bmModG1wZGlyKCkpO1xuXG5mdW5jdGlvbiB3cml0ZUZpbGUocGF0aDogc3RyaW5nLCBjb250ZW50cyA9ICcnKTogdm9pZCB7XG4gIG1rZGlyU3luYyhkaXJuYW1lKHBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhwYXRoLCBjb250ZW50cywgJ3V0Zi04Jyk7XG59XG5cbmRlc2NyaWJlKCdjcmVhdGVTd2NQbHVnaW4gZXh0ZXJuYWxpemVOb25TdGVwcycsICgpID0+IHtcbiAgbGV0IHRlc3RSb290OiBzdHJpbmc7XG5cbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgdGVzdFJvb3QgPSBta2R0ZW1wU3luYyhqb2luKHJlYWxUbXBkaXIsICd3b3JrZmxvdy1zd2MtcGx1Z2luLScpKTtcbiAgICBpbXBvcnRQYXJlbnRzLmNsZWFyKCk7XG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tSZXNldCgpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrSW1wbGVtZW50YXRpb24oXG4gICAgICBhc3luYyAoX2ZpbGVuYW1lOiBzdHJpbmcsIHNvdXJjZTogc3RyaW5nKSA9PiAoe1xuICAgICAgICBjb2RlOiBzb3VyY2UsXG4gICAgICAgIHdvcmtmbG93TWFuaWZlc3Q6IHt9LFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcblxuICBhZnRlckVhY2goKCkgPT4ge1xuICAgIGltcG9ydFBhcmVudHMuY2xlYXIoKTtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgaXQoJ3JlcG9ydHMgYXV0aG9yaXRhdGl2ZSB0cmFuc2Zvcm0gcmVzdWx0cyB0byBhbiBvcHRpb25hbCBvYnNlcnZlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcbiAgICBjb25zdCBzb3VyY2UgPSAnZXhwb3J0IGNvbnN0IHZhbHVlID0gNDI7JztcbiAgICBjb25zdCB3b3JrZmxvd01hbmlmZXN0ID0ge1xuICAgICAgc3RlcHM6IHtcbiAgICAgICAgJ3NyYy9zdGVwLnRzJzoge1xuICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICBzdGVwSWQ6ICdzdGVwLy9zcmMvc3RlcC8vdmFsdWUnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gICAgY29uc3Qgb25BZnRlclRyYW5zZm9ybSA9IHZpLmZuKCk7XG5cbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIHNvdXJjZSk7XG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICAgIGNvZGU6IGAke3NvdXJjZX1cXG4vKiB0cmFuc2Zvcm1lZCAqL2AsXG4gICAgICB3b3JrZmxvd01hbmlmZXN0LFxuICAgIH0pO1xuXG4gICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgb3V0ZGlyOiBqb2luKHRlc3RSb290LCAnb3V0JyksXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvbkFmdGVyVHJhbnNmb3JtLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3Qob25BZnRlclRyYW5zZm9ybSkudG9IYXZlQmVlbkNhbGxlZE9uY2UoKTtcbiAgICBleHBlY3Qob25BZnRlclRyYW5zZm9ybSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgZmlsZW5hbWU6ICdzcmMvc3RlcC50cycsXG4gICAgICBhYnNvbHV0ZVBhdGg6IHN0ZXBGaWxlLFxuICAgICAgc291cmNlLFxuICAgICAgY29kZTogYCR7c291cmNlfVxcbi8qIHRyYW5zZm9ybWVkICovYCxcbiAgICAgIHdvcmtmbG93TWFuaWZlc3QsXG4gICAgfSk7XG4gIH0pO1xuXG4gIGl0KCdhd2FpdHMgYXN5bmNocm9ub3VzIHRyYW5zZm9ybSBvYnNlcnZlcnMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc3JjJywgJ3N0ZXAudHMnKTtcbiAgICBsZXQgbWFya09ic2VydmVyU3RhcnRlZDogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGxldCByZWxlYXNlT2JzZXJ2ZXI6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcbiAgICBjb25zdCBvYnNlcnZlclN0YXJ0ZWQgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgbWFya09ic2VydmVyU3RhcnRlZCA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgY29uc3Qgb2JzZXJ2ZXJCbG9ja2VkID0gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIHJlbGVhc2VPYnNlcnZlciA9IHJlc29sdmU7XG4gICAgfSk7XG4gICAgbGV0IGJ1aWxkQ29tcGxldGVkID0gZmFsc2U7XG5cbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsICdleHBvcnQgY29uc3QgdmFsdWUgPSA0MjsnKTtcblxuICAgIGNvbnN0IGJ1aWxkID0gZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgb3V0ZGlyOiBqb2luKHRlc3RSb290LCAnb3V0JyksXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvbkFmdGVyVHJhbnNmb3JtOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBtYXJrT2JzZXJ2ZXJTdGFydGVkKCk7XG4gICAgICAgICAgICBhd2FpdCBvYnNlcnZlckJsb2NrZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuICAgIHZvaWQgYnVpbGQudGhlbigoKSA9PiB7XG4gICAgICBidWlsZENvbXBsZXRlZCA9IHRydWU7XG4gICAgfSk7XG5cbiAgICBhd2FpdCBvYnNlcnZlclN0YXJ0ZWQ7XG4gICAgYXdhaXQgUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgZXhwZWN0KGJ1aWxkQ29tcGxldGVkKS50b0JlKGZhbHNlKTtcblxuICAgIHJlbGVhc2VPYnNlcnZlcigpO1xuICAgIGF3YWl0IGJ1aWxkO1xuICAgIGV4cGVjdChidWlsZENvbXBsZXRlZCkudG9CZSh0cnVlKTtcbiAgfSk7XG5cbiAgaXQoJ2ZhaWxzIHRoZSBidWlsZCB3aGVuIGEgdHJhbnNmb3JtIG9ic2VydmVyIHRocm93cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnc3RlcC50cycpO1xuXG4gICAgd3JpdGVGaWxlKHN0ZXBGaWxlLCAnZXhwb3J0IGNvbnN0IHZhbHVlID0gNDI7Jyk7XG5cbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgICBvdXRkaXI6IGpvaW4odGVzdFJvb3QsICdvdXQnKSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgICAgb25BZnRlclRyYW5zZm9ybTogKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYW5zZm9ybSBvYnNlcnZlciBmYWlsZWQnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93KC90cmFuc2Zvcm0gb2JzZXJ2ZXIgZmFpbGVkLyk7XG4gIH0pO1xuXG4gIGl0KCdmYWlscyB0aGUgYnVpbGQgd2hlbiB0d28gZmlsZXMgZW1pdCB0aGUgc2FtZSBzdGVwIGlkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBmaXJzdFN0ZXBGaWxlID0gam9pbihzcmNEaXIsICdjb25maXJtYXRpb24udHMnKTtcbiAgICBjb25zdCBzZWNvbmRTdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAncmVzY2hlZHVsZS50cycpO1xuICAgIGNvbnN0IG9uQWZ0ZXJUcmFuc2Zvcm0gPSB2aS5mbigpO1xuXG4gICAgd3JpdGVGaWxlKGZpcnN0U3RlcEZpbGUsIGBleHBvcnQgY29uc3QgZmlyc3QgPSB0cnVlO2ApO1xuICAgIHdyaXRlRmlsZShzZWNvbmRTdGVwRmlsZSwgYGV4cG9ydCBjb25zdCBzZWNvbmQgPSB0cnVlO2ApO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7XG4gICAgICAgICAgc3RlcHM6IHtcbiAgICAgICAgICAgIFtmaWxlbmFtZV06IHtcbiAgICAgICAgICAgICAgc2VuZE1lc3NhZ2U6IHtcbiAgICAgICAgICAgICAgICBzdGVwSWQ6ICdzdGVwLy9zaGFyZWQtcGFja2FnZUAxLjAuMC8vc2VuZE1lc3NhZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZmlyc3RTdGVwRmlsZSwgc2Vjb25kU3RlcEZpbGVdLFxuICAgICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgb3V0ZGlyOiBqb2luKHRlc3RSb290LCAnb3V0JyksXG4gICAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgICBwbHVnaW5zOiBbXG4gICAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICAgIG9uQWZ0ZXJUcmFuc2Zvcm0sXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICkucmVqZWN0cy50b1Rocm93KC9EdXBsaWNhdGUgd29ya2Zsb3cgc3RlcCBJRC8pO1xuICAgIGV4cGVjdChvbkFmdGVyVHJhbnNmb3JtKS50b0hhdmVCZWVuQ2FsbGVkT25jZSgpO1xuICB9KTtcblxuICBpdCgnZmFpbHMgdGhlIGJ1aWxkIHdoZW4gdHdvIGZpbGVzIGVtaXQgdGhlIHNhbWUgd29ya2Zsb3cgaWQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGZpcnN0V29ya2Zsb3dGaWxlID0gam9pbihzcmNEaXIsICdjb25maXJtYXRpb24udHMnKTtcbiAgICBjb25zdCBzZWNvbmRXb3JrZmxvd0ZpbGUgPSBqb2luKHNyY0RpciwgJ3Jlc2NoZWR1bGUudHMnKTtcblxuICAgIHdyaXRlRmlsZShmaXJzdFdvcmtmbG93RmlsZSwgYGV4cG9ydCBjb25zdCBmaXJzdCA9IHRydWU7YCk7XG4gICAgd3JpdGVGaWxlKHNlY29uZFdvcmtmbG93RmlsZSwgYGV4cG9ydCBjb25zdCBzZWNvbmQgPSB0cnVlO2ApO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7XG4gICAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgICBbZmlsZW5hbWVdOiB7XG4gICAgICAgICAgICAgIHNlbmRNZXNzYWdlOiB7XG4gICAgICAgICAgICAgICAgd29ya2Zsb3dJZDogJ3dvcmtmbG93Ly9zaGFyZWQtcGFja2FnZUAxLjAuMC8vc2VuZE1lc3NhZ2UnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSlcbiAgICApO1xuXG4gICAgYXdhaXQgZXhwZWN0KFxuICAgICAgZXNidWlsZC5idWlsZCh7XG4gICAgICAgIGVudHJ5UG9pbnRzOiBbZmlyc3RXb3JrZmxvd0ZpbGUsIHNlY29uZFdvcmtmbG93RmlsZV0sXG4gICAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgICBvdXRkaXI6IGpvaW4odGVzdFJvb3QsICdvdXQnKSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgICB3cml0ZTogZmFsc2UsXG4gICAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgICAgbW9kZTogJ3dvcmtmbG93JyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0pXG4gICAgKS5yZWplY3RzLnRvVGhyb3coL0R1cGxpY2F0ZSB3b3JrZmxvdyBJRC8pO1xuICB9KTtcblxuICBpdC5lYWNoKFtcbiAgICB7IGlucHV0RXh0OiAnLnRzJywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcudHN4Jywgb3V0cHV0RXh0OiAnLmpzJyB9LFxuICAgIHsgaW5wdXRFeHQ6ICcubXRzJywgb3V0cHV0RXh0OiAnLm1qcycgfSxcbiAgICB7IGlucHV0RXh0OiAnLmN0cycsIG91dHB1dEV4dDogJy5janMnIH0sXG4gIF0pKCdyZXdyaXRlcyBleHRlcm5hbGl6ZWQgJGlucHV0RXh0IGltcG9ydHMgdG8gJG91dHB1dEV4dCB3aGVuIHJld3JpdGVUc0V4dGVuc2lvbnMgaXMgZW5hYmxlZCcsIGFzeW5jICh7XG4gICAgaW5wdXRFeHQsXG4gICAgb3V0cHV0RXh0LFxuICB9KSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4oc3JjRGlyLCBgZGVwJHtpbnB1dEV4dH1gKSwgJ2V4cG9ydCBjb25zdCBkZXAgPSB7fTsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBkZXAgfSBmcm9tICcuL2RlcCc7XFxuY29uc29sZS5sb2coZGVwKTtgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIHJld3JpdGVUc0V4dGVuc2lvbnM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKGAvZGVwJHtvdXRwdXRFeHR9YCk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbihgL2RlcCR7aW5wdXRFeHR9YCk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhdGgtYWxpYXNlZCBwcm9qZWN0LWxvY2FsIGltcG9ydHMgaW5saW5lJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBtdXN0IGJlIGJ1bmRsZWQgaW5saW5lIChub3QgZXh0ZXJuYWxpemVkXG4gICAgLy8gYXMgcmVsYXRpdmUgcGF0aHMpIGJlY2F1c2UgdGhlaXIgc291cmNlIG9uIGRpc2sgbWF5IGNvbnRhaW4gZnVydGhlclxuICAgIC8vIGFsaWFzIGltcG9ydHMgdGhhdCBOb2RlJ3MgRVNNIGxvYWRlciBjYW5ub3QgcmVzb2x2ZSBhdCBydW50aW1lLlxuICAgIC8vIFNlZSBwYWNrYWdlcy9idWlsZGVycy9zcmMvc3djLWVzYnVpbGQtcGx1Z2luLnRzIGZvciBmdWxsIHJlYXNvbmluZy5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAnY29uZmlnLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IGNvbmZpZyA9IHsgdmFsdWU6IFwiaGVsbG8tZnJvbS1jb25maWdcIiB9OydcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IGNvbmZpZyB9IGZyb20gJ0AvbGliL2NvbmZpZyc7XFxuY29uc29sZS5sb2coY29uZmlnKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgYWxpYXM6IHsgJ0AnOiBzcmNEaXIgfSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgICByZXdyaXRlVHNFeHRlbnNpb25zOiB0cnVlLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSBhbGlhc2VkIGhlbHBlciBzaG91bGQgYmUgYnVuZGxlZCBpbmxpbmUgKGl0cyBjb250ZW50IGlzIGluIHRoZVxuICAgIC8vIG91dHB1dCksIG5vdCBleHRlcm5hbGl6ZWQgYXMgYSByZWxhdGl2ZSBwYXRoIG9yIGxlZnQgYXMgYSBiYXJlIGFsaWFzLlxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignaGVsbG8tZnJvbS1jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAL2xpYi9jb25maWcnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpcXC9saWJcXC9jb25maWdcXC4oanN8dHMpW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2J1bmRsZXMgdHJhbnNpdGl2ZSBhbGlhc2VkIGltcG9ydHMgaW5zaWRlIGFsaWFzZWQgaGVscGVycyAoTXV4IHNlbGYtcmVmZXJlbmNpbmcgcGFja2FnZSByZWdyZXNzaW9uKScsIGFzeW5jICgpID0+IHtcbiAgICAvLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9tdXhpbmMvYWkvcHVsbC8xOTMuXG4gICAgLy9cbiAgICAvLyBBIHBhY2thZ2Ugc2VsZi1yZWZlcmVuY2VzIGl0cyBvd24gc3VicGF0aCB2aWEgdHNjb25maWcgYHBhdGhzYCAoZS5nLlxuICAgIC8vIGBAbXktcGtnL2xpYi9mb29gIOKGkiBgc3JjL2xpYi9mb28udHNgKS4gQSBzdGVwIGZpbGUgaW1wb3J0cyBhIGhlbHBlclxuICAgIC8vIHZpYSB0aGUgYWxpYXMsIGFuZCB0aGF0IGhlbHBlciBpbXBvcnRzIGFub3RoZXIgaGVscGVyIHZpYSB0aGUgYWxpYXMuXG4gICAgLy9cbiAgICAvLyBQcmV2aW91c2x5IHRoZSBoZWxwZXJzIHdlcmUgZXh0ZXJuYWxpemVkIGFzIHJlbGF0aXZlIHBhdGhzLCBidXQgdGhlaXJcbiAgICAvLyBzb3VyY2Ugb24gZGlzayBzdGlsbCBjb250YWluZWQgYGltcG9ydCBcIkBteS1wa2cvbGliLy4uLlwiYC4gQXQgcnVudGltZSxcbiAgICAvLyBOb2RlJ3MgRVNNIGxvYWRlciBkaWRuJ3Qga25vdyBhYm91dCB0c2NvbmZpZyBwYXRocywgZmVsbCB0aHJvdWdoIHRvXG4gICAgLy8gdGhlIHBhY2thZ2UncyBgZXhwb3J0c2AgbWFwLCBhbmQgdGhyZXcgYFBhY2thZ2Ugc3VicGF0aCAuLi4gaXMgbm90XG4gICAgLy8gZGVmaW5lZCBieSBcImV4cG9ydHNcImAuXG4gICAgLy9cbiAgICAvLyBXaXRoIHRoZSBmaXgsIGFsaWFzZWQgcHJvamVjdC1sb2NhbCBmaWxlcyBhcmUgYnVuZGxlZCBpbmxpbmUsIHNvXG4gICAgLy8gdGhlaXIgYWxpYXMgaW1wb3J0cyBhcmUgcmVzb2x2ZWQgYXQgYnVpbGQgdGltZS5cbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IGxpYkRpciA9IGpvaW4oc3JjRGlyLCAnbGliJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4obGliRGlyLCAncHJvdmlkZXJzLnRzJyksXG4gICAgICAnZXhwb3J0IGNvbnN0IHByb3ZpZGVyTmFtZSA9IFwiYW50aHJvcGljXCI7J1xuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgam9pbihsaWJEaXIsICdjbGllbnQtZmFjdG9yeS50cycpLFxuICAgICAgLy8gSGVscGVyIHVzZXMgdGhlIHNhbWUgYWxpYXMgdG8gcmVhY2ggYSBzaWJsaW5nIOKAlCB0aGlzIGlzIHRoZSBjYXNlXG4gICAgICAvLyB0aGF0IGJyb2tlIHRoZSBNdXggYnVpbGQgd2l0aCB3b3JrZmxvdyA+PSA0LjIuMC1iZXRhLjc4LlxuICAgICAgYGltcG9ydCB7IHByb3ZpZGVyTmFtZSB9IGZyb20gJ0BteS1wa2cvbGliL3Byb3ZpZGVycyc7XG5leHBvcnQgY29uc3QgY2xpZW50ID0geyBwcm92aWRlcjogcHJvdmlkZXJOYW1lIH07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgY2xpZW50IH0gZnJvbSAnQG15LXBrZy9saWIvY2xpZW50LWZhY3RvcnknO1xcbmNvbnNvbGUubG9nKGNsaWVudCk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIGFsaWFzOiB7ICdAbXktcGtnJzogc3JjRGlyIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgcmV3cml0ZVRzRXh0ZW5zaW9uczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBCb3RoIGhlbHBlcnMgc2hvdWxkIGJlIGJ1bmRsZWQgaW5saW5lIOKAlCBubyBhbGlhc2VkIHNwZWNpZmllcnMgc2hvdWxkXG4gICAgLy8gbGVhayBpbnRvIHRoZSBvdXRwdXQsIHdoZXJlIE5vZGUncyBFU00gbG9hZGVyIHdvdWxkIGNob2tlIG9uIHRoZW0uXG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdhbnRocm9waWMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9wcm92aWRlcnMnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdAbXktcGtnL2xpYi9jbGllbnQtZmFjdG9yeScpO1xuICB9KTtcblxuICBpdCgnZG9lcyBub3QgcmVsYXRpdml6ZSBOb2RlLmpzIGJ1aWx0aW4gaW1wb3J0cycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3JjRGlyID0gam9pbih0ZXN0Um9vdCwgJ3NyYycpO1xuICAgIGNvbnN0IHN0ZXBGaWxlID0gam9pbihzcmNEaXIsICdzdGVwLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSAnY3J5cHRvJztcXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcXG5jb25zb2xlLmxvZyhjcmVhdGVIYXNoLCBqb2luKTtgXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIEJ1aWx0aW5zIHNob3VsZCByZW1haW4gYXMgYmFyZSBzcGVjaWZpZXJzLCBub3QgcmVsYXRpdml6ZWQgcGF0aHNcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS50b01hdGNoKC9mcm9tXFxzK1tcIiddbm9kZTpwYXRoW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qY3J5cHRvW1wiJ10vKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9NYXRjaCgvZnJvbVxccytbXCInXVxcLi4qbm9kZTpwYXRoW1wiJ10vKTtcbiAgfSk7XG5cbiAgaXQoJ2RvZXMgbm90IGV4dGVybmFsaXplIGFsaWFzZWQgaW1wb3J0cyB0aGF0IHJlc29sdmUgaW50byBub2RlX21vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgb3V0ZGlyID0gam9pbih0ZXN0Um9vdCwgJ291dCcpO1xuICAgIGNvbnN0IHNyY0RpciA9IGpvaW4odGVzdFJvb3QsICdzcmMnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4oc3JjRGlyLCAnc3RlcC50cycpO1xuICAgIGNvbnN0IG5vZGVNb2R1bGVzRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdzb21lLXBrZycpO1xuXG4gICAgd3JpdGVGaWxlKGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpLCAnZXhwb3J0IGNvbnN0IHBrZyA9IFwiaGVsbG9cIjsnKTtcbiAgICB3cml0ZUZpbGUoc3RlcEZpbGUsIGBpbXBvcnQgeyBwa2cgfSBmcm9tICdAcGtnJztcXG5jb25zb2xlLmxvZyhwa2cpO2ApO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgb3V0ZGlyLFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBhbGlhczogeyAnQHBrZyc6IGpvaW4obm9kZU1vZHVsZXNEaXIsICdpbmRleC5qcycpIH0sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gU2hvdWxkIGJlIGJ1bmRsZWQgKGlubGluZWQpLCBub3QgZXh0ZXJuYWxpemVkIGFzIGEgcmVsYXRpdmUgbm9kZV9tb2R1bGVzIHBhdGhcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2hlbGxvJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ10uKm5vZGVfbW9kdWxlcy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIG5lc3RlZCBiYXJlIHBhY2thZ2UgaW1wb3J0cyB0aGF0IG9ubHkgcmVzb2x2ZSBmcm9tIGEgYnVuZGxlZCBwYWNrYWdlJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgJ3BhcmVudC1wa2cnKTtcbiAgICBjb25zdCBwYXJlbnRQa2dJbmRleCA9IGpvaW4ocGFyZW50UGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICBjb25zdCBuYXRpdmVQa2dEaXIgPSBqb2luKHBhcmVudFBrZ0RpciwgJ25vZGVfbW9kdWxlcycsICdvcHRpb25hbC1uYXRpdmUnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGFyZW50UGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwYXJlbnQtcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgcGFyZW50UGtnSW5kZXgsXG4gICAgICBgY29uc3QgbmF0aXZlID0gcmVxdWlyZSgnb3B0aW9uYWwtbmF0aXZlJyk7XFxuZXhwb3J0cy52YWx1ZSA9IG5hdGl2ZS52YWx1ZTtgXG4gICAgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKG5hdGl2ZVBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnb3B0aW9uYWwtbmF0aXZlJywgbWFpbjogJ2JpbmRpbmcubm9kZScgfSlcbiAgICApO1xuICAgIHdyaXRlRmlsZShqb2luKG5hdGl2ZVBrZ0RpciwgJ2JpbmRpbmcubm9kZScpLCAnJyk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgdmFsdWUgfSBmcm9tICdwYXJlbnQtcGtnJztcXG5jb25zb2xlLmxvZyh2YWx1ZSk7YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBhcmVudFBrZ0luZGV4XSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdvcHRpb25hbC1uYXRpdmUnKTtcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdiaW5kaW5nLm5vZGUnKTtcbiAgfSk7XG5cbiAgaXQuZWFjaChbXG4gICAgJy50cycsXG4gICAgJy50c3gnLFxuICAgICcubXRzJyxcbiAgICAnLmN0cycsXG4gIF0pKCdwcmVzZXJ2ZXMgZXh0ZXJuYWxpemVkICVzIGV4dGVuc2lvbnMgYnkgZGVmYXVsdCcsIGFzeW5jIChpbnB1dEV4dCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzcmNEaXIgPSBqb2luKHRlc3RSb290LCAnc3JjJyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHNyY0RpciwgJ3N0ZXAudHMnKTtcblxuICAgIHdyaXRlRmlsZShqb2luKHNyY0RpciwgYGRlcCR7aW5wdXRFeHR9YCksICdleHBvcnQgY29uc3QgZGVwID0ge307Jyk7XG4gICAgd3JpdGVGaWxlKHN0ZXBGaWxlLCBgaW1wb3J0IHsgZGVwIH0gZnJvbSAnLi9kZXAnO1xcbmNvbnNvbGUubG9nKGRlcCk7YCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGVdLFxuICAgICAgICAgIG91dGRpcixcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oYC9kZXAke2lucHV0RXh0fWApO1xuICB9KTtcblxuICBpdCgnYnVuZGxlcyB0cmFuc2l0aXZlIGxvY2FsIFR5cGVTY3JpcHQgZGVwZW5kZW5jaWVzIHdpdGggZXh0ZW5zaW9ubGVzcyBpbXBvcnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgY29uc3RhbnRzRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzaGFyZWQnLCAnY29uc3RhbnRzLnRzJyk7XG4gICAgY29uc3QgaGVscGVyc0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2hlbHBlcnMudHMnKTtcblxuICAgIHdyaXRlRmlsZShoZWxwZXJzRmlsZSwgYGV4cG9ydCBjb25zdCBIRUxQRVJfVkFMVUUgPSBcImZyb20taGVscGVyXCI7YCk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgY29uc3RhbnRzRmlsZSxcbiAgICAgIGBpbXBvcnQgeyBIRUxQRVJfVkFMVUUgfSBmcm9tICcuL2hlbHBlcnMnO1xcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTID0gW0hFTFBFUl9WQUxVRV07YFxuICAgICk7XG4gICAgd3JpdGVGaWxlKFxuICAgICAgc3RlcEZpbGUsXG4gICAgICBgaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gJy4uLy4uL3NoYXJlZC9jb25zdGFudHMnO1xcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBteVN0ZXAoKSB7XFxuICAndXNlIHN0ZXAnO1xcbiAgcmV0dXJuIENBVEVHT1JJRVNbMF07XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcmVzb2x2ZUV4dGVuc2lvbnM6IFsnLnRzJywgJy50c3gnLCAnLmpzJywgJy5qc3gnLCAnLm1qcycsICcuY2pzJ10sXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3N0ZXAnLFxuICAgICAgICAgIGVudHJpZXNUb0J1bmRsZTogW3N0ZXBGaWxlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgYnVuZGxlVHJhbnNpdGl2ZUxvY2FsU3RlcERlcGVuZGVuY2llczogdHJ1ZSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvY29uc3RhbnRzLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ11bXlwiJ10qc2hhcmVkXFwvaGVscGVycy8pO1xuICB9KTtcblxuICBpdCgnZXh0ZXJuYWxpemVzIHRyYW5zaXRpdmUgbG9jYWwgVHlwZVNjcmlwdCBkZXBlbmRlbmNpZXMgYnkgZGVmYXVsdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IGNvbnN0YW50c0ZpbGUgPSBqb2luKHRlc3RSb290LCAnc2hhcmVkJywgJ2NvbnN0YW50cy50cycpO1xuICAgIGNvbnN0IGhlbHBlcnNGaWxlID0gam9pbih0ZXN0Um9vdCwgJ3NoYXJlZCcsICdoZWxwZXJzLnRzJyk7XG5cbiAgICB3cml0ZUZpbGUoaGVscGVyc0ZpbGUsIGBleHBvcnQgY29uc3QgSEVMUEVSX1ZBTFVFID0gXCJmcm9tLWhlbHBlclwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGNvbnN0YW50c0ZpbGUsXG4gICAgICBgaW1wb3J0IHsgSEVMUEVSX1ZBTFVFIH0gZnJvbSAnLi9oZWxwZXJzJztcXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUyA9IFtIRUxQRVJfVkFMVUVdO2BcbiAgICApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tICcuLi8uLi9zaGFyZWQvY29uc3RhbnRzJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiBDQVRFR09SSUVTWzBdO1xcbn1gXG4gICAgKTtcblxuICAgIGNvbnN0IHN0YXRlID0ge1xuICAgICAgZGlzY292ZXJlZFN0ZXBzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRXb3JrZmxvd3M6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgIH07XG4gICAgYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW3N0ZXBGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICByZXNvbHZlRXh0ZW5zaW9uczogWycudHMnLCAnLnRzeCcsICcuanMnLCAnLmpzeCcsICcubWpzJywgJy5janMnXSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHJlc29sdmVFeHRlbnNpb25zOiBbJy50cycsICcudHN4JywgJy5qcycsICcuanN4JywgJy5tanMnLCAnLmNqcyddLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLm5vdC50b0NvbnRhaW4oJ2Zyb20taGVscGVyJyk7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXVteXCInXSpzaGFyZWRcXC9jb25zdGFudHNcXC50c1tcIiddLyk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBvcmRpbmFyeSBwYWNrYWdlIGRlcGVuZGVuY2llcyBleHRlcm5hbCB3aGVuIHJlYWNoYWJsZSBmcm9tIGEgYnVuZGxlZCBzdGVwJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzZXJ2ZXInLCAnd29ya2Zsb3dzJywgJ215LXdvcmtmbG93LnRzJyk7XG4gICAgY29uc3QgcGtnRGlyID0gam9pbih0ZXN0Um9vdCwgJ25vZGVfbW9kdWxlcycsICdwbGFpbi1wa2cnKTtcbiAgICBjb25zdCBwa2dJbmRleCA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7IG5hbWU6ICdwbGFpbi1wa2cnLCBtYWluOiAnaW5kZXguanMnIH0pXG4gICAgKTtcbiAgICB3cml0ZUZpbGUocGtnSW5kZXgsIGBleHBvcnQgY29uc3QgdmFsdWUgPSBcImZyb20tcGFja2FnZVwiO2ApO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCB7IHZhbHVlIH0gZnJvbSAncGxhaW4tcGtnJztcXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbXlTdGVwKCkge1xcbiAgJ3VzZSBzdGVwJztcXG4gIHJldHVybiB2YWx1ZTtcXG59YFxuICAgICk7XG5cbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIGRpc2NvdmVyZWRTdGVwczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICAgIGRpc2NvdmVyZWRTZXJkZUZpbGVzOiBuZXcgU2V0PHN0cmluZz4oKSxcbiAgICB9O1xuICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW2NyZWF0ZURpc2NvdmVyRW50cmllc1BsdWdpbihzdGF0ZSwgdGVzdFJvb3QpXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtzdGVwRmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiB0ZXN0Um9vdCxcbiAgICAgIG91dGRpcixcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZV0sXG4gICAgICAgICAgb3V0ZGlyLFxuICAgICAgICAgIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM6IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9NYXRjaCgvZnJvbVxccytbXCInXXBsYWluLXBrZ1tcIiddLyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvQ29udGFpbignZnJvbS1wYWNrYWdlJyk7XG4gIH0pO1xuXG4gIGl0KCdidW5kbGVzIHBhY2thZ2UgcGFyZW50cyB3aGVuIHRoZXkgbGVhZCB0byBkaXNjb3ZlcmVkIHdvcmtmbG93LXJlbGF0ZWQgZW50cmllcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBvdXRkaXIgPSBqb2luKHRlc3RSb290LCAnb3V0Jyk7XG4gICAgY29uc3Qgc3RlcEZpbGUgPSBqb2luKHRlc3RSb290LCAnc2VydmVyJywgJ3dvcmtmbG93cycsICdteS13b3JrZmxvdy50cycpO1xuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdub2RlX21vZHVsZXMnLCAnd29ya2Zsb3ctcGtnJyk7XG4gICAgY29uc3QgcGtnSW5kZXggPSBqb2luKHBrZ0RpciwgJ2luZGV4LmpzJyk7XG4gICAgY29uc3QgcGtnU2VyZGUgPSBqb2luKHBrZ0RpciwgJ3NlcmRlLmpzJyk7XG5cbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiAnd29ya2Zsb3ctcGtnJywgbWFpbjogJ2luZGV4LmpzJyB9KVxuICAgICk7XG4gICAgd3JpdGVGaWxlKHBrZ1NlcmRlLCBgZXhwb3J0IGNvbnN0IHZhbHVlID0gXCJmcm9tLXNlcmRlXCI7YCk7XG4gICAgd3JpdGVGaWxlKHBrZ0luZGV4LCBgZXhwb3J0IHsgdmFsdWUgfSBmcm9tICcuL3NlcmRlLmpzJztgKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBzdGVwRmlsZSxcbiAgICAgIGBpbXBvcnQgeyB2YWx1ZSB9IGZyb20gJ3dvcmtmbG93LXBrZyc7XFxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG15U3RlcCgpIHtcXG4gICd1c2Ugc3RlcCc7XFxuICByZXR1cm4gdmFsdWU7XFxufWBcbiAgICApO1xuXG4gICAgY29uc3Qgc3RhdGUgPSB7XG4gICAgICBkaXNjb3ZlcmVkU3RlcHM6IG5ldyBTZXQ8c3RyaW5nPigpLFxuICAgICAgZGlzY292ZXJlZFdvcmtmbG93czogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogbmV3IFNldDxzdHJpbmc+KCksXG4gICAgfTtcbiAgICBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtjcmVhdGVEaXNjb3ZlckVudHJpZXNQbHVnaW4oc3RhdGUsIHRlc3RSb290KV0sXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnc3RlcCcsXG4gICAgICAgICAgZW50cmllc1RvQnVuZGxlOiBbc3RlcEZpbGUsIHBrZ1NlcmRlXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgZXhwZWN0KG91dHB1dCkudG9Db250YWluKCdmcm9tLXNlcmRlJyk7XG4gICAgZXhwZWN0KG91dHB1dCkubm90LnRvTWF0Y2goL2Zyb21cXHMrW1wiJ113b3JrZmxvdy1wa2dbXCInXS8pO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHNpZGVFZmZlY3RFbnRyaWVzJywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIEhlbHBlcjogY3JlYXRlcyBhIGZha2Ugbm9kZV9tb2R1bGVzIHBhY2thZ2Ugd2l0aCBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWBcbiAgICogaW4gaXRzIHBhY2thZ2UuanNvbiBhbmQgYSBzaW5nbGUgZW50cnkgZmlsZSB0aGF0IGV4cG9ydHMgYSBzaWRlLWVmZmVjdGZ1bFxuICAgKiByZWdpc3RyYXRpb24gY2FsbCAoc2ltdWxhdGluZyB3aGF0IHRoZSBTV0MgdHJhbnNmb3JtIHByb2R1Y2VzKS5cbiAgICovXG4gIGZ1bmN0aW9uIGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gICAgZW50cnlDb2RlOiBzdHJpbmdcbiAgKTogc3RyaW5nIHtcbiAgICBjb25zdCBwa2dEaXIgPSBqb2luKHRlc3RSb290LCAnbm9kZV9tb2R1bGVzJywgcGFja2FnZU5hbWUpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIGpvaW4ocGtnRGlyLCAncGFja2FnZS5qc29uJyksXG4gICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgIG5hbWU6IHBhY2thZ2VOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnMS4wLjAnLFxuICAgICAgICBzaWRlRWZmZWN0czogZmFsc2UsXG4gICAgICAgIG1haW46ICdpbmRleC5qcycsXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgZW50cnlQYXRoID0gam9pbihwa2dEaXIsICdpbmRleC5qcycpO1xuICAgIHdyaXRlRmlsZShlbnRyeVBhdGgsIGVudHJ5Q29kZSk7XG4gICAgcmV0dXJuIGVudHJ5UGF0aDtcbiAgfVxuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIG9mIHNpZGVFZmZlY3RFbnRyaWVzIHBhY2thZ2VzIHdoZW4gYnVuZGxpbmcgd2l0aG91dCBlbnRyaWVzVG9CdW5kbGUnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPVxuICAgICAgJ2dsb2JhbFRoaXMuX19yZWdpc3RlcmVkID0gZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgfHwgW107XFxuZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQucHVzaChcIm15LXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXNpZGUtZWZmZWN0LXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICAvLyBTV0MgbW9jazogcmV0dXJuIHRoZSBjb2RlIHVuY2hhbmdlZCAodGhlIHNpZGUgZWZmZWN0cyBhcmUgYWxyZWFkeSB0aGVyZSlcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LXNpZGUtZWZmZWN0LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbZW50cnlQYXRoXSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBjb25zdCBvdXRwdXQgPSByZXN1bHQub3V0cHV0RmlsZXNbMF0udGV4dDtcbiAgICAvLyBUaGUgcmVnaXN0cmF0aW9uIGNvZGUgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGJ1bmRsZVxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkcm9wcyBiYXJlIGltcG9ydHMgd2hlbiBzaWRlRWZmZWN0RW50cmllcyBpcyBOT1QgcHJvdmlkZWQgZm9yIHNpZGVFZmZlY3RzOmZhbHNlIHBhY2thZ2VzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHNpZGVFZmZlY3RDb2RlID1cbiAgICAgICdnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCA9IGdsb2JhbFRoaXMuX19yZWdpc3RlcmVkIHx8IFtdO1xcbmdsb2JhbFRoaXMuX19yZWdpc3RlcmVkLnB1c2goXCJteS1wa2dcIik7JztcbiAgICBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZSgnbXktZHJvcHBlZC1wa2cnLCBzaWRlRWZmZWN0Q29kZSk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgc3RkaW46IHtcbiAgICAgICAgY29udGVudHM6IGBpbXBvcnQgJ215LWRyb3BwZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gV2l0aG91dCBzaWRlRWZmZWN0RW50cmllcywgZXNidWlsZCBkcm9wcyB0aGUgYmFyZSBpbXBvcnRcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX3JlZ2lzdGVyZWQnKTtcbiAgfSk7XG5cbiAgaXQoJ3Byb2R1Y2VzIG5vIHdhcm5pbmdzIGZvciBzaWRlRWZmZWN0RW50cmllcyBwYWNrYWdlcycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwid2FybmVkLXBrZ1wiKTsnO1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IGNyZWF0ZVNpZGVFZmZlY3RzRmFsc2VQYWNrYWdlKFxuICAgICAgJ215LXdhcm5lZC1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdteS13YXJuZWQtcGtnJztgLFxuICAgICAgICByZXNvbHZlRGlyOiB0ZXN0Um9vdCxcbiAgICAgICAgc291cmNlZmlsZTogJ3ZpcnR1YWwtZW50cnkuanMnLFxuICAgICAgICBsb2FkZXI6ICdqcycsXG4gICAgICB9LFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdjanMnLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIC8vIE5vIFwiaWdub3JlZC1iYXJlLWltcG9ydFwiIHdhcm5pbmdzIHNob3VsZCBiZSBwcm9kdWNlZFxuICAgIGNvbnN0IHNpZGVFZmZlY3RXYXJuaW5ncyA9IHJlc3VsdC53YXJuaW5ncy5maWx0ZXIoXG4gICAgICAodykgPT4gdy5pZCA9PT0gJ2lnbm9yZWQtYmFyZS1pbXBvcnQnXG4gICAgKTtcbiAgICBleHBlY3Qoc2lkZUVmZmVjdFdhcm5pbmdzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIHdpdGggZW50cmllc1RvQnVuZGxlIGFuZCBzaWRlRWZmZWN0RW50cmllcyB0b2dldGhlcicsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzaWRlRWZmZWN0Q29kZSA9XG4gICAgICAnZ2xvYmFsVGhpcy5fX3JlZ2lzdGVyZWQgPSBnbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZCB8fCBbXTtcXG5nbG9iYWxUaGlzLl9fcmVnaXN0ZXJlZC5wdXNoKFwiYnVuZGxlZC1wa2dcIik7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdteS1idW5kbGVkLXBrZycsXG4gICAgICBzaWRlRWZmZWN0Q29kZVxuICAgICk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbnN0IG91dGRpciA9IGpvaW4odGVzdFJvb3QsICdvdXQnKTtcbiAgICBjb25zdCBzdGVwRmlsZSA9IGpvaW4odGVzdFJvb3QsICdzcmMnLCAnc3RlcC50cycpO1xuICAgIHdyaXRlRmlsZShcbiAgICAgIHN0ZXBGaWxlLFxuICAgICAgYGltcG9ydCAnbXktYnVuZGxlZC1wa2cnO1xcbmV4cG9ydCBjb25zdCBQT1NUID0gKCkgPT4ge307YFxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbc3RlcEZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogdGVzdFJvb3QsXG4gICAgICBvdXRkaXIsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHRyZWVTaGFraW5nOiB0cnVlLFxuICAgICAgbG9nTGV2ZWw6ICdzaWxlbnQnLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICdzdGVwJyxcbiAgICAgICAgICBlbnRyaWVzVG9CdW5kbGU6IFtzdGVwRmlsZSwgZW50cnlQYXRoXSxcbiAgICAgICAgICBvdXRkaXIsXG4gICAgICAgICAgc2lkZUVmZmVjdEVudHJpZXM6IFtlbnRyeVBhdGhdLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIC8vIFRoZSByZWdpc3RyYXRpb24gY29kZSBzaG91bGQgYmUgYnVuZGxlZCBpblxuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19yZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdwcmVzZXJ2ZXMgYmFyZSBpbXBvcnRzIGZvciBsb2NhbCBmaWxlcyB3aXRoIHNpZGVFZmZlY3RzOmZhbHNlIGluIHRoZWlyIHBhcmVudCBwYWNrYWdlLmpzb24nLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gU2ltdWxhdGUgYSB3b3Jrc3BhY2UgcGFja2FnZSB3aXRoIHNpZGVFZmZlY3RzOiBmYWxzZVxuICAgIGNvbnN0IHBrZ0RpciA9IGpvaW4odGVzdFJvb3QsICdwYWNrYWdlcycsICdzaGFyZWQnKTtcbiAgICB3cml0ZUZpbGUoXG4gICAgICBqb2luKHBrZ0RpciwgJ3BhY2thZ2UuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICBuYW1lOiAnQG15b3JnL3NoYXJlZCcsXG4gICAgICAgIHZlcnNpb246ICcxLjAuMCcsXG4gICAgICAgIHNpZGVFZmZlY3RzOiBmYWxzZSxcbiAgICAgICAgbWFpbjogJ2luZGV4LmpzJyxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCBzaGFyZWRFbnRyeSA9IGpvaW4ocGtnRGlyLCAnaW5kZXguanMnKTtcbiAgICB3cml0ZUZpbGUoc2hhcmVkRW50cnksICdnbG9iYWxUaGlzLl9fc2hhcmVkUmVnaXN0ZXJlZCA9IHRydWU7Jyk7XG5cbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8vIFVzZSBhIHJlbGF0aXZlIGltcG9ydCB0byB0aGUgbG9jYWwgZmlsZSAobGlrZSB0aGUgdmlydHVhbCBlbnRyeSBkb2VzIGZvciBsb2NhbCBmaWxlcylcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICcuL3BhY2thZ2VzL3NoYXJlZC9pbmRleC5qcyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHNpZGVFZmZlY3RFbnRyaWVzOiBbc2hhcmVkRW50cnldLFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGNvbnN0IG91dHB1dCA9IHJlc3VsdC5vdXRwdXRGaWxlc1swXS50ZXh0O1xuICAgIGV4cGVjdChvdXRwdXQpLnRvQ29udGFpbignX19zaGFyZWRSZWdpc3RlcmVkJyk7XG4gIH0pO1xuXG4gIGl0KCdkb2VzIG5vdCBvdmVycmlkZSBzaWRlRWZmZWN0cyBmb3Igbm9uLWVudHJ5IG1vZHVsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgLy8gQ3JlYXRlIHR3byBwYWNrYWdlcyAtIG9uZSBpcyBhIHNpZGUtZWZmZWN0IGVudHJ5LCBvbmUgaXMgbm90XG4gICAgY29uc3Qgc2lkZUVmZmVjdENvZGUgPSAnZ2xvYmFsVGhpcy5fX2VudHJ5UmVnaXN0ZXJlZCA9IHRydWU7JztcbiAgICBjb25zdCBlbnRyeVBhdGggPSBjcmVhdGVTaWRlRWZmZWN0c0ZhbHNlUGFja2FnZShcbiAgICAgICdlbnRyeS1wa2cnLFxuICAgICAgc2lkZUVmZmVjdENvZGVcbiAgICApO1xuXG4gICAgY29uc3Qgbm9uRW50cnlDb2RlID0gJ2dsb2JhbFRoaXMuX19ub25FbnRyeVJlZ2lzdGVyZWQgPSB0cnVlOyc7XG4gICAgY3JlYXRlU2lkZUVmZmVjdHNGYWxzZVBhY2thZ2UoJ25vbi1lbnRyeS1wa2cnLCBub25FbnRyeUNvZGUpO1xuXG4gICAgYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgIGFzeW5jIChfZmlsZW5hbWU6IHN0cmluZywgc291cmNlOiBzdHJpbmcpID0+ICh7XG4gICAgICAgIGNvZGU6IHNvdXJjZSxcbiAgICAgICAgd29ya2Zsb3dNYW5pZmVzdDoge30sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIHN0ZGluOiB7XG4gICAgICAgIGNvbnRlbnRzOiBgaW1wb3J0ICdlbnRyeS1wa2cnO1xcbmltcG9ydCAnbm9uLWVudHJ5LXBrZyc7YCxcbiAgICAgICAgcmVzb2x2ZURpcjogdGVzdFJvb3QsXG4gICAgICAgIHNvdXJjZWZpbGU6ICd2aXJ0dWFsLWVudHJ5LmpzJyxcbiAgICAgICAgbG9hZGVyOiAnanMnLFxuICAgICAgfSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IHRlc3RSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnY2pzJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICB0cmVlU2hha2luZzogdHJ1ZSxcbiAgICAgIGxvZ0xldmVsOiAnc2lsZW50JyxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIC8vIE9ubHkgZW50cnktcGtnIGlzIGxpc3RlZCwgbm9uLWVudHJ5LXBrZyBpcyBub3RcbiAgICAgICAgICBzaWRlRWZmZWN0RW50cmllczogW2VudHJ5UGF0aF0sXG4gICAgICAgIH0pLFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChyZXN1bHQuZXJyb3JzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gcmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQ7XG4gICAgLy8gZW50cnktcGtnIHNob3VsZCBiZSBwcmVzZXJ2ZWRcbiAgICBleHBlY3Qob3V0cHV0KS50b0NvbnRhaW4oJ19fZW50cnlSZWdpc3RlcmVkJyk7XG4gICAgLy8gbm9uLWVudHJ5LXBrZyBzaG91bGQgYmUgZHJvcHBlZCAoc2lkZUVmZmVjdHM6IGZhbHNlIGlzIHJlc3BlY3RlZClcbiAgICBleHBlY3Qob3V0cHV0KS5ub3QudG9Db250YWluKCdfX25vbkVudHJ5UmVnaXN0ZXJlZCcpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnY3JlYXRlU3djUGx1Z2luIHByb2plY3RSb290JywgKCkgPT4ge1xuICBsZXQgdGVzdFJvb3Q6IHN0cmluZztcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB0ZXN0Um9vdCA9IG1rZHRlbXBTeW5jKGpvaW4ocmVhbFRtcGRpciwgJ3dvcmtmbG93LXN3Yy1wbHVnaW4tJykpO1xuICAgIGFwcGx5U3djVHJhbnNmb3JtTW9jay5tb2NrUmVzZXQoKTtcbiAgICBhcHBseVN3Y1RyYW5zZm9ybU1vY2subW9ja0ltcGxlbWVudGF0aW9uKFxuICAgICAgYXN5bmMgKF9maWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZykgPT4gKHtcbiAgICAgICAgY29kZTogc291cmNlLFxuICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBybVN5bmModGVzdFJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgfSk7XG5cbiAgZnVuY3Rpb24gc2V0dXBGaXh0dXJlKCkge1xuICAgIGNvbnN0IGFwcFJvb3QgPSBqb2luKHRlc3RSb290LCAnYXBwcycsICdjaGF0Jyk7XG4gICAgY29uc3QgcGFja2FnZVJvb3QgPSBqb2luKHRlc3RSb290LCAncGFja2FnZXMnLCAndmFkZScpO1xuICAgIGNvbnN0IHdvcmtmbG93RmlsZSA9IGpvaW4oXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgICdzcmMnLFxuICAgICAgJ2ludGVybmFsJyxcbiAgICAgICdtZXNzYWdlJyxcbiAgICAgICd3b3JrZmxvdycsXG4gICAgICAnaGFuZGxlLW1lc3NhZ2UudHMnXG4gICAgKTtcblxuICAgIHdyaXRlRmlsZShcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICAgIGBleHBvcnQgYXN5bmMgZnVuY3Rpb24gaGFuZGxlTWVzc2FnZVdvcmtmbG93KG1lc3NhZ2UpIHtcbiAgXCJ1c2Ugd29ya2Zsb3dcIjtcblxuICByZXR1cm4gbWVzc2FnZTtcbn1cbmBcbiAgICApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFJvb3QsXG4gICAgICBwYWNrYWdlUm9vdCxcbiAgICAgIHdvcmtmbG93RmlsZSxcbiAgICB9O1xuICB9XG5cbiAgaXQoJ3Bhc3NlcyB0aGUgZXhwbGljaXQgcHJvamVjdFJvb3QgdGhyb3VnaCB0byBhcHBseVN3Y1RyYW5zZm9ybScsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG5cbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlc2J1aWxkLmJ1aWxkKHtcbiAgICAgIGVudHJ5UG9pbnRzOiBbZml4dHVyZS53b3JrZmxvd0ZpbGVdLFxuICAgICAgYWJzV29ya2luZ0RpcjogZml4dHVyZS5wYWNrYWdlUm9vdCxcbiAgICAgIGJ1bmRsZTogdHJ1ZSxcbiAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICBwbGF0Zm9ybTogJ25vZGUnLFxuICAgICAgd3JpdGU6IGZhbHNlLFxuICAgICAgcGx1Z2luczogW1xuICAgICAgICBjcmVhdGVTd2NQbHVnaW4oe1xuICAgICAgICAgIG1vZGU6ICd3b3JrZmxvdycsXG4gICAgICAgICAgcHJvamVjdFJvb3Q6IGZpeHR1cmUuYXBwUm9vdCxcbiAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0OiB7fSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHJlc3VsdC5lcnJvcnMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgICBleHBlY3QoYXBwbHlTd2NUcmFuc2Zvcm1Nb2NrKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdzcmMvaW50ZXJuYWwvbWVzc2FnZS93b3JrZmxvdy9oYW5kbGUtbWVzc2FnZS50cycsXG4gICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnXCJ1c2Ugd29ya2Zsb3dcIicpLFxuICAgICAgJ3dvcmtmbG93JyxcbiAgICAgIGZpeHR1cmUud29ya2Zsb3dGaWxlLFxuICAgICAgZml4dHVyZS5hcHBSb290LFxuICAgICAgZml4dHVyZS5hcHBSb290XG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoJ3Bhc3NlcyBhbiBleHBsaWNpdCBtb2R1bGVTcGVjaWZpZXJSb290IHNlcGFyYXRlbHkgZnJvbSBwcm9qZWN0Um9vdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaXh0dXJlID0gc2V0dXBGaXh0dXJlKCk7XG4gICAgY29uc3QgdHJhY2luZ1Jvb3QgPSB0ZXN0Um9vdDtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgZW50cnlQb2ludHM6IFtmaXh0dXJlLndvcmtmbG93RmlsZV0sXG4gICAgICBhYnNXb3JraW5nRGlyOiBmaXh0dXJlLnBhY2thZ2VSb290LFxuICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICB3cml0ZTogZmFsc2UsXG4gICAgICBwbHVnaW5zOiBbXG4gICAgICAgIGNyZWF0ZVN3Y1BsdWdpbih7XG4gICAgICAgICAgbW9kZTogJ3dvcmtmbG93JyxcbiAgICAgICAgICBwcm9qZWN0Um9vdDogdHJhY2luZ1Jvb3QsXG4gICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogZml4dHVyZS5hcHBSb290LFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Q6IHt9LFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChhcHBseVN3Y1RyYW5zZm9ybU1vY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgJ3NyYy9pbnRlcm5hbC9tZXNzYWdlL3dvcmtmbG93L2hhbmRsZS1tZXNzYWdlLnRzJyxcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdcInVzZSB3b3JrZmxvd1wiJyksXG4gICAgICAnd29ya2Zsb3cnLFxuICAgICAgZml4dHVyZS53b3JrZmxvd0ZpbGUsXG4gICAgICB0cmFjaW5nUm9vdCxcbiAgICAgIGZpeHR1cmUuYXBwUm9vdFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KCdkZWZhdWx0cyB0aGUgdHJhbnNmb3JtIHByb2plY3RSb290IHRvIGFic1dvcmtpbmdEaXInLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZml4dHVyZSA9IHNldHVwRml4dHVyZSgpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXNidWlsZC5idWlsZCh7XG4gICAgICBlbnRyeVBvaW50czogW2ZpeHR1cmUud29ya2Zsb3dGaWxlXSxcbiAgICAgIGFic1dvcmtpbmdEaXI6IGZpeHR1cmUucGFja2FnZVJvb3QsXG4gICAgICBidW5kbGU6IHRydWUsXG4gICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgcGxhdGZvcm06ICdub2RlJyxcbiAgICAgIHdyaXRlOiBmYWxzZSxcbiAgICAgIHBsdWdpbnM6IFtcbiAgICAgICAgY3JlYXRlU3djUGx1Z2luKHtcbiAgICAgICAgICBtb2RlOiAnd29ya2Zsb3cnLFxuICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Q6IHt9LFxuICAgICAgICB9KSxcbiAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocmVzdWx0LmVycm9ycykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChhcHBseVN3Y1RyYW5zZm9ybU1vY2spLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgJ3NyYy9pbnRlcm5hbC9tZXNzYWdlL3dvcmtmbG93L2hhbmRsZS1tZXNzYWdlLnRzJyxcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdcInVzZSB3b3JrZmxvd1wiJyksXG4gICAgICAnd29ya2Zsb3cnLFxuICAgICAgZml4dHVyZS53b3JrZmxvd0ZpbGUsXG4gICAgICBmaXh0dXJlLnBhY2thZ2VSb290LFxuICAgICAgZml4dHVyZS5wYWNrYWdlUm9vdFxuICAgICk7XG4gIH0pO1xufSk7XG4iXX0=