@rotorsoft/act-http 1.10.0 → 1.10.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/dist/.tsbuildinfo +1 -1
- package/dist/@types/api/sse-wiring.d.ts +15 -8
- package/dist/@types/api/sse-wiring.d.ts.map +1 -1
- package/dist/@types/sse/broadcast.d.ts +19 -1
- package/dist/@types/sse/broadcast.d.ts.map +1 -1
- package/dist/@types/sse/state-cache.d.ts +8 -1
- package/dist/@types/sse/state-cache.d.ts.map +1 -1
- package/dist/@types/sse/types.d.ts +19 -0
- package/dist/@types/sse/types.d.ts.map +1 -1
- package/dist/api/index.cjs +6100 -1729
- package/dist/api/index.cjs.map +1 -1
- package/dist/api/index.js +3 -2
- package/dist/{chunk-BNEUODIM.js → chunk-EQDDWLTJ.js} +23 -4
- package/dist/chunk-EQDDWLTJ.js.map +1 -0
- package/dist/{chunk-WGFX4G27.js → chunk-IXMRQX4Y.js} +6078 -1726
- package/dist/chunk-IXMRQX4Y.js.map +1 -0
- package/dist/chunk-MKD3SM3N.js +9 -0
- package/dist/chunk-MKD3SM3N.js.map +1 -0
- package/dist/hono/index.cjs +6104 -1736
- package/dist/hono/index.cjs.map +1 -1
- package/dist/hono/index.js +6 -8
- package/dist/hono/index.js.map +1 -1
- package/dist/openapi/index.cjs +6106 -1754
- package/dist/openapi/index.cjs.map +1 -1
- package/dist/openapi/index.js +1 -1
- package/dist/sse/index.cjs +63 -20
- package/dist/sse/index.cjs.map +1 -1
- package/dist/sse/index.js +63 -20
- package/dist/sse/index.js.map +1 -1
- package/dist/trpc/index.cjs +6100 -1729
- package/dist/trpc/index.cjs.map +1 -1
- package/dist/trpc/index.js +3 -2
- package/dist/trpc/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-BNEUODIM.js.map +0 -1
- package/dist/chunk-WGFX4G27.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { BroadcastChannel } from "../sse/broadcast.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type BroadcastState } from "../sse/types.js";
|
|
3
3
|
/**
|
|
4
4
|
* SSE wiring options shared by the auto-generated `trpc` and `hono`
|
|
5
5
|
* transports. When supplied, each transport emits one streaming
|
|
@@ -53,10 +53,15 @@ export type SseOptions = {
|
|
|
53
53
|
* broadcast frames. A consumer that stalls (slow client, paused
|
|
54
54
|
* tab) can't drain frames as fast as a busy stream publishes them;
|
|
55
55
|
* without a bound the backlog grows until the process runs out of
|
|
56
|
-
* memory. When the backlog is full the
|
|
57
|
-
* to make room for the newest
|
|
58
|
-
*
|
|
59
|
-
*
|
|
56
|
+
* memory. When the backlog is full the oldest **version-keyed** frame
|
|
57
|
+
* is dropped to make room for the newest: the consumer sees the
|
|
58
|
+
* version gap, reports `behind`, and refetches, so it still converges
|
|
59
|
+
* on current state having skipped intermediate versions it was too
|
|
60
|
+
* slow to see.
|
|
61
|
+
*
|
|
62
|
+
* Version-neutral frames (`_overlay`, `_resync`) are never dropped
|
|
63
|
+
* silently — they create no gap to notice, so a backlog made only of
|
|
64
|
+
* them collapses into a single `_resync` instead (#1649).
|
|
60
65
|
*
|
|
61
66
|
* Default `256`. Validated range `[1, 100_000]`.
|
|
62
67
|
*/
|
|
@@ -92,9 +97,11 @@ export declare const DEFAULT_SSE_HEARTBEAT_MS = 30000;
|
|
|
92
97
|
* Default cap on the per-connection undelivered-frame backlog. Sized
|
|
93
98
|
* so a briefly-stalled consumer on a busy stream keeps recent history
|
|
94
99
|
* without letting a permanently-wedged client pin unbounded memory.
|
|
95
|
-
* At overflow the oldest frame is dropped
|
|
96
|
-
*
|
|
97
|
-
* state regardless of which intermediate versions it missed.
|
|
100
|
+
* At overflow the oldest version-keyed frame is dropped: it is a full
|
|
101
|
+
* version-keyed patch, so the consumer sees the gap and converges on
|
|
102
|
+
* current state regardless of which intermediate versions it missed.
|
|
103
|
+
* Version-neutral frames create no gap, so they collapse into a
|
|
104
|
+
* `_resync` rather than being dropped silently (#1649).
|
|
98
105
|
*/
|
|
99
106
|
export declare const DEFAULT_SSE_MAX_PENDING_PER_CONNECTION = 256;
|
|
100
107
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse-wiring.d.ts","sourceRoot":"","sources":["../../../src/api/sse-wiring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"sse-wiring.d.ts","sourceRoot":"","sources":["../../../src/api/sse-wiring.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,KAAK,cAAc,EAIpB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,UAAU,GAAG;IACvB;;;;;OAKG;IAEH,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAC3C,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,cAAc,CAAC,CAAC;IACnD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAC;CAC1C,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAE/C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAE/C;;;;;;;;;GASG;AACH,eAAO,MAAM,sCAAsC,MAAM,CAAC;AA+B1D;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,SAAS,CAY/D;AAED;;;;;;;;;GASG;AACH,qBAAa,oBAAoB;IAC/B,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,OAAO,CAAC,KAAK,CAAK;IAElB,YAAY,KAAK,EAAE,MAAM,EAExB;IAED;;;;OAIG;IACH,OAAO,IAAI,OAAO,CAIjB;IAED;;;;OAIG;IACH,OAAO,IAAI,IAAI,CAEd;IAED,qDAAqD;IACrD,IAAI,IAAI,IAAI,MAAM,CAEjB;CACF;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAE7E;AAED;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAC9B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,GAC5C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvD;;;;;;;;GAQG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,IAAI,OAAO,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B;;;;;OAKG;IACH,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,KAAK,CAAC;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B,CAAC;AAEF;;;;;;;;;;GAUG;AAEH,wBAAuB,kBAAkB,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,GAAG,EACtE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC5B,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,aAAa,GAAG,SAAS,EACrC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CA4EzC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StateCache } from "./state-cache.js";
|
|
2
|
-
import type
|
|
2
|
+
import { type BroadcastState, type PatchMessage, type Subscriber } from "./types.js";
|
|
3
3
|
export declare class BroadcastChannel<S extends BroadcastState = BroadcastState> {
|
|
4
4
|
private channels;
|
|
5
5
|
private state_cache;
|
|
@@ -34,6 +34,24 @@ export declare class BroadcastChannel<S extends BroadcastState = BroadcastState>
|
|
|
34
34
|
*/
|
|
35
35
|
cache_size?: number;
|
|
36
36
|
});
|
|
37
|
+
/**
|
|
38
|
+
* Fan a resync out to a stream's live subscribers. `applyPatchMessage`
|
|
39
|
+
* always reports `behind` for it, so they refetch.
|
|
40
|
+
*/
|
|
41
|
+
private broadcast_resync;
|
|
42
|
+
/**
|
|
43
|
+
* The LRU dropped an entry. If it carried overlay-contributed keys, that
|
|
44
|
+
* data existed only in the cache and is now gone: a later `publish()` has
|
|
45
|
+
* no baseline to carry it from, and the reseed a reconnecting client gets
|
|
46
|
+
* would silently lack presence a live client is still showing (#1648).
|
|
47
|
+
*
|
|
48
|
+
* `overlay()` was hardened for the same loss on its own path (#1423);
|
|
49
|
+
* catching it here covers `publish()` too, and does it at the moment the
|
|
50
|
+
* data is lost rather than at a later commit that may never come. Reading
|
|
51
|
+
* the marker off the entry being evicted is what avoids the parallel
|
|
52
|
+
* bookkeeping structure the `OVERLAY_KEYS` design explicitly rejected.
|
|
53
|
+
*/
|
|
54
|
+
private on_cache_evict;
|
|
37
55
|
/**
|
|
38
56
|
* Publish domain patches from a commit.
|
|
39
57
|
* patches[i] corresponds to version baseV + i + 1.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/sse/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"broadcast.d.ts","sourceRoot":"","sources":["../../../src/sse/broadcast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,YAAY,EAEjB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAoLpB,qBAAa,gBAAgB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IACrE,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,WAAW,CAAgB;IAEnC;;;OAGG;IACH,OAAO,CAAC,mBAAmB,CAA6C;IACxE,OAAO,CAAC,eAAe,CAA6B;IAEpD,YAAY,OAAO,CAAC,EAAE;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB;;;;;;WAMG;QACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QAC3C;;;;;;WAMG;QACH,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QAC/D;;;;WAIG;QACH,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,EAQA;IAED;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAMxB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,cAAc;IAMtB;;;;;;;OAOG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,CAAC,EACR,OAAO,GAAE,OAAO,CAAC,CAAC,CAAC,EAAO,GACzB,YAAY,CAAC,CAAC,CAAC,CAwCjB;IAED;;;;OAIG;IACH,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CA8C7B;IAED;;;OAGG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CASzD;IAED,kDAAkD;IAClD,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExC;IAED,8EAA8E;IAC9E,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAErC;IAED,4DAA4D;IAC5D,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC,CAAC,CAAC,GAAG,SAAS,CAE7B;IAED,oEAAoE;IACpE,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7C;IAED,0DAA0D;IAC1D,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAEzC;IAED,+EAA+E;IAC/E,IAAI,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,CAEzB;CACF"}
|
|
@@ -12,7 +12,14 @@ import type { BroadcastState } from "./types.js";
|
|
|
12
12
|
export declare class StateCache<S extends BroadcastState = BroadcastState> {
|
|
13
13
|
private cache;
|
|
14
14
|
private maxSize;
|
|
15
|
-
|
|
15
|
+
private on_evict;
|
|
16
|
+
/**
|
|
17
|
+
* @param maxSize - Max entries before the LRU drops its oldest.
|
|
18
|
+
* @param onEvict - Called with the entry the LRU just dropped. Eviction is
|
|
19
|
+
* the moment cached-only data is lost, so it is the only place a caller
|
|
20
|
+
* can still see what went (#1648).
|
|
21
|
+
*/
|
|
22
|
+
constructor(maxSize?: number, onEvict?: (key: string, state: S) => void);
|
|
16
23
|
/** Get a cached state, promoting it to MRU position. */
|
|
17
24
|
get(key: string): S | undefined;
|
|
18
25
|
/** Set a cached state, evicting the LRU entry if at capacity. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"state-cache.d.ts","sourceRoot":"","sources":["../../../src/sse/state-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAC/D,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"state-cache.d.ts","sourceRoot":"","sources":["../../../src/sse/state-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc;IAC/D,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAkC;IAElD;;;;;OAKG;IACH,YACE,OAAO,SAAK,EACZ,OAAO,GAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,KAAK,IAAe,EAIpD;IAED,wDAAwD;IACxD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAO9B;IAED,iEAAiE;IACjE,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAS/B;IAED,6BAA6B;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAExB;IAED,0CAA0C;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAExB;IAED,wCAAwC;IACxC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,2DAA2D;IAC3D,OAAO,IAAI,gBAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAEvC;CACF"}
|
|
@@ -34,4 +34,23 @@ export type PatchMessage<S extends BroadcastState = BroadcastState> = Record<num
|
|
|
34
34
|
* Subscriber callback — receives version-keyed patch messages.
|
|
35
35
|
*/
|
|
36
36
|
export type Subscriber<S extends BroadcastState = BroadcastState> = (msg: PatchMessage<S>) => void;
|
|
37
|
+
/**
|
|
38
|
+
* The frame that tells a client to refetch: no versions, so
|
|
39
|
+
* `applyPatchMessage` always reports `behind`.
|
|
40
|
+
*
|
|
41
|
+
* Every producer of a resync uses this — `overlay()` on a missing baseline,
|
|
42
|
+
* the cache on evicting overlay state, and the SSE backlog when it cannot
|
|
43
|
+
* drop a frame without losing it silently. One factory so the shape cannot
|
|
44
|
+
* drift between them.
|
|
45
|
+
*/
|
|
46
|
+
export declare const resync_frame: <S extends BroadcastState>() => PatchMessage<S>;
|
|
47
|
+
/**
|
|
48
|
+
* Whether a frame carries no versions, so `applyPatchMessage` can never
|
|
49
|
+
* classify it as a gap.
|
|
50
|
+
*
|
|
51
|
+
* A version-keyed patch that goes missing is self-announcing: the next frame
|
|
52
|
+
* skips a version and the client refetches. An `_overlay` or `_resync` frame
|
|
53
|
+
* is not, which is why anything that drops frames has to tell them apart.
|
|
54
|
+
*/
|
|
55
|
+
export declare const is_version_neutral: <S extends BroadcastState>(msg: PatchMessage<S>) => boolean;
|
|
37
56
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CAC1E,MAAM,EACN,WAAW,CAAC,CAAC,CAAC,CACf,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,CAClE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/sse/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACrD,sFAAsF;IACtF,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,MAAM,CAC1E,MAAM,EACN,WAAW,CAAC,CAAC,CAAC,CACf,GAAG;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAE1D;;GAEG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IAAI,CAClE,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KACjB,IAAI,CAAC;AAEV;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,cAAc,OAAK,YAAY,CAAC,CAAC,CAChC,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,CAAC,SAAS,cAAc,OACpD,YAAY,CAAC,CAAC,CAAC,KACnB,OAAwD,CAAC"}
|