@fjall/util 0.88.3 → 0.89.2

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.
@@ -4,122 +4,91 @@ exports.Config = void 0;
4
4
  const fs = require("fs");
5
5
  const path = require("path");
6
6
  const zod_1 = require("zod");
7
+ const logger_js_1 = require("./logger.js");
7
8
  /**
8
9
  * Maximum depth for searching up the directory tree for config files.
9
10
  * Prevents infinite loops when traversing directories.
10
11
  */
11
12
  const CONFIG_SEARCH_MAX_DEPTH = 10;
12
- // Zod schemas for validation
13
- const DockerConfigSchema = zod_1.z
13
+ // Per-app config schemas
14
+ const DeployStageSchema = zod_1.z
14
15
  .object({
15
- dockerfilePath: zod_1.z.string(),
16
- containerPort: zod_1.z.number()
16
+ account: zod_1.z.string(),
17
+ regions: zod_1.z.array(zod_1.z.string()).min(1)
17
18
  })
18
19
  .strict();
19
- const ServiceConfigSchema = zod_1.z
20
+ const DomainConfigSchema = zod_1.z
20
21
  .object({
21
- id: zod_1.z.string(),
22
- type: zod_1.z.string().optional(),
23
- version: zod_1.z.number().optional(),
24
- options: zod_1.z.object({}).passthrough().optional(),
25
- dockerConfig: DockerConfigSchema.optional(),
26
- apiApplicationId: zod_1.z.string().optional()
27
- })
28
- .strict();
29
- const ProviderAccountSchema = zod_1.z
30
- .object({
31
- id: zod_1.z.string(),
32
22
  name: zod_1.z.string(),
33
- environment: zod_1.z.string(),
34
- managed: zod_1.z.boolean().optional()
35
- })
36
- .strict();
37
- const ProfileSchema = zod_1.z
38
- .object({
39
- type: zod_1.z.enum(["iam", "sso", "oidc"]),
40
- region: zod_1.z.string(),
41
- ssoAccountId: zod_1.z.string().optional(),
42
- ssoRoleName: zod_1.z.string().optional(),
43
- ssoSession: zod_1.z.string().optional(),
44
- oidcRoleArn: zod_1.z.string().optional(),
45
- oidcProviderArn: zod_1.z.string().optional(),
46
- credentialSource: zod_1.z.string().optional(),
47
- roleArn: zod_1.z.string().optional(),
48
- roleSessionName: zod_1.z.string().optional()
49
- })
50
- .strict();
51
- const SSOSessionSchema = zod_1.z
52
- .object({
53
- ssoRegion: zod_1.z.string(),
54
- ssoStartUrl: zod_1.z.string()
55
- })
56
- .strict();
57
- const OidcConnectionSchema = zod_1.z
58
- .object({
59
- roleArn: zod_1.z.string(),
60
- externalId: zod_1.z.string()
23
+ type: zod_1.z.enum(["apex", "delegated"]),
24
+ parentDomain: zod_1.z.string().optional(),
25
+ account: zod_1.z.string().optional()
61
26
  })
62
27
  .strict();
63
28
  const RootConfigSchema = zod_1.z
64
29
  .object({
65
30
  version: zod_1.z.number().optional(),
66
- development: zod_1.z.boolean().optional(),
67
- services: zod_1.z.record(zod_1.z.string(), ServiceConfigSchema).optional(),
68
- providerAccounts: zod_1.z.array(ProviderAccountSchema).optional(),
69
- primaryRegion: zod_1.z.string().optional(),
70
- secondaryRegions: zod_1.z.array(zod_1.z.string()).optional(),
71
- disasterRecoveryRegion: zod_1.z.string().optional(),
72
- currentProfile: zod_1.z.string().optional(),
73
- profiles: zod_1.z.record(zod_1.z.string(), ProfileSchema).optional(),
74
- ssoSessions: zod_1.z.record(zod_1.z.string(), SSOSessionSchema).optional(),
75
- organisationId: zod_1.z.string().optional(),
76
- organisationName: zod_1.z.string().optional(),
77
- organisationEmail: zod_1.z.string().optional(),
78
- oidcIssuerUrl: zod_1.z.string().optional(),
79
- oidcConnections: zod_1.z.record(zod_1.z.string(), OidcConnectionSchema).optional(),
80
- rootOidcRoleArn: zod_1.z.string().optional()
81
- })
82
- .strict();
83
- const CostAllocationTagsSchema = zod_1.z
84
- .object({
85
- TagKey: zod_1.z.string(),
86
- Status: zod_1.z.string()
31
+ generatorVersion: zod_1.z.string().optional(),
32
+ deploy: zod_1.z.record(zod_1.z.string(), DeployStageSchema).optional(),
33
+ activeStage: zod_1.z.string().optional(),
34
+ domains: zod_1.z.array(DomainConfigSchema).optional()
87
35
  })
88
36
  .strict();
89
- const AccountSchema = zod_1.z
90
- .object({
91
- Id: zod_1.z.string().optional(),
92
- Arn: zod_1.z.string().optional(),
93
- Email: zod_1.z.string().optional(),
94
- Name: zod_1.z.string().optional(),
95
- Status: zod_1.z.enum(["ACTIVE", "SUSPENDED", "PENDING_CLOSURE"]).optional(),
96
- JoinedMethod: zod_1.z.enum(["INVITED", "CREATED"]).optional(),
97
- // z.coerce.date() handles both Date objects (from AWS SDK) and ISO 8601 strings (from JSON parsing)
98
- JoinedTimestamp: zod_1.z.coerce.date().optional()
99
- })
100
- .passthrough();
101
37
  /**
102
38
  * The current base-version of any newly created config file
103
39
  */
104
40
  const BASE_CONFIG_VERSION = 0.1;
41
+ /**
42
+ * Config class for loading and saving per-app fjall-config.json files.
43
+ * Each app has its own config at fjall/<app>/fjall-config.json.
44
+ * Stores deploy mapping, active stage, domains, and generator version.
45
+ * Org-level config (accounts, regions, OIDC) is served by OrgConfigClient from the API.
46
+ */
105
47
  class Config {
106
- constructor(rootConfig, existingAccountsConfig, costAllocationTagsConfig) {
48
+ constructor(rootConfig, configPath) {
49
+ this.configPath = null;
107
50
  this.rootConfig = rootConfig ?? {
108
- version: BASE_CONFIG_VERSION,
109
- services: {},
110
- providerAccounts: []
51
+ version: BASE_CONFIG_VERSION
111
52
  };
112
- this.existingAccountsConfig = existingAccountsConfig ?? [];
113
- this.costAllocationTagsConfig = costAllocationTagsConfig ?? [];
53
+ this.configPath = configPath ?? null;
114
54
  }
115
- isDevelopment() {
116
- return !!this.rootConfig?.development;
55
+ /**
56
+ * Find the fjall directory by walking up the directory tree
57
+ */
58
+ static findFjallDirectory() {
59
+ let currentDir = process.cwd();
60
+ for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
61
+ const fjallDir = path.join(currentDir, "fjall");
62
+ if (fs.existsSync(fjallDir) && fs.statSync(fjallDir).isDirectory()) {
63
+ return fjallDir;
64
+ }
65
+ const parentDir = path.dirname(currentDir);
66
+ if (parentDir === currentDir)
67
+ break;
68
+ currentDir = parentDir;
69
+ }
70
+ return null;
117
71
  }
118
72
  /**
119
- * Find the fjall config directory by walking up the directory tree
120
- * @returns The path to the fjall config directory or null if not found
73
+ * Find the config directory for a specific app or the legacy root config.
74
+ * When appName is provided, looks for fjall/<appName>/fjall-config.json.
75
+ * When omitted, falls back to legacy fjall/fjall-config.json or direct fjall-config.json.
121
76
  */
122
- static findConfigDirectory() {
77
+ static findConfigDirectory(appName) {
78
+ if (appName) {
79
+ if (appName !== path.basename(appName))
80
+ return null;
81
+ const fjallDir = Config.findFjallDirectory();
82
+ if (!fjallDir)
83
+ return null;
84
+ const appDir = path.join(fjallDir, appName);
85
+ const configFile = path.join(appDir, "fjall-config.json");
86
+ if (fs.existsSync(configFile)) {
87
+ return appDir;
88
+ }
89
+ return null;
90
+ }
91
+ // Legacy: look for fjall/fjall-config.json or direct fjall-config.json
123
92
  let currentDir = process.cwd();
124
93
  for (let i = 0; i < CONFIG_SEARCH_MAX_DEPTH; i++) {
125
94
  const fjallDir = path.join(currentDir, "fjall");
@@ -140,37 +109,32 @@ class Config {
140
109
  }
141
110
  /**
142
111
  * Load config file into memory as a raw JSON string
143
- * @param configFile - Path to the config file
144
- * @returns Config as JSON string or NULL if no config file accessible
145
112
  */
146
113
  static loadConfigFile(configFile) {
147
114
  try {
148
115
  fs.accessSync(configFile, fs.constants.R_OK | fs.constants.W_OK);
149
116
  return fs.readFileSync(configFile, { encoding: "utf8" });
150
117
  }
151
- catch {
118
+ catch (err) {
119
+ logger_js_1.logger.debug("Config", "Config file not accessible", {
120
+ file: configFile,
121
+ error: err instanceof Error ? err.message : String(err)
122
+ });
152
123
  return null;
153
124
  }
154
125
  }
155
126
  /**
156
- * Load configuration from file
157
- *
158
- * @returns Loaded configuration
159
- * @throws Error if config file cannot be parsed or fails schema validation
127
+ * Load configuration from file.
128
+ * @param appName - Optional app name to load config for a specific app
160
129
  */
161
- static loadConfig() {
162
- const configDir = Config.findConfigDirectory();
130
+ static loadConfig(appName) {
131
+ const configDir = Config.findConfigDirectory(appName);
163
132
  if (!configDir) {
164
133
  return new Config();
165
134
  }
166
- const rootConfigJson = Config.loadConfigFile(path.join(configDir, "fjall-config.json"));
167
- const existingAccountJson = Config.loadConfigFile(path.join(configDir, "accounts-config.json"));
168
- const costAllocationTagsJson = Config.loadConfigFile(path.join(configDir, "cost-allocation-tags-config.json"));
169
- // Parse each config file separately to identify which one fails
135
+ const configFilePath = path.join(configDir, "fjall-config.json");
136
+ const rootConfigJson = Config.loadConfigFile(configFilePath);
170
137
  let rootConfig;
171
- let existingAccountsConfig;
172
- let costAllocationTagsConfig;
173
- // 1. Parse root config (fjall-config.json)
174
138
  if (rootConfigJson) {
175
139
  try {
176
140
  rootConfig = RootConfigSchema.parse(JSON.parse(rootConfigJson));
@@ -179,27 +143,7 @@ class Config {
179
143
  throw Config.formatZodError(err, "fjall-config.json");
180
144
  }
181
145
  }
182
- // 2. Parse accounts config (accounts-config.json)
183
- if (existingAccountJson) {
184
- try {
185
- const raw = JSON.parse(existingAccountJson);
186
- existingAccountsConfig = zod_1.z.array(AccountSchema).parse(raw);
187
- }
188
- catch (err) {
189
- throw Config.formatZodError(err, "accounts-config.json");
190
- }
191
- }
192
- // 3. Parse cost allocation tags config
193
- if (costAllocationTagsJson) {
194
- try {
195
- const raw = JSON.parse(costAllocationTagsJson);
196
- costAllocationTagsConfig = zod_1.z.array(CostAllocationTagsSchema).parse(raw);
197
- }
198
- catch (err) {
199
- throw Config.formatZodError(err, "cost-allocation-tags-config.json");
200
- }
201
- }
202
- return new Config(rootConfig, existingAccountsConfig, costAllocationTagsConfig);
146
+ return new Config(rootConfig, configFilePath);
203
147
  }
204
148
  /**
205
149
  * Format a Zod error into a readable error message
@@ -211,7 +155,6 @@ class Config {
211
155
  .join("; ");
212
156
  return new Error(`Failed to parse ${fileName}: ${issueDetails}`);
213
157
  }
214
- // Fall back to the error message, but replace newlines to keep it on one line
215
158
  const rawMessage = err instanceof Error ? err.message : String(err);
216
159
  const message = rawMessage.replace(/\n/g, " ").substring(0, 500);
217
160
  return new Error(`Failed to parse ${fileName}: ${message}`);
@@ -219,251 +162,115 @@ class Config {
219
162
  /**
220
163
  * Save configuration to file
221
164
  */
222
- saveConfig() {
223
- const configDir = Config.findConfigDirectory() || path.join(process.cwd(), "fjall");
224
- // Ensure directory exists
225
- fs.mkdirSync(configDir, { recursive: true });
226
- const rootJsonString = JSON.stringify(this.rootConfig, null, 2);
227
- fs.writeFileSync(path.join(configDir, "fjall-config.json"), rootJsonString, {
228
- mode: 0o600
229
- });
230
- const existingAccountsJsonString = JSON.stringify(this.existingAccountsConfig, null, 2);
231
- fs.writeFileSync(path.join(configDir, "accounts-config.json"), existingAccountsJsonString, { mode: 0o600 });
232
- const costAllocationTagsJsonString = JSON.stringify(this.costAllocationTagsConfig, null, 2);
233
- fs.writeFileSync(path.join(configDir, "cost-allocation-tags-config.json"), costAllocationTagsJsonString, { mode: 0o600 });
234
- }
235
- /**
236
- * Add a new service to the config file
237
- * @param serviceKey Name/key of the service
238
- * @param config Service configuration properties
239
- */
240
- addService(serviceKey, config) {
241
- if (!this.rootConfig.services)
242
- this.rootConfig.services = {};
243
- this.rootConfig.services[serviceKey] = config;
244
- }
245
- getServiceConfig(serviceKey) {
246
- if (!this.rootConfig.services)
247
- return null;
248
- return this.rootConfig.services[serviceKey] || null;
249
- }
250
- addProviderAccount(account) {
251
- if (!this.rootConfig.providerAccounts)
252
- this.rootConfig.providerAccounts = [];
253
- // ensure account name is always lowercase
254
- account.name = account.name.toLocaleLowerCase();
255
- this.rootConfig.providerAccounts.push(account);
256
- }
257
- getProviderAccount(accountName) {
258
- if (!this.rootConfig.providerAccounts)
259
- return undefined;
260
- return this.rootConfig.providerAccounts.find((account) => account.name.toLocaleLowerCase() === accountName.toLocaleLowerCase());
261
- }
262
- getProviderAccountById(accountId) {
263
- if (!this.rootConfig.providerAccounts)
264
- return undefined;
265
- return this.rootConfig.providerAccounts.find((account) => account.id === accountId);
266
- }
267
- /**
268
- * Get provider account by environment type
269
- * @param environment The environment type (e.g., 'platform', 'staging', 'production')
270
- * @returns The provider account with the specified environment or undefined if not found
271
- */
272
- getAccountByEnvironment(environment) {
273
- if (!this.rootConfig.providerAccounts)
274
- return undefined;
275
- return this.rootConfig.providerAccounts.find((account) => account.environment === environment);
276
- }
277
- /**
278
- * Sets the existing accounts list. This should be called by AccountService
279
- * after it fetches the accounts from AWS.
280
- * @param accounts List of AWS accounts from Organizations API
281
- */
282
- setExistingAccountsList(accounts) {
283
- this.existingAccountsConfig = accounts;
284
- }
285
- getExistingAccounts() {
286
- return this.existingAccountsConfig;
287
- }
288
- setPrimaryRegion(region) {
289
- this.rootConfig.primaryRegion = region;
290
- }
291
- setSecondaryRegions(regions) {
292
- this.rootConfig.secondaryRegions = regions;
293
- }
294
- setDisasterRecoveryRegion(region) {
295
- this.rootConfig.disasterRecoveryRegion = region;
296
- }
297
- getPrimaryRegion() {
298
- return this.rootConfig.primaryRegion;
299
- }
300
- getSecondaryRegions() {
301
- return this.rootConfig.secondaryRegions;
302
- }
303
- getDisasterRecoveryRegion() {
304
- return this.rootConfig.disasterRecoveryRegion;
305
- }
306
- getAllRegions() {
307
- const regions = [];
308
- if (this.rootConfig.primaryRegion) {
309
- regions.push(this.rootConfig.primaryRegion);
310
- }
311
- if (this.rootConfig.secondaryRegions) {
312
- regions.push(...this.rootConfig.secondaryRegions);
313
- }
314
- if (this.rootConfig.disasterRecoveryRegion &&
315
- !regions.includes(this.rootConfig.disasterRecoveryRegion)) {
316
- regions.push(this.rootConfig.disasterRecoveryRegion);
165
+ saveConfig(appName) {
166
+ let targetPath = this.configPath;
167
+ if (!targetPath) {
168
+ if (appName) {
169
+ if (appName !== path.basename(appName)) {
170
+ throw new Error(`Invalid app name: ${appName}`);
171
+ }
172
+ const fjallDir = Config.findFjallDirectory() || path.join(process.cwd(), "fjall");
173
+ const appDir = path.join(fjallDir, appName);
174
+ targetPath = path.join(appDir, "fjall-config.json");
175
+ }
176
+ else {
177
+ const configDir = Config.findConfigDirectory() || path.join(process.cwd(), "fjall");
178
+ targetPath = path.join(configDir, "fjall-config.json");
179
+ }
317
180
  }
318
- return regions;
319
- }
320
- /**
321
- * Sets the cost allocation tags list. This should be called by AccountService
322
- * after it fetches the tags from AWS Cost Explorer.
323
- * @param tags List of cost allocation tags
324
- */
325
- setCostAllocationTagsList(tags) {
326
- this.costAllocationTagsConfig = tags;
327
- }
328
- getCostAllocationTags() {
329
- return this.costAllocationTagsConfig;
181
+ const dir = path.dirname(targetPath);
182
+ fs.mkdirSync(dir, { recursive: true });
183
+ const rootJsonString = JSON.stringify(this.rootConfig, null, 2);
184
+ const tmpPath = `${targetPath}.tmp`;
185
+ fs.writeFileSync(tmpPath, rootJsonString, { mode: 0o600 });
186
+ fs.renameSync(tmpPath, targetPath);
330
187
  }
331
188
  /**
332
189
  * Get the fjall config directory path
333
- * @returns The path to the fjall config directory or null if not found
334
- */
335
- static getConfigDirectory() {
336
- return Config.findConfigDirectory();
337
- }
338
- /**
339
- * Profile management methods
340
190
  */
341
- /**
342
- * Gets the name of the currently active profile.
343
- * @returns The current profile name, or undefined if no profile is set
344
- */
345
- getCurrentProfile() {
346
- return this.rootConfig.currentProfile;
191
+ static getConfigDirectory(appName) {
192
+ return Config.findConfigDirectory(appName);
347
193
  }
348
194
  /**
349
- * Sets the currently active profile.
350
- * @param name The name of the profile to set as current
195
+ * Discover all app names by scanning fjall/<app>/fjall-config.json
351
196
  */
352
- setCurrentProfile(name) {
353
- this.rootConfig.currentProfile = name;
354
- }
355
- /**
356
- * Retrieves a profile by name.
357
- * @param name The name of the profile to retrieve
358
- * @returns The profile configuration, or undefined if not found
359
- */
360
- getProfile(name) {
361
- if (!this.rootConfig.profiles)
362
- return undefined;
363
- return this.rootConfig.profiles[name];
364
- }
365
- getAllProfileNames() {
366
- if (!this.rootConfig.profiles)
197
+ static discoverApps() {
198
+ const fjallDir = Config.findFjallDirectory();
199
+ if (!fjallDir)
367
200
  return [];
368
- return Object.keys(this.rootConfig.profiles);
369
- }
370
- addProfile(name, profile) {
371
- if (!this.rootConfig.profiles) {
372
- this.rootConfig.profiles = {};
201
+ try {
202
+ const entries = fs.readdirSync(fjallDir, { withFileTypes: true });
203
+ const apps = [];
204
+ for (const entry of entries) {
205
+ if (!entry.isDirectory())
206
+ continue;
207
+ const configFile = path.join(fjallDir, entry.name, "fjall-config.json");
208
+ if (fs.existsSync(configFile)) {
209
+ apps.push(entry.name);
210
+ }
211
+ }
212
+ return apps.sort();
373
213
  }
374
- this.rootConfig.profiles[name] = profile;
375
- }
376
- removeProfile(name) {
377
- if (!this.rootConfig.profiles)
378
- return;
379
- delete this.rootConfig.profiles[name];
380
- // If we removed the current profile, clear it
381
- if (this.rootConfig.currentProfile === name) {
382
- this.rootConfig.currentProfile = undefined;
214
+ catch (err) {
215
+ logger_js_1.logger.debug("Config", "Failed to discover apps", {
216
+ error: err instanceof Error ? err.message : String(err)
217
+ });
218
+ return [];
383
219
  }
384
220
  }
385
- getSSOSession(name) {
386
- if (!this.rootConfig.ssoSessions)
387
- return undefined;
388
- return this.rootConfig.ssoSessions[name];
221
+ // Deploy stage management
222
+ getDeployStages() {
223
+ return this.rootConfig.deploy ?? {};
389
224
  }
390
- addSSOSession(name, session) {
391
- if (!this.rootConfig.ssoSessions) {
392
- this.rootConfig.ssoSessions = {};
393
- }
394
- this.rootConfig.ssoSessions[name] = session;
395
- }
396
- getOrgLevelConfig() {
397
- // Derive rootOidcRoleArn from the root account's OIDC profile if available,
398
- // falling back to the explicitly stored field (set during config pull)
399
- const rootAccount = this.rootConfig.providerAccounts?.find((a) => a.environment === "root");
400
- const rootProfileName = rootAccount?.name.toLowerCase();
401
- const rootProfile = rootProfileName
402
- ? this.rootConfig.profiles?.[rootProfileName]
403
- : undefined;
404
- const derivedRoleArn = rootProfile?.type === "oidc" ? rootProfile.oidcRoleArn : undefined;
405
- return {
406
- primaryRegion: this.rootConfig.primaryRegion,
407
- secondaryRegions: this.rootConfig.secondaryRegions,
408
- disasterRecoveryRegion: this.rootConfig.disasterRecoveryRegion,
409
- providerAccounts: this.rootConfig.providerAccounts,
410
- ssoSessions: this.rootConfig.ssoSessions,
411
- rootOidcRoleArn: derivedRoleArn ?? this.rootConfig.rootOidcRoleArn
412
- };
225
+ getDeployStage(name) {
226
+ return this.rootConfig.deploy?.[name];
413
227
  }
414
- getOrganisationId() {
415
- return this.rootConfig.organisationId;
416
- }
417
- setOrganisationId(id) {
418
- this.rootConfig.organisationId = id;
419
- }
420
- getOrganisationName() {
421
- return this.rootConfig.organisationName;
422
- }
423
- setOrganisationName(name) {
424
- this.rootConfig.organisationName = name;
425
- }
426
- getOrganisationEmail() {
427
- return this.rootConfig.organisationEmail;
228
+ setDeployStage(name, stage) {
229
+ if (!this.rootConfig.deploy) {
230
+ this.rootConfig.deploy = {};
231
+ }
232
+ this.rootConfig.deploy[name] = stage;
233
+ }
234
+ removeDeployStage(name) {
235
+ if (!this.rootConfig.deploy?.[name])
236
+ return false;
237
+ delete this.rootConfig.deploy[name];
238
+ if (this.rootConfig.activeStage === name) {
239
+ this.rootConfig.activeStage = undefined;
240
+ }
241
+ return true;
428
242
  }
429
- setOrganisationEmail(email) {
430
- this.rootConfig.organisationEmail = email;
243
+ getActiveStage() {
244
+ return this.rootConfig.activeStage;
431
245
  }
432
- getOidcIssuerUrl() {
433
- return this.rootConfig.oidcIssuerUrl;
246
+ setActiveStage(name) {
247
+ this.rootConfig.activeStage = name;
434
248
  }
435
- setOidcIssuerUrl(url) {
436
- this.rootConfig.oidcIssuerUrl = url;
249
+ // Domain management
250
+ getDomains() {
251
+ return this.rootConfig.domains ?? [];
437
252
  }
438
- getOidcConnection(accountId) {
439
- return this.rootConfig.oidcConnections?.[accountId];
253
+ setDomains(domains) {
254
+ this.rootConfig.domains = domains;
440
255
  }
441
- setOidcConnection(accountId, connection) {
442
- if (!this.rootConfig.oidcConnections) {
443
- this.rootConfig.oidcConnections = {};
256
+ addDomain(domain) {
257
+ if (!this.rootConfig.domains) {
258
+ this.rootConfig.domains = [];
444
259
  }
445
- this.rootConfig.oidcConnections[accountId] = connection;
260
+ this.rootConfig.domains.push(domain);
446
261
  }
447
- setOrgLevelConfig(config) {
448
- if (config.primaryRegion !== undefined) {
449
- this.rootConfig.primaryRegion = config.primaryRegion;
450
- }
451
- if (config.secondaryRegions !== undefined) {
452
- this.rootConfig.secondaryRegions = config.secondaryRegions;
453
- }
454
- if (config.disasterRecoveryRegion !== undefined) {
455
- this.rootConfig.disasterRecoveryRegion = config.disasterRecoveryRegion;
456
- }
457
- if (config.providerAccounts !== undefined) {
458
- this.rootConfig.providerAccounts = config.providerAccounts;
459
- }
460
- if (config.ssoSessions !== undefined) {
461
- this.rootConfig.ssoSessions = config.ssoSessions;
462
- }
463
- if (config.rootOidcRoleArn !== undefined) {
464
- this.rootConfig.rootOidcRoleArn = config.rootOidcRoleArn;
465
- }
262
+ getDomain(name) {
263
+ return this.rootConfig.domains?.find((d) => d.name.toLowerCase() === name.toLowerCase());
264
+ }
265
+ removeDomain(name) {
266
+ if (!this.rootConfig.domains)
267
+ return false;
268
+ const index = this.rootConfig.domains.findIndex((d) => d.name.toLowerCase() === name.toLowerCase());
269
+ if (index === -1)
270
+ return false;
271
+ this.rootConfig.domains.splice(index, 1);
272
+ return true;
466
273
  }
467
274
  }
468
275
  exports.Config = Config;
469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUl4Qjs7O0dBR0c7QUFDSCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQTJFbkMsNkJBQTZCO0FBQzdCLE1BQU0sa0JBQWtCLEdBQUcsT0FBQztLQUN6QixNQUFNLENBQUM7SUFDTixjQUFjLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUMxQixhQUFhLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtDQUMxQixDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFFWixNQUFNLG1CQUFtQixHQUFHLE9BQUM7S0FDMUIsTUFBTSxDQUFDO0lBQ04sRUFBRSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDZCxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUMzQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtJQUM5QixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDOUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDLFFBQVEsRUFBRTtJQUMzQyxnQkFBZ0IsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0NBQ3hDLENBQUM7S0FDRCxNQUFNLEVBQUUsQ0FBQztBQUVaLE1BQU0scUJBQXFCLEdBQUcsT0FBQztLQUM1QixNQUFNLENBQUM7SUFDTixFQUFFLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtJQUNkLElBQUksRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ3ZCLE9BQU8sRUFBRSxPQUFDLENB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QyxHQUFHLFVBQVUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBc0I7UUFDdEMsSUFBSSxNQUFNLENBQUMsYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7UUFDdkQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixDQUFDO1FBQzdELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxzQkFBc0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoRCxJQUFJLENBQUMsVUFBVSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsZ0JBQWdCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7UUFDN0QsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDO1FBQ25ELENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxlQUFlLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQztRQUMzRCxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBbmRELHdCQW1kQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWNjb3VudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtb3JnYW5pemF0aW9uc1wiO1xuZXhwb3J0IHR5cGUgeyBBY2NvdW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1vcmdhbml6YXRpb25zXCI7XG5cbi8qKlxuICogTWF4aW11bSBkZXB0aCBmb3Igc2VhcmNoaW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgY29uZmlnIGZpbGVzLlxuICogUHJldmVudHMgaW5maW5pdGUgbG9vcHMgd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yaWVzLlxuICovXG5jb25zdCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBTZXJ2aWNlQ29uZmlnID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBvcHRpb25zPzogb2JqZWN0O1xuICBkb2NrZXJDb25maWc/OiB7XG4gICAgZG9ja2VyZmlsZVBhdGg6IHN0cmluZztcbiAgICBjb250YWluZXJQb3J0OiBudW1iZXI7XG4gIH07XG4gIGFwaUFwcGxpY2F0aW9uSWQ/OiBzdHJpbmc7IC8vIEZqYWxsIEFQSSBhcHBsaWNhdGlvbiBJRFxufTtcblxuZXhwb3J0IHR5cGUgUHJvdmlkZXJBY2NvdW50ID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGVudmlyb25tZW50OiBzdHJpbmc7XG4gIG1hbmFnZWQ/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgT2lkY0Nvbm5lY3Rpb24gPSB7XG4gIHJvbGVBcm46IHN0cmluZztcbiAgZXh0ZXJuYWxJZDogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJpYW1cIiB8IFwic3NvXCIgfCBcIm9pZGNcIjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIC8vIFNTTyBwcm9maWxlc1xuICBzc29BY2NvdW50SWQ/OiBzdHJpbmc7XG4gIHNzb1JvbGVOYW1lPzogc3RyaW5nO1xuICBzc29TZXNzaW9uPzogc3RyaW5nO1xuICAvLyBPSURDIHByb2ZpbGVzIChDSS9DRCBhbmQgRmphbGwtaXNzdWVkKVxuICBvaWRjUm9sZUFybj86IHN0cmluZztcbiAgb2lkY1Byb3ZpZGVyQXJuPzogc3RyaW5nO1xuICAvLyBSb2xlIGFzc3VtcHRpb24gKHVzZWQgaW4gQVdTIGNvbmZpZyBmaWxlIGdlbmVyYXRpb24pXG4gIGNyZWRlbnRpYWxTb3VyY2U/OiBzdHJpbmc7XG4gIHJvbGVBcm4/OiBzdHJpbmc7XG4gIHJvbGVTZXNzaW9uTmFtZT86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFNTT1Nlc3Npb24gPSB7XG4gIHNzb1JlZ2lvbjogc3RyaW5nO1xuICBzc29TdGFydFVybDogc3RyaW5nO1xufTtcblxudHlwZSBSb290Q29uZmlnID0ge1xuICB2ZXJzaW9uPzogbnVtYmVyO1xuICBkZXZlbG9wbWVudD86IGJvb2xlYW47XG4gIHNlcnZpY2VzPzogeyBba2V5OiBzdHJpbmddOiBTZXJ2aWNlQ29uZmlnIH07XG4gIHByb3ZpZGVyQWNjb3VudHM/OiBQcm92aWRlckFjY291bnRbXTtcbiAgcHJpbWFyeVJlZ2lvbj86IHN0cmluZztcbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uPzogc3RyaW5nO1xuICAvLyBQcm9maWxlIG1hbmFnZW1lbnRcbiAgY3VycmVudFByb2ZpbGU/OiBzdHJpbmc7XG4gIHByb2ZpbGVzPzogeyBba2V5OiBzdHJpbmddOiBQcm9maWxlIH07XG4gIHNzb1Nlc3Npb25zPzogeyBba2V5OiBzdHJpbmddOiBTU09TZXNzaW9uIH07XG4gIC8vIE9yZ2FuaXNhdGlvbiBpZGVudGl0eSAoZnJvbSBGamFsbCBBUEkpXG4gIG9yZ2FuaXNhdGlvbklkPzogc3RyaW5nO1xuICBvcmdhbmlzYXRpb25OYW1lPzogc3RyaW5nO1xuICBvcmdhbmlzYXRpb25FbWFpbD86IHN0cmluZztcbiAgLy8gT0lEQyBjb25maWd1cmF0aW9uXG5cbiAgb2lkY0lzc3VlclVybD86IHN0cmluZztcbiAgb2lkY0Nvbm5lY3Rpb25zPzogeyBbYWNjb3VudElkOiBzdHJpbmddOiBPaWRjQ29ubmVjdGlvbiB9O1xuICByb290T2lkY1JvbGVBcm4/OiBzdHJpbmc7XG59O1xuXG50eXBlIENvc3RBbGxvY2F0aW9uVGFncyA9IHtcbiAgVGFnS2V5OiBzdHJpbmc7XG4gIFN0YXR1czogc3RyaW5nO1xufTtcblxuLy8gWm9kIHNjaGVtYXMgZm9yIHZhbGlkYXRpb25cbmNvbnN0IERvY2tlckNvbmZpZ1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgZG9ja2VyZmlsZVBhdGg6IHouc3RyaW5nKCksXG4gICAgY29udGFpbmVyUG9ydDogei5udW1iZXIoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFNlcnZpY2VDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIGlkOiB6LnN0cmluZygpLFxuICAgIHR5cGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB2ZXJzaW9uOiB6Lm51bWJlcigpLm9wdGlvbmFsKCksXG4gICAgb3B0aW9uczogei5vYmplY3Qoe30pLnBhc3N0aHJvdWdoKCkub3B0aW9uYWwoKSxcbiAgICBkb2NrZXJDb25maWc6IERvY2tlckNvbmZpZ1NjaGVtYS5vcHRpb25hbCgpLFxuICAgIGFwaUFwcGxpY2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmNvbnN0IFByb3ZpZGVyQWNjb3VudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgaWQ6IHouc3RyaW5nKCksXG4gICAgbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbnZpcm9ubWVudDogei5zdHJpbmcoKSxcbiAgICBtYW5hZ2VkOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgUHJvZmlsZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdHlwZTogei5lbnVtKFtcImlhbVwiLCBcInNzb1wiLCBcIm9pZGNcIl0pLFxuICAgIHJlZ2lvbjogei5zdHJpbmcoKSxcbiAgICBzc29BY2NvdW50SWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzc29Sb2xlTmFtZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIHNzb1Nlc3Npb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvaWRjUm9sZUFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIG9pZGNQcm92aWRlckFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGNyZWRlbnRpYWxTb3VyY2U6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICByb2xlQXJuOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcm9sZVNlc3Npb25OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBTU09TZXNzaW9uU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBzc29SZWdpb246IHouc3RyaW5nKCksXG4gICAgc3NvU3RhcnRVcmw6IHouc3RyaW5nKClcbiAgfSlcbiAgLnN0cmljdCgpO1xuXG5jb25zdCBPaWRjQ29ubmVjdGlvblNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgcm9sZUFybjogei5zdHJpbmcoKSxcbiAgICBleHRlcm5hbElkOiB6LnN0cmluZygpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgUm9vdENvbmZpZ1NjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgdmVyc2lvbjogei5udW1iZXIoKS5vcHRpb25hbCgpLFxuICAgIGRldmVsb3BtZW50OiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLFxuICAgIHNlcnZpY2VzOiB6LnJlY29yZCh6LnN0cmluZygpLCBTZXJ2aWNlQ29uZmlnU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHByb3ZpZGVyQWNjb3VudHM6IHouYXJyYXkoUHJvdmlkZXJBY2NvdW50U2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHByaW1hcnlSZWdpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBzZWNvbmRhcnlSZWdpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLm9wdGlvbmFsKCksXG4gICAgZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGN1cnJlbnRQcm9maWxlOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgcHJvZmlsZXM6IHoucmVjb3JkKHouc3RyaW5nKCksIFByb2ZpbGVTY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgc3NvU2Vzc2lvbnM6IHoucmVjb3JkKHouc3RyaW5nKCksIFNTT1Nlc3Npb25TY2hlbWEpLm9wdGlvbmFsKCksXG4gICAgb3JnYW5pc2F0aW9uSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvcmdhbmlzYXRpb25OYW1lOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgb3JnYW5pc2F0aW9uRW1haWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcblxuICAgIG9pZGNJc3N1ZXJVcmw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBvaWRjQ29ubmVjdGlvbnM6IHoucmVjb3JkKHouc3RyaW5nKCksIE9pZGNDb25uZWN0aW9uU2NoZW1hKS5vcHRpb25hbCgpLFxuICAgIHJvb3RPaWRjUm9sZUFybjogei5zdHJpbmcoKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQ29zdEFsbG9jYXRpb25UYWdzU2NoZW1hID0gelxuICAub2JqZWN0KHtcbiAgICBUYWdLZXk6IHouc3RyaW5nKCksXG4gICAgU3RhdHVzOiB6LnN0cmluZygpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxuY29uc3QgQWNjb3VudFNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgSWQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBBcm46IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBFbWFpbDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIE5hbWU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICBTdGF0dXM6IHouZW51bShbXCJBQ1RJVkVcIiwgXCJTVVNQRU5ERURcIiwgXCJQRU5ESU5HX0NMT1NVUkVcIl0pLm9wdGlvbmFsKCksXG4gICAgSm9pbmVkTWV0aG9kOiB6LmVudW0oW1wiSU5WSVRFRFwiLCBcIkNSRUFURURcIl0pLm9wdGlvbmFsKCksXG4gICAgLy8gei5jb2VyY2UuZGF0ZSgpIGhhbmRsZXMgYm90aCBEYXRlIG9iamVjdHMgKGZyb20gQVdTIFNESykgYW5kIElTTyA4NjAxIHN0cmluZ3MgKGZyb20gSlNPTiBwYXJzaW5nKVxuICAgIEpvaW5lZFRpbWVzdGFtcDogei5jb2VyY2UuZGF0ZSgpLm9wdGlvbmFsKClcbiAgfSlcbiAgLnBhc3N0aHJvdWdoKCk7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgZmphbGwtY29uZmlnLmpzb24gZmlsZVxuICovXG5leHBvcnQgdHlwZSBPcmdMZXZlbENvbmZpZyA9IHtcbiAgcHJpbWFyeVJlZ2lvbj86IHN0cmluZztcbiAgc2Vjb25kYXJ5UmVnaW9ucz86IHN0cmluZ1tdO1xuICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uPzogc3RyaW5nO1xuICBwcm92aWRlckFjY291bnRzPzogUHJvdmlkZXJBY2NvdW50W107XG4gIHNzb1Nlc3Npb25zPzogeyBba2V5OiBzdHJpbmddOiBTU09TZXNzaW9uIH07XG4gIHJvb3RPaWRjUm9sZUFybj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBleGlzdGluZ0FjY291bnRzQ29uZmlnOiBBY2NvdW50W107XG4gIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZzogQ29zdEFsbG9jYXRpb25UYWdzW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcm9vdENvbmZpZz86IFJvb3RDb25maWcsXG4gICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZz86IEFjY291bnRbXSxcbiAgICBjb3N0QWxsb2NhdGlvblRhZ3NDb25maWc/OiBDb3N0QWxsb2NhdGlvblRhZ3NbXVxuICApIHtcbiAgICB0aGlzLnJvb3RDb25maWcgPSByb290Q29uZmlnID8/IHtcbiAgICAgIHZlcnNpb246IEJBU0VfQ09ORklHX1ZFUlNJT04sXG4gICAgICBzZXJ2aWNlczoge30sXG4gICAgICBwcm92aWRlckFjY291bnRzOiBbXVxuICAgIH07XG4gICAgdGhpcy5leGlzdGluZ0FjY291bnRzQ29uZmlnID0gZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA/PyBbXTtcbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA/PyBbXTtcbiAgfVxuXG4gIGlzRGV2ZWxvcG1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5yb290Q29uZmlnPy5kZXZlbG9wbWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqIEByZXR1cm5zIFRoZSBwYXRoIHRvIHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kQ29uZmlnRGlyZWN0b3J5KCk6IHN0cmluZyB8IG51bGwge1xuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09ORklHX1NFQVJDSF9NQVhfREVQVEg7IGkrKykge1xuICAgICAgY29uc3QgZmphbGxEaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oZmphbGxEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBmamFsbERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0Q29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyZWN0Q29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIGJyZWFrO1xuICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZyBmaWxlIGludG8gbWVtb3J5IGFzIGEgcmF3IEpTT04gc3RyaW5nXG4gICAqIEBwYXJhbSBjb25maWdGaWxlIC0gUGF0aCB0byB0aGUgY29uZmlnIGZpbGVcbiAgICogQHJldHVybnMgQ29uZmlnIGFzIEpTT04gc3RyaW5nIG9yIE5VTEwgaWYgbm8gY29uZmlnIGZpbGUgYWNjZXNzaWJsZVxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgbG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGZzLmFjY2Vzc1N5bmMoY29uZmlnRmlsZSwgZnMuY29uc3RhbnRzLlJfT0sgfCBmcy5jb25zdGFudHMuV19PSyk7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGNvbmZpZ0ZpbGUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGVcbiAgICpcbiAgICogQHJldHVybnMgTG9hZGVkIGNvbmZpZ3VyYXRpb25cbiAgICogQHRocm93cyBFcnJvciBpZiBjb25maWcgZmlsZSBjYW5ub3QgYmUgcGFyc2VkIG9yIGZhaWxzIHNjaGVtYSB2YWxpZGF0aW9uXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZygpOiBDb25maWcge1xuICAgIGNvbnN0IGNvbmZpZ0RpciA9IENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCk7XG4gICAgaWYgKCFjb25maWdEaXIpIHtcbiAgICAgIHJldHVybiBuZXcgQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpXG4gICAgKTtcbiAgICBjb25zdCBleGlzdGluZ0FjY291bnRKc29uID0gQ29uZmlnLmxvYWRDb25maWdGaWxlKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJhY2NvdW50cy1jb25maWcuanNvblwiKVxuICAgICk7XG4gICAgY29uc3QgY29zdEFsbG9jYXRpb25UYWdzSnNvbiA9IENvbmZpZy5sb2FkQ29uZmlnRmlsZShcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIilcbiAgICApO1xuXG4gICAgLy8gUGFyc2UgZWFjaCBjb25maWcgZmlsZSBzZXBhcmF0ZWx5IHRvIGlkZW50aWZ5IHdoaWNoIG9uZSBmYWlsc1xuICAgIGxldCByb290Q29uZmlnOiBSb290Q29uZmlnIHwgdW5kZWZpbmVkO1xuICAgIGxldCBleGlzdGluZ0FjY291bnRzQ29uZmlnOiBBY2NvdW50W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZzogQ29zdEFsbG9jYXRpb25UYWdzW10gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyAxLiBQYXJzZSByb290IGNvbmZpZyAoZmphbGwtY29uZmlnLmpzb24pXG4gICAgaWYgKHJvb3RDb25maWdKc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICByb290Q29uZmlnID0gUm9vdENvbmZpZ1NjaGVtYS5wYXJzZShKU09OLnBhcnNlKHJvb3RDb25maWdKc29uKSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgdGhyb3cgQ29uZmlnLmZvcm1hdFpvZEVycm9yKGVyciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyLiBQYXJzZSBhY2NvdW50cyBjb25maWcgKGFjY291bnRzLWNvbmZpZy5qc29uKVxuICAgIGlmIChleGlzdGluZ0FjY291bnRKc29uKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBKU09OLnBhcnNlKGV4aXN0aW5nQWNjb3VudEpzb24pO1xuICAgICAgICBleGlzdGluZ0FjY291bnRzQ29uZmlnID0gei5hcnJheShBY2NvdW50U2NoZW1hKS5wYXJzZShyYXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IENvbmZpZy5mb3JtYXRab2RFcnJvcihlcnIsIFwiYWNjb3VudHMtY29uZmlnLmpzb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gUGFyc2UgY29zdCBhbGxvY2F0aW9uIHRhZ3MgY29uZmlnXG4gICAgaWYgKGNvc3RBbGxvY2F0aW9uVGFnc0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJhdyA9IEpTT04ucGFyc2UoY29zdEFsbG9jYXRpb25UYWdzSnNvbik7XG4gICAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IHouYXJyYXkoQ29zdEFsbG9jYXRpb25UYWdzU2NoZW1hKS5wYXJzZShyYXcpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IENvbmZpZy5mb3JtYXRab2RFcnJvcihlcnIsIFwiY29zdC1hbGxvY2F0aW9uLXRhZ3MtY29uZmlnLmpzb25cIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBDb25maWcoXG4gICAgICByb290Q29uZmlnLFxuICAgICAgZXhpc3RpbmdBY2NvdW50c0NvbmZpZyxcbiAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgWm9kIGVycm9yIGludG8gYSByZWFkYWJsZSBlcnJvciBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmb3JtYXRab2RFcnJvcihlcnI6IHVua25vd24sIGZpbGVOYW1lOiBzdHJpbmcpOiBFcnJvciB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IgJiYgZXJyLmlzc3Vlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBpc3N1ZURldGFpbHMgPSBlcnIuaXNzdWVzXG4gICAgICAgIC5tYXAoKGlzc3VlKSA9PiBgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfTogJHtpc3N1ZS5tZXNzYWdlfWApXG4gICAgICAgIC5qb2luKFwiOyBcIik7XG4gICAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7aXNzdWVEZXRhaWxzfWApO1xuICAgIH1cbiAgICAvLyBGYWxsIGJhY2sgdG8gdGhlIGVycm9yIG1lc3NhZ2UsIGJ1dCByZXBsYWNlIG5ld2xpbmVzIHRvIGtlZXAgaXQgb24gb25lIGxpbmVcbiAgICBjb25zdCByYXdNZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpO1xuICAgIGNvbnN0IG1lc3NhZ2UgPSByYXdNZXNzYWdlLnJlcGxhY2UoL1xcbi9nLCBcIiBcIikuc3Vic3RyaW5nKDAsIDUwMCk7XG4gICAgcmV0dXJuIG5ldyBFcnJvcihgRmFpbGVkIHRvIHBhcnNlICR7ZmlsZU5hbWV9OiAke21lc3NhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBjb25maWd1cmF0aW9uIHRvIGZpbGVcbiAgICovXG4gIHNhdmVDb25maWcoKTogdm9pZCB7XG4gICAgY29uc3QgY29uZmlnRGlyID1cbiAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG5cbiAgICAvLyBFbnN1cmUgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGZzLm1rZGlyU3luYyhjb25maWdEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgY29uc3Qgcm9vdEpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnJvb3RDb25maWcsIG51bGwsIDIpO1xuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpLFxuICAgICAgcm9vdEpzb25TdHJpbmcsXG4gICAgICB7XG4gICAgICAgIG1vZGU6IDBvNjAwXG4gICAgICB9XG4gICAgKTtcblxuICAgIGNvbnN0IGV4aXN0aW5nQWNjb3VudHNKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWcsXG4gICAgICBudWxsLFxuICAgICAgMlxuICAgICk7XG4gICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgIHBhdGguam9pbihjb25maWdEaXIsIFwiYWNjb3VudHMtY29uZmlnLmpzb25cIiksXG4gICAgICBleGlzdGluZ0FjY291bnRzSnNvblN0cmluZyxcbiAgICAgIHsgbW9kZTogMG82MDAgfVxuICAgICk7XG5cbiAgICBjb25zdCBjb3N0QWxsb2NhdGlvblRhZ3NKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICAyXG4gICAgKTtcbiAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgcGF0aC5qb2luKGNvbmZpZ0RpciwgXCJjb3N0LWFsbG9jYXRpb24tdGFncy1jb25maWcuanNvblwiKSxcbiAgICAgIGNvc3RBbGxvY2F0aW9uVGFnc0pzb25TdHJpbmcsXG4gICAgICB7IG1vZGU6IDBvNjAwIH1cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIG5ldyBzZXJ2aWNlIHRvIHRoZSBjb25maWcgZmlsZVxuICAgKiBAcGFyYW0gc2VydmljZUtleSBOYW1lL2tleSBvZiB0aGUgc2VydmljZVxuICAgKiBAcGFyYW0gY29uZmlnIFNlcnZpY2UgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzXG4gICAqL1xuICBhZGRTZXJ2aWNlKHNlcnZpY2VLZXk6IHN0cmluZywgY29uZmlnOiBTZXJ2aWNlQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuc2VydmljZXMpIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlcyA9IHt9O1xuICAgIHRoaXMucm9vdENvbmZpZy5zZXJ2aWNlc1tzZXJ2aWNlS2V5XSA9IGNvbmZpZztcbiAgfVxuXG4gIGdldFNlcnZpY2VDb25maWcoc2VydmljZUtleTogc3RyaW5nKTogU2VydmljZUNvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnNlcnZpY2VzW3NlcnZpY2VLZXldIHx8IG51bGw7XG4gIH1cblxuICBhZGRQcm92aWRlckFjY291bnQoYWNjb3VudDogUHJvdmlkZXJBY2NvdW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cylcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzID0gW107XG5cbiAgICAvLyBlbnN1cmUgYWNjb3VudCBuYW1lIGlzIGFsd2F5cyBsb3dlcmNhc2VcbiAgICBhY2NvdW50Lm5hbWUgPSBhY2NvdW50Lm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKTtcblxuICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLnB1c2goYWNjb3VudCk7XG4gIH1cblxuICBnZXRQcm92aWRlckFjY291bnQoYWNjb3VudE5hbWU6IHN0cmluZyk6IFByb3ZpZGVyQWNjb3VudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PlxuICAgICAgICBhY2NvdW50Lm5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gYWNjb3VudE5hbWUudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICBnZXRQcm92aWRlckFjY291bnRCeUlkKGFjY291bnRJZDogc3RyaW5nKTogUHJvdmlkZXJBY2NvdW50IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cy5maW5kKFxuICAgICAgKGFjY291bnQpID0+IGFjY291bnQuaWQgPT09IGFjY291bnRJZFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHByb3ZpZGVyIGFjY291bnQgYnkgZW52aXJvbm1lbnQgdHlwZVxuICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgVGhlIGVudmlyb25tZW50IHR5cGUgKGUuZy4sICdwbGF0Zm9ybScsICdzdGFnaW5nJywgJ3Byb2R1Y3Rpb24nKVxuICAgKiBAcmV0dXJucyBUaGUgcHJvdmlkZXIgYWNjb3VudCB3aXRoIHRoZSBzcGVjaWZpZWQgZW52aXJvbm1lbnQgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgZ2V0QWNjb3VudEJ5RW52aXJvbm1lbnQoZW52aXJvbm1lbnQ6IHN0cmluZyk6IFByb3ZpZGVyQWNjb3VudCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvdmlkZXJBY2NvdW50cykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLnByb3ZpZGVyQWNjb3VudHMuZmluZChcbiAgICAgIChhY2NvdW50KSA9PiBhY2NvdW50LmVudmlyb25tZW50ID09PSBlbnZpcm9ubWVudFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgZXhpc3RpbmcgYWNjb3VudHMgbGlzdC4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJ5IEFjY291bnRTZXJ2aWNlXG4gICAqIGFmdGVyIGl0IGZldGNoZXMgdGhlIGFjY291bnRzIGZyb20gQVdTLlxuICAgKiBAcGFyYW0gYWNjb3VudHMgTGlzdCBvZiBBV1MgYWNjb3VudHMgZnJvbSBPcmdhbml6YXRpb25zIEFQSVxuICAgKi9cbiAgc2V0RXhpc3RpbmdBY2NvdW50c0xpc3QoYWNjb3VudHM6IEFjY291bnRbXSk6IHZvaWQge1xuICAgIHRoaXMuZXhpc3RpbmdBY2NvdW50c0NvbmZpZyA9IGFjY291bnRzO1xuICB9XG5cbiAgZ2V0RXhpc3RpbmdBY2NvdW50cygpOiBBY2NvdW50W10ge1xuICAgIHJldHVybiB0aGlzLmV4aXN0aW5nQWNjb3VudHNDb25maWc7XG4gIH1cblxuICBzZXRQcmltYXJ5UmVnaW9uKHJlZ2lvbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb24gPSByZWdpb247XG4gIH1cblxuICBzZXRTZWNvbmRhcnlSZWdpb25zKHJlZ2lvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMgPSByZWdpb25zO1xuICB9XG5cbiAgc2V0RGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbihyZWdpb246IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5kaXNhc3RlclJlY292ZXJ5UmVnaW9uID0gcmVnaW9uO1xuICB9XG5cbiAgZ2V0UHJpbWFyeVJlZ2lvbigpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJpbWFyeVJlZ2lvbjtcbiAgfVxuXG4gIGdldFNlY29uZGFyeVJlZ2lvbnMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucztcbiAgfVxuXG4gIGdldERpc2FzdGVyUmVjb3ZlcnlSZWdpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb247XG4gIH1cblxuICBnZXRBbGxSZWdpb25zKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCByZWdpb25zOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uKSB7XG4gICAgICByZWdpb25zLnB1c2godGhpcy5yb290Q29uZmlnLnByaW1hcnlSZWdpb24pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucykge1xuICAgICAgcmVnaW9ucy5wdXNoKC4uLnRoaXMucm9vdENvbmZpZy5zZWNvbmRhcnlSZWdpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbiAmJlxuICAgICAgIXJlZ2lvbnMuaW5jbHVkZXModGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pXG4gICAgKSB7XG4gICAgICByZWdpb25zLnB1c2godGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24pO1xuICAgIH1cblxuICAgIHJldHVybiByZWdpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGNvc3QgYWxsb2NhdGlvbiB0YWdzIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBBY2NvdW50U2VydmljZVxuICAgKiBhZnRlciBpdCBmZXRjaGVzIHRoZSB0YWdzIGZyb20gQVdTIENvc3QgRXhwbG9yZXIuXG4gICAqIEBwYXJhbSB0YWdzIExpc3Qgb2YgY29zdCBhbGxvY2F0aW9uIHRhZ3NcbiAgICovXG4gIHNldENvc3RBbGxvY2F0aW9uVGFnc0xpc3QodGFnczogQ29zdEFsbG9jYXRpb25UYWdzW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZyA9IHRhZ3M7XG4gIH1cblxuICBnZXRDb3N0QWxsb2NhdGlvblRhZ3MoKTogQ29zdEFsbG9jYXRpb25UYWdzW10ge1xuICAgIHJldHVybiB0aGlzLmNvc3RBbGxvY2F0aW9uVGFnc0NvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZqYWxsIGNvbmZpZyBkaXJlY3RvcnkgcGF0aFxuICAgKiBAcmV0dXJucyBUaGUgcGF0aCB0byB0aGUgZmphbGwgY29uZmlnIGRpcmVjdG9yeSBvciBudWxsIGlmIG5vdCBmb3VuZFxuICAgKi9cbiAgc3RhdGljIGdldENvbmZpZ0RpcmVjdG9yeSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gQ29uZmlnLmZpbmRDb25maWdEaXJlY3RvcnkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9maWxlIG1hbmFnZW1lbnQgbWV0aG9kc1xuICAgKi9cblxuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBwcm9maWxlLlxuICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBwcm9maWxlIG5hbWUsIG9yIHVuZGVmaW5lZCBpZiBubyBwcm9maWxlIGlzIHNldFxuICAgKi9cbiAgZ2V0Q3VycmVudFByb2ZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmN1cnJlbnRQcm9maWxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGN1cnJlbnRseSBhY3RpdmUgcHJvZmlsZS5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgdG8gc2V0IGFzIGN1cnJlbnRcbiAgICovXG4gIHNldEN1cnJlbnRQcm9maWxlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IG5hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgcHJvZmlsZSBieSBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvZmlsZSB0byByZXRyaWV2ZVxuICAgKiBAcmV0dXJucyBUaGUgcHJvZmlsZSBjb25maWd1cmF0aW9uLCBvciB1bmRlZmluZWQgaWYgbm90IGZvdW5kXG4gICAqL1xuICBnZXRQcm9maWxlKG5hbWU6IHN0cmluZyk6IFByb2ZpbGUgfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcucHJvZmlsZXNbbmFtZV07XG4gIH1cblxuICBnZXRBbGxQcm9maWxlTmFtZXMoKTogc3RyaW5nW10ge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSByZXR1cm4gW107XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucm9vdENvbmZpZy5wcm9maWxlcyk7XG4gIH1cblxuICBhZGRQcm9maWxlKG5hbWU6IHN0cmluZywgcHJvZmlsZTogUHJvZmlsZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucHJvZmlsZXMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdID0gcHJvZmlsZTtcbiAgfVxuXG4gIHJlbW92ZVByb2ZpbGUobmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcucHJvZmlsZXMpIHJldHVybjtcbiAgICBkZWxldGUgdGhpcy5yb290Q29uZmlnLnByb2ZpbGVzW25hbWVdO1xuXG4gICAgLy8gSWYgd2UgcmVtb3ZlZCB0aGUgY3VycmVudCBwcm9maWxlLCBjbGVhciBpdFxuICAgIGlmICh0aGlzLnJvb3RDb25maWcuY3VycmVudFByb2ZpbGUgPT09IG5hbWUpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5jdXJyZW50UHJvZmlsZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBnZXRTU09TZXNzaW9uKG5hbWU6IHN0cmluZyk6IFNTT1Nlc3Npb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnNbbmFtZV07XG4gIH1cblxuICBhZGRTU09TZXNzaW9uKG5hbWU6IHN0cmluZywgc2Vzc2lvbjogU1NPU2Vzc2lvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc3NvU2Vzc2lvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zW25hbWVdID0gc2Vzc2lvbjtcbiAgfVxuXG4gIGdldE9yZ0xldmVsQ29uZmlnKCk6IE9yZ0xldmVsQ29uZmlnIHtcbiAgICAvLyBEZXJpdmUgcm9vdE9pZGNSb2xlQXJuIGZyb20gdGhlIHJvb3QgYWNjb3VudCdzIE9JREMgcHJvZmlsZSBpZiBhdmFpbGFibGUsXG4gICAgLy8gZmFsbGluZyBiYWNrIHRvIHRoZSBleHBsaWNpdGx5IHN0b3JlZCBmaWVsZCAoc2V0IGR1cmluZyBjb25maWcgcHVsbClcbiAgICBjb25zdCByb290QWNjb3VudCA9IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzPy5maW5kKFxuICAgICAgKGEpID0+IGEuZW52aXJvbm1lbnQgPT09IFwicm9vdFwiXG4gICAgKTtcbiAgICBjb25zdCByb290UHJvZmlsZU5hbWUgPSByb290QWNjb3VudD8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJvb3RQcm9maWxlID0gcm9vdFByb2ZpbGVOYW1lXG4gICAgICA/IHRoaXMucm9vdENvbmZpZy5wcm9maWxlcz8uW3Jvb3RQcm9maWxlTmFtZV1cbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRlcml2ZWRSb2xlQXJuID1cbiAgICAgIHJvb3RQcm9maWxlPy50eXBlID09PSBcIm9pZGNcIiA/IHJvb3RQcm9maWxlLm9pZGNSb2xlQXJuIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByaW1hcnlSZWdpb246IHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uLFxuICAgICAgc2Vjb25kYXJ5UmVnaW9uczogdGhpcy5yb290Q29uZmlnLnNlY29uZGFyeVJlZ2lvbnMsXG4gICAgICBkaXNhc3RlclJlY292ZXJ5UmVnaW9uOiB0aGlzLnJvb3RDb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbixcbiAgICAgIHByb3ZpZGVyQWNjb3VudHM6IHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzLFxuICAgICAgc3NvU2Vzc2lvbnM6IHRoaXMucm9vdENvbmZpZy5zc29TZXNzaW9ucyxcbiAgICAgIHJvb3RPaWRjUm9sZUFybjogZGVyaXZlZFJvbGVBcm4gPz8gdGhpcy5yb290Q29uZmlnLnJvb3RPaWRjUm9sZUFyblxuICAgIH07XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25JZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uSWQ7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25JZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbklkID0gaWQ7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25OYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vcmdhbmlzYXRpb25OYW1lO1xuICB9XG5cbiAgc2V0T3JnYW5pc2F0aW9uTmFtZShuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uTmFtZSA9IG5hbWU7XG4gIH1cblxuICBnZXRPcmdhbmlzYXRpb25FbWFpbCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcub3JnYW5pc2F0aW9uRW1haWw7XG4gIH1cblxuICBzZXRPcmdhbmlzYXRpb25FbWFpbChlbWFpbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290Q29uZmlnLm9yZ2FuaXNhdGlvbkVtYWlsID0gZW1haWw7XG4gIH1cblxuICBnZXRPaWRjSXNzdWVyVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsO1xuICB9XG5cbiAgc2V0T2lkY0lzc3VlclVybCh1cmw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5vaWRjSXNzdWVyVXJsID0gdXJsO1xuICB9XG5cbiAgZ2V0T2lkY0Nvbm5lY3Rpb24oYWNjb3VudElkOiBzdHJpbmcpOiBPaWRjQ29ubmVjdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5vaWRjQ29ubmVjdGlvbnM/LlthY2NvdW50SWRdO1xuICB9XG5cbiAgc2V0T2lkY0Nvbm5lY3Rpb24oYWNjb3VudElkOiBzdHJpbmcsIGNvbm5lY3Rpb246IE9pZGNDb25uZWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcub2lkY0Nvbm5lY3Rpb25zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcub2lkY0Nvbm5lY3Rpb25zID0ge307XG4gICAgfVxuICAgIHRoaXMucm9vdENvbmZpZy5vaWRjQ29ubmVjdGlvbnNbYWNjb3VudElkXSA9IGNvbm5lY3Rpb247XG4gIH1cblxuICBzZXRPcmdMZXZlbENvbmZpZyhjb25maWc6IE9yZ0xldmVsQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKGNvbmZpZy5wcmltYXJ5UmVnaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcmltYXJ5UmVnaW9uID0gY29uZmlnLnByaW1hcnlSZWdpb247XG4gICAgfVxuICAgIGlmIChjb25maWcuc2Vjb25kYXJ5UmVnaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuc2Vjb25kYXJ5UmVnaW9ucyA9IGNvbmZpZy5zZWNvbmRhcnlSZWdpb25zO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmRpc2FzdGVyUmVjb3ZlcnlSZWdpb24gPSBjb25maWcuZGlzYXN0ZXJSZWNvdmVyeVJlZ2lvbjtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5wcm92aWRlckFjY291bnRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucm9vdENvbmZpZy5wcm92aWRlckFjY291bnRzID0gY29uZmlnLnByb3ZpZGVyQWNjb3VudHM7XG4gICAgfVxuICAgIGlmIChjb25maWcuc3NvU2Vzc2lvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLnNzb1Nlc3Npb25zID0gY29uZmlnLnNzb1Nlc3Npb25zO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJvb3RPaWRjUm9sZUFybiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcucm9vdE9pZGNSb2xlQXJuID0gY29uZmlnLnJvb3RPaWRjUm9sZUFybjtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
276
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL0NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDZCQUF3QjtBQUN4QiwyQ0FBcUM7QUFFckM7OztHQUdHO0FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7QUEyQm5DLHlCQUF5QjtBQUN6QixNQUFNLGlCQUFpQixHQUFHLE9BQUM7S0FDeEIsTUFBTSxDQUFDO0lBQ04sT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDbkIsT0FBTyxFQUFFLE9BQUMsQ0FBQyxLQUFLLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztDQUNwQyxDQUFDO0tBQ0QsTUFBTSxFQUFFLENBQUM7QUFJWixNQUFNLGtCQUFrQixHQUFHLE9BQUM7S0FDekIsTUFBTSxDQUFDO0lBQ04sSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUU7SUFDaEIsSUFBSSxFQUFFLE9BQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDbkMsWUFBWSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDbkMsT0FBTyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDL0IsQ0FBQztLQUNELE1BQU0sRUFBRSxDQUFDO0FBSVosTUFBTSxnQkFBZ0IsR0FBRyxPQUFDO0tBQ3ZCLE1BQU0sQ0FBQztJQUNOLE9BQU8sRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQzlCLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDdkMsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUMsT0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLGlC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Q0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUNuRCxDQUFDO0lBQ0osQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFZO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU87WUFBRSxPQUFPLEtBQUssQ0FBQztRQUMzQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQzdDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FDbkQsQ0FBQztRQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQy9CLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUExUUQsd0JBMFFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIi4vbG9nZ2VyLmpzXCI7XG5cbi8qKlxuICogTWF4aW11bSBkZXB0aCBmb3Igc2VhcmNoaW5nIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBmb3IgY29uZmlnIGZpbGVzLlxuICogUHJldmVudHMgaW5maW5pdGUgbG9vcHMgd2hlbiB0cmF2ZXJzaW5nIGRpcmVjdG9yaWVzLlxuICovXG5jb25zdCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSCA9IDEwO1xuXG5leHBvcnQgdHlwZSBQcm92aWRlckFjY291bnQgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZW52aXJvbm1lbnQ6IHN0cmluZztcbiAgbWFuYWdlZD86IGJvb2xlYW47XG59O1xuXG4vLyBTdGFuZGFsb25lIHR5cGVzIOKAlCB1c2VkIGJ5IFByb2ZpbGVSZXNvbHZlciBhbmQgYXV0aCBzeXN0ZW0sIG5vdCBpbiBjb25maWcgZmlsZVxuZXhwb3J0IHR5cGUgUHJvZmlsZSA9IHtcbiAgdHlwZTogXCJzc29cIiB8IFwib2lkY1wiO1xuICByZWdpb246IHN0cmluZztcbiAgc3NvQWNjb3VudElkPzogc3RyaW5nO1xuICBzc29Sb2xlTmFtZT86IHN0cmluZztcbiAgc3NvU2Vzc2lvbj86IHN0cmluZztcbiAgb2lkY1JvbGVBcm4/OiBzdHJpbmc7XG4gIG9pZGNQcm92aWRlckFybj86IHN0cmluZztcbiAgcm9sZUFybj86IHN0cmluZztcbiAgcm9sZVNlc3Npb25OYW1lPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgU1NPU2Vzc2lvbiA9IHtcbiAgc3NvUmVnaW9uOiBzdHJpbmc7XG4gIHNzb1N0YXJ0VXJsOiBzdHJpbmc7XG59O1xuXG4vLyBQZXItYXBwIGNvbmZpZyBzY2hlbWFzXG5jb25zdCBEZXBsb3lTdGFnZVNjaGVtYSA9IHpcbiAgLm9iamVjdCh7XG4gICAgYWNjb3VudDogei5zdHJpbmcoKSxcbiAgICByZWdpb25zOiB6LmFycmF5KHouc3RyaW5nKCkpLm1pbigxKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERlcGxveVN0YWdlID0gei5pbmZlcjx0eXBlb2YgRGVwbG95U3RhZ2VTY2hlbWE+O1xuXG5jb25zdCBEb21haW5Db25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIG5hbWU6IHouc3RyaW5nKCksXG4gICAgdHlwZTogei5lbnVtKFtcImFwZXhcIiwgXCJkZWxlZ2F0ZWRcIl0pLFxuICAgIHBhcmVudERvbWFpbjogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGFjY291bnQ6IHouc3RyaW5nKCkub3B0aW9uYWwoKVxuICB9KVxuICAuc3RyaWN0KCk7XG5cbmV4cG9ydCB0eXBlIERvbWFpbkNvbmZpZyA9IHouaW5mZXI8dHlwZW9mIERvbWFpbkNvbmZpZ1NjaGVtYT47XG5cbmNvbnN0IFJvb3RDb25maWdTY2hlbWEgPSB6XG4gIC5vYmplY3Qoe1xuICAgIHZlcnNpb246IHoubnVtYmVyKCkub3B0aW9uYWwoKSxcbiAgICBnZW5lcmF0b3JWZXJzaW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgZGVwbG95OiB6LnJlY29yZCh6LnN0cmluZygpLCBEZXBsb3lTdGFnZVNjaGVtYSkub3B0aW9uYWwoKSxcbiAgICBhY3RpdmVTdGFnZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIGRvbWFpbnM6IHouYXJyYXkoRG9tYWluQ29uZmlnU2NoZW1hKS5vcHRpb25hbCgpXG4gIH0pXG4gIC5zdHJpY3QoKTtcblxudHlwZSBSb290Q29uZmlnID0gei5pbmZlcjx0eXBlb2YgUm9vdENvbmZpZ1NjaGVtYT47XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYmFzZS12ZXJzaW9uIG9mIGFueSBuZXdseSBjcmVhdGVkIGNvbmZpZyBmaWxlXG4gKi9cbmNvbnN0IEJBU0VfQ09ORklHX1ZFUlNJT04gPSAwLjE7XG5cbi8qKlxuICogQ29uZmlnIGNsYXNzIGZvciBsb2FkaW5nIGFuZCBzYXZpbmcgcGVyLWFwcCBmamFsbC1jb25maWcuanNvbiBmaWxlcy5cbiAqIEVhY2ggYXBwIGhhcyBpdHMgb3duIGNvbmZpZyBhdCBmamFsbC88YXBwPi9mamFsbC1jb25maWcuanNvbi5cbiAqIFN0b3JlcyBkZXBsb3kgbWFwcGluZywgYWN0aXZlIHN0YWdlLCBkb21haW5zLCBhbmQgZ2VuZXJhdG9yIHZlcnNpb24uXG4gKiBPcmctbGV2ZWwgY29uZmlnIChhY2NvdW50cywgcmVnaW9ucywgT0lEQykgaXMgc2VydmVkIGJ5IE9yZ0NvbmZpZ0NsaWVudCBmcm9tIHRoZSBBUEkuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25maWcge1xuICByb290Q29uZmlnOiBSb290Q29uZmlnO1xuICBwcml2YXRlIGNvbmZpZ1BhdGg6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHJvb3RDb25maWc/OiBSb290Q29uZmlnLCBjb25maWdQYXRoPzogc3RyaW5nKSB7XG4gICAgdGhpcy5yb290Q29uZmlnID0gcm9vdENvbmZpZyA/PyB7XG4gICAgICB2ZXJzaW9uOiBCQVNFX0NPTkZJR19WRVJTSU9OXG4gICAgfTtcbiAgICB0aGlzLmNvbmZpZ1BhdGggPSBjb25maWdQYXRoID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgZmphbGwgZGlyZWN0b3J5IGJ5IHdhbGtpbmcgdXAgdGhlIGRpcmVjdG9yeSB0cmVlXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBmaW5kRmphbGxEaXJlY3RvcnkoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgbGV0IGN1cnJlbnREaXIgPSBwcm9jZXNzLmN3ZCgpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDT05GSUdfU0VBUkNIX01BWF9ERVBUSDsgaSsrKSB7XG4gICAgICBjb25zdCBmamFsbERpciA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsXCIpO1xuXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhmamFsbERpcikgJiYgZnMuc3RhdFN5bmMoZmphbGxEaXIpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgcmV0dXJuIGZqYWxsRGlyO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgICBpZiAocGFyZW50RGlyID09PSBjdXJyZW50RGlyKSBicmVhaztcbiAgICAgIGN1cnJlbnREaXIgPSBwYXJlbnREaXI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgY29uZmlnIGRpcmVjdG9yeSBmb3IgYSBzcGVjaWZpYyBhcHAgb3IgdGhlIGxlZ2FjeSByb290IGNvbmZpZy5cbiAgICogV2hlbiBhcHBOYW1lIGlzIHByb3ZpZGVkLCBsb29rcyBmb3IgZmphbGwvPGFwcE5hbWU+L2ZqYWxsLWNvbmZpZy5qc29uLlxuICAgKiBXaGVuIG9taXR0ZWQsIGZhbGxzIGJhY2sgdG8gbGVnYWN5IGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvbi5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZpbmRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICBpZiAoYXBwTmFtZSAhPT0gcGF0aC5iYXNlbmFtZShhcHBOYW1lKSkgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGZqYWxsRGlyID0gQ29uZmlnLmZpbmRGamFsbERpcmVjdG9yeSgpO1xuICAgICAgaWYgKCFmamFsbERpcikgcmV0dXJuIG51bGw7XG5cbiAgICAgIGNvbnN0IGFwcERpciA9IHBhdGguam9pbihmamFsbERpciwgYXBwTmFtZSk7XG4gICAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aC5qb2luKGFwcERpciwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBMZWdhY3k6IGxvb2sgZm9yIGZqYWxsL2ZqYWxsLWNvbmZpZy5qc29uIG9yIGRpcmVjdCBmamFsbC1jb25maWcuanNvblxuICAgIGxldCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgQ09ORklHX1NFQVJDSF9NQVhfREVQVEg7IGkrKykge1xuICAgICAgY29uc3QgZmphbGxEaXIgPSBwYXRoLmpvaW4oY3VycmVudERpciwgXCJmamFsbFwiKTtcbiAgICAgIGNvbnN0IGNvbmZpZ0ZpbGUgPSBwYXRoLmpvaW4oZmphbGxEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG5cbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNvbmZpZ0ZpbGUpKSB7XG4gICAgICAgIHJldHVybiBmamFsbERpcjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGlyZWN0Q29uZmlnRmlsZSA9IHBhdGguam9pbihjdXJyZW50RGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoZGlyZWN0Q29uZmlnRmlsZSkpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhcmVudERpciA9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKTtcbiAgICAgIGlmIChwYXJlbnREaXIgPT09IGN1cnJlbnREaXIpIGJyZWFrO1xuICAgICAgY3VycmVudERpciA9IHBhcmVudERpcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGNvbmZpZyBmaWxlIGludG8gbWVtb3J5IGFzIGEgcmF3IEpTT04gc3RyaW5nXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uZmlnRmlsZShjb25maWdGaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgZnMuYWNjZXNzU3luYyhjb25maWdGaWxlLCBmcy5jb25zdGFudHMuUl9PSyB8IGZzLmNvbnN0YW50cy5XX09LKTtcbiAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMoY29uZmlnRmlsZSwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJDb25maWdcIiwgXCJDb25maWcgZmlsZSBub3QgYWNjZXNzaWJsZVwiLCB7XG4gICAgICAgIGZpbGU6IGNvbmZpZ0ZpbGUsXG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycilcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgY29uZmlndXJhdGlvbiBmcm9tIGZpbGUuXG4gICAqIEBwYXJhbSBhcHBOYW1lIC0gT3B0aW9uYWwgYXBwIG5hbWUgdG8gbG9hZCBjb25maWcgZm9yIGEgc3BlY2lmaWMgYXBwXG4gICAqL1xuICBzdGF0aWMgbG9hZENvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogQ29uZmlnIHtcbiAgICBjb25zdCBjb25maWdEaXIgPSBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgICBpZiAoIWNvbmZpZ0Rpcikge1xuICAgICAgcmV0dXJuIG5ldyBDb25maWcoKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb25maWdGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWdEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgY29uc3Qgcm9vdENvbmZpZ0pzb24gPSBDb25maWcubG9hZENvbmZpZ0ZpbGUoY29uZmlnRmlsZVBhdGgpO1xuXG4gICAgbGV0IHJvb3RDb25maWc6IFJvb3RDb25maWcgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAocm9vdENvbmZpZ0pzb24pIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJvb3RDb25maWcgPSBSb290Q29uZmlnU2NoZW1hLnBhcnNlKEpTT04ucGFyc2Uocm9vdENvbmZpZ0pzb24pKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aHJvdyBDb25maWcuZm9ybWF0Wm9kRXJyb3IoZXJyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgQ29uZmlnKHJvb3RDb25maWcsIGNvbmZpZ0ZpbGVQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBab2QgZXJyb3IgaW50byBhIHJlYWRhYmxlIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZvcm1hdFpvZEVycm9yKGVycjogdW5rbm93biwgZmlsZU5hbWU6IHN0cmluZyk6IEVycm9yIHtcbiAgICBpZiAoZXJyIGluc3RhbmNlb2Ygei5ab2RFcnJvciAmJiBlcnIuaXNzdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGlzc3VlRGV0YWlscyA9IGVyci5pc3N1ZXNcbiAgICAgICAgLm1hcCgoaXNzdWUpID0+IGAke2lzc3VlLnBhdGguam9pbihcIi5cIil9OiAke2lzc3VlLm1lc3NhZ2V9YClcbiAgICAgICAgLmpvaW4oXCI7IFwiKTtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSAke2ZpbGVOYW1lfTogJHtpc3N1ZURldGFpbHN9YCk7XG4gICAgfVxuICAgIGNvbnN0IHJhd01lc3NhZ2UgPSBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVycik7XG4gICAgY29uc3QgbWVzc2FnZSA9IHJhd01lc3NhZ2UucmVwbGFjZSgvXFxuL2csIFwiIFwiKS5zdWJzdHJpbmcoMCwgNTAwKTtcbiAgICByZXR1cm4gbmV3IEVycm9yKGBGYWlsZWQgdG8gcGFyc2UgJHtmaWxlTmFtZX06ICR7bWVzc2FnZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGNvbmZpZ3VyYXRpb24gdG8gZmlsZVxuICAgKi9cbiAgc2F2ZUNvbmZpZyhhcHBOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHRhcmdldFBhdGggPSB0aGlzLmNvbmZpZ1BhdGg7XG5cbiAgICBpZiAoIXRhcmdldFBhdGgpIHtcbiAgICAgIGlmIChhcHBOYW1lKSB7XG4gICAgICAgIGlmIChhcHBOYW1lICE9PSBwYXRoLmJhc2VuYW1lKGFwcE5hbWUpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGFwcCBuYW1lOiAke2FwcE5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmphbGxEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKSB8fCBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJmamFsbFwiKTtcbiAgICAgICAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKGZqYWxsRGlyLCBhcHBOYW1lKTtcbiAgICAgICAgdGFyZ2V0UGF0aCA9IHBhdGguam9pbihhcHBEaXIsIFwiZmphbGwtY29uZmlnLmpzb25cIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBjb25maWdEaXIgPVxuICAgICAgICAgIENvbmZpZy5maW5kQ29uZmlnRGlyZWN0b3J5KCkgfHwgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiZmphbGxcIik7XG4gICAgICAgIHRhcmdldFBhdGggPSBwYXRoLmpvaW4oY29uZmlnRGlyLCBcImZqYWxsLWNvbmZpZy5qc29uXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZSh0YXJnZXRQYXRoKTtcbiAgICBmcy5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHJvb3RKc29uU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkodGhpcy5yb290Q29uZmlnLCBudWxsLCAyKTtcbiAgICBjb25zdCB0bXBQYXRoID0gYCR7dGFyZ2V0UGF0aH0udG1wYDtcbiAgICBmcy53cml0ZUZpbGVTeW5jKHRtcFBhdGgsIHJvb3RKc29uU3RyaW5nLCB7IG1vZGU6IDBvNjAwIH0pO1xuICAgIGZzLnJlbmFtZVN5bmModG1wUGF0aCwgdGFyZ2V0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmamFsbCBjb25maWcgZGlyZWN0b3J5IHBhdGhcbiAgICovXG4gIHN0YXRpYyBnZXRDb25maWdEaXJlY3RvcnkoYXBwTmFtZT86IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiBDb25maWcuZmluZENvbmZpZ0RpcmVjdG9yeShhcHBOYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNjb3ZlciBhbGwgYXBwIG5hbWVzIGJ5IHNjYW5uaW5nIGZqYWxsLzxhcHA+L2ZqYWxsLWNvbmZpZy5qc29uXG4gICAqL1xuICBzdGF0aWMgZGlzY292ZXJBcHBzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBmamFsbERpciA9IENvbmZpZy5maW5kRmphbGxEaXJlY3RvcnkoKTtcbiAgICBpZiAoIWZqYWxsRGlyKSByZXR1cm4gW107XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGZqYWxsRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICBjb25zdCBhcHBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKCFlbnRyeS5pc0RpcmVjdG9yeSgpKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGguam9pbihmamFsbERpciwgZW50cnkubmFtZSwgXCJmamFsbC1jb25maWcuanNvblwiKTtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMoY29uZmlnRmlsZSkpIHtcbiAgICAgICAgICBhcHBzLnB1c2goZW50cnkubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFwcHMuc29ydCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiQ29uZmlnXCIsIFwiRmFpbGVkIHRvIGRpc2NvdmVyIGFwcHNcIiwge1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvLyBEZXBsb3kgc3RhZ2UgbWFuYWdlbWVudFxuXG4gIGdldERlcGxveVN0YWdlcygpOiBSZWNvcmQ8c3RyaW5nLCBEZXBsb3lTdGFnZT4ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95ID8/IHt9O1xuICB9XG5cbiAgZ2V0RGVwbG95U3RhZ2UobmFtZTogc3RyaW5nKTogRGVwbG95U3RhZ2UgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZGVwbG95Py5bbmFtZV07XG4gIH1cblxuICBzZXREZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcsIHN0YWdlOiBEZXBsb3lTdGFnZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5yb290Q29uZmlnLmRlcGxveSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmRlcGxveSA9IHt9O1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdID0gc3RhZ2U7XG4gIH1cblxuICByZW1vdmVEZXBsb3lTdGFnZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kZXBsb3k/LltuYW1lXSkgcmV0dXJuIGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLnJvb3RDb25maWcuZGVwbG95W25hbWVdO1xuXG4gICAgaWYgKHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9PT0gbmFtZSkge1xuICAgICAgdGhpcy5yb290Q29uZmlnLmFjdGl2ZVN0YWdlID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGdldEFjdGl2ZVN0YWdlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZTtcbiAgfVxuXG4gIHNldEFjdGl2ZVN0YWdlKG5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucm9vdENvbmZpZy5hY3RpdmVTdGFnZSA9IG5hbWU7XG4gIH1cblxuICAvLyBEb21haW4gbWFuYWdlbWVudFxuXG4gIGdldERvbWFpbnMoKTogRG9tYWluQ29uZmlnW10ge1xuICAgIHJldHVybiB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA/PyBbXTtcbiAgfVxuXG4gIHNldERvbWFpbnMoZG9tYWluczogRG9tYWluQ29uZmlnW10pOiB2b2lkIHtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IGRvbWFpbnM7XG4gIH1cblxuICBhZGREb21haW4oZG9tYWluOiBEb21haW5Db25maWcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucm9vdENvbmZpZy5kb21haW5zKSB7XG4gICAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucyA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5wdXNoKGRvbWFpbik7XG4gIH1cblxuICBnZXREb21haW4obmFtZTogc3RyaW5nKTogRG9tYWluQ29uZmlnIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yb290Q29uZmlnLmRvbWFpbnM/LmZpbmQoXG4gICAgICAoZCkgPT4gZC5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKVxuICAgICk7XG4gIH1cblxuICByZW1vdmVEb21haW4obmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnJvb3RDb25maWcuZG9tYWlucykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb290Q29uZmlnLmRvbWFpbnMuZmluZEluZGV4KFxuICAgICAgKGQpID0+IGQubmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKClcbiAgICApO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHJldHVybiBmYWxzZTtcbiAgICB0aGlzLnJvb3RDb25maWcuZG9tYWlucy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59XG4iXX0=