@mcp-abap-adt/connection 0.1.14 โ 0.2.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/README.md +34 -95
- package/dist/connection/AbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.d.ts +6 -44
- package/dist/connection/AbstractAbapConnection.d.ts.map +1 -1
- package/dist/connection/AbstractAbapConnection.js +62 -234
- package/dist/connection/BaseAbapConnection.d.ts +2 -2
- package/dist/connection/BaseAbapConnection.d.ts.map +1 -1
- package/dist/connection/BaseAbapConnection.js +6 -9
- package/dist/connection/JwtAbapConnection.d.ts +8 -16
- package/dist/connection/JwtAbapConnection.d.ts.map +1 -1
- package/dist/connection/JwtAbapConnection.js +24 -248
- package/dist/connection/connectionFactory.d.ts +2 -2
- package/dist/connection/connectionFactory.d.ts.map +1 -1
- package/dist/connection/connectionFactory.js +3 -3
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -4
- package/dist/logger.d.ts +2 -3
- package/dist/logger.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/utils/FileSessionStorage.d.ts +0 -73
- package/dist/utils/FileSessionStorage.d.ts.map +0 -1
- package/dist/utils/FileSessionStorage.js +0 -191
package/README.md
CHANGED
|
@@ -7,15 +7,12 @@ ABAP connection layer for MCP ABAP ADT server. Provides a unified interface for
|
|
|
7
7
|
- ๐ **Multiple Authentication Methods**:
|
|
8
8
|
- Basic Auth for on-premise SAP systems
|
|
9
9
|
- JWT/OAuth2 for SAP BTP ABAP Environment
|
|
10
|
-
- ๐ **
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
- Persistent session management with CSRF tokens and cookies
|
|
17
|
-
- Custom storage backends (file system, database, Redis, etc.)
|
|
18
|
-
- Automatic session state save/load
|
|
10
|
+
- ๐ **Token Management**:
|
|
11
|
+
- Token refresh is handled by `@mcp-abap-adt/auth-broker` package
|
|
12
|
+
- Connection package focuses on HTTP communication only
|
|
13
|
+
- ๐พ **Session Management**:
|
|
14
|
+
- Session headers management (cookies, CSRF tokens)
|
|
15
|
+
- Session state persistence is handled by `@mcp-abap-adt/auth-broker` package
|
|
19
16
|
- ๐๏ธ **Clean Architecture**:
|
|
20
17
|
- Abstract base class for common HTTP/session logic
|
|
21
18
|
- Auth-type specific implementations (BaseAbapConnection, JwtAbapConnection)
|
|
@@ -42,9 +39,9 @@ The package uses a clean separation of concerns:
|
|
|
42
39
|
|
|
43
40
|
- **`JwtAbapConnection`** (concrete, exported):
|
|
44
41
|
- JWT/OAuth2 Authentication implementation
|
|
45
|
-
-
|
|
46
|
-
- Permission vs auth error detection
|
|
42
|
+
- Simple connect() - establishes connection with JWT token
|
|
47
43
|
- Suitable for SAP BTP ABAP Environment
|
|
44
|
+
- Token refresh handled by auth-broker package
|
|
48
45
|
|
|
49
46
|
## Responsibilities and Design Principles
|
|
50
47
|
|
|
@@ -71,21 +68,19 @@ This package is responsible for:
|
|
|
71
68
|
1. **HTTP communication with SAP systems**: Makes HTTP requests to SAP ABAP systems via ADT protocol
|
|
72
69
|
2. **Authentication handling**: Supports Basic Auth and JWT/OAuth2 authentication methods
|
|
73
70
|
3. **Session management**: Manages cookies, CSRF tokens, and session state
|
|
74
|
-
4. **
|
|
75
|
-
5. **Error handling**: Distinguishes between authentication errors and permission errors
|
|
71
|
+
4. **Error handling**: Handles HTTP errors and connection issues
|
|
76
72
|
|
|
77
73
|
#### What This Package Does
|
|
78
74
|
|
|
79
75
|
- **Provides connection abstraction**: `AbapConnection` interface for interacting with SAP systems
|
|
80
76
|
- **Handles HTTP requests**: Makes requests to SAP ADT endpoints with proper headers and authentication
|
|
81
77
|
- **Manages sessions**: Handles cookies, CSRF tokens, and session state persistence
|
|
82
|
-
- **Refreshes tokens**: Automatically refreshes expired JWT tokens when detected
|
|
83
|
-
- **Validates tokens**: Detects expired tokens by analyzing HTTP response codes (401/403)
|
|
84
78
|
|
|
85
79
|
#### What This Package Does NOT Do
|
|
86
80
|
|
|
87
81
|
- **Does NOT obtain tokens**: Token acquisition is handled by `@mcp-abap-adt/auth-providers` and `@mcp-abap-adt/auth-broker`
|
|
88
82
|
- **Does NOT store tokens**: Token storage is handled by `@mcp-abap-adt/auth-stores`
|
|
83
|
+
- **Does NOT refresh tokens**: Token refresh is handled by `@mcp-abap-adt/auth-broker`
|
|
89
84
|
- **Does NOT orchestrate authentication**: Token lifecycle management is handled by `@mcp-abap-adt/auth-broker`
|
|
90
85
|
- **Does NOT know about destinations**: Destination-based authentication is handled by consumers
|
|
91
86
|
- **Does NOT handle OAuth2 flows**: OAuth2 flows are handled by token providers
|
|
@@ -95,25 +90,19 @@ This package is responsible for:
|
|
|
95
90
|
This package interacts with external packages **ONLY through interfaces**:
|
|
96
91
|
|
|
97
92
|
- **Logger interface**: Uses `ILogger` interface for logging - does not know about concrete logger implementation
|
|
98
|
-
- **Session storage interface**: Uses `ISessionStorage` interface for session persistence - does not know about concrete storage implementation
|
|
99
93
|
- **No direct dependencies on auth packages**: All token-related operations are handled through configuration (`SapConfig`) passed by consumers
|
|
100
94
|
|
|
101
95
|
## Documentation
|
|
102
96
|
|
|
103
97
|
- ๐ฆ **[Installation Guide](./docs/INSTALLATION.md)** - Setup and installation instructions
|
|
104
98
|
- ๐ **[Usage Guide](./docs/USAGE.md)** - Detailed usage examples and API documentation
|
|
105
|
-
- ๐งช **[Testing Guide](./docs/AUTO_REFRESH_TESTING.md)** - Auto-refresh testing and troubleshooting
|
|
106
|
-
- ๐ง **[Session Storage](./docs/CUSTOM_SESSION_STORAGE.md)** - Custom session storage implementation
|
|
107
|
-
- ๐ **[Stateful Session Guide (Connection)](./docs/STATEFUL_SESSION_GUIDE.md)** - Cookies, CSRF tokens, and session storage responsibilities
|
|
108
99
|
- ๐ก **[Examples](./examples/)** - Working code examples
|
|
109
100
|
|
|
110
101
|
## Features
|
|
111
102
|
|
|
112
103
|
- ๐ **Multiple Authentication Methods**: Basic Auth for on-premise systems, JWT/OAuth2 for SAP BTP ABAP Environment
|
|
113
|
-
-
|
|
114
|
-
-
|
|
115
|
-
- ๐ **Custom Logging**: Pluggable logger interface for integration with any logging system
|
|
116
|
-
- ๐ ๏ธ **CLI Tool**: Built-in authentication helper for SAP BTP service key authentication
|
|
104
|
+
- ๐พ **Session Management**: Session headers management (cookies, CSRF tokens) for HTTP communication
|
|
105
|
+
- ๐ **Custom Logging**: Pluggable logger interface for integration with any logging system (optional)
|
|
117
106
|
- ๐ฆ **TypeScript**: Full TypeScript support with type definitions included
|
|
118
107
|
- โก **Timeout Management**: Configurable timeouts for different operation types
|
|
119
108
|
|
|
@@ -158,22 +147,17 @@ const response = await connection.makeAdtRequest({
|
|
|
158
147
|
});
|
|
159
148
|
```
|
|
160
149
|
|
|
161
|
-
### Cloud Usage (JWT/OAuth2
|
|
150
|
+
### Cloud Usage (JWT/OAuth2)
|
|
162
151
|
|
|
163
152
|
```typescript
|
|
164
153
|
import { createAbapConnection, SapConfig } from "@mcp-abap-adt/connection";
|
|
165
154
|
|
|
166
|
-
// JWT configuration
|
|
155
|
+
// JWT configuration
|
|
167
156
|
const config: SapConfig = {
|
|
168
157
|
url: "https://your-instance.abap.cloud.sap",
|
|
169
158
|
client: "100", // Optional
|
|
170
159
|
authType: "jwt",
|
|
171
160
|
jwtToken: "your-jwt-token-here", // Obtained via OAuth2 flow
|
|
172
|
-
// For auto-refresh support:
|
|
173
|
-
refreshToken: "your-refresh-token",
|
|
174
|
-
uaaUrl: "https://your-tenant.authentication.cert.eu10.hana.ondemand.com",
|
|
175
|
-
uaaClientId: "your-client-id",
|
|
176
|
-
uaaClientSecret: "your-client-secret",
|
|
177
161
|
};
|
|
178
162
|
|
|
179
163
|
const logger = {
|
|
@@ -183,20 +167,14 @@ const logger = {
|
|
|
183
167
|
debug: (msg: string, meta?: any) => console.debug(msg, meta),
|
|
184
168
|
};
|
|
185
169
|
|
|
170
|
+
// Logger is optional - if not provided, no logging output
|
|
186
171
|
const connection = createAbapConnection(config, logger);
|
|
187
172
|
|
|
188
|
-
// Token
|
|
173
|
+
// Note: Token refresh is handled by @mcp-abap-adt/auth-broker package
|
|
189
174
|
const response = await connection.makeAdtRequest({
|
|
190
175
|
method: "GET",
|
|
191
176
|
url: "/sap/bc/adt/programs/programs/your-program",
|
|
192
177
|
});
|
|
193
|
-
|
|
194
|
-
// How auto-refresh works:
|
|
195
|
-
// 1. If JWT token expired โ SAP returns 401/403
|
|
196
|
-
// 2. Connection detects this is auth error (not permission error)
|
|
197
|
-
// 3. Automatically calls refresh token endpoint
|
|
198
|
-
// 4. Retries the request with new token
|
|
199
|
-
// 5. User doesn't need to handle this manually
|
|
200
178
|
```
|
|
201
179
|
|
|
202
180
|
### Stateful Sessions
|
|
@@ -204,46 +182,21 @@ const response = await connection.makeAdtRequest({
|
|
|
204
182
|
For operations that require session state (e.g., object modifications), you can enable stateful sessions:
|
|
205
183
|
|
|
206
184
|
```typescript
|
|
207
|
-
import {
|
|
208
|
-
createAbapConnection,
|
|
209
|
-
ISessionStorage,
|
|
210
|
-
SessionState,
|
|
211
|
-
} from "@mcp-abap-adt/connection";
|
|
212
|
-
|
|
213
|
-
// Implement session storage (e.g., file system, database, memory)
|
|
214
|
-
class FileSessionStorage implements ISessionStorage {
|
|
215
|
-
async save(sessionId: string, state: SessionState): Promise<void> {
|
|
216
|
-
// Save to file system
|
|
217
|
-
await fs.writeFile(
|
|
218
|
-
`sessions/${sessionId}.json`,
|
|
219
|
-
JSON.stringify(state, null, 2)
|
|
220
|
-
);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
async load(sessionId: string): Promise<SessionState | null> {
|
|
224
|
-
// Load from file system
|
|
225
|
-
const data = await fs.readFile(`sessions/${sessionId}.json`, "utf-8");
|
|
226
|
-
return JSON.parse(data);
|
|
227
|
-
}
|
|
228
|
-
|
|
229
|
-
async delete(sessionId: string): Promise<void> {
|
|
230
|
-
// Delete from file system
|
|
231
|
-
await fs.unlink(`sessions/${sessionId}.json`);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
185
|
+
import { createAbapConnection } from "@mcp-abap-adt/connection";
|
|
234
186
|
|
|
235
187
|
const connection = createAbapConnection(config, logger);
|
|
236
|
-
const sessionStorage = new FileSessionStorage();
|
|
237
188
|
|
|
238
|
-
// Enable stateful session
|
|
239
|
-
|
|
189
|
+
// Enable stateful session mode (adds x-sap-adt-sessiontype: stateful header)
|
|
190
|
+
connection.setSessionType("stateful");
|
|
240
191
|
|
|
241
|
-
//
|
|
192
|
+
// Make requests - SAP will maintain session state
|
|
242
193
|
await connection.makeAdtRequest({
|
|
243
194
|
method: "POST",
|
|
244
195
|
url: "/sap/bc/adt/objects/domains",
|
|
245
196
|
data: { /* domain data */ },
|
|
246
197
|
});
|
|
198
|
+
|
|
199
|
+
// Note: Session state persistence is handled by @mcp-abap-adt/auth-broker package
|
|
247
200
|
```
|
|
248
201
|
|
|
249
202
|
### Custom Logger
|
|
@@ -369,17 +322,16 @@ Main interface for ABAP connections.
|
|
|
369
322
|
interface AbapConnection {
|
|
370
323
|
makeAdtRequest(options: AbapRequestOptions): Promise<AxiosResponse>;
|
|
371
324
|
reset(): void;
|
|
372
|
-
enableStatefulSession(sessionId: string, storage: ISessionStorage): Promise<void>;
|
|
373
|
-
disableStatefulSession(): void;
|
|
374
|
-
getSessionMode(): "stateless" | "stateful";
|
|
375
|
-
getSessionId(): string | undefined; // Get current session ID
|
|
376
325
|
setSessionType(type: "stateless" | "stateful"): void; // Switch session type
|
|
326
|
+
getSessionMode(): "stateless" | "stateful"; // Get current session mode
|
|
327
|
+
getSessionId(): string | null; // Get current session ID
|
|
377
328
|
}
|
|
378
329
|
```
|
|
379
330
|
|
|
380
|
-
**
|
|
381
|
-
- `
|
|
382
|
-
- `
|
|
331
|
+
**Session Management:**
|
|
332
|
+
- `setSessionType(type)`: Programmatically switch between stateful and stateless modes
|
|
333
|
+
- `getSessionMode()`: Returns current session mode
|
|
334
|
+
- `getSessionId()`: Returns the current session ID (auto-generated UUID)
|
|
383
335
|
|
|
384
336
|
#### `ILogger`
|
|
385
337
|
|
|
@@ -396,29 +348,16 @@ interface ILogger {
|
|
|
396
348
|
}
|
|
397
349
|
```
|
|
398
350
|
|
|
399
|
-
#### `ISessionStorage`
|
|
400
|
-
|
|
401
|
-
Interface for session state persistence.
|
|
402
|
-
|
|
403
|
-
```typescript
|
|
404
|
-
interface ISessionStorage {
|
|
405
|
-
save(sessionId: string, state: SessionState): Promise<void>;
|
|
406
|
-
load(sessionId: string): Promise<SessionState | null>;
|
|
407
|
-
delete(sessionId: string): Promise<void>;
|
|
408
|
-
}
|
|
409
|
-
```
|
|
410
|
-
|
|
411
351
|
### Functions
|
|
412
352
|
|
|
413
|
-
#### `createAbapConnection(config, logger
|
|
353
|
+
#### `createAbapConnection(config, logger?, sessionId?)`
|
|
414
354
|
|
|
415
355
|
Factory function to create an ABAP connection instance.
|
|
416
356
|
|
|
417
357
|
```typescript
|
|
418
358
|
function createAbapConnection(
|
|
419
359
|
config: SapConfig,
|
|
420
|
-
logger
|
|
421
|
-
sessionStorage?: ISessionStorage,
|
|
360
|
+
logger?: ILogger | null,
|
|
422
361
|
sessionId?: string
|
|
423
362
|
): AbapConnection;
|
|
424
363
|
```
|
|
@@ -492,14 +431,14 @@ See [PR Proposal](./PR_PROPOSAL_CSRF_CONFIG.md) for more details.
|
|
|
492
431
|
|
|
493
432
|
See [CHANGELOG.md](./CHANGELOG.md) for detailed version history and breaking changes.
|
|
494
433
|
|
|
495
|
-
**Latest version: 0.
|
|
496
|
-
-
|
|
497
|
-
-
|
|
434
|
+
**Latest version: 0.2.0**
|
|
435
|
+
- Removed token refresh functionality (handled by `@mcp-abap-adt/auth-broker`)
|
|
436
|
+
- Removed session storage functionality (handled by `@mcp-abap-adt/auth-broker`)
|
|
437
|
+
- Logger is now optional
|
|
498
438
|
- See [CHANGELOG.md](./CHANGELOG.md) for full details
|
|
499
439
|
|
|
500
440
|
## Documentation
|
|
501
441
|
|
|
502
|
-
- [Custom Session Storage](./docs/CUSTOM_SESSION_STORAGE.md) - How to implement custom session persistence (database, Redis, etc.)
|
|
503
442
|
- [Examples](./examples/README.md) - Working code examples
|
|
504
443
|
- [Changelog](./CHANGELOG.md) - Version history and release notes
|
|
505
444
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbapConnection.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAGrF,MAAM,MAAM,kBAAkB,GAAG,mBAAmB,CAAC;AACrD,MAAM,MAAM,cAAc,GAAG,eAAe,CAAC"}
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import { AxiosResponse } from "axios";
|
|
2
|
-
import { ILogger
|
|
2
|
+
import { ILogger } from "../logger.js";
|
|
3
3
|
import { SapConfig } from "../config/sapConfig.js";
|
|
4
4
|
import { AbapConnection, AbapRequestOptions } from "./AbapConnection.js";
|
|
5
5
|
declare abstract class AbstractAbapConnection implements AbapConnection {
|
|
6
6
|
private readonly config;
|
|
7
|
-
protected readonly logger: ILogger;
|
|
7
|
+
protected readonly logger: ILogger | null;
|
|
8
8
|
private axiosInstance;
|
|
9
9
|
private csrfToken;
|
|
10
10
|
private cookies;
|
|
11
11
|
private cookieStore;
|
|
12
12
|
private baseUrl;
|
|
13
13
|
private sessionId;
|
|
14
|
-
private sessionStorage;
|
|
15
14
|
private sessionMode;
|
|
16
|
-
protected constructor(config: SapConfig, logger: ILogger
|
|
15
|
+
protected constructor(config: SapConfig, logger: ILogger | null, sessionId?: string);
|
|
17
16
|
/**
|
|
18
17
|
* Set session type (stateful or stateless)
|
|
19
18
|
* Controls whether x-sap-adt-sessiontype: stateful header is added to requests
|
|
@@ -24,64 +23,27 @@ declare abstract class AbstractAbapConnection implements AbapConnection {
|
|
|
24
23
|
/**
|
|
25
24
|
* Enable stateful session mode (tells SAP to maintain stateful session)
|
|
26
25
|
* This controls whether x-sap-adt-sessiontype: stateful header is used
|
|
27
|
-
* Storage is controlled separately via setSessionStorage()
|
|
28
26
|
* @deprecated Use setSessionType("stateful") instead
|
|
29
27
|
*/
|
|
30
28
|
enableStatefulSession(): void;
|
|
31
29
|
/**
|
|
32
30
|
* Disable stateful session mode (switch to stateless)
|
|
33
|
-
* Optionally saves current state before switching
|
|
34
31
|
* @deprecated Use setSessionType("stateless") instead
|
|
35
32
|
*/
|
|
36
|
-
disableStatefulSession(
|
|
33
|
+
disableStatefulSession(): void;
|
|
37
34
|
/**
|
|
38
35
|
* Get current session mode
|
|
39
36
|
*/
|
|
40
37
|
getSessionMode(): "stateless" | "stateful";
|
|
41
38
|
/**
|
|
42
|
-
* Set session ID
|
|
43
|
-
*
|
|
44
|
-
* @deprecated Use enableStatefulSession() instead
|
|
39
|
+
* Set session ID
|
|
40
|
+
* @deprecated Session ID is auto-generated, use setSessionType() to control session mode
|
|
45
41
|
*/
|
|
46
42
|
setSessionId(sessionId: string): void;
|
|
47
43
|
/**
|
|
48
44
|
* Get current session ID
|
|
49
45
|
*/
|
|
50
46
|
getSessionId(): string | null;
|
|
51
|
-
/**
|
|
52
|
-
* Set session storage (can be changed at runtime)
|
|
53
|
-
* This controls whether session state (cookies, CSRF token) is persisted to disk/storage
|
|
54
|
-
*/
|
|
55
|
-
setSessionStorage(storage: ISessionStorage | null): Promise<void>;
|
|
56
|
-
/**
|
|
57
|
-
* Get current session storage
|
|
58
|
-
*/
|
|
59
|
-
getSessionStorage(): ISessionStorage | null;
|
|
60
|
-
/**
|
|
61
|
-
* Load session state from storage
|
|
62
|
-
*/
|
|
63
|
-
loadSessionState(): Promise<void>;
|
|
64
|
-
/**
|
|
65
|
-
* Save session state to storage
|
|
66
|
-
* Only saves if in stateful mode
|
|
67
|
-
*/
|
|
68
|
-
saveSessionState(): Promise<void>;
|
|
69
|
-
/**
|
|
70
|
-
* Get current session state
|
|
71
|
-
* Returns cookies, CSRF token, and cookie store for manual persistence
|
|
72
|
-
* @returns Current session state or null if no session data
|
|
73
|
-
*/
|
|
74
|
-
getSessionState(): SessionState | null;
|
|
75
|
-
/**
|
|
76
|
-
* Set session state manually
|
|
77
|
-
* Allows user to restore session from custom storage (e.g., database, Redis)
|
|
78
|
-
* @param state - Session state with cookies, CSRF token, and cookie store
|
|
79
|
-
*/
|
|
80
|
-
setSessionState(state: SessionState): void;
|
|
81
|
-
/**
|
|
82
|
-
* Clear session state from storage
|
|
83
|
-
*/
|
|
84
|
-
clearSessionState(): Promise<void>;
|
|
85
47
|
getConfig(): SapConfig;
|
|
86
48
|
reset(): void;
|
|
87
49
|
getBaseUrl(): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiD,aAAa,EAAE,MAAM,OAAO,CAAC;AAG5F,OAAO,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"AbstractAbapConnection.d.ts","sourceRoot":"","sources":["../../src/connection/AbstractAbapConnection.ts"],"names":[],"mappings":"AAAA,OAAc,EAAiD,aAAa,EAAE,MAAM,OAAO,CAAC;AAG5F,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,uBAAe,sBAAuB,YAAW,cAAc;IAU3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAV3C,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,WAAW,CAAyC;IAE5D,SAAS,aACU,MAAM,EAAE,SAAS,EACf,MAAM,EAAE,OAAO,GAAG,IAAI,EACzC,SAAS,CAAC,EAAE,MAAM;IAgBpB;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI;IAOpD;;;;OAIG;IACH,qBAAqB,IAAI,IAAI;IAI7B;;;OAGG;IACH,sBAAsB,IAAI,IAAI;IAU9B;;OAEG;IACH,cAAc,IAAI,WAAW,GAAG,UAAU;IAI1C;;;OAGG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAKrC;;OAEG;IACH,YAAY,IAAI,MAAM,GAAG,IAAI;IAK7B,SAAS,IAAI,SAAS;IAItB,KAAK,IAAI,IAAI;IAYP,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAevD;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAE3B,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,aAAa,CAAC;IA2MzE,SAAS,CAAC,QAAQ,CAAC,wBAAwB,IAAI,MAAM;IAErD;;;OAGG;cACa,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,UAAU,GAAE,MAAgC,EAC5C,UAAU,GAAE,MAAgC,GAC3C,OAAO,CAAC,MAAM,CAAC;IAkKlB;;OAEG;IACH,SAAS,CAAC,YAAY,IAAI,MAAM,GAAG,IAAI;IAIvC;;OAEG;IACH,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM,GAAG,IAAI;IAIrC,OAAO,CAAC,yBAAyB;IAuDjC,OAAO,CAAC,gBAAgB;YAmBV,oBAAoB;IAwBlC,OAAO,CAAC,eAAe;CAyBxB;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|