@livestore/adapter-node 0.4.0-dev.9 → 0.5.0-dev.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 (49) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/client-session/adapter.d.ts +69 -3
  3. package/dist/client-session/adapter.d.ts.map +1 -1
  4. package/dist/client-session/adapter.js +160 -62
  5. package/dist/client-session/adapter.js.map +1 -1
  6. package/dist/devtools/devtools-server.d.ts.map +1 -1
  7. package/dist/devtools/devtools-server.js +25 -19
  8. package/dist/devtools/devtools-server.js.map +1 -1
  9. package/dist/devtools/mod.d.ts +1 -1
  10. package/dist/devtools/mod.d.ts.map +1 -1
  11. package/dist/devtools/mod.js +1 -1
  12. package/dist/devtools/mod.js.map +1 -1
  13. package/dist/devtools/vite-dev-server.d.ts +22 -4
  14. package/dist/devtools/vite-dev-server.d.ts.map +1 -1
  15. package/dist/devtools/vite-dev-server.js +45 -11
  16. package/dist/devtools/vite-dev-server.js.map +1 -1
  17. package/dist/leader-thread-shared.d.ts +8 -7
  18. package/dist/leader-thread-shared.d.ts.map +1 -1
  19. package/dist/leader-thread-shared.js +19 -16
  20. package/dist/leader-thread-shared.js.map +1 -1
  21. package/dist/make-leader-worker.d.ts +5 -3
  22. package/dist/make-leader-worker.d.ts.map +1 -1
  23. package/dist/make-leader-worker.js +75 -59
  24. package/dist/make-leader-worker.js.map +1 -1
  25. package/dist/rpc-worker.d.ts +8 -0
  26. package/dist/rpc-worker.d.ts.map +1 -0
  27. package/dist/rpc-worker.js +5 -0
  28. package/dist/rpc-worker.js.map +1 -0
  29. package/dist/shutdown-channel.d.ts.map +1 -1
  30. package/dist/shutdown-channel.js.map +1 -1
  31. package/dist/webchannel.d.ts +1 -1
  32. package/dist/webchannel.d.ts.map +1 -1
  33. package/dist/webchannel.js +17 -18
  34. package/dist/webchannel.js.map +1 -1
  35. package/dist/worker-schema.d.ts +274 -138
  36. package/dist/worker-schema.d.ts.map +1 -1
  37. package/dist/worker-schema.js +79 -45
  38. package/dist/worker-schema.js.map +1 -1
  39. package/package.json +51 -20
  40. package/src/client-session/adapter.ts +228 -124
  41. package/src/devtools/devtools-server.ts +50 -35
  42. package/src/devtools/mod.ts +1 -1
  43. package/src/devtools/vite-dev-server.ts +65 -15
  44. package/src/leader-thread-shared.ts +37 -34
  45. package/src/make-leader-worker.ts +164 -115
  46. package/src/rpc-worker.ts +28 -0
  47. package/src/shutdown-channel.ts +1 -0
  48. package/src/webchannel.ts +21 -28
  49. package/src/worker-schema.ts +132 -117
@@ -0,0 +1,8 @@
1
+ import { Effect, RpcClientError, Stream } from '@livestore/utils/effect';
2
+ export type WithoutRpcClientError<E> = E extends {
3
+ readonly _tag: infer Tag;
4
+ } ? 'RpcClientError' extends Tag ? never : E : E;
5
+ export declare const isRpcClientError: (error: unknown) => error is RpcClientError.RpcClientError;
6
+ export declare const dieOnRpcClientError: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, WithoutRpcClientError<E>, R>;
7
+ export declare const dieOnRpcClientErrorStream: <A, E, R>(stream: Stream.Stream<A, E, R>) => Stream.Stream<A, WithoutRpcClientError<E>, R>;
8
+ //# sourceMappingURL=rpc-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-worker.d.ts","sourceRoot":"","sources":["../src/rpc-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAU,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAEhF,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,CAAA;CAAE,GACzE,gBAAgB,SAAS,GAAG,GAC1B,KAAK,GACL,CAAC,GACH,CAAC,CAAA;AAEL,eAAO,MAAM,gBAAgB,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,cAAc,CAAC,cACzB,CAAA;AAEjD,eAAO,MAAM,mBAAmB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACzC,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAGK,CAAA;AAEpD,eAAO,MAAM,yBAAyB,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC/C,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,CAOK,CAAA"}
@@ -0,0 +1,5 @@
1
+ import { Effect, RpcClientError, Schema, Stream } from '@livestore/utils/effect';
2
+ export const isRpcClientError = (error) => Schema.is(RpcClientError.RpcClientError)(error);
3
+ export const dieOnRpcClientError = (effect) => effect.pipe(Effect.catchIf(isRpcClientError, (error) => Effect.die(error)));
4
+ export const dieOnRpcClientErrorStream = (stream) => stream.pipe(Stream.catchIf(isRpcClientError, (error) => Stream.die(error), (error) => Stream.fail(error)));
5
+ //# sourceMappingURL=rpc-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-worker.js","sourceRoot":"","sources":["../src/rpc-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAQhF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAA0C,EAAE,CACzF,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,CAAA;AAEjD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,MAA8B,EACiB,EAAE,CAChD,MAAwF,CAAC,IAAI,CAC5F,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CACd,CAAA;AAEpD,MAAM,CAAC,MAAM,yBAAyB,GAAG,CACvC,MAA8B,EACiB,EAAE,CAChD,MAAwF,CAAC,IAAI,CAC5F,MAAM,CAAC,OAAO,CACZ,gBAAgB,EAChB,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAC5B,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAC9B,CAC+C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-channel.d.ts","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAG5D,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAIhE,CAAA"}
1
+ {"version":3,"file":"shutdown-channel.d.ts","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAI5D,eAAO,MAAM,mBAAmB,GAC9B,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAIhE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"shutdown-channel.js","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EACqD,EAAE,CACtE,oBAAoB,CAAC;IACnB,WAAW,EAAE,sBAAsB,OAAO,EAAE;IAC5C,MAAM,EAAE,eAAe,CAAC,GAAG;CAC5B,CAAC,CAAA"}
1
+ {"version":3,"file":"shutdown-channel.js","sourceRoot":"","sources":["../src/shutdown-channel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,OAAe,EACqD,EAAE,CACtE,oBAAoB,CAAC;IACnB,WAAW,EAAE,sBAAsB,OAAO,EAAE;IAC5C,MAAM,EAAE,eAAe,CAAC,GAAG;CAC5B,CAAC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Effect, Schema, Scope, WebChannel } from '@livestore/utils/effect';
2
2
  export declare const makeBroadcastChannel: <Msg, MsgEncoded>({ channelName, schema, }: {
3
3
  channelName: string;
4
- schema: Schema.Schema<Msg, MsgEncoded>;
4
+ schema: Schema.Codec<Msg, MsgEncoded>;
5
5
  }) => Effect.Effect<WebChannel.WebChannel<Msg, Msg>, never, Scope.Scope>;
6
6
  //# sourceMappingURL=webchannel.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"webchannel.d.ts","sourceRoot":"","sources":["../src/webchannel.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,MAAM,EAAQ,MAAM,EAAE,KAAK,EAAU,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEnG,eAAO,MAAM,oBAAoB,GAAI,GAAG,EAAE,UAAU,EAAE,0BAGnD;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;CACvC,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAyDlE,CAAA"}
1
+ {"version":3,"file":"webchannel.d.ts","sourceRoot":"","sources":["../src/webchannel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAY,MAAM,EAAe,MAAM,EAAE,KAAK,EAAU,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE1G,eAAO,MAAM,oBAAoB,GAAI,GAAG,EAAE,UAAU,EAAE,0BAGnD;IACD,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;CACtC,KAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAmDlE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { Deferred, Effect, Exit, Schema, Scope, Stream, WebChannel } from '@livestore/utils/effect';
1
+ import { Deferred, Effect, Exit, Queue, Schema, Scope, Stream, WebChannel } from '@livestore/utils/effect';
2
2
  export const makeBroadcastChannel = ({ channelName, schema, }) => Effect.scopeWithCloseable((scope) => Effect.gen(function* () {
3
3
  if (globalThis.BroadcastChannel === undefined) {
4
4
  yield* Effect.logWarning('BroadcastChannel is not supported in this environment. Using a NoopChannel instead.');
@@ -7,27 +7,26 @@ export const makeBroadcastChannel = ({ channelName, schema, }) => Effect.scopeWi
7
7
  // NOTE we're using `globalThis.BroadcastChannel` here because `BroadcastChannel`
8
8
  // from `node:worker_threads` is not yet stable in Deno
9
9
  const channel = new globalThis.BroadcastChannel(channelName);
10
- yield* Effect.addFinalizer(() => Effect.try(() => channel.close()).pipe(Effect.ignoreLogged));
11
- const send = (message) => Effect.gen(function* () {
12
- const messageEncoded = yield* Schema.encode(schema)(message);
13
- channel.postMessage(messageEncoded);
14
- });
15
- // TODO also listen to `messageerror` in parallel
16
- // const listen = Stream.fromEventListener<MessageEvent>(channel, 'message').pipe(
17
- // Stream.map((_) => Schema.decodeEither(listenSchema)(_.data)),
18
- // )
19
- const listen = Stream.asyncPush((emit) => Effect.acquireRelease(Effect.gen(function* () {
20
- channel.onmessage = (event) => {
21
- return emit.single(Schema.decodeEither(schema)(event.data));
22
- };
23
- return channel;
24
- }), (channel) => Effect.sync(() => {
10
+ yield* Effect.addFinalizer(() => Effect.try(() => {
25
11
  // NOTE not all BroadcastChannel implementations have the `unref` method
26
12
  if (typeof channel.unref === 'function') {
27
13
  channel.unref();
28
14
  }
29
- })));
30
- const closedDeferred = yield* Deferred.make().pipe(Effect.acquireRelease(Deferred.done(Exit.void)));
15
+ channel.close();
16
+ }).pipe(Effect.ignore));
17
+ const send = (message) => Effect.gen(function* () {
18
+ const messageEncoded = yield* Schema.encodeEffect(schema)(message);
19
+ channel.postMessage(messageEncoded);
20
+ });
21
+ // In Effect v4, forking a consumer is not a readiness handshake. Install the message
22
+ // listener while constructing the channel and buffer into a scoped queue so early messages
23
+ // are not lost before `listen` is pulled.
24
+ const messageQueue = yield* Effect.acquireRelease(Queue.unbounded(), Queue.shutdown);
25
+ channel.onmessage = (event) => {
26
+ Queue.offerUnsafe(messageQueue, event.data);
27
+ };
28
+ const listen = Stream.fromQueue(messageQueue).pipe(Stream.map((data) => Schema.decodeUnknownResult(schema)(data)));
29
+ const closedDeferred = yield* Effect.acquireRelease(Deferred.make(), Deferred.done(Exit.void));
31
30
  const supportsTransferables = false;
32
31
  return {
33
32
  [WebChannel.WebChannelSymbol]: WebChannel.WebChannelSymbol,
@@ -1 +1 @@
1
- {"version":3,"file":"webchannel.js","sourceRoot":"","sources":["../src/webchannel.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEnG,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAkB,EACpD,WAAW,EACX,MAAM,GAIP,EAAsE,EAAE,CACvE,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,UAAU,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC9C,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,qFAAqF,CAAC,CAAA;QAC/G,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAA2C,CAAA;IACpF,CAAC;IAED,iFAAiF;IACjF,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAgC,CAAA;IAE3F,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAE7F,MAAM,IAAI,GAAG,CAAC,OAAY,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAA;QAC5D,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEJ,iDAAiD;IACjD,kFAAkF;IAClF,kEAAkE;IAClE,IAAI;IAEJ,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAA6C,CAAC,IAAI,EAAE,EAAE,CACnF,MAAM,CAAC,cAAc,CACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,OAAO,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;YACjC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;QAC7D,CAAC,CAAA;QAED,OAAO,OAAO,CAAA;IAChB,CAAC,CAAC,EACF,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;IACH,CAAC,CAAC,CACL,CACF,CAAA;IAED,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACzG,MAAM,qBAAqB,GAAG,KAAK,CAAA;IAEnC,OAAO;QACL,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,gBAAgB;QAC1D,IAAI;QACJ,MAAM;QACN,cAAc;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QACxC,qBAAqB;QACrB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;KACxC,CAAA;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,WAAW,GAAG,CAAC,CAAC,CACxE,CAAA"}
1
+ {"version":3,"file":"webchannel.js","sourceRoot":"","sources":["../src/webchannel.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAE1G,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAkB,EACpD,WAAW,EACX,MAAM,GAIP,EAAsE,EAAE,CACvE,MAAM,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,EAAE,CAClC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,UAAU,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QAC9C,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,qFAAqF,CAAC,CAAA;QAC/G,OAAO,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAA2C,CAAA;IACpF,CAAC;IAED,iFAAiF;IACjF,uDAAuD;IACvD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,gBAAgB,CAAC,WAAW,CAAgC,CAAA;IAE3F,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE;QACd,wEAAwE;QACxE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YACxC,OAAO,CAAC,KAAK,EAAE,CAAA;QACjB,CAAC;QACD,OAAO,CAAC,KAAK,EAAE,CAAA;IACjB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CACvB,CAAA;IAED,MAAM,IAAI,GAAG,CAAC,OAAY,EAAE,EAAE,CAC5B,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAA;QAClE,OAAO,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEJ,qFAAqF;IACrF,2FAA2F;IAC3F,0CAA0C;IAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,EAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAA;IAC7F,OAAO,CAAC,SAAS,GAAG,CAAC,KAAU,EAAE,EAAE;QACjC,KAAK,CAAC,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAElH,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,EAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IACpG,MAAM,qBAAqB,GAAG,KAAK,CAAA;IAEnC,OAAO;QACL,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,UAAU,CAAC,gBAAgB;QAC1D,IAAI;QACJ,MAAM;QACN,cAAc;QACd,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;QACxC,qBAAqB;QACrB,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;KACxC,CAAA;AACH,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,+BAA+B,WAAW,GAAG,CAAC,CAAC,CACxE,CAAA"}