dcdx 1.3.0-next.6 → 1.3.0-next.61

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/assets/versions.json +1 -1
  2. package/lib/commands/apt.js +1937 -9471
  3. package/lib/commands/build.js +470 -8943
  4. package/lib/commands/configure.js +593 -0
  5. package/lib/commands/database.js +24 -8890
  6. package/lib/commands/debug.js +989 -8967
  7. package/lib/commands/install.js +629 -8971
  8. package/lib/commands/reset.js +564 -8898
  9. package/lib/commands/run.js +618 -8929
  10. package/lib/commands/stop.js +564 -8898
  11. package/lib/commands/update.js +10 -8877
  12. package/lib/index.js +33 -2
  13. package/lib/types/src/applications/base.d.ts +4 -0
  14. package/lib/types/src/apt/helpers/dcapt.d.ts +2 -1
  15. package/lib/types/src/apt/helpers/downloadFile.d.ts +1 -0
  16. package/lib/types/src/apt/helpers/generateDependencyTree.d.ts +2 -0
  17. package/lib/types/src/apt/helpers/generateSCAReport.d.ts +2 -0
  18. package/lib/types/src/apt/helpers/getAppLicense.d.ts +3 -0
  19. package/lib/types/src/apt/helpers/getAptDirectory.d.ts +1 -1
  20. package/lib/types/src/apt/helpers/getClusterURL.d.ts +1 -1
  21. package/lib/types/src/apt/helpers/getHostLicense.d.ts +1 -1
  22. package/lib/types/src/apt/helpers/getRunForStage.d.ts +1 -1
  23. package/lib/types/src/apt/helpers/getUrlByAppKey.d.ts +1 -0
  24. package/lib/types/src/apt/helpers/installAppInCluster.d.ts +2 -0
  25. package/lib/types/src/apt/helpers/persistClusterConfiguration.d.ts +2 -1
  26. package/lib/types/src/apt/helpers/persistTestConfiguration.d.ts +1 -1
  27. package/lib/types/src/apt/helpers/provisionCluster.d.ts +1 -0
  28. package/lib/types/src/apt/helpers/restartCluster.d.ts +2 -0
  29. package/lib/types/src/apt/helpers/runLuceneTimingTest.d.ts +2 -0
  30. package/lib/types/src/apt/helpers/runPerformanceTest.d.ts +2 -2
  31. package/lib/types/src/apt/helpers/runScalabilityTest.d.ts +2 -2
  32. package/lib/types/src/apt/messages.d.ts +10 -5
  33. package/lib/types/src/commands/configure.d.ts +2 -0
  34. package/lib/types/src/databases/base.d.ts +1 -0
  35. package/lib/types/src/helpers/ActionHandler.d.ts +1 -40
  36. package/lib/types/src/helpers/FileWatcher.d.ts +2 -2
  37. package/lib/types/src/helpers/PAT.d.ts +10 -0
  38. package/lib/types/src/helpers/findInFile.d.ts +1 -0
  39. package/lib/types/src/helpers/getConfig.d.ts +2 -0
  40. package/lib/types/src/helpers/getMainArtifactFromOBR.d.ts +1 -0
  41. package/lib/types/src/helpers/installFromMPAC.d.ts +2 -0
  42. package/lib/types/src/helpers/installFromURL.d.ts +2 -0
  43. package/lib/types/src/helpers/installWithQuickReload.d.ts +2 -0
  44. package/lib/types/src/helpers/setupHost.d.ts +3 -0
  45. package/lib/types/src/helpers/upm.d.ts +2 -2
  46. package/lib/types/src/helpers/validateAtlassianPlugin.d.ts +4 -0
  47. package/lib/types/src/types/AMPS.d.ts +12 -0
  48. package/lib/types/src/types/Application.d.ts +6 -0
  49. package/lib/types/src/types/Config.d.ts +370 -0
  50. package/lib/types/src/types/Configure.d.ts +177 -0
  51. package/lib/types/src/types/DCAPT.d.ts +506 -94
  52. package/lib/types/src/types/Database.d.ts +1 -0
  53. package/lib/types/src/types/FileWatcher.d.ts +39 -0
  54. package/lib/types/src/types/Install.d.ts +238 -0
  55. package/lib/types/src/types/Installer.d.ts +21 -0
  56. package/package.json +7 -1
  57. package/lib/types/src/apt/helpers/installApp.d.ts +0 -1
  58. package/lib/types/src/helpers/Installer.d.ts +0 -3
@@ -0,0 +1,593 @@
1
+ #!/usr/bin/env node
2
+ import { Command as Command$1, Option } from 'commander';
3
+ import { asyncExitHook, gracefulExit } from 'exit-hook';
4
+ import { z } from 'zod';
5
+ import { realpathSync, readFileSync, existsSync, statSync } from 'fs';
6
+ import { dirname, join, isAbsolute } from 'path';
7
+ import { pathToFileURL } from 'url';
8
+ import puppeteer from 'puppeteer';
9
+
10
+ const ActionHandler = async (program, { action, errorHandler }, options) => {
11
+ const ops = options || program.opts();
12
+ await new Promise((_, reject) => {
13
+ let errorMessage = '';
14
+ asyncExitHook(async (code) => {
15
+ try {
16
+ if (code !== 0) {
17
+ await errorHandler(ops).catch(() => null);
18
+ }
19
+ if (errorMessage) {
20
+ throw new Error(errorMessage.trim());
21
+ }
22
+ else {
23
+ // We are rejecting the promise to avoid the
24
+ // "Calling process.exit" log message from exit-hook
25
+ reject(null);
26
+ }
27
+ }
28
+ catch (err) {
29
+ const message = err instanceof Error ? err.message : err;
30
+ reject(message);
31
+ }
32
+ }, {
33
+ wait: 60 * 1 * 1000
34
+ });
35
+ action(ops).then(() => {
36
+ gracefulExit(0);
37
+ }).catch(err => {
38
+ if (err instanceof z.ZodError) {
39
+ err.issues.forEach(issue => {
40
+ errorMessage += `Unable to parse option ${issue.path.join(',')}: ${issue.message}\n`;
41
+ });
42
+ }
43
+ else if (err instanceof Error || typeof err === 'string') {
44
+ errorMessage = err.toString();
45
+ }
46
+ gracefulExit(1);
47
+ });
48
+ }).catch(message => {
49
+ if (message !== null) {
50
+ program.error(message);
51
+ // If there is no error message,
52
+ // we can assume a clean exit
53
+ }
54
+ else {
55
+ process.exit(0);
56
+ }
57
+ });
58
+ };
59
+
60
+ const toAbsolutePath = (relativePath) => {
61
+ const [, filePath] = process.argv;
62
+ const executableFileDir = dirname(realpathSync(filePath));
63
+ const basedir = executableFileDir.substring(0, executableFileDir.indexOf('dcdx') + 4);
64
+ return join(basedir, relativePath.replaceAll('../', ''));
65
+ };
66
+
67
+ const getVersions = () => {
68
+ const content = readFileSync(toAbsolutePath('../../assets/versions.json'), 'utf-8');
69
+ const versions = JSON.parse(content);
70
+ return versions;
71
+ };
72
+
73
+ const versions = getVersions();
74
+ const SupportedDatabaseEngines = z.enum([
75
+ 'postgresql',
76
+ 'mysql',
77
+ 'mssql'
78
+ ]);
79
+ const SupportedMSSQLEditions = z.enum([
80
+ 'Developer',
81
+ 'Express',
82
+ 'Standard',
83
+ 'Enterprise',
84
+ 'EnterpriseCore'
85
+ ]);
86
+ const DatabaseOptions = z.object({
87
+ name: SupportedDatabaseEngines,
88
+ port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))),
89
+ database: z.string().default('dcdx'),
90
+ username: z.string().default('dcdx'),
91
+ password: z.string().default('dcdx'),
92
+ clean: z.boolean().default(false),
93
+ prune: z.boolean().default(false),
94
+ verbose: z.boolean().default(false),
95
+ driver: z.string()
96
+ });
97
+ DatabaseOptions.extend({
98
+ name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.postgresql).default(SupportedDatabaseEngines.Values.postgresql),
99
+ tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.postgresql].includes(item)).default('latest'),
100
+ port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(5432),
101
+ driver: z.string().refine(item => item === 'org.postgresql.Driver').default('org.postgresql.Driver')
102
+ });
103
+ DatabaseOptions.extend({
104
+ name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.mysql).default(SupportedDatabaseEngines.Values.mysql),
105
+ tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.mysql].includes(item)).default('latest'),
106
+ port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(3306),
107
+ driver: z.string().refine(item => item === 'com.mysql.jdbc.Driver').default('com.mysql.jdbc.Driver')
108
+ });
109
+ DatabaseOptions.extend({
110
+ name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.mssql).default(SupportedDatabaseEngines.Values.mssql),
111
+ tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.mssql].includes(item)).default('latest'),
112
+ edition: SupportedMSSQLEditions.default('Developer'),
113
+ port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(1433),
114
+ username: z.string().refine(item => item === 'sa').default('sa'),
115
+ password: z.string().default('DataCenterDX!'),
116
+ driver: z.string().refine(item => item === 'com.microsoft.sqlserver.jdbc.SQLServerDriver').default('com.microsoft.sqlserver.jdbc.SQLServerDriver')
117
+ });
118
+
119
+ const SupportedApplications = z.enum([
120
+ 'jira',
121
+ 'confluence',
122
+ 'bitbucket',
123
+ 'bamboo'
124
+ ]);
125
+ z.object({
126
+ name: SupportedApplications,
127
+ tag: z.string().default('latest'),
128
+ database: SupportedDatabaseEngines.default('postgresql'),
129
+ databaseTag: z.string().default('latest'),
130
+ port: z.string().transform(Number).refine(item => !isNaN(item)).default('80'),
131
+ contextPath: z.string(),
132
+ xms: z.string().default('1024m'),
133
+ xmx: z.string().default('1024m'),
134
+ watch: z.boolean().default(false),
135
+ ext: z.array(z.string()),
136
+ install: z.boolean(),
137
+ outputDirectory: z.string(),
138
+ activateProfiles: z.string(),
139
+ configure: z.boolean().default(false),
140
+ clean: z.boolean().default(false),
141
+ prune: z.boolean().default(false),
142
+ debug: z.boolean().default(true),
143
+ jvm: z.string(),
144
+ cwd: z.string()
145
+ }).partial({
146
+ contextPath: true,
147
+ ext: true,
148
+ install: true,
149
+ outputDirectory: true,
150
+ activateProfiles: true,
151
+ jvm: true,
152
+ cwd: true
153
+ });
154
+
155
+ z.object({
156
+ product: SupportedApplications,
157
+ config: z.string(),
158
+ cwd: z.string()
159
+ }).partial({
160
+ config: true,
161
+ cwd: true
162
+ });
163
+ const ConfigureBase = z.object({
164
+ username: z.string(),
165
+ password: z.string()
166
+ });
167
+ const ConfigureJira = ConfigureBase.extend({
168
+ title: z.string(),
169
+ mode: z.enum(['private', 'public']),
170
+ baseUrl: z.string(),
171
+ fullname: z.string(),
172
+ email: z.string(),
173
+ configureEmail: z.enum(['later', 'now']),
174
+ emailName: z.string(),
175
+ emailFromAddress: z.string(),
176
+ emailPrefix: z.string(),
177
+ emailServerType: z.enum(['smtp', 'jndi']),
178
+ emailJndiLocation: z.string(),
179
+ emailServiceProvider: z.enum(['custom', 'google-apps-mail-/-gmail-8', 'yahoo!-mail-plus-9']),
180
+ emailHostName: z.string(),
181
+ emailProtocol: z.enum(['SMTP', 'SECURE_SMTP']),
182
+ emailPort: z.number(),
183
+ emailTimeout: z.number(),
184
+ emailTLS: z.boolean(),
185
+ emailUsername: z.string(),
186
+ emailPassword: z.string(),
187
+ language: z.enum([
188
+ 'en-US',
189
+ 'zh_CN',
190
+ 'cs_CZ',
191
+ 'da_DK',
192
+ 'nl_NL',
193
+ 'en_UK',
194
+ 'et_EE',
195
+ 'fi_FI',
196
+ 'fr_FR',
197
+ 'de_DE',
198
+ 'hu_HU',
199
+ 'is_IS',
200
+ 'it_IT',
201
+ 'ja_JP',
202
+ 'ko_KR',
203
+ 'no_NO',
204
+ 'pl_PL',
205
+ 'pt_BR',
206
+ 'ro_RO',
207
+ 'ru_RU',
208
+ 'sk_SK',
209
+ 'es_ES',
210
+ 'sv_SE'
211
+ ]),
212
+ avatarPath: z.string()
213
+ }).partial({
214
+ emailName: true,
215
+ emailFromAddress: true,
216
+ emailPrefix: true,
217
+ emailServerType: true,
218
+ emailJndiLocation: true,
219
+ emailServiceProvider: true,
220
+ emailHostName: true,
221
+ emailProtocol: true,
222
+ emailPort: true,
223
+ emailTimeout: true,
224
+ emailTLS: true,
225
+ emailUsername: true,
226
+ emailPassword: true,
227
+ language: true,
228
+ avatarPath: true
229
+ }).default({
230
+ title: 'Jira',
231
+ mode: 'private',
232
+ baseUrl: 'http://localhost',
233
+ fullname: 'Administrator',
234
+ email: 'admin@example.org',
235
+ configureEmail: 'later',
236
+ username: 'admin',
237
+ password: 'admin'
238
+ });
239
+ const ConfigureConfluence = ConfigureBase.extend({
240
+ baseUrl: z.string(),
241
+ deploymentType: z.enum(['non-clustered', 'clustered']),
242
+ fullName: z.string(),
243
+ email: z.string(),
244
+ clusterName: z.string(),
245
+ clusterHome: z.string(),
246
+ clusterJoinMode: z.enum(['useMulticast', 'useTcpIp', 'useAws']),
247
+ clusterAutoAddress: z.boolean(),
248
+ loadContent: z.enum(['example', 'empty']),
249
+ userManagement: z.enum(['confluence', 'jira']),
250
+ jiraBaseUrl: z.string(),
251
+ jiraUsername: z.string(),
252
+ jiraPassword: z.string(),
253
+ jiraUserGroups: z.string(),
254
+ jiraAdminGroups: z.string(),
255
+ }).partial({
256
+ clusterName: true,
257
+ clusterHome: true,
258
+ clusterJoinMode: true,
259
+ clusterAutoAddress: true,
260
+ jiraBaseUrl: true,
261
+ jiraUsername: true,
262
+ jiraPassword: true,
263
+ jiraUserGroups: true,
264
+ jiraAdminGroups: true
265
+ }).default({
266
+ baseUrl: 'http://localhost',
267
+ deploymentType: 'non-clustered',
268
+ fullName: 'Administrator',
269
+ email: 'admin@example.org',
270
+ loadContent: 'empty',
271
+ userManagement: 'confluence',
272
+ username: 'admin',
273
+ password: 'admin'
274
+ });
275
+ const ConfigureBitbucket = ConfigureBase.extend({}).default({
276
+ username: 'admin',
277
+ password: 'admin'
278
+ });
279
+ const ConfigureBamboo = ConfigureBase.extend({}).default({
280
+ username: 'admin',
281
+ password: 'admin'
282
+ });
283
+
284
+ const Config = z.object({
285
+ setup: z.object({
286
+ [SupportedApplications.Values.jira]: ConfigureJira,
287
+ [SupportedApplications.Values.confluence]: ConfigureConfluence,
288
+ [SupportedApplications.Values.bamboo]: ConfigureBamboo,
289
+ [SupportedApplications.Values.bitbucket]: ConfigureBitbucket
290
+ }).partial()
291
+ }).default({
292
+ setup: {
293
+ [SupportedApplications.Values.jira]: ConfigureJira.parse(undefined),
294
+ [SupportedApplications.Values.confluence]: ConfigureConfluence.parse(undefined),
295
+ [SupportedApplications.Values.bamboo]: ConfigureBamboo.parse(undefined),
296
+ [SupportedApplications.Values.bitbucket]: ConfigureBitbucket.parse(undefined)
297
+ }
298
+ });
299
+
300
+ /*
301
+ Code atrribution
302
+ borrowed some logic for loading configuration files from ESLint
303
+ https://github.com/eslint/eslint/blob/main/lib/config/config-loader.js
304
+ */
305
+ const getConfig = async (path, cwd) => {
306
+ let config;
307
+ const directory = cwd || process.cwd();
308
+ const configFile = path || 'dcdx.config.mjs';
309
+ const configPath = isAbsolute(configFile) && existsSync(configFile) ? configFile : join(directory, configFile);
310
+ if (existsSync(configPath)) {
311
+ /*
312
+ * Explanation copied from ESLint
313
+ *
314
+ * Append a query with the config file's modification time (`mtime`) in order
315
+ * to import the current version of the config file. Without the query, `import()` would
316
+ * cache the config file module by the pathname only, and then always return
317
+ * the same version (the one that was actual when the module was imported for the first time).
318
+ *
319
+ * This ensures that the config file module is loaded and executed again
320
+ * if it has been changed since the last time it was imported.
321
+ * If it hasn't been changed, `import()` will just return the cached version.
322
+ *
323
+ * Note that we should not overuse queries (e.g., by appending the current time
324
+ * to always reload the config file module) as that could cause memory leaks
325
+ * because entries are never removed from the import cache.
326
+ */
327
+ const mtime = statSync(configPath).mtime.getTime();
328
+ const fileURL = pathToFileURL(configPath);
329
+ fileURL.searchParams.append('mtime', mtime.toFixed());
330
+ const filePath = fileURL.toString();
331
+ config = (await import(filePath)).default;
332
+ }
333
+ return Config.parse(config);
334
+ };
335
+
336
+ const capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
337
+
338
+ const setupHost = async (name, config) => {
339
+ const options = config.setup[name];
340
+ if (!options) {
341
+ throw new Error(`Could not find initial setup configuration for ${capitalize(name)}`);
342
+ }
343
+ switch (name) {
344
+ case SupportedApplications.Values.jira:
345
+ return setupJira(ConfigureJira.parse(options));
346
+ case SupportedApplications.Values.confluence:
347
+ return setupConfluence(ConfigureConfluence.parse(options));
348
+ case SupportedApplications.Values.bitbucket:
349
+ console.log('Oopsie daisy 🌼 Atlassian Bitbucket does not require additional setup 🤖');
350
+ return true;
351
+ }
352
+ return true;
353
+ };
354
+ const setupJira = async (options) => {
355
+ try {
356
+ // Launch Google Chrome
357
+ const browser = await puppeteer.launch();
358
+ // Create the page view
359
+ const page = await browser.newPage();
360
+ await page.setViewport({ width: 1080, height: 1024 });
361
+ // Open the Setup page
362
+ console.log(`Starting automated initial setup of Atlassian Jira 🤖`);
363
+ await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
364
+ // We need to make sure that progress has ended
365
+ const isStillLoading = !!await page.$('#progress');
366
+ if (isStillLoading) {
367
+ console.log('Waiting for Atlassian Jira to be ready... ⏳');
368
+ await page.waitForNavigation({ waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
369
+ }
370
+ // Set up application properties
371
+ const mustSetupApplicationProperties = !!await page.$('form[action="SetupApplicationProperties.jspa"]');
372
+ if (mustSetupApplicationProperties) {
373
+ console.log('Setting up application properties');
374
+ await page.locator('input[name=title]').fill(options.title);
375
+ await page.locator(`label[for=jira-setupwizard-mode-${options.mode}]`).click();
376
+ await page.locator('input[name=baseURL]').fill(options.baseUrl);
377
+ await page.locator('#jira-setupwizard-submit').click();
378
+ console.log('Waiting for the administrator account setup wizard to load... ⏳');
379
+ await page.waitForSelector('form[action="SetupAdminAccount.jspa"]', { timeout: 5 * 60 * 1000 });
380
+ }
381
+ // Set up administrator account
382
+ const mustSetupAdminAccount = !!await page.$('form[action="SetupAdminAccount.jspa"]');
383
+ if (mustSetupAdminAccount) {
384
+ console.log('Setting up the administrator account');
385
+ await page.locator('input[name=fullname]').fill(options.fullname);
386
+ await page.locator('input[name=email]').fill(options.email);
387
+ await page.locator('input[name=username]').fill(options.username);
388
+ await page.locator('input[name=password]').fill(options.password);
389
+ await page.locator('input[name=confirm]').fill(options.password);
390
+ await page.locator('#jira-setupwizard-submit').click();
391
+ console.log('Waiting for the email notification setup wizard to load... ⏳');
392
+ await page.waitForSelector('form[action="SetupMailNotifications.jspa"]', { timeout: 5 * 60 * 1000 });
393
+ }
394
+ // Set up email notifications
395
+ const mustSetupEmailNotification = !!await page.$('form[action="SetupMailNotifications.jspa"]');
396
+ if (mustSetupEmailNotification) {
397
+ console.log('Setting up the email notification settings');
398
+ const configureEmailNotifications = options.configureEmail === 'later' ? 'disabled' : 'enabled';
399
+ await page.locator(`label[for=jira-setupwizard-email-notifications-${configureEmailNotifications}]`).click();
400
+ await page.locator('#jira-setupwizard-submit').click();
401
+ console.log('Waiting for the language chooser to load... ⏳');
402
+ await page.waitForSelector('#choose-language-form', { timeout: 5 * 60 * 1000 });
403
+ }
404
+ // Welcome to Jira, Administrator!
405
+ const mustSetupLanguage = !!await page.$('#choose-language-form');
406
+ if (mustSetupLanguage) {
407
+ console.log('Setting up the language for the administrator account');
408
+ const languageSelector = !options.language || options.language === 'en-US' ? 'locale_-1' : `locale_${options.language}`;
409
+ await page.locator(`label[for=${languageSelector}]`).click();
410
+ await page.locator('#next').click();
411
+ console.log('Waiting for the avatar setup wizard to load... ⏳');
412
+ await page.waitForSelector('.onboarding-sequence-avatar-picker', { timeout: 5 * 60 * 1000 });
413
+ }
414
+ const mustSetupAvatar = !!await page.$('.onboarding-sequence-avatar-picker');
415
+ if (mustSetupAvatar) {
416
+ console.log('Setting up the avatar for the administrator account');
417
+ await page.locator('input.avatar-picker-done').click();
418
+ await page.waitForSelector('#onboarding', { timeout: 5 * 60 * 1000 });
419
+ }
420
+ // We're done here, let's wrap things up
421
+ console.log(`Finished automated initial setup of Atlassian Jira 💪`);
422
+ await page.close();
423
+ await browser.close();
424
+ return true;
425
+ }
426
+ catch (err) {
427
+ console.error('Failed to automatically setup Atlassian Jira');
428
+ console.log(err);
429
+ return false;
430
+ }
431
+ };
432
+ const setupConfluence = async (options) => {
433
+ try {
434
+ // Launch Google Chrome
435
+ const browser = await puppeteer.launch();
436
+ // Create the page view
437
+ const page = await browser.newPage();
438
+ await page.setViewport({ width: 1080, height: 1024 });
439
+ // Open the Setup page
440
+ console.log(`Starting automated initial setup of Atlassian Confluence 🤖`);
441
+ await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
442
+ // Choose your deployment type
443
+ const mustChooseDeploymentType = !!await page.$('form[action="setupcluster.action"]');
444
+ if (mustChooseDeploymentType) {
445
+ console.log('Setting up deployment type');
446
+ const clusteringStatus = options.deploymentType === 'clustered' ? 'clusteringEnabled' : 'clusteringDisabled';
447
+ await page.locator(`label[for=${clusteringStatus}]`).click();
448
+ if (options.deploymentType === 'clustered') {
449
+ // TODO: add cluster options
450
+ await page.locator('button[name=newCluster]').click();
451
+ }
452
+ else {
453
+ await page.locator('#skip-button').click();
454
+ }
455
+ console.log('Waiting for the content chooser page to load... ⏳');
456
+ await page.waitForSelector('form[action="setupdata.action"]', { timeout: 5 * 60 * 1000 });
457
+ }
458
+ // Load Content
459
+ const mustLoadContent = !!await page.$('form[action="setupdata.action"]');
460
+ if (mustLoadContent) {
461
+ if (options.loadContent === 'example') {
462
+ await page.locator('#demoChoiceForm > input[type=submit]').click();
463
+ }
464
+ else {
465
+ await page.locator('#blankChoiceForm > input[type=submit]').click();
466
+ }
467
+ console.log('Waiting for the user management configuration page to load... ⏳');
468
+ await page.waitForSelector('form[action="setupusermanagementchoice.action"]', { timeout: 5 * 60 * 1000 });
469
+ }
470
+ // Configure User Management
471
+ const mustConfigureUserManagement = !!await page.$('form[action="setupusermanagementchoice.action"]');
472
+ if (mustConfigureUserManagement) {
473
+ if (options.userManagement === 'confluence') {
474
+ await page.locator('#internal').click();
475
+ console.log('Waiting for the system administration account configuration page to load... ⏳');
476
+ await page.waitForSelector('form[action="setupadministrator.action"]', { timeout: 5 * 60 * 1000 });
477
+ }
478
+ else {
479
+ await page.locator('#jaacs').click();
480
+ console.log('Waiting for the Connect to Jira page to load... ⏳');
481
+ await page.waitForSelector('form[action="connecttojira.action"]', { timeout: 5 * 60 * 1000 });
482
+ }
483
+ }
484
+ // Configure System Administrator Account
485
+ const mustConfigureAdministratorAccount = !!await page.$('form[action="setupadministrator.action"]');
486
+ if (mustConfigureAdministratorAccount) {
487
+ console.log('Configuring the administrator account');
488
+ await page.locator('input[name=username]').fill(options.username);
489
+ await page.locator('input[name=fullName]').fill(options.fullName);
490
+ await page.locator('input[name=email]').fill(options.email);
491
+ await page.locator('input[name=password]').fill(options.password);
492
+ await page.locator('input[name=confirm]').fill(options.password);
493
+ await page.locator('#setup-next-button').click();
494
+ console.log('Waiting for the setup successful notification to load... ⏳');
495
+ await page.waitForSelector('a.finishAction', { timeout: 5 * 60 * 1000 });
496
+ }
497
+ const mustFinishSetup = !!await page.$('a.finishAction');
498
+ if (mustFinishSetup) {
499
+ console.log('Finalizing initial Confluence setup');
500
+ await page.locator('a.finishAction').click();
501
+ console.log('Waiting for the initial space creation form to load... ⏳');
502
+ await page.waitForSelector('#grow-intro-create-space', { timeout: 5 * 60 * 1000 });
503
+ }
504
+ // We're done here, let's wrap things up
505
+ console.log(`Finished automated initial setup of Atlassian Confluence 💪`);
506
+ await page.close();
507
+ await browser.close();
508
+ return true;
509
+ }
510
+ catch (err) {
511
+ console.error('Failed to automatically setup Atlassian Confluence');
512
+ console.log(err);
513
+ return false;
514
+ }
515
+ };
516
+
517
+ const showHelpWithDefaultCommandOptions = {
518
+ visibleOptions: (cmd) => {
519
+ let options = cmd.options;
520
+ if (!cmd.parent && options.length === 0) {
521
+ const defaultCommandName = cmd._defaultCommandName;
522
+ if (defaultCommandName) {
523
+ const defaultCommand = cmd.commands.find(item => item._name === defaultCommandName);
524
+ if (defaultCommand) {
525
+ options = defaultCommand.options;
526
+ }
527
+ }
528
+ }
529
+ return Array.from(options);
530
+ }
531
+ };
532
+
533
+ const program = new Command$1();
534
+ const Command = () => {
535
+ return {
536
+ action: async (options) => {
537
+ const config = await getConfig(options.config, options.cwd);
538
+ await setupHost(options.product, config);
539
+ },
540
+ errorHandler: async () => {
541
+ }
542
+ };
543
+ };
544
+ program
545
+ .name('dcdx configure')
546
+ .description(`Automated initial setup of the host application
547
+ If you wish to run a specific host application, call this command with 'dcdx configure <name>'`)
548
+ .addHelpText('afterAll', '​') // there is a non-zero white space because the only reason to have this is to force a line break
549
+ .configureHelp(showHelpWithDefaultCommandOptions)
550
+ .allowUnknownOption(false)
551
+ .allowExcessArguments(false)
552
+ .showHelpAfterError(true);
553
+ program
554
+ .command('default', { isDefault: true, hidden: true })
555
+ .addOption(new Option('-p, --product <name>', 'The name of the host application').choices(Object.values(SupportedApplications.Values)))
556
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
557
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
558
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
559
+ .action(options => ActionHandler(program, Command(), options));
560
+ program
561
+ .command(SupportedApplications.Values.jira)
562
+ .description('Automated initial setup of Atlassian Jira')
563
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
564
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
565
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
566
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.jira }));
567
+ program
568
+ .command(SupportedApplications.Values.confluence)
569
+ .description('Automated initial setup of Atlassian Confluence')
570
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
571
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
572
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
573
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.confluence }));
574
+ program
575
+ .command(SupportedApplications.Values.bamboo)
576
+ .description('Automated initial setup of Atlassian Bamboo')
577
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
578
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
579
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
580
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bamboo }));
581
+ program
582
+ .command(SupportedApplications.Values.bitbucket)
583
+ .description('Automated initial setup of Atlassian Bitbucket')
584
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
585
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
586
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
587
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bitbucket }));
588
+ program.parseAsync().catch(() => gracefulExit(1));
589
+ process.on('SIGINT', () => {
590
+ console.log(`Received term signal, trying to stop gracefully 💪`);
591
+ gracefulExit();
592
+ });
593
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0FjdGlvbkhhbmRsZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3RvQWJzb2x1dGVQYXRoLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9nZXRWZXJzaW9ucy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0RhdGFiYXNlLmpzIiwiLi4vLi4vZGlzdC9zcmMvdHlwZXMvQXBwbGljYXRpb24uanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWd1cmUuanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWcuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2dldENvbmZpZy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvY2FwaXRhbGl6ZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvc2V0dXBIb3N0LmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMuanMiLCIuLi8uLi9kaXN0L3NyYy9jb21tYW5kcy9jb25maWd1cmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5jb25zdCB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKCk7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGNsZWFuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBwcnVuZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgZGVidWc6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAganZtOiB6LnN0cmluZygpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAganZtOiB0cnVlLFxuICAgIGN3ZDogdHJ1ZVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyB9IGZyb20gJy4vQXBwbGljYXRpb24nO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gICAgcHJvZHVjdDogU3VwcG9ydGVkQXBwbGljYXRpb25zLFxuICAgIGNvbmZpZzogei5zdHJpbmcoKSxcbiAgICBjd2Q6IHouc3RyaW5nKClcbn0pLnBhcnRpYWwoe1xuICAgIGNvbmZpZzogdHJ1ZSxcbiAgICBjd2Q6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUJhc2UgPSB6Lm9iamVjdCh7XG4gICAgdXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgcGFzc3dvcmQ6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUppcmEgPSBDb25maWd1cmVCYXNlLmV4dGVuZCh7XG4gICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgbW9kZTogei5lbnVtKFsncHJpdmF0ZScsICdwdWJsaWMnXSksXG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBmdWxsbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmVFbWFpbDogei5lbnVtKFsnbGF0ZXInLCAnbm93J10pLFxuICAgIGVtYWlsTmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbEZyb21BZGRyZXNzOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUHJlZml4OiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmVyVHlwZTogei5lbnVtKFsnc210cCcsICdqbmRpJ10pLFxuICAgIGVtYWlsSm5kaUxvY2F0aW9uOiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmljZVByb3ZpZGVyOiB6LmVudW0oWydjdXN0b20nLCAnZ29vZ2xlLWFwcHMtbWFpbC0vLWdtYWlsLTgnLCAneWFob28hLW1haWwtcGx1cy05J10pLFxuICAgIGVtYWlsSG9zdE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWxQcm90b2NvbDogei5lbnVtKFsnU01UUCcsICdTRUNVUkVfU01UUCddKSxcbiAgICBlbWFpbFBvcnQ6IHoubnVtYmVyKCksXG4gICAgZW1haWxUaW1lb3V0OiB6Lm51bWJlcigpLFxuICAgIGVtYWlsVExTOiB6LmJvb2xlYW4oKSxcbiAgICBlbWFpbFVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgbGFuZ3VhZ2U6IHouZW51bShbXG4gICAgICAgICdlbi1VUycsXG4gICAgICAgICd6aF9DTicsXG4gICAgICAgICdjc19DWicsXG4gICAgICAgICdkYV9ESycsXG4gICAgICAgICdubF9OTCcsXG4gICAgICAgICdlbl9VSycsXG4gICAgICAgICdldF9FRScsXG4gICAgICAgICdmaV9GSScsXG4gICAgICAgICdmcl9GUicsXG4gICAgICAgICdkZV9ERScsXG4gICAgICAgICdodV9IVScsXG4gICAgICAgICdpc19JUycsXG4gICAgICAgICdpdF9JVCcsXG4gICAgICAgICdqYV9KUCcsXG4gICAgICAgICdrb19LUicsXG4gICAgICAgICdub19OTycsXG4gICAgICAgICdwbF9QTCcsXG4gICAgICAgICdwdF9CUicsXG4gICAgICAgICdyb19STycsXG4gICAgICAgICdydV9SVScsXG4gICAgICAgICdza19TSycsXG4gICAgICAgICdlc19FUycsXG4gICAgICAgICdzdl9TRSdcbiAgICBdKSxcbiAgICBhdmF0YXJQYXRoOiB6LnN0cmluZygpXG59KS5wYXJ0aWFsKHtcbiAgICBlbWFpbE5hbWU6IHRydWUsXG4gICAgZW1haWxGcm9tQWRkcmVzczogdHJ1ZSxcbiAgICBlbWFpbFByZWZpeDogdHJ1ZSxcbiAgICBlbWFpbFNlcnZlclR5cGU6IHRydWUsXG4gICAgZW1haWxKbmRpTG9jYXRpb246IHRydWUsXG4gICAgZW1haWxTZXJ2aWNlUHJvdmlkZXI6IHRydWUsXG4gICAgZW1haWxIb3N0TmFtZTogdHJ1ZSxcbiAgICBlbWFpbFByb3RvY29sOiB0cnVlLFxuICAgIGVtYWlsUG9ydDogdHJ1ZSxcbiAgICBlbWFpbFRpbWVvdXQ6IHRydWUsXG4gICAgZW1haWxUTFM6IHRydWUsXG4gICAgZW1haWxVc2VybmFtZTogdHJ1ZSxcbiAgICBlbWFpbFBhc3N3b3JkOiB0cnVlLFxuICAgIGxhbmd1YWdlOiB0cnVlLFxuICAgIGF2YXRhclBhdGg6IHRydWVcbn0pLmRlZmF1bHQoe1xuICAgIHRpdGxlOiAnSmlyYScsXG4gICAgbW9kZTogJ3ByaXZhdGUnLFxuICAgIGJhc2VVcmw6ICdodHRwOi8vbG9jYWxob3N0JyxcbiAgICBmdWxsbmFtZTogJ0FkbWluaXN0cmF0b3InLFxuICAgIGVtYWlsOiAnYWRtaW5AZXhhbXBsZS5vcmcnLFxuICAgIGNvbmZpZ3VyZUVtYWlsOiAnbGF0ZXInLFxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nXG59KTtcbmV4cG9ydCBjb25zdCBDb25maWd1cmVDb25mbHVlbmNlID0gQ29uZmlndXJlQmFzZS5leHRlbmQoe1xuICAgIGJhc2VVcmw6IHouc3RyaW5nKCksXG4gICAgZGVwbG95bWVudFR5cGU6IHouZW51bShbJ25vbi1jbHVzdGVyZWQnLCAnY2x1c3RlcmVkJ10pLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJOYW1lOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJIb21lOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJKb2luTW9kZTogei5lbnVtKFsndXNlTXVsdGljYXN0JywgJ3VzZVRjcElwJywgJ3VzZUF3cyddKSxcbiAgICBjbHVzdGVyQXV0b0FkZHJlc3M6IHouYm9vbGVhbigpLFxuICAgIGxvYWRDb250ZW50OiB6LmVudW0oWydleGFtcGxlJywgJ2VtcHR5J10pLFxuICAgIHVzZXJNYW5hZ2VtZW50OiB6LmVudW0oWydjb25mbHVlbmNlJywgJ2ppcmEnXSksXG4gICAgamlyYUJhc2VVcmw6IHouc3RyaW5nKCksXG4gICAgamlyYVVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGppcmFQYXNzd29yZDogei5zdHJpbmcoKSxcbiAgICBqaXJhVXNlckdyb3Vwczogei5zdHJpbmcoKSxcbiAgICBqaXJhQWRtaW5Hcm91cHM6IHouc3RyaW5nKCksXG59KS5wYXJ0aWFsKHtcbiAgICBjbHVzdGVyTmFtZTogdHJ1ZSxcbiAgICBjbHVzdGVySG9tZTogdHJ1ZSxcbiAgICBjbHVzdGVySm9pbk1vZGU6IHRydWUsXG4gICAgY2x1c3RlckF1dG9BZGRyZXNzOiB0cnVlLFxuICAgIGppcmFCYXNlVXJsOiB0cnVlLFxuICAgIGppcmFVc2VybmFtZTogdHJ1ZSxcbiAgICBqaXJhUGFzc3dvcmQ6IHRydWUsXG4gICAgamlyYVVzZXJHcm91cHM6IHRydWUsXG4gICAgamlyYUFkbWluR3JvdXBzOiB0cnVlXG59KS5kZWZhdWx0KHtcbiAgICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdCcsXG4gICAgZGVwbG95bWVudFR5cGU6ICdub24tY2x1c3RlcmVkJyxcbiAgICBmdWxsTmFtZTogJ0FkbWluaXN0cmF0b3InLFxuICAgIGVtYWlsOiAnYWRtaW5AZXhhbXBsZS5vcmcnLFxuICAgIGxvYWRDb250ZW50OiAnZW1wdHknLFxuICAgIHVzZXJNYW5hZ2VtZW50OiAnY29uZmx1ZW5jZScsXG4gICAgdXNlcm5hbWU6ICdhZG1pbicsXG4gICAgcGFzc3dvcmQ6ICdhZG1pbidcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUJpdGJ1Y2tldCA9IENvbmZpZ3VyZUJhc2UuZXh0ZW5kKHt9KS5kZWZhdWx0KHtcbiAgICB1c2VybmFtZTogJ2FkbWluJyxcbiAgICBwYXNzd29yZDogJ2FkbWluJ1xufSk7XG5leHBvcnQgY29uc3QgQ29uZmlndXJlQmFtYm9vID0gQ29uZmlndXJlQmFzZS5leHRlbmQoe30pLmRlZmF1bHQoe1xuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nXG59KTtcbiIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi9BcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb25maWd1cmVCYW1ib28sIENvbmZpZ3VyZUJpdGJ1Y2tldCwgQ29uZmlndXJlQ29uZmx1ZW5jZSwgQ29uZmlndXJlSmlyYSB9IGZyb20gJy4vQ29uZmlndXJlJztcbmV4cG9ydCBjb25zdCBDb25maWcgPSB6Lm9iamVjdCh7XG4gICAgc2V0dXA6IHoub2JqZWN0KHtcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYV06IENvbmZpZ3VyZUppcmEsXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2VdOiBDb25maWd1cmVDb25mbHVlbmNlLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib29dOiBDb25maWd1cmVCYW1ib28sXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldF06IENvbmZpZ3VyZUJpdGJ1Y2tldFxuICAgIH0pLnBhcnRpYWwoKVxufSkuZGVmYXVsdCh7XG4gICAgc2V0dXA6IHtcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYV06IENvbmZpZ3VyZUppcmEucGFyc2UodW5kZWZpbmVkKSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZV06IENvbmZpZ3VyZUNvbmZsdWVuY2UucGFyc2UodW5kZWZpbmVkKSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vXTogQ29uZmlndXJlQmFtYm9vLnBhcnNlKHVuZGVmaW5lZCksXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldF06IENvbmZpZ3VyZUJpdGJ1Y2tldC5wYXJzZSh1bmRlZmluZWQpXG4gICAgfVxufSk7XG4iLCIvKlxuICBDb2RlIGF0cnJpYnV0aW9uXG4gIGJvcnJvd2VkIHNvbWUgbG9naWMgZm9yIGxvYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIEVTTGludFxuICBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL21haW4vbGliL2NvbmZpZy9jb25maWctbG9hZGVyLmpzXG4qL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL0NvbmZpZyc7XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gYXN5bmMgKHBhdGgsIGN3ZCkgPT4ge1xuICAgIGxldCBjb25maWc7XG4gICAgY29uc3QgZGlyZWN0b3J5ID0gY3dkIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGggfHwgJ2RjZHguY29uZmlnLm1qcyc7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGlzQWJzb2x1dGUoY29uZmlnRmlsZSkgJiYgZXhpc3RzU3luYyhjb25maWdGaWxlKSA/IGNvbmZpZ0ZpbGUgOiBqb2luKGRpcmVjdG9yeSwgY29uZmlnRmlsZSk7XG4gICAgaWYgKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgLypcbiAgICAgICAgKiBFeHBsYW5hdGlvbiBjb3BpZWQgZnJvbSBFU0xpbnRcbiAgICAgICAgKlxuICAgICAgICAqIEFwcGVuZCBhIHF1ZXJ5IHdpdGggdGhlIGNvbmZpZyBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUgKGBtdGltZWApIGluIG9yZGVyXG4gICAgICAgICogdG8gaW1wb3J0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGNvbmZpZyBmaWxlLiBXaXRob3V0IHRoZSBxdWVyeSwgYGltcG9ydCgpYCB3b3VsZFxuICAgICAgICAqIGNhY2hlIHRoZSBjb25maWcgZmlsZSBtb2R1bGUgYnkgdGhlIHBhdGhuYW1lIG9ubHksIGFuZCB0aGVuIGFsd2F5cyByZXR1cm5cbiAgICAgICAgKiB0aGUgc2FtZSB2ZXJzaW9uICh0aGUgb25lIHRoYXQgd2FzIGFjdHVhbCB3aGVuIHRoZSBtb2R1bGUgd2FzIGltcG9ydGVkIGZvciB0aGUgZmlyc3QgdGltZSkuXG4gICAgICAgICpcbiAgICAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY29uZmlnIGZpbGUgbW9kdWxlIGlzIGxvYWRlZCBhbmQgZXhlY3V0ZWQgYWdhaW5cbiAgICAgICAgKiBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGltcG9ydGVkLlxuICAgICAgICAqIElmIGl0IGhhc24ndCBiZWVuIGNoYW5nZWQsIGBpbXBvcnQoKWAgd2lsbCBqdXN0IHJldHVybiB0aGUgY2FjaGVkIHZlcnNpb24uXG4gICAgICAgICpcbiAgICAgICAgKiBOb3RlIHRoYXQgd2Ugc2hvdWxkIG5vdCBvdmVydXNlIHF1ZXJpZXMgKGUuZy4sIGJ5IGFwcGVuZGluZyB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgICogdG8gYWx3YXlzIHJlbG9hZCB0aGUgY29uZmlnIGZpbGUgbW9kdWxlKSBhcyB0aGF0IGNvdWxkIGNhdXNlIG1lbW9yeSBsZWFrc1xuICAgICAgICAqIGJlY2F1c2UgZW50cmllcyBhcmUgbmV2ZXIgcmVtb3ZlZCBmcm9tIHRoZSBpbXBvcnQgY2FjaGUuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IG10aW1lID0gc3RhdFN5bmMoY29uZmlnUGF0aCkubXRpbWUuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVVJMID0gcGF0aFRvRmlsZVVSTChjb25maWdQYXRoKTtcbiAgICAgICAgZmlsZVVSTC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdtdGltZScsIG10aW1lLnRvRml4ZWQoKSk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZVVSTC50b1N0cmluZygpO1xuICAgICAgICBjb25maWcgPSAoYXdhaXQgaW1wb3J0KGZpbGVQYXRoKSkuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIENvbmZpZy5wYXJzZShjb25maWcpO1xufTtcbiIsImV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHZhbHVlKSA9PiB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xuIiwiaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuaW1wb3J0IHsgQ29uZmlndXJlQ29uZmx1ZW5jZSwgQ29uZmlndXJlSmlyYSB9IGZyb20gJy4uL3R5cGVzL0NvbmZpZ3VyZSc7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnLi9jYXBpdGFsaXplJztcbmV4cG9ydCBjb25zdCBzZXR1cEhvc3QgPSBhc3luYyAobmFtZSwgY29uZmlnKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5zZXR1cFtuYW1lXTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbml0aWFsIHNldHVwIGNvbmZpZ3VyYXRpb24gZm9yICR7Y2FwaXRhbGl6ZShuYW1lKX1gKTtcbiAgICB9XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwSmlyYShDb25maWd1cmVKaXJhLnBhcnNlKG9wdGlvbnMpKTtcbiAgICAgICAgY2FzZSBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2U6XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBDb25mbHVlbmNlKENvbmZpZ3VyZUNvbmZsdWVuY2UucGFyc2Uob3B0aW9ucykpO1xuICAgICAgICBjYXNlIFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0OlxuICAgICAgICAgICAgY29uc29sZS5sb2coJ09vcHNpZSBkYWlzeSDwn4y8IEF0bGFzc2lhbiBCaXRidWNrZXQgZG9lcyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIHNldHVwIPCfpJYnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5jb25zdCBzZXR1cEppcmEgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIExhdW5jaCBHb29nbGUgQ2hyb21lXG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFnZSB2aWV3XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydCh7IHdpZHRoOiAxMDgwLCBoZWlnaHQ6IDEwMjQgfSk7XG4gICAgICAgIC8vIE9wZW4gdGhlIFNldHVwIHBhZ2VcbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBKaXJhIPCfpJZgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5nb3RvKG9wdGlvbnMuYmFzZVVybCwgeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHByb2dyZXNzIGhhcyBlbmRlZFxuICAgICAgICBjb25zdCBpc1N0aWxsTG9hZGluZyA9ICEhYXdhaXQgcGFnZS4kKCcjcHJvZ3Jlc3MnKTtcbiAgICAgICAgaWYgKGlzU3RpbGxMb2FkaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgQXRsYXNzaWFuIEppcmEgdG8gYmUgcmVhZHkuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHsgd2FpdFVudGlsOiBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnbG9hZCcsICduZXR3b3JraWRsZTAnXSwgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgYXBwbGljYXRpb24gcHJvcGVydGllc1xuICAgICAgICBjb25zdCBtdXN0U2V0dXBBcHBsaWNhdGlvblByb3BlcnRpZXMgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcy5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBcHBsaWNhdGlvblByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIGFwcGxpY2F0aW9uIHByb3BlcnRpZXMnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT10aXRsZV0nKS5maWxsKG9wdGlvbnMudGl0bGUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9amlyYS1zZXR1cHdpemFyZC1tb2RlLSR7b3B0aW9ucy5tb2RlfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWJhc2VVUkxdJykuZmlsbChvcHRpb25zLmJhc2VVcmwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjamlyYS1zZXR1cHdpemFyZC1zdWJtaXQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQgc2V0dXAgd2l6YXJkIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignZm9ybVthY3Rpb249XCJTZXR1cEFkbWluQWNjb3VudC5qc3BhXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBhZG1pbmlzdHJhdG9yIGFjY291bnRcbiAgICAgICAgY29uc3QgbXVzdFNldHVwQWRtaW5BY2NvdW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBBZG1pbkFjY291bnQuanNwYVwiXScpO1xuICAgICAgICBpZiAobXVzdFNldHVwQWRtaW5BY2NvdW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZnVsbG5hbWVdJykuZmlsbChvcHRpb25zLmZ1bGxuYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1lbWFpbF0nKS5maWxsKG9wdGlvbnMuZW1haWwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXVzZXJuYW1lXScpLmZpbGwob3B0aW9ucy51c2VybmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9cGFzc3dvcmRdJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1jb25maXJtXScpLmZpbGwob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGVtYWlsIG5vdGlmaWNhdGlvbiBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cIlNldHVwTWFpbE5vdGlmaWNhdGlvbnMuanNwYVwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgZW1haWwgbm90aWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBtdXN0U2V0dXBFbWFpbE5vdGlmaWNhdGlvbiA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cIlNldHVwTWFpbE5vdGlmaWNhdGlvbnMuanNwYVwiXScpO1xuICAgICAgICBpZiAobXVzdFNldHVwRW1haWxOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBlbWFpbCBub3RpZmljYXRpb24gc2V0dGluZ3MnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyZUVtYWlsTm90aWZpY2F0aW9ucyA9IG9wdGlvbnMuY29uZmlndXJlRW1haWwgPT09ICdsYXRlcicgPyAnZGlzYWJsZWQnIDogJ2VuYWJsZWQnO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9amlyYS1zZXR1cHdpemFyZC1lbWFpbC1ub3RpZmljYXRpb25zLSR7Y29uZmlndXJlRW1haWxOb3RpZmljYXRpb25zfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjamlyYS1zZXR1cHdpemFyZC1zdWJtaXQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBsYW5ndWFnZSBjaG9vc2VyIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI2Nob29zZS1sYW5ndWFnZS1mb3JtJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlbGNvbWUgdG8gSmlyYSwgQWRtaW5pc3RyYXRvciFcbiAgICAgICAgY29uc3QgbXVzdFNldHVwTGFuZ3VhZ2UgPSAhIWF3YWl0IHBhZ2UuJCgnI2Nob29zZS1sYW5ndWFnZS1mb3JtJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBMYW5ndWFnZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgdGhlIGxhbmd1YWdlIGZvciB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZVNlbGVjdG9yID0gIW9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5sYW5ndWFnZSA9PT0gJ2VuLVVTJyA/ICdsb2NhbGVfLTEnIDogYGxvY2FsZV8ke29wdGlvbnMubGFuZ3VhZ2V9YDtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihgbGFiZWxbZm9yPSR7bGFuZ3VhZ2VTZWxlY3Rvcn1dYCkuY2xpY2soKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI25leHQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBhdmF0YXIgc2V0dXAgd2l6YXJkIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignLm9uYm9hcmRpbmctc2VxdWVuY2UtYXZhdGFyLXBpY2tlcicsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdXN0U2V0dXBBdmF0YXIgPSAhIWF3YWl0IHBhZ2UuJCgnLm9uYm9hcmRpbmctc2VxdWVuY2UtYXZhdGFyLXBpY2tlcicpO1xuICAgICAgICBpZiAobXVzdFNldHVwQXZhdGFyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgYXZhdGFyIGZvciB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0LmF2YXRhci1waWNrZXItZG9uZScpLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI29uYm9hcmRpbmcnLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UncmUgZG9uZSBoZXJlLCBsZXQncyB3cmFwIHRoaW5ncyB1cFxuICAgICAgICBjb25zb2xlLmxvZyhgRmluaXNoZWQgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEppcmEg8J+SqmApO1xuICAgICAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0dXAgQXRsYXNzaWFuIEppcmEnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBzZXR1cENvbmZsdWVuY2UgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIExhdW5jaCBHb29nbGUgQ2hyb21lXG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFnZSB2aWV3XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydCh7IHdpZHRoOiAxMDgwLCBoZWlnaHQ6IDEwMjQgfSk7XG4gICAgICAgIC8vIE9wZW4gdGhlIFNldHVwIHBhZ2VcbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBDb25mbHVlbmNlIPCfpJZgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5nb3RvKG9wdGlvbnMuYmFzZVVybCwgeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAvLyBDaG9vc2UgeW91ciBkZXBsb3ltZW50IHR5cGVcbiAgICAgICAgY29uc3QgbXVzdENob29zZURlcGxveW1lbnRUeXBlID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBjbHVzdGVyLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENob29zZURlcGxveW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCBkZXBsb3ltZW50IHR5cGUnKTtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJpbmdTdGF0dXMgPSBvcHRpb25zLmRlcGxveW1lbnRUeXBlID09PSAnY2x1c3RlcmVkJyA/ICdjbHVzdGVyaW5nRW5hYmxlZCcgOiAnY2x1c3RlcmluZ0Rpc2FibGVkJztcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihgbGFiZWxbZm9yPSR7Y2x1c3RlcmluZ1N0YXR1c31dYCkuY2xpY2soKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlcGxveW1lbnRUeXBlID09PSAnY2x1c3RlcmVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBjbHVzdGVyIG9wdGlvbnNcbiAgICAgICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2J1dHRvbltuYW1lPW5ld0NsdXN0ZXJdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI3NraXAtYnV0dG9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgY29udGVudCBjaG9vc2VyIHBhZ2UgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwZGF0YS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZCBDb250ZW50XG4gICAgICAgIGNvbnN0IG11c3RMb2FkQ29udGVudCA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cInNldHVwZGF0YS5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RMb2FkQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubG9hZENvbnRlbnQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2RlbW9DaG9pY2VGb3JtID4gaW5wdXRbdHlwZT1zdWJtaXRdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2JsYW5rQ2hvaWNlRm9ybSA+IGlucHV0W3R5cGU9c3VibWl0XScpLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIHVzZXIgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIHBhZ2UgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwdXNlcm1hbmFnZW1lbnRjaG9pY2UuYWN0aW9uXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbmZpZ3VyZSBVc2VyIE1hbmFnZW1lbnRcbiAgICAgICAgY29uc3QgbXVzdENvbmZpZ3VyZVVzZXJNYW5hZ2VtZW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXB1c2VybWFuYWdlbWVudGNob2ljZS5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RDb25maWd1cmVVc2VyTWFuYWdlbWVudCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudXNlck1hbmFnZW1lbnQgPT09ICdjb25mbHVlbmNlJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2ludGVybmFsJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdGlvbiBhY2NvdW50IGNvbmZpZ3VyYXRpb24gcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwYWRtaW5pc3RyYXRvci5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqYWFjcycpLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBDb25uZWN0IHRvIEppcmEgcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cImNvbm5lY3R0b2ppcmEuYWN0aW9uXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENvbmZpZ3VyZSBTeXN0ZW0gQWRtaW5pc3RyYXRvciBBY2NvdW50XG4gICAgICAgIGNvbnN0IG11c3RDb25maWd1cmVBZG1pbmlzdHJhdG9yQWNjb3VudCA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cInNldHVwYWRtaW5pc3RyYXRvci5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RDb25maWd1cmVBZG1pbmlzdHJhdG9yQWNjb3VudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvbmZpZ3VyaW5nIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT11c2VybmFtZV0nKS5maWxsKG9wdGlvbnMudXNlcm5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWZ1bGxOYW1lXScpLmZpbGwob3B0aW9ucy5mdWxsTmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZW1haWxdJykuZmlsbChvcHRpb25zLmVtYWlsKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1wYXNzd29yZF0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWNvbmZpcm1dJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI3NldHVwLW5leHQtYnV0dG9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgc2V0dXAgc3VjY2Vzc2Z1bCBub3RpZmljYXRpb24gdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdhLmZpbmlzaEFjdGlvbicsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdXN0RmluaXNoU2V0dXAgPSAhIWF3YWl0IHBhZ2UuJCgnYS5maW5pc2hBY3Rpb24nKTtcbiAgICAgICAgaWYgKG11c3RGaW5pc2hTZXR1cCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmFsaXppbmcgaW5pdGlhbCBDb25mbHVlbmNlIHNldHVwJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2EuZmluaXNoQWN0aW9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgaW5pdGlhbCBzcGFjZSBjcmVhdGlvbiBmb3JtIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI2dyb3ctaW50cm8tY3JlYXRlLXNwYWNlJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUgaGVyZSwgbGV0J3Mgd3JhcCB0aGluZ3MgdXBcbiAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBDb25mbHVlbmNlIPCfkqpgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5jbG9zZSgpO1xuICAgICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhdXRvbWF0aWNhbGx5IHNldHVwIEF0bGFzc2lhbiBDb25mbHVlbmNlJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIiwiZXhwb3J0IGNvbnN0IHNob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucyA9IHtcbiAgICB2aXNpYmxlT3B0aW9uczogKGNtZCkgPT4ge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IGNtZC5vcHRpb25zO1xuICAgICAgICBpZiAoIWNtZC5wYXJlbnQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fZGVmYXVsdENvbW1hbmROYW1lO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb21tYW5kID0gY21kLmNvbW1hbmRzLmZpbmQoaXRlbSA9PiBpdGVtLl9uYW1lID09PSBkZWZhdWx0Q29tbWFuZE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZGVmYXVsdENvbW1hbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucyk7XG4gICAgfVxufTtcbiIsIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IENvbW1hbmQgYXMgQ29tbWFuZGVyLCBPcHRpb24gfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IEFjdGlvbkhhbmRsZXIgfSBmcm9tICcuLi9oZWxwZXJzL0FjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vaGVscGVycy9nZXRDb25maWcnO1xuaW1wb3J0IHsgc2V0dXBIb3N0IH0gZnJvbSAnLi4vaGVscGVycy9zZXR1cEhvc3QnO1xuaW1wb3J0IHsgc2hvd0hlbHBXaXRoRGVmYXVsdENvbW1hbmRPcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kZXIoKTtcbmNvbnN0IENvbW1hbmQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKG9wdGlvbnMuY29uZmlnLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgICAgICBhd2FpdCBzZXR1cEhvc3Qob3B0aW9ucy5wcm9kdWN0LCBjb25maWcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvckhhbmRsZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgfVxuICAgIH07XG59O1xucHJvZ3JhbVxuICAgIC5uYW1lKCdkY2R4IGNvbmZpZ3VyZScpXG4gICAgLmRlc2NyaXB0aW9uKGBBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvblxuSWYgeW91IHdpc2ggdG8gcnVuIGEgc3BlY2lmaWMgaG9zdCBhcHBsaWNhdGlvbiwgY2FsbCB0aGlzIGNvbW1hbmQgd2l0aCAnZGNkeCBjb25maWd1cmUgPG5hbWU+J2ApXG4gICAgLmFkZEhlbHBUZXh0KCdhZnRlckFsbCcsICfigIsnKSAvLyB0aGVyZSBpcyBhIG5vbi16ZXJvIHdoaXRlIHNwYWNlIGJlY2F1c2UgdGhlIG9ubHkgcmVhc29uIHRvIGhhdmUgdGhpcyBpcyB0byBmb3JjZSBhIGxpbmUgYnJlYWtcbiAgICAuY29uZmlndXJlSGVscChzaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMpXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbihmYWxzZSlcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoZmFsc2UpXG4gICAgLnNob3dIZWxwQWZ0ZXJFcnJvcih0cnVlKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZCgnZGVmYXVsdCcsIHsgaXNEZWZhdWx0OiB0cnVlLCBoaWRkZW46IHRydWUgfSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1wLCAtLXByb2R1Y3QgPG5hbWU+JywgJ1RoZSBuYW1lIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuY2hvaWNlcyhPYmplY3QudmFsdWVzKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMpKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIG9wdGlvbnMpKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmEpXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gSmlyYScpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYSB9KSk7XG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlKVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2UnKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgeyAuLi5vcHRpb25zLCBuYW1lOiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UgfSkpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vKVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEJhbWJvbycpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vIH0pKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldClcbiAgICAuZGVzY3JpcHRpb24oJ0F1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBCaXRidWNrZXQnKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgeyAuLi5vcHRpb25zLCBuYW1lOiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldCB9KSk7XG5wcm9ncmFtLnBhcnNlQXN5bmMoKS5jYXRjaCgoKSA9PiBncmFjZWZ1bEV4aXQoMSkpO1xucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBSZWNlaXZlZCB0ZXJtIHNpZ25hbCwgdHJ5aW5nIHRvIHN0b3AgZ3JhY2VmdWxseSDwn5KqYCk7XG4gICAgZ3JhY2VmdWxFeGl0KCk7XG59KTtcbiJdLCJuYW1lcyI6WyJDb21tYW5kZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVPLE1BQU0sYUFBYSxHQUFHLE9BQU8sT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFB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RSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDckMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDckMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN0QixDQUFDLENBQUMsQ0FBQztBQUM4QixlQUFlLENBQUMsTUFBTSxDQUFDO0FBQ3hELElBQUksSUFBSSxFQUFFLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUMxSixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDekgsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFD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