@ic-reactor/react 3.7.0 → 3.9.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 (107) hide show
  1. package/README.md +158 -9
  2. package/dist/auth/authentication-manager.d.ts +37 -5
  3. package/dist/auth/authentication-manager.d.ts.map +1 -1
  4. package/dist/auth/authentication-manager.js +242 -52
  5. package/dist/auth/authentication-manager.js.map +1 -1
  6. package/dist/auth/createIdentityAttributeHooks.d.ts +2 -2
  7. package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -1
  8. package/dist/auth/identity-attributes-manager.d.ts +12 -5
  9. package/dist/auth/identity-attributes-manager.d.ts.map +1 -1
  10. package/dist/auth/identity-attributes-manager.js +42 -28
  11. package/dist/auth/identity-attributes-manager.js.map +1 -1
  12. package/dist/auth/identity-attributes.d.ts +1 -1
  13. package/dist/auth/identity-attributes.d.ts.map +1 -1
  14. package/dist/auth/identity-attributes.js +1 -1
  15. package/dist/auth/identity-attributes.js.map +1 -1
  16. package/dist/auth/index.d.ts +7 -7
  17. package/dist/auth/index.d.ts.map +1 -1
  18. package/dist/auth/index.js +7 -7
  19. package/dist/auth/index.js.map +1 -1
  20. package/dist/auth/types.d.ts +123 -16
  21. package/dist/auth/types.d.ts.map +1 -1
  22. package/dist/createActorHooks.d.ts +4 -4
  23. package/dist/createActorHooks.d.ts.map +1 -1
  24. package/dist/createActorHooks.js +6 -6
  25. package/dist/createActorHooks.js.map +1 -1
  26. package/dist/createInfiniteQuery.d.ts +12 -10
  27. package/dist/createInfiniteQuery.d.ts.map +1 -1
  28. package/dist/createInfiniteQuery.js +20 -17
  29. package/dist/createInfiniteQuery.js.map +1 -1
  30. package/dist/createMutation.d.ts +1 -1
  31. package/dist/createMutation.d.ts.map +1 -1
  32. package/dist/createMutation.js +22 -2
  33. package/dist/createMutation.js.map +1 -1
  34. package/dist/createQuery.d.ts +1 -1
  35. package/dist/createQuery.d.ts.map +1 -1
  36. package/dist/createQuery.js +6 -2
  37. package/dist/createQuery.js.map +1 -1
  38. package/dist/createSuspenseInfiniteQuery.d.ts +11 -10
  39. package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
  40. package/dist/createSuspenseInfiniteQuery.js +18 -16
  41. package/dist/createSuspenseInfiniteQuery.js.map +1 -1
  42. package/dist/createSuspenseQuery.d.ts +1 -1
  43. package/dist/createSuspenseQuery.d.ts.map +1 -1
  44. package/dist/createSuspenseQuery.js +6 -2
  45. package/dist/createSuspenseQuery.js.map +1 -1
  46. package/dist/defineReactor.d.ts +54 -4
  47. package/dist/defineReactor.d.ts.map +1 -1
  48. package/dist/defineReactor.js +77 -7
  49. package/dist/defineReactor.js.map +1 -1
  50. package/dist/hooks/createAuthHooks.d.ts +2 -2
  51. package/dist/hooks/createAuthHooks.d.ts.map +1 -1
  52. package/dist/hooks/createAuthHooks.js +7 -2
  53. package/dist/hooks/createAuthHooks.js.map +1 -1
  54. package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
  55. package/dist/hooks/useActorInfiniteQuery.js +16 -2
  56. package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
  57. package/dist/hooks/useActorMethod.d.ts.map +1 -1
  58. package/dist/hooks/useActorMethod.js +66 -33
  59. package/dist/hooks/useActorMethod.js.map +1 -1
  60. package/dist/hooks/useActorMutation.d.ts +8 -1
  61. package/dist/hooks/useActorMutation.d.ts.map +1 -1
  62. package/dist/hooks/useActorMutation.js +9 -1
  63. package/dist/hooks/useActorMutation.js.map +1 -1
  64. package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
  65. package/dist/hooks/useActorSuspenseInfiniteQuery.js +16 -2
  66. package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
  67. package/dist/index.d.ts +11 -11
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +11 -11
  70. package/dist/index.js.map +1 -1
  71. package/dist/types.d.ts +8 -2
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/utils.d.ts +14 -5
  74. package/dist/utils.d.ts.map +1 -1
  75. package/dist/utils.js +21 -10
  76. package/dist/utils.js.map +1 -1
  77. package/llms.txt +1 -1
  78. package/package.json +14 -9
  79. package/src/auth/authentication-manager.ts +267 -64
  80. package/src/auth/createIdentityAttributeHooks.ts +2 -2
  81. package/src/auth/identity-attributes-manager.ts +53 -44
  82. package/src/auth/identity-attributes.ts +2 -2
  83. package/src/auth/index.ts +7 -7
  84. package/src/auth/types.ts +134 -18
  85. package/src/createActorHooks.ts +9 -9
  86. package/src/createInfiniteQuery.ts +49 -35
  87. package/src/createMutation.ts +33 -3
  88. package/src/createQuery.ts +10 -3
  89. package/src/createSuspenseInfiniteQuery.ts +45 -33
  90. package/src/createSuspenseQuery.ts +10 -3
  91. package/src/defineReactor.ts +136 -14
  92. package/src/hooks/createAuthHooks.ts +8 -3
  93. package/src/hooks/useActorInfiniteQuery.ts +25 -3
  94. package/src/hooks/useActorMethod.ts +82 -34
  95. package/src/hooks/useActorMutation.ts +19 -4
  96. package/src/hooks/useActorSuspenseInfiniteQuery.ts +25 -3
  97. package/src/index.ts +11 -11
  98. package/src/types.ts +8 -2
  99. package/src/utils.ts +21 -10
  100. package/src/defineReactor.test.ts +0 -70
  101. package/src/hooks/useActorInfiniteQuery.test.tsx +0 -457
  102. package/src/hooks/useActorMethod.test.tsx +0 -798
  103. package/src/hooks/useActorMutation.test.tsx +0 -220
  104. package/src/hooks/useActorQuery.test.tsx +0 -287
  105. package/src/hooks/useActorSuspenseInfiniteQuery.test.tsx +0 -472
  106. package/src/hooks/useActorSuspenseQuery.test.tsx +0 -254
  107. package/src/utils.test.ts +0 -14
package/README.md CHANGED
@@ -13,6 +13,28 @@ pnpm add @ic-reactor/react @icp-sdk/core @tanstack/react-query
13
13
  pnpm add @icp-sdk/auth
14
14
  ```
15
15
 
16
+ `@icp-sdk/auth` is an optional peer. `AuthenticationManager` reaches it through a
17
+ literal `import("@icp-sdk/auth/client")`, so Vite, Rollup and webpack code-split
18
+ it into its own async chunk. That chunk is never fetched unless something
19
+ touches authentication, and its bytes are dropped from the output entirely in
20
+ apps that never reference the class.
21
+
22
+ Bundlers still **resolve** that specifier while building the module graph, which
23
+ happens before any tree-shaking — so a missing peer cannot simply be optimized
24
+ away. The import therefore sits inside a `try` block, which webpack-family
25
+ bundlers treat as declaring an optional dependency: with the peer absent the
26
+ build succeeds and prints one warning,
27
+ `Module not found: Can't resolve '@icp-sdk/auth/client'`. Only the login paths
28
+ are affected, and they throw an actionable error if they are ever called.
29
+
30
+ Install the peer to remove the warning, or silence it with
31
+ [`ignoreWarnings`](https://webpack.js.org/configuration/other-options/#ignorewarnings):
32
+
33
+ ```js
34
+ // webpack.config.js / next.config.js (webpack)
35
+ ignoreWarnings: [{ module: /@ic-reactor\/react/, message: /@icp-sdk\/auth/ }]
36
+ ```
37
+
16
38
  ## Quick Start
17
39
 
18
40
  ```tsx
@@ -25,7 +47,6 @@ export const queryClient = new QueryClient()
25
47
 
26
48
  export const clientManager = new ClientManager({
27
49
  queryClient,
28
- withCanisterEnv: true,
29
50
  })
30
51
 
31
52
  export const backend = new Reactor<_SERVICE>({
@@ -136,12 +157,41 @@ const mutation = updateProfile.useMutation({
136
157
  })
137
158
  ```
138
159
 
139
- ## Identity Attributes / OpenID email and profile values
160
+ ## Internet Identity
140
161
 
141
- Identity attributes use a dedicated `IdentityAttributesManager`, with React
142
- bindings created by `createIdentityAttributeHooks`. The configured auth client
143
- must support the `@icp-sdk/auth` v7 constructor, sign-in, sign-out, and
144
- attribute-request APIs.
162
+ `defineReactor` wires up Internet Identity for you — `useAuth`,
163
+ `useUserPrincipal`, `useAgentState` and `useIdentityAttributes` come back
164
+ alongside the actor hooks:
165
+
166
+ ```tsx
167
+ // src/reactor.ts
168
+ export const { useActorQuery, useAuth, useIdentityAttributes, authentication } =
169
+ defineReactor<_SERVICE>({
170
+ name: "backend",
171
+ idlFactory,
172
+ auth: {
173
+ // Required when the app is served from more than one origin, so every
174
+ // origin resolves to the same principal.
175
+ derivationOrigin: "https://app.example.com",
176
+ // The default signs the user out and reloads after 10 minutes idle.
177
+ idleOptions: { disableIdle: true },
178
+ },
179
+ })
180
+ ```
181
+
182
+ Auth options are forwarded to the underlying `@icp-sdk/auth` client:
183
+ `identityProvider`, `derivationOrigin`, `windowOpenerFeatures`,
184
+ `openIdProvider`, `storage`, `keyType`, `idleOptions`, `identity`, and
185
+ `transport`. Only the `"google" | "apple" | "microsoft"` aliases are accepted
186
+ for `openIdProvider`; any other value is dropped, since raw issuer URLs are
187
+ only meaningful on `requestOpenIdAttributes`, where they scope the keys.
188
+
189
+ Pass `authentication` from one reactor into another to share a single session
190
+ across canisters. That reactor adopts the manager's `ClientManager` so sign-in
191
+ updates the agent it calls through, so pass either `authentication` or `auth` —
192
+ not both.
193
+
194
+ Set up manually when you need more control:
145
195
 
146
196
  ```tsx
147
197
  // src/auth.ts
@@ -162,6 +212,59 @@ export const { useIdentityAttributes } =
162
212
  createIdentityAttributeHooks(identityAttributes)
163
213
  ```
164
214
 
215
+ `useAuth()` calls `authentication.prepareClient()` on mount. Outside React, do
216
+ it yourself during startup — it preloads the auth module so `login()` can open
217
+ the identity provider window synchronously inside a click handler, which is
218
+ what browser popup blockers require:
219
+
220
+ ```ts
221
+ // once, at startup — awaits the dynamic import and builds the AuthClient
222
+ await authentication.prepareClient()
223
+
224
+ // later, inside the click handler — no await before signIn(), so the popup
225
+ // still counts as user-initiated
226
+ button.onclick = () => authentication.login()
227
+ ```
228
+
229
+ `authentication.getPreparedClient()` returns the already-built client
230
+ synchronously, or `undefined` when the module has not loaded yet.
231
+
232
+ If your bundler cannot resolve the optional peer at all, construct the client
233
+ yourself and inject it — IC Reactor then never imports `@icp-sdk/auth`:
234
+
235
+ ```ts
236
+ import { AuthClient } from "@icp-sdk/auth/client"
237
+
238
+ const authentication = new AuthenticationManager({
239
+ clientManager,
240
+ authClient: new AuthClient(),
241
+ })
242
+ ```
243
+
244
+ ## Identity Attributes / OpenID email and profile values
245
+
246
+ Identity attributes use a dedicated `IdentityAttributesManager`, with React
247
+ bindings created by `createIdentityAttributeHooks`. Works with `@icp-sdk/auth`
248
+ v7 and v8; the two versions disagree on the nonce contract and IC Reactor
249
+ normalizes whichever form you pass.
250
+
251
+ **Pass the nonce as a callback.** Awaiting your backend before calling
252
+ `requestOpenIdAttributes` ends the user gesture, and the browser then blocks
253
+ the Internet Identity window:
254
+
255
+ ```tsx
256
+ // ✅ window opens immediately, nonce resolves while the user is in II
257
+ await requestOpenIdAttributes({
258
+ nonce: () => backend.registerBegin(),
259
+ openIdProvider: "google",
260
+ keys: ["email", "name"],
261
+ })
262
+
263
+ // ❌ gesture is gone by the time the window would open
264
+ const nonce = await backend.registerBegin()
265
+ await requestOpenIdAttributes({ nonce, openIdProvider: "google", keys })
266
+ ```
267
+
165
268
  ```tsx
166
269
  // src/RegisterWithOpenIdProvider.tsx
167
270
  import { useIdentityAttributes } from "./auth"
@@ -176,10 +279,8 @@ function RegisterWithOpenIdProvider() {
176
279
  } = useIdentityAttributes()
177
280
 
178
281
  async function handleProviderLogin() {
179
- const nonce = await backend.registerBegin()
180
-
181
282
  const result = await requestOpenIdAttributes({
182
- nonce,
283
+ nonce: () => backend.registerBegin(),
183
284
  openIdProvider: "microsoft",
184
285
  keys: ["email", "name"],
185
286
  windowOpenerFeatures: popupCenter(),
@@ -212,6 +313,54 @@ must send `signedAttributes.data` and `signedAttributes.signature` to the backen
212
313
  or canister and verify the signature, nonce, origin, timestamp, and requested keys
213
314
  before trusting or storing the attributes.
214
315
 
316
+ ## Server-Side Rendering
317
+
318
+ **Build the reactor inside the request, not at module scope.**
319
+
320
+ A reactor owns its `QueryClient`. On a server a module-scope reactor is created
321
+ once per process and shared by every request, and query keys are
322
+ `[canisterId, functionName, args]` — they do not include the caller. So a
323
+ cached result for a caller-scoped method (`get_my_balance`, a deposit address,
324
+ `my_profile`) is handed to whichever request asks next:
325
+
326
+ ```tsx
327
+ // ❌ Shared by every request on the server
328
+ export const app = defineReactor<_SERVICE>({
329
+ name: "backend",
330
+ idlFactory,
331
+ canisterId,
332
+ })
333
+ ```
334
+
335
+ ```tsx
336
+ // ✅ Per request: nothing is shared between users
337
+ export default async function Page() {
338
+ const app = defineReactor<_SERVICE>({
339
+ name: "backend",
340
+ idlFactory,
341
+ canisterId,
342
+ queryClient: new QueryClient(),
343
+ })
344
+
345
+ const data = await app.reactor.fetchQuery({ functionName: "get_my_profile" })
346
+ return <Profile data={data} />
347
+ }
348
+ ```
349
+
350
+ Two further constraints on the App Router specifically:
351
+
352
+ - Hooks are client-only, like every React hook — call them from a `"use client"`
353
+ module. A server component may import `Reactor` / `ClientManager` and make
354
+ imperative calls; that path works.
355
+ - Hooks bind to their reactor's own `QueryClient` rather than to a
356
+ `QueryClientProvider`, so `HydrationBoundary` prefetch does not feed them
357
+ unless the provider's client _is_ that reactor's client. Next.js also
358
+ evaluates a shared module twice on the server (the RSC and SSR graphs), so a
359
+ module-scope reactor is two different instances there.
360
+
361
+ If none of that applies — a client-only SPA — module-scope reactors are exactly
362
+ right and none of this is a concern.
363
+
215
364
  ## Query Result Methods
216
365
 
217
366
  Every object returned by `createQuery`, `createSuspenseQuery`, and their
@@ -1,10 +1,14 @@
1
1
  import type { Identity } from "@icp-sdk/core/agent";
2
- import type { AuthClientLike, AuthClientSignInOptions, AuthState, AuthenticationClientOptions, AuthenticationSignInOptions } from "./types";
2
+ import type { AuthClientLike, AuthClientSignInOptions, AuthState, AuthenticationClientOptions, AuthenticationSignInOptions } from "./types.js";
3
3
  import { ClientManager } from "@ic-reactor/core";
4
- export interface AuthenticationManagerParameters {
4
+ export interface AuthenticationManagerParameters extends AuthenticationClientOptions {
5
5
  clientManager: ClientManager;
6
+ /**
7
+ * Bring your own client instance. When provided, IC Reactor never constructs
8
+ * one and never applies the options below to it.
9
+ */
6
10
  authClient?: AuthClientLike;
7
- identityProvider?: string | URL;
11
+ /** Canister ID of a locally deployed Internet Identity. */
8
12
  internetIdentityId?: string;
9
13
  }
10
14
  /**
@@ -26,20 +30,36 @@ export declare class AuthenticationManager {
26
30
  private authClientConstructor?;
27
31
  private authClientConstructorPromise?;
28
32
  private authModuleMissing;
33
+ private authClientOptions?;
29
34
  private authStateValue;
30
35
  private readonly identityProvider?;
31
36
  private readonly internetIdentityId?;
37
+ private readonly defaultClientOptions;
32
38
  readonly clientManager: ClientManager;
33
39
  /** The current authentication state. */
34
40
  get authState(): AuthState;
35
- constructor({ clientManager, authClient, identityProvider, internetIdentityId, }: AuthenticationManagerParameters);
41
+ constructor({ clientManager, authClient, identityProvider, internetIdentityId, ...clientOptions }: AuthenticationManagerParameters);
36
42
  /** @internal Used by IdentityAttributesManager. */
37
43
  get client(): AuthClientLike | undefined;
38
44
  subscribeAuthState(callback: (state: AuthState) => void): () => void;
39
45
  /**
40
- * Preloads and creates an AuthClient before a user gesture is needed.
46
+ * Preloads the auth module and creates an AuthClient ahead of time.
47
+ *
48
+ * Call (and await) this before wiring up a login button: it makes
49
+ * {@link login} and {@link IdentityAttributesManager.request} able to open
50
+ * the identity provider synchronously inside the click handler, which is
51
+ * what browser popup blockers and the ICRC-29 transport require.
41
52
  */
42
53
  prepareClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
54
+ /**
55
+ * Returns an AuthClient without awaiting, or `undefined` when the auth
56
+ * module has not been loaded yet.
57
+ *
58
+ * Callers that must stay inside a user gesture use this instead of
59
+ * {@link ensureClient}; awaiting anything before opening the identity
60
+ * provider window loses the gesture.
61
+ */
62
+ getPreparedClient(options?: AuthenticationClientOptions): AuthClientLike | undefined;
43
63
  authenticate: () => Promise<Identity | undefined>;
44
64
  login: (loginOptions?: AuthenticationSignInOptions) => Promise<void>;
45
65
  logout: (options?: {
@@ -49,7 +69,19 @@ export declare class AuthenticationManager {
49
69
  /** @internal Used by IdentityAttributesManager. */
50
70
  signInOrRecoverIdentity(options?: AuthClientSignInOptions): Promise<Identity>;
51
71
  private ensurePreparedClient;
72
+ /**
73
+ * Only rebuild the client when the effective options actually changed.
74
+ *
75
+ * Recreating on every call would discard the client warmed up by
76
+ * `prepareClient()` and register a duplicate sign-out callback on the
77
+ * shared IdleManager singleton each time.
78
+ */
52
79
  private shouldRecreateClient;
80
+ /**
81
+ * Merges constructor-level defaults with per-call overrides and fills in the
82
+ * network-appropriate identity provider.
83
+ */
84
+ private resolveClientOptions;
53
85
  private syncStateFromClient;
54
86
  /** @internal Used by IdentityAttributesManager. */
55
87
  ensureClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"authentication-manager.d.ts","sourceRoot":"","sources":["../../src/auth/authentication-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,aAAa,EAAS,MAAM,kBAAkB,CAAA;AASvD,MAAM,WAAW,+BAA+B;IAC9C,aAAa,EAAE,aAAa,CAAA;IAC5B,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,gBAAgB,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;IAC/B,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAQD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAC,CAA+B;IACnD,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAwC;IACpE,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IACrD,OAAO,CAAC,4BAA4B,CAAC,CAEpC;IACD,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,cAAc,CAKrB;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAQ;IAC5C,SAAgB,aAAa,EAAE,aAAa,CAAA;IAE5C,wCAAwC;IACxC,IAAW,SAAS,IAAI,SAAS,CAEhC;gBAEW,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,GACnB,EAAE,+BAA+B;IA2BlC,mDAAmD;IACnD,IAAW,MAAM,+BAEhB;IAEM,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI;IAS9D;;OAEG;IACU,aAAa,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAiBzD,YAAY,QAAa,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAuD5D;IAEM,KAAK,GAAU,eAAe,2BAA2B,mBA2D/D;IAEM,MAAM,GAAU,UAAU;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,mBAerD;YAEa,gBAAgB;IAa9B,mDAAmD;IACtC,uBAAuB,CAClC,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC;IAyBpB,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,oBAAoB;YAId,mBAAmB;IAmBjC,mDAAmD;IACtC,YAAY,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAY/D,mDAAmD;IACtC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO;IAQxE,mDAAmD;IAC5C,iBAAiB;IAIxB,mDAAmD;IAC5C,sBAAsB,CAAC,KAAK,EAAE,KAAK;IAI1C,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,WAAW;YASL,yBAAyB;CAsCxC"}
1
+ {"version":3,"file":"authentication-manager.d.ts","sourceRoot":"","sources":["../../src/auth/authentication-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAA;AAUtE,MAAM,WAAW,+BAAgC,SAAQ,2BAA2B;IAClF,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAMD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAC,CAA+B;IACnD,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAwC;IACpE,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IACrD,OAAO,CAAC,4BAA4B,CAAC,CAEpC;IACD,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAA6B;IACvD,OAAO,CAAC,cAAc,CAKrB;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAClE,SAAgB,aAAa,EAAE,aAAa,CAAA;IAE5C,wCAAwC;IACxC,IAAW,SAAS,IAAI,SAAS,CAEhC;gBAEW,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,GAAG,aAAa,EACjB,EAAE,+BAA+B;IAiClC,mDAAmD;IACnD,IAAW,MAAM,+BAEhB;IAEM,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI;IAS9D;;;;;;;OAOG;IACU,aAAa,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAUhE;;;;;;;OAOG;IACI,iBAAiB,CACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,cAAc,GAAG,SAAS;IAItB,YAAY,QAAa,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA2E5D;IAEM,KAAK,GAAU,eAAe,2BAA2B,mBAwD/D;IAEM,MAAM,GAAU,UAAU;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,mBAuBrD;YAEa,gBAAgB;IAc9B,mDAAmD;IACtC,uBAAuB,CAClC,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC;IAyBpB,OAAO,CAAC,oBAAoB;IAiB5B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;YAed,mBAAmB;IAmBjC,mDAAmD;IACtC,YAAY,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAQ/D,mDAAmD;IACtC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO;IAQxE,mDAAmD;IAC5C,iBAAiB;IAIxB,mDAAmD;IAC5C,sBAAsB,CAAC,KAAK,EAAE,KAAK;IAI1C,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,WAAW;YASL,yBAAyB;CAkCxC"}