agenthub-multiagent-mcp 1.67.0 → 1.69.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/dist/channel.js +24 -8
- package/dist/channel.js.map +1 -1
- package/dist/client.d.ts +6 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -4
- package/dist/client.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/messageIdempotency.d.ts +41 -0
- package/dist/messageIdempotency.d.ts.map +1 -0
- package/dist/messageIdempotency.js +65 -0
- package/dist/messageIdempotency.js.map +1 -0
- package/dist/messageIdempotency.test.d.ts +2 -0
- package/dist/messageIdempotency.test.d.ts.map +1 -0
- package/dist/messageIdempotency.test.js +130 -0
- package/dist/messageIdempotency.test.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +29 -5
- package/dist/tools/index.js.map +1 -1
- package/dist/websocket.d.ts +20 -1
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +33 -2
- package/dist/websocket.js.map +1 -1
- package/dist/websocketAuth.test.d.ts +10 -0
- package/dist/websocketAuth.test.d.ts.map +1 -0
- package/dist/websocketAuth.test.js +57 -0
- package/dist/websocketAuth.test.js.map +1 -0
- package/package.json +1 -1
package/dist/websocket.d.ts
CHANGED
|
@@ -28,10 +28,29 @@ export interface PushedItems {
|
|
|
28
28
|
messages: Message[];
|
|
29
29
|
}
|
|
30
30
|
export type PushCallback = (type: "task" | "message" | "event_notification", summary: string) => void;
|
|
31
|
+
/**
|
|
32
|
+
* Handshake headers for the MCP server's per-agent socket
|
|
33
|
+
* (fix-mcp-websocket-connect-token).
|
|
34
|
+
*
|
|
35
|
+
* The connect token is the credential the server binds to the agent in the
|
|
36
|
+
* path. This socket used to send only the org key, which the server compares
|
|
37
|
+
* against one static value — once that stopped matching, every push to every
|
|
38
|
+
* interactive session was refused with 401 while REST tool calls kept working.
|
|
39
|
+
* The key still rides alongside for servers that predate
|
|
40
|
+
* fix-websocket-connect-token-auth.
|
|
41
|
+
*
|
|
42
|
+
* Deliberately NOT `X-AgentHub-Channel`: that header is how the server tells a
|
|
43
|
+
* steer-capable channel subscriber (channelSocketHeaders) from this socket.
|
|
44
|
+
*/
|
|
45
|
+
export declare function agentSocketHeaders(creds: {
|
|
46
|
+
connectToken?: string | null;
|
|
47
|
+
apiKey?: string | null;
|
|
48
|
+
}): Record<string, string>;
|
|
31
49
|
export declare class WebSocketClient {
|
|
32
50
|
private ws;
|
|
33
51
|
private baseUrl;
|
|
34
52
|
private apiKey;
|
|
53
|
+
private getConnectToken;
|
|
35
54
|
private agentId;
|
|
36
55
|
private reconnectAttempts;
|
|
37
56
|
private maxReconnectAttempts;
|
|
@@ -42,7 +61,7 @@ export declare class WebSocketClient {
|
|
|
42
61
|
private pushCallback;
|
|
43
62
|
private pushedTasks;
|
|
44
63
|
private pushedMessages;
|
|
45
|
-
constructor(baseUrl: string, apiKey: string);
|
|
64
|
+
constructor(baseUrl: string, apiKey: string, getConnectToken?: () => string | null | undefined);
|
|
46
65
|
/**
|
|
47
66
|
* Register a callback for when pushed items arrive (messages/tasks).
|
|
48
67
|
* Used to send MCP logging notifications to Claude Code.
|
package/dist/websocket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEtG,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAExD,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;IACvC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,QAAQ,EAAE,OAAO,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAEtG;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKzB;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAGvB,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAA6B;IAGjD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,cAAc,CAAiB;gBAGrC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,eAAe,GAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAsB;IAW/D;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIpC;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IA+D9B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgErB;;OAEG;IACH,OAAO,CAAC,OAAO;IAQf;;OAEG;IACH,OAAO,CAAC,IAAI;IAUZ;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA0BzB;;;;;;;;;;OAUG;IACH,eAAe,IAAI,WAAW;IAO9B;;;;;;;OAOG;IACH,iBAAiB,CAAC,QAAQ,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAAG,IAAI;IAWhF;;;;;;;OAOG;IACH,cAAc,IAAI,WAAW;IAU7B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,KAAK,IAAI,IAAI;CAuBd"}
|
package/dist/websocket.js
CHANGED
|
@@ -5,10 +5,35 @@
|
|
|
5
5
|
* for inclusion in tool responses.
|
|
6
6
|
*/
|
|
7
7
|
import WebSocket from "ws";
|
|
8
|
+
/**
|
|
9
|
+
* Handshake headers for the MCP server's per-agent socket
|
|
10
|
+
* (fix-mcp-websocket-connect-token).
|
|
11
|
+
*
|
|
12
|
+
* The connect token is the credential the server binds to the agent in the
|
|
13
|
+
* path. This socket used to send only the org key, which the server compares
|
|
14
|
+
* against one static value — once that stopped matching, every push to every
|
|
15
|
+
* interactive session was refused with 401 while REST tool calls kept working.
|
|
16
|
+
* The key still rides alongside for servers that predate
|
|
17
|
+
* fix-websocket-connect-token-auth.
|
|
18
|
+
*
|
|
19
|
+
* Deliberately NOT `X-AgentHub-Channel`: that header is how the server tells a
|
|
20
|
+
* steer-capable channel subscriber (channelSocketHeaders) from this socket.
|
|
21
|
+
*/
|
|
22
|
+
export function agentSocketHeaders(creds) {
|
|
23
|
+
const headers = {};
|
|
24
|
+
if (creds.connectToken)
|
|
25
|
+
headers["X-Connect-Token"] = creds.connectToken;
|
|
26
|
+
if (creds.apiKey)
|
|
27
|
+
headers["X-API-Key"] = creds.apiKey;
|
|
28
|
+
return headers;
|
|
29
|
+
}
|
|
8
30
|
export class WebSocketClient {
|
|
9
31
|
ws = null;
|
|
10
32
|
baseUrl;
|
|
11
33
|
apiKey;
|
|
34
|
+
// Read on every connect, not captured once: the token is minted or replaced
|
|
35
|
+
// after start-up (register, reconnect, replace_token).
|
|
36
|
+
getConnectToken;
|
|
12
37
|
agentId = null;
|
|
13
38
|
reconnectAttempts = 0;
|
|
14
39
|
maxReconnectAttempts = 5;
|
|
@@ -20,13 +45,14 @@ export class WebSocketClient {
|
|
|
20
45
|
// Queue for pushed items
|
|
21
46
|
pushedTasks = [];
|
|
22
47
|
pushedMessages = [];
|
|
23
|
-
constructor(baseUrl, apiKey) {
|
|
48
|
+
constructor(baseUrl, apiKey, getConnectToken = () => null) {
|
|
24
49
|
// Convert HTTP URL to WebSocket URL
|
|
25
50
|
this.baseUrl = baseUrl
|
|
26
51
|
.replace(/^https:/, "wss:")
|
|
27
52
|
.replace(/^http:/, "ws:")
|
|
28
53
|
.replace(/\/$/, "");
|
|
29
54
|
this.apiKey = apiKey;
|
|
55
|
+
this.getConnectToken = getConnectToken;
|
|
30
56
|
}
|
|
31
57
|
/**
|
|
32
58
|
* Register a callback for when pushed items arrive (messages/tasks).
|
|
@@ -47,7 +73,12 @@ export class WebSocketClient {
|
|
|
47
73
|
this.isClosing = false;
|
|
48
74
|
const url = `${this.baseUrl}/ws/agents/${agentId}`;
|
|
49
75
|
try {
|
|
50
|
-
this.ws = new WebSocket(url, {
|
|
76
|
+
this.ws = new WebSocket(url, {
|
|
77
|
+
headers: agentSocketHeaders({
|
|
78
|
+
connectToken: this.getConnectToken(),
|
|
79
|
+
apiKey: this.apiKey,
|
|
80
|
+
}),
|
|
81
|
+
});
|
|
51
82
|
this.ws.on("open", () => {
|
|
52
83
|
this.isConnecting = false;
|
|
53
84
|
this.reconnectAttempts = 0;
|
package/dist/websocket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,SAAS,MAAM,IAAI,CAAC;AA8B3B,MAAM,OAAO,eAAe;IAClB,EAAE,GAAqB,IAAI,CAAC;IAC5B,OAAO,CAAS;IAChB,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fix-mcp-websocket-connect-token — the MCP server's own socket presents the
|
|
3
|
+
* agent's connect token.
|
|
4
|
+
*
|
|
5
|
+
* It sent only the org key, which the server compares against one static value;
|
|
6
|
+
* once that key stopped matching, every push to every interactive session was
|
|
7
|
+
* refused with 401 while REST tool calls kept working, so nothing looked broken.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=websocketAuth.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketAuth.test.d.ts","sourceRoot":"","sources":["../src/websocketAuth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fix-mcp-websocket-connect-token — the MCP server's own socket presents the
|
|
3
|
+
* agent's connect token.
|
|
4
|
+
*
|
|
5
|
+
* It sent only the org key, which the server compares against one static value;
|
|
6
|
+
* once that key stopped matching, every push to every interactive session was
|
|
7
|
+
* refused with 401 while REST tool calls kept working, so nothing looked broken.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, it, expect } from "vitest";
|
|
10
|
+
import { WebSocketServer } from "ws";
|
|
11
|
+
import { WebSocketClient, agentSocketHeaders } from "./websocket.js";
|
|
12
|
+
describe("agentSocketHeaders", () => {
|
|
13
|
+
it("sends the connect token and the key when both are held", () => {
|
|
14
|
+
expect(agentSocketHeaders({ connectToken: "tok", apiKey: "key" })).toEqual({
|
|
15
|
+
"X-Connect-Token": "tok",
|
|
16
|
+
"X-API-Key": "key",
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
it("falls back to the key alone without a token", () => {
|
|
20
|
+
expect(agentSocketHeaders({ connectToken: null, apiKey: "key" })).toEqual({
|
|
21
|
+
"X-API-Key": "key",
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
it("never claims to be a channel subscriber", () => {
|
|
25
|
+
const headers = agentSocketHeaders({ connectToken: "tok", apiKey: "key" });
|
|
26
|
+
expect(Object.keys(headers)).not.toContain("X-AgentHub-Channel");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("WebSocketClient handshake", () => {
|
|
30
|
+
it("reads the token at connect time, not at construction", async () => {
|
|
31
|
+
const wss = new WebSocketServer({ port: 0 });
|
|
32
|
+
const seen = [];
|
|
33
|
+
const connected = new Promise((resolve) => {
|
|
34
|
+
wss.on("connection", (_socket, req) => {
|
|
35
|
+
seen.push(req.headers);
|
|
36
|
+
resolve();
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
const { port } = wss.address();
|
|
40
|
+
// Constructed before any token exists — as at MCP start-up, before
|
|
41
|
+
// agent_register or reconnect has minted one.
|
|
42
|
+
let token = null;
|
|
43
|
+
const client = new WebSocketClient(`http://127.0.0.1:${port}`, "key", () => token);
|
|
44
|
+
token = "minted-later";
|
|
45
|
+
try {
|
|
46
|
+
client.connect("agent-a");
|
|
47
|
+
await connected;
|
|
48
|
+
expect(seen[0]["x-connect-token"]).toBe("minted-later");
|
|
49
|
+
expect(seen[0]["x-api-key"]).toBe("key");
|
|
50
|
+
}
|
|
51
|
+
finally {
|
|
52
|
+
client.close();
|
|
53
|
+
await new Promise((resolve) => wss.close(() => resolve()));
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=websocketAuth.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocketAuth.test.js","sourceRoot":"","sources":["../src/websocketAuth.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,IAAI,CAAC;AAGrC,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAErE,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACzE,iBAAiB,EAAE,KAAK;YACxB,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,kBAAkB,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;YACxE,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,MAAM,GAAG,GAAG,IAAI,eAAe,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAA0B,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC9C,GAAG,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,EAAE;gBACpC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACvB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,OAAO,EAAiB,CAAC;QAE9C,mEAAmE;QACnE,8CAA8C;QAC9C,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,oBAAoB,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,GAAG,cAAc,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1B,MAAM,SAAS,CAAC;YAChB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACxD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|