@edge-base/web 0.2.9 → 0.3.2

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,417 +0,0 @@
1
- import { createSubscription } from './room.js';
2
- function generateTrackName(kind) {
3
- if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
4
- return `${kind}-${crypto.randomUUID()}`;
5
- }
6
- return `${kind}-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
7
- }
8
- function buildRemoteTrackKey(track) {
9
- if (!track.providerSessionId || !track.trackId)
10
- return null;
11
- return `${track.providerSessionId}:${track.trackId}:${track.kind}`;
12
- }
13
- function toSessionDescription(description) {
14
- if (!description?.sdp || !description.type) {
15
- throw new Error('PeerConnection is missing a local session description');
16
- }
17
- return {
18
- sdp: description.sdp,
19
- type: description.type,
20
- };
21
- }
22
- function normalizeIceServers(response, filterBrowserIncompatibleUrls) {
23
- return (response.iceServers ?? []).map((server) => {
24
- const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
25
- return {
26
- ...server,
27
- urls: filterBrowserIncompatibleUrls
28
- ? urls.filter((url) => !url.includes(':53'))
29
- : urls,
30
- };
31
- });
32
- }
33
- export class RoomRealtimeMediaTransport {
34
- room;
35
- options;
36
- localTracks = new Map();
37
- remoteSubscriptions = new Map();
38
- remoteSubscriptionByMid = new Map();
39
- remoteTrackHandlers = [];
40
- unsubscribers = [];
41
- peerConnection = null;
42
- sessionId = null;
43
- constructor(room, options) {
44
- this.room = room;
45
- this.options = {
46
- autoSubscribe: options?.autoSubscribe ?? true,
47
- turn: options?.turn ?? true,
48
- rtcConfiguration: options?.rtcConfiguration ?? {},
49
- peerConnectionFactory: options?.peerConnectionFactory
50
- ?? ((configuration) => new RTCPeerConnection(configuration)),
51
- mediaDevices: options?.mediaDevices
52
- ?? (typeof navigator !== 'undefined' ? navigator.mediaDevices : undefined),
53
- };
54
- }
55
- getSessionId() {
56
- return this.sessionId;
57
- }
58
- getPeerConnection() {
59
- return this.peerConnection;
60
- }
61
- async connect(payload) {
62
- if (this.peerConnection && this.sessionId) {
63
- return this.sessionId;
64
- }
65
- const configuration = {
66
- ...this.options.rtcConfiguration,
67
- iceServers: await this.resolveIceServers(),
68
- };
69
- this.peerConnection = this.options.peerConnectionFactory(configuration);
70
- this.peerConnection.ontrack = (event) => this.handleRemoteTrack(event);
71
- const response = await this.room.media.realtime.createSession(payload);
72
- this.sessionId = response.sessionId;
73
- this.attachRoomSubscriptions();
74
- await this.subscribeExistingPublishedTracks();
75
- return response.sessionId;
76
- }
77
- async enableAudio(constraints = true) {
78
- const devices = this.requireMediaDevices();
79
- const stream = await devices.getUserMedia({ audio: constraints, video: false });
80
- const track = stream.getAudioTracks()[0];
81
- if (!track) {
82
- throw new Error('No audio track was returned by getUserMedia()');
83
- }
84
- await this.publishLocalTrack('audio', track, stream, track.getSettings().deviceId);
85
- return track;
86
- }
87
- async enableVideo(constraints = true) {
88
- const devices = this.requireMediaDevices();
89
- const stream = await devices.getUserMedia({ audio: false, video: constraints });
90
- const track = stream.getVideoTracks()[0];
91
- if (!track) {
92
- throw new Error('No video track was returned by getUserMedia()');
93
- }
94
- await this.publishLocalTrack('video', track, stream, track.getSettings().deviceId);
95
- return track;
96
- }
97
- async startScreenShare(constraints = { video: true, audio: false }) {
98
- const devices = this.requireMediaDevices();
99
- if (!devices.getDisplayMedia) {
100
- throw new Error('navigator.mediaDevices.getDisplayMedia() is not available in this environment');
101
- }
102
- const stream = await devices.getDisplayMedia(constraints);
103
- const track = stream.getVideoTracks()[0];
104
- if (!track) {
105
- throw new Error('No screen-share track was returned by getDisplayMedia()');
106
- }
107
- track.addEventListener('ended', () => {
108
- void this.stopScreenShare();
109
- }, { once: true });
110
- await this.publishLocalTrack('screen', track, stream, track.getSettings().deviceId);
111
- return track;
112
- }
113
- async disableAudio() {
114
- await this.unpublishLocalTrack('audio');
115
- }
116
- async disableVideo() {
117
- await this.unpublishLocalTrack('video');
118
- }
119
- async stopScreenShare() {
120
- await this.unpublishLocalTrack('screen');
121
- }
122
- async setMuted(kind, muted) {
123
- const local = this.localTracks.get(kind);
124
- if (local) {
125
- local.track.enabled = !muted;
126
- }
127
- if (kind === 'audio') {
128
- await this.room.media.audio.setMuted?.(muted);
129
- }
130
- else {
131
- await this.room.media.video.setMuted?.(muted);
132
- }
133
- }
134
- async switchDevices(payload) {
135
- const devices = this.requireMediaDevices();
136
- if (payload.audioInputId && this.localTracks.has('audio')) {
137
- const stream = await devices.getUserMedia({
138
- audio: { deviceId: { exact: payload.audioInputId } },
139
- video: false,
140
- });
141
- const track = stream.getAudioTracks()[0];
142
- if (track) {
143
- await this.replaceLocalTrack('audio', track, stream, payload.audioInputId);
144
- }
145
- }
146
- if (payload.videoInputId && this.localTracks.has('video')) {
147
- const stream = await devices.getUserMedia({
148
- audio: false,
149
- video: { deviceId: { exact: payload.videoInputId } },
150
- });
151
- const track = stream.getVideoTracks()[0];
152
- if (track) {
153
- await this.replaceLocalTrack('video', track, stream, payload.videoInputId);
154
- }
155
- }
156
- await this.room.media.devices.switch(payload);
157
- }
158
- onRemoteTrack(handler) {
159
- this.remoteTrackHandlers.push(handler);
160
- return createSubscription(() => {
161
- const index = this.remoteTrackHandlers.indexOf(handler);
162
- if (index >= 0) {
163
- this.remoteTrackHandlers.splice(index, 1);
164
- }
165
- });
166
- }
167
- destroy() {
168
- for (const local of this.localTracks.values()) {
169
- local.track.stop();
170
- }
171
- this.localTracks.clear();
172
- for (const unsubscribe of this.unsubscribers) {
173
- unsubscribe.unsubscribe();
174
- }
175
- this.unsubscribers.length = 0;
176
- this.remoteSubscriptions.clear();
177
- this.remoteSubscriptionByMid.clear();
178
- if (this.peerConnection) {
179
- this.peerConnection.close();
180
- this.peerConnection = null;
181
- }
182
- this.sessionId = null;
183
- }
184
- attachRoomSubscriptions() {
185
- if (this.unsubscribers.length > 0 || !this.options.autoSubscribe) {
186
- return;
187
- }
188
- this.unsubscribers.push(this.room.media.onTrack((track) => {
189
- void this.subscribeRemoteTrack(track);
190
- }), this.room.media.onTrackRemoved((track) => {
191
- void this.unsubscribeRemoteTrack(track);
192
- }));
193
- }
194
- async subscribeExistingPublishedTracks() {
195
- if (!this.options.autoSubscribe)
196
- return;
197
- for (const member of this.room.media.list()) {
198
- for (const track of member.tracks) {
199
- await this.subscribeRemoteTrack(track);
200
- }
201
- }
202
- }
203
- async subscribeRemoteTrack(track) {
204
- if (!this.sessionId || !this.peerConnection)
205
- return;
206
- if (!track.providerSessionId || !track.trackId || track.providerSessionId === this.sessionId) {
207
- return;
208
- }
209
- const key = buildRemoteTrackKey(track);
210
- if (!key || this.remoteSubscriptions.has(key)) {
211
- return;
212
- }
213
- const response = await this.room.media.realtime.addTracks({
214
- sessionId: this.sessionId,
215
- tracks: [
216
- {
217
- location: 'remote',
218
- sessionId: track.providerSessionId,
219
- trackName: track.trackId,
220
- },
221
- ],
222
- });
223
- const subscription = {
224
- key,
225
- kind: track.kind,
226
- providerSessionId: track.providerSessionId,
227
- trackName: track.trackId,
228
- mid: response.tracks?.[0]?.mid,
229
- };
230
- this.remoteSubscriptions.set(key, subscription);
231
- if (subscription.mid) {
232
- this.remoteSubscriptionByMid.set(subscription.mid, subscription);
233
- }
234
- await this.applyTracksResponse(response);
235
- }
236
- async unsubscribeRemoteTrack(track) {
237
- if (!this.sessionId)
238
- return;
239
- const key = buildRemoteTrackKey(track);
240
- if (!key)
241
- return;
242
- const subscription = this.remoteSubscriptions.get(key);
243
- if (!subscription?.mid) {
244
- this.remoteSubscriptions.delete(key);
245
- return;
246
- }
247
- const response = await this.room.media.realtime.closeTracks({
248
- sessionId: this.sessionId,
249
- tracks: [{ mid: subscription.mid }],
250
- });
251
- this.remoteSubscriptionByMid.delete(subscription.mid);
252
- this.remoteSubscriptions.delete(subscription.key);
253
- await this.applyTracksResponse(response);
254
- }
255
- async publishLocalTrack(kind, track, stream, deviceId) {
256
- await this.connect();
257
- if (!this.peerConnection || !this.sessionId) {
258
- throw new Error('Realtime media transport is not connected');
259
- }
260
- if (this.localTracks.has(kind)) {
261
- await this.replaceLocalTrack(kind, track, stream, deviceId);
262
- return;
263
- }
264
- const transceiver = this.peerConnection.addTransceiver(track, { direction: 'sendonly' });
265
- const offer = await this.createLocalOffer();
266
- const trackName = generateTrackName(kind);
267
- const mid = transceiver.mid ?? this.findTransceiverMid(transceiver);
268
- const response = await this.room.media.realtime.addTracks({
269
- sessionId: this.sessionId,
270
- sessionDescription: offer,
271
- tracks: [
272
- {
273
- location: 'local',
274
- mid: mid ?? undefined,
275
- trackName,
276
- },
277
- ],
278
- publish: {
279
- kind,
280
- trackId: trackName,
281
- deviceId,
282
- muted: !track.enabled,
283
- },
284
- });
285
- await this.applyTracksResponse(response);
286
- this.localTracks.set(kind, {
287
- kind,
288
- track,
289
- transceiver,
290
- stream,
291
- trackName,
292
- deviceId,
293
- });
294
- }
295
- async replaceLocalTrack(kind, track, stream, deviceId) {
296
- const existing = this.localTracks.get(kind);
297
- if (!existing) {
298
- await this.publishLocalTrack(kind, track, stream, deviceId);
299
- return;
300
- }
301
- await existing.transceiver.sender.replaceTrack(track);
302
- existing.track.stop();
303
- existing.track = track;
304
- existing.stream = stream;
305
- existing.deviceId = deviceId;
306
- }
307
- async unpublishLocalTrack(kind) {
308
- const local = this.localTracks.get(kind);
309
- if (!local || !this.peerConnection || !this.sessionId) {
310
- return;
311
- }
312
- local.transceiver.direction = 'inactive';
313
- const offer = await this.createLocalOffer();
314
- const mid = local.transceiver.mid ?? this.findTransceiverMid(local.transceiver);
315
- if (!mid) {
316
- throw new Error(`Cannot unpublish ${kind}: missing transceiver mid`);
317
- }
318
- const response = await this.room.media.realtime.closeTracks({
319
- sessionId: this.sessionId,
320
- sessionDescription: offer,
321
- tracks: [{ mid }],
322
- unpublish: { kind },
323
- });
324
- await this.applyTracksResponse(response);
325
- local.track.stop();
326
- this.localTracks.delete(kind);
327
- }
328
- async applyTracksResponse(response) {
329
- if (!this.peerConnection)
330
- return;
331
- if (response.errorCode) {
332
- throw new Error(response.errorDescription || response.errorCode);
333
- }
334
- const trackError = response.tracks?.find((track) => track.errorCode);
335
- if (trackError?.errorCode) {
336
- throw new Error(trackError.errorDescription || trackError.errorCode);
337
- }
338
- const sessionDescription = response.sessionDescription;
339
- if (!sessionDescription) {
340
- return;
341
- }
342
- if (sessionDescription.type === 'answer') {
343
- await this.peerConnection.setRemoteDescription(sessionDescription);
344
- return;
345
- }
346
- await this.peerConnection.setRemoteDescription(sessionDescription);
347
- const answer = await this.peerConnection.createAnswer();
348
- await this.peerConnection.setLocalDescription(answer);
349
- await this.waitForIceGatheringComplete();
350
- const renegotiateResponse = await this.room.media.realtime.renegotiate({
351
- sessionId: this.sessionId,
352
- sessionDescription: toSessionDescription(this.peerConnection.localDescription),
353
- });
354
- if (renegotiateResponse.sessionDescription?.type === 'answer') {
355
- await this.peerConnection.setRemoteDescription(renegotiateResponse.sessionDescription);
356
- }
357
- }
358
- async createLocalOffer() {
359
- if (!this.peerConnection) {
360
- throw new Error('Realtime media transport is not connected');
361
- }
362
- const offer = await this.peerConnection.createOffer();
363
- await this.peerConnection.setLocalDescription(offer);
364
- await this.waitForIceGatheringComplete();
365
- return toSessionDescription(this.peerConnection.localDescription);
366
- }
367
- async waitForIceGatheringComplete() {
368
- if (!this.peerConnection || this.peerConnection.iceGatheringState === 'complete') {
369
- return;
370
- }
371
- await new Promise((resolve) => {
372
- const onStateChange = () => {
373
- if (this.peerConnection?.iceGatheringState === 'complete') {
374
- this.peerConnection.removeEventListener('icegatheringstatechange', onStateChange);
375
- resolve();
376
- }
377
- };
378
- this.peerConnection?.addEventListener('icegatheringstatechange', onStateChange);
379
- });
380
- }
381
- async resolveIceServers() {
382
- if (!this.options.turn) {
383
- return this.options.rtcConfiguration.iceServers;
384
- }
385
- const turnOptions = typeof this.options.turn === 'object' ? this.options.turn : {};
386
- const response = await this.room.media.realtime.getIceServers({
387
- ttl: turnOptions.ttl,
388
- });
389
- return normalizeIceServers(response, turnOptions.filterBrowserIncompatibleUrls !== false);
390
- }
391
- handleRemoteTrack(event) {
392
- const stream = event.streams[0] ?? new MediaStream([event.track]);
393
- const subscription = event.transceiver.mid
394
- ? this.remoteSubscriptionByMid.get(event.transceiver.mid)
395
- : undefined;
396
- const payload = {
397
- kind: subscription?.kind ?? (event.track.kind === 'audio' ? 'audio' : 'video'),
398
- track: event.track,
399
- stream,
400
- trackName: subscription?.trackName,
401
- providerSessionId: subscription?.providerSessionId,
402
- };
403
- for (const handler of this.remoteTrackHandlers) {
404
- handler(payload);
405
- }
406
- }
407
- findTransceiverMid(transceiver) {
408
- return transceiver.mid ?? null;
409
- }
410
- requireMediaDevices() {
411
- if (!this.options.mediaDevices?.getUserMedia) {
412
- throw new Error('navigator.mediaDevices.getUserMedia() is not available in this environment');
413
- }
414
- return this.options.mediaDevices;
415
- }
416
- }
417
- //# sourceMappingURL=room-realtime-media.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"room-realtime-media.js","sourceRoot":"","sources":["../src/room-realtime-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AA8F/C,SAAS,iBAAiB,CAAC,IAAmB;IAC5C,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QAC7E,OAAO,GAAG,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC5E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAqE;IAChG,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC5D,OAAO,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAqE;IACjG,IAAI,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,GAAG;QACpB,IAAI,EAAE,WAAW,CAAC,IAA0B;KAC7C,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAwC,EACxC,6BAAsC;IAEtC,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtE,OAAO;YACL,GAAG,MAAM;YACT,IAAI,EAAE,6BAA6B;gBACjC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC5C,CAAC,CAAC,IAAI;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,OAAO,0BAA0B;IACpB,IAAI,CAA2B;IAC/B,OAAO,CAA8C;IACrD,WAAW,GAAG,IAAI,GAAG,EAAkC,CAAC;IACxD,mBAAmB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACjE,uBAAuB,GAAG,IAAI,GAAG,EAAmC,CAAC;IACrE,mBAAmB,GAAyD,EAAE,CAAC;IAC/E,aAAa,GAAmB,EAAE,CAAC;IAC5C,cAAc,GAA6B,IAAI,CAAC;IAChD,SAAS,GAAkB,IAAI,CAAC;IAExC,YAAY,IAA8B,EAAE,OAA2C;QACrF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG;YACb,aAAa,EAAE,OAAO,EAAE,aAAa,IAAI,IAAI;YAC7C,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI;YAC3B,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,IAAI,EAAE;YACjD,qBAAqB,EACnB,OAAO,EAAE,qBAAqB;mBAC3B,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,aAAa,CAAC,CAAC;YAC9D,YAAY,EACV,OAAO,EAAE,YAAY;mBAClB,CAAC,OAAO,SAAS,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,SAAkB,CAAC;SACtF,CAAC;IACJ,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,OAA0C;QACtD,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB;YAChC,UAAU,EAAE,MAAM,IAAI,CAAC,iBAAiB,EAAE;SAChB,CAAC;QAE7B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;QACxE,IAAI,CAAC,cAAc,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QAEvE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;QACvE,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,SAAS,CAAC;QAEpC,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,gCAAgC,EAAE,CAAC;QAC9C,OAAO,QAAQ,CAAC,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAA+C,IAAI;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,cAA+C,IAAI;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACnF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,gBAAgB,CACpB,cAAyC,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;QAEtE,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;QACnG,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACnC,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;QAC9B,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAEnB,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC;QACpF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,YAAY;QAChB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAA+C,EAAE,KAAc;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACV,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAGnB;QACC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3C,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;gBACpD,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC;gBACxC,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE;aACrD,CAAC,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAC;YACzC,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,CAAC;IAED,aAAa,CAAC,OAAsD;QAClE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,kBAAkB,CAAC,GAAG,EAAE;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACxD,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QAEzB,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,WAAW,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QAErC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;IACxB,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;YACjE,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,CACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAChC,KAAK,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,EACF,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,KAAK,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,gCAAgC;QAC5C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa;YAAE,OAAO;QACxC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YAC5C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAqB;QACtD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QACpD,IAAI,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,iBAAiB,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,QAAQ;oBAClB,SAAS,EAAE,KAAK,CAAC,iBAAiB;oBAClC,SAAS,EAAE,KAAK,CAAC,OAAO;iBACS;aACpC;SACF,CAAC,CAAC;QAEH,MAAM,YAAY,GAA4B;YAC5C,GAAG;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;YAC1C,SAAS,EAAE,KAAK,CAAC,OAAO;YACxB,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG;SAC/B,CAAC;QAEF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAChD,IAAI,YAAY,CAAC,GAAG,EAAE,CAAC;YACrB,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,KAAqB;QACxD,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,OAAO;QAC5B,MAAM,GAAG,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC;YACvB,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC1D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC;SACpC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACtD,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,IAAmB,EACnB,KAAuB,EACvB,MAAmB,EACnB,QAAiB;QAEjB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;QACzF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC;QAEpE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;YACxD,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,KAAK;YACzB,MAAM,EAAE;gBACN;oBACE,QAAQ,EAAE,OAAO;oBACjB,GAAG,EAAE,GAAG,IAAI,SAAS;oBACrB,SAAS;iBACwB;aACpC;YACD,OAAO,EAAE;gBACP,IAAI;gBACJ,OAAO,EAAE,SAAS;gBAClB,QAAQ;gBACR,KAAK,EAAE,CAAC,KAAK,CAAC,OAAO;aACtB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE;YACzB,IAAI;YACJ,KAAK;YACL,WAAW;YACX,MAAM;YACN,SAAS;YACT,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAC7B,IAAmB,EACnB,KAAuB,EACvB,MAAmB,EACnB,QAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACtD,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;QACvB,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QACzB,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC/B,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,IAAmB;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACtD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChF,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,2BAA2B,CAAC,CAAC;QACvE,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC1D,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kBAAkB,EAAE,KAAK;YACzB,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;YACjB,SAAS,EAAE,EAAE,IAAI,EAAE;SACpB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhC,CAAC;IAEO,KAAK,CAAC,mBAAmB,CAAC,QAAoC;QACpE,IAAI,CAAC,IAAI,CAAC,cAAc;YAAE,OAAO;QAEjC,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,QAAQ,CAAC,gBAAgB,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrE,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,gBAAgB,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;QACvE,CAAC;QAED,MAAM,kBAAkB,GAAG,QAAQ,CAAC,kBAAkB,CAAC;QACvD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,IAAI,kBAAkB,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAC;QACxD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEzC,MAAM,mBAAmB,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC;YACrE,SAAS,EAAE,IAAI,CAAC,SAAU;YAC1B,kBAAkB,EAAE,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC;SAC/E,CAAC,CAAC;QAEH,IAAI,mBAAmB,CAAC,kBAAkB,EAAE,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;QACzF,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;QACtD,MAAM,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACzC,OAAO,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,iBAAiB,KAAK,UAAU,EAAE,CAAC;YACjF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,aAAa,GAAG,GAAG,EAAE;gBACzB,IAAI,IAAI,CAAC,cAAc,EAAE,iBAAiB,KAAK,UAAU,EAAE,CAAC;oBAC1D,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;oBAClF,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC;YACF,IAAI,CAAC,cAAc,EAAE,gBAAgB,CAAC,yBAAyB,EAAE,aAAa,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,iBAAiB;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,UAAU,CAAC;QAClD,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC5D,GAAG,EAAE,WAAW,CAAC,GAAG;SACrB,CAAC,CAAC;QAEH,OAAO,mBAAmB,CAAC,QAAQ,EAAE,WAAW,CAAC,6BAA6B,KAAK,KAAK,CAAC,CAAC;IAC5F,CAAC;IAEO,iBAAiB,CAAC,KAAoB;QAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAClE,MAAM,YAAY,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG;YACxC,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC;YACzD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,OAAO,GAAiC;YAC5C,IAAI,EAAE,YAAY,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM;YACN,SAAS,EAAE,YAAY,EAAE,SAAS;YAClC,iBAAiB,EAAE,YAAY,EAAE,iBAAiB;SACnD,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC/C,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,kBAAkB,CAAC,WAA8B;QACvD,OAAO,WAAW,CAAC,GAAG,IAAI,IAAI,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,YAAY,EAAE,CAAC;YAC7C,MAAM,IAAI,KAAK,CAAC,4EAA4E,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IACnC,CAAC;CACF"}