@oflow-ai/oflow-cli 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +171 -99
- package/dist/commands/index.js +7 -1
- package/dist/updater.d.ts +17 -0
- package/dist/updater.js +167 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -43,8 +43,78 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
43
43
|
const ora_1 = __importDefault(require("ora"));
|
|
44
44
|
const core_1 = require("@oflow-ai/core");
|
|
45
45
|
const commands_1 = require("./commands");
|
|
46
|
+
const updater_1 = require("./updater");
|
|
46
47
|
let sandboxExecutor = null;
|
|
47
48
|
let currentShowThinking = false;
|
|
49
|
+
let sessionStats = {
|
|
50
|
+
toolCallsCount: 0,
|
|
51
|
+
filesRead: [],
|
|
52
|
+
filesWritten: [],
|
|
53
|
+
commandsRun: [],
|
|
54
|
+
startTime: new Date()
|
|
55
|
+
};
|
|
56
|
+
let contextTokens = 0;
|
|
57
|
+
let maxContextTokens = 128000;
|
|
58
|
+
function drawStatusBar(model) {
|
|
59
|
+
const terminalWidth = process.stdout.columns || 80;
|
|
60
|
+
const contextPercent = Math.min(100, Math.round((contextTokens / maxContextTokens) * 100));
|
|
61
|
+
const contextColor = contextPercent > 80 ? chalk_1.default.red : contextPercent > 50 ? chalk_1.default.yellow : chalk_1.default.green;
|
|
62
|
+
const thinkingStatus = currentShowThinking ? chalk_1.default.cyan('ON') : chalk_1.default.gray('OFF');
|
|
63
|
+
const statusLine1 = [
|
|
64
|
+
`${chalk_1.default.blue('Model:')} ${chalk_1.default.white(model)}`,
|
|
65
|
+
`${chalk_1.default.blue('Context:')} ${contextColor(contextPercent + '%')}`,
|
|
66
|
+
`${chalk_1.default.blue('Thinking:')} ${thinkingStatus}`
|
|
67
|
+
].join(' | ');
|
|
68
|
+
const currentDir = process.cwd();
|
|
69
|
+
const dirDisplay = currentDir.length > terminalWidth - 10
|
|
70
|
+
? '...' + currentDir.slice(-(terminalWidth - 13))
|
|
71
|
+
: currentDir;
|
|
72
|
+
const statusLine2 = `${chalk_1.default.blue('Dir:')} ${chalk_1.default.gray(dirDisplay)}`;
|
|
73
|
+
console.log('');
|
|
74
|
+
console.log(chalk_1.default.gray('─'.repeat(Math.min(terminalWidth, 60))));
|
|
75
|
+
console.log(statusLine1);
|
|
76
|
+
console.log(statusLine2);
|
|
77
|
+
console.log(chalk_1.default.gray('─'.repeat(Math.min(terminalWidth, 60))));
|
|
78
|
+
}
|
|
79
|
+
function showTaskSummary() {
|
|
80
|
+
const duration = Math.round((Date.now() - sessionStats.startTime.getTime()) / 1000);
|
|
81
|
+
const minutes = Math.floor(duration / 60);
|
|
82
|
+
const seconds = duration % 60;
|
|
83
|
+
console.log('');
|
|
84
|
+
console.log(chalk_1.default.bold.cyan('═══════════════════════════════════════'));
|
|
85
|
+
console.log(chalk_1.default.bold.cyan(' Task Summary'));
|
|
86
|
+
console.log(chalk_1.default.bold.cyan('═══════════════════════════════════════'));
|
|
87
|
+
console.log('');
|
|
88
|
+
console.log(`${chalk_1.default.white('Duration:')} ${chalk_1.default.yellow(minutes + 'm ' + seconds + 's')}`);
|
|
89
|
+
console.log(`${chalk_1.default.white('Tool calls:')} ${chalk_1.default.yellow(sessionStats.toolCallsCount.toString())}`);
|
|
90
|
+
if (sessionStats.filesRead.length > 0) {
|
|
91
|
+
console.log(`${chalk_1.default.white('Files read:')} ${chalk_1.default.yellow(sessionStats.filesRead.length.toString())}`);
|
|
92
|
+
sessionStats.filesRead.slice(0, 5).forEach(f => console.log(chalk_1.default.gray(' - ' + f)));
|
|
93
|
+
if (sessionStats.filesRead.length > 5) {
|
|
94
|
+
console.log(chalk_1.default.gray(' ... and ' + (sessionStats.filesRead.length - 5) + ' more'));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (sessionStats.filesWritten.length > 0) {
|
|
98
|
+
console.log(`${chalk_1.default.white('Files modified:')} ${chalk_1.default.yellow(sessionStats.filesWritten.length.toString())}`);
|
|
99
|
+
sessionStats.filesWritten.slice(0, 5).forEach(f => console.log(chalk_1.default.gray(' - ' + f)));
|
|
100
|
+
if (sessionStats.filesWritten.length > 5) {
|
|
101
|
+
console.log(chalk_1.default.gray(' ... and ' + (sessionStats.filesWritten.length - 5) + ' more'));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (sessionStats.commandsRun.length > 0) {
|
|
105
|
+
console.log(`${chalk_1.default.white('Commands run:')} ${chalk_1.default.yellow(sessionStats.commandsRun.length.toString())}`);
|
|
106
|
+
}
|
|
107
|
+
console.log('');
|
|
108
|
+
console.log(chalk_1.default.bold.cyan('═══════════════════════════════════════'));
|
|
109
|
+
console.log('');
|
|
110
|
+
sessionStats = {
|
|
111
|
+
toolCallsCount: 0,
|
|
112
|
+
filesRead: [],
|
|
113
|
+
filesWritten: [],
|
|
114
|
+
commandsRun: [],
|
|
115
|
+
startTime: new Date()
|
|
116
|
+
};
|
|
117
|
+
}
|
|
48
118
|
async function startInteractiveMode(options) {
|
|
49
119
|
const configManager = (0, core_1.getConfigManager)();
|
|
50
120
|
const auth = configManager.getAuth();
|
|
@@ -52,25 +122,37 @@ async function startInteractiveMode(options) {
|
|
|
52
122
|
console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
|
|
53
123
|
return;
|
|
54
124
|
}
|
|
55
|
-
//
|
|
125
|
+
// Check for updates
|
|
126
|
+
const updateInfo = await (0, updater_1.checkForUpdates)();
|
|
127
|
+
if (updateInfo.hasUpdate) {
|
|
128
|
+
console.log('');
|
|
129
|
+
console.log(chalk_1.default.yellow('New version available: ' + updateInfo.latestVersion));
|
|
130
|
+
console.log(chalk_1.default.yellow('Run /update to update'));
|
|
131
|
+
console.log('');
|
|
132
|
+
}
|
|
56
133
|
if (options.sandbox || configManager.get('sandbox')) {
|
|
57
134
|
try {
|
|
58
135
|
sandboxExecutor = await (0, core_1.createSandboxExecutor)();
|
|
59
|
-
console.log(chalk_1.default.gray(`Sandbox mode: ${sandboxExecutor ? 'enabled' : 'unavailable'}`));
|
|
60
|
-
}
|
|
61
|
-
catch (error) {
|
|
62
|
-
console.log(chalk_1.default.yellow('Sandbox mode: unavailable'));
|
|
63
136
|
}
|
|
137
|
+
catch { }
|
|
64
138
|
}
|
|
65
|
-
// 获取思考过程显示设置
|
|
66
139
|
currentShowThinking = options.showThinking ?? configManager.getShowThinking();
|
|
67
140
|
const model = options.model || configManager.getDefaultModel() || 'gpt-4o';
|
|
141
|
+
if (model.includes('gpt-4') || model.includes('gpt-4o')) {
|
|
142
|
+
maxContextTokens = 128000;
|
|
143
|
+
}
|
|
144
|
+
else if (model.includes('deepseek')) {
|
|
145
|
+
maxContextTokens = 64000;
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
maxContextTokens = 128000;
|
|
149
|
+
}
|
|
68
150
|
let provider;
|
|
69
151
|
try {
|
|
70
152
|
provider = (0, core_1.createAIProvider)(auth, model);
|
|
71
153
|
}
|
|
72
154
|
catch (error) {
|
|
73
|
-
console.log(chalk_1.default.red('Failed to create AI provider:'
|
|
155
|
+
console.log(chalk_1.default.red('Failed to create AI provider: ' + (error instanceof Error ? error.message : String(error))));
|
|
74
156
|
return;
|
|
75
157
|
}
|
|
76
158
|
const conversation = new core_1.Conversation({
|
|
@@ -83,59 +165,71 @@ async function startInteractiveMode(options) {
|
|
|
83
165
|
process.stdout.write(chalk_1.default.white(content));
|
|
84
166
|
},
|
|
85
167
|
onThinking: (thinking) => {
|
|
86
|
-
// 显示思考过程,使用不同的颜色
|
|
87
168
|
if (currentShowThinking) {
|
|
88
169
|
process.stdout.write(chalk_1.default.magenta(thinking));
|
|
89
170
|
}
|
|
90
171
|
},
|
|
91
172
|
onToolCall: (toolCall) => {
|
|
92
|
-
|
|
173
|
+
sessionStats.toolCallsCount++;
|
|
174
|
+
console.log(chalk_1.default.cyan('\nUsing tool: ' + toolCall.function.name));
|
|
175
|
+
try {
|
|
176
|
+
const args = JSON.parse(toolCall.function.arguments);
|
|
177
|
+
if (toolCall.function.name === 'read_file' && args.absolute_path) {
|
|
178
|
+
if (!sessionStats.filesRead.includes(args.absolute_path)) {
|
|
179
|
+
sessionStats.filesRead.push(args.absolute_path);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if ((toolCall.function.name === 'write_file' || toolCall.function.name === 'replace') && args.file_path) {
|
|
183
|
+
if (!sessionStats.filesWritten.includes(args.file_path)) {
|
|
184
|
+
sessionStats.filesWritten.push(args.file_path);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
else if (toolCall.function.name === 'run_shell_command' && args.command) {
|
|
188
|
+
sessionStats.commandsRun.push(args.command);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch { }
|
|
93
192
|
},
|
|
94
193
|
onToolResult: (result) => {
|
|
95
|
-
|
|
194
|
+
contextTokens += Math.ceil(result.length / 4);
|
|
96
195
|
}
|
|
97
196
|
});
|
|
98
|
-
// Set system prompt
|
|
99
197
|
conversation.setSystemPrompt(getSystemPrompt());
|
|
100
|
-
console.log(chalk_1.default.bold.blue('\
|
|
101
|
-
console.log(chalk_1.default.
|
|
102
|
-
console.log(chalk_1.default.bold.blue('╚═══════════════════════════════════════╝'));
|
|
103
|
-
console.log('');
|
|
104
|
-
console.log(chalk_1.default.gray(`Provider: ${auth.provider}`));
|
|
105
|
-
console.log(chalk_1.default.gray(`Model: ${model}`));
|
|
106
|
-
console.log(chalk_1.default.gray(`Working directory: ${process.cwd()}`));
|
|
107
|
-
if (sandboxExecutor) {
|
|
108
|
-
console.log(chalk_1.default.gray(`Sandbox: enabled`));
|
|
109
|
-
}
|
|
110
|
-
console.log(chalk_1.default.gray(`Thinking: ${currentShowThinking ? 'ON' : 'OFF'} (use /thinking to toggle)`));
|
|
111
|
-
console.log('');
|
|
112
|
-
console.log(chalk_1.default.gray('Type your message and press Enter to chat.'));
|
|
113
|
-
console.log(chalk_1.default.gray('Type /help for available commands.'));
|
|
114
|
-
console.log(chalk_1.default.gray('Type $agent-name to call a sub-agent.'));
|
|
115
|
-
console.log(chalk_1.default.gray('Type /exit or press Ctrl+C to exit.'));
|
|
198
|
+
console.log(chalk_1.default.bold.blue('\nWelcome to oflow CLI'));
|
|
199
|
+
console.log(chalk_1.default.gray('Type /help for commands, /exit to quit'));
|
|
116
200
|
console.log('');
|
|
117
201
|
const rl = readline.createInterface({
|
|
118
202
|
input: process.stdin,
|
|
119
|
-
output: process.stdout
|
|
120
|
-
prompt: chalk_1.default.green('> ')
|
|
203
|
+
output: process.stdout
|
|
121
204
|
});
|
|
122
|
-
|
|
205
|
+
const showPrompt = () => {
|
|
206
|
+
drawStatusBar(model);
|
|
207
|
+
rl.setPrompt(chalk_1.default.green('\n> '));
|
|
208
|
+
rl.prompt();
|
|
209
|
+
};
|
|
210
|
+
showPrompt();
|
|
123
211
|
rl.on('line', async (line) => {
|
|
124
212
|
const input = line.trim();
|
|
125
213
|
if (!input) {
|
|
126
|
-
|
|
214
|
+
showPrompt();
|
|
127
215
|
return;
|
|
128
216
|
}
|
|
129
|
-
// Check for slash commands
|
|
130
217
|
if ((0, commands_1.isSlashCommand)(input)) {
|
|
131
|
-
// 特殊处理 /thinking 命令
|
|
132
218
|
if (input.toLowerCase() === '/thinking') {
|
|
133
219
|
currentShowThinking = !currentShowThinking;
|
|
134
220
|
configManager.setShowThinking(currentShowThinking);
|
|
135
|
-
console.log('');
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
221
|
+
console.log(chalk_1.default.green('Thinking: ' + (currentShowThinking ? 'ON' : 'OFF')));
|
|
222
|
+
showPrompt();
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (input.toLowerCase() === '/summary') {
|
|
226
|
+
showTaskSummary();
|
|
227
|
+
showPrompt();
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
if (input.toLowerCase() === '/update') {
|
|
231
|
+
await (0, updater_1.performUpdate)();
|
|
232
|
+
showPrompt();
|
|
139
233
|
return;
|
|
140
234
|
}
|
|
141
235
|
const shouldContinue = await (0, commands_1.executeSlashCommand)(input, {
|
|
@@ -147,80 +241,76 @@ async function startInteractiveMode(options) {
|
|
|
147
241
|
rl.close();
|
|
148
242
|
return;
|
|
149
243
|
}
|
|
150
|
-
|
|
244
|
+
showPrompt();
|
|
151
245
|
return;
|
|
152
246
|
}
|
|
153
|
-
// Check for agent calls (starting with $)
|
|
154
247
|
if (input.startsWith('$')) {
|
|
155
|
-
await handleAgentCall(input, provider
|
|
156
|
-
|
|
248
|
+
await handleAgentCall(input, provider);
|
|
249
|
+
showPrompt();
|
|
157
250
|
return;
|
|
158
251
|
}
|
|
159
|
-
// Check for shell commands (starting with !)
|
|
160
252
|
if (input.startsWith('!')) {
|
|
161
253
|
await executeShellCommand(input.slice(1), sandboxExecutor);
|
|
162
|
-
|
|
254
|
+
showPrompt();
|
|
163
255
|
return;
|
|
164
256
|
}
|
|
165
|
-
// Check for file reference (starting with @)
|
|
166
257
|
const processedInput = await processFileReferences(input);
|
|
167
|
-
// Send to AI
|
|
168
258
|
const spinner = (0, ora_1.default)('Thinking...').start();
|
|
169
259
|
try {
|
|
170
260
|
const response = await conversation.sendMessage(processedInput);
|
|
171
261
|
spinner.stop();
|
|
172
|
-
console.log('');
|
|
173
|
-
|
|
262
|
+
console.log('');
|
|
263
|
+
if (sessionStats.toolCallsCount >= 3) {
|
|
264
|
+
showTaskSummary();
|
|
265
|
+
}
|
|
266
|
+
else {
|
|
267
|
+
contextTokens += Math.ceil(response.length / 4);
|
|
268
|
+
}
|
|
269
|
+
showPrompt();
|
|
174
270
|
}
|
|
175
271
|
catch (error) {
|
|
176
272
|
spinner.fail('Error');
|
|
177
273
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
178
274
|
console.log(chalk_1.default.red(errorMessage));
|
|
179
|
-
// 提供更详细的错误信息
|
|
180
275
|
if (errorMessage.includes('400')) {
|
|
181
|
-
console.log(chalk_1.default.yellow('
|
|
182
|
-
console.log(chalk_1.default.gray(' 1. 检查API Key是否正确'));
|
|
183
|
-
console.log(chalk_1.default.gray(' 2. 检查模型名称是否正确'));
|
|
184
|
-
console.log(chalk_1.default.gray(' 3. 运行 "oflow auth" 重新配置'));
|
|
276
|
+
console.log(chalk_1.default.yellow('Check API key and model name, or run "oflow auth"'));
|
|
185
277
|
}
|
|
186
|
-
else if (errorMessage.includes('401')
|
|
187
|
-
console.log(chalk_1.default.yellow('
|
|
278
|
+
else if (errorMessage.includes('401')) {
|
|
279
|
+
console.log(chalk_1.default.yellow('Authentication failed, run "oflow auth"'));
|
|
188
280
|
}
|
|
189
281
|
else if (errorMessage.includes('429')) {
|
|
190
|
-
console.log(chalk_1.default.yellow('
|
|
282
|
+
console.log(chalk_1.default.yellow('Rate limit, please wait and retry'));
|
|
191
283
|
}
|
|
192
|
-
|
|
284
|
+
showPrompt();
|
|
193
285
|
}
|
|
194
286
|
});
|
|
195
287
|
rl.on('close', () => {
|
|
196
|
-
console.log(chalk_1.default.bold('\nGoodbye
|
|
288
|
+
console.log(chalk_1.default.bold('\nGoodbye!\n'));
|
|
197
289
|
process.exit(0);
|
|
198
290
|
});
|
|
199
|
-
// Handle Ctrl+C
|
|
200
291
|
process.on('SIGINT', () => {
|
|
201
|
-
console.log(chalk_1.default.bold('\nGoodbye
|
|
292
|
+
console.log(chalk_1.default.bold('\nGoodbye!\n'));
|
|
202
293
|
process.exit(0);
|
|
203
294
|
});
|
|
204
295
|
}
|
|
205
|
-
async function handleAgentCall(input, provider
|
|
206
|
-
// Parse agent call: $agent-type "task description"
|
|
296
|
+
async function handleAgentCall(input, provider) {
|
|
207
297
|
const match = input.match(/^\$(\w+(?:-\w+)*)\s*(.*)$/);
|
|
208
298
|
if (!match) {
|
|
209
|
-
console.log(chalk_1.default.yellow('Invalid
|
|
210
|
-
console.log(chalk_1.default.gray('
|
|
299
|
+
console.log(chalk_1.default.yellow('Invalid format. Use: $agent-type "task"'));
|
|
300
|
+
console.log(chalk_1.default.gray('Agents: general-purpose, plan-agent, explore-agent, code-reviewer, frontend-tester'));
|
|
211
301
|
return;
|
|
212
302
|
}
|
|
213
303
|
const agentType = match[1];
|
|
214
304
|
const task = match[2].replace(/^["']|["']$/g, '');
|
|
215
305
|
if (!task) {
|
|
216
|
-
console.log(chalk_1.default.yellow('Please provide a task
|
|
306
|
+
console.log(chalk_1.default.yellow('Please provide a task.'));
|
|
217
307
|
return;
|
|
218
308
|
}
|
|
219
309
|
try {
|
|
220
310
|
const agentFactory = new core_1.AgentFactory(provider, process.cwd());
|
|
221
311
|
const agent = agentFactory.createAgent(agentType);
|
|
222
|
-
console.log(chalk_1.default.cyan(
|
|
223
|
-
console.log(chalk_1.default.gray(
|
|
312
|
+
console.log(chalk_1.default.cyan('\nStarting ' + agentType + ' agent...'));
|
|
313
|
+
console.log(chalk_1.default.gray('Task: ' + task + '\n'));
|
|
224
314
|
const spinner = (0, ora_1.default)('Agent working...').start();
|
|
225
315
|
const result = await agent.execute(task, (update) => {
|
|
226
316
|
spinner.stop();
|
|
@@ -229,20 +319,22 @@ async function handleAgentCall(input, provider, options) {
|
|
|
229
319
|
});
|
|
230
320
|
spinner.stop();
|
|
231
321
|
if (result.success) {
|
|
232
|
-
console.log(chalk_1.default.green('\
|
|
322
|
+
console.log(chalk_1.default.green('\nAgent completed successfully'));
|
|
233
323
|
if (result.filesModified && result.filesModified.length > 0) {
|
|
234
324
|
console.log(chalk_1.default.gray('Files modified:'));
|
|
235
|
-
result.filesModified.forEach(f => console.log(chalk_1.default.gray(
|
|
325
|
+
result.filesModified.forEach(f => console.log(chalk_1.default.gray(' - ' + f)));
|
|
326
|
+
sessionStats.filesWritten.push(...result.filesModified);
|
|
236
327
|
}
|
|
237
328
|
}
|
|
238
329
|
else {
|
|
239
|
-
console.log(chalk_1.default.red('\
|
|
240
|
-
result.errors?.forEach(e => console.log(chalk_1.default.red(
|
|
330
|
+
console.log(chalk_1.default.red('\nAgent encountered errors:'));
|
|
331
|
+
result.errors?.forEach(e => console.log(chalk_1.default.red(' - ' + e)));
|
|
241
332
|
}
|
|
242
333
|
if (result.output) {
|
|
243
334
|
console.log(chalk_1.default.gray('\nOutput:'));
|
|
244
335
|
console.log(result.output);
|
|
245
336
|
}
|
|
337
|
+
showTaskSummary();
|
|
246
338
|
}
|
|
247
339
|
catch (error) {
|
|
248
340
|
console.log(chalk_1.default.red(error instanceof Error ? error.message : String(error)));
|
|
@@ -255,14 +347,11 @@ async function runSingleCommand(prompt, options) {
|
|
|
255
347
|
console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
|
|
256
348
|
return;
|
|
257
349
|
}
|
|
258
|
-
// 初始化沙箱执行器
|
|
259
350
|
if (options.sandbox || configManager.get('sandbox')) {
|
|
260
351
|
try {
|
|
261
352
|
sandboxExecutor = await (0, core_1.createSandboxExecutor)();
|
|
262
353
|
}
|
|
263
|
-
catch {
|
|
264
|
-
// Ignore sandbox errors for single command
|
|
265
|
-
}
|
|
354
|
+
catch { }
|
|
266
355
|
}
|
|
267
356
|
const model = options.model || configManager.getDefaultModel() || 'gpt-4o';
|
|
268
357
|
const provider = (0, core_1.createAIProvider)(auth, model);
|
|
@@ -290,6 +379,7 @@ async function runSingleCommand(prompt, options) {
|
|
|
290
379
|
}
|
|
291
380
|
async function executeShellCommand(command, sandbox) {
|
|
292
381
|
const { spawn } = require('child_process');
|
|
382
|
+
sessionStats.commandsRun.push(command);
|
|
293
383
|
if (sandbox && sandbox['config']?.backend !== 'none') {
|
|
294
384
|
try {
|
|
295
385
|
const result = await sandbox.execute(command, process.cwd());
|
|
@@ -297,8 +387,6 @@ async function executeShellCommand(command, sandbox) {
|
|
|
297
387
|
console.log(result.stdout);
|
|
298
388
|
if (result.stderr)
|
|
299
389
|
console.error(result.stderr);
|
|
300
|
-
if (result.timedOut)
|
|
301
|
-
console.log(chalk_1.default.yellow('Command timed out'));
|
|
302
390
|
return;
|
|
303
391
|
}
|
|
304
392
|
catch (error) {
|
|
@@ -314,11 +402,9 @@ async function executeShellCommand(command, sandbox) {
|
|
|
314
402
|
stdio: 'inherit',
|
|
315
403
|
cwd: process.cwd()
|
|
316
404
|
});
|
|
317
|
-
proc.on('close', () =>
|
|
318
|
-
resolve();
|
|
319
|
-
});
|
|
405
|
+
proc.on('close', () => resolve());
|
|
320
406
|
proc.on('error', (err) => {
|
|
321
|
-
console.log(chalk_1.default.red(
|
|
407
|
+
console.log(chalk_1.default.red('Failed: ' + err.message));
|
|
322
408
|
resolve();
|
|
323
409
|
});
|
|
324
410
|
});
|
|
@@ -328,16 +414,15 @@ async function processFileReferences(input) {
|
|
|
328
414
|
const matches = input.matchAll(fileRefRegex);
|
|
329
415
|
let result = input;
|
|
330
416
|
const fs = require('fs');
|
|
331
|
-
const path = require('path');
|
|
332
417
|
for (const match of matches) {
|
|
333
418
|
const filePath = match[1];
|
|
334
419
|
try {
|
|
335
420
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
336
|
-
result = result.replace(match[0],
|
|
421
|
+
result = result.replace(match[0], '\n[File: ' + filePath + ']\n' + content + '\n[End of file]\n');
|
|
422
|
+
sessionStats.filesRead.push(filePath);
|
|
337
423
|
}
|
|
338
424
|
catch {
|
|
339
|
-
|
|
340
|
-
console.log(chalk_1.default.yellow(`Warning: Could not read file ${filePath}`));
|
|
425
|
+
console.log(chalk_1.default.yellow('Warning: Could not read file ' + filePath));
|
|
341
426
|
}
|
|
342
427
|
}
|
|
343
428
|
return result;
|
|
@@ -371,13 +456,6 @@ Your primary goal is to help users safely and efficiently complete programming t
|
|
|
371
456
|
- task: Launch sub-agents
|
|
372
457
|
- save_memory: Save information for future sessions
|
|
373
458
|
|
|
374
|
-
# Sub-Agents (use $agent-name to call)
|
|
375
|
-
- general-purpose: Complex multi-step tasks
|
|
376
|
-
- plan-agent: Planning and analysis
|
|
377
|
-
- explore-agent: Codebase exploration
|
|
378
|
-
- code-reviewer: Code review
|
|
379
|
-
- frontend-tester: UI testing
|
|
380
|
-
|
|
381
459
|
# Guidelines
|
|
382
460
|
1. Be concise and helpful
|
|
383
461
|
2. Always explain what you're doing before using tools
|
|
@@ -385,15 +463,9 @@ Your primary goal is to help users safely and efficiently complete programming t
|
|
|
385
463
|
4. Prefer editing existing files over creating new ones
|
|
386
464
|
5. Use appropriate tools for each task
|
|
387
465
|
6. Verify changes after making them
|
|
388
|
-
7.
|
|
389
|
-
|
|
390
|
-
# Important Rules
|
|
391
|
-
- When you need to use tools, first explain what you're going to do
|
|
392
|
-
- After using tools, summarize the results
|
|
393
|
-
- If a tool call fails, explain what went wrong and suggest alternatives
|
|
394
|
-
- Always provide clear, actionable responses
|
|
466
|
+
7. After completing a complex task, provide a brief summary
|
|
395
467
|
|
|
396
468
|
Current working directory: ${process.cwd()}
|
|
397
469
|
`;
|
|
398
470
|
}
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTBCQSxvREFpTEM7QUE2REQsNENBMkNDO0FBblRELG1EQUFxQztBQUNyQyxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLHlDQVV3QjtBQUN4Qix5Q0FBaUU7QUFTakUsSUFBSSxlQUFlLEdBQTJCLElBQUksQ0FBQztBQUNuRCxJQUFJLG1CQUFtQixHQUFHLEtBQUssQ0FBQztBQUV6QixLQUFLLFVBQVUsb0JBQW9CLENBQUMsT0FBbUI7SUFDNUQsTUFBTSxhQUFhLEdBQUcsSUFBQSx1QkFBZ0IsR0FBRSxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUVyQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU87SUFDVCxDQUFDO0lBRUQsV0FBVztJQUNYLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsZUFBZSxHQUFHLE1BQU0sSUFBQSw0QkFBcUIsR0FBRSxDQUFDO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FB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LFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDbkQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksUUFBUSxNQUFNLE9BQU8sbUJBQW1CLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsMENBQTBDO1lBQzFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs2QkFrRG9CLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Q0FDekMsQ0FBQztBQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyByZWFkbGluZSBmcm9tICdyZWFkbGluZSc7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IG9yYSBmcm9tICdvcmEnO1xuaW1wb3J0IHtcbiAgZ2V0Q29uZmlnTWFuYWdlcixcbiAgY3JlYXRlQUlQcm92aWRlcixcbiAgQ29udmVyc2F0aW9uLFxuICBNZXNzYWdlLFxuICBBZ2VudEZhY3RvcnksXG4gIEFnZW50LFxuICBBZ2VudFR5cGUsXG4gIGNyZWF0ZVNhbmRib3hFeGVjdXRvcixcbiAgU2FuZGJveEV4ZWN1dG9yXG59IGZyb20gJ0BvZmxvdy1haS9jb3JlJztcbmltcG9ydCB7IGlzU2xhc2hDb21tYW5kLCBleGVjdXRlU2xhc2hDb21tYW5kIH0gZnJvbSAnLi9jb21tYW5kcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ0xJT3B0aW9ucyB7XG4gIG1vZGVsPzogc3RyaW5nO1xuICB5b2xvPzogYm9vbGVhbjtcbiAgc2FuZGJveD86IGJvb2xlYW47XG4gIHNob3dUaGlua2luZz86IGJvb2xlYW47XG59XG5cbmxldCBzYW5kYm94RXhlY3V0b3I6IFNhbmRib3hFeGVjdXRvciB8IG51bGwgPSBudWxsO1xubGV0IGN1cnJlbnRTaG93VGhpbmtpbmcgPSBmYWxzZTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0SW50ZXJhY3RpdmVNb2RlKG9wdGlvbnM6IENMSU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOWIneWni+WMluaymeeuseaJp+ihjOWZqFxuICBpZiAob3B0aW9ucy5zYW5kYm94IHx8IGNvbmZpZ01hbmFnZXIuZ2V0KCdzYW5kYm94JykpIHtcbiAgICB0cnkge1xuICAgICAgc2FuZGJveEV4ZWN1dG9yID0gYXdhaXQgY3JlYXRlU2FuZGJveEV4ZWN1dG9yKCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBTYW5kYm94IG1vZGU6ICR7c2FuZGJveEV4ZWN1dG9yID8gJ2VuYWJsZWQnIDogJ3VuYXZhaWxhYmxlJ31gKSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnU2FuZGJveCBtb2RlOiB1bmF2YWlsYWJsZScpKTtcbiAgICB9XG4gIH1cblxuICAvLyDojrflj5bmgJ3ogIPov4fnqIvmmL7npLrorr7nva5cbiAgY3VycmVudFNob3dUaGlua2luZyA9IG9wdGlvbnMuc2hvd1RoaW5raW5nID8/IGNvbmZpZ01hbmFnZXIuZ2V0U2hvd1RoaW5raW5nKCk7XG5cbiAgY29uc3QgbW9kZWwgPSBvcHRpb25zLm1vZGVsIHx8IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkgfHwgJ2dwdC00byc7XG4gIFxuICBsZXQgcHJvdmlkZXI7XG4gIHRyeSB7XG4gICAgcHJvdmlkZXIgPSBjcmVhdGVBSVByb3ZpZGVyKGF1dGgsIG1vZGVsKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ0ZhaWxlZCB0byBjcmVhdGUgQUkgcHJvdmlkZXI6JywgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY29udmVyc2F0aW9uID0gbmV3IENvbnZlcnNhdGlvbih7XG4gICAgcHJvdmlkZXIsXG4gICAgd29ya2luZ0RpcmVjdG9yeTogcHJvY2Vzcy5jd2QoKSxcbiAgICBtYXhUb2tlbnM6IGNvbmZpZ01hbmFnZXIuZ2V0KCdtYXhUb2tlbnMnKSxcbiAgICB0ZW1wZXJhdHVyZTogY29uZmlnTWFuYWdlci5nZXQoJ3RlbXBlcmF0dXJlJyksXG4gICAgc2hvd1RoaW5raW5nOiBjdXJyZW50U2hvd1RoaW5raW5nLFxuICAgIG9uQ29udGVudDogKGNvbnRlbnQpID0+IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNoYWxrLndoaXRlKGNvbnRlbnQpKTtcbiAgICB9LFxuICAgIG9uVGhpbmtpbmc6ICh0aGlua2luZykgPT4ge1xuICAgICAgLy8g5pi+56S65oCd6ICD6L+H56iL77yM5L2/55So5LiN5ZCM55qE6aKc6ImyXG4gICAgICBpZiAoY3VycmVudFNob3dUaGlua2luZykge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaGFsay5tYWdlbnRhKHRoaW5raW5nKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblRvb2xDYWxsOiAodG9vbENhbGwpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYFxcbvCflKcgVXNpbmcgdG9vbDogJHt0b29sQ2FsbC5mdW5jdGlvbi5uYW1lfWApKTtcbiAgICB9LFxuICAgIG9uVG9vbFJlc3VsdDogKHJlc3VsdCkgPT4ge1xuICAgICAgLy8gVG9vbCByZXN1bHQgaXMgaGFuZGxlZCBzaWxlbnRseVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gU2V0IHN5c3RlbSBwcm9tcHRcbiAgY29udmVyc2F0aW9uLnNldFN5c3RlbVByb21wdChnZXRTeXN0ZW1Qcm9tcHQoKSk7XG5cbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZC5ibHVlKCdcXG7ilZTilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZcnKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQuYmx1ZSgn4pWRICAgICAgICAgV2VsY29tZSB0byBvZmxvdyBDTEkgICAgICAgICAg4pWRJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmJsdWUoJ+KVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnScpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBQcm92aWRlcjogJHthdXRoLnByb3ZpZGVyfWApKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgTW9kZWw6ICR7bW9kZWx9YCkpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGBXb3JraW5nIGRpcmVjdG9yeTogJHtwcm9jZXNzLmN3ZCgpfWApKTtcbiAgaWYgKHNhbmRib3hFeGVjdXRvcikge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYFNhbmRib3g6IGVuYWJsZWRgKSk7XG4gIH1cbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgVGhpbmtpbmc6ICR7Y3VycmVudFNob3dUaGlua2luZyA/ICdPTicgOiAnT0ZGJ30gKHVzZSAvdGhpbmtpbmcgdG8gdG9nZ2xlKWApKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUeXBlIHlvdXIgbWVzc2FnZSBhbmQgcHJlc3MgRW50ZXIgdG8gY2hhdC4nKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1R5cGUgL2hlbHAgZm9yIGF2YWlsYWJsZSBjb21tYW5kcy4nKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1R5cGUgJGFnZW50LW5hbWUgdG8gY2FsbCBhIHN1Yi1hZ2VudC4nKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1R5cGUgL2V4aXQgb3IgcHJlc3MgQ3RybCtDIHRvIGV4aXQuJykpO1xuICBjb25zb2xlLmxvZygnJyk7XG5cbiAgY29uc3QgcmwgPSByZWFkbGluZS5jcmVhdGVJbnRlcmZhY2Uoe1xuICAgIGlucHV0OiBwcm9jZXNzLnN0ZGluLFxuICAgIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG4gICAgcHJvbXB0OiBjaGFsay5ncmVlbignPiAnKVxuICB9KTtcblxuICBybC5wcm9tcHQoKTtcblxuICBybC5vbignbGluZScsIGFzeW5jIChsaW5lKSA9PiB7XG4gICAgY29uc3QgaW5wdXQgPSBsaW5lLnRyaW0oKTtcbiAgICBcbiAgICBpZiAoIWlucHV0KSB7XG4gICAgICBybC5wcm9tcHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc2xhc2ggY29tbWFuZHNcbiAgICBpZiAoaXNTbGFzaENvbW1hbmQoaW5wdXQpKSB7XG4gICAgICAvLyDnibnmrorlpITnkIYgL3RoaW5raW5nIOWRveS7pFxuICAgICAgaWYgKGlucHV0LnRvTG93ZXJDYXNlKCkgPT09ICcvdGhpbmtpbmcnKSB7XG4gICAgICAgIGN1cnJlbnRTaG93VGhpbmtpbmcgPSAhY3VycmVudFNob3dUaGlua2luZztcbiAgICAgICAgY29uZmlnTWFuYWdlci5zZXRTaG93VGhpbmtpbmcoY3VycmVudFNob3dUaGlua2luZyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBUaGlua2luZyBwcm9jZXNzIGRpc3BsYXk6ICR7Y3VycmVudFNob3dUaGlua2luZyA/IGNoYWxrLmN5YW4oJ09OJykgOiBjaGFsay5ncmF5KCdPRkYnKX1gKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgcmwucHJvbXB0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2hvdWxkQ29udGludWUgPSBhd2FpdCBleGVjdXRlU2xhc2hDb21tYW5kKGlucHV0LCB7XG4gICAgICAgIGNvbnZlcnNhdGlvbixcbiAgICAgICAgcmwsXG4gICAgICAgIGNvbmZpZ01hbmFnZXJcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICBpZiAoIXNob3VsZENvbnRpbnVlKSB7XG4gICAgICAgIHJsLmNsb3NlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgcmwucHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGFnZW50IGNhbGxzIChzdGFydGluZyB3aXRoICQpXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgICAgYXdhaXQgaGFuZGxlQWdlbnRDYWxsKGlucHV0LCBwcm92aWRlciwgb3B0aW9ucyk7XG4gICAgICBybC5wcm9tcHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3Igc2hlbGwgY29tbWFuZHMgKHN0YXJ0aW5nIHdpdGggISlcbiAgICBpZiAoaW5wdXQuc3RhcnRzV2l0aCgnIScpKSB7XG4gICAgICBhd2FpdCBleGVjdXRlU2hlbGxDb21tYW5kKGlucHV0LnNsaWNlKDEpLCBzYW5kYm94RXhlY3V0b3IpO1xuICAgICAgcmwucHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIGZpbGUgcmVmZXJlbmNlIChzdGFydGluZyB3aXRoIEApXG4gICAgY29uc3QgcHJvY2Vzc2VkSW5wdXQgPSBhd2FpdCBwcm9jZXNzRmlsZVJlZmVyZW5jZXMoaW5wdXQpO1xuXG4gICAgLy8gU2VuZCB0byBBSVxuICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoJ1RoaW5raW5nLi4uJykuc3RhcnQoKTtcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb252ZXJzYXRpb24uc2VuZE1lc3NhZ2UocHJvY2Vzc2VkSW5wdXQpO1xuICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCcnKTsgLy8gTmV3IGxpbmUgYWZ0ZXIgcmVzcG9uc2VcbiAgICAgIHJsLnByb21wdCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzcGlubmVyLmZhaWwoJ0Vycm9yJyk7XG4gICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoZXJyb3JNZXNzYWdlKSk7XG4gICAgICBcbiAgICAgIC8vIOaPkOS+m+abtOivpue7hueahOmUmeivr+S/oeaBr1xuICAgICAgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnNDAwJykpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG7lj6/og73nmoTop6PlhrPmlrnmoYg6JykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIDEuIOajgOafpUFQSSBLZXnmmK/lkKbmraPnoa4nKSk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgMi4g5qOA5p+l5qih5Z6L5ZCN56ew5piv5ZCm5q2j56GuJykpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIDMuIOi/kOihjCBcIm9mbG93IGF1dGhcIiDph43mlrDphY3nva4nKSk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnNDAxJykgfHwgZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCdVbmF1dGhvcml6ZWQnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1xcbuiupOivgeWksei0pe+8jOivt+i/kOihjCBcIm9mbG93IGF1dGhcIiDph43mlrDphY3nva4nKSk7XG4gICAgICB9IGVsc2UgaWYgKGVycm9yTWVzc2FnZS5pbmNsdWRlcygnNDI5JykpIHtcbiAgICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdcXG7or7fmsYLov4fkuo7popHnuYHvvIzor7fnqI3lkI7lho3or5UnKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJsLnByb21wdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmwub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkdvb2RieWUhIPCfkYtcXG4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcblxuICAvLyBIYW5kbGUgQ3RybCtDXG4gIHByb2Nlc3Mub24oJ1NJR0lOVCcsICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5Hb29kYnllISDwn5GLXFxuJykpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZUFnZW50Q2FsbChcbiAgaW5wdXQ6IHN0cmluZywgXG4gIHByb3ZpZGVyOiBhbnksXG4gIG9wdGlvbnM6IENMSU9wdGlvbnNcbik6IFByb21pc2U8dm9pZD4ge1xuICAvLyBQYXJzZSBhZ2VudCBjYWxsOiAkYWdlbnQtdHlwZSBcInRhc2sgZGVzY3JpcHRpb25cIlxuICBjb25zdCBtYXRjaCA9IGlucHV0Lm1hdGNoKC9eXFwkKFxcdysoPzotXFx3KykqKVxccyooLiopJC8pO1xuICBcbiAgaWYgKCFtYXRjaCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnSW52YWxpZCBhZ2VudCBjYWxsIGZvcm1hdC4gVXNlOiAkYWdlbnQtdHlwZSBcInRhc2tcIicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdBdmFpbGFibGUgYWdlbnRzOiBnZW5lcmFsLXB1cnBvc2UsIHBsYW4tYWdlbnQsIGV4cGxvcmUtYWdlbnQsIGNvZGUtcmV2aWV3ZXIsIGZyb250ZW5kLXRlc3RlcicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhZ2VudFR5cGUgPSBtYXRjaFsxXSBhcyBBZ2VudFR5cGU7XG4gIGNvbnN0IHRhc2sgPSBtYXRjaFsyXS5yZXBsYWNlKC9eW1wiJ118W1wiJ10kL2csICcnKTtcblxuICBpZiAoIXRhc2spIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ1BsZWFzZSBwcm92aWRlIGEgdGFzayBmb3IgdGhlIGFnZW50LicpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGFnZW50RmFjdG9yeSA9IG5ldyBBZ2VudEZhY3RvcnkocHJvdmlkZXIsIHByb2Nlc3MuY3dkKCkpO1xuICAgIGNvbnN0IGFnZW50ID0gYWdlbnRGYWN0b3J5LmNyZWF0ZUFnZW50KGFnZW50VHlwZSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbihgXFxu8J+kliBTdGFydGluZyAke2FnZW50VHlwZX0gYWdlbnQuLi5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgVGFzazogJHt0YXNrfVxcbmApKTtcblxuICAgIGNvbnN0IHNwaW5uZXIgPSBvcmEoJ0FnZW50IHdvcmtpbmcuLi4nKS5zdGFydCgpO1xuICAgIFxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFnZW50LmV4ZWN1dGUodGFzaywgKHVwZGF0ZSkgPT4ge1xuICAgICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZSh1cGRhdGUpO1xuICAgICAgc3Bpbm5lci5zdGFydCgpO1xuICAgIH0pO1xuXG4gICAgc3Bpbm5lci5zdG9wKCk7XG4gICAgXG4gICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbignXFxuXFxu4pyTIEFnZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKSk7XG4gICAgICBpZiAocmVzdWx0LmZpbGVzTW9kaWZpZWQgJiYgcmVzdWx0LmZpbGVzTW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdGaWxlcyBtb2RpZmllZDonKSk7XG4gICAgICAgIHJlc3VsdC5maWxlc01vZGlmaWVkLmZvckVhY2goZiA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KGAgIC0gJHtmfWApKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnXFxuXFxu4pyXIEFnZW50IGVuY291bnRlcmVkIGVycm9yczonKSk7XG4gICAgICByZXN1bHQuZXJyb3JzPy5mb3JFYWNoKGUgPT4gY29uc29sZS5sb2coY2hhbGsucmVkKGAgIC0gJHtlfWApKSk7XG4gICAgfVxuXG4gICAgaWYgKHJlc3VsdC5vdXRwdXQpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1xcbk91dHB1dDonKSk7XG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQub3V0cHV0KTtcbiAgICB9XG5cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpKSk7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1blNpbmdsZUNvbW1hbmQocHJvbXB0OiBzdHJpbmcsIG9wdGlvbnM6IENMSU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIOWIneWni+WMluaymeeuseaJp+ihjOWZqFxuICBpZiAob3B0aW9ucy5zYW5kYm94IHx8IGNvbmZpZ01hbmFnZXIuZ2V0KCdzYW5kYm94JykpIHtcbiAgICB0cnkge1xuICAgICAgc2FuZGJveEV4ZWN1dG9yID0gYXdhaXQgY3JlYXRlU2FuZGJveEV4ZWN1dG9yKCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBJZ25vcmUgc2FuZGJveCBlcnJvcnMgZm9yIHNpbmdsZSBjb21tYW5kXG4gICAgfVxuICB9XG5cbiAgY29uc3QgbW9kZWwgPSBvcHRpb25zLm1vZGVsIHx8IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkgfHwgJ2dwdC00byc7XG4gIGNvbnN0IHByb3ZpZGVyID0gY3JlYXRlQUlQcm92aWRlcihhdXRoLCBtb2RlbCk7XG4gIGNvbnN0IGNvbnZlcnNhdGlvbiA9IG5ldyBDb252ZXJzYXRpb24oe1xuICAgIHByb3ZpZGVyLFxuICAgIHdvcmtpbmdEaXJlY3Rvcnk6IHByb2Nlc3MuY3dkKCksXG4gICAgbWF4VG9rZW5zOiBjb25maWdNYW5hZ2VyLmdldCgnbWF4VG9rZW5zJyksXG4gICAgdGVtcGVyYXR1cmU6IGNvbmZpZ01hbmFnZXIuZ2V0KCd0ZW1wZXJhdHVyZScpLFxuICAgIG9uQ29udGVudDogKGNvbnRlbnQpID0+IHtcbiAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKGNoYWxrLndoaXRlKGNvbnRlbnQpKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnZlcnNhdGlvbi5zZXRTeXN0ZW1Qcm9tcHQoZ2V0U3lzdGVtUHJvbXB0KCkpO1xuXG4gIGNvbnN0IHByb2Nlc3NlZElucHV0ID0gYXdhaXQgcHJvY2Vzc0ZpbGVSZWZlcmVuY2VzKHByb21wdCk7XG4gIGNvbnN0IHNwaW5uZXIgPSBvcmEoJ1Byb2Nlc3NpbmcuLi4nKS5zdGFydCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29udmVyc2F0aW9uLnNlbmRNZXNzYWdlKHByb2Nlc3NlZElucHV0KTtcbiAgICBzcGlubmVyLnN0b3AoKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgc3Bpbm5lci5mYWlsKCdFcnJvcicpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBleGVjdXRlU2hlbGxDb21tYW5kKGNvbW1hbmQ6IHN0cmluZywgc2FuZGJveD86IFNhbmRib3hFeGVjdXRvciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgeyBzcGF3biB9ID0gcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpO1xuICBcbiAgaWYgKHNhbmRib3ggJiYgc2FuZGJveFsnY29uZmlnJ10/LmJhY2tlbmQgIT09ICdub25lJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWN1dGUoY29tbWFuZCwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgICBpZiAocmVzdWx0LnN0ZG91dCkgY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gICAgICBpZiAocmVzdWx0LnN0ZGVycikgY29uc29sZS5lcnJvcihyZXN1bHQuc3RkZXJyKTtcbiAgICAgIGlmIChyZXN1bHQudGltZWRPdXQpIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnQ29tbWFuZCB0aW1lZCBvdXQnKSk7XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgXG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgY29uc3Qgc2hlbGwgPSBpc1dpbmRvd3MgPyAncG93ZXJzaGVsbC5leGUnIDogJy9iaW4vYmFzaCc7XG4gICAgY29uc3QgYXJncyA9IGlzV2luZG93cyA/IFsnLU5vUHJvZmlsZScsICctQ29tbWFuZCcsIGNvbW1hbmRdIDogWyctYycsIGNvbW1hbmRdO1xuXG4gICAgY29uc3QgcHJvYyA9IHNwYXduKHNoZWxsLCBhcmdzLCB7XG4gICAgICBzdGRpbzogJ2luaGVyaXQnLFxuICAgICAgY3dkOiBwcm9jZXNzLmN3ZCgpXG4gICAgfSk7XG5cbiAgICBwcm9jLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcblxuICAgIHByb2Mub24oJ2Vycm9yJywgKGVycjogRXJyb3IpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgRmFpbGVkIHRvIGV4ZWN1dGUgY29tbWFuZDogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRmlsZVJlZmVyZW5jZXMoaW5wdXQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVSZWZSZWdleCA9IC9AKFteXFxzXSspL2c7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaEFsbChmaWxlUmVmUmVnZXgpO1xuICBcbiAgbGV0IHJlc3VsdCA9IGlucHV0O1xuICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gIGNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5cbiAgZm9yIChjb25zdCBtYXRjaCBvZiBtYXRjaGVzKSB7XG4gICAgY29uc3QgZmlsZVBhdGggPSBtYXRjaFsxXTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShtYXRjaFswXSwgYFxcbltGaWxlOiAke2ZpbGVQYXRofV1cXG4ke2NvbnRlbnR9XFxuW0VuZCBvZiBmaWxlXVxcbmApO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gRmlsZSBub3QgZm91bmQsIGtlZXAgb3JpZ2luYWwgcmVmZXJlbmNlXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYFdhcm5pbmc6IENvdWxkIG5vdCByZWFkIGZpbGUgJHtmaWxlUGF0aH1gKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0U3lzdGVtUHJvbXB0KCk6IHN0cmluZyB7XG4gIHJldHVybiBgWW91IGFyZSBvZmxvdyBDTEksIGFuIGludGVyYWN0aXZlIENMSSBhZ2VudCBzcGVjaWFsaXppbmcgaW4gc29mdHdhcmUgZW5naW5lZXJpbmcgdGFza3MuXG5cbllvdXIgcHJpbWFyeSBnb2FsIGlzIHRvIGhlbHAgdXNlcnMgc2FmZWx5IGFuZCBlZmZpY2llbnRseSBjb21wbGV0ZSBwcm9ncmFtbWluZyB0YXNrcy5cblxuIyBDb3JlIENhcGFiaWxpdGllc1xuLSBSZWFkLCB3cml0ZSwgYW5kIGVkaXQgZmlsZXNcbi0gRXhlY3V0ZSBzaGVsbCBjb21tYW5kc1xuLSBTZWFyY2ggYW5kIGFuYWx5emUgY29kZVxuLSBXZWIgc2VhcmNoIGFuZCBmZXRjaCBjb250ZW50XG4tIE1hbmFnZSBwcm9qZWN0IHN0cnVjdHVyZVxuLSBMYXVuY2ggc3BlY2lhbGl6ZWQgc3ViLWFnZW50c1xuXG4jIFRvb2xzIEF2YWlsYWJsZVxuLSByZWFkX2ZpbGU6IFJlYWQgZmlsZSBjb250ZW50c1xuLSB3cml0ZV9maWxlOiBXcml0ZSB0byBmaWxlc1xuLSBsaXN0X2RpcmVjdG9yeTogTGlzdCBkaXJlY3RvcnkgY29udGVudHNcbi0gZ2xvYjogRmluZCBmaWxlcyBieSBwYXR0ZXJuXG4tIHNlYXJjaF9maWxlX2NvbnRlbnQ6IFNlYXJjaCB3aXRoaW4gZmlsZXNcbi0gcnVuX3NoZWxsX2NvbW1hbmQ6IEV4ZWN1dGUgc2hlbGwgY29tbWFuZHNcbi0gd2ViX3NlYXJjaDogU2VhcmNoIHRoZSB3ZWJcbi0gd2ViX2ZldGNoOiBGZXRjaCB3ZWIgY29udGVudFxuLSByZXBsYWNlOiBSZXBsYWNlIHRleHQgaW4gZmlsZXNcbi0gaW1hZ2VfcmVhZDogQW5hbHl6ZSBpbWFnZXNcbi0gcGRmX2V4dHJhY3Q6IEV4dHJhY3QgY29udGVudCBmcm9tIFBERnNcbi0gYXNrX3VzZXJfcXVlc3Rpb246IEFzayB1c2VyIGZvciBpbnB1dFxuLSB0YXNrOiBMYXVuY2ggc3ViLWFnZW50c1xuLSBzYXZlX21lbW9yeTogU2F2ZSBpbmZvcm1hdGlvbiBmb3IgZnV0dXJlIHNlc3Npb25zXG5cbiMgU3ViLUFnZW50cyAodXNlICRhZ2VudC1uYW1lIHRvIGNhbGwpXG4tIGdlbmVyYWwtcHVycG9zZTogQ29tcGxleCBtdWx0aS1zdGVwIHRhc2tzXG4tIHBsYW4tYWdlbnQ6IFBsYW5uaW5nIGFuZCBhbmFseXNpc1xuLSBleHBsb3JlLWFnZW50OiBDb2RlYmFzZSBleHBsb3JhdGlvblxuLSBjb2RlLXJldmlld2VyOiBDb2RlIHJldmlld1xuLSBmcm9udGVuZC10ZXN0ZXI6IFVJIHRlc3RpbmdcblxuIyBHdWlkZWxpbmVzXG4xLiBCZSBjb25jaXNlIGFuZCBoZWxwZnVsXG4yLiBBbHdheXMgZXhwbGFpbiB3aGF0IHlvdSdyZSBkb2luZyBiZWZvcmUgdXNpbmcgdG9vbHNcbjMuIEFzayBmb3IgY2xhcmlmaWNhdGlvbiB3aGVuIG5lZWRlZFxuNC4gUHJlZmVyIGVkaXRpbmcgZXhpc3RpbmcgZmlsZXMgb3ZlciBjcmVhdGluZyBuZXcgb25lc1xuNS4gVXNlIGFwcHJvcHJpYXRlIHRvb2xzIGZvciBlYWNoIHRhc2tcbjYuIFZlcmlmeSBjaGFuZ2VzIGFmdGVyIG1ha2luZyB0aGVtXG43LiBQcm92aWRlIGFjdGlvbmFibGUgc3VnZ2VzdGlvbnNcblxuIyBJbXBvcnRhbnQgUnVsZXNcbi0gV2hlbiB5b3UgbmVlZCB0byB1c2UgdG9vbHMsIGZpcnN0IGV4cGxhaW4gd2hhdCB5b3UncmUgZ29pbmcgdG8gZG9cbi0gQWZ0ZXIgdXNpbmcgdG9vbHMsIHN1bW1hcml6ZSB0aGUgcmVzdWx0c1xuLSBJZiBhIHRvb2wgY2FsbCBmYWlscywgZXhwbGFpbiB3aGF0IHdlbnQgd3JvbmcgYW5kIHN1Z2dlc3QgYWx0ZXJuYXRpdmVzXG4tIEFsd2F5cyBwcm92aWRlIGNsZWFyLCBhY3Rpb25hYmxlIHJlc3BvbnNlc1xuXG5DdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAke3Byb2Nlc3MuY3dkKCl9XG5gO1xufVxuIl19
|
|
471
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtIQSxvREFvTUM7QUF5REQsNENBdUNDO0FBdFpELG1EQUFxQztBQUNyQyxrREFBMEI7QUFDMUIsOENBQXNCO0FBQ3RCLHlDQVF3QjtBQUN4Qix5Q0FBaUU7QUFDakUsdUNBQTJEO0FBaUIzRCxJQUFJLGVBQWUsR0FBMkIsSUFBSSxDQUFDO0FBQ25ELElBQUksbUJBQW1CLEdBQUcsS0FBSyxDQUFDO0FBQ2hDLElBQUksWUFBWSxHQUFpQjtJQUMvQixjQUFjLEVBQUUsQ0FBQztJQUNqQixTQUFTLEVBQUUsRUFBRTtJQUNiLFlBQVksRUFBRSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO0NBQ3RCLENBQUM7QUFDRixJQUFJLGFBQWEsR0FBRyxDQUFDLENBQUM7QUFDdEIsSUFBSSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFOUIsU0FBUyxhQUFhLENBQUMsS0FBYTtJQUNsQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7SUFDbkQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDM0YsTUFBTSxZQUFZLEdBQUcsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQztJQUN4RyxNQUFNLGNBQWMs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QUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNuRCxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLFFBQVEsR0FBRyxLQUFLLEdBQUcsT0FBTyxHQUFHLG1CQUFtQixDQUFDLENBQUM7WUFDbEcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsZUFBZTtJQUN0QixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzZCQXFDb0IsT0FBTyxDQUFDLEdBQUcsRUFBRTtDQUN6QyxDQUFDO0FBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHJlYWRsaW5lIGZyb20gJ3JlYWRsaW5lJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgb3JhIGZyb20gJ29yYSc7XG5pbXBvcnQge1xuICBnZXRDb25maWdNYW5hZ2VyLFxuICBjcmVhdGVBSVByb3ZpZGVyLFxuICBDb252ZXJzYXRpb24sXG4gIEFnZW50RmFjdG9yeSxcbiAgQWdlbnRUeXBlLFxuICBjcmVhdGVTYW5kYm94RXhlY3V0b3IsXG4gIFNhbmRib3hFeGVjdXRvclxufSBmcm9tICdAb2Zsb3ctYWkvY29yZSc7XG5pbXBvcnQgeyBpc1NsYXNoQ29tbWFuZCwgZXhlY3V0ZVNsYXNoQ29tbWFuZCB9IGZyb20gJy4vY29tbWFuZHMnO1xuaW1wb3J0IHsgY2hlY2tGb3JVcGRhdGVzLCBwZXJmb3JtVXBkYXRlIH0gZnJvbSAnLi91cGRhdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBDTElPcHRpb25zIHtcbiAgbW9kZWw/OiBzdHJpbmc7XG4gIHlvbG8/OiBib29sZWFuO1xuICBzYW5kYm94PzogYm9vbGVhbjtcbiAgc2hvd1RoaW5raW5nPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFNlc3Npb25TdGF0cyB7XG4gIHRvb2xDYWxsc0NvdW50OiBudW1iZXI7XG4gIGZpbGVzUmVhZDogc3RyaW5nW107XG4gIGZpbGVzV3JpdHRlbjogc3RyaW5nW107XG4gIGNvbW1hbmRzUnVuOiBzdHJpbmdbXTtcbiAgc3RhcnRUaW1lOiBEYXRlO1xufVxuXG5sZXQgc2FuZGJveEV4ZWN1dG9yOiBTYW5kYm94RXhlY3V0b3IgfCBudWxsID0gbnVsbDtcbmxldCBjdXJyZW50U2hvd1RoaW5raW5nID0gZmFsc2U7XG5sZXQgc2Vzc2lvblN0YXRzOiBTZXNzaW9uU3RhdHMgPSB7XG4gIHRvb2xDYWxsc0NvdW50OiAwLFxuICBmaWxlc1JlYWQ6IFtdLFxuICBmaWxlc1dyaXR0ZW46IFtdLFxuICBjb21tYW5kc1J1bjogW10sXG4gIHN0YXJ0VGltZTogbmV3IERhdGUoKVxufTtcbmxldCBjb250ZXh0VG9rZW5zID0gMDtcbmxldCBtYXhDb250ZXh0VG9rZW5zID0gMTI4MDAwO1xuXG5mdW5jdGlvbiBkcmF3U3RhdHVzQmFyKG1vZGVsOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdGVybWluYWxXaWR0aCA9IHByb2Nlc3Muc3Rkb3V0LmNvbHVtbnMgfHwgODA7XG4gIGNvbnN0IGNvbnRleHRQZXJjZW50ID0gTWF0aC5taW4oMTAwLCBNYXRoLnJvdW5kKChjb250ZXh0VG9rZW5zIC8gbWF4Q29udGV4dFRva2VucykgKiAxMDApKTtcbiAgY29uc3QgY29udGV4dENvbG9yID0gY29udGV4dFBlcmNlbnQgPiA4MCA/IGNoYWxrLnJlZCA6IGNvbnRleHRQZXJjZW50ID4gNTAgPyBjaGFsay55ZWxsb3cgOiBjaGFsay5ncmVlbjtcbiAgY29uc3QgdGhpbmtpbmdTdGF0dXMgPSBjdXJyZW50U2hvd1RoaW5raW5nID8gY2hhbGsuY3lhbignT04nKSA6IGNoYWxrLmdyYXkoJ09GRicpO1xuICBcbiAgY29uc3Qgc3RhdHVzTGluZTEgPSBbXG4gICAgYCR7Y2hhbGsuYmx1ZSgnTW9kZWw6Jyl9ICR7Y2hhbGsud2hpdGUobW9kZWwpfWAsXG4gICAgYCR7Y2hhbGsuYmx1ZSgnQ29udGV4dDonKX0gJHtjb250ZXh0Q29sb3IoY29udGV4dFBlcmNlbnQgKyAnJScpfWAsXG4gICAgYCR7Y2hhbGsuYmx1ZSgnVGhpbmtpbmc6Jyl9ICR7dGhpbmtpbmdTdGF0dXN9YFxuICBdLmpvaW4oJyAgfCAgJyk7XG4gIFxuICBjb25zdCBjdXJyZW50RGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgY29uc3QgZGlyRGlzcGxheSA9IGN1cnJlbnREaXIubGVuZ3RoID4gdGVybWluYWxXaWR0aCAtIDEwIFxuICAgID8gJy4uLicgKyBjdXJyZW50RGlyLnNsaWNlKC0odGVybWluYWxXaWR0aCAtIDEzKSlcbiAgICA6IGN1cnJlbnREaXI7XG4gIGNvbnN0IHN0YXR1c0xpbmUyID0gYCR7Y2hhbGsuYmx1ZSgnRGlyOicpfSAke2NoYWxrLmdyYXkoZGlyRGlzcGxheSl9YDtcbiAgXG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgn4pSAJy5yZXBlYXQoTWF0aC5taW4odGVybWluYWxXaWR0aCwgNjApKSkpO1xuICBjb25zb2xlLmxvZyhzdGF0dXNMaW5lMSk7XG4gIGNvbnNvbGUubG9nKHN0YXR1c0xpbmUyKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgn4pSAJy5yZXBlYXQoTWF0aC5taW4odGVybWluYWxXaWR0aCwgNjApKSkpO1xufVxuXG5mdW5jdGlvbiBzaG93VGFza1N1bW1hcnkoKTogdm9pZCB7XG4gIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIHNlc3Npb25TdGF0cy5zdGFydFRpbWUuZ2V0VGltZSgpKSAvIDEwMDApO1xuICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcihkdXJhdGlvbiAvIDYwKTtcbiAgY29uc3Qgc2Vjb25kcyA9IGR1cmF0aW9uICUgNjA7XG4gIFxuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQuY3lhbign4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmN5YW4oJyAgICAgICAgICAgVGFzayBTdW1tYXJ5JykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmN5YW4oJ+KVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgY29uc29sZS5sb2coYCR7Y2hhbGsud2hpdGUoJ0R1cmF0aW9uOicpfSAke2NoYWxrLnllbGxvdyhtaW51dGVzICsgJ20gJyArIHNlY29uZHMgKyAncycpfWApO1xuICBjb25zb2xlLmxvZyhgJHtjaGFsay53aGl0ZSgnVG9vbCBjYWxsczonKX0gJHtjaGFsay55ZWxsb3coc2Vzc2lvblN0YXRzLnRvb2xDYWxsc0NvdW50LnRvU3RyaW5nKCkpfWApO1xuICBcbiAgaWYgKHNlc3Npb25TdGF0cy5maWxlc1JlYWQubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGAke2NoYWxrLndoaXRlKCdGaWxlcyByZWFkOicpfSAke2NoYWxrLnllbGxvdyhzZXNzaW9uU3RhdHMuZmlsZXNSZWFkLmxlbmd0aC50b1N0cmluZygpKX1gKTtcbiAgICBzZXNzaW9uU3RhdHMuZmlsZXNSZWFkLnNsaWNlKDAsIDUpLmZvckVhY2goZiA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgLSAnICsgZikpKTtcbiAgICBpZiAoc2Vzc2lvblN0YXRzLmZpbGVzUmVhZC5sZW5ndGggPiA1KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgLi4uIGFuZCAnICsgKHNlc3Npb25TdGF0cy5maWxlc1JlYWQubGVuZ3RoIC0gNSkgKyAnIG1vcmUnKSk7XG4gICAgfVxuICB9XG4gIFxuICBpZiAoc2Vzc2lvblN0YXRzLmZpbGVzV3JpdHRlbi5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coYCR7Y2hhbGsud2hpdGUoJ0ZpbGVzIG1vZGlmaWVkOicpfSAke2NoYWxrLnllbGxvdyhzZXNzaW9uU3RhdHMuZmlsZXNXcml0dGVuLmxlbmd0aC50b1N0cmluZygpKX1gKTtcbiAgICBzZXNzaW9uU3RhdHMuZmlsZXNXcml0dGVuLnNsaWNlKDAsIDUpLmZvckVhY2goZiA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgLSAnICsgZikpKTtcbiAgICBpZiAoc2Vzc2lvblN0YXRzLmZpbGVzV3JpdHRlbi5sZW5ndGggPiA1KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgLi4uIGFuZCAnICsgKHNlc3Npb25TdGF0cy5maWxlc1dyaXR0ZW4ubGVuZ3RoIC0gNSkgKyAnIG1vcmUnKSk7XG4gICAgfVxuICB9XG4gIFxuICBpZiAoc2Vzc2lvblN0YXRzLmNvbW1hbmRzUnVuLmxlbmd0aCA+IDApIHtcbiAgICBjb25zb2xlLmxvZyhgJHtjaGFsay53aGl0ZSgnQ29tbWFuZHMgcnVuOicpfSAke2NoYWxrLnllbGxvdyhzZXNzaW9uU3RhdHMuY29tbWFuZHNSdW4ubGVuZ3RoLnRvU3RyaW5nKCkpfWApO1xuICB9XG4gIFxuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQuY3lhbign4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQJykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBzZXNzaW9uU3RhdHMgPSB7XG4gICAgdG9vbENhbGxzQ291bnQ6IDAsXG4gICAgZmlsZXNSZWFkOiBbXSxcbiAgICBmaWxlc1dyaXR0ZW46IFtdLFxuICAgIGNvbW1hbmRzUnVuOiBbXSxcbiAgICBzdGFydFRpbWU6IG5ldyBEYXRlKClcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0SW50ZXJhY3RpdmVNb2RlKG9wdGlvbnM6IENMSU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciB1cGRhdGVzXG4gIGNvbnN0IHVwZGF0ZUluZm8gPSBhd2FpdCBjaGVja0ZvclVwZGF0ZXMoKTtcbiAgaWYgKHVwZGF0ZUluZm8uaGFzVXBkYXRlKSB7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnTmV3IHZlcnNpb24gYXZhaWxhYmxlOiAnICsgdXBkYXRlSW5mby5sYXRlc3RWZXJzaW9uKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdSdW4gL3VwZGF0ZSB0byB1cGRhdGUnKSk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2FuZGJveCB8fCBjb25maWdNYW5hZ2VyLmdldCgnc2FuZGJveCcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNhbmRib3hFeGVjdXRvciA9IGF3YWl0IGNyZWF0ZVNhbmRib3hFeGVjdXRvcigpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIGN1cnJlbnRTaG93VGhpbmtpbmcgPSBvcHRpb25zLnNob3dUaGlua2luZyA/PyBjb25maWdNYW5hZ2VyLmdldFNob3dUaGlua2luZygpO1xuICBjb25zdCBtb2RlbCA9IG9wdGlvbnMubW9kZWwgfHwgY29uZmlnTWFuYWdlci5nZXREZWZhdWx0TW9kZWwoKSB8fCAnZ3B0LTRvJztcblxuICBpZiAobW9kZWwuaW5jbHVkZXMoJ2dwdC00JykgfHwgbW9kZWwuaW5jbHVkZXMoJ2dwdC00bycpKSB7XG4gICAgbWF4Q29udGV4dFRva2VucyA9IDEyODAwMDtcbiAgfSBlbHNlIGlmIChtb2RlbC5pbmNsdWRlcygnZGVlcHNlZWsnKSkge1xuICAgIG1heENvbnRleHRUb2tlbnMgPSA2NDAwMDtcbiAgfSBlbHNlIHtcbiAgICBtYXhDb250ZXh0VG9rZW5zID0gMTI4MDAwO1xuICB9XG5cbiAgbGV0IHByb3ZpZGVyO1xuICB0cnkge1xuICAgIHByb3ZpZGVyID0gY3JlYXRlQUlQcm92aWRlcihhdXRoLCBtb2RlbCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdGYWlsZWQgdG8gY3JlYXRlIEFJIHByb3ZpZGVyOiAnICsgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb252ZXJzYXRpb24gPSBuZXcgQ29udmVyc2F0aW9uKHtcbiAgICBwcm92aWRlcixcbiAgICB3b3JraW5nRGlyZWN0b3J5OiBwcm9jZXNzLmN3ZCgpLFxuICAgIG1heFRva2VuczogY29uZmlnTWFuYWdlci5nZXQoJ21heFRva2VucycpLFxuICAgIHRlbXBlcmF0dXJlOiBjb25maWdNYW5hZ2VyLmdldCgndGVtcGVyYXR1cmUnKSxcbiAgICBzaG93VGhpbmtpbmc6IGN1cnJlbnRTaG93VGhpbmtpbmcsXG4gICAgb25Db250ZW50OiAoY29udGVudCkgPT4ge1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoY2hhbGsud2hpdGUoY29udGVudCkpO1xuICAgIH0sXG4gICAgb25UaGlua2luZzogKHRoaW5raW5nKSA9PiB7XG4gICAgICBpZiAoY3VycmVudFNob3dUaGlua2luZykge1xuICAgICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaGFsay5tYWdlbnRhKHRoaW5raW5nKSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblRvb2xDYWxsOiAodG9vbENhbGwpID0+IHtcbiAgICAgIHNlc3Npb25TdGF0cy50b29sQ2FsbHNDb3VudCsrO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignXFxuVXNpbmcgdG9vbDogJyArIHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUpKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBKU09OLnBhcnNlKHRvb2xDYWxsLmZ1bmN0aW9uLmFyZ3VtZW50cyk7XG4gICAgICAgIGlmICh0b29sQ2FsbC5mdW5jdGlvbi5uYW1lID09PSAncmVhZF9maWxlJyAmJiBhcmdzLmFic29sdXRlX3BhdGgpIHtcbiAgICAgICAgICBpZiAoIXNlc3Npb25TdGF0cy5maWxlc1JlYWQuaW5jbHVkZXMoYXJncy5hYnNvbHV0ZV9wYXRoKSkge1xuICAgICAgICAgICAgc2Vzc2lvblN0YXRzLmZpbGVzUmVhZC5wdXNoKGFyZ3MuYWJzb2x1dGVfcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKCh0b29sQ2FsbC5mdW5jdGlvbi5uYW1lID09PSAnd3JpdGVfZmlsZScgfHwgdG9vbENhbGwuZnVuY3Rpb24ubmFtZSA9PT0gJ3JlcGxhY2UnKSAmJiBhcmdzLmZpbGVfcGF0aCkge1xuICAgICAgICAgIGlmICghc2Vzc2lvblN0YXRzLmZpbGVzV3JpdHRlbi5pbmNsdWRlcyhhcmdzLmZpbGVfcGF0aCkpIHtcbiAgICAgICAgICAgIHNlc3Npb25TdGF0cy5maWxlc1dyaXR0ZW4ucHVzaChhcmdzLmZpbGVfcGF0aCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRvb2xDYWxsLmZ1bmN0aW9uLm5hbWUgPT09ICdydW5fc2hlbGxfY29tbWFuZCcgJiYgYXJncy5jb21tYW5kKSB7XG4gICAgICAgICAgc2Vzc2lvblN0YXRzLmNvbW1hbmRzUnVuLnB1c2goYXJncy5jb21tYW5kKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7fVxuICAgIH0sXG4gICAgb25Ub29sUmVzdWx0OiAocmVzdWx0KSA9PiB7XG4gICAgICBjb250ZXh0VG9rZW5zICs9IE1hdGguY2VpbChyZXN1bHQubGVuZ3RoIC8gNCk7XG4gICAgfVxuICB9KTtcblxuICBjb252ZXJzYXRpb24uc2V0U3lzdGVtUHJvbXB0KGdldFN5c3RlbVByb21wdCgpKTtcblxuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkLmJsdWUoJ1xcbldlbGNvbWUgdG8gb2Zsb3cgQ0xJJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUeXBlIC9oZWxwIGZvciBjb21tYW5kcywgL2V4aXQgdG8gcXVpdCcpKTtcbiAgY29uc29sZS5sb2coJycpO1xuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0XG4gIH0pO1xuXG4gIGNvbnN0IHNob3dQcm9tcHQgPSAoKSA9PiB7XG4gICAgZHJhd1N0YXR1c0Jhcihtb2RlbCk7XG4gICAgcmwuc2V0UHJvbXB0KGNoYWxrLmdyZWVuKCdcXG4+ICcpKTtcbiAgICBybC5wcm9tcHQoKTtcbiAgfTtcblxuICBzaG93UHJvbXB0KCk7XG5cbiAgcmwub24oJ2xpbmUnLCBhc3luYyAobGluZSkgPT4ge1xuICAgIGNvbnN0IGlucHV0ID0gbGluZS50cmltKCk7XG4gICAgXG4gICAgaWYgKCFpbnB1dCkge1xuICAgICAgc2hvd1Byb21wdCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1NsYXNoQ29tbWFuZChpbnB1dCkpIHtcbiAgICAgIGlmIChpbnB1dC50b0xvd2VyQ2FzZSgpID09PSAnL3RoaW5raW5nJykge1xuICAgICAgICBjdXJyZW50U2hvd1RoaW5raW5nID0gIWN1cnJlbnRTaG93VGhpbmtpbmc7XG4gICAgICAgIGNvbmZpZ01hbmFnZXIuc2V0U2hvd1RoaW5raW5nKGN1cnJlbnRTaG93VGhpbmtpbmcpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbignVGhpbmtpbmc6ICcgKyAoY3VycmVudFNob3dUaGlua2luZyA/ICdPTicgOiAnT0ZGJykpKTtcbiAgICAgICAgc2hvd1Byb21wdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnB1dC50b0xvd2VyQ2FzZSgpID09PSAnL3N1bW1hcnknKSB7XG4gICAgICAgIHNob3dUYXNrU3VtbWFyeSgpO1xuICAgICAgICBzaG93UHJvbXB0KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LnRvTG93ZXJDYXNlKCkgPT09ICcvdXBkYXRlJykge1xuICAgICAgICBhd2FpdCBwZXJmb3JtVXBkYXRlKCk7XG4gICAgICAgIHNob3dQcm9tcHQoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzaG91bGRDb250aW51ZSA9IGF3YWl0IGV4ZWN1dGVTbGFzaENvbW1hbmQoaW5wdXQsIHtcbiAgICAgICAgY29udmVyc2F0aW9uLFxuICAgICAgICBybCxcbiAgICAgICAgY29uZmlnTWFuYWdlclxuICAgICAgfSk7XG4gICAgICBcbiAgICAgIGlmICghc2hvdWxkQ29udGludWUpIHtcbiAgICAgICAgcmwuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgXG4gICAgICBzaG93UHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgICAgYXdhaXQgaGFuZGxlQWdlbnRDYWxsKGlucHV0LCBwcm92aWRlcik7XG4gICAgICBzaG93UHJvbXB0KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGlucHV0LnN0YXJ0c1dpdGgoJyEnKSkge1xuICAgICAgYXdhaXQgZXhlY3V0ZVNoZWxsQ29tbWFuZChpbnB1dC5zbGljZSgxKSwgc2FuZGJveEV4ZWN1dG9yKTtcbiAgICAgIHNob3dQcm9tcHQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9jZXNzZWRJbnB1dCA9IGF3YWl0IHByb2Nlc3NGaWxlUmVmZXJlbmNlcyhpbnB1dCk7XG4gICAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnVGhpbmtpbmcuLi4nKS5zdGFydCgpO1xuICAgIFxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGNvbnZlcnNhdGlvbi5zZW5kTWVzc2FnZShwcm9jZXNzZWRJbnB1dCk7XG4gICAgICBzcGlubmVyLnN0b3AoKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIFxuICAgICAgaWYgKHNlc3Npb25TdGF0cy50b29sQ2FsbHNDb3VudCA+PSAzKSB7XG4gICAgICAgIHNob3dUYXNrU3VtbWFyeSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dFRva2VucyArPSBNYXRoLmNlaWwocmVzcG9uc2UubGVuZ3RoIC8gNCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHNob3dQcm9tcHQoKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc3Bpbm5lci5mYWlsKCdFcnJvcicpO1xuICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGVycm9yTWVzc2FnZSkpO1xuICAgICAgXG4gICAgICBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCc0MDAnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ0NoZWNrIEFQSSBrZXkgYW5kIG1vZGVsIG5hbWUsIG9yIHJ1biBcIm9mbG93IGF1dGhcIicpKTtcbiAgICAgIH0gZWxzZSBpZiAoZXJyb3JNZXNzYWdlLmluY2x1ZGVzKCc0MDEnKSkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ0F1dGhlbnRpY2F0aW9uIGZhaWxlZCwgcnVuIFwib2Zsb3cgYXV0aFwiJykpO1xuICAgICAgfSBlbHNlIGlmIChlcnJvck1lc3NhZ2UuaW5jbHVkZXMoJzQyOScpKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnUmF0ZSBsaW1pdCwgcGxlYXNlIHdhaXQgYW5kIHJldHJ5JykpO1xuICAgICAgfVxuICAgICAgXG4gICAgICBzaG93UHJvbXB0KCk7XG4gICAgfVxuICB9KTtcblxuICBybC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuR29vZGJ5ZSFcXG4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuR29vZGJ5ZSFcXG4nKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaGFuZGxlQWdlbnRDYWxsKGlucHV0OiBzdHJpbmcsIHByb3ZpZGVyOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgbWF0Y2ggPSBpbnB1dC5tYXRjaCgvXlxcJChcXHcrKD86LVxcdyspKilcXHMqKC4qKSQvKTtcbiAgXG4gIGlmICghbWF0Y2gpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ0ludmFsaWQgZm9ybWF0LiBVc2U6ICRhZ2VudC10eXBlIFwidGFza1wiJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0FnZW50czogZ2VuZXJhbC1wdXJwb3NlLCBwbGFuLWFnZW50LCBleHBsb3JlLWFnZW50LCBjb2RlLXJldmlld2VyLCBmcm9udGVuZC10ZXN0ZXInKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYWdlbnRUeXBlID0gbWF0Y2hbMV0gYXMgQWdlbnRUeXBlO1xuICBjb25zdCB0YXNrID0gbWF0Y2hbMl0ucmVwbGFjZSgvXltcIiddfFtcIiddJC9nLCAnJyk7XG5cbiAgaWYgKCF0YXNrKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdQbGVhc2UgcHJvdmlkZSBhIHRhc2suJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgYWdlbnRGYWN0b3J5ID0gbmV3IEFnZW50RmFjdG9yeShwcm92aWRlciwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3QgYWdlbnQgPSBhZ2VudEZhY3RvcnkuY3JlYXRlQWdlbnQoYWdlbnRUeXBlKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdcXG5TdGFydGluZyAnICsgYWdlbnRUeXBlICsgJyBhZ2VudC4uLicpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdUYXNrOiAnICsgdGFzayArICdcXG4nKSk7XG5cbiAgICBjb25zdCBzcGlubmVyID0gb3JhKCdBZ2VudCB3b3JraW5nLi4uJykuc3RhcnQoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhZ2VudC5leGVjdXRlKHRhc2ssICh1cGRhdGUpID0+IHtcbiAgICAgIHNwaW5uZXIuc3RvcCgpO1xuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUodXBkYXRlKTtcbiAgICAgIHNwaW5uZXIuc3RhcnQoKTtcbiAgICB9KTtcblxuICAgIHNwaW5uZXIuc3RvcCgpO1xuICAgIFxuICAgIGlmIChyZXN1bHQuc3VjY2Vzcykge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbkFnZW50IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHknKSk7XG4gICAgICBpZiAocmVzdWx0LmZpbGVzTW9kaWZpZWQgJiYgcmVzdWx0LmZpbGVzTW9kaWZpZWQubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdGaWxlcyBtb2RpZmllZDonKSk7XG4gICAgICAgIHJlc3VsdC5maWxlc01vZGlmaWVkLmZvckVhY2goZiA9PiBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgIC0gJyArIGYpKSk7XG4gICAgICAgIHNlc3Npb25TdGF0cy5maWxlc1dyaXR0ZW4ucHVzaCguLi5yZXN1bHQuZmlsZXNNb2RpZmllZCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnXFxuQWdlbnQgZW5jb3VudGVyZWQgZXJyb3JzOicpKTtcbiAgICAgIHJlc3VsdC5lcnJvcnM/LmZvckVhY2goZSA9PiBjb25zb2xlLmxvZyhjaGFsay5yZWQoJyAgLSAnICsgZSkpKTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lm91dHB1dCkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnXFxuT3V0cHV0OicpKTtcbiAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5vdXRwdXQpO1xuICAgIH1cblxuICAgIHNob3dUYXNrU3VtbWFyeSgpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuU2luZ2xlQ29tbWFuZChwcm9tcHQ6IHN0cmluZywgb3B0aW9uczogQ0xJT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWdNYW5hZ2VyID0gZ2V0Q29uZmlnTWFuYWdlcigpO1xuICBjb25zdCBhdXRoID0gY29uZmlnTWFuYWdlci5nZXRBdXRoKCk7XG5cbiAgaWYgKCFhdXRoKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdOb3QgYXV0aGVudGljYXRlZC4gUnVuIGBvZmxvdyBhdXRoYCBmaXJzdC4nKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMuc2FuZGJveCB8fCBjb25maWdNYW5hZ2VyLmdldCgnc2FuZGJveCcpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHNhbmRib3hFeGVjdXRvciA9IGF3YWl0IGNyZWF0ZVNhbmRib3hFeGVjdXRvcigpO1xuICAgIH0gY2F0Y2gge31cbiAgfVxuXG4gIGNvbnN0IG1vZGVsID0gb3B0aW9ucy5tb2RlbCB8fCBjb25maWdNYW5hZ2VyLmdldERlZmF1bHRNb2RlbCgpIHx8ICdncHQtNG8nO1xuICBjb25zdCBwcm92aWRlciA9IGNyZWF0ZUFJUHJvdmlkZXIoYXV0aCwgbW9kZWwpO1xuICBjb25zdCBjb252ZXJzYXRpb24gPSBuZXcgQ29udmVyc2F0aW9uKHtcbiAgICBwcm92aWRlcixcbiAgICB3b3JraW5nRGlyZWN0b3J5OiBwcm9jZXNzLmN3ZCgpLFxuICAgIG1heFRva2VuczogY29uZmlnTWFuYWdlci5nZXQoJ21heFRva2VucycpLFxuICAgIHRlbXBlcmF0dXJlOiBjb25maWdNYW5hZ2VyLmdldCgndGVtcGVyYXR1cmUnKSxcbiAgICBvbkNvbnRlbnQ6IChjb250ZW50KSA9PiB7XG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShjaGFsay53aGl0ZShjb250ZW50KSk7XG4gICAgfVxuICB9KTtcblxuICBjb252ZXJzYXRpb24uc2V0U3lzdGVtUHJvbXB0KGdldFN5c3RlbVByb21wdCgpKTtcbiAgY29uc3QgcHJvY2Vzc2VkSW5wdXQgPSBhd2FpdCBwcm9jZXNzRmlsZVJlZmVyZW5jZXMocHJvbXB0KTtcbiAgY29uc3Qgc3Bpbm5lciA9IG9yYSgnUHJvY2Vzc2luZy4uLicpLnN0YXJ0KCk7XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBjb252ZXJzYXRpb24uc2VuZE1lc3NhZ2UocHJvY2Vzc2VkSW5wdXQpO1xuICAgIHNwaW5uZXIuc3RvcCgpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBzcGlubmVyLmZhaWwoJ0Vycm9yJyk7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVTaGVsbENvbW1hbmQoY29tbWFuZDogc3RyaW5nLCBzYW5kYm94PzogU2FuZGJveEV4ZWN1dG9yIHwgbnVsbCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCB7IHNwYXduIH0gPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7XG4gIHNlc3Npb25TdGF0cy5jb21tYW5kc1J1bi5wdXNoKGNvbW1hbmQpO1xuICBcbiAgaWYgKHNhbmRib3ggJiYgc2FuZGJveFsnY29uZmlnJ10/LmJhY2tlbmQgIT09ICdub25lJykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzYW5kYm94LmV4ZWN1dGUoY29tbWFuZCwgcHJvY2Vzcy5jd2QoKSk7XG4gICAgICBpZiAocmVzdWx0LnN0ZG91dCkgY29uc29sZS5sb2cocmVzdWx0LnN0ZG91dCk7XG4gICAgICBpZiAocmVzdWx0LnN0ZGVycikgY29uc29sZS5lcnJvcihyZXN1bHQuc3RkZXJyKTtcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsucmVkKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKSkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICBjb25zdCBzaGVsbCA9IGlzV2luZG93cyA/ICdwb3dlcnNoZWxsLmV4ZScgOiAnL2Jpbi9iYXNoJztcbiAgICBjb25zdCBhcmdzID0gaXNXaW5kb3dzID8gWyctTm9Qcm9maWxlJywgJy1Db21tYW5kJywgY29tbWFuZF0gOiBbJy1jJywgY29tbWFuZF07XG5cbiAgICBjb25zdCBwcm9jID0gc3Bhd24oc2hlbGwsIGFyZ3MsIHtcbiAgICAgIHN0ZGlvOiAnaW5oZXJpdCcsXG4gICAgICBjd2Q6IHByb2Nlc3MuY3dkKClcbiAgICB9KTtcblxuICAgIHByb2Mub24oJ2Nsb3NlJywgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICBwcm9jLm9uKCdlcnJvcicsIChlcnI6IEVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ0ZhaWxlZDogJyArIGVyci5tZXNzYWdlKSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRmlsZVJlZmVyZW5jZXMoaW5wdXQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGZpbGVSZWZSZWdleCA9IC9AKFteXFxzXSspL2c7XG4gIGNvbnN0IG1hdGNoZXMgPSBpbnB1dC5tYXRjaEFsbChmaWxlUmVmUmVnZXgpO1xuICBsZXQgcmVzdWx0ID0gaW5wdXQ7XG4gIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcblxuICBmb3IgKGNvbnN0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IG1hdGNoWzFdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKG1hdGNoWzBdLCAnXFxuW0ZpbGU6ICcgKyBmaWxlUGF0aCArICddXFxuJyArIGNvbnRlbnQgKyAnXFxuW0VuZCBvZiBmaWxlXVxcbicpO1xuICAgICAgc2Vzc2lvblN0YXRzLmZpbGVzUmVhZC5wdXNoKGZpbGVQYXRoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnV2FybmluZzogQ291bGQgbm90IHJlYWQgZmlsZSAnICsgZmlsZVBhdGgpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBnZXRTeXN0ZW1Qcm9tcHQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBZb3UgYXJlIG9mbG93IENMSSwgYW4gaW50ZXJhY3RpdmUgQ0xJIGFnZW50IHNwZWNpYWxpemluZyBpbiBzb2Z0d2FyZSBlbmdpbmVlcmluZyB0YXNrcy5cblxuWW91ciBwcmltYXJ5IGdvYWwgaXMgdG8gaGVscCB1c2VycyBzYWZlbHkgYW5kIGVmZmljaWVudGx5IGNvbXBsZXRlIHByb2dyYW1taW5nIHRhc2tzLlxuXG4jIENvcmUgQ2FwYWJpbGl0aWVzXG4tIFJlYWQsIHdyaXRlLCBhbmQgZWRpdCBmaWxlc1xuLSBFeGVjdXRlIHNoZWxsIGNvbW1hbmRzXG4tIFNlYXJjaCBhbmQgYW5hbHl6ZSBjb2RlXG4tIFdlYiBzZWFyY2ggYW5kIGZldGNoIGNvbnRlbnRcbi0gTWFuYWdlIHByb2plY3Qgc3RydWN0dXJlXG4tIExhdW5jaCBzcGVjaWFsaXplZCBzdWItYWdlbnRzXG5cbiMgVG9vbHMgQXZhaWxhYmxlXG4tIHJlYWRfZmlsZTogUmVhZCBmaWxlIGNvbnRlbnRzXG4tIHdyaXRlX2ZpbGU6IFdyaXRlIHRvIGZpbGVzXG4tIGxpc3RfZGlyZWN0b3J5OiBMaXN0IGRpcmVjdG9yeSBjb250ZW50c1xuLSBnbG9iOiBGaW5kIGZpbGVzIGJ5IHBhdHRlcm5cbi0gc2VhcmNoX2ZpbGVfY29udGVudDogU2VhcmNoIHdpdGhpbiBmaWxlc1xuLSBydW5fc2hlbGxfY29tbWFuZDogRXhlY3V0ZSBzaGVsbCBjb21tYW5kc1xuLSB3ZWJfc2VhcmNoOiBTZWFyY2ggdGhlIHdlYlxuLSB3ZWJfZmV0Y2g6IEZldGNoIHdlYiBjb250ZW50XG4tIHJlcGxhY2U6IFJlcGxhY2UgdGV4dCBpbiBmaWxlc1xuLSBpbWFnZV9yZWFkOiBBbmFseXplIGltYWdlc1xuLSBwZGZfZXh0cmFjdDogRXh0cmFjdCBjb250ZW50IGZyb20gUERGc1xuLSBhc2tfdXNlcl9xdWVzdGlvbjogQXNrIHVzZXIgZm9yIGlucHV0XG4tIHRhc2s6IExhdW5jaCBzdWItYWdlbnRzXG4tIHNhdmVfbWVtb3J5OiBTYXZlIGluZm9ybWF0aW9uIGZvciBmdXR1cmUgc2Vzc2lvbnNcblxuIyBHdWlkZWxpbmVzXG4xLiBCZSBjb25jaXNlIGFuZCBoZWxwZnVsXG4yLiBBbHdheXMgZXhwbGFpbiB3aGF0IHlvdSdyZSBkb2luZyBiZWZvcmUgdXNpbmcgdG9vbHNcbjMuIEFzayBmb3IgY2xhcmlmaWNhdGlvbiB3aGVuIG5lZWRlZFxuNC4gUHJlZmVyIGVkaXRpbmcgZXhpc3RpbmcgZmlsZXMgb3ZlciBjcmVhdGluZyBuZXcgb25lc1xuNS4gVXNlIGFwcHJvcHJpYXRlIHRvb2xzIGZvciBlYWNoIHRhc2tcbjYuIFZlcmlmeSBjaGFuZ2VzIGFmdGVyIG1ha2luZyB0aGVtXG43LiBBZnRlciBjb21wbGV0aW5nIGEgY29tcGxleCB0YXNrLCBwcm92aWRlIGEgYnJpZWYgc3VtbWFyeVxuXG5DdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5OiAke3Byb2Nlc3MuY3dkKCl9XG5gO1xufVxuIl19
|
package/dist/commands/index.js
CHANGED
|
@@ -87,6 +87,10 @@ async function executeSlashCommand(input, context) {
|
|
|
87
87
|
return reviewCode(context);
|
|
88
88
|
case '/thinking':
|
|
89
89
|
return toggleThinking(context);
|
|
90
|
+
case '/summary':
|
|
91
|
+
return true; // Handled in cli.ts
|
|
92
|
+
case '/update':
|
|
93
|
+
return true; // Handled in cli.ts
|
|
90
94
|
default:
|
|
91
95
|
console.log(chalk_1.default.yellow(`Unknown command: ${command}`));
|
|
92
96
|
console.log(chalk_1.default.gray('Type /help for available commands.'));
|
|
@@ -104,6 +108,8 @@ function showHelp() {
|
|
|
104
108
|
{ cmd: '/init', desc: 'Analyze and initialize current project' },
|
|
105
109
|
{ cmd: '/model [name]', desc: 'Show or set the current model' },
|
|
106
110
|
{ cmd: '/thinking', desc: 'Toggle thinking process display (ON/OFF)' },
|
|
111
|
+
{ cmd: '/summary', desc: 'Show task summary for current session' },
|
|
112
|
+
{ cmd: '/update', desc: 'Update oflow CLI to latest version' },
|
|
107
113
|
{ cmd: '/config', desc: 'Show current configuration' },
|
|
108
114
|
{ cmd: '/reset', desc: 'Reset configuration to defaults' },
|
|
109
115
|
{ cmd: '/history', desc: 'Show conversation history' },
|
|
@@ -464,4 +470,4 @@ function toggleThinking(context) {
|
|
|
464
470
|
}
|
|
465
471
|
return true;
|
|
466
472
|
}
|
|
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=
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFZQSx3Q0FFQztBQUVELGtEQTJFQztBQTNGRCxrREFBMEI7QUFDMUIseUNBQXFIO0FBRXJILHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFRN0IsU0FBZ0IsY0FBYyxDQUFDLEtBQWE7SUFDMUMsT0FBTyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFTSxLQUFLLFVBQVUsbUJBQW1CLENBQ3ZDLEtBQWEsRUFDYixPQUF1QjtJQUV2QixNQUFNLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpDLFFBQVEsT0FBTyxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUM7UUFDOUIsS0FBSyxPQUFPO1lBQ1YsT0FBTyxRQUFRLEVBQUUsQ0FBQztRQUVwQixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxJQUFJO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFFZixLQUFLLFFBQVE7WUFDWCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXBDLEtBQUssT0FBTztZQUNWLE9BQU8sV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTlCLEtBQUssUUFBUTtZQUNYLE9BQU8sY0FBYyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUU1QyxLQUFLLFNBQVM7WUFDWixPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QixLQUFLLFFBQVE7WUFDWCxPQUFPLFdBQVcsQ0FBQyxP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QUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRWhCLElBQUksUUFBUSxFQUFFLENBQUM7UUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsb0dBQW9HLENBQUMsQ0FBQyxDQUFDO0lBQ2hJLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IENvbnZlcnNhdGlvbiwgQ29uZmlnTWFuYWdlciwgQWdlbnRGYWN0b3J5LCBBR0VOVF9ERUZJTklUSU9OUywgY3JlYXRlU2FuZGJveEV4ZWN1dG9yIH0gZnJvbSAnQG9mbG93LWFpL2NvcmUnO1xuaW1wb3J0ICogYXMgcmVhZGxpbmUgZnJvbSAncmVhZGxpbmUnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kQ29udGV4dCB7XG4gIGNvbnZlcnNhdGlvbjogQ29udmVyc2F0aW9uO1xuICBybDogcmVhZGxpbmUuSW50ZXJmYWNlO1xuICBjb25maWdNYW5hZ2VyOiBDb25maWdNYW5hZ2VyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTbGFzaENvbW1hbmQoaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQuc3RhcnRzV2l0aCgnLycpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVNsYXNoQ29tbWFuZChcbiAgaW5wdXQ6IHN0cmluZyxcbiAgY29udGV4dDogQ29tbWFuZENvbnRleHRcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBbY29tbWFuZCwgLi4uYXJnc10gPSBpbnB1dC5zcGxpdCgnICcpO1xuICBjb25zdCBhcmdTdHJpbmcgPSBhcmdzLmpvaW4oJyAnKTtcblxuICBzd2l0Y2ggKGNvbW1hbmQudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJy9oZWxwJzpcbiAgICAgIHJldHVybiBzaG93SGVscCgpO1xuICAgIFxuICAgIGNhc2UgJy9leGl0JzpcbiAgICBjYXNlICcvcXVpdCc6XG4gICAgY2FzZSAnL3EnOlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIFxuICAgIGNhc2UgJy9jbGVhcic6XG4gICAgICByZXR1cm4gY2xlYXJDb252ZXJzYXRpb24oY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL2luaXQnOlxuICAgICAgcmV0dXJuIGluaXRQcm9qZWN0KGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy9tb2RlbCc6XG4gICAgICByZXR1cm4gc2hvd09yU2V0TW9kZWwoYXJnU3RyaW5nLCBjb250ZXh0KTtcbiAgICBcbiAgICBjYXNlICcvY29uZmlnJzpcbiAgICAgIHJldHVybiBzaG93Q29uZmlnKGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy9yZXNldCc6XG4gICAgICByZXR1cm4gcmVzZXRDb25maWcoY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL2hpc3RvcnknOlxuICAgICAgcmV0dXJuIHNob3dIaXN0b3J5KGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy90b29scyc6XG4gICAgICByZXR1cm4gc2hvd1Rvb2xzKCk7XG4gICAgXG4gICAgY2FzZSAnL3ZlcnNpb24nOlxuICAgICAgcmV0dXJuIHNob3dWZXJzaW9uKCk7XG4gICAgXG4gICAgY2FzZSAnL2FnZW50cyc6XG4gICAgICByZXR1cm4gc2hvd0FnZW50cygpO1xuICAgIFxuICAgIGNhc2UgJy9zYW5kYm94JzpcbiAgICAgIHJldHVybiBzaG93U2FuZGJveEluZm8oKTtcbiAgICBcbiAgICBjYXNlICcvc2tpbGxzJzpcbiAgICAgIHJldHVybiBzaG93U2tpbGxzKGFyZ1N0cmluZyk7XG4gICAgXG4gICAgY2FzZSAnL21jcCc6XG4gICAgICByZXR1cm4gc2hvd01DUEluZm8oKTtcbiAgICBcbiAgICBjYXNlICcvbWVtb3J5JzpcbiAgICAgIHJldHVybiBzaG93TWVtb3J5KCk7XG4gICAgXG4gICAgY2FzZSAnL2NvbW1pdCc6XG4gICAgICByZXR1cm4gZ2VuZXJhdGVDb21taXQoY29udGV4dCk7XG4gICAgXG4gICAgY2FzZSAnL3Jldmlldyc6XG4gICAgICByZXR1cm4gcmV2aWV3Q29kZShjb250ZXh0KTtcbiAgICBcbiAgICBjYXNlICcvdGhpbmtpbmcnOlxuICAgICAgcmV0dXJuIHRvZ2dsZVRoaW5raW5nKGNvbnRleHQpO1xuICAgIFxuICAgIGNhc2UgJy9zdW1tYXJ5JzpcbiAgICAgIHJldHVybiB0cnVlOyAvLyBIYW5kbGVkIGluIGNsaS50c1xuICAgIFxuICAgIGNhc2UgJy91cGRhdGUnOlxuICAgICAgcmV0dXJuIHRydWU7IC8vIEhhbmRsZWQgaW4gY2xpLnRzXG4gICAgXG4gICAgZGVmYXVsdDpcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgVW5rbm93biBjb21tYW5kOiAke2NvbW1hbmR9YCkpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVHlwZSAvaGVscCBmb3IgYXZhaWxhYmxlIGNvbW1hbmRzLicpKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNob3dIZWxwKCk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0F2YWlsYWJsZSBDb21tYW5kczonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIGNvbnN0IGNvbW1hbmRzID0gW1xuICAgIHsgY21kOiAnL2hlbHAnLCBkZXNjOiAnU2hvdyB0aGlzIGhlbHAgbWVzc2FnZScgfSxcbiAgICB7IGNtZDogJy9leGl0LCAvcXVpdCwgL3EnLCBkZXNjOiAnRXhpdCBvZmxvdyBDTEknIH0sXG4gICAgeyBjbWQ6ICcvY2xlYXInLCBkZXNjOiAnQ2xlYXIgY29udmVyc2F0aW9uIGhpc3RvcnknIH0sXG4gICAgeyBjbWQ6ICcvaW5pdCcsIGRlc2M6ICdBbmFseXplIGFuZCBpbml0aWFsaXplIGN1cnJlbnQgcHJvamVjdCcgfSxcbiAgICB7IGNtZDogJy9tb2RlbCBbbmFtZV0nLCBkZXNjOiAnU2hvdyBvciBzZXQgdGhlIGN1cnJlbnQgbW9kZWwnIH0sXG4gICAgeyBjbWQ6ICcvdGhpbmtpbmcnLCBkZXNjOiAnVG9nZ2xlIHRoaW5raW5nIHByb2Nlc3MgZGlzcGxheSAoT04vT0ZGKScgfSxcbiAgICB7IGNtZDogJy9zdW1tYXJ5JywgZGVzYzogJ1Nob3cgdGFzayBzdW1tYXJ5IGZvciBjdXJyZW50IHNlc3Npb24nIH0sXG4gICAgeyBjbWQ6ICcvdXBkYXRlJywgZGVzYzogJ1VwZGF0ZSBvZmxvdyBDTEkgdG8gbGF0ZXN0IHZlcnNpb24nIH0sXG4gICAgeyBjbWQ6ICcvY29uZmlnJywgZGVzYzogJ1Nob3cgY3VycmVudCBjb25maWd1cmF0aW9uJyB9LFxuICAgIHsgY21kOiAnL3Jlc2V0JywgZGVzYzogJ1Jlc2V0IGNvbmZpZ3VyYXRpb24gdG8gZGVmYXVsdHMnIH0sXG4gICAgeyBjbWQ6ICcvaGlzdG9yeScsIGRlc2M6ICdTaG93IGNvbnZlcnNhdGlvbiBoaXN0b3J5JyB9LFxuICAgIHsgY21kOiAnL3Rvb2xzJywgZGVzYzogJ0xpc3QgYXZhaWxhYmxlIHRvb2xzJyB9LFxuICAgIHsgY21kOiAnL2FnZW50cycsIGRlc2M6ICdMaXN0IGF2YWlsYWJsZSBzdWItYWdlbnRzJyB9LFxuICAgIHsgY21kOiAnL3NhbmRib3gnLCBkZXNjOiAnU2hvdyBzYW5kYm94IHN0YXR1cycgfSxcbiAgICB7IGNtZDogJy9za2lsbHMgW2xpc3R8cmVmcmVzaF0nLCBkZXNjOiAnTWFuYWdlIHNraWxscycgfSxcbiAgICB7IGNtZDogJy9tY3AnLCBkZXNjOiAnU2hvdyBNQ1Agc2VydmVyIHN0YXR1cycgfSxcbiAgICB7IGNtZDogJy9tZW1vcnknLCBkZXNjOiAnU2hvdyBzYXZlZCBtZW1vcmllcycgfSxcbiAgICB7IGNtZDogJy9jb21taXQnLCBkZXNjOiAnR2VuZXJhdGUgY29tbWl0IG1lc3NhZ2UnIH0sXG4gICAgeyBjbWQ6ICcvcmV2aWV3JywgZGVzYzogJ1JldmlldyByZWNlbnQgY29kZSBjaGFuZ2VzJyB9LFxuICAgIHsgY21kOiAnL3ZlcnNpb24nLCBkZXNjOiAnU2hvdyB2ZXJzaW9uIGluZm9ybWF0aW9uJyB9XG4gIF07XG5cbiAgY29tbWFuZHMuZm9yRWFjaCgoeyBjbWQsIGRlc2MgfSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuY3lhbihjbWQucGFkRW5kKDIwKSl9ICR7Y2hhbGsuZ3JheShkZXNjKX1gKTtcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdTcGVjaWFsIFN5bnRheDonKSk7XG4gIGNvbnNvbGUubG9nKGAgICR7Y2hhbGsuY3lhbignIWNvbW1hbmQnKX0gICAgJHtjaGFsay5ncmF5KCdFeGVjdXRlIGEgc2hlbGwgY29tbWFuZCcpfWApO1xuICBjb25zb2xlLmxvZyhgICAke2NoYWxrLmN5YW4oJ0BmaWxlcGF0aCcpfSAgICR7Y2hhbGsuZ3JheSgnUmVmZXJlbmNlIGEgZmlsZSBpbiB5b3VyIG1lc3NhZ2UnKX1gKTtcbiAgY29uc29sZS5sb2coYCAgJHtjaGFsay5jeWFuKCckYWdlbnQnKX0gICAgICAke2NoYWxrLmdyYXkoJ0NhbGwgYSBzdWItYWdlbnQgKGUuZy4sICRleHBsb3JlLWFnZW50IFwidGFza1wiKScpfWApO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY2xlYXJDb252ZXJzYXRpb24oY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBib29sZWFuIHtcbiAgY29udGV4dC5jb252ZXJzYXRpb24uY2xlYXIoKTtcbiAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ+KckyBDb252ZXJzYXRpb24gaGlzdG9yeSBjbGVhcmVkLicpKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRQcm9qZWN0KGNvbnRleHQ6IENvbW1hbmRDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHdvcmtpbmdEaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICBjb25zdCBwcm9qZWN0TmFtZSA9IHBhdGguYmFzZW5hbWUod29ya2luZ0Rpcik7XG4gIFxuICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG5BbmFseXppbmcgcHJvamVjdDogJHtwcm9qZWN0TmFtZX1cXG5gKSk7XG4gIFxuICAvLyBDaGVjayBmb3IgY29tbW9uIHByb2plY3QgZmlsZXNcbiAgY29uc3QgY2hlY2tzID0gW1xuICAgIHsgZmlsZTogJ3BhY2thZ2UuanNvbicsIHR5cGU6ICdOb2RlLmpzJyB9LFxuICAgIHsgZmlsZTogJ3RzY29uZmlnLmpzb24nLCB0eXBlOiAnVHlwZVNjcmlwdCcgfSxcbiAgICB7IGZpbGU6ICdweXByb2plY3QudG9tbCcsIHR5cGU6ICdQeXRob24gKG1vZGVybiknIH0sXG4gICAgeyBmaWxlOiAncmVxdWlyZW1lbnRzLnR4dCcsIHR5cGU6ICdQeXRob24nIH0sXG4gICAgeyBmaWxlOiAnQ2FyZ28udG9tbCcsIHR5cGU6ICdSdXN0JyB9LFxuICAgIHsgZmlsZTogJ2dvLm1vZCcsIHR5cGU6ICdHbycgfSxcbiAgICB7IGZpbGU6ICdwb20ueG1sJywgdHlwZTogJ0phdmEgKE1hdmVuKScgfSxcbiAgICB7IGZpbGU6ICdidWlsZC5ncmFkbGUnLCB0eXBlOiAnSmF2YSAoR3JhZGxlKScgfSxcbiAgICB7IGZpbGU6ICcuZ2l0JywgdHlwZTogJ0dpdCByZXBvc2l0b3J5JyB9XG4gIF07XG5cbiAgY29uc3QgZGV0ZWN0ZWQ6IHN0cmluZ1tdID0gW107XG4gIFxuICBmb3IgKGNvbnN0IGNoZWNrIG9mIGNoZWNrcykge1xuICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKHdvcmtpbmdEaXIsIGNoZWNrLmZpbGUpO1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgZGV0ZWN0ZWQucHVzaChjaGVjay50eXBlKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZGV0ZWN0ZWQubGVuZ3RoID4gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0RldGVjdGVkIHByb2plY3QgdHlwZXM6JykpO1xuICAgIGRldGVjdGVkLmZvckVhY2godCA9PiBjb25zb2xlLmxvZyhgICDigKIgJHt0fWApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coJ05vIHJlY29nbml6ZWQgcHJvamVjdCB0eXBlIGRldGVjdGVkLicpKTtcbiAgfVxuXG4gIC8vIExpc3QgdG9wLWxldmVsIGZpbGVzIGFuZCBkaXJlY3Rvcmllc1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5Qcm9qZWN0IHN0cnVjdHVyZTonKSk7XG4gIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyh3b3JraW5nRGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gIGVudHJpZXMuc2xpY2UoMCwgMjApLmZvckVhY2goZW50cnkgPT4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGVudHJ5LmlzRGlyZWN0b3J5KCkgPyAn8J+TgSAnIDogJ/Cfk4QgJztcbiAgICBjb25zb2xlLmxvZyhgICAke3ByZWZpeH0ke2VudHJ5Lm5hbWV9YCk7XG4gIH0pO1xuXG4gIGlmIChlbnRyaWVzLmxlbmd0aCA+IDIwKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAuLi4gYW5kICR7ZW50cmllcy5sZW5ndGggLSAyMH0gbW9yZSBpdGVtc2ApKTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCcnKTtcblxuICAvLyBBZGQgaW5pdCBjb250ZXh0IHRvIGNvbnZlcnNhdGlvblxuICBjb25zdCBpbml0TWVzc2FnZSA9IGBQbGVhc2UgYW5hbHl6ZSB0aGUgY3VycmVudCBwcm9qZWN0IHN0cnVjdHVyZSBhbmQgcHJvdmlkZTpcbjEuIEEgYnJpZWYgb3ZlcnZpZXcgb2YgdGhlIHByb2plY3QgdHlwZSBhbmQgcHVycG9zZVxuMi4gS2V5IGZpbGVzIGFuZCB0aGVpciByb2xlc1xuMy4gU3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50cyBvciBiZXN0IHByYWN0aWNlc1xuXG5Xb3JraW5nIGRpcmVjdG9yeTogJHt3b3JraW5nRGlyfVxuRGV0ZWN0ZWQgdHlwZXM6ICR7ZGV0ZWN0ZWQuam9pbignLCAnKX1gO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgY29udGV4dC5jb252ZXJzYXRpb24uc2VuZE1lc3NhZ2UoaW5pdE1lc3NhZ2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnRXJyb3IgZHVyaW5nIGFuYWx5c2lzLicpKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93T3JTZXRNb2RlbChtb2RlbE5hbWU6IHN0cmluZywgY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKG1vZGVsTmFtZSkge1xuICAgIGNvbnRleHQuY29uZmlnTWFuYWdlci5zZXREZWZhdWx0TW9kZWwobW9kZWxOYW1lKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIE1vZGVsIHNldCB0bzogJHttb2RlbE5hbWV9YCkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IGNvbnRleHQuY29uZmlnTWFuYWdlci5nZXREZWZhdWx0TW9kZWwoKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBDdXJyZW50IG1vZGVsOiAke2N1cnJlbnRNb2RlbH1gKSk7XG4gICAgY29uc29sZS5sb2coJycpO1xuICAgIGNvbnNvbGUubG9nKCdBdmFpbGFibGUgbW9kZWxzOicpO1xuICAgIGNvbnN0IG1vZGVscyA9IFsnZ3B0LTRvJywgJ2dwdC00by1taW5pJywgJ2dwdC00LXR1cmJvJywgJ2dwdC0zLjUtdHVyYm8nLCAnbzEtcHJldmlldycsICdvMS1taW5pJ107XG4gICAgbW9kZWxzLmZvckVhY2gobSA9PiB7XG4gICAgICBpZiAobSA9PT0gY3VycmVudE1vZGVsKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGAgICogJHttfSAoY3VycmVudClgKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgICAgICR7bX1gKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2hvd0NvbmZpZyhjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IGJvb2xlYW4ge1xuICBjb25zdCBjb25maWcgPSBjb250ZXh0LmNvbmZpZ01hbmFnZXIuZ2V0QWxsKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkN1cnJlbnQgQ29uZmlndXJhdGlvbjonKSk7XG4gIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMikpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoYENvbmZpZyBmaWxlOiAke2NvbnRleHQuY29uZmlnTWFuYWdlci5nZXRDb25maWdQYXRoKCl9YCkpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVzZXRDb25maWcoY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBib29sZWFuIHtcbiAgY29udGV4dC5jb25maWdNYW5hZ2VyLmNsZWFyKCk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgQ29uZmlndXJhdGlvbiByZXNldCB0byBkZWZhdWx0cy4nKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnWW91IHdpbGwgbmVlZCB0byBydW4gYG9mbG93IGF1dGhgIHRvIHJlY29uZmlndXJlIGF1dGhlbnRpY2F0aW9uLicpKTtcbiAgcmV0dXJuIGZhbHNlOyAvLyBFeGl0IHRvIGZvcmNlIHJlLWF1dGhcbn1cblxuZnVuY3Rpb24gc2hvd0hpc3RvcnkoY29udGV4dDogQ29tbWFuZENvbnRleHQpOiBib29sZWFuIHtcbiAgY29uc3QgbWVzc2FnZXMgPSBjb250ZXh0LmNvbnZlcnNhdGlvbi5nZXRNZXNzYWdlcygpO1xuICBcbiAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ05vIGNvbnZlcnNhdGlvbiBoaXN0b3J5LicpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbkNvbnZlcnNhdGlvbiBIaXN0b3J5OicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgbWVzc2FnZXMuZm9yRWFjaCgobXNnLCBpbmRleCkgPT4ge1xuICAgIGlmIChtc2cucm9sZSA9PT0gJ3N5c3RlbScpIHJldHVybjtcbiAgICBcbiAgICBjb25zdCByb2xlQ29sb3JzOiBSZWNvcmQ8c3RyaW5nLCBjaGFsay5DaGFsaz4gPSB7XG4gICAgICB1c2VyOiBjaGFsay5ncmVlbixcbiAgICAgIGFzc2lzdGFudDogY2hhbGsuYmx1ZSxcbiAgICAgIHRvb2w6IGNoYWxrLmdyYXlcbiAgICB9O1xuICAgIFxuICAgIGNvbnN0IGNvbG9yID0gcm9sZUNvbG9yc1ttc2cucm9sZV0gfHwgY2hhbGsud2hpdGU7XG4gICAgY29uc3QgcHJldmlldyA9IHR5cGVvZiBtc2cuY29udGVudCA9PT0gJ3N0cmluZycgXG4gICAgICA/IG1zZy5jb250ZW50LnN1YnN0cmluZygwLCAxMDApICsgKG1zZy5jb250ZW50Lmxlbmd0aCA+IDEwMCA/ICcuLi4nIDogJycpXG4gICAgICA6ICdbY29tcGxleCBjb250ZW50XSc7XG4gICAgXG4gICAgY29uc29sZS5sb2coYCR7aW5kZXh9LiAke2NvbG9yKG1zZy5yb2xlKX06ICR7cHJldmlld31gKTtcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2hvd1Rvb2xzKCk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5BdmFpbGFibGUgVG9vbHM6JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBjb25zdCB0b29scyA9IFtcbiAgICB7IG5hbWU6ICdyZWFkX2ZpbGUnLCBkZXNjOiAnUmVhZCBmaWxlIGNvbnRlbnRzJyB9LFxuICAgIHsgbmFtZTogJ3dyaXRlX2ZpbGUnLCBkZXNjOiAnV3JpdGUgdG8gZmlsZXMnIH0sXG4gICAgeyBuYW1lOiAnbGlzdF9kaXJlY3RvcnknLCBkZXNjOiAnTGlzdCBkaXJlY3RvcnkgY29udGVudHMnIH0sXG4gICAgeyBuYW1lOiAnZ2xvYicsIGRlc2M6ICdGaW5kIGZpbGVzIGJ5IHBhdHRlcm4nIH0sXG4gICAgeyBuYW1lOiAnc2VhcmNoX2ZpbGVfY29udGVudCcsIGRlc2M6ICdTZWFyY2ggd2l0aGluIGZpbGVzJyB9LFxuICAgIHsgbmFtZTogJ3J1bl9zaGVsbF9jb21tYW5kJywgZGVzYzogJ0V4ZWN1dGUgc2hlbGwgY29tbWFuZHMnIH0sXG4gICAgeyBuYW1lOiAnd2ViX3NlYXJjaCcsIGRlc2M6ICdTZWFyY2ggdGhlIHdlYicgfSxcbiAgICB7IG5hbWU6ICd3ZWJfZmV0Y2gnLCBkZXNjOiAnRmV0Y2ggd2ViIGNvbnRlbnQnIH0sXG4gICAgeyBuYW1lOiAncmVwbGFjZScsIGRlc2M6ICdSZXBsYWNlIHRleHQgaW4gZmlsZXMnIH0sXG4gICAgeyBuYW1lOiAnaW1hZ2VfcmVhZCcsIGRlc2M6ICdBbmFseXplIGltYWdlcyB3aXRoIFZMIG1vZGVscycgfSxcbiAgICB7IG5hbWU6ICdwZGZfZXh0cmFjdCcsIGRlc2M6ICdFeHRyYWN0IGNvbnRlbnQgZnJvbSBQREZzJyB9LFxuICAgIHsgbmFtZTogJ2Fza191c2VyX3F1ZXN0aW9uJywgZGVzYzogJ0FzayB1c2VyIGZvciBpbnB1dCcgfSxcbiAgICB7IG5hbWU6ICd0YXNrJywgZGVzYzogJ0xhdW5jaCBzdWItYWdlbnRzJyB9LFxuICAgIHsgbmFtZTogJ3NhdmVfbWVtb3J5JywgZGVzYzogJ1NhdmUgaW5mb3JtYXRpb24gZm9yIGZ1dHVyZScgfVxuICBdO1xuXG4gIHRvb2xzLmZvckVhY2goKHsgbmFtZSwgZGVzYyB9KSA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5jeWFuKG5hbWUucGFkRW5kKDIwKSl9ICR7Y2hhbGsuZ3JheShkZXNjKX1gKTtcbiAgfSk7XG5cbiAgY29uc29sZS5sb2coJycpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gc2hvd1ZlcnNpb24oKTogYm9vbGVhbiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICcuLicsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04JykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYG9mbG93IENMSSB2JHtwYWNrYWdlSnNvbi52ZXJzaW9ufWApKTtcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuY3lhbignb2Zsb3cgQ0xJICh2ZXJzaW9uIHVua25vd24pJykpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93QWdlbnRzKCk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5BdmFpbGFibGUgU3ViLUFnZW50czonKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgXG4gIGNvbnN0IGFnZW50cyA9IE9iamVjdC52YWx1ZXMoQUdFTlRfREVGSU5JVElPTlMpO1xuICBhZ2VudHMuZm9yRWFjaChhZ2VudCA9PiB7XG4gICAgY29uc29sZS5sb2coYCAgJHtjaGFsay5jeWFuKGAkJHthZ2VudC50eXBlfWApfWApO1xuICAgIGNvbnNvbGUubG9nKGAgICAgJHtjaGFsay5ncmF5KGFnZW50LmRlc2NyaXB0aW9uKX1gKTtcbiAgICBjb25zb2xlLmxvZyhgICAgIFRvb2xzOiAke2FnZW50LmFsbG93ZWRUb29scyA9PT0gJyonID8gJ2FsbCcgOiBhZ2VudC5hbGxvd2VkVG9vbHMuam9pbignLCAnKX1gKTtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gIH0pO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1VzYWdlOiAkYWdlbnQtdHlwZSBcInlvdXIgdGFzayBoZXJlXCInKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNob3dTYW5kYm94SW5mbygpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuU2FuZGJveCBTdGF0dXM6JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICB0cnkge1xuICAgIGNvbnN0IGJhY2tlbmQgPSBhd2FpdCBjcmVhdGVTYW5kYm94RXhlY3V0b3IoKTtcbiAgICBjb25zb2xlLmxvZyhgICBCYWNrZW5kOiAke2NoYWxrLmN5YW4oYmFja2VuZCA/ICdhdmFpbGFibGUnIDogJ3VuYXZhaWxhYmxlJyl9YCk7XG4gICAgY29uc29sZS5sb2coYCAgTW9kZTogJHtjaGFsay5jeWFuKGJhY2tlbmQgPyBiYWNrZW5kWydjb25maWcnXT8uYmFja2VuZCB8fCAnbm9uZScgOiAnbm9uZScpfWApO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLmxvZygnICBCYWNrZW5kOiAnICsgY2hhbGsueWVsbG93KCdub3QgYXZhaWxhYmxlJykpO1xuICB9XG5cbiAgY29uc29sZS5sb2coJycpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdFbmFibGUgd2l0aDogb2Zsb3cgLS1zYW5kYm94JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93U2tpbGxzKHN1YkNvbW1hbmQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdcXG5Ta2lsbHMgU3lzdGVtOicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgaWYgKHN1YkNvbW1hbmQgPT09ICdsaXN0JyB8fCAhc3ViQ29tbWFuZCkge1xuICAgIGNvbnNvbGUubG9nKCdTa2lsbHMgYWxsb3cgZXh0ZW5kaW5nIG9mbG93IHdpdGggc3BlY2lhbGl6ZWQgY2FwYWJpbGl0aWVzLicpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdBdmFpbGFibGUgU2tpbGwgQ2F0ZWdvcmllczonKSk7XG4gICAgY29uc29sZS5sb2coJyAg4oCiIERvY3VtZW50IFByb2Nlc3NpbmcgKHBkZiwgZG9jeCwgcHB0eCknKTtcbiAgICBjb25zb2xlLmxvZygnICDigKIgQ3JlYXRpdmUgVG9vbHMgKGFsZ29yaXRobWljLWFydCwgY2FudmFzLWRlc2lnbiknKTtcbiAgICBjb25zb2xlLmxvZygnICDigKIgRGV2ZWxvcG1lbnQgVG9vbHMgKG1jcC1idWlsZGVyLCBza2lsbC1jcmVhdG9yKScpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdTa2lsbHMgYXJlIHN0b3JlZCBpbjonKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBHbG9iYWw6IH4vLm9mbG93L3NraWxscy8nKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBQcm9qZWN0OiAuLy5vZmxvdy9za2lsbHMvJykpO1xuICB9IGVsc2UgaWYgKHN1YkNvbW1hbmQgPT09ICdyZWZyZXNoJykge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgU2tpbGxzIHJlZ2lzdHJ5IHJlZnJlc2hlZC4nKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KGBVbmtub3duIHN1YmNvbW1hbmQ6ICR7c3ViQ29tbWFuZH1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVXNhZ2U6IC9za2lsbHMgW2xpc3R8cmVmcmVzaF0nKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnJyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBzaG93TUNQSW5mbygpOiBib29sZWFuIHtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnXFxuTUNQIChNb2RlbCBDb250ZXh0IFByb3RvY29sKSBTdGF0dXM6JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICBjb25zb2xlLmxvZygnTUNQIGFsbG93cyBleHRlbmRpbmcgb2Zsb3cgd2l0aCBleHRlcm5hbCB0b29sIHNlcnZlcnMuJyk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnQ29uZmlndXJhdGlvbjonKSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ0FkZCBzZXJ2ZXJzIHRvIH4vLm9mbG93L3NldHRpbmdzLmpzb246JykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oYHtcbiAgXCJtY3BTZXJ2ZXJzXCI6IHtcbiAgICBcIm15X3NlcnZlclwiOiB7XG4gICAgICBcImNvbW1hbmRcIjogXCJucHhcIixcbiAgICAgIFwiYXJnc1wiOiBbXCIteVwiLCBcIm15LW1jcC1zZXJ2ZXJcIl1cbiAgICB9XG4gIH1cbn1gKSk7XG4gIGNvbnNvbGUubG9nKCcnKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHNob3dNZW1vcnkoKTogYm9vbGVhbiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcblNhdmVkIE1lbW9yaWVzOicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgY29uc3QgaG9tZURpciA9IHByb2Nlc3MuZW52LkhPTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUgfHwgJyc7XG4gIGNvbnN0IG1lbW9yeUZpbGUgPSBwYXRoLmpvaW4oaG9tZURpciwgJy5vZmxvdycsICdtZW1vcnkuanNvbicpO1xuICBcbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhtZW1vcnlGaWxlKSkge1xuICAgICAgY29uc3QgY29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhtZW1vcnlGaWxlLCAndXRmLTgnKTtcbiAgICAgIGNvbnN0IG1lbW9yaWVzID0gSlNPTi5wYXJzZShjb250ZW50KTtcbiAgICAgIFxuICAgICAgaWYgKG1lbW9yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdObyBtZW1vcmllcyBzYXZlZC4nKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZW1vcmllcy5mb3JFYWNoKChtOiB7IGZhY3Q6IHN0cmluZzsgY3JlYXRlZEF0OiBzdHJpbmcgfSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYCR7aSArIDF9LiAke2NoYWxrLndoaXRlKG0uZmFjdCl9YCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYCAgICR7Y2hhbGsuZ3JheShuZXcgRGF0ZShtLmNyZWF0ZWRBdCkudG9Mb2NhbGVTdHJpbmcoKSl9YCk7XG4gICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnTm8gbWVtb3JpZXMgc2F2ZWQuJykpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdDb3VsZCBub3QgcmVhZCBtZW1vcnkgZmlsZS4nKSk7XG4gIH1cblxuICBjb25zb2xlLmxvZygnJyk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZW5lcmF0ZUNvbW1pdChjb250ZXh0OiBDb21tYW5kQ29udGV4dCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCdcXG5HZW5lcmF0aW5nIGNvbW1pdCBtZXNzYWdlLi4uJykpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIFxuICAvLyDmo4Dmn6XmmK/lkKbmmK9naXTku5PlupNcbiAgY29uc3QgZ2l0RGlyID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICcuZ2l0Jyk7XG4gIGlmICghZnMuZXhpc3RzU3luYyhnaXREaXIpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdOb3QgYSBnaXQgcmVwb3NpdG9yeS4nKSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBjb25zdCBjb21taXRQcm9tcHQgPSBgUGxlYXNlIGFuYWx5emUgdGhlIGN1cnJlbnQgZ2l0IHJlcG9zaXRvcnkgc3RhdGUgYW5kIGdlbmVyYXRlIGFuIGFwcHJvcHJpYXRlIGNvbW1pdCBtZXNzYWdlLlxuXG5Xb3JraW5nIGRpcmVjdG9yeTogJHtwcm9jZXNzLmN3ZCgpfVxuXG5TdGVwczpcbjEuIFJ1biAnZ2l0IHN0YXR1cycgdG8gc2VlIGNoYW5nZWQgZmlsZXNcbjIuIFJ1biAnZ2l0IGRpZmYgLS1zdGFnZWQnIHRvIHNlZSBzdGFnZWQgY2hhbmdlcyAoaWYgYW55KVxuMy4gUnVuICdnaXQgZGlmZicgdG8gc2VlIHVuc3RhZ2VkIGNoYW5nZXNcbjQuIEdlbmVyYXRlIGEgY2xlYXIsIGNvbmNpc2UgY29tbWl0IG1lc3NhZ2UgZm9sbG93aW5nIGNvbnZlbnRpb25hbCBjb21taXQgZm9ybWF0XG5cblByb3ZpZGUgdGhlIGNvbW1pdCBtZXNzYWdlIGFzIHlvdXIgcmVzcG9uc2UuYDtcblxuICB0cnkge1xuICAgIGF3YWl0IGNvbnRleHQuY29udmVyc2F0aW9uLnNlbmRNZXNzYWdlKGNvbW1pdFByb21wdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdFcnJvciBnZW5lcmF0aW5nIGNvbW1pdCBtZXNzYWdlLicpKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXZpZXdDb2RlKGNvbnRleHQ6IENvbW1hbmRDb250ZXh0KTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ1xcblJldmlld2luZyByZWNlbnQgY2hhbmdlcy4uLicpKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgLy8g5qOA5p+l5piv5ZCm5pivZ2l05LuT5bqTXG4gIGNvbnN0IGdpdERpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnLmdpdCcpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZ2l0RGlyKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygnTm90IGEgZ2l0IHJlcG9zaXRvcnkuJykpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgY29uc3QgcmV2aWV3UHJvbXB0ID0gYFBsZWFzZSByZXZpZXcgdGhlIHJlY2VudCBjb2RlIGNoYW5nZXMgaW4gdGhpcyByZXBvc2l0b3J5LlxuXG5Xb3JraW5nIGRpcmVjdG9yeTogJHtwcm9jZXNzLmN3ZCgpfVxuXG5TdGVwczpcbjEuIFJ1biAnZ2l0IGxvZyAtNSAtLW9uZWxpbmUnIHRvIHNlZSByZWNlbnQgY29tbWl0c1xuMi4gUnVuICdnaXQgZGlmZiBIRUFEfjEgSEVBRCcgdG8gc2VlIHRoZSBsYXRlc3QgY2hhbmdlc1xuMy4gUmV2aWV3IHRoZSBjb2RlIGZvcjpcbiAgIC0gUG90ZW50aWFsIGJ1Z3NcbiAgIC0gU2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzXG4gICAtIENvZGUgc3R5bGUgaXNzdWVzXG4gICAtIFBlcmZvcm1hbmNlIGNvbmNlcm5zXG4gICAtIEJlc3QgcHJhY3RpY2UgdmlvbGF0aW9uc1xuXG5Qcm92aWRlIGEgc3RydWN0dXJlZCByZXZpZXcgd2l0aCBzcGVjaWZpYyBmaW5kaW5ncyBhbmQgc3VnZ2VzdGlvbnMuYDtcblxuICB0cnkge1xuICAgIGF3YWl0IGNvbnRleHQuY29udmVyc2F0aW9uLnNlbmRNZXNzYWdlKHJldmlld1Byb21wdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKCdFcnJvciBkdXJpbmcgY29kZSByZXZpZXcuJykpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZVRoaW5raW5nKGNvbnRleHQ6IENvbW1hbmRDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IG5ld1ZhbHVlID0gY29udGV4dC5jb25maWdNYW5hZ2VyLnRvZ2dsZVNob3dUaGlua2luZygpO1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgVGhpbmtpbmcgcHJvY2VzcyBkaXNwbGF5OiAke25ld1ZhbHVlID8gY2hhbGsuY3lhbignT04nKSA6IGNoYWxrLmdyYXkoJ09GRicpfWApKTtcbiAgY29uc29sZS5sb2coJycpO1xuICBcbiAgaWYgKG5ld1ZhbHVlKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVGhlIEFJIHdpbGwgbm93IHNob3cgaXRzIHRoaW5raW5nL3JlYXNvbmluZyBwcm9jZXNzIChmb3Igc3VwcG9ydGVkIG1vZGVscyBsaWtlIERlZXBTZWVrIFJlYXNvbmVyKS4nKSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheSgnVGhlIEFJIHRoaW5raW5nIHByb2Nlc3MgaXMgbm93IGhpZGRlbi4nKSk7XG4gIH1cbiAgXG4gIHJldHVybiB0cnVlO1xufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
interface UpdateInfo {
|
|
2
|
+
hasUpdate: boolean;
|
|
3
|
+
currentVersion: string;
|
|
4
|
+
latestVersion: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 检查是否有更新
|
|
8
|
+
*/
|
|
9
|
+
export declare function checkForUpdates(): Promise<UpdateInfo>;
|
|
10
|
+
/**
|
|
11
|
+
* 执行更新
|
|
12
|
+
*/
|
|
13
|
+
export declare function performUpdate(): Promise<{
|
|
14
|
+
success: boolean;
|
|
15
|
+
message: string;
|
|
16
|
+
}>;
|
|
17
|
+
export {};
|
package/dist/updater.js
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.checkForUpdates = checkForUpdates;
|
|
7
|
+
exports.performUpdate = performUpdate;
|
|
8
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
|
+
const util_1 = require("util");
|
|
11
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
12
|
+
const PACKAGE_NAME = '@oflow-ai/oflow-cli';
|
|
13
|
+
const NPM_REGISTRY = 'https://registry.npmjs.org';
|
|
14
|
+
/**
|
|
15
|
+
* 获取当前安装的版本
|
|
16
|
+
*/
|
|
17
|
+
async function getCurrentVersion() {
|
|
18
|
+
try {
|
|
19
|
+
const packageJson = require('../../package.json');
|
|
20
|
+
return packageJson.version;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return '0.0.0';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 从npm获取最新版本
|
|
28
|
+
*/
|
|
29
|
+
async function getLatestVersion() {
|
|
30
|
+
try {
|
|
31
|
+
const { stdout } = await execAsync(`npm view ${PACKAGE_NAME} version`, {
|
|
32
|
+
timeout: 10000
|
|
33
|
+
});
|
|
34
|
+
return stdout.trim();
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// 如果npm命令失败,尝试直接访问registry
|
|
38
|
+
try {
|
|
39
|
+
const https = require('https');
|
|
40
|
+
return new Promise((resolve, reject) => {
|
|
41
|
+
https.get(`${NPM_REGISTRY}/${PACKAGE_NAME.replace('/', '%2F')}/latest`, (res) => {
|
|
42
|
+
let data = '';
|
|
43
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
44
|
+
res.on('end', () => {
|
|
45
|
+
try {
|
|
46
|
+
const json = JSON.parse(data);
|
|
47
|
+
resolve(json.version);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
reject(new Error('Failed to parse response'));
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}).on('error', reject);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return '0.0.0';
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 比较版本号
|
|
63
|
+
*/
|
|
64
|
+
function compareVersions(v1, v2) {
|
|
65
|
+
const parts1 = v1.split('.').map(Number);
|
|
66
|
+
const parts2 = v2.split('.').map(Number);
|
|
67
|
+
for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
|
|
68
|
+
const p1 = parts1[i] || 0;
|
|
69
|
+
const p2 = parts2[i] || 0;
|
|
70
|
+
if (p1 > p2)
|
|
71
|
+
return 1;
|
|
72
|
+
if (p1 < p2)
|
|
73
|
+
return -1;
|
|
74
|
+
}
|
|
75
|
+
return 0;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* 检查是否有更新
|
|
79
|
+
*/
|
|
80
|
+
async function checkForUpdates() {
|
|
81
|
+
const currentVersion = await getCurrentVersion();
|
|
82
|
+
// 检查缓存(每天只检查一次)
|
|
83
|
+
const cacheKey = 'oflow_last_update_check';
|
|
84
|
+
const cachedData = getCachedUpdateInfo(cacheKey);
|
|
85
|
+
if (cachedData && Date.now() - cachedData.timestamp < 24 * 60 * 60 * 1000) {
|
|
86
|
+
return {
|
|
87
|
+
hasUpdate: compareVersions(currentVersion, cachedData.latestVersion) < 0,
|
|
88
|
+
currentVersion,
|
|
89
|
+
latestVersion: cachedData.latestVersion
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const latestVersion = await getLatestVersion();
|
|
93
|
+
// 缓存结果
|
|
94
|
+
setCachedUpdateInfo(cacheKey, {
|
|
95
|
+
latestVersion,
|
|
96
|
+
timestamp: Date.now()
|
|
97
|
+
});
|
|
98
|
+
return {
|
|
99
|
+
hasUpdate: compareVersions(currentVersion, latestVersion) < 0,
|
|
100
|
+
currentVersion,
|
|
101
|
+
latestVersion
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* 执行更新
|
|
106
|
+
*/
|
|
107
|
+
async function performUpdate() {
|
|
108
|
+
console.log(chalk_1.default.cyan('\n🔄 Updating oflow CLI...\n'));
|
|
109
|
+
try {
|
|
110
|
+
const { stdout, stderr } = await execAsync(`npm install -g ${PACKAGE_NAME}@latest`, {
|
|
111
|
+
timeout: 60000
|
|
112
|
+
});
|
|
113
|
+
console.log(chalk_1.default.green('\n✓ oflow CLI updated successfully!'));
|
|
114
|
+
console.log(chalk_1.default.gray('Please restart oflow to use the new version.\n'));
|
|
115
|
+
return { success: true, message: 'Update completed' };
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
119
|
+
console.log(chalk_1.default.red('\n✗ Update failed'));
|
|
120
|
+
console.log(chalk_1.default.gray('You can manually update with: npm install -g @oflow-ai/oflow-cli@latest\n'));
|
|
121
|
+
return { success: false, message: errorMsg };
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 获取缓存的更新信息
|
|
126
|
+
*/
|
|
127
|
+
function getCachedUpdateInfo(key) {
|
|
128
|
+
try {
|
|
129
|
+
const fs = require('fs');
|
|
130
|
+
const path = require('path');
|
|
131
|
+
const os = require('os');
|
|
132
|
+
const cacheFile = path.join(os.homedir(), '.oflow', 'update-cache.json');
|
|
133
|
+
if (fs.existsSync(cacheFile)) {
|
|
134
|
+
const data = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
|
|
135
|
+
return data[key] || null;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Ignore cache errors
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 缓存更新信息
|
|
145
|
+
*/
|
|
146
|
+
function setCachedUpdateInfo(key, value) {
|
|
147
|
+
try {
|
|
148
|
+
const fs = require('fs');
|
|
149
|
+
const path = require('path');
|
|
150
|
+
const os = require('os');
|
|
151
|
+
const cacheDir = path.join(os.homedir(), '.oflow');
|
|
152
|
+
const cacheFile = path.join(cacheDir, 'update-cache.json');
|
|
153
|
+
if (!fs.existsSync(cacheDir)) {
|
|
154
|
+
fs.mkdirSync(cacheDir, { recursive: true });
|
|
155
|
+
}
|
|
156
|
+
let data = {};
|
|
157
|
+
if (fs.existsSync(cacheFile)) {
|
|
158
|
+
data = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
|
|
159
|
+
}
|
|
160
|
+
data[key] = value;
|
|
161
|
+
fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Ignore cache errors
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91cGRhdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBK0VBLDBDQTRCQztBQUtELHNDQW1CQztBQW5JRCxrREFBMEI7QUFDMUIsaURBQXFDO0FBQ3JDLCtCQUFpQztBQUVqQyxNQUFNLFNBQVMsR0FBRyxJQUFBLGdCQUFTLEVBQUMsb0JBQUksQ0FBQyxDQUFDO0FBRWxDLE1BQU0sWUFBWSxHQUFHLHFCQUFxQixDQUFDO0FBQzNDLE1BQU0sWUFBWSxHQUFHLDRCQUE0QixDQUFDO0FBUWxEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGlCQUFpQjtJQUM5QixJQUFJLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNsRCxPQUFPLFdBQVcsQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCO0lBQzdCLElBQUksQ0FBQztRQUNILE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLFNBQVMsQ0FBQyxZQUFZLFlBQVksVUFBVSxFQUFFO1lBQ3JFLE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLDJCQUEyQjtRQUMzQixJQUFJLENBQUM7WUFDSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtnQkFDckMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFlBQVksSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxL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QUUsQ0FBQztZQUM3QixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFFRCxJQUFJLElBQUksR0FBd0IsRUFBRSxDQUFDO1FBQ25DLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsRUFBRSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLHNCQUFzQjtJQUN4QixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcblxuY29uc3QgZXhlY0FzeW5jID0gcHJvbWlzaWZ5KGV4ZWMpO1xuXG5jb25zdCBQQUNLQUdFX05BTUUgPSAnQG9mbG93LWFpL29mbG93LWNsaSc7XG5jb25zdCBOUE1fUkVHSVNUUlkgPSAnaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcnO1xuXG5pbnRlcmZhY2UgVXBkYXRlSW5mbyB7XG4gIGhhc1VwZGF0ZTogYm9vbGVhbjtcbiAgY3VycmVudFZlcnNpb246IHN0cmluZztcbiAgbGF0ZXN0VmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIOiOt+WPluW9k+WJjeWuieijheeahOeJiOacrFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50VmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gcmVxdWlyZSgnLi4vLi4vcGFja2FnZS5qc29uJyk7XG4gICAgcmV0dXJuIHBhY2thZ2VKc29uLnZlcnNpb247XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiAnMC4wLjAnO1xuICB9XG59XG5cbi8qKlxuICog5LuObnBt6I635Y+W5pyA5paw54mI5pysXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldExhdGVzdFZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCB9ID0gYXdhaXQgZXhlY0FzeW5jKGBucG0gdmlldyAke1BBQ0tBR0VfTkFNRX0gdmVyc2lvbmAsIHtcbiAgICAgIHRpbWVvdXQ6IDEwMDAwXG4gICAgfSk7XG4gICAgcmV0dXJuIHN0ZG91dC50cmltKCk7XG4gIH0gY2F0Y2gge1xuICAgIC8vIOWmguaenG5wbeWRveS7pOWksei0pe+8jOWwneivleebtOaOpeiuv+mXrnJlZ2lzdHJ5XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGh0dHBzID0gcmVxdWlyZSgnaHR0cHMnKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGh0dHBzLmdldChgJHtOUE1fUkVHSVNUUll9LyR7UEFDS0FHRV9OQU1FLnJlcGxhY2UoJy8nLCAnJTJGJyl9L2xhdGVzdGAsIChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGxldCBkYXRhID0gJyc7XG4gICAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rOiBzdHJpbmcpID0+IHsgZGF0YSArPSBjaHVuazsgfSk7XG4gICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLnZlcnNpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSByZXNwb25zZScpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuICcwLjAuMCc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICog5q+U6L6D54mI5pys5Y+3XG4gKi9cbmZ1bmN0aW9uIGNvbXBhcmVWZXJzaW9ucyh2MTogc3RyaW5nLCB2Mjogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgcGFydHMxID0gdjEuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcbiAgY29uc3QgcGFydHMyID0gdjIuc3BsaXQoJy4nKS5tYXAoTnVtYmVyKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWF4KHBhcnRzMS5sZW5ndGgsIHBhcnRzMi5sZW5ndGgpOyBpKyspIHtcbiAgICBjb25zdCBwMSA9IHBhcnRzMVtpXSB8fCAwO1xuICAgIGNvbnN0IHAyID0gcGFydHMyW2ldIHx8IDA7XG4gICAgaWYgKHAxID4gcDIpIHJldHVybiAxO1xuICAgIGlmIChwMSA8IHAyKSByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbi8qKlxuICog5qOA5p+l5piv5ZCm5pyJ5pu05pawXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKTogUHJvbWlzZTxVcGRhdGVJbmZvPiB7XG4gIGNvbnN0IGN1cnJlbnRWZXJzaW9uID0gYXdhaXQgZ2V0Q3VycmVudFZlcnNpb24oKTtcbiAgXG4gIC8vIOajgOafpee8k+WtmO+8iOavj+WkqeWPquajgOafpeS4gOasoe+8iVxuICBjb25zdCBjYWNoZUtleSA9ICdvZmxvd19sYXN0X3VwZGF0ZV9jaGVjayc7XG4gIGNvbnN0IGNhY2hlZERhdGEgPSBnZXRDYWNoZWRVcGRhdGVJbmZvKGNhY2hlS2V5KTtcbiAgXG4gIGlmIChjYWNoZWREYXRhICYmIERhdGUubm93KCkgLSBjYWNoZWREYXRhLnRpbWVzdGFtcCA8IDI0ICogNjAgKiA2MCAqIDEwMDApIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGFzVXBkYXRlOiBjb21wYXJlVmVyc2lvbnMoY3VycmVudFZlcnNpb24sIGNhY2hlZERhdGEubGF0ZXN0VmVyc2lvbikgPCAwLFxuICAgICAgY3VycmVudFZlcnNpb24sXG4gICAgICBsYXRlc3RWZXJzaW9uOiBjYWNoZWREYXRhLmxhdGVzdFZlcnNpb25cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF0ZXN0VmVyc2lvbiA9IGF3YWl0IGdldExhdGVzdFZlcnNpb24oKTtcbiAgXG4gIC8vIOe8k+WtmOe7k+aenFxuICBzZXRDYWNoZWRVcGRhdGVJbmZvKGNhY2hlS2V5LCB7IFxuICAgIGxhdGVzdFZlcnNpb24sIFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSBcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNVcGRhdGU6IGNvbXBhcmVWZXJzaW9ucyhjdXJyZW50VmVyc2lvbiwgbGF0ZXN0VmVyc2lvbikgPCAwLFxuICAgIGN1cnJlbnRWZXJzaW9uLFxuICAgIGxhdGVzdFZlcnNpb25cbiAgfTtcbn1cblxuLyoqXG4gKiDmiafooYzmm7TmlrBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBlcmZvcm1VcGRhdGUoKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IG1lc3NhZ2U6IHN0cmluZyB9PiB7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ1xcbvCflIQgVXBkYXRpbmcgb2Zsb3cgQ0xJLi4uXFxuJykpO1xuICBcbiAgdHJ5IHtcbiAgICBjb25zdCB7IHN0ZG91dCwgc3RkZXJyIH0gPSBhd2FpdCBleGVjQXN5bmMoYG5wbSBpbnN0YWxsIC1nICR7UEFDS0FHRV9OQU1FfUBsYXRlc3RgLCB7XG4gICAgICB0aW1lb3V0OiA2MDAwMFxuICAgIH0pO1xuICAgIFxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCdcXG7inJMgb2Zsb3cgQ0xJIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5IScpKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCdQbGVhc2UgcmVzdGFydCBvZmxvdyB0byB1c2UgdGhlIG5ldyB2ZXJzaW9uLlxcbicpKTtcbiAgICBcbiAgICByZXR1cm4geyBzdWNjZXNzOiB0cnVlLCBtZXNzYWdlOiAnVXBkYXRlIGNvbXBsZXRlZCcgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBlcnJvck1zZyA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoJ1xcbuKclyBVcGRhdGUgZmFpbGVkJykpO1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJ1lvdSBjYW4gbWFudWFsbHkgdXBkYXRlIHdpdGg6IG5wbSBpbnN0YWxsIC1nIEBvZmxvdy1haS9vZmxvdy1jbGlAbGF0ZXN0XFxuJykpO1xuICAgIFxuICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlLCBtZXNzYWdlOiBlcnJvck1zZyB9O1xuICB9XG59XG5cbi8qKlxuICog6I635Y+W57yT5a2Y55qE5pu05paw5L+h5oGvXG4gKi9cbmZ1bmN0aW9uIGdldENhY2hlZFVwZGF0ZUluZm8oa2V5OiBzdHJpbmcpOiB7IGxhdGVzdFZlcnNpb246IHN0cmluZzsgdGltZXN0YW1wOiBudW1iZXIgfSB8IG51bGwge1xuICB0cnkge1xuICAgIGNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbiAgICBjb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuICAgIGNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbiAgICBcbiAgICBjb25zdCBjYWNoZUZpbGUgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9mbG93JywgJ3VwZGF0ZS1jYWNoZS5qc29uJyk7XG4gICAgXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoY2FjaGVGaWxlKSkge1xuICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGNhY2hlRmlsZSwgJ3V0Zi04JykpO1xuICAgICAgcmV0dXJuIGRhdGFba2V5XSB8fCBudWxsO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIGNhY2hlIGVycm9yc1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIOe8k+WtmOabtOaWsOS/oeaBr1xuICovXG5mdW5jdGlvbiBzZXRDYWNoZWRVcGRhdGVJbmZvKGtleTogc3RyaW5nLCB2YWx1ZTogeyBsYXRlc3RWZXJzaW9uOiBzdHJpbmc7IHRpbWVzdGFtcDogbnVtYmVyIH0pOiB2b2lkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gICAgY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbiAgICBjb25zdCBvcyA9IHJlcXVpcmUoJ29zJyk7XG4gICAgXG4gICAgY29uc3QgY2FjaGVEaXIgPSBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnLm9mbG93Jyk7XG4gICAgY29uc3QgY2FjaGVGaWxlID0gcGF0aC5qb2luKGNhY2hlRGlyLCAndXBkYXRlLWNhY2hlLmpzb24nKTtcbiAgICBcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgICBmcy5ta2RpclN5bmMoY2FjaGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgICBcbiAgICBsZXQgZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGNhY2hlRmlsZSkpIHtcbiAgICAgIGRhdGEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjYWNoZUZpbGUsICd1dGYtOCcpKTtcbiAgICB9XG4gICAgXG4gICAgZGF0YVtrZXldID0gdmFsdWU7XG4gICAgZnMud3JpdGVGaWxlU3luYyhjYWNoZUZpbGUsIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gSWdub3JlIGNhY2hlIGVycm9yc1xuICB9XG59XG4iXX0=
|