integrate-sdk 0.7.66 → 0.8.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/adapters/index.js +39 -3
- package/dist/adapters/solid-start.js +39 -3
- package/dist/adapters/svelte-kit.js +39 -3
- package/dist/ai/cloudflare.d.ts +158 -0
- package/dist/ai/cloudflare.d.ts.map +1 -0
- package/dist/ai/cloudflare.js +4249 -0
- package/dist/ai/langchain.d.ts +139 -0
- package/dist/ai/langchain.d.ts.map +1 -0
- package/dist/ai/langchain.js +4237 -0
- package/dist/ai/llamaindex.d.ts +125 -0
- package/dist/ai/llamaindex.d.ts.map +1 -0
- package/dist/ai/llamaindex.js +4236 -0
- package/dist/ai/mastra.d.ts +138 -0
- package/dist/ai/mastra.d.ts.map +1 -0
- package/dist/ai/mastra.js +4240 -0
- package/dist/index.js +39 -3
- package/dist/server.js +39 -3
- package/dist/src/ai/cloudflare.d.ts +158 -0
- package/dist/src/ai/cloudflare.d.ts.map +1 -0
- package/dist/src/ai/langchain.d.ts +139 -0
- package/dist/src/ai/langchain.d.ts.map +1 -0
- package/dist/src/ai/llamaindex.d.ts +125 -0
- package/dist/src/ai/llamaindex.d.ts.map +1 -0
- package/dist/src/ai/mastra.d.ts +138 -0
- package/dist/src/ai/mastra.d.ts.map +1 -0
- package/dist/src/client.d.ts +14 -1
- package/dist/src/client.d.ts.map +1 -1
- package/dist/src/integrations/vercel-ai.d.ts +127 -0
- package/dist/src/integrations/vercel-ai.d.ts.map +1 -0
- package/dist/src/plugins/generic.d.ts +99 -0
- package/dist/src/plugins/generic.d.ts.map +1 -0
- package/dist/src/plugins/github-client.d.ts +320 -0
- package/dist/src/plugins/github-client.d.ts.map +1 -0
- package/dist/src/plugins/github.d.ts +89 -0
- package/dist/src/plugins/github.d.ts.map +1 -0
- package/dist/src/plugins/gmail-client.d.ts +106 -0
- package/dist/src/plugins/gmail-client.d.ts.map +1 -0
- package/dist/src/plugins/gmail.d.ts +87 -0
- package/dist/src/plugins/gmail.d.ts.map +1 -0
- package/dist/src/plugins/server-client.d.ts +18 -0
- package/dist/src/plugins/server-client.d.ts.map +1 -0
- package/dist/src/plugins/types.d.ts +70 -0
- package/dist/src/plugins/types.d.ts.map +1 -0
- package/package.json +1 -1
package/dist/adapters/index.js
CHANGED
|
@@ -1625,7 +1625,7 @@ class OAuthManager {
|
|
|
1625
1625
|
}
|
|
1626
1626
|
clearProviderToken(provider) {
|
|
1627
1627
|
this.providerTokens.delete(provider);
|
|
1628
|
-
if (!this.
|
|
1628
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1629
1629
|
try {
|
|
1630
1630
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
1631
1631
|
} catch (error) {
|
|
@@ -1636,7 +1636,7 @@ class OAuthManager {
|
|
|
1636
1636
|
clearAllProviderTokens() {
|
|
1637
1637
|
const providers = Array.from(this.providerTokens.keys());
|
|
1638
1638
|
this.providerTokens.clear();
|
|
1639
|
-
if (!this.
|
|
1639
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1640
1640
|
for (const provider of providers) {
|
|
1641
1641
|
try {
|
|
1642
1642
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
@@ -2315,7 +2315,28 @@ class MCPClientBase {
|
|
|
2315
2315
|
await this.oauthCallbackPromise;
|
|
2316
2316
|
this.oauthCallbackPromise = null;
|
|
2317
2317
|
}
|
|
2318
|
-
|
|
2318
|
+
try {
|
|
2319
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2320
|
+
const isAuthenticated = !!tokenData;
|
|
2321
|
+
const currentState = this.authState.get(provider);
|
|
2322
|
+
if (currentState) {
|
|
2323
|
+
currentState.authenticated = isAuthenticated;
|
|
2324
|
+
if (isAuthenticated) {
|
|
2325
|
+
currentState.lastError = undefined;
|
|
2326
|
+
}
|
|
2327
|
+
} else {
|
|
2328
|
+
this.authState.set(provider, { authenticated: isAuthenticated });
|
|
2329
|
+
}
|
|
2330
|
+
return isAuthenticated;
|
|
2331
|
+
} catch (error) {
|
|
2332
|
+
const currentState = this.authState.get(provider);
|
|
2333
|
+
if (currentState) {
|
|
2334
|
+
currentState.authenticated = false;
|
|
2335
|
+
} else {
|
|
2336
|
+
this.authState.set(provider, { authenticated: false });
|
|
2337
|
+
}
|
|
2338
|
+
return false;
|
|
2339
|
+
}
|
|
2319
2340
|
}
|
|
2320
2341
|
async authorizedProviders() {
|
|
2321
2342
|
if (this.oauthCallbackPromise) {
|
|
@@ -2343,6 +2364,21 @@ class MCPClientBase {
|
|
|
2343
2364
|
this.eventEmitter.emit("auth:error", { provider, error });
|
|
2344
2365
|
throw error;
|
|
2345
2366
|
}
|
|
2367
|
+
if (options?.useExistingConnection) {
|
|
2368
|
+
const authStatus = await this.oauthManager.checkAuthStatus(provider);
|
|
2369
|
+
if (authStatus.authorized) {
|
|
2370
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2371
|
+
if (tokenData) {
|
|
2372
|
+
this.eventEmitter.emit("auth:complete", {
|
|
2373
|
+
provider,
|
|
2374
|
+
accessToken: tokenData.accessToken,
|
|
2375
|
+
expiresAt: tokenData.expiresAt
|
|
2376
|
+
});
|
|
2377
|
+
this.authState.set(provider, { authenticated: true });
|
|
2378
|
+
}
|
|
2379
|
+
return;
|
|
2380
|
+
}
|
|
2381
|
+
}
|
|
2346
2382
|
this.eventEmitter.emit("auth:started", { provider });
|
|
2347
2383
|
try {
|
|
2348
2384
|
await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
|
|
@@ -1484,7 +1484,7 @@ class OAuthManager {
|
|
|
1484
1484
|
}
|
|
1485
1485
|
clearProviderToken(provider) {
|
|
1486
1486
|
this.providerTokens.delete(provider);
|
|
1487
|
-
if (!this.
|
|
1487
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1488
1488
|
try {
|
|
1489
1489
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
1490
1490
|
} catch (error) {
|
|
@@ -1495,7 +1495,7 @@ class OAuthManager {
|
|
|
1495
1495
|
clearAllProviderTokens() {
|
|
1496
1496
|
const providers = Array.from(this.providerTokens.keys());
|
|
1497
1497
|
this.providerTokens.clear();
|
|
1498
|
-
if (!this.
|
|
1498
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1499
1499
|
for (const provider of providers) {
|
|
1500
1500
|
try {
|
|
1501
1501
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
@@ -2174,7 +2174,28 @@ class MCPClientBase {
|
|
|
2174
2174
|
await this.oauthCallbackPromise;
|
|
2175
2175
|
this.oauthCallbackPromise = null;
|
|
2176
2176
|
}
|
|
2177
|
-
|
|
2177
|
+
try {
|
|
2178
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2179
|
+
const isAuthenticated = !!tokenData;
|
|
2180
|
+
const currentState = this.authState.get(provider);
|
|
2181
|
+
if (currentState) {
|
|
2182
|
+
currentState.authenticated = isAuthenticated;
|
|
2183
|
+
if (isAuthenticated) {
|
|
2184
|
+
currentState.lastError = undefined;
|
|
2185
|
+
}
|
|
2186
|
+
} else {
|
|
2187
|
+
this.authState.set(provider, { authenticated: isAuthenticated });
|
|
2188
|
+
}
|
|
2189
|
+
return isAuthenticated;
|
|
2190
|
+
} catch (error) {
|
|
2191
|
+
const currentState = this.authState.get(provider);
|
|
2192
|
+
if (currentState) {
|
|
2193
|
+
currentState.authenticated = false;
|
|
2194
|
+
} else {
|
|
2195
|
+
this.authState.set(provider, { authenticated: false });
|
|
2196
|
+
}
|
|
2197
|
+
return false;
|
|
2198
|
+
}
|
|
2178
2199
|
}
|
|
2179
2200
|
async authorizedProviders() {
|
|
2180
2201
|
if (this.oauthCallbackPromise) {
|
|
@@ -2202,6 +2223,21 @@ class MCPClientBase {
|
|
|
2202
2223
|
this.eventEmitter.emit("auth:error", { provider, error });
|
|
2203
2224
|
throw error;
|
|
2204
2225
|
}
|
|
2226
|
+
if (options?.useExistingConnection) {
|
|
2227
|
+
const authStatus = await this.oauthManager.checkAuthStatus(provider);
|
|
2228
|
+
if (authStatus.authorized) {
|
|
2229
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2230
|
+
if (tokenData) {
|
|
2231
|
+
this.eventEmitter.emit("auth:complete", {
|
|
2232
|
+
provider,
|
|
2233
|
+
accessToken: tokenData.accessToken,
|
|
2234
|
+
expiresAt: tokenData.expiresAt
|
|
2235
|
+
});
|
|
2236
|
+
this.authState.set(provider, { authenticated: true });
|
|
2237
|
+
}
|
|
2238
|
+
return;
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2205
2241
|
this.eventEmitter.emit("auth:started", { provider });
|
|
2206
2242
|
try {
|
|
2207
2243
|
await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
|
|
@@ -1484,7 +1484,7 @@ class OAuthManager {
|
|
|
1484
1484
|
}
|
|
1485
1485
|
clearProviderToken(provider) {
|
|
1486
1486
|
this.providerTokens.delete(provider);
|
|
1487
|
-
if (!this.
|
|
1487
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1488
1488
|
try {
|
|
1489
1489
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
1490
1490
|
} catch (error) {
|
|
@@ -1495,7 +1495,7 @@ class OAuthManager {
|
|
|
1495
1495
|
clearAllProviderTokens() {
|
|
1496
1496
|
const providers = Array.from(this.providerTokens.keys());
|
|
1497
1497
|
this.providerTokens.clear();
|
|
1498
|
-
if (!this.
|
|
1498
|
+
if (!this.skipLocalStorage && typeof window !== "undefined" && window.localStorage) {
|
|
1499
1499
|
for (const provider of providers) {
|
|
1500
1500
|
try {
|
|
1501
1501
|
window.localStorage.removeItem(`integrate_token_${provider}`);
|
|
@@ -2174,7 +2174,28 @@ class MCPClientBase {
|
|
|
2174
2174
|
await this.oauthCallbackPromise;
|
|
2175
2175
|
this.oauthCallbackPromise = null;
|
|
2176
2176
|
}
|
|
2177
|
-
|
|
2177
|
+
try {
|
|
2178
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2179
|
+
const isAuthenticated = !!tokenData;
|
|
2180
|
+
const currentState = this.authState.get(provider);
|
|
2181
|
+
if (currentState) {
|
|
2182
|
+
currentState.authenticated = isAuthenticated;
|
|
2183
|
+
if (isAuthenticated) {
|
|
2184
|
+
currentState.lastError = undefined;
|
|
2185
|
+
}
|
|
2186
|
+
} else {
|
|
2187
|
+
this.authState.set(provider, { authenticated: isAuthenticated });
|
|
2188
|
+
}
|
|
2189
|
+
return isAuthenticated;
|
|
2190
|
+
} catch (error) {
|
|
2191
|
+
const currentState = this.authState.get(provider);
|
|
2192
|
+
if (currentState) {
|
|
2193
|
+
currentState.authenticated = false;
|
|
2194
|
+
} else {
|
|
2195
|
+
this.authState.set(provider, { authenticated: false });
|
|
2196
|
+
}
|
|
2197
|
+
return false;
|
|
2198
|
+
}
|
|
2178
2199
|
}
|
|
2179
2200
|
async authorizedProviders() {
|
|
2180
2201
|
if (this.oauthCallbackPromise) {
|
|
@@ -2202,6 +2223,21 @@ class MCPClientBase {
|
|
|
2202
2223
|
this.eventEmitter.emit("auth:error", { provider, error });
|
|
2203
2224
|
throw error;
|
|
2204
2225
|
}
|
|
2226
|
+
if (options?.useExistingConnection) {
|
|
2227
|
+
const authStatus = await this.oauthManager.checkAuthStatus(provider);
|
|
2228
|
+
if (authStatus.authorized) {
|
|
2229
|
+
const tokenData = await this.oauthManager.getProviderToken(provider);
|
|
2230
|
+
if (tokenData) {
|
|
2231
|
+
this.eventEmitter.emit("auth:complete", {
|
|
2232
|
+
provider,
|
|
2233
|
+
accessToken: tokenData.accessToken,
|
|
2234
|
+
expiresAt: tokenData.expiresAt
|
|
2235
|
+
});
|
|
2236
|
+
this.authState.set(provider, { authenticated: true });
|
|
2237
|
+
}
|
|
2238
|
+
return;
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2205
2241
|
this.eventEmitter.emit("auth:started", { provider });
|
|
2206
2242
|
try {
|
|
2207
2243
|
await this.oauthManager.initiateFlow(provider, integration.oauth, options?.returnUrl);
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare Workers AI Integration
|
|
3
|
+
*
|
|
4
|
+
* Helper functions to convert MCP tools to Cloudflare Workers AI format
|
|
5
|
+
*/
|
|
6
|
+
import type { MCPClient } from "../client.js";
|
|
7
|
+
import type { MCPTool } from "../protocol/messages.js";
|
|
8
|
+
import { type AIToolsOptions } from "./utils.js";
|
|
9
|
+
/**
|
|
10
|
+
* Cloudflare AI tool definition
|
|
11
|
+
* Compatible with Cloudflare Workers AI
|
|
12
|
+
*/
|
|
13
|
+
export interface CloudflareTool {
|
|
14
|
+
type: 'function';
|
|
15
|
+
function: {
|
|
16
|
+
name: string;
|
|
17
|
+
description: string;
|
|
18
|
+
parameters: {
|
|
19
|
+
type: 'object';
|
|
20
|
+
properties: Record<string, {
|
|
21
|
+
type: string;
|
|
22
|
+
description?: string;
|
|
23
|
+
}>;
|
|
24
|
+
required: string[];
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Options for converting MCP tools to Cloudflare format
|
|
30
|
+
*/
|
|
31
|
+
export interface CloudflareToolsOptions extends AIToolsOptions {
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Convert a single MCP tool to Cloudflare Workers AI format
|
|
35
|
+
*
|
|
36
|
+
* @param mcpTool - The MCP tool definition
|
|
37
|
+
* @param client - The MCP client instance (used for executing the tool)
|
|
38
|
+
* @param options - Optional configuration including provider tokens
|
|
39
|
+
* @returns Cloudflare compatible tool definition
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const cloudflareTool = convertMCPToolToCloudflare(mcpTool, client);
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function convertMCPToolToCloudflare(mcpTool: MCPTool, _client: MCPClient<any>, _options?: CloudflareToolsOptions): CloudflareTool;
|
|
47
|
+
/**
|
|
48
|
+
* Convert all enabled MCP tools to Cloudflare Workers AI format
|
|
49
|
+
* Returns a dictionary keyed by tool name
|
|
50
|
+
*
|
|
51
|
+
* @param client - The MCP client instance (must be connected)
|
|
52
|
+
* @param options - Optional configuration including provider tokens
|
|
53
|
+
* @returns Dictionary of Cloudflare compatible tool definitions
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // Client-side usage
|
|
58
|
+
* const tools = convertMCPToolsToCloudflare(mcpClient);
|
|
59
|
+
*
|
|
60
|
+
* // Server-side with provider tokens
|
|
61
|
+
* const tools = convertMCPToolsToCloudflare(serverClient, {
|
|
62
|
+
* providerTokens: { github: 'ghp_...', gmail: 'ya29...' }
|
|
63
|
+
* });
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
export declare function convertMCPToolsToCloudflare(client: MCPClient<any>, options?: CloudflareToolsOptions): Record<string, CloudflareTool>;
|
|
67
|
+
/**
|
|
68
|
+
* Execute a tool call from Cloudflare Workers AI
|
|
69
|
+
*
|
|
70
|
+
* @param client - The MCP client instance
|
|
71
|
+
* @param toolCall - The tool call with name and arguments
|
|
72
|
+
* @param options - Optional configuration including provider tokens
|
|
73
|
+
* @returns Tool execution result as JSON string
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const result = await executeCloudflareToolCall(client, {
|
|
78
|
+
* name: 'github_create_issue',
|
|
79
|
+
* arguments: { owner: 'user', repo: 'repo', title: 'Bug' }
|
|
80
|
+
* }, { providerTokens });
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function executeCloudflareToolCall(client: MCPClient<any>, toolCall: {
|
|
84
|
+
name: string;
|
|
85
|
+
arguments: Record<string, unknown> | string;
|
|
86
|
+
}, options?: CloudflareToolsOptions): Promise<string>;
|
|
87
|
+
/**
|
|
88
|
+
* Get tools in a format compatible with Cloudflare Workers AI
|
|
89
|
+
*
|
|
90
|
+
* Automatically connects the client if not already connected.
|
|
91
|
+
*
|
|
92
|
+
* @param client - The MCP client instance
|
|
93
|
+
* @param options - Optional configuration including provider tokens for server-side usage
|
|
94
|
+
* @returns Dictionary of tools ready to use with Cloudflare Workers AI
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* // Cloudflare Worker usage
|
|
99
|
+
* import { createMCPClient, githubIntegration } from 'integrate-sdk';
|
|
100
|
+
* import { getCloudflareTools, executeCloudflareToolCall } from 'integrate-sdk/ai/cloudflare';
|
|
101
|
+
*
|
|
102
|
+
* export default {
|
|
103
|
+
* async fetch(request: Request, env: Env): Promise<Response> {
|
|
104
|
+
* const client = createMCPClient({
|
|
105
|
+
* integrations: [githubIntegration({ clientId: env.GITHUB_CLIENT_ID })],
|
|
106
|
+
* });
|
|
107
|
+
*
|
|
108
|
+
* const tools = await getCloudflareTools(client);
|
|
109
|
+
* const ai = new Ai(env.AI);
|
|
110
|
+
*
|
|
111
|
+
* const response = await ai.run('@cf/meta/llama-3-8b-instruct', {
|
|
112
|
+
* messages: [{ role: 'user', content: 'Create a GitHub issue' }],
|
|
113
|
+
* tools: Object.values(tools)
|
|
114
|
+
* });
|
|
115
|
+
*
|
|
116
|
+
* return Response.json(response);
|
|
117
|
+
* }
|
|
118
|
+
* };
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* // Server-side usage with tokens from client
|
|
124
|
+
* import { createMCPServer, githubIntegration } from 'integrate-sdk/server';
|
|
125
|
+
* import { getCloudflareTools, executeCloudflareToolCall } from 'integrate-sdk/ai/cloudflare';
|
|
126
|
+
*
|
|
127
|
+
* const { client: serverClient } = createMCPServer({
|
|
128
|
+
* integrations: [githubIntegration({
|
|
129
|
+
* clientId: '...',
|
|
130
|
+
* clientSecret: '...'
|
|
131
|
+
* })],
|
|
132
|
+
* });
|
|
133
|
+
*
|
|
134
|
+
* // In your API route
|
|
135
|
+
* export async function POST(req: Request) {
|
|
136
|
+
* const providerTokens = JSON.parse(req.headers.get('x-integrate-tokens') || '{}');
|
|
137
|
+
* const tools = await getCloudflareTools(serverClient, { providerTokens });
|
|
138
|
+
*
|
|
139
|
+
* // Use with Cloudflare AI
|
|
140
|
+
* const ai = new Ai(env.AI);
|
|
141
|
+
* const response = await ai.run('@cf/meta/llama-3-8b-instruct', {
|
|
142
|
+
* messages: [{ role: 'user', content: 'Create a GitHub issue' }],
|
|
143
|
+
* tools: Object.values(tools)
|
|
144
|
+
* });
|
|
145
|
+
*
|
|
146
|
+
* // Handle tool calls
|
|
147
|
+
* if (response.tool_calls) {
|
|
148
|
+
* for (const toolCall of response.tool_calls) {
|
|
149
|
+
* await executeCloudflareToolCall(serverClient, toolCall, { providerTokens });
|
|
150
|
+
* }
|
|
151
|
+
* }
|
|
152
|
+
*
|
|
153
|
+
* return Response.json(response);
|
|
154
|
+
* }
|
|
155
|
+
* ```
|
|
156
|
+
*/
|
|
157
|
+
export declare function getCloudflareTools(client: MCPClient<any>, options?: CloudflareToolsOptions): Promise<Record<string, CloudflareTool>>;
|
|
158
|
+
//# sourceMappingURL=cloudflare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloudflare.d.ts","sourceRoot":"","sources":["../../../src/ai/cloudflare.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAkE,KAAK,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjH;;;GAGG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ,CAAC;YACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;gBACzB,IAAI,EAAE,MAAM,CAAC;gBACb,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC,CAAC;YACH,QAAQ,EAAE,MAAM,EAAE,CAAC;SACpB,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,cAAc;CAAI;AAElE;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,EACvB,QAAQ,CAAC,EAAE,sBAAsB,GAChC,cAAc,CAahB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAShC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,QAAQ,EAAE;IACR,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CAC7C,EACD,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAOjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqEG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,EACtB,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAezC"}
|