@mentra/sdk 2.1.13 → 2.1.14
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/app/session/events.d.ts +35 -23
- package/dist/app/session/events.d.ts.map +1 -1
- package/dist/app/session/events.js +46 -38
- package/dist/app/session/index.d.ts +13 -13
- package/dist/app/session/index.d.ts.map +1 -1
- package/dist/app/session/index.js +237 -204
- package/dist/index.d.ts +28 -28
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -1
- package/dist/types/message-types.d.ts +1 -0
- package/dist/types/message-types.d.ts.map +1 -1
- package/dist/types/message-types.js +6 -5
- package/dist/types/messages/cloud-to-app.d.ts +15 -5
- package/dist/types/messages/cloud-to-app.d.ts.map +1 -1
- package/dist/types/messages/cloud-to-app.js +4 -0
- package/dist/types/streams.d.ts +9 -3
- package/dist/types/streams.d.ts.map +1 -1
- package/dist/types/streams.js +68 -19
- package/package.json +1 -1
@@ -1,37 +1,42 @@
|
|
1
1
|
/**
|
2
2
|
* 🎮 Event Manager Module
|
3
3
|
*/
|
4
|
-
import EventEmitter from
|
5
|
-
import { StreamType, ExtendedStreamType, AppSettings, WebSocketError, ButtonPress, HeadPosition, PhoneNotification, TranscriptionData, TranslationData, GlassesBatteryUpdate, PhoneBatteryUpdate, GlassesConnectionState, LocationUpdate, Vad, AudioChunk, CalendarEvent, VpsCoordinates, CustomMessage, RtmpStreamStatus, PhotoTaken, ManagedStreamStatus, PhoneNotificationDismissed } from
|
6
|
-
import { DashboardMode } from
|
7
|
-
import { PermissionErrorDetail } from
|
4
|
+
import EventEmitter from "events";
|
5
|
+
import { StreamType, ExtendedStreamType, AppSettings, WebSocketError, ButtonPress, HeadPosition, PhoneNotification, TranscriptionData, TranslationData, GlassesBatteryUpdate, PhoneBatteryUpdate, GlassesConnectionState, LocationUpdate, Vad, AudioChunk, CalendarEvent, VpsCoordinates, CustomMessage, RtmpStreamStatus, PhotoTaken, ManagedStreamStatus, PhoneNotificationDismissed, Capabilities } from "../../types";
|
6
|
+
import { DashboardMode } from "../../types/dashboard";
|
7
|
+
import { PermissionErrorDetail } from "../../types/messages/cloud-to-app";
|
8
8
|
/** 🎯 Type-safe event handler function */
|
9
9
|
type Handler<T> = (data: T) => void;
|
10
10
|
/** 🔄 System events not tied to streams */
|
11
11
|
interface SystemEvents {
|
12
|
-
|
13
|
-
|
12
|
+
connected: AppSettings | undefined;
|
13
|
+
disconnected: string | {
|
14
14
|
message: string;
|
15
15
|
code: number;
|
16
16
|
reason: string;
|
17
17
|
wasClean: boolean;
|
18
18
|
permanent?: boolean;
|
19
19
|
};
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
error: WebSocketError | Error;
|
21
|
+
settings_update: AppSettings;
|
22
|
+
capabilities_update: {
|
23
|
+
capabilities: Capabilities | null;
|
24
|
+
modelName: string | null;
|
25
|
+
timestamp?: Date;
|
26
|
+
};
|
27
|
+
dashboard_mode_change: {
|
28
|
+
mode: DashboardMode | "none";
|
24
29
|
};
|
25
|
-
|
30
|
+
dashboard_always_on_change: {
|
26
31
|
enabled: boolean;
|
27
32
|
};
|
28
|
-
|
29
|
-
|
33
|
+
custom_message: CustomMessage;
|
34
|
+
permission_error: {
|
30
35
|
message: string;
|
31
36
|
details: PermissionErrorDetail[];
|
32
37
|
timestamp?: Date;
|
33
38
|
};
|
34
|
-
|
39
|
+
permission_denied: {
|
35
40
|
stream: string;
|
36
41
|
requiredPermission: string;
|
37
42
|
message: string;
|
@@ -80,10 +85,11 @@ export declare class EventManager {
|
|
80
85
|
* 🎤 Listen for transcription events in a specific language
|
81
86
|
* @param language - Language code (e.g., "en-US")
|
82
87
|
* @param handler - Function to handle transcription data
|
88
|
+
* @param disableLanguageIdentification - Optional flag to disable language identification (defaults to false/enabled)
|
83
89
|
* @returns Cleanup function to remove the handler
|
84
90
|
* @throws Error if language code is invalid
|
85
91
|
*/
|
86
|
-
onTranscriptionForLanguage(language: string, handler: Handler<TranscriptionData
|
92
|
+
onTranscriptionForLanguage(language: string, handler: Handler<TranscriptionData>, disableLanguageIdentification?: boolean): () => void;
|
87
93
|
/**
|
88
94
|
* 🌐 Listen for translation events for a specific language pair
|
89
95
|
* @param sourceLanguage - Source language code (e.g., "es-ES")
|
@@ -108,34 +114,40 @@ export declare class EventManager {
|
|
108
114
|
* @returns Cleanup function to remove the handler
|
109
115
|
*/
|
110
116
|
onAudioChunk(handler: Handler<AudioChunk>): () => void;
|
111
|
-
onConnected(handler: Handler<SystemEvents[
|
112
|
-
onDisconnected(handler: Handler<SystemEvents[
|
113
|
-
onError(handler: Handler<SystemEvents[
|
114
|
-
onSettingsUpdate(handler: Handler<SystemEvents[
|
117
|
+
onConnected(handler: Handler<SystemEvents["connected"]>): () => EventEmitter<[never]>;
|
118
|
+
onDisconnected(handler: Handler<SystemEvents["disconnected"]>): () => EventEmitter<[never]>;
|
119
|
+
onError(handler: Handler<SystemEvents["error"]>): () => EventEmitter<[never]>;
|
120
|
+
onSettingsUpdate(handler: Handler<SystemEvents["settings_update"]>): () => EventEmitter<[never]>;
|
121
|
+
/**
|
122
|
+
* 🔧 Listen for device capabilities updates
|
123
|
+
* @param handler - Function to handle capabilities updates
|
124
|
+
* @returns Cleanup function to remove the handler
|
125
|
+
*/
|
126
|
+
onCapabilitiesUpdate(handler: Handler<SystemEvents["capabilities_update"]>): () => EventEmitter<[never]>;
|
115
127
|
/**
|
116
128
|
* 🌐 Listen for dashboard mode changes
|
117
129
|
* @param handler - Function to handle dashboard mode changes
|
118
130
|
* @returns Cleanup function to remove the handler
|
119
131
|
*/
|
120
|
-
onDashboardModeChange(handler: Handler<SystemEvents[
|
132
|
+
onDashboardModeChange(handler: Handler<SystemEvents["dashboard_mode_change"]>): () => EventEmitter<[never]>;
|
121
133
|
/**
|
122
134
|
* 🌐 Listen for dashboard always-on mode changes
|
123
135
|
* @param handler - Function to handle dashboard always-on mode changes
|
124
136
|
* @returns Cleanup function to remove the handler
|
125
137
|
*/
|
126
|
-
onDashboardAlwaysOnChange(handler: Handler<SystemEvents[
|
138
|
+
onDashboardAlwaysOnChange(handler: Handler<SystemEvents["dashboard_always_on_change"]>): () => EventEmitter<[never]>;
|
127
139
|
/**
|
128
140
|
* 🚫 Listen for permission errors when subscriptions are rejected
|
129
141
|
* @param handler - Function to handle permission errors
|
130
142
|
* @returns Cleanup function to remove the handler
|
131
143
|
*/
|
132
|
-
onPermissionError(handler: Handler<SystemEvents[
|
144
|
+
onPermissionError(handler: Handler<SystemEvents["permission_error"]>): () => EventEmitter<[never]>;
|
133
145
|
/**
|
134
146
|
* 🚫 Listen for individual permission denied events for specific streams
|
135
147
|
* @param handler - Function to handle permission denied events
|
136
148
|
* @returns Cleanup function to remove the handler
|
137
149
|
*/
|
138
|
-
onPermissionDenied(handler: Handler<SystemEvents[
|
150
|
+
onPermissionDenied(handler: Handler<SystemEvents["permission_denied"]>): () => EventEmitter<[never]>;
|
139
151
|
/**
|
140
152
|
* 🔄 Listen for changes to a specific setting
|
141
153
|
* @param key - Setting key to monitor
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/app/session/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,GAAG,EACH,UAAU,EACV,aAAa,EACb,cAAc,EAKd,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,0BAA0B,
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/app/session/events.ts"],"names":[],"mappings":"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"}
|
@@ -21,24 +21,24 @@ class EventManager {
|
|
21
21
|
// Convenience handlers for common event types
|
22
22
|
onTranscription(handler) {
|
23
23
|
// Default to en-US when using the generic transcription handler
|
24
|
-
return this.addHandler((0, types_1.createTranscriptionStream)(
|
24
|
+
return this.addHandler((0, types_1.createTranscriptionStream)("en-US"), handler);
|
25
25
|
}
|
26
26
|
/**
|
27
27
|
* 🎤 Listen for transcription events in a specific language
|
28
28
|
* @param language - Language code (e.g., "en-US")
|
29
29
|
* @param handler - Function to handle transcription data
|
30
|
+
* @param disableLanguageIdentification - Optional flag to disable language identification (defaults to false/enabled)
|
30
31
|
* @returns Cleanup function to remove the handler
|
31
32
|
* @throws Error if language code is invalid
|
32
33
|
*/
|
33
|
-
onTranscriptionForLanguage(language, handler) {
|
34
|
+
onTranscriptionForLanguage(language, handler, disableLanguageIdentification = false) {
|
34
35
|
if (!(0, types_1.isValidLanguageCode)(language)) {
|
35
36
|
throw new Error(`Invalid language code: ${language}`);
|
36
37
|
}
|
37
38
|
this.lastLanguageTranscriptioCleanupHandler();
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
// console.log(`^^^^^^^ handler: ${handler.toString()}`);
|
39
|
+
const streamType = (0, types_1.createTranscriptionStream)(language, {
|
40
|
+
disableLanguageIdentification,
|
41
|
+
});
|
42
42
|
this.lastLanguageTranscriptioCleanupHandler = this.addHandler(streamType, handler);
|
43
43
|
return this.lastLanguageTranscriptioCleanupHandler;
|
44
44
|
}
|
@@ -99,20 +99,29 @@ class EventManager {
|
|
99
99
|
}
|
100
100
|
// System event handlers
|
101
101
|
onConnected(handler) {
|
102
|
-
this.emitter.on(
|
103
|
-
return () => this.emitter.off(
|
102
|
+
this.emitter.on("connected", handler);
|
103
|
+
return () => this.emitter.off("connected", handler);
|
104
104
|
}
|
105
105
|
onDisconnected(handler) {
|
106
|
-
this.emitter.on(
|
107
|
-
return () => this.emitter.off(
|
106
|
+
this.emitter.on("disconnected", handler);
|
107
|
+
return () => this.emitter.off("disconnected", handler);
|
108
108
|
}
|
109
109
|
onError(handler) {
|
110
|
-
this.emitter.on(
|
111
|
-
return () => this.emitter.off(
|
110
|
+
this.emitter.on("error", handler);
|
111
|
+
return () => this.emitter.off("error", handler);
|
112
112
|
}
|
113
113
|
onSettingsUpdate(handler) {
|
114
|
-
this.emitter.on(
|
115
|
-
return () => this.emitter.off(
|
114
|
+
this.emitter.on("settings_update", handler);
|
115
|
+
return () => this.emitter.off("settings_update", handler);
|
116
|
+
}
|
117
|
+
/**
|
118
|
+
* 🔧 Listen for device capabilities updates
|
119
|
+
* @param handler - Function to handle capabilities updates
|
120
|
+
* @returns Cleanup function to remove the handler
|
121
|
+
*/
|
122
|
+
onCapabilitiesUpdate(handler) {
|
123
|
+
this.emitter.on("capabilities_update", handler);
|
124
|
+
return () => this.emitter.off("capabilities_update", handler);
|
116
125
|
}
|
117
126
|
/**
|
118
127
|
* 🌐 Listen for dashboard mode changes
|
@@ -120,8 +129,8 @@ class EventManager {
|
|
120
129
|
* @returns Cleanup function to remove the handler
|
121
130
|
*/
|
122
131
|
onDashboardModeChange(handler) {
|
123
|
-
this.emitter.on(
|
124
|
-
return () => this.emitter.off(
|
132
|
+
this.emitter.on("dashboard_mode_change", handler);
|
133
|
+
return () => this.emitter.off("dashboard_mode_change", handler);
|
125
134
|
}
|
126
135
|
/**
|
127
136
|
* 🌐 Listen for dashboard always-on mode changes
|
@@ -129,8 +138,8 @@ class EventManager {
|
|
129
138
|
* @returns Cleanup function to remove the handler
|
130
139
|
*/
|
131
140
|
onDashboardAlwaysOnChange(handler) {
|
132
|
-
this.emitter.on(
|
133
|
-
return () => this.emitter.off(
|
141
|
+
this.emitter.on("dashboard_always_on_change", handler);
|
142
|
+
return () => this.emitter.off("dashboard_always_on_change", handler);
|
134
143
|
}
|
135
144
|
/**
|
136
145
|
* 🚫 Listen for permission errors when subscriptions are rejected
|
@@ -138,8 +147,8 @@ class EventManager {
|
|
138
147
|
* @returns Cleanup function to remove the handler
|
139
148
|
*/
|
140
149
|
onPermissionError(handler) {
|
141
|
-
this.emitter.on(
|
142
|
-
return () => this.emitter.off(
|
150
|
+
this.emitter.on("permission_error", handler);
|
151
|
+
return () => this.emitter.off("permission_error", handler);
|
143
152
|
}
|
144
153
|
/**
|
145
154
|
* 🚫 Listen for individual permission denied events for specific streams
|
@@ -147,8 +156,8 @@ class EventManager {
|
|
147
156
|
* @returns Cleanup function to remove the handler
|
148
157
|
*/
|
149
158
|
onPermissionDenied(handler) {
|
150
|
-
this.emitter.on(
|
151
|
-
return () => this.emitter.off(
|
159
|
+
this.emitter.on("permission_denied", handler);
|
160
|
+
return () => this.emitter.off("permission_denied", handler);
|
152
161
|
}
|
153
162
|
/**
|
154
163
|
* 🔄 Listen for changes to a specific setting
|
@@ -160,7 +169,7 @@ class EventManager {
|
|
160
169
|
let previousValue = undefined;
|
161
170
|
const settingsHandler = (settings) => {
|
162
171
|
try {
|
163
|
-
const setting = settings.find(s => s.key === key);
|
172
|
+
const setting = settings.find((s) => s.key === key);
|
164
173
|
if (setting) {
|
165
174
|
// Only call handler if value has changed
|
166
175
|
if (setting.value !== previousValue) {
|
@@ -174,11 +183,11 @@ class EventManager {
|
|
174
183
|
console.error(`Error in onSettingChange handler for key "${key}":`, error);
|
175
184
|
}
|
176
185
|
};
|
177
|
-
this.emitter.on(
|
178
|
-
this.emitter.on(
|
186
|
+
this.emitter.on("settings_update", settingsHandler);
|
187
|
+
this.emitter.on("connected", settingsHandler); // Also check when first connected
|
179
188
|
return () => {
|
180
|
-
this.emitter.off(
|
181
|
-
this.emitter.off(
|
189
|
+
this.emitter.off("settings_update", settingsHandler);
|
190
|
+
this.emitter.off("connected", settingsHandler);
|
182
191
|
};
|
183
192
|
}
|
184
193
|
/**
|
@@ -231,7 +240,7 @@ class EventManager {
|
|
231
240
|
// console.log(`((())) HandlersArray: ${JSON.stringify(handlersArray)}`);
|
232
241
|
// Execute each handler in isolated try/catch to prevent one handler
|
233
242
|
// from crashing the entire App
|
234
|
-
handlersArray.forEach(handler => {
|
243
|
+
handlersArray.forEach((handler) => {
|
235
244
|
try {
|
236
245
|
handler(data);
|
237
246
|
}
|
@@ -239,11 +248,12 @@ class EventManager {
|
|
239
248
|
// Log the error but don't let it propagate
|
240
249
|
console.error(`Error in handler for event '${String(event)}':`, handlerError);
|
241
250
|
// Emit an error event for tracking purposes
|
242
|
-
if (event !==
|
251
|
+
if (event !== "error") {
|
252
|
+
// Prevent infinite recursion
|
243
253
|
const errorMessage = handlerError instanceof Error
|
244
254
|
? handlerError.message
|
245
255
|
: String(handlerError);
|
246
|
-
this.emitter.emit(
|
256
|
+
this.emitter.emit("error", new Error(`Handler error for event '${String(event)}': ${errorMessage}`));
|
247
257
|
}
|
248
258
|
}
|
249
259
|
});
|
@@ -253,16 +263,14 @@ class EventManager {
|
|
253
263
|
// Catch any errors in the emission process itself
|
254
264
|
console.error(`Fatal error emitting event '${String(event)}':`, emitError);
|
255
265
|
// Try to emit an error event if we're not already handling an error
|
256
|
-
if (event !==
|
266
|
+
if (event !== "error") {
|
257
267
|
try {
|
258
|
-
const errorMessage = emitError instanceof Error
|
259
|
-
|
260
|
-
: String(emitError);
|
261
|
-
this.emitter.emit('error', new Error(`Event emission error for '${String(event)}': ${errorMessage}`));
|
268
|
+
const errorMessage = emitError instanceof Error ? emitError.message : String(emitError);
|
269
|
+
this.emitter.emit("error", new Error(`Event emission error for '${String(event)}': ${errorMessage}`));
|
262
270
|
}
|
263
271
|
catch (nestedError) {
|
264
272
|
// If even this fails, just log it - nothing more we can do
|
265
|
-
console.error(
|
273
|
+
console.error("Failed to emit error event:", nestedError);
|
266
274
|
}
|
267
275
|
}
|
268
276
|
}
|
@@ -279,8 +287,8 @@ class EventManager {
|
|
279
287
|
handler(message.payload);
|
280
288
|
}
|
281
289
|
};
|
282
|
-
this.emitter.on(
|
283
|
-
return () => this.emitter.off(
|
290
|
+
this.emitter.on("custom_message", messageHandler);
|
291
|
+
return () => this.emitter.off("custom_message", messageHandler);
|
284
292
|
}
|
285
293
|
onVpsCoordinates(handler) {
|
286
294
|
return this.addHandler(types_1.StreamType.VPS_COORDINATES, handler);
|
@@ -1,13 +1,13 @@
|
|
1
|
-
import { EventManager, EventData } from
|
2
|
-
import { LayoutManager } from
|
3
|
-
import { SettingsManager } from
|
4
|
-
import { LocationManager } from
|
5
|
-
import { CameraModule } from
|
6
|
-
import { AudioManager } from
|
7
|
-
import { ExtendedStreamType, ButtonPress, HeadPosition, PhoneNotification, PhoneNotificationDismissed, TranscriptionData, TranslationData, AppSettings, AppSetting, AppConfig, VpsCoordinates, PhotoTaken, SubscriptionRequest, Capabilities } from
|
8
|
-
import { DashboardAPI } from
|
9
|
-
import { Logger } from
|
10
|
-
import { AppServer } from
|
1
|
+
import { EventManager, EventData } from "./events";
|
2
|
+
import { LayoutManager } from "./layouts";
|
3
|
+
import { SettingsManager } from "./settings";
|
4
|
+
import { LocationManager } from "./modules/location";
|
5
|
+
import { CameraModule } from "./modules/camera";
|
6
|
+
import { AudioManager } from "./modules/audio";
|
7
|
+
import { ExtendedStreamType, ButtonPress, HeadPosition, PhoneNotification, PhoneNotificationDismissed, TranscriptionData, TranslationData, AppSettings, AppSetting, AppConfig, VpsCoordinates, PhotoTaken, SubscriptionRequest, Capabilities } from "../../types";
|
8
|
+
import { DashboardAPI } from "../../types/dashboard";
|
9
|
+
import { Logger } from "pino";
|
10
|
+
import { AppServer } from "../server";
|
11
11
|
/**
|
12
12
|
* ⚙️ Configuration options for App Session
|
13
13
|
*
|
@@ -135,7 +135,7 @@ export declare class AppSession {
|
|
135
135
|
* @throws Error if language code is invalid
|
136
136
|
* @deprecated Use session.events.onTranscriptionForLanguage() instead
|
137
137
|
*/
|
138
|
-
onTranscriptionForLanguage(language: string, handler: (data: TranscriptionData) => void): () => void;
|
138
|
+
onTranscriptionForLanguage(language: string, handler: (data: TranscriptionData) => void, disableLanguageIdentification?: boolean): () => void;
|
139
139
|
/**
|
140
140
|
* 🌐 Listen for speech translation events for a specific language pair
|
141
141
|
* @param sourceLanguage - Source language code (e.g., "es-ES")
|
@@ -430,6 +430,6 @@ export type TpaSessionConfig = AppSessionConfig;
|
|
430
430
|
export declare class TpaSession extends AppSession {
|
431
431
|
constructor(config: TpaSessionConfig);
|
432
432
|
}
|
433
|
-
export { CameraModule, PhotoRequestOptions, RtmpStreamOptions } from
|
434
|
-
export { AudioManager, AudioPlayOptions, AudioPlayResult, SpeakOptions } from
|
433
|
+
export { CameraModule, PhotoRequestOptions, RtmpStreamOptions, } from "./modules/camera";
|
434
|
+
export { AudioManager, AudioPlayOptions, AudioPlayResult, SpeakOptions, } from "./modules/audio";
|
435
435
|
//# sourceMappingURL=index.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/session/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/session/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EACL,YAAY,EAGb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAeL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,0BAA0B,EAC1B,iBAAiB,EACjB,eAAe,EAcf,WAAW,EACX,UAAU,EACV,SAAS,EAQT,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,YAAY,EAGb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAYtC;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;CACtB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,UAAU;IAmET,OAAO,CAAC,MAAM;IAlE1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAA0B;IACpC,iCAAiC;IACjC,OAAO,CAAC,SAAS,CAAuB;IACxC,2CAA2C;IAC3C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,iCAAiC;IACjC,OAAO,CAAC,aAAa,CAAiC;IACtD,4CAA4C;IAC5C,OAAO,CAAC,WAAW,CAAyC;IAC5D,6CAA6C;IAC7C,OAAO,CAAC,SAAS,CAAyB;IAC1C,kEAAkE;IAClE,OAAO,CAAC,YAAY,CAAmB;IACvC,oDAAoD;IACpD,OAAO,CAAC,SAAS,CAA0B;IAC3C,2DAA2D;IAC3D,OAAO,CAAC,yCAAyC,CAAS;IAC1D,mEAAmE;IACnE,OAAO,CAAC,2BAA2B,CAAC,CAEV;IAC1B,qEAAqE;IACrE,OAAO,CAAC,0BAA0B,CAAgB;IAClD,4DAA4D;IAC5D,OAAO,CAAC,4BAA4B,CAMhC;IACJ,4DAA4D;IAC5D,OAAO,CAAC,qBAAqB,CAMzB;IAEJ,oCAAoC;IACpC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,qCAAqC;IACrC,SAAgB,OAAO,EAAE,aAAa,CAAC;IACvC,uCAAuC;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAC1C,wCAAwC;IACxC,SAAgB,SAAS,EAAE,YAAY,CAAC;IACxC,uCAAuC;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAC1C,mDAAmD;IACnD,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,4CAA4C;IAC5C,SAAgB,KAAK,EAAE,YAAY,CAAC;IAEpC,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,wDAAwD;IACjD,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEhD,8CAA8C;IAC9C,OAAO,CAAC,SAAS,CAAsB;gBAEnB,MAAM,EAAE,gBAAgB;IA2I5C;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,cAAc,IAAI,MAAM;IAQxB;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAIvE;;;;;;;OAOG;IACH,0BAA0B,CACxB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,EAC1C,6BAA6B,UAAQ,GACpC,MAAM,IAAI;IAQb;;;;;;;;OAQG;IACH,wBAAwB,CACtB,cAAc,EAAE,MAAM,EACtB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,GACvC,MAAM,IAAI;IAQb;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjE;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAI/D;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAI5E;;;;;OAKG;IACH,4BAA4B,CAC1B,OAAO,EAAE,CAAC,IAAI,EAAE,0BAA0B,KAAK,IAAI,GAClD,MAAM,IAAI;IAIb;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrE;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;IAS7D;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IA6BzC;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IAqB3C;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,kBAAkB,EAC7B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GACpC,MAAM,IAAI;IAQb;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiU/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAqBlB;;;;OAIG;IACH,WAAW,IAAI,WAAW;IAI1B;;;;;OAKG;IACH,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIzC;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAAE;QAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,kBAAkB,EAAE,CAAC;KAC1D,GAAG,IAAI;IAWR;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IA8BvC;;;;OAIG;IACH,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAexD;;;;;OAKG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAiB/C;;;OAGG;IACH,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAI3B,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAO9C,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B;;;;OAIG;IACH,kBAAkB,IAAI,WAAW;IAkBjC;;;;OAIG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAerD;;OAEG;IACH,OAAO,CAAC,aAAa;IAuVrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAoBvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAkC3B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAsDzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IA2B3B;;OAEG;YACW,kBAAkB;IAiFhC;;;OAGG;IACH,OAAO,CAAC,IAAI;IA2DZ;;;OAGG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAgBtD;;;;OAIG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,eAAe,UAAQ,GACtB,OAAO,CAAC,GAAG,CAAC;IAkCf;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpD;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUnD;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvE;;;;;OAKG;IACG,iBAAiB,CACrB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,GAAG,GACX,OAAO,CAAC,OAAO,CAAC;IAuCnB;;;;;OAKG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,UAAU,CAAC,EAAE;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,GAAG,CAAC;KAChB,GACA,OAAO,CAAC,IAAI,CAAC;IAmBhB;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjD;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvD;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAG1B;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,UAAU;gBAC5B,MAAM,EAAE,gBAAgB;CASrC;AAGD,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,YAAY,GACb,MAAM,iBAAiB,CAAC"}
|