@oflow-ai/oflow-cli 0.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.
@@ -0,0 +1,467 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.isSlashCommand = isSlashCommand;
40
+ exports.executeSlashCommand = executeSlashCommand;
41
+ const chalk_1 = __importDefault(require("chalk"));
42
+ const core_1 = require("@oflow-ai/core");
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ function isSlashCommand(input) {
46
+ return input.startsWith('/');
47
+ }
48
+ async function executeSlashCommand(input, context) {
49
+ const [command, ...args] = input.split(' ');
50
+ const argString = args.join(' ');
51
+ switch (command.toLowerCase()) {
52
+ case '/help':
53
+ return showHelp();
54
+ case '/exit':
55
+ case '/quit':
56
+ case '/q':
57
+ return false;
58
+ case '/clear':
59
+ return clearConversation(context);
60
+ case '/init':
61
+ return initProject(context);
62
+ case '/model':
63
+ return showOrSetModel(argString, context);
64
+ case '/config':
65
+ return showConfig(context);
66
+ case '/reset':
67
+ return resetConfig(context);
68
+ case '/history':
69
+ return showHistory(context);
70
+ case '/tools':
71
+ return showTools();
72
+ case '/version':
73
+ return showVersion();
74
+ case '/agents':
75
+ return showAgents();
76
+ case '/sandbox':
77
+ return showSandboxInfo();
78
+ case '/skills':
79
+ return showSkills(argString);
80
+ case '/mcp':
81
+ return showMCPInfo();
82
+ case '/memory':
83
+ return showMemory();
84
+ case '/commit':
85
+ return generateCommit(context);
86
+ case '/review':
87
+ return reviewCode(context);
88
+ case '/thinking':
89
+ return toggleThinking(context);
90
+ default:
91
+ console.log(chalk_1.default.yellow(`Unknown command: ${command}`));
92
+ console.log(chalk_1.default.gray('Type /help for available commands.'));
93
+ return true;
94
+ }
95
+ }
96
+ function showHelp() {
97
+ console.log('');
98
+ console.log(chalk_1.default.bold('Available Commands:'));
99
+ console.log('');
100
+ const commands = [
101
+ { cmd: '/help', desc: 'Show this help message' },
102
+ { cmd: '/exit, /quit, /q', desc: 'Exit oflow CLI' },
103
+ { cmd: '/clear', desc: 'Clear conversation history' },
104
+ { cmd: '/init', desc: 'Analyze and initialize current project' },
105
+ { cmd: '/model [name]', desc: 'Show or set the current model' },
106
+ { cmd: '/thinking', desc: 'Toggle thinking process display (ON/OFF)' },
107
+ { cmd: '/config', desc: 'Show current configuration' },
108
+ { cmd: '/reset', desc: 'Reset configuration to defaults' },
109
+ { cmd: '/history', desc: 'Show conversation history' },
110
+ { cmd: '/tools', desc: 'List available tools' },
111
+ { cmd: '/agents', desc: 'List available sub-agents' },
112
+ { cmd: '/sandbox', desc: 'Show sandbox status' },
113
+ { cmd: '/skills [list|refresh]', desc: 'Manage skills' },
114
+ { cmd: '/mcp', desc: 'Show MCP server status' },
115
+ { cmd: '/memory', desc: 'Show saved memories' },
116
+ { cmd: '/commit', desc: 'Generate commit message' },
117
+ { cmd: '/review', desc: 'Review recent code changes' },
118
+ { cmd: '/version', desc: 'Show version information' }
119
+ ];
120
+ commands.forEach(({ cmd, desc }) => {
121
+ console.log(` ${chalk_1.default.cyan(cmd.padEnd(20))} ${chalk_1.default.gray(desc)}`);
122
+ });
123
+ console.log('');
124
+ console.log(chalk_1.default.bold('Special Syntax:'));
125
+ console.log(` ${chalk_1.default.cyan('!command')} ${chalk_1.default.gray('Execute a shell command')}`);
126
+ console.log(` ${chalk_1.default.cyan('@filepath')} ${chalk_1.default.gray('Reference a file in your message')}`);
127
+ console.log(` ${chalk_1.default.cyan('$agent')} ${chalk_1.default.gray('Call a sub-agent (e.g., $explore-agent "task")')}`);
128
+ console.log('');
129
+ return true;
130
+ }
131
+ function clearConversation(context) {
132
+ context.conversation.clear();
133
+ console.log(chalk_1.default.green('✓ Conversation history cleared.'));
134
+ return true;
135
+ }
136
+ async function initProject(context) {
137
+ const workingDir = process.cwd();
138
+ const projectName = path.basename(workingDir);
139
+ console.log(chalk_1.default.cyan(`\nAnalyzing project: ${projectName}\n`));
140
+ // Check for common project files
141
+ const checks = [
142
+ { file: 'package.json', type: 'Node.js' },
143
+ { file: 'tsconfig.json', type: 'TypeScript' },
144
+ { file: 'pyproject.toml', type: 'Python (modern)' },
145
+ { file: 'requirements.txt', type: 'Python' },
146
+ { file: 'Cargo.toml', type: 'Rust' },
147
+ { file: 'go.mod', type: 'Go' },
148
+ { file: 'pom.xml', type: 'Java (Maven)' },
149
+ { file: 'build.gradle', type: 'Java (Gradle)' },
150
+ { file: '.git', type: 'Git repository' }
151
+ ];
152
+ const detected = [];
153
+ for (const check of checks) {
154
+ const filePath = path.join(workingDir, check.file);
155
+ if (fs.existsSync(filePath)) {
156
+ detected.push(check.type);
157
+ }
158
+ }
159
+ if (detected.length > 0) {
160
+ console.log(chalk_1.default.bold('Detected project types:'));
161
+ detected.forEach(t => console.log(` • ${t}`));
162
+ }
163
+ else {
164
+ console.log(chalk_1.default.yellow('No recognized project type detected.'));
165
+ }
166
+ // List top-level files and directories
167
+ console.log(chalk_1.default.bold('\nProject structure:'));
168
+ const entries = fs.readdirSync(workingDir, { withFileTypes: true });
169
+ entries.slice(0, 20).forEach(entry => {
170
+ const prefix = entry.isDirectory() ? '📁 ' : '📄 ';
171
+ console.log(` ${prefix}${entry.name}`);
172
+ });
173
+ if (entries.length > 20) {
174
+ console.log(chalk_1.default.gray(` ... and ${entries.length - 20} more items`));
175
+ }
176
+ console.log('');
177
+ // Add init context to conversation
178
+ const initMessage = `Please analyze the current project structure and provide:
179
+ 1. A brief overview of the project type and purpose
180
+ 2. Key files and their roles
181
+ 3. Suggestions for improvements or best practices
182
+
183
+ Working directory: ${workingDir}
184
+ Detected types: ${detected.join(', ')}`;
185
+ try {
186
+ await context.conversation.sendMessage(initMessage);
187
+ }
188
+ catch (error) {
189
+ console.log(chalk_1.default.red('Error during analysis.'));
190
+ }
191
+ return true;
192
+ }
193
+ function showOrSetModel(modelName, context) {
194
+ if (modelName) {
195
+ context.configManager.setDefaultModel(modelName);
196
+ console.log(chalk_1.default.green(`✓ Model set to: ${modelName}`));
197
+ }
198
+ else {
199
+ const currentModel = context.configManager.getDefaultModel();
200
+ console.log(chalk_1.default.cyan(`Current model: ${currentModel}`));
201
+ console.log('');
202
+ console.log('Available models:');
203
+ const models = ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'gpt-3.5-turbo', 'o1-preview', 'o1-mini'];
204
+ models.forEach(m => {
205
+ if (m === currentModel) {
206
+ console.log(chalk_1.default.green(` * ${m} (current)`));
207
+ }
208
+ else {
209
+ console.log(` ${m}`);
210
+ }
211
+ });
212
+ }
213
+ return true;
214
+ }
215
+ function showConfig(context) {
216
+ const config = context.configManager.getAll();
217
+ console.log(chalk_1.default.bold('\nCurrent Configuration:'));
218
+ console.log(JSON.stringify(config, null, 2));
219
+ console.log('');
220
+ console.log(chalk_1.default.gray(`Config file: ${context.configManager.getConfigPath()}`));
221
+ return true;
222
+ }
223
+ function resetConfig(context) {
224
+ context.configManager.clear();
225
+ console.log(chalk_1.default.green('✓ Configuration reset to defaults.'));
226
+ console.log(chalk_1.default.yellow('You will need to run `oflow auth` to reconfigure authentication.'));
227
+ return false; // Exit to force re-auth
228
+ }
229
+ function showHistory(context) {
230
+ const messages = context.conversation.getMessages();
231
+ if (messages.length === 0) {
232
+ console.log(chalk_1.default.gray('No conversation history.'));
233
+ return true;
234
+ }
235
+ console.log(chalk_1.default.bold('\nConversation History:'));
236
+ console.log('');
237
+ messages.forEach((msg, index) => {
238
+ if (msg.role === 'system')
239
+ return;
240
+ const roleColors = {
241
+ user: chalk_1.default.green,
242
+ assistant: chalk_1.default.blue,
243
+ tool: chalk_1.default.gray
244
+ };
245
+ const color = roleColors[msg.role] || chalk_1.default.white;
246
+ const preview = typeof msg.content === 'string'
247
+ ? msg.content.substring(0, 100) + (msg.content.length > 100 ? '...' : '')
248
+ : '[complex content]';
249
+ console.log(`${index}. ${color(msg.role)}: ${preview}`);
250
+ });
251
+ console.log('');
252
+ return true;
253
+ }
254
+ function showTools() {
255
+ console.log(chalk_1.default.bold('\nAvailable Tools:'));
256
+ console.log('');
257
+ const tools = [
258
+ { name: 'read_file', desc: 'Read file contents' },
259
+ { name: 'write_file', desc: 'Write to files' },
260
+ { name: 'list_directory', desc: 'List directory contents' },
261
+ { name: 'glob', desc: 'Find files by pattern' },
262
+ { name: 'search_file_content', desc: 'Search within files' },
263
+ { name: 'run_shell_command', desc: 'Execute shell commands' },
264
+ { name: 'web_search', desc: 'Search the web' },
265
+ { name: 'web_fetch', desc: 'Fetch web content' },
266
+ { name: 'replace', desc: 'Replace text in files' },
267
+ { name: 'image_read', desc: 'Analyze images with VL models' },
268
+ { name: 'pdf_extract', desc: 'Extract content from PDFs' },
269
+ { name: 'ask_user_question', desc: 'Ask user for input' },
270
+ { name: 'task', desc: 'Launch sub-agents' },
271
+ { name: 'save_memory', desc: 'Save information for future' }
272
+ ];
273
+ tools.forEach(({ name, desc }) => {
274
+ console.log(` ${chalk_1.default.cyan(name.padEnd(20))} ${chalk_1.default.gray(desc)}`);
275
+ });
276
+ console.log('');
277
+ return true;
278
+ }
279
+ function showVersion() {
280
+ const packageJsonPath = path.join(__dirname, '..', '..', 'package.json');
281
+ try {
282
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
283
+ console.log(chalk_1.default.cyan(`oflow CLI v${packageJson.version}`));
284
+ }
285
+ catch {
286
+ console.log(chalk_1.default.cyan('oflow CLI (version unknown)'));
287
+ }
288
+ return true;
289
+ }
290
+ function showAgents() {
291
+ console.log(chalk_1.default.bold('\nAvailable Sub-Agents:'));
292
+ console.log('');
293
+ const agents = Object.values(core_1.AGENT_DEFINITIONS);
294
+ agents.forEach(agent => {
295
+ console.log(` ${chalk_1.default.cyan(`$${agent.type}`)}`);
296
+ console.log(` ${chalk_1.default.gray(agent.description)}`);
297
+ console.log(` Tools: ${agent.allowedTools === '*' ? 'all' : agent.allowedTools.join(', ')}`);
298
+ console.log('');
299
+ });
300
+ console.log(chalk_1.default.gray('Usage: $agent-type "your task here"'));
301
+ console.log('');
302
+ return true;
303
+ }
304
+ async function showSandboxInfo() {
305
+ console.log(chalk_1.default.bold('\nSandbox Status:'));
306
+ console.log('');
307
+ try {
308
+ const backend = await (0, core_1.createSandboxExecutor)();
309
+ console.log(` Backend: ${chalk_1.default.cyan(backend ? 'available' : 'unavailable')}`);
310
+ console.log(` Mode: ${chalk_1.default.cyan(backend ? backend['config']?.backend || 'none' : 'none')}`);
311
+ }
312
+ catch {
313
+ console.log(' Backend: ' + chalk_1.default.yellow('not available'));
314
+ }
315
+ console.log('');
316
+ console.log(chalk_1.default.gray('Enable with: oflow --sandbox'));
317
+ console.log('');
318
+ return true;
319
+ }
320
+ function showSkills(subCommand) {
321
+ console.log(chalk_1.default.bold('\nSkills System:'));
322
+ console.log('');
323
+ if (subCommand === 'list' || !subCommand) {
324
+ console.log('Skills allow extending oflow with specialized capabilities.');
325
+ console.log('');
326
+ console.log(chalk_1.default.bold('Available Skill Categories:'));
327
+ console.log(' • Document Processing (pdf, docx, pptx)');
328
+ console.log(' • Creative Tools (algorithmic-art, canvas-design)');
329
+ console.log(' • Development Tools (mcp-builder, skill-creator)');
330
+ console.log('');
331
+ console.log(chalk_1.default.gray('Skills are stored in:'));
332
+ console.log(chalk_1.default.gray(' Global: ~/.oflow/skills/'));
333
+ console.log(chalk_1.default.gray(' Project: ./.oflow/skills/'));
334
+ }
335
+ else if (subCommand === 'refresh') {
336
+ console.log(chalk_1.default.green('✓ Skills registry refreshed.'));
337
+ }
338
+ else {
339
+ console.log(chalk_1.default.yellow(`Unknown subcommand: ${subCommand}`));
340
+ console.log(chalk_1.default.gray('Usage: /skills [list|refresh]'));
341
+ }
342
+ console.log('');
343
+ return true;
344
+ }
345
+ function showMCPInfo() {
346
+ console.log(chalk_1.default.bold('\nMCP (Model Context Protocol) Status:'));
347
+ console.log('');
348
+ console.log('MCP allows extending oflow with external tool servers.');
349
+ console.log('');
350
+ console.log(chalk_1.default.bold('Configuration:'));
351
+ console.log(chalk_1.default.gray('Add servers to ~/.oflow/settings.json:'));
352
+ console.log('');
353
+ console.log(chalk_1.default.cyan(`{
354
+ "mcpServers": {
355
+ "my_server": {
356
+ "command": "npx",
357
+ "args": ["-y", "my-mcp-server"]
358
+ }
359
+ }
360
+ }`));
361
+ console.log('');
362
+ return true;
363
+ }
364
+ function showMemory() {
365
+ console.log(chalk_1.default.bold('\nSaved Memories:'));
366
+ console.log('');
367
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
368
+ const memoryFile = path.join(homeDir, '.oflow', 'memory.json');
369
+ try {
370
+ if (fs.existsSync(memoryFile)) {
371
+ const content = fs.readFileSync(memoryFile, 'utf-8');
372
+ const memories = JSON.parse(content);
373
+ if (memories.length === 0) {
374
+ console.log(chalk_1.default.gray('No memories saved.'));
375
+ }
376
+ else {
377
+ memories.forEach((m, i) => {
378
+ console.log(`${i + 1}. ${chalk_1.default.white(m.fact)}`);
379
+ console.log(` ${chalk_1.default.gray(new Date(m.createdAt).toLocaleString())}`);
380
+ console.log('');
381
+ });
382
+ }
383
+ }
384
+ else {
385
+ console.log(chalk_1.default.gray('No memories saved.'));
386
+ }
387
+ }
388
+ catch {
389
+ console.log(chalk_1.default.yellow('Could not read memory file.'));
390
+ }
391
+ console.log('');
392
+ return true;
393
+ }
394
+ async function generateCommit(context) {
395
+ console.log(chalk_1.default.cyan('\nGenerating commit message...'));
396
+ console.log('');
397
+ // 检查是否是git仓库
398
+ const gitDir = path.join(process.cwd(), '.git');
399
+ if (!fs.existsSync(gitDir)) {
400
+ console.log(chalk_1.default.yellow('Not a git repository.'));
401
+ return true;
402
+ }
403
+ const commitPrompt = `Please analyze the current git repository state and generate an appropriate commit message.
404
+
405
+ Working directory: ${process.cwd()}
406
+
407
+ Steps:
408
+ 1. Run 'git status' to see changed files
409
+ 2. Run 'git diff --staged' to see staged changes (if any)
410
+ 3. Run 'git diff' to see unstaged changes
411
+ 4. Generate a clear, concise commit message following conventional commit format
412
+
413
+ Provide the commit message as your response.`;
414
+ try {
415
+ await context.conversation.sendMessage(commitPrompt);
416
+ }
417
+ catch (error) {
418
+ console.log(chalk_1.default.red('Error generating commit message.'));
419
+ }
420
+ return true;
421
+ }
422
+ async function reviewCode(context) {
423
+ console.log(chalk_1.default.cyan('\nReviewing recent changes...'));
424
+ console.log('');
425
+ // 检查是否是git仓库
426
+ const gitDir = path.join(process.cwd(), '.git');
427
+ if (!fs.existsSync(gitDir)) {
428
+ console.log(chalk_1.default.yellow('Not a git repository.'));
429
+ return true;
430
+ }
431
+ const reviewPrompt = `Please review the recent code changes in this repository.
432
+
433
+ Working directory: ${process.cwd()}
434
+
435
+ Steps:
436
+ 1. Run 'git log -5 --oneline' to see recent commits
437
+ 2. Run 'git diff HEAD~1 HEAD' to see the latest changes
438
+ 3. Review the code for:
439
+ - Potential bugs
440
+ - Security vulnerabilities
441
+ - Code style issues
442
+ - Performance concerns
443
+ - Best practice violations
444
+
445
+ Provide a structured review with specific findings and suggestions.`;
446
+ try {
447
+ await context.conversation.sendMessage(reviewPrompt);
448
+ }
449
+ catch (error) {
450
+ console.log(chalk_1.default.red('Error during code review.'));
451
+ }
452
+ return true;
453
+ }
454
+ function toggleThinking(context) {
455
+ const newValue = context.configManager.toggleShowThinking();
456
+ console.log('');
457
+ console.log(chalk_1.default.green(`✓ Thinking process display: ${newValue ? chalk_1.default.cyan('ON') : chalk_1.default.gray('OFF')}`));
458
+ console.log('');
459
+ if (newValue) {
460
+ console.log(chalk_1.default.gray('The AI will now show its thinking/reasoning process (for supported models like DeepSeek Reasoner).'));
461
+ }
462
+ else {
463
+ console.log(chalk_1.default.gray('The AI thinking process is now hidden.'));
464
+ }
465
+ return true;
466
+ }
467
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSx3Q0FFQztBQUVELGtEQXFFQztBQXJGRCxrREFBMEI7QUFDMUIseUNBQXFIO0FBRXJILHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFRN0IsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFTSxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLEtBQWEsRUFDYixPQUF1QjtJQUV2QixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpDLFFBQVEsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDOUIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUVwQixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxJQUFJO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFFZixLQUFLLFFBQVE7WUFDWCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLEtBQUssT0FBTztZQUNWLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLEtBQUssUUFBUTtZQUNYLE9BQU8sY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU1QyxLQUFLLFNBQVM7WUFDWixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QixLQUFLLFFBQVE7WUFDWCxPQUFPLFdBQVcsQ0FBQyxP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LENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IHsgQ29udmVyc2F0aW9uLCBDb25maWdNYW5hZ2VyLCBBZ2VudEZhY3RvcnksIEFHRU5UX0RFRklOSVRJT05TLCBjcmVhdGVTYW5kYm94RXhlY3V0b3IgfSBmcm9tICdAb2Zsb3ctYWkvY29yZSc7XG5pbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRDb250ZXh0IHtcbiAgY29udmVyc2F0aW9uOiBDb252ZXJzYXRpb247XG4gIHJsOiByZWFkbGluZS5JbnRlcmZhY2U7XG4gIGNvbmZpZ01hbmFnZXI6IENvbmZpZ01hbmFnZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1NsYXNoQ29tbWFuZChpbnB1dDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dC5zdGFydHNXaXRoKCcvJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlU2xhc2hDb21tYW5kKFxuICBpbnB1dDogc3RyaW5nLFxuICBjb250ZXh0OiBDb21tYW5kQ29udGV4dFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IFtjb21tYW5kLCAuLi5hcmdzXSA9IGlucHV0LnNwbGl0KCcgJyk7XG4gIGNvbnN0IGFyZ1N0cmluZyA9IGFyZ3Muam9pbignICcpO1xuXG4gIHN3aXRjaCAoY29tbWFuZC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgY2FzZSAnL2hlbHAnOlxuICAgICAgcmV0dXJuIHNob3dIZWxwKCk7XG4gICAgXG4gICAgY2FzZSAnL2V4aXQnOlxuICAgIGNhc2UgJy9xdWl0JzpcbiAgICBjYXNlICcvcSc6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgXG4gICAgY2FzZSAnL2NsZWFyJzpcbiAgICAgIHJldHVybiBjbGVhckNvbnZlcnNhdGlvbihjb250ZXh0KTtcbiAgICBcbiAgICBjYXNlICcvaW5pdCc6XG4gICAgICByZXR1cm4gaW5pdFByb2plY3QoY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL21vZGVsJzpcbiAgICAgIHJldHVybiBzaG93T3JTZXRNb2RlbChhcmdTdHJpbmcsIGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy9jb25maWcnOlxuICAgICAgcmV0dXJuIHNob3dDb25maWcoY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL3Jlc2V0JzpcbiAgICAgIHJldHVybiByZXNldENvbmZpZyhjb250ZXh0KTtcbiAgICBcbiAgICBjYXNlICcvaGlzdG9yeSc6XG4gICAgICByZXR1cm4gc2hvd0hpc3RvcnkoY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL3Rvb2xzJzpcbiAgICAgIHJldHVybiBzaG93VG9vbHMoKTtcbiAgICBcbiAgICBjYXNlICcvdmVyc2lvbic6XG4gICAgICByZXR1cm4gc2hvd1ZlcnNpb24oKTtcbiAgICBcbiAgICBjYXNlICcvYWdlbnRzJzpcbiAgICAgIHJldHVybiBzaG93QWdlbnRzKCk7XG4gICAgXG4gICAgY2FzZSAnL3NhbmRib3gnOlxuICAgICAgcmV0dXJuIHNob3dTYW5kYm94SW5mbygpO1xuICAgIFxuICAgIGNhc2UgJy9za2lsbHMnOlxuICAgICAgcmV0dXJuIHNob3dTa2lsbHMoYXJnU3RyaW5nKTtcbiAgICBcbiAgICBjYXNlICcvbWNwJzpcbiAgICAgIHJldHVybiBzaG93TUNQSW5mbygpO1xuICAgIFxuICAgIGNhc2UgJy9tZW1vcnknOlxuICAgICAgcmV0dXJuIHNob3dNZW1vcnkoKTtcbiAgICBcbiAgICBjYXNlICcvY29tbWl0JzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvbW1pdChjb250ZXh0KTtcbiAgICBcbiAgICBjYXNlICcvcmV2aWV3JzpcbiAgICAgIHJldHVybiByZXZpZXdDb2RlKGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy90aGlua2luZyc6XG4gICAgICByZXR1cm4gdG9nZ2xlVGhpbmtpbmcoY29udGV4dCk7XG4gICAgXG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YCkpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVHlwZSAvaGVscCBmb3IgYXZhaWxhYmxlIGNvbW1hbmRzLicpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0F2YWlsYWJsZSBDb21tYW5kczonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgIHsgY21kOiAnL2hlbHAnLCBkZXNjOiAnU2hvdyB0aGlzIGhlbHAgbWVzc2FnZScgfSxcbiAgICB7IGNtZDogJy9leGl0LCAvcXVpdCwgL3EnLCBkZXNjOiAnRXhpdCBvZmxvdyBDTEknIH0sXG4gICAgeyBjbWQ6ICcvY2xlYXInLCBkZXNjOiAnQ2xlYXIgY29udmVyc2F0aW9uIGhpc3RvcnknIH0sXG4gICAgeyBjbWQ6ICcvaW5pdCcsIGRlc2M6ICdBbmFseXplIGFuZCBpbml0aWFsaXplIGN1cnJlbnQgcHJvamVjdCcgfSxcbiAgICB7IGNtZDogJy9tb2RlbCBbbmFtZV0nLCBkZXNjOiAnU2hvdyBvciBzZXQgdGhlIGN1cnJlbnQgbW9kZWwnIH0sXG4gICAgeyBjbWQ6ICcvdGhpbmtpbmcnLCBkZXNjOiAnVG9nZ2xlIHRoaW5raW5nIHByb2Nlc3MgZGlzcGxheSAoT04vT0ZGKScgfSxcbiAgICB7IGNtZDogJy9jb25maWcnLCBkZXNjOiAnU2hvdyBjdXJyZW50IGNvbmZpZ3VyYXRpb24nIH0sXG4gICAgeyBjbWQ6ICcvcmVzZXQnLCBkZXNjOiAnUmVzZXQgY29uZmlndXJhdGlvbiB0byBkZWZhdWx0cycgfSxcbiAgICB7IGNtZDogJy9oaXN0b3J5JywgZGVzYzogJ1Nob3cgY29udmVyc2F0aW9uIGhpc3RvcnknIH0sXG4gICAgeyBjbWQ6ICcvdG9vbHMnLCBkZXNjOiAnTGlzdCBhdmFpbGFibGUgdG9vbHMnIH0sXG4gICAgeyBjbWQ6ICcvYWdlbnRzJywgZGVzYzogJ0xpc3QgYXZhaWxhYmxlIHN1Yi1hZ2VudHMnIH0sXG4gICAgeyBjbWQ6ICcvc2FuZGJveCcsIGRlc2M6ICdTaG93IHNhbmRib3ggc3RhdHVzJyB9LFxuICAgIHsgY21kOiAnL3NraWxscyBbbGlzdHxyZWZyZXNoXScsIGRlc2M6ICdNYW5hZ2Ugc2tpbGxzJyB9LFxuICAgIHsgY21kOiAnL21jcCcsIGRlc2M6ICdTaG93IE1DUCBzZXJ2ZXIgc3RhdHVzJyB9LFxuICAgIHsgY21kOiAnL21lbW9yeScsIGRlc2M6ICdTaG93IHNhdmVkIG1lbW9yaWVzJyB9LFxuICAgIHsgY21kOiAnL2NvbW1pdCcsIGRlc2M6ICdHZW5lcmF0ZSBjb21taXQgbWVzc2FnZScgfSxcbiAgICB7IGNtZDogJy9yZXZpZXcnLCBkZXNjOiAnUmV2aWV3IHJlY2VudCBjb2RlIGNoYW5nZXMnIH0sXG4gICAgeyBjbWQ6ICcvdmVyc2lvbicsIGRlc2M6ICdTaG93IHZlcnNpb24gaW5mb3JtYXRpb24nIH1cbiAgXTtcblxuICBjb21tYW5kcy5mb3JFYWNoKCh7IGNtZCwgZGVzYyB9KSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5jeWFuKGNtZC5wYWRFbmQoMjApKX0gJHtjaGFsay5ncmF5KGRlc2MpfWApO1xuICB9KTtcblxuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1NwZWNpYWwgU3ludGF4OicpKTtcbiAgY29uc29sZS5sb2coYCAgJHtjaGFsay5jeWFuKCchY29tbWFuZCcpfSAgICAke2NoYWxrLmdyYXkoJ0V4ZWN1dGUgYSBzaGVsbCBjb21tYW5kJyl9YCk7XG4gIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuY3lhbignQGZpbGVwYXRoJyl9ICAgJHtjaGFsay5ncmF5KCdSZWZlcmVuY2UgYSBmaWxlIGluIHlvdXIgbWVzc2FnZScpfWApO1xuICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmN5YW4oJyRhZ2VudCcpfSAgICAgICR7Y2hhbGsuZ3JheSgnQ2FsbCBhIHN1Yi1hZ2VudCAoZS5nLiwgJGV4cGxvcmUtYWdlbnQgXCJ0YXNrXCIpJyl9YCk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjbGVhckNvbnZlcnNhdGlvbihjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IGJvb2xlYW4ge1xuICBjb250ZXh0LmNvbnZlcnNhdGlvbi5jbGVhcigpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbign4pyTIENvbnZlcnNhdGlvbiBoaXN0b3J5IGNsZWFyZWQuJykpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdFByb2plY3QoY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gIGNvbnN0IHByb2plY3ROYW1lID0gcGF0aC5iYXNlbmFtZSh3b3JraW5nRGlyKTtcbiAgXG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbkFuYWx5emluZyBwcm9qZWN0OiAke3Byb2plY3ROYW1lfVxcbmApKTtcbiAgXG4gIC8vIENoZWNrIGZvciBjb21tb24gcHJvamVjdCBmaWxlc1xuICBjb25zdCBjaGVja3MgPSBbXG4gICAgeyBmaWxlOiAncGFja2FnZS5qc29uJywgdHlwZTogJ05vZGUuanMnIH0sXG4gICAgeyBmaWxlOiAndHNjb25maWcuanNvbicsIHR5cGU6ICdUeXBlU2NyaXB0JyB9LFxuICAgIHsgZmlsZTogJ3B5cHJvamVjdC50b21sJywgdHlwZTogJ1B5dGhvbiAobW9kZXJuKScgfSxcbiAgICB7IGZpbGU6ICdyZXF1aXJlbWVudHMudHh0JywgdHlwZTogJ1B5dGhvbicgfSxcbiAgICB7IGZpbGU6ICdDYXJnby50b21sJywgdHlwZTogJ1J1c3QnIH0sXG4gICAgeyBmaWxlOiAnZ28ubW9kJywgdHlwZTogJ0dvJyB9LFxuICAgIHsgZmlsZTogJ3BvbS54bWwnLCB0eXBlOiAnSmF2YSAoTWF2ZW4pJyB9LFxuICAgIHsgZmlsZTogJ2J1aWxkLmdyYWRsZScsIHR5cGU6ICdKYXZhIChHcmFkbGUpJyB9LFxuICAgIHsgZmlsZTogJy5naXQnLCB0eXBlOiAnR2l0IHJlcG9zaXRvcnknIH1cbiAgXTtcblxuICBjb25zdCBkZXRlY3RlZDogc3RyaW5nW10gPSBbXTtcbiAgXG4gIGZvciAoY29uc3QgY2hlY2sgb2YgY2hlY2tzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4od29ya2luZ0RpciwgY2hlY2suZmlsZSk7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICBkZXRlY3RlZC5wdXNoKGNoZWNrLnR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXRlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnRGV0ZWN0ZWQgcHJvamVjdCB0eXBlczonKSk7XG4gICAgZGV0ZWN0ZWQuZm9yRWFjaCh0ID0+IGNvbnNvbGUubG9nKGAgIOKAoiAke3R9YCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnTm8gcmVjb2duaXplZCBwcm9qZWN0IHR5cGUgZGV0ZWN0ZWQuJykpO1xuICB9XG5cbiAgLy8gTGlzdCB0b3AtbGV2ZWwgZmlsZXMgYW5kIGRpcmVjdG9yaWVzXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcblByb2plY3Qgc3RydWN0dXJlOicpKTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKHdvcmtpbmdEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgZW50cmllcy5zbGljZSgwLCAyMCkuZm9yRWFjaChlbnRyeSA9PiB7XG4gICAgY29uc3QgcHJlZml4ID0gZW50cnkuaXNEaXJlY3RvcnkoKSA/ICfwn5OBICcgOiAn8J+ThCAnO1xuICAgIGNvbnNvbGUubG9nKGAgICR7cHJlZml4fSR7ZW50cnkubmFtZX1gKTtcbiAgfSk7XG5cbiAgaWYgKGVudHJpZXMubGVuZ3RoID4gMjApIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIC4uLiBhbmQgJHtlbnRyaWVzLmxlbmd0aCAtIDIwfSBtb3JlIGl0ZW1zYCkpO1xuICB9XG5cbiAgY29uc29sZS5sb2coJycpO1xuXG4gIC8vIEFkZCBpbml0IGNvbnRleHQgdG8gY29udmVyc2F0aW9uXG4gIGNvbnN0IGluaXRNZXNzYWdlID0gYFBsZWFzZSBhbmFseXplIHRoZSBjdXJyZW50IHByb2plY3Qgc3RydWN0dXJlIGFuZCBwcm92aWRlOlxuMS4gQSBicmllZiBvdmVydmlldyBvZiB0aGUgcHJvamVjdCB0eXBlIGFuZCBwdXJwb3NlXG4yLiBLZXkgZmlsZXMgYW5kIHRoZWlyIHJvbGVzXG4zLiBTdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnRzIG9yIGJlc3QgcHJhY3RpY2VzXG5cbldvcmtpbmcgZGlyZWN0b3J5OiAke3dvcmtpbmdEaXJ9XG5EZXRlY3RlZCB0eXBlczogJHtkZXRlY3RlZC5qb2luKCcsICcpfWA7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjb250ZXh0LmNvbnZlcnNhdGlvbi5zZW5kTWVzc2FnZShpbml0TWVzc2FnZSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdFcnJvciBkdXJpbmcgYW5hbHlzaXMuJykpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3dPclNldE1vZGVsKG1vZGVsTmFtZTogc3RyaW5nLCBjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IGJvb2xlYW4ge1xuICBpZiAobW9kZWxOYW1lKSB7XG4gICAgY29udGV4dC5jb25maWdNYW5hZ2VyLnNldERlZmF1bHRNb2RlbChtb2RlbE5hbWUpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgTW9kZWwgc2V0IHRvOiAke21vZGVsTmFtZX1gKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY3VycmVudE1vZGVsID0gY29udGV4dC5jb25maWdNYW5hZ2VyLmdldERlZmF1bHRNb2RlbCgpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYEN1cnJlbnQgbW9kZWw6ICR7Y3VycmVudE1vZGVsfWApKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSBtb2RlbHM6Jyk7XG4gICAgY29uc3QgbW9kZWxzID0gWydncHQtNG8nLCAnZ3B0LTRvLW1pbmknLCAnZ3B0LTQtdHVyYm8nLCAnZ3B0LTMuNS10dXJibycsICdvMS1wcmV2aWV3JywgJ28xLW1pbmknXTtcbiAgICBtb2RlbHMuZm9yRWFjaChtID0+IHtcbiAgICAgIGlmIChtID09PSBjdXJyZW50TW9kZWwpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYCAgKiAke219IChjdXJyZW50KWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGAgICAgJHttfWApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93Q29uZmlnKGNvbnRleHQ6IENvbW1hbmRDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbmZpZyA9IGNvbnRleHQuY29uZmlnTWFuYWdlci5nZXRBbGwoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuQ3VycmVudCBDb25maWd1cmF0aW9uOicpKTtcbiAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY29uZmlnLCBudWxsLCAyKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgQ29uZmlnIGZpbGU6ICR7Y29udGV4dC5jb25maWdNYW5hZ2VyLmdldENvbmZpZ1BhdGgoKX1gKSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXNldENvbmZpZyhjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IGJvb2xlYW4ge1xuICBjb250ZXh0LmNvbmZpZ01hbmFnZXIuY2xlYXIoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDb25maWd1cmF0aW9uIHJlc2V0IHRvIGRlZmF1bHRzLicpKTtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdZb3Ugd2lsbCBuZWVkIHRvIHJ1biBgb2Zsb3cgYXV0aGAgdG8gcmVjb25maWd1cmUgYXV0aGVudGljYXRpb24uJykpO1xuICByZXR1cm4gZmFsc2U7IC8vIEV4aXQgdG8gZm9yY2UgcmUtYXV0aFxufVxuXG5mdW5jdGlvbiBzaG93SGlzdG9yeShjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IGJvb2xlYW4ge1xuICBjb25zdCBtZXNzYWdlcyA9IGNvbnRleHQuY29udmVyc2F0aW9uLmdldE1lc3NhZ2VzKCk7XG4gIFxuICBpZiAobWVzc2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnTm8gY29udmVyc2F0aW9uIGhpc3RvcnkuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuQ29udmVyc2F0aW9uIEhpc3Rvcnk6JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBtZXNzYWdlcy5mb3JFYWNoKChtc2csIGluZGV4KSA9PiB7XG4gICAgaWYgKG1zZy5yb2xlID09PSAnc3lzdGVtJykgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHJvbGVDb2xvcnM6IFJlY29yZDxzdHJpbmcsIGNoYWxrLkNoYWxrPiA9IHtcbiAgICAgIHVzZXI6IGNoYWxrLmdyZWVuLFxuICAgICAgYXNzaXN0YW50OiBjaGFsay5ibHVlLFxuICAgICAgdG9vbDogY2hhbGsuZ3JheVxuICAgIH07XG4gICAgXG4gICAgY29uc3QgY29sb3IgPSByb2xlQ29sb3JzW21zZy5yb2xlXSB8fCBjaGFsay53aGl0ZTtcbiAgICBjb25zdCBwcmV2aWV3ID0gdHlwZW9mIG1zZy5jb250ZW50ID09PSAnc3RyaW5nJyBcbiAgICAgID8gbXNnLmNvbnRlbnQuc3Vic3RyaW5nKDAsIDEwMCkgKyAobXNnLmNvbnRlbnQubGVuZ3RoID4gMTAwID8gJy4uLicgOiAnJylcbiAgICAgIDogJ1tjb21wbGV4IGNvbnRlbnRdJztcbiAgICBcbiAgICBjb25zb2xlLmxvZyhgJHtpbmRleH0uICR7Y29sb3IobXNnLnJvbGUpfTogJHtwcmV2aWV3fWApO1xuICB9KTtcblxuICBjb25zb2xlLmxvZygnJyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93VG9vbHMoKTogYm9vbGVhbiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkF2YWlsYWJsZSBUb29sczonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIGNvbnN0IHRvb2xzID0gW1xuICAgIHsgbmFtZTogJ3JlYWRfZmlsZScsIGRlc2M6ICdSZWFkIGZpbGUgY29udGVudHMnIH0sXG4gICAgeyBuYW1lOiAnd3JpdGVfZmlsZScsIGRlc2M6ICdXcml0ZSB0byBmaWxlcycgfSxcbiAgICB7IG5hbWU6ICdsaXN0X2RpcmVjdG9yeScsIGRlc2M6ICdMaXN0IGRpcmVjdG9yeSBjb250ZW50cycgfSxcbiAgICB7IG5hbWU6ICdnbG9iJywgZGVzYzogJ0ZpbmQgZmlsZXMgYnkgcGF0dGVybicgfSxcbiAgICB7IG5hbWU6ICdzZWFyY2hfZmlsZV9jb250ZW50JywgZGVzYzogJ1NlYXJjaCB3aXRoaW4gZmlsZXMnIH0sXG4gICAgeyBuYW1lOiAncnVuX3NoZWxsX2NvbW1hbmQnLCBkZXNjOiAnRXhlY3V0ZSBzaGVsbCBjb21tYW5kcycgfSxcbiAgICB7IG5hbWU6ICd3ZWJfc2VhcmNoJywgZGVzYzogJ1NlYXJjaCB0aGUgd2ViJyB9LFxuICAgIHsgbmFtZTogJ3dlYl9mZXRjaCcsIGRlc2M6ICdGZXRjaCB3ZWIgY29udGVudCcgfSxcbiAgICB7IG5hbWU6ICdyZXBsYWNlJywgZGVzYzogJ1JlcGxhY2UgdGV4dCBpbiBmaWxlcycgfSxcbiAgICB7IG5hbWU6ICdpbWFnZV9yZWFkJywgZGVzYzogJ0FuYWx5emUgaW1hZ2VzIHdpdGggVkwgbW9kZWxzJyB9LFxuICAgIHsgbmFtZTogJ3BkZl9leHRyYWN0JywgZGVzYzogJ0V4dHJhY3QgY29udGVudCBmcm9tIFBERnMnIH0sXG4gICAgeyBuYW1lOiAnYXNrX3VzZXJfcXVlc3Rpb24nLCBkZXNjOiAnQXNrIHVzZXIgZm9yIGlucHV0JyB9LFxuICAgIHsgbmFtZTogJ3Rhc2snLCBkZXNjOiAnTGF1bmNoIHN1Yi1hZ2VudHMnIH0sXG4gICAgeyBuYW1lOiAnc2F2ZV9tZW1vcnknLCBkZXNjOiAnU2F2ZSBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlJyB9XG4gIF07XG5cbiAgdG9vbHMuZm9yRWFjaCgoeyBuYW1lLCBkZXNjIH0pID0+IHtcbiAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmN5YW4obmFtZS5wYWRFbmQoMjApKX0gJHtjaGFsay5ncmF5KGRlc2MpfWApO1xuICB9KTtcblxuICBjb25zb2xlLmxvZygnJyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93VmVyc2lvbigpOiBib29sZWFuIHtcbiAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJy4uJywgJ3BhY2thZ2UuanNvbicpO1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgb2Zsb3cgQ0xJIHYke3BhY2thZ2VKc29uLnZlcnNpb259YCkpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdvZmxvdyBDTEkgKHZlcnNpb24gdW5rbm93biknKSk7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3dBZ2VudHMoKTogYm9vbGVhbiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkF2YWlsYWJsZSBTdWItQWdlbnRzOicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgY29uc3QgYWdlbnRzID0gT2JqZWN0LnZhbHVlcyhBR0VOVF9ERUZJTklUSU9OUyk7XG4gIGFnZW50cy5mb3JFYWNoKGFnZW50ID0+IHtcbiAgICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmN5YW4oYCQke2FnZW50LnR5cGV9YCl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgICAke2NoYWxrLmdyYXkoYWdlbnQuZGVzY3JpcHRpb24pfWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgVG9vbHM6ICR7YWdlbnQuYWxsb3dlZFRvb2xzID09PSAnKicgPyAnYWxsJyA6IGFnZW50LmFsbG93ZWRUb29scy5qb2luKCcsICcpfWApO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVXNhZ2U6ICRhZ2VudC10eXBlIFwieW91ciB0YXNrIGhlcmVcIicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2hvd1NhbmRib3hJbmZvKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5TYW5kYm94IFN0YXR1czonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIHRyeSB7XG4gICAgY29uc3QgYmFja2VuZCA9IGF3YWl0IGNyZWF0ZVNhbmRib3hFeGVjdXRvcigpO1xuICAgIGNvbnNvbGUubG9nKGAgIEJhY2tlbmQ6ICR7Y2hhbGsuY3lhbihiYWNrZW5kID8gJ2F2YWlsYWJsZScgOiAndW5hdmFpbGFibGUnKX1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBNb2RlOiAke2NoYWxrLmN5YW4oYmFja2VuZCA/IGJhY2tlbmRbJ2NvbmZpZyddPy5iYWNrZW5kIHx8ICdub25lJyA6ICdub25lJyl9YCk7XG4gIH0gY2F0Y2gge1xuICAgIGNvbnNvbGUubG9nKCcgIEJhY2tlbmQ6ICcgKyBjaGFsay55ZWxsb3coJ25vdCBhdmFpbGFibGUnKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0VuYWJsZSB3aXRoOiBvZmxvdyAtLXNhbmRib3gnKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3dTa2lsbHMoc3ViQ29tbWFuZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcblNraWxscyBTeXN0ZW06JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBpZiAoc3ViQ29tbWFuZCA9PT0gJ2xpc3QnIHx8ICFzdWJDb21tYW5kKSB7XG4gICAgY29uc29sZS5sb2coJ1NraWxscyBhbGxvdyBleHRlbmRpbmcgb2Zsb3cgd2l0aCBzcGVjaWFsaXplZCBjYXBhYmlsaXRpZXMuJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0F2YWlsYWJsZSBTa2lsbCBDYXRlZ29yaWVzOicpKTtcbiAgICBjb25zb2xlLmxvZygnICDigKIgRG9jdW1lbnQgUHJvY2Vzc2luZyAocGRmLCBkb2N4LCBwcHR4KScpO1xuICAgIGNvbnNvbGUubG9nKCcgIOKAoiBDcmVhdGl2ZSBUb29scyAoYWxnb3JpdGhtaWMtYXJ0LCBjYW52YXMtZGVzaWduKScpO1xuICAgIGNvbnNvbGUubG9nKCcgIOKAoiBEZXZlbG9wbWVudCBUb29scyAobWNwLWJ1aWxkZXIsIHNraWxsLWNyZWF0b3IpJyk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1NraWxscyBhcmUgc3RvcmVkIGluOicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIEdsb2JhbDogfi8ub2Zsb3cvc2tpbGxzLycpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIFByb2plY3Q6IC4vLm9mbG93L3NraWxscy8nKSk7XG4gIH0gZWxzZSBpZiAoc3ViQ29tbWFuZCA9PT0gJ3JlZnJlc2gnKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBTa2lsbHMgcmVnaXN0cnkgcmVmcmVzaGVkLicpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYFVua25vd24gc3ViY29tbWFuZDogJHtzdWJDb21tYW5kfWApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdVc2FnZTogL3NraWxscyBbbGlzdHxyZWZyZXNoXScpKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3dNQ1BJbmZvKCk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5NQ1AgKE1vZGVsIENvbnRleHQgUHJvdG9jb2wpIFN0YXR1czonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIGNvbnNvbGUubG9nKCdNQ1AgYWxsb3dzIGV4dGVuZGluZyBvZmxvdyB3aXRoIGV4dGVybmFsIHRvb2wgc2VydmVycy4nKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdDb25maWd1cmF0aW9uOicpKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnQWRkIHNlcnZlcnMgdG8gfi8ub2Zsb3cvc2V0dGluZ3MuanNvbjonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuY3lhbihge1xuICBcIm1jcFNlcnZlcnNcIjoge1xuICAgIFwibXlfc2VydmVyXCI6IHtcbiAgICAgIFwiY29tbWFuZFwiOiBcIm5weFwiLFxuICAgICAgXCJhcmdzXCI6IFtcIi15XCIsIFwibXktbWNwLXNlcnZlclwiXVxuICAgIH1cbiAgfVxufWApKTtcbiAgY29uc29sZS5sb2coJycpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2hvd01lbW9yeSgpOiBib29sZWFuIHtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuU2F2ZWQgTWVtb3JpZXM6JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBjb25zdCBob21lRGlyID0gcHJvY2Vzcy5lbnYuSE9NRSB8fCBwcm9jZXNzLmVudi5VU0VSUFJPRklMRSB8fCAnJztcbiAgY29uc3QgbWVtb3J5RmlsZSA9IHBhdGguam9pbihob21lRGlyLCAnLm9mbG93JywgJ21lbW9yeS5qc29uJyk7XG4gIFxuICB0cnkge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKG1lbW9yeUZpbGUpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKG1lbW9yeUZpbGUsICd1dGYtOCcpO1xuICAgICAgY29uc3QgbWVtb3JpZXMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgICAgXG4gICAgICBpZiAobWVtb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ05vIG1lbW9yaWVzIHNhdmVkLicpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9yaWVzLmZvckVhY2goKG06IHsgZmFjdDogc3RyaW5nOyBjcmVhdGVkQXQ6IHN0cmluZyB9LCBpOiBudW1iZXIpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7Y2hhbGsud2hpdGUobS5mYWN0KX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgICAgJHtjaGFsay5ncmF5KG5ldyBEYXRlKG0uY3JlYXRlZEF0KS50b0xvY2FsZVN0cmluZygpKX1gKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdObyBtZW1vcmllcyBzYXZlZC4nKSk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ0NvdWxkIG5vdCByZWFkIG1lbW9yeSBmaWxlLicpKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlQ29tbWl0KGNvbnRleHQ6IENvbW1hbmRDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ1xcbkdlbmVyYXRpbmcgY29tbWl0IG1lc3NhZ2UuLi4nKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIC8vIOajgOafpeaYr+WQpuaYr2dpdOS7k+W6k1xuICBjb25zdCBnaXREaXIgPSBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJy5naXQnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGdpdERpcikpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vdCBhIGdpdCByZXBvc2l0b3J5LicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGNvbW1pdFByb21wdCA9IGBQbGVhc2UgYW5hbHl6ZSB0aGUgY3VycmVudCBnaXQgcmVwb3NpdG9yeSBzdGF0ZSBhbmQgZ2VuZXJhdGUgYW4gYXBwcm9wcmlhdGUgY29tbWl0IG1lc3NhZ2UuXG5cbldvcmtpbmcgZGlyZWN0b3J5OiAke3Byb2Nlc3MuY3dkKCl9XG5cblN0ZXBzOlxuMS4gUnVuICdnaXQgc3RhdHVzJyB0byBzZWUgY2hhbmdlZCBmaWxlc1xuMi4gUnVuICdnaXQgZGlmZiAtLXN0YWdlZCcgdG8gc2VlIHN0YWdlZCBjaGFuZ2VzIChpZiBhbnkpXG4zLiBSdW4gJ2dpdCBkaWZmJyB0byBzZWUgdW5zdGFnZWQgY2hhbmdlc1xuNC4gR2VuZXJhdGUgYSBjbGVhciwgY29uY2lzZSBjb21taXQgbWVzc2FnZSBmb2xsb3dpbmcgY29udmVudGlvbmFsIGNvbW1pdCBmb3JtYXRcblxuUHJvdmlkZSB0aGUgY29tbWl0IG1lc3NhZ2UgYXMgeW91ciByZXNwb25zZS5gO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29udGV4dC5jb252ZXJzYXRpb24uc2VuZE1lc3NhZ2UoY29tbWl0UHJvbXB0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ0Vycm9yIGdlbmVyYXRpbmcgY29tbWl0IG1lc3NhZ2UuJykpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJldmlld0NvZGUoY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc29sZS5sb2coY2hhbGsuY3lhbignXFxuUmV2aWV3aW5nIHJlY2VudCBjaGFuZ2VzLi4uJykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICAvLyDmo4Dmn6XmmK/lkKbmmK9naXTku5PlupNcbiAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhnaXREaXIpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdOb3QgYSBnaXQgcmVwb3NpdG9yeS4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCByZXZpZXdQcm9tcHQgPSBgUGxlYXNlIHJldmlldyB0aGUgcmVjZW50IGNvZGUgY2hhbmdlcyBpbiB0aGlzIHJlcG9zaXRvcnkuXG5cbldvcmtpbmcgZGlyZWN0b3J5OiAke3Byb2Nlc3MuY3dkKCl9XG5cblN0ZXBzOlxuMS4gUnVuICdnaXQgbG9nIC01IC0tb25lbGluZScgdG8gc2VlIHJlY2VudCBjb21taXRzXG4yLiBSdW4gJ2dpdCBkaWZmIEhFQUR+MSBIRUFEJyB0byBzZWUgdGhlIGxhdGVzdCBjaGFuZ2VzXG4zLiBSZXZpZXcgdGhlIGNvZGUgZm9yOlxuICAgLSBQb3RlbnRpYWwgYnVnc1xuICAgLSBTZWN1cml0eSB2dWxuZXJhYmlsaXRpZXNcbiAgIC0gQ29kZSBzdHlsZSBpc3N1ZXNcbiAgIC0gUGVyZm9ybWFuY2UgY29uY2VybnNcbiAgIC0gQmVzdCBwcmFjdGljZSB2aW9sYXRpb25zXG5cblByb3ZpZGUgYSBzdHJ1Y3R1cmVkIHJldmlldyB3aXRoIHNwZWNpZmljIGZpbmRpbmdzIGFuZCBzdWdnZXN0aW9ucy5gO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29udGV4dC5jb252ZXJzYXRpb24uc2VuZE1lc3NhZ2UocmV2aWV3UHJvbXB0KTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ0Vycm9yIGR1cmluZyBjb2RlIHJldmlldy4nKSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlVGhpbmtpbmcoY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgbmV3VmFsdWUgPSBjb250ZXh0LmNvbmZpZ01hbmFnZXIudG9nZ2xlU2hvd1RoaW5raW5nKCk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBUaGlua2luZyBwcm9jZXNzIGRpc3BsYXk6ICR7bmV3VmFsdWUgPyBjaGFsay5jeWFuKCdPTicpIDogY2hhbGsuZ3JheSgnT0ZGJyl9YCkpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBpZiAobmV3VmFsdWUpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUaGUgQUkgd2lsbCBub3cgc2hvdyBpdHMgdGhpbmtpbmcvcmVhc29uaW5nIHByb2Nlc3MgKGZvciBzdXBwb3J0ZWQgbW9kZWxzIGxpa2UgRGVlcFNlZWsgUmVhc29uZXIpLicpKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUaGUgQUkgdGhpbmtpbmcgcHJvY2VzcyBpcyBub3cgaGlkZGVuLicpKTtcbiAgfVxuICBcbiAgcmV0dXJuIHRydWU7XG59XG4iXX0=
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};