@chaaskit/server 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/admin.js +438 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/agents.js +21 -0
- package/dist/api/agents.js.map +1 -0
- package/dist/api/api-keys.js +122 -0
- package/dist/api/api-keys.js.map +1 -0
- package/dist/api/auth.js +399 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/chat.js +900 -0
- package/dist/api/chat.js.map +1 -0
- package/dist/api/config.js +91 -0
- package/dist/api/config.js.map +1 -0
- package/dist/api/documents.js +237 -0
- package/dist/api/documents.js.map +1 -0
- package/dist/api/export.js +107 -0
- package/dist/api/export.js.map +1 -0
- package/dist/api/health.js +25 -0
- package/dist/api/health.js.map +1 -0
- package/dist/api/mcp-server.js +84 -0
- package/dist/api/mcp-server.js.map +1 -0
- package/dist/api/mcp.js +400 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/mentions.js +94 -0
- package/dist/api/mentions.js.map +1 -0
- package/dist/api/oauth.js +366 -0
- package/dist/api/oauth.js.map +1 -0
- package/dist/api/payments.js +473 -0
- package/dist/api/payments.js.map +1 -0
- package/dist/api/projects.js +301 -0
- package/dist/api/projects.js.map +1 -0
- package/dist/api/scheduled-prompts.js +617 -0
- package/dist/api/scheduled-prompts.js.map +1 -0
- package/dist/api/search.js +85 -0
- package/dist/api/search.js.map +1 -0
- package/dist/api/share.js +188 -0
- package/dist/api/share.js.map +1 -0
- package/dist/api/slack.js +468 -0
- package/dist/api/slack.js.map +1 -0
- package/dist/api/teams.js +693 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/templates.js +134 -0
- package/dist/api/templates.js.map +1 -0
- package/dist/api/threads.js +323 -0
- package/dist/api/threads.js.map +1 -0
- package/dist/api/upload.js +57 -0
- package/dist/api/upload.js.map +1 -0
- package/dist/api/user.js +111 -0
- package/dist/api/user.js.map +1 -0
- package/dist/api/v1/openai.js +245 -0
- package/dist/api/v1/openai.js.map +1 -0
- package/dist/app.js +168 -0
- package/dist/app.js.map +1 -0
- package/dist/bin/cli.js +57 -0
- package/dist/bin/cli.js.map +1 -0
- package/dist/commands/db-sync.js +108 -0
- package/dist/commands/db-sync.js.map +1 -0
- package/dist/config/loader.js +374 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/documents/extractors.js +136 -0
- package/dist/documents/extractors.js.map +1 -0
- package/dist/extensions/glob.js +53 -0
- package/dist/extensions/glob.js.map +1 -0
- package/dist/extensions/loader.js +72 -0
- package/dist/extensions/loader.js.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/loaders/index.js +75 -0
- package/dist/loaders/index.js.map +1 -0
- package/dist/mcp/client.js +551 -0
- package/dist/mcp/client.js.map +1 -0
- package/dist/mcp/server.js +335 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/middleware/apiKeyAuth.js +136 -0
- package/dist/middleware/apiKeyAuth.js.map +1 -0
- package/dist/middleware/auth.js +192 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/errorHandler.js +41 -0
- package/dist/middleware/errorHandler.js.map +1 -0
- package/dist/middleware/mcpServerAuth.js +164 -0
- package/dist/middleware/mcpServerAuth.js.map +1 -0
- package/dist/middleware/requestLogger.js +9 -0
- package/dist/middleware/requestLogger.js.map +1 -0
- package/dist/middleware/team.js +132 -0
- package/dist/middleware/team.js.map +1 -0
- package/dist/oauth/server.js +410 -0
- package/dist/oauth/server.js.map +1 -0
- package/dist/queue/cli.js +93 -0
- package/dist/queue/cli.js.map +1 -0
- package/dist/queue/handlers/index.js +91 -0
- package/dist/queue/handlers/index.js.map +1 -0
- package/dist/queue/handlers/scheduled-prompt.js +270 -0
- package/dist/queue/handlers/scheduled-prompt.js.map +1 -0
- package/dist/queue/index.js +91 -0
- package/dist/queue/index.js.map +1 -0
- package/dist/queue/providers/memory.js +296 -0
- package/dist/queue/providers/memory.js.map +1 -0
- package/dist/queue/providers/sqs.js +275 -0
- package/dist/queue/providers/sqs.js.map +1 -0
- package/dist/queue/scheduler.js +355 -0
- package/dist/queue/scheduler.js.map +1 -0
- package/dist/queue/types.js +5 -0
- package/dist/queue/types.js.map +1 -0
- package/dist/queue/worker.js +230 -0
- package/dist/queue/worker.js.map +1 -0
- package/dist/registry/index.js +40 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/server.js +207 -0
- package/dist/server.js.map +1 -0
- package/dist/services/agent.js +530 -0
- package/dist/services/agent.js.map +1 -0
- package/dist/services/agents.js +194 -0
- package/dist/services/agents.js.map +1 -0
- package/dist/services/documents.js +507 -0
- package/dist/services/documents.js.map +1 -0
- package/dist/services/email/index.js +91 -0
- package/dist/services/email/index.js.map +1 -0
- package/dist/services/email/providers/ses.js +97 -0
- package/dist/services/email/providers/ses.js.map +1 -0
- package/dist/services/email/templates.js +194 -0
- package/dist/services/email/templates.js.map +1 -0
- package/dist/services/email/types.js +5 -0
- package/dist/services/email/types.js.map +1 -0
- package/dist/services/encryption.js +69 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/oauth-discovery.js +226 -0
- package/dist/services/oauth-discovery.js.map +1 -0
- package/dist/services/pendingConfirmation.js +105 -0
- package/dist/services/pendingConfirmation.js.map +1 -0
- package/dist/services/scheduledPrompts.js +70 -0
- package/dist/services/scheduledPrompts.js.map +1 -0
- package/dist/services/slack/client.js +174 -0
- package/dist/services/slack/client.js.map +1 -0
- package/dist/services/slack/events.js +189 -0
- package/dist/services/slack/events.js.map +1 -0
- package/dist/services/slack/index.js +6 -0
- package/dist/services/slack/index.js.map +1 -0
- package/dist/services/slack/notifications.js +124 -0
- package/dist/services/slack/notifications.js.map +1 -0
- package/dist/services/slack/signature.js +74 -0
- package/dist/services/slack/signature.js.map +1 -0
- package/dist/services/slack/thread-context.js +191 -0
- package/dist/services/slack/thread-context.js.map +1 -0
- package/dist/services/toolConfirmation.js +55 -0
- package/dist/services/toolConfirmation.js.map +1 -0
- package/dist/services/usage.js +241 -0
- package/dist/services/usage.js.map +1 -0
- package/dist/ssr/build.js +90 -0
- package/dist/ssr/build.js.map +1 -0
- package/dist/ssr/components/SSRMessageList.js +120 -0
- package/dist/ssr/components/SSRMessageList.js.map +1 -0
- package/dist/ssr/entry.client.js +8 -0
- package/dist/ssr/entry.client.js.map +1 -0
- package/dist/ssr/entry.server.js +71 -0
- package/dist/ssr/entry.server.js.map +1 -0
- package/dist/ssr/handler.js +51 -0
- package/dist/ssr/handler.js.map +1 -0
- package/dist/ssr/root.js +184 -0
- package/dist/ssr/root.js.map +1 -0
- package/dist/ssr/routes/login.js +140 -0
- package/dist/ssr/routes/login.js.map +1 -0
- package/dist/ssr/routes/pricing.js +195 -0
- package/dist/ssr/routes/pricing.js.map +1 -0
- package/dist/ssr/routes/privacy.js +39 -0
- package/dist/ssr/routes/privacy.js.map +1 -0
- package/dist/ssr/routes/register.js +148 -0
- package/dist/ssr/routes/register.js.map +1 -0
- package/dist/ssr/routes/shared.$shareId.js +153 -0
- package/dist/ssr/routes/shared.$shareId.js.map +1 -0
- package/dist/ssr/routes/terms.js +39 -0
- package/dist/ssr/routes/terms.js.map +1 -0
- package/dist/storage/index.js +43 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/providers/database.js +38 -0
- package/dist/storage/providers/database.js.map +1 -0
- package/dist/storage/providers/filesystem.js +51 -0
- package/dist/storage/providers/filesystem.js.map +1 -0
- package/dist/storage/types.js +2 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/tools/documents.js +336 -0
- package/dist/tools/documents.js.map +1 -0
- package/dist/tools/get-plan-usage.js +82 -0
- package/dist/tools/get-plan-usage.js.map +1 -0
- package/dist/tools/index.js +106 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/types.js +2 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/web-scrape.js +145 -0
- package/dist/tools/web-scrape.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
2
|
+
import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
|
|
3
|
+
import { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';
|
|
4
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import { db } from '@chaaskit/db';
|
|
7
|
+
import { decryptCredential, isTokenExpired, } from '../services/encryption.js';
|
|
8
|
+
// Cache expiration for user clients (5 minutes)
|
|
9
|
+
const USER_CLIENT_TTL_MS = 5 * 60 * 1000;
|
|
10
|
+
class MCPClientManager {
|
|
11
|
+
// Global clients for stdio/admin servers
|
|
12
|
+
globalClients = new Map();
|
|
13
|
+
// Per-user clients for user-credential servers
|
|
14
|
+
// Key format: `${userId}:${serverId}`
|
|
15
|
+
userClients = new Map();
|
|
16
|
+
// Cleanup interval handle
|
|
17
|
+
cleanupInterval = null;
|
|
18
|
+
constructor() {
|
|
19
|
+
// Start cleanup interval
|
|
20
|
+
this.cleanupInterval = setInterval(() => this.cleanupStaleClients(), 60000);
|
|
21
|
+
}
|
|
22
|
+
// Clean up stale user clients
|
|
23
|
+
cleanupStaleClients() {
|
|
24
|
+
const now = Date.now();
|
|
25
|
+
for (const [key, managedClient] of this.userClients) {
|
|
26
|
+
if (now - managedClient.lastUsed > USER_CLIENT_TTL_MS) {
|
|
27
|
+
console.log(`[MCP] Cleaning up stale user client: ${key}`);
|
|
28
|
+
this.disconnectUserClient(key);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async disconnectUserClient(key) {
|
|
33
|
+
const managedClient = this.userClients.get(key);
|
|
34
|
+
if (managedClient) {
|
|
35
|
+
try {
|
|
36
|
+
await managedClient.client.close();
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
console.error(`[MCP] Error closing user client ${key}:`, error);
|
|
40
|
+
}
|
|
41
|
+
this.userClients.delete(key);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async connect(serverConfig) {
|
|
45
|
+
if (this.globalClients.has(serverConfig.id)) {
|
|
46
|
+
return; // Already connected
|
|
47
|
+
}
|
|
48
|
+
const managedClient = await this.createClient(serverConfig);
|
|
49
|
+
this.globalClients.set(serverConfig.id, managedClient);
|
|
50
|
+
}
|
|
51
|
+
async disconnect(serverId) {
|
|
52
|
+
const managedClient = this.globalClients.get(serverId);
|
|
53
|
+
if (managedClient) {
|
|
54
|
+
try {
|
|
55
|
+
await managedClient.client.close();
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error(`[MCP] Error closing client for ${serverId}:`, error);
|
|
59
|
+
}
|
|
60
|
+
// Kill child process if stdio transport
|
|
61
|
+
if (managedClient.childProcess) {
|
|
62
|
+
managedClient.childProcess.kill();
|
|
63
|
+
}
|
|
64
|
+
this.globalClients.delete(serverId);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Disconnect a user's client for a specific server (e.g., after credential change)
|
|
68
|
+
async disconnectUser(userId, serverId) {
|
|
69
|
+
const key = `${userId}:${serverId}`;
|
|
70
|
+
await this.disconnectUserClient(key);
|
|
71
|
+
}
|
|
72
|
+
isConnected(serverId) {
|
|
73
|
+
return this.globalClients.has(serverId);
|
|
74
|
+
}
|
|
75
|
+
async listTools(serverId) {
|
|
76
|
+
const managedClient = this.globalClients.get(serverId);
|
|
77
|
+
if (!managedClient) {
|
|
78
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
79
|
+
}
|
|
80
|
+
return managedClient.tools;
|
|
81
|
+
}
|
|
82
|
+
async listAllTools() {
|
|
83
|
+
const allTools = [];
|
|
84
|
+
for (const [serverId, managedClient] of this.globalClients) {
|
|
85
|
+
for (const tool of managedClient.tools) {
|
|
86
|
+
allTools.push({ ...tool, serverId });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return allTools;
|
|
90
|
+
}
|
|
91
|
+
// Get or list all tools available to a user (including user-credential servers)
|
|
92
|
+
async listAllToolsForUser(userId, serverConfigs) {
|
|
93
|
+
const allTools = [];
|
|
94
|
+
console.log(`[MCP] listAllToolsForUser: userId=${userId || 'anonymous'}, ${serverConfigs.length} server configs`);
|
|
95
|
+
for (const config of serverConfigs) {
|
|
96
|
+
if (!config.enabled) {
|
|
97
|
+
console.log(`[MCP] - ${config.name} (${config.id}): SKIPPED (disabled)`);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const authMode = config.authMode || 'none';
|
|
101
|
+
// For none/admin auth modes, use global client
|
|
102
|
+
if (authMode === 'none' || authMode === 'admin') {
|
|
103
|
+
const managedClient = this.globalClients.get(config.id);
|
|
104
|
+
if (managedClient) {
|
|
105
|
+
console.log(`[MCP] - ${config.name} (${config.id}): ${managedClient.tools.length} tools from global client`);
|
|
106
|
+
for (const tool of managedClient.tools) {
|
|
107
|
+
allTools.push({ ...tool, serverId: config.id });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
console.log(`[MCP] - ${config.name} (${config.id}): NO global client connected`);
|
|
112
|
+
}
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
// For user-apikey/user-oauth, check if user has credential and try to get client
|
|
116
|
+
if (userId && (authMode === 'user-apikey' || authMode === 'user-oauth')) {
|
|
117
|
+
try {
|
|
118
|
+
const managedClient = await this.getClientForUser(config.id, userId, config);
|
|
119
|
+
if (managedClient) {
|
|
120
|
+
console.log(`[MCP] - ${config.name} (${config.id}): ${managedClient.tools.length} tools from user client`);
|
|
121
|
+
for (const tool of managedClient.tools) {
|
|
122
|
+
allTools.push({ ...tool, serverId: config.id });
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
console.log(`[MCP] - ${config.name} (${config.id}): NO user credentials`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.log(`[MCP] - ${config.name} (${config.id}): ERROR - ${error instanceof Error ? error.message : error}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else if (!userId) {
|
|
134
|
+
console.log(`[MCP] - ${config.name} (${config.id}): SKIPPED (requires user auth, no userId)`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
console.log(`[MCP] Total tools available: ${allTools.length}`);
|
|
138
|
+
if (allTools.length > 0) {
|
|
139
|
+
console.log(`[MCP] Tool names: ${allTools.map(t => `${t.serverId}:${t.name}`).join(', ')}`);
|
|
140
|
+
}
|
|
141
|
+
return allTools;
|
|
142
|
+
}
|
|
143
|
+
async callTool(serverId, toolName, args) {
|
|
144
|
+
const managedClient = this.globalClients.get(serverId);
|
|
145
|
+
if (!managedClient) {
|
|
146
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
147
|
+
}
|
|
148
|
+
return this.executeToolCall(managedClient, serverId, toolName, args);
|
|
149
|
+
}
|
|
150
|
+
// Call a tool with user context (handles user-credential servers)
|
|
151
|
+
async callToolForUser(userId, serverId, toolName, args, config) {
|
|
152
|
+
const authMode = config.authMode || 'none';
|
|
153
|
+
// For none/admin auth modes, use global client
|
|
154
|
+
if (authMode === 'none' || authMode === 'admin') {
|
|
155
|
+
return this.callTool(serverId, toolName, args);
|
|
156
|
+
}
|
|
157
|
+
// For user-credential modes, get user-specific client
|
|
158
|
+
if (!userId) {
|
|
159
|
+
return {
|
|
160
|
+
content: [{ type: 'text', text: 'Authentication required for this tool' }],
|
|
161
|
+
isError: true,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
try {
|
|
165
|
+
const managedClient = await this.getClientForUser(serverId, userId, config);
|
|
166
|
+
if (!managedClient) {
|
|
167
|
+
return {
|
|
168
|
+
content: [{ type: 'text', text: 'Please configure your credentials for this server in Settings' }],
|
|
169
|
+
isError: true,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
return this.executeToolCall(managedClient, serverId, toolName, args);
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
console.error(`[MCP] User tool call error:`, error);
|
|
176
|
+
return {
|
|
177
|
+
content: [{ type: 'text', text: error instanceof Error ? error.message : 'Tool execution failed' }],
|
|
178
|
+
isError: true,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
async executeToolCall(managedClient, serverId, toolName, args) {
|
|
183
|
+
console.log(`[MCP] Executing tool: ${toolName} on server ${serverId}`);
|
|
184
|
+
console.log(`[MCP] Arguments: ${JSON.stringify(args)}`);
|
|
185
|
+
try {
|
|
186
|
+
const startTime = Date.now();
|
|
187
|
+
const result = await managedClient.client.callTool({
|
|
188
|
+
name: toolName,
|
|
189
|
+
arguments: args,
|
|
190
|
+
});
|
|
191
|
+
const duration = Date.now() - startTime;
|
|
192
|
+
// Convert MCP SDK result to our MCPToolResponse format
|
|
193
|
+
const content = result.content.map((item) => {
|
|
194
|
+
if (item.type === 'text') {
|
|
195
|
+
return { type: 'text', text: item.text };
|
|
196
|
+
}
|
|
197
|
+
else if (item.type === 'image') {
|
|
198
|
+
return { type: 'image', data: item.data, mimeType: item.mimeType };
|
|
199
|
+
}
|
|
200
|
+
return { type: 'text', text: JSON.stringify(item) };
|
|
201
|
+
});
|
|
202
|
+
console.log(`[MCP] Tool ${toolName} completed in ${duration}ms, isError=${result.isError === true}`);
|
|
203
|
+
console.log(`[MCP] Full tool response:`, JSON.stringify(result, null, 2));
|
|
204
|
+
console.log(`[MCP] Tool response content:`);
|
|
205
|
+
for (const item of content) {
|
|
206
|
+
if (item.type === 'text') {
|
|
207
|
+
console.log(`[MCP] ${item.text}`);
|
|
208
|
+
}
|
|
209
|
+
else if (item.type === 'image') {
|
|
210
|
+
console.log(`[MCP] [Image: ${item.mimeType}]`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return {
|
|
214
|
+
content,
|
|
215
|
+
isError: result.isError === true,
|
|
216
|
+
structuredContent: result.structuredContent,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
console.error(`[MCP] Tool call error for ${toolName}:`, error);
|
|
221
|
+
return {
|
|
222
|
+
content: [{ type: 'text', text: error instanceof Error ? error.message : 'Tool execution failed' }],
|
|
223
|
+
isError: true,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
// Get or create a user-specific client
|
|
228
|
+
async getClientForUser(serverId, userId, config) {
|
|
229
|
+
const key = `${userId}:${serverId}`;
|
|
230
|
+
// Check existing client
|
|
231
|
+
const existing = this.userClients.get(key);
|
|
232
|
+
if (existing) {
|
|
233
|
+
existing.lastUsed = Date.now();
|
|
234
|
+
return existing;
|
|
235
|
+
}
|
|
236
|
+
// Get user's credential
|
|
237
|
+
const credential = await db.mCPCredential.findUnique({
|
|
238
|
+
where: {
|
|
239
|
+
userId_serverId: { userId, serverId },
|
|
240
|
+
},
|
|
241
|
+
});
|
|
242
|
+
if (!credential) {
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
// Create client with user's credentials
|
|
246
|
+
const managedClient = await this.createUserClient(config, credential);
|
|
247
|
+
if (managedClient) {
|
|
248
|
+
this.userClients.set(key, managedClient);
|
|
249
|
+
}
|
|
250
|
+
return managedClient;
|
|
251
|
+
}
|
|
252
|
+
async createClient(config) {
|
|
253
|
+
if (config.transport === 'stdio') {
|
|
254
|
+
return this.createStdioClient(config);
|
|
255
|
+
}
|
|
256
|
+
else if (config.transport === 'sse') {
|
|
257
|
+
return this.createSSEClient(config);
|
|
258
|
+
}
|
|
259
|
+
else if (config.transport === 'streamable-http') {
|
|
260
|
+
return this.createStreamableHTTPClient(config);
|
|
261
|
+
}
|
|
262
|
+
throw new Error(`Unsupported transport: ${config.transport}`);
|
|
263
|
+
}
|
|
264
|
+
async createUserClient(config, credential) {
|
|
265
|
+
if (config.transport !== 'streamable-http') {
|
|
266
|
+
throw new Error('User credentials only supported for streamable-http transport');
|
|
267
|
+
}
|
|
268
|
+
if (!config.url) {
|
|
269
|
+
throw new Error(`No URL specified for server ${config.id}`);
|
|
270
|
+
}
|
|
271
|
+
let authHeader;
|
|
272
|
+
if (credential.credentialType === 'api_key') {
|
|
273
|
+
const data = decryptCredential(credential.encryptedData);
|
|
274
|
+
authHeader = `Bearer ${data.apiKey}`;
|
|
275
|
+
}
|
|
276
|
+
else if (credential.credentialType === 'oauth') {
|
|
277
|
+
const data = decryptCredential(credential.encryptedData);
|
|
278
|
+
// Check if token is expired
|
|
279
|
+
if (isTokenExpired(data.expiresAt)) {
|
|
280
|
+
// TODO: Implement token refresh
|
|
281
|
+
throw new Error('OAuth token expired - please re-authenticate');
|
|
282
|
+
}
|
|
283
|
+
authHeader = `${data.tokenType || 'Bearer'} ${data.accessToken}`;
|
|
284
|
+
}
|
|
285
|
+
console.log(`[MCP] Connecting user client to: ${config.url}`);
|
|
286
|
+
const transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
287
|
+
requestInit: authHeader
|
|
288
|
+
? { headers: { Authorization: authHeader } }
|
|
289
|
+
: undefined,
|
|
290
|
+
});
|
|
291
|
+
const client = new Client({
|
|
292
|
+
name: 'chaaskit',
|
|
293
|
+
version: '1.0.0',
|
|
294
|
+
});
|
|
295
|
+
await client.connect(transport);
|
|
296
|
+
console.log(`[MCP] User connected to ${config.name}`);
|
|
297
|
+
// Fetch available tools
|
|
298
|
+
console.log(`[MCP] Fetching tools from ${config.name} for user...`);
|
|
299
|
+
const toolsResult = await client.listTools();
|
|
300
|
+
// Log raw tool data from MCP
|
|
301
|
+
console.log(`[MCP] ${config.name} raw tools from MCP:`);
|
|
302
|
+
for (const tool of toolsResult.tools) {
|
|
303
|
+
console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
|
|
304
|
+
}
|
|
305
|
+
const tools = toolsResult.tools.map((tool) => ({
|
|
306
|
+
name: tool.name,
|
|
307
|
+
description: tool.description,
|
|
308
|
+
inputSchema: tool.inputSchema,
|
|
309
|
+
_meta: tool._meta,
|
|
310
|
+
annotations: tool.annotations,
|
|
311
|
+
}));
|
|
312
|
+
console.log(`[MCP] ${config.name} provides ${tools.length} tools for user`);
|
|
313
|
+
return {
|
|
314
|
+
client,
|
|
315
|
+
tools,
|
|
316
|
+
transport,
|
|
317
|
+
lastUsed: Date.now(),
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
async createStdioClient(config) {
|
|
321
|
+
if (!config.command) {
|
|
322
|
+
throw new Error(`No command specified for stdio server ${config.id}`);
|
|
323
|
+
}
|
|
324
|
+
console.log(`[MCP] Connecting to stdio server: ${config.command} ${config.args?.join(' ') || ''}`);
|
|
325
|
+
// Spawn the child process
|
|
326
|
+
const childProcess = spawn(config.command, config.args || [], {
|
|
327
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
328
|
+
env: { ...process.env },
|
|
329
|
+
});
|
|
330
|
+
// Handle stderr for debugging
|
|
331
|
+
childProcess.stderr?.on('data', (data) => {
|
|
332
|
+
console.error(`[MCP:${config.id}] stderr:`, data.toString());
|
|
333
|
+
});
|
|
334
|
+
// Create transport with the child process streams
|
|
335
|
+
const transport = new StdioClientTransport({
|
|
336
|
+
command: config.command,
|
|
337
|
+
args: config.args || [],
|
|
338
|
+
});
|
|
339
|
+
// Create and connect the client
|
|
340
|
+
const client = new Client({
|
|
341
|
+
name: 'chaaskit',
|
|
342
|
+
version: '1.0.0',
|
|
343
|
+
});
|
|
344
|
+
await client.connect(transport);
|
|
345
|
+
console.log(`[MCP] Connected to ${config.name}`);
|
|
346
|
+
// Fetch available tools
|
|
347
|
+
const toolsResult = await client.listTools();
|
|
348
|
+
// Log raw tool data from MCP
|
|
349
|
+
console.log(`[MCP] ${config.name} raw tools from MCP:`);
|
|
350
|
+
for (const tool of toolsResult.tools) {
|
|
351
|
+
console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
|
|
352
|
+
}
|
|
353
|
+
const tools = toolsResult.tools.map((tool) => ({
|
|
354
|
+
name: tool.name,
|
|
355
|
+
description: tool.description,
|
|
356
|
+
inputSchema: tool.inputSchema,
|
|
357
|
+
_meta: tool._meta,
|
|
358
|
+
annotations: tool.annotations,
|
|
359
|
+
}));
|
|
360
|
+
console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
|
|
361
|
+
return {
|
|
362
|
+
client,
|
|
363
|
+
tools,
|
|
364
|
+
transport,
|
|
365
|
+
childProcess,
|
|
366
|
+
lastUsed: Date.now(),
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
async createSSEClient(config) {
|
|
370
|
+
if (!config.url) {
|
|
371
|
+
throw new Error(`No URL specified for SSE server ${config.id}`);
|
|
372
|
+
}
|
|
373
|
+
console.log(`[MCP] Connecting to SSE server: ${config.url}`);
|
|
374
|
+
// Create SSE transport
|
|
375
|
+
const transport = new SSEClientTransport(new URL(config.url));
|
|
376
|
+
// Create and connect the client
|
|
377
|
+
const client = new Client({
|
|
378
|
+
name: 'chaaskit',
|
|
379
|
+
version: '1.0.0',
|
|
380
|
+
});
|
|
381
|
+
await client.connect(transport);
|
|
382
|
+
console.log(`[MCP] Connected to ${config.name}`);
|
|
383
|
+
// Fetch available tools
|
|
384
|
+
const toolsResult = await client.listTools();
|
|
385
|
+
// Log raw tool data from MCP
|
|
386
|
+
console.log(`[MCP] ${config.name} raw tools from MCP:`);
|
|
387
|
+
for (const tool of toolsResult.tools) {
|
|
388
|
+
console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
|
|
389
|
+
}
|
|
390
|
+
const tools = toolsResult.tools.map((tool) => ({
|
|
391
|
+
name: tool.name,
|
|
392
|
+
description: tool.description,
|
|
393
|
+
inputSchema: tool.inputSchema,
|
|
394
|
+
_meta: tool._meta,
|
|
395
|
+
annotations: tool.annotations,
|
|
396
|
+
}));
|
|
397
|
+
console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
|
|
398
|
+
return {
|
|
399
|
+
client,
|
|
400
|
+
tools,
|
|
401
|
+
transport,
|
|
402
|
+
lastUsed: Date.now(),
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
async createStreamableHTTPClient(config) {
|
|
406
|
+
if (!config.url) {
|
|
407
|
+
throw new Error(`No URL specified for streamable-http server ${config.id}`);
|
|
408
|
+
}
|
|
409
|
+
console.log(`[MCP] Connecting to streamable-http server: ${config.url}`);
|
|
410
|
+
// Get auth header for admin mode
|
|
411
|
+
let authHeader;
|
|
412
|
+
if (config.authMode === 'admin' && config.adminApiKeyEnvVar) {
|
|
413
|
+
const apiKey = process.env[config.adminApiKeyEnvVar];
|
|
414
|
+
if (!apiKey) {
|
|
415
|
+
throw new Error(`Admin API key not found in env var: ${config.adminApiKeyEnvVar}`);
|
|
416
|
+
}
|
|
417
|
+
authHeader = `Bearer ${apiKey}`;
|
|
418
|
+
}
|
|
419
|
+
// Create Streamable HTTP transport
|
|
420
|
+
const transport = new StreamableHTTPClientTransport(new URL(config.url), {
|
|
421
|
+
requestInit: authHeader
|
|
422
|
+
? { headers: { Authorization: authHeader } }
|
|
423
|
+
: undefined,
|
|
424
|
+
});
|
|
425
|
+
// Create and connect the client
|
|
426
|
+
const client = new Client({
|
|
427
|
+
name: 'chaaskit',
|
|
428
|
+
version: '1.0.0',
|
|
429
|
+
});
|
|
430
|
+
await client.connect(transport);
|
|
431
|
+
console.log(`[MCP] Connected to ${config.name}`);
|
|
432
|
+
// Fetch available tools
|
|
433
|
+
const toolsResult = await client.listTools();
|
|
434
|
+
// Log raw tool data from MCP
|
|
435
|
+
console.log(`[MCP] ${config.name} raw tools from MCP:`);
|
|
436
|
+
for (const tool of toolsResult.tools) {
|
|
437
|
+
console.log(`[MCP] Raw tool: ${JSON.stringify(tool, null, 2)}`);
|
|
438
|
+
}
|
|
439
|
+
const tools = toolsResult.tools.map((tool) => ({
|
|
440
|
+
name: tool.name,
|
|
441
|
+
description: tool.description,
|
|
442
|
+
inputSchema: tool.inputSchema,
|
|
443
|
+
_meta: tool._meta,
|
|
444
|
+
annotations: tool.annotations,
|
|
445
|
+
}));
|
|
446
|
+
console.log(`[MCP] ${config.name} provides ${tools.length} tools`);
|
|
447
|
+
return {
|
|
448
|
+
client,
|
|
449
|
+
tools,
|
|
450
|
+
transport,
|
|
451
|
+
lastUsed: Date.now(),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
// List resources from a server
|
|
455
|
+
async listResources(serverId) {
|
|
456
|
+
const managedClient = this.globalClients.get(serverId);
|
|
457
|
+
if (!managedClient) {
|
|
458
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
459
|
+
}
|
|
460
|
+
try {
|
|
461
|
+
const result = await managedClient.client.listResources();
|
|
462
|
+
console.log(`[MCP] Listed ${result.resources.length} resources from ${serverId}`);
|
|
463
|
+
return result.resources.map(r => ({
|
|
464
|
+
uri: r.uri,
|
|
465
|
+
name: r.name,
|
|
466
|
+
description: r.description,
|
|
467
|
+
mimeType: r.mimeType,
|
|
468
|
+
}));
|
|
469
|
+
}
|
|
470
|
+
catch (error) {
|
|
471
|
+
console.error(`[MCP] Failed to list resources from ${serverId}:`, error);
|
|
472
|
+
return [];
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// Read a resource from a server
|
|
476
|
+
async readResource(serverId, uri) {
|
|
477
|
+
const managedClient = this.globalClients.get(serverId);
|
|
478
|
+
if (!managedClient) {
|
|
479
|
+
throw new Error(`Server ${serverId} not connected`);
|
|
480
|
+
}
|
|
481
|
+
try {
|
|
482
|
+
console.log(`[MCP] Reading resource ${uri} from ${serverId}`);
|
|
483
|
+
const result = await managedClient.client.readResource({ uri });
|
|
484
|
+
if (result.contents.length === 0) {
|
|
485
|
+
console.log(`[MCP] Resource ${uri} returned no contents`);
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
const content = result.contents[0];
|
|
489
|
+
console.log(`[MCP] Resource ${uri} read successfully, mimeType=${content.mimeType}`);
|
|
490
|
+
return {
|
|
491
|
+
text: content.text,
|
|
492
|
+
blob: content.blob,
|
|
493
|
+
mimeType: content.mimeType,
|
|
494
|
+
};
|
|
495
|
+
}
|
|
496
|
+
catch (error) {
|
|
497
|
+
console.error(`[MCP] Failed to read resource ${uri} from ${serverId}:`, error);
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
// Read a resource for a specific user (handles user-credential servers)
|
|
502
|
+
async readResourceForUser(userId, serverId, uri, config) {
|
|
503
|
+
const authMode = config.authMode || 'none';
|
|
504
|
+
// For none/admin auth modes, use global client
|
|
505
|
+
if (authMode === 'none' || authMode === 'admin') {
|
|
506
|
+
return this.readResource(serverId, uri);
|
|
507
|
+
}
|
|
508
|
+
// For user-credential modes, get user-specific client
|
|
509
|
+
try {
|
|
510
|
+
const managedClient = await this.getClientForUser(serverId, userId, config);
|
|
511
|
+
if (!managedClient) {
|
|
512
|
+
console.error(`[MCP] No user client available for ${serverId}`);
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
console.log(`[MCP] Reading resource ${uri} from ${serverId} for user ${userId}`);
|
|
516
|
+
const result = await managedClient.client.readResource({ uri });
|
|
517
|
+
if (result.contents.length === 0) {
|
|
518
|
+
console.log(`[MCP] Resource ${uri} returned no contents`);
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
521
|
+
const content = result.contents[0];
|
|
522
|
+
console.log(`[MCP] Resource ${uri} read successfully, mimeType=${content.mimeType}`);
|
|
523
|
+
return {
|
|
524
|
+
text: content.text,
|
|
525
|
+
blob: content.blob,
|
|
526
|
+
mimeType: content.mimeType,
|
|
527
|
+
};
|
|
528
|
+
}
|
|
529
|
+
catch (error) {
|
|
530
|
+
console.error(`[MCP] Failed to read resource ${uri} for user:`, error);
|
|
531
|
+
return null;
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
// Clean up all connections on shutdown
|
|
535
|
+
async disconnectAll() {
|
|
536
|
+
// Disconnect global clients
|
|
537
|
+
const globalIds = Array.from(this.globalClients.keys());
|
|
538
|
+
await Promise.all(globalIds.map(id => this.disconnect(id)));
|
|
539
|
+
// Disconnect user clients
|
|
540
|
+
const userKeys = Array.from(this.userClients.keys());
|
|
541
|
+
await Promise.all(userKeys.map(key => this.disconnectUserClient(key)));
|
|
542
|
+
// Stop cleanup interval
|
|
543
|
+
if (this.cleanupInterval) {
|
|
544
|
+
clearInterval(this.cleanupInterval);
|
|
545
|
+
this.cleanupInterval = null;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
// Singleton instance
|
|
550
|
+
export const mcpManager = new MCPClientManager();
|
|
551
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/mcp/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAElC,OAAO,EACL,iBAAiB,EAGjB,cAAc,GACf,MAAM,2BAA2B,CAAC;AAYnC,gDAAgD;AAChD,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEzC,MAAM,gBAAgB;IACpB,yCAAyC;IACjC,aAAa,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEzD,+CAA+C;IAC/C,sCAAsC;IAC9B,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEvD,0BAA0B;IAClB,eAAe,GAA0C,IAAI,CAAC;IAEtE;QACE,yBAAyB;QACzB,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;IAED,8BAA8B;IACtB,mBAAmB;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACpD,IAAI,GAAG,GAAG,aAAa,CAAC,QAAQ,GAAG,kBAAkB,EAAE,CAAC;gBACtD,OAAO,CAAC,GAAG,CAAC,wCAAwC,GAAG,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,GAAW;QAC5C,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,YAA6B;QACzC,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,oBAAoB;QAC9B,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;QAC5D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACrC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACtE,CAAC;YAED,wCAAwC;YACxC,IAAI,aAAa,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;YACpC,CAAC;YAED,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC;IAED,mFAAmF;IACnF,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,QAAgB;QACnD,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;QACpC,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,WAAW,CAAC,QAAgB;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,QAAgB;QAC9B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,gBAAgB,CAAC,CAAC;QACtD,CAAC;QACD,OAAO,aAAa,CAAC,KAAK,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAE3D,KAAK,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3D,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,mBAAmB,CACvB,MAA0B,EAC1B,aAAgC;QAEhC,MAAM,QAAQ,GAA0C,EAAE,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,IAAI,WAAW,KAAK,aAAa,CAAC,MAAM,iBAAiB,CAAC,CAAC;QAElH,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,uBAAuB,CAAC,CAAC;gBAC3E,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;YAE3C,+CAA+C;YAC/C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBAChD,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACxD,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,2BAA2B,CAAC,CAAC;oBAC/G,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;wBACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClD,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,+BAA+B,CAAC,CAAC;gBACrF,CAAC;gBACD,SAAS;YACX,CAAC;YAED,iFAAiF;YACjF,IAAI,MAAM,IAAI,CAAC,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,YAAY,CAAC,EAAE,CAAC;gBACxE,IAAI,CAAC;oBACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;oBAC7E,IAAI,aAAa,EAAE,CAAC;wBAClB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,MAAM,aAAa,CAAC,KAAK,CAAC,MAAM,yBAAyB,CAAC,CAAC;wBAC7G,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,KAAK,EAAE,CAAC;4BACvC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;wBAClD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,wBAAwB,CAAC,CAAC;oBAC9E,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,cAAc,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACpH,CAAC;YACH,CAAC;iBAAM,IAAI,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,aAAa,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,4CAA4C,CAAC,CAAC;YAClG,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,qBAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC9F,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,QAAgB,EAChB,IAA6B;QAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,gBAAgB,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,eAAe,CACnB,MAA0B,EAC1B,QAAgB,EAChB,QAAgB,EAChB,IAA6B,EAC7B,MAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;QAE3C,+CAA+C;QAC/C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACjD,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,uCAAuC,EAAE,CAAC;gBAC1E,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,+DAA+D,EAAE,CAAC;oBAClG,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC;gBACnG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,aAA4B,EAC5B,QAAgB,EAChB,QAAgB,EAChB,IAA6B;QAE7B,OAAO,CAAC,GAAG,CAAC,yBAAyB,QAAQ,cAAc,QAAQ,EAAE,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE1D,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;gBACjD,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAExC,uDAAuD;YACvD,MAAM,OAAO,GAAsB,MAAM,CAAC,OAAoF,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC1I,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACpD,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACjC,OAAO,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9E,CAAC;gBACD,OAAO,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/D,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,GAAG,CAAC,cAAc,QAAQ,iBAAiB,QAAQ,eAAe,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;YACrG,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1E,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;YAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBACzB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtC,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO;gBACP,OAAO,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;gBAChC,iBAAiB,EAAG,MAA0D,CAAC,iBAAiB;aACjG,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/D,OAAO;gBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,CAAC;gBACnG,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,gBAAgB,CACpB,QAAgB,EAChB,MAAc,EACd,MAAuB;QAEvB,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,QAAQ,EAAE,CAAC;QAEpC,wBAAwB;QACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC;YACnD,KAAK,EAAE;gBACL,eAAe,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;aACtC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wCAAwC;QACxC,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QACtE,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,aAAa,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,MAAuB;QAChD,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;YAClD,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,MAAuB,EACvB,UAA6D;QAE7D,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,IAAI,UAA8B,CAAC;QAEnC,IAAI,UAAU,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,GAAG,iBAAiB,CAAuB,UAAU,CAAC,aAAa,CAAC,CAAC;YAC/E,UAAU,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACvC,CAAC;aAAM,IAAI,UAAU,CAAC,cAAc,KAAK,OAAO,EAAE,CAAC;YACjD,MAAM,IAAI,GAAG,iBAAiB,CAAsB,UAAU,CAAC,aAAa,CAAC,CAAC;YAE9E,4BAA4B;YAC5B,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,gCAAgC;gBAChC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YAED,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACnE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,oCAAoC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAE9D,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvE,WAAW,EAAE,UAAU;gBACrB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE;gBAC5C,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEtD,wBAAwB;QACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,MAAM,CAAC,IAAI,cAAc,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAE7C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,KAAK,GAAc,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAqC;YACvD,KAAK,EAAG,IAAgC,CAAC,KAAyB;YAClE,WAAW,EAAG,IAAgC,CAAC,WAAqC;SACrF,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,aAAa,KAAK,CAAC,MAAM,iBAAiB,CAAC,CAAA;QAE3E,OAAO;YACL,MAAM;YACN,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,MAAuB;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAEnG,0BAA0B;QAC1B,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE,EAAE;YAC5D,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YAC/B,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;SACxB,CAAC,CAAC;QAEH,8BAA8B;QAC9B,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACvC,OAAO,CAAC,KAAK,CAAC,QAAQ,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,oBAAoB,CAAC;YACzC,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,EAAE;SACxB,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAE7C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,KAAK,GAAc,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAqC;YACvD,KAAK,EAAG,IAAgC,CAAC,KAAyB;YAClE,WAAW,EAAG,IAAgC,CAAC,WAAqC;SACrF,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM;YACN,KAAK;YACL,SAAS;YACT,YAAY;YACZ,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,MAAuB;QACnD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,mCAAmC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mCAAmC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAE7D,uBAAuB;QACvB,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9D,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAE7C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,KAAK,GAAc,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAqC;YACvD,KAAK,EAAG,IAAgC,CAAC,KAAyB;YAClE,WAAW,EAAG,IAAgC,CAAC,WAAqC;SACrF,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM;YACN,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,0BAA0B,CAAC,MAAuB;QAC9D,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,+CAA+C,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9E,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzE,iCAAiC;QACjC,IAAI,UAA8B,CAAC;QACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC5D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;YACrD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;YACrF,CAAC;YACD,UAAU,GAAG,UAAU,MAAM,EAAE,CAAC;QAClC,CAAC;QAED,mCAAmC;QACnC,MAAM,SAAS,GAAG,IAAI,6BAA6B,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACvE,WAAW,EAAE,UAAU;gBACrB,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE;gBAC5C,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;QAEH,gCAAgC;QAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;YACxB,IAAI,EAAE,UAAU;YAChB,OAAO,EAAE,OAAO;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,sBAAsB,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAEjD,wBAAwB;QACxB,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC;QAE7C,6BAA6B;QAC7B,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,sBAAsB,CAAC,CAAC;QACxD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,KAAK,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,MAAM,KAAK,GAAc,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACxD,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,WAAqC;YACvD,KAAK,EAAG,IAAgC,CAAC,KAAyB;YAClE,WAAW,EAAG,IAAgC,CAAC,WAAqC;SACrF,CAAC,CAAC,CAAC;QAEJ,OAAO,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,aAAa,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QAEnE,OAAO;YACL,MAAM;YACN,KAAK;YACL,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE;SACrB,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,gBAAgB,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC1D,OAAO,CAAC,GAAG,CAAC,gBAAgB,MAAM,CAAC,SAAS,CAAC,MAAM,mBAAmB,QAAQ,EAAE,CAAC,CAAC;YAClF,OAAO,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChC,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,WAAW,EAAE,CAAC,CAAC,WAAW;gBAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,uCAAuC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YACzE,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,GAAW;QAC9C,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,gBAAgB,CAAC,CAAC;QACtD,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,SAAS,QAAQ,EAAE,CAAC,CAAC;YAC9D,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAqE,CAAC;YACvG,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,gCAAgC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAErF,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,SAAS,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC/E,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,mBAAmB,CACvB,MAAc,EACd,QAAgB,EAChB,GAAW,EACX,MAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC;QAE3C,+CAA+C;QAC/C,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YAChD,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC1C,CAAC;QAED,sDAAsD;QACtD,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;YAC5E,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,sCAAsC,QAAQ,EAAE,CAAC,CAAC;gBAChE,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,SAAS,QAAQ,aAAa,MAAM,EAAE,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YAEhE,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,uBAAuB,CAAC,CAAC;gBAC1D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAqE,CAAC;YACvG,OAAO,CAAC,GAAG,CAAC,kBAAkB,GAAG,gCAAgC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAErF,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,GAAG,YAAY,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,KAAK,CAAC,aAAa;QACjB,4BAA4B;QAC5B,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAE5D,0BAA0B;QAC1B,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEvE,wBAAwB;QACxB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;IACH,CAAC;CACF;AAED,qBAAqB;AACrB,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,gBAAgB,EAAE,CAAC"}
|