@roomkit/state 1.1.2 → 1.2.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.
Files changed (59) hide show
  1. package/dist/State.d.ts +86 -0
  2. package/dist/State.d.ts.map +1 -0
  3. package/dist/State.js +279 -0
  4. package/dist/State.js.map +1 -0
  5. package/dist/collections/TrackedArray.d.ts +87 -0
  6. package/dist/collections/TrackedArray.d.ts.map +1 -0
  7. package/dist/collections/TrackedArray.js +203 -0
  8. package/dist/collections/TrackedArray.js.map +1 -0
  9. package/dist/collections/TrackedMap.d.ts +77 -0
  10. package/dist/collections/TrackedMap.d.ts.map +1 -0
  11. package/dist/collections/TrackedMap.js +183 -0
  12. package/dist/collections/TrackedMap.js.map +1 -0
  13. package/dist/collections/TrackedSet.d.ts +81 -0
  14. package/dist/collections/TrackedSet.d.ts.map +1 -0
  15. package/dist/collections/TrackedSet.js +175 -0
  16. package/dist/collections/TrackedSet.js.map +1 -0
  17. package/dist/collections/index.d.ts +9 -0
  18. package/dist/collections/index.d.ts.map +1 -0
  19. package/dist/collections/index.js +8 -0
  20. package/dist/collections/index.js.map +1 -0
  21. package/dist/compression/CompressionStrategy.d.ts +81 -0
  22. package/dist/compression/CompressionStrategy.d.ts.map +1 -0
  23. package/dist/compression/CompressionStrategy.js +195 -0
  24. package/dist/compression/CompressionStrategy.js.map +1 -0
  25. package/dist/compression/index.d.ts +5 -0
  26. package/dist/compression/index.d.ts.map +1 -0
  27. package/dist/compression/index.js +5 -0
  28. package/dist/compression/index.js.map +1 -0
  29. package/dist/decorators/index.d.ts +62 -0
  30. package/dist/decorators/index.d.ts.map +1 -0
  31. package/dist/decorators/index.js +144 -0
  32. package/dist/decorators/index.js.map +1 -0
  33. package/dist/encoding/index.d.ts +68 -0
  34. package/dist/encoding/index.d.ts.map +1 -0
  35. package/dist/encoding/index.js +227 -0
  36. package/dist/encoding/index.js.map +1 -0
  37. package/dist/index.js +8 -24
  38. package/dist/index.js.map +1 -1
  39. package/dist/optimization/BatchQueue.d.ts +96 -0
  40. package/dist/optimization/BatchQueue.d.ts.map +1 -0
  41. package/dist/optimization/BatchQueue.js +231 -0
  42. package/dist/optimization/BatchQueue.js.map +1 -0
  43. package/dist/optimization/index.d.ts +5 -0
  44. package/dist/optimization/index.d.ts.map +1 -0
  45. package/dist/optimization/index.js +5 -0
  46. package/dist/optimization/index.js.map +1 -0
  47. package/dist/tracking/ChangeTracker.d.ts +75 -0
  48. package/dist/tracking/ChangeTracker.d.ts.map +1 -0
  49. package/dist/tracking/ChangeTracker.js +341 -0
  50. package/dist/tracking/ChangeTracker.js.map +1 -0
  51. package/dist/tracking/deep-tracking.d.ts +22 -0
  52. package/dist/tracking/deep-tracking.d.ts.map +1 -0
  53. package/dist/tracking/deep-tracking.js +173 -0
  54. package/dist/tracking/deep-tracking.js.map +1 -0
  55. package/dist/types.d.ts +140 -0
  56. package/dist/types.d.ts.map +1 -0
  57. package/dist/types.js +21 -0
  58. package/dist/types.js.map +1 -0
  59. package/package.json +3 -4
@@ -0,0 +1,195 @@
1
+ /**
2
+ * 压缩策略管理器
3
+ * 根据数据大小和类型智能选择压缩方案
4
+ */
5
+ import { deflate, inflate } from 'pako';
6
+ /**
7
+ * 压缩策略
8
+ */
9
+ export class CompressionStrategy {
10
+ defaultOptions = {
11
+ threshold: 1024, // 1KB 以下不压缩
12
+ minCompressionRatio: 0.8, // 压缩率低于 80% 才使用
13
+ level: 6, // 默认压缩级别
14
+ force: false,
15
+ adaptive: true,
16
+ };
17
+ // 统计数据用于自适应
18
+ stats = {
19
+ totalAttempts: 0,
20
+ totalCompressed: 0,
21
+ totalSaved: 0,
22
+ averageRatio: 1.0,
23
+ };
24
+ constructor(options) {
25
+ if (options) {
26
+ this.defaultOptions = { ...this.defaultOptions, ...options };
27
+ }
28
+ }
29
+ /**
30
+ * 压缩数据
31
+ */
32
+ compress(data, options) {
33
+ const opts = { ...this.defaultOptions, ...options };
34
+ const originalSize = data.length;
35
+ // 太小不压缩
36
+ if (!opts.force && originalSize < opts.threshold) {
37
+ return {
38
+ data,
39
+ compressed: false,
40
+ originalSize,
41
+ compressedSize: originalSize,
42
+ compressionRatio: 1.0,
43
+ };
44
+ }
45
+ // 自适应:如果历史压缩效果不好,跳过
46
+ if (opts.adaptive && this.stats.totalAttempts > 10) {
47
+ if (this.stats.averageRatio > 0.95) {
48
+ return {
49
+ data,
50
+ compressed: false,
51
+ originalSize,
52
+ compressedSize: originalSize,
53
+ compressionRatio: 1.0,
54
+ };
55
+ }
56
+ }
57
+ try {
58
+ const startTime = Date.now();
59
+ const compressed = deflate(data, { level: opts.level });
60
+ const compressionTime = Date.now() - startTime;
61
+ const compressedSize = compressed.length;
62
+ const ratio = compressedSize / originalSize;
63
+ // 更新统计
64
+ this.stats.totalAttempts++;
65
+ // 压缩效果不好,不使用压缩结果
66
+ if (!opts.force && ratio > opts.minCompressionRatio) {
67
+ return {
68
+ data,
69
+ compressed: false,
70
+ originalSize,
71
+ compressedSize: originalSize,
72
+ compressionRatio: 1.0,
73
+ };
74
+ }
75
+ // 压缩成功
76
+ this.stats.totalCompressed++;
77
+ this.stats.totalSaved += (originalSize - compressedSize);
78
+ this.stats.averageRatio = (this.stats.averageRatio * (this.stats.totalAttempts - 1) + ratio) / this.stats.totalAttempts;
79
+ if (compressionTime > 100) {
80
+ console.warn(`[Compression] Slow compression: ${compressionTime}ms for ${originalSize} bytes`);
81
+ }
82
+ return {
83
+ data: compressed,
84
+ compressed: true,
85
+ originalSize,
86
+ compressedSize,
87
+ compressionRatio: ratio,
88
+ };
89
+ }
90
+ catch (error) {
91
+ console.error('[Compression] Error:', error);
92
+ return {
93
+ data,
94
+ compressed: false,
95
+ originalSize,
96
+ compressedSize: originalSize,
97
+ compressionRatio: 1.0,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * 解压数据
103
+ */
104
+ decompress(data, compressed) {
105
+ if (!compressed)
106
+ return data;
107
+ try {
108
+ return inflate(data);
109
+ }
110
+ catch (error) {
111
+ console.error('[Compression] Decompress error:', error);
112
+ return data;
113
+ }
114
+ }
115
+ /**
116
+ * 批量压缩(用于多个小对象)
117
+ */
118
+ compressBatch(dataArray) {
119
+ // 合并所有数据
120
+ const totalSize = dataArray.reduce((sum, d) => sum + d.length, 0);
121
+ const merged = new Uint8Array(totalSize);
122
+ let offset = 0;
123
+ for (const data of dataArray) {
124
+ merged.set(data, offset);
125
+ offset += data.length;
126
+ }
127
+ // 压缩合并后的数据
128
+ return this.compress(merged);
129
+ }
130
+ /**
131
+ * 获取压缩统计
132
+ */
133
+ getStats() {
134
+ return {
135
+ ...this.stats,
136
+ compressionRate: this.stats.totalAttempts > 0
137
+ ? this.stats.totalCompressed / this.stats.totalAttempts
138
+ : 0,
139
+ averageSaving: this.stats.totalCompressed > 0
140
+ ? this.stats.totalSaved / this.stats.totalCompressed
141
+ : 0,
142
+ };
143
+ }
144
+ /**
145
+ * 重置统计
146
+ */
147
+ resetStats() {
148
+ this.stats = {
149
+ totalAttempts: 0,
150
+ totalCompressed: 0,
151
+ totalSaved: 0,
152
+ averageRatio: 1.0,
153
+ };
154
+ }
155
+ /**
156
+ * 根据数据类型建议压缩级别
157
+ */
158
+ static suggestLevel(dataType) {
159
+ switch (dataType) {
160
+ case 'text':
161
+ return 9; // 文本压缩效果好,使用最高级别
162
+ case 'binary':
163
+ return 3; // 二进制数据可能已压缩,使用低级别
164
+ case 'mixed':
165
+ default:
166
+ return 6; // 混合数据使用中等级别
167
+ }
168
+ }
169
+ /**
170
+ * 估算压缩后大小(不实际压缩)
171
+ */
172
+ static estimateSize(data) {
173
+ // 简单启发式估算
174
+ const size = data.length;
175
+ // 检查数据熵(重复模式)
176
+ const sample = data.slice(0, Math.min(1024, size));
177
+ const unique = new Set(sample);
178
+ const entropy = unique.size / sample.length;
179
+ // 高熵(随机)数据压缩效果差
180
+ if (entropy > 0.9) {
181
+ return Math.floor(size * 0.95); // 估计只能压缩 5%
182
+ }
183
+ // 低熵数据压缩效果好
184
+ if (entropy < 0.3) {
185
+ return Math.floor(size * 0.4); // 估计能压缩 60%
186
+ }
187
+ // 中等熵
188
+ return Math.floor(size * 0.7); // 估计能压缩 30%
189
+ }
190
+ }
191
+ /**
192
+ * 全局压缩策略实例
193
+ */
194
+ export const globalCompressionStrategy = new CompressionStrategy();
195
+ //# sourceMappingURL=CompressionStrategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompressionStrategy.js","sourceRoot":"","sources":["../../src/compression/CompressionStrategy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compression utilities
3
+ */
4
+ export * from './CompressionStrategy.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Compression utilities
3
+ */
4
+ export * from './CompressionStrategy.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compression/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * State Schema Decorators - TypeScript 5.0+ Standard
3
+ *
4
+ * 使用 TS 5.0+ 的标准装饰器,无需 experimentalDecorators
5
+ */
6
+ import { FieldType, FieldMetadata } from '../types.js';
7
+ /**
8
+ * @Field - 定义一个可序列化的字段(TS 5.0+ 标准装饰器)
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * class Player {
13
+ * @Field('string') name: string = '';
14
+ * @Field('number') health: number = 100;
15
+ * @Field('boolean') isAlive: boolean = true;
16
+ * }
17
+ * ```
18
+ */
19
+ export declare function Field(type: FieldType, optional?: boolean): (_target: undefined, context: ClassFieldDecoratorContext) => void;
20
+ /**
21
+ * @MapField - 定义一个 Map 集合字段(TS 5.0+ 标准装饰器)
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * class GameState {
26
+ * @MapField(Player) players = new Map<string, Player>();
27
+ * }
28
+ * ```
29
+ */
30
+ export declare function MapField(valueType: Function): (_target: undefined, context: ClassFieldDecoratorContext) => void;
31
+ /**
32
+ * @ArrayField - 定义一个 Array 集合字段(TS 5.0+ 标准装饰器)
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * class GameState {
37
+ * @ArrayField('number') scores: number[] = [];
38
+ * @ArrayField(Item) inventory: Item[] = [];
39
+ * }
40
+ * ```
41
+ */
42
+ export declare function ArrayField(type: FieldType): (_target: undefined, context: ClassFieldDecoratorContext) => void;
43
+ /**
44
+ * @SetField - 定义一个 Set 集合字段(TS 5.0+ 标准装饰器)
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * class GameState {
49
+ * @SetField('string') activePlayers = new Set<string>();
50
+ * }
51
+ * ```
52
+ */
53
+ export declare function SetField(type: FieldType): (_target: undefined, context: ClassFieldDecoratorContext) => void;
54
+ /**
55
+ * 获取类的所有字段元数据
56
+ */
57
+ export declare function getFieldsMetadata(target: any): Map<string, FieldMetadata>;
58
+ /**
59
+ * 检查对象是否有 State 装饰器定义
60
+ */
61
+ export declare function hasStateMetadata(target: any): boolean;
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAiB,MAAM,aAAa,CAAC;AAiBtE;;;;;;;;;;;GAWG;AACH,wBAAgB,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,GAAE,OAAe,IAE5D,SAAS,SAAS,EAClB,SAAS,0BAA0B,UAgBtC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,SAAS,EAAE,QAAQ,IAExC,SAAS,SAAS,EAClB,SAAS,0BAA0B,UActC;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,SAAS,IAEtC,SAAS,SAAS,EAClB,SAAS,0BAA0B,UActC;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,IAEpC,SAAS,SAAS,EAClB,SAAS,0BAA0B,UActC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAgBzE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAGrD"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * State Schema Decorators - TypeScript 5.0+ Standard
3
+ *
4
+ * 使用 TS 5.0+ 的标准装饰器,无需 experimentalDecorators
5
+ */
6
+ /**
7
+ * 获取或创建类的字段元数据(TS 5.0+ 版本)
8
+ */
9
+ function getOrCreateFieldsMetadata(target) {
10
+ if (!target)
11
+ return new Map();
12
+ // 直接使用属性而不是 Symbol
13
+ const metadataKey = '__roomkit_fields__';
14
+ if (!target[metadataKey]) {
15
+ target[metadataKey] = new Map();
16
+ }
17
+ return target[metadataKey];
18
+ }
19
+ /**
20
+ * @Field - 定义一个可序列化的字段(TS 5.0+ 标准装饰器)
21
+ *
22
+ * @example
23
+ * ```typescript
24
+ * class Player {
25
+ * @Field('string') name: string = '';
26
+ * @Field('number') health: number = 100;
27
+ * @Field('boolean') isAlive: boolean = true;
28
+ * }
29
+ * ```
30
+ */
31
+ export function Field(type, optional = false) {
32
+ return function (_target, context) {
33
+ // 在类初始化时添加元数据
34
+ context.addInitializer(function () {
35
+ const fields = getOrCreateFieldsMetadata(this.constructor.prototype);
36
+ fields.set(context.name, {
37
+ key: context.name,
38
+ type,
39
+ isArray: false,
40
+ isMap: false,
41
+ isSet: false,
42
+ optional,
43
+ });
44
+ });
45
+ };
46
+ }
47
+ /**
48
+ * @MapField - 定义一个 Map 集合字段(TS 5.0+ 标准装饰器)
49
+ *
50
+ * @example
51
+ * ```typescript
52
+ * class GameState {
53
+ * @MapField(Player) players = new Map<string, Player>();
54
+ * }
55
+ * ```
56
+ */
57
+ export function MapField(valueType) {
58
+ return function (_target, context) {
59
+ context.addInitializer(function () {
60
+ const fields = getOrCreateFieldsMetadata(this.constructor.prototype);
61
+ fields.set(context.name, {
62
+ key: context.name,
63
+ type: valueType,
64
+ isArray: false,
65
+ isMap: true,
66
+ isSet: false,
67
+ });
68
+ });
69
+ };
70
+ }
71
+ /**
72
+ * @ArrayField - 定义一个 Array 集合字段(TS 5.0+ 标准装饰器)
73
+ *
74
+ * @example
75
+ * ```typescript
76
+ * class GameState {
77
+ * @ArrayField('number') scores: number[] = [];
78
+ * @ArrayField(Item) inventory: Item[] = [];
79
+ * }
80
+ * ```
81
+ */
82
+ export function ArrayField(type) {
83
+ return function (_target, context) {
84
+ context.addInitializer(function () {
85
+ const fields = getOrCreateFieldsMetadata(this.constructor.prototype);
86
+ fields.set(context.name, {
87
+ key: context.name,
88
+ type,
89
+ isArray: true,
90
+ isMap: false,
91
+ isSet: false,
92
+ });
93
+ });
94
+ };
95
+ }
96
+ /**
97
+ * @SetField - 定义一个 Set 集合字段(TS 5.0+ 标准装饰器)
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * class GameState {
102
+ * @SetField('string') activePlayers = new Set<string>();
103
+ * }
104
+ * ```
105
+ */
106
+ export function SetField(type) {
107
+ return function (_target, context) {
108
+ context.addInitializer(function () {
109
+ const fields = getOrCreateFieldsMetadata(this.constructor.prototype);
110
+ fields.set(context.name, {
111
+ key: context.name,
112
+ type,
113
+ isArray: false,
114
+ isMap: false,
115
+ isSet: true,
116
+ });
117
+ });
118
+ };
119
+ }
120
+ /**
121
+ * 获取类的所有字段元数据
122
+ */
123
+ export function getFieldsMetadata(target) {
124
+ if (!target)
125
+ return new Map();
126
+ const metadataKey = '__roomkit_fields__';
127
+ // 尝试从实例获取
128
+ if (target[metadataKey]) {
129
+ return target[metadataKey];
130
+ }
131
+ // 尝试从原型获取
132
+ if (target.constructor && target.constructor.prototype[metadataKey]) {
133
+ return target.constructor.prototype[metadataKey];
134
+ }
135
+ return new Map();
136
+ }
137
+ /**
138
+ * 检查对象是否有 State 装饰器定义
139
+ */
140
+ export function hasStateMetadata(target) {
141
+ const fields = getFieldsMetadata(target);
142
+ return fields.size > 0;
143
+ }
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * State Encoding and Decoding
3
+ * 使用 MessagePack 进行高性能二进制编码
4
+ */
5
+ import { CompressionStrategy } from '../compression/CompressionStrategy.js';
6
+ import type { Patch, EncodedState, EncodeOptions, DecodeOptions } from '../types.js';
7
+ /**
8
+ * StateEncoder - 状态编码器
9
+ */
10
+ export declare class StateEncoder {
11
+ private compressionStrategy;
12
+ constructor(compressionStrategy?: CompressionStrategy);
13
+ /**
14
+ * 编码完整状态
15
+ */
16
+ encodeFull(state: any, options?: EncodeOptions): EncodedState;
17
+ /**
18
+ * 编码增量变化
19
+ */
20
+ encodeDelta(patches: Patch[], options?: EncodeOptions): EncodedState;
21
+ /**
22
+ * 获取压缩统计
23
+ */
24
+ getCompressionStats(): {
25
+ compressionRate: number;
26
+ averageSaving: number;
27
+ totalAttempts: number;
28
+ totalCompressed: number;
29
+ totalSaved: number;
30
+ averageRatio: number;
31
+ };
32
+ /**
33
+ * 重置压缩统计
34
+ */
35
+ resetCompressionStats(): void;
36
+ /**
37
+ * 序列化对象
38
+ */
39
+ private serializeObject;
40
+ /**
41
+ * 序列化值
42
+ */
43
+ private serializeValue;
44
+ }
45
+ /**
46
+ * StateDecoder - 状态解码器
47
+ */
48
+ export declare class StateDecoder {
49
+ private compressionStrategy;
50
+ constructor(compressionStrategy?: CompressionStrategy);
51
+ /**
52
+ * 解码二进制数据
53
+ */
54
+ decode<T = any>(data: Uint8Array, options?: DecodeOptions): T;
55
+ /**
56
+ * 应用 Patches 到对象
57
+ */
58
+ applyPatches(target: any, patches: Patch[]): void;
59
+ /**
60
+ * 应用单个 Patch
61
+ */
62
+ private applyPatch;
63
+ /**
64
+ * 反序列化对象
65
+ */
66
+ private deserializeObject;
67
+ }
68
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/encoding/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,OAAO,KAAK,EACV,KAAK,EACL,YAAY,EACZ,aAAa,EACb,aAAa,EAEd,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,mBAAmB,CAAC,EAAE,mBAAmB;IAIrD;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAuBjE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,aAAkB,GAAG,YAAY;IAoBxE;;OAEG;IACH,mBAAmB;;;;;;;;IAInB;;OAEG;IACH,qBAAqB;IAIrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoCvB;;OAEG;IACH,OAAO,CAAC,cAAc;CAevB;AAED;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,mBAAmB,CAAsB;gBAErC,mBAAmB,CAAC,EAAE,mBAAmB;IAIrD;;OAEG;IACH,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,aAAkB,GAAG,CAAC;IAWjE;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,IAAI;IAMjD;;OAEG;IACH,OAAO,CAAC,UAAU;IAoDlB;;OAEG;IACH,OAAO,CAAC,iBAAiB;CA+B1B"}