@nonoun/native-chat 0.2.1 → 0.4.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/{chat-input-structured-element-CbDnI4zv.js → chat-input-structured-element-C80qP8yg.js} +265 -108
- package/dist/chat-panel-element.d.ts.map +1 -1
- package/dist/feed/chat-feed-element.d.ts +19 -0
- package/dist/feed/chat-feed-element.d.ts.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/message/chat-message-element.d.ts +14 -1
- package/dist/message/chat-message-element.d.ts.map +1 -1
- package/dist/native-chat.css +31 -1
- package/dist/native-chat.js +426 -2
- package/dist/register.js +3 -3
- package/dist/stream/classify.d.ts +19 -0
- package/dist/stream/classify.d.ts.map +1 -0
- package/dist/stream/create-transport.d.ts +19 -0
- package/dist/stream/create-transport.d.ts.map +1 -0
- package/dist/stream/index.d.ts +9 -0
- package/dist/stream/index.d.ts.map +1 -0
- package/dist/stream/parse-json.d.ts +9 -0
- package/dist/stream/parse-json.d.ts.map +1 -0
- package/dist/stream/parse-ndjson.d.ts +9 -0
- package/dist/stream/parse-ndjson.d.ts.map +1 -0
- package/dist/stream/parse-sse.d.ts +9 -0
- package/dist/stream/parse-sse.d.ts.map +1 -0
- package/dist/stream/types.d.ts +42 -0
- package/dist/stream/types.d.ts.map +1 -0
- package/dist/telemetry/emitter.d.ts +20 -0
- package/dist/telemetry/emitter.d.ts.map +1 -0
- package/dist/telemetry/events.d.ts +11 -0
- package/dist/telemetry/events.d.ts.map +1 -0
- package/dist/telemetry/index.d.ts +5 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/redactor.d.ts +17 -0
- package/dist/telemetry/redactor.d.ts.map +1 -0
- package/dist/telemetry/types.d.ts +27 -0
- package/dist/telemetry/types.d.ts.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type { ChatStreamChunk, StreamFormat, ChatTransportOptions, ChatStreamEvent, TransportState, TransportStatus, TransportStateCallback, RetryOptions, } from './types.ts';
|
|
2
|
+
export { parseSSE } from './parse-sse.ts';
|
|
3
|
+
export { parseNDJSON } from './parse-ndjson.ts';
|
|
4
|
+
export { parseJSON } from './parse-json.ts';
|
|
5
|
+
export type { ChatTransport } from './create-transport.ts';
|
|
6
|
+
export { detectFormat, createChatStream, createChatTransport, } from './create-transport.ts';
|
|
7
|
+
export type { StreamEndReason } from './classify.ts';
|
|
8
|
+
export { classifyStreamEnd, classifyHttpError, backoffDelay } from './classify.ts';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/stream/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,YAAY,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChatStreamChunk } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a standard JSON response as a single ChatStreamChunk.
|
|
4
|
+
*
|
|
5
|
+
* Reads the entire response body, parses as JSON, and yields one chunk
|
|
6
|
+
* with `done: true`.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseJSON(response: Response): AsyncGenerator<ChatStreamChunk>;
|
|
9
|
+
//# sourceMappingURL=parse-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-json.d.ts","sourceRoot":"","sources":["../../src/stream/parse-json.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,wBAAuB,SAAS,CAC9B,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,eAAe,CAAC,CA2BjC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChatStreamChunk } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a newline-delimited JSON (NDJSON) response stream into ChatStreamChunk values.
|
|
4
|
+
*
|
|
5
|
+
* Each non-empty line is parsed as a standalone JSON object.
|
|
6
|
+
* Accumulates the full message across chunks.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseNDJSON(response: Response): AsyncGenerator<ChatStreamChunk>;
|
|
9
|
+
//# sourceMappingURL=parse-ndjson.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-ndjson.d.ts","sourceRoot":"","sources":["../../src/stream/parse-ndjson.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,wBAAuB,WAAW,CAChC,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,eAAe,CAAC,CA2FjC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ChatStreamChunk } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Parse a Server-Sent Events (SSE) response stream into ChatStreamChunk values.
|
|
4
|
+
*
|
|
5
|
+
* Reads `data:` lines from the response body, skips empty lines and comments,
|
|
6
|
+
* handles the `[DONE]` sentinel, and accumulates the full message across chunks.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseSSE(response: Response): AsyncGenerator<ChatStreamChunk>;
|
|
9
|
+
//# sourceMappingURL=parse-sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse-sse.d.ts","sourceRoot":"","sources":["../../src/stream/parse-sse.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;GAKG;AACH,wBAAuB,QAAQ,CAC7B,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,eAAe,CAAC,CAmIjC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
export interface ChatStreamChunk {
|
|
2
|
+
delta: string;
|
|
3
|
+
fullMessage: string;
|
|
4
|
+
role: 'assistant' | 'user';
|
|
5
|
+
datetime: number;
|
|
6
|
+
done: boolean;
|
|
7
|
+
/** True when stream ended without an explicit completion signal (e.g., no `[DONE]` sentinel). */
|
|
8
|
+
partial?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export type StreamFormat = 'sse' | 'ndjson' | 'json';
|
|
11
|
+
export type TransportState = 'idle' | 'sending' | 'streaming' | 'retrying' | 'rate-limited' | 'auth-required' | 'server-error' | 'offline' | 'ready';
|
|
12
|
+
export interface TransportStatus {
|
|
13
|
+
state: TransportState;
|
|
14
|
+
statusCode?: number;
|
|
15
|
+
retryInMs?: number;
|
|
16
|
+
attempt?: number;
|
|
17
|
+
maxAttempts?: number;
|
|
18
|
+
error?: Error;
|
|
19
|
+
}
|
|
20
|
+
export type TransportStateCallback = (status: TransportStatus) => void;
|
|
21
|
+
export interface RetryOptions {
|
|
22
|
+
maxAttempts?: number;
|
|
23
|
+
baseDelayMs?: number;
|
|
24
|
+
maxDelayMs?: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ChatTransportOptions {
|
|
27
|
+
baseUrl: string;
|
|
28
|
+
clientId?: string;
|
|
29
|
+
format?: StreamFormat;
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
signal?: AbortSignal;
|
|
32
|
+
onStateChange?: TransportStateCallback;
|
|
33
|
+
retry?: RetryOptions;
|
|
34
|
+
}
|
|
35
|
+
export interface ChatStreamEvent {
|
|
36
|
+
type: 'start' | 'chunk' | 'complete' | 'partial' | 'error' | 'stop';
|
|
37
|
+
chunk?: ChatStreamChunk;
|
|
38
|
+
error?: Error;
|
|
39
|
+
durationMs?: number;
|
|
40
|
+
requestId: string;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/stream/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,WAAW,GAAG,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;IACd,iGAAiG;IACjG,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAIrD,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,SAAS,GACT,WAAW,GACX,UAAU,GACV,cAAc,GACd,eAAe,GACf,cAAc,GACd,SAAS,GACT,OAAO,CAAC;AAEZ,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,cAAc,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,MAAM,sBAAsB,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,aAAa,CAAC,EAAE,sBAAsB,CAAC;IACvC,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IACpE,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { TelemetryCorrelation, TelemetryEvent, TelemetryLevel, TelemetryRedactor } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Dispatches telemetry events as `CustomEvent` instances on a given
|
|
4
|
+
* `EventTarget`, applying a configurable redactor before emission.
|
|
5
|
+
*/
|
|
6
|
+
export declare class TelemetryEmitter {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(target: EventTarget, level?: TelemetryLevel);
|
|
9
|
+
/** Change the telemetry level, replacing the redactor. */
|
|
10
|
+
setLevel(level: TelemetryLevel): void;
|
|
11
|
+
/** Replace the redactor with a custom implementation. */
|
|
12
|
+
setRedactor(fn: TelemetryRedactor): void;
|
|
13
|
+
/** Apply the redactor and dispatch the event on the target. */
|
|
14
|
+
emit(event: TelemetryEvent): void;
|
|
15
|
+
emitTransport(correlation: TelemetryCorrelation, mode: string, contentType: string): void;
|
|
16
|
+
emitGenerationStart(correlation: TelemetryCorrelation): void;
|
|
17
|
+
emitGenerationComplete(correlation: TelemetryCorrelation, durationMs: number): void;
|
|
18
|
+
emitWarning(correlation: TelemetryCorrelation, message: string, detail?: Record<string, unknown>): void;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=emitter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emitter.d.ts","sourceRoot":"","sources":["../../src/telemetry/emitter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,cAAc,EACd,cAAc,EACd,iBAAiB,EAClB,MAAM,YAAY,CAAC;AAIpB;;;GAGG;AACH,qBAAa,gBAAgB;;gBAIf,MAAM,EAAE,WAAW,EAAE,KAAK,GAAE,cAA0B;IAKlE,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIrC,yDAAyD;IACzD,WAAW,CAAC,EAAE,EAAE,iBAAiB,GAAG,IAAI;IAIxC,+DAA+D;IAC/D,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IASjC,aAAa,CACX,WAAW,EAAE,oBAAoB,EACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,IAAI;IAQP,mBAAmB,CAAC,WAAW,EAAE,oBAAoB,GAAG,IAAI;IAQ5D,sBAAsB,CACpB,WAAW,EAAE,oBAAoB,EACjC,UAAU,EAAE,MAAM,GACjB,IAAI;IAQP,WAAW,CACT,WAAW,EAAE,oBAAoB,EACjC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,IAAI;CAOR"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const CHAT_EVENTS: {
|
|
2
|
+
readonly TRANSPORT: "native:chat-transport";
|
|
3
|
+
readonly GENERATION_START: "native:generation-start";
|
|
4
|
+
readonly GENERATION_COMPLETE: "native:generation-complete";
|
|
5
|
+
readonly GENERATION_STOP: "native:generation-stop";
|
|
6
|
+
readonly GENERATION_ERROR: "native:generation-error";
|
|
7
|
+
readonly WARNING: "native:chat-warning";
|
|
8
|
+
};
|
|
9
|
+
export declare const SAFE_FIELDS: readonly ["requestId", "sessionId", "conversationId", "messageId", "mode", "contentType", "durationMs", "startedAt", "completedAt", "attempt", "maxAttempts", "chunkIndex"];
|
|
10
|
+
export declare const SENSITIVE_FIELDS: readonly ["query", "message", "delta", "fullMessage", "body", "content", "prompt", "response"];
|
|
11
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/telemetry/events.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;CAOd,CAAC;AAEX,eAAO,MAAM,WAAW,6KAad,CAAC;AAEX,eAAO,MAAM,gBAAgB,gGASnB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { TelemetryCorrelation, TelemetryTiming, TelemetryRetry, TelemetryLevel, TelemetryEvent, TelemetryRedactor, } from './types.ts';
|
|
2
|
+
export { CHAT_EVENTS, SAFE_FIELDS, SENSITIVE_FIELDS } from './events.ts';
|
|
3
|
+
export { scrubPII, createDefaultRedactor } from './redactor.ts';
|
|
4
|
+
export { TelemetryEmitter } from './emitter.ts';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/telemetry/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,cAAc,EACd,cAAc,EACd,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEzE,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TelemetryLevel, TelemetryRedactor } from './types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Scrub common PII patterns from a string.
|
|
4
|
+
*
|
|
5
|
+
* Replaces email addresses, phone-like numbers, and credit-card-like
|
|
6
|
+
* number sequences with `[redacted]` placeholders.
|
|
7
|
+
*/
|
|
8
|
+
export declare function scrubPII(text: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Create a default redactor for the given telemetry level.
|
|
11
|
+
*
|
|
12
|
+
* - **minimal**: Sensitive fields in `detail` are replaced with
|
|
13
|
+
* `[redacted:Nchars]` indicating the original length.
|
|
14
|
+
* - **debug**: All fields pass through unmodified.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDefaultRedactor(level: TelemetryLevel): TelemetryRedactor;
|
|
17
|
+
//# sourceMappingURL=redactor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactor.d.ts","sourceRoot":"","sources":["../../src/telemetry/redactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkB,cAAc,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AASpF;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK7C;AAMD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,iBAAiB,CAmB9E"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export interface TelemetryCorrelation {
|
|
2
|
+
requestId: string;
|
|
3
|
+
sessionId?: string;
|
|
4
|
+
conversationId?: string;
|
|
5
|
+
messageId?: string;
|
|
6
|
+
parentMessageId?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface TelemetryTiming {
|
|
9
|
+
startedAt?: number;
|
|
10
|
+
completedAt?: number;
|
|
11
|
+
durationMs?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface TelemetryRetry {
|
|
14
|
+
attempt?: number;
|
|
15
|
+
maxAttempts?: number;
|
|
16
|
+
retryReason?: string;
|
|
17
|
+
}
|
|
18
|
+
export type TelemetryLevel = 'minimal' | 'debug';
|
|
19
|
+
export interface TelemetryEvent {
|
|
20
|
+
type: string;
|
|
21
|
+
correlation: TelemetryCorrelation;
|
|
22
|
+
timing?: TelemetryTiming;
|
|
23
|
+
retry?: TelemetryRetry;
|
|
24
|
+
detail?: Record<string, unknown>;
|
|
25
|
+
}
|
|
26
|
+
export type TelemetryRedactor = (event: TelemetryEvent) => TelemetryEvent;
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/telemetry/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC;AAEjD,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,oBAAoB,CAAC;IAClC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,cAAc,KAAK,cAAc,CAAC"}
|