@desplega.ai/qa-use 2.0.1

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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1003 -0
  3. package/bin/qa-use.js +7 -0
  4. package/dist/lib/api/index.d.ts +296 -0
  5. package/dist/lib/api/index.d.ts.map +1 -0
  6. package/dist/lib/api/index.js +564 -0
  7. package/dist/lib/api/index.js.map +1 -0
  8. package/dist/lib/api/sse.d.ts +33 -0
  9. package/dist/lib/api/sse.d.ts.map +1 -0
  10. package/dist/lib/api/sse.js +97 -0
  11. package/dist/lib/api/sse.js.map +1 -0
  12. package/dist/lib/browser/index.d.ts +28 -0
  13. package/dist/lib/browser/index.d.ts.map +1 -0
  14. package/dist/lib/browser/index.js +145 -0
  15. package/dist/lib/browser/index.js.map +1 -0
  16. package/dist/lib/env/index.d.ts +41 -0
  17. package/dist/lib/env/index.d.ts.map +1 -0
  18. package/dist/lib/env/index.js +125 -0
  19. package/dist/lib/env/index.js.map +1 -0
  20. package/dist/lib/tunnel/index.d.ts +38 -0
  21. package/dist/lib/tunnel/index.d.ts.map +1 -0
  22. package/dist/lib/tunnel/index.js +154 -0
  23. package/dist/lib/tunnel/index.js.map +1 -0
  24. package/dist/package.json +100 -0
  25. package/dist/src/cli/commands/info.d.ts +6 -0
  26. package/dist/src/cli/commands/info.d.ts.map +1 -0
  27. package/dist/src/cli/commands/info.js +32 -0
  28. package/dist/src/cli/commands/info.js.map +1 -0
  29. package/dist/src/cli/commands/mcp.d.ts +6 -0
  30. package/dist/src/cli/commands/mcp.d.ts.map +1 -0
  31. package/dist/src/cli/commands/mcp.js +45 -0
  32. package/dist/src/cli/commands/mcp.js.map +1 -0
  33. package/dist/src/cli/commands/setup.d.ts +6 -0
  34. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  35. package/dist/src/cli/commands/setup.js +59 -0
  36. package/dist/src/cli/commands/setup.js.map +1 -0
  37. package/dist/src/cli/commands/test/index.d.ts +6 -0
  38. package/dist/src/cli/commands/test/index.d.ts.map +1 -0
  39. package/dist/src/cli/commands/test/index.js +15 -0
  40. package/dist/src/cli/commands/test/index.js.map +1 -0
  41. package/dist/src/cli/commands/test/init.d.ts +6 -0
  42. package/dist/src/cli/commands/test/init.d.ts.map +1 -0
  43. package/dist/src/cli/commands/test/init.js +64 -0
  44. package/dist/src/cli/commands/test/init.js.map +1 -0
  45. package/dist/src/cli/commands/test/list.d.ts +6 -0
  46. package/dist/src/cli/commands/test/list.d.ts.map +1 -0
  47. package/dist/src/cli/commands/test/list.js +70 -0
  48. package/dist/src/cli/commands/test/list.js.map +1 -0
  49. package/dist/src/cli/commands/test/run.d.ts +6 -0
  50. package/dist/src/cli/commands/test/run.d.ts.map +1 -0
  51. package/dist/src/cli/commands/test/run.js +95 -0
  52. package/dist/src/cli/commands/test/run.js.map +1 -0
  53. package/dist/src/cli/commands/test/validate.d.ts +6 -0
  54. package/dist/src/cli/commands/test/validate.d.ts.map +1 -0
  55. package/dist/src/cli/commands/test/validate.js +70 -0
  56. package/dist/src/cli/commands/test/validate.js.map +1 -0
  57. package/dist/src/cli/index.d.ts +6 -0
  58. package/dist/src/cli/index.d.ts.map +1 -0
  59. package/dist/src/cli/index.js +21 -0
  60. package/dist/src/cli/index.js.map +1 -0
  61. package/dist/src/cli/lib/config.d.ts +36 -0
  62. package/dist/src/cli/lib/config.d.ts.map +1 -0
  63. package/dist/src/cli/lib/config.js +89 -0
  64. package/dist/src/cli/lib/config.js.map +1 -0
  65. package/dist/src/cli/lib/loader.d.ts +49 -0
  66. package/dist/src/cli/lib/loader.d.ts.map +1 -0
  67. package/dist/src/cli/lib/loader.js +122 -0
  68. package/dist/src/cli/lib/loader.js.map +1 -0
  69. package/dist/src/cli/lib/output.d.ts +53 -0
  70. package/dist/src/cli/lib/output.d.ts.map +1 -0
  71. package/dist/src/cli/lib/output.js +133 -0
  72. package/dist/src/cli/lib/output.js.map +1 -0
  73. package/dist/src/cli/lib/runner.d.ts +23 -0
  74. package/dist/src/cli/lib/runner.d.ts.map +1 -0
  75. package/dist/src/cli/lib/runner.js +40 -0
  76. package/dist/src/cli/lib/runner.js.map +1 -0
  77. package/dist/src/http-server.d.ts +14 -0
  78. package/dist/src/http-server.d.ts.map +1 -0
  79. package/dist/src/http-server.js +145 -0
  80. package/dist/src/http-server.js.map +1 -0
  81. package/dist/src/index.d.ts +9 -0
  82. package/dist/src/index.d.ts.map +1 -0
  83. package/dist/src/index.js +21 -0
  84. package/dist/src/index.js.map +1 -0
  85. package/dist/src/server.d.ts +58 -0
  86. package/dist/src/server.d.ts.map +1 -0
  87. package/dist/src/server.js +2376 -0
  88. package/dist/src/server.js.map +1 -0
  89. package/dist/src/tunnel-mode.d.ts +13 -0
  90. package/dist/src/tunnel-mode.d.ts.map +1 -0
  91. package/dist/src/tunnel-mode.js +159 -0
  92. package/dist/src/tunnel-mode.js.map +1 -0
  93. package/dist/src/types/test-definition.d.ts +320 -0
  94. package/dist/src/types/test-definition.d.ts.map +1 -0
  95. package/dist/src/types/test-definition.js +11 -0
  96. package/dist/src/types/test-definition.js.map +1 -0
  97. package/dist/src/types.d.ts +209 -0
  98. package/dist/src/types.d.ts.map +1 -0
  99. package/dist/src/types.js +34 -0
  100. package/dist/src/types.js.map +1 -0
  101. package/dist/src/utils/package.d.ts +12 -0
  102. package/dist/src/utils/package.d.ts.map +1 -0
  103. package/dist/src/utils/package.js +36 -0
  104. package/dist/src/utils/package.js.map +1 -0
  105. package/dist/src/utils/summary.d.ts +45 -0
  106. package/dist/src/utils/summary.d.ts.map +1 -0
  107. package/dist/src/utils/summary.js +198 -0
  108. package/dist/src/utils/summary.js.map +1 -0
  109. package/lib/api/index.ts +977 -0
  110. package/lib/api/sse.ts +112 -0
  111. package/lib/browser/index.ts +181 -0
  112. package/lib/env/index.ts +156 -0
  113. package/lib/tunnel/index.test.ts +344 -0
  114. package/lib/tunnel/index.ts +197 -0
  115. package/lib/tunnel/integration.test.ts +98 -0
  116. package/package.json +100 -0
  117. package/server.json +16 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Test execution runner with SSE progress output
3
+ */
4
+ import { ApiClient, } from '../../../lib/api/index.js';
5
+ import { printSSEProgress } from './output.js';
6
+ /**
7
+ * Run a test with real-time progress output
8
+ *
9
+ * @param client - ApiClient instance
10
+ * @param options - Test run options
11
+ * @param onEvent - Optional additional event callback
12
+ * @returns Test result
13
+ */
14
+ export async function runTest(client, options, onEvent) {
15
+ return await client.runCliTest(options, (event) => {
16
+ // Print progress to console
17
+ printSSEProgress(event);
18
+ // Call additional callback if provided
19
+ if (onEvent) {
20
+ onEvent(event);
21
+ }
22
+ });
23
+ }
24
+ /**
25
+ * Run multiple tests sequentially
26
+ *
27
+ * @param client - ApiClient instance
28
+ * @param tests - Array of test run options
29
+ * @returns Array of test results
30
+ */
31
+ export async function runTests(client, tests) {
32
+ const results = [];
33
+ for (let i = 0; i < tests.length; i++) {
34
+ console.log(`\nRunning test ${i + 1}/${tests.length}...\n`);
35
+ const result = await runTest(client, tests[i]);
36
+ results.push(result);
37
+ }
38
+ return results;
39
+ }
40
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/cli/lib/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,GAGV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAiB,EACjB,OAA0B,EAC1B,OAAmC;IAEnC,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,4BAA4B;QAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExB,uCAAuC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiB,EACjB,KAA0B;IAE1B,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { QAUseMcpServer } from './server.js';
2
+ export declare class HttpMcpServer {
3
+ private app;
4
+ private server;
5
+ private mcpServer;
6
+ private port;
7
+ private transports;
8
+ constructor(mcpServer: QAUseMcpServer, port?: number);
9
+ private setupMiddleware;
10
+ private authenticateRequest;
11
+ private setupRoutes;
12
+ start(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=http-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAA6C;gBAEnD,SAAS,EAAE,cAAc,EAAE,IAAI,GAAE,MAAa;IAU1D,OAAO,CAAC,eAAe;YAiBT,mBAAmB;IAuBjC,OAAO,CAAC,WAAW;IAgFb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B"}
@@ -0,0 +1,145 @@
1
+ import express from 'express';
2
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
3
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { ApiClient } from '../lib/api/index.js';
6
+ import { getName, getVersion } from './utils/package.js';
7
+ export class HttpMcpServer {
8
+ app;
9
+ server;
10
+ mcpServer;
11
+ port;
12
+ transports;
13
+ constructor(mcpServer, port = 3000) {
14
+ this.app = express();
15
+ this.server = mcpServer.getServer();
16
+ this.mcpServer = mcpServer;
17
+ this.port = port;
18
+ this.transports = new Map();
19
+ this.setupMiddleware();
20
+ this.setupRoutes();
21
+ }
22
+ setupMiddleware() {
23
+ // Parse JSON bodies
24
+ this.app.use(express.json());
25
+ // CORS middleware
26
+ this.app.use((req, res, next) => {
27
+ res.header('Access-Control-Allow-Origin', '*');
28
+ res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
29
+ res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
30
+ if (req.method === 'OPTIONS') {
31
+ res.sendStatus(200);
32
+ }
33
+ else {
34
+ next();
35
+ }
36
+ });
37
+ }
38
+ async authenticateRequest(req) {
39
+ const authHeader = req.headers.authorization;
40
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
41
+ return false;
42
+ }
43
+ const apiKey = authHeader.substring(7);
44
+ if (!apiKey) {
45
+ return false;
46
+ }
47
+ // Validate API key
48
+ const apiClient = new ApiClient();
49
+ const authResult = await apiClient.validateApiKey(apiKey);
50
+ if (!authResult.success) {
51
+ return false;
52
+ }
53
+ // Store API key in request for later use
54
+ req.apiKey = apiKey;
55
+ return true;
56
+ }
57
+ setupRoutes() {
58
+ // Health check endpoint
59
+ this.app.get('/health', (req, res) => {
60
+ res.json({
61
+ status: 'ok',
62
+ name: getName(),
63
+ version: getVersion(),
64
+ mode: 'http-sse',
65
+ transport: 'StreamableHTTP',
66
+ });
67
+ });
68
+ // MCP endpoint - handles both GET (SSE) and POST (messages)
69
+ this.app.all('/mcp', async (req, res) => {
70
+ const authReq = req;
71
+ authReq.body = req.body;
72
+ // Authenticate request
73
+ const isAuthenticated = await this.authenticateRequest(authReq);
74
+ if (!isAuthenticated) {
75
+ return res.status(401).json({
76
+ error: 'Unauthorized',
77
+ message: 'Missing or invalid Authorization header. Expected: Bearer <api-key>',
78
+ });
79
+ }
80
+ // Set API key on MCP server so tools can use it
81
+ if (authReq.apiKey) {
82
+ this.mcpServer.setApiKey(authReq.apiKey);
83
+ }
84
+ // Create or get transport for this request
85
+ const sessionId = req.headers['mcp-session-id'];
86
+ let transport;
87
+ if (sessionId && this.transports.has(sessionId)) {
88
+ transport = this.transports.get(sessionId);
89
+ }
90
+ else {
91
+ // Create new transport
92
+ transport = new StreamableHTTPServerTransport({
93
+ sessionIdGenerator: () => randomUUID(),
94
+ onsessioninitialized: (id) => {
95
+ this.transports.set(id, transport);
96
+ },
97
+ onsessionclosed: (id) => {
98
+ this.transports.delete(id);
99
+ },
100
+ });
101
+ // Connect transport to MCP server
102
+ await this.server.connect(transport);
103
+ }
104
+ // Handle the request with the transport
105
+ try {
106
+ await transport.handleRequest(authReq, res, req.body);
107
+ }
108
+ catch (error) {
109
+ if (!res.headersSent) {
110
+ res.status(500).json({
111
+ error: 'Internal Server Error',
112
+ message: error instanceof Error ? error.message : 'Unknown error',
113
+ });
114
+ }
115
+ }
116
+ });
117
+ // 404 handler
118
+ this.app.use((req, res) => {
119
+ res.status(404).json({
120
+ error: 'Not Found',
121
+ message: `Route ${req.method} ${req.path} not found. Use /mcp for MCP protocol or /health for health check.`,
122
+ });
123
+ });
124
+ }
125
+ async start() {
126
+ return new Promise((resolve) => {
127
+ this.app.listen(this.port, () => {
128
+ console.log(`${getName()} MCP Server running on port ${this.port}`);
129
+ console.log(`Version: ${getVersion()}`);
130
+ console.log(`Transport: StreamableHTTP (SSE + JSON-RPC)`);
131
+ console.log(`\nEndpoints:`);
132
+ console.log(` GET /health - Health check (no auth required)`);
133
+ console.log(` GET /mcp - Establish SSE connection (auth required)`);
134
+ console.log(` POST /mcp - Send JSON-RPC message (auth required)`);
135
+ console.log(` DELETE /mcp - Close session (auth required)`);
136
+ console.log(`\nAuthentication: Bearer token required (API key)`);
137
+ console.log(`\nExample:`);
138
+ console.log(` # Establish connection`);
139
+ console.log(` curl -N -H "Authorization: Bearer YOUR_KEY" http://localhost:${this.port}/mcp`);
140
+ resolve();
141
+ });
142
+ });
143
+ }
144
+ }
145
+ //# sourceMappingURL=http-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * QA-Use MCP Server - Stdio Entry Point
4
+ *
5
+ * This file starts the MCP server in stdio mode (the default for MCP).
6
+ * For other modes (HTTP, tunnel), use the unified CLI: `qa-use mcp --http` or `qa-use mcp tunnel`
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -0,0 +1,21 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * QA-Use MCP Server - Stdio Entry Point
4
+ *
5
+ * This file starts the MCP server in stdio mode (the default for MCP).
6
+ * For other modes (HTTP, tunnel), use the unified CLI: `qa-use mcp --http` or `qa-use mcp tunnel`
7
+ */
8
+ import { version } from 'node:process';
9
+ import { logConfigSources } from '../lib/env/index.js';
10
+ import { QAUseMcpServer } from './server.js';
11
+ const [major] = version.substring(1).split('.').map(Number);
12
+ if (major < 18) {
13
+ console.error(`ERROR: \`qa-use\` requires Node.js 18.0.0 or newer. Current version: ${process.version}`);
14
+ process.exit(1);
15
+ }
16
+ // Log configuration sources (helps users understand where credentials come from)
17
+ logConfigSources();
18
+ // Start stdio server (default MCP mode)
19
+ const server = new QAUseMcpServer();
20
+ await server.start();
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAE5D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,wEAAwE,OAAO,CAAC,OAAO,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AACjF,gBAAgB,EAAE,CAAC;AAEnB,wCAAwC;AACxC,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;AACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
+ declare class QAUseMcpServer {
3
+ private server;
4
+ private globalApiClient;
5
+ private browserSessions;
6
+ private readonly DEFAULT_TTL_MS;
7
+ private globalBrowser;
8
+ private globalTunnel;
9
+ private globalSessionIndex;
10
+ private cleanupInterval;
11
+ constructor();
12
+ private createSessionSummary;
13
+ private createTestSummary;
14
+ private formatSessionProgress;
15
+ private formatSessionCompletion;
16
+ private startCleanupTask;
17
+ private cleanupExpiredSessions;
18
+ private getBrowserSession;
19
+ /**
20
+ * Cleanup global browser and tunnel resources
21
+ */
22
+ private cleanupGlobalResources;
23
+ /**
24
+ * Get or create the global browser session (singleton pattern)
25
+ * All sessions share this single browser instance
26
+ */
27
+ private getOrCreateGlobalBrowser;
28
+ private addBrowserSession;
29
+ private resetAllBrowserSessions;
30
+ private setupTools;
31
+ private handleEnsureInstalled;
32
+ private handleRegisterUser;
33
+ private ensureInitialized;
34
+ private handleSearchSessions;
35
+ private handleStartAutomatedSession;
36
+ private handleStartDevSession;
37
+ private handleMonitorSession;
38
+ private handleWaitForNonRunningState;
39
+ private handleInteractWithSession;
40
+ private handleSearchAutomatedTests;
41
+ private handleRunAutomatedTests;
42
+ private handleSearchAutomatedTestRuns;
43
+ private handleUpdateConfiguration;
44
+ private handleGetConfiguration;
45
+ private handleResetBrowserSessions;
46
+ private setupResources;
47
+ private setupPrompts;
48
+ private generateAAATestPrompt;
49
+ private getGettingStartedGuide;
50
+ private getWorkflowsGuide;
51
+ private getToolsGuide;
52
+ getServer(): Server;
53
+ setApiKey(apiKey: string): void;
54
+ start(): Promise<void>;
55
+ private cleanup;
56
+ }
57
+ export { QAUseMcpServer };
58
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAmOnE,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAY;IAEnC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IAGjD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,kBAAkB,CAAa;IAEvC,OAAO,CAAC,eAAe,CAA+B;;IAyBtD,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,qBAAqB;IAuH7B,OAAO,CAAC,uBAAuB;IA6D/B,OAAO,CAAC,gBAAgB;YAMV,sBAAsB;IA6BpC,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;YACW,sBAAsB;IAmBpC;;;OAGG;YACW,wBAAwB;IAwJtC,OAAO,CAAC,iBAAiB;YAqBX,uBAAuB;IAwBrC,OAAO,CAAC,UAAU;YAuXJ,qBAAqB;YAmFrB,kBAAkB;YAuClB,iBAAiB;YA6CjB,oBAAoB;YAoEpB,2BAA2B;YAiF3B,qBAAqB;YA6ErB,oBAAoB;YA6GpB,4BAA4B;YA2I5B,yBAAyB;YAgGzB,0BAA0B;YA8F1B,uBAAuB;YA6GvB,6BAA6B;YAyE7B,yBAAyB;YAmFzB,sBAAsB;YAiDtB,0BAA0B;IA0BxC,OAAO,CAAC,cAAc;IAuEtB,OAAO,CAAC,YAAY;IA8DpB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,sBAAsB;IAqF9B,OAAO,CAAC,iBAAiB;IAiGzB,OAAO,CAAC,aAAa;IAyHrB,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,OAAO;CAUtB;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}