@kernel.chat/kbot 2.17.3 → 2.19.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/dist/cli.js +130 -0
- package/dist/cli.js.map +1 -1
- package/dist/share.d.ts +30 -0
- package/dist/share.d.ts.map +1 -0
- package/dist/share.js +160 -0
- package/dist/share.js.map +1 -0
- package/dist/tools/audit.d.ts +20 -0
- package/dist/tools/audit.d.ts.map +1 -0
- package/dist/tools/audit.js +440 -0
- package/dist/tools/audit.js.map +1 -0
- package/dist/tools/contribute.d.ts +2 -0
- package/dist/tools/contribute.d.ts.map +1 -0
- package/dist/tools/contribute.js +262 -0
- package/dist/tools/contribute.js.map +1 -0
- package/dist/tools/documents.d.ts +2 -0
- package/dist/tools/documents.d.ts.map +1 -0
- package/dist/tools/documents.js +460 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +7 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +1 -0
- package/dist/ui.js.map +1 -1
- package/package.json +14 -3
package/dist/share.js
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
// K:BOT Share — Share conversations as GitHub Gists for organic discovery
|
|
2
|
+
//
|
|
3
|
+
// Creates branded, shareable Gists from saved sessions or the current
|
|
4
|
+
// conversation. Each share links back to kbot, turning every user into
|
|
5
|
+
// a distribution channel.
|
|
6
|
+
//
|
|
7
|
+
// Usage:
|
|
8
|
+
// /share — share current conversation
|
|
9
|
+
// /share <session-id> — share a saved session
|
|
10
|
+
// kbot share <id> — CLI subcommand
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { getHistory } from './memory.js';
|
|
13
|
+
import { loadSession, saveSession } from './sessions.js';
|
|
14
|
+
const KBOT_URL = 'https://www.npmjs.com/package/@kernel.chat/kbot';
|
|
15
|
+
const REPO_URL = 'https://github.com/isaacsight/kernel';
|
|
16
|
+
/**
|
|
17
|
+
* Format a conversation into branded markdown for sharing.
|
|
18
|
+
*/
|
|
19
|
+
export function formatShareMarkdown(turns, meta) {
|
|
20
|
+
const agent = meta?.agent || 'auto';
|
|
21
|
+
const date = meta?.created
|
|
22
|
+
? new Date(meta.created).toLocaleDateString()
|
|
23
|
+
: new Date().toLocaleDateString();
|
|
24
|
+
const name = meta?.name || 'K:BOT Conversation';
|
|
25
|
+
const lines = [
|
|
26
|
+
`# ${name}`,
|
|
27
|
+
'',
|
|
28
|
+
`> Generated with [K:BOT](${KBOT_URL}) — 39 specialists, 216 tools, 20 AI providers`,
|
|
29
|
+
`> Agent: \`${agent}\` | Date: ${date}`,
|
|
30
|
+
'',
|
|
31
|
+
'---',
|
|
32
|
+
'',
|
|
33
|
+
];
|
|
34
|
+
for (const turn of turns) {
|
|
35
|
+
if (turn.role === 'user') {
|
|
36
|
+
lines.push(`### You`, '', turn.content, '');
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
lines.push(`### K:BOT`, '', turn.content, '');
|
|
40
|
+
}
|
|
41
|
+
lines.push('---', '');
|
|
42
|
+
}
|
|
43
|
+
lines.push('', '---', '', `*Shared from [K:BOT](${KBOT_URL}) — the open-source terminal AI agent by [kernel.chat](https://kernel.chat)*`, `*Install: \`npm install -g @kernel.chat/kbot\` | [GitHub](${REPO_URL})*`);
|
|
44
|
+
return lines.join('\n');
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check if GitHub CLI (gh) is available and authenticated.
|
|
48
|
+
*/
|
|
49
|
+
function hasGitHubCLI() {
|
|
50
|
+
try {
|
|
51
|
+
execSync('gh auth status', { stdio: 'ignore', timeout: 5000 });
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Create a GitHub Gist with the conversation and return the URL.
|
|
60
|
+
*/
|
|
61
|
+
export function createGist(content, filename, description, isPublic = true) {
|
|
62
|
+
const flag = isPublic ? '--public' : '';
|
|
63
|
+
const safeDesc = description.replace(/'/g, "'\\''");
|
|
64
|
+
const safeFilename = filename.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
65
|
+
// Write content to a temp file to avoid shell escaping issues
|
|
66
|
+
const tmpFile = `/tmp/kbot-share-${Date.now()}.md`;
|
|
67
|
+
const { writeFileSync, unlinkSync } = require('node:fs');
|
|
68
|
+
writeFileSync(tmpFile, content, 'utf-8');
|
|
69
|
+
try {
|
|
70
|
+
const result = execSync(`gh gist create ${flag} --desc '${safeDesc}' --filename '${safeFilename}' '${tmpFile}'`, { encoding: 'utf-8', timeout: 15000 }).trim();
|
|
71
|
+
return result; // gh gist create returns the URL
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
try {
|
|
75
|
+
unlinkSync(tmpFile);
|
|
76
|
+
}
|
|
77
|
+
catch { /* ignore */ }
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Copy text to system clipboard (macOS/Linux/Windows).
|
|
82
|
+
*/
|
|
83
|
+
function copyToClipboard(text) {
|
|
84
|
+
try {
|
|
85
|
+
const platform = process.platform;
|
|
86
|
+
if (platform === 'darwin') {
|
|
87
|
+
execSync('pbcopy', { input: text, timeout: 3000 });
|
|
88
|
+
}
|
|
89
|
+
else if (platform === 'linux') {
|
|
90
|
+
execSync('xclip -selection clipboard', { input: text, timeout: 3000 });
|
|
91
|
+
}
|
|
92
|
+
else if (platform === 'win32') {
|
|
93
|
+
execSync('clip', { input: text, timeout: 3000 });
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
return false;
|
|
97
|
+
}
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return false;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Share a conversation. Tries GitHub Gist first, falls back to clipboard.
|
|
106
|
+
*
|
|
107
|
+
* @param sessionId - Optional session ID. If omitted, shares current conversation.
|
|
108
|
+
* @param options - Share options
|
|
109
|
+
*/
|
|
110
|
+
export async function shareConversation(sessionId, options = {}) {
|
|
111
|
+
let turns;
|
|
112
|
+
let meta = {};
|
|
113
|
+
if (sessionId) {
|
|
114
|
+
// Share a saved session
|
|
115
|
+
const session = loadSession(sessionId);
|
|
116
|
+
if (!session) {
|
|
117
|
+
throw new Error(`Session not found: ${sessionId}`);
|
|
118
|
+
}
|
|
119
|
+
turns = session.history;
|
|
120
|
+
meta = {
|
|
121
|
+
name: options.title || session.name,
|
|
122
|
+
agent: session.agent,
|
|
123
|
+
created: session.created,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
// Share current conversation
|
|
128
|
+
turns = getHistory();
|
|
129
|
+
if (turns.length === 0) {
|
|
130
|
+
throw new Error('No conversation to share. Say something first, or specify a session ID.');
|
|
131
|
+
}
|
|
132
|
+
// Auto-save the session so it's persisted
|
|
133
|
+
const saved = saveSession(options.title);
|
|
134
|
+
meta = {
|
|
135
|
+
name: options.title || saved.name,
|
|
136
|
+
agent: saved.agent,
|
|
137
|
+
created: saved.created,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
const markdown = formatShareMarkdown(turns, meta);
|
|
141
|
+
const title = meta.name || 'K:BOT Conversation';
|
|
142
|
+
const filename = `kbot-${title.toLowerCase().replace(/[^a-z0-9]+/g, '-').slice(0, 40)}.md`;
|
|
143
|
+
// Try GitHub Gist first
|
|
144
|
+
if (hasGitHubCLI()) {
|
|
145
|
+
try {
|
|
146
|
+
const url = createGist(markdown, filename, `${title} — shared from K:BOT`, options.public !== false);
|
|
147
|
+
if (url && url.startsWith('http')) {
|
|
148
|
+
copyToClipboard(url);
|
|
149
|
+
return { url, copied: true, method: 'gist', markdown };
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// Fall through to clipboard
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
// Fallback: copy markdown to clipboard
|
|
157
|
+
const copied = copyToClipboard(markdown);
|
|
158
|
+
return { copied, method: copied ? 'clipboard' : 'stdout', markdown };
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=share.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share.js","sourceRoot":"","sources":["../src/share.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface AuditResult {
|
|
2
|
+
repo: string;
|
|
3
|
+
score: number;
|
|
4
|
+
maxScore: number;
|
|
5
|
+
grade: string;
|
|
6
|
+
sections: AuditSection[];
|
|
7
|
+
summary: string;
|
|
8
|
+
}
|
|
9
|
+
interface AuditSection {
|
|
10
|
+
name: string;
|
|
11
|
+
score: number;
|
|
12
|
+
maxScore: number;
|
|
13
|
+
findings: string[];
|
|
14
|
+
status: 'pass' | 'warn' | 'fail';
|
|
15
|
+
}
|
|
16
|
+
declare function auditRepo(repo: string): Promise<AuditResult>;
|
|
17
|
+
declare function formatAuditReport(result: AuditResult): string;
|
|
18
|
+
export declare function registerAuditTools(): void;
|
|
19
|
+
export { auditRepo, formatAuditReport };
|
|
20
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"AAgCA,UAAU,WAAW;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAA;CACjC;AAUD,iBAAe,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiN3D;AAED,iBAAS,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAgCtD;AAED,wBAAgB,kBAAkB,IAAI,IAAI,CAmBzC;AAGD,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAA"}
|
|
@@ -0,0 +1,440 @@
|
|
|
1
|
+
// K:BOT Audit Tools — Full-spectrum audit of any GitHub repository
|
|
2
|
+
//
|
|
3
|
+
// Security, code quality, documentation, dependency health — all in one report.
|
|
4
|
+
// Designed to be shared. Every audit links back to kbot.
|
|
5
|
+
import { registerTool } from './index.js';
|
|
6
|
+
const GITHUB_API = 'https://api.github.com';
|
|
7
|
+
const HEADERS = {
|
|
8
|
+
'User-Agent': 'KBot/2.18 (Audit)',
|
|
9
|
+
'Accept': 'application/vnd.github.v3+json',
|
|
10
|
+
};
|
|
11
|
+
async function githubFetch(path) {
|
|
12
|
+
const res = await fetch(`${GITHUB_API}${path}`, { headers: HEADERS });
|
|
13
|
+
if (!res.ok)
|
|
14
|
+
throw new Error(`GitHub API ${res.status}: ${path}`);
|
|
15
|
+
return res.json();
|
|
16
|
+
}
|
|
17
|
+
async function rawFetch(repo, path, branch = 'main') {
|
|
18
|
+
for (const b of [branch, 'master']) {
|
|
19
|
+
try {
|
|
20
|
+
const res = await fetch(`https://raw.githubusercontent.com/${repo}/${b}/${path}`, { headers: { 'User-Agent': 'KBot/2.18' } });
|
|
21
|
+
if (res.ok)
|
|
22
|
+
return res.text();
|
|
23
|
+
}
|
|
24
|
+
catch { /* try next */ }
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
function gradeFromPercent(pct) {
|
|
29
|
+
if (pct >= 90)
|
|
30
|
+
return 'A';
|
|
31
|
+
if (pct >= 80)
|
|
32
|
+
return 'B';
|
|
33
|
+
if (pct >= 70)
|
|
34
|
+
return 'C';
|
|
35
|
+
if (pct >= 60)
|
|
36
|
+
return 'D';
|
|
37
|
+
return 'F';
|
|
38
|
+
}
|
|
39
|
+
async function auditRepo(repo) {
|
|
40
|
+
const sections = [];
|
|
41
|
+
// 1. Repository health
|
|
42
|
+
const repoHealth = { name: 'Repository Health', score: 0, maxScore: 20, findings: [], status: 'pass' };
|
|
43
|
+
try {
|
|
44
|
+
const data = await githubFetch(`/repos/${repo}`);
|
|
45
|
+
if (data.description) {
|
|
46
|
+
repoHealth.score += 3;
|
|
47
|
+
repoHealth.findings.push('Has description');
|
|
48
|
+
}
|
|
49
|
+
else
|
|
50
|
+
repoHealth.findings.push('Missing description');
|
|
51
|
+
if (data.license) {
|
|
52
|
+
repoHealth.score += 3;
|
|
53
|
+
repoHealth.findings.push(`License: ${data.license.spdx_id}`);
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
repoHealth.findings.push('No license detected');
|
|
57
|
+
repoHealth.status = 'warn';
|
|
58
|
+
}
|
|
59
|
+
if (data.topics?.length > 0) {
|
|
60
|
+
repoHealth.score += 2;
|
|
61
|
+
repoHealth.findings.push(`${data.topics.length} topics`);
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
repoHealth.findings.push('No topics/tags');
|
|
65
|
+
if (!data.archived) {
|
|
66
|
+
repoHealth.score += 2;
|
|
67
|
+
}
|
|
68
|
+
else
|
|
69
|
+
repoHealth.findings.push('Repository is archived');
|
|
70
|
+
if (data.has_issues)
|
|
71
|
+
repoHealth.score += 1;
|
|
72
|
+
if (data.has_wiki)
|
|
73
|
+
repoHealth.score += 1;
|
|
74
|
+
// Activity: updated in last 90 days
|
|
75
|
+
const lastUpdate = new Date(data.updated_at);
|
|
76
|
+
const daysAgo = (Date.now() - lastUpdate.getTime()) / 86400000;
|
|
77
|
+
if (daysAgo < 30) {
|
|
78
|
+
repoHealth.score += 4;
|
|
79
|
+
repoHealth.findings.push(`Active — updated ${Math.floor(daysAgo)}d ago`);
|
|
80
|
+
}
|
|
81
|
+
else if (daysAgo < 90) {
|
|
82
|
+
repoHealth.score += 2;
|
|
83
|
+
repoHealth.findings.push(`Updated ${Math.floor(daysAgo)}d ago`);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
repoHealth.findings.push(`Stale — last updated ${Math.floor(daysAgo)}d ago`);
|
|
87
|
+
repoHealth.status = 'warn';
|
|
88
|
+
}
|
|
89
|
+
// Stars as social proof
|
|
90
|
+
if (data.stargazers_count >= 100) {
|
|
91
|
+
repoHealth.score += 4;
|
|
92
|
+
repoHealth.findings.push(`${data.stargazers_count} stars`);
|
|
93
|
+
}
|
|
94
|
+
else if (data.stargazers_count >= 10) {
|
|
95
|
+
repoHealth.score += 2;
|
|
96
|
+
repoHealth.findings.push(`${data.stargazers_count} stars`);
|
|
97
|
+
}
|
|
98
|
+
else
|
|
99
|
+
repoHealth.findings.push(`${data.stargazers_count} stars`);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
repoHealth.findings.push(`Could not fetch repo: ${err.message}`);
|
|
103
|
+
repoHealth.status = 'fail';
|
|
104
|
+
}
|
|
105
|
+
sections.push(repoHealth);
|
|
106
|
+
// 2. Documentation
|
|
107
|
+
const docs = { name: 'Documentation', score: 0, maxScore: 15, findings: [], status: 'pass' };
|
|
108
|
+
const readme = await rawFetch(repo, 'README.md');
|
|
109
|
+
if (readme) {
|
|
110
|
+
docs.score += 3;
|
|
111
|
+
docs.findings.push('Has README.md');
|
|
112
|
+
if (readme.length > 500) {
|
|
113
|
+
docs.score += 2;
|
|
114
|
+
docs.findings.push(`README: ${(readme.length / 1024).toFixed(1)}KB`);
|
|
115
|
+
}
|
|
116
|
+
else
|
|
117
|
+
docs.findings.push('README is short (< 500 chars)');
|
|
118
|
+
if (/install/i.test(readme)) {
|
|
119
|
+
docs.score += 2;
|
|
120
|
+
docs.findings.push('Has install instructions');
|
|
121
|
+
}
|
|
122
|
+
else
|
|
123
|
+
docs.findings.push('No install instructions found');
|
|
124
|
+
if (/usage|example|getting started/i.test(readme)) {
|
|
125
|
+
docs.score += 2;
|
|
126
|
+
docs.findings.push('Has usage examples');
|
|
127
|
+
}
|
|
128
|
+
else
|
|
129
|
+
docs.findings.push('No usage examples');
|
|
130
|
+
if (/api|reference|docs/i.test(readme)) {
|
|
131
|
+
docs.score += 1;
|
|
132
|
+
}
|
|
133
|
+
if (/badge|shield/i.test(readme)) {
|
|
134
|
+
docs.score += 1;
|
|
135
|
+
docs.findings.push('Has badges');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
docs.findings.push('No README.md found');
|
|
140
|
+
docs.status = 'fail';
|
|
141
|
+
}
|
|
142
|
+
const contributing = await rawFetch(repo, 'CONTRIBUTING.md');
|
|
143
|
+
if (contributing) {
|
|
144
|
+
docs.score += 2;
|
|
145
|
+
docs.findings.push('Has CONTRIBUTING.md');
|
|
146
|
+
}
|
|
147
|
+
const changelog = await rawFetch(repo, 'CHANGELOG.md');
|
|
148
|
+
if (changelog) {
|
|
149
|
+
docs.score += 2;
|
|
150
|
+
docs.findings.push('Has CHANGELOG.md');
|
|
151
|
+
}
|
|
152
|
+
sections.push(docs);
|
|
153
|
+
// 3. Security
|
|
154
|
+
const security = { name: 'Security', score: 0, maxScore: 15, findings: [], status: 'pass' };
|
|
155
|
+
const securityMd = await rawFetch(repo, 'SECURITY.md');
|
|
156
|
+
if (securityMd) {
|
|
157
|
+
security.score += 3;
|
|
158
|
+
security.findings.push('Has SECURITY.md');
|
|
159
|
+
}
|
|
160
|
+
else
|
|
161
|
+
security.findings.push('No SECURITY.md');
|
|
162
|
+
const gitignore = await rawFetch(repo, '.gitignore');
|
|
163
|
+
if (gitignore) {
|
|
164
|
+
security.score += 2;
|
|
165
|
+
security.findings.push('Has .gitignore');
|
|
166
|
+
if (/\.env/m.test(gitignore)) {
|
|
167
|
+
security.score += 3;
|
|
168
|
+
security.findings.push('.env is gitignored');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
security.findings.push('.env NOT in .gitignore');
|
|
172
|
+
security.status = 'warn';
|
|
173
|
+
}
|
|
174
|
+
if (/node_modules|__pycache__|target\//m.test(gitignore))
|
|
175
|
+
security.score += 1;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
security.findings.push('No .gitignore');
|
|
179
|
+
security.status = 'warn';
|
|
180
|
+
}
|
|
181
|
+
// Check for common security files
|
|
182
|
+
const codeowners = await rawFetch(repo, 'CODEOWNERS') || await rawFetch(repo, '.github/CODEOWNERS');
|
|
183
|
+
if (codeowners) {
|
|
184
|
+
security.score += 2;
|
|
185
|
+
security.findings.push('Has CODEOWNERS');
|
|
186
|
+
}
|
|
187
|
+
// Check branch protection via API (may fail without auth)
|
|
188
|
+
try {
|
|
189
|
+
const branches = await githubFetch(`/repos/${repo}/branches?per_page=5`);
|
|
190
|
+
const defaultBranch = branches.find((b) => b.name === 'main' || b.name === 'master');
|
|
191
|
+
if (defaultBranch?.protected) {
|
|
192
|
+
security.score += 4;
|
|
193
|
+
security.findings.push('Default branch is protected');
|
|
194
|
+
}
|
|
195
|
+
else
|
|
196
|
+
security.findings.push('Default branch is NOT protected');
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
security.findings.push('Could not check branch protection');
|
|
200
|
+
}
|
|
201
|
+
sections.push(security);
|
|
202
|
+
// 4. Code Quality
|
|
203
|
+
const quality = { name: 'Code Quality', score: 0, maxScore: 20, findings: [], status: 'pass' };
|
|
204
|
+
// Check for linter/formatter configs
|
|
205
|
+
const eslint = await rawFetch(repo, '.eslintrc.json') || await rawFetch(repo, '.eslintrc.js') || await rawFetch(repo, 'eslint.config.js');
|
|
206
|
+
if (eslint) {
|
|
207
|
+
quality.score += 3;
|
|
208
|
+
quality.findings.push('Has ESLint config');
|
|
209
|
+
}
|
|
210
|
+
const prettier = await rawFetch(repo, '.prettierrc') || await rawFetch(repo, '.prettierrc.json');
|
|
211
|
+
if (prettier) {
|
|
212
|
+
quality.score += 2;
|
|
213
|
+
quality.findings.push('Has Prettier config');
|
|
214
|
+
}
|
|
215
|
+
const editorconfig = await rawFetch(repo, '.editorconfig');
|
|
216
|
+
if (editorconfig) {
|
|
217
|
+
quality.score += 1;
|
|
218
|
+
quality.findings.push('Has .editorconfig');
|
|
219
|
+
}
|
|
220
|
+
// TypeScript
|
|
221
|
+
const tsconfig = await rawFetch(repo, 'tsconfig.json');
|
|
222
|
+
if (tsconfig) {
|
|
223
|
+
quality.score += 3;
|
|
224
|
+
quality.findings.push('Uses TypeScript');
|
|
225
|
+
if (/"strict"\s*:\s*true/i.test(tsconfig)) {
|
|
226
|
+
quality.score += 2;
|
|
227
|
+
quality.findings.push('Strict mode enabled');
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
// CI/CD
|
|
231
|
+
const ghaWorkflow = await rawFetch(repo, '.github/workflows/ci.yml') ||
|
|
232
|
+
await rawFetch(repo, '.github/workflows/ci.yaml') ||
|
|
233
|
+
await rawFetch(repo, '.github/workflows/test.yml') ||
|
|
234
|
+
await rawFetch(repo, '.circleci/config.yml') ||
|
|
235
|
+
await rawFetch(repo, '.travis.yml');
|
|
236
|
+
if (ghaWorkflow) {
|
|
237
|
+
quality.score += 4;
|
|
238
|
+
quality.findings.push('Has CI/CD pipeline');
|
|
239
|
+
}
|
|
240
|
+
else
|
|
241
|
+
quality.findings.push('No CI/CD detected');
|
|
242
|
+
// Tests
|
|
243
|
+
const pkg = await rawFetch(repo, 'package.json');
|
|
244
|
+
if (pkg) {
|
|
245
|
+
try {
|
|
246
|
+
const pkgData = JSON.parse(pkg);
|
|
247
|
+
if (pkgData.scripts?.test && pkgData.scripts.test !== 'echo "Error: no test specified" && exit 1') {
|
|
248
|
+
quality.score += 3;
|
|
249
|
+
quality.findings.push(`Test script: ${pkgData.scripts.test.slice(0, 60)}`);
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
quality.findings.push('No test script configured');
|
|
253
|
+
quality.status = 'warn';
|
|
254
|
+
}
|
|
255
|
+
// Check for outdated/vulnerable patterns
|
|
256
|
+
const deps = { ...pkgData.dependencies, ...pkgData.devDependencies };
|
|
257
|
+
const depCount = Object.keys(deps || {}).length;
|
|
258
|
+
quality.findings.push(`${depCount} dependencies`);
|
|
259
|
+
if (depCount > 100) {
|
|
260
|
+
quality.findings.push('High dependency count (>100) — supply chain risk');
|
|
261
|
+
quality.status = 'warn';
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
catch { /* not valid JSON */ }
|
|
265
|
+
}
|
|
266
|
+
const pyproject = await rawFetch(repo, 'pyproject.toml');
|
|
267
|
+
if (pyproject) {
|
|
268
|
+
quality.score += 2;
|
|
269
|
+
quality.findings.push('Has pyproject.toml');
|
|
270
|
+
if (/\[tool\.pytest/m.test(pyproject)) {
|
|
271
|
+
quality.score += 2;
|
|
272
|
+
quality.findings.push('Has pytest config');
|
|
273
|
+
}
|
|
274
|
+
if (/\[tool\.(ruff|black|isort)/m.test(pyproject)) {
|
|
275
|
+
quality.score += 1;
|
|
276
|
+
quality.findings.push('Has Python linter config');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
const cargoToml = await rawFetch(repo, 'Cargo.toml');
|
|
280
|
+
if (cargoToml) {
|
|
281
|
+
quality.score += 2;
|
|
282
|
+
quality.findings.push('Uses Rust (Cargo.toml)');
|
|
283
|
+
if (/clippy/i.test(ghaWorkflow || '')) {
|
|
284
|
+
quality.score += 2;
|
|
285
|
+
quality.findings.push('Runs clippy in CI');
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
sections.push(quality);
|
|
289
|
+
// 5. Community & Governance
|
|
290
|
+
const community = { name: 'Community', score: 0, maxScore: 15, findings: [], status: 'pass' };
|
|
291
|
+
const coc = await rawFetch(repo, 'CODE_OF_CONDUCT.md');
|
|
292
|
+
if (coc) {
|
|
293
|
+
community.score += 3;
|
|
294
|
+
community.findings.push('Has Code of Conduct');
|
|
295
|
+
}
|
|
296
|
+
if (contributing)
|
|
297
|
+
community.score += 3;
|
|
298
|
+
try {
|
|
299
|
+
const issues = await githubFetch(`/repos/${repo}/issues?state=open&per_page=5`);
|
|
300
|
+
if (Array.isArray(issues)) {
|
|
301
|
+
community.findings.push(`${issues.length}+ open issues`);
|
|
302
|
+
// Check if issues have labels
|
|
303
|
+
const labeled = issues.filter((i) => i.labels?.length > 0);
|
|
304
|
+
if (labeled.length > 0) {
|
|
305
|
+
community.score += 2;
|
|
306
|
+
community.findings.push('Issues are labeled');
|
|
307
|
+
}
|
|
308
|
+
// Check for issue templates
|
|
309
|
+
const issueTemplate = await rawFetch(repo, '.github/ISSUE_TEMPLATE/bug_report.md') ||
|
|
310
|
+
await rawFetch(repo, '.github/ISSUE_TEMPLATE.md');
|
|
311
|
+
if (issueTemplate) {
|
|
312
|
+
community.score += 2;
|
|
313
|
+
community.findings.push('Has issue templates');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
catch { /* rate limited */ }
|
|
318
|
+
const prTemplate = await rawFetch(repo, '.github/PULL_REQUEST_TEMPLATE.md');
|
|
319
|
+
if (prTemplate) {
|
|
320
|
+
community.score += 2;
|
|
321
|
+
community.findings.push('Has PR template');
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
const contributors = await githubFetch(`/repos/${repo}/contributors?per_page=100`);
|
|
325
|
+
if (Array.isArray(contributors)) {
|
|
326
|
+
community.score += Math.min(3, Math.floor(contributors.length / 5));
|
|
327
|
+
community.findings.push(`${contributors.length} contributors`);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
catch { /* rate limited */ }
|
|
331
|
+
sections.push(community);
|
|
332
|
+
// 6. DevOps & Infrastructure
|
|
333
|
+
const devops = { name: 'DevOps', score: 0, maxScore: 15, findings: [], status: 'pass' };
|
|
334
|
+
const dockerfile = await rawFetch(repo, 'Dockerfile');
|
|
335
|
+
if (dockerfile) {
|
|
336
|
+
devops.score += 3;
|
|
337
|
+
devops.findings.push('Has Dockerfile');
|
|
338
|
+
if (/HEALTHCHECK/i.test(dockerfile)) {
|
|
339
|
+
devops.score += 1;
|
|
340
|
+
devops.findings.push('Docker health check configured');
|
|
341
|
+
}
|
|
342
|
+
if (/FROM .* AS /i.test(dockerfile)) {
|
|
343
|
+
devops.score += 1;
|
|
344
|
+
devops.findings.push('Multi-stage Docker build');
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
const compose = await rawFetch(repo, 'docker-compose.yml') || await rawFetch(repo, 'docker-compose.yaml');
|
|
348
|
+
if (compose) {
|
|
349
|
+
devops.score += 2;
|
|
350
|
+
devops.findings.push('Has docker-compose');
|
|
351
|
+
}
|
|
352
|
+
if (ghaWorkflow)
|
|
353
|
+
devops.score += 3;
|
|
354
|
+
const lockfile = await rawFetch(repo, 'package-lock.json') || await rawFetch(repo, 'yarn.lock') ||
|
|
355
|
+
await rawFetch(repo, 'pnpm-lock.yaml') || await rawFetch(repo, 'Cargo.lock') ||
|
|
356
|
+
await rawFetch(repo, 'poetry.lock');
|
|
357
|
+
if (lockfile !== null) {
|
|
358
|
+
devops.score += 3;
|
|
359
|
+
devops.findings.push('Has lockfile (reproducible builds)');
|
|
360
|
+
}
|
|
361
|
+
else {
|
|
362
|
+
devops.findings.push('No lockfile');
|
|
363
|
+
devops.status = 'warn';
|
|
364
|
+
}
|
|
365
|
+
const renovate = await rawFetch(repo, 'renovate.json') || await rawFetch(repo, '.github/dependabot.yml');
|
|
366
|
+
if (renovate) {
|
|
367
|
+
devops.score += 3;
|
|
368
|
+
devops.findings.push('Has automated dependency updates');
|
|
369
|
+
}
|
|
370
|
+
sections.push(devops);
|
|
371
|
+
// Calculate totals
|
|
372
|
+
const totalScore = sections.reduce((sum, s) => sum + s.score, 0);
|
|
373
|
+
const totalMax = sections.reduce((sum, s) => sum + s.maxScore, 0);
|
|
374
|
+
const pct = Math.round((totalScore / totalMax) * 100);
|
|
375
|
+
const grade = gradeFromPercent(pct);
|
|
376
|
+
// Set section statuses
|
|
377
|
+
for (const s of sections) {
|
|
378
|
+
const sPct = s.maxScore > 0 ? (s.score / s.maxScore) * 100 : 0;
|
|
379
|
+
if (s.status !== 'fail') {
|
|
380
|
+
s.status = sPct >= 60 ? 'pass' : 'warn';
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
// Generate summary
|
|
384
|
+
const fails = sections.filter(s => s.status === 'fail');
|
|
385
|
+
const warns = sections.filter(s => s.status === 'warn');
|
|
386
|
+
const summary = fails.length > 0
|
|
387
|
+
? `${fails.length} critical issue(s) found. ${warns.length} warning(s).`
|
|
388
|
+
: warns.length > 0
|
|
389
|
+
? `No critical issues. ${warns.length} area(s) need improvement.`
|
|
390
|
+
: 'All checks passed. Well-maintained repository.';
|
|
391
|
+
return { repo, score: totalScore, maxScore: totalMax, grade, sections, summary };
|
|
392
|
+
}
|
|
393
|
+
function formatAuditReport(result) {
|
|
394
|
+
const statusIcon = (s) => s === 'pass' ? '✅' : s === 'warn' ? '⚠️' : '❌';
|
|
395
|
+
const pct = Math.round((result.score / result.maxScore) * 100);
|
|
396
|
+
const lines = [
|
|
397
|
+
`# Audit Report: ${result.repo}`,
|
|
398
|
+
'',
|
|
399
|
+
`> Generated by [K:BOT](https://www.npmjs.com/package/@kernel.chat/kbot) — open-source AI agent`,
|
|
400
|
+
'',
|
|
401
|
+
`## Score: ${result.score}/${result.maxScore} (${pct}%) — Grade ${result.grade}`,
|
|
402
|
+
'',
|
|
403
|
+
`**${result.summary}**`,
|
|
404
|
+
'',
|
|
405
|
+
];
|
|
406
|
+
for (const section of result.sections) {
|
|
407
|
+
const sPct = section.maxScore > 0 ? Math.round((section.score / section.maxScore) * 100) : 0;
|
|
408
|
+
lines.push(`### ${statusIcon(section.status)} ${section.name} — ${section.score}/${section.maxScore} (${sPct}%)`);
|
|
409
|
+
for (const f of section.findings) {
|
|
410
|
+
lines.push(`- ${f}`);
|
|
411
|
+
}
|
|
412
|
+
lines.push('');
|
|
413
|
+
}
|
|
414
|
+
lines.push('---', '', `*Audited by [K:BOT](https://www.npmjs.com/package/@kernel.chat/kbot) — 39 specialists, 216 tools, 20 AI providers*`, `*Install: \`npm install -g @kernel.chat/kbot\` | [GitHub](https://github.com/isaacsight/kernel)*`);
|
|
415
|
+
return lines.join('\n');
|
|
416
|
+
}
|
|
417
|
+
export function registerAuditTools() {
|
|
418
|
+
registerTool({
|
|
419
|
+
name: 'repo_audit',
|
|
420
|
+
description: 'Run a full audit on any GitHub repository. Checks security, documentation, code quality, CI/CD, community health, and DevOps practices. Returns a scored report with grade (A-F). Use to evaluate any open-source project before using or contributing.',
|
|
421
|
+
parameters: {
|
|
422
|
+
repo: { type: 'string', description: 'Repository in "owner/repo" format (e.g., "facebook/react")', required: true },
|
|
423
|
+
},
|
|
424
|
+
tier: 'free',
|
|
425
|
+
timeout: 60_000,
|
|
426
|
+
async execute(args) {
|
|
427
|
+
const repo = String(args.repo);
|
|
428
|
+
try {
|
|
429
|
+
const result = await auditRepo(repo);
|
|
430
|
+
return formatAuditReport(result);
|
|
431
|
+
}
|
|
432
|
+
catch (err) {
|
|
433
|
+
return `Audit failed: ${err instanceof Error ? err.message : String(err)}`;
|
|
434
|
+
}
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
// Export for CLI subcommand
|
|
439
|
+
export { auditRepo, formatAuditReport };
|
|
440
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/tools/audit.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,EAAE;AACF,gFAAgF;AAChF,yDAAyD;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,UAAU,GAAG,wBAAwB,CAAA;AAC3C,MAAM,OAAO,GAAG;IACd,YAAY,EAAE,mBAAmB;IACjC,QAAQ,EAAE,gCAAgC;CAC3C,CAAA;AAED,KAAK,UAAU,WAAW,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,UAAU,GAAG,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IACrE,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,cAAc,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAA;IACjE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;AACnB,CAAC;AAED,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAAY,EAAE,MAAM,GAAG,MAAM;IACjE,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,qCAAqC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,EACxD,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,CAC3C,CAAA;YACD,IAAI,GAAG,CAAC,EAAE;gBAAE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;QAC/B,CAAC;QAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAmBD,SAAS,gBAAgB,CAAC,GAAW;IACnC,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,GAAG,CAAA;IACzB,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,GAAG,CAAA;IACzB,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,GAAG,CAAA;IACzB,IAAI,GAAG,IAAI,EAAE;QAAE,OAAO,GAAG,CAAA;IACzB,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,IAAY;IACnC,MAAM,QAAQ,GAAmB,EAAE,CAAA;IAEnC,uBAAuB;IACvB,MAAM,UAAU,GAAiB,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACpH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;QAChD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAAC,CAAC;;YACvF,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QACpD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAAC,CAAC;aACpG,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;QAAC,CAAC;QACpF,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAA;QAAC,CAAC;;YAC3G,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAA;QAAC,CAAC;;YAAM,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QACrG,IAAI,IAAI,CAAC,UAAU;YAAE,UAAU,CAAC,KAAK,IAAI,CAAC,CAAA;QAC1C,IAAI,IAAI,CAAC,QAAQ;YAAE,UAAU,CAAC,KAAK,IAAI,CAAC,CAAA;QACxC,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,GAAG,QAAQ,CAAA;QAC9D,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAAC,CAAC;aAChH,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAAC,CAAC;aAC5G,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAAC,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;QAAC,CAAC;QACjH,wBAAwB;QACxB,IAAI,IAAI,CAAC,gBAAgB,IAAI,GAAG,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,QAAQ,CAAC,CAAA;QAAC,CAAC;aAClH,IAAI,IAAI,CAAC,gBAAgB,IAAI,EAAE,EAAE,CAAC;YAAC,UAAU,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,QAAQ,CAAC,CAAA;QAAC,CAAC;;YACtH,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,QAAQ,CAAC,CAAA;IACjE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,yBAA0B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAA;QAC3E,UAAU,CAAC,MAAM,GAAG,MAAM,CAAA;IAC5B,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IAEzB,mBAAmB;IACnB,MAAM,IAAI,GAAiB,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC1G,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,CAAA;IAChD,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACpD,IAAI,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAAC,CAAC;;YAC7G,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QACxD,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAAC,CAAC;;YAC3F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;QACxD,IAAI,gCAAgC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAAC,CAAC;;YAC3G,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAC5C,IAAI,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QAAC,CAAC;QAC3D,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAAC,CAAC;IACzF,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACxC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAA;IAC5D,IAAI,YAAY,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAAC,CAAC;IAChF,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IACtD,IAAI,SAAS,EAAE,CAAC;QAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;IAAC,CAAC;IAC1E,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEnB,cAAc;IACd,MAAM,QAAQ,GAAiB,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACzG,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACtD,IAAI,UAAU,EAAE,CAAC;QAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAAC,CAAC;;QAC7E,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAC7C,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QAC7D,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAAC,CAAC;aAC9F,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YAAC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;QAAC,CAAC;QACnF,IAAI,oCAAoC,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAA;IAC/E,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACvC,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAA;IAC1B,CAAC;IACD,kCAAkC;IAClC,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;IACnG,IAAI,UAAU,EAAE,CAAC;QAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;IAAC,CAAC;IACjF,0DAA0D;IAC1D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,UAAU,IAAI,sBAAsB,CAAC,CAAA;QACxE,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAA;QACzF,IAAI,aAAa,EAAE,SAAS,EAAE,CAAC;YAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAA;QAAC,CAAC;;YACvG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAA;IAChE,CAAC;IAAC,MAAM,CAAC;QAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;IAAC,CAAC;IACvE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAEvB,kBAAkB;IAClB,MAAM,OAAO,GAAiB,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC5G,qCAAqC;IACrC,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IACzI,IAAI,MAAM,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAA;IAChG,IAAI,QAAQ,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAAC,CAAC;IAClF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IAC1D,IAAI,YAAY,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAAC,CAAC;IACpF,aAAa;IACb,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;IACtD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC5D,IAAI,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;QAAC,CAAC;IACjH,CAAC;IACD,QAAQ;IACR,MAAM,WAAW,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC;QAClE,MAAM,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC;QACjD,MAAM,QAAQ,CAAC,IAAI,EAAE,4BAA4B,CAAC;QAClD,MAAM,QAAQ,CAAC,IAAI,EAAE,sBAAsB,CAAC;QAC5C,MAAM,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACrC,IAAI,WAAW,EAAE,CAAC;QAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAAC,CAAC;;QAC/E,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAC/C,QAAQ;IACR,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;IAChD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,2CAA2C,EAAE,CAAC;gBAClG,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;gBAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAA;YAChG,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;gBAClD,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;YACzB,CAAC;YACD,yCAAyC;YACzC,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAA;YACpE,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAA;YAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,eAAe,CAAC,CAAA;YACjD,IAAI,QAAQ,GAAG,GAAG,EAAE,CAAC;gBAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;gBAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAA;YAAC,CAAC;QAC5H,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACxD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QAC/D,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAAC,CAAC;QACzG,IAAI,6BAA6B,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAAC,CAAC;IAC9H,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;QACnE,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;QAAC,CAAC;IAC3G,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAEtB,4BAA4B;IAC5B,MAAM,SAAS,GAAiB,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IAC3G,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAA;IACtD,IAAI,GAAG,EAAE,CAAC;QAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAAC,CAAC;IACjF,IAAI,YAAY;QAAE,SAAS,CAAC,KAAK,IAAI,CAAC,CAAA;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,UAAU,IAAI,+BAA+B,CAAC,CAAA;QAC/E,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,eAAe,CAAC,CAAA;YACxD,8BAA8B;YAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,CAAA;YAC/D,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;gBAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;YAAC,CAAC;YAC/F,4BAA4B;YAC5B,MAAM,aAAa,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,sCAAsC,CAAC;gBAChF,MAAM,QAAQ,CAAC,IAAI,EAAE,2BAA2B,CAAC,CAAA;YACnD,IAAI,aAAa,EAAE,CAAC;gBAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;gBAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;YAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,kCAAkC,CAAC,CAAA;IAC3E,IAAI,UAAU,EAAE,CAAC;QAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAAC,CAAC;IACpF,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,MAAM,WAAW,CAAC,UAAU,IAAI,4BAA4B,CAAC,CAAA;QAClF,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,SAAS,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;YACnE,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,eAAe,CAAC,CAAA;QAChE,CAAC;IACH,CAAC;IAAC,MAAM,CAAC,CAAC,kBAAkB,CAAC,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAExB,6BAA6B;IAC7B,MAAM,MAAM,GAAiB,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;IACrG,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;IACrD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;QACzD,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;QAAC,CAAC;QAClH,IAAI,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAA;QAAC,CAAC;IAC9G,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAA;IACzG,IAAI,OAAO,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IAAC,CAAC;IAC9E,IAAI,WAAW;QAAE,MAAM,CAAC,KAAK,IAAI,CAAC,CAAA;IAClC,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAC7F,MAAM,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;QAC5E,MAAM,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACrC,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;IAAC,CAAC;SACnG,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAAC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAA;IAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC,IAAI,MAAM,QAAQ,CAAC,IAAI,EAAE,wBAAwB,CAAC,CAAA;IACxG,IAAI,QAAQ,EAAE,CAAC;QAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;QAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;IAAC,CAAC;IAC7F,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAErB,mBAAmB;IACnB,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IAChE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IACjE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAA;IACrD,MAAM,KAAK,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAA;IAEnC,uBAAuB;IACvB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACxB,CAAC,CAAC,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QACzC,CAAC;IACH,CAAC;IAED,mBAAmB;IACnB,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;IACvD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAA;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC9B,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,6BAA6B,KAAK,CAAC,MAAM,cAAc;QACxE,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YAChB,CAAC,CAAC,uBAAuB,KAAK,CAAC,MAAM,4BAA4B;YACjE,CAAC,CAAC,gDAAgD,CAAA;IAEtD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;AAClF,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAmB;IAC5C,MAAM,UAAU,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAA;IAChF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAA;IAE9D,MAAM,KAAK,GAAa;QACtB,mBAAmB,MAAM,CAAC,IAAI,EAAE;QAChC,EAAE;QACF,gGAAgG;QAChG,EAAE;QACF,aAAa,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,cAAc,MAAM,CAAC,KAAK,EAAE;QAChF,EAAE;QACF,KAAK,MAAM,CAAC,OAAO,IAAI;QACvB,EAAE;KACH,CAAA;IAED,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC5F,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAA;QACjH,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QACtB,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,KAAK,EACL,EAAE,EACF,oHAAoH,EACpH,kGAAkG,CACnG,CAAA;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,YAAY,CAAC;QACX,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,yPAAyP;QACtQ,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4DAA4D,EAAE,QAAQ,EAAE,IAAI,EAAE;SACpH;QACD,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,MAAM;QACf,KAAK,CAAC,OAAO,CAAC,IAAI;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC9B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,CAAA;gBACpC,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAA;YAClC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAA;YAC5E,CAAC;QACH,CAAC;KACF,CAAC,CAAA;AACJ,CAAC;AAED,4BAA4B;AAC5B,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAA"}
|