@ecsia/core 0.1.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 (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +29 -0
  3. package/dist/bitmask/bitmask.d.ts +21 -0
  4. package/dist/bitmask/bitmask.d.ts.map +1 -0
  5. package/dist/bitmask/bitmask.js +103 -0
  6. package/dist/bitmask/bitmask.js.map +1 -0
  7. package/dist/bitmask/index.d.ts +3 -0
  8. package/dist/bitmask/index.d.ts.map +1 -0
  9. package/dist/bitmask/index.js +2 -0
  10. package/dist/bitmask/index.js.map +1 -0
  11. package/dist/component/accessor.d.ts +40 -0
  12. package/dist/component/accessor.d.ts.map +1 -0
  13. package/dist/component/accessor.js +220 -0
  14. package/dist/component/accessor.js.map +1 -0
  15. package/dist/component/column-set.d.ts +20 -0
  16. package/dist/component/column-set.d.ts.map +1 -0
  17. package/dist/component/column-set.js +60 -0
  18. package/dist/component/column-set.js.map +1 -0
  19. package/dist/component/define.d.ts +23 -0
  20. package/dist/component/define.d.ts.map +1 -0
  21. package/dist/component/define.js +155 -0
  22. package/dist/component/define.js.map +1 -0
  23. package/dist/component/descriptors.d.ts +3 -0
  24. package/dist/component/descriptors.d.ts.map +1 -0
  25. package/dist/component/descriptors.js +147 -0
  26. package/dist/component/descriptors.js.map +1 -0
  27. package/dist/component/index.d.ts +10 -0
  28. package/dist/component/index.d.ts.map +1 -0
  29. package/dist/component/index.js +6 -0
  30. package/dist/component/index.js.map +1 -0
  31. package/dist/component/sidecar.d.ts +58 -0
  32. package/dist/component/sidecar.d.ts.map +1 -0
  33. package/dist/component/sidecar.js +136 -0
  34. package/dist/component/sidecar.js.map +1 -0
  35. package/dist/config.d.ts +55 -0
  36. package/dist/config.d.ts.map +1 -0
  37. package/dist/config.js +70 -0
  38. package/dist/config.js.map +1 -0
  39. package/dist/entity/codec.d.ts +45 -0
  40. package/dist/entity/codec.d.ts.map +1 -0
  41. package/dist/entity/codec.js +53 -0
  42. package/dist/entity/codec.js.map +1 -0
  43. package/dist/entity/index-allocator.d.ts +46 -0
  44. package/dist/entity/index-allocator.d.ts.map +1 -0
  45. package/dist/entity/index-allocator.js +121 -0
  46. package/dist/entity/index-allocator.js.map +1 -0
  47. package/dist/entity/index.d.ts +13 -0
  48. package/dist/entity/index.d.ts.map +1 -0
  49. package/dist/entity/index.js +7 -0
  50. package/dist/entity/index.js.map +1 -0
  51. package/dist/entity/record.d.ts +28 -0
  52. package/dist/entity/record.d.ts.map +1 -0
  53. package/dist/entity/record.js +42 -0
  54. package/dist/entity/record.js.map +1 -0
  55. package/dist/entity/ref.d.ts +70 -0
  56. package/dist/entity/ref.d.ts.map +1 -0
  57. package/dist/entity/ref.js +104 -0
  58. package/dist/entity/ref.js.map +1 -0
  59. package/dist/entity/reservation.d.ts +12 -0
  60. package/dist/entity/reservation.d.ts.map +1 -0
  61. package/dist/entity/reservation.js +28 -0
  62. package/dist/entity/reservation.js.map +1 -0
  63. package/dist/entity/store.d.ts +60 -0
  64. package/dist/entity/store.d.ts.map +1 -0
  65. package/dist/entity/store.js +193 -0
  66. package/dist/entity/store.js.map +1 -0
  67. package/dist/env.d.ts +2 -0
  68. package/dist/env.d.ts.map +1 -0
  69. package/dist/env.js +12 -0
  70. package/dist/env.js.map +1 -0
  71. package/dist/ids.d.ts +9 -0
  72. package/dist/ids.d.ts.map +1 -0
  73. package/dist/ids.js +8 -0
  74. package/dist/ids.js.map +1 -0
  75. package/dist/index.d.ts +29 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +33 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/inspect-surface.d.ts +27 -0
  80. package/dist/inspect-surface.d.ts.map +1 -0
  81. package/dist/inspect-surface.js +14 -0
  82. package/dist/inspect-surface.js.map +1 -0
  83. package/dist/internal.d.ts +19 -0
  84. package/dist/internal.d.ts.map +1 -0
  85. package/dist/internal.js +19 -0
  86. package/dist/internal.js.map +1 -0
  87. package/dist/memory/allocU32.d.ts +25 -0
  88. package/dist/memory/allocU32.d.ts.map +1 -0
  89. package/dist/memory/allocU32.js +95 -0
  90. package/dist/memory/allocU32.js.map +1 -0
  91. package/dist/memory/buffers.d.ts +94 -0
  92. package/dist/memory/buffers.d.ts.map +1 -0
  93. package/dist/memory/buffers.js +308 -0
  94. package/dist/memory/buffers.js.map +1 -0
  95. package/dist/memory/index.d.ts +7 -0
  96. package/dist/memory/index.d.ts.map +1 -0
  97. package/dist/memory/index.js +4 -0
  98. package/dist/memory/index.js.map +1 -0
  99. package/dist/memory/layout.d.ts +37 -0
  100. package/dist/memory/layout.d.ts.map +1 -0
  101. package/dist/memory/layout.js +116 -0
  102. package/dist/memory/layout.js.map +1 -0
  103. package/dist/query/compile.d.ts +73 -0
  104. package/dist/query/compile.d.ts.map +1 -0
  105. package/dist/query/compile.js +158 -0
  106. package/dist/query/compile.js.map +1 -0
  107. package/dist/query/engine.d.ts +48 -0
  108. package/dist/query/engine.d.ts.map +1 -0
  109. package/dist/query/engine.js +230 -0
  110. package/dist/query/engine.js.map +1 -0
  111. package/dist/query/index.d.ts +8 -0
  112. package/dist/query/index.d.ts.map +1 -0
  113. package/dist/query/index.js +10 -0
  114. package/dist/query/index.js.map +1 -0
  115. package/dist/query/live-query.d.ts +122 -0
  116. package/dist/query/live-query.d.ts.map +1 -0
  117. package/dist/query/live-query.js +543 -0
  118. package/dist/query/live-query.js.map +1 -0
  119. package/dist/query/sparse-set.d.ts +18 -0
  120. package/dist/query/sparse-set.d.ts.map +1 -0
  121. package/dist/query/sparse-set.js +126 -0
  122. package/dist/query/sparse-set.js.map +1 -0
  123. package/dist/reactivity/change-version.d.ts +19 -0
  124. package/dist/reactivity/change-version.d.ts.map +1 -0
  125. package/dist/reactivity/change-version.js +76 -0
  126. package/dist/reactivity/change-version.js.map +1 -0
  127. package/dist/reactivity/index.d.ts +12 -0
  128. package/dist/reactivity/index.d.ts.map +1 -0
  129. package/dist/reactivity/index.js +12 -0
  130. package/dist/reactivity/index.js.map +1 -0
  131. package/dist/reactivity/log.d.ts +83 -0
  132. package/dist/reactivity/log.d.ts.map +1 -0
  133. package/dist/reactivity/log.js +260 -0
  134. package/dist/reactivity/log.js.map +1 -0
  135. package/dist/reactivity/observer-commands.d.ts +40 -0
  136. package/dist/reactivity/observer-commands.d.ts.map +1 -0
  137. package/dist/reactivity/observer-commands.js +111 -0
  138. package/dist/reactivity/observer-commands.js.map +1 -0
  139. package/dist/reactivity/observers.d.ts +50 -0
  140. package/dist/reactivity/observers.d.ts.map +1 -0
  141. package/dist/reactivity/observers.js +127 -0
  142. package/dist/reactivity/observers.js.map +1 -0
  143. package/dist/reactivity/reactivity.d.ts +141 -0
  144. package/dist/reactivity/reactivity.d.ts.map +1 -0
  145. package/dist/reactivity/reactivity.js +479 -0
  146. package/dist/reactivity/reactivity.js.map +1 -0
  147. package/dist/reactivity/structural-journal.d.ts +30 -0
  148. package/dist/reactivity/structural-journal.d.ts.map +1 -0
  149. package/dist/reactivity/structural-journal.js +77 -0
  150. package/dist/reactivity/structural-journal.js.map +1 -0
  151. package/dist/registry.d.ts +26 -0
  152. package/dist/registry.d.ts.map +1 -0
  153. package/dist/registry.js +58 -0
  154. package/dist/registry.js.map +1 -0
  155. package/dist/serialize-surface.d.ts +170 -0
  156. package/dist/serialize-surface.d.ts.map +1 -0
  157. package/dist/serialize-surface.js +6 -0
  158. package/dist/serialize-surface.js.map +1 -0
  159. package/dist/storage/archetype.d.ts +38 -0
  160. package/dist/storage/archetype.d.ts.map +1 -0
  161. package/dist/storage/archetype.js +47 -0
  162. package/dist/storage/archetype.js.map +1 -0
  163. package/dist/storage/cold-store.d.ts +41 -0
  164. package/dist/storage/cold-store.d.ts.map +1 -0
  165. package/dist/storage/cold-store.js +100 -0
  166. package/dist/storage/cold-store.js.map +1 -0
  167. package/dist/storage/index.d.ts +10 -0
  168. package/dist/storage/index.d.ts.map +1 -0
  169. package/dist/storage/index.js +5 -0
  170. package/dist/storage/index.js.map +1 -0
  171. package/dist/storage/signature.d.ts +27 -0
  172. package/dist/storage/signature.d.ts.map +1 -0
  173. package/dist/storage/signature.js +115 -0
  174. package/dist/storage/signature.js.map +1 -0
  175. package/dist/storage/storage.d.ts +72 -0
  176. package/dist/storage/storage.d.ts.map +1 -0
  177. package/dist/storage/storage.js +192 -0
  178. package/dist/storage/storage.js.map +1 -0
  179. package/dist/storage/store.d.ts +88 -0
  180. package/dist/storage/store.d.ts.map +1 -0
  181. package/dist/storage/store.js +473 -0
  182. package/dist/storage/store.js.map +1 -0
  183. package/dist/util/stable-index.d.ts +29 -0
  184. package/dist/util/stable-index.d.ts.map +1 -0
  185. package/dist/util/stable-index.js +51 -0
  186. package/dist/util/stable-index.js.map +1 -0
  187. package/dist/world.d.ts +262 -0
  188. package/dist/world.d.ts.map +1 -0
  189. package/dist/world.js +831 -0
  190. package/dist/world.js.map +1 -0
  191. package/package.json +52 -0
@@ -0,0 +1,155 @@
1
+ // defineComponent / defineTag runtime. Maps a schema to a resolved
2
+ // FieldDescriptor set + a per-field ColumnLayout set, defaults options (tag → sparse, else
3
+ // packed), and produces a frozen ComponentDef whose `id` is UNREGISTERED until a world interns it
4
+ // The accessor factory is wired lazily once `id` is known.
5
+ import { fieldToColumnLayout } from '../memory/index.js';
6
+ import { resolveDescriptor } from './descriptors.js';
7
+ import { makeAccessorFactory } from './accessor.js';
8
+ export const UNREGISTERED = -1;
9
+ const IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
10
+ function isPlainObject(v) {
11
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
12
+ }
13
+ function validateSchema(schema) {
14
+ if (!isPlainObject(schema))
15
+ throw new Error('defineComponent: schema must be a plain object');
16
+ const seen = new Set();
17
+ for (const name of Object.keys(schema)) {
18
+ if (!IDENT.test(name) || name.startsWith('__')) {
19
+ throw new Error(`defineComponent: invalid field name '${name}' (reserved __ prefix or non-identifier)`);
20
+ }
21
+ if (seen.has(name))
22
+ throw new Error(`defineComponent: duplicate field '${name}'`);
23
+ seen.add(name);
24
+ const token = schema[name];
25
+ validateToken(name, token);
26
+ }
27
+ }
28
+ function isFieldSpec(token) {
29
+ return typeof token === 'object' && token !== null && token.__fieldSpec === true;
30
+ }
31
+ function validateToken(name, token) {
32
+ // A FieldSpec wrapper carries a user default; validate its inner token.
33
+ if (isFieldSpec(token)) {
34
+ validateToken(name, token.token);
35
+ return;
36
+ }
37
+ if (typeof token === 'string')
38
+ return;
39
+ if (typeof token !== 'object' || token === null) {
40
+ throw new Error(`defineComponent: field '${name}' is not a valid field token`);
41
+ }
42
+ const kind = token.kind;
43
+ if (kind === 'vec') {
44
+ const t = token;
45
+ if (typeof t.elem !== 'string')
46
+ throw new Error(`defineComponent: vec field '${name}' needs a scalar elem`);
47
+ if (t.elem === 'bool' || t.elem === 'eid') {
48
+ throw new Error(`defineComponent: vec field '${name}' element must be numeric, not '${t.elem}'`);
49
+ }
50
+ if (!Number.isInteger(t.len) || t.len < 1) {
51
+ throw new Error(`defineComponent: vec field '${name}' len must be an integer >= 1`);
52
+ }
53
+ }
54
+ else if (kind === 'staticString') {
55
+ const choices = token.choices;
56
+ if (choices.length < 1)
57
+ throw new Error(`defineComponent: staticString field '${name}' needs >= 1 choice`);
58
+ if (new Set(choices).size !== choices.length) {
59
+ throw new Error(`defineComponent: staticString field '${name}' choices must be distinct`);
60
+ }
61
+ if (choices.length > 0xffffffff)
62
+ throw new Error(`defineComponent: staticString field '${name}' exceeds u32 index ceiling`);
63
+ }
64
+ else if (kind !== 'object') {
65
+ throw new Error(`defineComponent: field '${name}' has an unknown token kind`);
66
+ }
67
+ }
68
+ function validateOptions(options) {
69
+ if (options?.storage !== undefined && options.storage !== 'packed' && options.storage !== 'sparse') {
70
+ throw new Error(`defineComponent: storage must be 'packed' or 'sparse'`);
71
+ }
72
+ if (options?.maxHistory !== undefined && (!Number.isInteger(options.maxHistory) || options.maxHistory < 0)) {
73
+ throw new Error('defineComponent: maxHistory must be a non-negative integer');
74
+ }
75
+ }
76
+ // `B`/`N` capture the brand/name LITERALS so the returned def's `name` is the literal the query DSL
77
+ // lifts to a precise element key (CompKey). The runtime `name` is
78
+ // `brand ?? name`. A name (or brand) is REQUIRED: without it two anonymous defs would
79
+ // both key the element surface as `'Component'` and collide — so the options arg now mandates one and
80
+ // `defineComponent(schema)` is a compile error. defineTag and the relations runtime supply `brand`.
81
+ export function defineComponent(schema, options) {
82
+ validateSchema(schema);
83
+ validateOptions(options);
84
+ if (options?.brand === undefined && options?.name === undefined) {
85
+ throw new Error("defineComponent: a 'name' (or 'brand') option is required — it keys the element surface (e.entity.<name>) and prevents anonymous defs from colliding");
86
+ }
87
+ const fields = [];
88
+ for (const name of Object.keys(schema)) {
89
+ const raw = schema[name];
90
+ if (isFieldSpec(raw)) {
91
+ fields.push(resolveDescriptor(name, raw.token, raw.default));
92
+ }
93
+ else {
94
+ fields.push(resolveDescriptor(name, raw));
95
+ }
96
+ }
97
+ const isTag = fields.length === 0;
98
+ const resolvedOptions = {
99
+ storage: options?.storage ?? (isTag ? 'sparse' : 'packed'),
100
+ maxHistory: options?.maxHistory ?? 0,
101
+ };
102
+ const columnLayouts = [];
103
+ for (const f of fields) {
104
+ const layout = fieldToColumnLayout(f);
105
+ if (layout !== null)
106
+ columnLayouts.push(layout);
107
+ }
108
+ const restrictedToMainThread = fields.some((f) => !f.shareable);
109
+ const hasRichFields = fields.some((f) => f.rich !== undefined);
110
+ const def = {
111
+ schema,
112
+ fields: Object.freeze(fields),
113
+ name: (options.brand ?? options.name),
114
+ options: Object.freeze(resolvedOptions),
115
+ columnLayouts: Object.freeze(columnLayouts),
116
+ defKind: 'component',
117
+ restrictedToMainThread,
118
+ hasRichFields,
119
+ };
120
+ // `id` and `accessorFactory` are the only mutable fields — the registry's single commit point
121
+ // Everything else is read-only; the object stays non-extensible.
122
+ Object.defineProperty(def, 'id', { value: UNREGISTERED, enumerable: true, writable: true, configurable: true });
123
+ Object.defineProperty(def, 'accessorFactory', {
124
+ value: null,
125
+ enumerable: true,
126
+ writable: true,
127
+ configurable: true,
128
+ });
129
+ if (options?.brand !== undefined) {
130
+ Object.defineProperty(def, '__nominalBrand', { value: options.brand, enumerable: true, writable: false });
131
+ }
132
+ // The runtime def is built as ComponentRuntime<S> (name: string); the captured literal lives only
133
+ // in the declared return type, so re-narrow here. The runtime value is unchanged.
134
+ return Object.preventExtensions(def);
135
+ }
136
+ // A name is REQUIRED: it keys the tag's element/membership identity, so an anonymous tag
137
+ // can no longer collide with another on a default name.
138
+ export function defineTag(name) {
139
+ if (name === undefined || name === '') {
140
+ throw new Error("defineTag: a 'name' argument is required — it keys the tag's identity and prevents anonymous tags from colliding");
141
+ }
142
+ return defineComponent({}, { storage: 'sparse', brand: name });
143
+ }
144
+ // Assign a dense ComponentId and wire the accessor factory now that `id` is known. The def
145
+ // is frozen, so `id`/`accessorFactory` are mutated through defineProperty (the registry's single
146
+ // commit point — analogous to the entity-record commit).
147
+ export function registerComponentId(def, id) {
148
+ const rt = def;
149
+ if (rt.id !== UNREGISTERED) {
150
+ throw new Error(`component '${def.name}' is already registered to a world (id ${rt.id})`);
151
+ }
152
+ rt.id = id;
153
+ rt.accessorFactory = makeAccessorFactory(def);
154
+ }
155
+ //# sourceMappingURL=define.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define.js","sourceRoot":"","sources":["../../src/component/define.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FieldDescriptor, FieldToken } from '@ecsia/schema';
2
+ export declare function resolveDescriptor(name: string, token: FieldToken, userDefault?: unknown): FieldDescriptor;
3
+ //# sourceMappingURL=descriptors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptors.d.ts","sourceRoot":"","sources":["../../src/component/descriptors.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EAKX,MAAM,eAAe,CAAA;AAyDtB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,OAAO,GAAG,eAAe,CAsGzG"}
@@ -0,0 +1,147 @@
1
+ // Field-token → FieldDescriptor resolution: the value-level bodies for each token —
2
+ // ctor, bytesPerElem, stride, shareable, encode/decode, choices,
3
+ // default, needsExplicitInit. eid encode/decode forward to the normative memory-buffers helpers.
4
+ import { encodeEid, decodeEid, EID_NULL } from '../memory/index.js';
5
+ const SCALAR_ROWS = {
6
+ bool: { ctor: Uint8Array, bytes: 1, encode: (v) => (v ? 1 : 0), decode: (s) => s !== 0, default: false },
7
+ i8: { ctor: Int8Array, bytes: 1, encode: (v) => v | 0, decode: (s) => s, default: 0 },
8
+ u8: { ctor: Uint8Array, bytes: 1, encode: (v) => v & 0xff, decode: (s) => s, default: 0 },
9
+ u8c: { ctor: Uint8ClampedArray, bytes: 1, encode: (v) => v, decode: (s) => s, default: 0 },
10
+ i16: { ctor: Int16Array, bytes: 2, encode: (v) => v | 0, decode: (s) => s, default: 0 },
11
+ u16: { ctor: Uint16Array, bytes: 2, encode: (v) => v & 0xffff, decode: (s) => s, default: 0 },
12
+ i32: { ctor: Int32Array, bytes: 4, encode: (v) => v | 0, decode: (s) => s, default: 0 },
13
+ u32: { ctor: Uint32Array, bytes: 4, encode: (v) => v >>> 0, decode: (s) => s >>> 0, default: 0 },
14
+ f32: { ctor: Float32Array, bytes: 4, encode: (v) => +v, decode: (s) => s, default: 0 },
15
+ f64: { ctor: Float64Array, bytes: 8, encode: (v) => +v, decode: (s) => s, default: 0 },
16
+ eid: {
17
+ ctor: Int32Array,
18
+ bytes: 4,
19
+ encode: (v) => encodeEid(v),
20
+ decode: (s) => decodeEid(s),
21
+ default: EID_NULL,
22
+ },
23
+ };
24
+ function scalarRow(token) {
25
+ const row = SCALAR_ROWS[token];
26
+ if (row === undefined)
27
+ throw new Error(`unknown scalar token: ${String(token)}`);
28
+ return row;
29
+ }
30
+ function stringIndexCtor(n) {
31
+ if (n <= 256)
32
+ return Uint8Array;
33
+ if (n <= 65_536)
34
+ return Uint16Array;
35
+ return Uint32Array;
36
+ }
37
+ function isVecToken(t) {
38
+ return typeof t === 'object' && t.kind === 'vec';
39
+ }
40
+ function isStaticStringToken(t) {
41
+ return typeof t === 'object' && t.kind === 'staticString';
42
+ }
43
+ function isObjectToken(t) {
44
+ return typeof t === 'object' && t.kind === 'object';
45
+ }
46
+ function isZeroEquivalentDefault(d) {
47
+ return d === 0 || d === false;
48
+ }
49
+ export function resolveDescriptor(name, token, userDefault) {
50
+ // The free-form 'string' rich token MUST be matched before the scalar dispatch below (it is a
51
+ // `typeof === 'string'` value that scalarRow would reject as an unknown scalar token).
52
+ // Sidecar-backed: no column (ctor null), not shareable, identity encode/decode never invoked.
53
+ if (token === 'string') {
54
+ return {
55
+ name,
56
+ token,
57
+ ctor: null,
58
+ bytesPerElem: 0,
59
+ stride: 0,
60
+ shareable: false,
61
+ rich: 'string',
62
+ encode: (v) => v,
63
+ decode: (s) => s,
64
+ default: userDefault ?? '',
65
+ needsExplicitInit: false,
66
+ };
67
+ }
68
+ if (typeof token === 'string') {
69
+ const row = scalarRow(token);
70
+ const def = userDefault ?? row.default;
71
+ // eid is always non-zero-equivalent (its null is -1); other scalars only when user-overridden.
72
+ const needsExplicitInit = token === 'eid' ? true : userDefault !== undefined && !isZeroEquivalentDefault(def);
73
+ return {
74
+ name,
75
+ token,
76
+ ctor: row.ctor,
77
+ bytesPerElem: row.bytes,
78
+ stride: 1,
79
+ shareable: true,
80
+ encode: row.encode,
81
+ decode: row.decode,
82
+ default: def,
83
+ needsExplicitInit,
84
+ };
85
+ }
86
+ if (isVecToken(token)) {
87
+ const row = scalarRow(token.elem);
88
+ const def = userDefault ?? Array(token.len).fill(row.default);
89
+ const needsExplicitInit = userDefault !== undefined && def.some((axis) => !isZeroEquivalentDefault(axis));
90
+ return {
91
+ name,
92
+ token,
93
+ ctor: row.ctor,
94
+ bytesPerElem: row.bytes,
95
+ stride: token.len,
96
+ shareable: true,
97
+ encode: row.encode,
98
+ decode: row.decode,
99
+ default: def,
100
+ needsExplicitInit,
101
+ };
102
+ }
103
+ if (isStaticStringToken(token)) {
104
+ const choices = token.choices;
105
+ const ctor = stringIndexCtor(choices.length);
106
+ const idxOf = new Map();
107
+ choices.forEach((c, i) => idxOf.set(c, i));
108
+ const defaultIndex = userDefault !== undefined ? (idxOf.get(userDefault) ?? 0) : 0;
109
+ return {
110
+ name,
111
+ token,
112
+ ctor,
113
+ bytesPerElem: ctor.BYTES_PER_ELEMENT,
114
+ stride: 1,
115
+ shareable: true,
116
+ encode: (v) => {
117
+ const idx = idxOf.get(v);
118
+ if (idx === undefined)
119
+ throw new Error(`staticString value '${String(v)}' not in choices for field '${name}'`);
120
+ return idx;
121
+ },
122
+ decode: (slot) => choices[slot],
123
+ choices,
124
+ default: defaultIndex,
125
+ // The stored slot 0 is choices[0]; only non-zero indices need an explicit fill.
126
+ needsExplicitInit: defaultIndex !== 0,
127
+ };
128
+ }
129
+ // object token: no column, not shareable.
130
+ if (isObjectToken(token)) {
131
+ return {
132
+ name,
133
+ token,
134
+ ctor: null,
135
+ bytesPerElem: 0,
136
+ stride: 0,
137
+ shareable: false,
138
+ rich: 'object',
139
+ encode: (v) => v,
140
+ decode: (s) => s,
141
+ default: userDefault,
142
+ needsExplicitInit: false,
143
+ };
144
+ }
145
+ throw new Error(`unknown field token for field '${name}'`);
146
+ }
147
+ //# sourceMappingURL=descriptors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptors.js","sourceRoot":"","sources":["../../src/component/descriptors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { defineComponent, defineTag, registerComponentId, UNREGISTERED } from './define.js';
2
+ export type { ComponentRuntime, DefKind } from './define.js';
3
+ export { resolveDescriptor } from './descriptors.js';
4
+ export { makeAccessorFactory, bindingsFor } from './accessor.js';
5
+ export type { AccessorWorld, AccessorBinding, AccessorInstanceBase } from './accessor.js';
6
+ export { buildColumnSet, bindAccessorRow } from './column-set.js';
7
+ export type { ColumnSet, BuildColumnSetParams } from './column-set.js';
8
+ export { SidecarStore, sidecarKey } from './sidecar.js';
9
+ export type { SidecarKey, RichKind } from './sidecar.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/component/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC3F,YAAY,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAE5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAChE,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEzF,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjE,YAAY,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACvD,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { defineComponent, defineTag, registerComponentId, UNREGISTERED } from './define.js';
2
+ export { resolveDescriptor } from './descriptors.js';
3
+ export { makeAccessorFactory, bindingsFor } from './accessor.js';
4
+ export { buildColumnSet, bindAccessorRow } from './column-set.js';
5
+ export { SidecarStore, sidecarKey } from './sidecar.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/component/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG3F,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAEpD,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAGhE,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGjE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,58 @@
1
+ export type SidecarKey = number & {
2
+ readonly __sidecarKey: unique symbol;
3
+ };
4
+ export declare const sidecarKey: (componentId: number, fieldIndex: number) => SidecarKey;
5
+ export type RichKind = 'string' | 'object';
6
+ interface SidecarColumn {
7
+ /** Dense JS array indexed by entity index (handleIndex), NOT archetype row. */
8
+ data: unknown[];
9
+ /** Generation stamp per entity index (RF-HYGIENE). Parallel to `data`, grows on demand. */
10
+ gen: Uint32Array;
11
+ /** Whether `gen[index]` was ever stamped — distinguishes "written gen 0" from "never written". */
12
+ written: Uint8Array;
13
+ readonly def: unknown;
14
+ readonly kind: RichKind;
15
+ }
16
+ export declare class SidecarStore {
17
+ #private;
18
+ /** Allocate a column for a (componentId, fieldIndex) rich field (idempotent). */
19
+ ensureColumn(key: SidecarKey, kind: RichKind, def: unknown): void;
20
+ hasColumn(key: SidecarKey): boolean;
21
+ /** Read entity `index`'s value for `key`, applying the lazy default + generation guard (RF-HYGIENE). */
22
+ read(key: SidecarKey, index: number, gen: number): unknown;
23
+ /**
24
+ * Whether entity `index` has a WRITTEN value at `key` for its current generation (vs the lazy default).
25
+ * The serializer uses this to emit only present rich values (empty slots
26
+ * are skipped and re-defaulted on the receiver). A recycled index reads as not-present (RF-HYGIENE).
27
+ */
28
+ isPresent(key: SidecarKey, index: number, gen: number): boolean;
29
+ /** Write entity `index`'s value, stamping the current generation. */
30
+ write(key: SidecarKey, index: number, gen: number, value: unknown): void;
31
+ /**
32
+ * Observer-window read: during an onRemove/preDespawn drain the dying entity's
33
+ * generation has already been bumped, so a normal generation-guarded read would return the default.
34
+ * If a pending-clear entry exists for `index`, return its stashed value regardless of generation; else
35
+ * fall back to the generation-guarded read.
36
+ */
37
+ readForObserver(key: SidecarKey, index: number, gen: number): unknown;
38
+ /**
39
+ * Despawn handler. When no rich-carrying held component has a
40
+ * remove-observer, clear data[index] eagerly so the JS reference is released for GC. When one does,
41
+ * DEFER: stash the dying values so an onRemove handler can read them during the drain (RF-REMOVE-READ),
42
+ * then flush at the post-observer point (flushPending).
43
+ *
44
+ * `richKeysOnEntity` are the sidecar keys the entity actually held (its signature's rich fields); only
45
+ * those are stashed/cleared. `defer` is true iff any held component has a remove-observer.
46
+ */
47
+ onDespawn(index: number, richKeysOnEntity: readonly SidecarKey[], defer: boolean): void;
48
+ /**
49
+ * Flush the deferred-clear window. Called at the post-observerDrain serial slot,
50
+ * mirroring where storage's deferred row reclaim is finalized — after onRemove handlers have read the
51
+ * dying values, before the index is re-minted for a new tenant.
52
+ */
53
+ flushPending(): void;
54
+ hasPending(): boolean;
55
+ columns(): IterableIterator<[SidecarKey, SidecarColumn]>;
56
+ }
57
+ export {};
58
+ //# sourceMappingURL=sidecar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.d.ts","sourceRoot":"","sources":["../../src/component/sidecar.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG;IAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,MAAM,CAAA;CAAE,CAAA;AAE1E,eAAO,MAAM,UAAU,GAAI,aAAa,MAAM,EAAE,YAAY,MAAM,KAAG,UACM,CAAA;AAE3E,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAE1C,UAAU,aAAa;IACrB,+EAA+E;IAC/E,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,2FAA2F;IAC3F,GAAG,EAAE,WAAW,CAAA;IAChB,kGAAkG;IAClG,OAAO,EAAE,UAAU,CAAA;IACnB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CACxB;AASD,qBAAa,YAAY;;IAKvB,iFAAiF;IACjF,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI;IAKjE,SAAS,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO;IAgBnC,wGAAwG;IACxG,IAAI,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAU1D;;;;OAIG;IACH,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAM/D,qEAAqE;IACrE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAUxE;;;;;OAKG;IACH,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAMrE;;;;;;;;OAQG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,SAAS,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAwBvF;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAIpB,UAAU,IAAI,OAAO;IAIrB,OAAO,IAAI,gBAAgB,CAAC,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;CAGzD"}
@@ -0,0 +1,136 @@
1
+ // The entity-index-keyed dense sidecar store for rich fields. One dense JS value
2
+ // array + a parallel generation-stamp array per (componentId, fieldIndex), keyed by HANDLE INDEX (NOT
3
+ // archetype row). This is the storage for 'string' and object<T> fields.
4
+ //
5
+ // Why entity-index-keyed (NOT per-archetype columns): a rich value lives at data[entityIndex], and the
6
+ // entity index is invariant across archetype migrations — so RF-MIGRATE (zero migration carry) is
7
+ // structural, the same way changeVersion follows an entity across relocations. The generation stamp
8
+ // closes RF-HYGIENE: a recycled index never leaks the prior tenant's value (a stale slot reads the
9
+ // field default). Main-thread-only by construction (rich components are restrictedToMainThread).
10
+ const FIELD_BITS = 8; // up to 256 fields per component; schema arity is far below.
11
+ export const sidecarKey = (componentId, fieldIndex) => (((componentId << FIELD_BITS) | (fieldIndex & 0xff)) >>> 0);
12
+ export class SidecarStore {
13
+ #cols = new Map();
14
+ /** index → its pending-clear entry while a remove-observer window is open (RF-REMOVE-READ). */
15
+ #pending = new Map();
16
+ /** Allocate a column for a (componentId, fieldIndex) rich field (idempotent). */
17
+ ensureColumn(key, kind, def) {
18
+ if (this.#cols.has(key))
19
+ return;
20
+ this.#cols.set(key, { data: [], gen: new Uint32Array(0), written: new Uint8Array(0), def, kind });
21
+ }
22
+ hasColumn(key) {
23
+ return this.#cols.has(key);
24
+ }
25
+ #grow(col, index) {
26
+ if (index < col.gen.length)
27
+ return;
28
+ let next = col.gen.length === 0 ? 16 : col.gen.length;
29
+ while (next <= index)
30
+ next *= 2;
31
+ const g = new Uint32Array(next);
32
+ g.set(col.gen);
33
+ col.gen = g;
34
+ const w = new Uint8Array(next);
35
+ w.set(col.written);
36
+ col.written = w;
37
+ }
38
+ /** Read entity `index`'s value for `key`, applying the lazy default + generation guard (RF-HYGIENE). */
39
+ read(key, index, gen) {
40
+ const col = this.#cols.get(key);
41
+ if (col === undefined)
42
+ return undefined;
43
+ if (index < col.written.length && col.written[index] === 1 && col.gen[index] === gen) {
44
+ const v = col.data[index];
45
+ return v === undefined ? col.def : v;
46
+ }
47
+ return col.def;
48
+ }
49
+ /**
50
+ * Whether entity `index` has a WRITTEN value at `key` for its current generation (vs the lazy default).
51
+ * The serializer uses this to emit only present rich values (empty slots
52
+ * are skipped and re-defaulted on the receiver). A recycled index reads as not-present (RF-HYGIENE).
53
+ */
54
+ isPresent(key, index, gen) {
55
+ const col = this.#cols.get(key);
56
+ if (col === undefined)
57
+ return false;
58
+ return index < col.written.length && col.written[index] === 1 && col.gen[index] === gen;
59
+ }
60
+ /** Write entity `index`'s value, stamping the current generation. */
61
+ write(key, index, gen, value) {
62
+ const col = this.#cols.get(key);
63
+ if (col === undefined)
64
+ return;
65
+ this.#grow(col, index);
66
+ if (index >= col.data.length)
67
+ col.data.length = index + 1;
68
+ col.data[index] = value;
69
+ col.gen[index] = gen >>> 0;
70
+ col.written[index] = 1;
71
+ }
72
+ /**
73
+ * Observer-window read: during an onRemove/preDespawn drain the dying entity's
74
+ * generation has already been bumped, so a normal generation-guarded read would return the default.
75
+ * If a pending-clear entry exists for `index`, return its stashed value regardless of generation; else
76
+ * fall back to the generation-guarded read.
77
+ */
78
+ readForObserver(key, index, gen) {
79
+ const pend = this.#pending.get(index);
80
+ if (pend !== undefined && pend.values.has(key))
81
+ return pend.values.get(key);
82
+ return this.read(key, index, gen);
83
+ }
84
+ /**
85
+ * Despawn handler. When no rich-carrying held component has a
86
+ * remove-observer, clear data[index] eagerly so the JS reference is released for GC. When one does,
87
+ * DEFER: stash the dying values so an onRemove handler can read them during the drain (RF-REMOVE-READ),
88
+ * then flush at the post-observer point (flushPending).
89
+ *
90
+ * `richKeysOnEntity` are the sidecar keys the entity actually held (its signature's rich fields); only
91
+ * those are stashed/cleared. `defer` is true iff any held component has a remove-observer.
92
+ */
93
+ onDespawn(index, richKeysOnEntity, defer) {
94
+ if (richKeysOnEntity.length === 0)
95
+ return;
96
+ if (defer) {
97
+ const values = new Map();
98
+ for (const key of richKeysOnEntity) {
99
+ const col = this.#cols.get(key);
100
+ if (col === undefined)
101
+ continue;
102
+ const v = index < col.written.length && col.written[index] === 1 ? col.data[index] : col.def;
103
+ values.set(key, v === undefined ? col.def : v);
104
+ }
105
+ this.#pending.set(index, { index, values });
106
+ }
107
+ // Whether deferred or not, the live slot is invalidated now: a recycled index must not read this
108
+ // tenant's value. The generation guard already protects correctness; clearing releases the GC ref.
109
+ for (const key of richKeysOnEntity)
110
+ this.#clearSlot(key, index);
111
+ }
112
+ #clearSlot(key, index) {
113
+ const col = this.#cols.get(key);
114
+ if (col === undefined)
115
+ return;
116
+ if (index < col.data.length)
117
+ col.data[index] = undefined;
118
+ if (index < col.written.length)
119
+ col.written[index] = 0;
120
+ }
121
+ /**
122
+ * Flush the deferred-clear window. Called at the post-observerDrain serial slot,
123
+ * mirroring where storage's deferred row reclaim is finalized — after onRemove handlers have read the
124
+ * dying values, before the index is re-minted for a new tenant.
125
+ */
126
+ flushPending() {
127
+ this.#pending.clear();
128
+ }
129
+ hasPending() {
130
+ return this.#pending.size > 0;
131
+ }
132
+ columns() {
133
+ return this.#cols.entries();
134
+ }
135
+ }
136
+ //# sourceMappingURL=sidecar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sidecar.js","sourceRoot":"","sources":["../../src/component/sidecar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ export type ObserverCadence = 'frame-end' | 'per-system';
2
+ export type ChangeTracking = 'component' | 'field';
3
+ export type WorkerOption = number | 'no-sab';
4
+ export interface ReactivityOptions {
5
+ maxWritesPerFrame?: number;
6
+ maxShapeChangesPerFrame?: number;
7
+ observerCadence?: ObserverCadence;
8
+ changeTrackingDefault?: ChangeTracking;
9
+ logEntryWords?: 1 | 2;
10
+ shrinkRings?: boolean;
11
+ }
12
+ export interface SchedulerOptions {
13
+ workers?: WorkerOption;
14
+ }
15
+ export interface WorldOptions {
16
+ components?: readonly unknown[];
17
+ relations?: readonly unknown[];
18
+ systems?: readonly unknown[];
19
+ maxEntities?: number;
20
+ generationBits?: number;
21
+ threaded?: boolean;
22
+ maxHotArchetypes?: number;
23
+ reactivity?: ReactivityOptions;
24
+ scheduler?: SchedulerOptions;
25
+ }
26
+ export interface ResolvedReactivityOptions {
27
+ readonly maxWritesPerFrame: number;
28
+ readonly maxShapeChangesPerFrame: number;
29
+ readonly observerCadence: ObserverCadence;
30
+ readonly changeTrackingDefault: ChangeTracking;
31
+ readonly logEntryWords: 1 | 2;
32
+ readonly shrinkRings: boolean;
33
+ }
34
+ export interface ResolvedWorldOptions {
35
+ readonly components: readonly unknown[];
36
+ readonly relations: readonly unknown[];
37
+ readonly systems: readonly unknown[];
38
+ readonly maxEntities: number;
39
+ readonly generationBits: number;
40
+ /** Derived: 32 - generationBits. */
41
+ readonly indexBits: number;
42
+ readonly threaded: boolean;
43
+ readonly maxHotArchetypes: number;
44
+ readonly reactivity: ResolvedReactivityOptions;
45
+ readonly scheduler: {
46
+ readonly workers: WorkerOption;
47
+ };
48
+ }
49
+ /** Thrown synchronously at construction for any invalid configuration. */
50
+ export declare class ConfigError extends Error {
51
+ readonly name = "ConfigError";
52
+ constructor(message: string);
53
+ }
54
+ export declare function resolveOptions(options?: WorldOptions): ResolvedWorldOptions;
55
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,YAAY,CAAA;AACxD,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,OAAO,CAAA;AAClD,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAA;AAE5C,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,eAAe,CAAC,EAAE,eAAe,CAAA;IACjC,qBAAqB,CAAC,EAAE,cAAc,CAAA;IACtC,aAAa,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;IACrB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,YAAY,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAE3B,UAAU,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;IAC/B,SAAS,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;IAG5B,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAA;IAGvB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAGlB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAGzB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,SAAS,CAAC,EAAE,gBAAgB,CAAA;CAC7B;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,CAAA;IACxC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAA;IACzC,QAAQ,CAAC,qBAAqB,EAAE,cAAc,CAAA;IAC9C,QAAQ,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAA;IAC7B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAA;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,UAAU,EAAE,SAAS,OAAO,EAAE,CAAA;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,OAAO,EAAE,CAAA;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAA;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAA;IAC/B,oCAAoC;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;IAC1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAA;IACjC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAA;IAC9C,QAAQ,CAAC,SAAS,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;KAAE,CAAA;CACvD;AAED,0EAA0E;AAC1E,qBAAa,WAAY,SAAQ,KAAK;IACpC,SAAkB,IAAI,iBAAgB;gBAC1B,OAAO,EAAE,MAAM;CAG5B;AAID,wBAAgB,cAAc,CAAC,OAAO,GAAE,YAAiB,GAAG,oBAAoB,CAoE/E"}