@ai-sdk/rsc 3.0.122 → 3.0.123

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.
@@ -1,34 +1,35 @@
1
- import { LanguageModelV4, LanguageModelV4StreamResult } from '@ai-sdk/provider';
2
- import { ProviderOptions, InferSchema } from '@ai-sdk/provider-utils';
3
- import { Schema, LanguageModelCallOptions, RequestOptions, Prompt, ToolChoice, FinishReason, LanguageModelUsage, CallWarning } from 'ai';
4
- import { ReactNode } from 'react';
5
- import * as z3 from 'zod/v3';
6
- import * as z4 from 'zod/v4';
7
-
1
+ import { ReactNode } from "react";
2
+ import { InferSchema, ProviderOptions } from "@ai-sdk/provider-utils";
3
+ import { CallWarning, FinishReason, LanguageModelCallOptions, LanguageModelUsage, Prompt, RequestOptions, Schema, ToolChoice } from "ai";
4
+ import { LanguageModelV4, LanguageModelV4StreamResult } from "@ai-sdk/provider";
5
+ import * as z3 from "zod/v3";
6
+ import * as z4 from "zod/v4";
7
+ //#region src/types.d.ts
8
8
  type AIAction<T = any, R = any> = (...args: T[]) => Promise<R>;
9
9
  type AIActions<T = any, R = any> = Record<string, AIAction<T, R>>;
10
10
  type AIProviderProps<AIState = any, UIState = any, Actions = any> = {
11
- children: React.ReactNode;
12
- initialAIState?: AIState;
13
- initialUIState?: UIState;
14
- /** $ActionTypes is only added for type inference and is never used at runtime **/
15
- $ActionTypes?: Actions;
11
+ children: React.ReactNode;
12
+ initialAIState?: AIState;
13
+ initialUIState?: UIState;
14
+ /** $ActionTypes is only added for type inference and is never used at runtime **/
15
+ $ActionTypes?: Actions;
16
16
  };
17
17
  type AIProvider<AIState = any, UIState = any, Actions = any> = (props: AIProviderProps<AIState, UIState, Actions>) => Promise<React.ReactElement>;
18
18
  type InferAIState<T, Fallback> = T extends AIProvider<infer AIState, any, any> ? AIState : Fallback;
19
- type OnSetAIState<S> = ({ key, state, done, }: {
20
- key: string | number | symbol | undefined;
21
- state: S;
22
- done: boolean;
19
+ type OnSetAIState<S> = ({ key, state, done }: {
20
+ key: string | number | symbol | undefined;
21
+ state: S;
22
+ done: boolean;
23
23
  }) => void | Promise<void>;
24
24
  type OnGetUIState<S> = AIAction<void, S | undefined>;
25
25
  type ValueOrUpdater<T> = T | ((current: T) => T);
26
26
  type MutableAIState<AIState> = {
27
- get: () => AIState;
28
- update: (newState: ValueOrUpdater<AIState>) => void;
29
- done: ((newState: AIState) => void) | (() => void);
27
+ get: () => AIState;
28
+ update: (newState: ValueOrUpdater<AIState>) => void;
29
+ done: ((newState: AIState) => void) | (() => void);
30
30
  };
31
-
31
+ //#endregion
32
+ //#region src/ai-state.d.ts
32
33
  /**
33
34
  * Get the current AI state.
34
35
  * If `key` is provided, it will return the value of the specified key in the
@@ -59,185 +60,182 @@ declare function getAIState<AI extends AIProvider = any>(key: keyof InferAIState
59
60
  */
60
61
  declare function getMutableAIState<AI extends AIProvider = any>(): MutableAIState<InferAIState<AI, any>>;
61
62
  declare function getMutableAIState<AI extends AIProvider = any>(key: keyof InferAIState<AI, any>): MutableAIState<InferAIState<AI, any>[typeof key]>;
62
-
63
- declare function createAI<AIState = any, UIState = any, Actions extends AIActions = {}>({ actions, initialAIState, initialUIState, onSetAIState, onGetUIState, }: {
64
- actions: Actions;
65
- initialAIState?: AIState;
66
- initialUIState?: UIState;
67
- /**
68
- * This function is called whenever the AI state is updated by an Action.
69
- * You can use this to persist the AI state to a database, or to send it to a
70
- * logging service.
71
- */
72
- onSetAIState?: OnSetAIState<AIState>;
73
- /**
74
- * This function is used to retrieve the UI state based on the AI state.
75
- * For example, to render the initial UI state based on a given AI state, or
76
- * to sync the UI state when the application is already loaded.
77
- *
78
- * If returning `undefined`, the client side UI state will not be updated.
79
- *
80
- * This function must be annotated with the `"use server"` directive.
81
- *
82
- * @example
83
- * ```tsx
84
- * onGetUIState: async () => {
85
- * 'use server';
86
- *
87
- * const currentAIState = getAIState();
88
- * const externalAIState = await loadAIStateFromDatabase();
89
- *
90
- * if (currentAIState === externalAIState) return undefined;
91
- *
92
- * // Update current AI state and return the new UI state
93
- * const state = getMutableAIState()
94
- * state.done(externalAIState)
95
- *
96
- * return <div>...</div>;
97
- * }
98
- * ```
99
- */
100
- onGetUIState?: OnGetUIState<UIState>;
63
+ //#endregion
64
+ //#region src/provider.d.ts
65
+ export declare function createAI<AIState = any, UIState = any, Actions extends AIActions = {}>({ actions, initialAIState, initialUIState, onSetAIState, onGetUIState }: {
66
+ actions: Actions;
67
+ initialAIState?: AIState;
68
+ initialUIState?: UIState;
69
+ /**
70
+ * This function is called whenever the AI state is updated by an Action.
71
+ * You can use this to persist the AI state to a database, or to send it to a
72
+ * logging service.
73
+ */
74
+ onSetAIState?: OnSetAIState<AIState>;
75
+ /**
76
+ * This function is used to retrieve the UI state based on the AI state.
77
+ * For example, to render the initial UI state based on a given AI state, or
78
+ * to sync the UI state when the application is already loaded.
79
+ *
80
+ * If returning `undefined`, the client side UI state will not be updated.
81
+ *
82
+ * This function must be annotated with the `"use server"` directive.
83
+ *
84
+ * @example
85
+ * ```tsx
86
+ * onGetUIState: async () => {
87
+ * 'use server';
88
+ *
89
+ * const currentAIState = getAIState();
90
+ * const externalAIState = await loadAIStateFromDatabase();
91
+ *
92
+ * if (currentAIState === externalAIState) return undefined;
93
+ *
94
+ * // Update current AI state and return the new UI state
95
+ * const state = getMutableAIState()
96
+ * state.done(externalAIState)
97
+ *
98
+ * return <div>...</div>;
99
+ * }
100
+ * ```
101
+ */
102
+ onGetUIState?: OnGetUIState<UIState>;
101
103
  }): AIProvider<AIState, UIState, Actions>;
102
-
104
+ //#endregion
105
+ //#region src/stream-ui/stream-ui.d.ts
103
106
  type Streamable = ReactNode | Promise<ReactNode>;
104
107
  type Renderer<T extends Array<any>> = (...args: T) => Streamable | Generator<Streamable, Streamable, void> | AsyncGenerator<Streamable, Streamable, void>;
105
108
  type RenderTool<INPUT_SCHEMA extends z4.core.$ZodType | z3.Schema | Schema = any> = {
106
- description?: string;
107
- inputSchema: INPUT_SCHEMA;
108
- generate?: Renderer<[
109
- InferSchema<INPUT_SCHEMA>,
110
- {
111
- toolName: string;
112
- toolCallId: string;
113
- }
114
- ]>;
109
+ description?: string;
110
+ inputSchema: INPUT_SCHEMA;
111
+ generate?: Renderer<[InferSchema<INPUT_SCHEMA>, {
112
+ toolName: string;
113
+ toolCallId: string;
114
+ }]>;
115
115
  };
116
- type RenderText = Renderer<[
117
- {
118
- /**
119
- * The full text content from the model so far.
120
- */
121
- content: string;
122
- /**
123
- * The new appended text content from the model since the last `text` call.
124
- */
125
- delta: string;
126
- /**
127
- * Whether the model is done generating text.
128
- * If `true`, the `content` will be the final output and this call will be the last.
129
- */
130
- done: boolean;
131
- }
132
- ]>;
116
+ type RenderText = Renderer<[{
117
+ /**
118
+ * The full text content from the model so far.
119
+ */
120
+ content: string;
121
+ /**
122
+ * The new appended text content from the model since the last `text` call.
123
+ */
124
+ delta: string;
125
+ /**
126
+ * Whether the model is done generating text.
127
+ * If `true`, the `content` will be the final output and this call will be the last.
128
+ */
129
+ done: boolean;
130
+ }]>;
133
131
  type RenderResult = {
134
- value: ReactNode;
132
+ value: ReactNode;
135
133
  } & LanguageModelV4StreamResult;
136
134
  /**
137
135
  * `streamUI` is a helper function to create a streamable UI from LLMs.
138
136
  */
139
- declare function streamUI<TOOLS extends {
140
- [name: string]: z4.core.$ZodType | z3.Schema | Schema;
137
+ export declare function streamUI<TOOLS extends {
138
+ [name: string]: z4.core.$ZodType | z3.Schema | Schema;
141
139
  } = {}>({ model, tools, toolChoice, instructions, system, prompt, messages, allowSystemInMessages, maxRetries, abortSignal, headers, initial, text, providerOptions, onFinish, ...settings }: LanguageModelCallOptions & Omit<RequestOptions, 'timeout'> & Prompt & {
140
+ /**
141
+ * The language model to use.
142
+ */
143
+ model: LanguageModelV4;
144
+ /**
145
+ * The tools that the model can call. The model needs to support calling tools.
146
+ */
147
+ tools?: { [name in keyof TOOLS]: RenderTool<TOOLS[name]>; };
148
+ /**
149
+ * The tool choice strategy. Default: 'auto'.
150
+ */
151
+ toolChoice?: ToolChoice<TOOLS>;
152
+ text?: RenderText;
153
+ initial?: ReactNode;
154
+ /**
155
+ * Additional provider-specific options. They are passed through
156
+ * to the provider from the AI SDK and enable provider-specific
157
+ * functionality that can be fully encapsulated in the provider.
158
+ */
159
+ providerOptions?: ProviderOptions;
160
+ /**
161
+ * Callback that is called when the LLM response and the final object validation are finished.
162
+ */
163
+ onFinish?: (event: {
142
164
  /**
143
- * The language model to use.
165
+ * The reason why the generation finished.
144
166
  */
145
- model: LanguageModelV4;
167
+ finishReason: FinishReason;
146
168
  /**
147
- * The tools that the model can call. The model needs to support calling tools.
169
+ * The token usage of the generated response.
148
170
  */
149
- tools?: {
150
- [name in keyof TOOLS]: RenderTool<TOOLS[name]>;
151
- };
171
+ usage: LanguageModelUsage;
152
172
  /**
153
- * The tool choice strategy. Default: 'auto'.
173
+ * The final ui node that was generated.
154
174
  */
155
- toolChoice?: ToolChoice<TOOLS>;
156
- text?: RenderText;
157
- initial?: ReactNode;
175
+ value: ReactNode;
158
176
  /**
159
- * Additional provider-specific options. They are passed through
160
- * to the provider from the AI SDK and enable provider-specific
161
- * functionality that can be fully encapsulated in the provider.
177
+ * Warnings from the model provider (e.g. unsupported settings)
162
178
  */
163
- providerOptions?: ProviderOptions;
179
+ warnings?: CallWarning[];
164
180
  /**
165
- * Callback that is called when the LLM response and the final object validation are finished.
181
+ * Optional response data.
166
182
  */
167
- onFinish?: (event: {
168
- /**
169
- * The reason why the generation finished.
170
- */
171
- finishReason: FinishReason;
172
- /**
173
- * The token usage of the generated response.
174
- */
175
- usage: LanguageModelUsage;
176
- /**
177
- * The final ui node that was generated.
178
- */
179
- value: ReactNode;
180
- /**
181
- * Warnings from the model provider (e.g. unsupported settings)
182
- */
183
- warnings?: CallWarning[];
184
- /**
185
- * Optional response data.
186
- */
187
- response?: {
188
- /**
189
- * Response headers.
190
- */
191
- headers?: Record<string, string>;
192
- };
193
- }) => Promise<void> | void;
183
+ response?: {
184
+ /**
185
+ * Response headers.
186
+ */
187
+ headers?: Record<string, string>;
188
+ };
189
+ }) => Promise<void> | void;
194
190
  }): Promise<RenderResult>;
195
-
191
+ //#endregion
192
+ //#region src/streamable-ui/create-streamable-ui.d.ts
196
193
  type StreamableUIWrapper = {
197
- /**
198
- * The value of the streamable UI. This can be returned from a Server Action and received by the client.
199
- */
200
- readonly value: React.ReactNode;
201
- /**
202
- * This method updates the current UI node. It takes a new UI node and replaces the old one.
203
- */
204
- update(value: React.ReactNode): StreamableUIWrapper;
205
- /**
206
- * This method is used to append a new UI node to the end of the old one.
207
- * Once appended a new UI node, the previous UI node cannot be updated anymore.
208
- *
209
- * @example
210
- * ```jsx
211
- * const ui = createStreamableUI(<div>hello</div>)
212
- * ui.append(<div>world</div>)
213
- *
214
- * // The UI node will be:
215
- * // <>
216
- * // <div>hello</div>
217
- * // <div>world</div>
218
- * // </>
219
- * ```
220
- */
221
- append(value: React.ReactNode): StreamableUIWrapper;
222
- /**
223
- * This method is used to signal that there is an error in the UI stream.
224
- * It will be thrown on the client side and caught by the nearest error boundary component.
225
- */
226
- error(error: any): StreamableUIWrapper;
227
- /**
228
- * This method marks the UI node as finalized. You can either call it without any parameters or with a new UI node as the final state.
229
- * Once called, the UI node cannot be updated or appended anymore.
230
- *
231
- * This method is always **required** to be called, otherwise the response will be stuck in a loading state.
232
- */
233
- done(...args: [React.ReactNode] | []): StreamableUIWrapper;
194
+ /**
195
+ * The value of the streamable UI. This can be returned from a Server Action and received by the client.
196
+ */
197
+ readonly value: React.ReactNode;
198
+ /**
199
+ * This method updates the current UI node. It takes a new UI node and replaces the old one.
200
+ */
201
+ update(value: React.ReactNode): StreamableUIWrapper;
202
+ /**
203
+ * This method is used to append a new UI node to the end of the old one.
204
+ * Once appended a new UI node, the previous UI node cannot be updated anymore.
205
+ *
206
+ * @example
207
+ * ```jsx
208
+ * const ui = createStreamableUI(<div>hello</div>)
209
+ * ui.append(<div>world</div>)
210
+ *
211
+ * // The UI node will be:
212
+ * // <>
213
+ * // <div>hello</div>
214
+ * // <div>world</div>
215
+ * // </>
216
+ * ```
217
+ */
218
+ append(value: React.ReactNode): StreamableUIWrapper;
219
+ /**
220
+ * This method is used to signal that there is an error in the UI stream.
221
+ * It will be thrown on the client side and caught by the nearest error boundary component.
222
+ */
223
+ error(error: any): StreamableUIWrapper;
224
+ /**
225
+ * This method marks the UI node as finalized. You can either call it without any parameters or with a new UI node as the final state.
226
+ * Once called, the UI node cannot be updated or appended anymore.
227
+ *
228
+ * This method is always **required** to be called, otherwise the response will be stuck in a loading state.
229
+ */
230
+ done(...args: [React.ReactNode] | []): StreamableUIWrapper;
234
231
  };
235
232
  /**
236
233
  * Create a piece of changeable UI that can be streamed to the client.
237
234
  * On the client side, it can be rendered as a normal React node.
238
235
  */
239
236
  declare function createStreamableUI(initialValue?: React.ReactNode): StreamableUIWrapper;
240
-
237
+ //#endregion
238
+ //#region src/streamable-value/streamable-value.d.ts
241
239
  declare const __internal_curr: unique symbol;
242
240
  declare const __internal_error: unique symbol;
243
241
  /**
@@ -245,54 +243,56 @@ declare const __internal_error: unique symbol;
245
243
  * To read the streamed values, use the `readStreamableValue` or `useStreamableValue` APIs.
246
244
  */
247
245
  type StreamableValue<T = any, E = any> = {
248
- [__internal_curr]?: T;
249
- [__internal_error]?: E;
246
+ [__internal_curr]?: T;
247
+ [__internal_error]?: E;
250
248
  };
251
-
249
+ //#endregion
250
+ //#region src/streamable-value/create-streamable-value.d.ts
252
251
  /**
253
252
  * Create a wrapped, changeable value that can be streamed to the client.
254
253
  * On the client side, the value can be accessed via the readStreamableValue() API.
255
254
  */
256
255
  declare function createStreamableValue<T = any, E = any>(initialValue?: T | ReadableStream<T>): StreamableValueWrapper<T, E>;
257
256
  type StreamableValueWrapper<T, E> = {
258
- /**
259
- * The value of the streamable. This can be returned from a Server Action and
260
- * received by the client. To read the streamed values, use the
261
- * `readStreamableValue` or `useStreamableValue` APIs.
262
- */
263
- readonly value: StreamableValue<T, E>;
264
- /**
265
- * This method updates the current value with a new one.
266
- */
267
- update(value: T): StreamableValueWrapper<T, E>;
268
- /**
269
- * This method is used to append a delta string to the current value. It
270
- * requires the current value of the streamable to be a string.
271
- *
272
- * @example
273
- * ```jsx
274
- * const streamable = createStreamableValue('hello');
275
- * streamable.append(' world');
276
- *
277
- * // The value will be 'hello world'
278
- * ```
279
- */
280
- append(value: T): StreamableValueWrapper<T, E>;
281
- /**
282
- * This method is used to signal that there is an error in the value stream.
283
- * It will be thrown on the client side when consumed via
284
- * `readStreamableValue` or `useStreamableValue`.
285
- */
286
- error(error: any): StreamableValueWrapper<T, E>;
287
- /**
288
- * This method marks the value as finalized. You can either call it without
289
- * any parameters or with a new value as the final state.
290
- * Once called, the value cannot be updated or appended anymore.
291
- *
292
- * This method is always **required** to be called, otherwise the response
293
- * will be stuck in a loading state.
294
- */
295
- done(...args: [T] | []): StreamableValueWrapper<T, E>;
257
+ /**
258
+ * The value of the streamable. This can be returned from a Server Action and
259
+ * received by the client. To read the streamed values, use the
260
+ * `readStreamableValue` or `useStreamableValue` APIs.
261
+ */
262
+ readonly value: StreamableValue<T, E>;
263
+ /**
264
+ * This method updates the current value with a new one.
265
+ */
266
+ update(value: T): StreamableValueWrapper<T, E>;
267
+ /**
268
+ * This method is used to append a delta string to the current value. It
269
+ * requires the current value of the streamable to be a string.
270
+ *
271
+ * @example
272
+ * ```jsx
273
+ * const streamable = createStreamableValue('hello');
274
+ * streamable.append(' world');
275
+ *
276
+ * // The value will be 'hello world'
277
+ * ```
278
+ */
279
+ append(value: T): StreamableValueWrapper<T, E>;
280
+ /**
281
+ * This method is used to signal that there is an error in the value stream.
282
+ * It will be thrown on the client side when consumed via
283
+ * `readStreamableValue` or `useStreamableValue`.
284
+ */
285
+ error(error: any): StreamableValueWrapper<T, E>;
286
+ /**
287
+ * This method marks the value as finalized. You can either call it without
288
+ * any parameters or with a new value as the final state.
289
+ * Once called, the value cannot be updated or appended anymore.
290
+ *
291
+ * This method is always **required** to be called, otherwise the response
292
+ * will be stuck in a loading state.
293
+ */
294
+ done(...args: [T] | []): StreamableValueWrapper<T, E>;
296
295
  };
297
-
298
- export { createAI, createStreamableUI, createStreamableValue, getAIState, getMutableAIState, streamUI };
296
+ //#endregion
297
+ export { createStreamableUI, createStreamableValue, getAIState, getMutableAIState };
298
+ //# sourceMappingURL=rsc-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rsc-server.d.ts","names":[],"sources":["../src/types.ts","../src/ai-state.tsx","../src/provider.tsx","../src/stream-ui/stream-ui.tsx","../src/streamable-ui/create-streamable-ui.tsx","../src/streamable-value/streamable-value.ts","../src/streamable-value/create-streamable-value.ts"],"mappings":";;;;;;;KAQY,SAAS,SAAS,eAAe,MAAM,QAAQ,QAAQ;KACvD,UAAU,SAAS,WAAW,eAAe,SAAS,GAAG;KAoBzD,gBAAgB,eAAe,eAAe;EACxD,UAAU,MAAM;EAChB,iBAAiB;EACjB,iBAAiB;;EAEjB,eAAe;;KAGL,WAAW,eAAe,eAAe,kBACnD,OAAO,gBAAgB,SAAS,SAAS,aACtC,QAAQ,MAAM;KAEP,aAAa,GAAG,YAC1B,UAAU,iBAAiB,qBAAqB,UAAU;KAUhD,aAAa,QACvB,KACA,OACA;EAEA;EACA,OAAO;EACP;aACW;KAED,aAAa,KAAK,eAAe;KAEjC,eAAe,KAAK,MAAM,SAAS,MAAM;KAEzC,eAAe;EACzB,WAAW;EACX,SAAS,UAAU,eAAe;EAClC,QAAQ,UAAU;;;;;;;;;;;;iBCFX,WAAW,WAAW,qBAAqB,SAClD,aAAa;iBAEN,WAAW,WAAW,kBAC7B,WAAW,aAAa,WACvB,SAAS,aAAa,gBAAgB;;;;;;;;;;;;;;;;;;;iBAyChC,kBAAkB,WAAW,qBAAqB,eACzD,aAAa;iBAEN,kBAAkB,WAAW,kBACpC,WAAW,aAAa,WACvB,eAAe,aAAa,gBAAgB;;;wBCtE/B,SACd,eACA,eACA,gBAAgB,kBAEhB,SACA,gBACA,gBAEA,cACA;EAEA,SAAS;EACT,iBAAiB;EACjB,iBAAiB;;;;;;EAOjB,eAAe,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B5B,eAAe,aAAa;IAC7B,WAAA,SAAA,SAAA;;;KC3DI,aAAa,YAAY,QAAQ;KAEjC,SAAS,UAAU,kBACnB,MAAM,MAEP,aACA,UAAU,YAAY,oBACtB,eAAe,YAAY;KAE1B,WACH,qBAAqB,GAAG,KAAK,WAAW,GAAG,SAAS;EAEpD;EACA,aAAa;EACb,WAAW,UAEP,YAAY;IAEV;IACA;;;KAMH,aAAa;;;;EAMZ;;;;EAKA;;;;;EAMA;;KAKD;EACH,OAAO;IACL;;;;wBAQkB,SACpB;GAAiB,eAAe,GAAG,KAAK,WAAW,GAAG,SAAS;UAE/D,OACA,OACA,YACA,cACA,QACA,QACA,UACA,uBACA,YACA,aACA,SACA,SACA,MACA,iBACA,aACG,YACF,2BACD,KAAK,6BACL;;;;EAIE,OAAO;;;;EAKP,WACG,cAAc,QAAQ,WAAW,MAAM;;;;EAM1C,aAAa,WAAW;EAExB,OAAO;EACP,UAAU;;;;;;EAOV,kBAAkB;;;;EAKlB,YAAY;;;;IAIV,cAAc;;;;IAId,OAAO;;;;IAIP,OAAO;;;;IAIP,WAAW;;;;IAIX;;;;MAIE,UAAU;;QAER;IACJ,QAAQ;;;KC1KT;;;;WAIM,OAAO,MAAM;;;;EAKtB,OAAO,OAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;EAkBhC,OAAO,OAAO,MAAM,YAAY;;;;;EAMhC,MAAM,aAAa;;;;;;;EAQnB,QAAQ,OAAO,MAAM,kBAAkB;;;;;;iBAOhC,mBAAmB,eAAe,MAAM,YAAS;;;cClD5C;cACA;;;;;KAMF,gBAAgB,SAAS;GAuBlC,mBAAmB;GACnB,oBAAoB;;;;;;;;iBCtBd,sBAAsB,SAAS,SACtC,eAAe,IAAI,eAAe,KAAE,uBAAA,GAAA;KA0DjC,uBAAuB,GAAG;;;;;;WAMpB,OAAO,gBAAgB,GAAG;;;;EAKnC,OAAO,OAAO,IAAI,uBAAuB,GAAG;;;;;;;;;;;;;EAc5C,OAAO,OAAO,IAAI,uBAAuB,GAAG;;;;;;EAO5C,MAAM,aAAa,uBAAuB,GAAG;;;;;;;;;EAU7C,QAAQ,OAAO,UAAU,uBAAuB,GAAG"}