@panguard-ai/panguard 0.3.1 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/dist/cli/auth-guard.d.ts +9 -7
  2. package/dist/cli/auth-guard.d.ts.map +1 -1
  3. package/dist/cli/auth-guard.js +33 -199
  4. package/dist/cli/auth-guard.js.map +1 -1
  5. package/dist/cli/commands/doctor.d.ts.map +1 -1
  6. package/dist/cli/commands/doctor.js +146 -26
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/guard.d.ts.map +1 -1
  9. package/dist/cli/commands/guard.js +264 -7
  10. package/dist/cli/commands/guard.js.map +1 -1
  11. package/dist/cli/commands/hacktivity.d.ts +10 -0
  12. package/dist/cli/commands/hacktivity.d.ts.map +1 -0
  13. package/dist/cli/commands/hacktivity.js +308 -0
  14. package/dist/cli/commands/hacktivity.js.map +1 -0
  15. package/dist/cli/commands/login.d.ts +3 -4
  16. package/dist/cli/commands/login.d.ts.map +1 -1
  17. package/dist/cli/commands/login.js +8 -258
  18. package/dist/cli/commands/login.js.map +1 -1
  19. package/dist/cli/commands/logout.d.ts +3 -3
  20. package/dist/cli/commands/logout.d.ts.map +1 -1
  21. package/dist/cli/commands/logout.js +7 -35
  22. package/dist/cli/commands/logout.js.map +1 -1
  23. package/dist/cli/commands/report.d.ts +2 -2
  24. package/dist/cli/commands/report.d.ts.map +1 -1
  25. package/dist/cli/commands/report.js +30 -40
  26. package/dist/cli/commands/report.js.map +1 -1
  27. package/dist/cli/commands/scan.d.ts.map +1 -1
  28. package/dist/cli/commands/scan.js +16 -19
  29. package/dist/cli/commands/scan.js.map +1 -1
  30. package/dist/cli/commands/setup-skill-scan.d.ts +39 -0
  31. package/dist/cli/commands/setup-skill-scan.d.ts.map +1 -0
  32. package/dist/cli/commands/setup-skill-scan.js +186 -0
  33. package/dist/cli/commands/setup-skill-scan.js.map +1 -0
  34. package/dist/cli/commands/setup.d.ts +11 -0
  35. package/dist/cli/commands/setup.d.ts.map +1 -0
  36. package/dist/cli/commands/setup.js +219 -0
  37. package/dist/cli/commands/setup.js.map +1 -0
  38. package/dist/cli/commands/status.js +43 -0
  39. package/dist/cli/commands/status.js.map +1 -1
  40. package/dist/cli/commands/threat.d.ts +3 -0
  41. package/dist/cli/commands/threat.d.ts.map +1 -1
  42. package/dist/cli/commands/threat.js +31 -11
  43. package/dist/cli/commands/threat.js.map +1 -1
  44. package/dist/cli/commands/trap.d.ts +2 -2
  45. package/dist/cli/commands/trap.d.ts.map +1 -1
  46. package/dist/cli/commands/trap.js +32 -29
  47. package/dist/cli/commands/trap.js.map +1 -1
  48. package/dist/cli/commands/upgrade.d.ts +3 -4
  49. package/dist/cli/commands/upgrade.d.ts.map +1 -1
  50. package/dist/cli/commands/upgrade.js +10 -234
  51. package/dist/cli/commands/upgrade.js.map +1 -1
  52. package/dist/cli/commands/whoami.d.ts +2 -2
  53. package/dist/cli/commands/whoami.d.ts.map +1 -1
  54. package/dist/cli/commands/whoami.js +9 -60
  55. package/dist/cli/commands/whoami.js.map +1 -1
  56. package/dist/cli/index.js +4 -0
  57. package/dist/cli/index.js.map +1 -1
  58. package/dist/cli/interactive.d.ts +1 -1
  59. package/dist/cli/interactive.d.ts.map +1 -1
  60. package/dist/cli/interactive.js +477 -236
  61. package/dist/cli/interactive.js.map +1 -1
  62. package/dist/cli/menu.d.ts.map +1 -1
  63. package/dist/cli/menu.js +2 -5
  64. package/dist/cli/menu.js.map +1 -1
  65. package/dist/index.d.ts +0 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +2 -2
  68. package/dist/index.js.map +1 -1
  69. package/dist/init/wizard-runner.d.ts.map +1 -1
  70. package/dist/init/wizard-runner.js +136 -6
  71. package/dist/init/wizard-runner.js.map +1 -1
  72. package/package.json +25 -13
@@ -0,0 +1,308 @@
1
+ /**
2
+ * panguard hacktivity - HackerOne threat intel pipeline
3
+ * panguard hacktivity - HackerOne 威脅情報管線
4
+ *
5
+ * Fetches publicly disclosed HackerOne reports, extracts attack patterns,
6
+ * and auto-generates Sigma detection rules.
7
+ */
8
+ import { Command } from 'commander';
9
+ import { mkdirSync, writeFileSync, readFileSync, existsSync, readdirSync } from 'node:fs';
10
+ import { join } from 'node:path';
11
+ import { c, spinner, statusPanel, divider, table, symbols } from '@panguard-ai/core';
12
+ import { withAuth } from '../auth-guard.js';
13
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
+ async function loadThreatCloud() {
15
+ try {
16
+ const mod = '@panguard-ai/threat-cloud';
17
+ return await import(/* webpackIgnore: true */ mod);
18
+ }
19
+ catch {
20
+ console.error(`\n ${c.red('Threat Cloud server package is not available.')}\n` +
21
+ ` This command is for Panguard operators only.\n`);
22
+ process.exitCode = 1;
23
+ return null;
24
+ }
25
+ }
26
+ /** Default directory for auto-generated rules */
27
+ const RULES_DIR = './config/sigma-rules/auto-generated';
28
+ /** Metadata file tracking sync state */
29
+ const META_FILE = './config/sigma-rules/auto-generated/.meta.json';
30
+ /** Reports cache */
31
+ const REPORTS_DIR = './config/sigma-rules/auto-generated/.reports';
32
+ function loadMeta() {
33
+ if (existsSync(META_FILE)) {
34
+ return JSON.parse(readFileSync(META_FILE, 'utf-8'));
35
+ }
36
+ return { lastSyncAt: null, reports: [], rules: [] };
37
+ }
38
+ function saveMeta(meta) {
39
+ mkdirSync(RULES_DIR, { recursive: true });
40
+ mkdirSync(REPORTS_DIR, { recursive: true });
41
+ writeFileSync(META_FILE, JSON.stringify(meta, null, 2));
42
+ }
43
+ export function hacktivityCommand() {
44
+ const cmd = new Command('hacktivity').description('HackerOne threat intel pipeline / HackerOne 威脅情報管線');
45
+ // ─── sync ───
46
+ cmd
47
+ .command('sync')
48
+ .description('Fetch latest disclosed reports from HackerOne / 拉取最新公開報告')
49
+ .option('--max <number>', 'Max reports to fetch / 最大拉取數量', '50')
50
+ .option('--severity <level>', 'Min severity (low|medium|high|critical)', 'medium')
51
+ .action(withAuth('solo', async (opts) => {
52
+ const tc = await loadThreatCloud();
53
+ if (!tc)
54
+ return;
55
+ const meta = loadMeta();
56
+ const adapter = new tc.HackerOneAdapter({
57
+ maxReports: parseInt(opts.max, 10),
58
+ minSeverity: opts.severity,
59
+ });
60
+ const sp = spinner('Fetching HackerOne Hacktivity reports...');
61
+ try {
62
+ const reports = await adapter.fetchReports(meta.lastSyncAt ?? undefined);
63
+ sp.succeed(`Fetched ${reports.length} new reports`);
64
+ if (reports.length === 0) {
65
+ console.log(` ${symbols.info} ${c.dim('No new reports since last sync.')}`);
66
+ return;
67
+ }
68
+ // Merge with existing reports (dedup by id)
69
+ const existingIds = new Set(meta.reports.map((r) => r.id));
70
+ const newReports = reports.filter((r) => !existingIds.has(r.id));
71
+ meta.reports = [...meta.reports, ...newReports];
72
+ meta.lastSyncAt = new Date().toISOString();
73
+ saveMeta(meta);
74
+ // Summary table
75
+ const columns = [
76
+ { header: 'ID', key: 'id', width: 12 },
77
+ { header: 'Severity', key: 'severity', width: 10 },
78
+ { header: 'CWE', key: 'cwe', width: 12 },
79
+ { header: 'Title', key: 'title', width: 50 },
80
+ ];
81
+ const rows = newReports.slice(0, 20).map((r) => ({
82
+ id: r.id,
83
+ severity: r.severity === 'critical'
84
+ ? c.red(r.severity)
85
+ : r.severity === 'high'
86
+ ? c.yellow(r.severity)
87
+ : r.severity,
88
+ cwe: r.cweId ?? c.dim('N/A'),
89
+ title: r.title.length > 48 ? r.title.slice(0, 48) + '...' : r.title,
90
+ }));
91
+ console.log('');
92
+ console.log(divider(`New Reports (${newReports.length})`));
93
+ console.log(table(columns, rows));
94
+ if (newReports.length > 20) {
95
+ console.log(` ${c.dim(`... and ${newReports.length - 20} more`)}`);
96
+ }
97
+ console.log('');
98
+ console.log(` ${symbols.info} Run ${c.sage('panguard hacktivity generate-rules')} to create detection rules.`);
99
+ }
100
+ catch (err) {
101
+ sp.fail(`Sync failed: ${err instanceof Error ? err.message : String(err)}`);
102
+ process.exitCode = 1;
103
+ }
104
+ }));
105
+ // ─── generate-rules ───
106
+ cmd
107
+ .command('generate-rules')
108
+ .description('Generate Sigma rules from fetched reports / 從報告生成偵測規則')
109
+ .option('--ollama-url <url>', 'Ollama API URL', 'http://localhost:11434')
110
+ .option('--model <name>', 'Ollama model name', 'llama3.2')
111
+ .option('--heuristic-only', 'Skip Ollama, use heuristic extraction only', false)
112
+ .action(withAuth('solo', async (opts) => {
113
+ const meta = loadMeta();
114
+ if (meta.reports.length === 0) {
115
+ console.log(` ${symbols.warn} ${c.dim('No reports found. Run')} ${c.sage('panguard hacktivity sync')} ${c.dim('first.')}`);
116
+ return;
117
+ }
118
+ const tc = await loadThreatCloud();
119
+ if (!tc)
120
+ return;
121
+ const extractor = new tc.AttackExtractor({
122
+ ollamaBaseUrl: opts.ollamaUrl,
123
+ model: opts.model,
124
+ });
125
+ const generator = new tc.SigmaRuleGenerator();
126
+ const validator = new tc.RuleValidator();
127
+ // Register existing rules for dedup
128
+ validator.registerExistingRules(meta.rules);
129
+ // Check Ollama availability
130
+ let useOllama = !opts.heuristicOnly;
131
+ if (useOllama) {
132
+ const sp = spinner('Checking Ollama availability...');
133
+ useOllama = await extractor.isOllamaAvailable();
134
+ if (useOllama) {
135
+ sp.succeed(`Ollama connected (model: ${opts.model})`);
136
+ }
137
+ else {
138
+ sp.warn('Ollama unavailable, using heuristic extraction');
139
+ }
140
+ }
141
+ // Find reports without rules
142
+ const ruledReportIds = new Set(meta.rules.map((r) => r.sourceReportId));
143
+ const pendingReports = meta.reports.filter((r) => !ruledReportIds.has(r.id));
144
+ if (pendingReports.length === 0) {
145
+ console.log(` ${symbols.info} ${c.dim('All reports already have generated rules.')}`);
146
+ return;
147
+ }
148
+ const sp2 = spinner(`Generating rules for ${pendingReports.length} reports...`);
149
+ const newRules = [];
150
+ let skippedDupes = 0;
151
+ let skippedInvalid = 0;
152
+ for (const report of pendingReports) {
153
+ try {
154
+ const extraction = useOllama
155
+ ? await extractor.extract(report)
156
+ : {
157
+ reportId: report.id,
158
+ reportTitle: report.title,
159
+ reportUrl: report.url,
160
+ patterns: extractor.extractHeuristic(report),
161
+ extractedAt: new Date().toISOString(),
162
+ model: 'heuristic',
163
+ };
164
+ const rules = generator.generate(extraction);
165
+ for (const rule of rules) {
166
+ const validation = validator.validate(rule);
167
+ if (validation.isDuplicate) {
168
+ skippedDupes++;
169
+ continue;
170
+ }
171
+ if (!validation.valid) {
172
+ skippedInvalid++;
173
+ continue;
174
+ }
175
+ // Write rule file
176
+ mkdirSync(RULES_DIR, { recursive: true });
177
+ const filename = `${rule.attackType.toLowerCase().replace(/\s+/g, '-')}-${rule.id.slice(0, 8)}.yml`;
178
+ writeFileSync(join(RULES_DIR, filename), rule.yamlContent);
179
+ newRules.push(rule);
180
+ }
181
+ }
182
+ catch {
183
+ // Skip failed extractions silently
184
+ }
185
+ }
186
+ meta.rules = [...meta.rules, ...newRules];
187
+ saveMeta(meta);
188
+ sp2.succeed(`Generated ${newRules.length} new rules`);
189
+ if (skippedDupes > 0) {
190
+ console.log(` ${symbols.info} ${c.dim(`Skipped ${skippedDupes} duplicates`)}`);
191
+ }
192
+ if (skippedInvalid > 0) {
193
+ console.log(` ${symbols.warn} ${c.dim(`Skipped ${skippedInvalid} invalid rules`)}`);
194
+ }
195
+ // Summary
196
+ const draftCount = newRules.filter((r) => r.status === 'draft').length;
197
+ const experimentalCount = newRules.filter((r) => r.status === 'experimental').length;
198
+ console.log('');
199
+ console.log(statusPanel('Rule Generation Summary', [
200
+ { label: 'New Rules', value: String(newRules.length) },
201
+ {
202
+ label: 'Experimental (auto-enabled)',
203
+ value: String(experimentalCount),
204
+ status: 'safe',
205
+ },
206
+ {
207
+ label: 'Draft (needs review)',
208
+ value: String(draftCount),
209
+ status: draftCount > 0 ? 'caution' : 'safe',
210
+ },
211
+ { label: 'Output', value: RULES_DIR },
212
+ ]));
213
+ if (draftCount > 0) {
214
+ console.log('');
215
+ console.log(` ${symbols.info} Run ${c.sage('panguard hacktivity review')} to review draft rules.`);
216
+ }
217
+ }));
218
+ // ─── review ───
219
+ cmd
220
+ .command('review')
221
+ .description('Review auto-generated rules / 審核自動生成的規則')
222
+ .option('--status <status>', 'Filter by status (draft|experimental|all)', 'draft')
223
+ .action(withAuth('solo', async (opts) => {
224
+ const meta = loadMeta();
225
+ const pendingRules = meta.rules.filter((r) => {
226
+ if (opts.status === 'all')
227
+ return r.reviewDecision === 'pending';
228
+ return r.status === opts.status && r.reviewDecision === 'pending';
229
+ });
230
+ if (pendingRules.length === 0) {
231
+ console.log(` ${symbols.info} ${c.dim('No rules pending review.')}`);
232
+ return;
233
+ }
234
+ console.log(divider(`Pending Review (${pendingRules.length})`));
235
+ console.log('');
236
+ const columns = [
237
+ { header: '#', key: 'idx', width: 4, align: 'right' },
238
+ { header: 'ID', key: 'id', width: 10 },
239
+ { header: 'Attack', key: 'attack', width: 20 },
240
+ { header: 'Confidence', key: 'confidence', width: 12, align: 'right' },
241
+ { header: 'Status', key: 'status', width: 14 },
242
+ { header: 'Source', key: 'source', width: 30 },
243
+ ];
244
+ const rows = pendingRules.map((r, i) => ({
245
+ idx: String(i + 1),
246
+ id: r.id.slice(0, 8),
247
+ attack: r.attackType,
248
+ confidence: r.confidence >= 70
249
+ ? c.sage(`${r.confidence}%`)
250
+ : c.yellow(`${r.confidence}%`),
251
+ status: r.status === 'draft' ? c.yellow(r.status) : c.sage(r.status),
252
+ source: r.sourceReportUrl,
253
+ }));
254
+ console.log(table(columns, rows));
255
+ console.log('');
256
+ console.log(` ${symbols.info} ${c.dim('To approve/reject, edit the .meta.json file or use the dashboard.')}`);
257
+ }));
258
+ // ─── stats ───
259
+ cmd
260
+ .command('stats')
261
+ .description('Show pipeline statistics / 顯示管線統計')
262
+ .action(async () => {
263
+ const meta = loadMeta();
264
+ const totalRules = meta.rules.length;
265
+ const approved = meta.rules.filter((r) => r.reviewDecision === 'approved').length;
266
+ const rejected = meta.rules.filter((r) => r.reviewDecision === 'rejected').length;
267
+ const draft = meta.rules.filter((r) => r.status === 'draft').length;
268
+ const experimental = meta.rules.filter((r) => r.status === 'experimental').length;
269
+ // Count rule files on disk
270
+ let filesOnDisk = 0;
271
+ if (existsSync(RULES_DIR)) {
272
+ filesOnDisk = readdirSync(RULES_DIR).filter((f) => f.endsWith('.yml')).length;
273
+ }
274
+ // Attack type breakdown
275
+ const attackCounts = new Map();
276
+ for (const rule of meta.rules) {
277
+ attackCounts.set(rule.attackType, (attackCounts.get(rule.attackType) ?? 0) + 1);
278
+ }
279
+ console.log(statusPanel('Hacktivity Pipeline Stats', [
280
+ { label: 'Last Sync', value: meta.lastSyncAt ?? c.dim('Never') },
281
+ { label: 'Reports Fetched', value: String(meta.reports.length) },
282
+ { label: 'Total Rules', value: String(totalRules) },
283
+ { label: 'Experimental', value: String(experimental), status: 'safe' },
284
+ { label: 'Draft', value: String(draft), status: draft > 0 ? 'caution' : 'safe' },
285
+ { label: 'Approved', value: String(approved), status: 'safe' },
286
+ { label: 'Rejected', value: String(rejected) },
287
+ { label: 'Files on Disk', value: String(filesOnDisk) },
288
+ ]));
289
+ if (attackCounts.size > 0) {
290
+ console.log(divider('Rules by Attack Type'));
291
+ console.log('');
292
+ const columns = [
293
+ { header: 'Attack Type', key: 'type', width: 25 },
294
+ { header: 'Count', key: 'count', width: 10, align: 'right' },
295
+ ];
296
+ const rows = [...attackCounts.entries()]
297
+ .sort((a, b) => b[1] - a[1])
298
+ .map(([type, count]) => ({
299
+ type,
300
+ count: String(count),
301
+ }));
302
+ console.log(table(columns, rows));
303
+ console.log('');
304
+ }
305
+ });
306
+ return cmd;
307
+ }
308
+ //# sourceMappingURL=hacktivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hacktivity.js","sourceRoot":"","sources":["../../../src/cli/commands/hacktivity.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAe5C,8DAA8D;AAC9D,KAAK,UAAU,eAAe;IAC5B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,2BAA2B,CAAC;QACxC,OAAO,MAAM,MAAM,CAAC,yBAAyB,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CACX,OAAO,CAAC,CAAC,GAAG,CAAC,+CAA+C,CAAC,IAAI;YACjE,kDAAkD,CACnD,CAAC;QACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,SAAS,GAAG,qCAAqC,CAAC;AACxD,wCAAwC;AACxC,MAAM,SAAS,GAAG,gDAAgD,CAAC;AACnE,oBAAoB;AACpB,MAAM,WAAW,GAAG,8CAA8C,CAAC;AAQnE,SAAS,QAAQ;IACf,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAa,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,IAAc;IAC9B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5C,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC,WAAW,CAC/C,oDAAoD,CACrD,CAAC;IAEF,eAAe;IACf,GAAG;SACA,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,0DAA0D,CAAC;SACvE,MAAM,CAAC,gBAAgB,EAAE,+BAA+B,EAAE,IAAI,CAAC;SAC/D,MAAM,CAAC,oBAAoB,EAAE,yCAAyC,EAAE,QAAQ,CAAC;SACjF,MAAM,CACL,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAuC,EAAE,EAAE;QACjE,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,IAAI,EAAE,CAAC,gBAAgB,CAAC;YACtC,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAClC,WAAW,EAAE,IAAI,CAAC,QAAkD;SACrE,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG,OAAO,CAAC,0CAA0C,CAAC,CAAC;QAE/D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,IAAI,SAAS,CAAC,CAAC;YACzE,EAAE,CAAC,OAAO,CAAC,WAAW,OAAO,CAAC,MAAM,cAAc,CAAC,CAAC;YAEpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC,EAAE,CAAC,CAAC;gBAC7E,OAAO;YACT,CAAC;YAED,4CAA4C;YAC5C,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,UAAU,GAAI,OAA0B,CAAC,MAAM,CAAC,CAAC,CAAe,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnG,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,QAAQ,CAAC,IAAI,CAAC,CAAC;YAEf,gBAAgB;YAChB,MAAM,OAAO,GAAG;gBACd,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;gBACtC,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE;gBAClD,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE;gBACxC,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;aAC7C,CAAC;YACF,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/C,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,QAAQ,EAAE,CAAC,CAAC,QAAQ,KAAK,UAAU;oBACjC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACnB,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM;wBACrB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC;wBACtB,CAAC,CAAC,CAAC,CAAC,QAAQ;gBAChB,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC5B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK;aACpE,CAAC,CAAC,CAAC;YAEJ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAClC,IAAI,UAAU,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;gBAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,WAAW,UAAU,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,oCAAoC,CAAC,6BAA6B,CACnG,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,EAAE,CAAC,IAAI,CAAC,gBAAgB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC5E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEJ,yBAAyB;IACzB,GAAG;SACA,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,uDAAuD,CAAC;SACpE,MAAM,CAAC,oBAAoB,EAAE,gBAAgB,EAAE,wBAAwB,CAAC;SACxE,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,EAAE,UAAU,CAAC;SACzD,MAAM,CAAC,kBAAkB,EAAE,4CAA4C,EAAE,KAAK,CAAC;SAC/E,MAAM,CACL,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAkE,EAAE,EAAE;QAC5F,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,uBAAuB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAC/G,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,eAAe,EAAE,CAAC;QACnC,IAAI,CAAC,EAAE;YAAE,OAAO;QAChB,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,eAAe,CAAC;YACvC,aAAa,EAAE,IAAI,CAAC,SAAS;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,kBAAkB,EAAE,CAAC;QAC9C,MAAM,SAAS,GAAG,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;QAEzC,oCAAoC;QACpC,SAAS,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5C,4BAA4B;QAC5B,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;YACtD,SAAS,GAAG,MAAM,SAAS,CAAC,iBAAiB,EAAE,CAAC;YAChD,IAAI,SAAS,EAAE,CAAC;gBACd,EAAE,CAAC,OAAO,CAAC,4BAA4B,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;YACxD,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QACxE,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAE7E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,2CAA2C,CAAC,EAAE,CAAC,CAAC;YACvF,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,OAAO,CAAC,wBAAwB,cAAc,CAAC,MAAM,aAAa,CAAC,CAAC;QAChF,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE,CAAC;YACpC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,SAAS;oBAC1B,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;oBACjC,CAAC,CAAC;wBACE,QAAQ,EAAE,MAAM,CAAC,EAAE;wBACnB,WAAW,EAAE,MAAM,CAAC,KAAK;wBACzB,SAAS,EAAE,MAAM,CAAC,GAAG;wBACrB,QAAQ,EAAE,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC;wBAC5C,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;wBACrC,KAAK,EAAE,WAAW;qBACnB,CAAC;gBAEN,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,UAAU,GAAG,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAE5C,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;wBAC3B,YAAY,EAAE,CAAC;wBACf,SAAS;oBACX,CAAC;oBAED,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;wBACtB,cAAc,EAAE,CAAC;wBACjB,SAAS;oBACX,CAAC;oBAED,kBAAkB;oBAClB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1C,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;oBACpG,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC3D,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,mCAAmC;YACrC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,QAAQ,CAAC,CAAC;QAC1C,QAAQ,CAAC,IAAI,CAAC,CAAC;QAEf,GAAG,CAAC,OAAO,CAAC,aAAa,QAAQ,CAAC,MAAM,YAAY,CAAC,CAAC;QAEtD,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,YAAY,aAAa,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,WAAW,cAAc,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;QAED,UAAU;QACV,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACvE,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;QAErF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,yBAAyB,EAAE;YACrC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;YACtD;gBACE,KAAK,EAAE,6BAA6B;gBACpC,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC;gBAChC,MAAM,EAAE,MAAM;aACf;YACD;gBACE,KAAK,EAAE,sBAAsB;gBAC7B,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC;gBACzB,MAAM,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;aAC5C;YACD,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;SACtC,CAAC,CACH,CAAC;QAEF,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,IAAI,QAAQ,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,yBAAyB,CACvF,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEJ,iBAAiB;IACjB,GAAG;SACA,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,mBAAmB,EAAE,2CAA2C,EAAE,OAAO,CAAC;SACjF,MAAM,CACL,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,IAAwB,EAAE,EAAE;QAClD,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC3C,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;gBAAE,OAAO,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC;YACjE,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,cAAc,KAAK,SAAS,CAAC;QACpE,CAAC,CAAC,CAAC;QAEH,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEhB,MAAM,OAAO,GAAG;YACd,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,OAAgB,EAAE;YAC9D,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;YACtC,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9C,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAgB,EAAE;YAC/E,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9C,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,EAAE;SAC/C,CAAC;QAEF,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YACvC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;YAClB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,MAAM,EAAE,CAAC,CAAC,UAAU;YACpB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;gBAC5B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC;gBAC5B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC;YAChC,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,EAAE,CAAC,CAAC,eAAe;SAC1B,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,mEAAmE,CAAC,EAAE,CAClG,CAAC;IACJ,CAAC,CAAC,CACH,CAAC;IAEJ,gBAAgB;IAChB,GAAG;SACA,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QAExB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC,MAAM,CAAC;QAElF,2BAA2B;QAC3B,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC1B,WAAW,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QAChF,CAAC;QAED,wBAAwB;QACxB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,2BAA2B,EAAE;YACvC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;YAChE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAChE,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;YACnD,EAAE,KAAK,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;YACtE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE;YAChF,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE;YAC9D,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE;YAC9C,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,EAAE;SACvD,CAAC,CACH,CAAC;QAEF,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,OAAO,GAAG;gBACd,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;gBACjD,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAgB,EAAE;aACtE,CAAC;YACF,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;iBACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvB,IAAI;gBACJ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;aACrB,CAAC,CAAC,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,9 +1,8 @@
1
1
  /**
2
- * `panguard login` - Authenticate via browser OAuth
3
- * `panguard login` - 透過瀏覽器 OAuth 驗證
2
+ * `panguard login` - Authentication removed
3
+ * `panguard login` - 驗證功能已移除
4
4
  *
5
- * Opens a browser for authentication, receives callback on localhost,
6
- * then stores the session token locally.
5
+ * All features are free and open source. No login required.
7
6
  *
8
7
  * @module @panguard-ai/panguard/cli/commands/login
9
8
  */
@@ -1 +1 @@
1
- {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBpC,wBAAgB,YAAY,IAAI,OAAO,CAStC"}
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,wBAAgB,YAAY,IAAI,OAAO,CAWtC"}
@@ -1,272 +1,22 @@
1
1
  /**
2
- * `panguard login` - Authenticate via browser OAuth
3
- * `panguard login` - 透過瀏覽器 OAuth 驗證
2
+ * `panguard login` - Authentication removed
3
+ * `panguard login` - 驗證功能已移除
4
4
  *
5
- * Opens a browser for authentication, receives callback on localhost,
6
- * then stores the session token locally.
5
+ * All features are free and open source. No login required.
7
6
  *
8
7
  * @module @panguard-ai/panguard/cli/commands/login
9
8
  */
10
9
  import { Command } from 'commander';
11
- import { createServer } from 'node:http';
12
- import { randomBytes } from 'node:crypto';
13
- import { execFile } from 'node:child_process';
14
- import { c, symbols, box, statusPanel, spinner } from '@panguard-ai/core';
15
- import { saveCredentials, loadCredentials, isTokenExpired, tierDisplayName, CREDENTIALS_PATH, } from '../credentials.js';
16
- const DEFAULT_API_URL = 'https://panguard.ai';
17
10
  export function loginCommand() {
18
11
  return new Command('login')
19
- .description('Log in to Panguard AI / \u767B\u5165 Panguard AI')
20
- .option('--api-url <url>', 'Auth server URL', DEFAULT_API_URL)
21
- .option('--no-browser', 'Print URL instead of opening browser')
22
- .option('--lang <language>', 'Language override')
23
- .action(async (opts) => {
24
- await runLogin(opts);
25
- });
26
- }
27
- async function runLogin(opts) {
28
- const lang = opts.lang === 'en' ? 'en' : 'zh-TW';
29
- // Check if already logged in
30
- const existing = loadCredentials();
31
- if (existing && !isTokenExpired(existing)) {
32
- console.log('');
33
- console.log(box(lang === 'zh-TW'
34
- ? [
35
- `${symbols.pass} \u5DF2\u767B\u5165\u70BA ${c.sage(existing.email)}`,
36
- '',
37
- ` \u7B49\u7D1A: ${c.sage(tierDisplayName(existing.tier))}`,
38
- ` \u540D\u7A31: ${existing.name}`,
39
- '',
40
- ` \u8981\u5207\u63DB\u5E33\u865F\uFF1F\u5148\u57F7\u884C ${c.sage('panguard logout')}`,
41
- ].join('\n')
42
- : [
43
- `${symbols.pass} Already logged in as ${c.sage(existing.email)}`,
44
- '',
45
- ` Tier: ${c.sage(tierDisplayName(existing.tier))}`,
46
- ` Name: ${existing.name}`,
47
- '',
48
- ` To switch accounts, run ${c.sage('panguard logout')} first.`,
49
- ].join('\n'), { borderColor: c.sage, title: 'Panguard AI' }));
50
- console.log('');
51
- return;
52
- }
53
- // Generate CSRF state token
54
- const state = randomBytes(16).toString('hex');
55
- // Start local callback server
56
- const { port, waitForCallback } = await startCallbackServer(state);
57
- const callbackUrl = `http://localhost:${port}/callback`;
58
- const loginUrl = `${opts.apiUrl}/login?cli_state=${state}&cli_callback=${encodeURIComponent(callbackUrl)}`;
59
- console.log('');
60
- if (opts.browser) {
61
- const sp = spinner(lang === 'zh-TW' ? '\u6B63\u5728\u958B\u555F\u700F\u89BD\u5668...' : 'Opening browser...');
62
- try {
63
- await openBrowser(loginUrl);
64
- sp.succeed(lang === 'zh-TW'
65
- ? '\u700F\u89BD\u5668\u5DF2\u958B\u555F\uFF0C\u8ACB\u5728\u700F\u89BD\u5668\u4E2D\u5B8C\u6210\u767B\u5165'
66
- : 'Browser opened. Please complete login in the browser.');
67
- }
68
- catch {
69
- sp.warn(lang === 'zh-TW'
70
- ? '\u7121\u6CD5\u958B\u555F\u700F\u89BD\u5668\uFF0C\u8ACB\u624B\u52D5\u958B\u555F\u4EE5\u4E0B\u7DB2\u5740'
71
- : 'Could not open browser. Please open the following URL manually:');
72
- console.log(`\n ${c.underline(loginUrl)}\n`);
73
- }
74
- }
75
- else {
76
- console.log(lang === 'zh-TW'
77
- ? ` \u8ACB\u5728\u700F\u89BD\u5668\u4E2D\u958B\u555F\u4EE5\u4E0B\u7DB2\u5740\u4F86\u767B\u5165\uFF1A`
78
- : ' Open the following URL in your browser to log in:');
79
- console.log(`\n ${c.underline(loginUrl)}\n`);
80
- }
81
- console.log(c.dim(lang === 'zh-TW'
82
- ? ' \u7B49\u5F85\u8A8D\u8B49\u56DE\u61C9...'
83
- : ' Waiting for authentication...'));
84
- // Wait for callback
85
- try {
86
- const creds = await waitForCallback(opts.apiUrl);
87
- console.log('');
88
- const items = [
89
- { label: lang === 'zh-TW' ? '\u4FE1\u7BB1' : 'Email', value: creds.email, status: 'safe' },
90
- { label: lang === 'zh-TW' ? '\u540D\u7A31' : 'Name', value: creds.name },
91
- {
92
- label: lang === 'zh-TW' ? '\u7B49\u7D1A' : 'Tier',
93
- value: tierDisplayName(creds.tier),
94
- status: 'safe',
95
- },
96
- ];
97
- console.log(statusPanel(lang === 'zh-TW' ? '\u767B\u5165\u6210\u529F' : 'Login Successful', items));
98
- console.log(c.dim(` ${lang === 'zh-TW'
99
- ? `\u6191\u8B49\u5DF2\u5132\u5B58\u81F3 ${CREDENTIALS_PATH}`
100
- : `Credentials saved to ${CREDENTIALS_PATH}`}`));
12
+ .description('Authentication removed - all features are free / 驗證已移除 - 所有功能免費')
13
+ .action(async () => {
101
14
  console.log('');
102
- }
103
- catch (err) {
15
+ console.log(' Authentication removed. All features are free and open source.');
16
+ console.log(' 驗證功能已移除。所有功能皆免費開源。');
104
17
  console.log('');
105
- console.log(` ${symbols.fail} ${lang === 'zh-TW' ? '\u767B\u5165\u5931\u6557' : 'Login failed'}: ${err instanceof Error ? err.message : String(err)}`);
18
+ console.log(' Visit https://github.com/panguard-ai/panguard-ai for more info.');
106
19
  console.log('');
107
- process.exitCode = 1;
108
- }
109
- }
110
- function startCallbackServer(expectedState) {
111
- return new Promise((resolve, reject) => {
112
- let settled = false;
113
- let callbackResolve;
114
- let callbackReject;
115
- const callbackPromise = new Promise((res, rej) => {
116
- callbackResolve = res;
117
- callbackReject = rej;
118
- });
119
- const server = createServer((req, res) => {
120
- const url = new URL(req.url ?? '/', `http://localhost`);
121
- if (url.pathname !== '/callback') {
122
- res.writeHead(404);
123
- res.end('Not found');
124
- return;
125
- }
126
- const token = url.searchParams.get('token');
127
- const email = url.searchParams.get('email');
128
- const name = url.searchParams.get('name') ?? '';
129
- const tier = url.searchParams.get('tier');
130
- const expiresAt = url.searchParams.get('expires');
131
- const state = url.searchParams.get('state');
132
- // CSRF check
133
- if (state !== expectedState) {
134
- res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
135
- res.end(callbackHtml(false, 'Invalid state parameter'));
136
- callbackReject(new Error('CSRF state mismatch'));
137
- server.close();
138
- return;
139
- }
140
- if (!token || !email || !tier || !expiresAt) {
141
- res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
142
- res.end(callbackHtml(false, 'Missing required parameters'));
143
- callbackReject(new Error('Missing callback parameters'));
144
- server.close();
145
- return;
146
- }
147
- // Respond to browser
148
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
149
- res.end(callbackHtml(true));
150
- // Save credentials
151
- const creds = {
152
- token,
153
- expiresAt,
154
- email,
155
- tier,
156
- name,
157
- savedAt: new Date().toISOString(),
158
- apiUrl: '',
159
- };
160
- callbackResolve(creds);
161
- // Close server after a short delay
162
- setTimeout(() => server.close(), 500);
163
- });
164
- // Listen on random port
165
- server.listen(0, '127.0.0.1', () => {
166
- const addr = server.address();
167
- if (!addr || typeof addr === 'string') {
168
- reject(new Error('Failed to start callback server'));
169
- return;
170
- }
171
- settled = true;
172
- resolve({
173
- port: addr.port,
174
- waitForCallback: async (apiUrl) => {
175
- // Set a 5-minute timeout
176
- const timeout = setTimeout(() => {
177
- callbackReject(new Error('Login timed out after 5 minutes'));
178
- server.close();
179
- }, 5 * 60 * 1000);
180
- try {
181
- const creds = await callbackPromise;
182
- clearTimeout(timeout);
183
- creds.apiUrl = apiUrl;
184
- saveCredentials(creds);
185
- return creds;
186
- }
187
- catch (err) {
188
- clearTimeout(timeout);
189
- throw err;
190
- }
191
- },
192
- });
193
- });
194
- server.on('error', (err) => {
195
- if (!settled) {
196
- settled = true;
197
- reject(err);
198
- }
199
- });
200
- });
201
- }
202
- // ── Browser opening ─────────────────────────────────────────
203
- function openBrowser(url) {
204
- return new Promise((resolve, reject) => {
205
- const platform = process.platform;
206
- let bin;
207
- let args;
208
- if (platform === 'darwin') {
209
- bin = 'open';
210
- args = [url];
211
- }
212
- else if (platform === 'win32') {
213
- bin = 'cmd';
214
- args = ['/c', 'start', '', url];
215
- }
216
- else {
217
- bin = 'xdg-open';
218
- args = [url];
219
- }
220
- execFile(bin, args, (err) => {
221
- if (err)
222
- reject(err);
223
- else
224
- resolve();
225
- });
226
20
  });
227
21
  }
228
- // ── Callback HTML page ──────────────────────────────────────
229
- function callbackHtml(success, error) {
230
- const title = success ? 'Login Successful' : 'Login Failed';
231
- const message = success
232
- ? 'You can close this tab and return to your terminal.'
233
- : `Error: ${error ?? 'Unknown error'}`;
234
- return `<!DOCTYPE html>
235
- <html lang="en">
236
- <head>
237
- <meta charset="UTF-8">
238
- <title>Panguard AI - ${title}</title>
239
- <style>
240
- * { margin: 0; padding: 0; box-sizing: border-box; }
241
- body {
242
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
243
- background: #0a0f1e;
244
- color: #F5F1E8;
245
- display: flex;
246
- justify-content: center;
247
- align-items: center;
248
- min-height: 100vh;
249
- }
250
- .card {
251
- background: #1a1f2e;
252
- border: 1px solid ${success ? '#8B9A8E' : '#EF4444'};
253
- border-radius: 12px;
254
- padding: 48px;
255
- text-align: center;
256
- max-width: 480px;
257
- }
258
- h1 { color: ${success ? '#8B9A8E' : '#EF4444'}; margin-bottom: 16px; }
259
- p { color: #F5F1E8; opacity: 0.8; line-height: 1.6; }
260
- .brand { color: #8B9A8E; font-size: 14px; margin-top: 24px; opacity: 0.6; }
261
- </style>
262
- </head>
263
- <body>
264
- <div class="card">
265
- <h1>${title}</h1>
266
- <p>${message}</p>
267
- <p class="brand">PANGUARD AI</p>
268
- </div>
269
- </body>
270
- </html>`;
271
- }
272
22
  //# sourceMappingURL=login.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAE1E,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAG3B,MAAM,eAAe,GAAG,qBAAqB,CAAC;AAE9C,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,eAAe,CAAC;SAC7D,MAAM,CAAC,cAAc,EAAE,sCAAsC,CAAC;SAC9D,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;SAChD,MAAM,CAAC,KAAK,EAAE,IAAyD,EAAE,EAAE;QAC1E,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAyD;IAC/E,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IAEjD,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,IAAI,QAAQ,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,GAAG,CACD,IAAI,KAAK,OAAO;YACd,CAAC,CAAC;gBACE,GAAG,OAAO,CAAC,IAAI,6BAA6B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACpE,EAAE;gBACF,mBAAmB,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC3D,mBAAmB,QAAQ,CAAC,IAAI,EAAE;gBAClC,EAAE;gBACF,4DAA4D,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE;aACxF,CAAC,IAAI,CAAC,IAAI,CAAC;YACd,CAAC,CAAC;gBACE,GAAG,OAAO,CAAC,IAAI,yBAAyB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBAChE,EAAE;gBACF,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE;gBACnD,WAAW,QAAQ,CAAC,IAAI,EAAE;gBAC1B,EAAE;gBACF,6BAA6B,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS;aAChE,CAAC,IAAI,CAAC,IAAI,CAAC,EAChB,EAAE,WAAW,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE,CAC9C,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,4BAA4B;IAC5B,MAAM,KAAK,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAE9C,8BAA8B;IAC9B,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,oBAAoB,IAAI,WAAW,CAAC;IACxD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,oBAAoB,KAAK,iBAAiB,kBAAkB,CAAC,WAAW,CAAC,EAAE,CAAC;IAE3G,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,EAAE,GAAG,OAAO,CAChB,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,+CAA+C,CAAC,CAAC,CAAC,oBAAoB,CAC1F,CAAC;QACF,IAAI,CAAC;YACH,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5B,EAAE,CAAC,OAAO,CACR,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC,wGAAwG;gBAC1G,CAAC,CAAC,uDAAuD,CAC5D,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,CAAC,IAAI,CACL,IAAI,KAAK,OAAO;gBACd,CAAC,CAAC,wGAAwG;gBAC1G,CAAC,CAAC,iEAAiE,CACtE,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CACT,IAAI,KAAK,OAAO;YACd,CAAC,CAAC,oGAAoG;YACtG,CAAC,CAAC,qDAAqD,CAC1D,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,GAAG,CACH,IAAI,KAAK,OAAO;QACd,CAAC,CAAC,2CAA2C;QAC7C,CAAC,CAAC,iCAAiC,CACtC,CACF,CAAC;IAEF,oBAAoB;IACpB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,KAAK,GAAiB;YAC1B,EAAE,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE;YAC1F,EAAE,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE;YACxE;gBACE,KAAK,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM;gBACjD,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;gBAClC,MAAM,EAAE,MAAM;aACf;SACF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,WAAW,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,kBAAkB,EAAE,KAAK,CAAC,CACvF,CAAC;QACF,OAAO,CAAC,GAAG,CACT,CAAC,CAAC,GAAG,CACH,KACE,IAAI,KAAK,OAAO;YACd,CAAC,CAAC,wCAAwC,gBAAgB,EAAE;YAC5D,CAAC,CAAC,wBAAwB,gBAAgB,EAC9C,EAAE,CACH,CACF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CACT,KAAK,OAAO,CAAC,IAAI,IACf,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,cAClD,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACxD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AASD,SAAS,mBAAmB,CAAC,aAAqB;IAChD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,eAAmD,CAAC;QACxD,IAAI,cAAoC,CAAC;QAEzC,MAAM,eAAe,GAAG,IAAI,OAAO,CAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAClE,eAAe,GAAG,GAAG,CAAC;YACtB,cAAc,GAAG,GAAG,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAC;YAExD,IAAI,GAAG,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAChD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAgB,CAAC;YACzD,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAE5C,aAAa;YACb,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBAC5B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,yBAAyB,CAAC,CAAC,CAAC;gBACxD,cAAe,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;gBAClD,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC5C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;gBACnE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,EAAE,6BAA6B,CAAC,CAAC,CAAC;gBAC5D,cAAe,CAAC,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YAED,qBAAqB;YACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,0BAA0B,EAAE,CAAC,CAAC;YACnE,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;YAE5B,mBAAmB;YACnB,MAAM,KAAK,GAAsB;gBAC/B,KAAK;gBACL,SAAS;gBACT,KAAK;gBACL,IAAI;gBACJ,IAAI;gBACJ,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;gBACjC,MAAM,EAAE,EAAE;aACX,CAAC;YAEF,eAAgB,CAAC,KAAK,CAAC,CAAC;YAExB,mCAAmC;YACnC,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC,CAAC,CAAC;QAEH,wBAAwB;QACxB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE;YACjC,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,OAAO,CAAC;gBACN,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,eAAe,EAAE,KAAK,EAAE,MAAc,EAAE,EAAE;oBACxC,yBAAyB;oBACzB,MAAM,OAAO,GAAG,UAAU,CACxB,GAAG,EAAE;wBACH,cAAe,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;wBAC9D,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAC;oBAEF,IAAI,CAAC;wBACH,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC;wBACpC,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;wBACtB,eAAe,CAAC,KAAK,CAAC,CAAC;wBACvB,OAAO,KAAK,CAAC;oBACf,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACb,YAAY,CAAC,OAAO,CAAC,CAAC;wBACtB,MAAM,GAAG,CAAC;oBACZ,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAE/D,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAClC,IAAI,GAAW,CAAC;QAChB,IAAI,IAAc,CAAC;QACnB,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,GAAG,GAAG,MAAM,CAAC;YACb,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChC,GAAG,GAAG,KAAK,CAAC;YACZ,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,GAAG,GAAG,UAAU,CAAC;YACjB,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE;YAC1B,IAAI,GAAG;gBAAE,MAAM,CAAC,GAAG,CAAC,CAAC;;gBAChB,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,+DAA+D;AAE/D,SAAS,YAAY,CAAC,OAAgB,EAAE,KAAc;IACpD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC;IAC5D,MAAM,OAAO,GAAG,OAAO;QACrB,CAAC,CAAC,qDAAqD;QACvD,CAAC,CAAC,UAAU,KAAK,IAAI,eAAe,EAAE,CAAC;IACzC,OAAO;;;;yBAIgB,KAAK;;;;;;;;;;;;;;0BAcJ,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;;;;;;kBAMvC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;;;;;;;UAOvC,KAAK;SACN,OAAO;;;;QAIR,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,iEAAiE,CAAC;SAC9E,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}