@ccpocket-base-auth/bridge 1.26.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 (89) hide show
  1. package/README.md +67 -0
  2. package/dist/archive-store.d.ts +28 -0
  3. package/dist/archive-store.js +68 -0
  4. package/dist/archive-store.js.map +1 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.js +82 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/codex-process.d.ts +171 -0
  9. package/dist/codex-process.js +1928 -0
  10. package/dist/codex-process.js.map +1 -0
  11. package/dist/debug-trace-store.d.ts +15 -0
  12. package/dist/debug-trace-store.js +78 -0
  13. package/dist/debug-trace-store.js.map +1 -0
  14. package/dist/doctor.d.ts +58 -0
  15. package/dist/doctor.js +663 -0
  16. package/dist/doctor.js.map +1 -0
  17. package/dist/firebase-auth.d.ts +35 -0
  18. package/dist/firebase-auth.js +132 -0
  19. package/dist/firebase-auth.js.map +1 -0
  20. package/dist/gallery-store.d.ts +67 -0
  21. package/dist/gallery-store.js +333 -0
  22. package/dist/gallery-store.js.map +1 -0
  23. package/dist/image-store.d.ts +23 -0
  24. package/dist/image-store.js +142 -0
  25. package/dist/image-store.js.map +1 -0
  26. package/dist/index.d.ts +1 -0
  27. package/dist/index.js +191 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/mdns.d.ts +7 -0
  30. package/dist/mdns.js +49 -0
  31. package/dist/mdns.js.map +1 -0
  32. package/dist/parser.d.ts +465 -0
  33. package/dist/parser.js +251 -0
  34. package/dist/parser.js.map +1 -0
  35. package/dist/project-history.d.ts +10 -0
  36. package/dist/project-history.js +73 -0
  37. package/dist/project-history.js.map +1 -0
  38. package/dist/prompt-history-backup.d.ts +15 -0
  39. package/dist/prompt-history-backup.js +46 -0
  40. package/dist/prompt-history-backup.js.map +1 -0
  41. package/dist/proxy.d.ts +15 -0
  42. package/dist/proxy.js +95 -0
  43. package/dist/proxy.js.map +1 -0
  44. package/dist/push-i18n.d.ts +7 -0
  45. package/dist/push-i18n.js +75 -0
  46. package/dist/push-i18n.js.map +1 -0
  47. package/dist/push-relay.d.ts +29 -0
  48. package/dist/push-relay.js +70 -0
  49. package/dist/push-relay.js.map +1 -0
  50. package/dist/recording-store.d.ts +51 -0
  51. package/dist/recording-store.js +158 -0
  52. package/dist/recording-store.js.map +1 -0
  53. package/dist/screenshot.d.ts +28 -0
  54. package/dist/screenshot.js +98 -0
  55. package/dist/screenshot.js.map +1 -0
  56. package/dist/sdk-process.d.ts +180 -0
  57. package/dist/sdk-process.js +937 -0
  58. package/dist/sdk-process.js.map +1 -0
  59. package/dist/session.d.ts +142 -0
  60. package/dist/session.js +615 -0
  61. package/dist/session.js.map +1 -0
  62. package/dist/sessions-index.d.ts +128 -0
  63. package/dist/sessions-index.js +1767 -0
  64. package/dist/sessions-index.js.map +1 -0
  65. package/dist/setup-launchd.d.ts +8 -0
  66. package/dist/setup-launchd.js +109 -0
  67. package/dist/setup-launchd.js.map +1 -0
  68. package/dist/setup-systemd.d.ts +8 -0
  69. package/dist/setup-systemd.js +118 -0
  70. package/dist/setup-systemd.js.map +1 -0
  71. package/dist/startup-info.d.ts +8 -0
  72. package/dist/startup-info.js +92 -0
  73. package/dist/startup-info.js.map +1 -0
  74. package/dist/usage.d.ts +69 -0
  75. package/dist/usage.js +545 -0
  76. package/dist/usage.js.map +1 -0
  77. package/dist/version.d.ts +13 -0
  78. package/dist/version.js +43 -0
  79. package/dist/version.js.map +1 -0
  80. package/dist/websocket.d.ts +127 -0
  81. package/dist/websocket.js +2482 -0
  82. package/dist/websocket.js.map +1 -0
  83. package/dist/worktree-store.d.ts +25 -0
  84. package/dist/worktree-store.js +59 -0
  85. package/dist/worktree-store.js.map +1 -0
  86. package/dist/worktree.d.ts +47 -0
  87. package/dist/worktree.js +313 -0
  88. package/dist/worktree.js.map +1 -0
  89. package/package.json +68 -0
@@ -0,0 +1,142 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFile, stat } from "node:fs/promises";
3
+ import { extname, isAbsolute, resolve } from "node:path";
4
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB
5
+ const MAX_ENTRIES = 100;
6
+ const MIME_TYPES = {
7
+ ".png": "image/png",
8
+ ".jpg": "image/jpeg",
9
+ ".jpeg": "image/jpeg",
10
+ ".gif": "image/gif",
11
+ ".webp": "image/webp",
12
+ };
13
+ // Matches absolute paths ending with image extensions
14
+ const IMAGE_PATH_RE = /(\/[\w./_-]+\.(?:png|jpe?g|gif|webp))/gi;
15
+ export class ImageStore {
16
+ store = new Map();
17
+ async resolveReadablePath(filePath, projectPath) {
18
+ const candidates = [];
19
+ if (projectPath) {
20
+ if (isAbsolute(filePath)) {
21
+ candidates.push(filePath);
22
+ // Tool outputs sometimes return project-root-relative paths with a
23
+ // leading slash (e.g. /images/foo.png). Try resolving against project.
24
+ candidates.push(resolve(projectPath, filePath.replace(/^\/+/, "")));
25
+ }
26
+ else {
27
+ candidates.push(resolve(projectPath, filePath));
28
+ candidates.push(filePath);
29
+ }
30
+ }
31
+ else {
32
+ candidates.push(filePath);
33
+ }
34
+ for (const candidate of candidates) {
35
+ try {
36
+ const st = await stat(candidate);
37
+ if (st.isFile() && st.size <= MAX_FILE_SIZE)
38
+ return candidate;
39
+ }
40
+ catch {
41
+ // Try next candidate.
42
+ }
43
+ }
44
+ return null;
45
+ }
46
+ /** Evict least-recently-used entries if store exceeds MAX_ENTRIES. */
47
+ evictLRU() {
48
+ while (this.store.size > MAX_ENTRIES) {
49
+ let oldestId = null;
50
+ let oldestTime = Infinity;
51
+ for (const [key, val] of this.store) {
52
+ if (val.accessedAt < oldestTime) {
53
+ oldestTime = val.accessedAt;
54
+ oldestId = key;
55
+ }
56
+ }
57
+ if (oldestId)
58
+ this.store.delete(oldestId);
59
+ }
60
+ }
61
+ /** Extract local image file paths from text (ignores URLs). */
62
+ extractImagePaths(text) {
63
+ const str = typeof text === "string" ? text : JSON.stringify(text ?? "");
64
+ const matches = str.match(IMAGE_PATH_RE);
65
+ if (!matches)
66
+ return [];
67
+ // Filter out URLs (paths starting with //) and deduplicate
68
+ const localPaths = matches.filter((p) => !p.startsWith("//"));
69
+ return [...new Set(localPaths)];
70
+ }
71
+ /** Register an image from raw base64 data. Returns an ImageRef with a URL for HTTP access. */
72
+ registerFromBase64(base64Data, mimeType) {
73
+ try {
74
+ const buffer = Buffer.from(base64Data, "base64");
75
+ if (buffer.length > MAX_FILE_SIZE) {
76
+ console.warn(`[image-store] Skipping base64 image (>10MB)`);
77
+ return null;
78
+ }
79
+ const id = randomUUID();
80
+ this.store.set(id, { id, mimeType, buffer, accessedAt: Date.now() });
81
+ this.evictLRU();
82
+ return { id, url: `/images/${id}`, mimeType };
83
+ }
84
+ catch (err) {
85
+ console.warn(`[image-store] Failed to register base64 image:`, err);
86
+ return null;
87
+ }
88
+ }
89
+ /** Read files from disk, assign UUIDs, store in memory. */
90
+ async registerImages(paths, projectPath) {
91
+ const refs = [];
92
+ for (const filePath of paths) {
93
+ try {
94
+ const resolvedPath = await this.resolveReadablePath(filePath, projectPath);
95
+ if (!resolvedPath) {
96
+ console.warn(`[image-store] Skipping ${filePath} (not file or >10MB)`);
97
+ continue;
98
+ }
99
+ const ext = extname(resolvedPath).toLowerCase();
100
+ const mimeType = MIME_TYPES[ext];
101
+ if (!mimeType)
102
+ continue;
103
+ const buffer = await readFile(resolvedPath);
104
+ const id = randomUUID();
105
+ this.store.set(id, { id, mimeType, buffer, accessedAt: Date.now() });
106
+ const ref = { id, url: `/images/${id}`, mimeType };
107
+ refs.push(ref);
108
+ this.evictLRU();
109
+ }
110
+ catch (err) {
111
+ console.warn(`[image-store] Failed to read ${filePath}:`, err);
112
+ }
113
+ }
114
+ return refs;
115
+ }
116
+ /**
117
+ * Handle HTTP request for image serving.
118
+ * Returns true if the request was handled, false otherwise.
119
+ */
120
+ handleRequest(req, res) {
121
+ const url = req.url ?? "";
122
+ const match = url.match(/^\/images\/([a-f0-9-]+)$/);
123
+ if (!match)
124
+ return false;
125
+ const id = match[1];
126
+ const entry = this.store.get(id);
127
+ if (!entry) {
128
+ res.writeHead(404, { "Content-Type": "text/plain" });
129
+ res.end("Not Found");
130
+ return true;
131
+ }
132
+ entry.accessedAt = Date.now();
133
+ res.writeHead(200, {
134
+ "Content-Type": entry.mimeType,
135
+ "Content-Length": entry.buffer.length,
136
+ "Cache-Control": "public, max-age=3600",
137
+ });
138
+ res.end(entry.buffer);
139
+ return true;
140
+ }
141
+ }
142
+ //# sourceMappingURL=image-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"image-store.js","sourceRoot":"","sources":["../src/image-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function startServer(): Promise<void>;
package/dist/index.js ADDED
@@ -0,0 +1,191 @@
1
+ import { createServer } from "node:http";
2
+ import { homedir } from "node:os";
3
+ import { resolve } from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { setupProxy } from "./proxy.js";
6
+ import { BridgeWebSocketServer } from "./websocket.js";
7
+ import { ImageStore } from "./image-store.js";
8
+ import { GalleryStore } from "./gallery-store.js";
9
+ import { printStartupInfo } from "./startup-info.js";
10
+ import { MdnsAdvertiser } from "./mdns.js";
11
+ import { ProjectHistory } from "./project-history.js";
12
+ import { getVersionInfo } from "./version.js";
13
+ import { fetchAllUsage } from "./usage.js";
14
+ import { runDoctor } from "./doctor.js";
15
+ import { DebugTraceStore } from "./debug-trace-store.js";
16
+ import { RecordingStore } from "./recording-store.js";
17
+ import { FirebaseAuthClient } from "./firebase-auth.js";
18
+ import { PromptHistoryBackupStore } from "./prompt-history-backup.js";
19
+ export async function startServer() {
20
+ const PORT = parseInt(process.env.BRIDGE_PORT ?? "8765", 10);
21
+ const HOST = process.env.BRIDGE_HOST ?? "0.0.0.0";
22
+ const API_KEY = process.env.BRIDGE_API_KEY;
23
+ // Parse allowed project directories (default: $HOME)
24
+ const ALLOWED_DIRS = process.env.BRIDGE_ALLOWED_DIRS
25
+ ? process.env.BRIDGE_ALLOWED_DIRS.split(",").map((d) => resolve(d.trim())).filter(Boolean)
26
+ : [homedir()];
27
+ console.log("[bridge] Starting ccpocket bridge server...");
28
+ if (API_KEY) {
29
+ console.log("[bridge] API key authentication enabled");
30
+ }
31
+ console.log(`[bridge] Allowed dirs: ${ALLOWED_DIRS.join(", ")}`);
32
+ // Initialize Firebase Anonymous Auth for push notifications
33
+ let firebaseAuth;
34
+ try {
35
+ firebaseAuth = new FirebaseAuthClient();
36
+ await firebaseAuth.initialize();
37
+ console.log("[bridge] Push relay enabled (Firebase Anonymous Auth)");
38
+ }
39
+ catch (err) {
40
+ console.warn("[bridge] Push relay disabled: Firebase auth failed:", err);
41
+ firebaseAuth = undefined;
42
+ }
43
+ const imageStore = new ImageStore();
44
+ const galleryStore = new GalleryStore();
45
+ const projectHistory = new ProjectHistory();
46
+ const debugTraceStore = new DebugTraceStore();
47
+ const RECORDING_ENABLED = !!process.env.BRIDGE_RECORDING;
48
+ const recordingStore = RECORDING_ENABLED ? new RecordingStore() : undefined;
49
+ const promptHistoryBackup = new PromptHistoryBackupStore();
50
+ const mdns = new MdnsAdvertiser();
51
+ // Initialize stores (async)
52
+ galleryStore.init().then(() => {
53
+ console.log("[bridge] Gallery store initialized");
54
+ }).catch((err) => {
55
+ console.error("[bridge] Failed to initialize gallery store:", err);
56
+ });
57
+ projectHistory.init().then(() => {
58
+ console.log("[bridge] Project history initialized");
59
+ }).catch((err) => {
60
+ console.error("[bridge] Failed to initialize project history:", err);
61
+ });
62
+ debugTraceStore.init().then(() => {
63
+ console.log("[bridge] Debug trace store initialized");
64
+ }).catch((err) => {
65
+ console.error("[bridge] Failed to initialize debug trace store:", err);
66
+ });
67
+ if (recordingStore) {
68
+ recordingStore.init().then(() => {
69
+ console.log("[bridge] Recording enabled");
70
+ }).catch((err) => {
71
+ console.error("[bridge] Failed to initialize recording store:", err);
72
+ });
73
+ }
74
+ promptHistoryBackup.init().then(() => {
75
+ console.log("[bridge] Prompt history backup store initialized");
76
+ }).catch((err) => {
77
+ console.error("[bridge] Failed to initialize prompt history backup store:", err);
78
+ });
79
+ const startedAt = Date.now();
80
+ let wsServer = null;
81
+ const httpServer = createServer((req, res) => {
82
+ // CORS headers for Flutter Web clients
83
+ res.setHeader("Access-Control-Allow-Origin", "*");
84
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, OPTIONS");
85
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
86
+ if (req.method === "OPTIONS") {
87
+ res.writeHead(204);
88
+ res.end();
89
+ return;
90
+ }
91
+ // Health check endpoint
92
+ if (req.url === "/health" && req.method === "GET") {
93
+ const body = JSON.stringify({
94
+ status: "ok",
95
+ uptime: Math.floor((Date.now() - startedAt) / 1000),
96
+ sessions: wsServer?.sessionCount ?? 0,
97
+ clients: wsServer?.clientCount ?? 0,
98
+ });
99
+ res.writeHead(200, { "Content-Type": "application/json" });
100
+ res.end(body);
101
+ return;
102
+ }
103
+ // Version info endpoint
104
+ if (req.url === "/version" && req.method === "GET") {
105
+ const body = JSON.stringify(getVersionInfo(startedAt));
106
+ res.writeHead(200, { "Content-Type": "application/json" });
107
+ res.end(body);
108
+ return;
109
+ }
110
+ // Usage endpoint
111
+ if (req.url === "/usage" && req.method === "GET") {
112
+ fetchAllUsage()
113
+ .then((providers) => {
114
+ res.writeHead(200, { "Content-Type": "application/json" });
115
+ res.end(JSON.stringify({ providers }));
116
+ })
117
+ .catch((err) => {
118
+ res.writeHead(500, { "Content-Type": "application/json" });
119
+ res.end(JSON.stringify({ error: String(err) }));
120
+ });
121
+ return;
122
+ }
123
+ // Doctor endpoint
124
+ if (req.url === "/doctor" && req.method === "GET") {
125
+ runDoctor()
126
+ .then((report) => {
127
+ res.writeHead(200, { "Content-Type": "application/json" });
128
+ res.end(JSON.stringify(report));
129
+ })
130
+ .catch((err) => {
131
+ res.writeHead(500, { "Content-Type": "application/json" });
132
+ res.end(JSON.stringify({ error: String(err) }));
133
+ });
134
+ return;
135
+ }
136
+ // Serve images via ImageStore (in-memory, session-scoped)
137
+ if (imageStore.handleRequest(req, res))
138
+ return;
139
+ // Serve gallery images via GalleryStore (disk-persistent)
140
+ if (galleryStore.handleRequest(req, res))
141
+ return;
142
+ // Upload images via POST /api/gallery/upload
143
+ if (galleryStore.handleUploadRequest(req, res, (meta) => {
144
+ if (wsServer) {
145
+ const info = galleryStore.metaToInfo(meta);
146
+ wsServer.broadcastGalleryNewImage(info);
147
+ }
148
+ }))
149
+ return;
150
+ // Default 404 for unknown HTTP requests
151
+ res.writeHead(404, { "Content-Type": "text/plain" });
152
+ res.end("Not Found");
153
+ });
154
+ wsServer = new BridgeWebSocketServer({
155
+ server: httpServer,
156
+ apiKey: API_KEY,
157
+ allowedDirs: ALLOWED_DIRS,
158
+ imageStore,
159
+ galleryStore,
160
+ projectHistory,
161
+ debugTraceStore,
162
+ recordingStore,
163
+ firebaseAuth,
164
+ promptHistoryBackup,
165
+ });
166
+ httpServer.listen(PORT, HOST, () => {
167
+ console.log(`[bridge] Ready. Listening on http://${HOST}:${PORT} (HTTP + WebSocket)`);
168
+ mdns.start(PORT, API_KEY);
169
+ printStartupInfo(PORT, HOST, API_KEY);
170
+ });
171
+ function shutdown() {
172
+ console.log("\n[bridge] Shutting down gracefully...");
173
+ mdns.stop();
174
+ wsServer?.close();
175
+ httpServer.close();
176
+ process.exit(0);
177
+ }
178
+ process.on("SIGINT", shutdown);
179
+ process.on("SIGTERM", shutdown);
180
+ }
181
+ // Auto-start when executed directly (node dist/index.js, tsx src/index.ts)
182
+ const isDirectExecution = process.argv[1] &&
183
+ fileURLToPath(import.meta.url) === process.argv[1];
184
+ if (isDirectExecution) {
185
+ setupProxy();
186
+ startServer().catch((err) => {
187
+ console.error("[bridge] Failed to start:", err);
188
+ process.exit(1);
189
+ });
190
+ }
191
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/mdns.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare class MdnsAdvertiser {
2
+ private bonjour;
3
+ private service;
4
+ private disabled;
5
+ start(port: number, apiKey?: string): void;
6
+ stop(): void;
7
+ }
package/dist/mdns.js ADDED
@@ -0,0 +1,49 @@
1
+ import { Bonjour } from "bonjour-service";
2
+ export class MdnsAdvertiser {
3
+ bonjour = null;
4
+ service = null;
5
+ disabled = false;
6
+ start(port, apiKey) {
7
+ if (this.disabled)
8
+ return;
9
+ try {
10
+ this.bonjour = new Bonjour({}, (err) => {
11
+ console.warn(`[bridge] mDNS: transport error (non-fatal): ${err.message}`);
12
+ this.disabled = true;
13
+ this.stop();
14
+ });
15
+ this.service = this.bonjour.publish({
16
+ name: "ccpocket-bridge",
17
+ type: "ccpocket",
18
+ protocol: "tcp",
19
+ port,
20
+ probe: false, // Skip name collision check (same bridge restarting)
21
+ txt: {
22
+ version: "1",
23
+ auth: apiKey ? "required" : "none",
24
+ },
25
+ });
26
+ // Handle async errors (e.g. name already in use from a stale process)
27
+ this.service.on("error", (err) => {
28
+ console.warn(`[bridge] mDNS: service error (non-fatal): ${err.message}`);
29
+ });
30
+ console.log(`[bridge] mDNS: advertising _ccpocket._tcp on port ${port}`);
31
+ }
32
+ catch (err) {
33
+ console.warn(`[bridge] mDNS: failed to advertise (non-fatal): ${err instanceof Error ? err.message : err}`);
34
+ this.stop();
35
+ }
36
+ }
37
+ stop() {
38
+ if (this.service) {
39
+ this.service.stop?.();
40
+ this.service = null;
41
+ }
42
+ if (this.bonjour) {
43
+ this.bonjour.destroy();
44
+ this.bonjour = null;
45
+ }
46
+ console.log("[bridge] mDNS: stopped advertising");
47
+ }
48
+ }
49
+ //# sourceMappingURL=mdns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.js","sourceRoot":"","sources":["../src/mdns.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAgB,MAAM,iBAAiB,CAAC;AAExD,MAAM,OAAO,cAAc;IACjB,OAAO,GAAmB,IAAI,CAAC;IAC/B,OAAO,GAAmB,IAAI,CAAC;IAC/B,QAAQ,GAAG,KAAK,CAAC;IAEzB,KAAK,CAAC,IAAY,EAAE,MAAe;QACjC,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,GAAU,EAAE,EAAE;gBAC5C,OAAO,CAAC,IAAI,CACV,+CAA+C,GAAG,CAAC,OAAO,EAAE,CAC7D,CAAC;gBACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,CAAC,CAAC,CAAC;YACH,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBAClC,IAAI,EAAE,iBAAiB;gBACvB,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE,KAAK;gBACf,IAAI;gBACJ,KAAK,EAAE,KAAK,EAAE,qDAAqD;gBACnE,GAAG,EAAE;oBACH,OAAO,EAAE,GAAG;oBACZ,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM;iBACnC;aACF,CAAC,CAAC;YACH,sEAAsE;YACtE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;gBACtC,OAAO,CAAC,IAAI,CAAC,6CAA6C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,GAAG,CACT,qDAAqD,IAAI,EAAE,CAC5D,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,mDAAmD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;YAC5G,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IACpD,CAAC;CACF"}