@idlebox/common 1.3.23 → 1.3.26

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.
Files changed (57) hide show
  1. package/lib/cjs/__create_index.generated.cjs +73 -57
  2. package/lib/cjs/__create_index.generated.cjs.map +1 -1
  3. package/lib/cjs/__create_index.generated.d.cts +62 -5
  4. package/lib/cjs/debugging/tryInspect.cjs +4 -1
  5. package/lib/cjs/debugging/tryInspect.cjs.map +1 -1
  6. package/lib/cjs/error/pretty.cjs +235 -0
  7. package/lib/cjs/error/pretty.cjs.map +10 -0
  8. package/lib/cjs/lifecycle/dispose/disposedError.cjs +15 -2
  9. package/lib/cjs/lifecycle/dispose/disposedError.cjs.map +1 -1
  10. package/lib/cjs/lifecycle/dispose/lifecycle.async.cjs +9 -4
  11. package/lib/cjs/lifecycle/dispose/lifecycle.async.cjs.map +1 -1
  12. package/lib/cjs/lifecycle/dispose/lifecycle.sync.cjs +10 -2
  13. package/lib/cjs/lifecycle/dispose/lifecycle.sync.cjs.map +1 -1
  14. package/lib/cjs/path/normalizePath.cjs +116 -4
  15. package/lib/cjs/path/normalizePath.cjs.map +1 -1
  16. package/lib/cjs/promise/{promisePool.cjs → promiseCollection.cjs} +4 -4
  17. package/lib/cjs/promise/promiseCollection.cjs.map +10 -0
  18. package/lib/cjs/promise/{timeoutPromisePool.cjs → timeoutPromiseCollection.cjs} +5 -5
  19. package/lib/cjs/promise/timeoutPromiseCollection.cjs.map +10 -0
  20. package/lib/cjs/state/StateMachine.cjs +34 -0
  21. package/lib/cjs/state/StateMachine.cjs.map +10 -0
  22. package/lib/esm/__create_index.generated.d.mts +62 -5
  23. package/lib/esm/__create_index.generated.mjs +41 -32
  24. package/lib/esm/__create_index.generated.mjs.map +1 -1
  25. package/lib/esm/debugging/tryInspect.mjs +4 -1
  26. package/lib/esm/debugging/tryInspect.mjs.map +1 -1
  27. package/lib/esm/error/pretty.mjs +229 -0
  28. package/lib/esm/error/pretty.mjs.map +10 -0
  29. package/lib/esm/lifecycle/dispose/disposedError.mjs +15 -2
  30. package/lib/esm/lifecycle/dispose/disposedError.mjs.map +1 -1
  31. package/lib/esm/lifecycle/dispose/lifecycle.async.mjs +9 -4
  32. package/lib/esm/lifecycle/dispose/lifecycle.async.mjs.map +1 -1
  33. package/lib/esm/lifecycle/dispose/lifecycle.sync.mjs +10 -2
  34. package/lib/esm/lifecycle/dispose/lifecycle.sync.mjs.map +1 -1
  35. package/lib/esm/path/normalizePath.mjs +113 -3
  36. package/lib/esm/path/normalizePath.mjs.map +1 -1
  37. package/lib/esm/promise/{promisePool.mjs → promiseCollection.mjs} +2 -2
  38. package/lib/esm/promise/promiseCollection.mjs.map +10 -0
  39. package/lib/esm/promise/{timeoutPromisePool.mjs → timeoutPromiseCollection.mjs} +3 -3
  40. package/lib/esm/promise/timeoutPromiseCollection.mjs.map +10 -0
  41. package/lib/esm/state/StateMachine.mjs +30 -0
  42. package/lib/esm/state/StateMachine.mjs.map +10 -0
  43. package/package.json +4 -4
  44. package/src/debugging/tryInspect.ts +3 -1
  45. package/src/error/pretty.ts +249 -0
  46. package/src/lifecycle/dispose/disposedError.ts +20 -3
  47. package/src/lifecycle/dispose/lifecycle.async.ts +14 -3
  48. package/src/lifecycle/dispose/lifecycle.sync.ts +18 -4
  49. package/src/lifecycle/dispose/lifecycle.ts +1 -1
  50. package/src/path/normalizePath.ts +126 -3
  51. package/src/promise/{promisePool.ts → promiseCollection.ts} +1 -1
  52. package/src/promise/{timeoutPromisePool.ts → timeoutPromiseCollection.ts} +2 -2
  53. package/src/state/StateMachine.ts +52 -0
  54. package/lib/cjs/promise/promisePool.cjs.map +0 -10
  55. package/lib/cjs/promise/timeoutPromisePool.cjs.map +0 -10
  56. package/lib/esm/promise/promisePool.mjs.map +0 -10
  57. package/lib/esm/promise/timeoutPromisePool.mjs.map +0 -10
@@ -1,13 +1,13 @@
1
1
  import { convertCatchedError } from '../../error/convertUnknown';
2
2
  import { Emitter, EventRegister } from '../event/event';
3
3
  import { DisposedError } from './disposedError';
4
- import { IAsyncDisposable, IDisposableBaseInternal } from './lifecycle';
4
+ import { IAsyncDisposable, IDisposableEvents } from './lifecycle';
5
5
 
6
6
  /**
7
7
  * Async version of Disposable
8
8
  * @public
9
9
  */
10
- export class AsyncDisposable implements IAsyncDisposable, IDisposableBaseInternal {
10
+ export class AsyncDisposable implements IAsyncDisposable, IDisposableEvents {
11
11
  private readonly _disposables: IAsyncDisposable[] = [];
12
12
 
13
13
  protected readonly _onDisposeError = new Emitter<Error>();
@@ -34,12 +34,23 @@ export class AsyncDisposable implements IAsyncDisposable, IDisposableBaseInterna
34
34
  /**
35
35
  * register a disposable object
36
36
  */
37
- public _register<T extends IAsyncDisposable>(d: T): T {
37
+ public _register<T extends IAsyncDisposable>(d: T): T;
38
+ public _register<T extends IAsyncDisposable & IDisposableEvents>(d: T, autoDereference?: boolean): T;
39
+ public _register<T extends IAsyncDisposable | (IAsyncDisposable & IDisposableEvents)>(d: T, deref?: boolean): T {
38
40
  this.assertNotDisposed();
39
41
  this._disposables.unshift(d);
42
+ if (deref) {
43
+ (d as IDisposableEvents).onBeforeDispose(() => {
44
+ this._unregister(d);
45
+ });
46
+ }
40
47
  return d;
41
48
  }
42
49
 
50
+ public _unregister(d: IAsyncDisposable) {
51
+ return this._disposables.splice(this._disposables.indexOf(d), 1).length > 0;
52
+ }
53
+
43
54
  public async dispose(): Promise<void> {
44
55
  if (this._disposed) {
45
56
  console.warn(new DisposedError(this, this._disposed).message);
@@ -1,6 +1,6 @@
1
- import { DisposedError } from './disposedError';
2
1
  import { Emitter, EventRegister } from '../event/event';
3
- import { IDisposable, IDisposableBaseInternal } from './lifecycle';
2
+ import { DisposedError } from './disposedError';
3
+ import { IDisposable, IDisposableEvents } from './lifecycle';
4
4
 
5
5
  export abstract class DisposableOnce implements IDisposable {
6
6
  private _disposed?: Error;
@@ -23,7 +23,7 @@ export abstract class DisposableOnce implements IDisposable {
23
23
  /**
24
24
  * Standalone disposable class, can use as instance or base class.
25
25
  */
26
- export class Disposable implements IDisposable, IDisposableBaseInternal {
26
+ export class Disposable implements IDisposable, IDisposableEvents {
27
27
  private readonly _disposables: IDisposable[] = [];
28
28
 
29
29
  protected readonly _onDisposeError = new Emitter<Error>();
@@ -47,12 +47,26 @@ export class Disposable implements IDisposable, IDisposableBaseInternal {
47
47
  }
48
48
  }
49
49
 
50
- public _register<T extends IDisposable>(d: T): T {
50
+ /**
51
+ * register a disposable object
52
+ */
53
+ public _register<T extends IDisposable>(d: T): T;
54
+ public _register<T extends IDisposable & IDisposableEvents>(d: T, autoDereference?: boolean): T;
55
+ public _register<T extends IDisposable | (IDisposable & IDisposableEvents)>(d: T, autoDereference?: boolean): T {
51
56
  this.assertNotDisposed();
52
57
  this._disposables.unshift(d);
58
+ if (autoDereference) {
59
+ (d as IDisposableEvents).onBeforeDispose(() => {
60
+ this._unregister(d);
61
+ });
62
+ }
53
63
  return d;
54
64
  }
55
65
 
66
+ public _unregister(d: IDisposable) {
67
+ return this._disposables.splice(this._disposables.indexOf(d), 1).length > 0;
68
+ }
69
+
56
70
  public dispose(): void {
57
71
  if (this._disposed) {
58
72
  console.warn(new DisposedError(this, this._disposed).message);
@@ -3,7 +3,7 @@ import { EventRegister } from '../event/event';
3
3
  /**
4
4
  * @private
5
5
  */
6
- export interface IDisposableBaseInternal {
6
+ export interface IDisposableEvents {
7
7
  onDisposeError: EventRegister<Error>;
8
8
  onBeforeDispose: EventRegister<void>;
9
9
  readonly hasDisposed: boolean;
@@ -1,11 +1,134 @@
1
+ const schema = /^[a-z]{2,}:\/\//i;
2
+ const unc = /^[\/\\]{1,2}\?[\/\\]UNC[\/\\]/i;
3
+ const winSp = /^[\/\\]{1,2}\?[\/\\]([a-z]:[\/\\])/i;
4
+ const winLetter = /^[a-z]:\//i;
5
+ const doubleSlash = /^[\/\\]{2}[^\/\\]/i;
6
+
7
+ export enum PathKind {
8
+ url,
9
+ unc,
10
+ win,
11
+ cifs,
12
+ unix,
13
+ relative,
14
+ }
15
+ export interface IPathInfo {
16
+ kind: PathKind;
17
+ prefix?: string;
18
+ path: string;
19
+ url?: URL;
20
+ }
21
+
22
+ export function analyzePath(p: string) {
23
+ const inp = p;
24
+ let r: IPathInfo;
25
+ if (schema.test(p)) {
26
+ const u = new URL(p);
27
+ r = {
28
+ kind: PathKind.url,
29
+ prefix: u.protocol + '//' + u.host,
30
+ path: u.pathname.slice(1),
31
+ url: u,
32
+ };
33
+ } else if (unc.test(p)) {
34
+ p = p.replace(unc, '').replace(/^[\/\\]+/, '');
35
+ const i = /[\///]/.exec(p)?.index ?? -1;
36
+ if (i <= 0) throw new Error('invalid unc path: ' + inp);
37
+
38
+ r = {
39
+ kind: PathKind.unc,
40
+ prefix: '//?/UNC/' + p.slice(0, i),
41
+ path: p.slice(i + 1),
42
+ };
43
+ } else if (winSp.test(p) || winLetter.test(p)) {
44
+ p = p.replace(winSp, '$1');
45
+
46
+ r = {
47
+ kind: PathKind.win,
48
+ prefix: p.slice(0, 2),
49
+ path: p.slice(4),
50
+ };
51
+ } else if (doubleSlash.test(p)) {
52
+ p = p.replace(/^[\/\\]+/, '');
53
+ const i = /[\///]/.exec(p)?.index ?? -1;
54
+ if (i <= 0) throw new Error('invalid cifs url: ' + inp);
55
+
56
+ r = {
57
+ kind: PathKind.cifs,
58
+ prefix: '//' + p.slice(0, i),
59
+ path: p.slice(i + 1),
60
+ };
61
+ } else if (p.startsWith('/')) {
62
+ r = {
63
+ kind: PathKind.unix,
64
+ prefix: '',
65
+ path: p,
66
+ };
67
+ } else {
68
+ const st = p.startsWith('..') ? '..' : '.';
69
+ r = {
70
+ kind: PathKind.relative,
71
+ prefix: st,
72
+ path: p,
73
+ };
74
+ }
75
+
76
+ const path = r.path.replace(/\\/g, '/');
77
+ const st = [];
78
+ for (const item of path.split('/')) {
79
+ if (!item || item === '.') continue;
80
+ if (item === '..') {
81
+ st.pop();
82
+ } else {
83
+ st.push(item);
84
+ }
85
+ }
86
+ r.path = st.join('/');
87
+
88
+ return r;
89
+ }
90
+
1
91
  /**
2
92
  * replace // to /
3
93
  * replace \ to /
4
94
  * remove ending /
5
95
  */
6
96
  export function normalizePath(p: string) {
7
- if (p.startsWith('file:')) {
8
- throw new Error('normalizePath not support file url.');
97
+ const r = analyzePath(p);
98
+
99
+ if (r.prefix === undefined) {
100
+ return r.path;
101
+ } else {
102
+ return `${r.prefix}/${r.path}`;
9
103
  }
10
- return p.replace(/\\+/g, '/').replace(/\/\/+/g, '/').replace(/\/+$/, '');
104
+ }
105
+
106
+ export function relativePath(from: string, to: string) {
107
+ const r1 = analyzePath(from);
108
+ const r2 = analyzePath(to);
109
+ if (r1.kind !== r2.kind)
110
+ throw new Error(
111
+ `cannot relative path between different kind: "${PathKind[r1.kind]}::${r1.prefix}" * "${
112
+ PathKind[r2.kind]
113
+ }::${r2.prefix}"`,
114
+ );
115
+
116
+ if (r1.prefix !== r2.prefix) return to;
117
+
118
+ const p1arr = r1.path.split('/');
119
+ const p2arr = r2.path.split('/');
120
+
121
+ // find same prefix
122
+ let i = 0;
123
+ while (i < p1arr.length && i < p2arr.length && p1arr[i] === p2arr[i]) i++;
124
+
125
+ // remove same prefix
126
+ p1arr.splice(0, i);
127
+ p2arr.splice(0, i);
128
+
129
+ // add ..
130
+ const p1 = p1arr.length > 0 ? p1arr.map(() => '..').join('/') + '/' : '';
131
+ const p2 = p2arr.join('/');
132
+
133
+ return p1 + p2;
11
134
  }
@@ -1,7 +1,7 @@
1
1
  import { CanceledError } from '../lifecycle/promise/cancel';
2
2
  import { DeferredPromise } from '../lifecycle/promise/deferredPromise';
3
3
 
4
- export class PromisePool {
4
+ export class PromiseCollection {
5
5
  protected readonly promiseList: Record<string, DeferredPromise<any>> = {};
6
6
 
7
7
  size() {
@@ -1,7 +1,7 @@
1
1
  import { TimeoutError } from '../lifecycle/timeout/timeoutError';
2
- import { PromisePool } from './promisePool';
2
+ import { PromiseCollection } from './promiseCollection';
3
3
 
4
- export class TimeoutPromisePool extends PromisePool {
4
+ export class TimeoutPromiseCollection extends PromiseCollection {
5
5
  constructor(private readonly defaultTimeoutMs = 50000) {
6
6
  super();
7
7
  }
@@ -0,0 +1,52 @@
1
+ import { Emitter } from '../lifecycle/event/event';
2
+
3
+ // type StateType = string | number;
4
+ // type EventType = string | number;
5
+
6
+ export type IFsmRuleMap<StateType, EventType> = MapLike<StateType, MapLike<EventType, StateType>>;
7
+
8
+ type MapLike<K, V> = Pick<Map<K, V>, 'get' | 'has' | 'keys'>;
9
+
10
+ export interface IStateChangeEvent<StateType, EventType> {
11
+ from: StateType;
12
+ to: StateType;
13
+ reason: EventType;
14
+ }
15
+
16
+ export class SimpleStateMachine<StateType, EventType> {
17
+ protected declare currentState: StateType;
18
+ protected readonly rules: IFsmRuleMap<StateType, EventType>;
19
+
20
+ private readonly _onStateChange = new Emitter<IStateChangeEvent<StateType, EventType>>();
21
+ public readonly onStateChange = this._onStateChange.register;
22
+
23
+ constructor(rules: IFsmRuleMap<StateType, EventType>, init_state: StateType) {
24
+ this.rules = rules;
25
+ this.moveTo(init_state);
26
+ }
27
+
28
+ protected moveTo(state: StateType) {
29
+ if (!this.rules.has(state)) throw new Error(`missing state "${state}"`);
30
+
31
+ this.currentState = state;
32
+ }
33
+
34
+ getName() {
35
+ return this.currentState;
36
+ }
37
+
38
+ change(event: EventType) {
39
+ const state = this.rules.get(this.currentState)!;
40
+ const next = state.get(event);
41
+ if (typeof next === 'undefined') {
42
+ throw new Error(
43
+ `no event "${event} (${typeof event})" on state "${this.currentState} (${typeof this
44
+ .currentState})" (has ${[...state.keys()].map((v) => `"${v} (${typeof v})"`).join(', ')})`
45
+ );
46
+ }
47
+
48
+ const last = this.currentState;
49
+ this.moveTo(next);
50
+ this._onStateChange.fireNoError({ from: last, to: next, reason: event });
51
+ }
52
+ }
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "promisePool.cjs",
4
- "sourceRoot": "",
5
- "sources": [
6
- "../../../src/promise/promisePool.ts"
7
- ],
8
- "names": [],
9
- "mappings": ";;;AAAA,4DAA4D;AAC5D,8EAAuE;AAEvE,MAAa,WAAW;IACJ,WAAW,GAAyC,EAAE,CAAC;IAE1E,IAAI;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;SACnD;QACD,MAAM,GAAG,GAAG,IAAI,iCAAe,EAAO,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC3B,OAAO,GAAG,CAAC,CAAC,CAAC;IACd,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,EAAU,EAAE,IAAS;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,CAAQ;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACN,MAAM,CAAC,GAAG,IAAI,sBAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SAClB;IACF,CAAC;CACD;AApCD,kCAoCC"
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "timeoutPromisePool.cjs",
4
- "sourceRoot": "",
5
- "sources": [
6
- "../../../src/promise/timeoutPromisePool.ts"
7
- ],
8
- "names": [],
9
- "mappings": ";;;AAAA,wEAAiE;AACjE,mDAA4C;AAE5C,MAAa,kBAAmB,SAAQ,yBAAW;IACrB;IAA7B,YAA6B,mBAAmB,KAAK;QACpD,KAAK,EAAE,CAAC;QADoB,qBAAgB,GAAhB,gBAAgB,CAAQ;IAErD,CAAC;IAEQ,MAAM,CAAC,EAAU,EAAE,YAAoB,IAAI,CAAC,gBAAgB,EAAE,UAAmB;QACzF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,2BAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,YAAY,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC;IACV,CAAC;CACD;AAlBD,gDAkBC"
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "promisePool.mjs",
4
- "sourceRoot": "",
5
- "sources": [
6
- "../../../src/promise/promisePool.ts"
7
- ],
8
- "names": [],
9
- "mappings": "AAAA,OAAO,EAAE,aAAa,EAAE,wCAAoC;AAC5D,OAAO,EAAE,eAAe,EAAE,iDAA6C;AAEvE,MAAM,OAAO,WAAW;IACJ,WAAW,GAAyC,EAAE,CAAC;IAE1E,IAAI;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED,MAAM,CAAC,EAAU;QAChB,IAAI,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE;YACzB,MAAM,IAAI,KAAK,CAAC,4BAA4B,GAAG,EAAE,CAAC,CAAC;SACnD;QACD,MAAM,GAAG,GAAG,IAAI,eAAe,EAAO,CAAC;QACvC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;QAC3B,OAAO,GAAG,CAAC,CAAC,CAAC;IACd,CAAC;IAED,GAAG,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,CAAC,EAAU,EAAE,IAAS;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,EAAU,EAAE,CAAQ;QACzB,IAAI,CAAC,WAAW,CAAC,EAAE,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACN,MAAM,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;YAC/C,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;SAClB;IACF,CAAC;CACD"
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "version": 3,
3
- "file": "timeoutPromisePool.mjs",
4
- "sourceRoot": "",
5
- "sources": [
6
- "../../../src/promise/timeoutPromisePool.ts"
7
- ],
8
- "names": [],
9
- "mappings": "AAAA,OAAO,EAAE,YAAY,EAAE,8CAA0C;AACjE,OAAO,EAAE,WAAW,EAAE,0BAAsB;AAE5C,MAAM,OAAO,kBAAmB,SAAQ,WAAW;IACrB;IAA7B,YAA6B,mBAAmB,KAAK;QACpD,KAAK,EAAE,CAAC;QADoB,qBAAgB,GAAhB,gBAAgB,CAAQ;IAErD,CAAC;IAEQ,MAAM,CAAC,EAAU,EAAE,YAAoB,IAAI,CAAC,gBAAgB,EAAE,UAAmB;QACzF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE3B,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YACd,YAAY,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,CAAC;IACV,CAAC;CACD"
10
- }