@akala/pm 15.2.9 → 15.3.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/changelog.md CHANGED
@@ -1,10 +1,14 @@
1
- # (2025-06-07)
1
+ # (2025-06-18)
2
2
 
3
3
 
4
4
  ### Bug Fixes
5
5
 
6
- * handle 'undefined' abort reason 1c2cb6f
7
- * update after commands breaking change ab04f29
6
+ * remove deprecated ac command usage 5cf4a82
7
+
8
+
9
+ ### Features
10
+
11
+ * enhance IpcAdapter and MessagePortAdapter to support improved event handling and subscription management 24090fb
8
12
 
9
13
 
10
14
 
@@ -1,14 +1,17 @@
1
1
  import { ChildProcess } from "child_process";
2
2
  import * as jsonrpc from '@akala/json-rpc-ws';
3
- import { SocketAdapterEventMap } from "@akala/json-rpc-ws";
4
- export declare class IpcAdapter implements jsonrpc.SocketAdapter {
3
+ import { AllEventKeys, AllEvents, EventArgs, EventKeys, EventListener, EventOptions, EventReturnType, Subscription, TeardownManager } from "@akala/core";
4
+ export declare class IpcAdapter extends TeardownManager implements jsonrpc.SocketAdapter {
5
5
  private cp;
6
6
  get open(): boolean;
7
- pipe(socket: jsonrpc.SocketAdapter<unknown>): void;
7
+ pipe(socket: jsonrpc.SocketAdapter): void;
8
8
  close(): void;
9
9
  send(data: string): void;
10
- off<K extends keyof SocketAdapterEventMap>(event: K, handler: (ev: SocketAdapterEventMap[K]) => void): void;
11
- on<K extends keyof SocketAdapterEventMap>(event: K, handler: (ev: SocketAdapterEventMap[K]) => void): void;
12
- once<K extends keyof SocketAdapterEventMap>(event: K, handler: (ev: SocketAdapterEventMap[K]) => void): void;
10
+ off<const TEvent extends AllEventKeys<jsonrpc.SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<jsonrpc.SocketAdapterAkalaEventMap>[TEvent]>): boolean;
11
+ on<const TEvent extends AllEventKeys<jsonrpc.SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<jsonrpc.SocketAdapterAkalaEventMap>[TEvent]>, options?: EventOptions<AllEvents<jsonrpc.SocketAdapterAkalaEventMap>[TEvent]>): Subscription;
12
+ once<const TEvent extends AllEventKeys<jsonrpc.SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<jsonrpc.SocketAdapterAkalaEventMap>[TEvent]>): Subscription;
13
13
  constructor(cp: ChildProcess | typeof process);
14
+ hasListener<const TKey extends AllEventKeys<jsonrpc.SocketAdapterAkalaEventMap>>(name: TKey): boolean;
15
+ get definedEvents(): AllEventKeys<jsonrpc.SocketAdapterAkalaEventMap>[];
16
+ emit<const TEvent extends EventKeys<jsonrpc.SocketAdapterAkalaEventMap>>(event: TEvent, ...args: EventArgs<jsonrpc.SocketAdapterAkalaEventMap[TEvent]>): false | EventReturnType<jsonrpc.SocketAdapterAkalaEventMap[TEvent]>;
14
17
  }
@@ -1,4 +1,5 @@
1
- export class IpcAdapter {
1
+ import { StatefulSubscription, TeardownManager } from "@akala/core";
2
+ export class IpcAdapter extends TeardownManager {
2
3
  cp;
3
4
  get open() { return !!this.cp.pid; }
4
5
  pipe(socket) {
@@ -26,35 +27,44 @@ export class IpcAdapter {
26
27
  this.cp.off('disconnect', handler);
27
28
  break;
28
29
  }
30
+ return true;
29
31
  }
30
- on(event, handler) {
32
+ on(event, handler, options) {
31
33
  switch (event) {
32
34
  case 'message':
33
- this.cp.on('message', handler);
34
- break;
35
+ if (options?.once)
36
+ this.cp.on('message', handler);
37
+ else
38
+ this.cp.on('message', handler);
39
+ return new StatefulSubscription(() => this.cp.off('message', handler)).unsubscribe;
35
40
  case 'open':
36
41
  handler(null);
37
42
  break;
38
43
  case 'close':
39
- this.cp.on('disconnect', handler);
40
- break;
44
+ if (options?.once)
45
+ this.cp.once('disconnect', handler);
46
+ else
47
+ this.cp.on('disconnect', handler);
48
+ return new StatefulSubscription(() => this.cp.off('disconnect', handler)).unsubscribe;
41
49
  }
42
50
  }
43
51
  once(event, handler) {
44
- switch (event) {
45
- case 'message':
46
- this.cp.once('message', handler);
47
- break;
48
- case 'open':
49
- handler(null);
50
- break;
51
- case 'close':
52
- this.cp.once('disconnect', () => handler(null));
53
- break;
54
- }
52
+ return this.on(event, handler, { once: true });
55
53
  }
56
54
  constructor(cp) {
55
+ super();
57
56
  this.cp = cp;
58
57
  }
58
+ hasListener(name) {
59
+ if (name === 'open')
60
+ return false;
61
+ return !!this.cp.listenerCount(name);
62
+ }
63
+ get definedEvents() {
64
+ return ['close', 'error', 'message'].filter(ev => this.hasListener(ev));
65
+ }
66
+ emit(event, ...args) {
67
+ throw new Error("Method not implemented.");
68
+ }
59
69
  }
60
70
  //# sourceMappingURL=ipc-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ipc-adapter.js","sourceRoot":"","sources":["../../src/ipc-adapter.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,UAAU;IAsEC;IApEpB,IAAI,IAAI,KAAc,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAG7C,IAAI,CAAC,MAAsC;QAEvC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK;QAED,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,CAAC,IAAY;QAEb,IAAI,IAAI,CAAC,EAAE,CAAC,IAAI;YACZ,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;;YAG1B,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,EAAE,CAAC,GAAG,iCAAiC,CAAC,CAAC;IAC9E,CAAC;IACD,GAAG,CAAwC,KAAQ,EAAE,OAA+C;QAEhG,QAAQ,KAAK,EACb,CAAC;YACG,KAAK,SAAS;gBACV,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAChC,MAAM;YACV,KAAK,MAAM;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YACV,KAAK,OAAO;gBACR,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBACnC,MAAM;QACd,CAAC;IACL,CAAC;IACD,EAAE,CAAwC,KAAQ,EAAE,OAA+C;QAE/F,QAAQ,KAAK,EACb,CAAC;YACG,KAAK,SAAS;gBACV,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/B,MAAM;YACV,KAAK,MAAM;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YACV,KAAK,OAAO;gBACR,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM;QACd,CAAC;IACL,CAAC;IAED,IAAI,CAAwC,KAAQ,EAAE,OAA+C;QAEjG,QAAQ,KAAK,EACb,CAAC;YACG,KAAK,SAAS;gBACV,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACjC,MAAM;YACV,KAAK,MAAM;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YACV,KAAK,OAAO;gBACR,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChD,MAAM;QACd,CAAC;IACL,CAAC;IAED,YAAoB,EAAiC;QAAjC,OAAE,GAAF,EAAE,CAA+B;IAErD,CAAC;CAEJ"}
1
+ {"version":3,"file":"ipc-adapter.js","sourceRoot":"","sources":["../../src/ipc-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,18 @@
1
- import { SocketAdapter, SocketAdapterEventMap } from "@akala/json-rpc-ws";
1
+ import { AllEventKeys, AllEvents, EventArgs, EventKeys, EventListener, EventOptions, EventReturnType, Subscription, TeardownManager } from "@akala/core";
2
+ import { SocketAdapter, SocketAdapterAkalaEventMap } from "@akala/json-rpc-ws";
2
3
  import { MessagePort, Worker } from "worker_threads";
3
- export declare class MessagePortAdapter implements SocketAdapter {
4
+ export declare class MessagePortAdapter extends TeardownManager implements SocketAdapter {
4
5
  private cp;
5
6
  private isOpen;
6
7
  get open(): boolean;
7
8
  close(): void;
8
9
  send(data: string): void;
9
- on<K extends keyof SocketAdapterEventMap>(event: K, handler: (ev: SocketAdapterEventMap[K]) => void): void;
10
- once<K extends keyof SocketAdapterEventMap>(event: K, handler: (ev: SocketAdapterEventMap[K]) => void): void;
10
+ on<const TEvent extends AllEventKeys<SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<SocketAdapterAkalaEventMap>[TEvent]>, options?: EventOptions<AllEvents<SocketAdapterAkalaEventMap>[TEvent]>): Subscription;
11
+ once<const TEvent extends AllEventKeys<SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<SocketAdapterAkalaEventMap>[TEvent]>): Subscription;
11
12
  constructor(cp: MessagePort | Worker);
12
- off<K extends keyof SocketAdapterEventMap>(event: K, handler?: (this: unknown, ev: SocketAdapterEventMap[K]) => void): void;
13
- pipe(socket: SocketAdapter<unknown>): void;
13
+ off<const TEvent extends AllEventKeys<SocketAdapterAkalaEventMap>>(event: TEvent, handler: EventListener<AllEvents<SocketAdapterAkalaEventMap>[TEvent]>): boolean;
14
+ pipe(socket: SocketAdapter): void;
15
+ hasListener<const TKey extends AllEventKeys<SocketAdapterAkalaEventMap>>(name: TKey): boolean;
16
+ get definedEvents(): AllEventKeys<SocketAdapterAkalaEventMap>[];
17
+ emit<const TEvent extends EventKeys<SocketAdapterAkalaEventMap>>(event: TEvent, ...args: EventArgs<SocketAdapterAkalaEventMap[TEvent]>): false | EventReturnType<SocketAdapterAkalaEventMap[TEvent]>;
14
18
  }
@@ -1,5 +1,6 @@
1
+ import { StatefulSubscription, TeardownManager } from "@akala/core";
1
2
  import { Worker } from "worker_threads";
2
- export class MessagePortAdapter {
3
+ export class MessagePortAdapter extends TeardownManager {
3
4
  cp;
4
5
  isOpen = true;
5
6
  get open() { return this.isOpen; }
@@ -12,42 +13,74 @@ export class MessagePortAdapter {
12
13
  send(data) {
13
14
  this.cp.postMessage(data);
14
15
  }
15
- on(event, handler) {
16
+ on(event, handler, options) {
16
17
  switch (event) {
17
18
  case 'message':
18
- this.cp.on('message', handler);
19
- break;
19
+ if (options?.once)
20
+ this.cp.on('message', handler);
21
+ else
22
+ this.cp.on('message', handler);
23
+ return new StatefulSubscription(() => this.cp.off('message', handler)).unsubscribe;
20
24
  case 'open':
21
25
  handler(null);
22
26
  break;
23
27
  case 'close':
24
- this.cp.on('disconnect', handler);
25
- break;
28
+ if (options?.once)
29
+ this.cp.once('disconnect', handler);
30
+ else
31
+ this.cp.on('disconnect', handler);
32
+ return new StatefulSubscription(() => this.cp.off('disconnect', handler)).unsubscribe;
26
33
  }
27
34
  }
28
35
  once(event, handler) {
36
+ return this.on(event, handler, { once: true });
37
+ }
38
+ constructor(cp) {
39
+ super();
40
+ this.cp = cp;
41
+ cp.on('close', () => this.isOpen = false);
42
+ }
43
+ off(event, handler) {
29
44
  switch (event) {
30
45
  case 'message':
31
- this.cp.once('message', handler);
46
+ this.cp.off('message', handler);
32
47
  break;
33
48
  case 'open':
34
49
  handler(null);
35
50
  break;
36
51
  case 'close':
37
- this.cp.once('close', () => handler(null));
52
+ this.cp.off('disconnect', handler);
38
53
  break;
39
54
  }
40
- }
41
- constructor(cp) {
42
- this.cp = cp;
43
- cp.on('close', () => this.isOpen = false);
44
- }
45
- off(event, handler) {
46
- this.cp.off(event, handler);
55
+ return true;
47
56
  }
48
57
  pipe(socket) {
49
58
  this.on('message', (message) => socket.send(message));
50
59
  this.on('close', () => socket.close());
51
60
  }
61
+ // _write(chunk: string | Buffer, encoding: string, callback: (error?: any) => void)
62
+ // {
63
+ // // The underlying source only deals with strings.
64
+ // if (Buffer.isBuffer(chunk))
65
+ // chunk = chunk.toString('utf8');
66
+ // if (this.cp.send)
67
+ // this.cp.send(chunk + '\n', callback);
68
+ // else
69
+ // callback(new Error('there is no send method on this process'));
70
+ // }
71
+ // _read()
72
+ // {
73
+ // }
74
+ hasListener(name) {
75
+ if (name === 'open')
76
+ return false;
77
+ return !!this.cp.listenerCount(name);
78
+ }
79
+ get definedEvents() {
80
+ return ['close', 'error', 'message'].filter(ev => this.hasListener(ev));
81
+ }
82
+ emit(event, ...args) {
83
+ throw new Error("Method not implemented.");
84
+ }
52
85
  }
53
86
  //# sourceMappingURL=messageport-adapter.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"messageport-adapter.js","sourceRoot":"","sources":["../../src/messageport-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAe,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,OAAO,kBAAkB;IAgDP;IA9CZ,MAAM,GAAY,IAAI,CAAC;IAE/B,IAAI,IAAI,KAAc,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,KAAK;QAED,IAAI,IAAI,CAAC,EAAE,YAAY,MAAM;YACzB,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC;;YAEpB,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IACD,IAAI,CAAC,IAAY;QAEb,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IACD,EAAE,CAAwC,KAAQ,EAAE,OAA+C;QAE/F,QAAQ,KAAK,EACb,CAAC;YACG,KAAK,SAAS;gBACV,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/B,MAAM;YACV,KAAK,MAAM;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YACV,KAAK,OAAO;gBACR,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;gBAClC,MAAM;QACd,CAAC;IACL,CAAC;IAED,IAAI,CAAwC,KAAQ,EAAE,OAA+C;QAEjG,QAAQ,KAAK,EACb,CAAC;YACG,KAAK,SAAS;gBACV,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBACjC,MAAM;YACV,KAAK,MAAM;gBACP,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YACV,KAAK,OAAO;gBACR,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBAC3C,MAAM;QACd,CAAC;IACL,CAAC;IAED,YAAoB,EAAwB;QAAxB,OAAE,GAAF,EAAE,CAAsB;QAExC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;IAC9C,CAAC;IACD,GAAG,CAAwC,KAAQ,EAAE,OAA+D;QAEhH,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,MAA8B;QAE/B,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;CAgBJ"}
1
+ {"version":3,"file":"messageport-adapter.js","sourceRoot":"","sources":["../../src/messageport-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { Transform } from 'stream';
2
+ export declare class VirtualScrollPrefixer extends Transform {
3
+ private buffer;
4
+ private readonly maxLines;
5
+ private readonly prefixer;
6
+ constructor(prefix: string, options?: {
7
+ maxLines?: number;
8
+ useColors?: boolean;
9
+ });
10
+ _transform(chunk: Buffer | string, encoding: string, callback: () => void): void;
11
+ _flush(callback: () => void): void;
12
+ }
@@ -0,0 +1,47 @@
1
+ import { Transform } from 'stream';
2
+ import { NewLinePrefixer } from './new-line-prefixer.js';
3
+ export class VirtualScrollPrefixer extends Transform {
4
+ buffer = [];
5
+ maxLines;
6
+ prefixer;
7
+ constructor(prefix, options = {}) {
8
+ super();
9
+ this.maxLines = options.maxLines || 5;
10
+ this.prefixer = new NewLinePrefixer(prefix, { useColors: options.useColors });
11
+ }
12
+ _transform(chunk, encoding, callback) {
13
+ // Convert chunk to string if it's a buffer
14
+ const str = Buffer.isBuffer(chunk) ? chunk.toString() : chunk;
15
+ // Split the input into lines
16
+ const lines = str.split('\n');
17
+ // Process each line
18
+ lines.forEach((line, i) => {
19
+ if (line || i < lines.length - 1) { // Skip empty lines at the end
20
+ // Add the new line to the buffer
21
+ this.buffer.push(line);
22
+ // If buffer exceeds max lines, remove the oldest line
23
+ if (this.buffer.length > this.maxLines) {
24
+ this.buffer.shift();
25
+ }
26
+ // Clear the terminal and rewrite all lines
27
+ this.push('\x1b[' + this.maxLines + 'A\x1b[0G\x1b[0J'); // Move cursor up and clear screen below
28
+ // Write each line in the buffer
29
+ this.buffer.forEach(bufferedLine => {
30
+ const prefixed = new Promise((resolve) => {
31
+ this.prefixer._transform(bufferedLine, 'utf8', () => {
32
+ this.prefixer.once('data', (data) => {
33
+ resolve(data);
34
+ });
35
+ });
36
+ });
37
+ prefixed.then(data => this.push(data + '\n'));
38
+ });
39
+ }
40
+ });
41
+ callback();
42
+ }
43
+ _flush(callback) {
44
+ callback();
45
+ }
46
+ }
47
+ //# sourceMappingURL=virtual-scroll-prefixer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-scroll-prefixer.js","sourceRoot":"","sources":["../../src/virtual-scroll-prefixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,OAAO,qBAAsB,SAAQ,SAAS;IAExC,MAAM,GAAa,EAAE,CAAC;IACb,QAAQ,CAAS;IACjB,QAAQ,CAAkB;IAE3C,YAAY,MAAc,EAAE,UAAsD,EAAE;QAEhF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAe,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,UAAU,CAAC,KAAsB,EAAE,QAAgB,EAAE,QAAoB;QAErE,2CAA2C;QAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;QAE9D,6BAA6B;QAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,oBAAoB;QACpB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAEtB,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAChC,CAAC,CAAC,8BAA8B;gBAC5B,iCAAiC;gBACjC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvB,sDAAsD;gBACtD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,EACtC,CAAC;oBACG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,wCAAwC;gBAEhG,gCAAgC;gBAChC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE;oBAE/B,MAAM,QAAQ,GAAG,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;wBAE7C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE;4BAEhD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;gCAEhC,OAAO,CAAC,IAAI,CAAC,CAAC;4BAClB,CAAC,CAAC,CAAC;wBACP,CAAC,CAAC,CAAC;oBACP,CAAC,CAAC,CAAC;oBACH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC;gBAClD,CAAC,CAAC,CAAC;YACP,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,EAAE,CAAC;IACf,CAAC;IAED,MAAM,CAAC,QAAoB;QAEvB,QAAQ,EAAE,CAAC;IACf,CAAC;CACJ"}