@pipeline-builder/pipeline-manager 3.4.69 → 3.4.71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (84) hide show
  1. package/README.md +32 -2
  2. package/dist/agent/ai.d.ts +55 -0
  3. package/dist/agent/ai.d.ts.map +1 -0
  4. package/dist/agent/ai.js +130 -0
  5. package/dist/agent/executor.d.ts +24 -0
  6. package/dist/agent/executor.d.ts.map +1 -0
  7. package/dist/agent/executor.js +54 -0
  8. package/dist/agent/health.d.ts +22 -0
  9. package/dist/agent/health.d.ts.map +1 -0
  10. package/dist/agent/health.js +55 -0
  11. package/dist/agent/prereqs.d.ts +16 -0
  12. package/dist/agent/prereqs.d.ts.map +1 -0
  13. package/dist/agent/prereqs.js +73 -0
  14. package/dist/agent/targets.d.ts +83 -0
  15. package/dist/agent/targets.d.ts.map +1 -0
  16. package/dist/agent/targets.js +142 -0
  17. package/dist/agent/troubleshoot.d.ts +30 -0
  18. package/dist/agent/troubleshoot.d.ts.map +1 -0
  19. package/dist/agent/troubleshoot.js +87 -0
  20. package/dist/boilerplate.js +8 -13
  21. package/dist/cli.d.ts.map +1 -1
  22. package/dist/cli.js +114 -116
  23. package/dist/commands/audit-stacks.js +22 -24
  24. package/dist/commands/audit-tokens.js +25 -27
  25. package/dist/commands/bootstrap.js +29 -37
  26. package/dist/commands/create-pipeline.js +55 -92
  27. package/dist/commands/deploy.d.ts.map +1 -1
  28. package/dist/commands/deploy.js +58 -62
  29. package/dist/commands/get-pipeline.js +24 -28
  30. package/dist/commands/get-plugin.js +24 -28
  31. package/dist/commands/list-pipelines.js +30 -31
  32. package/dist/commands/list-plugins.js +32 -33
  33. package/dist/commands/login.js +44 -49
  34. package/dist/commands/org-export.js +22 -60
  35. package/dist/commands/provision.d.ts +12 -0
  36. package/dist/commands/provision.d.ts.map +1 -0
  37. package/dist/commands/provision.js +362 -0
  38. package/dist/commands/register.js +29 -30
  39. package/dist/commands/setup-events.d.ts.map +1 -1
  40. package/dist/commands/setup-events.js +42 -77
  41. package/dist/commands/status.js +20 -25
  42. package/dist/commands/store-token.js +44 -82
  43. package/dist/commands/synth.d.ts.map +1 -1
  44. package/dist/commands/synth.js +36 -35
  45. package/dist/commands/upload-plugin.js +59 -96
  46. package/dist/commands/validate-templates.d.ts.map +1 -1
  47. package/dist/commands/validate-templates.js +23 -29
  48. package/dist/commands/version.js +42 -47
  49. package/dist/config/cli.constants.d.ts.map +1 -1
  50. package/dist/config/cli.constants.js +24 -31
  51. package/dist/types/config.js +2 -3
  52. package/dist/types/error.js +3 -7
  53. package/dist/types/index.d.ts +4 -4
  54. package/dist/types/index.d.ts.map +1 -1
  55. package/dist/types/index.js +5 -21
  56. package/dist/types/pipeline.js +2 -3
  57. package/dist/types/plugin.js +2 -3
  58. package/dist/utils/api-client.d.ts +1 -1
  59. package/dist/utils/api-client.d.ts.map +1 -1
  60. package/dist/utils/api-client.js +23 -28
  61. package/dist/utils/audit-log.js +16 -22
  62. package/dist/utils/auth-guard.js +2 -5
  63. package/dist/utils/aws-secrets.js +17 -23
  64. package/dist/utils/banner.js +16 -23
  65. package/dist/utils/cdk-utils.js +14 -24
  66. package/dist/utils/command-utils.d.ts +1 -1
  67. package/dist/utils/command-utils.d.ts.map +1 -1
  68. package/dist/utils/command-utils.js +32 -44
  69. package/dist/utils/config-loader.d.ts +1 -1
  70. package/dist/utils/config-loader.d.ts.map +1 -1
  71. package/dist/utils/config-loader.js +24 -58
  72. package/dist/utils/error-handler.d.ts +1 -1
  73. package/dist/utils/error-handler.d.ts.map +1 -1
  74. package/dist/utils/error-handler.js +16 -24
  75. package/dist/utils/list-command-utils.js +15 -20
  76. package/dist/utils/output-utils.d.ts +1 -1
  77. package/dist/utils/output-utils.d.ts.map +1 -1
  78. package/dist/utils/output-utils.js +35 -55
  79. package/dist/utils/plugin-resolver.d.ts +1 -1
  80. package/dist/utils/plugin-resolver.d.ts.map +1 -1
  81. package/dist/utils/plugin-resolver.js +6 -8
  82. package/dist/utils/rate-limiter.js +11 -19
  83. package/dist/utils/registry.js +16 -22
  84. package/package.json +26 -17
@@ -1,54 +1,17 @@
1
- "use strict";
2
1
  // Copyright 2026 Pipeline Builder Contributors
3
2
  // SPDX-License-Identifier: Apache-2.0
4
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
5
- if (k2 === undefined) k2 = k;
6
- var desc = Object.getOwnPropertyDescriptor(m, k);
7
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
8
- desc = { enumerable: true, get: function() { return m[k]; } };
9
- }
10
- Object.defineProperty(o, k2, desc);
11
- }) : (function(o, m, k, k2) {
12
- if (k2 === undefined) k2 = k;
13
- o[k2] = m[k];
14
- }));
15
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
16
- Object.defineProperty(o, "default", { enumerable: true, value: v });
17
- }) : function(o, v) {
18
- o["default"] = v;
19
- });
20
- var __importStar = (this && this.__importStar) || (function () {
21
- var ownKeys = function(o) {
22
- ownKeys = Object.getOwnPropertyNames || function (o) {
23
- var ar = [];
24
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
25
- return ar;
26
- };
27
- return ownKeys(o);
28
- };
29
- return function (mod) {
30
- if (mod && mod.__esModule) return mod;
31
- var result = {};
32
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
33
- __setModuleDefault(result, mod);
34
- return result;
35
- };
36
- })();
37
- var __importDefault = (this && this.__importDefault) || function (mod) {
38
- return (mod && mod.__esModule) ? mod : { "default": mod };
39
- };
40
- Object.defineProperty(exports, "__esModule", { value: true });
41
- exports.uploadPlugin = uploadPlugin;
42
- const fs = __importStar(require("fs"));
43
- const path = __importStar(require("path"));
44
- const form_data_1 = __importDefault(require("form-data"));
45
- const ora_1 = __importDefault(require("ora"));
46
- const picocolors_1 = __importDefault(require("picocolors"));
47
- const cli_constants_1 = require("../config/cli.constants");
48
- const command_utils_1 = require("../utils/command-utils");
49
- const error_handler_1 = require("../utils/error-handler");
50
- const output_utils_1 = require("../utils/output-utils");
51
- const { bold, green } = picocolors_1.default;
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { Command } from 'commander';
6
+ import FormData from 'form-data';
7
+ import ora from 'ora';
8
+ import pico from 'picocolors';
9
+ import { FILE_SIZE_LIMITS, formatFileSize } from '../config/cli.constants.js';
10
+ import {} from '../types/index.js';
11
+ import { printCommandHeader, printSslWarning, createAuthenticatedClient } from '../utils/command-utils.js';
12
+ import { ERROR_CODES, handleError, ValidationError } from '../utils/error-handler.js';
13
+ import { extractSingleResponse, fileExists, printError, printInfo, printKeyValue, printSection, printSuccess, printWarning } from '../utils/output-utils.js';
14
+ const { bold, green } = pico;
52
15
  /**
53
16
  * Registers the `upload-plugin` command with the CLI program.
54
17
  *
@@ -67,7 +30,7 @@ const { bold, green } = picocolors_1.default;
67
30
  * cli upload-plugin --file plugin.zip --organization acme --no-verify-ssl
68
31
  * ```
69
32
  */
70
- function uploadPlugin(program) {
33
+ export function uploadPlugin(program) {
71
34
  program
72
35
  .command('upload-plugin')
73
36
  .description('Upload and deploy a plugin package')
@@ -81,10 +44,10 @@ function uploadPlugin(program) {
81
44
  .option('--no-verify-ssl', 'Disable SSL certificate verification')
82
45
  .option('--dry-run', 'Validate file without uploading', false)
83
46
  .action(async (options) => {
84
- const executionId = (0, command_utils_1.printCommandHeader)('Upload Plugin');
47
+ const executionId = printCommandHeader('Upload Plugin');
85
48
  try {
86
49
  // Display parameters
87
- (0, output_utils_1.printInfo)('Upload parameters', {
50
+ printInfo('Upload parameters', {
88
51
  file: options.file,
89
52
  organization: options.organization,
90
53
  name: options.name || '(auto-detect)',
@@ -95,68 +58,68 @@ function uploadPlugin(program) {
95
58
  verifySsl: options.verifySsl,
96
59
  });
97
60
  // Security warning for SSL verification disabled
98
- (0, command_utils_1.printSslWarning)(options.verifySsl);
61
+ printSslWarning(options.verifySsl);
99
62
  // Validate organization
100
63
  if (!options.organization || typeof options.organization !== 'string' || options.organization.trim().length === 0) {
101
- (0, output_utils_1.printError)('Invalid organization name', { provided: options.organization });
102
- throw new error_handler_1.ValidationError('Organization must be a non-empty string', 'organization', options.organization);
64
+ printError('Invalid organization name', { provided: options.organization });
65
+ throw new ValidationError('Organization must be a non-empty string', 'organization', options.organization);
103
66
  }
104
67
  // Validate file path
105
68
  if (!options.file || typeof options.file !== 'string' || options.file.trim().length === 0) {
106
- (0, output_utils_1.printError)('Invalid file path', { provided: options.file });
107
- throw new error_handler_1.ValidationError('File path must be a non-empty string', 'file', options.file);
69
+ printError('Invalid file path', { provided: options.file });
70
+ throw new ValidationError('File path must be a non-empty string', 'file', options.file);
108
71
  }
109
72
  const filePath = path.resolve(options.file);
110
73
  // Validate file exists
111
- (0, output_utils_1.printInfo)('Validating plugin file', { path: filePath });
112
- if (!(0, output_utils_1.fileExists)(filePath)) {
113
- (0, output_utils_1.printError)('Plugin file not found', { path: filePath });
114
- throw new error_handler_1.ValidationError(`Plugin file not found: ${filePath}`, 'file', filePath);
74
+ printInfo('Validating plugin file', { path: filePath });
75
+ if (!fileExists(filePath)) {
76
+ printError('Plugin file not found', { path: filePath });
77
+ throw new ValidationError(`Plugin file not found: ${filePath}`, 'file', filePath);
115
78
  }
116
79
  // Validate file extension
117
80
  const fileExt = path.extname(filePath).toLowerCase();
118
81
  if (fileExt !== '.zip') {
119
- (0, output_utils_1.printWarning)('File extension is not .zip', {
82
+ printWarning('File extension is not .zip', {
120
83
  provided: fileExt,
121
84
  expected: '.zip',
122
85
  });
123
- throw new error_handler_1.ValidationError('Plugin file must be a ZIP archive', 'file', filePath);
86
+ throw new ValidationError('Plugin file must be a ZIP archive', 'file', filePath);
124
87
  }
125
88
  // Get file stats
126
89
  const stats = fs.statSync(filePath);
127
90
  const sizeBytes = stats.size;
128
- const sizeFormatted = (0, cli_constants_1.formatFileSize)(sizeBytes);
129
- (0, output_utils_1.printSuccess)('Plugin file found', {
91
+ const sizeFormatted = formatFileSize(sizeBytes);
92
+ printSuccess('Plugin file found', {
130
93
  path: filePath,
131
94
  size: sizeFormatted,
132
95
  modified: new Date(stats.mtime).toLocaleString(),
133
96
  });
134
97
  // Check file size
135
- if (sizeBytes > cli_constants_1.FILE_SIZE_LIMITS.PLUGIN) {
136
- (0, output_utils_1.printError)('Plugin file too large', {
98
+ if (sizeBytes > FILE_SIZE_LIMITS.PLUGIN) {
99
+ printError('Plugin file too large', {
137
100
  size: sizeFormatted,
138
- maximum: (0, cli_constants_1.formatFileSize)(cli_constants_1.FILE_SIZE_LIMITS.PLUGIN),
139
- exceededBy: (0, cli_constants_1.formatFileSize)(sizeBytes - cli_constants_1.FILE_SIZE_LIMITS.PLUGIN),
101
+ maximum: formatFileSize(FILE_SIZE_LIMITS.PLUGIN),
102
+ exceededBy: formatFileSize(sizeBytes - FILE_SIZE_LIMITS.PLUGIN),
140
103
  });
141
- throw new error_handler_1.ValidationError(`Plugin file exceeds maximum size of ${(0, cli_constants_1.formatFileSize)(cli_constants_1.FILE_SIZE_LIMITS.PLUGIN)} (actual: ${sizeFormatted})`, 'file.size', sizeBytes);
104
+ throw new ValidationError(`Plugin file exceeds maximum size of ${formatFileSize(FILE_SIZE_LIMITS.PLUGIN)} (actual: ${sizeFormatted})`, 'file.size', sizeBytes);
142
105
  }
143
106
  // Check if file is readable
144
107
  try {
145
108
  fs.accessSync(filePath, fs.constants.R_OK);
146
109
  }
147
110
  catch (error) {
148
- (0, output_utils_1.printError)('Cannot read plugin file', {
111
+ printError('Cannot read plugin file', {
149
112
  path: filePath,
150
113
  error: error instanceof Error ? error.message : String(error),
151
114
  });
152
- throw new error_handler_1.ValidationError('Plugin file is not readable', 'file', filePath);
115
+ throw new ValidationError('Plugin file is not readable', 'file', filePath);
153
116
  }
154
- (0, output_utils_1.printSuccess)('Plugin file validated');
117
+ printSuccess('Plugin file validated');
155
118
  // Validate version format if provided
156
119
  if (options.version) {
157
120
  const versionRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?$/;
158
121
  if (!versionRegex.test(options.version)) {
159
- (0, output_utils_1.printWarning)('Version format may be invalid', {
122
+ printWarning('Version format may be invalid', {
160
123
  provided: options.version,
161
124
  expected: 'semantic version (e.g., 1.0.0, 1.2.3-beta.1)',
162
125
  });
@@ -166,7 +129,7 @@ function uploadPlugin(program) {
166
129
  if (options.name) {
167
130
  const nameRegex = /^[a-z0-9-]+$/;
168
131
  if (!nameRegex.test(options.name)) {
169
- (0, output_utils_1.printWarning)('Plugin name format may be invalid', {
132
+ printWarning('Plugin name format may be invalid', {
170
133
  provided: options.name,
171
134
  expected: 'lowercase alphanumeric with dashes (e.g., my-plugin-name)',
172
135
  });
@@ -175,9 +138,9 @@ function uploadPlugin(program) {
175
138
  // Dry run mode
176
139
  if (options.dryRun) {
177
140
  console.log('');
178
- (0, output_utils_1.printSection)('Dry Run - Validation Complete');
179
- (0, output_utils_1.printSuccess)('File validation passed - no upload performed');
180
- (0, output_utils_1.printKeyValue)({
141
+ printSection('Dry Run - Validation Complete');
142
+ printSuccess('File validation passed - no upload performed');
143
+ printKeyValue({
181
144
  File: filePath,
182
145
  Size: sizeFormatted,
183
146
  Organization: options.organization,
@@ -189,16 +152,16 @@ function uploadPlugin(program) {
189
152
  return;
190
153
  }
191
154
  // Create authenticated API client
192
- const client = (0, command_utils_1.createAuthenticatedClient)(options);
155
+ const client = createAuthenticatedClient(options);
193
156
  const config = client.getConfig();
194
157
  // Create form data
195
158
  console.log('');
196
- (0, output_utils_1.printSection)('Uploading Plugin');
197
- (0, output_utils_1.printInfo)('Preparing upload', {
159
+ printSection('Uploading Plugin');
160
+ printInfo('Preparing upload', {
198
161
  file: path.basename(filePath),
199
162
  size: sizeFormatted,
200
163
  });
201
- const formData = new form_data_1.default();
164
+ const formData = new FormData();
202
165
  formData.append('plugin', fs.createReadStream(filePath), {
203
166
  filename: path.basename(filePath),
204
167
  contentType: 'application/zip',
@@ -212,11 +175,11 @@ function uploadPlugin(program) {
212
175
  formData.append('isActive', options.active ? 'true' : 'false');
213
176
  // Make API request
214
177
  const endpoint = config.api.pluginUploadUrl;
215
- (0, output_utils_1.printInfo)('Uploading to API', {
178
+ printInfo('Uploading to API', {
216
179
  endpoint: `${config.api.baseUrl}${endpoint}`,
217
180
  });
218
181
  console.log('');
219
- const spinner = (0, ora_1.default)('Uploading plugin...').start();
182
+ const spinner = ora('Uploading plugin...').start();
220
183
  let rawResponse;
221
184
  let duration;
222
185
  try {
@@ -229,17 +192,17 @@ function uploadPlugin(program) {
229
192
  spinner.fail('Upload failed');
230
193
  throw error;
231
194
  }
232
- const response = (0, output_utils_1.extractSingleResponse)(rawResponse, 'plugin', 'name');
195
+ const response = extractSingleResponse(rawResponse, 'plugin', 'name');
233
196
  if (!response) {
234
- (0, output_utils_1.printError)('No valid plugin data in response', {
197
+ printError('No valid plugin data in response', {
235
198
  responseKeys: rawResponse ? Object.keys(rawResponse) : '(null)',
236
199
  });
237
200
  throw new Error('Upload failed - no valid plugin data received');
238
201
  }
239
202
  console.log('');
240
- (0, output_utils_1.printSection)('Plugin Uploaded Successfully');
203
+ printSection('Plugin Uploaded Successfully');
241
204
  // Display plugin information
242
- (0, output_utils_1.printKeyValue)({
205
+ printKeyValue({
243
206
  'Plugin ID': green(bold(response.id)),
244
207
  'Name': response.name,
245
208
  'Version': response.version,
@@ -247,20 +210,20 @@ function uploadPlugin(program) {
247
210
  'Description': response.description || '(not set)',
248
211
  });
249
212
  console.log('');
250
- (0, output_utils_1.printKeyValue)({
213
+ printKeyValue({
251
214
  'File URL': response.fileUrl || '(not available)',
252
215
  'File Size': response.fileSize ? `${(response.fileSize / 1024).toFixed(2)} KB` : '(not available)',
253
216
  'Checksum': response.checksum ? `${response.checksum.substring(0, 16)}...` : '(not available)',
254
217
  });
255
218
  console.log('');
256
- (0, output_utils_1.printKeyValue)({
219
+ printKeyValue({
257
220
  'Public': response.isPublic ? 'Yes' : 'No',
258
221
  'Active': response.isActive ? 'Yes' : 'No',
259
222
  'Created At': response.createdAt || '(not available)',
260
223
  'Uploaded By': response.uploadedBy || '(not available)',
261
224
  });
262
225
  console.log('');
263
- (0, output_utils_1.printKeyValue)({
226
+ printKeyValue({
264
227
  'Execution ID': executionId,
265
228
  'Upload Duration': `${(duration / 1000).toFixed(2)}s`,
266
229
  'Status': green('✓ Success'),
@@ -268,7 +231,7 @@ function uploadPlugin(program) {
268
231
  // Print additional information if available
269
232
  if (response.metadata) {
270
233
  console.log('');
271
- (0, output_utils_1.printInfo)('Plugin metadata available', {
234
+ printInfo('Plugin metadata available', {
272
235
  keys: Object.keys(response.metadata).length,
273
236
  });
274
237
  }
@@ -277,20 +240,20 @@ function uploadPlugin(program) {
277
240
  const requestId = resp['X-Request-Id'] || resp.requestId;
278
241
  if (requestId) {
279
242
  console.log('');
280
- (0, output_utils_1.printInfo)('Deployment logs available', {
243
+ printInfo('Deployment logs available', {
281
244
  requestId,
282
245
  url: `${config.api.baseUrl}/logs/${requestId}`,
283
246
  });
284
247
  }
285
248
  // Next steps
286
249
  console.log('');
287
- (0, output_utils_1.printInfo)('Next steps', {
250
+ printInfo('Next steps', {
288
251
  view: `Use "get-plugin --id ${response.id}" to view plugin details`,
289
252
  list: 'Use "list-plugins" to see all plugins',
290
253
  });
291
254
  }
292
255
  catch (error) {
293
- (0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.API_REQUEST, {
256
+ handleError(error, ERROR_CODES.API_REQUEST, {
294
257
  debug: program.opts().debug,
295
258
  exit: true,
296
259
  context: {
@@ -308,4 +271,4 @@ function uploadPlugin(program) {
308
271
  }
309
272
  });
310
273
  }
311
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy91cGxvYWQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQ0FBK0M7QUFDL0Msc0NBQXNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtDdEMsb0NBb1JDO0FBcFRELHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsMERBQWlDO0FBQ2pDLDhDQUFzQjtBQUN0Qiw0REFBOEI7QUFDOUIsMkRBQTJFO0FBRTNFLDBEQUF3RztBQUN4RywwREFBbUY7QUFDbkYsd0RBQTBKO0FBRTFKLE1BQU0sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsb0JBQUksQ0FBQztBQUU3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFnQixZQUFZLENBQUMsT0FBZ0I7SUFDM0MsT0FBTztTQUNKLE9BQU8sQ0FBQyxlQUFlLENBQUM7U0FDeEIsV0FBVyxDQUFDLG9DQUFvQyxDQUFDO1NBQ2pELGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSx5QkFBeUIsQ0FBQztTQUM5RCxjQUFjLENBQUMsbUNBQW1DLEVBQUUsbUJBQW1CLENBQUM7U0FDeEUsTUFBTSxDQUFDLG1CQUFtQixFQUFFLGdFQUFnRSxDQUFDO1NBQzdGLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRSxtRUFBbUUsQ0FBQztTQUN0RyxNQUFNLENBQUMsVUFBVSxFQUFFLGlDQUFpQyxFQUFFLEtBQUssQ0FBQztTQUM1RCxNQUFNLENBQUMsVUFBVSxFQUFFLHNCQUFzQixFQUFFLElBQUksQ0FBQztTQUNoRCxNQUFNLENBQUMsY0FBYyxFQUFFLHFDQUFxQyxDQUFDO1NBQzdELE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxzQ0FBc0MsQ0FBQztTQUNqRSxNQUFNLENBQUMsV0FBVyxFQUFFLGlDQUFpQyxFQUFFLEtBQUssQ0FBQztTQUM3RCxNQUFNLENBQUMsS0FBSyxFQUFF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b0JBQ1gsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO29CQUNsQixZQUFZLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQ2xDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO29CQUN4QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtvQkFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM3QjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDb3B5cmlnaHQgMjAyNiBQaXBlbGluZSBCdWlsZGVyIENvbnRyaWJ1dG9yc1xuLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjBcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IEZvcm1EYXRhIGZyb20gJ2Zvcm0tZGF0YSc7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQgcGljbyBmcm9tICdwaWNvY29sb3JzJztcbmltcG9ydCB7IEZJTEVfU0laRV9MSU1JVFMsIGZvcm1hdEZpbGVTaXplIH0gZnJvbSAnLi4vY29uZmlnL2NsaS5jb25zdGFudHMnO1xuaW1wb3J0IHsgUGx1Z2luLCBQbHVnaW5SZXNwb25zZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IHByaW50Q29tbWFuZEhlYWRlciwgcHJpbnRTc2xXYXJuaW5nLCBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50IH0gZnJvbSAnLi4vdXRpbHMvY29tbWFuZC11dGlscyc7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4uL3V0aWxzL2Vycm9yLWhhbmRsZXInO1xuaW1wb3J0IHsgZXh0cmFjdFNpbmdsZVJlc3BvbnNlLCBmaWxlRXhpc3RzLCBwcmludEVycm9yLCBwcmludEluZm8sIHByaW50S2V5VmFsdWUsIHByaW50U2VjdGlvbiwgcHJpbnRTdWNjZXNzLCBwcmludFdhcm5pbmcgfSBmcm9tICcuLi91dGlscy9vdXRwdXQtdXRpbHMnO1xuXG5jb25zdCB7IGJvbGQsIGdyZWVuIH0gPSBwaWNvO1xuXG4vKipcbiAqIFJlZ2lzdGVycyB0aGUgYHVwbG9hZC1wbHVnaW5gIGNvbW1hbmQgd2l0aCB0aGUgQ0xJIHByb2dyYW0uXG4gKlxuICogVmFsaWRhdGVzIGEgbG9jYWwgcGx1Z2luIFpJUCBmaWxlIChzaXplLCBleHRlbnNpb24sIHJlYWRhYmlsaXR5KSxcbiAqIGJ1aWxkcyBhIG11bHRpcGFydCBmb3JtLCBhbmQgdXBsb2FkcyBpdCB0byB0aGUgcGxhdGZvcm0gQVBJLlxuICogUGx1Z2luIG5hbWUgYW5kIHZlcnNpb24gY2FuIGJlIGF1dG8tZGV0ZWN0ZWQgZnJvbSB0aGUgcGFja2FnZVxuICogb3Igb3ZlcnJpZGRlbiB2aWEgQ0xJIGZsYWdzLlxuICpcbiAqIEBwYXJhbSBwcm9ncmFtIC0gVGhlIHJvb3QgQ29tbWFuZGVyIHByb2dyYW0gaW5zdGFuY2UgdG8gYXR0YWNoIHRoZSBjb21tYW5kIHRvLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBiYXNoXG4gKiBjbGkgdXBsb2FkLXBsdWdpbiAtLWZpbGUgcGx1Z2luLnppcCAtLW9yZ2FuaXphdGlvbiBhY21lXG4gKiBjbGkgdXBsb2FkLXBsdWdpbiAtLWZpbGUgcGx1Z2luLnppcCAtLW9yZ2FuaXphdGlvbiBhY21lIC0tcHVibGljXG4gKiBjbGkgdXBsb2FkLXBsdWdpbiAtLWZpbGUgcGx1Z2luLnppcCAtLW9yZ2FuaXphdGlvbiBhY21lIC0tbmFtZSBteS1wbHVnaW4gLS12ZXJzaW9uIDEuMC4wXG4gKiBjbGkgdXBsb2FkLXBsdWdpbiAtLWZpbGUgcGx1Z2luLnppcCAtLW9yZ2FuaXphdGlvbiBhY21lIC0tbm8tdmVyaWZ5LXNzbFxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGxvYWRQbHVnaW4ocHJvZ3JhbTogQ29tbWFuZCk6IHZvaWQge1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ3VwbG9hZC1wbHVnaW4nKVxuICAgIC5kZXNjcmlwdGlvbignVXBsb2FkIGFuZCBkZXBsb3kgYSBwbHVnaW4gcGFja2FnZScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctZiwgLS1maWxlIDxmaWxlPicsICdQYXRoIHRvIHBsdWdpbiBaSVAgZmlsZScpXG4gICAgLnJlcXVpcmVkT3B0aW9uKCctbywgLS1vcmdhbml6YXRpb24gPG9yZ2FuaXphdGlvbj4nLCAnT3JnYW5pemF0aW9uIG5hbWUnKVxuICAgIC5vcHRpb24oJy1uLCAtLW5hbWUgPG5hbWU+JywgJ1BsdWdpbiBuYW1lIChvcHRpb25hbCwgZXh0cmFjdGVkIGZyb20gcGFja2FnZSBpZiBub3QgcHJvdmlkZWQpJylcbiAgICAub3B0aW9uKCctdiwgLS12ZXJzaW9uIDx2ZXJzaW9uPicsICdQbHVnaW4gdmVyc2lvbiAob3B0aW9uYWwsIGV4dHJhY3RlZCBmcm9tIHBhY2thZ2UgaWYgbm90IHByb3ZpZGVkKScpXG4gICAgLm9wdGlvbignLS1wdWJsaWMnLCAnTWFrZSBwbHVnaW4gcHVibGljbHkgYWNjZXNzaWJsZScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tYWN0aXZlJywgJ1NldCBwbHVnaW4gYXMgYWN0aXZlJywgdHJ1ZSlcbiAgICAub3B0aW9uKCctLXZlcmlmeS1zc2wnLCAnRW5hYmxlIFNTTCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24nKVxuICAgIC5vcHRpb24oJy0tbm8tdmVyaWZ5LXNzbCcsICdEaXNhYmxlIFNTTCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24nKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdWYWxpZGF0ZSBmaWxlIHdpdGhvdXQgdXBsb2FkaW5nJywgZmFsc2UpXG4gICAgLmFjdGlvbihhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgY29uc3QgZXhlY3V0aW9uSWQgPSBwcmludENvbW1hbmRIZWFkZXIoJ1VwbG9hZCBQbHVnaW4nKTtcblxuICAgICAgdHJ5IHtcblxuICAgICAgICAvLyBEaXNwbGF5IHBhcmFtZXRlcnNcbiAgICAgICAgcHJpbnRJbmZvKCdVcGxvYWQgcGFyYW1ldGVycycsIHtcbiAgICAgICAgICBmaWxlOiBvcHRpb25zLmZpbGUsXG4gICAgICAgICAgb3JnYW5pemF0aW9uOiBvcHRpb25zLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUgfHwgJyhhdXRvLWRldGVjdCknLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiB8fCAnKGF1dG8tZGV0ZWN0KScsXG4gICAgICAgICAgcHVibGljOiBvcHRpb25zLnB1YmxpYyA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICBhY3RpdmU6IG9wdGlvbnMuYWN0aXZlID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgICAgdmVyaWZ5U3NsOiBvcHRpb25zLnZlcmlmeVNzbCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU2VjdXJpdHkgd2FybmluZyBmb3IgU1NMIHZlcmlmaWNhdGlvbiBkaXNhYmxlZFxuICAgICAgICBwcmludFNzbFdhcm5pbmcob3B0aW9ucy52ZXJpZnlTc2wpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIG9yZ2FuaXphdGlvblxuICAgICAgICBpZiAoIW9wdGlvbnMub3JnYW5pemF0aW9uIHx8IHR5cGVvZiBvcHRpb25zLm9yZ2FuaXphdGlvbiAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5vcmdhbml6YXRpb24udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ0ludmFsaWQgb3JnYW5pemF0aW9uIG5hbWUnLCB7IHByb3ZpZGVkOiBvcHRpb25zLm9yZ2FuaXphdGlvbiB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdPcmdhbml6YXRpb24gbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCAnb3JnYW5pemF0aW9uJywgb3B0aW9ucy5vcmdhbml6YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBwYXRoXG4gICAgICAgIGlmICghb3B0aW9ucy5maWxlIHx8IHR5cGVvZiBvcHRpb25zLmZpbGUgIT09ICdzdHJpbmcnIHx8IG9wdGlvbnMuZmlsZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignSW52YWxpZCBmaWxlIHBhdGgnLCB7IHByb3ZpZGVkOiBvcHRpb25zLmZpbGUgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignRmlsZSBwYXRoIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJywgJ2ZpbGUnLCBvcHRpb25zLmZpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLnJlc29sdmUob3B0aW9ucy5maWxlKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSBmaWxlIGV4aXN0c1xuICAgICAgICBwcmludEluZm8oJ1ZhbGlkYXRpbmcgcGx1Z2luIGZpbGUnLCB7IHBhdGg6IGZpbGVQYXRoIH0pO1xuXG4gICAgICAgIGlmICghZmlsZUV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdQbHVnaW4gZmlsZSBub3QgZm91bmQnLCB7IHBhdGg6IGZpbGVQYXRoIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoYFBsdWdpbiBmaWxlIG5vdCBmb3VuZDogJHtmaWxlUGF0aH1gLCAnZmlsZScsIGZpbGVQYXRoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhbGlkYXRlIGZpbGUgZXh0ZW5zaW9uXG4gICAgICAgIGNvbnN0IGZpbGVFeHQgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChmaWxlRXh0ICE9PSAnLnppcCcpIHtcbiAgICAgICAgICBwcmludFdhcm5pbmcoJ0ZpbGUgZXh0ZW5zaW9uIGlzIG5vdCAuemlwJywge1xuICAgICAgICAgICAgcHJvdmlkZWQ6IGZpbGVFeHQsXG4gICAgICAgICAgICBleHBlY3RlZDogJy56aXAnLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ1BsdWdpbiBmaWxlIG11c3QgYmUgYSBaSVAgYXJjaGl2ZScsICdmaWxlJywgZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGZpbGUgc3RhdHNcbiAgICAgICAgY29uc3Qgc3RhdHMgPSBmcy5zdGF0U3luYyhmaWxlUGF0aCk7XG4gICAgICAgIGNvbnN0IHNpemVCeXRlcyA9IHN0YXRzLnNpemU7XG4gICAgICAgIGNvbnN0IHNpemVGb3JtYXR0ZWQgPSBmb3JtYXRGaWxlU2l6ZShzaXplQnl0ZXMpO1xuXG4gICAgICAgIHByaW50U3VjY2VzcygnUGx1Z2luIGZpbGUgZm91bmQnLCB7XG4gICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgc2l6ZTogc2l6ZUZvcm1hdHRlZCxcbiAgICAgICAgICBtb2RpZmllZDogbmV3IERhdGUoc3RhdHMubXRpbWUpLnRvTG9jYWxlU3RyaW5nKCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENoZWNrIGZpbGUgc2l6ZVxuICAgICAgICBpZiAoc2l6ZUJ5dGVzID4gRklMRV9TSVpFX0xJTUlUUy5QTFVHSU4pIHtcbiAgICAgICAgICBwcmludEVycm9yKCdQbHVnaW4gZmlsZSB0b28gbGFyZ2UnLCB7XG4gICAgICAgICAgICBzaXplOiBzaXplRm9ybWF0dGVkLFxuICAgICAgICAgICAgbWF4aW11bTogZm9ybWF0RmlsZVNpemUoRklMRV9TSVpFX0xJTUlUUy5QTFVHSU4pLFxuICAgICAgICAgICAgZXhjZWVkZWRCeTogZm9ybWF0RmlsZVNpemUoc2l6ZUJ5dGVzIC0gRklMRV9TSVpFX0xJTUlUUy5QTFVHSU4pLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgICBgUGx1Z2luIGZpbGUgZXhjZWVkcyBtYXhpbXVtIHNpemUgb2YgJHtmb3JtYXRGaWxlU2l6ZShGSUxFX1NJWkVfTElNSVRTLlBMVUdJTil9IChhY3R1YWw6ICR7c2l6ZUZvcm1hdHRlZH0pYCxcbiAgICAgICAgICAgICdmaWxlLnNpemUnLFxuICAgICAgICAgICAgc2l6ZUJ5dGVzLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBmaWxlIGlzIHJlYWRhYmxlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZnMuYWNjZXNzU3luYyhmaWxlUGF0aCwgZnMuY29uc3RhbnRzLlJfT0spO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIHByaW50RXJyb3IoJ0Nhbm5vdCByZWFkIHBsdWdpbiBmaWxlJywge1xuICAgICAgICAgICAgcGF0aDogZmlsZVBhdGgsXG4gICAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ1BsdWdpbiBmaWxlIGlzIG5vdCByZWFkYWJsZScsICdmaWxlJywgZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKCdQbHVnaW4gZmlsZSB2YWxpZGF0ZWQnKTtcblxuICAgICAgICAvLyBWYWxpZGF0ZSB2ZXJzaW9uIGZvcm1hdCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob3B0aW9ucy52ZXJzaW9uKSB7XG4gICAgICAgICAgY29uc3QgdmVyc2lvblJlZ2V4ID0gL15cXGQrXFwuXFxkK1xcLlxcZCsoLVthLXpBLVowLTkuLV0rKT8kLztcbiAgICAgICAgICBpZiAoIXZlcnNpb25SZWdleC50ZXN0KG9wdGlvbnMudmVyc2lvbikpIHtcbiAgICAgICAgICAgIHByaW50V2FybmluZygnVmVyc2lvbiBmb3JtYXQgbWF5IGJlIGludmFsaWQnLCB7XG4gICAgICAgICAgICAgIHByb3ZpZGVkOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICAgICAgICAgIGV4cGVjdGVkOiAnc2VtYW50aWMgdmVyc2lvbiAoZS5nLiwgMS4wLjAsIDEuMi4zLWJldGEuMSknLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgbmFtZSBmb3JtYXQgaWYgcHJvdmlkZWRcbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSkge1xuICAgICAgICAgIGNvbnN0IG5hbWVSZWdleCA9IC9eW2EtejAtOS1dKyQvO1xuICAgICAgICAgIGlmICghbmFtZVJlZ2V4LnRlc3Qob3B0aW9ucy5uYW1lKSkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdQbHVnaW4gbmFtZSBmb3JtYXQgbWF5IGJlIGludmFsaWQnLCB7XG4gICAgICAgICAgICAgIHByb3ZpZGVkOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICAgIGV4cGVjdGVkOiAnbG93ZXJjYXNlIGFscGhhbnVtZXJpYyB3aXRoIGRhc2hlcyAoZS5nLiwgbXktcGx1Z2luLW5hbWUpJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERyeSBydW4gbW9kZVxuICAgICAgICBpZiAob3B0aW9ucy5kcnlSdW4pIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRTZWN0aW9uKCdEcnkgUnVuIC0gVmFsaWRhdGlvbiBDb21wbGV0ZScpO1xuICAgICAgICAgIHByaW50U3VjY2VzcygnRmlsZSB2YWxpZGF0aW9uIHBhc3NlZCAtIG5vIHVwbG9hZCBwZXJmb3JtZWQnKTtcblxuICAgICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICAgRmlsZTogZmlsZVBhdGgsXG4gICAgICAgICAgICBTaXplOiBzaXplRm9ybWF0dGVkLFxuICAgICAgICAgICAgT3JnYW5pemF0aW9uOiBvcHRpb25zLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICAgIE5hbWU6IG9wdGlvbnMubmFtZSB8fCAnKHdpbGwgYmUgYXV0by1kZXRlY3RlZCknLFxuICAgICAgICAgICAgVmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uIHx8ICcod2lsbCBiZSBhdXRvLWRldGVjdGVkKScsXG4gICAgICAgICAgICBQdWJsaWM6IG9wdGlvbnMucHVibGljID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgICAgQWN0aXZlOiBvcHRpb25zLmFjdGl2ZSA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhdXRoZW50aWNhdGVkIEFQSSBjbGllbnRcbiAgICAgICAgY29uc3QgY2xpZW50ID0gY3JlYXRlQXV0aGVudGljYXRlZENsaWVudChvcHRpb25zKTtcbiAgICAgICAgY29uc3QgY29uZmlnID0gY2xpZW50LmdldENvbmZpZygpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBmb3JtIGRhdGFcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1VwbG9hZGluZyBQbHVnaW4nKTtcbiAgICAgICAgcHJpbnRJbmZvKCdQcmVwYXJpbmcgdXBsb2FkJywge1xuICAgICAgICAgIGZpbGU6IHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpLFxuICAgICAgICAgIHNpemU6IHNpemVGb3JtYXR0ZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgncGx1Z2luJywgZnMuY3JlYXRlUmVhZFN0cmVhbShmaWxlUGF0aCksIHtcbiAgICAgICAgICBmaWxlbmFtZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXG4gICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi96aXAnLFxuICAgICAgICB9KTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdvcmdhbml6YXRpb24nLCBvcHRpb25zLm9yZ2FuaXphdGlvbik7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubmFtZSkgZm9ybURhdGEuYXBwZW5kKCduYW1lJywgb3B0aW9ucy5uYW1lKTtcbiAgICAgICAgaWYgKG9wdGlvbnMudmVyc2lvbikgZm9ybURhdGEuYXBwZW5kKCd2ZXJzaW9uJywgb3B0aW9ucy52ZXJzaW9uKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc1B1YmxpYycsIG9wdGlvbnMucHVibGljID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnaXNBY3RpdmUnLCBvcHRpb25zLmFjdGl2ZSA/ICd0cnVlJyA6ICdmYWxzZScpO1xuXG4gICAgICAgIC8vIE1ha2UgQVBJIHJlcXVlc3RcbiAgICAgICAgY29uc3QgZW5kcG9pbnQgPSBjb25maWcuYXBpLnBsdWdpblVwbG9hZFVybDtcbiAgICAgICAgcHJpbnRJbmZvKCdVcGxvYWRpbmcgdG8gQVBJJywge1xuICAgICAgICAgIGVuZHBvaW50OiBgJHtjb25maWcuYXBpLmJhc2VVcmx9JHtlbmRwb2ludH1gLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnVXBsb2FkaW5nIHBsdWdpbi4uLicpLnN0YXJ0KCk7XG4gICAgICAgIGxldCByYXdSZXNwb25zZTogUGx1Z2luUmVzcG9uc2U7XG4gICAgICAgIGxldCBkdXJhdGlvbjogbnVtYmVyO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgcmF3UmVzcG9uc2UgPSBhd2FpdCBjbGllbnQucG9zdEZvcm08UGx1Z2luUmVzcG9uc2U+KGVuZHBvaW50LCBmb3JtRGF0YSk7XG4gICAgICAgICAgZHVyYXRpb24gPSBEYXRlLm5vdygpIC0gc3RhcnRUaW1lO1xuICAgICAgICAgIHNwaW5uZXIuc3VjY2VlZCgnUGx1Z2luIHVwbG9hZGVkJyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgc3Bpbm5lci5mYWlsKCdVcGxvYWQgZmFpbGVkJyk7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV4dHJhY3RTaW5nbGVSZXNwb25zZTxQbHVnaW4+KHJhd1Jlc3BvbnNlLCAncGx1Z2luJywgJ25hbWUnKTtcblxuICAgICAgICBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignTm8gdmFsaWQgcGx1Z2luIGRhdGEgaW4gcmVzcG9uc2UnLCB7XG4gICAgICAgICAgICByZXNwb25zZUtleXM6IHJhd1Jlc3BvbnNlID8gT2JqZWN0LmtleXMocmF3UmVzcG9uc2UpIDogJyhudWxsKScsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVcGxvYWQgZmFpbGVkIC0gbm8gdmFsaWQgcGx1Z2luIGRhdGEgcmVjZWl2ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRTZWN0aW9uKCdQbHVnaW4gVXBsb2FkZWQgU3VjY2Vzc2Z1bGx5Jyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSBwbHVnaW4gaW5mb3JtYXRpb25cbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1BsdWdpbiBJRCc6IGdyZWVuKGJvbGQocmVzcG9uc2UuaWQpKSxcbiAgICAgICAgICAnTmFtZSc6IHJlc3BvbnNlLm5hbWUsXG4gICAgICAgICAgJ1ZlcnNpb24nOiByZXNwb25zZS52ZXJzaW9uLFxuICAgICAgICAgICdPcmdhbml6YXRpb24nOiByZXNwb25zZS5vcmdhbml6YXRpb24sXG4gICAgICAgICAgJ0Rlc2NyaXB0aW9uJzogcmVzcG9uc2UuZGVzY3JpcHRpb24gfHwgJyhub3Qgc2V0KScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ0ZpbGUgVVJMJzogcmVzcG9uc2UuZmlsZVVybCB8fCAnKG5vdCBhdmFpbGFibGUpJyxcbiAgICAgICAgICAnRmlsZSBTaXplJzogcmVzcG9uc2UuZmlsZVNpemUgPyBgJHsocmVzcG9uc2UuZmlsZVNpemUgLyAxMDI0KS50b0ZpeGVkKDIpfSBLQmAgOiAnKG5vdCBhdmFpbGFibGUpJyxcbiAgICAgICAgICAnQ2hlY2tzdW0nOiByZXNwb25zZS5jaGVja3N1bSA/IGAke3Jlc3BvbnNlLmNoZWNrc3VtLnN1YnN0cmluZygwLCAxNil9Li4uYCA6ICcobm90IGF2YWlsYWJsZSknLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICdQdWJsaWMnOiByZXNwb25zZS5pc1B1YmxpYyA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICAnQWN0aXZlJzogcmVzcG9uc2UuaXNBY3RpdmUgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgJ0NyZWF0ZWQgQXQnOiByZXNwb25zZS5jcmVhdGVkQXQgfHwgJyhub3QgYXZhaWxhYmxlKScsXG4gICAgICAgICAgJ1VwbG9hZGVkIEJ5JzogcmVzcG9uc2UudXBsb2FkZWRCeSB8fCAnKG5vdCBhdmFpbGFibGUpJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnRXhlY3V0aW9uIElEJzogZXhlY3V0aW9uSWQsXG4gICAgICAgICAgJ1VwbG9hZCBEdXJhdGlvbic6IGAkeyhkdXJhdGlvbiAvIDEwMDApLnRvRml4ZWQoMil9c2AsXG4gICAgICAgICAgJ1N0YXR1cyc6IGdyZWVuKCfinJMgU3VjY2VzcycpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcmludCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlmIGF2YWlsYWJsZVxuICAgICAgICBpZiAocmVzcG9uc2UubWV0YWRhdGEpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgcHJpbnRJbmZvKCdQbHVnaW4gbWV0YWRhdGEgYXZhaWxhYmxlJywge1xuICAgICAgICAgICAga2V5czogT2JqZWN0LmtleXMocmVzcG9uc2UubWV0YWRhdGEpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByaW50IGRlcGxveW1lbnQgbG9ncyBVUkwgaWYgYXZhaWxhYmxlXG4gICAgICAgIGNvbnN0IHJlc3AgPSByZXNwb25zZSBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBjb25zdCByZXF1ZXN0SWQgPSByZXNwWydYLVJlcXVlc3QtSWQnXSB8fCByZXNwLnJlcXVlc3RJZDtcbiAgICAgICAgaWYgKHJlcXVlc3RJZCkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludEluZm8oJ0RlcGxveW1lbnQgbG9ncyBhdmFpbGFibGUnLCB7XG4gICAgICAgICAgICByZXF1ZXN0SWQsXG4gICAgICAgICAgICB1cmw6IGAke2NvbmZpZy5hcGkuYmFzZVVybH0vbG9ncy8ke3JlcXVlc3RJZH1gLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTmV4dCBzdGVwc1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50SW5mbygnTmV4dCBzdGVwcycsIHtcbiAgICAgICAgICB2aWV3OiBgVXNlIFwiZ2V0LXBsdWdpbiAtLWlkICR7cmVzcG9uc2UuaWR9XCIgdG8gdmlldyBwbHVnaW4gZGV0YWlsc2AsXG4gICAgICAgICAgbGlzdDogJ1VzZSBcImxpc3QtcGx1Z2luc1wiIHRvIHNlZSBhbGwgcGx1Z2lucycsXG4gICAgICAgIH0pO1xuXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuQVBJX1JFUVVFU1QsIHtcbiAgICAgICAgICBkZWJ1ZzogcHJvZ3JhbS5vcHRzKCkuZGVidWcsXG4gICAgICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICBjb21tYW5kOiAndXBsb2FkLXBsdWdpbicsXG4gICAgICAgICAgICBleGVjdXRpb25JZCxcbiAgICAgICAgICAgIGZpbGU6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICAgIG9yZ2FuaXphdGlvbjogb3B0aW9ucy5vcmdhbml6YXRpb24sXG4gICAgICAgICAgICBuYW1lOiBvcHRpb25zLm5hbWUsXG4gICAgICAgICAgICB2ZXJzaW9uOiBvcHRpb25zLnZlcnNpb24sXG4gICAgICAgICAgICBwdWJsaWM6IG9wdGlvbnMucHVibGljLFxuICAgICAgICAgICAgYWN0aXZlOiBvcHRpb25zLmFjdGl2ZSxcbiAgICAgICAgICAgIHZlcmlmeVNzbDogb3B0aW9ucy52ZXJpZnlTc2wsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG59XG4iXX0=
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tYW5kcy91cGxvYWQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtDQUErQztBQUMvQyxzQ0FBc0M7QUFFdEMsT0FBTyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDekIsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLFFBQVEsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxHQUFHLE1BQU0sS0FBSyxDQUFDO0FBQ3RCLE9BQU8sSUFBSSxNQUFNLFlBQVksQ0FBQztBQUM5QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFvQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMzRyxPQUFPLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN0RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0osTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFN0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxPQUFnQjtJQUMzQyxPQUFPO1NBQ0osT0FBTyxDQUFDLGVBQWUsQ0FBQztTQUN4QixXQUFXLENBQUMsb0NBQW9DLENBQUM7U0FDakQsY0FBYyxDQUFDLG1CQUFtQixFQUFFLHlCQUF5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QUFFLFdBQVcsQ0FBQyxXQUFXLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSztnQkFDM0IsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRSxlQUFlO29CQUN4QixXQUFXO29CQUNYLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtvQkFDbEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxZQUFZO29CQUNsQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7b0JBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztvQkFDeEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO29CQUN0QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07b0JBQ3RCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztpQkFDN0I7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQ29weXJpZ2h0IDIwMjYgUGlwZWxpbmUgQnVpbGRlciBDb250cmlidXRvcnNcbi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCBGb3JtRGF0YSBmcm9tICdmb3JtLWRhdGEnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHBpY28gZnJvbSAncGljb2NvbG9ycyc7XG5pbXBvcnQgeyBGSUxFX1NJWkVfTElNSVRTLCBmb3JtYXRGaWxlU2l6ZSB9IGZyb20gJy4uL2NvbmZpZy9jbGkuY29uc3RhbnRzLmpzJztcbmltcG9ydCB7IHR5cGUgUGx1Z2luLCB0eXBlIFBsdWdpblJlc3BvbnNlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xuaW1wb3J0IHsgcHJpbnRDb21tYW5kSGVhZGVyLCBwcmludFNzbFdhcm5pbmcsIGNyZWF0ZUF1dGhlbnRpY2F0ZWRDbGllbnQgfSBmcm9tICcuLi91dGlscy9jb21tYW5kLXV0aWxzLmpzJztcbmltcG9ydCB7IEVSUk9SX0NPREVTLCBoYW5kbGVFcnJvciwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi4vdXRpbHMvZXJyb3ItaGFuZGxlci5qcyc7XG5pbXBvcnQgeyBleHRyYWN0U2luZ2xlUmVzcG9uc2UsIGZpbGVFeGlzdHMsIHByaW50RXJyb3IsIHByaW50SW5mbywgcHJpbnRLZXlWYWx1ZSwgcHJpbnRTZWN0aW9uLCBwcmludFN1Y2Nlc3MsIHByaW50V2FybmluZyB9IGZyb20gJy4uL3V0aWxzL291dHB1dC11dGlscy5qcyc7XG5cbmNvbnN0IHsgYm9sZCwgZ3JlZW4gfSA9IHBpY287XG5cbi8qKlxuICogUmVnaXN0ZXJzIHRoZSBgdXBsb2FkLXBsdWdpbmAgY29tbWFuZCB3aXRoIHRoZSBDTEkgcHJvZ3JhbS5cbiAqXG4gKiBWYWxpZGF0ZXMgYSBsb2NhbCBwbHVnaW4gWklQIGZpbGUgKHNpemUsIGV4dGVuc2lvbiwgcmVhZGFiaWxpdHkpLFxuICogYnVpbGRzIGEgbXVsdGlwYXJ0IGZvcm0sIGFuZCB1cGxvYWRzIGl0IHRvIHRoZSBwbGF0Zm9ybSBBUEkuXG4gKiBQbHVnaW4gbmFtZSBhbmQgdmVyc2lvbiBjYW4gYmUgYXV0by1kZXRlY3RlZCBmcm9tIHRoZSBwYWNrYWdlXG4gKiBvciBvdmVycmlkZGVuIHZpYSBDTEkgZmxhZ3MuXG4gKlxuICogQHBhcmFtIHByb2dyYW0gLSBUaGUgcm9vdCBDb21tYW5kZXIgcHJvZ3JhbSBpbnN0YW5jZSB0byBhdHRhY2ggdGhlIGNvbW1hbmQgdG8uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYGJhc2hcbiAqIGNsaSB1cGxvYWQtcGx1Z2luIC0tZmlsZSBwbHVnaW4uemlwIC0tb3JnYW5pemF0aW9uIGFjbWVcbiAqIGNsaSB1cGxvYWQtcGx1Z2luIC0tZmlsZSBwbHVnaW4uemlwIC0tb3JnYW5pemF0aW9uIGFjbWUgLS1wdWJsaWNcbiAqIGNsaSB1cGxvYWQtcGx1Z2luIC0tZmlsZSBwbHVnaW4uemlwIC0tb3JnYW5pemF0aW9uIGFjbWUgLS1uYW1lIG15LXBsdWdpbiAtLXZlcnNpb24gMS4wLjBcbiAqIGNsaSB1cGxvYWQtcGx1Z2luIC0tZmlsZSBwbHVnaW4uemlwIC0tb3JnYW5pemF0aW9uIGFjbWUgLS1uby12ZXJpZnktc3NsXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBsdWdpbihwcm9ncmFtOiBDb21tYW5kKTogdm9pZCB7XG4gIHByb2dyYW1cbiAgICAuY29tbWFuZCgndXBsb2FkLXBsdWdpbicpXG4gICAgLmRlc2NyaXB0aW9uKCdVcGxvYWQgYW5kIGRlcGxveSBhIHBsdWdpbiBwYWNrYWdlJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1mLCAtLWZpbGUgPGZpbGU+JywgJ1BhdGggdG8gcGx1Z2luIFpJUCBmaWxlJylcbiAgICAucmVxdWlyZWRPcHRpb24oJy1vLCAtLW9yZ2FuaXphdGlvbiA8b3JnYW5pemF0aW9uPicsICdPcmdhbml6YXRpb24gbmFtZScpXG4gICAgLm9wdGlvbignLW4sIC0tbmFtZSA8bmFtZT4nLCAnUGx1Z2luIG5hbWUgKG9wdGlvbmFsLCBleHRyYWN0ZWQgZnJvbSBwYWNrYWdlIGlmIG5vdCBwcm92aWRlZCknKVxuICAgIC5vcHRpb24oJy12LCAtLXZlcnNpb24gPHZlcnNpb24+JywgJ1BsdWdpbiB2ZXJzaW9uIChvcHRpb25hbCwgZXh0cmFjdGVkIGZyb20gcGFja2FnZSBpZiBub3QgcHJvdmlkZWQpJylcbiAgICAub3B0aW9uKCctLXB1YmxpYycsICdNYWtlIHBsdWdpbiBwdWJsaWNseSBhY2Nlc3NpYmxlJywgZmFsc2UpXG4gICAgLm9wdGlvbignLS1hY3RpdmUnLCAnU2V0IHBsdWdpbiBhcyBhY3RpdmUnLCB0cnVlKVxuICAgIC5vcHRpb24oJy0tdmVyaWZ5LXNzbCcsICdFbmFibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1uby12ZXJpZnktc3NsJywgJ0Rpc2FibGUgU1NMIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbicpXG4gICAgLm9wdGlvbignLS1kcnktcnVuJywgJ1ZhbGlkYXRlIGZpbGUgd2l0aG91dCB1cGxvYWRpbmcnLCBmYWxzZSlcbiAgICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBleGVjdXRpb25JZCA9IHByaW50Q29tbWFuZEhlYWRlcignVXBsb2FkIFBsdWdpbicpO1xuXG4gICAgICB0cnkge1xuXG4gICAgICAgIC8vIERpc3BsYXkgcGFyYW1ldGVyc1xuICAgICAgICBwcmludEluZm8oJ1VwbG9hZCBwYXJhbWV0ZXJzJywge1xuICAgICAgICAgIGZpbGU6IG9wdGlvbnMuZmlsZSxcbiAgICAgICAgICBvcmdhbml6YXRpb246IG9wdGlvbnMub3JnYW5pemF0aW9uLFxuICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSB8fCAnKGF1dG8tZGV0ZWN0KScsXG4gICAgICAgICAgdmVyc2lvbjogb3B0aW9ucy52ZXJzaW9uIHx8ICcoYXV0by1kZXRlY3QpJyxcbiAgICAgICAgICBwdWJsaWM6IG9wdGlvbnMucHVibGljID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgIGFjdGl2ZTogb3B0aW9ucy5hY3RpdmUgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgICAgICB2ZXJpZnlTc2w6IG9wdGlvbnMudmVyaWZ5U3NsLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBTZWN1cml0eSB3YXJuaW5nIGZvciBTU0wgdmVyaWZpY2F0aW9uIGRpc2FibGVkXG4gICAgICAgIHByaW50U3NsV2FybmluZyhvcHRpb25zLnZlcmlmeVNzbCk7XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgb3JnYW5pemF0aW9uXG4gICAgICAgIGlmICghb3B0aW9ucy5vcmdhbml6YXRpb24gfHwgdHlwZW9mIG9wdGlvbnMub3JnYW5pemF0aW9uICE9PSAnc3RyaW5nJyB8fCBvcHRpb25zLm9yZ2FuaXphdGlvbi50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignSW52YWxpZCBvcmdhbml6YXRpb24gbmFtZScsIHsgcHJvdmlkZWQ6IG9wdGlvbnMub3JnYW5pemF0aW9uIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoJ09yZ2FuaXphdGlvbiBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZycsICdvcmdhbml6YXRpb24nLCBvcHRpb25zLm9yZ2FuaXphdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBmaWxlIHBhdGhcbiAgICAgICAgaWYgKCFvcHRpb25zLmZpbGUgfHwgdHlwZW9mIG9wdGlvbnMuZmlsZSAhPT0gJ3N0cmluZycgfHwgb3B0aW9ucy5maWxlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBwcmludEVycm9yKCdJbnZhbGlkIGZpbGUgcGF0aCcsIHsgcHJvdmlkZWQ6IG9wdGlvbnMuZmlsZSB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKCdGaWxlIHBhdGggbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcnLCAnZmlsZScsIG9wdGlvbnMuZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlUGF0aCA9IHBhdGgucmVzb2x2ZShvcHRpb25zLmZpbGUpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIGZpbGUgZXhpc3RzXG4gICAgICAgIHByaW50SW5mbygnVmFsaWRhdGluZyBwbHVnaW4gZmlsZScsIHsgcGF0aDogZmlsZVBhdGggfSk7XG5cbiAgICAgICAgaWYgKCFmaWxlRXhpc3RzKGZpbGVQYXRoKSkge1xuICAgICAgICAgIHByaW50RXJyb3IoJ1BsdWdpbiBmaWxlIG5vdCBmb3VuZCcsIHsgcGF0aDogZmlsZVBhdGggfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihgUGx1Z2luIGZpbGUgbm90IGZvdW5kOiAke2ZpbGVQYXRofWAsICdmaWxlJywgZmlsZVBhdGgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFsaWRhdGUgZmlsZSBleHRlbnNpb25cbiAgICAgICAgY29uc3QgZmlsZUV4dCA9IHBhdGguZXh0bmFtZShmaWxlUGF0aCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGZpbGVFeHQgIT09ICcuemlwJykge1xuICAgICAgICAgIHByaW50V2FybmluZygnRmlsZSBleHRlbnNpb24gaXMgbm90IC56aXAnLCB7XG4gICAgICAgICAgICBwcm92aWRlZDogZmlsZUV4dCxcbiAgICAgICAgICAgIGV4cGVjdGVkOiAnLnppcCcsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUGx1Z2luIGZpbGUgbXVzdCBiZSBhIFpJUCBhcmNoaXZlJywgJ2ZpbGUnLCBmaWxlUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZmlsZSBzdGF0c1xuICAgICAgICBjb25zdCBzdGF0cyA9IGZzLnN0YXRTeW5jKGZpbGVQYXRoKTtcbiAgICAgICAgY29uc3Qgc2l6ZUJ5dGVzID0gc3RhdHMuc2l6ZTtcbiAgICAgICAgY29uc3Qgc2l6ZUZvcm1hdHRlZCA9IGZvcm1hdEZpbGVTaXplKHNpemVCeXRlcyk7XG5cbiAgICAgICAgcHJpbnRTdWNjZXNzKCdQbHVnaW4gZmlsZSBmb3VuZCcsIHtcbiAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICBzaXplOiBzaXplRm9ybWF0dGVkLFxuICAgICAgICAgIG1vZGlmaWVkOiBuZXcgRGF0ZShzdGF0cy5tdGltZSkudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgZmlsZSBzaXplXG4gICAgICAgIGlmIChzaXplQnl0ZXMgPiBGSUxFX1NJWkVfTElNSVRTLlBMVUdJTikge1xuICAgICAgICAgIHByaW50RXJyb3IoJ1BsdWdpbiBmaWxlIHRvbyBsYXJnZScsIHtcbiAgICAgICAgICAgIHNpemU6IHNpemVGb3JtYXR0ZWQsXG4gICAgICAgICAgICBtYXhpbXVtOiBmb3JtYXRGaWxlU2l6ZShGSUxFX1NJWkVfTElNSVRTLlBMVUdJTiksXG4gICAgICAgICAgICBleGNlZWRlZEJ5OiBmb3JtYXRGaWxlU2l6ZShzaXplQnl0ZXMgLSBGSUxFX1NJWkVfTElNSVRTLlBMVUdJTiksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICAgIGBQbHVnaW4gZmlsZSBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiAke2Zvcm1hdEZpbGVTaXplKEZJTEVfU0laRV9MSU1JVFMuUExVR0lOKX0gKGFjdHVhbDogJHtzaXplRm9ybWF0dGVkfSlgLFxuICAgICAgICAgICAgJ2ZpbGUuc2l6ZScsXG4gICAgICAgICAgICBzaXplQnl0ZXMsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIGZpbGUgaXMgcmVhZGFibGVcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmcy5hY2Nlc3NTeW5jKGZpbGVQYXRoLCBmcy5jb25zdGFudHMuUl9PSyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgcHJpbnRFcnJvcignQ2Fubm90IHJlYWQgcGx1Z2luIGZpbGUnLCB7XG4gICAgICAgICAgICBwYXRoOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcignUGx1Z2luIGZpbGUgaXMgbm90IHJlYWRhYmxlJywgJ2ZpbGUnLCBmaWxlUGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBwcmludFN1Y2Nlc3MoJ1BsdWdpbiBmaWxlIHZhbGlkYXRlZCcpO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHZlcnNpb24gZm9ybWF0IGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zLnZlcnNpb24pIHtcbiAgICAgICAgICBjb25zdCB2ZXJzaW9uUmVnZXggPSAvXlxcZCtcXC5cXGQrXFwuXFxkKygtW2EtekEtWjAtOS4tXSspPyQvO1xuICAgICAgICAgIGlmICghdmVyc2lvblJlZ2V4LnRlc3Qob3B0aW9ucy52ZXJzaW9uKSkge1xuICAgICAgICAgICAgcHJpbnRXYXJuaW5nKCdWZXJzaW9uIGZvcm1hdCBtYXkgYmUgaW52YWxpZCcsIHtcbiAgICAgICAgICAgICAgcHJvdmlkZWQ6IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgICAgICAgZXhwZWN0ZWQ6ICdzZW1hbnRpYyB2ZXJzaW9uIChlLmcuLCAxLjAuMCwgMS4yLjMtYmV0YS4xKScsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBuYW1lIGZvcm1hdCBpZiBwcm92aWRlZFxuICAgICAgICBpZiAob3B0aW9ucy5uYW1lKSB7XG4gICAgICAgICAgY29uc3QgbmFtZVJlZ2V4ID0gL15bYS16MC05LV0rJC87XG4gICAgICAgICAgaWYgKCFuYW1lUmVnZXgudGVzdChvcHRpb25zLm5hbWUpKSB7XG4gICAgICAgICAgICBwcmludFdhcm5pbmcoJ1BsdWdpbiBuYW1lIGZvcm1hdCBtYXkgYmUgaW52YWxpZCcsIHtcbiAgICAgICAgICAgICAgcHJvdmlkZWQ6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgICAgZXhwZWN0ZWQ6ICdsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggZGFzaGVzIChlLmcuLCBteS1wbHVnaW4tbmFtZSknLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJ5IHJ1biBtb2RlXG4gICAgICAgIGlmIChvcHRpb25zLmRyeVJ1bikge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludFNlY3Rpb24oJ0RyeSBSdW4gLSBWYWxpZGF0aW9uIENvbXBsZXRlJyk7XG4gICAgICAgICAgcHJpbnRTdWNjZXNzKCdGaWxlIHZhbGlkYXRpb24gcGFzc2VkIC0gbm8gdXBsb2FkIHBlcmZvcm1lZCcpO1xuXG4gICAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgICBGaWxlOiBmaWxlUGF0aCxcbiAgICAgICAgICAgIFNpemU6IHNpemVGb3JtYXR0ZWQsXG4gICAgICAgICAgICBPcmdhbml6YXRpb246IG9wdGlvbnMub3JnYW5pemF0aW9uLFxuICAgICAgICAgICAgTmFtZTogb3B0aW9ucy5uYW1lIHx8ICcod2lsbCBiZSBhdXRvLWRldGVjdGVkKScsXG4gICAgICAgICAgICBWZXJzaW9uOiBvcHRpb25zLnZlcnNpb24gfHwgJyh3aWxsIGJlIGF1dG8tZGV0ZWN0ZWQpJyxcbiAgICAgICAgICAgIFB1YmxpYzogb3B0aW9ucy5wdWJsaWMgPyAnWWVzJyA6ICdObycsXG4gICAgICAgICAgICBBY3RpdmU6IG9wdGlvbnMuYWN0aXZlID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIGF1dGhlbnRpY2F0ZWQgQVBJIGNsaWVudFxuICAgICAgICBjb25zdCBjbGllbnQgPSBjcmVhdGVBdXRoZW50aWNhdGVkQ2xpZW50KG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBjb25maWcgPSBjbGllbnQuZ2V0Q29uZmlnKCk7XG5cbiAgICAgICAgLy8gQ3JlYXRlIGZvcm0gZGF0YVxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50U2VjdGlvbignVXBsb2FkaW5nIFBsdWdpbicpO1xuICAgICAgICBwcmludEluZm8oJ1ByZXBhcmluZyB1cGxvYWQnLCB7XG4gICAgICAgICAgZmlsZTogcGF0aC5iYXNlbmFtZShmaWxlUGF0aCksXG4gICAgICAgICAgc2l6ZTogc2l6ZUZvcm1hdHRlZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdwbHVnaW4nLCBmcy5jcmVhdGVSZWFkU3RyZWFtKGZpbGVQYXRoKSwge1xuICAgICAgICAgIGZpbGVuYW1lOiBwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKSxcbiAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3ppcCcsXG4gICAgICAgIH0pO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ29yZ2FuaXphdGlvbicsIG9wdGlvbnMub3JnYW5pemF0aW9uKTtcblxuICAgICAgICBpZiAob3B0aW9ucy5uYW1lKSBmb3JtRGF0YS5hcHBlbmQoJ25hbWUnLCBvcHRpb25zLm5hbWUpO1xuICAgICAgICBpZiAob3B0aW9ucy52ZXJzaW9uKSBmb3JtRGF0YS5hcHBlbmQoJ3ZlcnNpb24nLCBvcHRpb25zLnZlcnNpb24pO1xuICAgICAgICBmb3JtRGF0YS5hcHBlbmQoJ2lzUHVibGljJywgb3B0aW9ucy5wdWJsaWMgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdpc0FjdGl2ZScsIG9wdGlvbnMuYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7XG5cbiAgICAgICAgLy8gTWFrZSBBUEkgcmVxdWVzdFxuICAgICAgICBjb25zdCBlbmRwb2ludCA9IGNvbmZpZy5hcGkucGx1Z2luVXBsb2FkVXJsO1xuICAgICAgICBwcmludEluZm8oJ1VwbG9hZGluZyB0byBBUEknLCB7XG4gICAgICAgICAgZW5kcG9pbnQ6IGAke2NvbmZpZy5hcGkuYmFzZVVybH0ke2VuZHBvaW50fWAsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgICBjb25zdCBzcGlubmVyID0gb3JhKCdVcGxvYWRpbmcgcGx1Z2luLi4uJykuc3RhcnQoKTtcbiAgICAgICAgbGV0IHJhd1Jlc3BvbnNlOiBQbHVnaW5SZXNwb25zZTtcbiAgICAgICAgbGV0IGR1cmF0aW9uOiBudW1iZXI7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICByYXdSZXNwb25zZSA9IGF3YWl0IGNsaWVudC5wb3N0Rm9ybTxQbHVnaW5SZXNwb25zZT4oZW5kcG9pbnQsIGZvcm1EYXRhKTtcbiAgICAgICAgICBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG4gICAgICAgICAgc3Bpbm5lci5zdWNjZWVkKCdQbHVnaW4gdXBsb2FkZWQnKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBzcGlubmVyLmZhaWwoJ1VwbG9hZCBmYWlsZWQnKTtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXh0cmFjdFNpbmdsZVJlc3BvbnNlPFBsdWdpbj4ocmF3UmVzcG9uc2UsICdwbHVnaW4nLCAnbmFtZScpO1xuXG4gICAgICAgIGlmICghcmVzcG9uc2UpIHtcbiAgICAgICAgICBwcmludEVycm9yKCdObyB2YWxpZCBwbHVnaW4gZGF0YSBpbiByZXNwb25zZScsIHtcbiAgICAgICAgICAgIHJlc3BvbnNlS2V5czogcmF3UmVzcG9uc2UgPyBPYmplY3Qua2V5cyhyYXdSZXNwb25zZSkgOiAnKG51bGwpJyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VwbG9hZCBmYWlsZWQgLSBubyB2YWxpZCBwbHVnaW4gZGF0YSByZWNlaXZlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludFNlY3Rpb24oJ1BsdWdpbiBVcGxvYWRlZCBTdWNjZXNzZnVsbHknKTtcblxuICAgICAgICAvLyBEaXNwbGF5IHBsdWdpbiBpbmZvcm1hdGlvblxuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnUGx1Z2luIElEJzogZ3JlZW4oYm9sZChyZXNwb25zZS5pZCkpLFxuICAgICAgICAgICdOYW1lJzogcmVzcG9uc2UubmFtZSxcbiAgICAgICAgICAnVmVyc2lvbic6IHJlc3BvbnNlLnZlcnNpb24sXG4gICAgICAgICAgJ09yZ2FuaXphdGlvbic6IHJlc3BvbnNlLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICAnRGVzY3JpcHRpb24nOiByZXNwb25zZS5kZXNjcmlwdGlvbiB8fCAnKG5vdCBzZXQpJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBwcmludEtleVZhbHVlKHtcbiAgICAgICAgICAnRmlsZSBVUkwnOiByZXNwb25zZS5maWxlVXJsIHx8ICcobm90IGF2YWlsYWJsZSknLFxuICAgICAgICAgICdGaWxlIFNpemUnOiByZXNwb25zZS5maWxlU2l6ZSA/IGAkeyhyZXNwb25zZS5maWxlU2l6ZSAvIDEwMjQpLnRvRml4ZWQoMil9IEtCYCA6ICcobm90IGF2YWlsYWJsZSknLFxuICAgICAgICAgICdDaGVja3N1bSc6IHJlc3BvbnNlLmNoZWNrc3VtID8gYCR7cmVzcG9uc2UuY2hlY2tzdW0uc3Vic3RyaW5nKDAsIDE2KX0uLi5gIDogJyhub3QgYXZhaWxhYmxlKScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRLZXlWYWx1ZSh7XG4gICAgICAgICAgJ1B1YmxpYyc6IHJlc3BvbnNlLmlzUHVibGljID8gJ1llcycgOiAnTm8nLFxuICAgICAgICAgICdBY3RpdmUnOiByZXNwb25zZS5pc0FjdGl2ZSA/ICdZZXMnIDogJ05vJyxcbiAgICAgICAgICAnQ3JlYXRlZCBBdCc6IHJlc3BvbnNlLmNyZWF0ZWRBdCB8fCAnKG5vdCBhdmFpbGFibGUpJyxcbiAgICAgICAgICAnVXBsb2FkZWQgQnknOiByZXNwb25zZS51cGxvYWRlZEJ5IHx8ICcobm90IGF2YWlsYWJsZSknLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIHByaW50S2V5VmFsdWUoe1xuICAgICAgICAgICdFeGVjdXRpb24gSUQnOiBleGVjdXRpb25JZCxcbiAgICAgICAgICAnVXBsb2FkIER1cmF0aW9uJzogYCR7KGR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgyKX1zYCxcbiAgICAgICAgICAnU3RhdHVzJzogZ3JlZW4oJ+KckyBTdWNjZXNzJyksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFByaW50IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChyZXNwb25zZS5tZXRhZGF0YSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICBwcmludEluZm8oJ1BsdWdpbiBtZXRhZGF0YSBhdmFpbGFibGUnLCB7XG4gICAgICAgICAgICBrZXlzOiBPYmplY3Qua2V5cyhyZXNwb25zZS5tZXRhZGF0YSkubGVuZ3RoLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJpbnQgZGVwbG95bWVudCBsb2dzIFVSTCBpZiBhdmFpbGFibGVcbiAgICAgICAgY29uc3QgcmVzcCA9IHJlc3BvbnNlIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IHJlc3BbJ1gtUmVxdWVzdC1JZCddIHx8IHJlc3AucmVxdWVzdElkO1xuICAgICAgICBpZiAocmVxdWVzdElkKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgIHByaW50SW5mbygnRGVwbG95bWVudCBsb2dzIGF2YWlsYWJsZScsIHtcbiAgICAgICAgICAgIHJlcXVlc3RJZCxcbiAgICAgICAgICAgIHVybDogYCR7Y29uZmlnLmFwaS5iYXNlVXJsfS9sb2dzLyR7cmVxdWVzdElkfWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZXh0IHN0ZXBzXG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcHJpbnRJbmZvKCdOZXh0IHN0ZXBzJywge1xuICAgICAgICAgIHZpZXc6IGBVc2UgXCJnZXQtcGx1Z2luIC0taWQgJHtyZXNwb25zZS5pZH1cIiB0byB2aWV3IHBsdWdpbiBkZXRhaWxzYCxcbiAgICAgICAgICBsaXN0OiAnVXNlIFwibGlzdC1wbHVnaW5zXCIgdG8gc2VlIGFsbCBwbHVnaW5zJyxcbiAgICAgICAgfSk7XG5cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5BUElfUkVRVUVTVCwge1xuICAgICAgICAgIGRlYnVnOiBwcm9ncmFtLm9wdHMoKS5kZWJ1ZyxcbiAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICd1cGxvYWQtcGx1Z2luJyxcbiAgICAgICAgICAgIGV4ZWN1dGlvbklkLFxuICAgICAgICAgICAgZmlsZTogb3B0aW9ucy5maWxlLFxuICAgICAgICAgICAgb3JnYW5pemF0aW9uOiBvcHRpb25zLm9yZ2FuaXphdGlvbixcbiAgICAgICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgICAgIHB1YmxpYzogb3B0aW9ucy5wdWJsaWMsXG4gICAgICAgICAgICBhY3RpdmU6IG9wdGlvbnMuYWN0aXZlLFxuICAgICAgICAgICAgdmVyaWZ5U3NsOiBvcHRpb25zLnZlcmlmeVNzbCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"validate-templates.d.ts","sourceRoot":"","sources":["../../src/commands/validate-templates.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAqF/D"}
1
+ {"version":3,"file":"validate-templates.d.ts","sourceRoot":"","sources":["../../src/commands/validate-templates.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoF/D"}