dcdx 1.3.0-next.44 → 1.3.0-next.46
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/versions.json +1 -1
- package/lib/commands/apt.js +217 -8995
- package/lib/commands/build.js +394 -9008
- package/lib/commands/configure.js +560 -0
- package/lib/commands/database.js +15 -8968
- package/lib/commands/debug.js +774 -9019
- package/lib/commands/install.js +463 -9587
- package/lib/commands/reset.js +413 -8975
- package/lib/commands/run.js +467 -9006
- package/lib/commands/stop.js +413 -8975
- package/lib/commands/update.js +7 -8957
- package/lib/index.js +33 -2
- package/lib/types/src/applications/base.d.ts +2 -0
- package/lib/types/src/apt/helpers/downloadFile.d.ts +1 -0
- package/lib/types/src/apt/helpers/getRunForStage.d.ts +1 -1
- package/lib/types/src/apt/helpers/getUrlByAppKey.d.ts +1 -0
- package/lib/types/src/apt/helpers/installAppInCluster.d.ts +2 -0
- package/lib/types/src/commands/configure.d.ts +2 -0
- package/lib/types/src/helpers/ActionHandler.d.ts +1 -40
- package/lib/types/src/helpers/getConfig.d.ts +2 -0
- package/lib/types/src/helpers/getMainArtifactFromOBR.d.ts +1 -0
- package/lib/types/src/helpers/installFromMPAC.d.ts +2 -0
- package/lib/types/src/helpers/installFromURL.d.ts +2 -0
- package/lib/types/src/helpers/installWithQuickReload.d.ts +2 -0
- package/lib/types/src/helpers/setupHost.d.ts +3 -0
- package/lib/types/src/helpers/validateAtlassianPlugin.d.ts +4 -0
- package/lib/types/src/types/AMPS.d.ts +12 -0
- package/lib/types/src/types/Application.d.ts +6 -0
- package/lib/types/src/types/Config.d.ts +328 -0
- package/lib/types/src/types/Configure.d.ts +145 -0
- package/lib/types/src/types/DCAPT.d.ts +135 -36
- package/lib/types/src/types/FileWatcher.d.ts +3 -0
- package/lib/types/src/types/Install.d.ts +179 -39
- package/package.json +1 -1
- package/lib/types/src/apt/helpers/downloadApp.d.ts +0 -1
- package/lib/types/src/apt/helpers/installApp.d.ts +0 -2
- package/lib/types/src/helpers/Installer.d.ts +0 -3
|
@@ -0,0 +1,560 @@
|
|
|
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 ConfigureJira = z.object({
|
|
164
|
+
title: z.string(),
|
|
165
|
+
mode: z.enum(['private', 'public']),
|
|
166
|
+
baseUrl: z.string(),
|
|
167
|
+
fullname: z.string(),
|
|
168
|
+
email: z.string(),
|
|
169
|
+
username: z.string(),
|
|
170
|
+
password: z.string(),
|
|
171
|
+
configureEmail: z.enum(['later', 'now']),
|
|
172
|
+
emailName: z.string(),
|
|
173
|
+
emailFromAddress: z.string(),
|
|
174
|
+
emailPrefix: z.string(),
|
|
175
|
+
emailServerType: z.enum(['smtp', 'jndi']),
|
|
176
|
+
emailJndiLocation: z.string(),
|
|
177
|
+
emailServiceProvider: z.enum(['custom', 'google-apps-mail-/-gmail-8', 'yahoo!-mail-plus-9']),
|
|
178
|
+
emailHostName: z.string(),
|
|
179
|
+
emailProtocol: z.enum(['SMTP', 'SECURE_SMTP']),
|
|
180
|
+
emailPort: z.number(),
|
|
181
|
+
emailTimeout: z.number(),
|
|
182
|
+
emailTLS: z.boolean(),
|
|
183
|
+
emailUsername: z.string(),
|
|
184
|
+
emailPassword: z.string(),
|
|
185
|
+
language: z.enum([
|
|
186
|
+
'en-US',
|
|
187
|
+
'zh_CN',
|
|
188
|
+
'cs_CZ',
|
|
189
|
+
'da_DK',
|
|
190
|
+
'nl_NL',
|
|
191
|
+
'en_UK',
|
|
192
|
+
'et_EE',
|
|
193
|
+
'fi_FI',
|
|
194
|
+
'fr_FR',
|
|
195
|
+
'de_DE',
|
|
196
|
+
'hu_HU',
|
|
197
|
+
'is_IS',
|
|
198
|
+
'it_IT',
|
|
199
|
+
'ja_JP',
|
|
200
|
+
'ko_KR',
|
|
201
|
+
'no_NO',
|
|
202
|
+
'pl_PL',
|
|
203
|
+
'pt_BR',
|
|
204
|
+
'ro_RO',
|
|
205
|
+
'ru_RU',
|
|
206
|
+
'sk_SK',
|
|
207
|
+
'es_ES',
|
|
208
|
+
'sv_SE'
|
|
209
|
+
]),
|
|
210
|
+
avatarPath: z.string()
|
|
211
|
+
}).partial({
|
|
212
|
+
emailName: true,
|
|
213
|
+
emailFromAddress: true,
|
|
214
|
+
emailPrefix: true,
|
|
215
|
+
emailServerType: true,
|
|
216
|
+
emailJndiLocation: true,
|
|
217
|
+
emailServiceProvider: true,
|
|
218
|
+
emailHostName: true,
|
|
219
|
+
emailProtocol: true,
|
|
220
|
+
emailPort: true,
|
|
221
|
+
emailTimeout: true,
|
|
222
|
+
emailTLS: true,
|
|
223
|
+
emailUsername: true,
|
|
224
|
+
emailPassword: true,
|
|
225
|
+
language: true,
|
|
226
|
+
avatarPath: true
|
|
227
|
+
});
|
|
228
|
+
const ConfigureConfluence = z.object({
|
|
229
|
+
baseUrl: z.string(),
|
|
230
|
+
deploymentType: z.enum(['non-clustered', 'clustered']),
|
|
231
|
+
username: z.string(),
|
|
232
|
+
fullName: z.string(),
|
|
233
|
+
email: z.string(),
|
|
234
|
+
password: z.string(),
|
|
235
|
+
clusterName: z.string(),
|
|
236
|
+
clusterHome: z.string(),
|
|
237
|
+
clusterJoinMode: z.enum(['useMulticast', 'useTcpIp', 'useAws']),
|
|
238
|
+
clusterAutoAddress: z.boolean(),
|
|
239
|
+
loadContent: z.enum(['example', 'empty']),
|
|
240
|
+
userManagement: z.enum(['confluence', 'jira']),
|
|
241
|
+
jiraBaseUrl: z.string(),
|
|
242
|
+
jiraUsername: z.string(),
|
|
243
|
+
jiraPassword: z.string(),
|
|
244
|
+
jiraUserGroups: z.string(),
|
|
245
|
+
jiraAdminGroups: z.string(),
|
|
246
|
+
}).partial({
|
|
247
|
+
clusterName: true,
|
|
248
|
+
clusterHome: true,
|
|
249
|
+
clusterJoinMode: true,
|
|
250
|
+
clusterAutoAddress: true,
|
|
251
|
+
jiraBaseUrl: true,
|
|
252
|
+
jiraUsername: true,
|
|
253
|
+
jiraPassword: true,
|
|
254
|
+
jiraUserGroups: true,
|
|
255
|
+
jiraAdminGroups: true
|
|
256
|
+
});
|
|
257
|
+
|
|
258
|
+
const Config = z.object({
|
|
259
|
+
setup: z.object({
|
|
260
|
+
[SupportedApplications.Values.jira]: ConfigureJira,
|
|
261
|
+
[SupportedApplications.Values.confluence]: ConfigureConfluence,
|
|
262
|
+
[SupportedApplications.Values.bamboo]: z.object({}),
|
|
263
|
+
[SupportedApplications.Values.bitbucket]: z.object({})
|
|
264
|
+
}).partial()
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
/*
|
|
268
|
+
Code atrribution
|
|
269
|
+
borrowed some logic for loading configuration files from ESLint
|
|
270
|
+
https://github.com/eslint/eslint/blob/main/lib/config/config-loader.js
|
|
271
|
+
*/
|
|
272
|
+
const getConfig = async (path, cwd) => {
|
|
273
|
+
const directory = cwd || process.cwd();
|
|
274
|
+
const configFile = path || 'dcdx.config.mjs';
|
|
275
|
+
const configPath = isAbsolute(configFile) && existsSync(configFile) ? configFile : join(directory, configFile);
|
|
276
|
+
if (!existsSync(configPath)) {
|
|
277
|
+
throw new Error('Unable to find dcdx configuration file. Please make sure to specify the correct working directory (--cwd) or path to the file (-c, --config)');
|
|
278
|
+
}
|
|
279
|
+
/*
|
|
280
|
+
* Explanation copied from ESLint
|
|
281
|
+
*
|
|
282
|
+
* Append a query with the config file's modification time (`mtime`) in order
|
|
283
|
+
* to import the current version of the config file. Without the query, `import()` would
|
|
284
|
+
* cache the config file module by the pathname only, and then always return
|
|
285
|
+
* the same version (the one that was actual when the module was imported for the first time).
|
|
286
|
+
*
|
|
287
|
+
* This ensures that the config file module is loaded and executed again
|
|
288
|
+
* if it has been changed since the last time it was imported.
|
|
289
|
+
* If it hasn't been changed, `import()` will just return the cached version.
|
|
290
|
+
*
|
|
291
|
+
* Note that we should not overuse queries (e.g., by appending the current time
|
|
292
|
+
* to always reload the config file module) as that could cause memory leaks
|
|
293
|
+
* because entries are never removed from the import cache.
|
|
294
|
+
*/
|
|
295
|
+
const mtime = statSync(configPath).mtime.getTime();
|
|
296
|
+
const fileURL = pathToFileURL(configPath);
|
|
297
|
+
fileURL.searchParams.append('mtime', mtime.toFixed());
|
|
298
|
+
const filePath = fileURL.toString();
|
|
299
|
+
const result = (await import(filePath)).default;
|
|
300
|
+
return Config.parse(result);
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
const capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
|
|
304
|
+
|
|
305
|
+
const setupHost = async (name, config) => {
|
|
306
|
+
const options = config.setup[name];
|
|
307
|
+
if (!options) {
|
|
308
|
+
throw new Error(`Could not find initial setup configuration for ${capitalize(name)}`);
|
|
309
|
+
}
|
|
310
|
+
switch (name) {
|
|
311
|
+
case SupportedApplications.Values.jira:
|
|
312
|
+
return setupJira(ConfigureJira.parse(options));
|
|
313
|
+
case SupportedApplications.Values.confluence:
|
|
314
|
+
return setupConfluence(ConfigureConfluence.parse(options));
|
|
315
|
+
case SupportedApplications.Values.bitbucket:
|
|
316
|
+
console.log('Oopsie daisy 🌼 Atlassian Bitbucket does not require additional setup 🤖');
|
|
317
|
+
return true;
|
|
318
|
+
}
|
|
319
|
+
return true;
|
|
320
|
+
};
|
|
321
|
+
const setupJira = async (options) => {
|
|
322
|
+
try {
|
|
323
|
+
// Launch Google Chrome
|
|
324
|
+
const browser = await puppeteer.launch();
|
|
325
|
+
// Create the page view
|
|
326
|
+
const page = await browser.newPage();
|
|
327
|
+
await page.setViewport({ width: 1080, height: 1024 });
|
|
328
|
+
// Open the Setup page
|
|
329
|
+
console.log(`Starting automated initial setup of Atlassian Jira 🤖`);
|
|
330
|
+
await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
331
|
+
// We need to make sure that progress has ended
|
|
332
|
+
const isStillLoading = !!await page.$('#progress');
|
|
333
|
+
if (isStillLoading) {
|
|
334
|
+
console.log('Waiting for Atlassian Jira to be ready... ⏳');
|
|
335
|
+
await page.waitForNavigation({ waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
336
|
+
}
|
|
337
|
+
// Set up application properties
|
|
338
|
+
const mustSetupApplicationProperties = !!await page.$('form[action="SetupApplicationProperties.jspa"]');
|
|
339
|
+
if (mustSetupApplicationProperties) {
|
|
340
|
+
console.log('Setting up application properties');
|
|
341
|
+
await page.locator('input[name=title]').fill(options.title);
|
|
342
|
+
await page.locator(`label[for=jira-setupwizard-mode-${options.mode}]`).click();
|
|
343
|
+
await page.locator('input[name=baseURL]').fill(options.baseUrl);
|
|
344
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
345
|
+
console.log('Waiting for the administrator account setup wizard to load... ⏳');
|
|
346
|
+
await page.waitForSelector('form[action="SetupAdminAccount.jspa"]', { timeout: 5 * 60 * 1000 });
|
|
347
|
+
}
|
|
348
|
+
// Set up administrator account
|
|
349
|
+
const mustSetupAdminAccount = !!await page.$('form[action="SetupAdminAccount.jspa"]');
|
|
350
|
+
if (mustSetupAdminAccount) {
|
|
351
|
+
console.log('Setting up the administrator account');
|
|
352
|
+
await page.locator('input[name=fullname]').fill(options.fullname);
|
|
353
|
+
await page.locator('input[name=email]').fill(options.email);
|
|
354
|
+
await page.locator('input[name=username]').fill(options.username);
|
|
355
|
+
await page.locator('input[name=password]').fill(options.password);
|
|
356
|
+
await page.locator('input[name=confirm]').fill(options.password);
|
|
357
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
358
|
+
console.log('Waiting for the email notification setup wizard to load... ⏳');
|
|
359
|
+
await page.waitForSelector('form[action="SetupMailNotifications.jspa"]', { timeout: 5 * 60 * 1000 });
|
|
360
|
+
}
|
|
361
|
+
// Set up email notifications
|
|
362
|
+
const mustSetupEmailNotification = !!await page.$('form[action="SetupMailNotifications.jspa"]');
|
|
363
|
+
if (mustSetupEmailNotification) {
|
|
364
|
+
console.log('Setting up the email notification settings');
|
|
365
|
+
const configureEmailNotifications = options.configureEmail === 'later' ? 'disabled' : 'enabled';
|
|
366
|
+
await page.locator(`label[for=jira-setupwizard-email-notifications-${configureEmailNotifications}]`).click();
|
|
367
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
368
|
+
console.log('Waiting for the language chooser to load... ⏳');
|
|
369
|
+
await page.waitForSelector('#choose-language-form', { timeout: 5 * 60 * 1000 });
|
|
370
|
+
}
|
|
371
|
+
// Welcome to Jira, Administrator!
|
|
372
|
+
const mustSetupLanguage = !!await page.$('#choose-language-form');
|
|
373
|
+
if (mustSetupLanguage) {
|
|
374
|
+
console.log('Setting up the language for the administrator account');
|
|
375
|
+
const languageSelector = !options.language || options.language === 'en-US' ? 'locale_-1' : `locale_${options.language}`;
|
|
376
|
+
await page.locator(`label[for=${languageSelector}]`).click();
|
|
377
|
+
await page.locator('#next').click();
|
|
378
|
+
console.log('Waiting for the avatar setup wizard to load... ⏳');
|
|
379
|
+
await page.waitForSelector('.onboarding-sequence-avatar-picker', { timeout: 5 * 60 * 1000 });
|
|
380
|
+
}
|
|
381
|
+
const mustSetupAvatar = !!await page.$('.onboarding-sequence-avatar-picker');
|
|
382
|
+
if (mustSetupAvatar) {
|
|
383
|
+
console.log('Setting up the avatar for the administrator account');
|
|
384
|
+
await page.locator('input.avatar-picker-done').click();
|
|
385
|
+
await page.waitForSelector('#onboarding', { timeout: 5 * 60 * 1000 });
|
|
386
|
+
}
|
|
387
|
+
// We're done here, let's wrap things up
|
|
388
|
+
console.log(`Finished automated initial setup of Atlassian Jira 💪`);
|
|
389
|
+
await page.close();
|
|
390
|
+
await browser.close();
|
|
391
|
+
return true;
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
console.error('Failed to automatically setup Atlassian Jira');
|
|
395
|
+
console.log(err);
|
|
396
|
+
return false;
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
const setupConfluence = async (options) => {
|
|
400
|
+
try {
|
|
401
|
+
// Launch Google Chrome
|
|
402
|
+
const browser = await puppeteer.launch();
|
|
403
|
+
// Create the page view
|
|
404
|
+
const page = await browser.newPage();
|
|
405
|
+
await page.setViewport({ width: 1080, height: 1024 });
|
|
406
|
+
// Open the Setup page
|
|
407
|
+
console.log(`Starting automated initial setup of Atlassian Confluence 🤖`);
|
|
408
|
+
await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
409
|
+
// Choose your deployment type
|
|
410
|
+
const mustChooseDeploymentType = !!await page.$('form[action="setupcluster.action"]');
|
|
411
|
+
if (mustChooseDeploymentType) {
|
|
412
|
+
console.log('Setting up deployment type');
|
|
413
|
+
const clusteringStatus = options.deploymentType === 'clustered' ? 'clusteringEnabled' : 'clusteringDisabled';
|
|
414
|
+
await page.locator(`label[for=${clusteringStatus}]`).click();
|
|
415
|
+
if (options.deploymentType === 'clustered') {
|
|
416
|
+
// TODO: add cluster options
|
|
417
|
+
await page.locator('button[name=newCluster]').click();
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
await page.locator('#skip-button').click();
|
|
421
|
+
}
|
|
422
|
+
console.log('Waiting for the content chooser page to load... ⏳');
|
|
423
|
+
await page.waitForSelector('form[action="setupdata.action"]', { timeout: 5 * 60 * 1000 });
|
|
424
|
+
}
|
|
425
|
+
// Load Content
|
|
426
|
+
const mustLoadContent = !!await page.$('form[action="setupdata.action"]');
|
|
427
|
+
if (mustLoadContent) {
|
|
428
|
+
if (options.loadContent === 'example') {
|
|
429
|
+
await page.locator('#demoChoiceForm > input[type=submit]').click();
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
await page.locator('#blankChoiceForm > input[type=submit]').click();
|
|
433
|
+
}
|
|
434
|
+
console.log('Waiting for the user management configuration page to load... ⏳');
|
|
435
|
+
await page.waitForSelector('form[action="setupusermanagementchoice.action"]', { timeout: 5 * 60 * 1000 });
|
|
436
|
+
}
|
|
437
|
+
// Configure User Management
|
|
438
|
+
const mustConfigureUserManagement = !!await page.$('form[action="setupusermanagementchoice.action"]');
|
|
439
|
+
if (mustConfigureUserManagement) {
|
|
440
|
+
if (options.userManagement === 'confluence') {
|
|
441
|
+
await page.locator('#internal').click();
|
|
442
|
+
console.log('Waiting for the system administration account configuration page to load... ⏳');
|
|
443
|
+
await page.waitForSelector('form[action="setupadministrator.action"]', { timeout: 5 * 60 * 1000 });
|
|
444
|
+
}
|
|
445
|
+
else {
|
|
446
|
+
await page.locator('#jaacs').click();
|
|
447
|
+
console.log('Waiting for the Connect to Jira page to load... ⏳');
|
|
448
|
+
await page.waitForSelector('form[action="connecttojira.action"]', { timeout: 5 * 60 * 1000 });
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
// Configure System Administrator Account
|
|
452
|
+
const mustConfigureAdministratorAccount = !!await page.$('form[action="setupadministrator.action"]');
|
|
453
|
+
if (mustConfigureAdministratorAccount) {
|
|
454
|
+
console.log('Configuring the administrator account');
|
|
455
|
+
await page.locator('input[name=username]').fill(options.username);
|
|
456
|
+
await page.locator('input[name=fullName]').fill(options.fullName);
|
|
457
|
+
await page.locator('input[name=email]').fill(options.email);
|
|
458
|
+
await page.locator('input[name=password]').fill(options.password);
|
|
459
|
+
await page.locator('input[name=confirm]').fill(options.password);
|
|
460
|
+
await page.locator('#setup-next-button').click();
|
|
461
|
+
console.log('Waiting for the setup successful notification to load... ⏳');
|
|
462
|
+
await page.waitForSelector('a.finishAction', { timeout: 5 * 60 * 1000 });
|
|
463
|
+
}
|
|
464
|
+
const mustFinishSetup = !!await page.$('a.finishAction');
|
|
465
|
+
if (mustFinishSetup) {
|
|
466
|
+
console.log('Finalizing initial Confluence setup');
|
|
467
|
+
await page.locator('a.finishAction').click();
|
|
468
|
+
console.log('Waiting for the initial space creation form to load... ⏳');
|
|
469
|
+
await page.waitForSelector('#grow-intro-create-space', { timeout: 5 * 60 * 1000 });
|
|
470
|
+
}
|
|
471
|
+
// We're done here, let's wrap things up
|
|
472
|
+
console.log(`Finished automated initial setup of Atlassian Confluence 💪`);
|
|
473
|
+
await page.close();
|
|
474
|
+
await browser.close();
|
|
475
|
+
return true;
|
|
476
|
+
}
|
|
477
|
+
catch (err) {
|
|
478
|
+
console.error('Failed to automatically setup Atlassian Confluence');
|
|
479
|
+
console.log(err);
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
};
|
|
483
|
+
|
|
484
|
+
const showHelpWithDefaultCommandOptions = {
|
|
485
|
+
visibleOptions: (cmd) => {
|
|
486
|
+
let options = cmd.options;
|
|
487
|
+
if (!cmd.parent && options.length === 0) {
|
|
488
|
+
const defaultCommandName = cmd._defaultCommandName;
|
|
489
|
+
if (defaultCommandName) {
|
|
490
|
+
const defaultCommand = cmd.commands.find(item => item._name === defaultCommandName);
|
|
491
|
+
if (defaultCommand) {
|
|
492
|
+
options = defaultCommand.options;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
return Array.from(options);
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
|
|
500
|
+
const program = new Command$1();
|
|
501
|
+
const Command = () => {
|
|
502
|
+
return {
|
|
503
|
+
action: async (options) => {
|
|
504
|
+
const config = await getConfig(options.config, options.cwd);
|
|
505
|
+
await setupHost(options.product, config);
|
|
506
|
+
},
|
|
507
|
+
errorHandler: async () => {
|
|
508
|
+
}
|
|
509
|
+
};
|
|
510
|
+
};
|
|
511
|
+
program
|
|
512
|
+
.name('dcdx configure')
|
|
513
|
+
.description(`Automated initial setup of the host application
|
|
514
|
+
If you wish to run a specific host application, call this command with 'dcdx configure <name>'`)
|
|
515
|
+
.addHelpText('afterAll', '') // there is a non-zero white space because the only reason to have this is to force a line break
|
|
516
|
+
.configureHelp(showHelpWithDefaultCommandOptions)
|
|
517
|
+
.allowUnknownOption(false)
|
|
518
|
+
.allowExcessArguments(false)
|
|
519
|
+
.showHelpAfterError(true);
|
|
520
|
+
program
|
|
521
|
+
.command('default', { isDefault: true, hidden: true })
|
|
522
|
+
.addOption(new Option('-p, --product <name>', 'The name of the host application').choices(Object.values(SupportedApplications.Values)))
|
|
523
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
524
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
525
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
526
|
+
.action(options => ActionHandler(program, Command(), options));
|
|
527
|
+
program
|
|
528
|
+
.command(SupportedApplications.Values.jira)
|
|
529
|
+
.description('Automated initial setup of Atlassian Jira')
|
|
530
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
531
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
532
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
533
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.jira }));
|
|
534
|
+
program
|
|
535
|
+
.command(SupportedApplications.Values.confluence)
|
|
536
|
+
.description('Automated initial setup of Atlassian Confluence')
|
|
537
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
538
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
539
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
540
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.confluence }));
|
|
541
|
+
program
|
|
542
|
+
.command(SupportedApplications.Values.bamboo)
|
|
543
|
+
.description('Automated initial setup of Atlassian Bamboo')
|
|
544
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
545
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
546
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
547
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bamboo }));
|
|
548
|
+
program
|
|
549
|
+
.command(SupportedApplications.Values.bitbucket)
|
|
550
|
+
.description('Automated initial setup of Atlassian Bitbucket')
|
|
551
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
552
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
553
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
554
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bitbucket }));
|
|
555
|
+
program.parseAsync().catch(() => gracefulExit(1));
|
|
556
|
+
process.on('SIGINT', () => {
|
|
557
|
+
console.log(`Received term signal, trying to stop gracefully 💪`);
|
|
558
|
+
gracefulExit();
|
|
559
|
+
});
|
|
560
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0FjdGlvbkhhbmRsZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3RvQWJzb2x1dGVQYXRoLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9nZXRWZXJzaW9ucy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0RhdGFiYXNlLmpzIiwiLi4vLi4vZGlzdC9zcmMvdHlwZXMvQXBwbGljYXRpb24uanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWd1cmUuanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWcuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2dldENvbmZpZy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvY2FwaXRhbGl6ZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvc2V0dXBIb3N0LmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMuanMiLCIuLi8uLi9kaXN0L3NyYy9jb21tYW5kcy9jb25maWd1cmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5jb25zdCB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKCk7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGNsZWFuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBwcnVuZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgZGVidWc6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAganZtOiB6LnN0cmluZygpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAganZtOiB0cnVlLFxuICAgIGN3ZDogdHJ1ZVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyB9IGZyb20gJy4vQXBwbGljYXRpb24nO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gICAgcHJvZHVjdDogU3VwcG9ydGVkQXBwbGljYXRpb25zLFxuICAgIGNvbmZpZzogei5zdHJpbmcoKSxcbiAgICBjd2Q6IHouc3RyaW5nKClcbn0pLnBhcnRpYWwoe1xuICAgIGNvbmZpZzogdHJ1ZSxcbiAgICBjd2Q6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUppcmEgPSB6Lm9iamVjdCh7XG4gICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgbW9kZTogei5lbnVtKFsncHJpdmF0ZScsICdwdWJsaWMnXSksXG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBmdWxsbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmVFbWFpbDogei5lbnVtKFsnbGF0ZXInLCAnbm93J10pLFxuICAgIGVtYWlsTmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbEZyb21BZGRyZXNzOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUHJlZml4OiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmVyVHlwZTogei5lbnVtKFsnc210cCcsICdqbmRpJ10pLFxuICAgIGVtYWlsSm5kaUxvY2F0aW9uOiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmljZVByb3ZpZGVyOiB6LmVudW0oWydjdXN0b20nLCAnZ29vZ2xlLWFwcHMtbWFpbC0vLWdtYWlsLTgnLCAneWFob28hLW1haWwtcGx1cy05J10pLFxuICAgIGVtYWlsSG9zdE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWxQcm90b2NvbDogei5lbnVtKFsnU01UUCcsICdTRUNVUkVfU01UUCddKSxcbiAgICBlbWFpbFBvcnQ6IHoubnVtYmVyKCksXG4gICAgZW1haWxUaW1lb3V0OiB6Lm51bWJlcigpLFxuICAgIGVtYWlsVExTOiB6LmJvb2xlYW4oKSxcbiAgICBlbWFpbFVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgbGFuZ3VhZ2U6IHouZW51bShbXG4gICAgICAgICdlbi1VUycsXG4gICAgICAgICd6aF9DTicsXG4gICAgICAgICdjc19DWicsXG4gICAgICAgICdkYV9ESycsXG4gICAgICAgICdubF9OTCcsXG4gICAgICAgICdlbl9VSycsXG4gICAgICAgICdldF9FRScsXG4gICAgICAgICdmaV9GSScsXG4gICAgICAgICdmcl9GUicsXG4gICAgICAgICdkZV9ERScsXG4gICAgICAgICdodV9IVScsXG4gICAgICAgICdpc19JUycsXG4gICAgICAgICdpdF9JVCcsXG4gICAgICAgICdqYV9KUCcsXG4gICAgICAgICdrb19LUicsXG4gICAgICAgICdub19OTycsXG4gICAgICAgICdwbF9QTCcsXG4gICAgICAgICdwdF9CUicsXG4gICAgICAgICdyb19STycsXG4gICAgICAgICdydV9SVScsXG4gICAgICAgICdza19TSycsXG4gICAgICAgICdlc19FUycsXG4gICAgICAgICdzdl9TRSdcbiAgICBdKSxcbiAgICBhdmF0YXJQYXRoOiB6LnN0cmluZygpXG59KS5wYXJ0aWFsKHtcbiAgICBlbWFpbE5hbWU6IHRydWUsXG4gICAgZW1haWxGcm9tQWRkcmVzczogdHJ1ZSxcbiAgICBlbWFpbFByZWZpeDogdHJ1ZSxcbiAgICBlbWFpbFNlcnZlclR5cGU6IHRydWUsXG4gICAgZW1haWxKbmRpTG9jYXRpb246IHRydWUsXG4gICAgZW1haWxTZXJ2aWNlUHJvdmlkZXI6IHRydWUsXG4gICAgZW1haWxIb3N0TmFtZTogdHJ1ZSxcbiAgICBlbWFpbFByb3RvY29sOiB0cnVlLFxuICAgIGVtYWlsUG9ydDogdHJ1ZSxcbiAgICBlbWFpbFRpbWVvdXQ6IHRydWUsXG4gICAgZW1haWxUTFM6IHRydWUsXG4gICAgZW1haWxVc2VybmFtZTogdHJ1ZSxcbiAgICBlbWFpbFBhc3N3b3JkOiB0cnVlLFxuICAgIGxhbmd1YWdlOiB0cnVlLFxuICAgIGF2YXRhclBhdGg6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUNvbmZsdWVuY2UgPSB6Lm9iamVjdCh7XG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBkZXBsb3ltZW50VHlwZTogei5lbnVtKFsnbm9uLWNsdXN0ZXJlZCcsICdjbHVzdGVyZWQnXSksXG4gICAgdXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgZnVsbE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWw6IHouc3RyaW5nKCksXG4gICAgcGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgY2x1c3Rlck5hbWU6IHouc3RyaW5nKCksXG4gICAgY2x1c3RlckhvbWU6IHouc3RyaW5nKCksXG4gICAgY2x1c3RlckpvaW5Nb2RlOiB6LmVudW0oWyd1c2VNdWx0aWNhc3QnLCAndXNlVGNwSXAnLCAndXNlQXdzJ10pLFxuICAgIGNsdXN0ZXJBdXRvQWRkcmVzczogei5ib29sZWFuKCksXG4gICAgbG9hZENvbnRlbnQ6IHouZW51bShbJ2V4YW1wbGUnLCAnZW1wdHknXSksXG4gICAgdXNlck1hbmFnZW1lbnQ6IHouZW51bShbJ2NvbmZsdWVuY2UnLCAnamlyYSddKSxcbiAgICBqaXJhQmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBqaXJhVXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgamlyYVBhc3N3b3JkOiB6LnN0cmluZygpLFxuICAgIGppcmFVc2VyR3JvdXBzOiB6LnN0cmluZygpLFxuICAgIGppcmFBZG1pbkdyb3Vwczogei5zdHJpbmcoKSxcbn0pLnBhcnRpYWwoe1xuICAgIGNsdXN0ZXJOYW1lOiB0cnVlLFxuICAgIGNsdXN0ZXJIb21lOiB0cnVlLFxuICAgIGNsdXN0ZXJKb2luTW9kZTogdHJ1ZSxcbiAgICBjbHVzdGVyQXV0b0FkZHJlc3M6IHRydWUsXG4gICAgamlyYUJhc2VVcmw6IHRydWUsXG4gICAgamlyYVVzZXJuYW1lOiB0cnVlLFxuICAgIGppcmFQYXNzd29yZDogdHJ1ZSxcbiAgICBqaXJhVXNlckdyb3VwczogdHJ1ZSxcbiAgICBqaXJhQWRtaW5Hcm91cHM6IHRydWVcbn0pO1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuL0FwcGxpY2F0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyZUNvbmZsdWVuY2UsIENvbmZpZ3VyZUppcmEgfSBmcm9tICcuL0NvbmZpZ3VyZSc7XG5leHBvcnQgY29uc3QgQ29uZmlnID0gei5vYmplY3Qoe1xuICAgIHNldHVwOiB6Lm9iamVjdCh7XG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmFdOiBDb25maWd1cmVKaXJhLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlXTogQ29uZmlndXJlQ29uZmx1ZW5jZSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vXTogei5vYmplY3Qoe30pLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXRdOiB6Lm9iamVjdCh7fSlcbiAgICB9KS5wYXJ0aWFsKClcbn0pO1xuIiwiLypcbiAgQ29kZSBhdHJyaWJ1dGlvblxuICBib3Jyb3dlZCBzb21lIGxvZ2ljIGZvciBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSBFU0xpbnRcbiAgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9tYWluL2xpYi9jb25maWcvY29uZmlnLWxvYWRlci5qc1xuKi9cbmltcG9ydCB7IGV4aXN0c1N5bmMsIHN0YXRTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgaXNBYnNvbHV0ZSwgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi90eXBlcy9Db25maWcnO1xuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9IGFzeW5jIChwYXRoLCBjd2QpID0+IHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSBjd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aCB8fCAnZGNkeC5jb25maWcubWpzJztcbiAgICBjb25zdCBjb25maWdQYXRoID0gaXNBYnNvbHV0ZShjb25maWdGaWxlKSAmJiBleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpID8gY29uZmlnRmlsZSA6IGpvaW4oZGlyZWN0b3J5LCBjb25maWdGaWxlKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBkY2R4IGNvbmZpZ3VyYXRpb24gZmlsZS4gUGxlYXNlIG1ha2Ugc3VyZSB0byBzcGVjaWZ5IHRoZSBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5ICgtLWN3ZCkgb3IgcGF0aCB0byB0aGUgZmlsZSAoLWMsIC0tY29uZmlnKScpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEV4cGxhbmF0aW9uIGNvcGllZCBmcm9tIEVTTGludFxuICAgICAqXG4gICAgICogQXBwZW5kIGEgcXVlcnkgd2l0aCB0aGUgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZSAoYG10aW1lYCkgaW4gb3JkZXJcbiAgICAgKiB0byBpbXBvcnQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgY29uZmlnIGZpbGUuIFdpdGhvdXQgdGhlIHF1ZXJ5LCBgaW1wb3J0KClgIHdvdWxkXG4gICAgICogY2FjaGUgdGhlIGNvbmZpZyBmaWxlIG1vZHVsZSBieSB0aGUgcGF0aG5hbWUgb25seSwgYW5kIHRoZW4gYWx3YXlzIHJldHVyblxuICAgICAqIHRoZSBzYW1lIHZlcnNpb24gKHRoZSBvbmUgdGhhdCB3YXMgYWN0dWFsIHdoZW4gdGhlIG1vZHVsZSB3YXMgaW1wb3J0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lKS5cbiAgICAgKlxuICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjb25maWcgZmlsZSBtb2R1bGUgaXMgbG9hZGVkIGFuZCBleGVjdXRlZCBhZ2FpblxuICAgICAqIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgaW1wb3J0ZWQuXG4gICAgICogSWYgaXQgaGFzbid0IGJlZW4gY2hhbmdlZCwgYGltcG9ydCgpYCB3aWxsIGp1c3QgcmV0dXJuIHRoZSBjYWNoZWQgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IG92ZXJ1c2UgcXVlcmllcyAoZS5nLiwgYnkgYXBwZW5kaW5nIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgKiB0byBhbHdheXMgcmVsb2FkIHRoZSBjb25maWcgZmlsZSBtb2R1bGUpIGFzIHRoYXQgY291bGQgY2F1c2UgbWVtb3J5IGxlYWtzXG4gICAgICogYmVjYXVzZSBlbnRyaWVzIGFyZSBuZXZlciByZW1vdmVkIGZyb20gdGhlIGltcG9ydCBjYWNoZS5cbiAgICAgKi9cbiAgICBjb25zdCBtdGltZSA9IHN0YXRTeW5jKGNvbmZpZ1BhdGgpLm10aW1lLmdldFRpbWUoKTtcbiAgICBjb25zdCBmaWxlVVJMID0gcGF0aFRvRmlsZVVSTChjb25maWdQYXRoKTtcbiAgICBmaWxlVVJMLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ210aW1lJywgbXRpbWUudG9GaXhlZCgpKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVVUkwudG9TdHJpbmcoKTtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgaW1wb3J0KGZpbGVQYXRoKSkuZGVmYXVsdDtcbiAgICByZXR1cm4gQ29uZmlnLnBhcnNlKHJlc3VsdCk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGNhcGl0YWxpemUgPSAodmFsdWUpID0+IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSk7XG4iLCJpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuLi90eXBlcy9BcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb25maWd1cmVDb25mbHVlbmNlLCBDb25maWd1cmVKaXJhIH0gZnJvbSAnLi4vdHlwZXMvQ29uZmlndXJlJztcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICcuL2NhcGl0YWxpemUnO1xuZXhwb3J0IGNvbnN0IHNldHVwSG9zdCA9IGFzeW5jIChuYW1lLCBjb25maWcpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLnNldHVwW25hbWVdO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGluaXRpYWwgc2V0dXAgY29uZmlndXJhdGlvbiBmb3IgJHtjYXBpdGFsaXplKG5hbWUpfWApO1xuICAgIH1cbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmE6XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBKaXJhKENvbmZpZ3VyZUppcmEucGFyc2Uob3B0aW9ucykpO1xuICAgICAgICBjYXNlIFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZTpcbiAgICAgICAgICAgIHJldHVybiBzZXR1cENvbmZsdWVuY2UoQ29uZmlndXJlQ29uZmx1ZW5jZS5wYXJzZShvcHRpb25zKSk7XG4gICAgICAgIGNhc2UgU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT29wc2llIGRhaXN5IPCfjLwgQXRsYXNzaWFuIEJpdGJ1Y2tldCBkb2VzIG5vdCByZXF1aXJlIGFkZGl0aW9uYWwgc2V0dXAg8J+klicpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbmNvbnN0IHNldHVwSmlyYSA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTGF1bmNoIEdvb2dsZSBDaHJvbWVcbiAgICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYWdlIHZpZXdcbiAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICBhd2FpdCBwYWdlLnNldFZpZXdwb3J0KHsgd2lkdGg6IDEwODAsIGhlaWdodDogMTAyNCB9KTtcbiAgICAgICAgLy8gT3BlbiB0aGUgU2V0dXAgcGFnZVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEppcmEg8J+klmApO1xuICAgICAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy5iYXNlVXJsLCB7IHdhaXRVbnRpbDogWydkb21jb250ZW50bG9hZGVkJywgJ2xvYWQnLCAnbmV0d29ya2lkbGUwJ10sIHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgcHJvZ3Jlc3MgaGFzIGVuZGVkXG4gICAgICAgIGNvbnN0IGlzU3RpbGxMb2FkaW5nID0gISFhd2FpdCBwYWdlLiQoJyNwcm9ncmVzcycpO1xuICAgICAgICBpZiAoaXNTdGlsbExvYWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBBdGxhc3NpYW4gSmlyYSB0byBiZSByZWFkeS4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcyA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cIlNldHVwQXBwbGljYXRpb25Qcm9wZXJ0aWVzLmpzcGFcIl0nKTtcbiAgICAgICAgaWYgKG11c3RTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgYXBwbGljYXRpb24gcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXRpdGxlXScpLmZpbGwob3B0aW9ucy50aXRsZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoYGxhYmVsW2Zvcj1qaXJhLXNldHVwd2l6YXJkLW1vZGUtJHtvcHRpb25zLm1vZGV9XWApLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9YmFzZVVSTF0nKS5maWxsKG9wdGlvbnMuYmFzZVVybCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGFkbWluaXN0cmF0b3IgYWNjb3VudCBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cIlNldHVwQWRtaW5BY2NvdW50LmpzcGFcIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHVwIGFkbWluaXN0cmF0b3IgYWNjb3VudFxuICAgICAgICBjb25zdCBtdXN0U2V0dXBBZG1pbkFjY291bnQgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJTZXR1cEFkbWluQWNjb3VudC5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBZG1pbkFjY291bnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1mdWxsbmFtZV0nKS5maWxsKG9wdGlvbnMuZnVsbG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWVtYWlsXScpLmZpbGwob3B0aW9ucy5lbWFpbCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9dXNlcm5hbWVdJykuZmlsbChvcHRpb25zLnVzZXJuYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1wYXNzd29yZF0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWNvbmZpcm1dJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2ppcmEtc2V0dXB3aXphcmQtc3VibWl0JykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgZW1haWwgbm90aWZpY2F0aW9uIHNldHVwIHdpemFyZCB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBNYWlsTm90aWZpY2F0aW9ucy5qc3BhXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBlbWFpbCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEVtYWlsTm90aWZpY2F0aW9uID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBNYWlsTm90aWZpY2F0aW9ucy5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBFbWFpbE5vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgdGhlIGVtYWlsIG5vdGlmaWNhdGlvbiBzZXR0aW5ncycpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlndXJlRW1haWxOb3RpZmljYXRpb25zID0gb3B0aW9ucy5jb25maWd1cmVFbWFpbCA9PT0gJ2xhdGVyJyA/ICdkaXNhYmxlZCcgOiAnZW5hYmxlZCc7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoYGxhYmVsW2Zvcj1qaXJhLXNldHVwd2l6YXJkLWVtYWlsLW5vdGlmaWNhdGlvbnMtJHtjb25maWd1cmVFbWFpbE5vdGlmaWNhdGlvbnN9XWApLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGxhbmd1YWdlIGNob29zZXIgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjY2hvb3NlLWxhbmd1YWdlLWZvcm0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2VsY29tZSB0byBKaXJhLCBBZG1pbmlzdHJhdG9yIVxuICAgICAgICBjb25zdCBtdXN0U2V0dXBMYW5ndWFnZSA9ICEhYXdhaXQgcGFnZS4kKCcjY2hvb3NlLWxhbmd1YWdlLWZvcm0nKTtcbiAgICAgICAgaWYgKG11c3RTZXR1cExhbmd1YWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgbGFuZ3VhZ2UgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlU2VsZWN0b3IgPSAhb3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLmxhbmd1YWdlID09PSAnZW4tVVMnID8gJ2xvY2FsZV8tMScgOiBgbG9jYWxlXyR7b3B0aW9ucy5sYW5ndWFnZX1gO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9JHtsYW5ndWFnZVNlbGVjdG9yfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjbmV4dCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGF2YXRhciBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcub25ib2FyZGluZy1zZXF1ZW5jZS1hdmF0YXItcGlja2VyJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEF2YXRhciA9ICEhYXdhaXQgcGFnZS4kKCcub25ib2FyZGluZy1zZXF1ZW5jZS1hdmF0YXItcGlja2VyJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBdmF0YXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBhdmF0YXIgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXQuYXZhdGFyLXBpY2tlci1kb25lJykuY2xpY2soKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjb25ib2FyZGluZycsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdyZSBkb25lIGhlcmUsIGxldCdzIHdyYXAgdGhpbmdzIHVwXG4gICAgICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCBhdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gSmlyYSDwn5KqYCk7XG4gICAgICAgIGF3YWl0IHBhZ2UuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYXV0b21hdGljYWxseSBzZXR1cCBBdGxhc3NpYW4gSmlyYScpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IHNldHVwQ29uZmx1ZW5jZSA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTGF1bmNoIEdvb2dsZSBDaHJvbWVcbiAgICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYWdlIHZpZXdcbiAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICBhd2FpdCBwYWdlLnNldFZpZXdwb3J0KHsgd2lkdGg6IDEwODAsIGhlaWdodDogMTAyNCB9KTtcbiAgICAgICAgLy8gT3BlbiB0aGUgU2V0dXAgcGFnZVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2Ug8J+klmApO1xuICAgICAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy5iYXNlVXJsLCB7IHdhaXRVbnRpbDogWydkb21jb250ZW50bG9hZGVkJywgJ2xvYWQnLCAnbmV0d29ya2lkbGUwJ10sIHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIC8vIENob29zZSB5b3VyIGRlcGxveW1lbnQgdHlwZVxuICAgICAgICBjb25zdCBtdXN0Q2hvb3NlRGVwbG95bWVudFR5cGUgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJzZXR1cGNsdXN0ZXIuYWN0aW9uXCJdJyk7XG4gICAgICAgIGlmIChtdXN0Q2hvb3NlRGVwbG95bWVudFR5cGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIGRlcGxveW1lbnQgdHlwZScpO1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlcmluZ1N0YXR1cyA9IG9wdGlvbnMuZGVwbG95bWVudFR5cGUgPT09ICdjbHVzdGVyZWQnID8gJ2NsdXN0ZXJpbmdFbmFibGVkJyA6ICdjbHVzdGVyaW5nRGlzYWJsZWQnO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9JHtjbHVzdGVyaW5nU3RhdHVzfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVwbG95bWVudFR5cGUgPT09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGNsdXN0ZXIgb3B0aW9uc1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignYnV0dG9uW25hbWU9bmV3Q2x1c3Rlcl0nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjc2tpcC1idXR0b24nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBjb250ZW50IGNob29zZXIgcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXBkYXRhLmFjdGlvblwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIENvbnRlbnRcbiAgICAgICAgY29uc3QgbXVzdExvYWRDb250ZW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBkYXRhLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdExvYWRDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sb2FkQ29udGVudCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjZGVtb0Nob2ljZUZvcm0gPiBpbnB1dFt0eXBlPXN1Ym1pdF0nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjYmxhbmtDaG9pY2VGb3JtID4gaW5wdXRbdHlwZT1zdWJtaXRdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgdXNlciBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXB1c2VybWFuYWdlbWVudGNob2ljZS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZmlndXJlIFVzZXIgTWFuYWdlbWVudFxuICAgICAgICBjb25zdCBtdXN0Q29uZmlndXJlVXNlck1hbmFnZW1lbnQgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJzZXR1cHVzZXJtYW5hZ2VtZW50Y2hvaWNlLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENvbmZpZ3VyZVVzZXJNYW5hZ2VtZW50KSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy51c2VyTWFuYWdlbWVudCA9PT0gJ2NvbmZsdWVuY2UnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjaW50ZXJuYWwnKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgc3lzdGVtIGFkbWluaXN0cmF0aW9uIGFjY291bnQgY29uZmlndXJhdGlvbiBwYWdlIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXBhZG1pbmlzdHJhdG9yLmFjdGlvblwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2phYWNzJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIENvbm5lY3QgdG8gSmlyYSBwYWdlIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwiY29ubmVjdHRvamlyYS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZmlndXJlIFN5c3RlbSBBZG1pbmlzdHJhdG9yIEFjY291bnRcbiAgICAgICAgY29uc3QgbXVzdENvbmZpZ3VyZUFkbWluaXN0cmF0b3JBY2NvdW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBhZG1pbmlzdHJhdG9yLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENvbmZpZ3VyZUFkbWluaXN0cmF0b3JBY2NvdW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29uZmlndXJpbmcgdGhlIGFkbWluaXN0cmF0b3IgYWNjb3VudCcpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXVzZXJuYW1lXScpLmZpbGwob3B0aW9ucy51c2VybmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZnVsbE5hbWVdJykuZmlsbChvcHRpb25zLmZ1bGxOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1lbWFpbF0nKS5maWxsKG9wdGlvbnMuZW1haWwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXBhc3N3b3JkXScpLmZpbGwob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9Y29uZmlybV0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjc2V0dXAtbmV4dC1idXR0b24nKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBzZXR1cCBzdWNjZXNzZnVsIG5vdGlmaWNhdGlvbiB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2EuZmluaXNoQWN0aW9uJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11c3RGaW5pc2hTZXR1cCA9ICEhYXdhaXQgcGFnZS4kKCdhLmZpbmlzaEFjdGlvbicpO1xuICAgICAgICBpZiAobXVzdEZpbmlzaFNldHVwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmluYWxpemluZyBpbml0aWFsIENvbmZsdWVuY2Ugc2V0dXAnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignYS5maW5pc2hBY3Rpb24nKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBpbml0aWFsIHNwYWNlIGNyZWF0aW9uIGZvcm0gdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjZ3Jvdy1pbnRyby1jcmVhdGUtc3BhY2UnLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UncmUgZG9uZSBoZXJlLCBsZXQncyB3cmFwIHRoaW5ncyB1cFxuICAgICAgICBjb25zb2xlLmxvZyhgRmluaXNoZWQgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2Ug8J+SqmApO1xuICAgICAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0dXAgQXRsYXNzaWFuIENvbmZsdWVuY2UnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iLCJleHBvcnQgY29uc3Qgc2hvd0hlbHBXaXRoRGVmYXVsdENvbW1hbmRPcHRpb25zID0ge1xuICAgIHZpc2libGVPcHRpb25zOiAoY21kKSA9PiB7XG4gICAgICAgIGxldCBvcHRpb25zID0gY21kLm9wdGlvbnM7XG4gICAgICAgIGlmICghY21kLnBhcmVudCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9kZWZhdWx0Q29tbWFuZE5hbWU7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbW1hbmQgPSBjbWQuY29tbWFuZHMuZmluZChpdGVtID0+IGl0ZW0uX25hbWUgPT09IGRlZmF1bHRDb21tYW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0Q29tbWFuZC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShvcHRpb25zKTtcbiAgICB9XG59O1xuIiwiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgQ29tbWFuZCBhcyBDb21tYW5kZXIsIE9wdGlvbiB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBncmFjZWZ1bEV4aXQgfSBmcm9tICdleGl0LWhvb2snO1xuaW1wb3J0IHsgQWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL2hlbHBlcnMvQWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuLi9oZWxwZXJzL2dldENvbmZpZyc7XG5pbXBvcnQgeyBzZXR1cEhvc3QgfSBmcm9tICcuLi9oZWxwZXJzL3NldHVwSG9zdCc7XG5pbXBvcnQgeyBzaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3Nob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucyc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuLi90eXBlcy9BcHBsaWNhdGlvbic7XG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmRlcigpO1xuY29uc3QgQ29tbWFuZCA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcob3B0aW9ucy5jb25maWcsIG9wdGlvbnMuY3dkKTtcbiAgICAgICAgICAgIGF3YWl0IHNldHVwSG9zdChvcHRpb25zLnByb2R1Y3QsIGNvbmZpZyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9ySGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB9XG4gICAgfTtcbn07XG5wcm9ncmFtXG4gICAgLm5hbWUoJ2RjZHggY29uZmlndXJlJylcbiAgICAuZGVzY3JpcHRpb24oYEF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uXG5JZiB5b3Ugd2lzaCB0byBydW4gYSBzcGVjaWZpYyBob3N0IGFwcGxpY2F0aW9uLCBjYWxsIHRoaXMgY29tbWFuZCB3aXRoICdkY2R4IGNvbmZpZ3VyZSA8bmFtZT4nYClcbiAgICAuYWRkSGVscFRleHQoJ2FmdGVyQWxsJywgJ+KAiycpIC8vIHRoZXJlIGlzIGEgbm9uLXplcm8gd2hpdGUgc3BhY2UgYmVjYXVzZSB0aGUgb25seSByZWFzb24gdG8gaGF2ZSB0aGlzIGlzIHRvIGZvcmNlIGEgbGluZSBicmVha1xuICAgIC5jb25maWd1cmVIZWxwKHNob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucylcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKGZhbHNlKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cyhmYWxzZSlcbiAgICAuc2hvd0hlbHBBZnRlckVycm9yKHRydWUpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdkZWZhdWx0JywgeyBpc0RlZmF1bHQ6IHRydWUsIGhpZGRlbjogdHJ1ZSB9KVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXAsIC0tcHJvZHVjdCA8bmFtZT4nLCAnVGhlIG5hbWUgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5jaG9pY2VzKE9iamVjdC52YWx1ZXMoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcykpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgb3B0aW9ucykpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYSlcbiAgICAuZGVzY3JpcHRpb24oJ0F1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBKaXJhJylcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIHsgLi4ub3B0aW9ucywgbmFtZTogU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhIH0pKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UpXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gQ29uZmx1ZW5jZScpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZSB9KSk7XG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib28pXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gQmFtYm9vJylcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIHsgLi4ub3B0aW9ucywgbmFtZTogU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib28gfSkpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0KVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEJpdGJ1Y2tldCcpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0IH0pKTtcbnByb2dyYW0ucGFyc2VBc3luYygpLmNhdGNoKCgpID0+IGdyYWNlZnVsRXhpdCgxKSk7XG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFJlY2VpdmVkIHRlcm0gc2lnbmFsLCB0cnlpbmcgdG8gc3RvcCBncmFjZWZ1bGx5IPCfkqpgKTtcbiAgICBncmFjZWZ1bEV4aXQoKTtcbn0pO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRU8sTUFBTSxhQUFhLEdBQUcsT0FBTyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxLQUFLO0FBQ25GLElBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMxQyxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxLQUFLO0FBQ3JDLFFBQVEsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQzlC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
|