@pipeline-builder/pipeline-manager 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +74 -0
- package/cdk.json +91 -0
- package/config.yml +94 -0
- package/dist/boilerplate.d.ts +3 -0
- package/dist/boilerplate.d.ts.map +1 -0
- package/dist/boilerplate.js +58 -0
- package/dist/cdk.json +91 -0
- package/dist/cli.d.ts +62 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +372 -0
- package/dist/commands/bootstrap.d.ts +11 -0
- package/dist/commands/bootstrap.d.ts.map +1 -0
- package/dist/commands/bootstrap.js +159 -0
- package/dist/commands/create-pipeline.d.ts +12 -0
- package/dist/commands/create-pipeline.d.ts.map +1 -0
- package/dist/commands/create-pipeline.js +291 -0
- package/dist/commands/deploy.d.ts +15 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +167 -0
- package/dist/commands/get-pipeline.d.ts +13 -0
- package/dist/commands/get-pipeline.d.ts.map +1 -0
- package/dist/commands/get-pipeline.js +97 -0
- package/dist/commands/get-plugin.d.ts +13 -0
- package/dist/commands/get-plugin.d.ts.map +1 -0
- package/dist/commands/get-plugin.js +98 -0
- package/dist/commands/list-pipelines.d.ts +20 -0
- package/dist/commands/list-pipelines.d.ts.map +1 -0
- package/dist/commands/list-pipelines.js +172 -0
- package/dist/commands/list-plugins.d.ts +20 -0
- package/dist/commands/list-plugins.d.ts.map +1 -0
- package/dist/commands/list-plugins.js +167 -0
- package/dist/commands/login.d.ts +21 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +179 -0
- package/dist/commands/setup-events.d.ts +15 -0
- package/dist/commands/setup-events.d.ts.map +1 -0
- package/dist/commands/setup-events.js +177 -0
- package/dist/commands/status.d.ts +11 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +89 -0
- package/dist/commands/store-token.d.ts +20 -0
- package/dist/commands/store-token.d.ts.map +1 -0
- package/dist/commands/store-token.js +233 -0
- package/dist/commands/synth.d.ts +21 -0
- package/dist/commands/synth.d.ts.map +1 -0
- package/dist/commands/synth.js +143 -0
- package/dist/commands/upload-plugin.d.ts +21 -0
- package/dist/commands/upload-plugin.d.ts.map +1 -0
- package/dist/commands/upload-plugin.js +311 -0
- package/dist/commands/version.d.ts +12 -0
- package/dist/commands/version.d.ts.map +1 -0
- package/dist/commands/version.js +223 -0
- package/dist/config/cli.constants.d.ts +101 -0
- package/dist/config/cli.constants.d.ts.map +1 -0
- package/dist/config/cli.constants.js +165 -0
- package/dist/config.yml +94 -0
- package/dist/templates/events-stack.json +141 -0
- package/dist/types/config.d.ts +44 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/error.d.ts +61 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +39 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/pipeline.d.ts +144 -0
- package/dist/types/pipeline.d.ts.map +1 -0
- package/dist/types/pipeline.js +5 -0
- package/dist/types/plugin.d.ts +160 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +5 -0
- package/dist/utils/api-client.d.ts +26 -0
- package/dist/utils/api-client.d.ts.map +1 -0
- package/dist/utils/api-client.js +160 -0
- package/dist/utils/audit-log.d.ts +8 -0
- package/dist/utils/audit-log.d.ts.map +1 -0
- package/dist/utils/audit-log.js +53 -0
- package/dist/utils/auth-guard.d.ts +16 -0
- package/dist/utils/auth-guard.d.ts.map +1 -0
- package/dist/utils/auth-guard.js +25 -0
- package/dist/utils/aws-secrets.d.ts +21 -0
- package/dist/utils/aws-secrets.d.ts.map +1 -0
- package/dist/utils/aws-secrets.js +74 -0
- package/dist/utils/banner.d.ts +19 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js +59 -0
- package/dist/utils/cdk-utils.d.ts +51 -0
- package/dist/utils/cdk-utils.d.ts.map +1 -0
- package/dist/utils/cdk-utils.js +101 -0
- package/dist/utils/command-utils.d.ts +56 -0
- package/dist/utils/command-utils.d.ts.map +1 -0
- package/dist/utils/command-utils.js +138 -0
- package/dist/utils/config-loader.d.ts +27 -0
- package/dist/utils/config-loader.d.ts.map +1 -0
- package/dist/utils/config-loader.js +166 -0
- package/dist/utils/error-handler.d.ts +29 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +255 -0
- package/dist/utils/list-command-utils.d.ts +23 -0
- package/dist/utils/list-command-utils.d.ts.map +1 -0
- package/dist/utils/list-command-utils.js +60 -0
- package/dist/utils/output-utils.d.ts +60 -0
- package/dist/utils/output-utils.d.ts.map +1 -0
- package/dist/utils/output-utils.js +320 -0
- package/dist/utils/rate-limiter.d.ts +14 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +73 -0
- package/package.json +144 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* CLI initialization options
|
|
4
|
+
*/
|
|
5
|
+
interface CliOptions {
|
|
6
|
+
/**
|
|
7
|
+
* Show banner on startup
|
|
8
|
+
* @default true
|
|
9
|
+
*/
|
|
10
|
+
showBanner?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Minimal banner (no ASCII art)
|
|
13
|
+
* @default false
|
|
14
|
+
*/
|
|
15
|
+
minimalBanner?: boolean;
|
|
16
|
+
/**
|
|
17
|
+
* Debug mode
|
|
18
|
+
* @default false
|
|
19
|
+
*/
|
|
20
|
+
debug?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Verbose output
|
|
23
|
+
* @default false
|
|
24
|
+
*/
|
|
25
|
+
verbose?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Quiet mode (minimal output)
|
|
28
|
+
* @default false
|
|
29
|
+
*/
|
|
30
|
+
quiet?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* No color output
|
|
33
|
+
* @default false
|
|
34
|
+
*/
|
|
35
|
+
noColor?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize CLI with options
|
|
39
|
+
*
|
|
40
|
+
* @param options - CLI initialization options
|
|
41
|
+
*/
|
|
42
|
+
export declare function initializeCli(options?: CliOptions): void;
|
|
43
|
+
/**
|
|
44
|
+
* Main CLI entry point
|
|
45
|
+
*
|
|
46
|
+
* @param options - CLI initialization options
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // Standard initialization
|
|
51
|
+
* main();
|
|
52
|
+
*
|
|
53
|
+
* // Minimal mode
|
|
54
|
+
* main({ minimalBanner: true, quiet: true });
|
|
55
|
+
*
|
|
56
|
+
* // Debug mode
|
|
57
|
+
* main({ debug: true, verbose: true });
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export declare function main(options?: CliOptions): void;
|
|
61
|
+
export {};
|
|
62
|
+
//# sourceMappingURL=cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AA+BA;;GAEG;AACH,UAAU,UAAU;IAClB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AA4ND;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CAyD5D;AAiDD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,IAAI,CAAC,OAAO,GAAE,UAAe,GAAG,IAAI,CA0BnD"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
// Copyright 2026 Pipeline Builder Contributors
|
|
4
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.initializeCli = initializeCli;
|
|
7
|
+
exports.main = main;
|
|
8
|
+
const commander_1 = require("commander");
|
|
9
|
+
const bootstrap_1 = require("./commands/bootstrap");
|
|
10
|
+
const create_pipeline_1 = require("./commands/create-pipeline");
|
|
11
|
+
const deploy_1 = require("./commands/deploy");
|
|
12
|
+
const get_pipeline_1 = require("./commands/get-pipeline");
|
|
13
|
+
const get_plugin_1 = require("./commands/get-plugin");
|
|
14
|
+
const list_pipelines_1 = require("./commands/list-pipelines");
|
|
15
|
+
const list_plugins_1 = require("./commands/list-plugins");
|
|
16
|
+
const login_1 = require("./commands/login");
|
|
17
|
+
const setup_events_1 = require("./commands/setup-events");
|
|
18
|
+
const status_1 = require("./commands/status");
|
|
19
|
+
const store_token_1 = require("./commands/store-token");
|
|
20
|
+
const synth_1 = require("./commands/synth");
|
|
21
|
+
const upload_plugin_1 = require("./commands/upload-plugin");
|
|
22
|
+
const version_1 = require("./commands/version");
|
|
23
|
+
const cli_constants_1 = require("./config/cli.constants");
|
|
24
|
+
const banner_1 = require("./utils/banner");
|
|
25
|
+
const error_handler_1 = require("./utils/error-handler");
|
|
26
|
+
const output_utils_1 = require("./utils/output-utils");
|
|
27
|
+
/**
|
|
28
|
+
* Check environment and display warnings
|
|
29
|
+
*/
|
|
30
|
+
function checkEnvironment() {
|
|
31
|
+
const warnings = [];
|
|
32
|
+
// Check for required environment variables
|
|
33
|
+
if (!process.env[cli_constants_1.ENV_VARS.PLATFORM_TOKEN]) {
|
|
34
|
+
warnings.push('PLATFORM_TOKEN environment variable is not set');
|
|
35
|
+
warnings.push('Authentication will fail for API operations');
|
|
36
|
+
}
|
|
37
|
+
// Check Node version
|
|
38
|
+
const nodeVersion = process.version;
|
|
39
|
+
const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0] || '0', 10);
|
|
40
|
+
if (majorVersion < 18) {
|
|
41
|
+
warnings.push(`Node.js ${nodeVersion} detected - version 18+ recommended`);
|
|
42
|
+
}
|
|
43
|
+
// Display warnings
|
|
44
|
+
if (warnings.length > 0) {
|
|
45
|
+
(0, output_utils_1.printSection)('Environment Warnings');
|
|
46
|
+
warnings.forEach(warning => {
|
|
47
|
+
(0, output_utils_1.printWarning)(warning);
|
|
48
|
+
});
|
|
49
|
+
console.log('');
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Display startup information
|
|
54
|
+
*/
|
|
55
|
+
function displayStartupInfo(options) {
|
|
56
|
+
if (options.quiet)
|
|
57
|
+
return;
|
|
58
|
+
const executionId = (0, cli_constants_1.generateExecutionId)();
|
|
59
|
+
if (options.debug || options.verbose) {
|
|
60
|
+
(0, output_utils_1.printDebug)('CLI Configuration', {
|
|
61
|
+
name: cli_constants_1.APP_NAME,
|
|
62
|
+
version: cli_constants_1.APP_VERSION,
|
|
63
|
+
executionId,
|
|
64
|
+
node: process.version,
|
|
65
|
+
platform: process.platform,
|
|
66
|
+
arch: process.arch,
|
|
67
|
+
cwd: process.cwd(),
|
|
68
|
+
env: {
|
|
69
|
+
debug: process.env.DEBUG,
|
|
70
|
+
token: process.env[cli_constants_1.ENV_VARS.PLATFORM_TOKEN] ? 'set' : 'not set',
|
|
71
|
+
url: process.env[cli_constants_1.ENV_VARS.PLATFORM_BASE_URL] || 'default',
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
(0, output_utils_1.printDebug)('Starting CLI', {
|
|
77
|
+
version: cli_constants_1.APP_VERSION,
|
|
78
|
+
executionId,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Register all CLI commands
|
|
84
|
+
*/
|
|
85
|
+
function registerCommands() {
|
|
86
|
+
(0, output_utils_1.printDebug)('Registering commands');
|
|
87
|
+
// Configure program
|
|
88
|
+
commander_1.program
|
|
89
|
+
.name(cli_constants_1.APP_NAME)
|
|
90
|
+
.description(cli_constants_1.APP_DESCRIPTION)
|
|
91
|
+
.version(cli_constants_1.APP_VERSION, '-v, --version', 'Show CLI version')
|
|
92
|
+
.option('--debug', 'Enable debug output with stack traces', false)
|
|
93
|
+
.option('--verbose', 'Show detailed information', false)
|
|
94
|
+
.option('--quiet', 'Minimal output (errors only)', false)
|
|
95
|
+
.option('--no-color', 'Disable colored output', false)
|
|
96
|
+
.addHelpText('after', `
|
|
97
|
+
Environment Variables:
|
|
98
|
+
${cli_constants_1.ENV_VARS.PLATFORM_TOKEN} Authentication token (required)
|
|
99
|
+
${cli_constants_1.ENV_VARS.PLATFORM_BASE_URL} API base URL (optional)
|
|
100
|
+
${cli_constants_1.ENV_VARS.CLI_CONFIG_PATH} Config file path (optional)
|
|
101
|
+
${cli_constants_1.ENV_VARS.TLS_REJECT_UNAUTHORIZED} Disable SSL verification if '0'
|
|
102
|
+
${cli_constants_1.ENV_VARS.DEBUG} Enable debug mode if 'true'
|
|
103
|
+
|
|
104
|
+
Examples:
|
|
105
|
+
$ ${cli_constants_1.APP_NAME} version
|
|
106
|
+
$ ${cli_constants_1.APP_NAME} list-pipelines --project my-app
|
|
107
|
+
$ ${cli_constants_1.APP_NAME} get-pipeline --id pipe-123 --format json
|
|
108
|
+
$ ${cli_constants_1.APP_NAME} store-token --days 30 --region us-east-1
|
|
109
|
+
$ ${cli_constants_1.APP_NAME} bootstrap --account 123456789012 --region us-east-1
|
|
110
|
+
$ ${cli_constants_1.APP_NAME} deploy --id pipe-123 --profile production
|
|
111
|
+
|
|
112
|
+
`);
|
|
113
|
+
// Version command (special handling)
|
|
114
|
+
(0, version_1.version)(commander_1.program);
|
|
115
|
+
// Authentication commands
|
|
116
|
+
(0, output_utils_1.printDebug)('Registering authentication commands');
|
|
117
|
+
(0, login_1.login)(commander_1.program); // Login and obtain PLATFORM_TOKEN (also supports --refresh)
|
|
118
|
+
// Query commands
|
|
119
|
+
(0, output_utils_1.printDebug)('Registering query commands');
|
|
120
|
+
(0, get_plugin_1.getPlugin)(commander_1.program); // Single plugin by ID
|
|
121
|
+
(0, list_plugins_1.listPlugins)(commander_1.program); // Multiple plugins with filters
|
|
122
|
+
(0, get_pipeline_1.getPipeline)(commander_1.program); // Single pipeline by ID
|
|
123
|
+
(0, list_pipelines_1.listPipelines)(commander_1.program); // Multiple pipelines with filters
|
|
124
|
+
// Create/Upload commands
|
|
125
|
+
(0, output_utils_1.printDebug)('Registering create/upload commands');
|
|
126
|
+
(0, create_pipeline_1.createPipeline)(commander_1.program); // Create pipeline configuration
|
|
127
|
+
(0, upload_plugin_1.uploadPlugin)(commander_1.program); // Upload and deploy plugin
|
|
128
|
+
// Status command
|
|
129
|
+
(0, output_utils_1.printDebug)('Registering status command');
|
|
130
|
+
(0, status_1.status)(commander_1.program); // Show environment and connectivity status
|
|
131
|
+
// Deployment commands
|
|
132
|
+
(0, output_utils_1.printDebug)('Registering deployment commands');
|
|
133
|
+
(0, store_token_1.storeToken)(commander_1.program); // Generate JWT token and store in Secrets Manager
|
|
134
|
+
(0, setup_events_1.setupEvents)(commander_1.program); // Deploy EventBridge event ingestion infrastructure
|
|
135
|
+
(0, bootstrap_1.bootstrap)(commander_1.program); // Bootstrap CDK toolkit stack
|
|
136
|
+
(0, deploy_1.deploy)(commander_1.program); // Deploy pipeline with CDK (--app prints boilerplate path)
|
|
137
|
+
(0, synth_1.synth)(commander_1.program); // Run CDK synthesis
|
|
138
|
+
// Shell completions
|
|
139
|
+
(0, output_utils_1.printDebug)('Registering completions command');
|
|
140
|
+
commander_1.program
|
|
141
|
+
.command('completions')
|
|
142
|
+
.description('Generate shell completions (bash, zsh, fish)')
|
|
143
|
+
.argument('<shell>', 'Shell type: bash, zsh, or fish')
|
|
144
|
+
.action((shell) => {
|
|
145
|
+
switch (shell) {
|
|
146
|
+
case 'bash':
|
|
147
|
+
console.log(`# pipeline-manager bash completions
|
|
148
|
+
_pipeline_manager_completions() {
|
|
149
|
+
local cur="\${COMP_WORDS[COMP_CWORD]}"
|
|
150
|
+
local commands="login deploy synth upload-plugin create-pipeline status version bootstrap setup-events store-token completions"
|
|
151
|
+
COMPREPLY=($(compgen -W "\${commands}" -- "\${cur}"))
|
|
152
|
+
}
|
|
153
|
+
complete -F _pipeline_manager_completions pipeline-manager`);
|
|
154
|
+
break;
|
|
155
|
+
case 'zsh':
|
|
156
|
+
console.log(`# pipeline-manager zsh completions
|
|
157
|
+
_pipeline_manager() {
|
|
158
|
+
local commands=(login deploy synth upload-plugin create-pipeline status version bootstrap setup-events store-token completions)
|
|
159
|
+
_describe 'command' commands
|
|
160
|
+
}
|
|
161
|
+
compdef _pipeline_manager pipeline-manager`);
|
|
162
|
+
break;
|
|
163
|
+
case 'fish':
|
|
164
|
+
console.log(`# pipeline-manager fish completions
|
|
165
|
+
complete -c pipeline-manager -n '__fish_use_subcommand' -a 'login deploy synth upload-plugin create-pipeline status version bootstrap setup-events store-token completions'`);
|
|
166
|
+
break;
|
|
167
|
+
default:
|
|
168
|
+
console.error(`Unknown shell: ${shell}. Use bash, zsh, or fish.`);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
(0, output_utils_1.printDebug)('All commands registered successfully');
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Handle program errors
|
|
176
|
+
*/
|
|
177
|
+
function setupErrorHandlers() {
|
|
178
|
+
// Handle uncaught exceptions
|
|
179
|
+
process.on('uncaughtException', (error) => {
|
|
180
|
+
console.error(''); // Empty line
|
|
181
|
+
(0, output_utils_1.printError)('Uncaught exception', {
|
|
182
|
+
error: error.message,
|
|
183
|
+
name: error.name,
|
|
184
|
+
});
|
|
185
|
+
(0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
|
|
186
|
+
debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
|
|
187
|
+
exit: true,
|
|
188
|
+
context: {
|
|
189
|
+
type: 'uncaughtException',
|
|
190
|
+
},
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
// Handle unhandled promise rejections
|
|
194
|
+
process.on('unhandledRejection', (reason) => {
|
|
195
|
+
console.error(''); // Empty line
|
|
196
|
+
(0, output_utils_1.printError)('Unhandled promise rejection', {
|
|
197
|
+
reason: reason instanceof Error ? reason.message : String(reason),
|
|
198
|
+
});
|
|
199
|
+
const error = reason instanceof Error ? reason : new Error(String(reason));
|
|
200
|
+
(0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
|
|
201
|
+
debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
|
|
202
|
+
exit: true,
|
|
203
|
+
context: {
|
|
204
|
+
type: 'unhandledRejection',
|
|
205
|
+
},
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
// Handle SIGINT (Ctrl+C)
|
|
209
|
+
process.on('SIGINT', () => {
|
|
210
|
+
console.log(''); // Empty line
|
|
211
|
+
(0, output_utils_1.printWarning)('Process interrupted by user (SIGINT)');
|
|
212
|
+
console.log(''); // Empty line
|
|
213
|
+
process.exit(130); // Standard exit code for SIGINT
|
|
214
|
+
});
|
|
215
|
+
// Handle SIGTERM
|
|
216
|
+
process.on('SIGTERM', () => {
|
|
217
|
+
console.log(''); // Empty line
|
|
218
|
+
(0, output_utils_1.printWarning)('Process terminated (SIGTERM)');
|
|
219
|
+
console.log(''); // Empty line
|
|
220
|
+
process.exit(143); // Standard exit code for SIGTERM
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Initialize CLI with options
|
|
225
|
+
*
|
|
226
|
+
* @param options - CLI initialization options
|
|
227
|
+
*/
|
|
228
|
+
function initializeCli(options = {}) {
|
|
229
|
+
const { showBanner = true, minimalBanner = false, debug = false, verbose = false, quiet = false, noColor = false, } = options;
|
|
230
|
+
// Handle color output
|
|
231
|
+
if (noColor) {
|
|
232
|
+
process.env.NO_COLOR = '1';
|
|
233
|
+
}
|
|
234
|
+
// Display banner
|
|
235
|
+
if (showBanner && !quiet) {
|
|
236
|
+
if (minimalBanner) {
|
|
237
|
+
(0, banner_1.miniBanner)();
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
(0, banner_1.banner)({
|
|
241
|
+
minimal: false,
|
|
242
|
+
showDescription: true,
|
|
243
|
+
showTimestamp: debug || verbose,
|
|
244
|
+
showExecutionId: debug,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// Display startup info
|
|
249
|
+
displayStartupInfo({ debug, verbose, quiet });
|
|
250
|
+
// Check environment
|
|
251
|
+
if (!quiet) {
|
|
252
|
+
checkEnvironment();
|
|
253
|
+
}
|
|
254
|
+
// Setup error handlers
|
|
255
|
+
setupErrorHandlers();
|
|
256
|
+
// Register commands
|
|
257
|
+
try {
|
|
258
|
+
registerCommands();
|
|
259
|
+
(0, output_utils_1.printDebug)('CLI initialization complete');
|
|
260
|
+
}
|
|
261
|
+
catch (error) {
|
|
262
|
+
(0, output_utils_1.printError)('CLI initialization failed', {
|
|
263
|
+
error: error instanceof Error ? error.message : String(error),
|
|
264
|
+
});
|
|
265
|
+
(0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.CONFIGURATION, {
|
|
266
|
+
debug: debug || (0, cli_constants_1.isDebugMode)(),
|
|
267
|
+
exit: true,
|
|
268
|
+
context: {
|
|
269
|
+
stage: 'initialization',
|
|
270
|
+
},
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Parse command line arguments
|
|
276
|
+
*/
|
|
277
|
+
function parseArguments() {
|
|
278
|
+
try {
|
|
279
|
+
commander_1.program.parse(process.argv);
|
|
280
|
+
// Show help if no command provided
|
|
281
|
+
const args = process.argv.slice(2);
|
|
282
|
+
if (args.length === 0) {
|
|
283
|
+
(0, output_utils_1.printInfo)('No command specified - displaying help');
|
|
284
|
+
console.log(''); // Empty line
|
|
285
|
+
commander_1.program.outputHelp();
|
|
286
|
+
process.exit(0);
|
|
287
|
+
}
|
|
288
|
+
// Check if command exists
|
|
289
|
+
const command = args[0];
|
|
290
|
+
if (command && !command.startsWith('-')) {
|
|
291
|
+
const commandExists = commander_1.program.commands.some(cmd => cmd.name() === command);
|
|
292
|
+
if (!commandExists) {
|
|
293
|
+
console.log(''); // Empty line
|
|
294
|
+
(0, output_utils_1.printError)(`Unknown command: ${command}`);
|
|
295
|
+
console.log(''); // Empty line
|
|
296
|
+
(0, output_utils_1.printInfo)('Available commands:');
|
|
297
|
+
commander_1.program.commands.forEach(cmd => {
|
|
298
|
+
console.log(` • ${cmd.name()} - ${cmd.description()}`);
|
|
299
|
+
});
|
|
300
|
+
console.log(''); // Empty line
|
|
301
|
+
process.exit(1);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
(0, output_utils_1.printDebug)('Command line arguments parsed successfully');
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
(0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
|
|
308
|
+
debug: (0, cli_constants_1.isDebugMode)(commander_1.program.opts()),
|
|
309
|
+
exit: true,
|
|
310
|
+
context: {
|
|
311
|
+
stage: 'argument-parsing',
|
|
312
|
+
argv: process.argv,
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Main CLI entry point
|
|
319
|
+
*
|
|
320
|
+
* @param options - CLI initialization options
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* ```typescript
|
|
324
|
+
* // Standard initialization
|
|
325
|
+
* main();
|
|
326
|
+
*
|
|
327
|
+
* // Minimal mode
|
|
328
|
+
* main({ minimalBanner: true, quiet: true });
|
|
329
|
+
*
|
|
330
|
+
* // Debug mode
|
|
331
|
+
* main({ debug: true, verbose: true });
|
|
332
|
+
* ```
|
|
333
|
+
*/
|
|
334
|
+
function main(options = {}) {
|
|
335
|
+
try {
|
|
336
|
+
// Initialize CLI
|
|
337
|
+
initializeCli(options);
|
|
338
|
+
// Parse arguments and execute command
|
|
339
|
+
parseArguments();
|
|
340
|
+
// If we reach here, command completed successfully
|
|
341
|
+
(0, output_utils_1.printDebug)('CLI execution completed successfully');
|
|
342
|
+
}
|
|
343
|
+
catch (error) {
|
|
344
|
+
// Final catch-all error handler
|
|
345
|
+
console.error(''); // Empty line
|
|
346
|
+
(0, output_utils_1.printError)('Fatal CLI error', {
|
|
347
|
+
error: error instanceof Error ? error.message : String(error),
|
|
348
|
+
});
|
|
349
|
+
(0, error_handler_1.handleError)(error, error_handler_1.ERROR_CODES.GENERAL, {
|
|
350
|
+
debug: (0, cli_constants_1.isDebugMode)(options),
|
|
351
|
+
exit: true,
|
|
352
|
+
context: {
|
|
353
|
+
stage: 'main',
|
|
354
|
+
options,
|
|
355
|
+
},
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Run CLI if executed directly
|
|
361
|
+
*/
|
|
362
|
+
if (require.main === module) {
|
|
363
|
+
// Parse CLI options from environment or command line
|
|
364
|
+
const options = {
|
|
365
|
+
debug: process.env.DEBUG === 'true',
|
|
366
|
+
quiet: process.argv.includes('--quiet'),
|
|
367
|
+
verbose: process.argv.includes('--verbose'),
|
|
368
|
+
noColor: process.argv.includes('--no-color') || process.env.NO_COLOR === '1',
|
|
369
|
+
};
|
|
370
|
+
main(options);
|
|
371
|
+
}
|
|
372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUNBLCtDQUErQztBQUMvQyxzQ0FBc0M7O0FBcVN0QyxzQ0F5REM7QUFrRUQsb0JBMEJDO0FBeGJELHlDQUFvQztBQUNwQyxvREFBaUQ7QUFDakQsZ0VBQTREO0FBQzVELDhDQUEyQztBQUMzQywwREFBc0Q7QUFDdEQsc0RBQWtEO0FBQ2xELDhEQUEwRDtBQUMxRCwwREFBc0Q7QUFDdEQsNENBQXlDO0FBQ3pDLDBEQUFzRDtBQUN0RCw4Q0FBMkM7QUFDM0Msd0RBQW9EO0FBQ3BELDRDQUF5QztBQUN6Qyw0REFBd0Q7QUFDeEQsZ0RBQTZDO0FBQzdDLDBEQU9nQztBQUNoQywyQ0FBb0Q7QUFDcEQseURBQWlFO0FBQ2pFLHVEQUFxRztBQTJDckc7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQjtJQUN2QixNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFFOUIsMkNBQTJDO0lBQzNDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUMxQyxRQUFRLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxDQUFDLENBQUM7UUFDaEUsUUFBUSxDQUFDLElBQUksQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxxQkFBcUI7SUFDckIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQztJQUNwQyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLElBQUksWUFBWSxHQUFHLEVBQUUsRUFBRSxDQUFDO1FBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxXQUFXLHFDQUFxQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDeEIsSUFBQSwyQkFBWSxFQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN6QixJQUFBLDJCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGtCQUFrQixDQUFDLE9BQW1CO0lBQzdDLElBQUksT0FBTyxDQUFDLEtBQUs7UUFBRSxPQUFPO0lBRTFCLE1BQU0sV0FBVyxHQUFHLElBQUEsbUNBQW1CLEdBQUUsQ0FBQztJQUUxQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JDLElBQUEseUJBQVUsRUFBQyxtQkFBbUIsRUFBRTtZQUM5QixJQUFJLEVBQUUsd0JBQVE7WUFDZCxPQUFPLEVBQUUsMkJBQVc7WUFDcEIsV0FBVztZQUNYLElBQUksRUFBRSxPQUFPLENBQUMsT0FBTztZQUNyQixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ2xCLEdBQUcsRUFBRTtnQkFDSCxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLO2dCQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyx3QkFBUSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7Z0JBQy9ELEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUFRLENBQUMsaUJBQWlCLENBQUMsSUFBSSxTQUFTO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztTQUFNLENBQUM7UUFDTixJQUFBLHlCQUFVLEVBQUMsY0FBYyxFQUFFO1lBQ3pCLE9BQU8sRUFBRSwyQkFBVztZQUNwQixXQUFXO1NBQ1osQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZ0JBQWdCO0lBQ3ZCLElBQUEseUJBQVUsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBRW5DLG9CQUFvQjtJQUNwQixtQkFBTztTQUNKLElBQUksQ0FBQyx3QkFBUSxDQUFDO1NBQ2QsV0FBVyxDQUFDLCtCQUFlLENBQUM7U0FDNUIsT0FBTyxDQUFDLDJCQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixDQUFDO1NBQ3pELE1BQU0sQ0FBQyxTQUFTLEVBQUUsdUNBQXVDLEVBQUUsS0FBSyxDQUFDO1NBQ2pFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLEVBQUUsS0FBSyxDQUFDO1NBQ3ZELE1BQU0sQ0FBQyxTQUFTLEVBQUUsOEJBQThCLEVBQUUsS0FBSyxDQUFDO1NBQ3hELE1BQU0sQ0FBQyxZQUFZLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxDQUFDO1NBQ3JELFdBQVcsQ0FBQyxPQUFPLEVBQUU7O0lBRXRCLHdCQUFRLENBQUMsY0FBYztJQUN2Qix3QkFBUSxDQUFDLGlCQUFpQjtJQUMxQix3QkFBUSxDQUFDLGVBQWU7SUFDeEIsd0JBQVEsQ0FBQyx1QkFBdUI7SUFDaEMsd0JBQVEsQ0FBQyxLQUFLOzs7TUFHWix3QkFBUTtNQUNSLHdCQUFRO01BQ1Isd0JBQVE7TUFDUix3QkFBUTtNQUNSLHdCQUFRO01BQ1Isd0JBQVE7O0NBRWIsQ0FBQyxDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUEsaUJBQU8sRUFBQyxtQkFBTyxDQUFDLENBQUM7SUFFakIsMEJBQTBCO0lBQzFCLElBQUEseUJBQVUsRUFBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ2xELElBQUEsYUFBSyxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLDREQUE0RDtJQUU1RSxpQkFBaUI7SUFDakIsSUFBQSx5QkFBVSxFQUFDLDRCQUE0QixDQUFDLENBQUM7SUFDekMsSUFBQSxzQkFBUyxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtJQUMxQyxJQUFBLDBCQUFXLEVBQUMsbUJBQU8sQ0FBQyxDQUFDLENBQUMsZ0NBQWdDO0lBQ3RELElBQUEsMEJBQVcsRUFBQyxtQkFBTyxDQUFDLENBQUMsQ0FBQyx3QkFBd0I7SUFDOUMsSUFBQSw4QkFBYSxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLGtDQUFrQztJQUUxRCx5QkFBeUI7SUFDekIsSUFBQSx5QkFBVSxFQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFDakQsSUFBQSxnQ0FBYyxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLGdDQUFnQztJQUN6RCxJQUFBLDRCQUFZLEVBQUMsbUJBQU8sQ0FBQyxDQUFDLENBQUMsMkJBQTJCO0lBRWxELGlCQUFpQjtJQUNqQixJQUFBLHlCQUFVLEVBQUMsNEJBQTRCLENBQUMsQ0FBQztJQUN6QyxJQUFBLGVBQU0sRUFBQyxtQkFBTyxDQUFDLENBQUMsQ0FBQywyQ0FBMkM7SUFFNUQsc0JBQXNCO0lBQ3RCLElBQUEseUJBQVUsRUFBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzlDLElBQUEsd0JBQVUsRUFBQyxtQkFBTyxDQUFDLENBQUMsQ0FBQyxrREFBa0Q7SUFDdkUsSUFBQSwwQkFBVyxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLG9EQUFvRDtJQUMxRSxJQUFBLHFCQUFTLEVBQUMsbUJBQU8sQ0FBQyxDQUFDLENBQUMsOEJBQThCO0lBQ2xELElBQUEsZUFBTSxFQUFDLG1CQUFPLENBQUMsQ0FBQyxDQUFDLDJEQUEyRDtJQUM1RSxJQUFBLGFBQUssRUFBQyxtQkFBTyxDQUFDLENBQUMsQ0FBQyxvQkFBb0I7SUFFcEMsb0JBQW9CO0lBQ3BCLElBQUEseUJBQVUsRUFBQyxpQ0FBaUMsQ0FBQyxDQUFDO0lBQzlDLG1CQUFPO1NBQ0osT0FBTyxDQUFDLGFBQWEsQ0FBQztTQUN0QixXQUFXLENBQUMsOENBQThDLENBQUM7U0FDM0QsUUFBUSxDQUFDLFNBQVMsRUFBRSxnQ0FBZ0MsQ0FBQztTQUNyRCxNQUFNLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN4QixRQUFRLEtBQUssRUFBRSxDQUFDO1lBQ2QsS0FBSyxNQUFNO2dCQUNULE9BQU8sQ0FBQyxHQUFHLENBQUM7Ozs7OzsyREFNcUMsQ0FBQyxDQUFDO2dCQUNuRCxNQUFNO1lBQ1IsS0FBSyxLQUFLO2dCQUNSLE9BQU8sQ0FBQyxHQUFHLENBQUM7Ozs7OzJDQUtxQixDQUFDLENBQUM7Z0JBQ25DLE1BQU07WUFDUixLQUFLLE1BQU07Z0JBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQzs0S0FDc0osQ0FBQyxDQUFDO2dCQUNwSyxNQUFNO1lBQ1I7Z0JBQ0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVMLElBQUEseUJBQVUsRUFBQyxzQ0FBc0MsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsa0JBQWtCO0lBQ3pCLDZCQUE2QjtJQUM3QixPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixFQUFFLENBQUMsS0FBWSxFQUFFLEVBQUU7UUFDL0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDaEMsSUFBQSx5QkFBVSxFQUFDLG9CQUFvQixFQUFFO1lBQy9CLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTztZQUNwQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FBQyxDQUFDO1FBRUgsSUFBQSwyQkFBVyxFQUFDLEtBQUssRUFBRSwyQkFBVyxDQUFDLE9BQU8sRUFBRTtZQUN0QyxLQUFLLEVBQUUsSUFBQSwyQkFBVyxFQUFDLG1CQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEMsSUFBSSxFQUFFLElBQUk7WUFDVixPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLG1CQUFtQjthQUMxQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxFQUFFLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxNQUFlLEVBQUUsRUFBRTtRQUNuRCxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUNoQyxJQUFBLHlCQUFVLEVBQUMsNkJBQTZCLEVBQUU7WUFDeEMsTUFBTSxFQUFFLE1BQU0sWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUM7U0FDbEUsQ0FBQyxDQUFDO1FBRUgsTUFBTSxLQUFLLEdBQUcsTUFBTSxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUUzRSxJQUFBLDJCQUFXLEVBQUMsS0FBSyxFQUFFLDJCQUFXLENBQUMsT0FBTyxFQUFFO1lBQ3RDLEtBQUssRUFBRSxJQUFBLDJCQUFXLEVBQUMsbUJBQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsb0JBQW9CO2FBQzNCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCx5QkFBeUI7SUFDekIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLElBQUEsMkJBQVksRUFBQyxzQ0FBc0MsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7SUFDckQsQ0FBQyxDQUFDLENBQUM7SUFFSCxpQkFBaUI7SUFDakIsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLElBQUEsMkJBQVksRUFBQyw4QkFBOEIsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhO1FBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUM7SUFDdEQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxVQUFzQixFQUFFO0lBQ3BELE1BQU0sRUFDSixVQUFVLEdBQUcsSUFBSSxFQUNqQixhQUFhLEdBQUcsS0FBSyxFQUNyQixLQUFLLEdBQUcsS0FBSyxFQUNiLE9BQU8sR0FBRyxLQUFLLEVBQ2YsS0FBSyxHQUFHLEtBQUssRUFDYixPQUFPLEdBQUcsS0FBSyxHQUNoQixHQUFHLE9BQU8sQ0FBQztJQUVaLHNCQUFzQjtJQUN0QixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQzdCLENBQUM7SUFFRCxpQkFBaUI7SUFDakIsSUFBSSxVQUFVLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLElBQUEsbUJBQVUsR0FBRSxDQUFDO1FBQ2YsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFBLGVBQU0sRUFBQztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxlQUFlLEVBQUUsSUFBSTtnQkFDckIsYUFBYSxFQUFFLEtBQUssSUFBSSxPQUFPO2dCQUMvQixlQUFlLEVBQUUsS0FBSzthQUN2QixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELHVCQUF1QjtJQUN2QixrQkFBa0IsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUU5QyxvQkFBb0I7SUFDcEIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsZ0JBQWdCLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLGtCQUFrQixFQUFFLENBQUM7SUFFckIsb0JBQW9CO0lBQ3BCLElBQUksQ0FBQztRQUNILGdCQUFnQixFQUFFLENBQUM7UUFDbkIsSUFBQSx5QkFBVSxFQUFDLDZCQUE2QixDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFBLHlCQUFVLEVBQUMsMkJBQTJCLEVBQUU7WUFDdEMsS0FBSyxFQUFFLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7U0FDOUQsQ0FBQyxDQUFDO1FBRUgsSUFBQSwyQkFBVyxFQUFDLEtBQUssRUFBRSwyQkFBVyxDQUFDLGFBQWEsRUFBRTtZQUM1QyxLQUFLLEVBQUUsS0FBSyxJQUFJLElBQUEsMkJBQVcsR0FBRTtZQUM3QixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxLQUFLLEVBQUUsZ0JBQWdCO2FBQ3hCO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsY0FBYztJQUNyQixJQUFJLENBQUM7UUFDSCxtQkFBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUIsbUNBQW1DO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QixJQUFBLHdCQUFTLEVBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUM5QixtQkFBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsQ0FBQztRQUVELDBCQUEwQjtRQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEMsTUFBTSxhQUFhLEdBQUcsbUJBQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBRTNFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDbkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQzlCLElBQUEseUJBQVUsRUFBQyxvQkFBb0IsT0FBTyxFQUFFLENBQUMsQ0FBQztnQkFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQzlCLElBQUEsd0JBQVMsRUFBQyxxQkFBcUIsQ0FBQyxDQUFDO2dCQUNqQyxtQkFBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNILENBQUM7UUFFRCxJQUFBLHlCQUFVLEVBQUMsNENBQTRDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUEsMkJBQVcsRUFBQyxLQUFLLEVBQUUsMkJBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsS0FBSyxFQUFFLElBQUEsMkJBQVcsRUFBQyxtQkFBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xDLElBQUksRUFBRSxJQUFJO1lBQ1YsT0FBTyxFQUFFO2dCQUNQLEtBQUssRUFBRSxrQkFBa0I7Z0JBQ3pCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTthQUNuQjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFnQixJQUFJLENBQUMsVUFBc0IsRUFBRTtJQUMzQyxJQUFJLENBQUM7UUFDSCxpQkFBaUI7UUFDakIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXZCLHNDQUFzQztRQUN0QyxjQUFjLEVBQUUsQ0FBQztRQUVqQixtREFBbUQ7UUFDbkQsSUFBQSx5QkFBVSxFQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDaEMsSUFBQSx5QkFBVSxFQUFDLGlCQUFpQixFQUFFO1lBQzVCLEtBQUssRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1NBQzlELENBQUMsQ0FBQztRQUVILElBQUEsMkJBQVcsRUFBQyxLQUFLLEVBQUUsMkJBQVcsQ0FBQyxPQUFPLEVBQUU7WUFDdEMsS0FBSyxFQUFFLElBQUEsMkJBQVcsRUFBQyxPQUFPLENBQUM7WUFDM0IsSUFBSSxFQUFFLElBQUk7WUFDVixPQUFPLEVBQUU7Z0JBQ1AsS0FBSyxFQUFFLE1BQU07Z0JBQ2IsT0FBTzthQUNSO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztJQUM1QixxREFBcUQ7SUFDckQsTUFBTSxPQUFPLEdBQWU7UUFDMUIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxLQUFLLE1BQU07UUFDbkMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUN2QyxPQUFPLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQzNDLE9BQU8sRUFBRSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHO0tBQzdFLENBQUM7SUFFRixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcbi8vIENvcHlyaWdodCAyMDI2IFBpcGVsaW5lIEJ1aWxkZXIgQ29udHJpYnV0b3JzXG4vLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQXBhY2hlLTIuMFxuXG5pbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGJvb3RzdHJhcCB9IGZyb20gJy4vY29tbWFuZHMvYm9vdHN0cmFwJztcbmltcG9ydCB7IGNyZWF0ZVBpcGVsaW5lIH0gZnJvbSAnLi9jb21tYW5kcy9jcmVhdGUtcGlwZWxpbmUnO1xuaW1wb3J0IHsgZGVwbG95IH0gZnJvbSAnLi9jb21tYW5kcy9kZXBsb3knO1xuaW1wb3J0IHsgZ2V0UGlwZWxpbmUgfSBmcm9tICcuL2NvbW1hbmRzL2dldC1waXBlbGluZSc7XG5pbXBvcnQgeyBnZXRQbHVnaW4gfSBmcm9tICcuL2NvbW1hbmRzL2dldC1wbHVnaW4nO1xuaW1wb3J0IHsgbGlzdFBpcGVsaW5lcyB9IGZyb20gJy4vY29tbWFuZHMvbGlzdC1waXBlbGluZXMnO1xuaW1wb3J0IHsgbGlzdFBsdWdpbnMgfSBmcm9tICcuL2NvbW1hbmRzL2xpc3QtcGx1Z2lucyc7XG5pbXBvcnQgeyBsb2dpbiB9IGZyb20gJy4vY29tbWFuZHMvbG9naW4nO1xuaW1wb3J0IHsgc2V0dXBFdmVudHMgfSBmcm9tICcuL2NvbW1hbmRzL3NldHVwLWV2ZW50cyc7XG5pbXBvcnQgeyBzdGF0dXMgfSBmcm9tICcuL2NvbW1hbmRzL3N0YXR1cyc7XG5pbXBvcnQgeyBzdG9yZVRva2VuIH0gZnJvbSAnLi9jb21tYW5kcy9zdG9yZS10b2tlbic7XG5pbXBvcnQgeyBzeW50aCB9IGZyb20gJy4vY29tbWFuZHMvc3ludGgnO1xuaW1wb3J0IHsgdXBsb2FkUGx1Z2luIH0gZnJvbSAnLi9jb21tYW5kcy91cGxvYWQtcGx1Z2luJztcbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuL2NvbW1hbmRzL3ZlcnNpb24nO1xuaW1wb3J0IHtcbiAgQVBQX05BTUUsXG4gIEFQUF9ERVNDUklQVElPTixcbiAgQVBQX1ZFUlNJT04sXG4gIEVOVl9WQVJTLFxuICBpc0RlYnVnTW9kZSxcbiAgZ2VuZXJhdGVFeGVjdXRpb25JZCxcbn0gZnJvbSAnLi9jb25maWcvY2xpLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBiYW5uZXIsIG1pbmlCYW5uZXIgfSBmcm9tICcuL3V0aWxzL2Jhbm5lcic7XG5pbXBvcnQgeyBFUlJPUl9DT0RFUywgaGFuZGxlRXJyb3IgfSBmcm9tICcuL3V0aWxzL2Vycm9yLWhhbmRsZXInO1xuaW1wb3J0IHsgcHJpbnRJbmZvLCBwcmludEVycm9yLCBwcmludFdhcm5pbmcsIHByaW50RGVidWcsIHByaW50U2VjdGlvbiB9IGZyb20gJy4vdXRpbHMvb3V0cHV0LXV0aWxzJztcblxuLyoqXG4gKiBDTEkgaW5pdGlhbGl6YXRpb24gb3B0aW9uc1xuICovXG5pbnRlcmZhY2UgQ2xpT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBTaG93IGJhbm5lciBvbiBzdGFydHVwXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHNob3dCYW5uZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBNaW5pbWFsIGJhbm5lciAobm8gQVNDSUkgYXJ0KVxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgbWluaW1hbEJhbm5lcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIERlYnVnIG1vZGVcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIGRlYnVnPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVmVyYm9zZSBvdXRwdXRcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHZlcmJvc2U/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBRdWlldCBtb2RlIChtaW5pbWFsIG91dHB1dClcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHF1aWV0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTm8gY29sb3Igb3V0cHV0XG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBub0NvbG9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaGVjayBlbnZpcm9ubWVudCBhbmQgZGlzcGxheSB3YXJuaW5nc1xuICovXG5mdW5jdGlvbiBjaGVja0Vudmlyb25tZW50KCk6IHZvaWQge1xuICBjb25zdCB3YXJuaW5nczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmICghcHJvY2Vzcy5lbnZbRU5WX1ZBUlMuUExBVEZPUk1fVE9LRU5dKSB7XG4gICAgd2FybmluZ3MucHVzaCgnUExBVEZPUk1fVE9LRU4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbm90IHNldCcpO1xuICAgIHdhcm5pbmdzLnB1c2goJ0F1dGhlbnRpY2F0aW9uIHdpbGwgZmFpbCBmb3IgQVBJIG9wZXJhdGlvbnMnKTtcbiAgfVxuXG4gIC8vIENoZWNrIE5vZGUgdmVyc2lvblxuICBjb25zdCBub2RlVmVyc2lvbiA9IHByb2Nlc3MudmVyc2lvbjtcbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQobm9kZVZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKVswXSB8fCAnMCcsIDEwKTtcbiAgaWYgKG1ham9yVmVyc2lvbiA8IDE4KSB7XG4gICAgd2FybmluZ3MucHVzaChgTm9kZS5qcyAke25vZGVWZXJzaW9ufSBkZXRlY3RlZCAtIHZlcnNpb24gMTgrIHJlY29tbWVuZGVkYCk7XG4gIH1cblxuICAvLyBEaXNwbGF5IHdhcm5pbmdzXG4gIGlmICh3YXJuaW5ncy5sZW5ndGggPiAwKSB7XG4gICAgcHJpbnRTZWN0aW9uKCdFbnZpcm9ubWVudCBXYXJuaW5ncycpO1xuICAgIHdhcm5pbmdzLmZvckVhY2god2FybmluZyA9PiB7XG4gICAgICBwcmludFdhcm5pbmcod2FybmluZyk7XG4gICAgfSk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG59XG5cbi8qKlxuICogRGlzcGxheSBzdGFydHVwIGluZm9ybWF0aW9uXG4gKi9cbmZ1bmN0aW9uIGRpc3BsYXlTdGFydHVwSW5mbyhvcHRpb25zOiBDbGlPcHRpb25zKTogdm9pZCB7XG4gIGlmIChvcHRpb25zLnF1aWV0KSByZXR1cm47XG5cbiAgY29uc3QgZXhlY3V0aW9uSWQgPSBnZW5lcmF0ZUV4ZWN1dGlvbklkKCk7XG5cbiAgaWYgKG9wdGlvbnMuZGVidWcgfHwgb3B0aW9ucy52ZXJib3NlKSB7XG4gICAgcHJpbnREZWJ1ZygnQ0xJIENvbmZpZ3VyYXRpb24nLCB7XG4gICAgICBuYW1lOiBBUFBfTkFNRSxcbiAgICAgIHZlcnNpb246IEFQUF9WRVJTSU9OLFxuICAgICAgZXhlY3V0aW9uSWQsXG4gICAgICBub2RlOiBwcm9jZXNzLnZlcnNpb24sXG4gICAgICBwbGF0Zm9ybTogcHJvY2Vzcy5wbGF0Zm9ybSxcbiAgICAgIGFyY2g6IHByb2Nlc3MuYXJjaCxcbiAgICAgIGN3ZDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgIGVudjoge1xuICAgICAgICBkZWJ1ZzogcHJvY2Vzcy5lbnYuREVCVUcsXG4gICAgICAgIHRva2VuOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9UT0tFTl0gPyAnc2V0JyA6ICdub3Qgc2V0JyxcbiAgICAgICAgdXJsOiBwcm9jZXNzLmVudltFTlZfVkFSUy5QTEFURk9STV9CQVNFX1VSTF0gfHwgJ2RlZmF1bHQnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBwcmludERlYnVnKCdTdGFydGluZyBDTEknLCB7XG4gICAgICB2ZXJzaW9uOiBBUFBfVkVSU0lPTixcbiAgICAgIGV4ZWN1dGlvbklkLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYWxsIENMSSBjb21tYW5kc1xuICovXG5mdW5jdGlvbiByZWdpc3RlckNvbW1hbmRzKCk6IHZvaWQge1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBjb21tYW5kcycpO1xuXG4gIC8vIENvbmZpZ3VyZSBwcm9ncmFtXG4gIHByb2dyYW1cbiAgICAubmFtZShBUFBfTkFNRSlcbiAgICAuZGVzY3JpcHRpb24oQVBQX0RFU0NSSVBUSU9OKVxuICAgIC52ZXJzaW9uKEFQUF9WRVJTSU9OLCAnLXYsIC0tdmVyc2lvbicsICdTaG93IENMSSB2ZXJzaW9uJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBvdXRwdXQgd2l0aCBzdGFjayB0cmFjZXMnLCBmYWxzZSlcbiAgICAub3B0aW9uKCctLXZlcmJvc2UnLCAnU2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbicsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tcXVpZXQnLCAnTWluaW1hbCBvdXRwdXQgKGVycm9ycyBvbmx5KScsIGZhbHNlKVxuICAgIC5vcHRpb24oJy0tbm8tY29sb3InLCAnRGlzYWJsZSBjb2xvcmVkIG91dHB1dCcsIGZhbHNlKVxuICAgIC5hZGRIZWxwVGV4dCgnYWZ0ZXInLCBgXG5FbnZpcm9ubWVudCBWYXJpYWJsZXM6XG4gICR7RU5WX1ZBUlMuUExBVEZPUk1fVE9LRU59ICAgICAgICAgICAgICBBdXRoZW50aWNhdGlvbiB0b2tlbiAocmVxdWlyZWQpXG4gICR7RU5WX1ZBUlMuUExBVEZPUk1fQkFTRV9VUkx9ICAgICAgICAgICAgICAgICBBUEkgYmFzZSBVUkwgKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLkNMSV9DT05GSUdfUEFUSH0gICAgICAgICAgICAgIENvbmZpZyBmaWxlIHBhdGggKG9wdGlvbmFsKVxuICAke0VOVl9WQVJTLlRMU19SRUpFQ1RfVU5BVVRIT1JJWkVEfSAgICAgIERpc2FibGUgU1NMIHZlcmlmaWNhdGlvbiBpZiAnMCdcbiAgJHtFTlZfVkFSUy5ERUJVR30gICAgICAgICAgICAgICAgICAgICAgICBFbmFibGUgZGVidWcgbW9kZSBpZiAndHJ1ZSdcblxuRXhhbXBsZXM6XG4gICQgJHtBUFBfTkFNRX0gdmVyc2lvblxuICAkICR7QVBQX05BTUV9IGxpc3QtcGlwZWxpbmVzIC0tcHJvamVjdCBteS1hcHBcbiAgJCAke0FQUF9OQU1FfSBnZXQtcGlwZWxpbmUgLS1pZCBwaXBlLTEyMyAtLWZvcm1hdCBqc29uXG4gICQgJHtBUFBfTkFNRX0gc3RvcmUtdG9rZW4gLS1kYXlzIDMwIC0tcmVnaW9uIHVzLWVhc3QtMVxuICAkICR7QVBQX05BTUV9IGJvb3RzdHJhcCAtLWFjY291bnQgMTIzNDU2Nzg5MDEyIC0tcmVnaW9uIHVzLWVhc3QtMVxuICAkICR7QVBQX05BTUV9IGRlcGxveSAtLWlkIHBpcGUtMTIzIC0tcHJvZmlsZSBwcm9kdWN0aW9uXG5cbmApO1xuXG4gIC8vIFZlcnNpb24gY29tbWFuZCAoc3BlY2lhbCBoYW5kbGluZylcbiAgdmVyc2lvbihwcm9ncmFtKTtcblxuICAvLyBBdXRoZW50aWNhdGlvbiBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBhdXRoZW50aWNhdGlvbiBjb21tYW5kcycpO1xuICBsb2dpbihwcm9ncmFtKTsgLy8gTG9naW4gYW5kIG9idGFpbiBQTEFURk9STV9UT0tFTiAoYWxzbyBzdXBwb3J0cyAtLXJlZnJlc2gpXG5cbiAgLy8gUXVlcnkgY29tbWFuZHNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgcXVlcnkgY29tbWFuZHMnKTtcbiAgZ2V0UGx1Z2luKHByb2dyYW0pOyAvLyBTaW5nbGUgcGx1Z2luIGJ5IElEXG4gIGxpc3RQbHVnaW5zKHByb2dyYW0pOyAvLyBNdWx0aXBsZSBwbHVnaW5zIHdpdGggZmlsdGVyc1xuICBnZXRQaXBlbGluZShwcm9ncmFtKTsgLy8gU2luZ2xlIHBpcGVsaW5lIGJ5IElEXG4gIGxpc3RQaXBlbGluZXMocHJvZ3JhbSk7IC8vIE11bHRpcGxlIHBpcGVsaW5lcyB3aXRoIGZpbHRlcnNcblxuICAvLyBDcmVhdGUvVXBsb2FkIGNvbW1hbmRzXG4gIHByaW50RGVidWcoJ1JlZ2lzdGVyaW5nIGNyZWF0ZS91cGxvYWQgY29tbWFuZHMnKTtcbiAgY3JlYXRlUGlwZWxpbmUocHJvZ3JhbSk7IC8vIENyZWF0ZSBwaXBlbGluZSBjb25maWd1cmF0aW9uXG4gIHVwbG9hZFBsdWdpbihwcm9ncmFtKTsgLy8gVXBsb2FkIGFuZCBkZXBsb3kgcGx1Z2luXG5cbiAgLy8gU3RhdHVzIGNvbW1hbmRcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgc3RhdHVzIGNvbW1hbmQnKTtcbiAgc3RhdHVzKHByb2dyYW0pOyAvLyBTaG93IGVudmlyb25tZW50IGFuZCBjb25uZWN0aXZpdHkgc3RhdHVzXG5cbiAgLy8gRGVwbG95bWVudCBjb21tYW5kc1xuICBwcmludERlYnVnKCdSZWdpc3RlcmluZyBkZXBsb3ltZW50IGNvbW1hbmRzJyk7XG4gIHN0b3JlVG9rZW4ocHJvZ3JhbSk7IC8vIEdlbmVyYXRlIEpXVCB0b2tlbiBhbmQgc3RvcmUgaW4gU2VjcmV0cyBNYW5hZ2VyXG4gIHNldHVwRXZlbnRzKHByb2dyYW0pOyAvLyBEZXBsb3kgRXZlbnRCcmlkZ2UgZXZlbnQgaW5nZXN0aW9uIGluZnJhc3RydWN0dXJlXG4gIGJvb3RzdHJhcChwcm9ncmFtKTsgLy8gQm9vdHN0cmFwIENESyB0b29sa2l0IHN0YWNrXG4gIGRlcGxveShwcm9ncmFtKTsgLy8gRGVwbG95IHBpcGVsaW5lIHdpdGggQ0RLICgtLWFwcCBwcmludHMgYm9pbGVycGxhdGUgcGF0aClcbiAgc3ludGgocHJvZ3JhbSk7IC8vIFJ1biBDREsgc3ludGhlc2lzXG5cbiAgLy8gU2hlbGwgY29tcGxldGlvbnNcbiAgcHJpbnREZWJ1ZygnUmVnaXN0ZXJpbmcgY29tcGxldGlvbnMgY29tbWFuZCcpO1xuICBwcm9ncmFtXG4gICAgLmNvbW1hbmQoJ2NvbXBsZXRpb25zJylcbiAgICAuZGVzY3JpcHRpb24oJ0dlbmVyYXRlIHNoZWxsIGNvbXBsZXRpb25zIChiYXNoLCB6c2gsIGZpc2gpJylcbiAgICAuYXJndW1lbnQoJzxzaGVsbD4nLCAnU2hlbGwgdHlwZTogYmFzaCwgenNoLCBvciBmaXNoJylcbiAgICAuYWN0aW9uKChzaGVsbDogc3RyaW5nKSA9PiB7XG4gICAgICBzd2l0Y2ggKHNoZWxsKSB7XG4gICAgICAgIGNhc2UgJ2Jhc2gnOlxuICAgICAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgYmFzaCBjb21wbGV0aW9uc1xuX3BpcGVsaW5lX21hbmFnZXJfY29tcGxldGlvbnMoKSB7XG4gIGxvY2FsIGN1cj1cIlxcJHtDT01QX1dPUkRTW0NPTVBfQ1dPUkRdfVwiXG4gIGxvY2FsIGNvbW1hbmRzPVwibG9naW4gZGVwbG95IHN5bnRoIHVwbG9hZC1wbHVnaW4gY3JlYXRlLXBpcGVsaW5lIHN0YXR1cyB2ZXJzaW9uIGJvb3RzdHJhcCBzZXR1cC1ldmVudHMgc3RvcmUtdG9rZW4gY29tcGxldGlvbnNcIlxuICBDT01QUkVQTFk9KCQoY29tcGdlbiAtVyBcIlxcJHtjb21tYW5kc31cIiAtLSBcIlxcJHtjdXJ9XCIpKVxufVxuY29tcGxldGUgLUYgX3BpcGVsaW5lX21hbmFnZXJfY29tcGxldGlvbnMgcGlwZWxpbmUtbWFuYWdlcmApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd6c2gnOlxuICAgICAgICAgIGNvbnNvbGUubG9nKGAjIHBpcGVsaW5lLW1hbmFnZXIgenNoIGNvbXBsZXRpb25zXG5fcGlwZWxpbmVfbWFuYWdlcigpIHtcbiAgbG9jYWwgY29tbWFuZHM9KGxvZ2luIGRlcGxveSBzeW50aCB1cGxvYWQtcGx1Z2luIGNyZWF0ZS1waXBlbGluZSBzdGF0dXMgdmVyc2lvbiBib290c3RyYXAgc2V0dXAtZXZlbnRzIHN0b3JlLXRva2VuIGNvbXBsZXRpb25zKVxuICBfZGVzY3JpYmUgJ2NvbW1hbmQnIGNvbW1hbmRzXG59XG5jb21wZGVmIF9waXBlbGluZV9tYW5hZ2VyIHBpcGVsaW5lLW1hbmFnZXJgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZmlzaCc6XG4gICAgICAgICAgY29uc29sZS5sb2coYCMgcGlwZWxpbmUtbWFuYWdlciBmaXNoIGNvbXBsZXRpb25zXG5jb21wbGV0ZSAtYyBwaXBlbGluZS1tYW5hZ2VyIC1uICdfX2Zpc2hfdXNlX3N1YmNvbW1hbmQnIC1hICdsb2dpbiBkZXBsb3kgc3ludGggdXBsb2FkLXBsdWdpbiBjcmVhdGUtcGlwZWxpbmUgc3RhdHVzIHZlcnNpb24gYm9vdHN0cmFwIHNldHVwLWV2ZW50cyBzdG9yZS10b2tlbiBjb21wbGV0aW9ucydgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBVbmtub3duIHNoZWxsOiAke3NoZWxsfS4gVXNlIGJhc2gsIHpzaCwgb3IgZmlzaC5gKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgcHJpbnREZWJ1ZygnQWxsIGNvbW1hbmRzIHJlZ2lzdGVyZWQgc3VjY2Vzc2Z1bGx5Jyk7XG59XG5cbi8qKlxuICogSGFuZGxlIHByb2dyYW0gZXJyb3JzXG4gKi9cbmZ1bmN0aW9uIHNldHVwRXJyb3JIYW5kbGVycygpOiB2b2lkIHtcbiAgLy8gSGFuZGxlIHVuY2F1Z2h0IGV4Y2VwdGlvbnNcbiAgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCAoZXJyb3I6IEVycm9yKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmNhdWdodCBleGNlcHRpb24nLCB7XG4gICAgICBlcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIG5hbWU6IGVycm9yLm5hbWUsXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHR5cGU6ICd1bmNhdWdodEV4Y2VwdGlvbicsXG4gICAgICB9LFxuICAgIH0pO1xuICB9KTtcblxuICAvLyBIYW5kbGUgdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uc1xuICBwcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCAocmVhc29uOiB1bmtub3duKSA9PiB7XG4gICAgY29uc29sZS5lcnJvcignJyk7IC8vIEVtcHR5IGxpbmVcbiAgICBwcmludEVycm9yKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCB7XG4gICAgICByZWFzb246IHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uLm1lc3NhZ2UgOiBTdHJpbmcocmVhc29uKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGVycm9yID0gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBuZXcgRXJyb3IoU3RyaW5nKHJlYXNvbikpO1xuXG4gICAgaGFuZGxlRXJyb3IoZXJyb3IsIEVSUk9SX0NPREVTLkdFTkVSQUwsIHtcbiAgICAgIGRlYnVnOiBpc0RlYnVnTW9kZShwcm9ncmFtLm9wdHMoKSksXG4gICAgICBleGl0OiB0cnVlLFxuICAgICAgY29udGV4dDoge1xuICAgICAgICB0eXBlOiAndW5oYW5kbGVkUmVqZWN0aW9uJyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdJTlQgKEN0cmwrQylcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50V2FybmluZygnUHJvY2VzcyBpbnRlcnJ1cHRlZCBieSB1c2VyIChTSUdJTlQpJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDEzMCk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHSU5UXG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTSUdURVJNXG4gIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJpbnRXYXJuaW5nKCdQcm9jZXNzIHRlcm1pbmF0ZWQgKFNJR1RFUk0pJyk7XG4gICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgcHJvY2Vzcy5leGl0KDE0Myk7IC8vIFN0YW5kYXJkIGV4aXQgY29kZSBmb3IgU0lHVEVSTVxuICB9KTtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIENMSSB3aXRoIG9wdGlvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENMSSBpbml0aWFsaXphdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ2xpKG9wdGlvbnM6IENsaU9wdGlvbnMgPSB7fSk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgc2hvd0Jhbm5lciA9IHRydWUsXG4gICAgbWluaW1hbEJhbm5lciA9IGZhbHNlLFxuICAgIGRlYnVnID0gZmFsc2UsXG4gICAgdmVyYm9zZSA9IGZhbHNlLFxuICAgIHF1aWV0ID0gZmFsc2UsXG4gICAgbm9Db2xvciA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICAvLyBIYW5kbGUgY29sb3Igb3V0cHV0XG4gIGlmIChub0NvbG9yKSB7XG4gICAgcHJvY2Vzcy5lbnYuTk9fQ09MT1IgPSAnMSc7XG4gIH1cblxuICAvLyBEaXNwbGF5IGJhbm5lclxuICBpZiAoc2hvd0Jhbm5lciAmJiAhcXVpZXQpIHtcbiAgICBpZiAobWluaW1hbEJhbm5lcikge1xuICAgICAgbWluaUJhbm5lcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBiYW5uZXIoe1xuICAgICAgICBtaW5pbWFsOiBmYWxzZSxcbiAgICAgICAgc2hvd0Rlc2NyaXB0aW9uOiB0cnVlLFxuICAgICAgICBzaG93VGltZXN0YW1wOiBkZWJ1ZyB8fCB2ZXJib3NlLFxuICAgICAgICBzaG93RXhlY3V0aW9uSWQ6IGRlYnVnLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGlzcGxheSBzdGFydHVwIGluZm9cbiAgZGlzcGxheVN0YXJ0dXBJbmZvKHsgZGVidWcsIHZlcmJvc2UsIHF1aWV0IH0pO1xuXG4gIC8vIENoZWNrIGVudmlyb25tZW50XG4gIGlmICghcXVpZXQpIHtcbiAgICBjaGVja0Vudmlyb25tZW50KCk7XG4gIH1cblxuICAvLyBTZXR1cCBlcnJvciBoYW5kbGVyc1xuICBzZXR1cEVycm9ySGFuZGxlcnMoKTtcblxuICAvLyBSZWdpc3RlciBjb21tYW5kc1xuICB0cnkge1xuICAgIHJlZ2lzdGVyQ29tbWFuZHMoKTtcbiAgICBwcmludERlYnVnKCdDTEkgaW5pdGlhbGl6YXRpb24gY29tcGxldGUnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBwcmludEVycm9yKCdDTEkgaW5pdGlhbGl6YXRpb24gZmFpbGVkJywge1xuICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSxcbiAgICB9KTtcblxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBFUlJPUl9DT0RFUy5DT05GSUdVUkFUSU9OLCB7XG4gICAgICBkZWJ1ZzogZGVidWcgfHwgaXNEZWJ1Z01vZGUoKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnaW5pdGlhbGl6YXRpb24nLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHNcbiAqL1xuZnVuY3Rpb24gcGFyc2VBcmd1bWVudHMoKTogdm9pZCB7XG4gIHRyeSB7XG4gICAgcHJvZ3JhbS5wYXJzZShwcm9jZXNzLmFyZ3YpO1xuXG4gICAgLy8gU2hvdyBoZWxwIGlmIG5vIGNvbW1hbmQgcHJvdmlkZWRcbiAgICBjb25zdCBhcmdzID0gcHJvY2Vzcy5hcmd2LnNsaWNlKDIpO1xuICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcHJpbnRJbmZvKCdObyBjb21tYW5kIHNwZWNpZmllZCAtIGRpc3BsYXlpbmcgaGVscCcpO1xuICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICBwcm9ncmFtLm91dHB1dEhlbHAoKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBjb21tYW5kIGV4aXN0c1xuICAgIGNvbnN0IGNvbW1hbmQgPSBhcmdzWzBdO1xuICAgIGlmIChjb21tYW5kICYmICFjb21tYW5kLnN0YXJ0c1dpdGgoJy0nKSkge1xuICAgICAgY29uc3QgY29tbWFuZEV4aXN0cyA9IHByb2dyYW0uY29tbWFuZHMuc29tZShjbWQgPT4gY21kLm5hbWUoKSA9PT0gY29tbWFuZCk7XG5cbiAgICAgIGlmICghY29tbWFuZEV4aXN0cykge1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7IC8vIEVtcHR5IGxpbmVcbiAgICAgICAgcHJpbnRFcnJvcihgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YCk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgICAgICBwcmludEluZm8oJ0F2YWlsYWJsZSBjb21tYW5kczonKTtcbiAgICAgICAgcHJvZ3JhbS5jb21tYW5kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAg4oCiICR7Y21kLm5hbWUoKX0gLSAke2NtZC5kZXNjcmlwdGlvbigpfWApO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc29sZS5sb2coJycpOyAvLyBFbXB0eSBsaW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcmludERlYnVnKCdDb21tYW5kIGxpbmUgYXJndW1lbnRzIHBhcnNlZCBzdWNjZXNzZnVsbHknKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKHByb2dyYW0ub3B0cygpKSxcbiAgICAgIGV4aXQ6IHRydWUsXG4gICAgICBjb250ZXh0OiB7XG4gICAgICAgIHN0YWdlOiAnYXJndW1lbnQtcGFyc2luZycsXG4gICAgICAgIGFyZ3Y6IHByb2Nlc3MuYXJndixcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBNYWluIENMSSBlbnRyeSBwb2ludFxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0xJIGluaXRpYWxpemF0aW9uIG9wdGlvbnNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gU3RhbmRhcmQgaW5pdGlhbGl6YXRpb25cbiAqIG1haW4oKTtcbiAqXG4gKiAvLyBNaW5pbWFsIG1vZGVcbiAqIG1haW4oeyBtaW5pbWFsQmFubmVyOiB0cnVlLCBxdWlldDogdHJ1ZSB9KTtcbiAqXG4gKiAvLyBEZWJ1ZyBtb2RlXG4gKiBtYWluKHsgZGVidWc6IHRydWUsIHZlcmJvc2U6IHRydWUgfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1haW4ob3B0aW9uczogQ2xpT3B0aW9ucyA9IHt9KTogdm9pZCB7XG4gIHRyeSB7XG4gICAgLy8gSW5pdGlhbGl6ZSBDTElcbiAgICBpbml0aWFsaXplQ2xpKG9wdGlvbnMpO1xuXG4gICAgLy8gUGFyc2UgYXJndW1lbnRzIGFuZCBleGVjdXRlIGNvbW1hbmRcbiAgICBwYXJzZUFyZ3VtZW50cygpO1xuXG4gICAgLy8gSWYgd2UgcmVhY2ggaGVyZSwgY29tbWFuZCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgcHJpbnREZWJ1ZygnQ0xJIGV4ZWN1dGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gRmluYWwgY2F0Y2gtYWxsIGVycm9yIGhhbmRsZXJcbiAgICBjb25zb2xlLmVycm9yKCcnKTsgLy8gRW1wdHkgbGluZVxuICAgIHByaW50RXJyb3IoJ0ZhdGFsIENMSSBlcnJvcicsIHtcbiAgICAgIGVycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgfSk7XG5cbiAgICBoYW5kbGVFcnJvcihlcnJvciwgRVJST1JfQ09ERVMuR0VORVJBTCwge1xuICAgICAgZGVidWc6IGlzRGVidWdNb2RlKG9wdGlvbnMpLFxuICAgICAgZXhpdDogdHJ1ZSxcbiAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgc3RhZ2U6ICdtYWluJyxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSdW4gQ0xJIGlmIGV4ZWN1dGVkIGRpcmVjdGx5XG4gKi9cbmlmIChyZXF1aXJlLm1haW4gPT09IG1vZHVsZSkge1xuICAvLyBQYXJzZSBDTEkgb3B0aW9ucyBmcm9tIGVudmlyb25tZW50IG9yIGNvbW1hbmQgbGluZVxuICBjb25zdCBvcHRpb25zOiBDbGlPcHRpb25zID0ge1xuICAgIGRlYnVnOiBwcm9jZXNzLmVudi5ERUJVRyA9PT0gJ3RydWUnLFxuICAgIHF1aWV0OiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tcXVpZXQnKSxcbiAgICB2ZXJib3NlOiBwcm9jZXNzLmFyZ3YuaW5jbHVkZXMoJy0tdmVyYm9zZScpLFxuICAgIG5vQ29sb3I6IHByb2Nlc3MuYXJndi5pbmNsdWRlcygnLS1uby1jb2xvcicpIHx8IHByb2Nlc3MuZW52Lk5PX0NPTE9SID09PSAnMScsXG4gIH07XG5cbiAgbWFpbihvcHRpb25zKTtcbn0iXX0=
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
/**
|
|
3
|
+
* Registers the `bootstrap` command with the CLI program.
|
|
4
|
+
*
|
|
5
|
+
* Provisions the CDK toolkit stack in the target AWS account/region
|
|
6
|
+
* so that CDK deployments can proceed.
|
|
7
|
+
*
|
|
8
|
+
* @param program - The root Commander program instance to attach the command to.
|
|
9
|
+
*/
|
|
10
|
+
export declare function bootstrap(program: Command): void;
|
|
11
|
+
//# sourceMappingURL=bootstrap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../src/commands/bootstrap.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsEpC;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+FhD"}
|