@coherent.js/api 1.0.0-beta.2
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/LICENSE +21 -0
- package/README.md +91 -0
- package/dist/api/errors.d.ts +92 -0
- package/dist/api/errors.d.ts.map +1 -0
- package/dist/api/errors.js +161 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/index.d.ts +61 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +41 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/middleware.d.ts +57 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +244 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/openapi.d.ts +54 -0
- package/dist/api/openapi.d.ts.map +1 -0
- package/dist/api/openapi.js +144 -0
- package/dist/api/openapi.js.map +1 -0
- package/dist/api/router.d.ts +368 -0
- package/dist/api/router.d.ts.map +1 -0
- package/dist/api/router.js +1508 -0
- package/dist/api/router.js.map +1 -0
- package/dist/api/security.d.ts +64 -0
- package/dist/api/security.d.ts.map +1 -0
- package/dist/api/security.js +239 -0
- package/dist/api/security.js.map +1 -0
- package/dist/api/serialization.d.ts +86 -0
- package/dist/api/serialization.d.ts.map +1 -0
- package/dist/api/serialization.js +151 -0
- package/dist/api/serialization.js.map +1 -0
- package/dist/api/validation.d.ts +34 -0
- package/dist/api/validation.d.ts.map +1 -0
- package/dist/api/validation.js +172 -0
- package/dist/api/validation.js.map +1 -0
- package/dist/index.cjs +1776 -0
- package/dist/index.cjs.map +7 -0
- package/dist/index.js +1722 -0
- package/dist/index.js.map +7 -0
- package/package.json +46 -0
- package/types/index.d.ts +720 -0
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates an object-based router from nested route definitions
|
|
3
|
+
*
|
|
4
|
+
* @param {Object} routes - Nested route definition object
|
|
5
|
+
* @param {Object} options - Router options (corsOrigin, rateLimit, maxBodySize)
|
|
6
|
+
* @returns {Object} Configured router instance
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* const routes = {
|
|
10
|
+
* api: {
|
|
11
|
+
* users: {
|
|
12
|
+
* get: { handler: () => ({ users: [] }) },
|
|
13
|
+
* post: {
|
|
14
|
+
* validation: userSchema,
|
|
15
|
+
* handler: (req) => ({ user: req.body })
|
|
16
|
+
* }
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* };
|
|
20
|
+
*
|
|
21
|
+
* const router = createObjectRouter(routes, {
|
|
22
|
+
* corsOrigin: 'https://myapp.com',
|
|
23
|
+
* rateLimit: { windowMs: 60000, maxRequests: 50 }
|
|
24
|
+
* });
|
|
25
|
+
* const server = router.createServer();
|
|
26
|
+
* server.listen(3000);
|
|
27
|
+
*/
|
|
28
|
+
/**
|
|
29
|
+
* Factory function to create a SimpleRouter instance
|
|
30
|
+
*
|
|
31
|
+
* @param {Object} options - Router options
|
|
32
|
+
* @returns {SimpleRouter} Router instance
|
|
33
|
+
*/
|
|
34
|
+
export function createSimpleRouter(options?: Object): SimpleRouter;
|
|
35
|
+
export function createObjectRouter(routeConfig: any, options?: {}): SimpleRouter;
|
|
36
|
+
export default createObjectRouter;
|
|
37
|
+
/**
|
|
38
|
+
* Simple router implementation for object-based routing with WebSocket support
|
|
39
|
+
*
|
|
40
|
+
* @class SimpleRouter
|
|
41
|
+
* @description Provides HTTP and WebSocket routing with middleware support, caching,
|
|
42
|
+
* versioning, content negotiation, and performance metrics.
|
|
43
|
+
*
|
|
44
|
+
* @param {Object} [options={}] - Router configuration options
|
|
45
|
+
* @param {number} [options.maxCacheSize=1000] - Maximum cache size for route lookups
|
|
46
|
+
* @param {boolean} [options.enableCompilation=true] - Enable route pattern compilation
|
|
47
|
+
* @param {boolean} [options.enableVersioning=false] - Enable API versioning
|
|
48
|
+
* @param {string} [options.defaultVersion='v1'] - Default API version
|
|
49
|
+
* @param {string} [options.versionHeader='api-version'] - Header for version detection
|
|
50
|
+
* @param {boolean} [options.enableContentNegotiation=true] - Enable content type negotiation
|
|
51
|
+
* @param {string} [options.defaultContentType='application/json'] - Default response content type
|
|
52
|
+
* @param {boolean} [options.enableWebSockets=false] - Enable WebSocket routing
|
|
53
|
+
* @param {boolean} [options.enableMetrics=false] - Enable performance metrics collection
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* const router = new SimpleRouter({
|
|
57
|
+
* enableWebSockets: true,
|
|
58
|
+
* enableMetrics: true,
|
|
59
|
+
* maxCacheSize: 2000
|
|
60
|
+
* });
|
|
61
|
+
*/
|
|
62
|
+
export class SimpleRouter {
|
|
63
|
+
constructor(options?: {});
|
|
64
|
+
routes: any[];
|
|
65
|
+
routeCache: Map<any, any>;
|
|
66
|
+
namedRoutes: Map<any, any>;
|
|
67
|
+
maxCacheSize: any;
|
|
68
|
+
routeGroups: any[];
|
|
69
|
+
globalMiddleware: any[];
|
|
70
|
+
enableCompilation: boolean;
|
|
71
|
+
compiledRoutes: Map<any, any>;
|
|
72
|
+
routeCompilationCache: Map<any, any>;
|
|
73
|
+
enableVersioning: any;
|
|
74
|
+
defaultVersion: any;
|
|
75
|
+
versionHeader: any;
|
|
76
|
+
versionedRoutes: Map<any, any>;
|
|
77
|
+
enableContentNegotiation: boolean;
|
|
78
|
+
defaultContentType: any;
|
|
79
|
+
enableWebSockets: any;
|
|
80
|
+
wsRoutes: any[];
|
|
81
|
+
wsConnections: Map<any, any>;
|
|
82
|
+
enableMetrics: any;
|
|
83
|
+
metrics: {
|
|
84
|
+
requests: number;
|
|
85
|
+
cacheHits: number;
|
|
86
|
+
compilationHits: number;
|
|
87
|
+
routeMatches: Map<any, any>;
|
|
88
|
+
responseTime: never[];
|
|
89
|
+
errors: number;
|
|
90
|
+
versionRequests: Map<any, any>;
|
|
91
|
+
contentTypeRequests: Map<any, any>;
|
|
92
|
+
wsConnections: number;
|
|
93
|
+
wsMessages: number;
|
|
94
|
+
} | undefined;
|
|
95
|
+
/**
|
|
96
|
+
* Add an HTTP route to the router
|
|
97
|
+
*
|
|
98
|
+
* @param {string} method - HTTP method (GET, POST, PUT, DELETE, PATCH)
|
|
99
|
+
* @param {string} path - Route path pattern (supports :param and wildcards)
|
|
100
|
+
* @param {Function} handler - Route handler function
|
|
101
|
+
* @param {Object} [options={}] - Route options
|
|
102
|
+
* @param {Array} [options.middleware] - Route-specific middleware
|
|
103
|
+
* @param {string} [options.name] - Named route for URL generation
|
|
104
|
+
* @param {string} [options.version] - API version for this route
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* router.addRoute('GET', '/users/:id', (req, res) => {
|
|
108
|
+
* return { user: { id: req.params.id } };
|
|
109
|
+
* }, { name: 'getUser', version: 'v2' });
|
|
110
|
+
*/
|
|
111
|
+
addRoute(method: string, path: string, handler: Function, options?: {
|
|
112
|
+
middleware?: any[] | undefined;
|
|
113
|
+
name?: string | undefined;
|
|
114
|
+
version?: string | undefined;
|
|
115
|
+
}): void;
|
|
116
|
+
/**
|
|
117
|
+
* Add a versioned route
|
|
118
|
+
* @param {string} version - API version (e.g., 'v1', 'v2')
|
|
119
|
+
* @param {string} method - HTTP method
|
|
120
|
+
* @param {string} path - Route path
|
|
121
|
+
* @param {Function} handler - Route handler
|
|
122
|
+
* @param {Object} options - Route options
|
|
123
|
+
*/
|
|
124
|
+
addVersionedRoute(version: string, method: string, path: string, handler: Function, options?: Object): void;
|
|
125
|
+
/**
|
|
126
|
+
* Add route with content negotiation support
|
|
127
|
+
* @param {string} method - HTTP method
|
|
128
|
+
* @param {string} path - Route path
|
|
129
|
+
* @param {Object} handlers - Content type handlers { 'application/json': handler, 'text/xml': handler }
|
|
130
|
+
* @param {Object} options - Route options
|
|
131
|
+
*/
|
|
132
|
+
addContentNegotiatedRoute(method: string, path: string, handlers: Object, options?: Object): void;
|
|
133
|
+
/**
|
|
134
|
+
* Negotiate content type based on Accept header
|
|
135
|
+
* @param {Object} req - Request object
|
|
136
|
+
* @param {Array} supportedTypes - Array of supported content types
|
|
137
|
+
* @returns {string} Best matching content type
|
|
138
|
+
* @private
|
|
139
|
+
*/
|
|
140
|
+
private negotiateContentType;
|
|
141
|
+
/**
|
|
142
|
+
* Convert object to XML string
|
|
143
|
+
* @param {Object} obj - Object to convert
|
|
144
|
+
* @param {string} rootName - Root element name
|
|
145
|
+
* @returns {string} XML string
|
|
146
|
+
* @private
|
|
147
|
+
*/
|
|
148
|
+
private objectToXml;
|
|
149
|
+
/**
|
|
150
|
+
* Add WebSocket route
|
|
151
|
+
* @param {string} path - WebSocket path
|
|
152
|
+
* @param {Function} handler - WebSocket handler function
|
|
153
|
+
* @param {Object} options - Route options
|
|
154
|
+
*/
|
|
155
|
+
addWebSocketRoute(path: string, handler: Function, options?: Object): void;
|
|
156
|
+
/**
|
|
157
|
+
* Handle WebSocket upgrade request
|
|
158
|
+
* @param {Object} request - HTTP request object
|
|
159
|
+
* @param {Object} socket - Socket object
|
|
160
|
+
* @param {Buffer} head - First packet of the upgraded stream
|
|
161
|
+
*/
|
|
162
|
+
handleWebSocketUpgrade(request: Object, socket: Object, head: Buffer): void;
|
|
163
|
+
/**
|
|
164
|
+
* Create WebSocket connection
|
|
165
|
+
* @param {Object} request - HTTP request object
|
|
166
|
+
* @param {Object} socket - Socket object
|
|
167
|
+
* @param {Buffer} head - First packet of the upgraded stream
|
|
168
|
+
* @param {Object} matchedRoute - Matched WebSocket route
|
|
169
|
+
* @private
|
|
170
|
+
*/
|
|
171
|
+
private createWebSocketConnection;
|
|
172
|
+
/**
|
|
173
|
+
* Create WebSocket wrapper with message handling
|
|
174
|
+
* @param {Object} socket - Raw socket
|
|
175
|
+
* @param {Object} matchedRoute - Matched route info
|
|
176
|
+
* @returns {Object} WebSocket wrapper
|
|
177
|
+
* @private
|
|
178
|
+
*/
|
|
179
|
+
private createWebSocketWrapper;
|
|
180
|
+
/**
|
|
181
|
+
* Parse WebSocket frame
|
|
182
|
+
* @param {Buffer} buffer - Raw frame data
|
|
183
|
+
* @returns {string|null} Parsed message
|
|
184
|
+
* @private
|
|
185
|
+
*/
|
|
186
|
+
private parseWebSocketFrame;
|
|
187
|
+
/**
|
|
188
|
+
* Broadcast message to all WebSocket connections on a path
|
|
189
|
+
* @param {string} path - WebSocket path pattern
|
|
190
|
+
* @param {*} message - Message to broadcast
|
|
191
|
+
* @param {string} [excludeId=null] - Connection ID to exclude from broadcast
|
|
192
|
+
*/
|
|
193
|
+
broadcast(path: string, message: any, excludeId?: string): void;
|
|
194
|
+
/**
|
|
195
|
+
* Get active WebSocket connections
|
|
196
|
+
* @returns {Array} Array of connection info
|
|
197
|
+
*/
|
|
198
|
+
getWebSocketConnections(): any[];
|
|
199
|
+
/**
|
|
200
|
+
* Get version from request
|
|
201
|
+
* @param {Object} req - Request object
|
|
202
|
+
* @returns {string} API version
|
|
203
|
+
* @private
|
|
204
|
+
*/
|
|
205
|
+
private getRequestVersion;
|
|
206
|
+
/**
|
|
207
|
+
* Generate URL for named route with parameter substitution
|
|
208
|
+
*
|
|
209
|
+
* @param {string} name - Route name (set during route registration)
|
|
210
|
+
* @param {Object} [params={}] - Parameters to substitute in the URL pattern
|
|
211
|
+
* @returns {string} Generated URL with parameters substituted
|
|
212
|
+
* @throws {Error} If named route is not found
|
|
213
|
+
*
|
|
214
|
+
* @example
|
|
215
|
+
* // Route registered as: router.addRoute('GET', '/users/:id', handler, { name: 'getUser' })
|
|
216
|
+
* const url = router.url('getUser', { id: 123 }); // '/users/123'
|
|
217
|
+
*
|
|
218
|
+
* // With constrained parameters
|
|
219
|
+
* const url = router.url('getUserPosts', { userId: 123, postId: 456 }); // '/users/123/posts/456'
|
|
220
|
+
*/
|
|
221
|
+
generateUrl(name: string, params?: Object): string;
|
|
222
|
+
/**
|
|
223
|
+
* Add routes from configuration object
|
|
224
|
+
*
|
|
225
|
+
* @param {Object} routeConfig - Route configuration object with nested structure
|
|
226
|
+
* @description Processes nested route objects and registers HTTP and WebSocket routes.
|
|
227
|
+
* Supports declarative route definition with automatic method detection.
|
|
228
|
+
*
|
|
229
|
+
* @example
|
|
230
|
+
* router.addRoutes({
|
|
231
|
+
* 'api': {
|
|
232
|
+
* 'users': {
|
|
233
|
+
* GET: (req, res) => ({ users: [] }),
|
|
234
|
+
* POST: (req, res) => ({ created: true })
|
|
235
|
+
* }
|
|
236
|
+
* }
|
|
237
|
+
* });
|
|
238
|
+
*/
|
|
239
|
+
addRoutes(routeConfig: Object): void;
|
|
240
|
+
/**
|
|
241
|
+
* Add global middleware to the router
|
|
242
|
+
*
|
|
243
|
+
* @param {Function|Object} middleware - Middleware function or conditional middleware object
|
|
244
|
+
* @description Adds middleware that runs before all route handlers. Supports both
|
|
245
|
+
* simple functions and conditional middleware objects.
|
|
246
|
+
*
|
|
247
|
+
* @example
|
|
248
|
+
* // Simple middleware
|
|
249
|
+
* router.use((req, res) => {
|
|
250
|
+
* console.log(`${req.method} ${req.url}`);
|
|
251
|
+
* });
|
|
252
|
+
*
|
|
253
|
+
* // Conditional middleware
|
|
254
|
+
* router.use({
|
|
255
|
+
* condition: (req) => req.url.startsWith('/api'),
|
|
256
|
+
* middleware: authMiddleware,
|
|
257
|
+
* name: 'apiAuth'
|
|
258
|
+
* });
|
|
259
|
+
*/
|
|
260
|
+
use(middleware: Function | Object): void;
|
|
261
|
+
/**
|
|
262
|
+
* Create conditional middleware wrapper
|
|
263
|
+
* @param {Object} config - Conditional middleware configuration
|
|
264
|
+
* @returns {Function} Wrapped middleware function
|
|
265
|
+
* @private
|
|
266
|
+
*/
|
|
267
|
+
private createConditionalMiddleware;
|
|
268
|
+
/**
|
|
269
|
+
* Evaluate condition object
|
|
270
|
+
* @param {Object} condition - Condition object
|
|
271
|
+
* @param {Object} req - Request object
|
|
272
|
+
* @param {Object} res - Response object
|
|
273
|
+
* @returns {boolean} Whether condition is met
|
|
274
|
+
* @private
|
|
275
|
+
*/
|
|
276
|
+
private evaluateConditionObject;
|
|
277
|
+
/**
|
|
278
|
+
* Match condition value
|
|
279
|
+
* @param {*} actual - Actual value
|
|
280
|
+
* @param {*} expected - Expected value or condition
|
|
281
|
+
* @returns {boolean} Whether condition matches
|
|
282
|
+
* @private
|
|
283
|
+
*/
|
|
284
|
+
private matchCondition;
|
|
285
|
+
/**
|
|
286
|
+
* Create a route group with shared middleware and prefix
|
|
287
|
+
* @param {string} prefix - Path prefix for the group
|
|
288
|
+
* @param {Function|Array} middleware - Shared middleware
|
|
289
|
+
* @param {Function} callback - Function to define routes in the group
|
|
290
|
+
*/
|
|
291
|
+
group(prefix: string, middleware: Function | any[], callback: Function): this;
|
|
292
|
+
/**
|
|
293
|
+
* Get current route prefix from active groups
|
|
294
|
+
* @private
|
|
295
|
+
*/
|
|
296
|
+
private getCurrentPrefix;
|
|
297
|
+
/**
|
|
298
|
+
* Get current group middleware
|
|
299
|
+
* @private
|
|
300
|
+
*/
|
|
301
|
+
private getCurrentGroupMiddleware;
|
|
302
|
+
/**
|
|
303
|
+
* Compile route pattern into optimized regex
|
|
304
|
+
* @param {string} pattern - Route pattern to compile
|
|
305
|
+
* @returns {Object} Compiled route object with regex and parameter names
|
|
306
|
+
* @private
|
|
307
|
+
*/
|
|
308
|
+
private compileRoute;
|
|
309
|
+
/**
|
|
310
|
+
* Match path using compiled route
|
|
311
|
+
* @param {Object} compiledRoute - Compiled route object
|
|
312
|
+
* @param {string} path - Path to match
|
|
313
|
+
* @returns {Object|null} Parameters object or null if no match
|
|
314
|
+
* @private
|
|
315
|
+
*/
|
|
316
|
+
private matchCompiledRoute;
|
|
317
|
+
/**
|
|
318
|
+
* Get performance metrics
|
|
319
|
+
* @returns {Object} Performance metrics object
|
|
320
|
+
*/
|
|
321
|
+
getMetrics(): Object;
|
|
322
|
+
/**
|
|
323
|
+
* Get compilation statistics
|
|
324
|
+
* @returns {Object} Compilation statistics
|
|
325
|
+
*/
|
|
326
|
+
getCompilationStats(): Object;
|
|
327
|
+
/**
|
|
328
|
+
* Clear route cache (useful for development)
|
|
329
|
+
*/
|
|
330
|
+
clearCache(): void;
|
|
331
|
+
/**
|
|
332
|
+
* Clear compilation cache
|
|
333
|
+
*/
|
|
334
|
+
clearCompilationCache(): void;
|
|
335
|
+
/**
|
|
336
|
+
* Get all registered routes with detailed information
|
|
337
|
+
* @returns {Array} Array of route information objects
|
|
338
|
+
*/
|
|
339
|
+
getRoutes(): any[];
|
|
340
|
+
/**
|
|
341
|
+
* Find routes matching a pattern or method
|
|
342
|
+
* @param {Object} criteria - Search criteria
|
|
343
|
+
* @returns {Array} Matching routes
|
|
344
|
+
*/
|
|
345
|
+
findRoutes(criteria?: Object): any[];
|
|
346
|
+
/**
|
|
347
|
+
* Test route matching without executing handlers
|
|
348
|
+
* @param {string} method - HTTP method
|
|
349
|
+
* @param {string} path - Path to test
|
|
350
|
+
* @returns {Object} Match result with route info and extracted parameters
|
|
351
|
+
*/
|
|
352
|
+
testRoute(method: string, path: string): Object;
|
|
353
|
+
/**
|
|
354
|
+
* Get router debug information
|
|
355
|
+
* @returns {Object} Comprehensive debug information
|
|
356
|
+
*/
|
|
357
|
+
getDebugInfo(): Object;
|
|
358
|
+
handle(req: any, res: any, options?: {}): Promise<void>;
|
|
359
|
+
createServer(options?: {}): import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
360
|
+
get(path: any, handler: any, options?: {}): void;
|
|
361
|
+
post(path: any, handler: any, options?: {}): void;
|
|
362
|
+
put(path: any, handler: any, options?: {}): void;
|
|
363
|
+
patch(path: any, handler: any, options?: {}): void;
|
|
364
|
+
delete(path: any, handler: any, options?: {}): void;
|
|
365
|
+
options(path: any, handler: any, options?: {}): void;
|
|
366
|
+
head(path: any, handler: any, options?: {}): void;
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../../src/api/router.js"],"names":[],"mappings":"AAqmDA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH;;;;;GAKG;AACH,6CAHW,MAAM,GACJ,YAAY,CAIxB;AAED,iFASC;;AAx0CD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH;IACE,0BA4CC;IA3CC,cAAgB;IAChB,0BAA2B;IAC3B,2BAA4B;IAC5B,kBAAgD;IAChD,mBAAqB;IACrB,wBAA0B;IAG1B,2BAA4D;IAC5D,8BAA+B;IAC/B,qCAAsC;IAGtC,sBAAyD;IACzD,oBAAoD;IACpD,mBAA2D;IAC3D,+BAAgC;IAGhC,kCAA0E;IAC1E,wBAA0E;IAG1E,sBAAyD;IACzD,gBAAkB;IAClB,6BAA8B;IAG9B,mBAAmD;IAEjD;;;;;;;;;;;kBAWC;IAIL;;;;;;;;;;;;;;;OAeG;IACH,iBAbW,MAAM,QACN,MAAM,+BAGd;QAAwB,UAAU;QACT,IAAI;QACJ,OAAO;KAEhC,QA2CF;IAED;;;;;;;OAOG;IACH,2BANW,MAAM,UACN,MAAM,QACN,MAAM,+BAEN,MAAM,QAIhB;IAED;;;;;;OAMG;IACH,kCALW,MAAM,QACN,MAAM,YACN,MAAM,YACN,MAAM,QAwChB;IAED;;;;;;OAMG;IACH,6BAiCC;IAED;;;;;;OAMG;IACH,oBA6BC;IAED;;;;;OAKG;IACH,wBAJW,MAAM,+BAEN,MAAM,QAuBhB;IAED;;;;;OAKG;IACH,gCAJW,MAAM,UACN,MAAM,QACN,MAAM,QAmChB;IAED;;;;;;;OAOG;IACH,kCAuEC;IAED;;;;;;OAMG;IACH,+BAoGC;IAED;;;;;OAKG;IACH,4BA+CC;IAED;;;;;OAKG;IACH,gBAJW,MAAM,WACN,GAAC,cACD,MAAM,QAahB;IAED;;;OAGG;IACH,iCAOC;IAED;;;;;OAKG;IACH,0BAkBC;IAED;;;;;;;;;;;;;;OAcG;IACH,kBAZW,MAAM,WACN,MAAM,GACJ,MAAM,CA0BlB;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,uBAdW,MAAM,QAgBhB;IAED;;;;;;;;;;;;;;;;;;;OAmBG;IACH,gBAjBW,WAAS,MAAM,QAwBzB;IAED;;;;;OAKG;IACH,oCAsBC;IAED;;;;;;;OAOG;IACH,gCAsCC;IAED;;;;;;OAMG;IACH,uBAcC;IAED;;;;;OAKG;IACH,cAJW,MAAM,cACN,gBAAc,4BAcxB;IAED;;;OAGG;IACH,yBAEC;IAED;;;OAGG;IACH,kCAEC;IAED;;;;;OAKG;IACH,qBAuDC;IAED;;;;;;OAMG;IACH,2BAcC;IAED;;;OAGG;IACH,cAFa,MAAM,CAiBlB;IAED;;;OAGG;IACH,uBAFa,MAAM,CAclB;IAED;;OAEG;IACH,mBAEC;IAED;;OAEG;IACH,8BAEC;IAED;;;OAGG;IACH,mBAWC;IAED;;;;OAIG;IACH,sBAHW,MAAM,SAkBhB;IAED;;;;;OAKG;IACH,kBAJW,MAAM,QACN,MAAM,GACJ,MAAM,CAiClB;IAED;;;OAGG;IACH,gBAFa,MAAM,CAoClB;IAED,wDAyJC;IAED,+HAGC;IAGD,iDAEC;IAED,kDAEC;IAED,iDAEC;IAED,mDAEC;IAED,oDAEC;IAED,qDAEC;IAED,kDAEC;CACF"}
|