opentunnel-cli 1.0.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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +284 -0
  3. package/dist/cli/index.d.ts +3 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +1357 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/client/NgrokClient.d.ts +40 -0
  8. package/dist/client/NgrokClient.d.ts.map +1 -0
  9. package/dist/client/NgrokClient.js +155 -0
  10. package/dist/client/NgrokClient.js.map +1 -0
  11. package/dist/client/TunnelClient.d.ts +47 -0
  12. package/dist/client/TunnelClient.d.ts.map +1 -0
  13. package/dist/client/TunnelClient.js +435 -0
  14. package/dist/client/TunnelClient.js.map +1 -0
  15. package/dist/client/index.d.ts +3 -0
  16. package/dist/client/index.d.ts.map +1 -0
  17. package/dist/client/index.js +8 -0
  18. package/dist/client/index.js.map +1 -0
  19. package/dist/dns/CloudflareDNS.d.ts +45 -0
  20. package/dist/dns/CloudflareDNS.d.ts.map +1 -0
  21. package/dist/dns/CloudflareDNS.js +286 -0
  22. package/dist/dns/CloudflareDNS.js.map +1 -0
  23. package/dist/dns/DuckDNS.d.ts +20 -0
  24. package/dist/dns/DuckDNS.d.ts.map +1 -0
  25. package/dist/dns/DuckDNS.js +109 -0
  26. package/dist/dns/DuckDNS.js.map +1 -0
  27. package/dist/dns/index.d.ts +3 -0
  28. package/dist/dns/index.d.ts.map +1 -0
  29. package/dist/dns/index.js +9 -0
  30. package/dist/dns/index.js.map +1 -0
  31. package/dist/index.d.ts +7 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +35 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/server/CertManager.d.ts +54 -0
  36. package/dist/server/CertManager.d.ts.map +1 -0
  37. package/dist/server/CertManager.js +414 -0
  38. package/dist/server/CertManager.js.map +1 -0
  39. package/dist/server/TunnelServer.d.ts +42 -0
  40. package/dist/server/TunnelServer.d.ts.map +1 -0
  41. package/dist/server/TunnelServer.js +790 -0
  42. package/dist/server/TunnelServer.js.map +1 -0
  43. package/dist/server/index.d.ts +3 -0
  44. package/dist/server/index.d.ts.map +1 -0
  45. package/dist/server/index.js +48 -0
  46. package/dist/server/index.js.map +1 -0
  47. package/dist/shared/types.d.ts +147 -0
  48. package/dist/shared/types.d.ts.map +1 -0
  49. package/dist/shared/types.js +3 -0
  50. package/dist/shared/types.js.map +1 -0
  51. package/dist/shared/utils.d.ts +29 -0
  52. package/dist/shared/utils.d.ts.map +1 -0
  53. package/dist/shared/utils.js +135 -0
  54. package/dist/shared/utils.js.map +1 -0
  55. package/package.json +66 -0
@@ -0,0 +1,435 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TunnelClient = void 0;
7
+ const http_1 = __importDefault(require("http"));
8
+ const https_1 = __importDefault(require("https"));
9
+ const net_1 = __importDefault(require("net"));
10
+ const ws_1 = __importDefault(require("ws"));
11
+ const events_1 = require("events");
12
+ const utils_1 = require("../shared/utils");
13
+ class TunnelClient extends events_1.EventEmitter {
14
+ constructor(config) {
15
+ super();
16
+ this.ws = null;
17
+ this.clientId = null;
18
+ this.authenticated = false;
19
+ this.tunnels = new Map();
20
+ this.pendingTunnels = new Map();
21
+ this.reconnectAttempts = 0;
22
+ this.maxReconnectAttempts = 10;
23
+ this.closed = false;
24
+ this.pingInterval = null;
25
+ this.pongTimeout = null;
26
+ this.lastPongTime = Date.now();
27
+ this.config = {
28
+ serverUrl: "ws://localhost:8080/_tunnel",
29
+ reconnect: true,
30
+ reconnectInterval: 3000,
31
+ silent: false,
32
+ ...config,
33
+ };
34
+ this.logger = new utils_1.Logger("Client", false, this.config.silent);
35
+ }
36
+ async connect() {
37
+ return new Promise((resolve, reject) => {
38
+ let connectionFailed = false;
39
+ let resolved = false;
40
+ try {
41
+ this.ws = new ws_1.default(this.config.serverUrl, {
42
+ handshakeTimeout: 10000,
43
+ perMessageDeflate: false,
44
+ rejectUnauthorized: this.config.rejectUnauthorized ?? true,
45
+ });
46
+ const connectionTimeout = setTimeout(() => {
47
+ if (!resolved) {
48
+ connectionFailed = true;
49
+ this.ws?.close();
50
+ reject(new Error(`Connection timeout - server not reachable at ${this.config.serverUrl}`));
51
+ }
52
+ }, 10000);
53
+ this.ws.on("open", () => {
54
+ clearTimeout(connectionTimeout);
55
+ this.reconnectAttempts = 0;
56
+ this.lastPongTime = Date.now();
57
+ // Start keepalive ping interval
58
+ this.startPingInterval();
59
+ // Send auth if token provided
60
+ if (this.config.token) {
61
+ this.send({
62
+ type: "auth",
63
+ id: (0, utils_1.generateId)(),
64
+ timestamp: Date.now(),
65
+ token: this.config.token,
66
+ });
67
+ }
68
+ });
69
+ // Handle WebSocket-level pong
70
+ this.ws.on("pong", () => {
71
+ this.lastPongTime = Date.now();
72
+ });
73
+ this.ws.on("message", (data) => {
74
+ // Any message counts as activity
75
+ this.lastPongTime = Date.now();
76
+ try {
77
+ const message = (0, utils_1.decodeMessage)(data.toString());
78
+ this.handleMessage(message, () => {
79
+ resolved = true;
80
+ clearTimeout(connectionTimeout);
81
+ resolve();
82
+ }, reject);
83
+ }
84
+ catch (err) {
85
+ this.logger.error("Failed to parse message");
86
+ }
87
+ });
88
+ this.ws.on("close", () => {
89
+ clearTimeout(connectionTimeout);
90
+ this.stopPingInterval();
91
+ this.authenticated = false;
92
+ if (!resolved && !connectionFailed) {
93
+ reject(new Error(`Connection closed - server at ${this.config.serverUrl} closed the connection`));
94
+ return;
95
+ }
96
+ this.emit("disconnected");
97
+ if (this.config.reconnect && !this.closed && resolved) {
98
+ this.attemptReconnect();
99
+ }
100
+ });
101
+ this.ws.on("error", (err) => {
102
+ clearTimeout(connectionTimeout);
103
+ this.stopPingInterval();
104
+ connectionFailed = true;
105
+ const errorMsg = this.getConnectionErrorMessage(err);
106
+ if (!resolved) {
107
+ reject(new Error(errorMsg));
108
+ }
109
+ });
110
+ }
111
+ catch (err) {
112
+ reject(new Error(`Failed to create connection: ${err.message}`));
113
+ }
114
+ });
115
+ }
116
+ startPingInterval() {
117
+ this.stopPingInterval();
118
+ // Send ping every 15 seconds
119
+ this.pingInterval = setInterval(() => {
120
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
121
+ // Check if we received pong recently (within 45 seconds)
122
+ const timeSinceLastPong = Date.now() - this.lastPongTime;
123
+ if (timeSinceLastPong > 45000) {
124
+ this.logger.warn("Server not responding to pings, reconnecting...");
125
+ this.ws.terminate();
126
+ return;
127
+ }
128
+ // Send WebSocket-level ping
129
+ this.ws.ping();
130
+ // Also send application-level ping for servers that don't support WS ping
131
+ this.send({
132
+ type: "ping",
133
+ id: (0, utils_1.generateId)(),
134
+ timestamp: Date.now(),
135
+ });
136
+ }
137
+ }, 15000);
138
+ }
139
+ stopPingInterval() {
140
+ if (this.pingInterval) {
141
+ clearInterval(this.pingInterval);
142
+ this.pingInterval = null;
143
+ }
144
+ if (this.pongTimeout) {
145
+ clearTimeout(this.pongTimeout);
146
+ this.pongTimeout = null;
147
+ }
148
+ }
149
+ getConnectionErrorMessage(err) {
150
+ const msg = err.message || "";
151
+ const code = err.code || "";
152
+ if (code === "ECONNREFUSED" || msg.includes("ECONNREFUSED")) {
153
+ return `Connection refused - server is not running at ${this.config.serverUrl}`;
154
+ }
155
+ if (code === "ENOTFOUND" || msg.includes("ENOTFOUND") || msg.includes("getaddrinfo")) {
156
+ return `Server not found - check the URL: ${this.config.serverUrl}`;
157
+ }
158
+ if (code === "ETIMEDOUT" || msg.includes("ETIMEDOUT")) {
159
+ return `Connection timed out - server not reachable at ${this.config.serverUrl}`;
160
+ }
161
+ if (code === "ECONNRESET" || msg.includes("ECONNRESET")) {
162
+ return `Connection reset by server at ${this.config.serverUrl}`;
163
+ }
164
+ if (msg.includes("Unexpected server response")) {
165
+ return `Invalid server response - check the URL: ${this.config.serverUrl}`;
166
+ }
167
+ // Try to get any useful info
168
+ const fullError = code ? `${code}: ${msg}` : msg;
169
+ return `Connection failed: ${fullError || "Server not reachable"} (${this.config.serverUrl})`;
170
+ }
171
+ async attemptReconnect() {
172
+ if (this.reconnectAttempts >= this.maxReconnectAttempts) {
173
+ this.logger.error("Max reconnect attempts reached");
174
+ this.emit("reconnect_failed");
175
+ return;
176
+ }
177
+ this.reconnectAttempts++;
178
+ this.logger.info(`Reconnecting... (attempt ${this.reconnectAttempts})`);
179
+ await (0, utils_1.sleep)(this.config.reconnectInterval);
180
+ try {
181
+ await this.connect();
182
+ // Re-establish tunnels
183
+ for (const tunnel of this.tunnels.values()) {
184
+ await this.createTunnel(tunnel.config);
185
+ }
186
+ }
187
+ catch {
188
+ // Will retry on close event
189
+ }
190
+ }
191
+ async disconnect() {
192
+ this.closed = true;
193
+ if (this.ws) {
194
+ this.ws.close();
195
+ this.ws = null;
196
+ }
197
+ }
198
+ async createTunnel(config) {
199
+ if (!this.authenticated) {
200
+ throw new Error("Not connected or authenticated");
201
+ }
202
+ const tunnelConfig = {
203
+ ...config,
204
+ id: (0, utils_1.generateId)(),
205
+ };
206
+ return new Promise((resolve, reject) => {
207
+ const requestId = (0, utils_1.generateId)();
208
+ this.pendingTunnels.set(requestId, { config: tunnelConfig, resolve, reject });
209
+ this.send({
210
+ type: "tunnel_request",
211
+ id: requestId,
212
+ timestamp: Date.now(),
213
+ config: tunnelConfig,
214
+ });
215
+ // Timeout
216
+ setTimeout(() => {
217
+ if (this.pendingTunnels.has(requestId)) {
218
+ this.pendingTunnels.delete(requestId);
219
+ reject(new Error("Tunnel request timeout"));
220
+ }
221
+ }, 10000);
222
+ });
223
+ }
224
+ async closeTunnel(tunnelId) {
225
+ const tunnel = this.tunnels.get(tunnelId);
226
+ if (tunnel) {
227
+ // Close all TCP connections
228
+ for (const socket of tunnel.tcpConnections.values()) {
229
+ socket.destroy();
230
+ }
231
+ this.tunnels.delete(tunnelId);
232
+ this.send({
233
+ type: "tunnel_close",
234
+ id: (0, utils_1.generateId)(),
235
+ timestamp: Date.now(),
236
+ tunnelId,
237
+ });
238
+ }
239
+ }
240
+ getTunnels() {
241
+ return Array.from(this.tunnels.values());
242
+ }
243
+ handleMessage(message, connectResolve, connectReject) {
244
+ switch (message.type) {
245
+ case "auth_response":
246
+ this.handleAuthResponse(message, connectResolve, connectReject);
247
+ break;
248
+ case "tunnel_response":
249
+ this.handleTunnelResponse(message);
250
+ break;
251
+ case "http_request":
252
+ this.handleHttpRequest(message);
253
+ break;
254
+ case "tcp_data":
255
+ this.handleTcpData(message);
256
+ break;
257
+ case "tcp_close":
258
+ this.handleTcpClose(message);
259
+ break;
260
+ case "pong":
261
+ this.emit("pong");
262
+ break;
263
+ }
264
+ }
265
+ handleAuthResponse(message, resolve, reject) {
266
+ if (message.success) {
267
+ this.authenticated = true;
268
+ this.clientId = message.clientId || null;
269
+ this.logger.info(`Authenticated as ${this.clientId}`);
270
+ this.emit("connected", { clientId: this.clientId });
271
+ resolve?.();
272
+ }
273
+ else {
274
+ this.logger.error(`Authentication failed: ${message.error}`);
275
+ this.emit("auth_failed", { error: message.error });
276
+ reject?.(new Error(message.error || "Authentication failed"));
277
+ }
278
+ }
279
+ handleTunnelResponse(message) {
280
+ // Find pending tunnel request
281
+ for (const [requestId, pending] of this.pendingTunnels.entries()) {
282
+ if (message.success && message.tunnelId && message.publicUrl) {
283
+ const tunnel = {
284
+ id: message.tunnelId,
285
+ config: pending.config,
286
+ publicUrl: message.publicUrl,
287
+ tcpConnections: new Map(),
288
+ };
289
+ this.tunnels.set(message.tunnelId, tunnel);
290
+ this.pendingTunnels.delete(requestId);
291
+ pending.resolve({ tunnelId: message.tunnelId, publicUrl: message.publicUrl });
292
+ this.emit("tunnel:created", { tunnelId: message.tunnelId, publicUrl: message.publicUrl });
293
+ return;
294
+ }
295
+ else {
296
+ this.pendingTunnels.delete(requestId);
297
+ pending.reject(new Error(message.error || "Failed to create tunnel"));
298
+ return;
299
+ }
300
+ }
301
+ }
302
+ async handleHttpRequest(message) {
303
+ const tunnel = this.tunnels.get(message.tunnelId);
304
+ if (!tunnel)
305
+ return;
306
+ const { localHost, localPort } = tunnel.config;
307
+ const isHttps = tunnel.config.protocol === "https";
308
+ try {
309
+ const response = await this.forwardHttpRequest(localHost, localPort, message, isHttps);
310
+ this.send({
311
+ type: "http_response",
312
+ id: (0, utils_1.generateId)(),
313
+ timestamp: Date.now(),
314
+ tunnelId: message.tunnelId,
315
+ requestId: message.requestId,
316
+ statusCode: response.statusCode,
317
+ headers: response.headers,
318
+ body: response.body,
319
+ isBase64: response.isBase64,
320
+ });
321
+ }
322
+ catch (err) {
323
+ this.send({
324
+ type: "http_response",
325
+ id: (0, utils_1.generateId)(),
326
+ timestamp: Date.now(),
327
+ tunnelId: message.tunnelId,
328
+ requestId: message.requestId,
329
+ statusCode: 502,
330
+ headers: { "content-type": "application/json" },
331
+ body: JSON.stringify({ error: err.message }),
332
+ });
333
+ }
334
+ }
335
+ forwardHttpRequest(host, port, request, useHttps) {
336
+ return new Promise((resolve, reject) => {
337
+ const httpModule = useHttps ? https_1.default : http_1.default;
338
+ // Preserve original Host header for proper URL generation in apps like Next.js
339
+ // Add X-Forwarded-* headers so the app knows it's behind a tunnel
340
+ const originalHost = request.headers.host || request.headers.Host;
341
+ const forwardedHeaders = {
342
+ ...request.headers,
343
+ "x-forwarded-host": originalHost,
344
+ "x-forwarded-proto": useHttps ? "https" : "http",
345
+ "x-forwarded-for": request.headers["x-forwarded-for"] || "127.0.0.1",
346
+ };
347
+ const options = {
348
+ hostname: host,
349
+ port,
350
+ path: request.path,
351
+ method: request.method,
352
+ headers: forwardedHeaders,
353
+ };
354
+ const req = httpModule.request(options, (res) => {
355
+ const chunks = [];
356
+ res.on("data", (chunk) => chunks.push(chunk));
357
+ res.on("end", () => {
358
+ // Use base64 encoding to preserve binary data (gzip, brotli, etc.)
359
+ const bodyBuffer = Buffer.concat(chunks);
360
+ resolve({
361
+ statusCode: res.statusCode || 500,
362
+ headers: res.headers,
363
+ body: bodyBuffer.toString("base64"),
364
+ isBase64: true,
365
+ });
366
+ });
367
+ });
368
+ req.on("error", reject);
369
+ req.setTimeout(30000, () => {
370
+ req.destroy();
371
+ reject(new Error("Request timeout"));
372
+ });
373
+ if (request.body) {
374
+ req.write(request.body);
375
+ }
376
+ req.end();
377
+ });
378
+ }
379
+ handleTcpData(message) {
380
+ const tunnel = this.tunnels.get(message.tunnelId);
381
+ if (!tunnel)
382
+ return;
383
+ let socket = tunnel.tcpConnections.get(message.connectionId);
384
+ if (!socket) {
385
+ // Create new connection to local service
386
+ socket = net_1.default.createConnection({
387
+ host: tunnel.config.localHost,
388
+ port: tunnel.config.localPort,
389
+ });
390
+ tunnel.tcpConnections.set(message.connectionId, socket);
391
+ socket.on("data", (data) => {
392
+ this.send({
393
+ type: "tcp_data",
394
+ id: (0, utils_1.generateId)(),
395
+ timestamp: Date.now(),
396
+ tunnelId: message.tunnelId,
397
+ connectionId: message.connectionId,
398
+ data: (0, utils_1.encodeBase64)(data),
399
+ });
400
+ });
401
+ socket.on("close", () => {
402
+ tunnel.tcpConnections.delete(message.connectionId);
403
+ this.send({
404
+ type: "tcp_close",
405
+ id: (0, utils_1.generateId)(),
406
+ timestamp: Date.now(),
407
+ tunnelId: message.tunnelId,
408
+ connectionId: message.connectionId,
409
+ });
410
+ });
411
+ socket.on("error", (err) => {
412
+ this.logger.error(`TCP connection error: ${err.message}`);
413
+ });
414
+ }
415
+ const data = (0, utils_1.decodeBase64)(message.data);
416
+ socket.write(data);
417
+ }
418
+ handleTcpClose(message) {
419
+ const tunnel = this.tunnels.get(message.tunnelId);
420
+ if (!tunnel)
421
+ return;
422
+ const socket = tunnel.tcpConnections.get(message.connectionId);
423
+ if (socket) {
424
+ socket.destroy();
425
+ tunnel.tcpConnections.delete(message.connectionId);
426
+ }
427
+ }
428
+ send(message) {
429
+ if (this.ws && this.ws.readyState === ws_1.default.OPEN) {
430
+ this.ws.send((0, utils_1.encodeMessage)(message));
431
+ }
432
+ }
433
+ }
434
+ exports.TunnelClient = TunnelClient;
435
+ //# sourceMappingURL=TunnelClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TunnelClient.js","sourceRoot":"","sources":["../../src/client/TunnelClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { TunnelClient } from "./TunnelClient";
2
+ export { NgrokClient } from "./NgrokClient";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NgrokClient = exports.TunnelClient = void 0;
4
+ var TunnelClient_1 = require("./TunnelClient");
5
+ Object.defineProperty(exports, "TunnelClient", { enumerable: true, get: function () { return TunnelClient_1.TunnelClient; } });
6
+ var NgrokClient_1 = require("./NgrokClient");
7
+ Object.defineProperty(exports, "NgrokClient", { enumerable: true, get: function () { return NgrokClient_1.NgrokClient; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":";;;AAAA,+CAA8C;AAArC,4GAAA,YAAY,OAAA;AACrB,6CAA4C;AAAnC,0GAAA,WAAW,OAAA"}
@@ -0,0 +1,45 @@
1
+ import { DnsProvider } from "../shared/types";
2
+ export declare class CloudflareDNS implements DnsProvider {
3
+ name: string;
4
+ private client;
5
+ private logger;
6
+ private zoneId;
7
+ private domain;
8
+ private basePath;
9
+ private serverIP;
10
+ private recordCache;
11
+ constructor(apiToken: string, domain: string, basePath?: string);
12
+ initialize(): Promise<boolean>;
13
+ private findZoneId;
14
+ getPublicIP(): Promise<string>;
15
+ /**
16
+ * Create or update a DNS A record for a subdomain
17
+ * Full record will be: subdomain.basePath.domain (e.g., myapp.op.example.com)
18
+ */
19
+ updateRecord(subdomain: string, ip?: string): Promise<boolean>;
20
+ /**
21
+ * Delete a DNS record for a subdomain
22
+ */
23
+ deleteRecord(subdomain: string): Promise<boolean>;
24
+ /**
25
+ * Find an existing DNS record by name
26
+ */
27
+ private findRecord;
28
+ /**
29
+ * Ensure wildcard record exists (*.op.domain.com)
30
+ * This is a fallback for subdomains not explicitly created
31
+ */
32
+ ensureWildcardRecord(): Promise<boolean>;
33
+ /**
34
+ * Ensure base domain record exists (op.domain.com)
35
+ */
36
+ ensureBaseRecord(): Promise<boolean>;
37
+ /**
38
+ * Setup all necessary DNS records for the tunnel server
39
+ * Creates: op.domain.com and *.op.domain.com
40
+ */
41
+ setupDNS(): Promise<boolean>;
42
+ getZoneId(): string | null;
43
+ getServerIP(): string | null;
44
+ }
45
+ //# sourceMappingURL=CloudflareDNS.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CloudflareDNS.d.ts","sourceRoot":"","sources":["../../src/dns/CloudflareDNS.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAU9C,qBAAa,aAAc,YAAW,WAAW;IACtC,IAAI,SAAgB;IAC3B,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,WAAW,CAAkC;gBAEzC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAa;IAO/D,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;YAqBtB,UAAU;IAiBlB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAWpC;;;OAGG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAwDpE;;OAEG;IACG,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6BvD;;OAEG;YACW,UAAU;IAyBxB;;;OAGG;IACG,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC;IA4C9C;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC;IA2C1C;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC;IAgBlC,SAAS,IAAI,MAAM,GAAG,IAAI;IAI1B,WAAW,IAAI,MAAM,GAAG,IAAI;CAG/B"}