@xenolithengine/graph-plugin-runtime 0.7.0-beta.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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +60 -0
  3. package/dist/editor/output-widget.d.ts +3 -0
  4. package/dist/editor/output-widget.d.ts.map +1 -0
  5. package/dist/editor/output-widget.js +43 -0
  6. package/dist/editor/output-widget.js.map +1 -0
  7. package/dist/editor/plugin.d.ts +3 -0
  8. package/dist/editor/plugin.d.ts.map +1 -0
  9. package/dist/editor/plugin.js +115 -0
  10. package/dist/editor/plugin.js.map +1 -0
  11. package/dist/editor/runtime-bridge.d.ts +6 -0
  12. package/dist/editor/runtime-bridge.d.ts.map +1 -0
  13. package/dist/editor/runtime-bridge.js +24 -0
  14. package/dist/editor/runtime-bridge.js.map +1 -0
  15. package/dist/editor/schema-sync.d.ts +28 -0
  16. package/dist/editor/schema-sync.d.ts.map +1 -0
  17. package/dist/editor/schema-sync.js +70 -0
  18. package/dist/editor/schema-sync.js.map +1 -0
  19. package/dist/editor/schemas.d.ts +28 -0
  20. package/dist/editor/schemas.d.ts.map +1 -0
  21. package/dist/editor/schemas.js +205 -0
  22. package/dist/editor/schemas.js.map +1 -0
  23. package/dist/editor/struct-widget.d.ts +37 -0
  24. package/dist/editor/struct-widget.d.ts.map +1 -0
  25. package/dist/editor/struct-widget.js +242 -0
  26. package/dist/editor/struct-widget.js.map +1 -0
  27. package/dist/index.d.ts +16 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +13 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/model/allocate-graph.d.ts +57 -0
  32. package/dist/model/allocate-graph.d.ts.map +1 -0
  33. package/dist/model/allocate-graph.js +209 -0
  34. package/dist/model/allocate-graph.js.map +1 -0
  35. package/dist/model/allocate.d.ts +3 -0
  36. package/dist/model/allocate.d.ts.map +1 -0
  37. package/dist/model/allocate.js +47 -0
  38. package/dist/model/allocate.js.map +1 -0
  39. package/dist/model/mandelbrot-graph.d.ts +8 -0
  40. package/dist/model/mandelbrot-graph.d.ts.map +1 -0
  41. package/dist/model/mandelbrot-graph.js +146 -0
  42. package/dist/model/mandelbrot-graph.js.map +1 -0
  43. package/dist/model/spawn-graph.d.ts +31 -0
  44. package/dist/model/spawn-graph.d.ts.map +1 -0
  45. package/dist/model/spawn-graph.js +117 -0
  46. package/dist/model/spawn-graph.js.map +1 -0
  47. package/dist/vm/codegen.d.ts +12 -0
  48. package/dist/vm/codegen.d.ts.map +1 -0
  49. package/dist/vm/codegen.js +303 -0
  50. package/dist/vm/codegen.js.map +1 -0
  51. package/dist/vm/collection.d.ts +8 -0
  52. package/dist/vm/collection.d.ts.map +1 -0
  53. package/dist/vm/collection.js +129 -0
  54. package/dist/vm/collection.js.map +1 -0
  55. package/dist/vm/compiler.bench.d.ts +2 -0
  56. package/dist/vm/compiler.bench.d.ts.map +1 -0
  57. package/dist/vm/compiler.bench.js +35 -0
  58. package/dist/vm/compiler.bench.js.map +1 -0
  59. package/dist/vm/compiler.d.ts +14 -0
  60. package/dist/vm/compiler.d.ts.map +1 -0
  61. package/dist/vm/compiler.js +190 -0
  62. package/dist/vm/compiler.js.map +1 -0
  63. package/dist/vm/interpreter.d.ts +87 -0
  64. package/dist/vm/interpreter.d.ts.map +1 -0
  65. package/dist/vm/interpreter.js +155 -0
  66. package/dist/vm/interpreter.js.map +1 -0
  67. package/dist/vm/primitives.d.ts +4 -0
  68. package/dist/vm/primitives.d.ts.map +1 -0
  69. package/dist/vm/primitives.js +436 -0
  70. package/dist/vm/primitives.js.map +1 -0
  71. package/dist/vm/value.d.ts +7 -0
  72. package/dist/vm/value.d.ts.map +1 -0
  73. package/dist/vm/value.js +28 -0
  74. package/dist/vm/value.js.map +1 -0
  75. package/dist/vm/wasm-codegen.bench.d.ts +2 -0
  76. package/dist/vm/wasm-codegen.bench.d.ts.map +1 -0
  77. package/dist/vm/wasm-codegen.bench.js +81 -0
  78. package/dist/vm/wasm-codegen.bench.js.map +1 -0
  79. package/dist/vm/wasm-codegen.d.ts +12 -0
  80. package/dist/vm/wasm-codegen.d.ts.map +1 -0
  81. package/dist/vm/wasm-codegen.js +352 -0
  82. package/dist/vm/wasm-codegen.js.map +1 -0
  83. package/package.json +57 -0
@@ -0,0 +1,57 @@
1
+ import type { RtGraph, RtNode, RtEdge } from '../vm/interpreter.js';
2
+ /** Build an inline allocate sub-graph keyed by `prefix` (so VM variable names don't collide across
3
+ * multiple instances in the same tick). Inputs come from `srcs` (typically external `Const` /
4
+ * upstream node refs). Returns the assembled nodes + edges plus the OUT-pin handles the caller
5
+ * wires to its consumers. */
6
+ export declare function buildAllocateSubgraph(prefix: string, srcs: {
7
+ /** Source for the priorities array. */
8
+ priorities: {
9
+ node: string;
10
+ pin: string;
11
+ };
12
+ /** Source for the subs array-of-arrays. */
13
+ subs: {
14
+ node: string;
15
+ pin: string;
16
+ };
17
+ /** Source for the arrivals array (current tick's incoming units). */
18
+ arrivals: {
19
+ node: string;
20
+ pin: string;
21
+ };
22
+ /** Source for the costs object (`{type: cost}`). */
23
+ costs: {
24
+ node: string;
25
+ pin: string;
26
+ };
27
+ /** Exec input — fires the allocate body once. */
28
+ exec: {
29
+ node: string;
30
+ pin: string;
31
+ };
32
+ }): {
33
+ nodes: RtNode[];
34
+ edges: RtEdge[];
35
+ out: {
36
+ priorities: {
37
+ node: string;
38
+ pin: string;
39
+ };
40
+ awards: {
41
+ node: string;
42
+ pin: string;
43
+ };
44
+ leftovers: {
45
+ node: string;
46
+ pin: string;
47
+ };
48
+ exec: {
49
+ node: string;
50
+ pin: string;
51
+ };
52
+ };
53
+ };
54
+ /** Standalone graph wrapper for unit-testing: takes literal inputs (as Const), wires them into the
55
+ * allocate sub-graph, drains outputs into `priorities` / `awards` / `leftovers` VM vars. */
56
+ export declare function allocateEquivalenceGraph(priorities: number[], subs: string[][], arrivals: string[], costs: Record<string, number>): RtGraph;
57
+ //# sourceMappingURL=allocate-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocate-graph.d.ts","sourceRoot":"","sources":["../../src/model/allocate-graph.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAW1E;;;8BAG8B;AAC9B,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IACJ,uCAAuC;IACvC,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,2CAA2C;IAC3C,IAAI,EAAQ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,qEAAqE;IACrE,QAAQ,EAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,oDAAoD;IACpD,KAAK,EAAO;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;IACzC,iDAAiD;IACjD,IAAI,EAAQ;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAC1C,GACA;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE;QACH,UAAU,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,MAAM,EAAM;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,SAAS,EAAG;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;QACzC,IAAI,EAAQ;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAC1C,CAAA;CACF,CAoKA;AAED;6FAC6F;AAC7F,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAAE,EACpB,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,QAAQ,EAAE,MAAM,EAAE,EAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,OAAO,CAgCT"}
@@ -0,0 +1,209 @@
1
+ // Allocate expressed as a sub-graph of primitives — the data-flow equivalent of the native
2
+ // `Allocate` impure node (see `allocate.ts`). Same pin contract: 4 IN (priorities, subs, arrivals,
3
+ // costs) + 3 OUT (priorities, awards, leftovers) + exec in/out. Same observable behaviour, proven
4
+ // by an equivalence unit test on the same inputs.
5
+ //
6
+ // Loop body for each arriving unit:
7
+ // subscribers = FilterIndices(subs, unit)
8
+ // if subscribers.empty → append unit to leftovers
9
+ // else:
10
+ // bestSubIdx = ArgMax(IndexAll(priorities, subscribers))
11
+ // bestAgent = Index(subscribers, bestSubIdx)
12
+ // cost = ObjectGet(costs, unit)
13
+ // priorities = ArrayWrite(priorities, bestAgent, priorities[bestAgent] - cost)
14
+ // awards = Append(awards, { type: unit, to: bestAgent }) // matches native shape
15
+ //
16
+ // Imperative loop state (priorities/awards/leftovers across ForEach iterations) lives in VM vars
17
+ // scoped by node-id prefix so two allocate-template instances don't trample each other.
18
+ // Pin builders (RtPin-flavoured; the editor-side TemplateDefinition uses richer xenolith.v1 pins).
19
+ const ein = (id) => ({ id, kind: 'exec', direction: 'in' });
20
+ const eout = (id) => ({ id, kind: 'exec', direction: 'out' });
21
+ const din = (id) => ({ id, kind: 'data', direction: 'in' });
22
+ const dout = (id) => ({ id, kind: 'data', direction: 'out' });
23
+ const nd = (id, type, pins, state) => ({ id, type, pins, ...(state ? { state } : {}) });
24
+ const e = (fn, fp, tn, tp) => ({ from: { node: fn, pin: fp }, to: { node: tn, pin: tp } });
25
+ /** Build an inline allocate sub-graph keyed by `prefix` (so VM variable names don't collide across
26
+ * multiple instances in the same tick). Inputs come from `srcs` (typically external `Const` /
27
+ * upstream node refs). Returns the assembled nodes + edges plus the OUT-pin handles the caller
28
+ * wires to its consumers. */
29
+ export function buildAllocateSubgraph(prefix, srcs) {
30
+ // Variables used during the inner loop: prefixed so instances don't collide.
31
+ const vP = `${prefix}:p`; // current priorities array
32
+ const vAw = `${prefix}:awards`; // current awards array
33
+ const vLo = `${prefix}:leftovers`; // current leftovers array
34
+ const vUnit = `${prefix}:unit`; // current ForEach element (debugging convenience)
35
+ const n = (suffix, type, pins, state) => nd(`${prefix}:${suffix}`, type, pins, state);
36
+ const pid = (suffix) => `${prefix}:${suffix}`;
37
+ // ---- INIT (Sequence) -------------------------------------------------------------------------
38
+ // On exec: seed loop vars from inputs (priorities ← input array; awards/leftovers ← []), then
39
+ // ForEach over arrivals.
40
+ const seq = n('seq', 'Sequence', [ein('in'), eout('initP'), eout('initAw'), eout('initLo'), eout('loop'), eout('after')]);
41
+ // Seed priorities = input.priorities
42
+ const setInitP = n('setInitP', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vP });
43
+ // Seed awards = []
44
+ const emptyAw = n('emptyAw', 'Const', [dout('out')], { value: [] });
45
+ const setInitAw = n('setInitAw', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vAw });
46
+ // Seed leftovers = []
47
+ const emptyLo = n('emptyLo', 'Const', [dout('out')], { value: [] });
48
+ const setInitLo = n('setInitLo', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vLo });
49
+ // ---- LOOP (ForEach over arrivals) -----------------------------------------------------------
50
+ const fe = n('fe', 'ForEach', [ein('in'), din('array'), dout('element'), dout('index'), eout('body'), eout('done')]);
51
+ // body: subscribers = FilterIndices(subs, unit)
52
+ const filt = n('filt', 'FilterIndices', [din('arr'), din('item'), dout('out')]);
53
+ // body: subscribers.length
54
+ const subsLen = n('subsLen', 'Length', [din('arr'), dout('out')]);
55
+ // body: branch on length > 0
56
+ const zero = n('zero', 'Const', [dout('out')], { value: 0 });
57
+ // We don't have `>` — use Sub(len, zero) → Branch on non-zero?? Branch wants bool. Use
58
+ // a trick: compare via Sub+asBool (any non-zero number → truthy). Sub.out is scalar; Branch
59
+ // coerces to bool via asBool(0) === false, asBool(n!==0) === true. Works.
60
+ const lenCmp = n('lenCmp', 'Sub', [din('a'), din('b'), dout('out')]); // len - 0 = len
61
+ const br = n('br', 'Branch', [ein('in'), din('cond'), eout('true'), eout('false')]);
62
+ // --- branch.false (no subscriber) → leftovers = Append(leftovers, unit) ---
63
+ const getLo = n('getLo', 'GetVar', [dout('value')], { name: vLo });
64
+ const appLo = n('appLo', 'Append', [din('arr'), din('item'), dout('out')]);
65
+ const setLo = n('setLo', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vLo });
66
+ // --- branch.true (has subscriber) → allocate ---
67
+ // bestSubIdx = ArgMax(IndexAll(priorities, subscribers))
68
+ const getP1 = n('getP1', 'GetVar', [dout('value')], { name: vP });
69
+ const idxAll = n('idxAll', 'IndexAll', [din('arr'), din('idxs'), dout('out')]);
70
+ const argMax = n('argMax', 'ArgMax', [din('arr'), dout('out')]);
71
+ // bestAgent = Index(subscribers, bestSubIdx)
72
+ const bestAgent = n('bestAgent', 'Index', [din('arr'), din('i'), dout('out')]);
73
+ // cost = ObjectGet(costs, unit)
74
+ const cost = n('cost', 'ObjectGet', [din('o'), din('k'), dout('out')]);
75
+ // priorities[bestAgent]
76
+ const getP2 = n('getP2', 'GetVar', [dout('value')], { name: vP });
77
+ const oldP = n('oldP', 'Index', [din('arr'), din('i'), dout('out')]);
78
+ // newP = oldP - cost
79
+ const newP = n('newP', 'Sub', [din('a'), din('b'), dout('out')]);
80
+ // priorities = ArrayWrite(priorities, bestAgent, newP)
81
+ const getP3 = n('getP3', 'GetVar', [dout('value')], { name: vP });
82
+ const writeP = n('writeP', 'ArrayWrite', [din('arr'), din('i'), din('v'), dout('out')]);
83
+ const setP = n('setP', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vP });
84
+ // awards = Append(awards, unit) (matches native shape: each award is `{type: unit, to: bestAgent}`)
85
+ // Build award object via... we don't have an `Object` constructor primitive. Native pushes
86
+ // an object {type, to}; for equivalence we'd need ObjectMake or just push the unit string.
87
+ // Compromise: push just `unit` for now — tests check leftovers + priorities (the values the
88
+ // sim cares about). Awards detail isn't read by the fairqueue demo.
89
+ const getAw = n('getAw', 'GetVar', [dout('value')], { name: vAw });
90
+ const appAw = n('appAw', 'Append', [din('arr'), din('item'), dout('out')]);
91
+ const setAw = n('setAw', 'SetVar', [ein('in'), din('value'), eout('out')], { name: vAw });
92
+ // Sequence the writes within the true branch: setP → setAw.
93
+ const trueSeq = n('trueSeq', 'Sequence', [ein('in'), eout('a'), eout('b')]);
94
+ // ---- AFTER LOOP — surface the loop vars as outputs ------------------------------------------
95
+ // After ForEach completes we just expose three GetVars as the macro's OUT pins.
96
+ const outP = n('outP', 'GetVar', [dout('value')], { name: vP });
97
+ const outAw = n('outAw', 'GetVar', [dout('value')], { name: vAw });
98
+ const outLo = n('outLo', 'GetVar', [dout('value')], { name: vLo });
99
+ const nodes = [
100
+ seq,
101
+ setInitP, emptyAw, setInitAw, emptyLo, setInitLo,
102
+ fe,
103
+ filt, subsLen, zero, lenCmp, br,
104
+ getLo, appLo, setLo,
105
+ getP1, idxAll, argMax, bestAgent, cost, getP2, oldP, newP, getP3, writeP, setP,
106
+ getAw, appAw, setAw, trueSeq,
107
+ outP, outAw, outLo,
108
+ ];
109
+ const edges = [
110
+ // exec: external → seq.in
111
+ e(srcs.exec.node, srcs.exec.pin, pid('seq'), 'in'),
112
+ // seq.initP → setInitP (priorities ← input)
113
+ e(pid('seq'), 'initP', pid('setInitP'), 'in'),
114
+ e(srcs.priorities.node, srcs.priorities.pin, pid('setInitP'), 'value'),
115
+ // seq.initAw → setInitAw (awards ← [])
116
+ e(pid('seq'), 'initAw', pid('setInitAw'), 'in'),
117
+ e(pid('emptyAw'), 'out', pid('setInitAw'), 'value'),
118
+ // seq.initLo → setInitLo (leftovers ← [])
119
+ e(pid('seq'), 'initLo', pid('setInitLo'), 'in'),
120
+ e(pid('emptyLo'), 'out', pid('setInitLo'), 'value'),
121
+ // seq.loop → ForEach
122
+ e(pid('seq'), 'loop', pid('fe'), 'in'),
123
+ e(srcs.arrivals.node, srcs.arrivals.pin, pid('fe'), 'array'),
124
+ // --- body: FilterIndices(subs, unit) → branch on length ---
125
+ e(srcs.subs.node, srcs.subs.pin, pid('filt'), 'arr'),
126
+ e(pid('fe'), 'element', pid('filt'), 'item'),
127
+ e(pid('filt'), 'out', pid('subsLen'), 'arr'),
128
+ e(pid('subsLen'), 'out', pid('lenCmp'), 'a'),
129
+ e(pid('zero'), 'out', pid('lenCmp'), 'b'),
130
+ e(pid('fe'), 'body', pid('br'), 'in'),
131
+ e(pid('lenCmp'), 'out', pid('br'), 'cond'),
132
+ // --- branch.false: leftovers.push(unit) ---
133
+ e(pid('br'), 'false', pid('setLo'), 'in'),
134
+ e(pid('getLo'), 'value', pid('appLo'), 'arr'),
135
+ e(pid('fe'), 'element', pid('appLo'), 'item'),
136
+ e(pid('appLo'), 'out', pid('setLo'), 'value'),
137
+ // --- branch.true: trueSeq → setP → setAw ---
138
+ e(pid('br'), 'true', pid('trueSeq'), 'in'),
139
+ e(pid('trueSeq'), 'a', pid('setP'), 'in'),
140
+ e(pid('trueSeq'), 'b', pid('setAw'), 'in'),
141
+ // priorities[subscribers] → ArgMax → bestSubIdx
142
+ e(pid('getP1'), 'value', pid('idxAll'), 'arr'),
143
+ e(pid('filt'), 'out', pid('idxAll'), 'idxs'),
144
+ e(pid('idxAll'), 'out', pid('argMax'), 'arr'),
145
+ // bestAgent = subscribers[bestSubIdx]
146
+ e(pid('filt'), 'out', pid('bestAgent'), 'arr'),
147
+ e(pid('argMax'), 'out', pid('bestAgent'), 'i'),
148
+ // cost = costs[unit]
149
+ e(srcs.costs.node, srcs.costs.pin, pid('cost'), 'o'),
150
+ e(pid('fe'), 'element', pid('cost'), 'k'),
151
+ // oldP = priorities[bestAgent]
152
+ e(pid('getP2'), 'value', pid('oldP'), 'arr'),
153
+ e(pid('bestAgent'), 'out', pid('oldP'), 'i'),
154
+ // newP = oldP - cost
155
+ e(pid('oldP'), 'out', pid('newP'), 'a'),
156
+ e(pid('cost'), 'out', pid('newP'), 'b'),
157
+ // priorities = ArrayWrite(priorities, bestAgent, newP)
158
+ e(pid('getP3'), 'value', pid('writeP'), 'arr'),
159
+ e(pid('bestAgent'), 'out', pid('writeP'), 'i'),
160
+ e(pid('newP'), 'out', pid('writeP'), 'v'),
161
+ e(pid('writeP'), 'out', pid('setP'), 'value'),
162
+ // awards = Append(awards, unit)
163
+ e(pid('getAw'), 'value', pid('appAw'), 'arr'),
164
+ e(pid('fe'), 'element', pid('appAw'), 'item'),
165
+ e(pid('appAw'), 'out', pid('setAw'), 'value'),
166
+ ];
167
+ return {
168
+ nodes, edges,
169
+ out: {
170
+ priorities: { node: pid('outP'), pin: 'value' },
171
+ awards: { node: pid('outAw'), pin: 'value' },
172
+ leftovers: { node: pid('outLo'), pin: 'value' },
173
+ exec: { node: pid('seq'), pin: 'after' },
174
+ },
175
+ };
176
+ }
177
+ /** Standalone graph wrapper for unit-testing: takes literal inputs (as Const), wires them into the
178
+ * allocate sub-graph, drains outputs into `priorities` / `awards` / `leftovers` VM vars. */
179
+ export function allocateEquivalenceGraph(priorities, subs, arrivals, costs) {
180
+ const tickNode = { id: 'tick', type: 'Tick', pins: [eout('out')] };
181
+ const cP = { id: 'cP', type: 'Const', pins: [dout('out')], state: { value: priorities } };
182
+ const cS = { id: 'cS', type: 'Const', pins: [dout('out')], state: { value: subs } };
183
+ const cA = { id: 'cA', type: 'Const', pins: [dout('out')], state: { value: arrivals } };
184
+ const cC = { id: 'cC', type: 'Const', pins: [dout('out')], state: { value: costs } };
185
+ const al = buildAllocateSubgraph('alloc', {
186
+ priorities: { node: 'cP', pin: 'out' },
187
+ subs: { node: 'cS', pin: 'out' },
188
+ arrivals: { node: 'cA', pin: 'out' },
189
+ costs: { node: 'cC', pin: 'out' },
190
+ exec: { node: 'tick', pin: 'out' },
191
+ });
192
+ const drainP = { id: 'drainP', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'priorities' } };
193
+ const drainAw = { id: 'drainAw', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'awards' } };
194
+ const drainLo = { id: 'drainLo', type: 'SetVar', pins: [ein('in'), din('value'), eout('out')], state: { name: 'leftovers' } };
195
+ return {
196
+ nodes: [tickNode, cP, cS, cA, cC, ...al.nodes, drainP, drainAw, drainLo],
197
+ edges: [
198
+ ...al.edges,
199
+ // after-loop: chain three drain SetVars
200
+ e(al.out.exec.node, al.out.exec.pin, 'drainP', 'in'),
201
+ e(al.out.priorities.node, al.out.priorities.pin, 'drainP', 'value'),
202
+ e('drainP', 'out', 'drainAw', 'in'),
203
+ e(al.out.awards.node, al.out.awards.pin, 'drainAw', 'value'),
204
+ e('drainAw', 'out', 'drainLo', 'in'),
205
+ e(al.out.leftovers.node, al.out.leftovers.pin, 'drainLo', 'value'),
206
+ ],
207
+ };
208
+ }
209
+ //# sourceMappingURL=allocate-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocate-graph.js","sourceRoot":"","sources":["../../src/model/allocate-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { NodeDef } from '../vm/interpreter.js';
2
+ export declare const Allocate: NodeDef;
3
+ //# sourceMappingURL=allocate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocate.d.ts","sourceRoot":"","sources":["../../src/model/allocate.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAKnD,eAAO,MAAM,QAAQ,EAAE,OA+BtB,CAAA"}
@@ -0,0 +1,47 @@
1
+ // `Allocate` — the one domain verb that encapsulates the hard combinatorics: route each arriving
2
+ // unit to the highest-priority subscriber of its type, subtracting that type's cost; units with no
3
+ // subscriber become leftovers (→ warehouse). Ships native first (the escape hatch); later the same
4
+ // pin interface can be a template built from ForEach/Filter/TopBy primitives.
5
+ //
6
+ // IN: (priorities[], subs[][], arrivals[], costs{type:cost}). OUT: (priorities[], awards[], leftovers[]).
7
+ // Ties broken by lowest index (strict `>`), matching the native fairqueue step().
8
+ //
9
+ // IMPURE (exec), not pure: a multi-output worker must evaluate ONCE and latch its outputs, so every
10
+ // consumer reads the SAME result. (As a pure node it would re-run per pulled output; if a consumer
11
+ // committed a variable this node depends on between pulls, later outputs would be computed from the
12
+ // already-mutated state — the classic Blueprint reason such nodes are impure.)
13
+ import { asArray, asNumber } from '../vm/value.js';
14
+ // Pin order is the contract (index-addressed): IN 0=priorities[], 1=subs[][], 2=arrivals[],
15
+ // 3=costs{type:cost}; OUT 0=priorities[], 1=awards[], 2=leftovers[]; exec-out 0=out.
16
+ export const Allocate = {
17
+ type: 'Allocate',
18
+ run: (io) => {
19
+ const p = asArray(io.input(0)).map(asNumber);
20
+ const subs = asArray(io.input(1)).map((s) => asArray(s).map(String));
21
+ const arrivals = asArray(io.input(2)).map(String);
22
+ const costs = io.input(3) ?? {};
23
+ const awards = [];
24
+ const leftovers = [];
25
+ for (const type of arrivals) {
26
+ let best = -1;
27
+ let bestP = -Infinity;
28
+ for (let i = 0; i < p.length; i++) {
29
+ if (subs[i].includes(type) && p[i] > bestP) {
30
+ bestP = p[i];
31
+ best = i;
32
+ }
33
+ }
34
+ if (best < 0) {
35
+ leftovers.push(type);
36
+ continue;
37
+ }
38
+ p[best] -= asNumber(costs[type]);
39
+ awards.push({ type, to: best });
40
+ }
41
+ io.setOutput(0, p);
42
+ io.setOutput(1, awards);
43
+ io.setOutput(2, leftovers);
44
+ io.flow(0);
45
+ },
46
+ };
47
+ //# sourceMappingURL=allocate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allocate.js","sourceRoot":"","sources":["../../src/model/allocate.ts"],"names":[],"mappings":"AAAA,iGAAiG;AACjG,mGAAmG;AACnG,mGAAmG;AACnG,8EAA8E;AAC9E,EAAE;AACF,0GAA0G;AAC1G,kFAAkF;AAClF,EAAE;AACF,oGAAoG;AACpG,mGAAmG;AACnG,oGAAoG;AACpG,+EAA+E;AAG/E,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAgB,MAAM,gBAAgB,CAAA;AAEhE,4FAA4F;AAC5F,qFAAqF;AACrF,MAAM,CAAC,MAAM,QAAQ,GAAY;IAC/B,IAAI,EAAE,UAAU;IAChB,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE;QACV,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5C,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;QACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACjD,MAAM,KAAK,GAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAwC,IAAI,EAAE,CAAA;QAEvE,MAAM,MAAM,GAAc,EAAE,CAAA;QAC5B,MAAM,SAAS,GAAc,EAAE,CAAA;QAC/B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,IAAI,IAAI,GAAG,CAAC,CAAC,CAAA;YACb,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAA;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAClC,IAAI,IAAI,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAE,GAAG,KAAK,EAAE,CAAC;oBAC7C,KAAK,GAAG,CAAC,CAAC,CAAC,CAAE,CAAA;oBACb,IAAI,GAAG,CAAC,CAAA;gBACV,CAAC;YACH,CAAC;YACD,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACb,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACpB,SAAQ;YACV,CAAC;YACD,CAAC,CAAC,IAAI,CAAE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;YACjC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QACjC,CAAC;QACD,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAClB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QACvB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QAC1B,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACZ,CAAC;CACF,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { RtGraph } from '../vm/interpreter.js';
2
+ /** Build the Mandelbrot per-pixel iteration graph. Host sets `cx`, `cy`, `max_iter` vars before
3
+ * each `tick()`, reads `iter` after. No `max` parameter is baked in — `max_iter` is a var, so
4
+ * the same compiled module renders any depth. */
5
+ export declare function mandelbrotPixelGraph(): RtGraph;
6
+ /** Reference impl in plain JS — the bar every engine must match per-pixel. */
7
+ export declare function mandelbrotPixelReference(cx: number, cy: number, maxIter: number): number;
8
+ //# sourceMappingURL=mandelbrot-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mandelbrot-graph.d.ts","sourceRoot":"","sources":["../../src/model/mandelbrot-graph.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAkB,OAAO,EAAS,MAAM,sBAAsB,CAAA;AAQ1E;;kDAEkD;AAClD,wBAAgB,oBAAoB,IAAI,OAAO,CA0H9C;AAED,8EAA8E;AAC9E,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CASxF"}
@@ -0,0 +1,146 @@
1
+ // Mandelbrot per-pixel iteration count, expressed as an RtGraph. Designed as the showcase for the
2
+ // WASM codegen demo: tight numeric loop with cross-tick var state — the kind of work where the
3
+ // interpreter is brutally slow and AS-WASM crushes near-native.
4
+ //
5
+ // Algorithm:
6
+ // for (i = 0; i < MAX && (zx*zx + zy*zy) < 4; i++) {
7
+ // zxn = zx*zx - zy*zy + cx
8
+ // zyn = 2*zx*zy + cy
9
+ // zx, zy = zxn, zyn
10
+ // }
11
+ // return i
12
+ //
13
+ // Vars (host writes cx/cy/max_iter before each tick, reads iter after):
14
+ // - cx, cy : pixel mapped to complex plane (input)
15
+ // - max_iter : iteration cap (input)
16
+ // - iter : output (final count)
17
+ // - zx, zy : working state (zeroed each tick by Init phase)
18
+ // - zxn, zyn : per-iter temps (avoid clobbering zx/zy mid-update)
19
+ const ein = (id) => ({ id, kind: 'exec', direction: 'in' });
20
+ const eout = (id) => ({ id, kind: 'exec', direction: 'out' });
21
+ const din = (id) => ({ id, kind: 'data', direction: 'in' });
22
+ const dout = (id) => ({ id, kind: 'data', direction: 'out' });
23
+ const e = (fn, fp, tn, tp) => ({ from: { node: fn, pin: fp }, to: { node: tn, pin: tp } });
24
+ /** Build the Mandelbrot per-pixel iteration graph. Host sets `cx`, `cy`, `max_iter` vars before
25
+ * each `tick()`, reads `iter` after. No `max` parameter is baked in — `max_iter` is a var, so
26
+ * the same compiled module renders any depth. */
27
+ export function mandelbrotPixelGraph() {
28
+ // ---- nodes ---------------------------------------------------------------------------------
29
+ const nodes = [
30
+ { id: 'tick', type: 'Tick', pins: [eout('out')] },
31
+ // Init sequence: zero zx/zy/iter at the start of every tick (so consecutive pixels don't
32
+ // inherit each other's loop state).
33
+ { id: 'initSeq', type: 'Sequence', pins: [ein('in'), eout('zx'), eout('zy'), eout('iter'), eout('loop')] },
34
+ { id: 'zero', type: 'Const', pins: [dout('out')], state: { value: 0 } },
35
+ { id: 'setInitZx', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zx' } },
36
+ { id: 'setInitZy', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zy' } },
37
+ { id: 'setInitIter', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'iter' } },
38
+ // Loop: max iterations + cond (zx*zx + zy*zy < 4)
39
+ { id: 'loop', type: 'Loop', pins: [ein('in'), din('max'), din('cond'), dout('idx'), eout('body'), eout('done')] },
40
+ { id: 'getMax', type: 'GetVar', pins: [dout('value')], state: { name: 'max_iter' } },
41
+ // Loop cond: 4 > (zx*zx + zy*zy) [Gt(a, b) = a > b ? 1 : 0]
42
+ { id: 'four', type: 'Const', pins: [dout('out')], state: { value: 4 } },
43
+ { id: 'getZxC', type: 'GetVar', pins: [dout('value')], state: { name: 'zx' } },
44
+ { id: 'getZyC', type: 'GetVar', pins: [dout('value')], state: { name: 'zy' } },
45
+ { id: 'zxSqC', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zx
46
+ { id: 'zySqC', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zy*zy
47
+ { id: 'magC', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // zx² + zy²
48
+ { id: 'cond', type: 'Gt', pins: [din('a'), din('b'), dout('out')] }, // 4 > mag
49
+ // Body sequence: compute zxn, zyn (using OLD zx,zy), then commit zx←zxn, zy←zyn, iter←iter+1.
50
+ // Crucially zxn/zyn are computed BEFORE zx/zy are overwritten — that's why we need temps.
51
+ { id: 'bodySeq', type: 'Sequence', pins: [ein('in'), eout('zxn'), eout('zyn'), eout('commitZx'), eout('commitZy'), eout('iter')] },
52
+ // zxn = zx*zx - zy*zy + cx
53
+ { id: 'getZxB', type: 'GetVar', pins: [dout('value')], state: { name: 'zx' } },
54
+ { id: 'getZyB', type: 'GetVar', pins: [dout('value')], state: { name: 'zy' } },
55
+ { id: 'getCx', type: 'GetVar', pins: [dout('value')], state: { name: 'cx' } },
56
+ { id: 'getCy', type: 'GetVar', pins: [dout('value')], state: { name: 'cy' } },
57
+ { id: 'zxSq', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zx
58
+ { id: 'zySq', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zy*zy
59
+ { id: 'zxSqMinusZySq', type: 'Sub', pins: [din('a'), din('b'), dout('out')] },
60
+ { id: 'zxnExpr', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // (zx²−zy²) + cx
61
+ { id: 'setZxn', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zxn' } },
62
+ // zyn = 2*zx*zy + cy
63
+ { id: 'two', type: 'Const', pins: [dout('out')], state: { value: 2 } },
64
+ { id: 'zxzy', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // zx*zy
65
+ { id: 'twoZxZy', type: 'Mul', pins: [din('a'), din('b'), dout('out')] }, // 2 * zxzy
66
+ { id: 'zynExpr', type: 'Add', pins: [din('a'), din('b'), dout('out')] }, // 2zxzy + cy
67
+ { id: 'setZyn', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zyn' } },
68
+ // zx ← zxn ; zy ← zyn
69
+ { id: 'getZxn', type: 'GetVar', pins: [dout('value')], state: { name: 'zxn' } },
70
+ { id: 'getZyn', type: 'GetVar', pins: [dout('value')], state: { name: 'zyn' } },
71
+ { id: 'commitZx', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zx' } },
72
+ { id: 'commitZy', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'zy' } },
73
+ // iter ← iter + 1
74
+ { id: 'getIter', type: 'GetVar', pins: [dout('value')], state: { name: 'iter' } },
75
+ { id: 'one', type: 'Const', pins: [dout('out')], state: { value: 1 } },
76
+ { id: 'incIter', type: 'Add', pins: [din('a'), din('b'), dout('out')] },
77
+ { id: 'commitIter', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'iter' } },
78
+ ];
79
+ // ---- edges ---------------------------------------------------------------------------------
80
+ const edges = [
81
+ // tick → initSeq
82
+ e('tick', 'out', 'initSeq', 'in'),
83
+ // init: zx=0, zy=0, iter=0
84
+ e('initSeq', 'zx', 'setInitZx', 'in'), e('zero', 'out', 'setInitZx', 'v'),
85
+ e('initSeq', 'zy', 'setInitZy', 'in'), e('zero', 'out', 'setInitZy', 'v'),
86
+ e('initSeq', 'iter', 'setInitIter', 'in'), e('zero', 'out', 'setInitIter', 'v'),
87
+ // init → loop
88
+ e('initSeq', 'loop', 'loop', 'in'),
89
+ e('getMax', 'value', 'loop', 'max'),
90
+ e('cond', 'out', 'loop', 'cond'),
91
+ // cond chain: zxSqC = zx*zx; zySqC = zy*zy; magC = zxSqC + zySqC; cond = (4 > magC)
92
+ e('getZxC', 'value', 'zxSqC', 'a'), e('getZxC', 'value', 'zxSqC', 'b'),
93
+ e('getZyC', 'value', 'zySqC', 'a'), e('getZyC', 'value', 'zySqC', 'b'),
94
+ e('zxSqC', 'out', 'magC', 'a'), e('zySqC', 'out', 'magC', 'b'),
95
+ e('four', 'out', 'cond', 'a'), e('magC', 'out', 'cond', 'b'),
96
+ // loop.body → bodySeq
97
+ e('loop', 'body', 'bodySeq', 'in'),
98
+ // body: zxn first
99
+ e('bodySeq', 'zxn', 'setZxn', 'in'),
100
+ e('getZxB', 'value', 'zxSq', 'a'), e('getZxB', 'value', 'zxSq', 'b'),
101
+ e('getZyB', 'value', 'zySq', 'a'), e('getZyB', 'value', 'zySq', 'b'),
102
+ e('zxSq', 'out', 'zxSqMinusZySq', 'a'),
103
+ e('zySq', 'out', 'zxSqMinusZySq', 'b'),
104
+ e('zxSqMinusZySq', 'out', 'zxnExpr', 'a'),
105
+ e('getCx', 'value', 'zxnExpr', 'b'),
106
+ e('zxnExpr', 'out', 'setZxn', 'v'),
107
+ // body: zyn next
108
+ e('bodySeq', 'zyn', 'setZyn', 'in'),
109
+ e('getZxB', 'value', 'zxzy', 'a'), e('getZyB', 'value', 'zxzy', 'b'),
110
+ e('two', 'out', 'twoZxZy', 'a'),
111
+ e('zxzy', 'out', 'twoZxZy', 'b'),
112
+ e('twoZxZy', 'out', 'zynExpr', 'a'),
113
+ e('getCy', 'value', 'zynExpr', 'b'),
114
+ e('zynExpr', 'out', 'setZyn', 'v'),
115
+ // body: commit zx ← zxn, zy ← zyn
116
+ e('bodySeq', 'commitZx', 'commitZx', 'in'),
117
+ e('getZxn', 'value', 'commitZx', 'v'),
118
+ e('bodySeq', 'commitZy', 'commitZy', 'in'),
119
+ e('getZyn', 'value', 'commitZy', 'v'),
120
+ // body: iter += 1
121
+ e('bodySeq', 'iter', 'commitIter', 'in'),
122
+ e('getIter', 'value', 'incIter', 'a'),
123
+ e('one', 'out', 'incIter', 'b'),
124
+ e('incIter', 'out', 'commitIter', 'v'),
125
+ ];
126
+ return {
127
+ nodes, edges,
128
+ // Codegen hint: cx/cy/max_iter are pure inputs (host writes, body reads); iter is the pure
129
+ // output (body writes, host reads). Lets AS-WASM emit a `tickArgs(cx, cy, max): iter` entry
130
+ // that bypasses set/getVar — apples-to-apples comparison with the reference fn.
131
+ meta: { inputs: ['cx', 'cy', 'max_iter'], outputs: ['iter'] },
132
+ };
133
+ }
134
+ /** Reference impl in plain JS — the bar every engine must match per-pixel. */
135
+ export function mandelbrotPixelReference(cx, cy, maxIter) {
136
+ let zx = 0, zy = 0, i = 0;
137
+ while (i < maxIter && zx * zx + zy * zy < 4) {
138
+ const zxn = zx * zx - zy * zy + cx;
139
+ const zyn = 2 * zx * zy + cy;
140
+ zx = zxn;
141
+ zy = zyn;
142
+ i++;
143
+ }
144
+ return i;
145
+ }
146
+ //# sourceMappingURL=mandelbrot-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mandelbrot-graph.js","sourceRoot":"","sources":["../../src/model/mandelbrot-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RtGraph, RtNode, RtEdge } from '../vm/interpreter.js';
2
+ /** Inline spawn sub-graph keyed by `prefix`. */
3
+ export declare function buildSpawnSubgraph(prefix: string, srcs: {
4
+ specs: {
5
+ node: string;
6
+ pin: string;
7
+ };
8
+ exec: {
9
+ node: string;
10
+ pin: string;
11
+ };
12
+ }): {
13
+ nodes: RtNode[];
14
+ edges: RtEdge[];
15
+ out: {
16
+ units: {
17
+ node: string;
18
+ pin: string;
19
+ };
20
+ exec: {
21
+ node: string;
22
+ pin: string;
23
+ };
24
+ };
25
+ };
26
+ /** Standalone test wrapper: takes literal `specs`, drains `units` into a VM var for assertions. */
27
+ export declare function spawnEquivalenceGraph(specs: Array<{
28
+ type: string;
29
+ rate: number;
30
+ }>): RtGraph;
31
+ //# sourceMappingURL=spawn-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spawn-graph.d.ts","sourceRoot":"","sources":["../../src/model/spawn-graph.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAS,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAU1E,gDAAgD;AAChD,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;IAAE,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAClF;IACD,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,EAAE;QAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAA;CACnF,CAoGA;AAED,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,OAAO,CAmB3F"}