summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/2026_REBASE/README.md314
-rw-r--r--docs/2026_REBASE/app.js303
-rw-r--r--docs/2026_REBASE/assets/aliases-final.json406
-rw-r--r--docs/2026_REBASE/assets/aliases-final.svg140
-rw-r--r--docs/2026_REBASE/assets/arithmetic-final.json162
-rw-r--r--docs/2026_REBASE/assets/arithmetic-final.svg94
-rw-r--r--docs/2026_REBASE/assets/backend-encoded.txt14
-rw-r--r--docs/2026_REBASE/assets/backend-registers.txt22
-rw-r--r--docs/2026_REBASE/assets/backend-selected.txt30
-rw-r--r--docs/2026_REBASE/assets/cliff-click-2020.jpegbin0 -> 408728 bytes
-rw-r--r--docs/2026_REBASE/assets/coffee-compiler-club-still.gifbin0 -> 39680 bytes
-rw-r--r--docs/2026_REBASE/assets/coffee-compiler-club.gifbin0 -> 129460 bytes
-rw-r--r--docs/2026_REBASE/assets/control-final.json588
-rw-r--r--docs/2026_REBASE/assets/control-final.svg171
-rw-r--r--docs/2026_REBASE/assets/inline-final.json251
-rw-r--r--docs/2026_REBASE/assets/inline-final.svg107
-rw-r--r--docs/2026_REBASE/assets/memory-final.json1404
-rw-r--r--docs/2026_REBASE/assets/memory-final.svg320
-rw-r--r--docs/2026_REBASE/assets/rich-lattice.gv404
-rw-r--r--docs/2026_REBASE/assets/rich-lattice.svg2579
-rw-r--r--docs/2026_REBASE/backend.js7
-rw-r--r--docs/2026_REBASE/deck.js58
-rw-r--r--docs/2026_REBASE/demos/aliases.smp5
-rw-r--r--docs/2026_REBASE/demos/arithmetic.smp3
-rw-r--r--docs/2026_REBASE/demos/backend.smp6
-rw-r--r--docs/2026_REBASE/demos/control.smp9
-rw-r--r--docs/2026_REBASE/demos/inline.smp3
-rw-r--r--docs/2026_REBASE/demos/memory.smp10
-rw-r--r--docs/2026_REBASE/demos/methods.smp11
-rw-r--r--docs/2026_REBASE/demos/sccp.smp4
-rw-r--r--docs/2026_REBASE/index.html41
-rw-r--r--docs/2026_REBASE/language.js40
-rw-r--r--docs/2026_REBASE/lattices.js128
-rw-r--r--docs/2026_REBASE/slides.css38
-rw-r--r--docs/2026_REBASE/slides.js214
-rw-r--r--docs/2026_REBASE/stdlib.js17
-rw-r--r--docs/2026_REBASE/tools/BackendDump.java45
-rw-r--r--docs/2026_REBASE/tools/RichLattice.java59
-rw-r--r--docs/2026_REBASE/tools/snapshot-library.py16
-rw-r--r--docs/chapter-backports.md16
40 files changed, 8039 insertions, 0 deletions
diff --git a/docs/2026_REBASE/README.md b/docs/2026_REBASE/README.md
new file mode 100644
index 00000000..925be1ed
--- /dev/null
+++ b/docs/2026_REBASE/README.md
@@ -0,0 +1,314 @@
+# A Simple Tutorial — REBASE 2026
+
+Cliff Click's 30-minute presentation for an audience familiar with compilers,
+SSA, and program analysis. Simple is an open-source, all-Java compiler tutorial
+modeled after Java's C2.
+
+## Run the deck
+
+From the repository root:
+
+ python -m http.server 8000 --bind 127.0.0.1 --directory docs/2026_REBASE
+
+Open [the presentation](http://127.0.0.1:8000/). Keep that terminal running and
+use a second terminal for the graph viewer. Opening `index.html` directly also
+works; a local HTTP server gives the most consistent clipboard and presenter
+window behavior.
+
+There is no npm install, build step, CDN, remote font, or network dependency.
+The portrait, CCC artwork, code, and captured graphs are all in this directory.
+External links are ordinary links, not embedded services.
+
+- **Right / Space:** next build; **Left:** previous build.
+- **Page Down / Page Up:** next / previous slide.
+- **Home / End:** title / closing slide.
+- **L:** cycle the example and lattice tabs on the current slide.
+- **O:** overview, including the optional Chapter 25 slide.
+- **P:** open a synchronized presenter window with notes and a talk timer.
+- **N:** show notes on the current screen; avoid this on the projected screen.
+- **T:** start / pause the timer. It keeps running while a viewer tab is active.
+- **F:** fullscreen; **B:** blank / unblank; **?:** shortcut reference.
+
+The title is still. The still CCC GIF is on the biography slide. Other slides have
+manual builds, with no automatic slide advancement. Reduced-motion preferences
+disable slide transitions.
+
+## The 30-minute route
+
+| Time | Slide | What to show |
+|---|---|---|
+| 00:00–01:00 | A Simple Tutorial | The all-Java, open-source C2 connection |
+| 01:00–02:00 | Who am I? | Short bio, Coffee Compiler Club, links |
+| 02:00–07:00 | Chapters 1–4 | Direct SSA construction and peepholes; live Chapter 4 |
+| 07:00–12:00 | Chapters 5–8 | Regions, Phis, and loops; live Chapter 8 |
+| 12:00–17:00 | Chapters 9–17b | Memory SSA and alias slices; live Chapter 17b |
+| 17:00–22:00 | Chapter 18 | Functions and calls; live demo of trivial inlining and constant folding |
+| 22:00–24:00 | Chapters 19–21 | Instruction selection, allocation, encoding |
+| 24:00–26:00 | Chapters 22–23 | I/O, C calls, methods, and cyclic types |
+| 26:00–28:00 | Chapter 24 | Optimistic propagation through a loop |
+| 28:00–30:00 | Takeaways | Discussion and links |
+
+Chapter 25 is a two-minute optional slide. Normal forward navigation skips it.
+Choose it in the overview or from the closing slide, replacing the final
+discussion if desired. It is not an extra two minutes in the default schedule.
+
+Each live segment includes roughly 45 seconds on the slide, 30 seconds to
+switch tabs, three minutes in the viewer, and a short wrap-up. Speaker notes
+contain the detailed beats and the cumulative time to leave each segment.
+
+## Lattice views
+
+The chapter slides have tabs in their header. Click a tab or press **L** to
+cycle through the views; the example remains the initial view. Memory still
+starts with the short alias example. Tabs synchronize with the presenter
+window, and a URL such as `#memory/0/contents` opens a lattice directly.
+
+| Slide | Lattice views |
+|---|---|
+| Chapters 1?4 | Global bounds, control, flat integer constants, tuples |
+| Chapters 5?8 | Live/dead control and Phi input types; integers remain flat |
+| Chapters 9?17b | Chapter 11 domains; typed memory contents; Chapter 14 ranges |
+| Chapter 18 | Function target sets, with the other type components held fixed |
+| Chapter 24 | Rich lattice across all type families |
+
+Use about 30 seconds of each existing introduction for the lattice. On the
+memory slide, spend about 20 seconds each on Domains and Memory types; Ranges
+is available if useful and is revisited at Chapter 24. These views share the
+existing time slots rather than adding slides to the 30-minute route. Right
+advances to the next slide from a lattice; click Example or press L to return
+to the source before switching to the viewer.
+
+The SVG diagrams in `lattices.js` are drawn for projection. They distinguish
+full domain overviews from selected sublattices and projections. Gray lines
+show lattice order, not IR use/definition edges. The orange SCCP curve marks
+an analysis update. In particular, Chapter 11's flat memory aliases are not
+presented as Chapter 17b's full typed-memory lattice, and the function picture
+shows only the target-set component.
+
+Sources in this repository:
+
+- Chapter 4 `docs/lattice.gv`, README, and `type/Type*.java`.
+- Chapter 6 `docs/lattice.gv`, retained in Chapter 8's types and Phi rules.
+- Chapter 11 `docs/lattice.gv` and `TypeMem.java` for the domain overview.
+- Chapter 17b `TypeMem.java` for fixed-alias contents and their meet.
+- Chapter 14 `TypeInteger.java` for range meet and endpoint-swapping dual.
+- Chapter 18 `TypeFunPtr.java` for target-bit union and the remaining components.
+- Chapter 24 README for optimistic propagation and the fixed-point example.
+
+## Prepare the live demos
+
+Use the repository's normal JDK and Make setup. Prebuild the demo chapters
+before the session so compilation does not consume stage time:
+
+ make -C chapter04 build CTAGS=
+ make -C chapter08 build CTAGS=
+ make -C chapter17b build CTAGS=
+ make -C chapter18 build CTAGS=
+ make -C chapter25 build CTAGS=
+
+The deck's **Copy viewer command** button gives one of these commands:
+
+ make -C chapter04 view
+ make -C chapter08 view
+ make -C chapter17b view
+ make -C chapter18 view
+ make -C chapter25 view
+
+The Chapter 24 SCCP slide deliberately launches **Chapter 25's viewer** for
+this talk, using the same example with a separately compiled standard library.
+Chapter 24's viewer captures the library afresh on each compile (about 3,281
+frames and 372 MB for this example), which can overwhelm the browser. The slide
+topic, source, and lattice explanations remain Chapter 24.
+
+Run one viewer at a time. Stop the previous one with Ctrl+C in its terminal
+before launching the next. Each launch opens a viewer page and prints its URL;
+the HTTP port can change. Keep only the current viewer tab to make switching
+between slides and viewer predictable. All ordinary viewer sessions use
+WebSocket port 12345.
+
+On the slide, **Copy code**, switch to the viewer, paste into the source editor,
+and click **Compile** (or Ctrl+Enter). Move focus out of the editor before using
+Left/Right for playback. Structural peepholes use gather → rewrite → release.
+Jump to **Last** to orient the audience or recover time; the larger examples
+are not intended to be stepped through from beginning to end.
+
+The viewer animates compilation, not runtime execution. It captures
+parsing/optimization/type checking as supported by the chapter; it does not
+show the global scheduler moving instructions. Discuss GCM from the slide.
+
+| Source | Chapter | Checkpoint / result |
+|---|---|---|
+| [arithmetic.smp](demos/arithmetic.smp) | 04 | Final expression `2*arg+6`; 51 capture frames |
+| [control.smp](demos/control.smp) | 08 | Sum 1 through `abs(arg)`; 65 frames |
+| [memory.smp](demos/memory.smp) | 17b | Two loops, array/object memory; 319 frames, 54 final nodes |
+| [aliases.smp](demos/aliases.smp) | 17b | Short follow-up: writing `p.y` leaves `p.x` unchanged; result 0 |
+| [inline.smp](demos/inline.smp) | 18 | Two single-caller functions disappear; `return 11;`; 161 frames |
+| [sccp.smp](demos/sccp.smp) | 24; viewer 25 | Return value 1 verified in the final graph; 76 frames, about 0.38 MB |
+
+The large memory example has runtime result `4*arg+10`. It retains loops and
+memory operations; that formula is not its claimed optimized graph.
+For SCCP, proving a constant result alone does not license deleting effects
+or a possibly nonterminating loop.
+
+The five **Final graph** buttons open captured compiler graphs, available
+offline. These are also a fallback if a viewer session fails. They were
+generated with the shared graph renderer from actual compiler snapshots.
+
+## Equivalence classes and research context
+
+Slide 5 partitions whole memory into `Pair.x`, `Pair.y`, and all other
+locations. A field class covers that field across all instances: accesses in
+the same class may alias; accesses in different classes cannot. The second
+build highlights the `Pair.y` slice changed by the Store. The array example
+uses the corresponding `Totals.sum` / `Totals.visits` partition.
+
+The linked precedent is Amer Diwan, Kathryn S. McKinley, and J. Eliot B. Moss,
+[?Type-Based Alias Analysis,? PLDI 1998, pp. 106?117](https://people.cs.umass.edu/~moss/papers/pldi-1998-tbaa.pdf).
+Sections 3.5?3.6 (printed p. 113; PDF page 8) compare redundant load elimination
+(RLE) with a runtime upper bound. Their type-based analysis came close to that
+bound on eight Modula-3 benchmarks; substantially more static opportunities
+did not produce comparable runtime gains. The average remaining headroom was
+at most 2.5% more heap loads eliminated, not a 2.5% speedup claim.
+
+This is a useful precedent for simple alias models, rather than a measurement
+of Simple's exact equivalence classes or a universal limit on Java optimization.
+It is the closest identified match to the recalled oracle study; an exact
+IBM/Java paper was not established. The visible citation identifies Modula-3,
+and the speaker notes retain the scope and measurement details.
+
+## GitHub hosting
+
+Commit this directory with the repository. GitHub's normal source browser shows
+HTML source; a GitHub Pages site serves the presentation as a running page.
+No generated build output is required.
+
+- If Pages serves the repository's `/docs` directory, the deck is at
+ `/Simple/2026_REBASE/` on that Pages site.
+- If Pages serves the repository root, the deck is at
+ `/Simple/docs/2026_REBASE/`.
+- An existing Pages workflow can copy this directory unchanged to the chosen
+ location in its site artifact.
+
+All asset paths are relative, so the folder can also be copied to another
+static host. Setting up or changing the repository's Pages deployment is
+separate from editing the deck.
+
+## Editing
+
+Slide 8's **Chapter 22** column opens an offline file explorer over the current
+Chapter 25 standard library: `sys.smp`, all eight files directly under `sys/`,
+and `sys/adt/bitset.smp`. Click folders and files; use **Up** or the breadcrumbs
+to navigate. File views scroll, **Full width** expands the explorer, and
+**Discussion** restores the normal column. **Copy file** copies the complete
+source. Paths, file scrolling, and open views synchronize with the presenter.
+While the file text has focus, navigation keys scroll it instead of advancing
+slides. This is a bundled source snapshot, so it also works from `file://`.
+
+The **Chapter 23** column flips to a complete [Counter example](demos/methods.smp)
+with an instance field, `add` and `get` methods, and calls chained through
+`self`. It passes Chapter 23 parsing, optimization, type checking, and evaluation:
+inputs −5, 0, and 5 return 2, 7, and 12. The library explorer deliberately uses
+the latest chapter; the short methods example is valid in Chapter 23 itself.
+
+Refresh the library snapshot and embedded methods source from the repository:
+
+```sh
+python docs/2026_REBASE/tools/snapshot-library.py
+```
+
+Chapter 24 is titled **Sparse Conditional Constant Propagation**. Its **Rich
+lattice** tab (`#sccp/0/rich`) shows the actual ordering of 143 representative
+types from Chapter 24's `Type.gather()`, including their duals. The 256 edges
+are transitively reduced within that sample. This covers every gathered type
+family, without attempting to enumerate all intervals or recursive aggregate
+types. Click the diagram to open the full-size SVG; node tooltips include the
+full type spelling. The two takeaways are “It’s just a lattice, so the
+fixed-point theory works” and “It’s a rich lattice, so we get rich results.”
+
+Regenerate with Chapter 24 built and Graphviz installed:
+
+```sh
+java -ea --class-path chapter24/build/classes/main docs/2026_REBASE/tools/RichLattice.java
+dot -Tsvg docs/2026_REBASE/assets/rich-lattice.gv -o docs/2026_REBASE/assets/rich-lattice.svg
+```
+
+Slide 7's three backend columns are clickable: each flips between its discussion
+and a captured compiler dump. Enter or Space also flips a focused column.
+Flips persist across builds and synchronize with the presenter window.
+The shared [backend example](demos/backend.smp) takes an existing writable Box,
+adds `abs(arg)` into its field, and returns the absolute value. No allocation
+is needed in the example.
+
+All three stages are captured from **Chapter 21**, targeting x86-64 System V;
+Chapters 19 and 20 do not yet select unary negation. The Chapter 19 column shows
+all 21 selected nodes, with concrete class names and every input slot. It omits
+types and redundant use lists to fit. The Chapter 20 and 21 columns show
+`CodeGen.asm()` after register allocation and encoding, respectively, with only
+whitespace and divider lengths compacted. The unabridged captures are
+[selected IR](assets/backend-selected.txt),
+[allocated assembly](assets/backend-registers.txt), and
+[encoded assembly](assets/backend-encoded.txt).
+
+The allocated listing still has provisional offsets, a not-yet-encoded jump,
+and callee-save bookkeeping. Encoding resolves the layout and removes the extra
+jump. `NegX86` emits `48 f7 d8`; `MemAddX86` emits `48 01 07` to add `rax` into
+`[rdi]`. The compiler printer calls its compare-with-zero `test`, although the
+bytes `48 83 f8 00` encode `cmp rax, 0`.
+
+Regenerate these captures and `backend.js` from the repository root:
+
+```sh
+make -C chapter21 build/classes/main/com/seaofnodes/simple/codegen/CodeGen.class
+java -ea --class-path chapter21/build/classes/main docs/2026_REBASE/tools/BackendDump.java
+```
+
+- `deck.js`: speaker links and demo source strings.
+- `backend.js`: generated backend source and compiler dumps.
+- `stdlib.js`: generated library snapshot and methods source.
+- `language.js`: library explorer and methods view.
+- `slides.js`: slide content, manual builds, durations, and speaker notes.
+- `lattices.js`: lattice diagrams, tab definitions, and their speaker notes.
+- `slides.css`: layout and transitions.
+- `app.js`: navigation, clipboard, notes, presenter synchronization, and timer.
+- `demos/*.smp`: standalone copies of the examples. Keep these identical to
+ their `deck.js` strings; `backend.smp` instead feeds `BackendDump.java`, and
+ `methods.smp` feeds `snapshot-library.py`.
+- `assets/*-final.json` and `.svg`: captured graph snapshots and their exports.
+
+YouTube uses [@compilers](https://www.youtube.com/@compilers). The short bio is
+adapted from Cliff's supplied 2024 biography. Portrait and CCC artwork were
+supplied by Cliff and copied into `assets/`.
+
+The bio and closing slides ask people to send an email for a Discord invite.
+
+Captured SVGs can be regenerated from their JSON with
+`graph/render_docs.py --browser msedge` followed by the relevant snapshot paths.
+This optional regeneration tool uses Python Playwright; the deck itself does
+not.
+
+## Validation
+
+The examples were run with assertions enabled in their own chapter compilers
+and evaluators:
+
+| Example | arg = -5 | arg = 0 | arg = 5 |
+|---|---:|---:|---:|
+| Arithmetic | -4 | 6 | 16 |
+| Control | 15 | 0 | 15 |
+| Memory | -10 | 10 | 30 |
+| Aliases | 0 | 0 | 0 |
+| Inlining | 11 | 11 | 11 |
+| SCCP | 1 | 1 | 1 |
+
+Chapter 4 is checked by parsing with constant argument types; later chapters
+use their evaluator. The four live demos and alias follow-up also completed
+their real graph-capture paths without diagnostics. Final snapshots verify
+the arithmetic shape, zero alias-example result, and absence of Calls with
+return value 11 after inlining.
+
+Headless browser checks cover navigation/builds, clipboard buttons, demo
+selection, fallback graphs, the optional route, presenter synchronization,
+the timer, local-file loading, reduced-motion transitions, and slide overflow.
+Lattice checks cover every tab, direct links, retained demo selection, and
+presenter synchronization. The displayed meet/dual and target-union examples
+were checked against the chapter 4, 8, 11, 14, 17b, 18, and 24 type implementations.
diff --git a/docs/2026_REBASE/app.js b/docs/2026_REBASE/app.js
new file mode 100644
index 00000000..c5c6aab0
--- /dev/null
+++ b/docs/2026_REBASE/app.js
@@ -0,0 +1,303 @@
+(function () {
+ "use strict";
+ const R=window.REBASE, slides=R.slides, $=id=>document.getElementById(id);
+ const presenter=new URLSearchParams(location.search).has("presenter");
+ const state={index:0,step:0,demo:null,view:"example",backend:0,library:null,libraryWide:false,libraryScroll:0,methods:false};
+ let held=0,started=null,toastTimeout,channel;
+ if(presenter) document.body.classList.add("presenter");
+ try { channel=new BroadcastChannel("simple-rebase-"+location.pathname); } catch (_) {}
+ const current=()=>slides[state.index];
+ const view=()=>current().views?.find(v=>v.id===state.view);
+ const steps=()=>view()?.steps??current().steps;
+ const elapsed=()=>held+(started===null?0:Date.now()-started);
+ const clock=ms=>Math.floor(ms/60000).toString().padStart(2,"0")+":"+Math.floor(ms/1000%60).toString().padStart(2,"0");
+ const starts=i=>slides.slice(0,i).reduce((n,s)=>n+s.minutes,0);
+ function fit() {
+ const box=$("viewport").getBoundingClientRect();
+ document.documentElement.style.setProperty("--scale",Math.min(box.width/1440,box.height/900));
+ }
+ function readHash() {
+ const [id,step,tab]=location.hash.slice(1).split("/");
+ const index=slides.findIndex(s=>s.id===id);
+ if(index>=0) {
+ state.index=index;
+ state.view=slides[index].views?.some(v=>v.id===tab)?tab:"example";
+ state.step=Math.max(0,Math.min(steps(),Number(step)||0));
+ state.demo=null;
+ }
+ }
+ function broadcast() {
+ if(!presenter && channel) channel.postMessage({type:"state",state:{...state},elapsed:elapsed(),running:started!==null});
+ }
+ function render(remote=false) {
+ const s=current(), count=slides.filter(x=>!x.optional).length;
+ const v=view(), builds=steps();
+ const tabs=s.views?'<nav class="view-tabs" aria-label="Slide views">'+
+ [{id:"example",label:s.id==="memory"?"Examples":"Example"},...s.views].map(t=>
+ '<button data-view="'+t.id+'" aria-pressed="'+String(state.view===t.id)+'">'+R.escape(t.label)+'</button>').join("")+'</nav>':"";
+ const number=s.optional?"BONUS":slides.slice(0,state.index+1).filter(x=>!x.optional).length;
+ $("slide").className="slide"+(s.still?" still":"");
+ $("slide").dataset.id=s.id;
+ $("slide").dataset.step=state.step;
+ $("slide").dataset.view=state.view;
+ $("slide").innerHTML='<header class="kicker"><span>'+R.escape(s.section)+'</span>'+tabs+'<span class="tag">'+(s.demo&&s.id!=="sccp"?"LIVE GRAPH":s.optional?"OPTIONAL":"REBASE 2026")+'</span></header>'+
+ '<div class="slide-content">'+(v?v.body(state):s.body(state))+'</div><footer class="footer"><span><strong>Simple</strong> / Cliff Click</span>'+
+ '<span class="build-dots" aria-label="Build '+state.step+' of '+builds+'">'+Array.from({length:builds+1},(_,i)=>'<i class="'+(i<=state.step?"on":"")+'"></i>').join("")+'</span>'+
+ '<span>'+R.escape(s.section)+' <strong> / '+number+'</strong></span></footer>';
+ $("slide").querySelectorAll("[data-reveal]").forEach(el=>{
+ const hidden=Number(el.dataset.reveal)>state.step;
+ el.classList.toggle("unrevealed",hidden);
+ el.setAttribute("aria-hidden",hidden?"true":"false");
+ el.inert=hidden;
+ });
+ $("slide").querySelectorAll(".state-card").forEach(card=>{
+ const entries=card.querySelectorAll(".state");
+ entries.forEach((el,i)=>{
+ const active=i===Math.min(state.step,entries.length-1);
+ el.classList.toggle("active",active);
+ el.setAttribute("aria-hidden",String(!active));
+ });
+ });
+ $("slide").querySelectorAll("[data-demo]").forEach(button=>{
+ const active=button.dataset.demo===(state.demo||s.demo);
+ button.classList.toggle("active",active);
+ button.setAttribute("aria-pressed",String(active));
+ });
+ $("position").textContent=s.optional?"BONUS":number+" / "+count;
+ $("previous").disabled=state.index===0&&state.step===0;
+ $("next").disabled=state.index===slides.length-1&&state.step===builds;
+ $("notes-content").innerHTML=v?v.notes:s.notes;
+ const source=$("slide").querySelector('[data-library-scroll]');
+ if(source) source.scrollTop=state.libraryScroll;
+ document.title=s.label+" · A Simple Tutorial";
+ if(!remote) {
+ history.replaceState(null,"","#"+s.id+(v?"/"+state.step+"/"+v.id:state.step?"/"+state.step:""));
+ broadcast();
+ }
+ tick();
+ fit();
+ }
+ function go(id) {
+ const index=slides.findIndex(s=>s.id===id);
+ if(index<0) return;
+ state.index=index;state.step=0;state.demo=null;state.view="example";render();
+ }
+ function move(direction,jump=false) {
+ const s=current();
+ if(!jump && direction>0 && state.step<steps()) {state.step++;render();return;}
+ if(!jump && direction<0 && state.step>0) {state.step--;render();return;}
+ let index=state.index+direction;
+ while(index>=0&&index<slides.length&&slides[index].optional) index+=direction;
+ if(index<0||index>=slides.length) return;
+ state.index=index;state.step=direction<0&&!jump?slides[index].steps:0;state.demo=null;state.view="example";render();
+ }
+ function action(name,value,remote=false) {
+ if(presenter&&!remote&&channel) {channel.postMessage({type:"command",name,value});return;}
+ if(name==="next") move(1);
+ else if(name==="previous") move(-1);
+ else if(name==="next-slide") move(1,true);
+ else if(name==="previous-slide") move(-1,true);
+ else if(name==="goto") go(value);
+ else if(name==="demo") {state.demo=value;render();}
+ else if(name==="language") {
+ if(current().id!=="language") return;
+ if(value==="library-open") {state.library="sys";state.libraryScroll=0;}
+ else if(value==="library-close") {state.library=null;state.libraryWide=false;state.libraryScroll=0;}
+ else if(value==="library-width") state.libraryWide=!state.libraryWide;
+ else if(value==="methods-open" && state.step>=1) state.methods=true;
+ else if(value==="methods-close") state.methods=false;
+ else return;
+ render();
+ const focus=value==="library-close"?'[data-language="library-open"]':value==="methods-close"?'[data-language="methods-open"]':value.startsWith("methods")?'[data-language="methods-close"]':'[data-language="library-close"]';
+ $("slide").querySelector(focus)?.focus({preventScroll:true});
+ }
+ else if(name==="library-path") {
+ if(current().id!=="language"||!R.libraryHasPath(value)) return;
+ state.library=value;state.libraryScroll=0;render();
+ $("slide").querySelector('[data-library-scroll],.library-list')?.focus({preventScroll:true});
+ }
+ else if(name==="library-scroll") {
+ if(current().id!=="language"||!Number.isFinite(value)||value<0) return;
+ state.libraryScroll=value;
+ const source=$("slide").querySelector('[data-library-scroll]');
+ if(source && Math.abs(source.scrollTop-value)>1) source.scrollTop=value;
+ broadcast();
+ }
+ else if(name==="backend") {
+ const index=Number(value);
+ if(current().id!=="backend"||!Number.isInteger(index)||index<0||index>state.step) return;
+ state.backend^=1<<index;render();
+ $("slide").querySelector('[data-backend="'+index+'"]').focus({preventScroll:true});
+ }
+ else if(name==="view") {
+ if(value!=="example"&&!current().views?.some(v=>v.id===value)) return;
+ state.view=value;state.step=0;render();
+ $("slide").querySelector('[data-view="'+value+'"]').focus({preventScroll:true});
+ }
+ else if(name==="cycle-view"&&current().views) {
+ const ids=["example",...current().views.map(v=>v.id)];
+ action("view",ids[(ids.indexOf(state.view)+1)%ids.length],remote);
+ }
+ else if(name==="timer") {
+ if(started===null) started=Date.now();
+ else {held=elapsed();started=null;}
+ tick();broadcast();
+ } else if(name==="reset") {held=0;started=null;tick();broadcast();}
+ }
+ function tick() {
+ const s=current(), time=elapsed(), start=starts(state.index), end=start+s.minutes;
+ $("timer").textContent=(started===null?(held?"Resume ":"Start timer "):"Pause ")+clock(time);
+ $("pace").textContent=(presenter&&!channel?"Independent notes · ":"")+
+ (s.optional?"Optional 2 min · replaces closing discussion":"Planned "+clock(start*60000)+"–"+clock(end*60000))+
+ " · elapsed "+clock(time);
+ $("pace").classList.toggle("over",!s.optional&&time>end*60000);
+ }
+ function toast(message) {
+ clearTimeout(toastTimeout);
+ $("toast").textContent=message;$("toast").classList.add("show");
+ toastTimeout=setTimeout(()=>$("toast").classList.remove("show"),2600);
+ }
+ function openDialog(content) {
+ $("dialog-content").innerHTML=content;
+ if(!$("dialog").open) $("dialog").showModal();
+ }
+ async function copy(text,label) {
+ try {
+ if(!navigator.clipboard) throw new Error("No clipboard API");
+ await navigator.clipboard.writeText(text);
+ toast(label+" copied");
+ } catch (_) {
+ const field=document.createElement("textarea");
+ field.value=text;field.style.cssText="position:fixed;left:-9999px";
+ document.body.append(field);field.select();
+ let ok=false;
+ try {ok=document.execCommand("copy");} catch (_) {}
+ field.remove();
+ if(ok) toast(label+" copied");
+ else {
+ openDialog('<h2>Copy '+R.escape(label.toLowerCase())+'</h2><p>Select and copy the text below.</p><textarea id="manual-copy" spellcheck="false"></textarea>');
+ $("manual-copy").value=text;$("manual-copy").focus();$("manual-copy").select();
+ }
+ }
+ }
+ function overview() {
+ openDialog('<h2>The 30-minute route</h2><div class="overview-grid">'+slides.map(s=>
+ '<button data-goto="'+s.id+'">'+R.escape(s.label)+'<small>'+
+ (s.optional?"Optional · 2 min, outside the default route":s.minutes+" min · "+(s.demo&&s.id!=="sccp"?"slide + viewer":"slides"))+
+ '</small></button>').join("")+'</div>');
+ }
+ function help() {
+ openDialog('<h2>Presentation controls</h2><div class="keys">'+[
+ ["← / →","Previous / next build"],["Space","Next build"],["PgUp / PgDn","Previous / next slide"],["Home / End","Title / closing slide"],
+ ["L","Cycle example / lattice tabs"],["O","Slide overview (includes optional Chapter 25)"],["N","Toggle notes on this screen"],["P","Open synchronized presenter window"],["T","Start / pause the talk timer"],["F","Fullscreen"],["B","Blank the projection"],["Esc","Close a dialog or unblank"],["?","This help"]
+ ].map(([key,meaning])=>'<span><kbd>'+key+'</kbd></span><span>'+meaning+'</span>').join("")+
+ '</div><p>Builds advance only when you ask. The talk timer keeps running while you switch to the graph viewer. For demos: Copy code → switch to viewer → paste → Compile.</p>');
+ }
+ function toggleNotes() {
+ if(presenter) return;
+ $("notes").hidden=!$("notes").hidden;
+ $("notes-toggle").setAttribute("aria-pressed",String(!$("notes").hidden));
+ }
+ function openPresenter() {
+ const url=new URL(location.href);url.searchParams.set("presenter","1");
+ const child=window.open(url,"simple-rebase-presenter","width=1400,height=850");
+ if(!child) toast("Allow popups for presenter mode, or press N for notes.");
+ }
+ async function fullscreen() {
+ try {if(document.fullscreenElement) await document.exitFullscreen();else await document.documentElement.requestFullscreen();}
+ catch (_) {toast("Use your browser’s fullscreen command.");}
+ }
+ function blank() {$("blackout").hidden=!$("blackout").hidden;}
+ $("previous").addEventListener("click",()=>action("previous"));
+ $("next").addEventListener("click",()=>action("next"));
+ $("overview").addEventListener("click",overview);
+ $("help").addEventListener("click",help);
+ $("notes-toggle").addEventListener("click",toggleNotes);
+ $("presenter").addEventListener("click",openPresenter);
+ $("timer").addEventListener("click",()=>action("timer"));
+ $("timer-reset").addEventListener("click",()=>action("reset"));
+ $("fullscreen").addEventListener("click",fullscreen);
+ $("dialog-close").addEventListener("click",()=>$("dialog").close());
+ $("dialog").addEventListener("click",e=>{if(e.target===$("dialog")) $("dialog").close();});
+ document.addEventListener("click",e=>{
+ const b=e.target.closest("[data-copy],[data-command],[data-graph],[data-goto],[data-demo],button[data-view],button[data-backend],[data-language],[data-library-path],[data-language-copy]");
+ if(!b) return;
+ if(b.dataset.goto) {if($("dialog").open) $("dialog").close();action("goto",b.dataset.goto);}
+ if(b.dataset.demo) action("demo",b.dataset.demo);
+ if(b.dataset.backend!==undefined) action("backend",b.dataset.backend);
+ if(b.dataset.language) action("language",b.dataset.language);
+ if(b.dataset.libraryPath!==undefined) action("library-path",b.dataset.libraryPath);
+ if(b.dataset.languageCopy) copy(b.dataset.languageCopy==='methods'?R.library.methods:R.library.files[state.library],b.dataset.languageCopy==='methods'?'Methods example':'Source file');
+ if(b.dataset.view) action("view",b.dataset.view);
+ if(b.dataset.copy) copy(R.demos.find(d=>d.id===b.dataset.copy).code,"Demo code");
+ if(b.dataset.command) {
+ const d=R.demos.find(d=>d.id===b.dataset.command);
+ copy("make -C "+(d.viewerChapter||d.chapter)+" view","Viewer command");
+ }
+ if(b.dataset.graph) {
+ const d=R.demos.find(d=>d.id===b.dataset.graph);
+ openDialog('<h2>'+R.escape(d.title)+'</h2><img src="assets/'+d.id+'-final.svg" alt="Captured final compiler graph for '+R.escape(d.title)+'"><p>Captured from '+d.chapter+' after its viewer compilation phases. '+R.escape(d.inputs)+'.</p><p><a href="assets/'+d.id+'-final.svg" target="_blank" rel="noopener">Open full-size graph ↗</a></p>');
+ }
+ });
+ document.addEventListener("scroll",e=>{
+ if(!e.target.matches?.('[data-library-scroll]')) return;
+ const top=e.target.scrollTop;
+ if(Math.abs(top-state.libraryScroll)>1) action("library-scroll",top);
+ },true);
+ document.addEventListener("keydown",e=>{
+ if(e.ctrlKey||e.altKey||e.metaKey||e.repeat) return;
+ if(e.target.closest("textarea,input,select,[contenteditable=true]")) return;
+ if(!$("blackout").hidden) {
+ if(e.key==="b"||e.key==="B"||e.key==="Escape") {$("blackout").hidden=true;e.preventDefault();}
+ return;
+ }
+ if($("dialog").open) return;
+ if(e.target.closest('.library-text,.library-list') && ['ArrowUp','ArrowDown','ArrowLeft','ArrowRight','PageUp','PageDown','Home','End',' '].includes(e.key)) return;
+ let handled=true;
+ switch(e.key) {
+ case "ArrowRight": action("next");break;
+ case " ": if(e.target.closest("button,a")) {handled=false;break;} action("next");break;
+ case "ArrowLeft": action("previous");break;
+ case "PageDown": action("next-slide");break;
+ case "PageUp": action("previous-slide");break;
+ case "Home": action("goto","title");break;
+ case "End": action("goto","close");break;
+ case "o": case "O": overview();break;
+ case "l": case "L": action("cycle-view");break;
+ case "n": case "N": toggleNotes();break;
+ case "p": case "P": openPresenter();break;
+ case "t": case "T": action("timer");break;
+ case "f": case "F": fullscreen();break;
+ case "b": case "B": blank();break;
+ case "?": help();break;
+ case "Escape": if(!presenter) {$("notes").hidden=true;$("notes-toggle").setAttribute("aria-pressed","false");} break;
+ default: handled=false;
+ }
+ if(handled) e.preventDefault();
+ });
+ if(channel) channel.onmessage=e=>{
+ const m=e.data;
+ if(m.type==="request"&&!presenter) broadcast();
+ if(m.type==="command"&&!presenter) action(m.name,m.value,true);
+ if(m.type==="state"&&presenter) {
+ const changed=JSON.stringify(state)!==JSON.stringify(m.state);
+ const scrollOnly=changed && JSON.stringify({...state,libraryScroll:m.state.libraryScroll})===JSON.stringify(m.state);
+ Object.assign(state,m.state);
+ held=m.elapsed;started=m.running?Date.now():null;
+ if(changed && !scrollOnly) render(true);
+ else {
+ const source=$("slide").querySelector('[data-library-scroll]');
+ if(scrollOnly && source) source.scrollTop=state.libraryScroll;
+ tick();
+ }
+ }
+ };
+ window.addEventListener("resize",fit);
+ window.addEventListener("hashchange",()=>{if(!presenter){readHash();render();}});
+ readHash();render();
+ if(presenter) {$("notes").hidden=false;if(channel) channel.postMessage({type:"request"});}
+ setInterval(()=>{tick();if(!presenter&&started!==null) broadcast();},1000);
+ // Small public surface for rehearsal and offline export tools.
+ R.go=id=>action("goto",id);
+ R.state=()=>({...state,elapsed:elapsed(),running:started!==null});
+})();
diff --git a/docs/2026_REBASE/assets/aliases-final.json b/docs/2026_REBASE/assets/aliases-final.json
new file mode 100644
index 00000000..0a13477b
--- /dev/null
+++ b/docs/2026_REBASE/assets/aliases-final.json
@@ -0,0 +1,406 @@
+{
+ "ver": 1,
+ "comp": "rebase-aliases",
+ "step": 50,
+ "roots": [
+ 2,
+ 3
+ ],
+ "scope": 0,
+ "nodes": [
+ {
+ "id": 2,
+ "label": "Start",
+ "type": "[ Ctrl, MemBot, int]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 3,
+ "label": "Stop",
+ "type": "Bot",
+ "kind": "STOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 29,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 4,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 5,
+ "label": "Xctrl",
+ "type": "~Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 6,
+ "label": "$ctrl",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 0
+ }
+ },
+ {
+ "id": 7,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 1
+ }
+ },
+ {
+ "id": 8,
+ "label": "arg",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 2
+ }
+ },
+ {
+ "id": 12,
+ "label": "Con",
+ "type": "10",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 13,
+ "label": "Con",
+ "type": "16",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 14,
+ "label": "MemMerge",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 15,
+ "label": "new_Pair",
+ "type": "[ *Pair {int !x; int !y; }, MemBot]",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 6,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 14,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 13,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 8,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 12,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 16,
+ "label": "Pair",
+ "type": "*Pair {int !x; int !y; }",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 15,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 15,
+ "idx": 0
+ }
+ },
+ {
+ "id": 17,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 15,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 15,
+ "idx": 1
+ }
+ },
+ {
+ "id": 21,
+ "label": "Con",
+ "type": "8",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 22,
+ "label": "Con",
+ "type": "99",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 23,
+ "label": "st_y",
+ "type": "MEM#3:[10-99]",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 17,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 16,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 21,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 22,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 24,
+ "label": "MemMerge",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 17,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 23,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 29,
+ "label": "Return",
+ "type": "[ Ctrl, MemBot, 0]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 6,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 24,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ }
+ ],
+ "groups": []
+}
diff --git a/docs/2026_REBASE/assets/aliases-final.svg b/docs/2026_REBASE/assets/aliases-final.svg
new file mode 100644
index 00000000..f8b2af9e
--- /dev/null
+++ b/docs/2026_REBASE/assets/aliases-final.svg
@@ -0,0 +1,140 @@
+<svg aria-label="Compiler graph" width="686" height="786" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 686 786" style="font-family: sans-serif;"><style>
+ html, body { height:100%; margin:0; font-family:sans-serif; }
+ .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
+ .source { padding:8px; border-bottom:1px solid #ccc; }
+ #program { width:min(600px,80vw); vertical-align:middle; }
+ #status { margin-top:4px; }
+ #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
+ #elk { width:100%; height:100%; }
+ #graph svg { display:block; }
+ .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
+ .hint { color:#616c78; }
+ .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
+ .edge { fill:none; stroke-width:1.5; }
+ .edge.CTRL { stroke-width:2; }
+ .edge.ASSOC { stroke-dasharray:4 4; }
+ .edge.PARSER { stroke-dasharray:5 4; }
+ .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
+ .edge.selected { stroke-width:3.5; }
+ .edge.bundle { stroke-width:4; }
+ .edge.bundle.selected { stroke-width:6; }
+ .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
+ .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
+ .node { cursor:pointer; }
+ .box { stroke:#758191; stroke-width:1; }
+ .node.held .box { stroke-dasharray:5 3; }
+ .node.near .box { stroke:#c18221; stroke-width:2; }
+ .node.focus .box { stroke:#9c4900; stroke-width:3; }
+ .node.selected .box { stroke:#1569b9; stroke-width:3; }
+ .node.folded .box { stroke-width:4; }
+ .node.folding .box { fill:#f4ccd7; }
+ .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
+ .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
+ .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
+ .node.error .box { stroke:#b42318; stroke-width:4; }
+ #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
+ .peep-ghosts { pointer-events:none; }
+ .region-box { stroke:#9da9b8; stroke-width:1.5; }
+ .fold-btn { cursor:pointer; }
+ .fold-btn rect { fill:white; stroke:#596674; }
+ .fold-btn text { font-size:14px; fill:#152330; }
+ .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
+ .shortcut { cursor:pointer; }
+ .shortcut path { fill:none; stroke-width:1.5; }
+ .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
+ .shortcut text { font-size:11px; fill:#783030; }
+ .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
+ .label { font-size:12px; fill:#152330; font-weight:600; }
+ .node-id { font-size:10px; fill:#596674; font-weight:400; }
+ .type { font-size:11px; fill:#455768; }
+ .port { stroke:#536477; stroke-width:1; }
+ .row { stroke:#b6afcf; stroke-width:1; }
+ .bind { font-size:12px; fill:#152330; }
+ .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
+ #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
+ max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
+ background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
+ .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
+ .button { color:white; background:black; font-size:20px; min-width:30px; }
+ .button:disabled { background:grey; }
+ .count { font-size:20px; min-width:35px; text-align:center; }
+ #N { width:6ch; }
+ #scrub { width:clamp(120px,35vw,600px); }
+ </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge CTRL" id="e3i0" d="M114,685 C114,709 343,712 343,736" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#3[0] → #29 · CTRL</title></path><path class="edge ASSOC" id="e4i0" d="M387,52 C387,76 307,507 307,531" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#4[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e5i0" d="M387,52 C387,76 482,25 482,49" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#5[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e12i0" d="M387,52 C387,76 470,151 470,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#12[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e13i0" d="M387,52 C387,76 329,151 329,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#13[0] → #2 · ASSOC</title></path><path class="edge MEM" id="e14i2" d="M204,124 L204,129 Q204,134 199,134 L196.5,134 Q189,134 189,141.5 L189,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#14[2] → #7 · MEM</title></path><path class="edge MEM" id="e14i3" d="M204,124 L204,129.5 Q204,134 208.5,134 L208.5,134 Q213,134 213,138.5 L213,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#14[3] → #7 · MEM</title></path><path class="edge CTRL" id="e15i0" d="M84,124 L84,136 Q84,144 92,144 L98,144 Q106,144 106,152 L106,230 Q106,238 114,238 L139,238 Q147,238 147,246 L147,276" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#15[0] → #6 · CTRL</title></path><path class="edge MEM" id="e15i1" d="M177,228 L177,233 Q177,238 182,238 L182.5,238 Q188,238 188,243.5 L188,276" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#15[1] → #14 · MEM</title></path><path class="edge DATA" id="e15i2" d="M329,228 L329,233 Q329,238 324,238 L237,238 Q229,238 229,246 L229,276" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[2] → #13 · DATA</title></path><path class="edge DATA" id="e15i3" d="M324,124 L324,129 Q324,134 329,134 L391,134 Q399,134 399,142 L399,240 Q399,248 391,248 L278,248 Q270,248 270,256 L270,276" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[3] → #8 · DATA</title></path><path class="edge DATA" id="e15i4" d="M470,228 L470,250 Q470,258 462,258 L319,258 Q311,258 311,266 L311,276" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#15[4] → #12 · DATA</title></path><path class="edge ASSOC" id="e21i0" d="M387,52 C387,76 450,299 450,323" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#21[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e22i0" d="M387,52 C387,76 602,299 602,323" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#22[0] → #2 · ASSOC</title></path><path class="edge MEM" id="e23i1" d="M292,376 L292,424" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#23[1] → #17 · MEM</title></path><path class="edge DATA" id="e23i2" d="M169,376 L169,381 Q169,386 174,386 L304,386 Q312,386 312,394 L312,424" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#23[2] → #16 · DATA</title></path><path class="edge DATA" id="e23i3" d="M450,376 L450,381 Q450,386 445,386 L340,386 Q332,386 332,394 L332,424" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#23[3] → #21 · DATA</title></path><path class="edge DATA" id="e23i4" d="M602,376 L602,388 Q602,396 594,396 L360,396 Q352,396 352,404 L352,424" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#23[4] → #22 · DATA</title></path><path class="edge MEM" id="e24i1" d="M204,124 L204,129 Q204,134 199,134 L103,134 Q95,134 95,142 L95,482 Q95,490 103,490 L135,490 Q143,490 143,498 L143,528" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#24[1] → #7 · MEM</title></path><path class="edge MEM" id="e24i2" d="M292,376 L292,388 Q292,396 284,396 L175,396 Q167,396 167,404 L167,528" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#24[2] → #17 · MEM</title></path><path class="edge MEM" id="e24i3" d="M312,480 L312,485 Q312,490 307,490 L199,490 Q191,490 191,498 L191,528" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#24[3] → #23 · MEM</title></path><path class="edge CTRL" id="e29i0" d="M84,124 L84,632" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#29[0] → #6 · CTRL</title></path><path class="edge MEM" id="e29i1" d="M155,584 L155,589 Q155,594 150,594 L122,594 Q114,594 114,602 L114,632" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#29[1] → #24 · MEM</title></path><path class="edge DATA" id="e29i2" d="M307,584 L307,596 Q307,604 299,604 L152,604 Q144,604 144,612 L144,632" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#29[2] → #4 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n2" data-id="2" transform="translate(24,30)" style="opacity: 1;"><path class="box" d="M0,0H360V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="180" y="18"><tspan>Start</tspan><tspan class="node-id">  #2</tspan></text><text class="type" text-anchor="middle" y="35" x="180">[ Ctrl, MemBot, int]</text><title>#2 Start
+[ Ctrl, MemBot, int]
+
+[0] → — ASSOC
+[1] → — CTRL
+[2] → — CTRL</title><circle class="port" cx="90" cy="-3" r="3" fill="white"/><circle class="port" cx="180" cy="-3" r="3" fill="white"/><circle class="port" cx="270" cy="-3" r="3" fill="white"/><text class="slot" x="90" y="-10" text-anchor="middle">0</text><text class="slot" x="180" y="-10" text-anchor="middle">1</text><text class="slot" x="270" y="-10" text-anchor="middle">2</text></g><g class="node" id="n3" data-id="3" transform="translate(307,736)" style="opacity: 1;"><path class="box" d="M0,0H72V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="36" y="17"><tspan>Stop</tspan><tspan class="node-id">  #3</tspan></text><text class="type" text-anchor="middle" y="35" x="36"/><title>#3 Stop
+Bot
+
+[0] → #29 CTRL</title><circle class="port" cx="36" cy="0" r="3" fill="#536477"/><text class="slot" x="36" y="-7" text-anchor="middle">0</text></g><g class="node" id="n4" data-id="4" transform="translate(247,534)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #4</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#4 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n5" data-id="5" transform="translate(422,52)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Xctrl</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60">~Ctrl</text><title>#5 Xctrl
+~Ctrl
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(24,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$ctrl</tspan><tspan class="node-id">  #6/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#6 $ctrl
+Projection 0 of #2
+Ctrl
+
+[0] → #2 CTRL</title></g><g class="node" id="n7" data-id="7" transform="translate(144,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #7/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#7 $mem
+Projection 1 of #2
+MemBot
+
+[0] → #2 MEM</title></g><g class="node" id="n8" data-id="8" transform="translate(264,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #8/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#8 arg
+Projection 2 of #2
+int
+
+[0] → #2 DATA</title></g><g class="node" id="n12" data-id="12" transform="translate(410,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #12</tspan></text><text class="type" text-anchor="middle" y="35" x="60">10</text><title>#12 Con
+10
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n13" data-id="13" transform="translate(269,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #13</tspan></text><text class="type" text-anchor="middle" y="35" x="60">16</text><title>#13 Con
+16
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n14" data-id="14" transform="translate(117,178)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemMerge</tspan><tspan class="node-id">  #14</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#14 MemMerge
+MemBot
+
+[0] → — CTRL
+[1] → — DATA
+[2] → #7 MEM
+[3] → #7 MEM</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="white"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n15" data-id="15" transform="translate(106,282)" style="opacity: 1;"><path class="box" d="M0,0H246V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="123" y="18"><tspan>new_Pair</tspan><tspan class="node-id">  #15</tspan></text><text class="type" text-anchor="middle" y="35" x="123">[ *Pair {int !x; int !y; }, MemBot]</text><title>#15 new_Pair
+[ *Pair {int !x; int !y; }, MemBot]
+
+[0] → #6 CTRL
+[1] → #14 MEM
+[2] → #13 DATA
+[3] → #8 DATA
+[4] → #12 DATA</title><circle class="port" cx="41" cy="-3" r="3" fill="#536477"/><circle class="port" cx="82" cy="-3" r="3" fill="#536477"/><circle class="port" cx="123" cy="-3" r="3" fill="#536477"/><circle class="port" cx="164" cy="-3" r="3" fill="#536477"/><circle class="port" cx="205" cy="-3" r="3" fill="#536477"/><text class="slot" x="41" y="-10" text-anchor="middle">0</text><text class="slot" x="82" y="-10" text-anchor="middle">1</text><text class="slot" x="123" y="-10" text-anchor="middle">2</text><text class="slot" x="164" y="-10" text-anchor="middle">3</text><text class="slot" x="205" y="-10" text-anchor="middle">4</text></g><g class="node" id="n16" data-id="16" transform="translate(106,326)" style="opacity: 1;"><path class="box" d="M0,0H126V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="63" y="18"><tspan>Pair</tspan><tspan class="node-id">  #16/0</tspan></text><text class="type" text-anchor="middle" y="35" x="63">*Pair {int !x; int !y; }</text><title>#16 Pair
+Projection 0 of #15
+*Pair {int !x; int !y; }
+
+[0] → #15 DATA</title></g><g class="node" id="n17" data-id="17" transform="translate(232,326)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #17/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#17 $mem
+Projection 1 of #15
+MemBot
+
+[0] → #15 MEM</title></g><g class="node" id="n21" data-id="21" transform="translate(390,326)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #21</tspan></text><text class="type" text-anchor="middle" y="35" x="60">8</text><title>#21 Con
+8
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n22" data-id="22" transform="translate(542,326)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #22</tspan></text><text class="type" text-anchor="middle" y="35" x="60">99</text><title>#22 Con
+99
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n23" data-id="23" transform="translate(252,430)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>st_y</tspan><tspan class="node-id">  #23</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#3:[10-99]</text><title>#23 st_y
+MEM#3:[10-99]
+
+[0] → — CTRL
+[1] → #17 MEM
+[2] → #16 DATA
+[3] → #21 DATA
+[4] → #22 DATA</title><circle class="port" cx="20" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="100" cy="-3" r="3" fill="#536477"/><text class="slot" x="20" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="60" y="-10" text-anchor="middle">2</text><text class="slot" x="80" y="-10" text-anchor="middle">3</text><text class="slot" x="100" y="-10" text-anchor="middle">4</text></g><g class="node" id="n24" data-id="24" transform="translate(95,534)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemMerge</tspan><tspan class="node-id">  #24</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#24 MemMerge
+MemBot
+
+[0] → — CTRL
+[1] → #7 MEM
+[2] → #17 MEM
+[3] → #23 MEM</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n29" data-id="29" transform="translate(54,638)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #29</tspan></text><text class="type" text-anchor="middle" y="35" x="60">[ Ctrl, MemBot, 0]</text><title>#29 Return
+[ Ctrl, MemBot, 0]
+
+[0] → #6 CTRL
+[1] → #24 MEM
+[2] → #4 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/docs/2026_REBASE/assets/arithmetic-final.json b/docs/2026_REBASE/assets/arithmetic-final.json
new file mode 100644
index 00000000..8ac65d50
--- /dev/null
+++ b/docs/2026_REBASE/assets/arithmetic-final.json
@@ -0,0 +1,162 @@
+{
+ "ver": 1,
+ "comp": "rebase-arithmetic",
+ "step": 50,
+ "roots": [
+ 2,
+ 26
+ ],
+ "scope": 0,
+ "nodes": [
+ {
+ "id": 2,
+ "label": "Start",
+ "type": "[ Ctrl,IntBot]",
+ "kind": "CTRL",
+ "edges": [],
+ "proj": null
+ },
+ {
+ "id": 3,
+ "label": "$ctrl",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 0
+ }
+ },
+ {
+ "id": 4,
+ "label": "arg",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 1
+ }
+ },
+ {
+ "id": 19,
+ "label": "Con",
+ "type": "2",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 20,
+ "label": "Mul",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 19,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 24,
+ "label": "Con",
+ "type": "6",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 25,
+ "label": "Add",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 20,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 24,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 26,
+ "label": "Return",
+ "type": "[ Ctrl,IntBot]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 3,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 25,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ }
+ ],
+ "groups": []
+}
diff --git a/docs/2026_REBASE/assets/arithmetic-final.svg b/docs/2026_REBASE/assets/arithmetic-final.svg
new file mode 100644
index 00000000..ae8452e1
--- /dev/null
+++ b/docs/2026_REBASE/assets/arithmetic-final.svg
@@ -0,0 +1,94 @@
+<svg aria-label="Compiler graph" width="446" height="454" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 446 454" style="font-family: sans-serif;"><style>
+ html, body { height:100%; margin:0; font-family:sans-serif; }
+ .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
+ .source { padding:8px; border-bottom:1px solid #ccc; }
+ #program { width:min(600px,80vw); vertical-align:middle; }
+ #status { margin-top:4px; }
+ #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
+ #elk { width:100%; height:100%; }
+ #graph svg { display:block; }
+ .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
+ .hint { color:#616c78; }
+ .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
+ .edge { fill:none; stroke-width:1.5; }
+ .edge.CTRL { stroke-width:2; }
+ .edge.ASSOC { stroke-dasharray:4 4; }
+ .edge.PARSER { stroke-dasharray:5 4; }
+ .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
+ .edge.selected { stroke-width:3.5; }
+ .edge.bundle { stroke-width:4; }
+ .edge.bundle.selected { stroke-width:6; }
+ .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
+ .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
+ .node { cursor:pointer; }
+ .box { stroke:#758191; stroke-width:1; }
+ .node.held .box { stroke-dasharray:5 3; }
+ .node.near .box { stroke:#c18221; stroke-width:2; }
+ .node.focus .box { stroke:#9c4900; stroke-width:3; }
+ .node.selected .box { stroke:#1569b9; stroke-width:3; }
+ .node.folded .box { stroke-width:4; }
+ .node.folding .box { fill:#f4ccd7; }
+ .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
+ .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
+ .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
+ .node.error .box { stroke:#b42318; stroke-width:4; }
+ #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
+ .peep-ghosts { pointer-events:none; }
+ .region-box { stroke:#9da9b8; stroke-width:1.5; }
+ .fold-btn { cursor:pointer; }
+ .fold-btn rect { fill:white; stroke:#596674; }
+ .fold-btn text { font-size:14px; fill:#152330; }
+ .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
+ .shortcut { cursor:pointer; }
+ .shortcut path { fill:none; stroke-width:1.5; }
+ .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
+ .shortcut text { font-size:11px; fill:#783030; }
+ .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
+ .label { font-size:12px; fill:#152330; font-weight:600; }
+ .node-id { font-size:10px; fill:#596674; font-weight:400; }
+ .type { font-size:11px; fill:#455768; }
+ .port { stroke:#536477; stroke-width:1; }
+ .row { stroke:#b6afcf; stroke-width:1; }
+ .bind { font-size:12px; fill:#152330; }
+ .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
+ #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
+ max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
+ background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
+ .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
+ .button { color:white; background:black; font-size:20px; min-width:30px; }
+ .button:disabled { background:grey; }
+ .count { font-size:20px; min-width:35px; text-align:center; }
+ #N { width:6ch; }
+ #scrub { width:clamp(120px,35vw,600px); }
+ </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"/><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge ASSOC" id="e19i0" d="M267,46 C267,70 362,41 362,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#19[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e20i1" d="M204,118 L204,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#20[1] → #4 · DATA</title></path><path class="edge DATA" id="e20i2" d="M362,118 L362,123 Q362,128 357,128 L242,128 Q234,128 234,136 L234,166" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#20[2] → #19 · DATA</title></path><path class="edge ASSOC" id="e24i0" d="M267,46 C267,70 356,145 356,169" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#24[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e25i1" d="M204,222 L204,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#25[1] → #20 · DATA</title></path><path class="edge DATA" id="e25i2" d="M356,222 L356,227 Q356,232 351,232 L242,232 Q234,232 234,240 L234,270" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#25[2] → #24 · DATA</title></path><path class="edge CTRL" id="e26i0" d="M84,118 L84,374" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#26[0] → #3 · CTRL</title></path><path class="edge DATA" id="e26i1" d="M204,326 L204,331 Q204,336 199,336 L132,336 Q124,336 124,344 L124,374" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#26[1] → #25 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n2" data-id="2" transform="translate(24,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #2</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[ Ctrl,IntBot]</text><title>#2 Start
+[ Ctrl,IntBot]
+
+</title></g><g class="node" id="n3" data-id="3" transform="translate(24,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$ctrl</tspan><tspan class="node-id">  #3/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#3 $ctrl
+Projection 0 of #2
+Ctrl
+
+[0] → #2 CTRL</title></g><g class="node" id="n4" data-id="4" transform="translate(144,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #4/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#4 arg
+Projection 1 of #2
+IntBot
+
+[0] → #2 DATA</title></g><g class="node" id="n19" data-id="19" transform="translate(302,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #19</tspan></text><text class="type" text-anchor="middle" y="35" x="60">2</text><title>#19 Con
+2
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n20" data-id="20" transform="translate(144,172)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Mul</tspan><tspan class="node-id">  #20</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#20 Mul
+IntBot
+
+[0] → — CTRL
+[1] → #4 DATA
+[2] → #19 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n24" data-id="24" transform="translate(296,172)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #24</tspan></text><text class="type" text-anchor="middle" y="35" x="60">6</text><title>#24 Con
+6
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n25" data-id="25" transform="translate(144,276)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #25</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#25 Add
+IntBot
+
+[0] → — CTRL
+[1] → #20 DATA
+[2] → #24 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n26" data-id="26" transform="translate(44,380)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #26</tspan></text><text class="type" text-anchor="middle" y="35" x="60">[ Ctrl,IntBot]</text><title>#26 Return
+[ Ctrl,IntBot]
+
+[0] → #3 CTRL
+[1] → #25 DATA</title><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="40" y="-10" text-anchor="middle">0</text><text class="slot" x="80" y="-10" text-anchor="middle">1</text></g></g><g class="region-heads" style="opacity: 1;"/><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/docs/2026_REBASE/assets/backend-encoded.txt b/docs/2026_REBASE/assets/backend-encoded.txt
new file mode 100644
index 00000000..ec1e9236
--- /dev/null
+++ b/docs/2026_REBASE/assets/backend-encoded.txt
@@ -0,0 +1,14 @@
+
+--- { *Box {int !x; } int -> int #0}---------------------------
+ arg:rsi,box:rdi
+0000 488bc6 mov rax = rsi // def/empty1 #0
+0003 4883f800 test rax
+0007 7d03 j>= L3 // L4
+L4:
+0009 48f7d8 neg rax
+L12:
+L3:
+ :rax
+000c 480107 add8 [rdi] += rax
+000f c3 ret
+--- ---------------------------
diff --git a/docs/2026_REBASE/assets/backend-registers.txt b/docs/2026_REBASE/assets/backend-registers.txt
new file mode 100644
index 00000000..d833b574
--- /dev/null
+++ b/docs/2026_REBASE/assets/backend-registers.txt
@@ -0,0 +1,22 @@
+
+--- { *Box {int !x; } int -> int #0}---------------------------
+ arg rsi
+ box rdi
+ r15 // r15
+ r14 // r14
+ r13 // r13
+ r12 // r12
+ rbp // rbp
+ rbx // rbx
+0000 mov rax = rsi // def/empty1 #0
+0000 test rax
+0000 j< L4 // L12
+L12:
+0000 ?? JMP L3
+L4:
+0001 neg rax
+L3:
+ rax = phi( N20,N33 )
+0001 add8 [rdi] += rax
+0001 ret rax [stk#33] rbx rbp r12 r13 r14 r15
+--- ---------------------------
diff --git a/docs/2026_REBASE/assets/backend-selected.txt b/docs/2026_REBASE/assets/backend-selected.txt
new file mode 100644
index 00000000..d09adc6b
--- /dev/null
+++ b/docs/2026_REBASE/assets/backend-selected.txt
@@ -0,0 +1,30 @@
+ 7 Start ____ ____ ____ [[ 6 11 15 18 22 ]] [ Ctrl, MemBot, int]
+ 11 Con 7 [[ 10 ]] int
+ 15 Con 7 [[ 14 ]] MemBot
+ 18 Con 7 [[ 17 ]] *Box
+ 22 Con 7 [[ 21 ]] $[ALL]
+
+--- { *Box {int !x; } int -> int #0}----------------------
+
+ 6 $fun0 ____ 7 [[ 5 10 14 17 21 ]] Ctrl
+ 10 arg 6 11 [[ 8 20 19 ]] int
+ 14 $mem 6 15 [[ 13 16 ]] MemBot
+ 17 box 6 18 [[ 16 ]] *Box
+ 21 $rpc 6 22 [[ 2 ]] $[ALL]
+ 8 test ____ 10 [[ 5 ]] bool
+ 20 neg ____ 10 [[ 19 ]] int
+
+ 5 j< 6 8 [[ 4 12 ]] [ Ctrl, Ctrl]
+
+ 12 False 5 [[ 3 ]] Ctrl
+
+ 4 True 5 [[ 3 ]] Ctrl
+
+ 3 Region ____ 4 12 [[ 2 19 ]] Ctrl
+ 19 Phi_ 3 20 10 [[ 16 2 ]] int
+ 16 add8 ____ 14 17 ____ 19 [[ 13 ]] #2:Bot
+ 13 MemMerg ____ 14 16 [[ 2 ]] MemBot
+
+ 2 Return 3 13 19 21 [[ 1 ]] [ Ctrl, MemBot, int]
+--- ----------------------
+ 1 Stop 2 [[ ]] Bot
diff --git a/docs/2026_REBASE/assets/cliff-click-2020.jpeg b/docs/2026_REBASE/assets/cliff-click-2020.jpeg
new file mode 100644
index 00000000..8e1fd801
--- /dev/null
+++ b/docs/2026_REBASE/assets/cliff-click-2020.jpeg
Binary files differ
diff --git a/docs/2026_REBASE/assets/coffee-compiler-club-still.gif b/docs/2026_REBASE/assets/coffee-compiler-club-still.gif
new file mode 100644
index 00000000..16616ab9
--- /dev/null
+++ b/docs/2026_REBASE/assets/coffee-compiler-club-still.gif
Binary files differ
diff --git a/docs/2026_REBASE/assets/coffee-compiler-club.gif b/docs/2026_REBASE/assets/coffee-compiler-club.gif
new file mode 100644
index 00000000..b3d7e292
--- /dev/null
+++ b/docs/2026_REBASE/assets/coffee-compiler-club.gif
Binary files differ
diff --git a/docs/2026_REBASE/assets/control-final.json b/docs/2026_REBASE/assets/control-final.json
new file mode 100644
index 00000000..6161328b
--- /dev/null
+++ b/docs/2026_REBASE/assets/control-final.json
@@ -0,0 +1,588 @@
+{
+ "ver": 1,
+ "comp": "rebase-control",
+ "step": 64,
+ "roots": [
+ 2,
+ 3
+ ],
+ "scope": 0,
+ "nodes": [
+ {
+ "id": 2,
+ "label": "Start",
+ "type": "[Ctrl,IntBot]",
+ "kind": "CTRL",
+ "edges": [],
+ "proj": null
+ },
+ {
+ "id": 3,
+ "label": "Stop",
+ "type": "Bot",
+ "kind": "STOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 32,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 4,
+ "label": "$ctrl",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 0
+ }
+ },
+ {
+ "id": 5,
+ "label": "arg",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 1
+ }
+ },
+ {
+ "id": 6,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 7,
+ "label": "LT",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 5,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 6,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 8,
+ "label": "If",
+ "type": "[Ctrl,Ctrl]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 4,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 7,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 9,
+ "label": "True",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 8,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 8,
+ "idx": 0
+ }
+ },
+ {
+ "id": 10,
+ "label": "False",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 8,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 8,
+ "idx": 1
+ }
+ },
+ {
+ "id": 12,
+ "label": "Minus",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 5,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 13,
+ "label": "Region",
+ "type": "Ctrl",
+ "kind": "REGION",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 9,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 10,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 14,
+ "label": "Phi_n",
+ "type": "IntBot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 13,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 12,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 5,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 15,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 16,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 17,
+ "label": "Loop",
+ "type": "Ctrl",
+ "kind": "LOOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 13,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 23,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 19,
+ "label": "Phi_i",
+ "type": "IntBot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 17,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 16,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 27,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 21,
+ "label": "LT",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 19,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 14,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 22,
+ "label": "If",
+ "type": "[Ctrl,Ctrl]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 17,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 21,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 23,
+ "label": "True",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 22,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 22,
+ "idx": 0
+ }
+ },
+ {
+ "id": 24,
+ "label": "False",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 22,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 22,
+ "idx": 1
+ }
+ },
+ {
+ "id": 26,
+ "label": "Con",
+ "type": "1",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 27,
+ "label": "Add",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 19,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 26,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 28,
+ "label": "Phi_sum",
+ "type": "IntBot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 17,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 15,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 31,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 30,
+ "label": "Add",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 28,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 19,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 31,
+ "label": "Add",
+ "type": "IntBot",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 30,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 26,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 32,
+ "label": "Return",
+ "type": "[Ctrl,IntBot]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 24,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 28,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ }
+ ],
+ "groups": [
+ {
+ "id": 8,
+ "par": 0,
+ "nodes": [
+ 7,
+ 8,
+ 9,
+ 10,
+ 12,
+ 13,
+ 14
+ ]
+ },
+ {
+ "id": 17,
+ "par": 0,
+ "nodes": [
+ 17,
+ 19,
+ 21,
+ 22,
+ 23,
+ 24,
+ 27,
+ 28,
+ 30,
+ 31
+ ]
+ }
+ ]
+}
diff --git a/docs/2026_REBASE/assets/control-final.svg b/docs/2026_REBASE/assets/control-final.svg
new file mode 100644
index 00000000..32e933aa
--- /dev/null
+++ b/docs/2026_REBASE/assets/control-final.svg
@@ -0,0 +1,171 @@
+<svg aria-label="Compiler graph" width="937" height="1260" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 937 1260" style="font-family: sans-serif;"><style>
+ html, body { height:100%; margin:0; font-family:sans-serif; }
+ .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
+ .source { padding:8px; border-bottom:1px solid #ccc; }
+ #program { width:min(600px,80vw); vertical-align:middle; }
+ #status { margin-top:4px; }
+ #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
+ #elk { width:100%; height:100%; }
+ #graph svg { display:block; }
+ .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
+ .hint { color:#616c78; }
+ .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
+ .edge { fill:none; stroke-width:1.5; }
+ .edge.CTRL { stroke-width:2; }
+ .edge.ASSOC { stroke-dasharray:4 4; }
+ .edge.PARSER { stroke-dasharray:5 4; }
+ .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
+ .edge.selected { stroke-width:3.5; }
+ .edge.bundle { stroke-width:4; }
+ .edge.bundle.selected { stroke-width:6; }
+ .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
+ .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
+ .node { cursor:pointer; }
+ .box { stroke:#758191; stroke-width:1; }
+ .node.held .box { stroke-dasharray:5 3; }
+ .node.near .box { stroke:#c18221; stroke-width:2; }
+ .node.focus .box { stroke:#9c4900; stroke-width:3; }
+ .node.selected .box { stroke:#1569b9; stroke-width:3; }
+ .node.folded .box { stroke-width:4; }
+ .node.folding .box { fill:#f4ccd7; }
+ .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
+ .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
+ .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
+ .node.error .box { stroke:#b42318; stroke-width:4; }
+ #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
+ .peep-ghosts { pointer-events:none; }
+ .region-box { stroke:#9da9b8; stroke-width:1.5; }
+ .fold-btn { cursor:pointer; }
+ .fold-btn rect { fill:white; stroke:#596674; }
+ .fold-btn text { font-size:14px; fill:#152330; }
+ .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
+ .shortcut { cursor:pointer; }
+ .shortcut path { fill:none; stroke-width:1.5; }
+ .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
+ .shortcut text { font-size:11px; fill:#783030; }
+ .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
+ .label { font-size:12px; fill:#152330; font-weight:600; }
+ .node-id { font-size:10px; fill:#596674; font-weight:400; }
+ .type { font-size:11px; fill:#455768; }
+ .port { stroke:#536477; stroke-width:1; }
+ .row { stroke:#b6afcf; stroke-width:1; }
+ .bind { font-size:12px; fill:#152330; }
+ .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
+ #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
+ max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
+ background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
+ .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
+ .button { color:white; background:black; font-size:20px; min-width:30px; }
+ .button:disabled { background:grey; }
+ .count { font-size:20px; min-width:35px; text-align:center; }
+ #N { width:6ch; }
+ #scrub { width:clamp(120px,35vw,600px); }
+ </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"><g class="region" transform="translate(24,171)"><rect class="region-box" rx="8" width="433" height="374" fill="#f2f7ef"/></g><g class="region" transform="translate(72,603)"><rect class="region-box" rx="8" width="613" height="450" fill="#f1f6fc"/></g></g><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge CTRL" id="e3i0" d="M306,1159 C306,1183 468.5,1186 468.5,1210" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#3[0] → #32 · CTRL</title></path><path class="edge ASSOC" id="e6i0" d="M299,46 C299,70 394,41 394,65" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e7i1" d="M236,118 L236,130 Q236,138 228,138 L204,138 Q196,138 196,146 L196,205" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[1] → #5 · DATA</title></path><path class="edge DATA" id="e7i2" d="M394,118 L394,123 Q394,128 389,128 L234,128 Q226,128 226,136 L226,205" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#7[2] → #6 · DATA</title></path><path class="edge CTRL" id="e8i0" d="M116,118 L116,309" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#8[0] → #4 · CTRL</title></path><path class="edge DATA" id="e8i1" d="M196,261 L196,309" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#8[1] → #7 · DATA</title></path><path class="edge DATA" id="e12i1" d="M236,118 L236,130 Q236,138 244,138 L386,138 Q394,138 394,146 L394,331" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#12[1] → #5 · DATA</title></path><path class="edge CTRL" id="e13i1" d="M96,409 L96,414 Q96,419 101,419 L178,419 Q186,419 186,427 L186,457" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#13[1] → #9 · CTRL</title></path><path class="edge CTRL" id="e13i2" d="M216,409 L216,457" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#13[2] → #10 · CTRL</title></path><path class="edge DATA" id="e14i1" d="M374,387 L374,411 Q374,419 366,419 L326,419 Q318,419 318,427 L318,457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[1] → #12 · DATA</title></path><path class="edge DATA" id="e14i2" d="M236,118 L236,130 Q236,138 244,138 L436,138 Q444,138 444,146 L444,421 Q444,429 436,429 L366,429 Q358,429 358,437 L358,457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[2] → #5 · DATA</title></path><path class="edge ASSOC" id="e15i0" d="M299,46 C299,70 701,473 701,497" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#15[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e16i0" d="M299,46 C299,70 549,473 549,497" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#16[0] → #2 · ASSOC</title></path><path class="edge CTRL" id="e17i1" d="M186,513 L186,701" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#17[1] → #13 · CTRL</title></path><path class="edge CTRL" id="e17i2" d="M166,1008 L166,1013 Q166,1018 171,1018 L665,1018 Q673,1018 673,1010 L673,684 Q673,676 665,676 L224,676 Q216,676 216,684 L216,704" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#17[2] → #23 · CTRL</title></path><path class="edge DATA" id="e19i1" d="M549,550 L549,555 Q549,560 544,560 L326,560 Q318,560 318,568 L318,701" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#19[1] → #16 · DATA</title></path><path class="edge DATA" id="e19i2" d="M397,860 L397,865 Q397,870 402,870 L655,870 Q663,870 663,862 L663,692 Q663,684 655,684 L366,684 Q358,684 358,692 L358,704" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#19[2] → #27 · DATA</title></path><path class="edge DATA" id="e21i1" d="M338,757 L338,779 Q338,787 330,787 L265,787 Q257,787 257,795 L257,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#21[1] → #19 · DATA</title></path><path class="edge DATA" id="e21i2" d="M338,513 L338,518 Q338,523 333,523 L184,523 Q176,523 176,531 L176,552 Q176,560 168,560 L113,560 Q105,560 105,568 L105,789 Q105,797 113,797 L282,797 Q287,797 287,802 L287,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#21[2] → #14 · DATA</title></path><path class="edge CTRL" id="e22i0" d="M186,757 L186,911" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#22[0] → #17 · CTRL</title></path><path class="edge DATA" id="e22i1" d="M257,863 L257,868.5 Q257,873 261.5,873 L261.5,873 Q266,873 266,877.5 L266,911" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#22[1] → #21 · DATA</title></path><path class="edge ASSOC" id="e26i0" d="M299,46 C299,70 853,473 853,497" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#26[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e27i1" d="M338,757 L338,779 Q338,787 346,787 L389,787 Q397,787 397,795 L397,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#27[1] → #19 · DATA</title></path><path class="edge DATA" id="e27i2" d="M853,550 L853,572 Q853,580 845,580 L568,580 Q560,580 560,588 L560,759 Q560,767 552,767 L435,767 Q427,767 427,775 L427,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#27[2] → #26 · DATA</title></path><path class="edge DATA" id="e28i1" d="M701,550 L701,562 Q701,570 693,570 L478,570 Q470,570 470,578 L470,701" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#28[1] → #15 · DATA</title></path><path class="edge DATA" id="e28i2" d="M549,964 L549,969 Q549,974 554,974 L645,974 Q653,974 653,966 L653,700 Q653,692 645,692 L516,692 Q510,692 510,698 L510,704" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#28[2] → #31 · DATA</title></path><path class="edge DATA" id="e30i1" d="M490,757 L490,769 Q490,777 498,777 L541,777 Q549,777 549,785 L549,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#30[1] → #28 · DATA</title></path><path class="edge DATA" id="e30i2" d="M338,757 L338,779 Q338,787 346,787 L571,787 Q579,787 579,795 L579,807" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#30[2] → #19 · DATA</title></path><path class="edge DATA" id="e31i1" d="M549,863 L549,911" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#31[1] → #30 · DATA</title></path><path class="edge DATA" id="e31i2" d="M853,550 L853,572 Q853,580 845,580 L627,580 Q619,580 619,588 L619,865 Q619,873 611,873 L587,873 Q579,873 579,881 L579,911" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#31[2] → #26 · DATA</title></path><path class="edge CTRL" id="e32i0" d="M286,1011 L286,1106" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#32[0] → #24 · CTRL</title></path><path class="edge DATA" id="e32i1" d="M490,757 L490,769 Q490,777 498,777 L622,777 Q630,777 630,785 L630,1060 Q630,1068 622,1068 L334,1068 Q326,1068 326,1076 L326,1106" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#32[1] → #28 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n2" data-id="2" transform="translate(56,24)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>Start</tspan><tspan class="node-id">  #2</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[Ctrl,IntBot]</text><title>#2 Start
+[Ctrl,IntBot]
+
+</title></g><g class="node" id="n3" data-id="3" transform="translate(432.5,1210)" style="opacity: 1;"><path class="box" d="M0,0H72V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="36" y="17"><tspan>Stop</tspan><tspan class="node-id">  #3</tspan></text><text class="type" text-anchor="middle" y="35" x="36"/><title>#3 Stop
+Bot
+
+[0] → #32 CTRL</title><circle class="port" cx="36" cy="0" r="3" fill="#536477"/><text class="slot" x="36" y="-7" text-anchor="middle">0</text></g><g class="node" id="n4" data-id="4" transform="translate(56,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$ctrl</tspan><tspan class="node-id">  #4/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#4 $ctrl
+Projection 0 of #2
+Ctrl
+
+[0] → #2 CTRL</title></g><g class="node" id="n5" data-id="5" transform="translate(176,68)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #5/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#5 arg
+Projection 1 of #2
+IntBot
+
+[0] → #2 DATA</title></g><g class="node" id="n6" data-id="6" transform="translate(334,68)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#6 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(136,211)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>LT</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#7 LT
+IntBot
+
+[0] → — CTRL
+[1] → #5 DATA
+[2] → #6 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n8" data-id="8" transform="translate(36,315)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>If</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[Ctrl,Ctrl]</text><title>#8 If
+[Ctrl,Ctrl]
+
+[0] → #4 CTRL
+[1] → #7 DATA</title><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="160" cy="-3" r="3" fill="#536477"/><text class="slot" x="80" y="-10" text-anchor="middle">0</text><text class="slot" x="160" y="-10" text-anchor="middle">1</text></g><g class="node" id="n9" data-id="9" transform="translate(36,359)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>True</tspan><tspan class="node-id">  #9/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#9 True
+Projection 0 of #8
+Ctrl
+
+[0] → #8 CTRL</title></g><g class="node" id="n10" data-id="10" transform="translate(156,359)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>False</tspan><tspan class="node-id">  #10/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#10 False
+Projection 1 of #8
+Ctrl
+
+[0] → #8 CTRL</title></g><g class="node" id="n12" data-id="12" transform="translate(314,337)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Minus</tspan><tspan class="node-id">  #12</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#12 Minus
+IntBot
+
+[0] → — CTRL
+[1] → #5 DATA</title><circle class="port" cx="40" cy="-3" r="3" fill="white"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="40" y="-10" text-anchor="middle">0</text><text class="slot" x="80" y="-10" text-anchor="middle">1</text></g><g class="node" id="n13" data-id="13" transform="translate(126,463)" style="opacity: 1;"><path class="box" d="M12,0H108L120,44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Region</tspan><tspan class="node-id">  #13</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#13 Region
+Ctrl
+
+[0] → — ASSOC
+[1] → #9 CTRL
+[2] → #10 CTRL</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n14" data-id="14" transform="translate(278,463)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_n</tspan><tspan class="node-id">  #14</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#14 Phi_n
+IntBot
+
+[0] → #13 ASSOC
+[1] → #12 DATA
+[2] → #5 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #13</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n15" data-id="15" transform="translate(641,500)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #15</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#15 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n16" data-id="16" transform="translate(489,500)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #16</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#16 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n17" data-id="17" transform="translate(126,707)" style="opacity: 1;"><path class="box" d="M20,0H100Q120,0 120,20V24Q120,44 100,44H20Q0,44 0,24V20Q0,0 20,0Z" fill="#ffe0ab"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Loop</tspan><tspan class="node-id">  #17</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#17 Loop
+Ctrl
+
+[0] → — ASSOC
+[1] → #13 CTRL
+[2] → #23 CTRL</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n19" data-id="19" transform="translate(278,707)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_i</tspan><tspan class="node-id">  #19</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#19 Phi_i
+IntBot
+
+[0] → #17 ASSOC
+[1] → #16 DATA
+[2] → #27 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #17</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n21" data-id="21" transform="translate(197,813)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>LT</tspan><tspan class="node-id">  #21</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#21 LT
+IntBot
+
+[0] → — CTRL
+[1] → #19 DATA
+[2] → #14 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n22" data-id="22" transform="translate(106,917)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>If</tspan><tspan class="node-id">  #22</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[Ctrl,Ctrl]</text><title>#22 If
+[Ctrl,Ctrl]
+
+[0] → #17 CTRL
+[1] → #21 DATA</title><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="160" cy="-3" r="3" fill="#536477"/><text class="slot" x="80" y="-10" text-anchor="middle">0</text><text class="slot" x="160" y="-10" text-anchor="middle">1</text></g><g class="node" id="n23" data-id="23" transform="translate(106,961)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>True</tspan><tspan class="node-id">  #23/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#23 True
+Projection 0 of #22
+Ctrl
+
+[0] → #22 CTRL</title></g><g class="node" id="n24" data-id="24" transform="translate(226,961)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>False</tspan><tspan class="node-id">  #24/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#24 False
+Projection 1 of #22
+Ctrl
+
+[0] → #22 CTRL</title></g><g class="node" id="n26" data-id="26" transform="translate(793,500)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #26</tspan></text><text class="type" text-anchor="middle" y="35" x="60">1</text><title>#26 Con
+1
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n27" data-id="27" transform="translate(337,813)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #27</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#27 Add
+IntBot
+
+[0] → — CTRL
+[1] → #19 DATA
+[2] → #26 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n28" data-id="28" transform="translate(430,707)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_sum</tspan><tspan class="node-id">  #28</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#28 Phi_sum
+IntBot
+
+[0] → #17 ASSOC
+[1] → #15 DATA
+[2] → #31 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #17</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n30" data-id="30" transform="translate(489,813)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #30</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#30 Add
+IntBot
+
+[0] → — CTRL
+[1] → #28 DATA
+[2] → #19 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n31" data-id="31" transform="translate(489,917)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #31</tspan></text><text class="type" text-anchor="middle" y="35" x="60">IntBot</text><title>#31 Add
+IntBot
+
+[0] → — CTRL
+[1] → #30 DATA
+[2] → #26 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n32" data-id="32" transform="translate(246,1112)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Return</tspan><tspan class="node-id">  #32</tspan></text><text class="type" text-anchor="middle" y="35" x="60">[Ctrl,IntBot]</text><title>#32 Return
+[Ctrl,IntBot]
+
+[0] → #24 CTRL
+[1] → #28 DATA</title><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="40" y="-10" text-anchor="middle">0</text><text class="slot" x="80" y="-10" text-anchor="middle">1</text></g></g><g class="region-heads" style="opacity: 1;"><g class="region-head" transform="translate(24,171)"><text class="label" x="26" y="17"><tspan>If</tspan><tspan class="node-id">  #8</tspan></text><title>If · 7 nodes</title><g class="fold-btn" role="button" tabindex="0" transform="translate(4,4)" aria-label="Fold region #8"><rect width="16" height="16" rx="2"/><text x="8" y="12" text-anchor="middle">−</text><title>Fold region</title></g></g><g class="region-head" transform="translate(72,603)"><text class="label" x="26" y="17"><tspan>Loop</tspan><tspan class="node-id">  #17</tspan></text><title>Loop · 10 nodes</title><g class="fold-btn" role="button" tabindex="0" transform="translate(4,4)" aria-label="Fold region #17"><rect width="16" height="16" rx="2"/><text x="8" y="12" text-anchor="middle">−</text><title>Fold region</title></g></g></g><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/docs/2026_REBASE/assets/inline-final.json b/docs/2026_REBASE/assets/inline-final.json
new file mode 100644
index 00000000..35e1568e
--- /dev/null
+++ b/docs/2026_REBASE/assets/inline-final.json
@@ -0,0 +1,251 @@
+{
+ "ver": 1,
+ "comp": "rebase-inline",
+ "step": 160,
+ "roots": [
+ 3
+ ],
+ "scope": 0,
+ "nodes": [
+ {
+ "id": 2,
+ "label": "Start",
+ "type": "[ Ctrl, MemBot, int]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 3,
+ "label": "Stop",
+ "type": "Bot",
+ "kind": "STOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 14,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 4,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 5,
+ "label": "Con",
+ "type": "null",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 6,
+ "label": "Xctrl",
+ "type": "~Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 7,
+ "label": "Con",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 8,
+ "label": "main",
+ "type": "Ctrl",
+ "kind": "FUN",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 2,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 9,
+ "label": "Con",
+ "type": "$[ALL]",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 10,
+ "label": "$rpc",
+ "type": "$[ALL]",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 8,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 9,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 14,
+ "label": "Return",
+ "type": "[ Ctrl, MemBot, 11]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 8,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 16,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 66,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 10,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 16,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 8,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 66,
+ "label": "Con",
+ "type": "11",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ }
+ ],
+ "groups": [
+ {
+ "id": 8,
+ "par": 0,
+ "nodes": [
+ 8,
+ 10,
+ 14,
+ 16
+ ]
+ }
+ ]
+}
diff --git a/docs/2026_REBASE/assets/inline-final.svg b/docs/2026_REBASE/assets/inline-final.svg
new file mode 100644
index 00000000..bd862ec3
--- /dev/null
+++ b/docs/2026_REBASE/assets/inline-final.svg
@@ -0,0 +1,107 @@
+<svg aria-label="Compiler graph" width="1084" height="437" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1084 437" style="font-family: sans-serif;"><style>
+ html, body { height:100%; margin:0; font-family:sans-serif; }
+ .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
+ .source { padding:8px; border-bottom:1px solid #ccc; }
+ #program { width:min(600px,80vw); vertical-align:middle; }
+ #status { margin-top:4px; }
+ #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
+ #elk { width:100%; height:100%; }
+ #graph svg { display:block; }
+ .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
+ .hint { color:#616c78; }
+ .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
+ .edge { fill:none; stroke-width:1.5; }
+ .edge.CTRL { stroke-width:2; }
+ .edge.ASSOC { stroke-dasharray:4 4; }
+ .edge.PARSER { stroke-dasharray:5 4; }
+ .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
+ .edge.selected { stroke-width:3.5; }
+ .edge.bundle { stroke-width:4; }
+ .edge.bundle.selected { stroke-width:6; }
+ .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
+ .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
+ .node { cursor:pointer; }
+ .box { stroke:#758191; stroke-width:1; }
+ .node.held .box { stroke-dasharray:5 3; }
+ .node.near .box { stroke:#c18221; stroke-width:2; }
+ .node.focus .box { stroke:#9c4900; stroke-width:3; }
+ .node.selected .box { stroke:#1569b9; stroke-width:3; }
+ .node.folded .box { stroke-width:4; }
+ .node.folding .box { fill:#f4ccd7; }
+ .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
+ .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
+ .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
+ .node.error .box { stroke:#b42318; stroke-width:4; }
+ #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
+ .peep-ghosts { pointer-events:none; }
+ .region-box { stroke:#9da9b8; stroke-width:1.5; }
+ .fold-btn { cursor:pointer; }
+ .fold-btn rect { fill:white; stroke:#596674; }
+ .fold-btn text { font-size:14px; fill:#152330; }
+ .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
+ .shortcut { cursor:pointer; }
+ .shortcut path { fill:none; stroke-width:1.5; }
+ .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
+ .shortcut text { font-size:11px; fill:#783030; }
+ .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
+ .label { font-size:12px; fill:#152330; font-weight:600; }
+ .node-id { font-size:10px; fill:#596674; font-weight:400; }
+ .type { font-size:11px; fill:#455768; }
+ .port { stroke:#536477; stroke-width:1; }
+ .row { stroke:#b6afcf; stroke-width:1; }
+ .bind { font-size:12px; fill:#152330; }
+ .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
+ #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
+ max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
+ background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
+ .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
+ .button { color:white; background:black; font-size:20px; min-width:30px; }
+ .button:disabled { background:grey; }
+ .count { font-size:20px; min-width:35px; text-align:center; }
+ #N { width:6ch; }
+ #scrub { width:clamp(120px,35vw,600px); }
+ </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"><g class="region" transform="translate(298,133)"><rect class="region-box" rx="8" width="459" height="206" fill="#fff8ec"/></g></g><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge CTRL" id="e3i0" d="M407,324 C407,348 542,363 542,387" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#3[0] → #14 · CTRL</title></path><path class="edge ASSOC" id="e4i0" d="M390,77 C390,101 236,3 236,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#4[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e5i0" d="M390,77 C390,101 84,3 84,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#5[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e6i0" d="M390,77 C390,101 696,3 696,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#6[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e7i0" d="M390,77 C390,101 848,3 848,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#7[0] → #2 · ASSOC</title></path><path class="edge CTRL" id="e8i1" d="M390,80 L390,167" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#8[1] → #2 · CTRL</title></path><path class="edge ASSOC" id="e9i0" d="M390,77 C390,101 544,3 544,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#9[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e10i1" d="M544,80 L544,85 Q544,90 539,90 L530,90 Q522,90 522,98 L522,167" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#10[1] → #9 · DATA</title></path><path class="edge CTRL" id="e14i0" d="M370,223 L370,271" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#14[0] → #8 · CTRL</title></path><path class="edge MEM" id="e14i1" d="M674,223 L674,228 Q674,233 669,233 L403,233 Q395,233 395,241 L395,271" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#14[1] → #16 · MEM</title></path><path class="edge DATA" id="e14i2" d="M1000,80 L1000,92 Q1000,100 992,100 L752,100 Q744,100 744,108 L744,235 Q744,243 736,243 L427,243 Q419,243 419,251 L419,271" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[2] → #66 · DATA</title></path><path class="edge DATA" id="e14i3" d="M522,223 L522,245 Q522,253 514,253 L452,253 Q444,253 444,261 L444,271" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[3] → #10 · DATA</title></path><path class="edge MEM" id="e16i1" d="M848,80 L848,85 Q848,90 843,90 L682,90 Q674,90 674,98 L674,167" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#16[1] → #7 · MEM</title></path><path class="edge ASSOC" id="e66i0" d="M390,77 C390,101 1000,3 1000,27" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#66[0] → #2 · ASSOC</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n2" data-id="2" transform="translate(328,30)" style="opacity: 1;"><path class="box" d="M0,0H124V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="62" y="18"><tspan>Start</tspan><tspan class="node-id">  #2</tspan></text><text class="type" text-anchor="middle" y="35" x="62">[ Ctrl, MemBot, int]</text><title>#2 Start
+[ Ctrl, MemBot, int]
+
+[0] → — ASSOC
+[1] → — CTRL
+[2] → — CTRL</title><circle class="port" cx="31" cy="-3" r="3" fill="white"/><circle class="port" cx="62" cy="-3" r="3" fill="white"/><circle class="port" cx="93" cy="-3" r="3" fill="white"/><text class="slot" x="31" y="-10" text-anchor="middle">0</text><text class="slot" x="62" y="-10" text-anchor="middle">1</text><text class="slot" x="93" y="-10" text-anchor="middle">2</text></g><g class="node" id="n3" data-id="3" transform="translate(506,387)" style="opacity: 1;"><path class="box" d="M0,0H72V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="36" y="17"><tspan>Stop</tspan><tspan class="node-id">  #3</tspan></text><text class="type" text-anchor="middle" y="35" x="36"/><title>#3 Stop
+Bot
+
+[0] → #14 CTRL</title><circle class="port" cx="36" cy="0" r="3" fill="#536477"/><text class="slot" x="36" y="-7" text-anchor="middle">0</text></g><g class="node" id="n4" data-id="4" transform="translate(176,30)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #4</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#4 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n5" data-id="5" transform="translate(24,30)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60">null</text><title>#5 Con
+null
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(636,30)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Xctrl</tspan><tspan class="node-id">  #6</tspan></text><text class="type" text-anchor="middle" y="35" x="60">~Ctrl</text><title>#6 Xctrl
+~Ctrl
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n7" data-id="7" transform="translate(788,30)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #7</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#7 Con
+MemBot
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n8" data-id="8" transform="translate(310,173)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#ffe0ab"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>main</tspan><tspan class="node-id">  #8</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#8 main
+Ctrl
+
+[0] → — ASSOC
+[1] → #2 CTRL</title><circle class="port" cx="40" cy="-3" r="3" fill="white"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><text class="slot" x="40" y="-10" text-anchor="middle">0</text><text class="slot" x="80" y="-10" text-anchor="middle">1</text></g><g class="node" id="n9" data-id="9" transform="translate(484,30)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #9</tspan></text><text class="type" text-anchor="middle" y="35" x="60">$[ALL]</text><title>#9 Con
+$[ALL]
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n10" data-id="10" transform="translate(462,173)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$rpc</tspan><tspan class="node-id">  #10</tspan></text><text class="type" text-anchor="middle" y="35" x="60">$[ALL]</text><title>#10 $rpc
+$[ALL]
+
+[0] → #8 ASSOC
+[1] → #9 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #8</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text></g><g class="node" id="n14" data-id="14" transform="translate(345,277)" style="opacity: 1;"><path class="box" d="M0,0H124V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="62" y="18"><tspan>Return</tspan><tspan class="node-id">  #14</tspan></text><text class="type" text-anchor="middle" y="35" x="62">[ Ctrl, MemBot, 11]</text><title>#14 Return
+[ Ctrl, MemBot, 11]
+
+[0] → #8 CTRL
+[1] → #16 MEM
+[2] → #66 DATA
+[3] → #10 DATA</title><circle class="port" cx="25" cy="-3" r="3" fill="#536477"/><circle class="port" cx="50" cy="-3" r="3" fill="#536477"/><circle class="port" cx="74" cy="-3" r="3" fill="#536477"/><circle class="port" cx="99" cy="-3" r="3" fill="#536477"/><text class="slot" x="25" y="-10" text-anchor="middle">0</text><text class="slot" x="50" y="-10" text-anchor="middle">1</text><text class="slot" x="74" y="-10" text-anchor="middle">2</text><text class="slot" x="99" y="-10" text-anchor="middle">3</text></g><g class="node" id="n16" data-id="16" transform="translate(614,173)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #16</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#16 $mem
+MemBot
+
+[0] → #8 ASSOC
+[1] → #7 MEM</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #8</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text></g><g class="node" id="n66" data-id="66" transform="translate(940,30)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #66</tspan></text><text class="type" text-anchor="middle" y="35" x="60">11</text><title>#66 Con
+11
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g></g><g class="region-heads" style="opacity: 1;"><g class="region-head" transform="translate(298,133)"><text class="label" x="26" y="17"><tspan>main</tspan><tspan class="node-id">  #8</tspan></text><title>main · 4 nodes</title><g class="fold-btn" role="button" tabindex="0" transform="translate(4,4)" aria-label="Fold region #8"><rect width="16" height="16" rx="2"/><text x="8" y="12" text-anchor="middle">−</text><title>Fold region</title></g></g></g><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/docs/2026_REBASE/assets/memory-final.json b/docs/2026_REBASE/assets/memory-final.json
new file mode 100644
index 00000000..e2f378ed
--- /dev/null
+++ b/docs/2026_REBASE/assets/memory-final.json
@@ -0,0 +1,1404 @@
+{
+ "ver": 1,
+ "comp": "rebase-memory",
+ "step": 318,
+ "roots": [
+ 2,
+ 3
+ ],
+ "scope": 0,
+ "nodes": [
+ {
+ "id": 2,
+ "label": "Start",
+ "type": "[ Ctrl, MemBot, int]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 3,
+ "label": "Stop",
+ "type": "Bot",
+ "kind": "STOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 115,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 4,
+ "label": "Con",
+ "type": "0",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 5,
+ "label": "Xctrl",
+ "type": "~Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 6,
+ "label": "$ctrl",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 0
+ }
+ },
+ {
+ "id": 7,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 1
+ }
+ },
+ {
+ "id": 8,
+ "label": "arg",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 2,
+ "idx": 2
+ }
+ },
+ {
+ "id": 12,
+ "label": "Con",
+ "type": "16",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 13,
+ "label": "MemMerge",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 14,
+ "label": "new_Totals",
+ "type": "[ *Totals {int !sum; int !visits; }, MemBot]",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 6,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 13,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 12,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 15,
+ "label": "Totals",
+ "type": "*Totals {int !sum; int !visits; }",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 14,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 14,
+ "idx": 0
+ }
+ },
+ {
+ "id": 16,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 14,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 14,
+ "idx": 1
+ }
+ },
+ {
+ "id": 18,
+ "label": "Con",
+ "type": "4",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 24,
+ "label": "Con",
+ "type": "40",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 26,
+ "label": "MemMerge",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 0,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 0,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 0,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 5,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 27,
+ "label": "new_ary_int",
+ "type": "[ *[int] {int #; int ![]; }, MemBot]",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 6,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 26,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 24,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 18,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 28,
+ "label": "[int]",
+ "type": "*[int] {int #; int ![]; }",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 27,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 27,
+ "idx": 0
+ }
+ },
+ {
+ "id": 29,
+ "label": "$mem",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 27,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 27,
+ "idx": 1
+ }
+ },
+ {
+ "id": 32,
+ "label": "Loop",
+ "type": "Ctrl",
+ "kind": "LOOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 6,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 41,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 34,
+ "label": "Phi_i",
+ "type": "int",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 32,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 60,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 35,
+ "label": "LT",
+ "type": "bool",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 34,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 18,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 40,
+ "label": "If",
+ "type": "[ Ctrl, Ctrl]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 32,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 35,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 41,
+ "label": "True",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 40,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 40,
+ "idx": 0
+ }
+ },
+ {
+ "id": 42,
+ "label": "False",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 40,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 40,
+ "idx": 1
+ }
+ },
+ {
+ "id": 46,
+ "label": "Con",
+ "type": "1",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 51,
+ "label": "Con",
+ "type": "8",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 52,
+ "label": "Con",
+ "type": "3",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 2,
+ "role": "ASSOC",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 53,
+ "label": "Shl",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 34,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 52,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 54,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 53,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 51,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 56,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 34,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 8,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 57,
+ "label": "st_ary",
+ "type": "MEM#5:Bot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 41,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 124,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 28,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 54,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 56,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 60,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 34,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 46,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 65,
+ "label": "Loop",
+ "type": "Ctrl",
+ "kind": "LOOP",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 42,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 74,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 67,
+ "label": "Phi_i",
+ "type": "int",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 103,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 68,
+ "label": "LT",
+ "type": "bool",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 67,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 18,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 73,
+ "label": "If",
+ "type": "[ Ctrl, Ctrl]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 68,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 74,
+ "label": "True",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 73,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 73,
+ "idx": 0
+ }
+ },
+ {
+ "id": 75,
+ "label": "False",
+ "type": "Ctrl",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 73,
+ "role": "CTRL",
+ "label": null
+ }
+ ],
+ "proj": {
+ "par": 73,
+ "idx": 1
+ }
+ },
+ {
+ "id": 88,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 131,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 93,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 91,
+ "label": "Shl",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 67,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 52,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 92,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 91,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 51,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 93,
+ "label": "ld_ary",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 74,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 124,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 28,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 92,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 94,
+ "label": "st_sum",
+ "type": "MEM#2:Bot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 104,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 15,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 88,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 99,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 138,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 46,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 100,
+ "label": "st_visits",
+ "type": "MEM#3:Bot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 132,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 15,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 51,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 99,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 103,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 67,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 46,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 104,
+ "label": "MemPhi_2",
+ "type": "MEM#2:Bot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 16,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 94,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 106,
+ "label": "MemMerge",
+ "type": "MemBot",
+ "kind": "MEM",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 7,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 104,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 3,
+ "def": 132,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 4,
+ "def": 29,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 5,
+ "def": 124,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 112,
+ "label": "Add",
+ "type": "int",
+ "kind": "DATA",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 0,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 138,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 131,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 115,
+ "label": "Return",
+ "type": "[ Ctrl, MemBot, int]",
+ "kind": "CTRL",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 75,
+ "role": "CTRL",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 106,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 112,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 124,
+ "label": "MemPhi_5",
+ "type": "MEM#5:Bot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 32,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 29,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 57,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 131,
+ "label": "Phi_sum",
+ "type": "int",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 88,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 132,
+ "label": "MemPhi_3",
+ "type": "MEM#3:Bot",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 16,
+ "role": "MEM",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 100,
+ "role": "MEM",
+ "label": null
+ }
+ ],
+ "proj": null
+ },
+ {
+ "id": 138,
+ "label": "Phi_visits",
+ "type": "int",
+ "kind": "PHI",
+ "edges": [
+ {
+ "idx": 0,
+ "def": 65,
+ "role": "ASSOC",
+ "label": null
+ },
+ {
+ "idx": 1,
+ "def": 4,
+ "role": "DATA",
+ "label": null
+ },
+ {
+ "idx": 2,
+ "def": 99,
+ "role": "DATA",
+ "label": null
+ }
+ ],
+ "proj": null
+ }
+ ],
+ "groups": [
+ {
+ "id": 32,
+ "par": 0,
+ "nodes": [
+ 32,
+ 34,
+ 35,
+ 40,
+ 41,
+ 42,
+ 53,
+ 54,
+ 56,
+ 57,
+ 60,
+ 124
+ ]
+ },
+ {
+ "id": 65,
+ "par": 0,
+ "nodes": [
+ 65,
+ 67,
+ 68,
+ 73,
+ 74,
+ 75,
+ 88,
+ 91,
+ 92,
+ 93,
+ 94,
+ 99,
+ 100,
+ 103,
+ 104,
+ 112,
+ 131,
+ 132,
+ 138
+ ]
+ }
+ ]
+}
diff --git a/docs/2026_REBASE/assets/memory-final.svg b/docs/2026_REBASE/assets/memory-final.svg
new file mode 100644
index 00000000..205fea1b
--- /dev/null
+++ b/docs/2026_REBASE/assets/memory-final.svg
@@ -0,0 +1,320 @@
+<svg aria-label="Compiler graph" width="2263" height="2332" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2263 2332" style="font-family: sans-serif;"><style>
+ html, body { height:100%; margin:0; font-family:sans-serif; }
+ .viewer { height:100%; display:grid; grid-template-rows:auto minmax(0,1fr) auto; }
+ .source { padding:8px; border-bottom:1px solid #ccc; }
+ #program { width:min(600px,80vw); vertical-align:middle; }
+ #status { margin-top:4px; }
+ #graph { min-height:0; overflow:hidden; position:relative; background:#fafbfc; }
+ #elk { width:100%; height:100%; }
+ #graph svg { display:block; }
+ .tools { display:flex; flex-wrap:wrap; align-items:center; gap:14px; margin-top:8px; font-size:12px; }
+ .hint { color:#616c78; }
+ .ctrl { color:#b63838; } .mem { color:#2867b2; } .data { color:#536477; }
+ .edge { fill:none; stroke-width:1.5; }
+ .edge.CTRL { stroke-width:2; }
+ .edge.ASSOC { stroke-dasharray:4 4; }
+ .edge.PARSER { stroke-dasharray:5 4; }
+ .parser rect { fill:#f6f0ff; stroke:#7956a5; stroke-width:1.5; stroke-dasharray:5 4; }
+ .edge.selected { stroke-width:3.5; }
+ .edge.bundle { stroke-width:4; }
+ .edge.bundle.selected { stroke-width:6; }
+ .edge-hit { fill:none; stroke:transparent; stroke-width:12; vector-effect:non-scaling-stroke; pointer-events:stroke; cursor:pointer; }
+ .edge-jump { fill:transparent; pointer-events:all; cursor:pointer; }
+ .node { cursor:pointer; }
+ .box { stroke:#758191; stroke-width:1; }
+ .node.held .box { stroke-dasharray:5 3; }
+ .node.near .box { stroke:#c18221; stroke-width:2; }
+ .node.focus .box { stroke:#9c4900; stroke-width:3; }
+ .node.selected .box { stroke:#1569b9; stroke-width:3; }
+ .node.folded .box { stroke-width:4; }
+ .node.folding .box { fill:#f4ccd7; }
+ .fold-tag { font-size:9px; font-weight:700; fill:#963751; }
+ .peep-area { fill:#fff3d9; fill-opacity:.8; stroke:#c18221; stroke-width:2; pointer-events:none; }
+ .node.peep-edit .box { stroke:#9c4900; stroke-width:3; }
+ .node.error .box { stroke:#b42318; stroke-width:4; }
+ #event.error { color:#b42318; font-weight:600; white-space:pre-wrap; overflow-wrap:anywhere; }
+ .peep-ghosts { pointer-events:none; }
+ .region-box { stroke:#9da9b8; stroke-width:1.5; }
+ .fold-btn { cursor:pointer; }
+ .fold-btn rect { fill:white; stroke:#596674; }
+ .fold-btn text { font-size:14px; fill:#152330; }
+ .fold-btn:focus rect { stroke:#1569b9; stroke-width:2; }
+ .shortcut { cursor:pointer; }
+ .shortcut path { fill:none; stroke-width:1.5; }
+ .shortcut rect { fill:#fff8ec; stroke:#b63838; stroke-dasharray:3 2; }
+ .shortcut text { font-size:11px; fill:#783030; }
+ .shortcut.selected rect, .shortcut:focus rect { stroke-width:2.5; }
+ .label { font-size:12px; fill:#152330; font-weight:600; }
+ .node-id { font-size:10px; fill:#596674; font-weight:400; }
+ .type { font-size:11px; fill:#455768; }
+ .port { stroke:#536477; stroke-width:1; }
+ .row { stroke:#b6afcf; stroke-width:1; }
+ .bind { font-size:12px; fill:#152330; }
+ .slot { font-size:10px; fill:#364352; paint-order:stroke; stroke:#fafbfc; stroke-width:3; }
+ #detail { position:absolute; top:8px; right:8px; margin:0; padding:12px; max-width:320px;
+ max-height:45%; overflow:auto; white-space:pre-wrap; overflow-wrap:anywhere;
+ background:#fffffff2; border:1px solid #bac5d0; border-radius:4px; font-size:12px; }
+ .controls { display:flex; flex-wrap:wrap; justify-content:center; align-items:center; gap:6px; padding:6px; }
+ .button { color:white; background:black; font-size:20px; min-width:30px; }
+ .button:disabled { background:grey; }
+ .count { font-size:20px; min-width:35px; text-align:center; }
+ #N { width:6ch; }
+ #scrub { width:clamp(120px,35vw,600px); }
+ </style><defs><marker id="arrow-CTRL" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#b63838"/></marker><marker id="arrow-DATA" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#536477"/></marker><marker id="arrow-MEM" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#2867b2"/></marker><marker id="arrow-ASSOC" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#9396a3"/></marker><marker id="arrow-PARSER" viewBox="0 -4 8 8" refX="8" refY="0" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M0,-4L8,0L0,4Z" fill="#7956a5"/></marker></defs><rect width="100%" height="100%" fill="rgb(250, 251, 252)"/><g><g class="regions" style="opacity: 1;"><g class="region" transform="translate(610,473)"><rect class="region-box" rx="8" width="836" height="556" fill="#f1f6fc"/></g><g class="region" transform="translate(658,1149)"><rect class="region-box" rx="8" width="1559" height="872" fill="#f1f6fc"/></g></g><rect class="peep-area" rx="36" style="opacity: 0;"/><g class="edges"><path class="edge CTRL" id="e3i0" d="M945,2231 C945,2255 1131.5,2258 1131.5,2282" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#3[0] → #115 · CTRL</title></path><path class="edge ASSOC" id="e4i0" d="M1017,52 C1017,76 492,151 492,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#4[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e5i0" d="M1017,52 C1017,76 562,25 562,49" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#5[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e12i0" d="M1017,52 C1017,76 340,151 340,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#12[0] → #2 · ASSOC</title></path><path class="edge MEM" id="e13i2" d="M834,124 L834,136 Q834,144 826,144 L208,144 Q200,144 200,152 L200,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#13[2] → #7 · MEM</title></path><path class="edge MEM" id="e13i3" d="M834,124 L834,136 Q834,144 826,144 L232,144 Q224,144 224,152 L224,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#13[3] → #7 · MEM</title></path><path class="edge CTRL" id="e14i0" d="M714,124 L714,146 Q714,154 706,154 L125,154 Q117,154 117,162 L117,288" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#14[0] → #6 · CTRL</title></path><path class="edge MEM" id="e14i1" d="M188,228 L188,270 Q188,278 180,278 L171,278 Q166,278 166,283 L166,288" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#14[1] → #13 · MEM</title></path><path class="edge DATA" id="e14i2" d="M340,228 L340,233 Q340,238 335,238 L223,238 Q215,238 215,246 L215,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[2] → #12 · DATA</title></path><path class="edge DATA" id="e14i3" d="M492,228 L492,260 Q492,268 484,268 L271,268 Q263,268 263,276 L263,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[3] → #4 · DATA</title></path><path class="edge DATA" id="e14i4" d="M492,228 L492,260 Q492,268 484,268 L320,268 Q312,268 312,276 L312,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#14[4] → #4 · DATA</title></path><path class="edge ASSOC" id="e18i0" d="M1017,52 C1017,76 644,151 644,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#18[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e24i0" d="M1017,52 C1017,76 976,151 976,175" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#24[0] → #2 · ASSOC</title></path><path class="edge MEM" id="e26i4" d="M834,124 L834,137 Q834,144 841,144 L841,144 Q848,144 848,151 L848,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#26[4] → #7 · MEM</title></path><path class="edge MEM" id="e26i5" d="M834,124 L834,136 Q834,144 842,144 L858,144 Q866,144 866,152 L866,172" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#26[5] → #7 · MEM</title></path><path class="edge CTRL" id="e27i0" d="M714,124 L714,146 Q714,154 722,154 L739,154 Q747,154 747,162 L747,250 Q747,258 755,258 L779,258 Q787,258 787,266 L787,288" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#27[0] → #6 · CTRL</title></path><path class="edge MEM" id="e27i1" d="M821,228 L821,254.5 Q821,258 824.5,258 L824.5,258 Q828,258 828,261.5 L828,288" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#27[1] → #26 · MEM</title></path><path class="edge DATA" id="e27i2" d="M976,228 L976,250 Q976,258 968,258 L876,258 Q868,258 868,266 L868,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#27[2] → #24 · DATA</title></path><path class="edge DATA" id="e27i3" d="M644,228 L644,240 Q644,248 652,248 L900,248 Q908,248 908,256 L908,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#27[3] → #18 · DATA</title></path><path class="edge DATA" id="e27i4" d="M492,228 L492,260 Q492,268 500,268 L941,268 Q949,268 949,276 L949,288" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#27[4] → #4 · DATA</title></path><path class="edge CTRL" id="e32i1" d="M714,124 L714,561" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#32[1] → #6 · CTRL</title></path><path class="edge CTRL" id="e32i2" d="M694,878 L694,883 Q694,888 699,888 L1426,888 Q1434,888 1434,880 L1434,544 Q1434,536 1426,536 L752,536 Q744,536 744,544 L744,564" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#32[2] → #41 · CTRL</title></path><path class="edge DATA" id="e34i1" d="M492,228 L492,260 Q492,268 500,268 L717,268 Q725,268 725,276 L725,450 Q725,458 733,458 L838,458 Q846,458 846,466 L846,561" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#34[1] → #4 · DATA</title></path><path class="edge DATA" id="e34i2" d="M785,730 L785,735 Q785,740 790,740 L1416,740 Q1424,740 1424,732 L1424,552 Q1424,544 1416,544 L894,544 Q886,544 886,552 L886,564" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#34[2] → #60 · DATA</title></path><path class="edge DATA" id="e35i1" d="M866,617 L866,659 Q866,667 874,667 L920,667 Q925,667 925,672 L925,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#35[1] → #34 · DATA</title></path><path class="edge DATA" id="e35i2" d="M644,228 L644,240 Q644,248 636,248 L581,248 Q573,248 573,256 L573,420 Q573,428 581,428 L635,428 Q643,428 643,436 L643,619 Q643,627 651,627 L947,627 Q955,627 955,635 L955,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#35[2] → #18 · DATA</title></path><path class="edge CTRL" id="e40i0" d="M714,617 L714,781" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#40[0] → #32 · CTRL</title></path><path class="edge DATA" id="e40i1" d="M925,733 L925,745 Q925,753 917,753 L802,753 Q794,753 794,761 L794,781" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#40[1] → #35 · DATA</title></path><path class="edge ASSOC" id="e46i0" d="M1017,52 C1017,76 644,311 644,335" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#46[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e51i0" d="M1017,52 C1017,76 1980,311 1980,335" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#51[0] → #2 · ASSOC</title></path><path class="edge ASSOC" id="e52i0" d="M1017,52 C1017,76 1828,311 1828,335" stroke="#9396a3" marker-start="url(#arrow-ASSOC)" style="opacity: 1;"><title>#52[0] → #2 · ASSOC</title></path><path class="edge DATA" id="e53i1" d="M866,617 L866,659 Q866,667 874,667 L1164,667 Q1169,667 1169,672 L1169,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#53[1] → #34 · DATA</title></path><path class="edge DATA" id="e53i2" d="M1828,388 L1828,430 Q1828,438 1820,438 L1207,438 Q1199,438 1199,446 L1199,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#53[2] → #52 · DATA</title></path><path class="edge DATA" id="e54i1" d="M1169,733 L1169,795.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#54[1] → #53 · DATA</title></path><path class="edge DATA" id="e54i2" d="M1980,388 L1980,450 Q1980,458 1972,458 L1247,458 Q1239,458 1239,466 L1239,735 Q1239,743 1231,743 L1207,743 Q1199,743 1199,751 L1199,795.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#54[2] → #51 · DATA</title></path><path class="edge DATA" id="e56i1" d="M866,617 L866,659 Q866,667 874,667 L1313,667 Q1321,667 1321,675 L1321,795.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#56[1] → #34 · DATA</title></path><path class="edge DATA" id="e56i2" d="M954,124 L954,129 Q954,134 949,134 L744,134 Q736,134 736,142 L736,440 Q736,448 744,448 L1343,448 Q1351,448 1351,456 L1351,795.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#56[2] → #8 · DATA</title></path><path class="edge CTRL" id="e57i0" d="M694,881 L694,886 Q694,891 699,891 L848,891 Q856,891 856,899 L856,941" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#57[0] → #41 · CTRL</title></path><path class="edge MEM" id="e57i1" d="M1018,617 L1018,649 Q1018,657 1026,657 L1079,657 Q1087,657 1087,665 L1087,893 Q1087,901 1079,901 L884,901 Q876,901 876,909 L876,941" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#57[1] → #124 · MEM</title></path><path class="edge DATA" id="e57i2" d="M808,388 L808,420 Q808,428 816,428 L1090,428 Q1098,428 1098,436 L1098,903 Q1098,911 1090,911 L904,911 Q896,911 896,919 L896,941" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#57[2] → #28 · DATA</title></path><path class="edge DATA" id="e57i3" d="M1169,851.6666666666667 L1169,913 Q1169,921 1161,921 L924,921 Q916,921 916,929 L916,941" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#57[3] → #54 · DATA</title></path><path class="edge DATA" id="e57i4" d="M1321,851.6666666666667 L1321,923 Q1321,931 1313,931 L941,931 Q936,931 936,936 L936,941" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#57[4] → #56 · DATA</title></path><path class="edge DATA" id="e60i1" d="M866,617 L866,659 Q866,667 858,667 L790,667 Q785,667 785,672 L785,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#60[1] → #34 · DATA</title></path><path class="edge DATA" id="e60i2" d="M644,388 L644,410 Q644,418 636,418 L630,418 Q622,418 622,426 L622,639 Q622,647 630,647 L807,647 Q815,647 815,655 L815,677" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#60[2] → #46 · DATA</title></path><path class="edge CTRL" id="e65i1" d="M814,881 L814,1281" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#65[1] → #42 · CTRL</title></path><path class="edge CTRL" id="e65i2" d="M794,1660 L794,1665 Q794,1670 799,1670 L2197,1670 Q2205,1670 2205,1662 L2205,1240 Q2205,1232 2197,1232 L852,1232 Q844,1232 844,1240 L844,1284" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#65[2] → #74 · CTRL</title></path><path class="edge DATA" id="e67i1" d="M492,228 L492,260 Q492,268 484,268 L65,268 Q57,268 57,276 L57,430 Q57,438 65,438 L71,438 Q79,438 79,446 L79,1086 Q79,1094 87,1094 L938,1094 Q946,1094 946,1102 L946,1281" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#67[1] → #4 · DATA</title></path><path class="edge DATA" id="e67i2" d="M1048,1510 L1048,1515 Q1048,1520 1053,1520 L2187,1520 Q2195,1520 2195,1512 L2195,1248 Q2195,1240 2187,1240 L994,1240 Q986,1240 986,1248 L986,1284" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#67[2] → #103 · DATA</title></path><path class="edge DATA" id="e68i1" d="M966,1337 L966,1359 Q966,1367 958,1367 L893,1367 Q885,1367 885,1375 L885,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#68[1] → #67 · DATA</title></path><path class="edge DATA" id="e68i2" d="M644,228 L644,240 Q644,248 636,248 L54,248 Q46,248 46,256 L46,1116 Q46,1124 54,1124 L683,1124 Q691,1124 691,1132 L691,1419 Q691,1427 699,1427 L907,1427 Q915,1427 915,1435 L915,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#68[2] → #18 · DATA</title></path><path class="edge CTRL" id="e73i0" d="M814,1337 L814,1563" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#73[0] → #65 · CTRL</title></path><path class="edge DATA" id="e73i1" d="M885,1513 L885,1518.5 Q885,1523 889.5,1523 L889.5,1523 Q894,1523 894,1527.5 L894,1563" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#73[1] → #68 · DATA</title></path><path class="edge DATA" id="e88i1" d="M1270,1337 L1270,1409 Q1270,1417 1262,1417 L985,1417 Q977,1417 977,1425 L977,1515 Q977,1523 985,1523 L1004,1523 Q1012,1523 1012,1531 L1012,1695 Q1012,1703 1004,1703 L977,1703 Q969,1703 969,1711 L969,1781 Q969,1789 977,1789 L1020,1789 Q1028,1789 1028,1797 L1028,1827" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#88[1] → #131 · DATA</title></path><path class="edge DATA" id="e88i2" d="M1040,1779 L1040,1784 Q1040,1789 1045,1789 L1050,1789 Q1058,1789 1058,1797 L1058,1827" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#88[2] → #93 · DATA</title></path><path class="edge DATA" id="e91i1" d="M966,1337 L966,1359 Q966,1367 974,1367 L1902,1367 Q1910,1367 1910,1375 L1910,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#91[1] → #67 · DATA</title></path><path class="edge DATA" id="e91i2" d="M1828,388 L1828,430 Q1828,438 1836,438 L1932,438 Q1940,438 1940,446 L1940,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#91[2] → #52 · DATA</title></path><path class="edge DATA" id="e92i1" d="M1910,1513 L1910,1577.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#92[1] → #91 · DATA</title></path><path class="edge DATA" id="e92i2" d="M1980,388 L1980,1515 Q1980,1523 1972,1523 L1948,1523 Q1940,1523 1940,1531 L1940,1577.6666666666667" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#92[2] → #51 · DATA</title></path><path class="edge CTRL" id="e93i0" d="M794,1663 L794,1685 Q794,1693 802,1693 L996,1693 Q1004,1693 1004,1701 L1004,1723" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#93[0] → #74 · CTRL</title></path><path class="edge MEM" id="e93i1" d="M1018,617 L1018,649 Q1018,657 1010,657 L631,657 Q623,657 623,665 L623,893 Q623,901 631,901 L817,901 Q825,901 825,909 L825,1036 Q825,1044 833,1044 L1636,1044 Q1644,1044 1644,1052 L1644,1341.5 Q1644,1347 1638.5,1347 L1638.5,1347 Q1633,1347 1633,1352.5 L1633,1675 Q1633,1683 1625,1683 L1036,1683 Q1028,1683 1028,1691 L1028,1723" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#93[1] → #124 · MEM</title></path><path class="edge DATA" id="e93i2" d="M808,388 L808,420 Q808,428 816,428 L1647,428 Q1655,428 1655,436 L1655,1351.5 Q1655,1357 1649.5,1357 L1649.5,1357 Q1644,1357 1644,1362.5 L1644,1685 Q1644,1693 1636,1693 L1060,1693 Q1052,1693 1052,1701 L1052,1723" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#93[2] → #28 · DATA</title></path><path class="edge DATA" id="e93i3" d="M1910,1633.6666666666667 L1910,1695 Q1910,1703 1902,1703 L1084,1703 Q1076,1703 1076,1711 L1076,1723" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#93[3] → #92 · DATA</title></path><path class="edge MEM" id="e94i1" d="M1118,1337 L1118,1379 Q1118,1387 1110,1387 L710,1387 Q702,1387 702,1395 L702,1705 Q702,1713 710,1713 L917,1713 Q925,1713 925,1721 L925,1915 Q925,1923 933,1923 L971,1923 Q976,1923 976,1928 L976,1933" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#94[1] → #104 · MEM</title></path><path class="edge DATA" id="e94i2" d="M155,388 L155,400 Q155,408 147,408 L43,408 Q35,408 35,416 L35,1126 Q35,1134 43,1134 L662,1134 Q670,1134 670,1142 L670,1439 Q670,1447 678,1447 L705,1447 Q713,1447 713,1455 L713,1695 Q713,1703 721,1703 L928,1703 Q936,1703 936,1711 L936,1905 Q936,1913 944,1913 L988,1913 Q996,1913 996,1921 L996,1933" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#94[2] → #15 · DATA</title></path><path class="edge DATA" id="e94i3" d="M492,228 L492,260 Q492,268 484,268 L65,268 Q57,268 57,276 L57,1106 Q57,1114 65,1114 L694,1114 Q702,1114 702,1122 L702,1369 Q702,1377 710,1377 L947,1377 Q955,1377 955,1385 L955,1535 Q955,1543 963,1543 L982,1543 Q990,1543 990,1551 L990,1665 Q990,1673 982,1673 L955,1673 Q947,1673 947,1681 L947,1895 Q947,1903 955,1903 L1008,1903 Q1016,1903 1016,1911 L1016,1933" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#94[3] → #4 · DATA</title></path><path class="edge DATA" id="e94i4" d="M1028,1883 L1028,1889 Q1028,1893 1032,1893 L1032,1893 Q1036,1893 1036,1897 L1036,1933" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#94[4] → #88 · DATA</title></path><path class="edge DATA" id="e99i1" d="M1574,1337 L1574,1419 Q1574,1427 1582,1427 L1750,1427 Q1758,1427 1758,1435 L1758,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#99[1] → #138 · DATA</title></path><path class="edge DATA" id="e99i2" d="M644,388 L644,410 Q644,418 652,418 L1780,418 Q1788,418 1788,426 L1788,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#99[2] → #46 · DATA</title></path><path class="edge MEM" id="e100i1" d="M1422,1337 L1422,1429 Q1422,1437 1430,1437 L1647,1437 Q1655,1437 1655,1445 L1655,1545 Q1655,1553 1663,1553 L1690,1553 Q1695,1553 1695,1558 L1695,1563" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#100[1] → #132 · MEM</title></path><path class="edge DATA" id="e100i2" d="M155,388 L155,400 Q155,408 163,408 L1658,408 Q1666,408 1666,416 L1666,1535 Q1666,1543 1674,1543 L1707,1543 Q1715,1543 1715,1551 L1715,1563" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#100[2] → #15 · DATA</title></path><path class="edge DATA" id="e100i3" d="M1980,388 L1980,450 Q1980,458 1972,458 L1685,458 Q1677,458 1677,466 L1677,1525 Q1677,1533 1685,1533 L1727,1533 Q1735,1533 1735,1541 L1735,1563" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#100[3] → #51 · DATA</title></path><path class="edge DATA" id="e100i4" d="M1758,1513 L1758,1521.5 Q1758,1523 1756.5,1523 L1756.5,1523 Q1755,1523 1755,1524.5 L1755,1563" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#100[4] → #99 · DATA</title></path><path class="edge DATA" id="e103i1" d="M966,1337 L966,1359 Q966,1367 974,1367 L1040,1367 Q1048,1367 1048,1375 L1048,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#103[1] → #67 · DATA</title></path><path class="edge DATA" id="e103i2" d="M644,388 L644,410 Q644,418 636,418 L76,418 Q68,418 68,426 L68,1096 Q68,1104 76,1104 L715,1104 Q723,1104 723,1112 L723,1399 Q723,1407 731,1407 L1070,1407 Q1078,1407 1078,1415 L1078,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#103[2] → #46 · DATA</title></path><path class="edge MEM" id="e104i1" d="M301,388 L301,420 Q301,428 293,428 L98,428 Q90,428 90,436 L90,1076 Q90,1084 98,1084 L1090,1084 Q1098,1084 1098,1092 L1098,1281" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#104[1] → #16 · MEM</title></path><path class="edge MEM" id="e104i2" d="M996,1986 L996,1991 Q996,1996 1001,1996 L2177,1996 Q2185,1996 2185,1988 L2185,1256 Q2185,1248 2177,1248 L1146,1248 Q1138,1248 1138,1256 L1138,1284" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#104[2] → #94 · MEM</title></path><path class="edge MEM" id="e106i1" d="M834,124 L834,136 Q834,144 826,144 L32,144 Q24,144 24,152 L24,2038 Q24,2046 32,2046 L1947,2046 Q1955,2046 1955,2054 L1955,2074" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#106[1] → #7 · MEM</title></path><path class="edge MEM" id="e106i2" d="M1118,1337 L1118,1379 Q1118,1387 1110,1387 L710,1387 Q702,1387 702,1395 L702,1705 Q702,1713 710,1713 L917,1713 Q925,1713 925,1721 L925,2028 Q925,2036 933,2036 L1965,2036 Q1973,2036 1973,2044 L1973,2074" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#106[2] → #104 · MEM</title></path><path class="edge MEM" id="e106i3" d="M1422,1337 L1422,1429 Q1422,1437 1430,1437 L1983,1437 Q1991,1437 1991,1445 L1991,2074" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#106[3] → #132 · MEM</title></path><path class="edge MEM" id="e106i4" d="M929,388 L929,393 Q929,398 934,398 L2219,398 Q2227,398 2227,406 L2227,2028 Q2227,2036 2219,2036 L2017,2036 Q2009,2036 2009,2044 L2009,2074" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#106[4] → #29 · MEM</title></path><path class="edge MEM" id="e106i5" d="M1018,617 L1018,649 Q1018,657 1010,657 L631,657 Q623,657 623,665 L623,893 Q623,901 631,901 L817,901 Q825,901 825,909 L825,1036 Q825,1044 833,1044 L2230,1044 Q2238,1044 2238,1052 L2238,2038 Q2238,2046 2230,2046 L2035,2046 Q2027,2046 2027,2054 L2027,2074" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#106[5] → #124 · MEM</title></path><path class="edge DATA" id="e112i1" d="M1574,1337 L1574,1419 Q1574,1427 1582,1427 L2065,1427 Q2073,1427 2073,1435 L2073,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#112[1] → #138 · DATA</title></path><path class="edge DATA" id="e112i2" d="M1270,1337 L1270,1409 Q1270,1417 1278,1417 L2095,1417 Q2103,1417 2103,1425 L2103,1457" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#112[2] → #131 · DATA</title></path><path class="edge CTRL" id="e115i0" d="M914,1663 L914,2178" stroke="#b63838" marker-start="url(#arrow-CTRL)" style="opacity: 1;"><title>#115[0] → #75 · CTRL</title></path><path class="edge MEM" id="e115i1" d="M1982,2130 L1982,2135 Q1982,2140 1977,2140 L953,2140 Q945,2140 945,2148 L945,2178" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#115[1] → #106 · MEM</title></path><path class="edge DATA" id="e115i2" d="M2073,1513 L2073,2142 Q2073,2150 2065,2150 L984,2150 Q976,2150 976,2158 L976,2178" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#115[2] → #112 · DATA</title></path><path class="edge MEM" id="e124i1" d="M929,388 L929,393 Q929,398 934,398 L990,398 Q998,398 998,406 L998,561" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#124[1] → #29 · MEM</title></path><path class="edge MEM" id="e124i2" d="M896,994 L896,999 Q896,1004 901,1004 L1406,1004 Q1414,1004 1414,996 L1414,560 Q1414,552 1406,552 L1044,552 Q1038,552 1038,558 L1038,564" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#124[2] → #57 · MEM</title></path><path class="edge DATA" id="e131i1" d="M492,228 L492,260 Q492,268 484,268 L65,268 Q57,268 57,276 L57,430 Q57,438 65,438 L93,438 Q101,438 101,446 L101,1066 Q101,1074 109,1074 L1242,1074 Q1250,1074 1250,1082 L1250,1281" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#131[1] → #4 · DATA</title></path><path class="edge DATA" id="e131i2" d="M1028,1880 L1028,1885 Q1028,1890 1033,1890 L2167,1890 Q2175,1890 2175,1882 L2175,1264 Q2175,1256 2167,1256 L1298,1256 Q1290,1256 1290,1264 L1290,1284" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#131[2] → #88 · DATA</title></path><path class="edge MEM" id="e132i1" d="M301,388 L301,420 Q301,428 309,428 L473,428 Q481,428 481,436 L481,1056 Q481,1064 489,1064 L1394,1064 Q1402,1064 1402,1072 L1402,1281" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#132[1] → #16 · MEM</title></path><path class="edge MEM" id="e132i2" d="M1715,1616 L1715,1621 Q1715,1626 1720,1626 L1837.1666666666665,1626 Q1842,1626 1842,1630.8333333333335 L1842,1630.8333333333335 Q1842,1635.6666666666667 1846.8333333333335,1635.6666666666667 L2157,1635.6666666666667 Q2165,1635.6666666666667 2165,1627.6666666666667 L2165,1272 Q2165,1264 2157,1264 L1450,1264 Q1442,1264 1442,1272 L1442,1284" stroke="#2867b2" marker-start="url(#arrow-MEM)" style="opacity: 1;"><title>#132[2] → #100 · MEM</title></path><path class="edge DATA" id="e138i1" d="M492,228 L492,1046 Q492,1054 500,1054 L1546,1054 Q1554,1054 1554,1062 L1554,1281" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#138[1] → #4 · DATA</title></path><path class="edge DATA" id="e138i2" d="M1758,1510 L1758,1515 Q1758,1520 1763,1520 L2147,1520 Q2155,1520 2155,1512 L2155,1280 Q2155,1272 2147,1272 L1600,1272 Q1594,1272 1594,1278 L1594,1284" stroke="#536477" marker-start="url(#arrow-DATA)" style="opacity: 1;"><title>#138[2] → #99 · DATA</title></path></g><g class="edge-hits"/><g class="parser" style="opacity: 1;"/><g class="nodes"><g class="node" id="n2" data-id="2" transform="translate(654,30)" style="opacity: 1;"><path class="box" d="M0,0H360V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="180" y="18"><tspan>Start</tspan><tspan class="node-id">  #2</tspan></text><text class="type" text-anchor="middle" y="35" x="180">[ Ctrl, MemBot, int]</text><title>#2 Start
+[ Ctrl, MemBot, int]
+
+[0] → — ASSOC
+[1] → — CTRL
+[2] → — CTRL</title><circle class="port" cx="90" cy="-3" r="3" fill="white"/><circle class="port" cx="180" cy="-3" r="3" fill="white"/><circle class="port" cx="270" cy="-3" r="3" fill="white"/><text class="slot" x="90" y="-10" text-anchor="middle">0</text><text class="slot" x="180" y="-10" text-anchor="middle">1</text><text class="slot" x="270" y="-10" text-anchor="middle">2</text></g><g class="node" id="n3" data-id="3" transform="translate(1095.5,2282)" style="opacity: 1;"><path class="box" d="M0,0H72V26H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="36" y="17"><tspan>Stop</tspan><tspan class="node-id">  #3</tspan></text><text class="type" text-anchor="middle" y="35" x="36"/><title>#3 Stop
+Bot
+
+[0] → #115 CTRL</title><circle class="port" cx="36" cy="0" r="3" fill="#536477"/><text class="slot" x="36" y="-7" text-anchor="middle">0</text></g><g class="node" id="n4" data-id="4" transform="translate(432,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #4</tspan></text><text class="type" text-anchor="middle" y="35" x="60">0</text><title>#4 Con
+0
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n5" data-id="5" transform="translate(502,52)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Xctrl</tspan><tspan class="node-id">  #5</tspan></text><text class="type" text-anchor="middle" y="35" x="60">~Ctrl</text><title>#5 Xctrl
+~Ctrl
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n6" data-id="6" transform="translate(654,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$ctrl</tspan><tspan class="node-id">  #6/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#6 $ctrl
+Projection 0 of #2
+Ctrl
+
+[0] → #2 CTRL</title></g><g class="node" id="n7" data-id="7" transform="translate(774,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #7/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#7 $mem
+Projection 1 of #2
+MemBot
+
+[0] → #2 MEM</title></g><g class="node" id="n8" data-id="8" transform="translate(894,74)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>arg</tspan><tspan class="node-id">  #8/2</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#8 arg
+Projection 2 of #2
+int
+
+[0] → #2 DATA</title></g><g class="node" id="n12" data-id="12" transform="translate(280,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #12</tspan></text><text class="type" text-anchor="middle" y="35" x="60">16</text><title>#12 Con
+16
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n13" data-id="13" transform="translate(128,178)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemMerge</tspan><tspan class="node-id">  #13</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#13 MemMerge
+MemBot
+
+[0] → — CTRL
+[1] → — DATA
+[2] → #7 MEM
+[3] → #7 MEM</title><circle class="port" cx="24" cy="-3" r="3" fill="white"/><circle class="port" cx="48" cy="-3" r="3" fill="white"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n14" data-id="14" transform="translate(68,294)" style="opacity: 1;"><path class="box" d="M0,0H293V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="146.5" y="18"><tspan>new_Totals</tspan><tspan class="node-id">  #14</tspan></text><text class="type" text-anchor="middle" y="35" x="146.5">[ *Totals {int !sum; int !visits; }, MemBot]</text><title>#14 new_Totals
+[ *Totals {int !sum; int !visits; }, MemBot]
+
+[0] → #6 CTRL
+[1] → #13 MEM
+[2] → #12 DATA
+[3] → #4 DATA
+[4] → #4 DATA</title><circle class="port" cx="49" cy="-3" r="3" fill="#536477"/><circle class="port" cx="98" cy="-3" r="3" fill="#536477"/><circle class="port" cx="147" cy="-3" r="3" fill="#536477"/><circle class="port" cx="195" cy="-3" r="3" fill="#536477"/><circle class="port" cx="244" cy="-3" r="3" fill="#536477"/><text class="slot" x="49" y="-10" text-anchor="middle">0</text><text class="slot" x="98" y="-10" text-anchor="middle">1</text><text class="slot" x="147" y="-10" text-anchor="middle">2</text><text class="slot" x="195" y="-10" text-anchor="middle">3</text><text class="slot" x="244" y="-10" text-anchor="middle">4</text></g><g class="node" id="n15" data-id="15" transform="translate(68,338)" style="opacity: 1;"><path class="box" d="M0,0H173V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="86.5" y="18"><tspan>Totals</tspan><tspan class="node-id">  #15/0</tspan></text><text class="type" text-anchor="middle" y="35" x="86.5">*Totals {int !sum; int !visits; }</text><title>#15 Totals
+Projection 0 of #14
+*Totals {int !sum; int !visits; }
+
+[0] → #14 DATA</title></g><g class="node" id="n16" data-id="16" transform="translate(241,338)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #16/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#16 $mem
+Projection 1 of #14
+MemBot
+
+[0] → #14 MEM</title></g><g class="node" id="n18" data-id="18" transform="translate(584,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #18</tspan></text><text class="type" text-anchor="middle" y="35" x="60">4</text><title>#18 Con
+4
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n24" data-id="24" transform="translate(916,178)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #24</tspan></text><text class="type" text-anchor="middle" y="35" x="60">40</text><title>#24 Con
+40
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n26" data-id="26" transform="translate(758,178)" style="opacity: 1;"><path class="box" d="M10,0H116L126,10V34L116,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="63" y="18"><tspan>MemMerge</tspan><tspan class="node-id">  #26</tspan></text><text class="type" text-anchor="middle" y="35" x="63">MemBot</text><title>#26 MemMerge
+MemBot
+
+[0] → — CTRL
+[1] → — DATA
+[2] → — DATA
+[3] → — DATA
+[4] → #7 MEM
+[5] → #7 MEM</title><circle class="port" cx="18" cy="-3" r="3" fill="white"/><circle class="port" cx="36" cy="-3" r="3" fill="white"/><circle class="port" cx="54" cy="-3" r="3" fill="white"/><circle class="port" cx="72" cy="-3" r="3" fill="white"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><circle class="port" cx="108" cy="-3" r="3" fill="#536477"/><text class="slot" x="18" y="-10" text-anchor="middle">0</text><text class="slot" x="36" y="-10" text-anchor="middle">1</text><text class="slot" x="54" y="-10" text-anchor="middle">2</text><text class="slot" x="72" y="-10" text-anchor="middle">3</text><text class="slot" x="90" y="-10" text-anchor="middle">4</text><text class="slot" x="108" y="-10" text-anchor="middle">5</text></g><g class="node" id="n27" data-id="27" transform="translate(747,294)" style="opacity: 1;"><path class="box" d="M0,0H242V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="121" y="18"><tspan>new_ary_int</tspan><tspan class="node-id">  #27</tspan></text><text class="type" text-anchor="middle" y="35" x="121">[ *[int] {int #; int ![]; }, MemBot]</text><title>#27 new_ary_int
+[ *[int] {int #; int ![]; }, MemBot]
+
+[0] → #6 CTRL
+[1] → #26 MEM
+[2] → #24 DATA
+[3] → #18 DATA
+[4] → #4 DATA</title><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="81" cy="-3" r="3" fill="#536477"/><circle class="port" cx="121" cy="-3" r="3" fill="#536477"/><circle class="port" cx="161" cy="-3" r="3" fill="#536477"/><circle class="port" cx="202" cy="-3" r="3" fill="#536477"/><text class="slot" x="40" y="-10" text-anchor="middle">0</text><text class="slot" x="81" y="-10" text-anchor="middle">1</text><text class="slot" x="121" y="-10" text-anchor="middle">2</text><text class="slot" x="161" y="-10" text-anchor="middle">3</text><text class="slot" x="202" y="-10" text-anchor="middle">4</text></g><g class="node" id="n28" data-id="28" transform="translate(747,338)" style="opacity: 1;"><path class="box" d="M0,0H122V44H0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="61" y="18"><tspan>[int]</tspan><tspan class="node-id">  #28/0</tspan></text><text class="type" text-anchor="middle" y="35" x="61">*[int] {int #; int ![]; }</text><title>#28 [int]
+Projection 0 of #27
+*[int] {int #; int ![]; }
+
+[0] → #27 DATA</title></g><g class="node" id="n29" data-id="29" transform="translate(869,338)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>$mem</tspan><tspan class="node-id">  #29/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MemBot</text><title>#29 $mem
+Projection 1 of #27
+MemBot
+
+[0] → #27 MEM</title></g><g class="node" id="n32" data-id="32" transform="translate(654,567)" style="opacity: 1;"><path class="box" d="M20,0H100Q120,0 120,20V24Q120,44 100,44H20Q0,44 0,24V20Q0,0 20,0Z" fill="#ffe0ab"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Loop</tspan><tspan class="node-id">  #32</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#32 Loop
+Ctrl
+
+[0] → — ASSOC
+[1] → #6 CTRL
+[2] → #41 CTRL</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n34" data-id="34" transform="translate(806,567)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_i</tspan><tspan class="node-id">  #34</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#34 Phi_i
+int
+
+[0] → #32 ASSOC
+[1] → #4 DATA
+[2] → #60 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #32</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n35" data-id="35" transform="translate(865,683)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>LT</tspan><tspan class="node-id">  #35</tspan></text><text class="type" text-anchor="middle" y="35" x="60">bool</text><title>#35 LT
+bool
+
+[0] → — CTRL
+[1] → #34 DATA
+[2] → #18 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n40" data-id="40" transform="translate(634,787)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>If</tspan><tspan class="node-id">  #40</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[ Ctrl, Ctrl]</text><title>#40 If
+[ Ctrl, Ctrl]
+
+[0] → #32 CTRL
+[1] → #35 DATA</title><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="160" cy="-3" r="3" fill="#536477"/><text class="slot" x="80" y="-10" text-anchor="middle">0</text><text class="slot" x="160" y="-10" text-anchor="middle">1</text></g><g class="node" id="n41" data-id="41" transform="translate(634,831)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>True</tspan><tspan class="node-id">  #41/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#41 True
+Projection 0 of #40
+Ctrl
+
+[0] → #40 CTRL</title></g><g class="node" id="n42" data-id="42" transform="translate(754,831)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>False</tspan><tspan class="node-id">  #42/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#42 False
+Projection 1 of #40
+Ctrl
+
+[0] → #40 CTRL</title></g><g class="node" id="n46" data-id="46" transform="translate(584,338)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #46</tspan></text><text class="type" text-anchor="middle" y="35" x="60">1</text><title>#46 Con
+1
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n51" data-id="51" transform="translate(1920,338)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #51</tspan></text><text class="type" text-anchor="middle" y="35" x="60">8</text><title>#51 Con
+8
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n52" data-id="52" transform="translate(1768,338)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Con</tspan><tspan class="node-id">  #52</tspan></text><text class="type" text-anchor="middle" y="35" x="60">3</text><title>#52 Con
+3
+
+[0] → #2 ASSOC</title><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><text class="slot" x="60" y="-10" text-anchor="middle">0</text></g><g class="node" id="n53" data-id="53" transform="translate(1109,683)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Shl</tspan><tspan class="node-id">  #53</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#53 Shl
+int
+
+[0] → — CTRL
+[1] → #34 DATA
+[2] → #52 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n54" data-id="54" transform="translate(1109,801.6666666666667)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #54</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#54 Add
+int
+
+[0] → — CTRL
+[1] → #53 DATA
+[2] → #51 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n56" data-id="56" transform="translate(1261,801.6666666666667)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #56</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#56 Add
+int
+
+[0] → — CTRL
+[1] → #34 DATA
+[2] → #8 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n57" data-id="57" transform="translate(836,947)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>st_ary</tspan><tspan class="node-id">  #57</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#5:Bot</text><title>#57 st_ary
+MEM#5:Bot
+
+[0] → #41 CTRL
+[1] → #124 MEM
+[2] → #28 DATA
+[3] → #54 DATA
+[4] → #56 DATA</title><circle class="port" cx="20" cy="-3" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="100" cy="-3" r="3" fill="#536477"/><text class="slot" x="20" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="60" y="-10" text-anchor="middle">2</text><text class="slot" x="80" y="-10" text-anchor="middle">3</text><text class="slot" x="100" y="-10" text-anchor="middle">4</text></g><g class="node" id="n60" data-id="60" transform="translate(725,683)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #60</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#60 Add
+int
+
+[0] → — CTRL
+[1] → #34 DATA
+[2] → #46 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n65" data-id="65" transform="translate(754,1287)" style="opacity: 1;"><path class="box" d="M20,0H100Q120,0 120,20V24Q120,44 100,44H20Q0,44 0,24V20Q0,0 20,0Z" fill="#ffe0ab"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Loop</tspan><tspan class="node-id">  #65</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#65 Loop
+Ctrl
+
+[0] → — ASSOC
+[1] → #42 CTRL
+[2] → #74 CTRL</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n67" data-id="67" transform="translate(906,1287)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_i</tspan><tspan class="node-id">  #67</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#67 Phi_i
+int
+
+[0] → #65 ASSOC
+[1] → #4 DATA
+[2] → #103 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #65</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n68" data-id="68" transform="translate(825,1463)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>LT</tspan><tspan class="node-id">  #68</tspan></text><text class="type" text-anchor="middle" y="35" x="60">bool</text><title>#68 LT
+bool
+
+[0] → — CTRL
+[1] → #67 DATA
+[2] → #18 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n73" data-id="73" transform="translate(734,1569)" style="opacity: 1;"><path class="box" d="M0,0H240V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="120" y="18"><tspan>If</tspan><tspan class="node-id">  #73</tspan></text><text class="type" text-anchor="middle" y="35" x="120">[ Ctrl, Ctrl]</text><title>#73 If
+[ Ctrl, Ctrl]
+
+[0] → #65 CTRL
+[1] → #68 DATA</title><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="160" cy="-3" r="3" fill="#536477"/><text class="slot" x="80" y="-10" text-anchor="middle">0</text><text class="slot" x="160" y="-10" text-anchor="middle">1</text></g><g class="node" id="n74" data-id="74" transform="translate(734,1613)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>True</tspan><tspan class="node-id">  #74/0</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#74 True
+Projection 0 of #73
+Ctrl
+
+[0] → #73 CTRL</title></g><g class="node" id="n75" data-id="75" transform="translate(854,1613)" style="opacity: 1;"><path class="box" d="M0,0H120V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>False</tspan><tspan class="node-id">  #75/1</tspan></text><text class="type" text-anchor="middle" y="35" x="60">Ctrl</text><title>#75 False
+Projection 1 of #73
+Ctrl
+
+[0] → #73 CTRL</title></g><g class="node" id="n88" data-id="88" transform="translate(968,1833)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #88</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#88 Add
+int
+
+[0] → — CTRL
+[1] → #131 DATA
+[2] → #93 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n91" data-id="91" transform="translate(1850,1463)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Shl</tspan><tspan class="node-id">  #91</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#91 Shl
+int
+
+[0] → — CTRL
+[1] → #67 DATA
+[2] → #52 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n92" data-id="92" transform="translate(1850,1583.6666666666667)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #92</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#92 Add
+int
+
+[0] → — CTRL
+[1] → #91 DATA
+[2] → #51 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n93" data-id="93" transform="translate(980,1729)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>ld_ary</tspan><tspan class="node-id">  #93</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#93 ld_ary
+int
+
+[0] → #74 CTRL
+[1] → #124 MEM
+[2] → #28 DATA
+[3] → #92 DATA</title><circle class="port" cx="24" cy="-3" r="3" fill="#536477"/><circle class="port" cx="48" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="96" cy="-3" r="3" fill="#536477"/><text class="slot" x="24" y="-10" text-anchor="middle">0</text><text class="slot" x="48" y="-10" text-anchor="middle">1</text><text class="slot" x="72" y="-10" text-anchor="middle">2</text><text class="slot" x="96" y="-10" text-anchor="middle">3</text></g><g class="node" id="n94" data-id="94" transform="translate(936,1939)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>st_sum</tspan><tspan class="node-id">  #94</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#2:Bot</text><title>#94 st_sum
+MEM#2:Bot
+
+[0] → — CTRL
+[1] → #104 MEM
+[2] → #15 DATA
+[3] → #4 DATA
+[4] → #88 DATA</title><circle class="port" cx="20" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="100" cy="-3" r="3" fill="#536477"/><text class="slot" x="20" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="60" y="-10" text-anchor="middle">2</text><text class="slot" x="80" y="-10" text-anchor="middle">3</text><text class="slot" x="100" y="-10" text-anchor="middle">4</text></g><g class="node" id="n99" data-id="99" transform="translate(1698,1463)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #99</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#99 Add
+int
+
+[0] → — CTRL
+[1] → #138 DATA
+[2] → #46 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n100" data-id="100" transform="translate(1655,1569)" style="opacity: 1;"><path class="box" d="M10,0H110L120,10V34L110,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>st_visits</tspan><tspan class="node-id">  #100</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#3:Bot</text><title>#100 st_visits
+MEM#3:Bot
+
+[0] → — CTRL
+[1] → #132 MEM
+[2] → #15 DATA
+[3] → #51 DATA
+[4] → #99 DATA</title><circle class="port" cx="20" cy="-3" r="3" fill="white"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><circle class="port" cx="100" cy="-3" r="3" fill="#536477"/><text class="slot" x="20" y="-10" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="60" y="-10" text-anchor="middle">2</text><text class="slot" x="80" y="-10" text-anchor="middle">3</text><text class="slot" x="100" y="-10" text-anchor="middle">4</text></g><g class="node" id="n103" data-id="103" transform="translate(988,1463)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #103</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#103 Add
+int
+
+[0] → — CTRL
+[1] → #67 DATA
+[2] → #46 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n104" data-id="104" transform="translate(1058,1287)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemPhi_2</tspan><tspan class="node-id">  #104</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#2:Bot</text><title>#104 MemPhi_2
+MEM#2:Bot
+
+[0] → #65 ASSOC
+[1] → #16 MEM
+[2] → #94 MEM</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #65</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n106" data-id="106" transform="translate(1919,2080)" style="opacity: 1;"><path class="box" d="M10,0H116L126,10V34L116,44H10L0,34V10Z" fill="#dcecff"/><text class="label" text-anchor="middle" x="63" y="18"><tspan>MemMerge</tspan><tspan class="node-id">  #106</tspan></text><text class="type" text-anchor="middle" y="35" x="63">MemBot</text><title>#106 MemMerge
+MemBot
+
+[0] → — CTRL
+[1] → #7 MEM
+[2] → #104 MEM
+[3] → #132 MEM
+[4] → #29 MEM
+[5] → #124 MEM</title><circle class="port" cx="18" cy="-3" r="3" fill="white"/><circle class="port" cx="36" cy="-3" r="3" fill="#536477"/><circle class="port" cx="54" cy="-3" r="3" fill="#536477"/><circle class="port" cx="72" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><circle class="port" cx="108" cy="-3" r="3" fill="#536477"/><text class="slot" x="18" y="-10" text-anchor="middle">0</text><text class="slot" x="36" y="-10" text-anchor="middle">1</text><text class="slot" x="54" y="-10" text-anchor="middle">2</text><text class="slot" x="72" y="-10" text-anchor="middle">3</text><text class="slot" x="90" y="-10" text-anchor="middle">4</text><text class="slot" x="108" y="-10" text-anchor="middle">5</text></g><g class="node" id="n112" data-id="112" transform="translate(2013,1463)" style="opacity: 1;"><path class="box" d="M14,0H106Q120,0 120,14V30Q120,44 106,44H14Q0,44 0,30V14Q0,0 14,0Z" fill="#edf3f7"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Add</tspan><tspan class="node-id">  #112</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#112 Add
+int
+
+[0] → — CTRL
+[1] → #138 DATA
+[2] → #131 DATA</title><circle class="port" cx="30" cy="-3" r="3" fill="white"/><circle class="port" cx="60" cy="-3" r="3" fill="#536477"/><circle class="port" cx="90" cy="-3" r="3" fill="#536477"/><text class="slot" x="30" y="-10" text-anchor="middle">0</text><text class="slot" x="60" y="-10" text-anchor="middle">1</text><text class="slot" x="90" y="-10" text-anchor="middle">2</text></g><g class="node" id="n115" data-id="115" transform="translate(883,2184)" style="opacity: 1;"><path class="box" d="M0,0H124V44H0Z" fill="#fff1c4"/><text class="label" text-anchor="middle" x="62" y="18"><tspan>Return</tspan><tspan class="node-id">  #115</tspan></text><text class="type" text-anchor="middle" y="35" x="62">[ Ctrl, MemBot, int]</text><title>#115 Return
+[ Ctrl, MemBot, int]
+
+[0] → #75 CTRL
+[1] → #106 MEM
+[2] → #112 DATA</title><circle class="port" cx="31" cy="-3" r="3" fill="#536477"/><circle class="port" cx="62" cy="-3" r="3" fill="#536477"/><circle class="port" cx="93" cy="-3" r="3" fill="#536477"/><text class="slot" x="31" y="-10" text-anchor="middle">0</text><text class="slot" x="62" y="-10" text-anchor="middle">1</text><text class="slot" x="93" y="-10" text-anchor="middle">2</text></g><g class="node" id="n124" data-id="124" transform="translate(958,567)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemPhi_5</tspan><tspan class="node-id">  #124</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#5:Bot</text><title>#124 MemPhi_5
+MEM#5:Bot
+
+[0] → #32 ASSOC
+[1] → #29 MEM
+[2] → #57 MEM</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #32</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n131" data-id="131" transform="translate(1210,1287)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_sum</tspan><tspan class="node-id">  #131</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#131 Phi_sum
+int
+
+[0] → #65 ASSOC
+[1] → #4 DATA
+[2] → #88 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #65</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n132" data-id="132" transform="translate(1362,1287)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>MemPhi_3</tspan><tspan class="node-id">  #132</tspan></text><text class="type" text-anchor="middle" y="35" x="60">MEM#3:Bot</text><title>#132 MemPhi_3
+MEM#3:Bot
+
+[0] → #65 ASSOC
+[1] → #16 MEM
+[2] → #100 MEM</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #65</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g><g class="node" id="n138" data-id="138" transform="translate(1514,1287)" style="opacity: 1;"><path class="box" d="M12,0H108L120,22L108,44H12L0,22Z" fill="#f5e4fa"/><text class="label" text-anchor="middle" x="60" y="18"><tspan>Phi_visits</tspan><tspan class="node-id">  #138</tspan></text><text class="type" text-anchor="middle" y="35" x="60">int</text><title>#138 Phi_visits
+int
+
+[0] → #65 ASSOC
+[1] → #4 DATA
+[2] → #99 DATA</title><circle class="port" cx="-3" cy="22" r="3" fill="#536477"/><circle class="port" cx="40" cy="-3" r="3" fill="#536477"/><circle class="port" cx="80" cy="-3" r="3" fill="#536477"/><path class="reg" fill="none" stroke="#b63838" d="M-3,22H-18m4,-3l-4,3l4,3"><title>[0] → #65</title></path><text class="slot" x="-10" y="15" text-anchor="middle">0</text><text class="slot" x="40" y="-10" text-anchor="middle">1</text><text class="slot" x="80" y="-10" text-anchor="middle">2</text></g></g><g class="region-heads" style="opacity: 1;"><g class="region-head" transform="translate(610,473)"><text class="label" x="26" y="17"><tspan>Loop</tspan><tspan class="node-id">  #32</tspan></text><title>Loop · 12 nodes</title><g class="fold-btn" role="button" tabindex="0" transform="translate(4,4)" aria-label="Fold region #32"><rect width="16" height="16" rx="2"/><text x="8" y="12" text-anchor="middle">−</text><title>Fold region</title></g></g><g class="region-head" transform="translate(658,1149)"><text class="label" x="26" y="17"><tspan>Loop</tspan><tspan class="node-id">  #65</tspan></text><title>Loop · 19 nodes</title><g class="fold-btn" role="button" tabindex="0" transform="translate(4,4)" aria-label="Fold region #65"><rect width="16" height="16" rx="2"/><text x="8" y="12" text-anchor="middle">−</text><title>Fold region</title></g></g></g><g class="shortcuts" style="opacity: 1;"/><g class="peep-ghosts" pointer-events="none"/></g></svg>
diff --git a/docs/2026_REBASE/assets/rich-lattice.gv b/docs/2026_REBASE/assets/rich-lattice.gv
new file mode 100644
index 00000000..848bca82
--- /dev/null
+++ b/docs/2026_REBASE/assets/rich-lattice.gv
@@ -0,0 +1,404 @@
+digraph RichLattice {
+graph [bgcolor="transparent", ranksep=0.35, nodesep=0.12, pad=0.08];
+node [shape=box, style="rounded,filled", fontname="Arial", fontsize=10, margin="0.06,0.04", color="#647674", penwidth=0.65];
+edge [arrowhead=none, color="#899895", penwidth=0.65];
+n0 [label="BOTTOM", tooltip="Type: Bot", fillcolor="#172e35", fontcolor="white"];
+n1 [label="Ctrl", tooltip="Type: Ctrl", fillcolor="#faedce", fontcolor="#172e35"];
+n2 [label="null", tooltip="Type: null", fillcolor="#faedce", fontcolor="#172e35"];
+n3 [label="ptr", tooltip="TypePtr: ptr", fillcolor="#cce4d6", fontcolor="#172e35"];
+n4 [label="nptr", tooltip="TypePtr: nptr", fillcolor="#cce4d6", fontcolor="#172e35"];
+n5 [label="i32", tooltip="TypeInteger: i32", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n6 [label="i64", tooltip="TypeInteger: i64", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n7 [label="bool", tooltip="TypeInteger: bool", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n8 [label="i1", tooltip="TypeInteger: i1", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n9 [label="u8", tooltip="TypeInteger: u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n10 [label="0", tooltip="TypeInteger: 0", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n11 [label="bool", tooltip="TypeInteger: bool", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n12 [label="u8", tooltip="TypeInteger: u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n13 [label="[1-255]", tooltip="TypeInteger: [1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n14 [label="[-255-0]", tooltip="TypeInteger: [-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n15 [label="[-255--1]", tooltip="TypeInteger: [-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n16 [label="u8", tooltip="TypeInteger: u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n17 [label="[1-255]", tooltip="TypeInteger: [1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n18 [label="[-255-0]", tooltip="TypeInteger: [-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n19 [label="[-255--1]", tooltip="TypeInteger: [-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n20 [label="u8", tooltip="TypeInteger: u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n21 [label="[1-255]", tooltip="TypeInteger: [1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n22 [label="[-255-0]", tooltip="TypeInteger: [-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n23 [label="[-255--1]", tooltip="TypeInteger: [-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n24 [label="[1-255]", tooltip="TypeInteger: [1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n25 [label="[-255-0]", tooltip="TypeInteger: [-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n26 [label="[-255--1]", tooltip="TypeInteger: [-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n27 [label="flt", tooltip="TypeFloat: flt", fillcolor="#c7eee9", fontcolor="#172e35"];
+n28 [label="f32", tooltip="TypeFloat: f32", fillcolor="#c7eee9", fontcolor="#172e35"];
+n29 [label="3.141592653589793", tooltip="TypeFloat: 3.141592653589793", fillcolor="#c7eee9", fontcolor="#172e35"];
+n30 [label="*void", tooltip="TypeMemPtr: *void", fillcolor="#cce4d6", fontcolor="#172e35"];
+n31 [label="PtrBot", tooltip="TypeMemPtr: PtrBot", fillcolor="#cce4d6", fontcolor="#172e35"];
+n32 [label="*test", tooltip="TypeMemPtr: *test {null !test; }", fillcolor="#cce4d6", fontcolor="#172e35"];
+n33 [label="*test", tooltip="TypeMemPtr: *test {null !test; }", fillcolor="#cce4d6", fontcolor="#172e35"];
+n34 [label="{0}", tooltip="TypeFunPtr: { i64 f32 -> i64 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n35 [label="{b11}", tooltip="TypeFunPtr: { i64 f32 -> i64 #b11}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n36 [label="FunBot", tooltip="TypeFunPtr: FunBot", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n37 [label="{ALL}", tooltip="TypeFunPtr: { i64 -> Bot #ALL}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n38 [label="{ALL}", tooltip="TypeFunPtr: { i64 i64 -> PtrBot #ALL}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n39 [label="{0}", tooltip="TypeFunPtr: { i64 -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n40 [label="{0}", tooltip="TypeFunPtr: { -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n41 [label="{0}", tooltip="TypeFunPtr: { Top i64 -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n42 [label="{0}", tooltip="TypeFunPtr: { i64 -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n43 [label="{0}", tooltip="TypeFunPtr: { -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n44 [label="{0}", tooltip="TypeFunPtr: { Bot i64 -> i32 #0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n45 [label="#2:null", tooltip="TypeMem: #2:null", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n46 [label="#2:0", tooltip="TypeMem: #2:0", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n47 [label="MemBot", tooltip="TypeMem: MemBot", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n48 [label="!test", tooltip="Field: !test:-2 : null", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n49 [label="test", tooltip="Field: test:-2 : null", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n50 [label="!flt ", tooltip="Field: !flt :-2 : f32", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n51 [label="StructBot", tooltip="TypeStruct: StructBot", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n52 [label="test", tooltip="TypeStruct: test {null !test; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n53 [label="[]i64", tooltip="TypeStruct: []i64", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n54 [label="[]u8", tooltip="TypeStruct: []u8", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n55 [label="[]u8", tooltip="TypeStruct: [\"abc\"]", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n56 [label="%SINT", tooltip="TypeStruct: %SINT {... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n57 [label="%SFLT", tooltip="TypeStruct: %SFLT {... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n58 [label="%SINT", tooltip="TypeStruct: %SINT {u32 !a; *%SFLT {... } !s2; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n59 [label="%SFLT", tooltip="TypeStruct: %SFLT {f32 !b; *%SINT {u32 !a; *%SFLT {... } !s2; ... } !s1; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n60 [label="%SFLT", tooltip="TypeStruct: %SFLT {f32 !b; *%SINT {u32 !a; *%SFLT !s2; } !s1; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n61 [label="%SINT", tooltip="TypeStruct: %SINT {u32 !a; *%SFLT {f32 !b; *%SINT !s1; } !s2; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n62 [label="calloc", tooltip="TypeStruct: calloc {{ i64 i64 -> PtrBot #ALL}? calloc; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n63 [label="[BOT]", tooltip="TypeTuple: [BOT]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n64 [label="[ i64, *test {null !test; }]", tooltip="TypeTuple: [ i64, *test {null !test; }]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n65 [label="[ Ctrl, MemTop, i64]", tooltip="TypeTuple: [ Ctrl, MemTop, i64]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n66 [label="[ Ctrl, ~Ctrl]", tooltip="TypeTuple: [ Ctrl, ~Ctrl]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n67 [label="$[ALL]", tooltip="TypeRPC: $[ALL]", fillcolor="#f4d4b5", fontcolor="#172e35"];
+n68 [label="$[2]", tooltip="TypeRPC: $[2]", fillcolor="#f4d4b5", fontcolor="#172e35"];
+n69 [label="[\"abc\"]", tooltip="TypeConAryB: [\"abc\"]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n70 [label="[\"abcd\"]", tooltip="TypeConAryB: [\"abcd\"]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n71 [label="[i32]", tooltip="TypeConAryI: [i32]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n72 [label="TOP", tooltip="Type: Top", fillcolor="#172e35", fontcolor="white"];
+n73 [label="~Ctrl", tooltip="Type: ~Ctrl", fillcolor="#faedce", fontcolor="#172e35"];
+n74 [label="~nil", tooltip="Type: ~nil", fillcolor="#faedce", fontcolor="#172e35"];
+n75 [label="~ptr", tooltip="TypePtr: ~ptr", fillcolor="#cce4d6", fontcolor="#172e35"];
+n76 [label="~nptr", tooltip="TypePtr: ~nptr", fillcolor="#cce4d6", fontcolor="#172e35"];
+n77 [label="~i32", tooltip="TypeInteger: ~i32", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n78 [label="~i64", tooltip="TypeInteger: ~i64", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n79 [label="~bool", tooltip="TypeInteger: ~bool", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n80 [label="~i1", tooltip="TypeInteger: ~i1", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n81 [label="~u8", tooltip="TypeInteger: ~u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n82 [label="0", tooltip="TypeInteger: 0", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n83 [label="~bool", tooltip="TypeInteger: ~bool", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n84 [label="~u8", tooltip="TypeInteger: ~u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n85 [label="~[1-255]", tooltip="TypeInteger: ~[1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n86 [label="~[-255-0]", tooltip="TypeInteger: ~[-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n87 [label="~[-255--1]", tooltip="TypeInteger: ~[-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n88 [label="~u8", tooltip="TypeInteger: ~u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n89 [label="~[1-255]", tooltip="TypeInteger: ~[1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n90 [label="~[-255-0]", tooltip="TypeInteger: ~[-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n91 [label="~[-255--1]", tooltip="TypeInteger: ~[-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n92 [label="~u8", tooltip="TypeInteger: ~u8", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n93 [label="~[1-255]", tooltip="TypeInteger: ~[1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n94 [label="~[-255-0]", tooltip="TypeInteger: ~[-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n95 [label="~[-255--1]", tooltip="TypeInteger: ~[-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n96 [label="~[1-255]", tooltip="TypeInteger: ~[1-255]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n97 [label="~[-255-0]", tooltip="TypeInteger: ~[-255-0]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n98 [label="~[-255--1]", tooltip="TypeInteger: ~[-255--1]", fillcolor="#d3e7f5", fontcolor="#172e35"];
+n99 [label="~flt", tooltip="TypeFloat: ~flt", fillcolor="#c7eee9", fontcolor="#172e35"];
+n100 [label="~f32", tooltip="TypeFloat: ~f32", fillcolor="#c7eee9", fontcolor="#172e35"];
+n101 [label="~*StructTop", tooltip="TypeMemPtr: ~*StructTop", fillcolor="#cce4d6", fontcolor="#172e35"];
+n102 [label="PtrTop", tooltip="TypeMemPtr: PtrTop", fillcolor="#cce4d6", fontcolor="#172e35"];
+n103 [label="~*test", tooltip="TypeMemPtr: ~*test {~nil test; ... }", fillcolor="#cce4d6", fontcolor="#172e35"];
+n104 [label="~*test", tooltip="TypeMemPtr: ~*test {~nil test; ... }", fillcolor="#cce4d6", fontcolor="#172e35"];
+n105 [label="{~0}", tooltip="TypeFunPtr: ~{ ~i64 ~f32 -> ~i64 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n106 [label="{~b11}", tooltip="TypeFunPtr: ~{ ~i64 ~f32 -> ~i64 #~b11}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n107 [label="FunTop", tooltip="TypeFunPtr: FunTop", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n108 [label="{~ALL}", tooltip="TypeFunPtr: ~{ ~i64 -> Top #~ALL}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n109 [label="{~ALL}", tooltip="TypeFunPtr: ~{ ~i64 ~i64 -> PtrTop #~ALL}?", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n110 [label="{~0}", tooltip="TypeFunPtr: ~{ ~i64 -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n111 [label="{~0}", tooltip="TypeFunPtr: ~{ -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n112 [label="{~0}", tooltip="TypeFunPtr: ~{ Bot ~i64 -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n113 [label="{~0}", tooltip="TypeFunPtr: ~{ ~i64 -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n114 [label="{~0}", tooltip="TypeFunPtr: ~{ -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n115 [label="{~0}", tooltip="TypeFunPtr: ~{ Top ~i64 -> ~i32 #~0}", fillcolor="#dfd0ef", fontcolor="#172e35"];
+n116 [label="#2:~nil", tooltip="TypeMem: #2:~nil", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n117 [label="#2:0", tooltip="TypeMem: #2:0", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n118 [label="MemTop", tooltip="TypeMem: MemTop", fillcolor="#a9c9e5", fontcolor="#172e35"];
+n119 [label="test", tooltip="Field: test:-2 : ~nil", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n120 [label="!test", tooltip="Field: !test:-2 : ~nil", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n121 [label="flt ", tooltip="Field: flt :-2 : ~f32", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n122 [label="StructTop", tooltip="TypeStruct: StructTop", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n123 [label="test", tooltip="TypeStruct: test {~nil test; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n124 [label="[]i64", tooltip="TypeStruct: []i64", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n125 [label="[]u8", tooltip="TypeStruct: []u8", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n126 [label="[]u8", tooltip="TypeStruct: [\"abc\"]", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n127 [label="%SINT", tooltip="TypeStruct: %SINT {}", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n128 [label="%SFLT", tooltip="TypeStruct: %SFLT {}", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n129 [label="%SINT", tooltip="TypeStruct: %SINT {~u32 a; ~*%SFLT {} s2; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n130 [label="%SFLT", tooltip="TypeStruct: %SFLT {~f32 b; ~*%SINT {~u32 a; ~*%SFLT {} s2; } s1; }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n131 [label="%SFLT", tooltip="TypeStruct: %SFLT {~f32 b; ~*%SINT {~u32 a; ~*%SFLT s2; ... } s1; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n132 [label="%SINT", tooltip="TypeStruct: %SINT {~u32 a; ~*%SFLT {~f32 b; ~*%SINT s1; ... } s2; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n133 [label="calloc", tooltip="TypeStruct: calloc {~{ ~i64 ~i64 -> PtrTop #~ALL}? !calloc; ... }", fillcolor="#e0ebc8", fontcolor="#172e35"];
+n134 [label="[TOP]", tooltip="TypeTuple: [TOP]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n135 [label="[ ~i64, ~*test {~nil test; ... }]", tooltip="TypeTuple: [ ~i64, ~*test {~nil test; ... }]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n136 [label="[ ~Ctrl, MemBot, ~i64]", tooltip="TypeTuple: [ ~Ctrl, MemBot, ~i64]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n137 [label="[ ~Ctrl, Ctrl]", tooltip="TypeTuple: [ ~Ctrl, Ctrl]", fillcolor="#f2d7e4", fontcolor="#172e35"];
+n138 [label="$[]", tooltip="TypeRPC: $[]", fillcolor="#f4d4b5", fontcolor="#172e35"];
+n139 [label="$[-2]", tooltip="TypeRPC: $[-2]", fillcolor="#f4d4b5", fontcolor="#172e35"];
+n140 [label="[\"abc\"]", tooltip="TypeConAryB: [\"abc\"]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n141 [label="[\"abcd\"]", tooltip="TypeConAryB: [\"abcd\"]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n142 [label="[i32]", tooltip="TypeConAryI: [i32]", fillcolor="#d9d5cc", fontcolor="#172e35"];
+n1 -> n0;
+n2 -> n31;
+n2 -> n35;
+n2 -> n37;
+n2 -> n38;
+n3 -> n0;
+n4 -> n3;
+n5 -> n6;
+n6 -> n0;
+n7 -> n9;
+n8 -> n25;
+n9 -> n5;
+n10 -> n11;
+n10 -> n12;
+n10 -> n14;
+n10 -> n82;
+n11 -> n7;
+n11 -> n20;
+n12 -> n16;
+n13 -> n12;
+n13 -> n17;
+n14 -> n18;
+n15 -> n14;
+n15 -> n19;
+n16 -> n20;
+n17 -> n16;
+n17 -> n21;
+n18 -> n22;
+n19 -> n18;
+n19 -> n23;
+n20 -> n9;
+n21 -> n20;
+n21 -> n24;
+n22 -> n25;
+n23 -> n22;
+n23 -> n26;
+n24 -> n9;
+n25 -> n5;
+n26 -> n25;
+n27 -> n0;
+n28 -> n27;
+n29 -> n27;
+n30 -> n4;
+n30 -> n31;
+n31 -> n3;
+n32 -> n33;
+n33 -> n30;
+n34 -> n4;
+n34 -> n35;
+n35 -> n36;
+n36 -> n3;
+n37 -> n36;
+n38 -> n36;
+n39 -> n34;
+n39 -> n37;
+n39 -> n42;
+n39 -> n44;
+n40 -> n39;
+n40 -> n41;
+n41 -> n42;
+n41 -> n44;
+n42 -> n43;
+n43 -> n4;
+n43 -> n36;
+n44 -> n43;
+n45 -> n47;
+n46 -> n117;
+n47 -> n0;
+n48 -> n49;
+n49 -> n0;
+n50 -> n0;
+n51 -> n0;
+n52 -> n51;
+n53 -> n51;
+n54 -> n51;
+n55 -> n51;
+n56 -> n51;
+n57 -> n51;
+n58 -> n56;
+n59 -> n57;
+n60 -> n59;
+n61 -> n58;
+n62 -> n51;
+n63 -> n0;
+n64 -> n63;
+n65 -> n63;
+n66 -> n63;
+n67 -> n0;
+n68 -> n67;
+n69 -> n13;
+n69 -> n140;
+n70 -> n13;
+n70 -> n141;
+n71 -> n13;
+n71 -> n142;
+n72 -> n48;
+n72 -> n50;
+n72 -> n73;
+n72 -> n75;
+n72 -> n78;
+n72 -> n99;
+n72 -> n118;
+n72 -> n120;
+n72 -> n121;
+n72 -> n122;
+n72 -> n134;
+n72 -> n138;
+n73 -> n1;
+n74 -> n4;
+n75 -> n76;
+n75 -> n102;
+n75 -> n107;
+n76 -> n2;
+n76 -> n40;
+n76 -> n101;
+n76 -> n105;
+n76 -> n114;
+n77 -> n81;
+n77 -> n97;
+n78 -> n77;
+n79 -> n10;
+n79 -> n13;
+n79 -> n83;
+n80 -> n10;
+n80 -> n15;
+n81 -> n79;
+n81 -> n92;
+n81 -> n96;
+n82 -> n7;
+n82 -> n8;
+n83 -> n11;
+n83 -> n17;
+n83 -> n18;
+n83 -> n82;
+n84 -> n82;
+n84 -> n85;
+n85 -> n7;
+n85 -> n140;
+n85 -> n141;
+n85 -> n142;
+n86 -> n82;
+n86 -> n87;
+n87 -> n8;
+n87 -> n26;
+n88 -> n22;
+n88 -> n84;
+n88 -> n89;
+n89 -> n11;
+n89 -> n21;
+n89 -> n85;
+n90 -> n11;
+n90 -> n86;
+n90 -> n91;
+n91 -> n23;
+n91 -> n87;
+n92 -> n83;
+n92 -> n88;
+n92 -> n93;
+n93 -> n17;
+n93 -> n89;
+n94 -> n16;
+n94 -> n90;
+n94 -> n95;
+n95 -> n19;
+n95 -> n91;
+n96 -> n69;
+n96 -> n70;
+n96 -> n71;
+n96 -> n93;
+n97 -> n80;
+n97 -> n94;
+n97 -> n98;
+n98 -> n15;
+n98 -> n95;
+n99 -> n29;
+n99 -> n100;
+n100 -> n28;
+n101 -> n32;
+n101 -> n104;
+n102 -> n74;
+n102 -> n101;
+n103 -> n30;
+n104 -> n103;
+n105 -> n110;
+n106 -> n74;
+n106 -> n105;
+n107 -> n38;
+n107 -> n40;
+n107 -> n106;
+n107 -> n108;
+n107 -> n109;
+n107 -> n114;
+n108 -> n42;
+n108 -> n74;
+n108 -> n110;
+n109 -> n36;
+n109 -> n74;
+n110 -> n111;
+n111 -> n4;
+n111 -> n36;
+n112 -> n111;
+n113 -> n37;
+n113 -> n110;
+n113 -> n112;
+n114 -> n113;
+n114 -> n115;
+n115 -> n110;
+n115 -> n112;
+n116 -> n47;
+n117 -> n47;
+n118 -> n45;
+n118 -> n46;
+n118 -> n116;
+n119 -> n0;
+n120 -> n119;
+n121 -> n0;
+n122 -> n52;
+n122 -> n53;
+n122 -> n54;
+n122 -> n55;
+n122 -> n62;
+n122 -> n123;
+n122 -> n124;
+n122 -> n125;
+n122 -> n126;
+n122 -> n127;
+n122 -> n128;
+n122 -> n133;
+n123 -> n51;
+n124 -> n51;
+n125 -> n51;
+n126 -> n51;
+n127 -> n61;
+n127 -> n129;
+n128 -> n60;
+n128 -> n130;
+n129 -> n132;
+n130 -> n131;
+n131 -> n57;
+n132 -> n56;
+n133 -> n51;
+n134 -> n64;
+n134 -> n65;
+n134 -> n66;
+n134 -> n135;
+n134 -> n136;
+n134 -> n137;
+n135 -> n63;
+n136 -> n63;
+n137 -> n63;
+n138 -> n68;
+n138 -> n139;
+n139 -> n67;
+n140 -> n24;
+n141 -> n24;
+n142 -> n24;
+}
diff --git a/docs/2026_REBASE/assets/rich-lattice.svg b/docs/2026_REBASE/assets/rich-lattice.svg
new file mode 100644
index 00000000..2aecb147
--- /dev/null
+++ b/docs/2026_REBASE/assets/rich-lattice.svg
@@ -0,0 +1,2579 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 12.2.0 (20241103.1931)
+ -->
+<!-- Title: RichLattice Pages: 1 -->
+<svg width="2868pt" height="841pt"
+ viewBox="0.00 0.00 2867.52 840.52" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(5.76 834.76)">
+<title>RichLattice</title>
+<!-- n0 -->
+<g id="node1" class="node">
+<title>n0</title>
+<g id="a_node1"><a xlink:title="Type: Bot">
+<path fill="#172e35" stroke="#647674" stroke-width="0.65" d="M1457,-36C1457,-36 1427,-36 1427,-36 1421,-36 1415,-30 1415,-24 1415,-24 1415,-12 1415,-12 1415,-6 1421,0 1427,0 1427,0 1457,0 1457,0 1463,0 1469,-6 1469,-12 1469,-12 1469,-24 1469,-24 1469,-30 1463,-36 1457,-36"/>
+<text text-anchor="middle" x="1442" y="-14.5" font-family="Arial" font-size="10.00" fill="white">BOTTOM</text>
+</a>
+</g>
+</g>
+<!-- n1 -->
+<g id="node2" class="node">
+<title>n1</title>
+<g id="a_node2"><a xlink:title="Type: Ctrl">
+<path fill="#faedce" stroke="#647674" stroke-width="0.65" d="M744,-158C744,-158 714,-158 714,-158 708,-158 702,-152 702,-146 702,-146 702,-134 702,-134 702,-128 708,-122 714,-122 714,-122 744,-122 744,-122 750,-122 756,-128 756,-134 756,-134 756,-146 756,-146 756,-152 750,-158 744,-158"/>
+<text text-anchor="middle" x="729" y="-136.5" font-family="Arial" font-size="10.00" fill="#172e35">Ctrl</text>
+</a>
+</g>
+</g>
+<!-- n1&#45;&gt;n0 -->
+<g id="edge1" class="edge">
+<title>n1&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M750.02,-122.08C774.54,-103.4 817.09,-74.25 859,-61 964.83,-27.55 1315.48,-20.6 1415.28,-19.28"/>
+</g>
+<!-- n2 -->
+<g id="node3" class="node">
+<title>n2</title>
+<g id="a_node3"><a xlink:title="Type: null">
+<path fill="#faedce" stroke="#647674" stroke-width="0.65" d="M685,-585C685,-585 655,-585 655,-585 649,-585 643,-579 643,-573 643,-573 643,-561 643,-561 643,-555 649,-549 655,-549 655,-549 685,-549 685,-549 691,-549 697,-555 697,-561 697,-561 697,-573 697,-573 697,-579 691,-585 685,-585"/>
+<text text-anchor="middle" x="670" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">null</text>
+</a>
+</g>
+</g>
+<!-- n31 -->
+<g id="node32" class="node">
+<title>n31</title>
+<g id="a_node32"><a xlink:title="TypeMemPtr: PtrBot">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M563,-402C563,-402 533,-402 533,-402 527,-402 521,-396 521,-390 521,-390 521,-378 521,-378 521,-372 527,-366 533,-366 533,-366 563,-366 563,-366 569,-366 575,-372 575,-378 575,-378 575,-390 575,-390 575,-396 569,-402 563,-402"/>
+<text text-anchor="middle" x="548" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">PtrBot</text>
+</a>
+</g>
+</g>
+<!-- n2&#45;&gt;n31 -->
+<g id="edge2" class="edge">
+<title>n2&#45;&gt;n31</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M672.39,-549.27C673.89,-532.12 673.47,-505.54 660,-488 642.16,-464.76 621.59,-481.66 599,-463 578.67,-446.21 563.55,-419.18 555.25,-401.75"/>
+</g>
+<!-- n35 -->
+<g id="node36" class="node">
+<title>n35</title>
+<g id="a_node36"><a xlink:title="TypeFunPtr: { i64 f32 &#45;&gt; i64 #b11}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M646,-463C646,-463 616,-463 616,-463 610,-463 604,-457 604,-451 604,-451 604,-439 604,-439 604,-433 610,-427 616,-427 616,-427 646,-427 646,-427 652,-427 658,-433 658,-439 658,-439 658,-451 658,-451 658,-457 652,-463 646,-463"/>
+<text text-anchor="middle" x="631" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">{b11}</text>
+</a>
+</g>
+</g>
+<!-- n2&#45;&gt;n35 -->
+<g id="edge3" class="edge">
+<title>n2&#45;&gt;n35</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M676.1,-549.1C680.97,-532.76 685.67,-507.65 677,-488 672.64,-478.11 664.66,-469.53 656.56,-462.76"/>
+</g>
+<!-- n37 -->
+<g id="node38" class="node">
+<title>n37</title>
+<g id="a_node38"><a xlink:title="TypeFunPtr: { i64 &#45;&gt; Bot #ALL}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M581,-524C581,-524 551,-524 551,-524 545,-524 539,-518 539,-512 539,-512 539,-500 539,-500 539,-494 545,-488 551,-488 551,-488 581,-488 581,-488 587,-488 593,-494 593,-500 593,-500 593,-512 593,-512 593,-518 587,-524 581,-524"/>
+<text text-anchor="middle" x="566" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{ALL}</text>
+</a>
+</g>
+</g>
+<!-- n2&#45;&gt;n37 -->
+<g id="edge4" class="edge">
+<title>n2&#45;&gt;n37</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M643.22,-550.81C627.69,-542 608.2,-530.94 592.69,-522.14"/>
+</g>
+<!-- n38 -->
+<g id="node39" class="node">
+<title>n38</title>
+<g id="a_node39"><a xlink:title="TypeFunPtr: { i64 i64 &#45;&gt; PtrBot #ALL}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M764,-524C764,-524 734,-524 734,-524 728,-524 722,-518 722,-512 722,-512 722,-500 722,-500 722,-494 728,-488 734,-488 734,-488 764,-488 764,-488 770,-488 776,-494 776,-500 776,-500 776,-512 776,-512 776,-518 770,-524 764,-524"/>
+<text text-anchor="middle" x="749" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{ALL}</text>
+</a>
+</g>
+</g>
+<!-- n2&#45;&gt;n38 -->
+<g id="edge5" class="edge">
+<title>n2&#45;&gt;n38</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M692.43,-549.25C703.01,-541.35 715.62,-531.93 726.24,-524"/>
+</g>
+<!-- n3 -->
+<g id="node4" class="node">
+<title>n3</title>
+<g id="a_node4"><a xlink:title="TypePtr: ptr">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M595,-341C595,-341 565,-341 565,-341 559,-341 553,-335 553,-329 553,-329 553,-317 553,-317 553,-311 559,-305 565,-305 565,-305 595,-305 595,-305 601,-305 607,-311 607,-317 607,-317 607,-329 607,-329 607,-335 601,-341 595,-341"/>
+<text text-anchor="middle" x="580" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">ptr</text>
+</a>
+</g>
+</g>
+<!-- n3&#45;&gt;n0 -->
+<g id="edge6" class="edge">
+<title>n3&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M606.91,-322.74C678.1,-323.17 866,-313.73 866,-202 866,-202 866,-202 866,-139 866,-25.23 1302.09,-18.59 1415.37,-18.79"/>
+</g>
+<!-- n4 -->
+<g id="node5" class="node">
+<title>n4</title>
+<g id="a_node5"><a xlink:title="TypePtr: nptr">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M471,-402C471,-402 441,-402 441,-402 435,-402 429,-396 429,-390 429,-390 429,-378 429,-378 429,-372 435,-366 441,-366 441,-366 471,-366 471,-366 477,-366 483,-372 483,-378 483,-378 483,-390 483,-390 483,-396 477,-402 471,-402"/>
+<text text-anchor="middle" x="456" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">nptr</text>
+</a>
+</g>
+</g>
+<!-- n4&#45;&gt;n3 -->
+<g id="edge7" class="edge">
+<title>n4&#45;&gt;n3</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M482.91,-370.2C503.71,-360.3 532.36,-346.67 553.15,-336.78"/>
+</g>
+<!-- n5 -->
+<g id="node6" class="node">
+<title>n5</title>
+<g id="a_node6"><a xlink:title="TypeInteger: i32">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1155,-158C1155,-158 1125,-158 1125,-158 1119,-158 1113,-152 1113,-146 1113,-146 1113,-134 1113,-134 1113,-128 1119,-122 1125,-122 1125,-122 1155,-122 1155,-122 1161,-122 1167,-128 1167,-134 1167,-134 1167,-146 1167,-146 1167,-152 1161,-158 1155,-158"/>
+<text text-anchor="middle" x="1140" y="-136.5" font-family="Arial" font-size="10.00" fill="#172e35">i32</text>
+</a>
+</g>
+</g>
+<!-- n6 -->
+<g id="node7" class="node">
+<title>n6</title>
+<g id="a_node7"><a xlink:title="TypeInteger: i64">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1281,-97C1281,-97 1251,-97 1251,-97 1245,-97 1239,-91 1239,-85 1239,-85 1239,-73 1239,-73 1239,-67 1245,-61 1251,-61 1251,-61 1281,-61 1281,-61 1287,-61 1293,-67 1293,-73 1293,-73 1293,-85 1293,-85 1293,-91 1287,-97 1281,-97"/>
+<text text-anchor="middle" x="1266" y="-75.5" font-family="Arial" font-size="10.00" fill="#172e35">i64</text>
+</a>
+</g>
+</g>
+<!-- n5&#45;&gt;n6 -->
+<g id="edge8" class="edge">
+<title>n5&#45;&gt;n6</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1166.72,-126.49C1188.1,-116.48 1217.94,-102.5 1239.32,-92.49"/>
+</g>
+<!-- n6&#45;&gt;n0 -->
+<g id="edge9" class="edge">
+<title>n6&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1292.73,-69.04C1325.81,-57.95 1381.82,-39.17 1415.02,-28.05"/>
+</g>
+<!-- n7 -->
+<g id="node8" class="node">
+<title>n7</title>
+<g id="a_node8"><a xlink:title="TypeInteger: bool">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1073,-341C1073,-341 1043,-341 1043,-341 1037,-341 1031,-335 1031,-329 1031,-329 1031,-317 1031,-317 1031,-311 1037,-305 1043,-305 1043,-305 1073,-305 1073,-305 1079,-305 1085,-311 1085,-317 1085,-317 1085,-329 1085,-329 1085,-335 1079,-341 1073,-341"/>
+<text text-anchor="middle" x="1058" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">bool</text>
+</a>
+</g>
+</g>
+<!-- n9 -->
+<g id="node10" class="node">
+<title>n9</title>
+<g id="a_node10"><a xlink:title="TypeInteger: u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1155,-219C1155,-219 1125,-219 1125,-219 1119,-219 1113,-213 1113,-207 1113,-207 1113,-195 1113,-195 1113,-189 1119,-183 1125,-183 1125,-183 1155,-183 1155,-183 1161,-183 1167,-189 1167,-195 1167,-195 1167,-207 1167,-207 1167,-213 1161,-219 1155,-219"/>
+<text text-anchor="middle" x="1140" y="-197.5" font-family="Arial" font-size="10.00" fill="#172e35">u8</text>
+</a>
+</g>
+</g>
+<!-- n7&#45;&gt;n9 -->
+<g id="edge10" class="edge">
+<title>n7&#45;&gt;n9</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1068.67,-305.08C1078.81,-289.16 1094.59,-264.72 1109,-244 1114.9,-235.52 1121.69,-226.26 1127.41,-218.6"/>
+</g>
+<!-- n8 -->
+<g id="node9" class="node">
+<title>n8</title>
+<g id="a_node9"><a xlink:title="TypeInteger: i1">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M993,-341C993,-341 963,-341 963,-341 957,-341 951,-335 951,-329 951,-329 951,-317 951,-317 951,-311 957,-305 963,-305 963,-305 993,-305 993,-305 999,-305 1005,-311 1005,-317 1005,-317 1005,-329 1005,-329 1005,-335 999,-341 993,-341"/>
+<text text-anchor="middle" x="978" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">i1</text>
+</a>
+</g>
+</g>
+<!-- n25 -->
+<g id="node26" class="node">
+<title>n25</title>
+<g id="a_node26"><a xlink:title="TypeInteger: [&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M970,-280C970,-280 940,-280 940,-280 934,-280 928,-274 928,-268 928,-268 928,-256 928,-256 928,-250 934,-244 940,-244 940,-244 970,-244 970,-244 976,-244 982,-250 982,-256 982,-256 982,-268 982,-268 982,-274 976,-280 970,-280"/>
+<text text-anchor="middle" x="955" y="-258.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n8&#45;&gt;n25 -->
+<g id="edge11" class="edge">
+<title>n8&#45;&gt;n25</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M971.47,-305.25C968.39,-297.35 964.72,-287.93 961.63,-280"/>
+</g>
+<!-- n9&#45;&gt;n5 -->
+<g id="edge12" class="edge">
+<title>n9&#45;&gt;n5</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1140,-183.25C1140,-175.35 1140,-165.93 1140,-158"/>
+</g>
+<!-- n10 -->
+<g id="node11" class="node">
+<title>n10</title>
+<g id="a_node11"><a xlink:title="TypeInteger: 0">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1035,-524C1035,-524 1005,-524 1005,-524 999,-524 993,-518 993,-512 993,-512 993,-500 993,-500 993,-494 999,-488 1005,-488 1005,-488 1035,-488 1035,-488 1041,-488 1047,-494 1047,-500 1047,-500 1047,-512 1047,-512 1047,-518 1041,-524 1035,-524"/>
+<text text-anchor="middle" x="1020" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">0</text>
+</a>
+</g>
+</g>
+<!-- n11 -->
+<g id="node12" class="node">
+<title>n11</title>
+<g id="a_node12"><a xlink:title="TypeInteger: bool">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1094,-402C1094,-402 1064,-402 1064,-402 1058,-402 1052,-396 1052,-390 1052,-390 1052,-378 1052,-378 1052,-372 1058,-366 1064,-366 1064,-366 1094,-366 1094,-366 1100,-366 1106,-372 1106,-378 1106,-378 1106,-390 1106,-390 1106,-396 1100,-402 1094,-402"/>
+<text text-anchor="middle" x="1079" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">bool</text>
+</a>
+</g>
+</g>
+<!-- n10&#45;&gt;n11 -->
+<g id="edge13" class="edge">
+<title>n10&#45;&gt;n11</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1018.17,-488.11C1017.17,-471.55 1017.77,-446.08 1028,-427 1033.58,-416.59 1042.93,-407.75 1052.11,-400.92"/>
+</g>
+<!-- n12 -->
+<g id="node13" class="node">
+<title>n12</title>
+<g id="a_node13"><a xlink:title="TypeInteger: u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1220,-402C1220,-402 1190,-402 1190,-402 1184,-402 1178,-396 1178,-390 1178,-390 1178,-378 1178,-378 1178,-372 1184,-366 1190,-366 1190,-366 1220,-366 1220,-366 1226,-366 1232,-372 1232,-378 1232,-378 1232,-390 1232,-390 1232,-396 1226,-402 1220,-402"/>
+<text text-anchor="middle" x="1205" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">u8</text>
+</a>
+</g>
+</g>
+<!-- n10&#45;&gt;n12 -->
+<g id="edge14" class="edge">
+<title>n10&#45;&gt;n12</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1046.73,-493.86C1061.46,-486.71 1079.28,-476.27 1092,-463 1104.52,-449.94 1097.54,-439.08 1111,-427 1133.42,-406.88 1146.74,-414.82 1174,-402 1175.33,-401.37 1176.69,-400.71 1178.05,-400.03"/>
+</g>
+<!-- n14 -->
+<g id="node15" class="node">
+<title>n14</title>
+<g id="a_node15"><a xlink:title="TypeInteger: [&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M955,-463C955,-463 925,-463 925,-463 919,-463 913,-457 913,-451 913,-451 913,-439 913,-439 913,-433 919,-427 925,-427 925,-427 955,-427 955,-427 961,-427 967,-433 967,-439 967,-439 967,-451 967,-451 967,-457 961,-463 955,-463"/>
+<text text-anchor="middle" x="940" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n10&#45;&gt;n14 -->
+<g id="edge15" class="edge">
+<title>n10&#45;&gt;n14</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M997.29,-488.25C986.57,-480.35 973.8,-470.93 963.05,-463"/>
+</g>
+<!-- n82 -->
+<g id="node83" class="node">
+<title>n82</title>
+<g id="a_node83"><a xlink:title="TypeInteger: 0">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M993,-402C993,-402 963,-402 963,-402 957,-402 951,-396 951,-390 951,-390 951,-378 951,-378 951,-372 957,-366 963,-366 963,-366 993,-366 993,-366 999,-366 1005,-372 1005,-378 1005,-378 1005,-390 1005,-390 1005,-396 999,-402 993,-402"/>
+<text text-anchor="middle" x="978" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">0</text>
+</a>
+</g>
+</g>
+<!-- n10&#45;&gt;n82 -->
+<g id="edge16" class="edge">
+<title>n10&#45;&gt;n82</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1014.07,-488.06C1006.07,-465.19 991.89,-424.68 983.9,-401.85"/>
+</g>
+<!-- n11&#45;&gt;n7 -->
+<g id="edge17" class="edge">
+<title>n11&#45;&gt;n7</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1073.04,-366.25C1070.23,-358.35 1066.87,-348.93 1064.05,-341"/>
+</g>
+<!-- n20 -->
+<g id="node21" class="node">
+<title>n20</title>
+<g id="a_node21"><a xlink:title="TypeInteger: u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1155,-280C1155,-280 1125,-280 1125,-280 1119,-280 1113,-274 1113,-268 1113,-268 1113,-256 1113,-256 1113,-250 1119,-244 1125,-244 1125,-244 1155,-244 1155,-244 1161,-244 1167,-250 1167,-256 1167,-256 1167,-268 1167,-268 1167,-274 1161,-280 1155,-280"/>
+<text text-anchor="middle" x="1140" y="-258.5" font-family="Arial" font-size="10.00" fill="#172e35">u8</text>
+</a>
+</g>
+</g>
+<!-- n11&#45;&gt;n20 -->
+<g id="edge18" class="edge">
+<title>n11&#45;&gt;n20</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1083.98,-366.3C1089.13,-350.1 1097.98,-325.1 1109,-305 1113.79,-296.26 1120.19,-287.27 1125.93,-279.87"/>
+</g>
+<!-- n16 -->
+<g id="node17" class="node">
+<title>n16</title>
+<g id="a_node17"><a xlink:title="TypeInteger: u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1155,-341C1155,-341 1125,-341 1125,-341 1119,-341 1113,-335 1113,-329 1113,-329 1113,-317 1113,-317 1113,-311 1119,-305 1125,-305 1125,-305 1155,-305 1155,-305 1161,-305 1167,-311 1167,-317 1167,-317 1167,-329 1167,-329 1167,-335 1161,-341 1155,-341"/>
+<text text-anchor="middle" x="1140" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">u8</text>
+</a>
+</g>
+</g>
+<!-- n12&#45;&gt;n16 -->
+<g id="edge19" class="edge">
+<title>n12&#45;&gt;n16</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1186.55,-366.25C1177.84,-358.35 1167.47,-348.93 1158.72,-341"/>
+</g>
+<!-- n13 -->
+<g id="node14" class="node">
+<title>n13</title>
+<g id="a_node14"><a xlink:title="TypeInteger: [1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1321,-463C1321,-463 1291,-463 1291,-463 1285,-463 1279,-457 1279,-451 1279,-451 1279,-439 1279,-439 1279,-433 1285,-427 1291,-427 1291,-427 1321,-427 1321,-427 1327,-427 1333,-433 1333,-439 1333,-439 1333,-451 1333,-451 1333,-457 1327,-463 1321,-463"/>
+<text text-anchor="middle" x="1306" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n13&#45;&gt;n12 -->
+<g id="edge20" class="edge">
+<title>n13&#45;&gt;n12</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1279.2,-428.34C1264.59,-419.81 1246.56,-409.28 1231.93,-400.73"/>
+</g>
+<!-- n17 -->
+<g id="node18" class="node">
+<title>n17</title>
+<g id="a_node18"><a xlink:title="TypeInteger: [1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1157,-402C1157,-402 1127,-402 1127,-402 1121,-402 1115,-396 1115,-390 1115,-390 1115,-378 1115,-378 1115,-372 1121,-366 1127,-366 1127,-366 1157,-366 1157,-366 1163,-366 1169,-372 1169,-378 1169,-378 1169,-390 1169,-390 1169,-396 1163,-402 1157,-402"/>
+<text text-anchor="middle" x="1142" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n13&#45;&gt;n17 -->
+<g id="edge21" class="edge">
+<title>n13&#45;&gt;n17</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1279.14,-429.92C1276.75,-428.87 1274.35,-427.88 1272,-427 1229.88,-411.3 1215.92,-418.22 1174,-402 1172.24,-401.32 1170.45,-400.56 1168.67,-399.76"/>
+</g>
+<!-- n18 -->
+<g id="node19" class="node">
+<title>n18</title>
+<g id="a_node19"><a xlink:title="TypeInteger: [&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M930,-402C930,-402 900,-402 900,-402 894,-402 888,-396 888,-390 888,-390 888,-378 888,-378 888,-372 894,-366 900,-366 900,-366 930,-366 930,-366 936,-366 942,-372 942,-378 942,-378 942,-390 942,-390 942,-396 936,-402 930,-402"/>
+<text text-anchor="middle" x="915" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n14&#45;&gt;n18 -->
+<g id="edge22" class="edge">
+<title>n14&#45;&gt;n18</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M932.9,-427.25C929.55,-419.35 925.56,-409.93 922.2,-402"/>
+</g>
+<!-- n15 -->
+<g id="node16" class="node">
+<title>n15</title>
+<g id="a_node16"><a xlink:title="TypeInteger: [&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M953,-524C953,-524 923,-524 923,-524 917,-524 911,-518 911,-512 911,-512 911,-500 911,-500 911,-494 917,-488 923,-488 923,-488 953,-488 953,-488 959,-488 965,-494 965,-500 965,-500 965,-512 965,-512 965,-518 959,-524 953,-524"/>
+<text text-anchor="middle" x="938" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n15&#45;&gt;n14 -->
+<g id="edge23" class="edge">
+<title>n15&#45;&gt;n14</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M938.57,-488.25C938.84,-480.35 939.15,-470.93 939.42,-463"/>
+</g>
+<!-- n19 -->
+<g id="node20" class="node">
+<title>n19</title>
+<g id="a_node20"><a xlink:title="TypeInteger: [&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M810,-463C810,-463 780,-463 780,-463 774,-463 768,-457 768,-451 768,-451 768,-439 768,-439 768,-433 774,-427 780,-427 780,-427 810,-427 810,-427 816,-427 822,-433 822,-439 822,-439 822,-451 822,-451 822,-457 816,-463 810,-463"/>
+<text text-anchor="middle" x="795" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n15&#45;&gt;n19 -->
+<g id="edge24" class="edge">
+<title>n15&#45;&gt;n19</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M911.29,-490.35C909.51,-489.52 907.74,-488.73 906,-488 871.63,-473.64 860.28,-477.58 826,-463 824.64,-462.42 823.27,-461.81 821.89,-461.16"/>
+</g>
+<!-- n16&#45;&gt;n20 -->
+<g id="edge25" class="edge">
+<title>n16&#45;&gt;n20</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1140,-305.25C1140,-297.35 1140,-287.93 1140,-280"/>
+</g>
+<!-- n17&#45;&gt;n16 -->
+<g id="edge26" class="edge">
+<title>n17&#45;&gt;n16</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1141.43,-366.25C1141.16,-358.35 1140.85,-348.93 1140.58,-341"/>
+</g>
+<!-- n21 -->
+<g id="node22" class="node">
+<title>n21</title>
+<g id="a_node22"><a xlink:title="TypeInteger: [1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1218,-341C1218,-341 1188,-341 1188,-341 1182,-341 1176,-335 1176,-329 1176,-329 1176,-317 1176,-317 1176,-311 1182,-305 1188,-305 1188,-305 1218,-305 1218,-305 1224,-305 1230,-311 1230,-317 1230,-317 1230,-329 1230,-329 1230,-335 1224,-341 1218,-341"/>
+<text text-anchor="middle" x="1203" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n17&#45;&gt;n21 -->
+<g id="edge27" class="edge">
+<title>n17&#45;&gt;n21</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1159.32,-366.25C1167.49,-358.35 1177.22,-348.93 1185.43,-341"/>
+</g>
+<!-- n22 -->
+<g id="node23" class="node">
+<title>n22</title>
+<g id="a_node23"><a xlink:title="TypeInteger: [&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M930,-341C930,-341 900,-341 900,-341 894,-341 888,-335 888,-329 888,-329 888,-317 888,-317 888,-311 894,-305 900,-305 900,-305 930,-305 930,-305 936,-305 942,-311 942,-317 942,-317 942,-329 942,-329 942,-335 936,-341 930,-341"/>
+<text text-anchor="middle" x="915" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n18&#45;&gt;n22 -->
+<g id="edge28" class="edge">
+<title>n18&#45;&gt;n22</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M915,-366.25C915,-358.35 915,-348.93 915,-341"/>
+</g>
+<!-- n19&#45;&gt;n18 -->
+<g id="edge29" class="edge">
+<title>n19&#45;&gt;n18</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M821.98,-429.02C823.33,-428.33 824.68,-427.65 826,-427 850.82,-414.78 858.1,-414.05 883,-402 884.7,-401.18 886.44,-400.31 888.19,-399.43"/>
+</g>
+<!-- n23 -->
+<g id="node24" class="node">
+<title>n23</title>
+<g id="a_node24"><a xlink:title="TypeInteger: [&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M804,-402C804,-402 774,-402 774,-402 768,-402 762,-396 762,-390 762,-390 762,-378 762,-378 762,-372 768,-366 774,-366 774,-366 804,-366 804,-366 810,-366 816,-372 816,-378 816,-378 816,-390 816,-390 816,-396 810,-402 804,-402"/>
+<text text-anchor="middle" x="789" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n19&#45;&gt;n23 -->
+<g id="edge30" class="edge">
+<title>n19&#45;&gt;n23</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M793.3,-427.25C792.49,-419.35 791.54,-409.93 790.73,-402"/>
+</g>
+<!-- n20&#45;&gt;n9 -->
+<g id="edge31" class="edge">
+<title>n20&#45;&gt;n9</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1140,-244.25C1140,-236.35 1140,-226.93 1140,-219"/>
+</g>
+<!-- n21&#45;&gt;n20 -->
+<g id="edge32" class="edge">
+<title>n21&#45;&gt;n20</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1185.12,-305.25C1176.68,-297.35 1166.62,-287.93 1158.15,-280"/>
+</g>
+<!-- n24 -->
+<g id="node25" class="node">
+<title>n24</title>
+<g id="a_node25"><a xlink:title="TypeInteger: [1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1281,-280C1281,-280 1251,-280 1251,-280 1245,-280 1239,-274 1239,-268 1239,-268 1239,-256 1239,-256 1239,-250 1245,-244 1251,-244 1251,-244 1281,-244 1281,-244 1287,-244 1293,-250 1293,-256 1293,-256 1293,-268 1293,-268 1293,-274 1287,-280 1281,-280"/>
+<text text-anchor="middle" x="1266" y="-258.5" font-family="Arial" font-size="10.00" fill="#172e35">[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n21&#45;&gt;n24 -->
+<g id="edge33" class="edge">
+<title>n21&#45;&gt;n24</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1220.88,-305.25C1229.32,-297.35 1239.38,-287.93 1247.85,-280"/>
+</g>
+<!-- n22&#45;&gt;n25 -->
+<g id="edge34" class="edge">
+<title>n22&#45;&gt;n25</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M926.36,-305.25C931.71,-297.35 938.1,-287.93 943.48,-280"/>
+</g>
+<!-- n23&#45;&gt;n22 -->
+<g id="edge35" class="edge">
+<title>n23&#45;&gt;n22</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M815.95,-367.97C817.31,-367.29 818.67,-366.63 820,-366 847.26,-353.18 855.66,-353.64 883,-341 884.71,-340.21 886.46,-339.37 888.22,-338.5"/>
+</g>
+<!-- n26 -->
+<g id="node27" class="node">
+<title>n26</title>
+<g id="a_node27"><a xlink:title="TypeInteger: [&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M867,-341C867,-341 837,-341 837,-341 831,-341 825,-335 825,-329 825,-329 825,-317 825,-317 825,-311 831,-305 837,-305 837,-305 867,-305 867,-305 873,-305 879,-311 879,-317 879,-317 879,-329 879,-329 879,-335 873,-341 867,-341"/>
+<text text-anchor="middle" x="852" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n23&#45;&gt;n26 -->
+<g id="edge36" class="edge">
+<title>n23&#45;&gt;n26</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M806.88,-366.25C815.32,-358.35 825.38,-348.93 833.85,-341"/>
+</g>
+<!-- n24&#45;&gt;n9 -->
+<g id="edge37" class="edge">
+<title>n24&#45;&gt;n9</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1239.28,-248.49C1217.9,-238.48 1188.06,-224.5 1166.68,-214.49"/>
+</g>
+<!-- n25&#45;&gt;n5 -->
+<g id="edge38" class="edge">
+<title>n25&#45;&gt;n5</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M981.11,-244.06C1016.37,-221.19 1078.83,-180.68 1114.02,-157.85"/>
+</g>
+<!-- n26&#45;&gt;n25 -->
+<g id="edge39" class="edge">
+<title>n26&#45;&gt;n25</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M878.79,-306.65C894.05,-297.91 913.1,-287 928.34,-278.27"/>
+</g>
+<!-- n27 -->
+<g id="node28" class="node">
+<title>n27</title>
+<g id="a_node28"><a xlink:title="TypeFloat: flt">
+<path fill="#c7eee9" stroke="#647674" stroke-width="0.65" d="M1263,-585C1263,-585 1233,-585 1233,-585 1227,-585 1221,-579 1221,-573 1221,-573 1221,-561 1221,-561 1221,-555 1227,-549 1233,-549 1233,-549 1263,-549 1263,-549 1269,-549 1275,-555 1275,-561 1275,-561 1275,-573 1275,-573 1275,-579 1269,-585 1263,-585"/>
+<text text-anchor="middle" x="1248" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">flt</text>
+</a>
+</g>
+</g>
+<!-- n27&#45;&gt;n0 -->
+<g id="edge40" class="edge">
+<title>n27&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1274.86,-563.32C1319.13,-558.32 1404.45,-546.03 1424,-524 1447.16,-497.9 1433,-480.9 1433,-446 1433,-446 1433,-446 1433,-139 1433,-102.02 1437.3,-58.81 1439.96,-35.67"/>
+</g>
+<!-- n28 -->
+<g id="node29" class="node">
+<title>n28</title>
+<g id="a_node29"><a xlink:title="TypeFloat: f32">
+<path fill="#c7eee9" stroke="#647674" stroke-width="0.65" d="M1256,-646C1256,-646 1226,-646 1226,-646 1220,-646 1214,-640 1214,-634 1214,-634 1214,-622 1214,-622 1214,-616 1220,-610 1226,-610 1226,-610 1256,-610 1256,-610 1262,-610 1268,-616 1268,-622 1268,-622 1268,-634 1268,-634 1268,-640 1262,-646 1256,-646"/>
+<text text-anchor="middle" x="1241" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">f32</text>
+</a>
+</g>
+</g>
+<!-- n28&#45;&gt;n27 -->
+<g id="edge41" class="edge">
+<title>n28&#45;&gt;n27</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1242.99,-610.25C1243.92,-602.35 1245.04,-592.93 1245.98,-585"/>
+</g>
+<!-- n29 -->
+<g id="node30" class="node">
+<title>n29</title>
+<g id="a_node30"><a xlink:title="TypeFloat: 3.141592653589793">
+<path fill="#c7eee9" stroke="#647674" stroke-width="0.65" d="M1192.82,-646C1192.82,-646 1121.18,-646 1121.18,-646 1115.18,-646 1109.18,-640 1109.18,-634 1109.18,-634 1109.18,-622 1109.18,-622 1109.18,-616 1115.18,-610 1121.18,-610 1121.18,-610 1192.82,-610 1192.82,-610 1198.82,-610 1204.82,-616 1204.82,-622 1204.82,-622 1204.82,-634 1204.82,-634 1204.82,-640 1198.82,-646 1192.82,-646"/>
+<text text-anchor="middle" x="1157" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">3.141592653589793</text>
+</a>
+</g>
+</g>
+<!-- n29&#45;&gt;n27 -->
+<g id="edge42" class="edge">
+<title>n29&#45;&gt;n27</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1182.83,-610.25C1195.02,-602.35 1209.55,-592.93 1221.79,-585"/>
+</g>
+<!-- n30 -->
+<g id="node31" class="node">
+<title>n30</title>
+<g id="a_node31"><a xlink:title="TypeMemPtr: *void">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M242,-463C242,-463 212,-463 212,-463 206,-463 200,-457 200,-451 200,-451 200,-439 200,-439 200,-433 206,-427 212,-427 212,-427 242,-427 242,-427 248,-427 254,-433 254,-439 254,-439 254,-451 254,-451 254,-457 248,-463 242,-463"/>
+<text text-anchor="middle" x="227" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">*void</text>
+</a>
+</g>
+</g>
+<!-- n30&#45;&gt;n4 -->
+<g id="edge43" class="edge">
+<title>n30&#45;&gt;n4</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M253.59,-431.6C257.7,-429.92 261.93,-428.32 266,-427 322.87,-408.51 391.92,-395.51 429.13,-389.25"/>
+</g>
+<!-- n30&#45;&gt;n31 -->
+<g id="edge44" class="edge">
+<title>n30&#45;&gt;n31</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M253.76,-440.68C301.1,-434.59 402.59,-420.52 487,-402 498.28,-399.53 510.56,-396.22 521.14,-393.18"/>
+</g>
+<!-- n31&#45;&gt;n3 -->
+<g id="edge45" class="edge">
+<title>n31&#45;&gt;n3</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M557.08,-366.25C561.37,-358.35 566.48,-348.93 570.78,-341"/>
+</g>
+<!-- n32 -->
+<g id="node33" class="node">
+<title>n32</title>
+<g id="a_node33"><a xlink:title="TypeMemPtr: *test {null !test; }">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M143,-585C143,-585 113,-585 113,-585 107,-585 101,-579 101,-573 101,-573 101,-561 101,-561 101,-555 107,-549 113,-549 113,-549 143,-549 143,-549 149,-549 155,-555 155,-561 155,-561 155,-573 155,-573 155,-579 149,-585 143,-585"/>
+<text text-anchor="middle" x="128" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">*test</text>
+</a>
+</g>
+</g>
+<!-- n33 -->
+<g id="node34" class="node">
+<title>n33</title>
+<g id="a_node34"><a xlink:title="TypeMemPtr: *test {null !test; }">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M154,-524C154,-524 124,-524 124,-524 118,-524 112,-518 112,-512 112,-512 112,-500 112,-500 112,-494 118,-488 124,-488 124,-488 154,-488 154,-488 160,-488 166,-494 166,-500 166,-500 166,-512 166,-512 166,-518 160,-524 154,-524"/>
+<text text-anchor="middle" x="139" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">*test</text>
+</a>
+</g>
+</g>
+<!-- n32&#45;&gt;n33 -->
+<g id="edge46" class="edge">
+<title>n32&#45;&gt;n33</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M131.12,-549.25C132.6,-541.35 134.35,-531.93 135.83,-524"/>
+</g>
+<!-- n33&#45;&gt;n30 -->
+<g id="edge47" class="edge">
+<title>n33&#45;&gt;n30</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M163.98,-488.25C175.77,-480.35 189.81,-470.93 201.65,-463"/>
+</g>
+<!-- n34 -->
+<g id="node35" class="node">
+<title>n34</title>
+<g id="a_node35"><a xlink:title="TypeFunPtr: { i64 f32 &#45;&gt; i64 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M644,-524C644,-524 614,-524 614,-524 608,-524 602,-518 602,-512 602,-512 602,-500 602,-500 602,-494 608,-488 614,-488 614,-488 644,-488 644,-488 650,-488 656,-494 656,-500 656,-500 656,-512 656,-512 656,-518 650,-524 644,-524"/>
+<text text-anchor="middle" x="629" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n34&#45;&gt;n4 -->
+<g id="edge48" class="edge">
+<title>n34&#45;&gt;n4</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M602.23,-488.14C590.42,-480.59 576.42,-471.49 564,-463 534.02,-442.51 500.19,-417.81 478.51,-401.78"/>
+</g>
+<!-- n34&#45;&gt;n35 -->
+<g id="edge49" class="edge">
+<title>n34&#45;&gt;n35</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M629.57,-488.25C629.84,-480.35 630.15,-470.93 630.42,-463"/>
+</g>
+<!-- n36 -->
+<g id="node37" class="node">
+<title>n36</title>
+<g id="a_node37"><a xlink:title="TypeFunPtr: FunBot">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M626,-402C626,-402 596,-402 596,-402 590,-402 584,-396 584,-390 584,-390 584,-378 584,-378 584,-372 590,-366 596,-366 596,-366 626,-366 626,-366 632,-366 638,-372 638,-378 638,-378 638,-390 638,-390 638,-396 632,-402 626,-402"/>
+<text text-anchor="middle" x="611" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">FunBot</text>
+</a>
+</g>
+</g>
+<!-- n35&#45;&gt;n36 -->
+<g id="edge50" class="edge">
+<title>n35&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M625.32,-427.25C622.64,-419.35 619.45,-409.93 616.76,-402"/>
+</g>
+<!-- n36&#45;&gt;n3 -->
+<g id="edge51" class="edge">
+<title>n36&#45;&gt;n3</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M602.2,-366.25C598.05,-358.35 593.1,-348.93 588.93,-341"/>
+</g>
+<!-- n37&#45;&gt;n36 -->
+<g id="edge52" class="edge">
+<title>n37&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M572.35,-488.06C580.93,-465.19 596.12,-424.68 604.68,-401.85"/>
+</g>
+<!-- n38&#45;&gt;n36 -->
+<g id="edge53" class="edge">
+<title>n38&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M726.08,-488.03C717.32,-480.89 707.61,-472.12 700,-463 688.14,-448.77 691.93,-440.26 679,-427 667.18,-414.88 651.18,-404.77 637.67,-397.51"/>
+</g>
+<!-- n39 -->
+<g id="node40" class="node">
+<title>n39</title>
+<g id="a_node40"><a xlink:title="TypeFunPtr: { i64 &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M622,-585C622,-585 592,-585 592,-585 586,-585 580,-579 580,-573 580,-573 580,-561 580,-561 580,-555 586,-549 592,-549 592,-549 622,-549 622,-549 628,-549 634,-555 634,-561 634,-561 634,-573 634,-573 634,-579 628,-585 622,-585"/>
+<text text-anchor="middle" x="607" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n39&#45;&gt;n34 -->
+<g id="edge54" class="edge">
+<title>n39&#45;&gt;n34</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M613.25,-549.25C616.19,-541.35 619.7,-531.93 622.66,-524"/>
+</g>
+<!-- n39&#45;&gt;n37 -->
+<g id="edge55" class="edge">
+<title>n39&#45;&gt;n37</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M595.36,-549.25C589.87,-541.35 583.32,-531.93 577.81,-524"/>
+</g>
+<!-- n42 -->
+<g id="node43" class="node">
+<title>n42</title>
+<g id="a_node43"><a xlink:title="TypeFunPtr: { i64 &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M455,-524C455,-524 425,-524 425,-524 419,-524 413,-518 413,-512 413,-512 413,-500 413,-500 413,-494 419,-488 425,-488 425,-488 455,-488 455,-488 461,-488 467,-494 467,-500 467,-500 467,-512 467,-512 467,-518 461,-524 455,-524"/>
+<text text-anchor="middle" x="440" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n39&#45;&gt;n42 -->
+<g id="edge56" class="edge">
+<title>n39&#45;&gt;n42</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M580.34,-551.21C578.56,-550.41 576.76,-549.67 575,-549 530.54,-532.16 515.34,-541.14 471,-524 469.63,-523.47 468.24,-522.89 466.85,-522.27"/>
+</g>
+<!-- n44 -->
+<g id="node45" class="node">
+<title>n44</title>
+<g id="a_node45"><a xlink:title="TypeFunPtr: { Bot i64 &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M518,-524C518,-524 488,-524 488,-524 482,-524 476,-518 476,-512 476,-512 476,-500 476,-500 476,-494 482,-488 488,-488 488,-488 518,-488 518,-488 524,-488 530,-494 530,-500 530,-500 530,-512 530,-512 530,-518 524,-524 518,-524"/>
+<text text-anchor="middle" x="503" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n39&#45;&gt;n44 -->
+<g id="edge57" class="edge">
+<title>n39&#45;&gt;n44</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M580.22,-550.81C564.69,-542 545.2,-530.94 529.69,-522.14"/>
+</g>
+<!-- n40 -->
+<g id="node41" class="node">
+<title>n40</title>
+<g id="a_node41"><a xlink:title="TypeFunPtr: { &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M554,-646C554,-646 524,-646 524,-646 518,-646 512,-640 512,-634 512,-634 512,-622 512,-622 512,-616 518,-610 524,-610 524,-610 554,-610 554,-610 560,-610 566,-616 566,-622 566,-622 566,-634 566,-634 566,-640 560,-646 554,-646"/>
+<text text-anchor="middle" x="539" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n40&#45;&gt;n39 -->
+<g id="edge58" class="edge">
+<title>n40&#45;&gt;n39</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M558.3,-610.25C567.41,-602.35 578.27,-592.93 587.41,-585"/>
+</g>
+<!-- n41 -->
+<g id="node42" class="node">
+<title>n41</title>
+<g id="a_node42"><a xlink:title="TypeFunPtr: { Top i64 &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M559,-585C559,-585 529,-585 529,-585 523,-585 517,-579 517,-573 517,-573 517,-561 517,-561 517,-555 523,-549 529,-549 529,-549 559,-549 559,-549 565,-549 571,-555 571,-561 571,-561 571,-573 571,-573 571,-579 565,-585 559,-585"/>
+<text text-anchor="middle" x="544" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n40&#45;&gt;n41 -->
+<g id="edge59" class="edge">
+<title>n40&#45;&gt;n41</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M540.42,-610.25C541.09,-602.35 541.89,-592.93 542.56,-585"/>
+</g>
+<!-- n41&#45;&gt;n42 -->
+<g id="edge60" class="edge">
+<title>n41&#45;&gt;n42</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M517.22,-550.81C501.69,-542 482.2,-530.94 466.69,-522.14"/>
+</g>
+<!-- n41&#45;&gt;n44 -->
+<g id="edge61" class="edge">
+<title>n41&#45;&gt;n44</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M532.36,-549.25C526.87,-541.35 520.32,-531.93 514.81,-524"/>
+</g>
+<!-- n43 -->
+<g id="node44" class="node">
+<title>n43</title>
+<g id="a_node44"><a xlink:title="TypeFunPtr: { &#45;&gt; i32 #0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M487,-463C487,-463 457,-463 457,-463 451,-463 445,-457 445,-451 445,-451 445,-439 445,-439 445,-433 451,-427 457,-427 457,-427 487,-427 487,-427 493,-427 499,-433 499,-439 499,-439 499,-451 499,-451 499,-457 493,-463 487,-463"/>
+<text text-anchor="middle" x="472" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">{0}</text>
+</a>
+</g>
+</g>
+<!-- n42&#45;&gt;n43 -->
+<g id="edge62" class="edge">
+<title>n42&#45;&gt;n43</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M449.08,-488.25C453.37,-480.35 458.48,-470.93 462.78,-463"/>
+</g>
+<!-- n43&#45;&gt;n4 -->
+<g id="edge63" class="edge">
+<title>n43&#45;&gt;n4</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M467.46,-427.25C465.31,-419.35 462.76,-409.93 460.61,-402"/>
+</g>
+<!-- n43&#45;&gt;n36 -->
+<g id="edge64" class="edge">
+<title>n43&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M498.74,-434.47C520.6,-426.45 552.17,-414.34 579,-402 580.71,-401.21 582.47,-400.37 584.22,-399.51"/>
+</g>
+<!-- n44&#45;&gt;n43 -->
+<g id="edge65" class="edge">
+<title>n44&#45;&gt;n43</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M494.2,-488.25C490.05,-480.35 485.1,-470.93 480.93,-463"/>
+</g>
+<!-- n45 -->
+<g id="node46" class="node">
+<title>n45</title>
+<g id="a_node46"><a xlink:title="TypeMem: #2:null">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1319,-646C1319,-646 1289,-646 1289,-646 1283,-646 1277,-640 1277,-634 1277,-634 1277,-622 1277,-622 1277,-616 1283,-610 1289,-610 1289,-610 1319,-610 1319,-610 1325,-610 1331,-616 1331,-622 1331,-622 1331,-634 1331,-634 1331,-640 1325,-646 1319,-646"/>
+<text text-anchor="middle" x="1304" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">#2:null</text>
+</a>
+</g>
+</g>
+<!-- n47 -->
+<g id="node48" class="node">
+<title>n47</title>
+<g id="a_node48"><a xlink:title="TypeMem: MemBot">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1414,-585C1414,-585 1384,-585 1384,-585 1378,-585 1372,-579 1372,-573 1372,-573 1372,-561 1372,-561 1372,-555 1378,-549 1384,-549 1384,-549 1414,-549 1414,-549 1420,-549 1426,-555 1426,-561 1426,-561 1426,-573 1426,-573 1426,-579 1420,-585 1414,-585"/>
+<text text-anchor="middle" x="1399" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">MemBot</text>
+</a>
+</g>
+</g>
+<!-- n45&#45;&gt;n47 -->
+<g id="edge66" class="edge">
+<title>n45&#45;&gt;n47</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1330.97,-610.25C1343.92,-602.21 1359.38,-592.61 1372.29,-584.59"/>
+</g>
+<!-- n46 -->
+<g id="node47" class="node">
+<title>n46</title>
+<g id="a_node47"><a xlink:title="TypeMem: #2:0">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1377,-707C1377,-707 1347,-707 1347,-707 1341,-707 1335,-701 1335,-695 1335,-695 1335,-683 1335,-683 1335,-677 1341,-671 1347,-671 1347,-671 1377,-671 1377,-671 1383,-671 1389,-677 1389,-683 1389,-683 1389,-695 1389,-695 1389,-701 1383,-707 1377,-707"/>
+<text text-anchor="middle" x="1362" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">#2:0</text>
+</a>
+</g>
+</g>
+<!-- n117 -->
+<g id="node118" class="node">
+<title>n117</title>
+<g id="a_node118"><a xlink:title="TypeMem: #2:0">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1382,-646C1382,-646 1352,-646 1352,-646 1346,-646 1340,-640 1340,-634 1340,-634 1340,-622 1340,-622 1340,-616 1346,-610 1352,-610 1352,-610 1382,-610 1382,-610 1388,-610 1394,-616 1394,-622 1394,-622 1394,-634 1394,-634 1394,-640 1388,-646 1382,-646"/>
+<text text-anchor="middle" x="1367" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">#2:0</text>
+</a>
+</g>
+</g>
+<!-- n46&#45;&gt;n117 -->
+<g id="edge67" class="edge">
+<title>n46&#45;&gt;n117</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1363.42,-671.25C1364.09,-663.35 1364.89,-653.93 1365.56,-646"/>
+</g>
+<!-- n47&#45;&gt;n0 -->
+<g id="edge68" class="edge">
+<title>n47&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1420.19,-549.19C1427.61,-542.19 1435.27,-533.48 1440,-524 1455.67,-492.62 1452,-481.07 1452,-446 1452,-446 1452,-446 1452,-139 1452,-102 1447.22,-58.8 1444.27,-35.66"/>
+</g>
+<!-- n48 -->
+<g id="node49" class="node">
+<title>n48</title>
+<g id="a_node49"><a xlink:title="Field: !test:&#45;2 : null">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M42,-768C42,-768 12,-768 12,-768 6,-768 0,-762 0,-756 0,-756 0,-744 0,-744 0,-738 6,-732 12,-732 12,-732 42,-732 42,-732 48,-732 54,-738 54,-744 54,-744 54,-756 54,-756 54,-762 48,-768 42,-768"/>
+<text text-anchor="middle" x="27" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">!test</text>
+</a>
+</g>
+</g>
+<!-- n49 -->
+<g id="node50" class="node">
+<title>n49</title>
+<g id="a_node50"><a xlink:title="Field: test:&#45;2 : null">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M42,-219C42,-219 12,-219 12,-219 6,-219 0,-213 0,-207 0,-207 0,-195 0,-195 0,-189 6,-183 12,-183 12,-183 42,-183 42,-183 48,-183 54,-189 54,-195 54,-195 54,-207 54,-207 54,-213 48,-219 42,-219"/>
+<text text-anchor="middle" x="27" y="-197.5" font-family="Arial" font-size="10.00" fill="#172e35">test</text>
+</a>
+</g>
+</g>
+<!-- n48&#45;&gt;n49 -->
+<g id="edge69" class="edge">
+<title>n48&#45;&gt;n49</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M27,-732.3C27,-709.12 27,-665.88 27,-629 27,-629 27,-629 27,-322 27,-285.12 27,-241.88 27,-218.7"/>
+</g>
+<!-- n49&#45;&gt;n0 -->
+<g id="edge70" class="edge">
+<title>n49&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M53.83,-185.83C56.22,-184.79 58.63,-183.83 61,-183 301.65,-98.17 369.08,-94.75 622,-61 931.79,-19.66 1312.41,-18.32 1415.31,-18.79"/>
+</g>
+<!-- n50 -->
+<g id="node51" class="node">
+<title>n50</title>
+<g id="a_node51"><a xlink:title="Field: !flt :&#45;2 : f32">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M489,-158C489,-158 459,-158 459,-158 453,-158 447,-152 447,-146 447,-146 447,-134 447,-134 447,-128 453,-122 459,-122 459,-122 489,-122 489,-122 495,-122 501,-128 501,-134 501,-134 501,-146 501,-146 501,-152 495,-158 489,-158"/>
+<text text-anchor="middle" x="474" y="-136.5" font-family="Arial" font-size="10.00" fill="#172e35">!flt </text>
+</a>
+</g>
+</g>
+<!-- n50&#45;&gt;n0 -->
+<g id="edge71" class="edge">
+<title>n50&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M500.88,-130.55C554.61,-114.06 679.37,-77.72 787,-61 1028.8,-23.43 1325.85,-19.34 1415.3,-18.99"/>
+</g>
+<!-- n51 -->
+<g id="node52" class="node">
+<title>n51</title>
+<g id="a_node52"><a xlink:title="TypeStruct: StructBot">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1921,-463C1921,-463 1891,-463 1891,-463 1885,-463 1879,-457 1879,-451 1879,-451 1879,-439 1879,-439 1879,-433 1885,-427 1891,-427 1891,-427 1921,-427 1921,-427 1927,-427 1933,-433 1933,-439 1933,-439 1933,-451 1933,-451 1933,-457 1927,-463 1921,-463"/>
+<text text-anchor="middle" x="1906" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">StructBot</text>
+</a>
+</g>
+</g>
+<!-- n51&#45;&gt;n0 -->
+<g id="edge72" class="edge">
+<title>n51&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1879.28,-438.31C1831.19,-426.32 1735,-393.63 1735,-324 1735,-324 1735,-324 1735,-139 1735,-81.76 1541.11,-38.24 1468.78,-23.99"/>
+</g>
+<!-- n52 -->
+<g id="node53" class="node">
+<title>n52</title>
+<g id="a_node53"><a xlink:title="TypeStruct: test {null !test; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1853,-524C1853,-524 1823,-524 1823,-524 1817,-524 1811,-518 1811,-512 1811,-512 1811,-500 1811,-500 1811,-494 1817,-488 1823,-488 1823,-488 1853,-488 1853,-488 1859,-488 1865,-494 1865,-500 1865,-500 1865,-512 1865,-512 1865,-518 1859,-524 1853,-524"/>
+<text text-anchor="middle" x="1838" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">test</text>
+</a>
+</g>
+</g>
+<!-- n52&#45;&gt;n51 -->
+<g id="edge73" class="edge">
+<title>n52&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1857.3,-488.25C1866.41,-480.35 1877.27,-470.93 1886.41,-463"/>
+</g>
+<!-- n53 -->
+<g id="node54" class="node">
+<title>n53</title>
+<g id="a_node54"><a xlink:title="TypeStruct: []i64">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1880,-646C1880,-646 1850,-646 1850,-646 1844,-646 1838,-640 1838,-634 1838,-634 1838,-622 1838,-622 1838,-616 1844,-610 1850,-610 1850,-610 1880,-610 1880,-610 1886,-610 1892,-616 1892,-622 1892,-622 1892,-634 1892,-634 1892,-640 1886,-646 1880,-646"/>
+<text text-anchor="middle" x="1865" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">[]i64</text>
+</a>
+</g>
+</g>
+<!-- n53&#45;&gt;n51 -->
+<g id="edge74" class="edge">
+<title>n53&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1868.78,-610.3C1876.57,-575.9 1894.33,-497.51 1902.17,-462.93"/>
+</g>
+<!-- n54 -->
+<g id="node55" class="node">
+<title>n54</title>
+<g id="a_node55"><a xlink:title="TypeStruct: []u8">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1792,-707C1792,-707 1762,-707 1762,-707 1756,-707 1750,-701 1750,-695 1750,-695 1750,-683 1750,-683 1750,-677 1756,-671 1762,-671 1762,-671 1792,-671 1792,-671 1798,-671 1804,-677 1804,-683 1804,-683 1804,-695 1804,-695 1804,-701 1798,-707 1792,-707"/>
+<text text-anchor="middle" x="1777" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[]u8</text>
+</a>
+</g>
+</g>
+<!-- n54&#45;&gt;n51 -->
+<g id="edge75" class="edge">
+<title>n54&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.69,-673.29C1805.47,-672.48 1807.25,-671.7 1809,-671 1846.72,-655.82 1871.77,-677.88 1897,-646 1919.22,-617.93 1911.51,-505.53 1907.65,-462.7"/>
+</g>
+<!-- n55 -->
+<g id="node56" class="node">
+<title>n55</title>
+<g id="a_node56"><a xlink:title="TypeStruct: [&quot;abc&quot;]">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1855,-707C1855,-707 1825,-707 1825,-707 1819,-707 1813,-701 1813,-695 1813,-695 1813,-683 1813,-683 1813,-677 1819,-671 1825,-671 1825,-671 1855,-671 1855,-671 1861,-671 1867,-677 1867,-683 1867,-683 1867,-695 1867,-695 1867,-701 1861,-707 1855,-707"/>
+<text text-anchor="middle" x="1840" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[]u8</text>
+</a>
+</g>
+</g>
+<!-- n55&#45;&gt;n51 -->
+<g id="edge76" class="edge">
+<title>n55&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1866.88,-673.36C1887.13,-662.2 1911.64,-648.36 1913,-646 1947.44,-586.45 1924.42,-499.38 1912.22,-462.98"/>
+</g>
+<!-- n56 -->
+<g id="node57" class="node">
+<title>n56</title>
+<g id="a_node57"><a xlink:title="TypeStruct: %SINT {... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1609,-524C1609,-524 1579,-524 1579,-524 1573,-524 1567,-518 1567,-512 1567,-512 1567,-500 1567,-500 1567,-494 1573,-488 1579,-488 1579,-488 1609,-488 1609,-488 1615,-488 1621,-494 1621,-500 1621,-500 1621,-512 1621,-512 1621,-518 1615,-524 1609,-524"/>
+<text text-anchor="middle" x="1594" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n56&#45;&gt;n51 -->
+<g id="edge77" class="edge">
+<title>n56&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1620.87,-499.92C1679.85,-488.77 1820.06,-462.25 1879.08,-451.09"/>
+</g>
+<!-- n57 -->
+<g id="node58" class="node">
+<title>n57</title>
+<g id="a_node58"><a xlink:title="TypeStruct: %SFLT {... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1735,-524C1735,-524 1705,-524 1705,-524 1699,-524 1693,-518 1693,-512 1693,-512 1693,-500 1693,-500 1693,-494 1699,-488 1705,-488 1705,-488 1735,-488 1735,-488 1741,-488 1747,-494 1747,-500 1747,-500 1747,-512 1747,-512 1747,-518 1741,-524 1735,-524"/>
+<text text-anchor="middle" x="1720" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n57&#45;&gt;n51 -->
+<g id="edge78" class="edge">
+<title>n57&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1746.65,-496.55C1781.91,-485.36 1843.71,-465.76 1879.1,-454.53"/>
+</g>
+<!-- n58 -->
+<g id="node59" class="node">
+<title>n58</title>
+<g id="a_node59"><a xlink:title="TypeStruct: %SINT {u32 !a; *%SFLT {... } !s2; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1546,-585C1546,-585 1516,-585 1516,-585 1510,-585 1504,-579 1504,-573 1504,-573 1504,-561 1504,-561 1504,-555 1510,-549 1516,-549 1516,-549 1546,-549 1546,-549 1552,-549 1558,-555 1558,-561 1558,-561 1558,-573 1558,-573 1558,-579 1552,-585 1546,-585"/>
+<text text-anchor="middle" x="1531" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n58&#45;&gt;n56 -->
+<g id="edge79" class="edge">
+<title>n58&#45;&gt;n56</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1548.88,-549.25C1557.32,-541.35 1567.38,-531.93 1575.85,-524"/>
+</g>
+<!-- n59 -->
+<g id="node60" class="node">
+<title>n59</title>
+<g id="a_node60"><a xlink:title="TypeStruct: %SFLT {f32 !b; *%SINT {u32 !a; *%SFLT {... } !s2; ... } !s1; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1735,-585C1735,-585 1705,-585 1705,-585 1699,-585 1693,-579 1693,-573 1693,-573 1693,-561 1693,-561 1693,-555 1699,-549 1705,-549 1705,-549 1735,-549 1735,-549 1741,-549 1747,-555 1747,-561 1747,-561 1747,-573 1747,-573 1747,-579 1741,-585 1735,-585"/>
+<text text-anchor="middle" x="1720" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n59&#45;&gt;n57 -->
+<g id="edge80" class="edge">
+<title>n59&#45;&gt;n57</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1720,-549.25C1720,-541.35 1720,-531.93 1720,-524"/>
+</g>
+<!-- n60 -->
+<g id="node61" class="node">
+<title>n60</title>
+<g id="a_node61"><a xlink:title="TypeStruct: %SFLT {f32 !b; *%SINT {u32 !a; *%SFLT !s2; } !s1; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1735,-646C1735,-646 1705,-646 1705,-646 1699,-646 1693,-640 1693,-634 1693,-634 1693,-622 1693,-622 1693,-616 1699,-610 1705,-610 1705,-610 1735,-610 1735,-610 1741,-610 1747,-616 1747,-622 1747,-622 1747,-634 1747,-634 1747,-640 1741,-646 1735,-646"/>
+<text text-anchor="middle" x="1720" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n60&#45;&gt;n59 -->
+<g id="edge81" class="edge">
+<title>n60&#45;&gt;n59</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1720,-610.25C1720,-602.35 1720,-592.93 1720,-585"/>
+</g>
+<!-- n61 -->
+<g id="node62" class="node">
+<title>n61</title>
+<g id="a_node62"><a xlink:title="TypeStruct: %SINT {u32 !a; *%SFLT {f32 !b; *%SINT !s1; } !s2; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1546,-646C1546,-646 1516,-646 1516,-646 1510,-646 1504,-640 1504,-634 1504,-634 1504,-622 1504,-622 1504,-616 1510,-610 1516,-610 1516,-610 1546,-610 1546,-610 1552,-610 1558,-616 1558,-622 1558,-622 1558,-634 1558,-634 1558,-640 1552,-646 1546,-646"/>
+<text text-anchor="middle" x="1531" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n61&#45;&gt;n58 -->
+<g id="edge82" class="edge">
+<title>n61&#45;&gt;n58</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1531,-610.25C1531,-602.35 1531,-592.93 1531,-585"/>
+</g>
+<!-- n62 -->
+<g id="node63" class="node">
+<title>n62</title>
+<g id="a_node63"><a xlink:title="TypeStruct: calloc {{ i64 i64 &#45;&gt; PtrBot #ALL}? calloc; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1918,-707C1918,-707 1888,-707 1888,-707 1882,-707 1876,-701 1876,-695 1876,-695 1876,-683 1876,-683 1876,-677 1882,-671 1888,-671 1888,-671 1918,-671 1918,-671 1924,-671 1930,-677 1930,-683 1930,-683 1930,-695 1930,-695 1930,-701 1924,-707 1918,-707"/>
+<text text-anchor="middle" x="1903" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">calloc</text>
+</a>
+</g>
+</g>
+<!-- n62&#45;&gt;n51 -->
+<g id="edge83" class="edge">
+<title>n62&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1918.02,-671.28C1923.55,-664.04 1929.15,-655.14 1932,-646 1952.9,-578.96 1951.21,-555.54 1932,-488 1929.47,-479.09 1924.44,-470.22 1919.48,-462.95"/>
+</g>
+<!-- n63 -->
+<g id="node64" class="node">
+<title>n63</title>
+<g id="a_node64"><a xlink:title="TypeTuple: [BOT]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2389,-646C2389,-646 2359,-646 2359,-646 2353,-646 2347,-640 2347,-634 2347,-634 2347,-622 2347,-622 2347,-616 2353,-610 2359,-610 2359,-610 2389,-610 2389,-610 2395,-610 2401,-616 2401,-622 2401,-622 2401,-634 2401,-634 2401,-640 2395,-646 2389,-646"/>
+<text text-anchor="middle" x="2374" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">[BOT]</text>
+</a>
+</g>
+</g>
+<!-- n63&#45;&gt;n0 -->
+<g id="edge84" class="edge">
+<title>n63&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2347.17,-616.19C2309.63,-599.09 2246,-561.98 2246,-507 2246,-507 2246,-507 2246,-139 2246,-58.56 1608.26,-26.22 1468.75,-20.11"/>
+</g>
+<!-- n64 -->
+<g id="node65" class="node">
+<title>n64</title>
+<g id="a_node65"><a xlink:title="TypeTuple: [ &#160;i64, *test {null !test; }]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2611.07,-707C2611.07,-707 2522.93,-707 2522.93,-707 2516.93,-707 2510.93,-701 2510.93,-695 2510.93,-695 2510.93,-683 2510.93,-683 2510.93,-677 2516.93,-671 2522.93,-671 2522.93,-671 2611.07,-671 2611.07,-671 2617.07,-671 2623.07,-677 2623.07,-683 2623.07,-683 2623.07,-695 2623.07,-695 2623.07,-701 2617.07,-707 2611.07,-707"/>
+<text text-anchor="middle" x="2567" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;i64, *test {null !test; }]</text>
+</a>
+</g>
+</g>
+<!-- n64&#45;&gt;n63 -->
+<g id="edge85" class="edge">
+<title>n64&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2511.44,-671.01C2475.13,-659.92 2429.34,-645.92 2400.86,-637.21"/>
+</g>
+<!-- n65 -->
+<g id="node66" class="node">
+<title>n65</title>
+<g id="a_node66"><a xlink:title="TypeTuple: [ &#160;Ctrl, MemTop, i64]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2718.32,-707C2718.32,-707 2643.68,-707 2643.68,-707 2637.68,-707 2631.68,-701 2631.68,-695 2631.68,-695 2631.68,-683 2631.68,-683 2631.68,-677 2637.68,-671 2643.68,-671 2643.68,-671 2718.32,-671 2718.32,-671 2724.32,-671 2730.32,-677 2730.32,-683 2730.32,-683 2730.32,-695 2730.32,-695 2730.32,-701 2724.32,-707 2718.32,-707"/>
+<text text-anchor="middle" x="2681" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;Ctrl, MemTop, i64]</text>
+</a>
+</g>
+</g>
+<!-- n65&#45;&gt;n63 -->
+<g id="edge86" class="edge">
+<title>n65&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2631.7,-671.92C2630.45,-671.6 2629.22,-671.3 2628,-671 2546.32,-651.26 2447.63,-637.86 2400.95,-632.14"/>
+</g>
+<!-- n66 -->
+<g id="node67" class="node">
+<title>n66</title>
+<g id="a_node67"><a xlink:title="TypeTuple: [ &#160;Ctrl, ~Ctrl]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2155.07,-707C2155.07,-707 2114.93,-707 2114.93,-707 2108.93,-707 2102.93,-701 2102.93,-695 2102.93,-695 2102.93,-683 2102.93,-683 2102.93,-677 2108.93,-671 2114.93,-671 2114.93,-671 2155.07,-671 2155.07,-671 2161.07,-671 2167.07,-677 2167.07,-683 2167.07,-683 2167.07,-695 2167.07,-695 2167.07,-701 2161.07,-707 2155.07,-707"/>
+<text text-anchor="middle" x="2135" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;Ctrl, ~Ctrl]</text>
+</a>
+</g>
+</g>
+<!-- n66&#45;&gt;n63 -->
+<g id="edge87" class="edge">
+<title>n66&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2166.7,-672.88C2168.48,-672.21 2170.25,-671.57 2172,-671 2233.08,-650.91 2307.81,-638.34 2347.03,-632.63"/>
+</g>
+<!-- n67 -->
+<g id="node68" class="node">
+<title>n67</title>
+<g id="a_node68"><a xlink:title="TypeRPC: $[ALL]">
+<path fill="#f4d4b5" stroke="#647674" stroke-width="0.65" d="M2781,-646C2781,-646 2751,-646 2751,-646 2745,-646 2739,-640 2739,-634 2739,-634 2739,-622 2739,-622 2739,-616 2745,-610 2751,-610 2751,-610 2781,-610 2781,-610 2787,-610 2793,-616 2793,-622 2793,-622 2793,-634 2793,-634 2793,-640 2787,-646 2781,-646"/>
+<text text-anchor="middle" x="2766" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">$[ALL]</text>
+</a>
+</g>
+</g>
+<!-- n67&#45;&gt;n0 -->
+<g id="edge88" class="edge">
+<title>n67&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2739.3,-626.49C2674.08,-623.7 2512,-606.74 2512,-507 2512,-507 2512,-507 2512,-139 2512,-30.7 1635.11,-20.14 1468.98,-19.11"/>
+</g>
+<!-- n68 -->
+<g id="node69" class="node">
+<title>n68</title>
+<g id="a_node69"><a xlink:title="TypeRPC: $[2]">
+<path fill="#f4d4b5" stroke="#647674" stroke-width="0.65" d="M2781,-707C2781,-707 2751,-707 2751,-707 2745,-707 2739,-701 2739,-695 2739,-695 2739,-683 2739,-683 2739,-677 2745,-671 2751,-671 2751,-671 2781,-671 2781,-671 2787,-671 2793,-677 2793,-683 2793,-683 2793,-695 2793,-695 2793,-701 2787,-707 2781,-707"/>
+<text text-anchor="middle" x="2766" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">$[2]</text>
+</a>
+</g>
+</g>
+<!-- n68&#45;&gt;n67 -->
+<g id="edge89" class="edge">
+<title>n68&#45;&gt;n67</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2766,-671.25C2766,-663.35 2766,-653.93 2766,-646"/>
+</g>
+<!-- n69 -->
+<g id="node70" class="node">
+<title>n69</title>
+<g id="a_node70"><a xlink:title="TypeConAryB: [&quot;abc&quot;]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1344,-524C1344,-524 1314,-524 1314,-524 1308,-524 1302,-518 1302,-512 1302,-512 1302,-500 1302,-500 1302,-494 1308,-488 1314,-488 1314,-488 1344,-488 1344,-488 1350,-488 1356,-494 1356,-500 1356,-500 1356,-512 1356,-512 1356,-518 1350,-524 1344,-524"/>
+<text text-anchor="middle" x="1329" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">[&quot;abc&quot;]</text>
+</a>
+</g>
+</g>
+<!-- n69&#45;&gt;n13 -->
+<g id="edge90" class="edge">
+<title>n69&#45;&gt;n13</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1322.47,-488.25C1319.39,-480.35 1315.72,-470.93 1312.63,-463"/>
+</g>
+<!-- n140 -->
+<g id="node141" class="node">
+<title>n140</title>
+<g id="a_node141"><a xlink:title="TypeConAryB: [&quot;abc&quot;]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1344,-341C1344,-341 1314,-341 1314,-341 1308,-341 1302,-335 1302,-329 1302,-329 1302,-317 1302,-317 1302,-311 1308,-305 1314,-305 1314,-305 1344,-305 1344,-305 1350,-305 1356,-311 1356,-317 1356,-317 1356,-329 1356,-329 1356,-335 1350,-341 1344,-341"/>
+<text text-anchor="middle" x="1329" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[&quot;abc&quot;]</text>
+</a>
+</g>
+</g>
+<!-- n69&#45;&gt;n140 -->
+<g id="edge91" class="edge">
+<title>n69&#45;&gt;n140</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1341.7,-488.38C1346.56,-481.02 1351.52,-472 1354,-463 1365.43,-421.43 1365.43,-407.57 1354,-366 1351.52,-357 1346.56,-347.98 1341.7,-340.62"/>
+</g>
+<!-- n70 -->
+<g id="node71" class="node">
+<title>n70</title>
+<g id="a_node71"><a xlink:title="TypeConAryB: [&quot;abcd&quot;]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1407,-524C1407,-524 1377,-524 1377,-524 1371,-524 1365,-518 1365,-512 1365,-512 1365,-500 1365,-500 1365,-494 1371,-488 1377,-488 1377,-488 1407,-488 1407,-488 1413,-488 1419,-494 1419,-500 1419,-500 1419,-512 1419,-512 1419,-518 1413,-524 1407,-524"/>
+<text text-anchor="middle" x="1392" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">[&quot;abcd&quot;]</text>
+</a>
+</g>
+</g>
+<!-- n70&#45;&gt;n13 -->
+<g id="edge92" class="edge">
+<title>n70&#45;&gt;n13</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1367.59,-488.25C1356.07,-480.35 1342.34,-470.93 1330.77,-463"/>
+</g>
+<!-- n141 -->
+<g id="node142" class="node">
+<title>n141</title>
+<g id="a_node142"><a xlink:title="TypeConAryB: [&quot;abcd&quot;]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1407,-341C1407,-341 1377,-341 1377,-341 1371,-341 1365,-335 1365,-329 1365,-329 1365,-317 1365,-317 1365,-311 1371,-305 1377,-305 1377,-305 1407,-305 1407,-305 1413,-305 1419,-311 1419,-317 1419,-317 1419,-329 1419,-329 1419,-335 1413,-341 1407,-341"/>
+<text text-anchor="middle" x="1392" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[&quot;abcd&quot;]</text>
+</a>
+</g>
+</g>
+<!-- n70&#45;&gt;n141 -->
+<g id="edge93" class="edge">
+<title>n70&#45;&gt;n141</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1392,-488.3C1392,-453.9 1392,-375.51 1392,-340.93"/>
+</g>
+<!-- n71 -->
+<g id="node72" class="node">
+<title>n71</title>
+<g id="a_node72"><a xlink:title="TypeConAryI: [i32]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1281,-524C1281,-524 1251,-524 1251,-524 1245,-524 1239,-518 1239,-512 1239,-512 1239,-500 1239,-500 1239,-494 1245,-488 1251,-488 1251,-488 1281,-488 1281,-488 1287,-488 1293,-494 1293,-500 1293,-500 1293,-512 1293,-512 1293,-518 1287,-524 1281,-524"/>
+<text text-anchor="middle" x="1266" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">[i32]</text>
+</a>
+</g>
+</g>
+<!-- n71&#45;&gt;n13 -->
+<g id="edge94" class="edge">
+<title>n71&#45;&gt;n13</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1277.36,-488.25C1282.71,-480.35 1289.1,-470.93 1294.48,-463"/>
+</g>
+<!-- n142 -->
+<g id="node143" class="node">
+<title>n142</title>
+<g id="a_node143"><a xlink:title="TypeConAryI: [i32]">
+<path fill="#d9d5cc" stroke="#647674" stroke-width="0.65" d="M1281,-341C1281,-341 1251,-341 1251,-341 1245,-341 1239,-335 1239,-329 1239,-329 1239,-317 1239,-317 1239,-311 1245,-305 1251,-305 1251,-305 1281,-305 1281,-305 1287,-305 1293,-311 1293,-317 1293,-317 1293,-329 1293,-329 1293,-335 1287,-341 1281,-341"/>
+<text text-anchor="middle" x="1266" y="-319.5" font-family="Arial" font-size="10.00" fill="#172e35">[i32]</text>
+</a>
+</g>
+</g>
+<!-- n71&#45;&gt;n142 -->
+<g id="edge95" class="edge">
+<title>n71&#45;&gt;n142</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1292.92,-490.12C1312.81,-479 1336.67,-465.32 1338,-463 1345.97,-449.13 1340.41,-442.82 1338,-427 1333.73,-398.93 1335.06,-389.41 1319,-366 1312.16,-356.03 1302.24,-347.28 1292.83,-340.39"/>
+</g>
+<!-- n72 -->
+<g id="node73" class="node">
+<title>n72</title>
+<g id="a_node73"><a xlink:title="Type: Top">
+<path fill="#172e35" stroke="#647674" stroke-width="0.65" d="M1298,-829C1298,-829 1268,-829 1268,-829 1262,-829 1256,-823 1256,-817 1256,-817 1256,-805 1256,-805 1256,-799 1262,-793 1268,-793 1268,-793 1298,-793 1298,-793 1304,-793 1310,-799 1310,-805 1310,-805 1310,-817 1310,-817 1310,-823 1304,-829 1298,-829"/>
+<text text-anchor="middle" x="1283" y="-807.5" font-family="Arial" font-size="10.00" fill="white">TOP</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n48 -->
+<g id="edge96" class="edge">
+<title>n72&#45;&gt;n48</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1256.21,-809.76C1087.97,-808.19 180.39,-798.36 61,-768 58.57,-767.38 56.11,-766.57 53.69,-765.64"/>
+</g>
+<!-- n72&#45;&gt;n50 -->
+<g id="edge97" class="edge">
+<title>n72&#45;&gt;n50</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1256.21,-810.25C1077.73,-811.59 68,-813.67 68,-690 68,-690 68,-690 68,-261 68,-225.07 70.58,-220.58 165,-183 263.59,-143.76 392.34,-139.99 447.28,-140.37"/>
+</g>
+<!-- n73 -->
+<g id="node74" class="node">
+<title>n73</title>
+<g id="a_node74"><a xlink:title="Type: ~Ctrl">
+<path fill="#faedce" stroke="#647674" stroke-width="0.65" d="M324,-768C324,-768 294,-768 294,-768 288,-768 282,-762 282,-756 282,-756 282,-744 282,-744 282,-738 288,-732 294,-732 294,-732 324,-732 324,-732 330,-732 336,-738 336,-744 336,-744 336,-756 336,-756 336,-762 330,-768 324,-768"/>
+<text text-anchor="middle" x="309" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">~Ctrl</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n73 -->
+<g id="edge98" class="edge">
+<title>n72&#45;&gt;n73</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1256.12,-809.09C1154.12,-805.54 781.36,-791.63 475,-768 425.9,-764.21 368.81,-757.96 335.99,-754.18"/>
+</g>
+<!-- n75 -->
+<g id="node76" class="node">
+<title>n75</title>
+<g id="a_node76"><a xlink:title="TypePtr: ~ptr">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M522,-768C522,-768 492,-768 492,-768 486,-768 480,-762 480,-756 480,-756 480,-744 480,-744 480,-738 486,-732 492,-732 492,-732 522,-732 522,-732 528,-732 534,-738 534,-744 534,-744 534,-756 534,-756 534,-762 528,-768 522,-768"/>
+<text text-anchor="middle" x="507" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">~ptr</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n75 -->
+<g id="edge99" class="edge">
+<title>n72&#45;&gt;n75</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1256.29,-807.97C1137.03,-798.9 653.85,-762.16 534,-753.05"/>
+</g>
+<!-- n78 -->
+<g id="node79" class="node">
+<title>n78</title>
+<g id="a_node79"><a xlink:title="TypeInteger: ~i64">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1140,-768C1140,-768 1110,-768 1110,-768 1104,-768 1098,-762 1098,-756 1098,-756 1098,-744 1098,-744 1098,-738 1104,-732 1110,-732 1110,-732 1140,-732 1140,-732 1146,-732 1152,-738 1152,-744 1152,-744 1152,-756 1152,-756 1152,-762 1146,-768 1140,-768"/>
+<text text-anchor="middle" x="1125" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">~i64</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n78 -->
+<g id="edge100" class="edge">
+<title>n72&#45;&gt;n78</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1256.2,-799.99C1227.14,-789.14 1181.04,-771.93 1151.93,-761.06"/>
+</g>
+<!-- n99 -->
+<g id="node100" class="node">
+<title>n99</title>
+<g id="a_node100"><a xlink:title="TypeFloat: ~flt">
+<path fill="#c7eee9" stroke="#647674" stroke-width="0.65" d="M1256,-768C1256,-768 1226,-768 1226,-768 1220,-768 1214,-762 1214,-756 1214,-756 1214,-744 1214,-744 1214,-738 1220,-732 1226,-732 1226,-732 1256,-732 1256,-732 1262,-732 1268,-738 1268,-744 1268,-744 1268,-756 1268,-756 1268,-762 1262,-768 1256,-768"/>
+<text text-anchor="middle" x="1241" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">~flt</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n99 -->
+<g id="edge101" class="edge">
+<title>n72&#45;&gt;n99</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1271.08,-793.25C1265.45,-785.35 1258.75,-775.93 1253.1,-768"/>
+</g>
+<!-- n118 -->
+<g id="node119" class="node">
+<title>n118</title>
+<g id="a_node119"><a xlink:title="TypeMem: MemTop">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1345,-768C1345,-768 1315,-768 1315,-768 1309,-768 1303,-762 1303,-756 1303,-756 1303,-744 1303,-744 1303,-738 1309,-732 1315,-732 1315,-732 1345,-732 1345,-732 1351,-732 1357,-738 1357,-744 1357,-744 1357,-756 1357,-756 1357,-762 1351,-768 1345,-768"/>
+<text text-anchor="middle" x="1330" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">MemTop</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n118 -->
+<g id="edge102" class="edge">
+<title>n72&#45;&gt;n118</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1296.34,-793.25C1302.64,-785.35 1310.14,-775.93 1316.46,-768"/>
+</g>
+<!-- n120 -->
+<g id="node121" class="node">
+<title>n120</title>
+<g id="a_node121"><a xlink:title="Field: !test:&#45;2 : ~nil">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1434,-768C1434,-768 1404,-768 1404,-768 1398,-768 1392,-762 1392,-756 1392,-756 1392,-744 1392,-744 1392,-738 1398,-732 1404,-732 1404,-732 1434,-732 1434,-732 1440,-732 1446,-738 1446,-744 1446,-744 1446,-756 1446,-756 1446,-762 1440,-768 1434,-768"/>
+<text text-anchor="middle" x="1419" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">!test</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n120 -->
+<g id="edge103" class="edge">
+<title>n72&#45;&gt;n120</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1309.87,-798.34C1333.71,-788 1368.36,-772.97 1392.19,-762.63"/>
+</g>
+<!-- n121 -->
+<g id="node122" class="node">
+<title>n121</title>
+<g id="a_node122"><a xlink:title="Field: flt :&#45;2 : ~f32">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1538,-219C1538,-219 1508,-219 1508,-219 1502,-219 1496,-213 1496,-207 1496,-207 1496,-195 1496,-195 1496,-189 1502,-183 1508,-183 1508,-183 1538,-183 1538,-183 1544,-183 1550,-189 1550,-195 1550,-195 1550,-207 1550,-207 1550,-213 1544,-219 1538,-219"/>
+<text text-anchor="middle" x="1523" y="-197.5" font-family="Arial" font-size="10.00" fill="#172e35">flt </text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n121 -->
+<g id="edge104" class="edge">
+<title>n72&#45;&gt;n121</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1309.87,-809.96C1345.8,-808.54 1409.73,-801.11 1451,-768 1481.23,-743.75 1490,-728.76 1490,-690 1490,-690 1490,-690 1490,-322 1490,-283.97 1505.6,-241.51 1515.35,-218.69"/>
+</g>
+<!-- n122 -->
+<g id="node123" class="node">
+<title>n122</title>
+<g id="a_node123"><a xlink:title="TypeStruct: StructTop">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1792,-768C1792,-768 1762,-768 1762,-768 1756,-768 1750,-762 1750,-756 1750,-756 1750,-744 1750,-744 1750,-738 1756,-732 1762,-732 1762,-732 1792,-732 1792,-732 1798,-732 1804,-738 1804,-744 1804,-744 1804,-756 1804,-756 1804,-762 1798,-768 1792,-768"/>
+<text text-anchor="middle" x="1777" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">StructTop</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n122 -->
+<g id="edge105" class="edge">
+<title>n72&#45;&gt;n122</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1309.91,-806.79C1395.98,-796.51 1663.96,-764.5 1750.07,-754.22"/>
+</g>
+<!-- n134 -->
+<g id="node135" class="node">
+<title>n134</title>
+<g id="a_node135"><a xlink:title="TypeTuple: [TOP]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2389,-768C2389,-768 2359,-768 2359,-768 2353,-768 2347,-762 2347,-756 2347,-756 2347,-744 2347,-744 2347,-738 2353,-732 2359,-732 2359,-732 2389,-732 2389,-732 2395,-732 2401,-738 2401,-744 2401,-744 2401,-756 2401,-756 2401,-762 2395,-768 2389,-768"/>
+<text text-anchor="middle" x="2374" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">[TOP]</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n134 -->
+<g id="edge106" class="edge">
+<title>n72&#45;&gt;n134</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1309.97,-808.54C1460.75,-800.39 2197.9,-760.52 2347.49,-752.43"/>
+</g>
+<!-- n138 -->
+<g id="node139" class="node">
+<title>n138</title>
+<g id="a_node139"><a xlink:title="TypeRPC: $[]">
+<path fill="#f4d4b5" stroke="#647674" stroke-width="0.65" d="M2781,-768C2781,-768 2751,-768 2751,-768 2745,-768 2739,-762 2739,-756 2739,-756 2739,-744 2739,-744 2739,-738 2745,-732 2751,-732 2751,-732 2781,-732 2781,-732 2787,-732 2793,-738 2793,-744 2793,-744 2793,-756 2793,-756 2793,-762 2787,-768 2781,-768"/>
+<text text-anchor="middle" x="2766" y="-746.5" font-family="Arial" font-size="10.00" fill="#172e35">$[]</text>
+</a>
+</g>
+</g>
+<!-- n72&#45;&gt;n138 -->
+<g id="edge107" class="edge">
+<title>n72&#45;&gt;n138</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1309.95,-809.09C1434.67,-804.86 1968.39,-786.52 2406,-768 2530.71,-762.72 2679.68,-755.35 2739.36,-752.35"/>
+</g>
+<!-- n73&#45;&gt;n1 -->
+<g id="edge108" class="edge">
+<title>n73&#45;&gt;n1</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M282.22,-746.91C223.18,-740.7 87,-716.84 87,-629 87,-629 87,-629 87,-261 87,-197.36 580.73,-153.05 702.23,-143.11"/>
+</g>
+<!-- n74 -->
+<g id="node75" class="node">
+<title>n74</title>
+<g id="a_node75"><a xlink:title="Type: ~nil">
+<path fill="#faedce" stroke="#647674" stroke-width="0.65" d="M332,-585C332,-585 302,-585 302,-585 296,-585 290,-579 290,-573 290,-573 290,-561 290,-561 290,-555 296,-549 302,-549 302,-549 332,-549 332,-549 338,-549 344,-555 344,-561 344,-561 344,-573 344,-573 344,-579 338,-585 332,-585"/>
+<text text-anchor="middle" x="317" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~nil</text>
+</a>
+</g>
+</g>
+<!-- n74&#45;&gt;n4 -->
+<g id="edge109" class="edge">
+<title>n74&#45;&gt;n4</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M298.56,-549.38C292.01,-542.29 285.43,-533.46 282,-524 276.55,-508.96 274.95,-502.36 282,-488 310.48,-430.03 387.91,-402.18 429.21,-391.1"/>
+</g>
+<!-- n76 -->
+<g id="node77" class="node">
+<title>n76</title>
+<g id="a_node77"><a xlink:title="TypePtr: ~nptr">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M491,-707C491,-707 461,-707 461,-707 455,-707 449,-701 449,-695 449,-695 449,-683 449,-683 449,-677 455,-671 461,-671 461,-671 491,-671 491,-671 497,-671 503,-677 503,-683 503,-683 503,-695 503,-695 503,-701 497,-707 491,-707"/>
+<text text-anchor="middle" x="476" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">~nptr</text>
+</a>
+</g>
+</g>
+<!-- n75&#45;&gt;n76 -->
+<g id="edge110" class="edge">
+<title>n75&#45;&gt;n76</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M498.2,-732.25C494.05,-724.35 489.1,-714.93 484.93,-707"/>
+</g>
+<!-- n102 -->
+<g id="node103" class="node">
+<title>n102</title>
+<g id="a_node103"><a xlink:title="TypeMemPtr: PtrTop">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M300,-707C300,-707 270,-707 270,-707 264,-707 258,-701 258,-695 258,-695 258,-683 258,-683 258,-677 264,-671 270,-671 270,-671 300,-671 300,-671 306,-671 312,-677 312,-683 312,-683 312,-695 312,-695 312,-701 306,-707 300,-707"/>
+<text text-anchor="middle" x="285" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">PtrTop</text>
+</a>
+</g>
+</g>
+<!-- n75&#45;&gt;n102 -->
+<g id="edge111" class="edge">
+<title>n75&#45;&gt;n102</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M480.22,-741.88C437.55,-730.54 354.6,-708.5 311.87,-697.14"/>
+</g>
+<!-- n107 -->
+<g id="node108" class="node">
+<title>n107</title>
+<g id="a_node108"><a xlink:title="TypeFunPtr: FunTop">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M554,-707C554,-707 524,-707 524,-707 518,-707 512,-701 512,-695 512,-695 512,-683 512,-683 512,-677 518,-671 524,-671 524,-671 554,-671 554,-671 560,-671 566,-677 566,-683 566,-683 566,-695 566,-695 566,-701 560,-707 554,-707"/>
+<text text-anchor="middle" x="539" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">FunTop</text>
+</a>
+</g>
+</g>
+<!-- n75&#45;&gt;n107 -->
+<g id="edge112" class="edge">
+<title>n75&#45;&gt;n107</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M516.08,-732.25C520.37,-724.35 525.48,-714.93 529.78,-707"/>
+</g>
+<!-- n76&#45;&gt;n2 -->
+<g id="edge113" class="edge">
+<title>n76&#45;&gt;n2</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M502.95,-672.97C504.31,-672.29 505.67,-671.63 507,-671 534.26,-658.18 547.58,-666.12 570,-646 583.46,-633.92 576.12,-622.7 589,-610 606.41,-592.83 616.31,-596.29 638,-585 639.67,-584.13 641.4,-583.23 643.13,-582.32"/>
+</g>
+<!-- n76&#45;&gt;n40 -->
+<g id="edge114" class="edge">
+<title>n76&#45;&gt;n40</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M493.88,-671.25C502.32,-663.35 512.38,-653.93 520.85,-646"/>
+</g>
+<!-- n101 -->
+<g id="node102" class="node">
+<title>n101</title>
+<g id="a_node102"><a xlink:title="TypeMemPtr: ~*StructTop">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M228.19,-646C228.19,-646 191.81,-646 191.81,-646 185.81,-646 179.81,-640 179.81,-634 179.81,-634 179.81,-622 179.81,-622 179.81,-616 185.81,-610 191.81,-610 191.81,-610 228.19,-610 228.19,-610 234.19,-610 240.19,-616 240.19,-622 240.19,-622 240.19,-634 240.19,-634 240.19,-640 234.19,-646 228.19,-646"/>
+<text text-anchor="middle" x="210" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">~*StructTop</text>
+</a>
+</g>
+</g>
+<!-- n76&#45;&gt;n101 -->
+<g id="edge115" class="edge">
+<title>n76&#45;&gt;n101</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M449.19,-684.16C407.77,-677.94 325.88,-664.45 258,-646 252.11,-644.4 245.91,-642.43 240,-640.4"/>
+</g>
+<!-- n105 -->
+<g id="node106" class="node">
+<title>n105</title>
+<g id="a_node106"><a xlink:title="TypeFunPtr: ~{ ~i64 ~f32 &#45;&gt; ~i64 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M269,-585C269,-585 239,-585 239,-585 233,-585 227,-579 227,-573 227,-573 227,-561 227,-561 227,-555 233,-549 239,-549 239,-549 269,-549 269,-549 275,-549 281,-555 281,-561 281,-561 281,-573 281,-573 281,-579 275,-585 269,-585"/>
+<text text-anchor="middle" x="254" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n76&#45;&gt;n105 -->
+<g id="edge116" class="edge">
+<title>n76&#45;&gt;n105</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M449.26,-688.57C410.92,-688.03 339.92,-681.77 294,-646 274.19,-630.57 263.3,-602.63 258.06,-584.71"/>
+</g>
+<!-- n114 -->
+<g id="node115" class="node">
+<title>n114</title>
+<g id="a_node115"><a xlink:title="TypeFunPtr: ~{ &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M491,-646C491,-646 461,-646 461,-646 455,-646 449,-640 449,-634 449,-634 449,-622 449,-622 449,-616 455,-610 461,-610 461,-610 491,-610 491,-610 497,-610 503,-616 503,-622 503,-622 503,-634 503,-634 503,-640 497,-646 491,-646"/>
+<text text-anchor="middle" x="476" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n76&#45;&gt;n114 -->
+<g id="edge117" class="edge">
+<title>n76&#45;&gt;n114</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M476,-671.25C476,-663.35 476,-653.93 476,-646"/>
+</g>
+<!-- n77 -->
+<g id="node78" class="node">
+<title>n77</title>
+<g id="a_node78"><a xlink:title="TypeInteger: ~i32">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1088,-707C1088,-707 1058,-707 1058,-707 1052,-707 1046,-701 1046,-695 1046,-695 1046,-683 1046,-683 1046,-677 1052,-671 1058,-671 1058,-671 1088,-671 1088,-671 1094,-671 1100,-677 1100,-683 1100,-683 1100,-695 1100,-695 1100,-701 1094,-707 1088,-707"/>
+<text text-anchor="middle" x="1073" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">~i32</text>
+</a>
+</g>
+</g>
+<!-- n81 -->
+<g id="node82" class="node">
+<title>n81</title>
+<g id="a_node82"><a xlink:title="TypeInteger: ~u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1088,-646C1088,-646 1058,-646 1058,-646 1052,-646 1046,-640 1046,-634 1046,-634 1046,-622 1046,-622 1046,-616 1052,-610 1058,-610 1058,-610 1088,-610 1088,-610 1094,-610 1100,-616 1100,-622 1100,-622 1100,-634 1100,-634 1100,-640 1094,-646 1088,-646"/>
+<text text-anchor="middle" x="1073" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">~u8</text>
+</a>
+</g>
+</g>
+<!-- n77&#45;&gt;n81 -->
+<g id="edge118" class="edge">
+<title>n77&#45;&gt;n81</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1073,-671.25C1073,-663.35 1073,-653.93 1073,-646"/>
+</g>
+<!-- n97 -->
+<g id="node98" class="node">
+<title>n97</title>
+<g id="a_node98"><a xlink:title="TypeInteger: ~[&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M951,-646C951,-646 921,-646 921,-646 915,-646 909,-640 909,-634 909,-634 909,-622 909,-622 909,-616 915,-610 921,-610 921,-610 951,-610 951,-610 957,-610 963,-616 963,-622 963,-622 963,-634 963,-634 963,-640 957,-646 951,-646"/>
+<text text-anchor="middle" x="936" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n77&#45;&gt;n97 -->
+<g id="edge119" class="edge">
+<title>n77&#45;&gt;n97</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1046.26,-676.48C1022.12,-666.09 986.79,-650.87 962.67,-640.49"/>
+</g>
+<!-- n78&#45;&gt;n77 -->
+<g id="edge120" class="edge">
+<title>n78&#45;&gt;n77</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1110.24,-732.25C1103.27,-724.35 1094.97,-714.93 1087.98,-707"/>
+</g>
+<!-- n79 -->
+<g id="node80" class="node">
+<title>n79</title>
+<g id="a_node80"><a xlink:title="TypeInteger: ~bool">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1074,-585C1074,-585 1044,-585 1044,-585 1038,-585 1032,-579 1032,-573 1032,-573 1032,-561 1032,-561 1032,-555 1038,-549 1044,-549 1044,-549 1074,-549 1074,-549 1080,-549 1086,-555 1086,-561 1086,-561 1086,-573 1086,-573 1086,-579 1080,-585 1074,-585"/>
+<text text-anchor="middle" x="1059" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~bool</text>
+</a>
+</g>
+</g>
+<!-- n79&#45;&gt;n10 -->
+<g id="edge121" class="edge">
+<title>n79&#45;&gt;n10</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1047.93,-549.25C1042.7,-541.35 1036.48,-531.93 1031.23,-524"/>
+</g>
+<!-- n79&#45;&gt;n13 -->
+<g id="edge122" class="edge">
+<title>n79&#45;&gt;n13</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1085.99,-550.97C1087.66,-550.26 1089.34,-549.59 1091,-549 1144.36,-529.95 1170.6,-557.89 1216,-524 1230.5,-513.18 1222.52,-501.1 1235,-488 1247.45,-474.93 1264.84,-464.56 1279.3,-457.38"/>
+</g>
+<!-- n83 -->
+<g id="node84" class="node">
+<title>n83</title>
+<g id="a_node84"><a xlink:title="TypeInteger: ~bool">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1075,-463C1075,-463 1045,-463 1045,-463 1039,-463 1033,-457 1033,-451 1033,-451 1033,-439 1033,-439 1033,-433 1039,-427 1045,-427 1045,-427 1075,-427 1075,-427 1081,-427 1087,-433 1087,-439 1087,-439 1087,-451 1087,-451 1087,-457 1081,-463 1075,-463"/>
+<text text-anchor="middle" x="1060" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">~bool</text>
+</a>
+</g>
+</g>
+<!-- n79&#45;&gt;n83 -->
+<g id="edge123" class="edge">
+<title>n79&#45;&gt;n83</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1059.14,-549.06C1059.33,-526.19 1059.67,-485.68 1059.86,-462.85"/>
+</g>
+<!-- n80 -->
+<g id="node81" class="node">
+<title>n80</title>
+<g id="a_node81"><a xlink:title="TypeInteger: ~i1">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M982,-585C982,-585 952,-585 952,-585 946,-585 940,-579 940,-573 940,-573 940,-561 940,-561 940,-555 946,-549 952,-549 952,-549 982,-549 982,-549 988,-549 994,-555 994,-561 994,-561 994,-573 994,-573 994,-579 988,-585 982,-585"/>
+<text text-anchor="middle" x="967" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~i1</text>
+</a>
+</g>
+</g>
+<!-- n80&#45;&gt;n10 -->
+<g id="edge124" class="edge">
+<title>n80&#45;&gt;n10</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M982.05,-549.25C989.15,-541.35 997.6,-531.93 1004.73,-524"/>
+</g>
+<!-- n80&#45;&gt;n15 -->
+<g id="edge125" class="edge">
+<title>n80&#45;&gt;n15</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M958.77,-549.25C954.88,-541.35 950.25,-531.93 946.35,-524"/>
+</g>
+<!-- n81&#45;&gt;n79 -->
+<g id="edge126" class="edge">
+<title>n81&#45;&gt;n79</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1069.03,-610.25C1067.15,-602.35 1064.92,-592.93 1063.03,-585"/>
+</g>
+<!-- n92 -->
+<g id="node93" class="node">
+<title>n92</title>
+<g id="a_node93"><a xlink:title="TypeInteger: ~u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1137,-585C1137,-585 1107,-585 1107,-585 1101,-585 1095,-579 1095,-573 1095,-573 1095,-561 1095,-561 1095,-555 1101,-549 1107,-549 1107,-549 1137,-549 1137,-549 1143,-549 1149,-555 1149,-561 1149,-561 1149,-573 1149,-573 1149,-579 1143,-585 1137,-585"/>
+<text text-anchor="middle" x="1122" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~u8</text>
+</a>
+</g>
+</g>
+<!-- n81&#45;&gt;n92 -->
+<g id="edge127" class="edge">
+<title>n81&#45;&gt;n92</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1086.91,-610.25C1093.47,-602.35 1101.29,-592.93 1107.88,-585"/>
+</g>
+<!-- n96 -->
+<g id="node97" class="node">
+<title>n96</title>
+<g id="a_node97"><a xlink:title="TypeInteger: ~[1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1200,-585C1200,-585 1170,-585 1170,-585 1164,-585 1158,-579 1158,-573 1158,-573 1158,-561 1158,-561 1158,-555 1164,-549 1170,-549 1170,-549 1200,-549 1200,-549 1206,-549 1212,-555 1212,-561 1212,-561 1212,-573 1212,-573 1212,-579 1206,-585 1200,-585"/>
+<text text-anchor="middle" x="1185" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n81&#45;&gt;n96 -->
+<g id="edge128" class="edge">
+<title>n81&#45;&gt;n96</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1099.87,-612.68C1101.6,-611.77 1103.33,-610.87 1105,-610 1126.69,-598.71 1132.39,-596.43 1154,-585 1155.41,-584.25 1156.85,-583.48 1158.31,-582.7"/>
+</g>
+<!-- n82&#45;&gt;n7 -->
+<g id="edge129" class="edge">
+<title>n82&#45;&gt;n7</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1000.71,-366.25C1011.43,-358.35 1024.2,-348.93 1034.95,-341"/>
+</g>
+<!-- n82&#45;&gt;n8 -->
+<g id="edge130" class="edge">
+<title>n82&#45;&gt;n8</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M978,-366.25C978,-358.35 978,-348.93 978,-341"/>
+</g>
+<!-- n83&#45;&gt;n11 -->
+<g id="edge131" class="edge">
+<title>n83&#45;&gt;n11</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1065.39,-427.25C1067.94,-419.35 1070.97,-409.93 1073.53,-402"/>
+</g>
+<!-- n83&#45;&gt;n17 -->
+<g id="edge132" class="edge">
+<title>n83&#45;&gt;n17</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1083.28,-427.25C1094.26,-419.35 1107.35,-409.93 1118.38,-402"/>
+</g>
+<!-- n83&#45;&gt;n18 -->
+<g id="edge133" class="edge">
+<title>n83&#45;&gt;n18</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1033.29,-435.42C1009.9,-427.6 975.18,-415.29 946,-402 944.66,-401.39 943.3,-400.74 941.93,-400.08"/>
+</g>
+<!-- n83&#45;&gt;n82 -->
+<g id="edge134" class="edge">
+<title>n83&#45;&gt;n82</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1036.72,-427.25C1025.74,-419.35 1012.65,-409.93 1001.62,-402"/>
+</g>
+<!-- n84 -->
+<g id="node85" class="node">
+<title>n84</title>
+<g id="a_node85"><a xlink:title="TypeInteger: ~u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1157,-463C1157,-463 1127,-463 1127,-463 1121,-463 1115,-457 1115,-451 1115,-451 1115,-439 1115,-439 1115,-433 1121,-427 1127,-427 1127,-427 1157,-427 1157,-427 1163,-427 1169,-433 1169,-439 1169,-439 1169,-451 1169,-451 1169,-457 1163,-463 1157,-463"/>
+<text text-anchor="middle" x="1142" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">~u8</text>
+</a>
+</g>
+</g>
+<!-- n84&#45;&gt;n82 -->
+<g id="edge135" class="edge">
+<title>n84&#45;&gt;n82</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1115.29,-434.39C1084.88,-423.45 1035.49,-405.68 1004.98,-394.7"/>
+</g>
+<!-- n85 -->
+<g id="node86" class="node">
+<title>n85</title>
+<g id="a_node86"><a xlink:title="TypeInteger: ~[1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1302,-402C1302,-402 1272,-402 1272,-402 1266,-402 1260,-396 1260,-390 1260,-390 1260,-378 1260,-378 1260,-372 1266,-366 1272,-366 1272,-366 1302,-366 1302,-366 1308,-366 1314,-372 1314,-378 1314,-378 1314,-390 1314,-390 1314,-396 1308,-402 1302,-402"/>
+<text text-anchor="middle" x="1287" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">~[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n84&#45;&gt;n85 -->
+<g id="edge136" class="edge">
+<title>n84&#45;&gt;n85</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1168.93,-433.04C1194.98,-422.44 1234.22,-406.48 1260.21,-395.9"/>
+</g>
+<!-- n85&#45;&gt;n7 -->
+<g id="edge137" class="edge">
+<title>n85&#45;&gt;n7</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1260.22,-373.15C1252.76,-370.61 1244.62,-368.03 1237,-366 1180.99,-351.08 1165.06,-355.75 1109,-341 1101.06,-338.91 1092.55,-336.25 1084.8,-333.65"/>
+</g>
+<!-- n85&#45;&gt;n140 -->
+<g id="edge138" class="edge">
+<title>n85&#45;&gt;n140</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1298.92,-366.25C1304.55,-358.35 1311.25,-348.93 1316.9,-341"/>
+</g>
+<!-- n85&#45;&gt;n141 -->
+<g id="edge139" class="edge">
+<title>n85&#45;&gt;n141</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1313.77,-367.96C1329.57,-359.08 1349.49,-347.89 1365.28,-339.01"/>
+</g>
+<!-- n85&#45;&gt;n142 -->
+<g id="edge140" class="edge">
+<title>n85&#45;&gt;n142</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1281.04,-366.25C1278.23,-358.35 1274.87,-348.93 1272.05,-341"/>
+</g>
+<!-- n86 -->
+<g id="node87" class="node">
+<title>n86</title>
+<g id="a_node87"><a xlink:title="TypeInteger: ~[&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M873,-463C873,-463 843,-463 843,-463 837,-463 831,-457 831,-451 831,-451 831,-439 831,-439 831,-433 837,-427 843,-427 843,-427 873,-427 873,-427 879,-427 885,-433 885,-439 885,-439 885,-451 885,-451 885,-457 879,-463 873,-463"/>
+<text text-anchor="middle" x="858" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n86&#45;&gt;n82 -->
+<g id="edge141" class="edge">
+<title>n86&#45;&gt;n82</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M884.69,-430.56C887.16,-429.35 889.62,-428.14 892,-427 915.83,-415.53 922.31,-413.76 946,-402 947.69,-401.16 949.42,-400.28 951.17,-399.39"/>
+</g>
+<!-- n87 -->
+<g id="node88" class="node">
+<title>n87</title>
+<g id="a_node88"><a xlink:title="TypeInteger: ~[&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M867,-402C867,-402 837,-402 837,-402 831,-402 825,-396 825,-390 825,-390 825,-378 825,-378 825,-372 831,-366 837,-366 837,-366 867,-366 867,-366 873,-366 879,-372 879,-378 879,-378 879,-390 879,-390 879,-396 873,-402 867,-402"/>
+<text text-anchor="middle" x="852" y="-380.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n86&#45;&gt;n87 -->
+<g id="edge142" class="edge">
+<title>n86&#45;&gt;n87</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M856.3,-427.25C855.49,-419.35 854.54,-409.93 853.73,-402"/>
+</g>
+<!-- n87&#45;&gt;n8 -->
+<g id="edge143" class="edge">
+<title>n87&#45;&gt;n8</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M878.95,-367.97C880.31,-367.29 881.67,-366.63 883,-366 910.26,-353.18 918.66,-353.64 946,-341 947.71,-340.21 949.46,-339.37 951.22,-338.5"/>
+</g>
+<!-- n87&#45;&gt;n26 -->
+<g id="edge144" class="edge">
+<title>n87&#45;&gt;n26</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M852,-366.25C852,-358.35 852,-348.93 852,-341"/>
+</g>
+<!-- n88 -->
+<g id="node89" class="node">
+<title>n88</title>
+<g id="a_node89"><a xlink:title="TypeInteger: ~u8">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1136,-524C1136,-524 1106,-524 1106,-524 1100,-524 1094,-518 1094,-512 1094,-512 1094,-500 1094,-500 1094,-494 1100,-488 1106,-488 1106,-488 1136,-488 1136,-488 1142,-488 1148,-494 1148,-500 1148,-500 1148,-512 1148,-512 1148,-518 1142,-524 1136,-524"/>
+<text text-anchor="middle" x="1121" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">~u8</text>
+</a>
+</g>
+</g>
+<!-- n88&#45;&gt;n22 -->
+<g id="edge145" class="edge">
+<title>n88&#45;&gt;n22</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1147.85,-490.75C1157.99,-483.85 1168.43,-474.52 1174,-463 1180.96,-448.6 1184.16,-439.36 1174,-427 1137.46,-382.57 1098.12,-428.38 1047,-402 1026.33,-391.33 1028.61,-378.52 1009,-366 983.61,-349.79 973.26,-353.82 946,-341 944.67,-340.37 943.31,-339.71 941.95,-339.03"/>
+</g>
+<!-- n88&#45;&gt;n84 -->
+<g id="edge146" class="edge">
+<title>n88&#45;&gt;n84</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1126.96,-488.25C1129.77,-480.35 1133.13,-470.93 1135.95,-463"/>
+</g>
+<!-- n89 -->
+<g id="node90" class="node">
+<title>n89</title>
+<g id="a_node90"><a xlink:title="TypeInteger: ~[1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1239,-463C1239,-463 1209,-463 1209,-463 1203,-463 1197,-457 1197,-451 1197,-451 1197,-439 1197,-439 1197,-433 1203,-427 1209,-427 1209,-427 1239,-427 1239,-427 1245,-427 1251,-433 1251,-439 1251,-439 1251,-451 1251,-451 1251,-457 1245,-463 1239,-463"/>
+<text text-anchor="middle" x="1224" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">~[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n88&#45;&gt;n89 -->
+<g id="edge147" class="edge">
+<title>n88&#45;&gt;n89</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1147.79,-489.65C1163.05,-480.91 1182.1,-470 1197.34,-461.27"/>
+</g>
+<!-- n89&#45;&gt;n11 -->
+<g id="edge148" class="edge">
+<title>n89&#45;&gt;n11</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1197.08,-430.06C1194.71,-428.98 1192.32,-427.94 1190,-427 1155.87,-413.17 1144.96,-416.25 1111,-402 1109.26,-401.27 1107.49,-400.48 1105.72,-399.65"/>
+</g>
+<!-- n89&#45;&gt;n21 -->
+<g id="edge149" class="edge">
+<title>n89&#45;&gt;n21</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1231.56,-427.14C1237.67,-411.05 1244.19,-386.32 1237,-366 1233.68,-356.63 1227.28,-347.81 1220.92,-340.71"/>
+</g>
+<!-- n89&#45;&gt;n85 -->
+<g id="edge150" class="edge">
+<title>n89&#45;&gt;n85</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1241.88,-427.25C1250.32,-419.35 1260.38,-409.93 1268.85,-402"/>
+</g>
+<!-- n90 -->
+<g id="node91" class="node">
+<title>n90</title>
+<g id="a_node91"><a xlink:title="TypeInteger: ~[&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M890,-524C890,-524 860,-524 860,-524 854,-524 848,-518 848,-512 848,-512 848,-500 848,-500 848,-494 854,-488 860,-488 860,-488 890,-488 890,-488 896,-488 902,-494 902,-500 902,-500 902,-512 902,-512 902,-518 896,-524 890,-524"/>
+<text text-anchor="middle" x="875" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n90&#45;&gt;n11 -->
+<g id="edge151" class="edge">
+<title>n90&#45;&gt;n11</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M881.21,-488.14C889.32,-466.49 903.08,-431.2 908,-427 908.7,-426.41 1004.04,-403.2 1052.04,-391.54"/>
+</g>
+<!-- n90&#45;&gt;n86 -->
+<g id="edge152" class="edge">
+<title>n90&#45;&gt;n86</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M870.17,-488.25C867.9,-480.35 865.18,-470.93 862.9,-463"/>
+</g>
+<!-- n91 -->
+<g id="node92" class="node">
+<title>n91</title>
+<g id="a_node92"><a xlink:title="TypeInteger: ~[&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M747,-463C747,-463 717,-463 717,-463 711,-463 705,-457 705,-451 705,-451 705,-439 705,-439 705,-433 711,-427 717,-427 717,-427 747,-427 747,-427 753,-427 759,-433 759,-439 759,-439 759,-451 759,-451 759,-457 753,-463 747,-463"/>
+<text text-anchor="middle" x="732" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n90&#45;&gt;n91 -->
+<g id="edge153" class="edge">
+<title>n90&#45;&gt;n91</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M848.29,-490.35C846.51,-489.52 844.74,-488.73 843,-488 808.63,-473.64 797.28,-477.58 763,-463 761.64,-462.42 760.27,-461.81 758.89,-461.16"/>
+</g>
+<!-- n91&#45;&gt;n23 -->
+<g id="edge154" class="edge">
+<title>n91&#45;&gt;n23</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M748.18,-427.25C755.82,-419.35 764.91,-409.93 772.58,-402"/>
+</g>
+<!-- n91&#45;&gt;n87 -->
+<g id="edge155" class="edge">
+<title>n91&#45;&gt;n87</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M758.98,-429.02C760.33,-428.33 761.68,-427.65 763,-427 787.82,-414.78 795.1,-414.05 820,-402 821.7,-401.18 823.44,-400.31 825.19,-399.43"/>
+</g>
+<!-- n92&#45;&gt;n83 -->
+<g id="edge156" class="edge">
+<title>n92&#45;&gt;n83</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1107.44,-549.19C1101.51,-541.8 1094.91,-532.8 1090,-524 1078.83,-503.98 1070.02,-478.96 1064.91,-462.74"/>
+</g>
+<!-- n92&#45;&gt;n88 -->
+<g id="edge157" class="edge">
+<title>n92&#45;&gt;n88</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1121.72,-549.25C1121.58,-541.35 1121.42,-531.93 1121.29,-524"/>
+</g>
+<!-- n93 -->
+<g id="node94" class="node">
+<title>n93</title>
+<g id="a_node94"><a xlink:title="TypeInteger: ~[1&#45;255]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M1199,-524C1199,-524 1169,-524 1169,-524 1163,-524 1157,-518 1157,-512 1157,-512 1157,-500 1157,-500 1157,-494 1163,-488 1169,-488 1169,-488 1199,-488 1199,-488 1205,-488 1211,-494 1211,-500 1211,-500 1211,-512 1211,-512 1211,-518 1205,-524 1199,-524"/>
+<text text-anchor="middle" x="1184" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">~[1&#45;255]</text>
+</a>
+</g>
+</g>
+<!-- n92&#45;&gt;n93 -->
+<g id="edge158" class="edge">
+<title>n92&#45;&gt;n93</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1139.6,-549.25C1147.91,-541.35 1157.8,-531.93 1166.14,-524"/>
+</g>
+<!-- n93&#45;&gt;n17 -->
+<g id="edge159" class="edge">
+<title>n93&#45;&gt;n17</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1211,-490.94C1230.32,-480.6 1253.37,-467.58 1256,-463 1263.97,-449.13 1265.52,-439.86 1256,-427 1233.32,-396.38 1209.21,-416.56 1174,-402 1172.26,-401.28 1170.48,-400.49 1168.71,-399.67"/>
+</g>
+<!-- n93&#45;&gt;n89 -->
+<g id="edge160" class="edge">
+<title>n93&#45;&gt;n89</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1195.36,-488.25C1200.71,-480.35 1207.1,-470.93 1212.48,-463"/>
+</g>
+<!-- n94 -->
+<g id="node95" class="node">
+<title>n94</title>
+<g id="a_node95"><a xlink:title="TypeInteger: ~[&#45;255&#45;0]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M919,-585C919,-585 889,-585 889,-585 883,-585 877,-579 877,-573 877,-573 877,-561 877,-561 877,-555 883,-549 889,-549 889,-549 919,-549 919,-549 925,-549 931,-555 931,-561 931,-561 931,-573 931,-573 931,-579 925,-585 919,-585"/>
+<text text-anchor="middle" x="904" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;0]</text>
+</a>
+</g>
+</g>
+<!-- n94&#45;&gt;n16 -->
+<g id="edge161" class="edge">
+<title>n94&#45;&gt;n16</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M930.82,-550.64C946,-541.58 963.1,-530.62 969,-524 982.02,-509.38 1032.92,-379.6 1047,-366 1056.94,-356.4 1089.3,-342.9 1113.06,-333.82"/>
+</g>
+<!-- n94&#45;&gt;n90 -->
+<g id="edge162" class="edge">
+<title>n94&#45;&gt;n90</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M895.77,-549.25C891.88,-541.35 887.25,-531.93 883.35,-524"/>
+</g>
+<!-- n95 -->
+<g id="node96" class="node">
+<title>n95</title>
+<g id="a_node96"><a xlink:title="TypeInteger: ~[&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M827,-524C827,-524 797,-524 797,-524 791,-524 785,-518 785,-512 785,-512 785,-500 785,-500 785,-494 791,-488 797,-488 797,-488 827,-488 827,-488 833,-488 839,-494 839,-500 839,-500 839,-512 839,-512 839,-518 833,-524 827,-524"/>
+<text text-anchor="middle" x="812" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n94&#45;&gt;n95 -->
+<g id="edge163" class="edge">
+<title>n94&#45;&gt;n95</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M877.88,-549.25C865.56,-541.35 850.88,-531.93 838.5,-524"/>
+</g>
+<!-- n95&#45;&gt;n19 -->
+<g id="edge164" class="edge">
+<title>n95&#45;&gt;n19</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M807.17,-488.25C804.9,-480.35 802.18,-470.93 799.9,-463"/>
+</g>
+<!-- n95&#45;&gt;n91 -->
+<g id="edge165" class="edge">
+<title>n95&#45;&gt;n91</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M789.29,-488.25C778.57,-480.35 765.8,-470.93 755.05,-463"/>
+</g>
+<!-- n96&#45;&gt;n69 -->
+<g id="edge166" class="edge">
+<title>n96&#45;&gt;n69</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1211.71,-551.34C1213.48,-550.51 1215.26,-549.72 1217,-549 1251.79,-534.54 1263.31,-538.69 1298,-524 1299.36,-523.43 1300.73,-522.81 1302.11,-522.16"/>
+</g>
+<!-- n96&#45;&gt;n70 -->
+<g id="edge167" class="edge">
+<title>n96&#45;&gt;n70</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1211.97,-550.92C1213.65,-550.22 1215.33,-549.57 1217,-549 1278.45,-527.94 1299.69,-545.46 1361,-524 1362.39,-523.51 1363.79,-522.97 1365.19,-522.38"/>
+</g>
+<!-- n96&#45;&gt;n71 -->
+<g id="edge168" class="edge">
+<title>n96&#45;&gt;n71</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1207.99,-549.25C1218.85,-541.35 1231.77,-531.93 1242.67,-524"/>
+</g>
+<!-- n96&#45;&gt;n93 -->
+<g id="edge169" class="edge">
+<title>n96&#45;&gt;n93</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1184.72,-549.25C1184.58,-541.35 1184.42,-531.93 1184.29,-524"/>
+</g>
+<!-- n97&#45;&gt;n80 -->
+<g id="edge170" class="edge">
+<title>n97&#45;&gt;n80</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M944.8,-610.25C948.95,-602.35 953.9,-592.93 958.07,-585"/>
+</g>
+<!-- n97&#45;&gt;n94 -->
+<g id="edge171" class="edge">
+<title>n97&#45;&gt;n94</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M926.92,-610.25C922.63,-602.35 917.52,-592.93 913.22,-585"/>
+</g>
+<!-- n98 -->
+<g id="node99" class="node">
+<title>n98</title>
+<g id="a_node99"><a xlink:title="TypeInteger: ~[&#45;255&#45;&#45;1]">
+<path fill="#d3e7f5" stroke="#647674" stroke-width="0.65" d="M856,-585C856,-585 826,-585 826,-585 820,-585 814,-579 814,-573 814,-573 814,-561 814,-561 814,-555 820,-549 826,-549 826,-549 856,-549 856,-549 862,-549 868,-555 868,-561 868,-561 868,-573 868,-573 868,-579 862,-585 856,-585"/>
+<text text-anchor="middle" x="841" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~[&#45;255&#45;&#45;1]</text>
+</a>
+</g>
+</g>
+<!-- n97&#45;&gt;n98 -->
+<g id="edge172" class="edge">
+<title>n97&#45;&gt;n98</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M909.03,-610.25C896.08,-602.21 880.62,-592.61 867.71,-584.59"/>
+</g>
+<!-- n98&#45;&gt;n15 -->
+<g id="edge173" class="edge">
+<title>n98&#45;&gt;n15</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M867.76,-549.72C881.33,-541.47 897.77,-531.47 911.32,-523.23"/>
+</g>
+<!-- n98&#45;&gt;n95 -->
+<g id="edge174" class="edge">
+<title>n98&#45;&gt;n95</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M832.77,-549.25C828.88,-541.35 824.25,-531.93 820.35,-524"/>
+</g>
+<!-- n99&#45;&gt;n29 -->
+<g id="edge175" class="edge">
+<title>n99&#45;&gt;n29</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1228.48,-732.35C1222.77,-724.68 1215.97,-715.43 1210,-707 1195.24,-686.16 1178.79,-661.75 1168.19,-645.87"/>
+</g>
+<!-- n100 -->
+<g id="node101" class="node">
+<title>n100</title>
+<g id="a_node101"><a xlink:title="TypeFloat: ~f32">
+<path fill="#c7eee9" stroke="#647674" stroke-width="0.65" d="M1256,-707C1256,-707 1226,-707 1226,-707 1220,-707 1214,-701 1214,-695 1214,-695 1214,-683 1214,-683 1214,-677 1220,-671 1226,-671 1226,-671 1256,-671 1256,-671 1262,-671 1268,-677 1268,-683 1268,-683 1268,-695 1268,-695 1268,-701 1262,-707 1256,-707"/>
+<text text-anchor="middle" x="1241" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">~f32</text>
+</a>
+</g>
+</g>
+<!-- n99&#45;&gt;n100 -->
+<g id="edge176" class="edge">
+<title>n99&#45;&gt;n100</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1241,-732.25C1241,-724.35 1241,-714.93 1241,-707"/>
+</g>
+<!-- n100&#45;&gt;n28 -->
+<g id="edge177" class="edge">
+<title>n100&#45;&gt;n28</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1241,-671.25C1241,-663.35 1241,-653.93 1241,-646"/>
+</g>
+<!-- n101&#45;&gt;n32 -->
+<g id="edge178" class="edge">
+<title>n101&#45;&gt;n32</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M186.72,-610.25C175.74,-602.35 162.65,-592.93 151.62,-585"/>
+</g>
+<!-- n104 -->
+<g id="node105" class="node">
+<title>n104</title>
+<g id="a_node105"><a xlink:title="TypeMemPtr: ~*test {~nil test; ... }">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M206,-585C206,-585 176,-585 176,-585 170,-585 164,-579 164,-573 164,-573 164,-561 164,-561 164,-555 170,-549 176,-549 176,-549 206,-549 206,-549 212,-549 218,-555 218,-561 218,-561 218,-573 218,-573 218,-579 212,-585 206,-585"/>
+<text text-anchor="middle" x="191" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">~*test</text>
+</a>
+</g>
+</g>
+<!-- n101&#45;&gt;n104 -->
+<g id="edge179" class="edge">
+<title>n101&#45;&gt;n104</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M204.61,-610.25C202.06,-602.35 199.03,-592.93 196.47,-585"/>
+</g>
+<!-- n102&#45;&gt;n74 -->
+<g id="edge180" class="edge">
+<title>n102&#45;&gt;n74</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M285.09,-671.18C285.6,-655.11 287.51,-630.39 294,-610 296.77,-601.29 301.41,-592.31 305.79,-584.9"/>
+</g>
+<!-- n102&#45;&gt;n101 -->
+<g id="edge181" class="edge">
+<title>n102&#45;&gt;n101</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M263.71,-671.25C253.66,-663.35 241.69,-653.93 231.61,-646"/>
+</g>
+<!-- n103 -->
+<g id="node104" class="node">
+<title>n103</title>
+<g id="a_node104"><a xlink:title="TypeMemPtr: ~*test {~nil test; ... }">
+<path fill="#cce4d6" stroke="#647674" stroke-width="0.65" d="M237,-524C237,-524 207,-524 207,-524 201,-524 195,-518 195,-512 195,-512 195,-500 195,-500 195,-494 201,-488 207,-488 207,-488 237,-488 237,-488 243,-488 249,-494 249,-500 249,-500 249,-512 249,-512 249,-518 243,-524 237,-524"/>
+<text text-anchor="middle" x="222" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">~*test</text>
+</a>
+</g>
+</g>
+<!-- n103&#45;&gt;n30 -->
+<g id="edge182" class="edge">
+<title>n103&#45;&gt;n30</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M223.42,-488.25C224.09,-480.35 224.89,-470.93 225.56,-463"/>
+</g>
+<!-- n104&#45;&gt;n103 -->
+<g id="edge183" class="edge">
+<title>n104&#45;&gt;n103</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M199.8,-549.25C203.95,-541.35 208.9,-531.93 213.07,-524"/>
+</g>
+<!-- n110 -->
+<g id="node111" class="node">
+<title>n110</title>
+<g id="a_node111"><a xlink:title="TypeFunPtr: ~{ ~i64 &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M329,-524C329,-524 299,-524 299,-524 293,-524 287,-518 287,-512 287,-512 287,-500 287,-500 287,-494 293,-488 299,-488 299,-488 329,-488 329,-488 335,-488 341,-494 341,-500 341,-500 341,-512 341,-512 341,-518 335,-524 329,-524"/>
+<text text-anchor="middle" x="314" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n105&#45;&gt;n110 -->
+<g id="edge184" class="edge">
+<title>n105&#45;&gt;n110</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M271.03,-549.25C279.07,-541.35 288.65,-531.93 296.72,-524"/>
+</g>
+<!-- n106 -->
+<g id="node107" class="node">
+<title>n106</title>
+<g id="a_node107"><a xlink:title="TypeFunPtr: ~{ ~i64 ~f32 &#45;&gt; ~i64 #~b11}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M341,-646C341,-646 311,-646 311,-646 305,-646 299,-640 299,-634 299,-634 299,-622 299,-622 299,-616 305,-610 311,-610 311,-610 341,-610 341,-610 347,-610 353,-616 353,-622 353,-622 353,-634 353,-634 353,-640 347,-646 341,-646"/>
+<text text-anchor="middle" x="326" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">{~b11}</text>
+</a>
+</g>
+</g>
+<!-- n106&#45;&gt;n74 -->
+<g id="edge185" class="edge">
+<title>n106&#45;&gt;n74</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M323.45,-610.25C322.24,-602.35 320.8,-592.93 319.59,-585"/>
+</g>
+<!-- n106&#45;&gt;n105 -->
+<g id="edge186" class="edge">
+<title>n106&#45;&gt;n105</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M305.56,-610.25C295.91,-602.35 284.42,-592.93 274.74,-585"/>
+</g>
+<!-- n107&#45;&gt;n38 -->
+<g id="edge187" class="edge">
+<title>n107&#45;&gt;n38</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M565.91,-681.22C589.68,-674.49 624.72,-662.76 652,-646 686.03,-625.09 695.4,-617.93 718,-585 731.11,-565.9 739.89,-540.43 744.67,-523.88"/>
+</g>
+<!-- n107&#45;&gt;n40 -->
+<g id="edge188" class="edge">
+<title>n107&#45;&gt;n40</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M539,-671.25C539,-663.35 539,-653.93 539,-646"/>
+</g>
+<!-- n107&#45;&gt;n106 -->
+<g id="edge189" class="edge">
+<title>n107&#45;&gt;n106</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M512.03,-672.92C510.35,-672.22 508.67,-671.57 507,-671 445.12,-649.84 424.36,-665.7 362,-646 358.97,-645.04 355.86,-643.88 352.81,-642.62"/>
+</g>
+<!-- n108 -->
+<g id="node109" class="node">
+<title>n108</title>
+<g id="a_node109"><a xlink:title="TypeFunPtr: ~{ ~i64 &#45;&gt; Top #~ALL}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M409,-646C409,-646 379,-646 379,-646 373,-646 367,-640 367,-634 367,-634 367,-622 367,-622 367,-616 373,-610 379,-610 379,-610 409,-610 409,-610 415,-610 421,-616 421,-622 421,-622 421,-634 421,-634 421,-640 415,-646 409,-646"/>
+<text text-anchor="middle" x="394" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">{~ALL}</text>
+</a>
+</g>
+</g>
+<!-- n107&#45;&gt;n108 -->
+<g id="edge190" class="edge">
+<title>n107&#45;&gt;n108</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M512.24,-673.45C510.48,-672.6 508.72,-671.77 507,-671 491.3,-663.95 449.12,-648.62 420.97,-638.56"/>
+</g>
+<!-- n109 -->
+<g id="node110" class="node">
+<title>n109</title>
+<g id="a_node110"><a xlink:title="TypeFunPtr: ~{ ~i64 ~i64 &#45;&gt; PtrTop #~ALL}?">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M636,-646C636,-646 606,-646 606,-646 600,-646 594,-640 594,-634 594,-634 594,-622 594,-622 594,-616 600,-610 606,-610 606,-610 636,-610 636,-610 642,-610 648,-616 648,-622 648,-622 648,-634 648,-634 648,-640 642,-646 636,-646"/>
+<text text-anchor="middle" x="621" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">{~ALL}</text>
+</a>
+</g>
+</g>
+<!-- n107&#45;&gt;n109 -->
+<g id="edge191" class="edge">
+<title>n107&#45;&gt;n109</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M562.28,-671.25C573.26,-663.35 586.35,-653.93 597.38,-646"/>
+</g>
+<!-- n107&#45;&gt;n114 -->
+<g id="edge192" class="edge">
+<title>n107&#45;&gt;n114</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M521.12,-671.25C512.68,-663.35 502.62,-653.93 494.15,-646"/>
+</g>
+<!-- n108&#45;&gt;n42 -->
+<g id="edge193" class="edge">
+<title>n108&#45;&gt;n42</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M412.34,-610.22C418.98,-603.1 425.87,-594.3 430,-585 438.76,-565.29 440.51,-540.2 440.58,-523.87"/>
+</g>
+<!-- n108&#45;&gt;n74 -->
+<g id="edge194" class="edge">
+<title>n108&#45;&gt;n74</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M372.14,-610.25C361.83,-602.35 349.54,-592.93 339.18,-585"/>
+</g>
+<!-- n108&#45;&gt;n110 -->
+<g id="edge195" class="edge">
+<title>n108&#45;&gt;n110</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M382.63,-610.04C377.68,-602.47 371.9,-593.38 367,-585 357.88,-569.38 357.96,-564.1 348,-549 342.32,-540.39 335.24,-531.42 329.02,-523.99"/>
+</g>
+<!-- n109&#45;&gt;n36 -->
+<g id="edge196" class="edge">
+<title>n109&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M647.69,-612.3C649.15,-611.52 650.59,-610.75 652,-610 673.61,-598.57 688.23,-605.85 701,-585 709.36,-571.36 702.92,-564.88 701,-549 697.58,-520.74 678.73,-450.03 662,-427 655.06,-417.44 645.44,-408.78 636.43,-401.83"/>
+</g>
+<!-- n109&#45;&gt;n74 -->
+<g id="edge197" class="edge">
+<title>n109&#45;&gt;n74</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M594.02,-616.89C586.35,-614.33 577.92,-611.79 570,-610 481.33,-589.97 455.61,-605.29 367,-585 359.4,-583.26 351.34,-580.8 343.96,-578.29"/>
+</g>
+<!-- n111 -->
+<g id="node112" class="node">
+<title>n111</title>
+<g id="a_node112"><a xlink:title="TypeFunPtr: ~{ &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M408,-463C408,-463 378,-463 378,-463 372,-463 366,-457 366,-451 366,-451 366,-439 366,-439 366,-433 372,-427 378,-427 378,-427 408,-427 408,-427 414,-427 420,-433 420,-439 420,-439 420,-451 420,-451 420,-457 414,-463 408,-463"/>
+<text text-anchor="middle" x="393" y="-441.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n110&#45;&gt;n111 -->
+<g id="edge198" class="edge">
+<title>n110&#45;&gt;n111</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M336.43,-488.25C347.01,-480.35 359.62,-470.93 370.24,-463"/>
+</g>
+<!-- n111&#45;&gt;n4 -->
+<g id="edge199" class="edge">
+<title>n111&#45;&gt;n4</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M410.88,-427.25C419.32,-419.35 429.38,-409.93 437.85,-402"/>
+</g>
+<!-- n111&#45;&gt;n36 -->
+<g id="edge200" class="edge">
+<title>n111&#45;&gt;n36</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M419.59,-433.5C426.19,-431.14 433.3,-428.8 440,-427 500.62,-410.71 519.68,-422.53 579,-402 580.66,-401.42 582.35,-400.77 584.03,-400.06"/>
+</g>
+<!-- n112 -->
+<g id="node113" class="node">
+<title>n112</title>
+<g id="a_node113"><a xlink:title="TypeFunPtr: ~{ Bot ~i64 &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M392,-524C392,-524 362,-524 362,-524 356,-524 350,-518 350,-512 350,-512 350,-500 350,-500 350,-494 356,-488 362,-488 362,-488 392,-488 392,-488 398,-488 404,-494 404,-500 404,-500 404,-512 404,-512 404,-518 398,-524 392,-524"/>
+<text text-anchor="middle" x="377" y="-502.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n112&#45;&gt;n111 -->
+<g id="edge201" class="edge">
+<title>n112&#45;&gt;n111</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M381.54,-488.25C383.69,-480.35 386.24,-470.93 388.39,-463"/>
+</g>
+<!-- n113 -->
+<g id="node114" class="node">
+<title>n113</title>
+<g id="a_node114"><a xlink:title="TypeFunPtr: ~{ ~i64 &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M496,-585C496,-585 466,-585 466,-585 460,-585 454,-579 454,-573 454,-573 454,-561 454,-561 454,-555 460,-549 466,-549 466,-549 496,-549 496,-549 502,-549 508,-555 508,-561 508,-561 508,-573 508,-573 508,-579 502,-585 496,-585"/>
+<text text-anchor="middle" x="481" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n113&#45;&gt;n37 -->
+<g id="edge202" class="edge">
+<title>n113&#45;&gt;n37</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M505.13,-549.25C516.52,-541.35 530.08,-531.93 541.51,-524"/>
+</g>
+<!-- n113&#45;&gt;n110 -->
+<g id="edge203" class="edge">
+<title>n113&#45;&gt;n110</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M454.06,-556.82C446.31,-554.23 437.84,-551.46 430,-549 392.43,-537.22 381.36,-539.11 345,-524 343.64,-523.43 342.26,-522.83 340.88,-522.19"/>
+</g>
+<!-- n113&#45;&gt;n112 -->
+<g id="edge204" class="edge">
+<title>n113&#45;&gt;n112</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M454.22,-550.81C438.69,-542 419.2,-530.94 403.69,-522.14"/>
+</g>
+<!-- n114&#45;&gt;n113 -->
+<g id="edge205" class="edge">
+<title>n114&#45;&gt;n113</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M477.42,-610.25C478.09,-602.35 478.89,-592.93 479.56,-585"/>
+</g>
+<!-- n115 -->
+<g id="node116" class="node">
+<title>n115</title>
+<g id="a_node116"><a xlink:title="TypeFunPtr: ~{ Top ~i64 &#45;&gt; ~i32 #~0}">
+<path fill="#dfd0ef" stroke="#647674" stroke-width="0.65" d="M414,-585C414,-585 384,-585 384,-585 378,-585 372,-579 372,-573 372,-573 372,-561 372,-561 372,-555 378,-549 384,-549 384,-549 414,-549 414,-549 420,-549 426,-555 426,-561 426,-561 426,-573 426,-573 426,-579 420,-585 414,-585"/>
+<text text-anchor="middle" x="399" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">{~0}</text>
+</a>
+</g>
+</g>
+<!-- n114&#45;&gt;n115 -->
+<g id="edge206" class="edge">
+<title>n114&#45;&gt;n115</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M454.14,-610.25C443.83,-602.35 431.54,-592.93 421.18,-585"/>
+</g>
+<!-- n115&#45;&gt;n110 -->
+<g id="edge207" class="edge">
+<title>n115&#45;&gt;n110</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M374.87,-549.25C363.48,-541.35 349.92,-531.93 338.49,-524"/>
+</g>
+<!-- n115&#45;&gt;n112 -->
+<g id="edge208" class="edge">
+<title>n115&#45;&gt;n112</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M392.75,-549.25C389.81,-541.35 386.3,-531.93 383.34,-524"/>
+</g>
+<!-- n116 -->
+<g id="node117" class="node">
+<title>n116</title>
+<g id="a_node117"><a xlink:title="TypeMem: #2:~nil">
+<path fill="#a9c9e5" stroke="#647674" stroke-width="0.65" d="M1445,-646C1445,-646 1415,-646 1415,-646 1409,-646 1403,-640 1403,-634 1403,-634 1403,-622 1403,-622 1403,-616 1409,-610 1415,-610 1415,-610 1445,-610 1445,-610 1451,-610 1457,-616 1457,-622 1457,-622 1457,-634 1457,-634 1457,-640 1451,-646 1445,-646"/>
+<text text-anchor="middle" x="1430" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">#2:~nil</text>
+</a>
+</g>
+</g>
+<!-- n116&#45;&gt;n47 -->
+<g id="edge209" class="edge">
+<title>n116&#45;&gt;n47</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1421.2,-610.25C1417.05,-602.35 1412.1,-592.93 1407.93,-585"/>
+</g>
+<!-- n117&#45;&gt;n47 -->
+<g id="edge210" class="edge">
+<title>n117&#45;&gt;n47</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1376.08,-610.25C1380.37,-602.35 1385.48,-592.93 1389.78,-585"/>
+</g>
+<!-- n118&#45;&gt;n45 -->
+<g id="edge211" class="edge">
+<title>n118&#45;&gt;n45</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1326.33,-732.06C1321.37,-709.19 1312.6,-668.68 1307.65,-645.85"/>
+</g>
+<!-- n118&#45;&gt;n46 -->
+<g id="edge212" class="edge">
+<title>n118&#45;&gt;n46</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1339.08,-732.25C1343.37,-724.35 1348.48,-714.93 1352.78,-707"/>
+</g>
+<!-- n118&#45;&gt;n116 -->
+<g id="edge213" class="edge">
+<title>n118&#45;&gt;n116</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1356.82,-735.9C1369.37,-728.73 1383.76,-718.88 1394,-707 1409.67,-688.81 1419.87,-662.65 1425.28,-645.74"/>
+</g>
+<!-- n119 -->
+<g id="node120" class="node">
+<title>n119</title>
+<g id="a_node120"><a xlink:title="Field: test:&#45;2 : ~nil">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1508,-97C1508,-97 1478,-97 1478,-97 1472,-97 1466,-91 1466,-85 1466,-85 1466,-73 1466,-73 1466,-67 1472,-61 1478,-61 1478,-61 1508,-61 1508,-61 1514,-61 1520,-67 1520,-73 1520,-73 1520,-85 1520,-85 1520,-91 1514,-97 1508,-97"/>
+<text text-anchor="middle" x="1493" y="-75.5" font-family="Arial" font-size="10.00" fill="#172e35">test</text>
+</a>
+</g>
+</g>
+<!-- n119&#45;&gt;n0 -->
+<g id="edge214" class="edge">
+<title>n119&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1478.52,-61.25C1471.69,-53.35 1463.55,-43.93 1456.69,-36"/>
+</g>
+<!-- n120&#45;&gt;n119 -->
+<g id="edge215" class="edge">
+<title>n120&#45;&gt;n119</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1431.59,-732.11C1446.98,-709.75 1471,-668.51 1471,-629 1471,-629 1471,-629 1471,-200 1471,-162.72 1481.4,-119.98 1487.9,-96.91"/>
+</g>
+<!-- n121&#45;&gt;n0 -->
+<g id="edge216" class="edge">
+<title>n121&#45;&gt;n0</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1528.64,-183.08C1536.8,-155.29 1548.51,-99.24 1525,-61 1512.82,-41.19 1488.08,-30.38 1468.77,-24.71"/>
+</g>
+<!-- n122&#45;&gt;n52 -->
+<g id="edge217" class="edge">
+<title>n122&#45;&gt;n52</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1756.61,-732.26C1749.64,-725.26 1742.68,-716.54 1739,-707 1733.25,-692.07 1729.62,-683.96 1739,-671 1759.85,-642.19 1791.86,-673 1815,-646 1830.52,-627.89 1835.74,-556.72 1837.35,-523.83"/>
+</g>
+<!-- n122&#45;&gt;n53 -->
+<g id="edge218" class="edge">
+<title>n122&#45;&gt;n53</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1761.3,-732.2C1747.63,-715.47 1732.03,-689.67 1746,-671 1769.59,-639.47 1794.36,-660.42 1831,-646 1833.33,-645.08 1835.72,-644.06 1838.1,-642.99"/>
+</g>
+<!-- n122&#45;&gt;n54 -->
+<g id="edge219" class="edge">
+<title>n122&#45;&gt;n54</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1777,-732.25C1777,-724.35 1777,-714.93 1777,-707"/>
+</g>
+<!-- n122&#45;&gt;n55 -->
+<g id="edge220" class="edge">
+<title>n122&#45;&gt;n55</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1794.88,-732.25C1803.32,-724.35 1813.38,-714.93 1821.85,-707"/>
+</g>
+<!-- n122&#45;&gt;n62 -->
+<g id="edge221" class="edge">
+<title>n122&#45;&gt;n62</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.9,-737.83C1823.08,-729.7 1849.37,-718.18 1872,-707 1873.32,-706.35 1874.67,-705.67 1876.02,-704.97"/>
+</g>
+<!-- n123 -->
+<g id="node124" class="node">
+<title>n123</title>
+<g id="a_node124"><a xlink:title="TypeStruct: test {~nil test; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1981,-707C1981,-707 1951,-707 1951,-707 1945,-707 1939,-701 1939,-695 1939,-695 1939,-683 1939,-683 1939,-677 1945,-671 1951,-671 1951,-671 1981,-671 1981,-671 1987,-671 1993,-677 1993,-683 1993,-683 1993,-695 1993,-695 1993,-701 1987,-707 1981,-707"/>
+<text text-anchor="middle" x="1966" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">test</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n123 -->
+<g id="edge222" class="edge">
+<title>n122&#45;&gt;n123</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.91,-743.92C1835.87,-737.42 1890.47,-724.82 1935,-707 1936.37,-706.45 1937.75,-705.86 1939.14,-705.23"/>
+</g>
+<!-- n124 -->
+<g id="node125" class="node">
+<title>n124</title>
+<g id="a_node125"><a xlink:title="TypeStruct: []i64">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M2044,-707C2044,-707 2014,-707 2014,-707 2008,-707 2002,-701 2002,-695 2002,-695 2002,-683 2002,-683 2002,-677 2008,-671 2014,-671 2014,-671 2044,-671 2044,-671 2050,-671 2056,-677 2056,-683 2056,-683 2056,-695 2056,-695 2056,-701 2050,-707 2044,-707"/>
+<text text-anchor="middle" x="2029" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[]i64</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n124 -->
+<g id="edge223" class="edge">
+<title>n122&#45;&gt;n124</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.91,-746.63C1846.25,-742.3 1930.55,-731.22 1998,-707 1999.39,-706.5 2000.79,-705.95 2002.18,-705.35"/>
+</g>
+<!-- n125 -->
+<g id="node126" class="node">
+<title>n125</title>
+<g id="a_node126"><a xlink:title="TypeStruct: []u8">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M2056,-585C2056,-585 2026,-585 2026,-585 2020,-585 2014,-579 2014,-573 2014,-573 2014,-561 2014,-561 2014,-555 2020,-549 2026,-549 2026,-549 2056,-549 2056,-549 2062,-549 2068,-555 2068,-561 2068,-561 2068,-573 2068,-573 2068,-579 2062,-585 2056,-585"/>
+<text text-anchor="middle" x="2041" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">[]u8</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n125 -->
+<g id="edge224" class="edge">
+<title>n122&#45;&gt;n125</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.75,-749.27C1867.95,-749.29 2027.87,-745.39 2061,-707 2090.95,-672.3 2066.12,-613.6 2050.82,-584.87"/>
+</g>
+<!-- n126 -->
+<g id="node127" class="node">
+<title>n126</title>
+<g id="a_node127"><a xlink:title="TypeStruct: [&quot;abc&quot;]">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M2126,-646C2126,-646 2096,-646 2096,-646 2090,-646 2084,-640 2084,-634 2084,-634 2084,-622 2084,-622 2084,-616 2090,-610 2096,-610 2096,-610 2126,-610 2126,-610 2132,-610 2138,-616 2138,-622 2138,-622 2138,-634 2138,-634 2138,-640 2132,-646 2126,-646"/>
+<text text-anchor="middle" x="2111" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">[]u8</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n126 -->
+<g id="edge225" class="edge">
+<title>n122&#45;&gt;n126</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1803.82,-748.52C1869.14,-746.85 2034.28,-739.44 2077,-707 2087.18,-699.27 2099.13,-666.37 2105.8,-645.84"/>
+</g>
+<!-- n127 -->
+<g id="node128" class="node">
+<title>n127</title>
+<g id="a_node128"><a xlink:title="TypeStruct: %SINT {}">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1609,-707C1609,-707 1579,-707 1579,-707 1573,-707 1567,-701 1567,-695 1567,-695 1567,-683 1567,-683 1567,-677 1573,-671 1579,-671 1579,-671 1609,-671 1609,-671 1615,-671 1621,-677 1621,-683 1621,-683 1621,-695 1621,-695 1621,-701 1615,-707 1609,-707"/>
+<text text-anchor="middle" x="1594" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n127 -->
+<g id="edge226" class="edge">
+<title>n122&#45;&gt;n127</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1750.24,-743.41C1719.6,-736.59 1668.2,-723.85 1626,-707 1624.25,-706.3 1622.47,-705.53 1620.69,-704.72"/>
+</g>
+<!-- n128 -->
+<g id="node129" class="node">
+<title>n128</title>
+<g id="a_node129"><a xlink:title="TypeStruct: %SFLT {}">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1672,-707C1672,-707 1642,-707 1642,-707 1636,-707 1630,-701 1630,-695 1630,-695 1630,-683 1630,-683 1630,-677 1636,-671 1642,-671 1642,-671 1672,-671 1672,-671 1678,-671 1684,-677 1684,-683 1684,-683 1684,-695 1684,-695 1684,-701 1678,-707 1672,-707"/>
+<text text-anchor="middle" x="1657" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n128 -->
+<g id="edge227" class="edge">
+<title>n122&#45;&gt;n128</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1750.24,-736.01C1733.25,-727.74 1710.81,-716.79 1691,-707 1688.63,-705.83 1686.18,-704.61 1683.71,-703.39"/>
+</g>
+<!-- n133 -->
+<g id="node134" class="node">
+<title>n133</title>
+<g id="a_node134"><a xlink:title="TypeStruct: calloc {~{ ~i64 ~i64 &#45;&gt; PtrTop #~ALL}? !calloc; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1798,-646C1798,-646 1768,-646 1768,-646 1762,-646 1756,-640 1756,-634 1756,-634 1756,-622 1756,-622 1756,-616 1762,-610 1768,-610 1768,-610 1798,-610 1798,-610 1804,-610 1810,-616 1810,-622 1810,-622 1810,-634 1810,-634 1810,-640 1804,-646 1798,-646"/>
+<text text-anchor="middle" x="1783" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">calloc</text>
+</a>
+</g>
+</g>
+<!-- n122&#45;&gt;n133 -->
+<g id="edge228" class="edge">
+<title>n122&#45;&gt;n133</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1750.22,-739.69C1735.52,-733.04 1718.57,-722.5 1710,-707 1702.25,-693 1701.99,-684.85 1710,-671 1710.69,-669.81 1735.63,-655.6 1756.17,-644.03"/>
+</g>
+<!-- n123&#45;&gt;n51 -->
+<g id="edge229" class="edge">
+<title>n123&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1967.77,-671.18C1970.78,-635.44 1973.94,-550.15 1944,-488 1939.48,-478.61 1932.18,-469.8 1925.19,-462.69"/>
+</g>
+<!-- n124&#45;&gt;n51 -->
+<g id="edge230" class="edge">
+<title>n124&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2026.07,-671.05C2019.14,-634.71 1999.08,-547.74 1957,-488 1950.26,-478.44 1940.8,-469.83 1931.85,-462.93"/>
+</g>
+<!-- n125&#45;&gt;n51 -->
+<g id="edge231" class="edge">
+<title>n125&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2036.03,-549.02C2030.18,-531.66 2018.93,-504.92 2001,-488 1981.85,-469.93 1953.65,-458.81 1932.94,-452.59"/>
+</g>
+<!-- n126&#45;&gt;n51 -->
+<g id="edge232" class="edge">
+<title>n126&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2104.97,-610.26C2093.38,-580.62 2065.1,-519.13 2020,-488 1993.1,-469.43 1956.98,-457.95 1932.67,-451.78"/>
+</g>
+<!-- n127&#45;&gt;n61 -->
+<g id="edge233" class="edge">
+<title>n127&#45;&gt;n61</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1576.12,-671.25C1567.68,-663.35 1557.62,-653.93 1549.15,-646"/>
+</g>
+<!-- n129 -->
+<g id="node130" class="node">
+<title>n129</title>
+<g id="a_node130"><a xlink:title="TypeStruct: %SINT {~u32 a; ~*%SFLT {} s2; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1609,-646C1609,-646 1579,-646 1579,-646 1573,-646 1567,-640 1567,-634 1567,-634 1567,-622 1567,-622 1567,-616 1573,-610 1579,-610 1579,-610 1609,-610 1609,-610 1615,-610 1621,-616 1621,-622 1621,-622 1621,-634 1621,-634 1621,-640 1615,-646 1609,-646"/>
+<text text-anchor="middle" x="1594" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n127&#45;&gt;n129 -->
+<g id="edge234" class="edge">
+<title>n127&#45;&gt;n129</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1594,-671.25C1594,-663.35 1594,-653.93 1594,-646"/>
+</g>
+<!-- n128&#45;&gt;n60 -->
+<g id="edge235" class="edge">
+<title>n128&#45;&gt;n60</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1674.88,-671.25C1683.32,-663.35 1693.38,-653.93 1701.85,-646"/>
+</g>
+<!-- n130 -->
+<g id="node131" class="node">
+<title>n130</title>
+<g id="a_node131"><a xlink:title="TypeStruct: %SFLT {~f32 b; ~*%SINT {~u32 a; ~*%SFLT {} s2; } s1; }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1672,-646C1672,-646 1642,-646 1642,-646 1636,-646 1630,-640 1630,-634 1630,-634 1630,-622 1630,-622 1630,-616 1636,-610 1642,-610 1642,-610 1672,-610 1672,-610 1678,-610 1684,-616 1684,-622 1684,-622 1684,-634 1684,-634 1684,-640 1678,-646 1672,-646"/>
+<text text-anchor="middle" x="1657" y="-624.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n128&#45;&gt;n130 -->
+<g id="edge236" class="edge">
+<title>n128&#45;&gt;n130</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1657,-671.25C1657,-663.35 1657,-653.93 1657,-646"/>
+</g>
+<!-- n132 -->
+<g id="node133" class="node">
+<title>n132</title>
+<g id="a_node133"><a xlink:title="TypeStruct: %SINT {~u32 a; ~*%SFLT {~f32 b; ~*%SINT s1; ... } s2; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1609,-585C1609,-585 1579,-585 1579,-585 1573,-585 1567,-579 1567,-573 1567,-573 1567,-561 1567,-561 1567,-555 1573,-549 1579,-549 1579,-549 1609,-549 1609,-549 1615,-549 1621,-555 1621,-561 1621,-561 1621,-573 1621,-573 1621,-579 1615,-585 1609,-585"/>
+<text text-anchor="middle" x="1594" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">%SINT</text>
+</a>
+</g>
+</g>
+<!-- n129&#45;&gt;n132 -->
+<g id="edge237" class="edge">
+<title>n129&#45;&gt;n132</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1594,-610.25C1594,-602.35 1594,-592.93 1594,-585"/>
+</g>
+<!-- n131 -->
+<g id="node132" class="node">
+<title>n131</title>
+<g id="a_node132"><a xlink:title="TypeStruct: %SFLT {~f32 b; ~*%SINT {~u32 a; ~*%SFLT s2; ... } s1; ... }">
+<path fill="#e0ebc8" stroke="#647674" stroke-width="0.65" d="M1672,-585C1672,-585 1642,-585 1642,-585 1636,-585 1630,-579 1630,-573 1630,-573 1630,-561 1630,-561 1630,-555 1636,-549 1642,-549 1642,-549 1672,-549 1672,-549 1678,-549 1684,-555 1684,-561 1684,-561 1684,-573 1684,-573 1684,-579 1678,-585 1672,-585"/>
+<text text-anchor="middle" x="1657" y="-563.5" font-family="Arial" font-size="10.00" fill="#172e35">%SFLT</text>
+</a>
+</g>
+</g>
+<!-- n130&#45;&gt;n131 -->
+<g id="edge238" class="edge">
+<title>n130&#45;&gt;n131</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1657,-610.25C1657,-602.35 1657,-592.93 1657,-585"/>
+</g>
+<!-- n131&#45;&gt;n57 -->
+<g id="edge239" class="edge">
+<title>n131&#45;&gt;n57</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1674.88,-549.25C1683.32,-541.35 1693.38,-531.93 1701.85,-524"/>
+</g>
+<!-- n132&#45;&gt;n56 -->
+<g id="edge240" class="edge">
+<title>n132&#45;&gt;n56</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1594,-549.25C1594,-541.35 1594,-531.93 1594,-524"/>
+</g>
+<!-- n133&#45;&gt;n51 -->
+<g id="edge241" class="edge">
+<title>n133&#45;&gt;n51</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1781.13,-610.42C1778.86,-582.13 1778.4,-524.08 1807,-488 1824.74,-465.61 1856.64,-454.98 1879.44,-450.05"/>
+</g>
+<!-- n134&#45;&gt;n64 -->
+<g id="edge242" class="edge">
+<title>n134&#45;&gt;n64</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2400.84,-740.8C2429.32,-732.09 2475.14,-718.08 2511.46,-706.98"/>
+</g>
+<!-- n134&#45;&gt;n65 -->
+<g id="edge243" class="edge">
+<title>n134&#45;&gt;n65</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2400.95,-745.86C2447.63,-740.14 2546.32,-726.74 2628,-707 2629.22,-706.7 2630.45,-706.4 2631.7,-706.08"/>
+</g>
+<!-- n134&#45;&gt;n66 -->
+<g id="edge244" class="edge">
+<title>n134&#45;&gt;n66</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2347.03,-745.37C2307.81,-739.66 2233.08,-727.09 2172,-707 2170.25,-706.43 2168.48,-705.79 2166.7,-705.12"/>
+</g>
+<!-- n135 -->
+<g id="node136" class="node">
+<title>n135</title>
+<g id="a_node136"><a xlink:title="TypeTuple: [ &#160;~i64, ~*test {~nil test; ... }]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2297.95,-707C2297.95,-707 2188.05,-707 2188.05,-707 2182.05,-707 2176.05,-701 2176.05,-695 2176.05,-695 2176.05,-683 2176.05,-683 2176.05,-677 2182.05,-671 2188.05,-671 2188.05,-671 2297.95,-671 2297.95,-671 2303.95,-671 2309.95,-677 2309.95,-683 2309.95,-683 2309.95,-695 2309.95,-695 2309.95,-701 2303.95,-707 2297.95,-707"/>
+<text text-anchor="middle" x="2243" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;~i64, ~*test {~nil test; ... }]</text>
+</a>
+</g>
+</g>
+<!-- n134&#45;&gt;n135 -->
+<g id="edge245" class="edge">
+<title>n134&#45;&gt;n135</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2347.17,-736.92C2328.01,-728.29 2301.97,-716.56 2280.71,-706.99"/>
+</g>
+<!-- n136 -->
+<g id="node137" class="node">
+<title>n136</title>
+<g id="a_node137"><a xlink:title="TypeTuple: [ &#160;~Ctrl, MemBot, ~i64]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2416.95,-707C2416.95,-707 2331.05,-707 2331.05,-707 2325.05,-707 2319.05,-701 2319.05,-695 2319.05,-695 2319.05,-683 2319.05,-683 2319.05,-677 2325.05,-671 2331.05,-671 2331.05,-671 2416.95,-671 2416.95,-671 2422.95,-671 2428.95,-677 2428.95,-683 2428.95,-683 2428.95,-695 2428.95,-695 2428.95,-701 2422.95,-707 2416.95,-707"/>
+<text text-anchor="middle" x="2374" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;~Ctrl, MemBot, ~i64]</text>
+</a>
+</g>
+</g>
+<!-- n134&#45;&gt;n136 -->
+<g id="edge246" class="edge">
+<title>n134&#45;&gt;n136</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2374,-732.25C2374,-724.35 2374,-714.93 2374,-707"/>
+</g>
+<!-- n137 -->
+<g id="node138" class="node">
+<title>n137</title>
+<g id="a_node138"><a xlink:title="TypeTuple: [ &#160;~Ctrl, Ctrl]">
+<path fill="#f2d7e4" stroke="#647674" stroke-width="0.65" d="M2490.07,-707C2490.07,-707 2449.93,-707 2449.93,-707 2443.93,-707 2437.93,-701 2437.93,-695 2437.93,-695 2437.93,-683 2437.93,-683 2437.93,-677 2443.93,-671 2449.93,-671 2449.93,-671 2490.07,-671 2490.07,-671 2496.07,-671 2502.07,-677 2502.07,-683 2502.07,-683 2502.07,-695 2502.07,-695 2502.07,-701 2496.07,-707 2490.07,-707"/>
+<text text-anchor="middle" x="2470" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">[ &#160;~Ctrl, Ctrl]</text>
+</a>
+</g>
+</g>
+<!-- n134&#45;&gt;n137 -->
+<g id="edge247" class="edge">
+<title>n134&#45;&gt;n137</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2401,-732.41C2413.97,-724.43 2429.5,-714.89 2442.54,-706.88"/>
+</g>
+<!-- n135&#45;&gt;n63 -->
+<g id="edge248" class="edge">
+<title>n135&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2280.54,-671.09C2301.86,-661.49 2328.05,-649.7 2347.27,-641.04"/>
+</g>
+<!-- n136&#45;&gt;n63 -->
+<g id="edge249" class="edge">
+<title>n136&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2374,-671.25C2374,-663.35 2374,-653.93 2374,-646"/>
+</g>
+<!-- n137&#45;&gt;n63 -->
+<g id="edge250" class="edge">
+<title>n137&#45;&gt;n63</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2442.49,-671.09C2429.41,-663.06 2413.84,-653.49 2400.85,-645.5"/>
+</g>
+<!-- n138&#45;&gt;n68 -->
+<g id="edge251" class="edge">
+<title>n138&#45;&gt;n68</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2766,-732.25C2766,-724.35 2766,-714.93 2766,-707"/>
+</g>
+<!-- n139 -->
+<g id="node140" class="node">
+<title>n139</title>
+<g id="a_node140"><a xlink:title="TypeRPC: $[&#45;2]">
+<path fill="#f4d4b5" stroke="#647674" stroke-width="0.65" d="M2844,-707C2844,-707 2814,-707 2814,-707 2808,-707 2802,-701 2802,-695 2802,-695 2802,-683 2802,-683 2802,-677 2808,-671 2814,-671 2814,-671 2844,-671 2844,-671 2850,-671 2856,-677 2856,-683 2856,-683 2856,-695 2856,-695 2856,-701 2850,-707 2844,-707"/>
+<text text-anchor="middle" x="2829" y="-685.5" font-family="Arial" font-size="10.00" fill="#172e35">$[&#45;2]</text>
+</a>
+</g>
+</g>
+<!-- n138&#45;&gt;n139 -->
+<g id="edge252" class="edge">
+<title>n138&#45;&gt;n139</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2783.88,-732.25C2792.32,-724.35 2802.38,-714.93 2810.85,-707"/>
+</g>
+<!-- n139&#45;&gt;n67 -->
+<g id="edge253" class="edge">
+<title>n139&#45;&gt;n67</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M2811.12,-671.25C2802.68,-663.35 2792.62,-653.93 2784.15,-646"/>
+</g>
+<!-- n140&#45;&gt;n24 -->
+<g id="edge254" class="edge">
+<title>n140&#45;&gt;n24</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1311.12,-305.25C1302.68,-297.35 1292.62,-287.93 1284.15,-280"/>
+</g>
+<!-- n141&#45;&gt;n24 -->
+<g id="edge255" class="edge">
+<title>n141&#45;&gt;n24</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1365.02,-307.03C1363.67,-306.33 1362.32,-305.65 1361,-305 1338.37,-293.82 1312.08,-282.3 1292.9,-274.17"/>
+</g>
+<!-- n142&#45;&gt;n24 -->
+<g id="edge256" class="edge">
+<title>n142&#45;&gt;n24</title>
+<path fill="none" stroke="#899895" stroke-width="0.65" d="M1266,-305.25C1266,-297.35 1266,-287.93 1266,-280"/>
+</g>
+</g>
+</svg>
diff --git a/docs/2026_REBASE/backend.js b/docs/2026_REBASE/backend.js
new file mode 100644
index 00000000..91ffb239
--- /dev/null
+++ b/docs/2026_REBASE/backend.js
@@ -0,0 +1,7 @@
+/* Generated by tools/BackendDump.java; Chapter 21, x86-64 System V. */
+window.REBASE.backend = {
+ source: "struct Box { int x; };\nreturn { !Box box, int arg ->\n int n = arg < 0 ? -arg : arg;\n box.x += n;\n return n;\n};\n",
+ selected: "id node inputs\n 7 StartNode _ _ _\n11 ConstantNode 7\n15 ConstantNode 7\n18 ConstantNode 7\n22 ConstantNode 7\n 6 FunX86 _ 7\n10 ParmX86:arg 6 11\n14 ParmX86:$mem 6 15\n17 ParmX86:box 6 18\n21 ParmX86:$rpc 6 22\n 8 CmpIX86 _ 10\n20 NegX86 _ 10\n 5 JmpX86 6 8\n12 CProjNode:False 5\n 4 CProjNode:True 5\n 3 RegionNode _ 4 12\n19 PhiNode 3 20 10\n16 MemAddX86 _ 14 17 _ 19\n13 MemMergeNode _ 14 16\n 2 RetX86 3 13 19 21\n 1 StopNode 2\n",
+ assembly: "\n--- { *Box {int !x; } int -> int #0}---------------------------\n arg rsi\n box rdi\n r15 // r15\n r14 // r14\n r13 // r13\n r12 // r12\n rbp // rbp\n rbx // rbx\n0000 mov rax = rsi // def/empty1 #0\n0000 test rax \n0000 j< L4 // L12\nL12:\n0000 ?? JMP L3\nL4:\n0001 neg rax \nL3:\n rax = phi( N20,N33 )\n0001 add8 [rdi] += rax \n0001 ret rax [stk#33] rbx rbp r12 r13 r14 r15 \n--- ---------------------------\n",
+ encoded: "\n--- { *Box {int !x; } int -> int #0}---------------------------\n arg:rsi,box:rdi\n0000 488bc6 mov rax = rsi // def/empty1 #0\n0003 4883f800 test rax \n0007 7d03 j>= L3 // L4\nL4:\n0009 48f7d8 neg rax \nL12:\nL3:\n :rax\n000c 480107 add8 [rdi] += rax \n000f c3 ret \n--- ---------------------------\n"
+};
diff --git a/docs/2026_REBASE/deck.js b/docs/2026_REBASE/deck.js
new file mode 100644
index 00000000..06a4e9d5
--- /dev/null
+++ b/docs/2026_REBASE/deck.js
@@ -0,0 +1,58 @@
+/* Plain scripts keep the deck usable from file:// as well as an HTTP server. */
+window.REBASE = {
+ "title": "A Simple Tutorial",
+ "speaker": "Cliff Click",
+ "youtube": "https://www.youtube.com/@compilers",
+ "repo": "https://github.com/SeaOfNodes/Simple",
+ "demos": [
+ {
+ "id": "arithmetic",
+ "chapter": "chapter04",
+ "title": "Local rewrites, global payoff",
+ "code": "int x = arg + 0;\nint y = 1 + x + 2;\nreturn y + x + 3;\n",
+ "result": "2 * arg + 6",
+ "inputs": "arg = 0 → 6; arg = 5 → 16"
+ },
+ {
+ "id": "control",
+ "chapter": "chapter08",
+ "title": "A value at every merge",
+ "code": "int n = arg;\nif( n < 0 ) n = -n;\nint sum = 0;\nint i = 0;\nwhile( i < n ) {\n i = i + 1;\n sum = sum + i;\n}\nreturn sum;\n",
+ "result": "Sum 1 … |arg|",
+ "inputs": "arg = 0 → 0; arg = 5 → 15; arg = -5 → 15"
+ },
+ {
+ "id": "memory",
+ "chapter": "chapter17b",
+ "title": "Memory is dataflow, too",
+ "code": "struct Totals { int sum; int visits; };\nval t = new Totals;\nval data = new int[4];\nfor( int i = 0; i < data#; i++ )\n data[i] = arg + i;\nfor( int i = 0; i < data#; i++ ) {\n t.sum = t.sum + data[i];\n t.visits++;\n}\nreturn t.sum + t.visits;\n",
+ "result": "4 * arg + 10 (runtime result)",
+ "inputs": "arg = 0 → 10; arg = 5 → 30"
+ },
+ {
+ "id": "aliases",
+ "chapter": "chapter17b",
+ "title": "One field changes. Another does not.",
+ "code": "struct Pair { int x; int y; };\nval p = new Pair { x = arg; y = 10; };\nint before = p.x;\np.y = 99;\nreturn p.x - before;\n",
+ "result": "return 0;",
+ "inputs": "Any arg → 0"
+ },
+ {
+ "id": "inline",
+ "chapter": "chapter18",
+ "title": "Erase the call boundary",
+ "code": "val add1 = { int x -> x + 1; };\nval twice = { int x -> x * 2; };\nreturn twice(1 + add1(2)) + 3;\n",
+ "result": "return 11;",
+ "inputs": "Any arg → 11"
+ },
+ {
+ "id": "sccp",
+ "chapter": "chapter24",
+ "viewerChapter": "chapter25",
+ "title": "Prove a loop-carried constant",
+ "code": "int x = 1;\nfor( int i = 0; i < arg; i++ )\n x = 2 - x;\nreturn x;\n",
+ "result": "Return value is always 1",
+ "inputs": "arg = 0 → 1; arg = 5 → 1"
+ }
+ ]
+};
diff --git a/docs/2026_REBASE/demos/aliases.smp b/docs/2026_REBASE/demos/aliases.smp
new file mode 100644
index 00000000..a8ee471f
--- /dev/null
+++ b/docs/2026_REBASE/demos/aliases.smp
@@ -0,0 +1,5 @@
+struct Pair { int x; int y; };
+val p = new Pair { x = arg; y = 10; };
+int before = p.x;
+p.y = 99;
+return p.x - before;
diff --git a/docs/2026_REBASE/demos/arithmetic.smp b/docs/2026_REBASE/demos/arithmetic.smp
new file mode 100644
index 00000000..ef19a5bd
--- /dev/null
+++ b/docs/2026_REBASE/demos/arithmetic.smp
@@ -0,0 +1,3 @@
+int x = arg + 0;
+int y = 1 + x + 2;
+return y + x + 3;
diff --git a/docs/2026_REBASE/demos/backend.smp b/docs/2026_REBASE/demos/backend.smp
new file mode 100644
index 00000000..de8f7665
--- /dev/null
+++ b/docs/2026_REBASE/demos/backend.smp
@@ -0,0 +1,6 @@
+struct Box { int x; };
+return { !Box box, int arg ->
+ int n = arg < 0 ? -arg : arg;
+ box.x += n;
+ return n;
+};
diff --git a/docs/2026_REBASE/demos/control.smp b/docs/2026_REBASE/demos/control.smp
new file mode 100644
index 00000000..6b7b1b17
--- /dev/null
+++ b/docs/2026_REBASE/demos/control.smp
@@ -0,0 +1,9 @@
+int n = arg;
+if( n < 0 ) n = -n;
+int sum = 0;
+int i = 0;
+while( i < n ) {
+ i = i + 1;
+ sum = sum + i;
+}
+return sum;
diff --git a/docs/2026_REBASE/demos/inline.smp b/docs/2026_REBASE/demos/inline.smp
new file mode 100644
index 00000000..9d38e5b0
--- /dev/null
+++ b/docs/2026_REBASE/demos/inline.smp
@@ -0,0 +1,3 @@
+val add1 = { int x -> x + 1; };
+val twice = { int x -> x * 2; };
+return twice(1 + add1(2)) + 3;
diff --git a/docs/2026_REBASE/demos/memory.smp b/docs/2026_REBASE/demos/memory.smp
new file mode 100644
index 00000000..466c0476
--- /dev/null
+++ b/docs/2026_REBASE/demos/memory.smp
@@ -0,0 +1,10 @@
+struct Totals { int sum; int visits; };
+val t = new Totals;
+val data = new int[4];
+for( int i = 0; i < data#; i++ )
+ data[i] = arg + i;
+for( int i = 0; i < data#; i++ ) {
+ t.sum = t.sum + data[i];
+ t.visits++;
+}
+return t.sum + t.visits;
diff --git a/docs/2026_REBASE/demos/methods.smp b/docs/2026_REBASE/demos/methods.smp
new file mode 100644
index 00000000..683540c3
--- /dev/null
+++ b/docs/2026_REBASE/demos/methods.smp
@@ -0,0 +1,11 @@
+struct Counter {
+ int n;
+ val add = { int delta ->
+ n += delta;
+ return self;
+ };
+ val get = { -> return n; };
+};
+!Counter c = new Counter { n = arg; };
+c.add(3).add(4);
+return c.get();
diff --git a/docs/2026_REBASE/demos/sccp.smp b/docs/2026_REBASE/demos/sccp.smp
new file mode 100644
index 00000000..da91691d
--- /dev/null
+++ b/docs/2026_REBASE/demos/sccp.smp
@@ -0,0 +1,4 @@
+int x = 1;
+for( int i = 0; i < arg; i++ )
+ x = 2 - x;
+return x;
diff --git a/docs/2026_REBASE/index.html b/docs/2026_REBASE/index.html
new file mode 100644
index 00000000..4a95e27c
--- /dev/null
+++ b/docs/2026_REBASE/index.html
@@ -0,0 +1,41 @@
+<!doctype html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta name="description" content="A Simple Tutorial — Cliff Click at REBASE 2026. A 30-minute tour of an all-Java, open-source compiler modeled after Java's C2.">
+ <title>A Simple Tutorial · Cliff Click · REBASE 2026</title>
+ <link rel="stylesheet" href="slides.css">
+ <script defer src="deck.js"></script>
+ <script defer src="backend.js"></script>
+ <script defer src="stdlib.js"></script>
+ <script defer src="slides.js"></script>
+ <script defer src="language.js"></script>
+ <script defer src="lattices.js"></script>
+ <script defer src="app.js"></script>
+</head>
+<body>
+ <main id="viewport" aria-label="Presentation">
+ <article id="slide" class="slide" aria-live="polite"></article>
+ </main>
+ <nav id="controls" aria-label="Presentation controls">
+ <button id="previous" title="Previous build (Left)">←</button>
+ <button id="overview" title="Slide overview (O)">Slides</button>
+ <span id="position"></span>
+ <button id="next" title="Next build (Right or Space)">→</button>
+ <span class="control-divider"></span>
+ <button id="notes-toggle" title="Speaker notes (N)" aria-pressed="false">Notes</button>
+ <button id="presenter" title="Open presenter window (P)">Presenter</button>
+ <button id="fullscreen" title="Fullscreen (F)">⛶</button>
+ <button id="help" title="Keyboard shortcuts (?)">?</button>
+ </nav>
+ <aside id="notes" hidden aria-label="Speaker notes">
+ <div class="notes-toolbar"><strong>Speaker notes</strong><button id="timer" title="Start / pause talk timer (T)">Start timer</button><button id="timer-reset">Reset</button></div>
+ <div id="pace"></div><div id="notes-content"></div>
+ </aside>
+ <dialog id="dialog"><button id="dialog-close" class="dialog-close" aria-label="Close dialog">×</button><div id="dialog-content"></div></dialog>
+ <div id="toast" role="status" aria-live="polite"></div>
+ <div id="blackout" hidden aria-label="Presentation blanked. Press B or Escape to return."></div>
+ <noscript><p>This presentation needs JavaScript. The examples are also available as plain .smp files in the demos directory.</p></noscript>
+</body>
+</html>
diff --git a/docs/2026_REBASE/language.js b/docs/2026_REBASE/language.js
new file mode 100644
index 00000000..d5e1079a
--- /dev/null
+++ b/docs/2026_REBASE/language.js
@@ -0,0 +1,40 @@
+/* Chapter 22 library explorer and Chapter 23 methods example. No fetch needed. */
+(function () {
+ const R=window.REBASE, esc=R.escape, files=R.library.files;
+ const parent=path=>path.split('/').slice(0,-1).join('/');
+ const button=(path,label,cls='')=>'<button class="'+cls+'" data-library-path="'+esc(path)+'">'+label+'</button>';
+ R.libraryHasPath=path=>typeof path==='string' && (path==='' || Object.hasOwn(files,path) || Object.keys(files).some(file=>file.startsWith(path+'/')));
+ function explorer(state) {
+ const path=state.library, isFile=Object.hasOwn(files,path);
+ let crumbs=button('','Standard library');
+ path.split('/').filter(Boolean).forEach((part,i,parts)=>{
+ crumbs+='<span>/</span>'+button(parts.slice(0,i+1).join('/'),esc(part));
+ });
+ let contents;
+ if(isFile) {
+ contents='<pre class="library-text" data-library-scroll tabindex="0" aria-label="Source of '+esc(path)+'"><code>'+esc(files[path])+'</code></pre>';
+ } else {
+ const entries=new Map(), prefix=path?path+'/':'';
+ for(const file of Object.keys(files)) if(file.startsWith(prefix)) {
+ const rest=file.slice(prefix.length), name=rest.split('/')[0];
+ entries.set(name,rest.includes('/'));
+ }
+ contents='<div class="library-list" tabindex="0" aria-label="Files in '+esc(path||'standard library')+'">'+
+ [...entries].sort(([a,ad],[b,bd])=>Number(bd)-Number(ad)||a.localeCompare(b)).map(([name,dir])=>
+ button(prefix+name,'<span class="file-kind">'+(dir?'DIR':'SMP')+'</span><span>'+esc(name)+(dir?'/':'')+'</span><span class="file-arrow">'+(dir?'›':'↗')+'</span>','library-entry')).join('')+'</div>';
+ }
+ return '<section class="panel language-panel library-panel" aria-label="Standard library explorer"><div class="library-toolbar"><button data-language="library-close">← Discussion</button><button data-library-path="'+esc(parent(path))+'"'+(path===''?' disabled':'')+'>↑ Up</button><button data-language="library-width" aria-pressed="'+!!state.libraryWide+'">'+(state.libraryWide?'Two columns':'Full width')+'</button>'+(isFile?'<button data-language-copy="file">Copy file</button>':'')+'</div><nav class="library-crumbs" aria-label="Library path">'+crumbs+'</nav><p class="library-origin">Chapter 25 · '+esc(R.library.origin)+'</p>'+contents+'</section>';
+ }
+ function intro(which,state) {
+ const methods=which==='methods';
+ return '<section class="panel language-panel"'+(methods?' data-reveal="1"':'')+'><button class="language-flip" data-language="'+(methods?'methods-open':'library-open')+'"'+(methods && state.step<1?' disabled':'')+'><span class="language-face"><span class="eyebrow">'+(methods?'23 · Methods and types':'22 · Hello, world')+'</span><span class="language-title">'+(methods?'A method is a function<br>with a receiver.':'Cross the runtime boundary.')+'</span>'+
+ (methods?'<span class="cycle"><span>Struct</span><b>⇄</b><span>Function(self)</span></span><span class="language-paragraph">Recursive type graphs require cyclic equality and interning.</span><span class="language-paragraph muted">The same meet/dual interface remains.</span>':'<code class="language-hello">sys.io.p("Hello, World!");</code><span class="language-paragraph">Strings, constant data, C calls,<br>and a small system library.</span><span class="language-paragraph muted">The ABI becomes observable behavior.</span>')+
+ '</span><span class="flip-hint">'+(methods?'Click to see a class and its methods':'Click to explore the standard library')+' ↻</span></button></section>';
+ }
+ function methods(state) {
+ return '<section class="panel language-panel methods-panel" data-reveal="1"><div class="library-toolbar"><button data-language="methods-close">← Discussion</button><strong>23 · Counter</strong><button data-language-copy="methods">Copy code</button></div><pre class="methods-source"><code>'+esc(R.library.methods)+'</code></pre><p class="methods-caption"><code>c.add(3).add(4)</code> passes <code>c</code> as <code>self</code>.<br>The program returns <strong>arg + 7</strong>.</p></section>';
+ }
+ R.languageBody=state=>'<h2>The language starts<br>using its compiler.</h2><div class="two-up language-layout'+(state.library!==null && state.libraryWide?' library-wide':'')+'">'+
+ (state.library===null?intro('library',state):explorer(state))+
+ (state.library!==null && state.libraryWide?'':state.methods?methods(state):intro('methods',state))+'</div>';
+})();
diff --git a/docs/2026_REBASE/lattices.js b/docs/2026_REBASE/lattices.js
new file mode 100644
index 00000000..2e7da4a4
--- /dev/null
+++ b/docs/2026_REBASE/lattices.js
@@ -0,0 +1,128 @@
+/* Presentation-sized views of the chapter lattices. Lines run down the order.
+ * Focused views deliberately omit other domains; see README.md for sources.
+ */
+(function () {
+ const R=window.REBASE, esc=R.escape;
+ const text=(x,y,s,cls='')=>'<text class="'+cls+'" x="'+x+'" y="'+y+'" text-anchor="middle">'+esc(s)+'</text>';
+ const edge=(x,y,a,b)=>'<path class="lat-edge" d="M'+x+' '+y+' L'+a+' '+b+'"/>';
+ function node(x,y,label,kind='integer',width=150) {
+ return '<rect class="lat-node '+kind+'" x="'+(x-width/2)+'" y="'+(y-23)+'" width="'+width+'" height="46" rx="12"/>'+text(x,y+8,label);
+ }
+ function svg(label,body) {
+ return '<svg class="lattice-svg" viewBox="0 0 900 500" role="img" aria-label="'+esc(label)+'"><title>'+esc(label)+'</title>'+body+'</svg>';
+ }
+ function early(control) {
+ let s=edge(450,58,130,control?127:227)+edge(130,control?373:273,450,442)+
+ edge(450,58,450,127)+edge(450,373,450,442)+edge(450,58,760,127)+edge(760,373,450,442);
+ for(const x of [295,450,605]) s+=edge(450,173,x,227)+edge(x,273,450,327);
+ s+=edge(760,173,760,227)+edge(760,273,760,327);
+ if(control) s+=edge(130,173,130,327);
+ s+=node(450,35,'⊤','global',65)+node(450,465,'⊥','global',65)+
+ node(450,150,'⊤:int')+node(295,250,'−1', 'integer',80)+node(450,250,'0','integer',80)+node(605,250,'1','integer',80)+node(450,350,'⊥:int')+
+ node(760,150,'⊤:tuple','tuple')+node(760,250,'[T₀, …, Tₙ]','tuple',200)+node(760,350,'⊥:tuple','tuple');
+ s+=control?node(130,150,'⊤:ctrl','control')+node(130,350,'⊥:ctrl','control')+text(130,207,'unreachable','hint')+text(130,405,'reachable','hint'):node(130,250,'ctrl','control');
+ return svg(control?'Chapter 8: control, flat integers, and tuples':'Chapter 4: control, flat integers, and tuples',s);
+ }
+ function domains() {
+ const ds=[['Control','ctrl','control'],['Integers','int','integer'],['Pointers','ptr','pointer'],['Structs','struct','struct'],['Memory','mem','memory'],['Tuples','tuple','tuple']];
+ let s='';
+ ds.forEach(([name,suffix,kind],i)=>{
+ const x=75+i*150;
+ s+=edge(450,58,x,137)+(suffix==='mem'?'':edge(x,183,x,327))+edge(x,373,450,442)+
+ node(x,160,'⊤:'+suffix,kind,134)+node(x,350,'⊥:'+suffix,kind,134)+'<rect x="'+(x-70)+'" y="92" width="140" height="29" fill="#f5f3ec"/>'+text(x,115,name,'domain-name');
+ if(suffix==='mem') {
+ s+=edge(x,183,x-38,237)+edge(x,183,x+38,237)+edge(x-38,263,x,327)+edge(x+38,263,x,327);
+ s+=node(x-38,250,'#2',kind,58)+node(x+38,250,'#3',kind,58);
+ } else if(suffix!=='ctrl') {
+ s+='<rect x="'+(x-55)+'" y="221" width="110" height="58" rx="8" class="lat-elided"/>'+text(x,258,'…','ellipsis');
+ }
+ });
+ s+=node(450,35,'⊤','global',65)+node(450,465,'⊥','global',65);
+ return svg('Chapter 11 domain overview; interiors elided except two memory aliases',s);
+ }
+ function contents() {
+ let s=edge(450,78,450,147)+edge(450,193,250,257)+edge(450,193,650,257)+edge(250,303,450,367)+edge(650,303,450,367)+edge(450,413,450,442);
+ s+=node(450,55,'MEM#2 : ⊤:int','memory',290)+node(450,170,'MEM#2 : [1, 0]','memory',300)+
+ node(250,280,'MEM#2 : 0','memory',220)+node(650,280,'MEM#2 : 1','memory',220)+
+ node(450,390,'MEM#2 : [0, 1]','memory',300)+node(450,465,'MEM#2 : ⊥:int','memory',290);
+ return svg('A slice of typed memory: fixed alias 2, integer contents, selected elements',s);
+ }
+ function ranges(optimistic=false) {
+ let s=edge(450,58,450,127)+edge(450,173,250,227)+edge(450,173,650,227)+edge(250,273,450,327)+edge(650,273,450,327)+edge(450,373,450,442);
+ if(optimistic) s+='<path class="lat-solve" d="M485 61 Q765 95 685 221"/>'+text(735,127,'start → 1','solve-label');
+ s+=node(450,35,'⊤:int','integer',170)+node(450,150,'[1, 0]','integer',180)+
+ node(250,250,'0','integer',100)+node(650,250,'1',optimistic?'chosen':'integer',100)+
+ node(450,350,'[0, 1]','integer',180)+node(450,465,'⊥:int','integer',170);
+ return svg('Selected integer-range lattice elements: dual ranges above constants, ordinary ranges below',s);
+ }
+ function functions() {
+ let s=edge(450,83,240,207)+edge(450,83,660,207)+edge(240,253,450,367)+edge(660,253,450,367);
+ s+=node(450,60,'∅','function',130)+node(240,230,'{add1}','chosen',190)+node(660,230,'{twice}','function',190)+node(450,390,'{add1, twice}','function',280);
+ s+=text(450,465,'Target-set projection; meet = union','hint');
+ return svg('Function target-set lattice restricted to two targets, with signature, return type, and nullability fixed',s);
+ }
+ const point=(title,body)=>'<div class="lattice-point"><h3>'+title+'</h3><p>'+body+'</p></div>';
+ function page(title,subtitle,picture,points,caption) {
+ return '<div class="lattice-page"><h2>'+title+'</h2><p class="lattice-subtitle">'+subtitle+'</p><div class="lattice-layout"><figure>'+picture+'<figcaption>'+caption+'</figcaption></figure><aside>'+points.join('')+'</aside></div><p class="lattice-legend">⊤ above ⊥ · lines show lattice order · meet moves downward to the greatest lower bound</p></div>';
+ }
+ const views={
+ early:{id:'lattice',label:'Lattice',steps:0,
+ body:()=>page('Types describe possible values.','Chapter 4 · one lattice, several domains',early(false),[
+ point('Constants are types.','<code>arg : ⊥:int</code><br><code>3 : 3</code>'),
+ point('Meet combines alternatives.','<code>1 ∧ 1 = 1</code><br><code>1 ∧ 2 = ⊥:int</code>'),
+ point('Every node computes a type.','A constant result can replace the node. Tuples meet element by element.')
+ ],'Other integer constants and tuple interiors are omitted.'),
+ notes:'<h3>Lattice · about 30 seconds of this demo slot</h3><p>These are abstract values, not the Java class hierarchy. Show global top/bottom versus domain top/bottom. Chapter 4 has one control element, flat integer constants, and tuples. AddNode.compute evaluates constant operands; meet is the operation for combining alternatives, not integer addition. Return to Example for the local rewrites.</p>'},
+ control:{id:'lattice',label:'Lattice',steps:0,
+ body:()=>page('Reachability is a type, too.','Chapter 8 · the Chapter 6 control lattice carries through loops',early(true),[
+ point('Control gains a dual.','<code>⊤:ctrl = unreachable</code><br><code>⊥:ctrl = reachable</code>'),
+ point('A Phi meets live inputs.','<code>Phi(1, 2) : ⊥:int</code><br>A dead predecessor contributes no value.'),
+ point('Loops close the cycle.','The backedge is another input. Lazy Phis allow construction before that input exists.')
+ ],'The integer lattice is still flat here; ranges arrive in Chapter 14.'),
+ notes:'<h3>Lattice · about 30 seconds of this demo slot</h3><p>Only the control branch changed from the preceding diagram. Region computes reachability; Region removes dead predecessors and their Phi inputs; Phi meets the remaining value types. A loop introduces a cycle in the graph, not another type domain. Optimistic solving comes later, in Chapter 24.</p>'},
+ domains:{id:'domains',label:'Domains',steps:0,
+ body:()=>page('Memory joins the type lattice.','Chapter 11 · six domains under the same global bounds',domains(),[
+ point('Memory has alias slices.','<code>MEM#2 ∧ MEM#3 = ⊥:mem</code><br>In this chapter the alias elements are flat.'),
+ point('Pointers carry structure.','Nullability and struct field types participate in the lattice; tuples contain types recursively.'),
+ point('A MemMerge is an IR node.','It carries several dependency slices. Its inputs are not a meet of distinct aliases.')
+ ],'Domain interiors are elided; #2 and #3 stand for two of many aliases.'),
+ notes:'<h3>Domain overview · about 20 seconds</h3><p>This is specifically Chapter 11: control, integers, pointers, structs, memory, and tuples. The boxes with ellipses abbreviate each domain, not extra lattice elements. Memory slices in 11 are flat aliases; typed contents arrive in Chapter 15. Distinguish the TypeMem meet from the MemMerge dependency node we just inspected.</p>'},
+ contents:{id:'contents',label:'Memory types',steps:0,
+ body:()=>page('Memory carries facts about contents.','Chapters 15–17b · one alias, with integer ranges from Chapter 14',contents(),[
+ point('Fix the alias; vary its contents.','<code>MEM#2 : T</code><br>The contents have their own lattice.'),
+ point('Meet the stored-value types.','<code>MEM#2:0 ∧ MEM#2:1</code><br><code>= MEM#2:[0,1]</code>'),
+ point('Types and dependencies cooperate.','The type bounds values in a slice. Memory edges and pointer identity determine which Store a Load can see.')
+ ],'Selected elements for alias #2 only; other aliases and memory bounds omitted.'),
+ notes:'<h3>Typed contents · about 20 seconds</h3><p>Chapter 15 adds TypeMem contents, using the integer ranges introduced in Chapter 14. This is a fixed-alias, integer-contents slice of the larger lattice. The top and bottom pictured belong to those integer contents, not global memory top and bottom. The contents type summarizes allocated objects in that alias; it does not name the object selected by p.x. Return to Examples and connect this to the independent p.y Store.</p>'},
+ ranges:{id:'ranges',label:'Ranges',steps:0,
+ body:()=>page('Refine the integer domain.','Chapter 14 · constants become singleton ranges',ranges(),[
+ point('Meet takes the bounding interval.','<code>0 ∧ 1 = [0,1]</code><br><code>[a,b] ∧ [c,d]</code><br><code>= [min(a,c), max(b,d)]</code>'),
+ point('Dual swaps the endpoints.','<code>dual([0,1]) = [1,0]</code><br>High ranges live above constants.'),
+ point('The interface stays the same.','Meet, dual, and transfer functions extend to richer types. Floats add another domain.')
+ ],'A selected sublattice, not all intervals. Lines may span omitted elements.'),
+ notes:'<h3>Ranges · optional 15–20 seconds</h3><p>Show the 0/1 diamond, with [0,1] below and its dual [1,0] above. The high side is an algebraic dual, not a second collection of runtime intervals. These selected elements omit other ranges and the float domain. Keep this quick: it supplies the picture needed again at SCCP.</p>'},
+ functions:{id:'lattice',label:'Lattice',steps:0,
+ body:()=>page('A function value has a target set.','Chapter 18 · hold signature, result type, and nullability fixed',functions(),[
+ point('Merge alternatives by union.','<code>{add1} ∧ {twice}</code><br><code>= {add1, twice}</code>'),
+ point('A singleton identifies the callee.','One known target makes direct linking possible. Trivial inlining also checks usage and recursion.'),
+ point('The full type has more components.','Argument tuple, return type, nullability, and target bits all participate. Only the target-set projection is drawn.')
+ ],'Restricted to two possible targets. The empty set is top in this projection.'),
+ notes:'<h3>Function targets · about 30 seconds of this demo slot</h3><p>TypeFunPtr meets target bits with bitwise OR. For this drawing fix the other components, including an int return type, and restrict the universe to the two named functions. This is not the complete function-pointer lattice or a diagram of function subtyping. The concrete demo calls each singleton directly; it does not form the two-target union. Connect singleton information to the additional single-use and non-recursion checks for inlining.</p>'},
+ rich:{id:'rich',label:'Rich lattice',steps:0,
+ body:()=>'<div class="rich-lattice-page"><h2>Rich lattice</h2><p class="rich-domains">Control · integer ranges · floats · nullability · pointers · function targets · memory · structs · tuples · return addresses · constant arrays</p><a class="rich-lattice-link" href="assets/rich-lattice.svg" target="_blank" rel="noopener" aria-label="Open the rich lattice at full size"><img class="rich-lattice-image" src="assets/rich-lattice.svg" alt="Chapter 24 type ordering: 143 representative types and their duals across all type families, connected by 256 order edges, from global top to global bottom."></a><div class="rich-takeaways"><p>It’s just a lattice.<small>So the fixed-point theory works.</small></p><p>It’s a rich lattice.<small>So we get rich results.</small></p></div><p class="rich-caption">Chapter 24’s actual type ordering · representative elements across every family · click for full size</p></div>',
+ notes:'<h3>Rich lattice</h3><p>Pull back from the little integer diamond to the full range of type families. This diagram is generated from Chapter 24 Type.gather(), including duals, and the actual isa/meet ordering: 143 representative types, 256 transitively reduced order edges. It samples each family; it does not enumerate every interval, function target set, or recursive aggregate. An edge can span elements outside the sample. Repeated compact labels can hide differing type components; opening the SVG gives full-type tooltips.</p><p>The two messages are: it is just a lattice, so the monotone fixed-point framework applies; it is a rich lattice, so the result contains far more than integer constants. Reachability, ranges, nullability, memory contents, and callable targets all participate. The usual monotonicity and convergence conditions still matter. The arrows here are lattice order, not IR dependencies.</p>'},
+ sccp:{id:'lattice',label:'Lattice',steps:0,
+ body:()=>page('Solve the cycle from the high side.','Chapter 24 · the integer lattice is already available',ranges(true),[
+ point('Seed unknown results at top.','<code>Phi(1, ⊤:int) = 1</code>'),
+ point('The backedge confirms it.','<code>2 − 1 = 1</code><br><code>Phi(1, 1) = 1</code>'),
+ point('Propagate to a fixed point.','Types descend as reachable information arrives. Control types decide which predecessors contribute.')
+ ],'Orange shows an analysis update; gray lines show the selected lattice order.'),
+ notes:'<h3>SCCP lattice · about 30 seconds of this two-minute slot</h3><p>Reuse the range picture, now showing the descent from integer top to 1. The loop Phi and subtraction both settle at 1. Global top may be used to initialize an untyped result; the picture projects onto the integer domain. Contrast with seeding at integer bottom, which cannot discover this invariant. Lattice order and the direction of solving are distinct from the graph viewer’s use-to-definition arrows.</p>'}
+ };
+ const attach=(id,items)=>{R.slides.find(s=>s.id===id).views=items.map(key=>views[key]);};
+ attach('arithmetic',['early']);
+ attach('control',['control']);
+ attach('memory',['domains','contents','ranges']);
+ attach('inline',['functions']);
+ attach('sccp',['rich']);
+})();
diff --git a/docs/2026_REBASE/slides.css b/docs/2026_REBASE/slides.css
new file mode 100644
index 00000000..67605fec
--- /dev/null
+++ b/docs/2026_REBASE/slides.css
@@ -0,0 +1,38 @@
+:root{color-scheme:light;--paper:#f5f3ec;--ink:#172e35;--muted:#53656a;--accent:#086c60;--orange:#c95932;--line:#cbd3cd;--blue:#24648a;--purple:#715694;--scale:1}
+.two-up.language-layout{margin-top:24px}.language-layout.library-wide{grid-template-columns:1fr}.panel.language-panel{height:530px;min-width:0;padding:0}.language-flip{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;padding:29px;text-align:left;border:0;background:transparent}.language-flip:disabled{opacity:1;cursor:default}.language-face,.language-title,.language-paragraph{display:block}.language-title{font-size:28px;font-weight:bold;line-height:1.14}.language-paragraph{font-size:24px;line-height:1.4;margin-top:23px}.language-hello{display:block;font:23px/1.5 Consolas,monospace;margin:28px 0}.language-face .cycle{font-size:22px}.panel.library-panel,.panel.methods-panel{padding:18px;display:flex;flex-direction:column}.library-toolbar{display:flex;gap:8px;align-items:center;flex-shrink:0}.library-toolbar button{font-size:16px;padding:8px 10px}.library-toolbar strong{font-size:19px;flex:1;text-align:center}.library-crumbs{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:10px;flex-shrink:0}.library-crumbs button{font:17px Consolas,monospace;padding:5px;border:0;background:transparent}.library-crumbs span{color:var(--muted)}.panel .library-origin{font-size:14px;color:var(--muted);margin:5px 0 12px}.library-list{min-height:0;overflow:auto;flex:1}.library-entry{display:flex;align-items:center;gap:16px;width:100%;text-align:left;border:0;border-radius:0;border-bottom:1px solid var(--line);padding:8px 12px;font:19px Consolas,monospace;background:transparent}.file-kind{font:12px Arial,sans-serif;color:var(--muted);width:30px}.file-arrow{margin-left:auto;color:var(--accent)}.panel .library-text{flex:1;min-height:0;max-width:100%;overflow:auto;overscroll-behavior:contain;white-space:pre;margin:0;padding:14px;background:#152e36;color:#ecf1e8;border-radius:5px;font:17px/1.45 Consolas,monospace;tab-size:4}.library-text:focus-visible,.library-list:focus-visible{outline:2px solid var(--orange);outline-offset:2px}.panel .methods-source{flex:1;min-height:0;overflow:auto;font:20px/1.38 Consolas,monospace;white-space:pre;margin:18px 0 10px}.panel .methods-caption{font-size:19px;line-height:1.4;border-top:1px solid var(--line);padding-top:10px}
+.slide h2.sccp-title{font-size:48px}.rich-lattice-page h2{font-size:52px}.rich-domains{font-size:20px;line-height:1.4;color:var(--muted);margin-top:12px}.rich-lattice-link{display:block;margin-top:12px}.rich-lattice-image{display:block;width:100%;height:455px;object-fit:contain}.rich-takeaways{display:grid;grid-template-columns:1fr 1fr;gap:40px;margin-top:12px}.rich-takeaways p{font-size:32px;font-weight:bold;border-top:3px solid var(--accent);padding-top:12px}.rich-takeaways small{display:block;font-size:26px;font-weight:normal;margin-top:4px}.rich-caption{font-size:16px;color:var(--muted);margin-top:16px}
+.backend-source{font:20px/1.4 Consolas,monospace;margin:16px 0 0;white-space:pre-wrap;color:var(--blue)}.pipeline.backend-pipeline{margin-top:18px}.pipeline-card.backend-card{padding:0;height:502px;min-width:0}.backend-flip{display:flex;flex-direction:column;justify-content:space-between;width:100%;height:100%;border:0;padding:26px;text-align:left;background:transparent;border-radius:8px}.backend-flip:disabled{opacity:1;cursor:default}.backend-face,.backend-title,.backend-discussion,.backend-card .number{display:block}.backend-title{font-size:28px;font-weight:bold;line-height:1.14;letter-spacing:-.02em;margin-bottom:18px}.backend-discussion{font-size:23px;line-height:1.4}.flip-hint{display:block;font-size:14px;color:var(--accent);margin-top:12px}.flipped .backend-flip{padding:15px 16px}.dump-heading{display:block;font-size:18px;font-weight:bold;margin-bottom:12px;color:var(--accent)}.backend-card .backend-dump{border:0;padding:0;margin:0;font:14px/1.27 Consolas,"Liberation Mono",monospace;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--ink)}.backend-card .backend-dump.selected{font-size:14.5px;line-height:1.25}.backend-card .backend-dump.encoded{font-size:16px;line-height:1.3}.backend-dump strong{color:var(--orange);font-weight:bold}.lower-line.backend-provenance{margin-top:15px}.backend-provenance p{font-size:18px}.backend-provenance .chips span{font-size:16px;padding:6px 12px}
+*{box-sizing:border-box}body{margin:0;background:#dfe4df;color:var(--ink);font-family:Arial,Helvetica,sans-serif}button,a,input{touch-action:manipulation}button{font:inherit;cursor:pointer}button:focus-visible,a:focus-visible,textarea:focus-visible{outline:3px solid #e17d39;outline-offset:5px}button:disabled{opacity:.4;cursor:default}a{color:var(--accent);text-underline-offset:5px}button{border:1px solid var(--line);background:var(--paper);color:var(--ink);border-radius:6px;padding:9px 14px}button:hover:not(:disabled){background:#e0e9e2}button.primary{background:var(--accent);color:#fff;border-color:var(--accent)}button.primary:hover{background:#09584f}
+#viewport{position:fixed;inset:0 0 54px;overflow:hidden}.slide{position:absolute;left:50%;top:50%;width:1440px;height:900px;transform:translate(-50%,-50%) scale(var(--scale));background:var(--paper);padding:54px 72px 64px;overflow:hidden;box-shadow:0 20px 80px #172e3518;display:flex;flex-direction:column}
+.slide:not(.still) .slide-content{animation:arrive .3s ease-out}@keyframes arrive{from{opacity:0;transform:translateY(9px)}to{opacity:1;transform:none}}
+.kicker{display:flex;justify-content:space-between;align-items:center;font-size:17px;letter-spacing:.12em;text-transform:uppercase;font-weight:700;margin-bottom:30px}.kicker .tag{border:1px solid var(--accent);padding:7px 11px;border-radius:30px;color:var(--accent);letter-spacing:.05em;font-size:14px}
+h1,h2,h3,p{margin:0}h1{font-size:100px;line-height:.99;letter-spacing:-.055em;font-weight:750}h2{font-size:62px;line-height:1.04;letter-spacing:-.04em;font-weight:700}h3{font-size:28px;letter-spacing:-.02em;line-height:1.14}p{font-size:25px;line-height:1.4}.muted{color:var(--muted)}.accent{color:var(--accent)}.orange{color:var(--orange)}.eyebrow{font-size:16px;font-weight:bold;text-transform:uppercase;letter-spacing:.13em;color:var(--muted);margin-bottom:14px}
+.slide-content{flex:1;min-height:0}.footer{position:absolute;bottom:25px;left:72px;right:72px;border-top:1px solid var(--line);padding-top:13px;display:flex;justify-content:space-between;font-size:15px;color:var(--muted)}.footer strong{color:var(--ink)}.build-dots{display:flex;gap:7px}.build-dots i{width:7px;height:7px;border-radius:50%;background:#c9d1ca}.build-dots i.on{background:var(--accent)}
+.title-layout{display:grid;grid-template-columns:1.2fr .8fr;gap:82px;height:100%;align-items:center}.title-copy h1{font-size:116px;line-height:.98}.title-copy .subtitle{font-size:29px;line-height:1.35;max-width:650px;margin-top:30px}.speaker{margin-top:55px}.speaker strong{font-size:30px;display:block}.speaker span{font-size:19px;display:block;margin-top:9px;color:var(--muted)}.portrait{width:100%;height:610px;object-fit:cover;object-position:50% 35%;border-radius:3px}.photo-caption{font-size:14px;color:var(--muted);margin-top:12px}.title-line{width:74px;height:6px;background:var(--orange);margin-bottom:30px}
+.title-repo{position:absolute;left:72px;bottom:82px;font:23px Consolas,monospace}
+.bio-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:60px;align-items:center;margin-top:35px}.bio-list{list-style:none;padding:0;margin:35px 0 30px}.bio-list li{border-top:1px solid var(--line);padding:18px 0;font-size:25px;line-height:1.35}.bio-list small{display:block;font-size:20px;color:var(--muted);margin-top:6px}.club-image{width:100%;height:340px;object-fit:contain;mix-blend-mode:multiply}.club-caption{font-size:20px;margin:20px 0;text-align:center}.link-row{display:flex;gap:12px;flex-wrap:wrap;margin-top:22px}.link-row a{font-size:20px;padding:12px 16px;border:1px solid var(--line);border-radius:5px;text-decoration:none}.link-row a:hover{background:#e0e9e2}
+.demo-layout{display:grid;grid-template-columns:1.03fr .97fr;gap:46px;margin-top:27px}.demo-code{background:#152e36;color:#ecf1e8;border-radius:9px;overflow:hidden;box-shadow:0 10px 25px #122b3410}.code-head{display:flex;justify-content:space-between;align-items:center;padding:13px 20px;background:#203d46;font:16px Consolas,monospace;color:#bdcec8}.code-head button{font-family:Arial,sans-serif;font-size:15px;background:#2e5356;color:#fff;border-color:#638582;padding:6px 13px}.demo-code pre{padding:24px 23px;margin:0;font:25px/1.5 Consolas,"Liberation Mono",monospace;tab-size:4;white-space:pre-wrap;overflow-wrap:normal}.demo-code.long pre{font-size:22px;line-height:1.45}.comment{color:#a6c0b5}.demo-actions{display:flex;gap:10px;margin-top:14px;flex-wrap:wrap}.demo-actions button,.demo-actions a{font-size:17px}.demo-actions a{display:inline-flex;align-items:center;padding:9px 2px}.launch{font:18px Consolas,monospace;display:block;margin-top:17px;color:var(--muted)}.demo-right{padding-top:5px}.thesis{font-size:28px;line-height:1.35;max-width:580px;margin-bottom:23px}
+.fact{border-top:1px solid var(--line);padding:14px 0;display:flex;align-items:baseline;gap:18px}.fact b{font-size:18px;color:var(--accent);min-width:65px}.fact span{font-size:22px;line-height:1.32}.result{background:#e2ebe2;border-left:5px solid var(--accent);padding:19px 22px;margin-top:22px}.result strong{font:30px/1.3 Consolas,monospace}.result small{font-size:17px;display:block;margin-top:10px;color:var(--muted)}.watch{margin-top:20px;font-size:19px;line-height:1.45;color:var(--muted)}.watch strong{color:var(--ink)}.demo-tabs{display:flex;gap:8px;margin-top:17px}.demo-tabs button{font-size:16px}.demo-tabs button.active{background:var(--accent);color:white}
+[data-reveal]{transition:opacity .25s,transform .25s}[data-reveal].unrevealed{opacity:.12;transform:translateY(5px)}.state-card{border:1px solid var(--line);padding:20px;border-radius:7px;margin-top:20px;background:#ffffff50}.state-card .state{display:none}.state-card .state.active{display:block}.formula{font:34px/1.5 Consolas,monospace}.formula small{font-size:19px;display:block;color:var(--muted)}.svg-graph{width:100%;height:235px;overflow:visible}.svg-graph text{font-family:Consolas,monospace;fill:var(--ink);font-size:20px}.svg-graph .node{fill:#e9efea;stroke:var(--accent);stroke-width:2}.svg-graph .phi{fill:#eee7f5;stroke:var(--purple)}.svg-graph .ctrl{fill:#faedce;stroke:#b88228}.svg-graph .edge{fill:none;stroke:#587075;stroke-width:2}.svg-graph .memory-edge{stroke:var(--blue);stroke-width:3}.graph-caption{font-size:15px;color:var(--muted);text-align:center}
+.pipeline{display:grid;grid-template-columns:repeat(3,1fr);gap:22px;margin-top:44px}.pipeline-card{position:relative;border:1px solid var(--line);padding:27px 26px;min-height:380px;background:#ffffff50;border-radius:8px}.pipeline-card .number{font:56px/1 Consolas,monospace;color:var(--accent);margin-bottom:24px}.pipeline-card h3{margin-bottom:18px}.pipeline-card p{font-size:23px}.pipeline-card code{display:block;border-top:1px solid var(--line);margin-top:25px;padding-top:20px;font:21px/1.7 Consolas,monospace;color:var(--blue)}.lower-line{display:flex;justify-content:space-between;align-items:center;margin-top:30px}.chips{display:flex;gap:12px}.chips span{font-size:20px;border:1px solid var(--line);padding:9px 17px;border-radius:30px}
+.two-up{display:grid;grid-template-columns:1fr 1fr;gap:36px;margin-top:38px}.panel{background:#ffffff60;border:1px solid var(--line);border-radius:8px;padding:29px;min-height:400px}.panel .eyebrow{color:var(--accent)}.panel pre{font:23px/1.5 Consolas,monospace;white-space:pre-wrap;margin:28px 0}.panel p{font-size:24px}.cycle{display:flex;align-items:center;justify-content:center;gap:16px;margin:26px 0;font:22px Consolas,monospace}.cycle span{padding:15px;background:#e1eae2;border:1px solid var(--line);border-radius:6px}.cycle b{color:var(--orange)}.statement{font-size:30px;line-height:1.4;margin-top:32px}
+.sccp-table{width:100%;border-collapse:collapse;margin-top:24px;font-size:24px}.sccp-table th,.sccp-table td{text-align:left;padding:16px;border-bottom:1px solid var(--line)}.sccp-table th{font-size:17px;text-transform:uppercase;color:var(--muted);letter-spacing:.08em}.sccp-table td:not(:first-child){font-family:Consolas,monospace}.sccp-table tr:last-child td{color:var(--accent);font-weight:bold}.sccp-warning{font-size:21px;margin-top:28px;line-height:1.4}.takeaway-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px;margin:45px 0}.takeaway-grid div{border-top:4px solid var(--accent);padding-top:23px}.takeaway-grid h3{font-size:33px;margin-bottom:15px}.takeaway-grid p{font-size:25px}.repo-link{font:27px Consolas,monospace}.optional-link{font-size:19px;margin-top:23px;display:block}.module-diagram{display:flex;gap:25px;align-items:center;justify-content:center;margin:38px 0}.module-diagram div{padding:25px;border:1px solid var(--line);border-radius:7px;background:#fff8;font-size:25px;line-height:1.5}.module-diagram b{font-size:35px;color:var(--orange)}
+#controls{position:fixed;bottom:0;height:54px;left:0;right:0;display:flex;gap:7px;justify-content:center;align-items:center;background:#f5f3eced;border-top:1px solid var(--line);z-index:5}#controls button{font-size:13px;padding:6px 11px}#position{font:13px Consolas,monospace;min-width:82px;text-align:center}.control-divider{height:20px;border-left:1px solid var(--line);margin:0 6px}#notes{position:fixed;z-index:8;right:20px;bottom:70px;width:min(650px,90vw);max-height:70vh;overflow:auto;padding:24px;background:#fffdf7;border:1px solid var(--line);box-shadow:0 15px 70px #102d3540;border-radius:10px;font-size:18px;line-height:1.5}#notes p,#notes li{font-size:18px;line-height:1.5}#notes ol{padding-left:24px}#notes li{margin:12px 0}.notes-toolbar{display:flex;gap:10px;align-items:center}.notes-toolbar strong{flex:1}.notes-toolbar button{font-size:13px}#pace{margin:16px 0;padding:10px;background:#e2ebe2;font:16px Consolas,monospace}#pace.over{background:#ffe5d6}#notes-content h3{font-size:23px;margin-bottom:15px}
+dialog{border:1px solid var(--line);border-radius:12px;background:var(--paper);color:var(--ink);max-width:min(1150px,95vw);max-height:90vh;width:950px;padding:34px}dialog::backdrop{background:#0b202dcc;backdrop-filter:blur(5px)}.dialog-close{float:right;font-size:26px;padding:1px 10px}dialog h2{font-size:34px;margin:5px 0 20px}dialog p{font-size:19px;line-height:1.5;margin:12px 0}dialog .overview-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}dialog .overview-grid button{text-align:left;padding:16px;line-height:1.5}dialog .overview-grid small{display:block;color:var(--muted)}dialog img{max-width:100%;max-height:68vh;display:block;margin:auto;object-fit:contain}dialog textarea{width:100%;height:250px;font:18px/1.5 Consolas,monospace;padding:15px}.keys{display:grid;grid-template-columns:130px 1fr;gap:13px;font-size:18px}kbd{font-family:Consolas,monospace;background:#e2e7df;padding:3px 7px;border-radius:4px}#toast{position:fixed;left:50%;bottom:73px;transform:translateX(-50%);padding:12px 22px;border-radius:8px;background:#172e35;color:white;z-index:30;opacity:0;pointer-events:none;transition:opacity .15s}#toast.show{opacity:1}#blackout{position:fixed;inset:0;background:#000;z-index:50}
+body.presenter #viewport{right:390px}body.presenter #notes{display:block;top:15px;right:15px;bottom:69px;width:360px;max-height:none;box-shadow:none;padding:20px}body.presenter .notes-toolbar{flex-wrap:wrap}body.presenter .notes-toolbar strong{flex-basis:100%}body.presenter #controls{right:390px}body.presenter #notes-toggle,body.presenter #presenter,body.presenter #fullscreen{display:none}body.presenter #notes p,body.presenter #notes li{font-size:16px}body.presenter #notes-content h3{font-size:21px}
+#slide[data-id="title"] .kicker .tag{visibility:hidden}
+.view-tabs{display:flex;gap:5px;letter-spacing:0;text-transform:none}.view-tabs button{font-size:16px;padding:8px 12px}.view-tabs button[aria-pressed="true"]{background:var(--accent);border-color:var(--accent);color:white}
+.lattice-page h2{font-size:55px}.lattice-subtitle{font-size:23px;color:var(--muted);margin-top:16px}.lattice-layout{display:grid;grid-template-columns:900px 1fr;gap:30px;margin-top:24px;align-items:start}.lattice-layout figure{margin:0}.lattice-svg{display:block;width:900px;height:500px}.lattice-svg text{font:25px Arial,Helvetica,sans-serif;fill:var(--ink)}.lattice-svg .hint{font-size:21px;fill:var(--muted)}.lattice-svg .domain-name{font-size:21px;font-weight:bold}.lattice-svg .ellipsis{font-size:32px;fill:var(--muted)}.lat-edge{stroke:#7d9090;stroke-width:2;fill:none}.lat-node{stroke-width:1.7;fill:#e5edf1;stroke:var(--blue)}.lat-node.control{fill:#faedce;stroke:#b88228}.lat-node.tuple{fill:#f4e2eb;stroke:#99617f}.lat-node.pointer{fill:#cce4d6;stroke:#267654}.lat-node.struct{fill:#e2edd7;stroke:#648539}.lat-node.memory{fill:#dbe8f4;stroke:#24648a}.lat-node.function{fill:#e9e1f2;stroke:#715694}.lat-node.global{fill:var(--ink);stroke:var(--ink)}.lat-node.global+text{fill:white}.lat-node.chosen{fill:#f9e3d6;stroke:var(--orange);stroke-width:3}.lat-elided{fill:var(--paper);stroke:var(--line);stroke-dasharray:4 4}.lat-solve{stroke:var(--orange);stroke-width:4;fill:none;stroke-dasharray:9 5}.lattice-svg .solve-label{font-size:22px;fill:var(--orange)}.lattice-layout figcaption{font-size:18px;line-height:1.35;color:var(--muted);margin:12px 0 0;text-align:center}.lattice-point{border-top:2px solid var(--line);padding:17px 0}.lattice-point h3{font-size:25px;line-height:1.15;margin-bottom:12px}.lattice-point p{font-size:22px;line-height:1.35}.lattice-point code{font:19px/1.5 Consolas,monospace}.lattice-legend{font-size:19px;color:var(--muted);margin-top:21px}
+#slide[data-id="control"] .svg-graph{height:190px}
+.demo-code.long pre{font-size:24px;line-height:1.4}
+.pending-link{display:inline-flex;align-items:center;font-size:18px;color:var(--muted);padding:12px 0}
+@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation:none!important;transition:none!important}.unrevealed{transform:none!important}}
+@media(max-width:650px){#controls{gap:3px}#controls button{padding:6px 8px}#presenter{display:none}.control-divider{margin:0 2px}.keys{grid-template-columns:95px 1fr}dialog{padding:24px}dialog .overview-grid{grid-template-columns:1fr}}
+@media print{body{background:white}#viewport{position:static;overflow:visible}.slide{position:relative;left:auto;top:auto;transform:none;width:100%;height:auto;min-height:95vh;box-shadow:none;break-after:page}.slide:not(.still) .slide-content{animation:none}#controls,#notes,#toast,dialog,#blackout{display:none!important}[data-reveal].unrevealed{opacity:1;transform:none}.state-card .state:last-child{display:block}.state-card .state:not(:last-child){display:none}@page{size:landscape;margin:10mm}}
+
+.result math{font-size:30px;math-style:normal;text-align:left;margin:0}
+#slide[data-id="control"] .result{padding:12px 22px;margin-top:14px}
+
+.memory-partition{margin:0 0 16px}.memory-partition svg{display:block;width:100%;height:auto}.memory-partition text{font:25px Consolas,monospace;fill:var(--ink)}.memory-partition .partition-title{font:bold 24px Arial,sans-serif}.memory-partition .partition-detail{font:17px Arial,sans-serif;fill:var(--muted)}.alias-x{fill:#d9e9dd}.alias-y{fill:#e8e0f1;transition:fill .25s}.alias-y.touched{fill:#f4cba9}.alias-rest{fill:#dfe8ef}.partition-outline{fill:none;stroke:#6b8285;stroke-width:2}.memory-partition figcaption{font-size:20px;line-height:1.35;color:var(--muted);text-align:center;margin-top:5px}
+
+.research-note{font-size:17px;line-height:1.4;margin-top:16px;padding-top:10px;border-top:1px solid var(--line);color:var(--muted)}
diff --git a/docs/2026_REBASE/slides.js b/docs/2026_REBASE/slides.js
new file mode 100644
index 00000000..fc54dc41
--- /dev/null
+++ b/docs/2026_REBASE/slides.js
@@ -0,0 +1,214 @@
+/* Content and speaker notes. Durations exclude the optional Chapter 25 slide. */
+(function () {
+ const R = window.REBASE;
+ const esc = s => String(s).replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;");
+ const external = (url, text, cls="") => '<a class="'+cls+'" href="'+esc(url)+'" target="_blank" rel="noopener noreferrer">'+text+'</a>';
+ const demo = id => R.demos.find(d => d.id === id);
+ function source(id, long=false) {
+ const d=demo(id);
+ return '<div class="demo-source"><div class="demo-code'+(long?' long':'')+'"><div class="code-head"><span>'+d.chapter+' / '+id+'.smp</span><button data-copy="'+id+'">Copy code</button></div><pre><code>'+esc(d.code)+'</code></pre></div><div class="demo-actions"><button class="primary" data-command="'+id+'">Copy viewer command</button>'+
+ (id==='sccp'?'':'<button data-graph="'+id+'">Final graph</button>')+
+ '<a href="demos/'+id+'.smp" download>Source ↗</a></div><code class="launch">make -C '+(d.viewerChapter||d.chapter)+' view</code></div>';
+ }
+ function result(id, label, formula) {
+ const d=demo(id);
+ return '<div class="result" data-reveal="2">'+(formula||'<strong>'+esc(d.result)+'</strong>')+'<small>'+esc(label||d.inputs)+'</small></div>';
+ }
+ function states(items) {
+ return '<div class="state-card">'+items.map((item,i)=>'<div class="state" data-state="'+i+'">'+item+'</div>').join('')+'</div>';
+ }
+ function backendCard(state, index, title, discussion, flow, kind, caption) {
+ const flipped=!!(state.backend & (1<<index));
+ const text=kind==='selected'?R.backend[kind].trimEnd():R.backend[kind].trim().split('\n')
+ .map(line=>line.trim().replace(/ {2,}/g,' ').replace(/-{4,}/g,'---')).join('\n');
+ const dump=text.split('\n').map(line=>{
+ const hot=/NegX86|MemAddX86|\bneg\b|\badd8\b/.test(line);
+ return hot?'<strong>'+esc(line)+'</strong>':esc(line);
+ }).join('\n');
+ return '<div class="pipeline-card backend-card'+(flipped?' flipped':'')+'" data-reveal="'+index+'">'+
+ '<button class="backend-flip" data-backend="'+index+'" aria-pressed="'+flipped+'" aria-label="Chapter '+(19+index)+': '+title+'; '+(flipped?'show discussion':'show compiler dump')+'"'+(state.step<index?' disabled':'')+'>'+
+ '<span class="backend-face">'+(flipped?
+ '<span class="dump-heading">'+(19+index)+' · '+caption+'</span><code class="backend-dump '+kind+'">'+dump+'</code>':
+ '<span class="number">'+(19+index)+'</span><span class="backend-title">'+title+'</span><span class="backend-discussion">'+discussion+'</span><code class="backend-flow">'+flow+'</code>')+'</span>'+
+ '<span class="flip-hint">'+(flipped?'Click to return to discussion':'Click to see '+caption.toLowerCase())+' ↻</span></button></div>';
+ }
+ function memoryPartition(state) {
+ const array=state.demo==='memory', x=array?'Totals.sum':'Pair.x', y=array?'Totals.visits':'Pair.y';
+ return '<figure class="memory-partition"><svg viewBox="0 0 600 160" role="img" aria-label="Whole memory partitioned into the disjoint equivalence classes '+x+', '+y+', and all the rest"><title>Equivalence classes partition whole memory</title>'+
+ '<text class="partition-title" x="300" y="25" text-anchor="middle">Whole memory</text>'+
+ '<rect class="alias-x" x="1" y="43" width="198" height="94"/>'+
+ '<rect class="alias-y'+(state.step===1?' touched':'')+'" x="200" y="43" width="198" height="94"/>'+
+ '<rect class="alias-rest" x="399" y="43" width="200" height="94"/>'+
+ '<rect class="partition-outline" x="1" y="43" width="598" height="94"/>'+
+ '<text x="100" y="85" text-anchor="middle">'+x+'</text><text class="partition-detail" x="100" y="113" text-anchor="middle">all instances</text>'+
+ '<text x="300" y="85" text-anchor="middle">'+y+'</text><text class="partition-detail" x="300" y="113" text-anchor="middle">all instances</text>'+
+ '<text x="500" y="85" text-anchor="middle">all the rest</text><text class="partition-detail" x="500" y="113" text-anchor="middle">'+(array?'including data[]':'other locations')+'</text></svg>'+
+ '<figcaption>Disjoint classes; together, all memory.<br>Same class <em>may</em> alias. Different classes cannot.</figcaption></figure>';
+ }
+ function graph(kind) {
+ const start='<svg class="svg-graph" viewBox="0 0 530 235" role="img" aria-label="'+(kind==='phi'?'Values feed a Phi associated with a Region':kind==='loop'?'Loop counter: Phi_i starts at zero and receives Add(Phi_i, 1) on the backedge':'Data dependencies in an arithmetic expression')+'"><defs><marker id="arrow" markerWidth="7" markerHeight="7" refX="6" refY="3" orient="auto"><path d="M0 0 L6 3 L0 6" fill="none" stroke="#587075"/></marker></defs>';
+ if(kind==='loop') return start+
+ '<path class="edge" marker-end="url(#arrow)" d="M210 105 H155"/><path class="edge" marker-end="url(#arrow)" d="M295 82 V48"/>'+
+ '<path class="edge" marker-end="url(#arrow)" d="M335 128 V174"/><path class="edge" marker-end="url(#arrow)" d="M265 174 V128"/><path class="edge" marker-end="url(#arrow)" d="M370 198 H435"/>'+
+ '<rect class="node ctrl" x="25" y="82" width="130" height="46" rx="7"/><text x="90" y="111" text-anchor="middle">Loop</text>'+
+ '<rect class="node phi" x="210" y="82" width="170" height="46" rx="7"/><text x="295" y="111" text-anchor="middle">Phi_i</text>'+
+ '<rect class="node" x="260" y="2" width="70" height="46" rx="7"/><text x="295" y="31" text-anchor="middle">0</text>'+
+ '<rect class="node" x="230" y="174" width="140" height="48" rx="7"/><text x="300" y="205" text-anchor="middle">Add</text>'+
+ '<rect class="node" x="435" y="174" width="70" height="48" rx="7"/><text x="470" y="205" text-anchor="middle">1</text></svg>';
+ if(kind==='phi') return start+
+ '<path class="edge" marker-end="url(#arrow)" d="M295 163 V91 H175 V69"/><path class="edge" marker-end="url(#arrow)" d="M305 163 V110 H425 V69"/><path class="edge" marker-end="url(#arrow)" d="M220 190 H181"/>'+
+ '<rect class="node" x="110" y="22" width="130" height="46" rx="7"/><text x="175" y="51" text-anchor="middle">n</text>'+
+ '<rect class="node" x="360" y="22" width="130" height="46" rx="7"/><text x="425" y="51" text-anchor="middle">-n</text>'+
+ '<rect class="node ctrl" x="30" y="164" width="150" height="52" rx="7"/><text x="105" y="197" text-anchor="middle">Region</text>'+
+ '<rect class="node phi" x="220" y="164" width="160" height="52" rx="7"/><text x="300" y="197" text-anchor="middle">Phi_n</text></svg>';
+ return start+
+ '<path class="edge" marker-end="url(#arrow)" d="M145 105 V68"/><path class="edge" marker-end="url(#arrow)" d="M205 105 V86 H270 V68"/><path class="edge" marker-end="url(#arrow)" d="M265 188 V167 H175 V150"/><path class="edge" marker-end="url(#arrow)" d="M325 188 V130 H410 V68"/>'+
+ '<rect class="node" x="90" y="23" width="110" height="44" rx="7"/><text x="145" y="52" text-anchor="middle">arg</text>'+
+ '<rect class="node" x="230" y="23" width="80" height="44" rx="7"/><text x="270" y="52" text-anchor="middle">2</text>'+
+ '<rect class="node" x="370" y="23" width="80" height="44" rx="7"/><text x="410" y="52" text-anchor="middle">6</text>'+
+ '<rect class="node" x="115" y="105" width="120" height="44" rx="7"/><text x="175" y="134" text-anchor="middle">Mul</text>'+
+ '<rect class="node" x="235" y="188" width="120" height="44" rx="7"/><text x="295" y="217" text-anchor="middle">Add</text></svg><p class="graph-caption">Arrows point from uses to definitions.</p>';
+ }
+ const links=()=>'<div class="link-row">'+external(R.youtube,'YouTube · @compilers')+
+ '<span class="pending-link">send an email for a discord invite</span>'+
+ external(R.repo,'Simple on GitHub')+'</div>';
+ const notes = (lead, beats, extra="") => '<h3>'+lead+'</h3><ol>'+beats.map(b=>'<li>'+b+'</li>').join('')+'</ol>'+extra;
+ R.slides=[
+ {
+ id:'title',label:'A Simple Tutorial',section:'REBASE 2026',minutes:1,steps:0,still:true,
+ body:()=>'<div class="title-layout"><div class="title-copy"><div class="title-line"></div><h1>A <span class="accent">Simple</span><br>Tutorial.</h1><p class="subtitle">An open-source, all-Java compiler<br>modeled after Java’s C2.</p><div class="speaker"><strong>Cliff Click</strong><span>Sea of Nodes · from source to machine code</span></div></div><div><img class="portrait" src="assets/cliff-click-2020.jpeg" alt="Cliff Click seated on outdoor stone steps"><p class="photo-caption">REBASE / SPLASH · 2026</p></div></div>'+external(R.repo,'github.com/SeaOfNodes/Simple','title-repo'),
+ notes:notes('An executable compiler tutorial',[
+ 'Assume SSA and compiler background. Simple is a small language used to explain a real optimizing compiler architecture.',
+ 'The compiler is written in Java, modeled on C2, and open source. The teaching unit is a complete compiler snapshot, with runnable tests and an explanation.',
+ 'Today: four live graphs, then the path to machine code. Keep the title still; advance when ready.'
+ ])
+ },
+ {
+ id:'bio',label:'Who am I?',section:'Cliff Click',minutes:1,steps:0,
+ body:()=>'<h2>Who am I?</h2><div class="bio-grid"><div><p class="accent">Cliff Click</p><ul class="bio-list"><li>HotSpot’s original C2 compiler<small>Sea of Nodes, optimization, and the JVM</small></li><li>Azul, H2O, and half a dozen other startups<small>JVMs, low-pause GC, and distributed computing</small></li><li>Coffee Compiler Club<small>Founder and host · language implementation discussions</small></li></ul>'+links()+'</div><div><img class="club-image" src="assets/coffee-compiler-club-still.gif" alt="Coffee Compiler Club logo"><p class="club-caption">People who enjoy talking about compilers.</p></div></div>',
+ notes:notes('Keep the biography to a minute',[
+ 'Select two relevant facts: original C2 and Sea of Nodes; subsequent JVM and runtime work at Azul.',
+ 'Coffee Compiler Club is the community connection. Point to the YouTube channel and invite people to email for a Discord invite.',
+ 'Transition: rather than describe the entire compiler, watch four graph transformations.'
+ ],'<p class="muted">Short bio adapted from the supplied 2024 biography.</p>')
+ },
+ {
+ id:'arithmetic',label:'1–4 · Parsing and peepholes',section:'Chapters 1–4',minutes:5,steps:2,demo:'arithmetic',
+ body:()=>'<h2>Parse straight into<br>an optimized graph.</h2><div class="demo-layout"><div>'+source('arithmetic')+'</div><div class="demo-right"><p class="thesis">SSA construction and local rewriting happen together.</p>'+graph('arithmetic')+'<div class="fact" data-reveal="1"><b>Watch</b><span>Identity removal → reassociation → constant folding.</span></div>'+result('arithmetic','Expected optimized expression; inspect the actual graph in the viewer.')+'</div></div>',
+ notes:notes('Live demo 1 · leave at 07:00',[
+ '<b>0:00–0:45:</b> Show the Lattice tab briefly, then return to Example and predict the source result. No separate AST is needed for this construction. The chapter boundary is intentionally tiny.',
+ '<b>0:45–1:15:</b> Copy code. In a terminal at the repository root run <code>make -C chapter04 view</code>. Paste into the viewer and Compile.',
+ '<b>1:15–4:15:</b> Use Next/Right to observe a few enclosing peepholes: arg+0 disappears, constants reassociate, and repeated arg becomes multiplication. Point to types on nodes and uses pointing to definitions.',
+ '<b>4:15–5:00:</b> Jump Last; the result is 2*arg+6. Return to slides. Before launching the next chapter, stop this viewer with Ctrl+C in its terminal.'
+ ],'<p>Fallback: “Final graph” is a captured compiler graph. Advance builds to reveal the conclusion. No need to step through all 51 captured frames.</p>')
+ },
+ {
+ id:'control',label:'5–8 · Control and loops',section:'Chapters 5–8',minutes:5,steps:2,demo:'control',
+ body:state=>'<h2>Control flow is<br>part of the graph.</h2><div class="demo-layout"><div>'+source('control',true)+'</div><div class="demo-right"><p class="thesis">'+(state.step===0?'Regions merge control.<br>Phis select the corresponding values.':'Loop is a Region.<br>Phi_i merges entry and backedge.')+'</p>'+graph(state.step===0?'phi':'loop')+'<div class="fact" data-reveal="1"><b>Loops</b><span>A backedge supplies another Phi input. Construction can be incomplete.</span></div>'+result('control',null,'<math display="block" aria-label="sum equals the sum of i from 1 through the absolute value of arg"><mrow><mi>sum</mi><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mrow><mo>|</mo><mi>arg</mi><mo>|</mo></mrow></munderover><mi>i</mi></mrow></math>')+'</div></div>',
+ notes:notes('Live demo 2 · leave at 12:00',[
+ '<b>0:00–0:45:</b> Briefly show the Lattice tab: control now has live/dead types. Return to Example. A branch chooses abs(arg); the loop accumulates integers from 1 through abs(arg). Build 1 shows the absolute-value Phi; highlight the corresponding branch in the source. Build 2 switches to Loop, Phi_i, and Add(i,1). Build 3 keeps that graph and reveals the sigma sum. The counter sketch omits the Loop control predecessors.',
+ '<b>0:45–1:15:</b> Stop the prior viewer. Run <code>make -C chapter08 view</code>; paste this example and Compile.',
+ '<b>1:15–4:15:</b> Find the initial Region/Phi, then the Loop and its backedge. Show the loop-carried i and sum values. Explain lazy Phi creation and how the backedge supplies the next iteration. Fold/unfold the loop for context.',
+ '<b>4:15–5:00:</b> Jump Last and trace the exit value. For arg=5 the result is 1+2+3+4+5=15. The viewer shows compilation, not the iterations of runtime execution.'
+ ],'<p>Chapters 5/6 introduce branches and dead control; 7/8 introduce loops and lazy Phis. Avoid walking every frame.</p>')
+ },
+ {
+ id:'memory',label:'9–17b · Values, memory, scheduling',section:'Chapters 9–17b',minutes:5,steps:2,demo:'aliases',
+ body:state=>'<h2>Memory is dataflow, too.</h2><div class="demo-layout"><div>'+source(state.demo||'aliases',true)+'<div class="demo-tabs"><button data-demo="aliases">Short alias example</button><button data-demo="memory">Array + object loops</button></div></div><div class="demo-right"><p class="thesis">Partition memory into<br>equivalence classes.</p>'+memoryPartition(state)+states(state.demo==='memory'?[
+ '<div class="formula">data[i]<small>Array element memory is another slice.</small></div>',
+ '<div class="formula">t.sum / t.visits<small>Separate field classes carry separate dependencies.</small></div>',
+ '<div class="formula">4*arg + 10<small>Runtime result; the graph still contains loops.</small></div>'
+ ]:[
+ '<div class="formula">p.x → Pair.x<small>All Pair.x fields share one equivalence class.</small></div>',
+ '<div class="formula">p.y = 99 → Pair.y<small>Only this slice changes; Pair.x is untouched.</small></div>',
+ '<div class="formula">p.x − before → 0<small>The short example isolates this fold.</small></div>'
+ ])+'<p class="watch">'+(state.demo==='memory'?'<strong>Inspect:</strong> two loops, array Loads/Stores, and blue memory edges.<br><strong>Runtime result:</strong> 4*arg+10.':'<strong>Inspect:</strong> writing p.y leaves p.x unchanged.<br><strong>Result:</strong> 0.')+'</p><p class="research-note">Simple type-based aliasing approached the RLE limit.<br>'+external('https://people.cs.umass.edu/~moss/papers/pldi-1998-tbaa.pdf#page=8','Diwan et al., PLDI \u201998 · 8 Modula-3 programs')+'</p></div></div>',
+ notes:notes('Live demo 3 · leave at 17:00',[
+ '<b>0:00–0:45:</b> Briefly show Domains and Memory types, then return to Examples. Use the partition picture: Pair.x, Pair.y, and the rest are disjoint equivalence classes whose union is whole memory. The classes group locations across all instances, not one class per object.',
+ '<b>0:45–1:15:</b> Run <code>make -C chapter17b view</code>. Paste Short alias example. Show that p.y changes while p.x does not, and the result becomes zero.',
+ '<b>1:15–3:15:</b> Trace the Loads and Store through their field equivalence classes. Same-class accesses may alias; different classes cannot. MemMerge recombines the slices without emitting an instruction. Explain why writing p.y does not clobber p.x. Read-only access would not make a Load independent of memory.',
+ '<b>3:15–4:30:</b> Switch back to this slide, select Array + object loops, Copy code, then compile it in the same viewer. Jump Last, fold/unfold the loops, and inspect loop-carried memory and the sum and visits aliases.',
+ '<b>4:30–5:00:</b> GCM uses these dependencies to choose legal placements; it does not guess ordering from source order. Return to slides.'
+ ],'<p>The graph viewer captures parsing/optimization/type checking, not GCM execution. The large graph has 54 nodes at its final checkpoint; do not step through all 319 frames.</p><p><b>Research context:</b> Diwan, McKinley, and Moss, <i>Type-Based Alias Analysis</i>, PLDI 1998, sections 3.5–3.6 (p. 113). A runtime upper bound left at most an average 2.5% more heap loads eliminable beyond their analysis on eight Modula-3 benchmarks. This is a load-elimination bound, not a speedup percentage. More static opportunities did not translate into corresponding runtime gains. This supports choosing useful, inexpensive alias distinctions; it does not establish that this exact equivalence-class scheme is optimal for Java. The study is a close match to the recalled oracle experiment, not an identified IBM/Java paper.</p>')
+ },
+ {
+ id:'inline',label:'18 · Functions and Calls',section:'Chapter 18',minutes:5,steps:2,demo:'inline',
+ body:state=>'<h2>Functions and Calls</h2><div class="demo-layout"><div>'+source('inline')+'</div><div class="demo-right"><p class="thesis">'+[
+ 'Declare and define functions.<br>Parse their bodies and calls.<br>Build the graph as we go.',
+ 'Trivial inlining:<br>erase the call boundary<br>with simple graph rewrites.',
+ 'Fun is a Region.<br>Parm is a Phi.<br>The familiar rules still apply.'
+ ][state.step]+ '</p>'+states([
+ '<div class="formula">twice(1 + add1(2)) + 3<small>Two functions. Two call sites.</small></div>',
+ '<div class="formula">(1 + (2 + 1)) * 2 + 3<small>Splice control, arguments, memory, and results.</small></div>',
+ '<div class="formula">return 11;<small>Ordinary constant folding finishes the job.</small></div>'
+ ])+(state.step===0?'<div class="fact"><b>Functions</b><span>Fun, Parm, Return</span></div><div class="fact"><b>Calls</b><span>Call, CallEnd</span></div>':'<div class="fact"><b>Proof</b><span>One target, one use of its function pointer, no self-recursive inline.</span></div>')+result('inline')+'</div></div>',
+ notes:notes('Live demo 4 · leave at 22:00',[
+ '<b>0:00–0:45:</b> Introduce function definitions and calls: parsing builds Fun, Parm, Return, Call, and CallEnd nodes. The whole top-level body is an implicit main. Each explicit function has a Fun, Parms, and one merged Return. Briefly show the Lattice tab and its singleton function targets, then return to Example. The second build shows trivial inlining by simple graph rewrites.',
+ '<b>0:45–1:15:</b> Stop the prior viewer. Run <code>make -C chapter18 view</code>; paste and Compile.',
+ '<b>1:15–4:15:</b> Find a Call/CallEnd and the function entry. Look for the FOLDING label while a single-use function is being inlined. Follow one parameter becoming the caller argument and the Return value taking the place of the call result. Gather → rewrite → release makes the local edit visible.',
+ '<b>4:15–5:00:</b> Jump Last. Both call boundaries are gone and the return value is 11. This example moves single-caller bodies; it does not demonstrate cloning for multi-callsite inlining.'
+ ],'<p>If tracing takes too long, show the captured final graph and use the three schematic builds on the slide.</p>')
+ },
+ {
+ id:'backend',label:'19–21 · From IR to instructions',section:'Chapters 19–21',minutes:2,steps:2,
+ body:state=>'<h2>Give the graph a machine.</h2><pre class="backend-source">'+esc(R.backend.source.trim().split('\n').map(line=>line.trim()).reduce((text,line,i)=>text+(i===0?'':i===2?'\n ':' ')+line,''))+'</pre><div class="pipeline backend-pipeline">'+
+ backendCard(state,0,'Select instructions','Match ideal nodes to machine operations. Carry operand and calling-convention constraints.','Ideal graph<br>↓<br>Machine graph','selected','Selected graph')+
+ backendCard(state,1,'Allocate registers','Build live ranges and interference. Coalesce, color, split, and spill.','Virtual values<br>↓<br>Registers + stack','assembly','Allocated assembly')+
+ backendCard(state,2,'Encode and execute','Lay out code, emit instruction bytes, resolve relocations, and build object files.','Scheduled instructions<br>↓<br>Executable code','encoded','Instruction bytes')+
+ '</div><div class="lower-line backend-provenance"><p class="muted">One program · x86-64 System V · Chapter 21 compiler</p><div class="chips"><span>x86-64</span><span>ARM64</span><span>RISC-V</span></div></div>',
+ notes:notes('Two minutes for the backend',[
+ '19: instruction selection happens before GCM. Target nodes still carry dependencies. Matching can absorb a Load into an arithmetic instruction.',
+ 'Click each revealed column to flip between discussion and its captured dump; click again to return. Flips persist across builds and synchronize with the presenter window. The returned function receives an existing writable Box, so there is no allocation or calloc lead-in. It adds abs(arg) into box.x and returns that same value.',
+ 'All three captures use the Chapter 21 compiler at the corresponding phase: Chapters 19 and 20 do not yet select unary Minus. The selected table includes every node and input slot, with concrete Java class names instead of shortened op labels; types and redundant use lists are omitted. Follow NegX86 #20, Phi #19, and MemAddX86 #16. Load + Add + Store become one read-modify-write instruction.',
+ '20: global graph coloring, with register masks and calling conventions. Legality first; spill quality is a separate question. ARM joins the existing x86/RISC-V ports here.',
+ 'The middle capture is CodeGen.asm() immediately after register allocation: arg is rsi, box is rdi, and the result is rax. Labels show ordered blocks; the Phi coalesces into rax. Offsets and the ?? jump are provisional here, and the return still displays callee-save bookkeeping.',
+ '21: actual instruction encodings and object output. Distinguish native execution from ARM/RISC-V test evaluators; the encoders are shared, but selection and allocation remain in chapter snapshots.',
+ 'The final CodeGen.asm() capture follows encode(): 48f7d8 is neg rax; 480107 is add qword [rdi], rax. Layout reverses the branch to j>= and removes the extra jump. Hex is shown in memory byte order. The printer labels the compare-with-zero as test; 4883f800 actually encodes cmp rax, 0. Only whitespace and long divider rules are compacted in these assembly displays; raw dumps and a regeneration tool are included in the deck.'
+ ],'<p>Target time: 24:00. This is a progression, not a claim that the three phases exhaust the backend pipeline.</p>')
+ },
+ {
+ id:'language',label:'22–23 · I/O, methods, types',section:'Chapters 22–23',minutes:2,steps:1,
+ body:state=>R.languageBody(state),
+ notes:notes('Language features stress the representation',[
+ '22: printing is a real chain of function and field accesses, ending at a C ABI boundary. Show how much existing infrastructure participates in one line of code.',
+ 'Click the Chapter 22 column to browse the bundled Chapter 25 standard library. Start in sys; Up reaches the root and sys.smp. Open adt for bitset.smp, or io.smp, aryu8.smp, and libc.smp to connect the library to language features. Breadcrumbs and Up navigate folders or leave a file; Discussion restores the original column. Full width gives long files more room. File contents scroll and can be copied. This is a snapshot of the latest chapter, including features beyond Chapter 22.',
+ '23: methods add a self parameter. A struct contains a function whose signature mentions the struct; types themselves become cyclic.',
+ 'Click the Chapter 23 column for a complete Counter class and calls, validated with the Chapter 23 compiler and evaluator. n is an instance field; new initializes it to arg. add mutates n and returns self, so calls can chain; get reads n. The result is arg + 7. Discussion restores the conceptual explanation.',
+ 'The interesting point for this audience is preserving canonical type identity and lattice operations while the representation becomes recursive.'
+ ],'<p>Target time: 26:00. No extra live demo is budgeted.</p>')
+ },
+ {
+ id:'sccp',label:'24 · Sparse Conditional Constant Propagation',section:'Chapter 24',minutes:2,steps:2,demo:'sccp',
+ body:()=>'<h2 class="sccp-title">Sparse Conditional Constant Propagation</h2><div class="demo-layout"><div>'+source('sccp')+'<p class="watch">This one stays on the slide. The loop’s return value is always 1.</p></div><div><p class="thesis">The lattice and transfer functions are already there.</p>'+states([
+ '<div class="formula">Phi(1, ⊥) = ⊥<small>Pessimistic propagation gets stuck.</small></div>',
+ '<div class="formula">Phi(1, ⊤) = 1<small>Start at the top; propagate reachable information.</small></div>',
+ '<div class="formula">2 − 1 = 1<small>The backedge confirms the invariant.</small></div>'
+ ])+'<table class="sccp-table"><thead><tr><th>Value</th><th>Initial</th><th>Fixed point</th></tr></thead><tbody><tr><td>Loop Phi</td><td>⊤</td><td data-reveal="1">1</td></tr><tr><td>2 − Phi</td><td>⊤</td><td data-reveal="2">1</td></tr></tbody></table><p class="sccp-warning" data-reveal="2">After SCCP, the program is fully typed.<br><strong>SCCP is the type analysis pass.</strong></p></div></div>',
+ notes:notes('Optimism earns its keep',[
+ 'Use the source as a concrete loop, but the equations are SSA pseudocode. The pessimistic fixed point cannot discover x=1 through the cycle.',
+ 'For this talk, Copy viewer command launches make -C chapter25 view. Chapter 25 demonstrates the same SCCP example using its separately compiled standard library, avoiding Chapter 24’s thousands of library capture frames. The slide topic and lattice remain Chapter 24.',
+ 'Use Rich lattice for the big picture, then return to Example. The entry value sharpens the Phi to 1; the backedge evaluates to 1 and confirms it. Explain the direction of monotonicity, not just “assume it works.”',
+ 'Control propagation makes the solve conditional. Chapter 24 also discovers interprocedural call-graph edges; Chapter 18’s local linking was only the beginning.'
+ ],'<p>Target time: 28:00. Continue to the closing slide, or use Overview → Chapter 25 if two minutes remain and replace the closing discussion.</p>')
+ },
+ {
+ id:'modules',label:'25 · Optional: separate compilation',section:'Chapter 25 · optional',minutes:0,steps:1,optional:true,
+ body:()=>'<h2>What survives<br>separate compilation?</h2><div class="module-diagram"><div>Library source<br><strong>Types + ideal IR</strong></div><b>→</b><div>Object file<br><strong>Native code + .simple</strong></div><b>→</b><div>Client compilation<br><strong>Import + optimize</strong></div></div><p class="statement">Imported functions can participate in optimization.</p><div class="two-up" data-reveal="1"><div class="panel" style="min-height:180px"><h3>Identity crosses a boundary.</h3><p style="margin-top:15px">Types, aliases, and function indices must be reconciled between units.</p></div><div class="panel" style="min-height:180px"><h3>Information arrives late.</h3><p style="margin-top:15px">SSA construction, forward types, and constructor memory need stronger contracts.</p></div></div>',
+ notes:notes('Optional · spend at most two minutes',[
+ 'This is outside the default 30-minute path. Use it instead of the final two-minute discussion, not in addition.',
+ 'The object contains both native code and a .simple section with types and ideal IR. Imported IR can be optimized and inlined in the client.',
+ 'The compiler must reconcile global identities and incomplete information. This is why Chapter 25 is more than an object writer. Do not attempt its whole architecture here.'
+ ])
+ },
+ {
+ id:'close',label:'Takeaways and discussion',section:'A Simple Tutorial',minutes:2,steps:0,
+ body:()=>'<h2>One graph.<br>Many compiler lessons.</h2><div class="takeaway-grid"><div><h3>Build</h3><p>Construct SSA directly.<br>Make dependencies explicit.</p></div><div><h3>Rewrite</h3><p>Use types and local rules.<br>Iterate to a fixed point.</p></div><div><h3>Lower</h3><p>Keep the graph useful<br>all the way to code.</p></div></div><p class="repo-link">'+external(R.repo,'github.com/SeaOfNodes/Simple')+'</p><p class="statement">Read a chapter. Run it. Watch what changes.</p>'+links()+'<button class="optional-link" data-goto="modules">If there’s time: Chapter 25 →</button>',
+ notes:notes('Leave room for the room',[
+ 'Each chapter is a runnable compiler snapshot, not a diff that needs the final compiler to make sense.',
+ 'Invite questions about where the unified graph helps and where it imposes costs. There is no need to sell a universal IR winner.',
+ 'Point people to the repository, chapter READMEs, and Coffee Compiler Club. Stop at 30:00.'
+ ])
+ }
+ ];
+ R.escape=esc;
+})();
diff --git a/docs/2026_REBASE/stdlib.js b/docs/2026_REBASE/stdlib.js
new file mode 100644
index 00000000..22c92fe4
--- /dev/null
+++ b/docs/2026_REBASE/stdlib.js
@@ -0,0 +1,17 @@
+/* Generated by tools/snapshot-library.py; local source snapshot. */
+window.REBASE.library = {
+ "origin": "chapter25/src/main/smp",
+ "files": {
+ "sys.smp": "\n// top-level default standard library import\n\nval adt = adt; // Abstract Data Types\nval ary = ary; // Array utilities\nval aryi64 = aryi64; // Variable sized array of i64\nval aryu8 = aryu8; // Variable sized array of u8\nval char = char; // Character utilities\nval io = io; // IO library\nval libc = libc; // libc FFI bindings\nval scan = scan; // A simple string parser\n",
+ "sys/adt/bitset.smp": "\n// A set of non-negative integers, represented one bit per value.\nstruct bitset {\n i64[] !_bits;\n\n new bitset = { ->\n _bits = new i64[1];\n };\n\n // Return 0 for missing, non-zero for true\n val get = { int bit ->\n if( (bit >> 6) >= _bits# ) return false;\n i64 mask = 1 << (bit & 63);\n return (_bits[bit >> 6] & mask);\n };\n\n val _grow = { int bit ->\n int x = bit >> 6;\n int len = _bits#;\n if( x < len ) return self;\n while( x >= len ) len *= 2;\n var bits = new i64[len];\n for( int i=0; i<_bits#; i++ )\n bits[i] = _bits[i];\n _bits = bits;\n return self;\n };\n\n // Set\n val set = { int bit ->\n i64 mask = 1 << (bit & 63);\n _grow(bit)._bits[bit >> 6] |= mask;\n return self;\n };\n\n // Test and set\n val tset = { int bit ->\n int idx = bit >> 6;\n i64 mask = 1 << (bit & 63);\n if( _grow(bit)._bits[idx] & mask )\n return true; // Already set\n _bits[idx] |= mask;\n return false; // Was false (and now set)\n };\n\n val clr = { int bit ->\n if( (bit >> 6) >= _bits# ) return self;\n i64 mask = 1 << (bit & 63);\n _bits[bit >> 6] &= (mask ^ -1);\n return self;\n };\n\n val clear = { ->\n for( int i=0; i<_bits#; i++ ) _bits[i] = 0;\n return self;\n };\n};\n",
+ "sys/adt.smp": "\n// Abstract data types.\nval bitset = bitset;\n",
+ "sys/ary.smp": "\n// Array utilities\n\n// Copy byte array contents. Copies the shorter of the buffers and len\nval copy = { u8[] dst, int doff, u8[~] src, int soff, int len ->\n if( len > dst# - doff ) len = dst# - doff;\n if( len > src# - soff ) len = src# - soff;\n for( int i=0; i<len; i++ )\n dst[i+doff] = src[i+soff];\n return dst;\n};\n\n// Compare lexigraphically array contents. Compares up to shorter array or\n// len. Returns <0 or >0 for first non-matching byte. Returns <0 or >0 for\n// the larger array after that, or 0 if both arrays are fully equal.\nval cmp = { u8[~] src1, u32 off1, u8[~] src2, u32 off2, u32 len ->\n u32 len1 = len > src1# - off1 ? src1# - off1 : len;\n u32 len2 = len > src2# - off2 ? src2# - off2 : len;\n u32 max = len1 > len2 ? len2 : len1;\n for( int i=0; i<max; i++ )\n if( src1[off1+i] != src2[off2+i] )\n return src1[off1+i] - src2[off2+i]; // Bytes determine compare\n return len1 - len2; // Length determines compare\n};\n",
+ "sys/aryi64.smp": "\n// Ary/Vector of i64s\nstruct aryi64 {\n u32 !len = 0;\n i64[] !buf;\n\n new aryi64 = { i64[] b ->\n buf = b;\n };\n\n // Grow as needed\n val _grow = { int len2 ->\n if( len+len2 < buf# ) return self;\n int newlen = buf# * 2;\n while( len+len2 >= newlen ) newlen *= 2;\n i64[] !buf2 = new i64[newlen];\n for( int i=0; i<buf#; i++ )\n buf2[i] = buf[i];\n buf = buf2;\n self;\n };\n\n // Add a i64 to aryu8\n val add = { i64 c ->\n _grow(1).buf[len++] = c;\n self;\n };\n\n val get = { int index -> return buf[index]; };\n\n // Write the bracketed array-list form to aryu8.\n val str = { ->\n // TODO: clunky default constructor syntax\n var str = new aryu8().add('[');\n for( int i=0; i<len; i++ )\n str.num(buf[i]).add(',').add(' ');\n if( len ) str.undo(2);\n return str.add(']');\n };\n\n val swap = { int i, int j ->\n i64 tmp = buf[i];\n buf[i] = buf[j];\n buf[j] = tmp;\n self;\n };\n};\n\n\n\n// Parse a comma-separated list of numbers, wrapped with square brackets,\n// with optional whitespace e.g. \"[ -17, 0,99,12456789 ] \".\n// parseAryI64 & aryi64.str are bijections modulo whitespace.\n// Returns null if the parse failed, without giving a clue as to why.\nval parseAryI64 = { u8[~] str ->\n !scan !s = new scan(str);\n if( !s.match('[') ) return null;\n // Array of parsed results\n var nums = new aryi64(new i64[1]);\n\n // Parse a list of numbers\n if( s.match(']') ) // Handle the empty list\n return nums;\n\n // Parse number commas \"123, \" until something else\n while( s.x < s.buf# ) {\n nums.add(s.number());\n if( s.bad ) return null;\n if( !s.match(',') )\n break;\n };\n // Close the list\n if( !s.match(']') ) return null;\n s.skip();\n return s.x == s.buf# ? nums : null;\n};\n\nval copy = { i64[] dst, int doff, i64[~] src, int soff, int len ->\n for( int i=0; i<len; i++ )\n dst[i+doff] = src[i+soff];\n return dst;\n};\n",
+ "sys/aryu8.smp": "\n// Ary/Vector of u8s - a resizable array of bytes.\nstruct aryu8 {\n u32 !len = 0;\n u8[] !buf;\n\n new aryu8 = { -> buf = new u8[1]; };\n\n // Grow as needed\n val _grow = { int len2 ->\n if( len+len2 < buf# ) return self;\n int newlen = buf# * 2;\n while( len+len2 >= newlen ) newlen *= 2;\n u8[] !buf2 = new u8[newlen];\n ary.copy(buf2,0,buf,0,buf#);\n buf = buf2;\n self;\n };\n\n val clear = { -> len = 0; self; };\n\n // Add a character to aryu8\n val add = { u8 c ->\n _grow(1).buf[len++] = c;\n self;\n };\n\n // Add all of a plain array to the aryu8\n val addAry = { u8[~] xs ->\n _grow(xs#);\n ary.copy(buf,len,xs,0,xs#);\n len += xs#;\n self;\n };\n\n // Remove x bytes from the tail.\n val undo = { int x ->\n len = len >= x ? len-x : 0;\n self;\n };\n\n // Print ASCII number into aryu8\n val num = { i64 x ->\n if( !x ) { add('0'); return self; }\n if( x < 0 ) { add('-'); x = -x; }\n i64 ten = 1, log = 0;\n while( ten <= x ) { ten *= 10; log++; }\n for( int i=0; i<log; i++ ) {\n ten /= 10;\n i64 q = x/ten;\n u8 digit = q+'0';\n add(digit);\n x -= q*ten;\n }\n self;\n };\n\n // Write to fd, returns the number of bytes written (len).\n val write = { i32 fd ->\n i64 ptr = buf; // Cast buffer pointer to i64 for native C call\n libc.write(fd,ptr,len);\n };\n};\n\n\n// Parse one integer, ignore trailing data; returns 0 with an empty string.\n// If you want a more robust parsing, use the `scan` class\nval atoi = { u8[~] str ->\n int x = 0;\n while( x < str# && str[x] <= ' ' ) x++;\n if( x == str# ) return 0;\n bool neg = false;\n if( str[x]=='-' ) { neg=true; x++; }\n i64 n = 0;\n while( x < str# && '0' <= str[x] <= '9' )\n n = n*10 + str[x++]-'0';\n return neg ? -n : n;\n};\n\n// Zero-terminate string for libc strings. No error checking, just copies and\n// appends a zero.\n{ u8[~] -> u8[] } str0 = { u8[~] str ->\n u8[] !strz = new u8[str#+1];\n ary.copy(strz,0,str,0,str#);\n strz[str#] = '\\0';\n strz;\n};\n",
+ "sys/char.smp": "\nval toupper = { u8 c ->\n return c >= 'a' && c <= 'z' ? c - ('a' - 'A') : c;\n};\n\nval tolower = { u8 c ->\n return c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c;\n};\n",
+ "sys/io.smp": "\n// Simple I/O Library\n\n// Write byte array to stdout\nval p = { u8[~] str -> write(1,str); };\nval p_noInline = { u8[~] str -> write(1,str); };\n\n// Return fd contents as a u8[].\nval read = { i32 fd ->\n var buf = new u8[8*1024];\n i64 ptr = buf;\n int len = 0;\n while( true ) {\n i32 rez = libc.read(fd,ptr,buf#);\n if( rez > buf# ) libc._exit(libc.errno());\n len += rez;\n if( rez < buf# )\n break;\n libc._exit(-2); // Need to implement for more than 8K input\n }\n var out = new u8[len];\n ary.copy(out,0,buf,0,len);\n};\n\n// Write all of str to fd.\nval write = { i32 fd, u8[~] str ->\n i64 ptr = str; // Convert array pointer to a i64 for the native call\n libc.write(fd,ptr,str#);\n};\n\n// Write all of str to fd.\nval writeOff = { i32 fd, u8[~] str, u32 off, u32 len ->\n i64 ptr = str; // Convert array pointer to a i64 for the native call\n ptr += off; // Skip offset\n // Cap at available length\n if( len > str# - off ) len = str# - off;\n // Do the write\n libc.write(fd,ptr,len);\n};\n\n// Return stdin as a u8[].\nval stdin = { -> read(0); };\n\n// Create file for writing. Return fd, or -1 and errno has the error code\nval create = { u8[~] str ->\n i64 ptr = sys.aryu8.str0(str);\n i32 perms = 6*64 + 6*8 + 6; // 0666\n return libc.creat(ptr, perms);\n};\n\n// Open file for reading. Return fd, or -1 and errno has the error code\nval open = { u8[~] str ->\n i64 ptr = sys.aryu8.str0(str);\n return libc.open(ptr, sys.libc.O_RDONLY, 0);\n};\n\n// Close an open fd. Return 0, or -1 and errno has the error code\nval close = { i32 fd -> return libc.close(fd); };\n\n// Remove a file. Return 0, or -1 and errno has the error code\nval remove = { u8[~] str ->\n i64 ptr = sys.aryu8.str0(str);\n return libc.unlink(ptr);\n};\n",
+ "sys/libc.smp": "\n// libc bindings:\n// https://www.man7.org/linux/man-pages/man2/<libc call>.2.html\n\n// The buffers are int-versions of zero-terminated strings.\n// int buf = aryu8.str0(\"some_file\");\n// buf mode perm-> fd\n{ i64 i32 i32 -> i32 } open = \"C\";\n// buf perm -> fd\n{ i64 i32 -> i32 } creat = \"C\";\n\n// fd buf len -> len\n{ i32 i64 u32 -> i32 } write = \"C\";\n// fd buf len -> len\n{ i32 i64 u32 -> i32 } read = \"C\";\n// fd -> err\n{ i32 -> i32 } close = \"C\";\n// path -> err\n{ i64 -> i32 } unlink = \"C\";\n\ni32 O_RDONLY = 0;\ni32 O_WRONLY = 1;\ni32 O_RDWR = 2;\ni32 O_CREAT = 512; // 02000 on x86_64-pc-cygwin\ni32 O_TRUNC = 1024; // 04000 on x86_64-pc-cygwin\n\ni32 STDIN = 0;\ni32 STDOUT = 1;\ni32 STDERR = 2;\n\n// status\n{ i32 -> i32 } _exit = \"C\";\n// errno is not an ordinary C data symbol; read it through the native runtime.\n{ i32 } simple_errno = \"C\";\nval errno = { -> simple_errno(); };\n// addr len prot flags fd off -> void*\n{ i64 i64 i32 i32 i32 i32 -> i64 } mmap = \"C\";\n// mmap flags\ni32 PROT_EXEC = 4;\ni32 PROT_READ = 1;\ni32 PROT_WRITE= 2;\ni32 PROT_NONE = 0;\ni32 MAP_PRIVATE = 2;\ni32 MAP_ANON = 32;\n",
+ "sys/scan.smp": "\n// Scanner; a simple string parser.\nstruct scan {\n int !x; // Cursor\n bool !bad; // True after a malformed token\n u8[~] buf; // Buffer to parse\n\n new scan = { u8[~] b -> buf = b; };\n\n // Skip whitespace\n val skip = { ->\n while( x < buf# && buf[x] <= ' ' )\n x++;\n return self;\n };\n\n // True if find required character, and skip it; else False.\n val match = { u8 c ->\n skip();\n if( x >= buf# ) return false;\n if( buf[x] != c ) return false;\n x++;\n return true;\n };\n\n // Parse a simple number\n val number = { ->\n skip();\n bool neg = match('-');\n if( x >= buf# || buf[x] < '0' || '9' < buf[x] ) {\n bad = true;\n return 0;\n }\n i64 n = 0;\n while( x < buf# && '0' <= buf[x] & buf[x] <= '9' )\n n = n*10 + (buf[x++] - '0');\n return neg ? -n : n;\n };\n};\n"
+ },
+ "methods": "struct Counter {\n int n;\n val add = { int delta ->\n n += delta;\n return self;\n };\n val get = { -> return n; };\n};\n!Counter c = new Counter { n = arg; };\nc.add(3).add(4);\nreturn c.get();\n"
+};
diff --git a/docs/2026_REBASE/tools/BackendDump.java b/docs/2026_REBASE/tools/BackendDump.java
new file mode 100644
index 00000000..faac89a4
--- /dev/null
+++ b/docs/2026_REBASE/tools/BackendDump.java
@@ -0,0 +1,45 @@
+import com.seaofnodes.simple.codegen.CodeGen;
+import com.seaofnodes.simple.node.*;
+import java.nio.file.*;
+import java.util.regex.Pattern;
+
+/** Run from the repo root with Chapter 21's built classes on the classpath. */
+public class BackendDump {
+ static String js(String s) {
+ return "\""+s.replace("\\","\\\\").replace("\"","\\\"")
+ .replace("\r", "").replace("\n","\\n")+"\"";
+ }
+ public static void main(String[] args) throws Exception {
+ Path deck=Path.of("docs/2026_REBASE");
+ String source=Files.readString(deck.resolve("demos/backend.smp"));
+ CodeGen code=new CodeGen(source).parse().opto().typeCheck().loopTree()
+ .instSelect("x86_64_v2","SystemV");
+ String selected=code.toString();
+ // Every row from the whole graph, in printer order. Show concrete Java
+ // classes and every input slot; omit types and redundant use lists.
+ StringBuilder compact=new StringBuilder("id node inputs\n");
+ var rows=Pattern.compile("(?m)^\\s*(\\d+) ").matcher(selected);
+ int count=0;
+ while(rows.find()) {
+ Node n=code.f(Integer.parseInt(rows.group(1)));
+ String name=n.getClass().getSimpleName();
+ if(n instanceof ParmNode || n instanceof CProjNode) name+=":"+n.label();
+ compact.append(String.format("%2d %-16s",n._nid,name));
+ for(int i=0;i<n.nIns();i++) compact.append(' ').append(n.in(i)==null?"_":n.in(i)._nid);
+ compact.append('\n');
+ count++;
+ }
+ code.GCM().localSched().regAlloc();
+ String assembly=code.asm();
+ code.encode();
+ String encoded=code.asm();
+ Files.writeString(deck.resolve("assets/backend-selected.txt"),selected);
+ Files.writeString(deck.resolve("assets/backend-registers.txt"),assembly);
+ Files.writeString(deck.resolve("assets/backend-encoded.txt"),encoded);
+ Files.writeString(deck.resolve("backend.js"),
+ "/* Generated by tools/BackendDump.java; Chapter 21, x86-64 System V. */\n"+
+ "window.REBASE.backend = {\n source: "+js(source)+",\n selected: "+js(compact.toString())+
+ ",\n assembly: "+js(assembly)+",\n encoded: "+js(encoded)+"\n};\n");
+ System.out.println("Captured "+count+" selected nodes, allocated assembly, and encoded assembly.");
+ }
+}
diff --git a/docs/2026_REBASE/tools/RichLattice.java b/docs/2026_REBASE/tools/RichLattice.java
new file mode 100644
index 00000000..bd2d99e9
--- /dev/null
+++ b/docs/2026_REBASE/tools/RichLattice.java
@@ -0,0 +1,59 @@
+import com.seaofnodes.simple.type.*;
+import java.nio.file.*;
+import java.util.*;
+
+/** Draw the ordering of Chapter 24's representative types and their duals. */
+public class RichLattice {
+ static String quote(String s) {
+ return "\""+s.replace("\\","\\\\").replace("\"","\\\"").replace("\n","\\n")+"\"";
+ }
+ static String color(Type t) {
+ String name=t.getClass().getSimpleName();
+ if(t==Type.TOP || t==Type.BOTTOM) return "#172e35";
+ return switch(name) {
+ case "TypeInteger" -> "#d3e7f5";
+ case "TypeFloat" -> "#c7eee9";
+ case "TypePtr", "TypeMemPtr" -> "#cce4d6";
+ case "TypeFunPtr" -> "#dfd0ef";
+ case "TypeMem" -> "#a9c9e5";
+ case "TypeStruct", "Field" -> "#e0ebc8";
+ case "TypeTuple" -> "#f2d7e4";
+ case "TypeRPC" -> "#f4d4b5";
+ default -> name.startsWith("TypeConAry") ? "#d9d5cc" : "#faedce";
+ };
+ }
+ public static void main(String[] args) throws Exception {
+ var types=new ArrayList<>(new LinkedHashSet<>(Arrays.asList(Type.gather())));
+ int size=types.size();
+ boolean[][] above=new boolean[size][size];
+ for(int i=0;i<size;i++) for(int j=0;j<size;j++)
+ above[i][j]=i!=j && types.get(i).meet(types.get(j))==types.get(j);
+ int top=types.indexOf(Type.TOP), bottom=types.indexOf(Type.BOTTOM);
+ for(int i=0;i<size;i++) {
+ assert !above[i][top] && !above[bottom][i];
+ assert i==top || above[top][i];
+ assert i==bottom || above[i][bottom];
+ }
+ StringBuilder dot=new StringBuilder("digraph RichLattice {\n"+
+ "graph [bgcolor=\"transparent\", ranksep=0.35, nodesep=0.12, pad=0.08];\n"+
+ "node [shape=box, style=\"rounded,filled\", fontname=\"Arial\", fontsize=10, margin=\"0.06,0.04\", color=\"#647674\", penwidth=0.65];\n"+
+ "edge [arrowhead=none, color=\"#899895\", penwidth=0.65];\n");
+ for(int i=0;i<size;i++) {
+ Type t=types.get(i);
+ String name=t==Type.TOP?"TOP":t==Type.BOTTOM?"BOTTOM":t.str();
+ dot.append("n").append(i).append(" [label=").append(quote(name))
+ .append(", tooltip=").append(quote(t.getClass().getSimpleName()+": "+t))
+ .append(", fillcolor=").append(quote(color(t)))
+ .append(", fontcolor=").append(quote(t==Type.TOP || t==Type.BOTTOM?"white":"#172e35")).append("];\n");
+ }
+ int edges=0;
+ for(int i=0;i<size;i++) for(int j=0;j<size;j++) if(above[i][j]) {
+ boolean indirect=false;
+ for(int k=0;k<size;k++) if(above[i][k] && above[k][j]) {indirect=true;break;}
+ if(!indirect) {dot.append("n").append(i).append(" -> n").append(j).append(";\n");edges++;}
+ }
+ dot.append("}\n");
+ Files.writeString(Path.of("docs/2026_REBASE/assets/rich-lattice.gv"),dot);
+ System.out.println(size+" representative types; "+edges+" order edges (transitively reduced).");
+ }
+}
diff --git a/docs/2026_REBASE/tools/snapshot-library.py b/docs/2026_REBASE/tools/snapshot-library.py
new file mode 100644
index 00000000..dee09d2f
--- /dev/null
+++ b/docs/2026_REBASE/tools/snapshot-library.py
@@ -0,0 +1,16 @@
+"""Bundle the current Chapter 25 stdlib and methods example for offline browsing."""
+from pathlib import Path
+import json
+
+deck = Path(__file__).resolve().parents[1]
+repo = deck.parents[1]
+source = repo / "chapter25/src/main/smp"
+paths = [source / "sys.smp", *sorted((source / "sys").rglob("*.smp"))]
+files = {path.relative_to(source).as_posix(): path.read_text(encoding="utf-8") for path in paths}
+bundle = {"origin": "chapter25/src/main/smp", "files": files,
+ "methods": (deck / "demos/methods.smp").read_text(encoding="utf-8")}
+(deck / "stdlib.js").write_text(
+ "/* Generated by tools/snapshot-library.py; local source snapshot. */\n"
+ "window.REBASE.library = " + json.dumps(bundle, ensure_ascii=False, indent=2) + ";\n",
+ encoding="utf-8", newline="\n")
+print(f"Bundled {len(files)} standard-library files and the methods example.")
diff --git a/docs/chapter-backports.md b/docs/chapter-backports.md
index 67920ba5..a8be1e24 100644
--- a/docs/chapter-backports.md
+++ b/docs/chapter-backports.md
@@ -642,6 +642,22 @@ The top-level runner accepts explicit chapter lists, e.g.
## Validation record
+- **Unused parser memory aggregates, Chapters 11-24 (2026-10-03).** Release
+ temporary prior-memory keeps with dead-node cleanup after publishing the new
+ memory value. Flattening a MemMerge could remove its last real use while the
+ parser kept it alive; plain `unkeep()` then left it unused and off the worklist.
+ The Chapter 17b presentation alias example's MemMerge#18 now disappears.
+ Its partial allocation input (#14) remains: null default means uncovered
+ aliases, so it cannot be replaced with whole memory just because its covered
+ slices coincide. Chapter 25's different construction sites were not changed.
+ Make builds passed in all affected chapters; complete suites passed in 11
+ (163 tests) and 12 (177). Existing Chapter10/11 tests passed in 13-24, plus
+ Chapter15/16 tests where present and Chapter17a/17b tests in 17b. Updated
+ earlier graph-shape expectations for the newly eliminated initializing Store
+ and a different equivalent Phi name. Direct graph checks and evaluator runs
+ passed for both presentation memory examples; their JSON/SVG captures were
+ regenerated. Logs: `build/rebase-talk/memory-cleanup/`.
+
- **Chapter 25 historical String fixtures (2026-10-02).** Added an explicit
constructor initializing the required non-null `cs` field in
`Chapter21Test-testStringExport.smp`, `Chapter21AllocTest-testString.smp`, and