@oflow-ai/oflow-cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +117 -0
- package/dist/cli.d.ts +8 -0
- package/dist/cli.js +339 -0
- package/dist/commands/index.d.ts +9 -0
- package/dist/commands/index.js +467 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +320 -0
- package/dist/postinstall.d.ts +10 -0
- package/dist/postinstall.js +58 -0
- package/dist/utils/markdown.d.ts +10 -0
- package/dist/utils/markdown.js +69 -0
- package/package.json +69 -0
- package/scripts/postinstall.js +61 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
const commander_1 = require("commander");
|
|
41
|
+
const cli_1 = require("./cli");
|
|
42
|
+
const core_1 = require("@oflow-ai/core");
|
|
43
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
44
|
+
const fs = __importStar(require("fs"));
|
|
45
|
+
const path = __importStar(require("path"));
|
|
46
|
+
// Read package.json for version
|
|
47
|
+
const packageJsonPath = path.join(__dirname, '..', 'package.json');
|
|
48
|
+
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
|
|
49
|
+
// Simple update check (without update-notifier due to type issues)
|
|
50
|
+
try {
|
|
51
|
+
const updateNotifier = require('update-notifier');
|
|
52
|
+
const notifier = updateNotifier({ pkg: packageJson });
|
|
53
|
+
if (notifier.notify) {
|
|
54
|
+
notifier.notify();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// Ignore update check errors
|
|
59
|
+
}
|
|
60
|
+
const program = new commander_1.Command();
|
|
61
|
+
program
|
|
62
|
+
.name('oflow')
|
|
63
|
+
.description('AI-powered CLI assistant for terminal')
|
|
64
|
+
.version(packageJson.version)
|
|
65
|
+
.option('-m, --model <model>', 'Specify the AI model to use')
|
|
66
|
+
.option('-d, --directory <dir>', 'Working directory')
|
|
67
|
+
.option('--yolo', 'Run in yolo mode (auto-approve all operations)')
|
|
68
|
+
.option('--thinking', 'Show AI thinking/reasoning process')
|
|
69
|
+
.option('--no-thinking', 'Hide AI thinking/reasoning process')
|
|
70
|
+
.argument('[prompt]', 'Prompt to send to AI (starts interactive mode if not provided)')
|
|
71
|
+
.action(async (prompt, options) => {
|
|
72
|
+
const configManager = (0, core_1.getConfigManager)();
|
|
73
|
+
// Check authentication
|
|
74
|
+
if (!configManager.isAuthenticated()) {
|
|
75
|
+
console.log(chalk_1.default.yellow('Welcome to oflow! Let\'s get you set up.'));
|
|
76
|
+
console.log('');
|
|
77
|
+
await runAuthFlow();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Set model if specified
|
|
81
|
+
if (options.model) {
|
|
82
|
+
configManager.setDefaultModel(options.model);
|
|
83
|
+
}
|
|
84
|
+
// Set thinking mode if specified
|
|
85
|
+
if (options.thinking === true) {
|
|
86
|
+
configManager.setShowThinking(true);
|
|
87
|
+
}
|
|
88
|
+
else if (options.thinking === false) {
|
|
89
|
+
configManager.setShowThinking(false);
|
|
90
|
+
}
|
|
91
|
+
// Set working directory
|
|
92
|
+
const workingDir = options.directory || process.cwd();
|
|
93
|
+
process.chdir(workingDir);
|
|
94
|
+
if (prompt) {
|
|
95
|
+
// Single command mode
|
|
96
|
+
await (0, cli_1.runSingleCommand)(prompt, {
|
|
97
|
+
model: options.model,
|
|
98
|
+
yolo: options.yolo
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
// Interactive mode
|
|
103
|
+
await (0, cli_1.startInteractiveMode)({
|
|
104
|
+
model: options.model,
|
|
105
|
+
yolo: options.yolo
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// Auth command
|
|
110
|
+
program
|
|
111
|
+
.command('auth')
|
|
112
|
+
.description('Configure authentication')
|
|
113
|
+
.option('--provider <provider>', 'Provider (openai, deepseek, qwen, etc.)')
|
|
114
|
+
.action(async (options) => {
|
|
115
|
+
await runAuthFlow(options.provider);
|
|
116
|
+
});
|
|
117
|
+
// Config command
|
|
118
|
+
program
|
|
119
|
+
.command('config')
|
|
120
|
+
.description('View or edit configuration')
|
|
121
|
+
.option('--list', 'List current configuration')
|
|
122
|
+
.option('--set <key=value>', 'Set a configuration value')
|
|
123
|
+
.option('--thinking', 'Toggle thinking process display')
|
|
124
|
+
.action(async (options) => {
|
|
125
|
+
const configManager = (0, core_1.getConfigManager)();
|
|
126
|
+
if (options.list) {
|
|
127
|
+
console.log(chalk_1.default.bold('Current Configuration:'));
|
|
128
|
+
console.log(JSON.stringify(configManager.getAll(), null, 2));
|
|
129
|
+
console.log('');
|
|
130
|
+
console.log(chalk_1.default.gray(`Config file: ${configManager.getConfigPath()}`));
|
|
131
|
+
}
|
|
132
|
+
else if (options.thinking) {
|
|
133
|
+
const newValue = configManager.toggleShowThinking();
|
|
134
|
+
console.log(chalk_1.default.green(`✓ Thinking process display: ${newValue ? 'ON' : 'OFF'}`));
|
|
135
|
+
}
|
|
136
|
+
else if (options.set) {
|
|
137
|
+
const [key, value] = options.set.split('=');
|
|
138
|
+
configManager.set(key, value);
|
|
139
|
+
console.log(chalk_1.default.green(`Set ${key} = ${value}`));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log(`Config file: ${configManager.getConfigPath()}`);
|
|
143
|
+
console.log(`Thinking display: ${configManager.getShowThinking() ? 'ON' : 'OFF'}`);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
// Models command
|
|
147
|
+
program
|
|
148
|
+
.command('models')
|
|
149
|
+
.description('List available AI models')
|
|
150
|
+
.action(async () => {
|
|
151
|
+
await listModels();
|
|
152
|
+
});
|
|
153
|
+
async function runAuthFlow(provider) {
|
|
154
|
+
const inquirer = require('inquirer');
|
|
155
|
+
const configManager = (0, core_1.getConfigManager)();
|
|
156
|
+
if (!provider) {
|
|
157
|
+
const answers = await inquirer.prompt([
|
|
158
|
+
{
|
|
159
|
+
type: 'list',
|
|
160
|
+
name: 'provider',
|
|
161
|
+
message: 'Select AI provider:',
|
|
162
|
+
choices: [
|
|
163
|
+
{ name: '🌐 OpenAI (Official API)', value: 'openai' },
|
|
164
|
+
{ name: '🔧 Custom (OpenAI-compatible)', value: 'custom' },
|
|
165
|
+
{ name: '────────── 国内模型 ──────────', value: 'separator', disabled: true },
|
|
166
|
+
{ name: '🇨🇳 DeepSeek (深度求索) - 推荐推理模型', value: 'deepseek' },
|
|
167
|
+
{ name: '🇨🇳 Qwen (通义千问)', value: 'qwen' },
|
|
168
|
+
{ name: '🇨🇳 GLM (智谱)', value: 'zhipu' },
|
|
169
|
+
{ name: '🇨🇳 Baichuan (百川)', value: 'baichuan' },
|
|
170
|
+
{ name: '🇨🇳 Yi (零一万物)', value: 'yi' },
|
|
171
|
+
{ name: '🇨🇳 Moonshot (月之暗面/Kimi)', value: 'moonshot' },
|
|
172
|
+
{ name: '🇨🇳 SiliconFlow (硅基流动)', value: 'siliconflow' }
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
]);
|
|
176
|
+
provider = answers.provider;
|
|
177
|
+
}
|
|
178
|
+
// OpenAI
|
|
179
|
+
if (provider === 'openai') {
|
|
180
|
+
const answers = await inquirer.prompt([
|
|
181
|
+
{
|
|
182
|
+
type: 'password',
|
|
183
|
+
name: 'apiKey',
|
|
184
|
+
message: 'Enter your OpenAI API key:',
|
|
185
|
+
mask: '*'
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
type: 'list',
|
|
189
|
+
name: 'model',
|
|
190
|
+
message: 'Select default model:',
|
|
191
|
+
choices: [
|
|
192
|
+
'gpt-4o',
|
|
193
|
+
'gpt-4o-mini',
|
|
194
|
+
'gpt-4-turbo',
|
|
195
|
+
'gpt-3.5-turbo',
|
|
196
|
+
'o1-preview',
|
|
197
|
+
'o1-mini'
|
|
198
|
+
],
|
|
199
|
+
default: 'gpt-4o'
|
|
200
|
+
}
|
|
201
|
+
]);
|
|
202
|
+
configManager.setAuth({
|
|
203
|
+
provider: 'openai',
|
|
204
|
+
apiKey: answers.apiKey,
|
|
205
|
+
model: answers.model
|
|
206
|
+
});
|
|
207
|
+
configManager.setDefaultModel(answers.model);
|
|
208
|
+
console.log(chalk_1.default.green('\n✓ Authentication configured successfully!'));
|
|
209
|
+
}
|
|
210
|
+
// Custom
|
|
211
|
+
else if (provider === 'custom') {
|
|
212
|
+
const answers = await inquirer.prompt([
|
|
213
|
+
{
|
|
214
|
+
type: 'input',
|
|
215
|
+
name: 'baseUrl',
|
|
216
|
+
message: 'Enter API base URL:',
|
|
217
|
+
default: 'https://api.openai.com/v1'
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'password',
|
|
221
|
+
name: 'apiKey',
|
|
222
|
+
message: 'Enter your API key:',
|
|
223
|
+
mask: '*'
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
type: 'input',
|
|
227
|
+
name: 'model',
|
|
228
|
+
message: 'Enter default model name:',
|
|
229
|
+
default: 'gpt-4o'
|
|
230
|
+
}
|
|
231
|
+
]);
|
|
232
|
+
configManager.setAuth({
|
|
233
|
+
provider: 'custom',
|
|
234
|
+
apiKey: answers.apiKey,
|
|
235
|
+
baseUrl: answers.baseUrl,
|
|
236
|
+
model: answers.model
|
|
237
|
+
});
|
|
238
|
+
configManager.setDefaultModel(answers.model);
|
|
239
|
+
console.log(chalk_1.default.green('\n✓ Authentication configured successfully!'));
|
|
240
|
+
}
|
|
241
|
+
// 国内模型
|
|
242
|
+
else if (core_1.CHINESE_MODELS[provider]) {
|
|
243
|
+
const modelConfig = core_1.CHINESE_MODELS[provider];
|
|
244
|
+
console.log(chalk_1.default.cyan(`\n配置 ${modelConfig.name}`));
|
|
245
|
+
const answers = await inquirer.prompt([
|
|
246
|
+
{
|
|
247
|
+
type: 'password',
|
|
248
|
+
name: 'apiKey',
|
|
249
|
+
message: `Enter your ${modelConfig.name} API key:`,
|
|
250
|
+
mask: '*'
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
type: 'list',
|
|
254
|
+
name: 'model',
|
|
255
|
+
message: 'Select default model:',
|
|
256
|
+
choices: modelConfig.models,
|
|
257
|
+
default: modelConfig.models[0]
|
|
258
|
+
}
|
|
259
|
+
]);
|
|
260
|
+
configManager.setAuth({
|
|
261
|
+
provider: provider,
|
|
262
|
+
apiKey: answers.apiKey,
|
|
263
|
+
baseUrl: modelConfig.baseUrl,
|
|
264
|
+
model: answers.model
|
|
265
|
+
});
|
|
266
|
+
configManager.setDefaultModel(answers.model);
|
|
267
|
+
console.log(chalk_1.default.green(`\n✓ ${modelConfig.name} 配置成功!`));
|
|
268
|
+
// DeepSeek特殊提示
|
|
269
|
+
if (provider === 'deepseek' && answers.model === 'deepseek-reasoner') {
|
|
270
|
+
console.log(chalk_1.default.yellow('💡 提示: deepseek-reasoner 支持显示思考过程,使用 --thinking 开启'));
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
async function listModels() {
|
|
275
|
+
const configManager = (0, core_1.getConfigManager)();
|
|
276
|
+
const auth = configManager.getAuth();
|
|
277
|
+
if (!auth) {
|
|
278
|
+
console.log(chalk_1.default.red('Not authenticated. Run `oflow auth` first.'));
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
console.log(chalk_1.default.bold('\n═══════════════════════════════════════════════════════════'));
|
|
282
|
+
console.log(chalk_1.default.bold(' Available Models '));
|
|
283
|
+
console.log(chalk_1.default.bold('═══════════════════════════════════════════════════════════\n'));
|
|
284
|
+
// OpenAI Models
|
|
285
|
+
console.log(chalk_1.default.cyan('🌐 OpenAI Models:'));
|
|
286
|
+
const openaiModels = [
|
|
287
|
+
{ id: 'gpt-4o', desc: 'Most capable GPT-4 model' },
|
|
288
|
+
{ id: 'gpt-4o-mini', desc: 'Fast and affordable' },
|
|
289
|
+
{ id: 'gpt-4-turbo', desc: 'Previous GPT-4 version' },
|
|
290
|
+
{ id: 'gpt-3.5-turbo', desc: 'Fast and cheap' },
|
|
291
|
+
{ id: 'o1-preview', desc: 'Advanced reasoning' },
|
|
292
|
+
{ id: 'o1-mini', desc: 'Efficient reasoning' }
|
|
293
|
+
];
|
|
294
|
+
openaiModels.forEach(m => {
|
|
295
|
+
const current = m.id === configManager.getDefaultModel() ? chalk_1.default.green('* ') : ' ';
|
|
296
|
+
console.log(`${current}${m.id} - ${chalk_1.default.gray(m.desc)}`);
|
|
297
|
+
});
|
|
298
|
+
// 国内模型
|
|
299
|
+
console.log('');
|
|
300
|
+
console.log(chalk_1.default.cyan('🇨🇳 国内开源模型:\n'));
|
|
301
|
+
for (const [key, config] of Object.entries(core_1.CHINESE_MODELS)) {
|
|
302
|
+
console.log(chalk_1.default.bold(` ${config.name}`));
|
|
303
|
+
console.log(chalk_1.default.gray(` API: ${config.baseUrl}`));
|
|
304
|
+
for (const m of config.models) {
|
|
305
|
+
const modelId = typeof m === 'string' ? m : m.id;
|
|
306
|
+
const modelName = typeof m === 'string' ? m : m.name;
|
|
307
|
+
const modelDesc = typeof m === 'string' ? '' : m.desc;
|
|
308
|
+
const current = modelId === configManager.getDefaultModel() ? chalk_1.default.green('* ') : ' ';
|
|
309
|
+
console.log(`${current}${modelId} - ${chalk_1.default.gray(modelName)}${modelDesc ? chalk_1.default.gray(` (${modelDesc})`) : ''}`);
|
|
310
|
+
}
|
|
311
|
+
console.log('');
|
|
312
|
+
}
|
|
313
|
+
// 显示当前配置
|
|
314
|
+
console.log(chalk_1.default.bold('───────────────────────────────────────────────────────────'));
|
|
315
|
+
console.log(`Current model: ${chalk_1.default.green(configManager.getDefaultModel())}`);
|
|
316
|
+
console.log(`Thinking display: ${configManager.getShowThinking() ? chalk_1.default.green('ON') : chalk_1.default.gray('OFF')}`);
|
|
317
|
+
console.log('');
|
|
318
|
+
}
|
|
319
|
+
program.parse();
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEseUNBQW9DO0FBQ3BDLCtCQUErRDtBQUMvRCx5Q0FBa0U7QUFDbEUsa0RBQTBCO0FBQzFCLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsZ0NBQWdDO0FBQ2hDLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQztBQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFMUUsbUVBQW1FO0FBQ25FLElBQUksQ0FBQztJQUNILE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUNwQixDQUFDO0FBQ0gsQ0FBQztBQUFDLE1BQU0sQ0FBQztJQUNQLDZCQUE2QjtBQUMvQixDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBTyxFQUFFLENBQUM7QUFFOUIsT0FBTztLQUNKLElBQUksQ0FBQyxPQUFPLENBQUM7S0FDYixXQUFXLENBQUMsdUNBQXVDLENBQUM7S0FDcEQsT0FBTyxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUM7S0FDNUIsTUFBTSxDQUFDLHFCQUFxQixFQUFFLDZCQUE2QixDQUFDO0tBQzVELE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxtQkFBbUIsQ0FBQztLQUNwRCxNQUFNLENBQUMsUUFBUSxFQUFFLGdEQUFnRCxDQUFDO0tBQ2xFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsb0NBQW9DLENBQUM7S0FDMUQsTUFBTSxDQUFDLGVBQWUsRUFBRSxvQ0FBb0MsQ0FBQztLQUM3RCxRQUFRLENBQUMsVUFBVSxFQUFFLGdFQUFnRSxDQUFDO0tBQ3RGLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFO0lBQ2hDLE1BQU0sYUFBYSxHQUFHLElBQUEsdUJBQWdCLEdBQUUsQ0FBQztJQUV6Qyx1QkFBdUI7SUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQywwQ0FBMEMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNoQixNQUFNLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLE9BQU87SUFDVCxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2xCLGFBQWEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFFRCxpQ0FBaUM7SUFDakMsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlCLGFBQWEsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUN0QyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDdEQsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUxQixJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsc0JBQXNCO1FBQ3RCLE1BQU0sSUFBQSxzQkFBZ0IsRUFBQyxNQUFNLEVBQUU7WUFDN0IsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLG1CQUFtQjtRQUNuQixNQUFNLElBQUEsMEJBQW9CLEVBQUM7WUFDekIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1lBQ3BCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtTQUNuQixDQUFDLENBQUM7SUFDTCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxlQUFlO0FBQ2YsT0FBTztLQUNKLE9BQU8sQ0FBQyxNQUFNLENBQUM7S0FDZixXQUFXLENBQUMsMEJBQTBCLENBQUM7S0FDdkMsTUFBTSxDQUFDLHVCQUF1QixFQUFFLHlDQUF5QyxDQUFDO0tBQzFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDeEIsTUFBTSxXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3RDLENBQUMsQ0FBQyxDQUFDO0FBRUwsaUJBQWlCO0FBQ2pCLE9BQU87S0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ2pCLFdBQVcsQ0FBQyw0QkFBNEIsQ0FBQztLQUN6QyxNQUFNLENBQUMsUUFBUSxFQUFFLDRCQUE0QixDQUFDO0tBQzlDLE1BQU0sQ0FBQyxtQkFBbUIsRUFBRSwyQkFBMkIsQ0FBQztLQUN4RCxNQUFNLENBQUMsWUFBWSxFQUFFLGlDQUFpQyxDQUFDO0tBQ3ZELE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7SUFDeEIsTUFBTSxhQUFhLEdBQUcsSUFBQSx1QkFBZ0IsR0FBRSxDQUFDO0lBRXpDLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDLENBQUM7UUFDbEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsYUFBYSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM1QixNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUNwRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxLQUFLLENBQUMsK0JBQStCLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLGFBQWEsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDN0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDckYsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUwsaUJBQWlCO0FBQ2pCLE9BQU87S0FDSixPQUFPLENBQUMsUUFBUSxDQUFDO0tBQ2pCLFdBQVcsQ0FBQywwQkFBMEIsQ0FBQztLQUN2QyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUU7SUFDakIsTUFBTSxVQUFVLEVBQUUsQ0FBQztBQUNyQixDQUFDLENBQUMsQ0FBQztBQUVMLEtBQUssVUFBVSxXQUFXLENBQUMsUUFBaUI7SUFDMUMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sYUFBYSxHQUFHLElBQUEsdUJBQWdCLEdBQUUsQ0FBQztJQUV6QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDcEM7Z0JBQ0UsSUFBSSxFQUFFLE1BQU07Z0JBQ1osSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLE9BQU8sRUFBRSxxQkFBcUI7Z0JBQzlCLE9BQU8sRUFBRTtvQkFDUCxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO29CQUNyRCxFQUFFLElBQUksRUFBRSwrQkFBK0IsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFO29CQUMxRCxFQUFFLElBQUksRUFBRSw0QkFBNEIsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7b0JBQzFFLEVBQUUsSUFBSSxFQUFFLCtCQUErQixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7b0JBQzVELEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7b0JBQzNDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO29CQUN6QyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO29CQUNqRCxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO29CQUN2QyxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO29CQUN4RCxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFO2lCQUMxRDthQUNGO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUM7SUFDOUIsQ0FBQztJQUVELFNBQVM7SUFDVCxJQUFJLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDcEM7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSw0QkFBNEI7Z0JBQ3JDLElBQUksRUFBRSxHQUFHO2FBQ1Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsTUFBTTtnQkFDWixJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsdUJBQXVCO2dCQUNoQyxPQUFPLEVBQUU7b0JBQ1AsUUFBUTtvQkFDUixhQUFhO29CQUNiLGFBQWE7b0JBQ2IsZUFBZTtvQkFDZixZQUFZO29CQUNaLFNBQVM7aUJBQ1Y7Z0JBQ0QsT0FBTyxFQUFFLFFBQVE7YUFDbEI7U0FDRixDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsT0FBTyxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsU0FBUztTQUNKLElBQUksUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQy9CLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNwQztnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsU0FBUztnQkFDZixPQUFPLEVBQUUscUJBQXFCO2dCQUM5QixPQUFPLEVBQUUsMkJBQTJCO2FBQ3JDO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLElBQUksRUFBRSxRQUFRO2dCQUNkLE9BQU8sRUFBRSxxQkFBcUI7Z0JBQzlCLElBQUksRUFBRSxHQUFHO2FBQ1Y7WUFDRDtnQkFDRSxJQUFJLEVBQUUsT0FBTztnQkFDYixJQUFJLEVBQUUsT0FBTztnQkFDYixPQUFPLEVBQUUsMkJBQTJCO2dCQUNwQyxPQUFPLEVBQUUsUUFBUTthQUNsQjtTQUNGLENBQUMsQ0FBQztRQUVILGFBQWEsQ0FBQyxPQUFPLENBQUM7WUFDcEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUs7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsYUFBYSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsT0FBTztTQUNGLElBQUkscUJBQWMsQ0FBQyxRQUF1QyxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLFdBQVcsR0FBRyxxQkFBYyxDQUFDLFFBQXVDLENBQUMsQ0FBQztRQUU1RSxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsUUFBUSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXBELE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLE1BQU0sQ0FBQztZQUNwQztnQkFDRSxJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsT0FBTyxFQUFFLGNBQWMsV0FBVyxDQUFDLElBQUksV0FBVztnQkFDbEQsSUFBSSxFQUFFLEdBQUc7YUFDVjtZQUNEO2dCQUNFLElBQUksRUFBRSxNQUFNO2dCQUNaLElBQUksRUFBRSxPQUFPO2dCQUNiLE9BQU8sRUFBRSx1QkFBdUI7Z0JBQ2hDLE9BQU8sRUFBRSxXQUFXLENBQUMsTUFBTTtnQkFDM0IsT0FBTyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2FBQy9CO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsYUFBYSxDQUFDLE9BQU8sQ0FBQztZQUNwQixRQUFRLEVBQUUsUUFBZTtZQUN6QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsT0FBTyxFQUFFLFdBQVcsQ0FBQyxPQUFPO1lBQzVCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztTQUNyQixDQUFDLENBQUM7UUFDSCxhQUFhLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3QyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxXQUFXLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTFELGVBQWU7UUFDZixJQUFJLFFBQVEsS0FBSyxVQUFVLElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxtQkFBbUIsRUFBRSxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLE1BQU0sQ0FBQyxvREFBb0QsQ0FBQyxDQUFDLENBQUM7UUFDbEYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsS0FBSyxVQUFVLFVBQVU7SUFDdkIsTUFBTSxhQUFhLEdBQUcsSUFBQSx1QkFBZ0IsR0FBRSxDQUFDO0lBQ3pDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUVyQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxHQUFHLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE9BQU87SUFDVCxDQUFDO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLCtEQUErRCxDQUFDLENBQUMsQ0FBQztJQUN6RixPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO0lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQywrREFBK0QsQ0FBQyxDQUFDLENBQUM7SUFFekYsZ0JBQWdCO0lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUc7UUFDbkIsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSwwQkFBMEIsRUFBRTtRQUNsRCxFQUFFLEVBQUUsRUFBRSxhQUFhLEVBQUUsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1FBQ2xELEVBQUUsRUFBRSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUU7UUFDckQsRUFBRSxFQUFFLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtRQUMvQyxFQUFFLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1FBQ2hELEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUscUJBQXFCLEVBQUU7S0FDL0MsQ0FBQztJQUNGLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNwRixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sZUFBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTztJQUNQLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUUxQyxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBYyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxZQUFZLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDOUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDakQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDckQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFFLENBQVMsQ0FBQyxJQUFJLENBQUM7WUFDL0QsTUFBTSxPQUFPLEdBQUcsT0FBTyxLQUFLLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxPQUFPLEdBQUcsT0FBTyxNQUFNLGVBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNsSCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNsQixDQUFDO0lBRUQsU0FBUztJQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyw2REFBNkQsQ0FBQyxDQUFDLENBQUM7SUFDdkYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsZUFBSyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsYUFBYSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xCLENBQUM7QUFFRCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgc3RhcnRJbnRlcmFjdGl2ZU1vZGUsIHJ1blNpbmdsZUNvbW1hbmQgfSBmcm9tICcuL2NsaSc7XG5pbXBvcnQgeyBnZXRDb25maWdNYW5hZ2VyLCBDSElORVNFX01PREVMUyB9IGZyb20gJ0BvZmxvdy1haS9jb3JlJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG4vLyBSZWFkIHBhY2thZ2UuanNvbiBmb3IgdmVyc2lvblxuY29uc3QgcGFja2FnZUpzb25QYXRoID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ3BhY2thZ2UuanNvbicpO1xuY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpKTtcblxuLy8gU2ltcGxlIHVwZGF0ZSBjaGVjayAod2l0aG91dCB1cGRhdGUtbm90aWZpZXIgZHVlIHRvIHR5cGUgaXNzdWVzKVxudHJ5IHtcbiAgY29uc3QgdXBkYXRlTm90aWZpZXIgPSByZXF1aXJlKCd1cGRhdGUtbm90aWZpZXInKTtcbiAgY29uc3Qgbm90aWZpZXIgPSB1cGRhdGVOb3RpZmllcih7IHBrZzogcGFja2FnZUpzb24gfSk7XG4gIGlmIChub3RpZmllci5ub3RpZnkpIHtcbiAgICBub3RpZmllci5ub3RpZnkoKTtcbiAgfVxufSBjYXRjaCB7XG4gIC8vIElnbm9yZSB1cGRhdGUgY2hlY2sgZXJyb3JzXG59XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdvZmxvdycpXG4gIC5kZXNjcmlwdGlvbignQUktcG93ZXJlZCBDTEkgYXNzaXN0YW50IGZvciB0ZXJtaW5hbCcpXG4gIC52ZXJzaW9uKHBhY2thZ2VKc29uLnZlcnNpb24pXG4gIC5vcHRpb24oJy1tLCAtLW1vZGVsIDxtb2RlbD4nLCAnU3BlY2lmeSB0aGUgQUkgbW9kZWwgdG8gdXNlJylcbiAgLm9wdGlvbignLWQsIC0tZGlyZWN0b3J5IDxkaXI+JywgJ1dvcmtpbmcgZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS15b2xvJywgJ1J1biBpbiB5b2xvIG1vZGUgKGF1dG8tYXBwcm92ZSBhbGwgb3BlcmF0aW9ucyknKVxuICAub3B0aW9uKCctLXRoaW5raW5nJywgJ1Nob3cgQUkgdGhpbmtpbmcvcmVhc29uaW5nIHByb2Nlc3MnKVxuICAub3B0aW9uKCctLW5vLXRoaW5raW5nJywgJ0hpZGUgQUkgdGhpbmtpbmcvcmVhc29uaW5nIHByb2Nlc3MnKVxuICAuYXJndW1lbnQoJ1twcm9tcHRdJywgJ1Byb21wdCB0byBzZW5kIHRvIEFJIChzdGFydHMgaW50ZXJhY3RpdmUgbW9kZSBpZiBub3QgcHJvdmlkZWQpJylcbiAgLmFjdGlvbihhc3luYyAocHJvbXB0LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICBcbiAgICAvLyBDaGVjayBhdXRoZW50aWNhdGlvblxuICAgIGlmICghY29uZmlnTWFuYWdlci5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCdXZWxjb21lIHRvIG9mbG93ISBMZXRcXCdzIGdldCB5b3Ugc2V0IHVwLicpKTtcbiAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgIGF3YWl0IHJ1bkF1dGhGbG93KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0IG1vZGVsIGlmIHNwZWNpZmllZFxuICAgIGlmIChvcHRpb25zLm1vZGVsKSB7XG4gICAgICBjb25maWdNYW5hZ2VyLnNldERlZmF1bHRNb2RlbChvcHRpb25zLm1vZGVsKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhpbmtpbmcgbW9kZSBpZiBzcGVjaWZpZWRcbiAgICBpZiAob3B0aW9ucy50aGlua2luZyA9PT0gdHJ1ZSkge1xuICAgICAgY29uZmlnTWFuYWdlci5zZXRTaG93VGhpbmtpbmcodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnRoaW5raW5nID09PSBmYWxzZSkge1xuICAgICAgY29uZmlnTWFuYWdlci5zZXRTaG93VGhpbmtpbmcoZmFsc2UpO1xuICAgIH1cblxuICAgIC8vIFNldCB3b3JraW5nIGRpcmVjdG9yeVxuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBvcHRpb25zLmRpcmVjdG9yeSB8fCBwcm9jZXNzLmN3ZCgpO1xuICAgIHByb2Nlc3MuY2hkaXIod29ya2luZ0Rpcik7XG5cbiAgICBpZiAocHJvbXB0KSB7XG4gICAgICAvLyBTaW5nbGUgY29tbWFuZCBtb2RlXG4gICAgICBhd2FpdCBydW5TaW5nbGVDb21tYW5kKHByb21wdCwge1xuICAgICAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAgICAgeW9sbzogb3B0aW9ucy55b2xvXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW50ZXJhY3RpdmUgbW9kZVxuICAgICAgYXdhaXQgc3RhcnRJbnRlcmFjdGl2ZU1vZGUoe1xuICAgICAgICBtb2RlbDogb3B0aW9ucy5tb2RlbCxcbiAgICAgICAgeW9sbzogb3B0aW9ucy55b2xvXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuXG4vLyBBdXRoIGNvbW1hbmRcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2F1dGgnKVxuICAuZGVzY3JpcHRpb24oJ0NvbmZpZ3VyZSBhdXRoZW50aWNhdGlvbicpXG4gIC5vcHRpb24oJy0tcHJvdmlkZXIgPHByb3ZpZGVyPicsICdQcm92aWRlciAob3BlbmFpLCBkZWVwc2VlaywgcXdlbiwgZXRjLiknKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgYXdhaXQgcnVuQXV0aEZsb3cob3B0aW9ucy5wcm92aWRlcik7XG4gIH0pO1xuXG4vLyBDb25maWcgY29tbWFuZFxucHJvZ3JhbVxuICAuY29tbWFuZCgnY29uZmlnJylcbiAgLmRlc2NyaXB0aW9uKCdWaWV3IG9yIGVkaXQgY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy0tbGlzdCcsICdMaXN0IGN1cnJlbnQgY29uZmlndXJhdGlvbicpXG4gIC5vcHRpb24oJy0tc2V0IDxrZXk9dmFsdWU+JywgJ1NldCBhIGNvbmZpZ3VyYXRpb24gdmFsdWUnKVxuICAub3B0aW9uKCctLXRoaW5raW5nJywgJ1RvZ2dsZSB0aGlua2luZyBwcm9jZXNzIGRpc3BsYXknKVxuICAuYWN0aW9uKGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgICBcbiAgICBpZiAob3B0aW9ucy5saXN0KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCdDdXJyZW50IENvbmZpZ3VyYXRpb246JykpO1xuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoY29uZmlnTWFuYWdlci5nZXRBbGwoKSwgbnVsbCwgMikpO1xuICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgQ29uZmlnIGZpbGU6ICR7Y29uZmlnTWFuYWdlci5nZXRDb25maWdQYXRoKCl9YCkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy50aGlua2luZykge1xuICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb25maWdNYW5hZ2VyLnRvZ2dsZVNob3dUaGlua2luZygpO1xuICAgICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oYOKckyBUaGlua2luZyBwcm9jZXNzIGRpc3BsYXk6ICR7bmV3VmFsdWUgPyAnT04nIDogJ09GRid9YCkpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5zZXQpIHtcbiAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IG9wdGlvbnMuc2V0LnNwbGl0KCc9Jyk7XG4gICAgICBjb25maWdNYW5hZ2VyLnNldChrZXkgYXMgYW55LCB2YWx1ZSk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihgU2V0ICR7a2V5fSA9ICR7dmFsdWV9YCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7Y29uZmlnTWFuYWdlci5nZXRDb25maWdQYXRoKCl9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgVGhpbmtpbmcgZGlzcGxheTogJHtjb25maWdNYW5hZ2VyLmdldFNob3dUaGlua2luZygpID8gJ09OJyA6ICdPRkYnfWApO1xuICAgIH1cbiAgfSk7XG5cbi8vIE1vZGVscyBjb21tYW5kXG5wcm9ncmFtXG4gIC5jb21tYW5kKCdtb2RlbHMnKVxuICAuZGVzY3JpcHRpb24oJ0xpc3QgYXZhaWxhYmxlIEFJIG1vZGVscycpXG4gIC5hY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGxpc3RNb2RlbHMoKTtcbiAgfSk7XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkF1dGhGbG93KHByb3ZpZGVyPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGlucXVpcmVyID0gcmVxdWlyZSgnaW5xdWlyZXInKTtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcblxuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgY29uc3QgYW5zd2VycyA9IGF3YWl0IGlucXVpcmVyLnByb21wdChbXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgbmFtZTogJ3Byb3ZpZGVyJyxcbiAgICAgICAgbWVzc2FnZTogJ1NlbGVjdCBBSSBwcm92aWRlcjonLFxuICAgICAgICBjaG9pY2VzOiBbXG4gICAgICAgICAgeyBuYW1lOiAn8J+MkCBPcGVuQUkgKE9mZmljaWFsIEFQSSknLCB2YWx1ZTogJ29wZW5haScgfSxcbiAgICAgICAgICB7IG5hbWU6ICfwn5SnIEN1c3RvbSAoT3BlbkFJLWNvbXBhdGlibGUpJywgdmFsdWU6ICdjdXN0b20nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIOWbveWGheaooeWeiyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAnLCB2YWx1ZTogJ3NlcGFyYXRvcicsIGRpc2FibGVkOiB0cnVlIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgRGVlcFNlZWsgKOa3seW6puaxgue0oikgLSDmjqjojZDmjqjnkIbmqKHlnosnLCB2YWx1ZTogJ2RlZXBzZWVrJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIFF3ZW4gKOmAmuS5ieWNg+mXriknLCB2YWx1ZTogJ3F3ZW4nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgR0xNICjmmbrosLEpJywgdmFsdWU6ICd6aGlwdScgfSxcbiAgICAgICAgICB7IG5hbWU6ICfwn4eo8J+HsyBCYWljaHVhbiAo55m+5bedKScsIHZhbHVlOiAnYmFpY2h1YW4nIH0sXG4gICAgICAgICAgeyBuYW1lOiAn8J+HqPCfh7MgWWkgKOmbtuS4gOS4h+eJqSknLCB2YWx1ZTogJ3lpJyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIE1vb25zaG90ICjmnIjkuYvmmpfpnaIvS2ltaSknLCB2YWx1ZTogJ21vb25zaG90JyB9LFxuICAgICAgICAgIHsgbmFtZTogJ/Cfh6jwn4ezIFNpbGljb25GbG93ICjnoYXln7rmtYHliqgpJywgdmFsdWU6ICdzaWxpY29uZmxvdycgfVxuICAgICAgICBdXG4gICAgICB9XG4gICAgXSk7XG4gICAgcHJvdmlkZXIgPSBhbnN3ZXJzLnByb3ZpZGVyO1xuICB9XG5cbiAgLy8gT3BlbkFJXG4gIGlmIChwcm92aWRlciA9PT0gJ29wZW5haScpIHtcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6ICdFbnRlciB5b3VyIE9wZW5BSSBBUEkga2V5OicsXG4gICAgICAgIG1hc2s6ICcqJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgICBuYW1lOiAnbW9kZWwnLFxuICAgICAgICBtZXNzYWdlOiAnU2VsZWN0IGRlZmF1bHQgbW9kZWw6JyxcbiAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICdncHQtNG8nLFxuICAgICAgICAgICdncHQtNG8tbWluaScsXG4gICAgICAgICAgJ2dwdC00LXR1cmJvJyxcbiAgICAgICAgICAnZ3B0LTMuNS10dXJibycsXG4gICAgICAgICAgJ28xLXByZXZpZXcnLFxuICAgICAgICAgICdvMS1taW5pJ1xuICAgICAgICBdLFxuICAgICAgICBkZWZhdWx0OiAnZ3B0LTRvJ1xuICAgICAgfVxuICAgIF0pO1xuXG4gICAgY29uZmlnTWFuYWdlci5zZXRBdXRoKHtcbiAgICAgIHByb3ZpZGVyOiAnb3BlbmFpJyxcbiAgICAgIGFwaUtleTogYW5zd2Vycy5hcGlLZXksXG4gICAgICBtb2RlbDogYW5zd2Vycy5tb2RlbFxuICAgIH0pO1xuICAgIGNvbmZpZ01hbmFnZXIuc2V0RGVmYXVsdE1vZGVsKGFuc3dlcnMubW9kZWwpO1xuXG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JlZW4oJ1xcbuKckyBBdXRoZW50aWNhdGlvbiBjb25maWd1cmVkIHN1Y2Nlc3NmdWxseSEnKSk7XG4gIH0gXG4gIC8vIEN1c3RvbVxuICBlbHNlIGlmIChwcm92aWRlciA9PT0gJ2N1c3RvbScpIHtcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2lucHV0JyxcbiAgICAgICAgbmFtZTogJ2Jhc2VVcmwnLFxuICAgICAgICBtZXNzYWdlOiAnRW50ZXIgQVBJIGJhc2UgVVJMOicsXG4gICAgICAgIGRlZmF1bHQ6ICdodHRwczovL2FwaS5vcGVuYWkuY29tL3YxJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6ICdFbnRlciB5b3VyIEFQSSBrZXk6JyxcbiAgICAgICAgbWFzazogJyonXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICB0eXBlOiAnaW5wdXQnLFxuICAgICAgICBuYW1lOiAnbW9kZWwnLFxuICAgICAgICBtZXNzYWdlOiAnRW50ZXIgZGVmYXVsdCBtb2RlbCBuYW1lOicsXG4gICAgICAgIGRlZmF1bHQ6ICdncHQtNG8nXG4gICAgICB9XG4gICAgXSk7XG5cbiAgICBjb25maWdNYW5hZ2VyLnNldEF1dGgoe1xuICAgICAgcHJvdmlkZXI6ICdjdXN0b20nLFxuICAgICAgYXBpS2V5OiBhbnN3ZXJzLmFwaUtleSxcbiAgICAgIGJhc2VVcmw6IGFuc3dlcnMuYmFzZVVybCxcbiAgICAgIG1vZGVsOiBhbnN3ZXJzLm1vZGVsXG4gICAgfSk7XG4gICAgY29uZmlnTWFuYWdlci5zZXREZWZhdWx0TW9kZWwoYW5zd2Vycy5tb2RlbCk7XG5cbiAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbignXFxu4pyTIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQgc3VjY2Vzc2Z1bGx5IScpKTtcbiAgfVxuICAvLyDlm73lhoXmqKHlnotcbiAgZWxzZSBpZiAoQ0hJTkVTRV9NT0RFTFNbcHJvdmlkZXIgYXMga2V5b2YgdHlwZW9mIENISU5FU0VfTU9ERUxTXSkge1xuICAgIGNvbnN0IG1vZGVsQ29uZmlnID0gQ0hJTkVTRV9NT0RFTFNbcHJvdmlkZXIgYXMga2V5b2YgdHlwZW9mIENISU5FU0VfTU9ERUxTXTtcbiAgICBcbiAgICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKGBcXG7phY3nva4gJHttb2RlbENvbmZpZy5uYW1lfWApKTtcbiAgICBcbiAgICBjb25zdCBhbnN3ZXJzID0gYXdhaXQgaW5xdWlyZXIucHJvbXB0KFtcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ3Bhc3N3b3JkJyxcbiAgICAgICAgbmFtZTogJ2FwaUtleScsXG4gICAgICAgIG1lc3NhZ2U6IGBFbnRlciB5b3VyICR7bW9kZWxDb25maWcubmFtZX0gQVBJIGtleTpgLFxuICAgICAgICBtYXNrOiAnKidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgICAgbmFtZTogJ21vZGVsJyxcbiAgICAgICAgbWVzc2FnZTogJ1NlbGVjdCBkZWZhdWx0IG1vZGVsOicsXG4gICAgICAgIGNob2ljZXM6IG1vZGVsQ29uZmlnLm1vZGVscyxcbiAgICAgICAgZGVmYXVsdDogbW9kZWxDb25maWcubW9kZWxzWzBdXG4gICAgICB9XG4gICAgXSk7XG5cbiAgICBjb25maWdNYW5hZ2VyLnNldEF1dGgoe1xuICAgICAgcHJvdmlkZXI6IHByb3ZpZGVyIGFzIGFueSxcbiAgICAgIGFwaUtleTogYW5zd2Vycy5hcGlLZXksXG4gICAgICBiYXNlVXJsOiBtb2RlbENvbmZpZy5iYXNlVXJsLFxuICAgICAgbW9kZWw6IGFuc3dlcnMubW9kZWxcbiAgICB9KTtcbiAgICBjb25maWdNYW5hZ2VyLnNldERlZmF1bHRNb2RlbChhbnN3ZXJzLm1vZGVsKTtcblxuICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGBcXG7inJMgJHttb2RlbENvbmZpZy5uYW1lfSDphY3nva7miJDlip8hYCkpO1xuICAgIFxuICAgIC8vIERlZXBTZWVr54m55q6K5o+Q56S6XG4gICAgaWYgKHByb3ZpZGVyID09PSAnZGVlcHNlZWsnICYmIGFuc3dlcnMubW9kZWwgPT09ICdkZWVwc2Vlay1yZWFzb25lcicpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdygn8J+SoSDmj5DnpLo6IGRlZXBzZWVrLXJlYXNvbmVyIOaUr+aMgeaYvuekuuaAneiAg+i/h+eoi++8jOS9v+eUqCAtLXRoaW5raW5nIOW8gOWQrycpKTtcbiAgICB9XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gbGlzdE1vZGVscygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29uZmlnTWFuYWdlciA9IGdldENvbmZpZ01hbmFnZXIoKTtcbiAgY29uc3QgYXV0aCA9IGNvbmZpZ01hbmFnZXIuZ2V0QXV0aCgpO1xuXG4gIGlmICghYXV0aCkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZCgnTm90IGF1dGhlbnRpY2F0ZWQuIFJ1biBgb2Zsb3cgYXV0aGAgZmlyc3QuJykpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ1xcbuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCcpKTtcbiAgY29uc29sZS5sb2coY2hhbGsuYm9sZCgnICAgICAgICAgICAgICAgICAgICBBdmFpbGFibGUgTW9kZWxzICAgICAgICAgICAgICAgICAgICAgICAgJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCfilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcXG4nKSk7XG5cbiAgLy8gT3BlbkFJIE1vZGVsc1xuICBjb25zb2xlLmxvZyhjaGFsay5jeWFuKCfwn4yQIE9wZW5BSSBNb2RlbHM6JykpO1xuICBjb25zdCBvcGVuYWlNb2RlbHMgPSBbXG4gICAgeyBpZDogJ2dwdC00bycsIGRlc2M6ICdNb3N0IGNhcGFibGUgR1BULTQgbW9kZWwnIH0sXG4gICAgeyBpZDogJ2dwdC00by1taW5pJywgZGVzYzogJ0Zhc3QgYW5kIGFmZm9yZGFibGUnIH0sXG4gICAgeyBpZDogJ2dwdC00LXR1cmJvJywgZGVzYzogJ1ByZXZpb3VzIEdQVC00IHZlcnNpb24nIH0sXG4gICAgeyBpZDogJ2dwdC0zLjUtdHVyYm8nLCBkZXNjOiAnRmFzdCBhbmQgY2hlYXAnIH0sXG4gICAgeyBpZDogJ28xLXByZXZpZXcnLCBkZXNjOiAnQWR2YW5jZWQgcmVhc29uaW5nJyB9LFxuICAgIHsgaWQ6ICdvMS1taW5pJywgZGVzYzogJ0VmZmljaWVudCByZWFzb25pbmcnIH1cbiAgXTtcbiAgb3BlbmFpTW9kZWxzLmZvckVhY2gobSA9PiB7XG4gICAgY29uc3QgY3VycmVudCA9IG0uaWQgPT09IGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkgPyBjaGFsay5ncmVlbignKiAnKSA6ICcgICc7XG4gICAgY29uc29sZS5sb2coYCR7Y3VycmVudH0ke20uaWR9IC0gJHtjaGFsay5ncmF5KG0uZGVzYyl9YCk7XG4gIH0pO1xuXG4gIC8vIOWbveWGheaooeWei1xuICBjb25zb2xlLmxvZygnJyk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJ/Cfh6jwn4ezIOWbveWGheW8gOa6kOaooeWeizpcXG4nKSk7XG5cbiAgZm9yIChjb25zdCBba2V5LCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKENISU5FU0VfTU9ERUxTKSkge1xuICAgIGNvbnNvbGUubG9nKGNoYWxrLmJvbGQoYCAgJHtjb25maWcubmFtZX1gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuZ3JheShgICAgIEFQSTogJHtjb25maWcuYmFzZVVybH1gKSk7XG4gICAgZm9yIChjb25zdCBtIG9mIGNvbmZpZy5tb2RlbHMpIHtcbiAgICAgIGNvbnN0IG1vZGVsSWQgPSB0eXBlb2YgbSA9PT0gJ3N0cmluZycgPyBtIDogbS5pZDtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IHR5cGVvZiBtID09PSAnc3RyaW5nJyA/IG0gOiBtLm5hbWU7XG4gICAgICBjb25zdCBtb2RlbERlc2MgPSB0eXBlb2YgbSA9PT0gJ3N0cmluZycgPyAnJyA6IChtIGFzIGFueSkuZGVzYztcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBtb2RlbElkID09PSBjb25maWdNYW5hZ2VyLmdldERlZmF1bHRNb2RlbCgpID8gY2hhbGsuZ3JlZW4oJyogJykgOiAnICAgICc7XG4gICAgICBjb25zb2xlLmxvZyhgJHtjdXJyZW50fSR7bW9kZWxJZH0gLSAke2NoYWxrLmdyYXkobW9kZWxOYW1lKX0ke21vZGVsRGVzYyA/IGNoYWxrLmdyYXkoYCAoJHttb2RlbERlc2N9KWApIDogJyd9YCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuXG4gIC8vIOaYvuekuuW9k+WJjemFjee9rlxuICBjb25zb2xlLmxvZyhjaGFsay5ib2xkKCfilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAnKSk7XG4gIGNvbnNvbGUubG9nKGBDdXJyZW50IG1vZGVsOiAke2NoYWxrLmdyZWVuKGNvbmZpZ01hbmFnZXIuZ2V0RGVmYXVsdE1vZGVsKCkpfWApO1xuICBjb25zb2xlLmxvZyhgVGhpbmtpbmcgZGlzcGxheTogJHtjb25maWdNYW5hZ2VyLmdldFNob3dUaGlua2luZygpID8gY2hhbGsuZ3JlZW4oJ09OJykgOiBjaGFsay5ncmF5KCdPRkYnKX1gKTtcbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5wcm9ncmFtLnBhcnNlKCk7Il19
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Post-install script for @oflow-ai/oflow-cli
|
|
4
|
+
* Runs after npm install to display welcome message and instructions
|
|
5
|
+
*/
|
|
6
|
+
declare const chalk: any;
|
|
7
|
+
declare const fs: any;
|
|
8
|
+
declare const path: any;
|
|
9
|
+
declare const nodeVersion: string;
|
|
10
|
+
declare const majorVersion: number;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Post-install script for @oflow-ai/oflow-cli
|
|
5
|
+
* Runs after npm install to display welcome message and instructions
|
|
6
|
+
*/
|
|
7
|
+
const chalk = require('chalk');
|
|
8
|
+
const fs = require('fs');
|
|
9
|
+
const path = require('path');
|
|
10
|
+
// Check if running in CI or npm install --ignore-scripts
|
|
11
|
+
if (process.env.CI || process.env.npm_config_ignore_scripts) {
|
|
12
|
+
process.exit(0);
|
|
13
|
+
}
|
|
14
|
+
// Display welcome message
|
|
15
|
+
console.log('');
|
|
16
|
+
console.log(chalk.bold.blue('╔════════════════════════════════════════════════════════════╗'));
|
|
17
|
+
console.log(chalk.bold.blue('║ Welcome to oFlow CLI ║'));
|
|
18
|
+
console.log(chalk.bold.blue('╚════════════════════════════════════════════════════════════╝'));
|
|
19
|
+
console.log('');
|
|
20
|
+
console.log(chalk.green('✓ oFlow CLI installed successfully!'));
|
|
21
|
+
console.log('');
|
|
22
|
+
console.log(chalk.bold('Quick Start:'));
|
|
23
|
+
console.log('');
|
|
24
|
+
console.log(chalk.cyan(' 1. Run the CLI:'));
|
|
25
|
+
console.log(chalk.white(' oflow'));
|
|
26
|
+
console.log('');
|
|
27
|
+
console.log(chalk.cyan(' 2. Configure authentication:'));
|
|
28
|
+
console.log(chalk.white(' oflow auth'));
|
|
29
|
+
console.log('');
|
|
30
|
+
console.log(chalk.cyan(' 3. Available AI Providers:'));
|
|
31
|
+
console.log(chalk.gray(' • OpenAI (GPT-4o, GPT-4-turbo, etc.)'));
|
|
32
|
+
console.log(chalk.gray(' • DeepSeek (深度求索) - Recommended'));
|
|
33
|
+
console.log(chalk.gray(' • Qwen (通义千问)'));
|
|
34
|
+
console.log(chalk.gray(' • GLM (智谱)'));
|
|
35
|
+
console.log(chalk.gray(' • Baichuan (百川)'));
|
|
36
|
+
console.log(chalk.gray(' • Yi (零一万物)'));
|
|
37
|
+
console.log(chalk.gray(' • Moonshot (月之暗面/Kimi)'));
|
|
38
|
+
console.log(chalk.gray(' • SiliconFlow (硅基流动)'));
|
|
39
|
+
console.log('');
|
|
40
|
+
console.log(chalk.bold('Options:'));
|
|
41
|
+
console.log(chalk.gray(' oflow --help Show help'));
|
|
42
|
+
console.log(chalk.gray(' oflow --thinking Show AI reasoning process'));
|
|
43
|
+
console.log(chalk.gray(' oflow models List available models'));
|
|
44
|
+
console.log(chalk.gray(' oflow config View configuration'));
|
|
45
|
+
console.log('');
|
|
46
|
+
console.log(chalk.bold('Documentation:'));
|
|
47
|
+
console.log(chalk.blue(' https://github.com/oflow-ai/oflow-cli'));
|
|
48
|
+
console.log('');
|
|
49
|
+
// Check Node.js version
|
|
50
|
+
const nodeVersion = process.version;
|
|
51
|
+
const majorVersion = parseInt(nodeVersion.slice(1).split('.')[0], 10);
|
|
52
|
+
if (majorVersion < 18) {
|
|
53
|
+
console.log(chalk.yellow('⚠ Warning: Node.js 18 or higher is recommended.'));
|
|
54
|
+
console.log(chalk.yellow(` Current version: ${nodeVersion}`));
|
|
55
|
+
console.log('');
|
|
56
|
+
}
|
|
57
|
+
process.exit(0);
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9zdGluc3RhbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcG9zdGluc3RhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQTs7O0dBR0c7QUFFSCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0IsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUU3Qix5REFBeUQ7QUFDekQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsMEJBQTBCO0FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDLENBQUM7QUFDL0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDeEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO0FBQzdDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUMsQ0FBQztBQUMxRCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzVDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztBQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDLENBQUM7QUFDaEUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0FBQzNDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7QUFDaEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztBQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7QUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztBQUNwQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxDQUFDO0FBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxtREFBbUQsQ0FBQyxDQUFDLENBQUM7QUFDN0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLCtDQUErQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQyxDQUFDO0FBQ3RFLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztBQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFaEIsd0JBQXdCO0FBQ3hCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7QUFDcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXRFLElBQUksWUFBWSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxpREFBaUQsQ0FBQyxDQUFDLENBQUM7SUFDN0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLHNCQUFzQixXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDL0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNsQixDQUFDO0FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuLyoqXG4gKiBQb3N0LWluc3RhbGwgc2NyaXB0IGZvciBAb2Zsb3ctYWkvb2Zsb3ctY2xpXG4gKiBSdW5zIGFmdGVyIG5wbSBpbnN0YWxsIHRvIGRpc3BsYXkgd2VsY29tZSBtZXNzYWdlIGFuZCBpbnN0cnVjdGlvbnNcbiAqL1xuXG5jb25zdCBjaGFsayA9IHJlcXVpcmUoJ2NoYWxrJyk7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuXG4vLyBDaGVjayBpZiBydW5uaW5nIGluIENJIG9yIG5wbSBpbnN0YWxsIC0taWdub3JlLXNjcmlwdHNcbmlmIChwcm9jZXNzLmVudi5DSSB8fCBwcm9jZXNzLmVudi5ucG1fY29uZmlnX2lnbm9yZV9zY3JpcHRzKSB7XG4gIHByb2Nlc3MuZXhpdCgwKTtcbn1cblxuLy8gRGlzcGxheSB3ZWxjb21lIG1lc3NhZ2VcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQuYmx1ZSgn4pWU4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWXJykpO1xuY29uc29sZS5sb2coY2hhbGsuYm9sZC5ibHVlKCfilZEgICAgICAgICAgICAgICAgICAgIFdlbGNvbWUgdG8gb0Zsb3cgQ0xJICAgICAgICAgICAgICAgICAgICDilZEnKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ib2xkLmJsdWUoJ+KVmuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVnScpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKCfinJMgb0Zsb3cgQ0xJIGluc3RhbGxlZCBzdWNjZXNzZnVsbHkhJykpO1xuY29uc29sZS5sb2coJycpO1xuY29uc29sZS5sb2coY2hhbGsuYm9sZCgnUXVpY2sgU3RhcnQ6JykpO1xuY29uc29sZS5sb2coJycpO1xuY29uc29sZS5sb2coY2hhbGsuY3lhbignICAxLiBSdW4gdGhlIENMSTonKSk7XG5jb25zb2xlLmxvZyhjaGFsay53aGl0ZSgnICAgICBvZmxvdycpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmN5YW4oJyAgMi4gQ29uZmlndXJlIGF1dGhlbnRpY2F0aW9uOicpKTtcbmNvbnNvbGUubG9nKGNoYWxrLndoaXRlKCcgICAgIG9mbG93IGF1dGgnKSk7XG5jb25zb2xlLmxvZygnJyk7XG5jb25zb2xlLmxvZyhjaGFsay5jeWFuKCcgIDMuIEF2YWlsYWJsZSBBSSBQcm92aWRlcnM6JykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgT3BlbkFJIChHUFQtNG8sIEdQVC00LXR1cmJvLCBldGMuKScpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgICAg4oCiIERlZXBTZWVrICjmt7HluqbmsYLntKIpIC0gUmVjb21tZW5kZWQnKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBRd2VuICjpgJrkuYnljYPpl64pJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgR0xNICjmmbrosLEpJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICAgICDigKIgQmFpY2h1YW4gKOeZvuW3nSknKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBZaSAo6Zu25LiA5LiH54mpKScpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgICAg4oCiIE1vb25zaG90ICjmnIjkuYvmmpfpnaIvS2ltaSknKSk7XG5jb25zb2xlLmxvZyhjaGFsay5ncmF5KCcgICAgIOKAoiBTaWxpY29uRmxvdyAo56GF5Z+65rWB5YqoKScpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ09wdGlvbnM6JykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBvZmxvdyAtLWhlbHAgICAgICAgICAgU2hvdyBoZWxwJykpO1xuY29uc29sZS5sb2coY2hhbGsuZ3JheSgnICBvZmxvdyAtLXRoaW5raW5nICAgICAgU2hvdyBBSSByZWFzb25pbmcgcHJvY2VzcycpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgb2Zsb3cgbW9kZWxzICAgICAgICAgIExpc3QgYXZhaWxhYmxlIG1vZGVscycpKTtcbmNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJyAgb2Zsb3cgY29uZmlnICAgICAgICAgIFZpZXcgY29uZmlndXJhdGlvbicpKTtcbmNvbnNvbGUubG9nKCcnKTtcbmNvbnNvbGUubG9nKGNoYWxrLmJvbGQoJ0RvY3VtZW50YXRpb246JykpO1xuY29uc29sZS5sb2coY2hhbGsuYmx1ZSgnICBodHRwczovL2dpdGh1Yi5jb20vb2Zsb3ctYWkvb2Zsb3ctY2xpJykpO1xuY29uc29sZS5sb2coJycpO1xuXG4vLyBDaGVjayBOb2RlLmpzIHZlcnNpb25cbmNvbnN0IG5vZGVWZXJzaW9uID0gcHJvY2Vzcy52ZXJzaW9uO1xuY29uc3QgbWFqb3JWZXJzaW9uID0gcGFyc2VJbnQobm9kZVZlcnNpb24uc2xpY2UoMSkuc3BsaXQoJy4nKVswXSwgMTApO1xuXG5pZiAobWFqb3JWZXJzaW9uIDwgMTgpIHtcbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KCfimqAgV2FybmluZzogTm9kZS5qcyAxOCBvciBoaWdoZXIgaXMgcmVjb21tZW5kZWQuJykpO1xuICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCAgQ3VycmVudCB2ZXJzaW9uOiAke25vZGVWZXJzaW9ufWApKTtcbiAgY29uc29sZS5sb2coJycpO1xufVxuXG5wcm9jZXNzLmV4aXQoMCk7XG4iXX0=
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function renderMarkdown(content: string): string;
|
|
2
|
+
export declare function formatCodeBlock(code: string, language?: string): string;
|
|
3
|
+
export declare function formatInlineCode(code: string): string;
|
|
4
|
+
export declare function formatLink(text: string, url: string): string;
|
|
5
|
+
export declare function formatBullet(text: string, level?: number): string;
|
|
6
|
+
export declare function formatNumberedList(items: string[]): string;
|
|
7
|
+
export declare function formatError(message: string): string;
|
|
8
|
+
export declare function formatSuccess(message: string): string;
|
|
9
|
+
export declare function formatWarning(message: string): string;
|
|
10
|
+
export declare function formatInfo(message: string): string;
|
|
@@ -0,0 +1,69 @@
|
|
|
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.renderMarkdown = renderMarkdown;
|
|
7
|
+
exports.formatCodeBlock = formatCodeBlock;
|
|
8
|
+
exports.formatInlineCode = formatInlineCode;
|
|
9
|
+
exports.formatLink = formatLink;
|
|
10
|
+
exports.formatBullet = formatBullet;
|
|
11
|
+
exports.formatNumberedList = formatNumberedList;
|
|
12
|
+
exports.formatError = formatError;
|
|
13
|
+
exports.formatSuccess = formatSuccess;
|
|
14
|
+
exports.formatWarning = formatWarning;
|
|
15
|
+
exports.formatInfo = formatInfo;
|
|
16
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
17
|
+
function renderMarkdown(content) {
|
|
18
|
+
// Simple markdown rendering
|
|
19
|
+
let result = content;
|
|
20
|
+
// Bold
|
|
21
|
+
result = result.replace(/\*\*(.*?)\*\*/g, (_, text) => chalk_1.default.bold(text));
|
|
22
|
+
// Italic
|
|
23
|
+
result = result.replace(/\*(.*?)\*/g, (_, text) => chalk_1.default.italic(text));
|
|
24
|
+
// Code blocks
|
|
25
|
+
result = result.replace(/```(\w*)\n([\s\S]*?)```/g, (_, lang, code) => {
|
|
26
|
+
return chalk_1.default.cyan(code);
|
|
27
|
+
});
|
|
28
|
+
// Inline code
|
|
29
|
+
result = result.replace(/`([^`]+)`/g, (_, code) => chalk_1.default.cyan(code));
|
|
30
|
+
// Headers
|
|
31
|
+
result = result.replace(/^### (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
|
|
32
|
+
result = result.replace(/^## (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
|
|
33
|
+
result = result.replace(/^# (.+)$/gm, (_, text) => chalk_1.default.bold.green(text));
|
|
34
|
+
// Links
|
|
35
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, (_, text, url) => `${chalk_1.default.blue.underline(text)} ${chalk_1.default.gray(`(${url})`)}`);
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function formatCodeBlock(code, language) {
|
|
39
|
+
const header = language ? chalk_1.default.gray(`\`\`\`${language}\n`) : chalk_1.default.gray('```\n');
|
|
40
|
+
const footer = chalk_1.default.gray('\n```');
|
|
41
|
+
return header + chalk_1.default.cyan(code) + footer;
|
|
42
|
+
}
|
|
43
|
+
function formatInlineCode(code) {
|
|
44
|
+
return chalk_1.default.cyan(`\`${code}\``);
|
|
45
|
+
}
|
|
46
|
+
function formatLink(text, url) {
|
|
47
|
+
return `${chalk_1.default.blue.underline(text)} ${chalk_1.default.gray(`(${url})`)}`;
|
|
48
|
+
}
|
|
49
|
+
function formatBullet(text, level = 0) {
|
|
50
|
+
const indent = ' '.repeat(level);
|
|
51
|
+
const bullet = level === 0 ? '•' : '◦';
|
|
52
|
+
return `${indent}${chalk_1.default.cyan(bullet)} ${text}`;
|
|
53
|
+
}
|
|
54
|
+
function formatNumberedList(items) {
|
|
55
|
+
return items.map((item, index) => `${chalk_1.default.cyan(`${index + 1}.`)} ${item}`).join('\n');
|
|
56
|
+
}
|
|
57
|
+
function formatError(message) {
|
|
58
|
+
return chalk_1.default.red(`✗ Error: ${message}`);
|
|
59
|
+
}
|
|
60
|
+
function formatSuccess(message) {
|
|
61
|
+
return chalk_1.default.green(`✓ ${message}`);
|
|
62
|
+
}
|
|
63
|
+
function formatWarning(message) {
|
|
64
|
+
return chalk_1.default.yellow(`⚠ ${message}`);
|
|
65
|
+
}
|
|
66
|
+
function formatInfo(message) {
|
|
67
|
+
return chalk_1.default.blue(`ℹ ${message}`);
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFya2Rvd24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvbWFya2Rvd24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSx3Q0E2QkM7QUFFRCwwQ0FJQztBQUVELDRDQUVDO0FBRUQsZ0NBRUM7QUFFRCxvQ0FJQztBQUVELGdEQUlDO0FBRUQsa0NBRUM7QUFFRCxzQ0FFQztBQUVELHNDQUVDO0FBRUQsZ0NBRUM7QUF6RUQsa0RBQTBCO0FBRTFCLFNBQWdCLGNBQWMsQ0FBQyxPQUFlO0lBQzVDLDRCQUE0QjtJQUM1QixJQUFJLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFFckIsT0FBTztJQUNQLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXpFLFNBQVM7SUFDVCxNQUFNLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxlQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFdkUsY0FBYztJQUNkLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUNwRSxPQUFPLGVBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQyxDQUFDLENBQUM7SUFFSCxjQUFjO0lBQ2QsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsZUFBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXJFLFVBQVU7SUFDVixNQUFNLEdBQUcs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QUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FBQyxPQUFlO0lBQzNDLE9BQU8sZUFBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELFNBQWdCLFVBQVUsQ0FBQyxPQUFlO0lBQ3hDLE9BQU8sZUFBSyxDQUFDLElBQUksQ0FBQyxLQUFLLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYXJrZG93bihjb250ZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBTaW1wbGUgbWFya2Rvd24gcmVuZGVyaW5nXG4gIGxldCByZXN1bHQgPSBjb250ZW50O1xuICBcbiAgLy8gQm9sZFxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXFwqXFwqKC4qPylcXCpcXCovZywgKF8sIHRleHQpID0+IGNoYWxrLmJvbGQodGV4dCkpO1xuICBcbiAgLy8gSXRhbGljXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXCooLio/KVxcKi9nLCAoXywgdGV4dCkgPT4gY2hhbGsuaXRhbGljKHRleHQpKTtcbiAgXG4gIC8vIENvZGUgYmxvY2tzXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9gYGAoXFx3KilcXG4oW1xcc1xcU10qPylgYGAvZywgKF8sIGxhbmcsIGNvZGUpID0+IHtcbiAgICByZXR1cm4gY2hhbGsuY3lhbihjb2RlKTtcbiAgfSk7XG4gIFxuICAvLyBJbmxpbmUgY29kZVxuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvYChbXmBdKylgL2csIChfLCBjb2RlKSA9PiBjaGFsay5jeWFuKGNvZGUpKTtcbiAgXG4gIC8vIEhlYWRlcnNcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL14jIyMgKC4rKSQvZ20sIChfLCB0ZXh0KSA9PiBjaGFsay5ib2xkLmdyZWVuKHRleHQpKTtcbiAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoL14jIyAoLispJC9nbSwgKF8sIHRleHQpID0+IGNoYWxrLmJvbGQuZ3JlZW4odGV4dCkpO1xuICByZXN1bHQgPSByZXN1bHQucmVwbGFjZSgvXiMgKC4rKSQvZ20sIChfLCB0ZXh0KSA9PiBjaGFsay5ib2xkLmdyZWVuKHRleHQpKTtcbiAgXG4gIC8vIExpbmtzXG4gIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKC9cXFsoW15cXF1dKylcXF1cXCgoW14pXSspXFwpL2csIChfLCB0ZXh0LCB1cmwpID0+IFxuICAgIGAke2NoYWxrLmJsdWUudW5kZXJsaW5lKHRleHQpfSAke2NoYWxrLmdyYXkoYCgke3VybH0pYCl9YFxuICApO1xuICBcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdENvZGVCbG9jayhjb2RlOiBzdHJpbmcsIGxhbmd1YWdlPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgaGVhZGVyID0gbGFuZ3VhZ2UgPyBjaGFsay5ncmF5KGBcXGBcXGBcXGAke2xhbmd1YWdlfVxcbmApIDogY2hhbGsuZ3JheSgnYGBgXFxuJyk7XG4gIGNvbnN0IGZvb3RlciA9IGNoYWxrLmdyYXkoJ1xcbmBgYCcpO1xuICByZXR1cm4gaGVhZGVyICsgY2hhbGsuY3lhbihjb2RlKSArIGZvb3Rlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdElubGluZUNvZGUoY29kZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLmN5YW4oYFxcYCR7Y29kZX1cXGBgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdExpbmsodGV4dDogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgJHtjaGFsay5ibHVlLnVuZGVybGluZSh0ZXh0KX0gJHtjaGFsay5ncmF5KGAoJHt1cmx9KWApfWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCdWxsZXQodGV4dDogc3RyaW5nLCBsZXZlbDogbnVtYmVyID0gMCk6IHN0cmluZyB7XG4gIGNvbnN0IGluZGVudCA9ICcgICcucmVwZWF0KGxldmVsKTtcbiAgY29uc3QgYnVsbGV0ID0gbGV2ZWwgPT09IDAgPyAn4oCiJyA6ICfil6YnO1xuICByZXR1cm4gYCR7aW5kZW50fSR7Y2hhbGsuY3lhbihidWxsZXQpfSAke3RleHR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlcmVkTGlzdChpdGVtczogc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gaXRlbXMubWFwKChpdGVtLCBpbmRleCkgPT4gXG4gICAgYCR7Y2hhbGsuY3lhbihgJHtpbmRleCArIDF9LmApfSAke2l0ZW19YFxuICApLmpvaW4oJ1xcbicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RXJyb3IobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLnJlZChg4pyXIEVycm9yOiAke21lc3NhZ2V9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRTdWNjZXNzKG1lc3NhZ2U6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBjaGFsay5ncmVlbihg4pyTICR7bWVzc2FnZX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFdhcm5pbmcobWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLnllbGxvdyhg4pqgICR7bWVzc2FnZX1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEluZm8obWVzc2FnZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNoYWxrLmJsdWUoYOKEuSAke21lc3NhZ2V9YCk7XG59Il19
|
package/package.json
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@oflow-ai/oflow-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "oFlow CLI - AI-powered terminal assistant for developers",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"ai",
|
|
7
|
+
"cli",
|
|
8
|
+
"assistant",
|
|
9
|
+
"terminal",
|
|
10
|
+
"code-assistant",
|
|
11
|
+
"gpt",
|
|
12
|
+
"openai",
|
|
13
|
+
"deepseek",
|
|
14
|
+
"qwen",
|
|
15
|
+
"developer-tools"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/oflow-ai/oflow-cli#readme",
|
|
18
|
+
"bugs": {
|
|
19
|
+
"url": "https://github.com/oflow-ai/oflow-cli/issues"
|
|
20
|
+
},
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "git+https://github.com/oflow-ai/oflow-cli.git"
|
|
24
|
+
},
|
|
25
|
+
"main": "dist/index.js",
|
|
26
|
+
"types": "dist/index.d.ts",
|
|
27
|
+
"bin": {
|
|
28
|
+
"oflow": "dist/index.js"
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
32
|
+
"scripts",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsc -b",
|
|
38
|
+
"dev": "tsc -b --watch",
|
|
39
|
+
"test": "echo \"No tests yet\"",
|
|
40
|
+
"prepublishOnly": "npm run build",
|
|
41
|
+
"postinstall": "node scripts/postinstall.js"
|
|
42
|
+
},
|
|
43
|
+
"dependencies": {
|
|
44
|
+
"@oflow-ai/core": "^0.1.0",
|
|
45
|
+
"commander": "^11.1.0",
|
|
46
|
+
"chalk": "^4.1.2",
|
|
47
|
+
"ora": "^5.4.1",
|
|
48
|
+
"inquirer": "^8.2.6",
|
|
49
|
+
"conf": "^10.2.0",
|
|
50
|
+
"marked": "^11.1.0",
|
|
51
|
+
"marked-terminal": "^6.0.0",
|
|
52
|
+
"update-notifier": "^6.0.2",
|
|
53
|
+
"open": "^8.4.2"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/inquirer": "^8.2.10",
|
|
57
|
+
"@types/node": "^20.10.0",
|
|
58
|
+
"@types/update-notifier": "^6.0.5",
|
|
59
|
+
"typescript": "^5.3.2"
|
|
60
|
+
},
|
|
61
|
+
"engines": {
|
|
62
|
+
"node": ">=18.0.0"
|
|
63
|
+
},
|
|
64
|
+
"author": "oFlow Team",
|
|
65
|
+
"license": "MIT",
|
|
66
|
+
"publishConfig": {
|
|
67
|
+
"access": "public"
|
|
68
|
+
}
|
|
69
|
+
}
|