mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-07-10 13:31:38 +00:00
Re-rendered after committing the verification gate replays so the report's result-file count matches the results directory.
584 lines
115 KiB
HTML
584 lines
115 KiB
HTML
<!doctype html>
|
||
<html lang="en"><head><meta charset="utf-8">
|
||
<title>Hermes TUI bench — Ink vs OpenTUI</title>
|
||
<style>
|
||
body { background:#0b0e14; color:#cdd3e0; font-family:ui-monospace,SFMono-Regular,monospace; margin:0; padding:32px; max-width:1100px; margin-inline:auto; }
|
||
h1 { color:#e8eaf0; font-size:24px; }
|
||
h2 { color:#e8eaf0; font-size:19px; margin-top:48px; border-bottom:1px solid #262c38; padding-bottom:6px;}
|
||
table { border-collapse:collapse; margin:12px 0; font-size:13px; width:100%; }
|
||
th,td { border:1px solid #262c38; padding:7px 10px; text-align:left; vertical-align:top;}
|
||
th { background:#161b24; color:#aab2c5; }
|
||
.verdict td { font-size:13.5px; }
|
||
.win-ink { background:#3a2126; color:#e8b4ba; font-weight:bold; }
|
||
.win-otui { background:#1f3a28; color:#a7d8b4; font-weight:bold; }
|
||
.win-tie { background:#252b36; color:#aab2c5; font-weight:bold; }
|
||
.sw { display:inline-block; width:12px; height:12px; border-radius:2px; vertical-align:-1px; }
|
||
.legend { color:#8b93a7; font-size:12px; }
|
||
.iqr { color:#6f7689; font-size:11px; }
|
||
.dim { color:#8b93a7; }
|
||
.ok { color:#98c379; } .bad { color:#e06c75; }
|
||
.notrun { color:#6f7689; font-style:italic; }
|
||
svg { margin:12px 0 4px; border-radius:6px; max-width:100%; height:auto; }
|
||
figure { margin:18px 0; }
|
||
figcaption { color:#9aa3b8; font-size:13px; margin:2px 0 0 4px; font-style:italic; }
|
||
p, li { font-size:14px; line-height:1.55; }
|
||
code { color:#98c379; }
|
||
.callout { background:#161b24; border-left:3px solid #61afef; padding:10px 14px; margin:14px 0; font-size:14px; }
|
||
.stress { border-left-color:#e5c07b; }
|
||
</style></head><body>
|
||
<h1>Hermes TUI benchmark — Ink (current UI) vs OpenTUI (new engine)</h1>
|
||
<p>Both UIs were run as real binaries in a real terminal, fed the exact same scripted conversations by a fake
|
||
gateway, and measured from outside the process. Every number below is the typical of repeated runs (median)
|
||
unless said otherwise. 103 result files · sha 50e34713b · node v26.3.0 · generated 2026-06-11T04:05:28.897Z</p>
|
||
|
||
<h2>The verdict — who won what</h2>
|
||
<table class="verdict">
|
||
<tr><th style="width:32%">dimension</th><th style="width:18%">winner</th><th>the numbers</th></tr>
|
||
<tr><td>Memory — typical real sessions (20–300 msgs)</td><td class="win-ink">Ink wins, modestly</td><td>OpenTUI uses ~59–88MB more (163 vs 222MB at 100 msgs; 180 vs 268MB at 300).</td></tr>
|
||
<tr><td>Memory — longest real sessions (~2,000 msgs, the longest 1 in 100 = p99)</td><td class="win-ink">Ink wins big</td><td>234MB vs 671MB peak — 2.9× more. Sessions this long really happen (6 of them in the DB).</td></tr>
|
||
<tr><td>Memory — 3,000-msg stress marathon (beyond any real session)</td><td class="win-ink">Ink wins</td><td>Ink levels off near 249MB; OpenTUI climbs to ~767MB (peak ~875MB), and its syntax styling degrades past ~1,400 rows. Stress test only — past the longest real session.</td></tr>
|
||
<tr><td>Scroll responsiveness on a long transcript</td><td class="win-otui">OpenTUI wins decisively</td><td>Slowest 1-in-100 scroll responses (p99): 14–17ms vs 83–101ms across repeats. Typical scrolls are ~2ms on both — the difference is the stutters.</td></tr>
|
||
<tr><td>Frame smoothness while streaming</td><td class="win-otui">OpenTUI wins</td><td>22 vs 16 screen updates/s, and its worst pauses between updates are half as long (103ms vs 209ms, slowest 1 in 20).</td></tr>
|
||
<tr><td>Typing echo (keystroke → it appears)</td><td class="win-tie">Tie</td><td>Both answer a keystroke in 1–2ms — under any human threshold.</td></tr>
|
||
<tr><td>Submit → first reply paint</td><td class="win-ink">Ink wins</td><td>44ms vs 107ms from pressing Enter to the first reply text on screen.</td></tr>
|
||
<tr><td>CPU, including the terminal-emulator (tmux) side</td><td class="win-tie">Tie</td><td>~80 CPU-seconds either way for the same 800-message stream (83 vs 80s total); the tmux leg is ~0.4s for both.</td></tr>
|
||
<tr><td>Crash recovery (gateway shot mid-stream)</td><td class="win-tie">Tie</td><td>Both auto-respawn the killed gateway and end with the full transcript intact and zero orphan processes. Ink respawns in ~81ms, OpenTUI in ~1.0s.</td></tr>
|
||
<tr><td>Startup</td><td class="win-ink">Ink wins, modestly</td><td>First paint 67ms vs 127ms. Both feel instant; OpenTUI actually reaches “session ready” slightly sooner (176 vs 202ms).</td></tr>
|
||
</table>
|
||
<p class="legend"><span class="sw win-ink"> </span> red = Ink (current UI) wins · <span class="sw win-otui"> </span> green = OpenTUI (new engine) wins · <span class="sw win-tie"> </span> grey = tie</p>
|
||
<p class="callout">One-line summary: <b>OpenTUI is the smoother UI</b> (scrolling, streaming) and
|
||
<b>Ink is the lighter one</b> (memory, first paint). Everything else is a wash — including reliability,
|
||
where both recover from a killed gateway with the transcript intact.</p>
|
||
|
||
<h2>Memory at real workloads — what sessions actually look like</h2>
|
||
<p>The memory debate was framed around 200–300-message sessions. The real session database says that band is
|
||
the top 5–10%: <b>the typical session is ~20 messages</b>, 90% stay under
|
||
182, and the longest real sessions reach ~1941 messages (the longest
|
||
1 in 100 — p99) — and at that tail the memory gap widens to 2.9×.</p>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="460" viewBox="0 0 1040 460" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="460" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">How long the user's real terminal sessions actually are (444 sessions)</text>
|
||
<line x1="72" y1="390" x2="1022" y2="390" stroke="#262c38"/>
|
||
<text x="64" y="394" fill="#8b93a7" font-size="12" text-anchor="end">0</text>
|
||
<line x1="72" y1="331.2" x2="1022" y2="331.2" stroke="#262c38"/>
|
||
<text x="64" y="335.2" fill="#8b93a7" font-size="12" text-anchor="end">37</text>
|
||
<line x1="72" y1="272.4" x2="1022" y2="272.4" stroke="#262c38"/>
|
||
<text x="64" y="276.4" fill="#8b93a7" font-size="12" text-anchor="end">74</text>
|
||
<line x1="72" y1="213.6" x2="1022" y2="213.6" stroke="#262c38"/>
|
||
<text x="64" y="217.6" fill="#8b93a7" font-size="12" text-anchor="end">111</text>
|
||
<line x1="72" y1="154.8" x2="1022" y2="154.8" stroke="#262c38"/>
|
||
<text x="64" y="158.8" fill="#8b93a7" font-size="12" text-anchor="end">148</text>
|
||
<line x1="72" y1="96" x2="1022" y2="96" stroke="#262c38"/>
|
||
<text x="64" y="100" fill="#8b93a7" font-size="12" text-anchor="end">185</text>
|
||
<text x="18" y="243" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 243)">number of sessions</text>
|
||
<rect x="76" y="122.72727272727275" width="97.55555555555556" height="267.27272727272725" fill="#c678dd" opacity="0.75"/>
|
||
<text x="124.77777777777777" y="116.72727272727275" fill="#e8eaf0" font-size="12" text-anchor="middle">168</text>
|
||
<text x="124.77777777777777" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">0–10</text>
|
||
<rect x="181.55555555555554" y="265.90909090909093" width="97.55555555555556" height="124.09090909090907" fill="#c678dd" opacity="0.75"/>
|
||
<text x="230.33333333333331" y="259.90909090909093" fill="#e8eaf0" font-size="12" text-anchor="middle">78</text>
|
||
<text x="230.33333333333331" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">10–25</text>
|
||
<rect x="287.1111111111111" y="265.90909090909093" width="97.55555555555556" height="124.09090909090907" fill="#c678dd" opacity="0.75"/>
|
||
<text x="335.88888888888886" y="259.90909090909093" fill="#e8eaf0" font-size="12" text-anchor="middle">78</text>
|
||
<text x="335.88888888888886" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">25–50</text>
|
||
<rect x="392.6666666666667" y="315.22727272727275" width="97.55555555555556" height="74.77272727272725" fill="#c678dd" opacity="0.75"/>
|
||
<text x="441.44444444444446" y="309.22727272727275" fill="#e8eaf0" font-size="12" text-anchor="middle">47</text>
|
||
<text x="441.44444444444446" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">50–100</text>
|
||
<rect x="498.22222222222223" y="342.27272727272725" width="97.55555555555556" height="47.72727272727275" fill="#c678dd" opacity="0.75"/>
|
||
<text x="547" y="336.27272727272725" fill="#e8eaf0" font-size="12" text-anchor="middle">30</text>
|
||
<text x="547" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">100–200</text>
|
||
<rect x="603.7777777777778" y="367.72727272727275" width="97.55555555555556" height="22.272727272727252" fill="#c678dd" opacity="0.75"/>
|
||
<text x="652.5555555555557" y="361.72727272727275" fill="#e8eaf0" font-size="12" text-anchor="middle">14</text>
|
||
<text x="652.5555555555557" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">200–300</text>
|
||
<rect x="709.3333333333334" y="361.3636363636364" width="97.55555555555556" height="28.636363636363626" fill="#c678dd" opacity="0.75"/>
|
||
<text x="758.1111111111112" y="355.3636363636364" fill="#e8eaf0" font-size="12" text-anchor="middle">18</text>
|
||
<text x="758.1111111111112" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">300–500</text>
|
||
<rect x="814.8888888888889" y="382.04545454545456" width="97.55555555555556" height="7.954545454545439" fill="#c678dd" opacity="0.75"/>
|
||
<text x="863.6666666666667" y="376.04545454545456" fill="#e8eaf0" font-size="12" text-anchor="middle">5</text>
|
||
<text x="863.6666666666667" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">500–1000</text>
|
||
<rect x="920.4444444444445" y="380.45454545454544" width="97.55555555555556" height="9.545454545454561" fill="#c678dd" opacity="0.75"/>
|
||
<text x="969.2222222222223" y="374.45454545454544" fill="#e8eaf0" font-size="12" text-anchor="middle">6</text>
|
||
<text x="969.2222222222223" y="410" fill="#8b93a7" font-size="12" text-anchor="middle">1000–3000</text>
|
||
<text x="547" y="434" fill="#aab2c5" font-size="13" text-anchor="middle">messages in the session</text>
|
||
<line x1="247.92592592592592" y1="50" x2="247.92592592592592" y2="390" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.85"/>
|
||
<text x="251.92592592592592" y="46" fill="#e5c07b" font-size="12" text-anchor="start">half are ≤20 (p50)</text>
|
||
<line x1="395" y1="66" x2="395" y2="390" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.85"/>
|
||
<text x="399" y="62" fill="#e5c07b" font-size="12" text-anchor="start">75% ≤53</text>
|
||
<line x1="580.7777777777778" y1="82" x2="580.7777777777778" y2="390" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.85"/>
|
||
<text x="584.7777777777778" y="78" fill="#e5c07b" font-size="12" text-anchor="start">90% ≤182</text>
|
||
<line x1="726.4444444444445" y1="50" x2="726.4444444444445" y2="390" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.85"/>
|
||
<text x="730.4444444444445" y="46" fill="#e5c07b" font-size="12" text-anchor="start">95% ≤340</text>
|
||
<line x1="966.1083333333332" y1="66" x2="966.1083333333332" y2="390" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="5 4" opacity="0.85"/>
|
||
<text x="962.1083333333332" y="62" fill="#e5c07b" font-size="12" text-anchor="end">99% ≤1941 (p99)</text>
|
||
<text x="72" y="452" fill="#6f7689" font-size="11">Every TUI/CLI session in the real session DB (/home/daimon/.hermes/state.db); message counts per session.</text>
|
||
</svg><figcaption>Takeaway: real sessions are short — half end within ~20 messages; the 200–300-msg sizes the debate assumed are actually the top 5–10% of sessions.</figcaption></figure>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Peak memory at real session sizes — Ink vs OpenTUI</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">158</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">317</text>
|
||
<line x1="72" y1="167.19999999999996" x2="1022" y2="167.19999999999996" stroke="#262c38"/>
|
||
<text x="64" y="171.19999999999996" fill="#8b93a7" font-size="12" text-anchor="end">475</text>
|
||
<line x1="72" y1="107.6" x2="1022" y2="107.6" stroke="#262c38"/>
|
||
<text x="64" y="111.6" fill="#8b93a7" font-size="12" text-anchor="end">633</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">791</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">peak memory (MB)</text>
|
||
<rect x="177.33333333333334" y="284.71411719316166" width="50" height="61.285882806838345" fill="#e06c75" opacity="0.85"/>
|
||
<text x="202.33333333333334" y="278.71411719316166" fill="#e8eaf0" font-size="12" text-anchor="middle">163</text>
|
||
<text x="202.33333333333334" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="233.33333333333334" y="262.3146223179742" width="50" height="83.68537768202577" fill="#61afef" opacity="0.85"/>
|
||
<text x="258.33333333333337" y="256.3146223179742" fill="#e8eaf0" font-size="12" text-anchor="middle">222</text>
|
||
<text x="258.33333333333337" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="230.33333333333334" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">100 msgs (heavy-ish day)</text>
|
||
<rect x="494" y="278.0624401470974" width="50" height="67.93755985290261" fill="#e06c75" opacity="0.85"/>
|
||
<text x="519" y="272.0624401470974" fill="#e8eaf0" font-size="12" text-anchor="middle">180</text>
|
||
<text x="519" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="550" y="245.02614518409658" width="50" height="100.97385481590342" fill="#61afef" opacity="0.85"/>
|
||
<text x="575" y="239.02614518409658" fill="#e8eaf0" font-size="12" text-anchor="middle">268</text>
|
||
<text x="575" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="547" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">300 msgs (top 5% of sessions)</text>
|
||
<rect x="810.6666666666667" y="257.9698895387429" width="50" height="88.0301104612571" fill="#e06c75" opacity="0.85"/>
|
||
<text x="835.6666666666667" y="251.9698895387429" fill="#e8eaf0" font-size="12" text-anchor="middle">234</text>
|
||
<text x="835.6666666666667" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="866.6666666666667" y="93.45762711864407" width="50" height="252.54237288135593" fill="#61afef" opacity="0.85"/>
|
||
<text x="891.6666666666667" y="87.45762711864407" fill="#e8eaf0" font-size="12" text-anchor="middle">671</text>
|
||
<text x="891.6666666666667" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="863.6666666666667" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">2,000 msgs (longest real sessions)</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">Peak resident memory of the UI process (VmHWM), typical of 2 repeats (median).</text>
|
||
</svg><figcaption>Takeaway: at everyday sizes the gap is a modest 60–90MB; at the rare-but-real 2,000-msg session it becomes 234MB vs 671MB — 2.9× — which is where Ink genuinely wins.</figcaption></figure>
|
||
<table><tr><th>session size</th><th>what that means in practice</th><th>Ink peak</th><th>OpenTUI peak</th><th>difference</th></tr><tr><td>100 msgs</td><td class="dim">a heavier-than-usual day (typical session is ~20 msgs)</td><td><b style="color:#e06c75">163 MB</b></td><td><b style="color:#61afef">222 MB</b></td><td>OpenTUI +59 MB (1.4×)</td></tr>
|
||
<tr><td>300 msgs</td><td class="dim">top ~5% of real sessions</td><td><b style="color:#e06c75">180 MB</b></td><td><b style="color:#61afef">268 MB</b></td><td>OpenTUI +88 MB (1.5×)</td></tr>
|
||
<tr><td>2,000 msgs</td><td class="dim">the longest sessions that actually occur (~1 in 100, p99)</td><td><b style="color:#e06c75">234 MB</b></td><td><b style="color:#61afef">671 MB</b></td><td>OpenTUI +437 MB (2.9×)</td></tr></table>
|
||
|
||
<h2>Scroll responsiveness — where OpenTUI wins</h2>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="500" viewBox="0 0 1040 500" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="500" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">What fraction of scroll responses finished within X ms (2000-msg transcript)</text>
|
||
<line x1="72" y1="48" x2="72" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="72" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">0</text>
|
||
<line x1="230.33333333333331" y1="48" x2="230.33333333333331" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="230.33333333333331" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">19</text>
|
||
<line x1="388.66666666666663" y1="48" x2="388.66666666666663" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="388.66666666666663" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">37</text>
|
||
<line x1="547" y1="48" x2="547" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="547" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">56</text>
|
||
<line x1="705.3333333333333" y1="48" x2="705.3333333333333" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="705.3333333333333" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">74</text>
|
||
<line x1="863.6666666666667" y1="48" x2="863.6666666666667" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="863.6666666666667" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">93</text>
|
||
<line x1="1022" y1="48" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="1022" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">111</text>
|
||
<line x1="72" y1="430" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="434" fill="#8b93a7" font-size="12" text-anchor="end">0</text>
|
||
<line x1="72" y1="353.6" x2="1022" y2="353.6" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="357.6" fill="#8b93a7" font-size="12" text-anchor="end">20</text>
|
||
<line x1="72" y1="277.2" x2="1022" y2="277.2" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="281.2" fill="#8b93a7" font-size="12" text-anchor="end">40</text>
|
||
<line x1="72" y1="200.8" x2="1022" y2="200.8" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="204.8" fill="#8b93a7" font-size="12" text-anchor="end">60</text>
|
||
<line x1="72" y1="124.39999999999998" x2="1022" y2="124.39999999999998" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="128.39999999999998" fill="#8b93a7" font-size="12" text-anchor="end">80</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">100</text>
|
||
<text x="547" y="474" fill="#aab2c5" font-size="13" text-anchor="middle">time from scroll input to first screen response (ms)</text>
|
||
<text x="18" y="239" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 239)">% of scroll responses at least this fast</text>
|
||
<path d="M72.0,429.7 L72.0,429.4 L72.0,429.2 L72.0,428.9 L72.0,428.6 L72.0,428.3 L72.0,428.0 L72.0,427.7 L80.6,427.5 L80.6,427.2 L80.6,426.9 L80.6,426.6 L80.6,426.3 L80.6,426.0 L80.6,425.8 L80.6,425.5 L80.6,425.2 L80.6,424.9 L80.6,424.6 L80.6,424.3 L80.6,424.1 L80.6,423.8 L80.6,423.5 L80.6,423.2 L80.6,422.9 L80.6,422.6 L80.6,422.4 L80.6,422.1 L80.6,421.8 L80.6,421.5 L80.6,421.2 L80.6,420.9 L80.6,420.7 L80.6,420.4 L80.6,420.1 L80.6,419.8 L80.6,419.5 L80.6,419.2 L80.6,419.0 L80.6,418.7 L80.6,418.4 L80.6,418.1 L80.6,417.8 L80.6,417.5 L80.6,417.3 L80.6,417.0 L80.6,416.7 L80.6,416.4 L80.6,416.1 L80.6,415.9 L80.6,415.6 L80.6,415.3 L80.6,415.0 L80.6,414.7 L80.6,414.4 L80.6,414.2 L80.6,413.9 L80.6,413.6 L80.6,413.3 L80.6,413.0 L80.6,412.7 L80.6,412.5 L80.6,412.2 L80.6,411.9 L80.6,411.6 L80.6,411.3 L80.6,411.0 L80.6,410.8 L80.6,410.5 L80.6,410.2 L80.6,409.9 L80.6,409.6 L80.6,409.3 L80.6,409.1 L80.6,408.8 L80.6,408.5 L80.6,408.2 L80.6,407.9 L80.6,407.6 L80.6,407.4 L80.6,407.1 L80.6,406.8 L80.6,406.5 L80.6,406.2 L80.6,405.9 L80.6,405.7 L80.6,405.4 L80.6,405.1 L80.6,404.8 L80.6,404.5 L80.6,404.3 L80.6,404.0 L80.6,403.7 L80.6,403.4 L80.6,403.1 L80.6,402.8 L80.6,402.6 L80.6,402.3 L80.6,402.0 L80.6,401.7 L80.6,401.4 L80.6,401.1 L80.6,400.9 L80.6,400.6 L80.6,400.3 L80.6,400.0 L80.6,399.7 L80.6,399.4 L80.6,399.2 L80.6,398.9 L80.6,398.6 L80.6,398.3 L80.6,398.0 L80.6,397.7 L80.6,397.5 L80.6,397.2 L80.6,396.9 L80.6,396.6 L80.6,396.3 L80.6,396.0 L80.6,395.8 L80.6,395.5 L80.6,395.2 L80.6,394.9 L80.6,394.6 L80.6,394.3 L80.6,394.1 L80.6,393.8 L80.6,393.5 L80.6,393.2 L80.6,392.9 L80.6,392.6 L80.6,392.4 L80.6,392.1 L80.6,391.8 L80.6,391.5 L80.6,391.2 L80.6,391.0 L80.6,390.7 L80.6,390.4 L80.6,390.1 L80.6,389.8 L80.6,389.5 L80.6,389.3 L80.6,389.0 L80.6,388.7 L80.6,388.4 L80.6,388.1 L80.6,387.8 L80.6,387.6 L80.6,387.3 L80.6,387.0 L80.6,386.7 L80.6,386.4 L80.6,386.1 L80.6,385.9 L80.6,385.6 L80.6,385.3 L80.6,385.0 L80.6,384.7 L80.6,384.4 L80.6,384.2 L80.6,383.9 L80.6,383.6 L80.6,383.3 L80.6,383.0 L80.6,382.7 L80.6,382.5 L80.6,382.2 L80.6,381.9 L80.6,381.6 L80.6,381.3 L80.6,381.0 L80.6,380.8 L80.6,380.5 L80.6,380.2 L80.6,379.9 L80.6,379.6 L80.6,379.3 L80.6,379.1 L80.6,378.8 L80.6,378.5 L80.6,378.2 L80.6,377.9 L80.6,377.7 L80.6,377.4 L80.6,377.1 L80.6,376.8 L80.6,376.5 L80.6,376.2 L80.6,376.0 L80.6,375.7 L80.6,375.4 L80.6,375.1 L80.6,374.8 L80.6,374.5 L80.6,374.3 L80.6,374.0 L80.6,373.7 L80.6,373.4 L80.6,373.1 L80.6,372.8 L80.6,372.6 L80.6,372.3 L80.6,372.0 L80.6,371.7 L80.6,371.4 L80.6,371.1 L80.6,370.9 L80.6,370.6 L80.6,370.3 L80.6,370.0 L80.6,369.7 L80.6,369.4 L80.6,369.2 L80.6,368.9 L80.6,368.6 L80.6,368.3 L80.6,368.0 L80.6,367.7 L80.6,367.5 L80.6,367.2 L80.6,366.9 L80.6,366.6 L80.6,366.3 L80.6,366.1 L80.6,365.8 L80.6,365.5 L80.6,365.2 L80.6,364.9 L80.6,364.6 L80.6,364.4 L80.6,364.1 L80.6,363.8 L80.6,363.5 L80.6,363.2 L80.6,362.9 L80.6,362.7 L80.6,362.4 L80.6,362.1 L80.6,361.8 L80.6,361.5 L80.6,361.2 L80.6,361.0 L80.6,360.7 L80.6,360.4 L80.6,360.1 L80.6,359.8 L80.6,359.5 L80.6,359.3 L80.6,359.0 L80.6,358.7 L80.6,358.4 L80.6,358.1 L80.6,357.8 L80.6,357.6 L80.6,357.3 L80.6,357.0 L80.6,356.7 L80.6,356.4 L80.6,356.1 L80.6,355.9 L80.6,355.6 L80.6,355.3 L80.6,355.0 L80.6,354.7 L80.6,354.4 L80.6,354.2 L80.6,353.9 L80.6,353.6 L80.6,353.3 L80.6,353.0 L80.6,352.8 L80.6,352.5 L80.6,352.2 L80.6,351.9 L80.6,351.6 L80.6,351.3 L80.6,351.1 L80.6,350.8 L80.6,350.5 L80.6,350.2 L80.6,349.9 L80.6,349.6 L80.6,349.4 L80.6,349.1 L80.6,348.8 L80.6,348.5 L80.6,348.2 L80.6,347.9 L80.6,347.7 L80.6,347.4 L80.6,347.1 L80.6,346.8 L80.6,346.5 L80.6,346.2 L80.6,346.0 L80.6,345.7 L80.6,345.4 L80.6,345.1 L80.6,344.8 L80.6,344.5 L80.6,344.3 L80.6,344.0 L80.6,343.7 L80.6,343.4 L80.6,343.1 L80.6,342.8 L80.6,342.6 L80.6,342.3 L80.6,342.0 L80.6,341.7 L80.6,341.4 L80.6,341.1 L80.6,340.9 L80.6,340.6 L80.6,340.3 L80.6,340.0 L80.6,339.7 L80.6,339.5 L80.6,339.2 L80.6,338.9 L80.6,338.6 L80.6,338.3 L80.6,338.0 L80.6,337.8 L80.6,337.5 L80.6,337.2 L80.6,336.9 L80.6,336.6 L80.6,336.3 L80.6,336.1 L80.6,335.8 L80.6,335.5 L80.6,335.2 L80.6,334.9 L80.6,334.6 L80.6,334.4 L80.6,334.1 L80.6,333.8 L80.6,333.5 L80.6,333.2 L80.6,332.9 L80.6,332.7 L80.6,332.4 L80.6,332.1 L80.6,331.8 L80.6,331.5 L80.6,331.2 L80.6,331.0 L80.6,330.7 L80.6,330.4 L80.6,330.1 L80.6,329.8 L80.6,329.5 L80.6,329.3 L80.6,329.0 L80.6,328.7 L80.6,328.4 L80.6,328.1 L80.6,327.9 L80.6,327.6 L80.6,327.3 L80.6,327.0 L80.6,326.7 L80.6,326.4 L80.6,326.2 L80.6,325.9 L80.6,325.6 L80.6,325.3 L80.6,325.0 L80.6,324.7 L80.6,324.5 L80.6,324.2 L80.6,323.9 L80.6,323.6 L80.6,323.3 L80.6,323.0 L80.6,322.8 L80.6,322.5 L80.6,322.2 L80.6,321.9 L80.6,321.6 L80.6,321.3 L80.6,321.1 L80.6,320.8 L80.6,320.5 L80.6,320.2 L80.6,319.9 L80.6,319.6 L80.6,319.4 L80.6,319.1 L80.6,318.8 L80.6,318.5 L80.6,318.2 L80.6,317.9 L80.6,317.7 L80.6,317.4 L80.6,317.1 L80.6,316.8 L80.6,316.5 L80.6,316.2 L80.6,316.0 L80.6,315.7 L80.6,315.4 L80.6,315.1 L80.6,314.8 L80.6,314.6 L80.6,314.3 L80.6,314.0 L80.6,313.7 L80.6,313.4 L80.6,313.1 L80.6,312.9 L80.6,312.6 L80.6,312.3 L80.6,312.0 L80.6,311.7 L80.6,311.4 L80.6,311.2 L80.6,310.9 L80.6,310.6 L80.6,310.3 L80.6,310.0 L80.6,309.7 L80.6,309.5 L80.6,309.2 L80.6,308.9 L80.6,308.6 L80.6,308.3 L80.6,308.0 L80.6,307.8 L80.6,307.5 L80.6,307.2 L80.6,306.9 L80.6,306.6 L80.6,306.3 L80.6,306.1 L80.6,305.8 L80.6,305.5 L80.6,305.2 L80.6,304.9 L80.6,304.6 L80.6,304.4 L80.6,304.1 L80.6,303.8 L80.6,303.5 L80.6,303.2 L80.6,302.9 L80.6,302.7 L80.6,302.4 L80.6,302.1 L80.6,301.8 L80.6,301.5 L80.6,301.3 L80.6,301.0 L80.6,300.7 L80.6,300.4 L80.6,300.1 L80.6,299.8 L80.6,299.6 L80.6,299.3 L80.6,299.0 L80.6,298.7 L80.6,298.4 L80.6,298.1 L80.6,297.9 L80.6,297.6 L80.6,297.3 L80.6,297.0 L80.6,296.7 L80.6,296.4 L80.6,296.2 L80.6,295.9 L80.6,295.6 L80.6,295.3 L80.6,295.0 L80.6,294.7 L80.6,294.5 L80.6,294.2 L80.6,293.9 L80.6,293.6 L80.6,293.3 L80.6,293.0 L80.6,292.8 L80.6,292.5 L80.6,292.2 L80.6,291.9 L80.6,291.6 L80.6,291.3 L80.6,291.1 L80.6,290.8 L80.6,290.5 L80.6,290.2 L80.6,289.9 L80.6,289.7 L80.6,289.4 L80.6,289.1 L80.6,288.8 L80.6,288.5 L80.6,288.2 L80.6,288.0 L80.6,287.7 L80.6,287.4 L80.6,287.1 L80.6,286.8 L80.6,286.5 L80.6,286.3 L80.6,286.0 L80.6,285.7 L80.6,285.4 L80.6,285.1 L80.6,284.8 L80.6,284.6 L80.6,284.3 L80.6,284.0 L80.6,283.7 L80.6,283.4 L80.6,283.1 L80.6,282.9 L80.6,282.6 L80.6,282.3 L80.6,282.0 L80.6,281.7 L80.6,281.4 L80.6,281.2 L80.6,280.9 L80.6,280.6 L80.6,280.3 L80.6,280.0 L80.6,279.7 L80.6,279.5 L80.6,279.2 L80.6,278.9 L80.6,278.6 L80.6,278.3 L80.6,278.0 L80.6,277.8 L80.6,277.5 L80.6,277.2 L80.6,276.9 L80.6,276.6 L80.6,276.4 L80.6,276.1 L80.6,275.8 L80.6,275.5 L80.6,275.2 L80.6,274.9 L80.6,274.7 L80.6,274.4 L80.6,274.1 L80.6,273.8 L80.6,273.5 L80.6,273.2 L80.6,273.0 L80.6,272.7 L80.6,272.4 L80.6,272.1 L80.6,271.8 L80.6,271.5 L80.6,271.3 L80.6,271.0 L80.6,270.7 L80.6,270.4 L80.6,270.1 L80.6,269.8 L80.6,269.6 L80.6,269.3 L80.6,269.0 L80.6,268.7 L80.6,268.4 L80.6,268.1 L80.6,267.9 L80.6,267.6 L80.6,267.3 L80.6,267.0 L80.6,266.7 L80.6,266.4 L80.6,266.2 L80.6,265.9 L80.6,265.6 L80.6,265.3 L80.6,265.0 L80.6,264.7 L80.6,264.5 L80.6,264.2 L80.6,263.9 L80.6,263.6 L80.6,263.3 L80.6,263.1 L80.6,262.8 L80.6,262.5 L80.6,262.2 L80.6,261.9 L80.6,261.6 L80.6,261.4 L80.6,261.1 L80.6,260.8 L80.6,260.5 L80.6,260.2 L80.6,259.9 L80.6,259.7 L80.6,259.4 L80.6,259.1 L80.6,258.8 L80.6,258.5 L80.6,258.2 L80.6,258.0 L80.6,257.7 L80.6,257.4 L80.6,257.1 L80.6,256.8 L80.6,256.5 L80.6,256.3 L80.6,256.0 L80.6,255.7 L80.6,255.4 L80.6,255.1 L80.6,254.8 L80.6,254.6 L80.6,254.3 L80.6,254.0 L80.6,253.7 L80.6,253.4 L80.6,253.1 L80.6,252.9 L80.6,252.6 L80.6,252.3 L80.6,252.0 L80.6,251.7 L89.1,251.5 L89.1,251.2 L89.1,250.9 L89.1,250.6 L89.1,250.3 L89.1,250.0 L89.1,249.8 L89.1,249.5 L89.1,249.2 L89.1,248.9 L89.1,248.6 L89.1,248.3 L89.1,248.1 L89.1,247.8 L89.1,247.5 L89.1,247.2 L89.1,246.9 L89.1,246.6 L89.1,246.4 L89.1,246.1 L89.1,245.8 L89.1,245.5 L89.1,245.2 L89.1,244.9 L89.1,244.7 L89.1,244.4 L89.1,244.1 L89.1,243.8 L89.1,243.5 L89.1,243.2 L89.1,243.0 L89.1,242.7 L89.1,242.4 L89.1,242.1 L89.1,241.8 L89.1,241.5 L89.1,241.3 L89.1,241.0 L89.1,240.7 L89.1,240.4 L89.1,240.1 L89.1,239.8 L89.1,239.6 L89.1,239.3 L89.1,239.0 L89.1,238.7 L89.1,238.4 L89.1,238.2 L89.1,237.9 L89.1,237.6 L89.1,237.3 L89.1,237.0 L89.1,236.7 L89.1,236.5 L89.1,236.2 L89.1,235.9 L89.1,235.6 L89.1,235.3 L89.1,235.0 L89.1,234.8 L89.1,234.5 L89.1,234.2 L89.1,233.9 L89.1,233.6 L89.1,233.3 L89.1,233.1 L89.1,232.8 L89.1,232.5 L89.1,232.2 L89.1,231.9 L89.1,231.6 L89.1,231.4 L89.1,231.1 L89.1,230.8 L89.1,230.5 L89.1,230.2 L89.1,229.9 L89.1,229.7 L89.1,229.4 L89.1,229.1 L89.1,228.8 L89.1,228.5 L89.1,228.2 L89.1,228.0 L89.1,227.7 L89.1,227.4 L89.1,227.1 L89.1,226.8 L89.1,226.5 L89.1,226.3 L89.1,226.0 L89.1,225.7 L89.1,225.4 L89.1,225.1 L89.1,224.9 L89.1,224.6 L89.1,224.3 L89.1,224.0 L89.1,223.7 L89.1,223.4 L89.1,223.2 L89.1,222.9 L89.1,222.6 L89.1,222.3 L89.1,222.0 L89.1,221.7 L89.1,221.5 L89.1,221.2 L89.1,220.9 L89.1,220.6 L89.1,220.3 L89.1,220.0 L89.1,219.8 L89.1,219.5 L89.1,219.2 L89.1,218.9 L89.1,218.6 L89.1,218.3 L89.1,218.1 L89.1,217.8 L89.1,217.5 L89.1,217.2 L89.1,216.9 L89.1,216.6 L89.1,216.4 L89.1,216.1 L89.1,215.8 L89.1,215.5 L89.1,215.2 L89.1,214.9 L89.1,214.7 L89.1,214.4 L89.1,214.1 L89.1,213.8 L89.1,213.5 L89.1,213.3 L89.1,213.0 L89.1,212.7 L89.1,212.4 L89.1,212.1 L89.1,211.8 L89.1,211.6 L89.1,211.3 L89.1,211.0 L89.1,210.7 L89.1,210.4 L89.1,210.1 L89.1,209.9 L89.1,209.6 L89.1,209.3 L89.1,209.0 L89.1,208.7 L89.1,208.4 L89.1,208.2 L89.1,207.9 L89.1,207.6 L89.1,207.3 L89.1,207.0 L89.1,206.7 L89.1,206.5 L89.1,206.2 L89.1,205.9 L89.1,205.6 L89.1,205.3 L89.1,205.0 L89.1,204.8 L89.1,204.5 L89.1,204.2 L89.1,203.9 L89.1,203.6 L89.1,203.3 L89.1,203.1 L89.1,202.8 L89.1,202.5 L89.1,202.2 L89.1,201.9 L89.1,201.6 L89.1,201.4 L89.1,201.1 L89.1,200.8 L89.1,200.5 L89.1,200.2 L89.1,200.0 L89.1,199.7 L89.1,199.4 L89.1,199.1 L89.1,198.8 L89.1,198.5 L89.1,198.3 L89.1,198.0 L89.1,197.7 L89.1,197.4 L89.1,197.1 L89.1,196.8 L89.1,196.6 L89.1,196.3 L89.1,196.0 L89.1,195.7 L89.1,195.4 L89.1,195.1 L89.1,194.9 L89.1,194.6 L89.1,194.3 L89.1,194.0 L89.1,193.7 L89.1,193.4 L89.1,193.2 L89.1,192.9 L89.1,192.6 L89.1,192.3 L89.1,192.0 L89.1,191.7 L89.1,191.5 L89.1,191.2 L89.1,190.9 L89.1,190.6 L89.1,190.3 L89.1,190.0 L89.1,189.8 L89.1,189.5 L89.1,189.2 L89.1,188.9 L89.1,188.6 L89.1,188.3 L89.1,188.1 L89.1,187.8 L89.1,187.5 L89.1,187.2 L89.1,186.9 L89.1,186.7 L89.1,186.4 L89.1,186.1 L89.1,185.8 L89.1,185.5 L89.1,185.2 L89.1,185.0 L89.1,184.7 L89.1,184.4 L89.1,184.1 L89.1,183.8 L89.1,183.5 L89.1,183.3 L89.1,183.0 L89.1,182.7 L89.1,182.4 L89.1,182.1 L89.1,181.8 L89.1,181.6 L89.1,181.3 L89.1,181.0 L89.1,180.7 L89.1,180.4 L89.1,180.1 L89.1,179.9 L89.1,179.6 L89.1,179.3 L89.1,179.0 L89.1,178.7 L89.1,178.4 L89.1,178.2 L89.1,177.9 L89.1,177.6 L89.1,177.3 L89.1,177.0 L89.1,176.7 L89.1,176.5 L89.1,176.2 L89.1,175.9 L89.1,175.6 L89.1,175.3 L89.1,175.1 L89.1,174.8 L89.1,174.5 L89.1,174.2 L89.1,173.9 L89.1,173.6 L89.1,173.4 L89.1,173.1 L89.1,172.8 L89.1,172.5 L89.1,172.2 L89.1,171.9 L89.1,171.7 L89.1,171.4 L89.1,171.1 L89.1,170.8 L89.1,170.5 L89.1,170.2 L89.1,170.0 L89.1,169.7 L89.1,169.4 L89.1,169.1 L89.1,168.8 L89.1,168.5 L89.1,168.3 L89.1,168.0 L89.1,167.7 L89.1,167.4 L89.1,167.1 L89.1,166.8 L89.1,166.6 L89.1,166.3 L89.1,166.0 L89.1,165.7 L89.1,165.4 L89.1,165.1 L89.1,164.9 L89.1,164.6 L89.1,164.3 L89.1,164.0 L89.1,163.7 L89.1,163.4 L89.1,163.2 L89.1,162.9 L89.1,162.6 L89.1,162.3 L89.1,162.0 L89.1,161.8 L89.1,161.5 L89.1,161.2 L89.1,160.9 L89.1,160.6 L89.1,160.3 L89.1,160.1 L89.1,159.8 L89.1,159.5 L89.1,159.2 L89.1,158.9 L89.1,158.6 L89.1,158.4 L89.1,158.1 L89.1,157.8 L89.1,157.5 L89.1,157.2 L89.1,156.9 L89.1,156.7 L89.1,156.4 L89.1,156.1 L89.1,155.8 L89.1,155.5 L89.1,155.2 L89.1,155.0 L89.1,154.7 L89.1,154.4 L89.1,154.1 L89.1,153.8 L89.1,153.5 L89.1,153.3 L89.1,153.0 L89.1,152.7 L89.1,152.4 L89.1,152.1 L89.1,151.8 L89.1,151.6 L89.1,151.3 L89.1,151.0 L89.1,150.7 L89.1,150.4 L89.1,150.1 L89.1,149.9 L89.1,149.6 L89.1,149.3 L89.1,149.0 L89.1,148.7 L89.1,148.5 L89.1,148.2 L89.1,147.9 L89.1,147.6 L89.1,147.3 L89.1,147.0 L89.1,146.8 L89.1,146.5 L89.1,146.2 L89.1,145.9 L89.1,145.6 L89.1,145.3 L89.1,145.1 L89.1,144.8 L89.1,144.5 L89.1,144.2 L89.1,143.9 L89.1,143.6 L89.1,143.4 L89.1,143.1 L89.1,142.8 L89.1,142.5 L89.1,142.2 L89.1,141.9 L89.1,141.7 L89.1,141.4 L89.1,141.1 L89.1,140.8 L89.1,140.5 L89.1,140.2 L89.1,140.0 L89.1,139.7 L89.1,139.4 L89.1,139.1 L89.1,138.8 L89.1,138.5 L89.1,138.3 L89.1,138.0 L89.1,137.7 L89.1,137.4 L89.1,137.1 L89.1,136.9 L89.1,136.6 L89.1,136.3 L89.1,136.0 L89.1,135.7 L89.1,135.4 L89.1,135.2 L89.1,134.9 L89.1,134.6 L89.1,134.3 L89.1,134.0 L89.1,133.7 L89.1,133.5 L89.1,133.2 L89.1,132.9 L89.1,132.6 L89.1,132.3 L89.1,132.0 L97.7,131.8 L97.7,131.5 L97.7,131.2 L97.7,130.9 L97.7,130.6 L97.7,130.3 L97.7,130.1 L97.7,129.8 L97.7,129.5 L97.7,129.2 L97.7,128.9 L97.7,128.6 L97.7,128.4 L97.7,128.1 L97.7,127.8 L97.7,127.5 L97.7,127.2 L97.7,126.9 L97.7,126.7 L97.7,126.4 L97.7,126.1 L97.7,125.8 L97.7,125.5 L97.7,125.2 L97.7,125.0 L97.7,124.7 L97.7,124.4 L97.7,124.1 L97.7,123.8 L97.7,123.6 L97.7,123.3 L97.7,123.0 L97.7,122.7 L97.7,122.4 L97.7,122.1 L97.7,121.9 L97.7,121.6 L97.7,121.3 L97.7,121.0 L97.7,120.7 L97.7,120.4 L97.7,120.2 L97.7,119.9 L97.7,119.6 L97.7,119.3 L97.7,119.0 L97.7,118.7 L97.7,118.5 L97.7,118.2 L97.7,117.9 L97.7,117.6 L97.7,117.3 L97.7,117.0 L97.7,116.8 L106.2,116.5 L106.2,116.2 L106.2,115.9 L106.2,115.6 L106.2,115.3 L106.2,115.1 L106.2,114.8 L106.2,114.5 L106.2,114.2 L106.2,113.9 L106.2,113.6 L106.2,113.4 L106.2,113.1 L106.2,112.8 L114.8,112.5 L114.8,112.2 L114.8,111.9 L114.8,111.7 L114.8,111.4 L114.8,111.1 L114.8,110.8 L114.8,110.5 L114.8,110.3 L114.8,110.0 L123.4,109.7 L123.4,109.4 L123.4,109.1 L123.4,108.8 L123.4,108.6 L123.4,108.3 L123.4,108.0 L131.9,107.7 L131.9,107.4 L131.9,107.1 L131.9,106.9 L131.9,106.6 L131.9,106.3 L140.5,106.0 L149.0,105.7 L149.0,105.4 L157.6,105.2 L157.6,104.9 L166.1,104.6 L166.1,104.3 L166.1,104.0 L166.1,103.7 L174.7,103.5 L174.7,103.2 L183.3,102.9 L183.3,102.6 L183.3,102.3 L183.3,102.0 L183.3,101.8 L183.3,101.5 L191.8,101.2 L191.8,100.9 L191.8,100.6 L191.8,100.3 L191.8,100.1 L191.8,99.8 L200.4,99.5 L200.4,99.2 L200.4,98.9 L200.4,98.7 L200.4,98.4 L200.4,98.1 L200.4,97.8 L208.9,97.5 L208.9,97.2 L208.9,97.0 L208.9,96.7 L217.5,96.4 L217.5,96.1 L217.5,95.8 L217.5,95.5 L226.1,95.3 L226.1,95.0 L226.1,94.7 L234.6,94.4 L234.6,94.1 L234.6,93.8 L234.6,93.6 L251.7,93.3 L268.8,93.0 L277.4,92.7 L286.0,92.4 L286.0,92.1 L320.2,91.9 L320.2,91.6 L337.3,91.3 L337.3,91.0 L337.3,90.7 L345.9,90.4 L345.9,90.2 L345.9,89.9 L354.4,89.6 L354.4,89.3 L354.4,89.0 L354.4,88.7 L363.0,88.5 L363.0,88.2 L363.0,87.9 L371.5,87.6 L371.5,87.3 L371.5,87.0 L380.1,86.8 L380.1,86.5 L380.1,86.2 L388.7,85.9 L388.7,85.6 L397.2,85.4 L397.2,85.1 L397.2,84.8 L405.8,84.5 L405.8,84.2 L405.8,83.9 L414.3,83.7 L414.3,83.4 L414.3,83.1 L414.3,82.8 L414.3,82.5 L422.9,82.2 L422.9,82.0 L422.9,81.7 L431.5,81.4 L431.5,81.1 L448.6,80.8 L448.6,80.5 L448.6,80.3 L457.1,80.0 L457.1,79.7 L465.7,79.4 L465.7,79.1 L465.7,78.8 L465.7,78.6 L474.3,78.3 L474.3,78.0 L474.3,77.7 L482.8,77.4 L482.8,77.1 L482.8,76.9 L482.8,76.6 L482.8,76.3 L482.8,76.0 L491.4,75.7 L491.4,75.4 L499.9,75.2 L499.9,74.9 L508.5,74.6 L508.5,74.3 L517.0,74.0 L517.0,73.7 L517.0,73.5 L534.2,73.2 L551.3,72.9 L568.4,72.6 L568.4,72.3 L568.4,72.1 L602.6,71.8 L611.2,71.5 L619.7,71.2 L619.7,70.9 L619.7,70.6 L628.3,70.4 L628.3,70.1 L628.3,69.8 L628.3,69.5 L636.9,69.2 L636.9,68.9 L636.9,68.7 L636.9,68.4 L645.4,68.1 L654.0,67.8 L662.5,67.5 L671.1,67.2 L671.1,67.0 L671.1,66.7 L671.1,66.4 L671.1,66.1 L679.7,65.8 L679.7,65.5 L679.7,65.3 L688.2,65.0 L688.2,64.7 L696.8,64.4 L696.8,64.1 L696.8,63.8 L696.8,63.6 L696.8,63.3 L705.3,63.0 L705.3,62.7 L705.3,62.4 L705.3,62.1 L722.5,61.9 L722.5,61.6 L731.0,61.3 L731.0,61.0 L731.0,60.7 L731.0,60.5 L748.1,60.2 L748.1,59.9 L748.1,59.6 L748.1,59.3 L756.7,59.0 L756.7,58.8 L756.7,58.5 L765.2,58.2 L765.2,57.9 L765.2,57.6 L765.2,57.3 L765.2,57.1 L773.8,56.8 L773.8,56.5 L773.8,56.2 L782.4,55.9 L782.4,55.6 L799.5,55.4 L799.5,55.1 L799.5,54.8 L808.0,54.5 L808.0,54.2 L816.6,53.9 L842.3,53.7 L842.3,53.4 L850.8,53.1 L859.4,52.8 L893.6,52.5 L902.2,52.2 L910.7,52.0 L919.3,51.7 L927.9,51.4 L945.0,51.1 L945.0,50.8 L970.6,50.5 L970.6,50.3 L1022.0,50.0 L1022.0,49.7 L1022.0,49.4 L1022.0,49.1 L1022.0,48.8 L1022.0,48.6 L1022.0,48.3 L1022.0,48.0" fill="none" stroke="#e06c75" stroke-width="2" opacity="1"/>
|
||
<rect x="792" y="49" width="14" height="3" fill="#e06c75"/>
|
||
<text x="812" y="56" fill="#cdd3e0" font-size="12">Ink (1350 scrolls)</text>
|
||
<path d="M80.6,429.7 L80.6,429.4 L80.6,429.2 L80.6,428.9 L80.6,428.6 L80.6,428.3 L80.6,428.0 L80.6,427.7 L80.6,427.5 L80.6,427.2 L80.6,426.9 L80.6,426.6 L80.6,426.3 L80.6,426.0 L80.6,425.8 L80.6,425.5 L80.6,425.2 L80.6,424.9 L80.6,424.6 L80.6,424.3 L80.6,424.1 L80.6,423.8 L80.6,423.5 L80.6,423.2 L80.6,422.9 L80.6,422.6 L80.6,422.4 L80.6,422.1 L80.6,421.8 L80.6,421.5 L80.6,421.2 L80.6,420.9 L80.6,420.7 L80.6,420.4 L80.6,420.1 L80.6,419.8 L89.1,419.5 L89.1,419.2 L89.1,419.0 L89.1,418.7 L89.1,418.4 L89.1,418.1 L89.1,417.8 L89.1,417.5 L89.1,417.3 L89.1,417.0 L89.1,416.7 L89.1,416.4 L89.1,416.1 L89.1,415.9 L89.1,415.6 L89.1,415.3 L89.1,415.0 L89.1,414.7 L89.1,414.4 L89.1,414.2 L89.1,413.9 L89.1,413.6 L89.1,413.3 L89.1,413.0 L89.1,412.7 L89.1,412.5 L89.1,412.2 L89.1,411.9 L89.1,411.6 L89.1,411.3 L89.1,411.0 L89.1,410.8 L89.1,410.5 L89.1,410.2 L89.1,409.9 L89.1,409.6 L89.1,409.3 L89.1,409.1 L89.1,408.8 L89.1,408.5 L89.1,408.2 L89.1,407.9 L89.1,407.6 L89.1,407.4 L89.1,407.1 L89.1,406.8 L89.1,406.5 L89.1,406.2 L89.1,405.9 L89.1,405.7 L89.1,405.4 L89.1,405.1 L89.1,404.8 L89.1,404.5 L89.1,404.3 L89.1,404.0 L89.1,403.7 L89.1,403.4 L89.1,403.1 L89.1,402.8 L89.1,402.6 L89.1,402.3 L89.1,402.0 L89.1,401.7 L89.1,401.4 L89.1,401.1 L89.1,400.9 L89.1,400.6 L89.1,400.3 L89.1,400.0 L89.1,399.7 L89.1,399.4 L89.1,399.2 L89.1,398.9 L89.1,398.6 L89.1,398.3 L89.1,398.0 L89.1,397.7 L89.1,397.5 L89.1,397.2 L89.1,396.9 L89.1,396.6 L89.1,396.3 L89.1,396.0 L89.1,395.8 L89.1,395.5 L89.1,395.2 L89.1,394.9 L89.1,394.6 L89.1,394.3 L89.1,394.1 L89.1,393.8 L89.1,393.5 L89.1,393.2 L89.1,392.9 L89.1,392.6 L89.1,392.4 L89.1,392.1 L89.1,391.8 L89.1,391.5 L89.1,391.2 L89.1,391.0 L89.1,390.7 L89.1,390.4 L89.1,390.1 L89.1,389.8 L89.1,389.5 L89.1,389.3 L89.1,389.0 L89.1,388.7 L89.1,388.4 L89.1,388.1 L89.1,387.8 L89.1,387.6 L89.1,387.3 L89.1,387.0 L89.1,386.7 L89.1,386.4 L89.1,386.1 L89.1,385.9 L89.1,385.6 L89.1,385.3 L89.1,385.0 L89.1,384.7 L89.1,384.4 L89.1,384.2 L89.1,383.9 L89.1,383.6 L89.1,383.3 L89.1,383.0 L89.1,382.7 L89.1,382.5 L89.1,382.2 L89.1,381.9 L89.1,381.6 L89.1,381.3 L89.1,381.0 L89.1,380.8 L89.1,380.5 L89.1,380.2 L89.1,379.9 L89.1,379.6 L89.1,379.3 L89.1,379.1 L89.1,378.8 L89.1,378.5 L89.1,378.2 L89.1,377.9 L89.1,377.7 L89.1,377.4 L89.1,377.1 L89.1,376.8 L89.1,376.5 L89.1,376.2 L89.1,376.0 L89.1,375.7 L89.1,375.4 L89.1,375.1 L89.1,374.8 L89.1,374.5 L89.1,374.3 L89.1,374.0 L89.1,373.7 L89.1,373.4 L89.1,373.1 L89.1,372.8 L89.1,372.6 L89.1,372.3 L89.1,372.0 L89.1,371.7 L89.1,371.4 L89.1,371.1 L89.1,370.9 L89.1,370.6 L89.1,370.3 L89.1,370.0 L89.1,369.7 L89.1,369.4 L89.1,369.2 L89.1,368.9 L89.1,368.6 L89.1,368.3 L89.1,368.0 L89.1,367.7 L89.1,367.5 L89.1,367.2 L89.1,366.9 L89.1,366.6 L89.1,366.3 L89.1,366.1 L89.1,365.8 L89.1,365.5 L89.1,365.2 L89.1,364.9 L89.1,364.6 L89.1,364.4 L89.1,364.1 L89.1,363.8 L89.1,363.5 L89.1,363.2 L89.1,362.9 L89.1,362.7 L89.1,362.4 L89.1,362.1 L89.1,361.8 L89.1,361.5 L89.1,361.2 L89.1,361.0 L89.1,360.7 L89.1,360.4 L89.1,360.1 L89.1,359.8 L89.1,359.5 L89.1,359.3 L89.1,359.0 L89.1,358.7 L89.1,358.4 L89.1,358.1 L89.1,357.8 L89.1,357.6 L89.1,357.3 L89.1,357.0 L89.1,356.7 L89.1,356.4 L89.1,356.1 L89.1,355.9 L89.1,355.6 L89.1,355.3 L89.1,355.0 L89.1,354.7 L89.1,354.4 L89.1,354.2 L89.1,353.9 L89.1,353.6 L89.1,353.3 L89.1,353.0 L89.1,352.8 L89.1,352.5 L89.1,352.2 L89.1,351.9 L89.1,351.6 L89.1,351.3 L89.1,351.1 L89.1,350.8 L89.1,350.5 L89.1,350.2 L89.1,349.9 L89.1,349.6 L89.1,349.4 L89.1,349.1 L89.1,348.8 L89.1,348.5 L89.1,348.2 L89.1,347.9 L89.1,347.7 L89.1,347.4 L89.1,347.1 L89.1,346.8 L89.1,346.5 L89.1,346.2 L89.1,346.0 L89.1,345.7 L89.1,345.4 L89.1,345.1 L89.1,344.8 L89.1,344.5 L89.1,344.3 L89.1,344.0 L89.1,343.7 L89.1,343.4 L89.1,343.1 L89.1,342.8 L89.1,342.6 L89.1,342.3 L89.1,342.0 L89.1,341.7 L89.1,341.4 L89.1,341.1 L89.1,340.9 L89.1,340.6 L89.1,340.3 L89.1,340.0 L89.1,339.7 L89.1,339.5 L89.1,339.2 L89.1,338.9 L89.1,338.6 L89.1,338.3 L89.1,338.0 L89.1,337.8 L89.1,337.5 L89.1,337.2 L89.1,336.9 L89.1,336.6 L89.1,336.3 L89.1,336.1 L89.1,335.8 L89.1,335.5 L89.1,335.2 L89.1,334.9 L89.1,334.6 L89.1,334.4 L89.1,334.1 L89.1,333.8 L89.1,333.5 L89.1,333.2 L89.1,332.9 L89.1,332.7 L89.1,332.4 L89.1,332.1 L89.1,331.8 L89.1,331.5 L89.1,331.2 L89.1,331.0 L89.1,330.7 L89.1,330.4 L89.1,330.1 L89.1,329.8 L89.1,329.5 L89.1,329.3 L89.1,329.0 L89.1,328.7 L89.1,328.4 L89.1,328.1 L89.1,327.9 L89.1,327.6 L89.1,327.3 L89.1,327.0 L89.1,326.7 L89.1,326.4 L89.1,326.2 L89.1,325.9 L89.1,325.6 L89.1,325.3 L89.1,325.0 L89.1,324.7 L89.1,324.5 L89.1,324.2 L89.1,323.9 L89.1,323.6 L89.1,323.3 L89.1,323.0 L89.1,322.8 L89.1,322.5 L89.1,322.2 L89.1,321.9 L89.1,321.6 L89.1,321.3 L89.1,321.1 L89.1,320.8 L89.1,320.5 L89.1,320.2 L89.1,319.9 L89.1,319.6 L89.1,319.4 L89.1,319.1 L89.1,318.8 L89.1,318.5 L89.1,318.2 L89.1,317.9 L89.1,317.7 L89.1,317.4 L89.1,317.1 L89.1,316.8 L89.1,316.5 L89.1,316.2 L89.1,316.0 L89.1,315.7 L89.1,315.4 L89.1,315.1 L89.1,314.8 L89.1,314.6 L89.1,314.3 L89.1,314.0 L89.1,313.7 L89.1,313.4 L89.1,313.1 L89.1,312.9 L89.1,312.6 L89.1,312.3 L89.1,312.0 L89.1,311.7 L89.1,311.4 L89.1,311.2 L89.1,310.9 L89.1,310.6 L89.1,310.3 L89.1,310.0 L89.1,309.7 L89.1,309.5 L89.1,309.2 L89.1,308.9 L89.1,308.6 L89.1,308.3 L89.1,308.0 L89.1,307.8 L89.1,307.5 L89.1,307.2 L89.1,306.9 L89.1,306.6 L89.1,306.3 L89.1,306.1 L89.1,305.8 L89.1,305.5 L89.1,305.2 L89.1,304.9 L89.1,304.6 L89.1,304.4 L89.1,304.1 L89.1,303.8 L89.1,303.5 L89.1,303.2 L89.1,302.9 L89.1,302.7 L89.1,302.4 L89.1,302.1 L89.1,301.8 L89.1,301.5 L89.1,301.3 L89.1,301.0 L89.1,300.7 L89.1,300.4 L89.1,300.1 L89.1,299.8 L89.1,299.6 L89.1,299.3 L89.1,299.0 L89.1,298.7 L89.1,298.4 L89.1,298.1 L89.1,297.9 L89.1,297.6 L89.1,297.3 L89.1,297.0 L89.1,296.7 L89.1,296.4 L89.1,296.2 L89.1,295.9 L89.1,295.6 L89.1,295.3 L89.1,295.0 L89.1,294.7 L89.1,294.5 L89.1,294.2 L89.1,293.9 L89.1,293.6 L89.1,293.3 L89.1,293.0 L89.1,292.8 L89.1,292.5 L89.1,292.2 L89.1,291.9 L89.1,291.6 L89.1,291.3 L89.1,291.1 L89.1,290.8 L89.1,290.5 L89.1,290.2 L89.1,289.9 L89.1,289.7 L89.1,289.4 L89.1,289.1 L89.1,288.8 L89.1,288.5 L89.1,288.2 L89.1,288.0 L89.1,287.7 L89.1,287.4 L89.1,287.1 L89.1,286.8 L89.1,286.5 L89.1,286.3 L89.1,286.0 L89.1,285.7 L89.1,285.4 L89.1,285.1 L89.1,284.8 L89.1,284.6 L89.1,284.3 L89.1,284.0 L89.1,283.7 L89.1,283.4 L89.1,283.1 L89.1,282.9 L89.1,282.6 L89.1,282.3 L89.1,282.0 L89.1,281.7 L89.1,281.4 L89.1,281.2 L89.1,280.9 L89.1,280.6 L89.1,280.3 L89.1,280.0 L89.1,279.7 L89.1,279.5 L89.1,279.2 L89.1,278.9 L89.1,278.6 L89.1,278.3 L89.1,278.0 L89.1,277.8 L89.1,277.5 L89.1,277.2 L89.1,276.9 L89.1,276.6 L89.1,276.4 L89.1,276.1 L89.1,275.8 L89.1,275.5 L89.1,275.2 L89.1,274.9 L89.1,274.7 L89.1,274.4 L89.1,274.1 L89.1,273.8 L89.1,273.5 L89.1,273.2 L89.1,273.0 L89.1,272.7 L89.1,272.4 L89.1,272.1 L89.1,271.8 L89.1,271.5 L89.1,271.3 L89.1,271.0 L89.1,270.7 L89.1,270.4 L89.1,270.1 L89.1,269.8 L89.1,269.6 L89.1,269.3 L89.1,269.0 L89.1,268.7 L89.1,268.4 L89.1,268.1 L89.1,267.9 L89.1,267.6 L89.1,267.3 L89.1,267.0 L89.1,266.7 L89.1,266.4 L89.1,266.2 L89.1,265.9 L89.1,265.6 L89.1,265.3 L89.1,265.0 L89.1,264.7 L89.1,264.5 L89.1,264.2 L89.1,263.9 L89.1,263.6 L89.1,263.3 L89.1,263.1 L89.1,262.8 L89.1,262.5 L89.1,262.2 L89.1,261.9 L89.1,261.6 L89.1,261.4 L89.1,261.1 L89.1,260.8 L89.1,260.5 L89.1,260.2 L89.1,259.9 L89.1,259.7 L89.1,259.4 L89.1,259.1 L89.1,258.8 L89.1,258.5 L89.1,258.2 L89.1,258.0 L89.1,257.7 L89.1,257.4 L89.1,257.1 L89.1,256.8 L89.1,256.5 L89.1,256.3 L89.1,256.0 L89.1,255.7 L89.1,255.4 L89.1,255.1 L89.1,254.8 L89.1,254.6 L89.1,254.3 L89.1,254.0 L89.1,253.7 L89.1,253.4 L89.1,253.1 L89.1,252.9 L89.1,252.6 L89.1,252.3 L89.1,252.0 L89.1,251.7 L89.1,251.5 L89.1,251.2 L89.1,250.9 L89.1,250.6 L89.1,250.3 L89.1,250.0 L89.1,249.8 L89.1,249.5 L89.1,249.2 L89.1,248.9 L89.1,248.6 L89.1,248.3 L89.1,248.1 L89.1,247.8 L89.1,247.5 L89.1,247.2 L89.1,246.9 L89.1,246.6 L89.1,246.4 L89.1,246.1 L89.1,245.8 L89.1,245.5 L89.1,245.2 L89.1,244.9 L89.1,244.7 L89.1,244.4 L89.1,244.1 L89.1,243.8 L89.1,243.5 L89.1,243.2 L89.1,243.0 L89.1,242.7 L89.1,242.4 L89.1,242.1 L89.1,241.8 L89.1,241.5 L89.1,241.3 L89.1,241.0 L89.1,240.7 L89.1,240.4 L89.1,240.1 L89.1,239.8 L89.1,239.6 L89.1,239.3 L89.1,239.0 L89.1,238.7 L89.1,238.4 L89.1,238.2 L89.1,237.9 L89.1,237.6 L89.1,237.3 L89.1,237.0 L89.1,236.7 L89.1,236.5 L89.1,236.2 L89.1,235.9 L89.1,235.6 L89.1,235.3 L89.1,235.0 L89.1,234.8 L89.1,234.5 L89.1,234.2 L89.1,233.9 L89.1,233.6 L89.1,233.3 L89.1,233.1 L89.1,232.8 L89.1,232.5 L89.1,232.2 L89.1,231.9 L89.1,231.6 L89.1,231.4 L89.1,231.1 L89.1,230.8 L89.1,230.5 L89.1,230.2 L89.1,229.9 L89.1,229.7 L89.1,229.4 L89.1,229.1 L89.1,228.8 L89.1,228.5 L89.1,228.2 L89.1,228.0 L89.1,227.7 L89.1,227.4 L89.1,227.1 L89.1,226.8 L89.1,226.5 L89.1,226.3 L89.1,226.0 L89.1,225.7 L89.1,225.4 L89.1,225.1 L89.1,224.9 L89.1,224.6 L89.1,224.3 L89.1,224.0 L89.1,223.7 L89.1,223.4 L89.1,223.2 L89.1,222.9 L89.1,222.6 L89.1,222.3 L89.1,222.0 L89.1,221.7 L89.1,221.5 L89.1,221.2 L89.1,220.9 L89.1,220.6 L89.1,220.3 L89.1,220.0 L89.1,219.8 L89.1,219.5 L89.1,219.2 L89.1,218.9 L89.1,218.6 L89.1,218.3 L89.1,218.1 L89.1,217.8 L89.1,217.5 L89.1,217.2 L89.1,216.9 L89.1,216.6 L89.1,216.4 L89.1,216.1 L89.1,215.8 L89.1,215.5 L89.1,215.2 L89.1,214.9 L89.1,214.7 L89.1,214.4 L89.1,214.1 L89.1,213.8 L89.1,213.5 L89.1,213.3 L89.1,213.0 L89.1,212.7 L89.1,212.4 L89.1,212.1 L89.1,211.8 L89.1,211.6 L89.1,211.3 L89.1,211.0 L89.1,210.7 L89.1,210.4 L89.1,210.1 L89.1,209.9 L89.1,209.6 L89.1,209.3 L89.1,209.0 L89.1,208.7 L89.1,208.4 L89.1,208.2 L89.1,207.9 L89.1,207.6 L89.1,207.3 L89.1,207.0 L89.1,206.7 L89.1,206.5 L89.1,206.2 L89.1,205.9 L89.1,205.6 L89.1,205.3 L89.1,205.0 L89.1,204.8 L89.1,204.5 L89.1,204.2 L89.1,203.9 L89.1,203.6 L89.1,203.3 L89.1,203.1 L89.1,202.8 L89.1,202.5 L89.1,202.2 L89.1,201.9 L89.1,201.6 L89.1,201.4 L89.1,201.1 L89.1,200.8 L89.1,200.5 L89.1,200.2 L89.1,200.0 L89.1,199.7 L89.1,199.4 L89.1,199.1 L89.1,198.8 L89.1,198.5 L89.1,198.3 L89.1,198.0 L89.1,197.7 L89.1,197.4 L89.1,197.1 L89.1,196.8 L89.1,196.6 L89.1,196.3 L89.1,196.0 L89.1,195.7 L89.1,195.4 L89.1,195.1 L89.1,194.9 L89.1,194.6 L89.1,194.3 L89.1,194.0 L89.1,193.7 L89.1,193.4 L89.1,193.2 L89.1,192.9 L89.1,192.6 L89.1,192.3 L89.1,192.0 L89.1,191.7 L89.1,191.5 L89.1,191.2 L89.1,190.9 L89.1,190.6 L89.1,190.3 L89.1,190.0 L89.1,189.8 L89.1,189.5 L89.1,189.2 L89.1,188.9 L89.1,188.6 L89.1,188.3 L89.1,188.1 L89.1,187.8 L89.1,187.5 L89.1,187.2 L89.1,186.9 L89.1,186.7 L89.1,186.4 L89.1,186.1 L89.1,185.8 L89.1,185.5 L89.1,185.2 L89.1,185.0 L89.1,184.7 L89.1,184.4 L89.1,184.1 L89.1,183.8 L97.7,183.5 L97.7,183.3 L97.7,183.0 L97.7,182.7 L97.7,182.4 L97.7,182.1 L97.7,181.8 L97.7,181.6 L97.7,181.3 L97.7,181.0 L97.7,180.7 L97.7,180.4 L97.7,180.1 L97.7,179.9 L97.7,179.6 L97.7,179.3 L97.7,179.0 L97.7,178.7 L97.7,178.4 L97.7,178.2 L97.7,177.9 L97.7,177.6 L97.7,177.3 L97.7,177.0 L97.7,176.7 L97.7,176.5 L97.7,176.2 L97.7,175.9 L97.7,175.6 L97.7,175.3 L97.7,175.1 L97.7,174.8 L97.7,174.5 L97.7,174.2 L97.7,173.9 L97.7,173.6 L97.7,173.4 L97.7,173.1 L97.7,172.8 L97.7,172.5 L97.7,172.2 L97.7,171.9 L97.7,171.7 L97.7,171.4 L97.7,171.1 L97.7,170.8 L97.7,170.5 L97.7,170.2 L97.7,170.0 L97.7,169.7 L97.7,169.4 L97.7,169.1 L97.7,168.8 L97.7,168.5 L97.7,168.3 L97.7,168.0 L97.7,167.7 L97.7,167.4 L97.7,167.1 L97.7,166.8 L97.7,166.6 L97.7,166.3 L97.7,166.0 L97.7,165.7 L97.7,165.4 L97.7,165.1 L97.7,164.9 L97.7,164.6 L97.7,164.3 L97.7,164.0 L97.7,163.7 L97.7,163.4 L97.7,163.2 L97.7,162.9 L97.7,162.6 L97.7,162.3 L97.7,162.0 L97.7,161.8 L97.7,161.5 L97.7,161.2 L97.7,160.9 L97.7,160.6 L97.7,160.3 L97.7,160.1 L97.7,159.8 L97.7,159.5 L97.7,159.2 L97.7,158.9 L97.7,158.6 L97.7,158.4 L97.7,158.1 L97.7,157.8 L97.7,157.5 L97.7,157.2 L97.7,156.9 L97.7,156.7 L97.7,156.4 L97.7,156.1 L97.7,155.8 L97.7,155.5 L97.7,155.2 L97.7,155.0 L97.7,154.7 L97.7,154.4 L97.7,154.1 L97.7,153.8 L97.7,153.5 L97.7,153.3 L97.7,153.0 L97.7,152.7 L97.7,152.4 L97.7,152.1 L97.7,151.8 L97.7,151.6 L97.7,151.3 L97.7,151.0 L97.7,150.7 L97.7,150.4 L97.7,150.1 L97.7,149.9 L97.7,149.6 L97.7,149.3 L97.7,149.0 L97.7,148.7 L97.7,148.5 L97.7,148.2 L97.7,147.9 L97.7,147.6 L97.7,147.3 L97.7,147.0 L97.7,146.8 L97.7,146.5 L97.7,146.2 L97.7,145.9 L97.7,145.6 L97.7,145.3 L97.7,145.1 L97.7,144.8 L97.7,144.5 L97.7,144.2 L97.7,143.9 L97.7,143.6 L97.7,143.4 L97.7,143.1 L97.7,142.8 L97.7,142.5 L97.7,142.2 L97.7,141.9 L97.7,141.7 L97.7,141.4 L97.7,141.1 L97.7,140.8 L97.7,140.5 L97.7,140.2 L97.7,140.0 L97.7,139.7 L97.7,139.4 L97.7,139.1 L97.7,138.8 L97.7,138.5 L97.7,138.3 L97.7,138.0 L97.7,137.7 L97.7,137.4 L97.7,137.1 L97.7,136.9 L97.7,136.6 L97.7,136.3 L97.7,136.0 L97.7,135.7 L97.7,135.4 L97.7,135.2 L97.7,134.9 L97.7,134.6 L97.7,134.3 L97.7,134.0 L97.7,133.7 L97.7,133.5 L97.7,133.2 L97.7,132.9 L97.7,132.6 L97.7,132.3 L97.7,132.0 L97.7,131.8 L97.7,131.5 L97.7,131.2 L97.7,130.9 L97.7,130.6 L97.7,130.3 L97.7,130.1 L97.7,129.8 L97.7,129.5 L97.7,129.2 L97.7,128.9 L97.7,128.6 L97.7,128.4 L97.7,128.1 L97.7,127.8 L97.7,127.5 L97.7,127.2 L97.7,126.9 L97.7,126.7 L97.7,126.4 L97.7,126.1 L97.7,125.8 L97.7,125.5 L97.7,125.2 L97.7,125.0 L97.7,124.7 L97.7,124.4 L97.7,124.1 L97.7,123.8 L97.7,123.6 L97.7,123.3 L97.7,123.0 L97.7,122.7 L97.7,122.4 L97.7,122.1 L97.7,121.9 L97.7,121.6 L97.7,121.3 L97.7,121.0 L97.7,120.7 L97.7,120.4 L97.7,120.2 L97.7,119.9 L97.7,119.6 L97.7,119.3 L97.7,119.0 L97.7,118.7 L97.7,118.5 L97.7,118.2 L97.7,117.9 L97.7,117.6 L97.7,117.3 L97.7,117.0 L97.7,116.8 L97.7,116.5 L97.7,116.2 L97.7,115.9 L97.7,115.6 L97.7,115.3 L97.7,115.1 L97.7,114.8 L97.7,114.5 L97.7,114.2 L97.7,113.9 L97.7,113.6 L97.7,113.4 L97.7,113.1 L97.7,112.8 L97.7,112.5 L97.7,112.2 L97.7,111.9 L97.7,111.7 L97.7,111.4 L97.7,111.1 L97.7,110.8 L97.7,110.5 L97.7,110.3 L97.7,110.0 L97.7,109.7 L97.7,109.4 L97.7,109.1 L97.7,108.8 L97.7,108.6 L97.7,108.3 L97.7,108.0 L97.7,107.7 L97.7,107.4 L97.7,107.1 L97.7,106.9 L97.7,106.6 L97.7,106.3 L97.7,106.0 L97.7,105.7 L97.7,105.4 L97.7,105.2 L97.7,104.9 L97.7,104.6 L97.7,104.3 L97.7,104.0 L97.7,103.7 L97.7,103.5 L97.7,103.2 L97.7,102.9 L97.7,102.6 L97.7,102.3 L97.7,102.0 L97.7,101.8 L97.7,101.5 L97.7,101.2 L97.7,100.9 L97.7,100.6 L97.7,100.3 L97.7,100.1 L97.7,99.8 L97.7,99.5 L97.7,99.2 L97.7,98.9 L97.7,98.7 L97.7,98.4 L97.7,98.1 L97.7,97.8 L97.7,97.5 L97.7,97.2 L97.7,97.0 L97.7,96.7 L97.7,96.4 L97.7,96.1 L97.7,95.8 L97.7,95.5 L97.7,95.3 L97.7,95.0 L97.7,94.7 L97.7,94.4 L97.7,94.1 L97.7,93.8 L97.7,93.6 L97.7,93.3 L97.7,93.0 L97.7,92.7 L97.7,92.4 L97.7,92.1 L97.7,91.9 L97.7,91.6 L97.7,91.3 L97.7,91.0 L97.7,90.7 L97.7,90.4 L97.7,90.2 L97.7,89.9 L97.7,89.6 L97.7,89.3 L97.7,89.0 L97.7,88.7 L97.7,88.5 L97.7,88.2 L97.7,87.9 L97.7,87.6 L97.7,87.3 L97.7,87.0 L97.7,86.8 L97.7,86.5 L97.7,86.2 L97.7,85.9 L97.7,85.6 L97.7,85.4 L97.7,85.1 L97.7,84.8 L97.7,84.5 L97.7,84.2 L97.7,83.9 L97.7,83.7 L97.7,83.4 L97.7,83.1 L97.7,82.8 L97.7,82.5 L97.7,82.2 L97.7,82.0 L97.7,81.7 L97.7,81.4 L97.7,81.1 L97.7,80.8 L97.7,80.5 L97.7,80.3 L97.7,80.0 L97.7,79.7 L97.7,79.4 L97.7,79.1 L97.7,78.8 L97.7,78.6 L97.7,78.3 L97.7,78.0 L97.7,77.7 L97.7,77.4 L97.7,77.1 L97.7,76.9 L97.7,76.6 L97.7,76.3 L97.7,76.0 L97.7,75.7 L106.2,75.4 L106.2,75.2 L106.2,74.9 L106.2,74.6 L106.2,74.3 L106.2,74.0 L106.2,73.7 L106.2,73.5 L106.2,73.2 L106.2,72.9 L106.2,72.6 L106.2,72.3 L106.2,72.1 L106.2,71.8 L106.2,71.5 L106.2,71.2 L106.2,70.9 L106.2,70.6 L106.2,70.4 L106.2,70.1 L106.2,69.8 L106.2,69.5 L106.2,69.2 L106.2,68.9 L106.2,68.7 L106.2,68.4 L106.2,68.1 L106.2,67.8 L106.2,67.5 L106.2,67.2 L106.2,67.0 L106.2,66.7 L114.8,66.4 L114.8,66.1 L114.8,65.8 L114.8,65.5 L114.8,65.3 L114.8,65.0 L114.8,64.7 L114.8,64.4 L123.4,64.1 L123.4,63.8 L123.4,63.6 L123.4,63.3 L123.4,63.0 L123.4,62.7 L123.4,62.4 L131.9,62.1 L131.9,61.9 L131.9,61.6 L131.9,61.3 L131.9,61.0 L131.9,60.7 L131.9,60.5 L131.9,60.2 L140.5,59.9 L140.5,59.6 L140.5,59.3 L149.0,59.0 L149.0,58.8 L149.0,58.5 L149.0,58.2 L149.0,57.9 L149.0,57.6 L149.0,57.3 L149.0,57.1 L149.0,56.8 L149.0,56.5 L149.0,56.2 L157.6,55.9 L157.6,55.6 L157.6,55.4 L157.6,55.1 L157.6,54.8 L157.6,54.5 L157.6,54.2 L157.6,53.9 L166.1,53.7 L166.1,53.4 L174.7,53.1 L191.8,52.8 L208.9,52.5 L208.9,52.2 L217.5,52.0 L217.5,51.7 L217.5,51.4 L217.5,51.1 L217.5,50.8 L226.1,50.5 L226.1,50.3 L226.1,50.0 L226.1,49.7 L226.1,49.4 L226.1,49.1 L234.6,48.8 L251.7,48.6 L277.4,48.3 L277.4,48.0" fill="none" stroke="#61afef" stroke-width="2" opacity="1"/>
|
||
<rect x="792" y="67" width="14" height="3" fill="#61afef"/>
|
||
<text x="812" y="74" fill="#cdd3e0" font-size="12">OpenTUI (1350 scrolls)</text>
|
||
<path d="M72.0,429.7 L72.0,429.4 L72.0,429.2 L72.0,428.9 L72.0,428.6 L80.6,428.3 L80.6,428.0 L80.6,427.7 L80.6,427.5 L80.6,427.2 L80.6,426.9 L80.6,426.6 L80.6,426.3 L80.6,426.0 L80.6,425.8 L80.6,425.5 L80.6,425.2 L80.6,424.9 L80.6,424.6 L80.6,424.3 L80.6,424.1 L80.6,423.8 L80.6,423.5 L80.6,423.2 L80.6,422.9 L80.6,422.6 L80.6,422.4 L80.6,422.1 L80.6,421.8 L80.6,421.5 L80.6,421.2 L80.6,420.9 L80.6,420.7 L80.6,420.4 L80.6,420.1 L80.6,419.8 L89.1,419.5 L89.1,419.2 L89.1,419.0 L89.1,418.7 L89.1,418.4 L89.1,418.1 L89.1,417.8 L89.1,417.5 L89.1,417.3 L89.1,417.0 L89.1,416.7 L89.1,416.4 L89.1,416.1 L89.1,415.9 L89.1,415.6 L89.1,415.3 L89.1,415.0 L89.1,414.7 L89.1,414.4 L89.1,414.2 L89.1,413.9 L89.1,413.6 L89.1,413.3 L89.1,413.0 L89.1,412.7 L89.1,412.5 L89.1,412.2 L89.1,411.9 L89.1,411.6 L89.1,411.3 L89.1,411.0 L89.1,410.8 L89.1,410.5 L89.1,410.2 L89.1,409.9 L89.1,409.6 L89.1,409.3 L89.1,409.1 L89.1,408.8 L89.1,408.5 L89.1,408.2 L89.1,407.9 L89.1,407.6 L89.1,407.4 L89.1,407.1 L89.1,406.8 L89.1,406.5 L89.1,406.2 L89.1,405.9 L89.1,405.7 L89.1,405.4 L89.1,405.1 L89.1,404.8 L89.1,404.5 L89.1,404.3 L89.1,404.0 L89.1,403.7 L89.1,403.4 L89.1,403.1 L89.1,402.8 L89.1,402.6 L89.1,402.3 L89.1,402.0 L89.1,401.7 L89.1,401.4 L89.1,401.1 L89.1,400.9 L89.1,400.6 L89.1,400.3 L89.1,400.0 L89.1,399.7 L89.1,399.4 L89.1,399.2 L89.1,398.9 L89.1,398.6 L89.1,398.3 L89.1,398.0 L89.1,397.7 L89.1,397.5 L89.1,397.2 L89.1,396.9 L89.1,396.6 L89.1,396.3 L89.1,396.0 L89.1,395.8 L89.1,395.5 L89.1,395.2 L89.1,394.9 L89.1,394.6 L89.1,394.3 L89.1,394.1 L89.1,393.8 L89.1,393.5 L89.1,393.2 L89.1,392.9 L89.1,392.6 L89.1,392.4 L89.1,392.1 L89.1,391.8 L89.1,391.5 L89.1,391.2 L89.1,391.0 L89.1,390.7 L89.1,390.4 L89.1,390.1 L89.1,389.8 L89.1,389.5 L89.1,389.3 L89.1,389.0 L89.1,388.7 L89.1,388.4 L89.1,388.1 L89.1,387.8 L89.1,387.6 L89.1,387.3 L89.1,387.0 L89.1,386.7 L89.1,386.4 L89.1,386.1 L89.1,385.9 L89.1,385.6 L89.1,385.3 L89.1,385.0 L89.1,384.7 L89.1,384.4 L89.1,384.2 L89.1,383.9 L89.1,383.6 L89.1,383.3 L89.1,383.0 L89.1,382.7 L89.1,382.5 L89.1,382.2 L89.1,381.9 L89.1,381.6 L89.1,381.3 L89.1,381.0 L89.1,380.8 L89.1,380.5 L89.1,380.2 L89.1,379.9 L89.1,379.6 L89.1,379.3 L89.1,379.1 L89.1,378.8 L89.1,378.5 L89.1,378.2 L89.1,377.9 L89.1,377.7 L89.1,377.4 L89.1,377.1 L89.1,376.8 L89.1,376.5 L89.1,376.2 L89.1,376.0 L89.1,375.7 L89.1,375.4 L89.1,375.1 L89.1,374.8 L89.1,374.5 L89.1,374.3 L89.1,374.0 L89.1,373.7 L89.1,373.4 L89.1,373.1 L89.1,372.8 L89.1,372.6 L89.1,372.3 L89.1,372.0 L89.1,371.7 L89.1,371.4 L89.1,371.1 L89.1,370.9 L89.1,370.6 L89.1,370.3 L89.1,370.0 L89.1,369.7 L89.1,369.4 L89.1,369.2 L89.1,368.9 L89.1,368.6 L89.1,368.3 L89.1,368.0 L89.1,367.7 L89.1,367.5 L89.1,367.2 L89.1,366.9 L89.1,366.6 L89.1,366.3 L89.1,366.1 L89.1,365.8 L89.1,365.5 L89.1,365.2 L89.1,364.9 L89.1,364.6 L89.1,364.4 L89.1,364.1 L89.1,363.8 L89.1,363.5 L89.1,363.2 L89.1,362.9 L89.1,362.7 L89.1,362.4 L89.1,362.1 L89.1,361.8 L89.1,361.5 L89.1,361.2 L89.1,361.0 L89.1,360.7 L89.1,360.4 L89.1,360.1 L89.1,359.8 L89.1,359.5 L89.1,359.3 L89.1,359.0 L89.1,358.7 L89.1,358.4 L89.1,358.1 L89.1,357.8 L89.1,357.6 L89.1,357.3 L89.1,357.0 L89.1,356.7 L89.1,356.4 L89.1,356.1 L89.1,355.9 L89.1,355.6 L89.1,355.3 L89.1,355.0 L89.1,354.7 L89.1,354.4 L89.1,354.2 L89.1,353.9 L89.1,353.6 L89.1,353.3 L89.1,353.0 L89.1,352.8 L89.1,352.5 L89.1,352.2 L89.1,351.9 L89.1,351.6 L89.1,351.3 L89.1,351.1 L89.1,350.8 L89.1,350.5 L89.1,350.2 L89.1,349.9 L89.1,349.6 L89.1,349.4 L89.1,349.1 L89.1,348.8 L89.1,348.5 L89.1,348.2 L89.1,347.9 L89.1,347.7 L89.1,347.4 L89.1,347.1 L89.1,346.8 L89.1,346.5 L89.1,346.2 L89.1,346.0 L89.1,345.7 L89.1,345.4 L89.1,345.1 L89.1,344.8 L89.1,344.5 L89.1,344.3 L89.1,344.0 L89.1,343.7 L89.1,343.4 L89.1,343.1 L89.1,342.8 L89.1,342.6 L89.1,342.3 L89.1,342.0 L89.1,341.7 L89.1,341.4 L89.1,341.1 L89.1,340.9 L89.1,340.6 L89.1,340.3 L89.1,340.0 L89.1,339.7 L89.1,339.5 L89.1,339.2 L89.1,338.9 L89.1,338.6 L89.1,338.3 L89.1,338.0 L89.1,337.8 L89.1,337.5 L89.1,337.2 L89.1,336.9 L89.1,336.6 L89.1,336.3 L89.1,336.1 L89.1,335.8 L89.1,335.5 L89.1,335.2 L89.1,334.9 L89.1,334.6 L89.1,334.4 L89.1,334.1 L89.1,333.8 L89.1,333.5 L89.1,333.2 L89.1,332.9 L89.1,332.7 L89.1,332.4 L89.1,332.1 L89.1,331.8 L89.1,331.5 L89.1,331.2 L89.1,331.0 L89.1,330.7 L89.1,330.4 L89.1,330.1 L89.1,329.8 L89.1,329.5 L89.1,329.3 L89.1,329.0 L89.1,328.7 L89.1,328.4 L89.1,328.1 L89.1,327.9 L89.1,327.6 L89.1,327.3 L89.1,327.0 L89.1,326.7 L89.1,326.4 L89.1,326.2 L89.1,325.9 L89.1,325.6 L89.1,325.3 L89.1,325.0 L89.1,324.7 L89.1,324.5 L89.1,324.2 L89.1,323.9 L89.1,323.6 L89.1,323.3 L89.1,323.0 L89.1,322.8 L89.1,322.5 L89.1,322.2 L89.1,321.9 L89.1,321.6 L89.1,321.3 L89.1,321.1 L89.1,320.8 L89.1,320.5 L89.1,320.2 L89.1,319.9 L89.1,319.6 L89.1,319.4 L89.1,319.1 L89.1,318.8 L89.1,318.5 L89.1,318.2 L89.1,317.9 L89.1,317.7 L89.1,317.4 L89.1,317.1 L89.1,316.8 L89.1,316.5 L89.1,316.2 L89.1,316.0 L89.1,315.7 L89.1,315.4 L89.1,315.1 L89.1,314.8 L89.1,314.6 L89.1,314.3 L89.1,314.0 L89.1,313.7 L89.1,313.4 L89.1,313.1 L89.1,312.9 L89.1,312.6 L89.1,312.3 L89.1,312.0 L89.1,311.7 L89.1,311.4 L89.1,311.2 L89.1,310.9 L89.1,310.6 L89.1,310.3 L89.1,310.0 L89.1,309.7 L89.1,309.5 L89.1,309.2 L89.1,308.9 L89.1,308.6 L89.1,308.3 L89.1,308.0 L89.1,307.8 L89.1,307.5 L89.1,307.2 L89.1,306.9 L89.1,306.6 L89.1,306.3 L89.1,306.1 L89.1,305.8 L89.1,305.5 L89.1,305.2 L89.1,304.9 L89.1,304.6 L89.1,304.4 L89.1,304.1 L89.1,303.8 L89.1,303.5 L89.1,303.2 L89.1,302.9 L89.1,302.7 L89.1,302.4 L89.1,302.1 L89.1,301.8 L89.1,301.5 L89.1,301.3 L89.1,301.0 L89.1,300.7 L89.1,300.4 L89.1,300.1 L89.1,299.8 L89.1,299.6 L89.1,299.3 L89.1,299.0 L89.1,298.7 L89.1,298.4 L89.1,298.1 L89.1,297.9 L89.1,297.6 L89.1,297.3 L89.1,297.0 L89.1,296.7 L89.1,296.4 L89.1,296.2 L89.1,295.9 L89.1,295.6 L89.1,295.3 L89.1,295.0 L89.1,294.7 L89.1,294.5 L89.1,294.2 L89.1,293.9 L89.1,293.6 L89.1,293.3 L89.1,293.0 L89.1,292.8 L89.1,292.5 L89.1,292.2 L89.1,291.9 L89.1,291.6 L89.1,291.3 L89.1,291.1 L89.1,290.8 L89.1,290.5 L89.1,290.2 L89.1,289.9 L89.1,289.7 L89.1,289.4 L89.1,289.1 L89.1,288.8 L89.1,288.5 L89.1,288.2 L89.1,288.0 L89.1,287.7 L89.1,287.4 L89.1,287.1 L89.1,286.8 L89.1,286.5 L89.1,286.3 L89.1,286.0 L89.1,285.7 L89.1,285.4 L89.1,285.1 L89.1,284.8 L89.1,284.6 L89.1,284.3 L89.1,284.0 L89.1,283.7 L89.1,283.4 L89.1,283.1 L89.1,282.9 L89.1,282.6 L89.1,282.3 L89.1,282.0 L89.1,281.7 L89.1,281.4 L89.1,281.2 L89.1,280.9 L89.1,280.6 L89.1,280.3 L89.1,280.0 L89.1,279.7 L89.1,279.5 L89.1,279.2 L89.1,278.9 L89.1,278.6 L89.1,278.3 L89.1,278.0 L89.1,277.8 L89.1,277.5 L89.1,277.2 L89.1,276.9 L89.1,276.6 L89.1,276.4 L89.1,276.1 L89.1,275.8 L89.1,275.5 L89.1,275.2 L89.1,274.9 L89.1,274.7 L89.1,274.4 L89.1,274.1 L89.1,273.8 L89.1,273.5 L89.1,273.2 L89.1,273.0 L89.1,272.7 L89.1,272.4 L89.1,272.1 L89.1,271.8 L89.1,271.5 L89.1,271.3 L89.1,271.0 L89.1,270.7 L89.1,270.4 L89.1,270.1 L89.1,269.8 L89.1,269.6 L89.1,269.3 L89.1,269.0 L89.1,268.7 L89.1,268.4 L89.1,268.1 L89.1,267.9 L89.1,267.6 L89.1,267.3 L89.1,267.0 L89.1,266.7 L89.1,266.4 L89.1,266.2 L89.1,265.9 L89.1,265.6 L89.1,265.3 L89.1,265.0 L89.1,264.7 L89.1,264.5 L89.1,264.2 L89.1,263.9 L89.1,263.6 L89.1,263.3 L89.1,263.1 L89.1,262.8 L89.1,262.5 L89.1,262.2 L89.1,261.9 L89.1,261.6 L89.1,261.4 L89.1,261.1 L89.1,260.8 L89.1,260.5 L89.1,260.2 L89.1,259.9 L89.1,259.7 L89.1,259.4 L89.1,259.1 L89.1,258.8 L89.1,258.5 L89.1,258.2 L89.1,258.0 L89.1,257.7 L89.1,257.4 L89.1,257.1 L89.1,256.8 L89.1,256.5 L89.1,256.3 L89.1,256.0 L89.1,255.7 L89.1,255.4 L89.1,255.1 L89.1,254.8 L89.1,254.6 L89.1,254.3 L89.1,254.0 L89.1,253.7 L89.1,253.4 L89.1,253.1 L89.1,252.9 L89.1,252.6 L89.1,252.3 L89.1,252.0 L89.1,251.7 L89.1,251.5 L89.1,251.2 L89.1,250.9 L89.1,250.6 L89.1,250.3 L89.1,250.0 L89.1,249.8 L89.1,249.5 L89.1,249.2 L89.1,248.9 L89.1,248.6 L89.1,248.3 L89.1,248.1 L89.1,247.8 L89.1,247.5 L89.1,247.2 L89.1,246.9 L89.1,246.6 L89.1,246.4 L89.1,246.1 L89.1,245.8 L89.1,245.5 L89.1,245.2 L89.1,244.9 L89.1,244.7 L89.1,244.4 L89.1,244.1 L89.1,243.8 L89.1,243.5 L89.1,243.2 L89.1,243.0 L89.1,242.7 L89.1,242.4 L89.1,242.1 L89.1,241.8 L89.1,241.5 L89.1,241.3 L89.1,241.0 L89.1,240.7 L89.1,240.4 L89.1,240.1 L89.1,239.8 L89.1,239.6 L89.1,239.3 L89.1,239.0 L89.1,238.7 L89.1,238.4 L89.1,238.2 L89.1,237.9 L89.1,237.6 L89.1,237.3 L89.1,237.0 L89.1,236.7 L89.1,236.5 L89.1,236.2 L89.1,235.9 L89.1,235.6 L89.1,235.3 L89.1,235.0 L89.1,234.8 L89.1,234.5 L89.1,234.2 L89.1,233.9 L89.1,233.6 L89.1,233.3 L89.1,233.1 L89.1,232.8 L89.1,232.5 L89.1,232.2 L89.1,231.9 L89.1,231.6 L89.1,231.4 L89.1,231.1 L89.1,230.8 L89.1,230.5 L89.1,230.2 L89.1,229.9 L89.1,229.7 L89.1,229.4 L89.1,229.1 L89.1,228.8 L89.1,228.5 L89.1,228.2 L89.1,228.0 L89.1,227.7 L89.1,227.4 L89.1,227.1 L89.1,226.8 L89.1,226.5 L89.1,226.3 L89.1,226.0 L89.1,225.7 L89.1,225.4 L89.1,225.1 L89.1,224.9 L89.1,224.6 L89.1,224.3 L89.1,224.0 L89.1,223.7 L89.1,223.4 L89.1,223.2 L89.1,222.9 L89.1,222.6 L89.1,222.3 L89.1,222.0 L89.1,221.7 L89.1,221.5 L89.1,221.2 L89.1,220.9 L89.1,220.6 L89.1,220.3 L89.1,220.0 L89.1,219.8 L89.1,219.5 L89.1,219.2 L89.1,218.9 L89.1,218.6 L89.1,218.3 L89.1,218.1 L89.1,217.8 L89.1,217.5 L89.1,217.2 L89.1,216.9 L89.1,216.6 L89.1,216.4 L89.1,216.1 L89.1,215.8 L89.1,215.5 L89.1,215.2 L89.1,214.9 L89.1,214.7 L89.1,214.4 L89.1,214.1 L89.1,213.8 L89.1,213.5 L89.1,213.3 L89.1,213.0 L89.1,212.7 L89.1,212.4 L89.1,212.1 L89.1,211.8 L89.1,211.6 L89.1,211.3 L89.1,211.0 L89.1,210.7 L89.1,210.4 L89.1,210.1 L89.1,209.9 L89.1,209.6 L89.1,209.3 L97.7,209.0 L97.7,208.7 L97.7,208.4 L97.7,208.2 L97.7,207.9 L97.7,207.6 L97.7,207.3 L97.7,207.0 L97.7,206.7 L97.7,206.5 L97.7,206.2 L97.7,205.9 L97.7,205.6 L97.7,205.3 L97.7,205.0 L97.7,204.8 L97.7,204.5 L97.7,204.2 L97.7,203.9 L97.7,203.6 L97.7,203.3 L97.7,203.1 L97.7,202.8 L97.7,202.5 L97.7,202.2 L97.7,201.9 L97.7,201.6 L97.7,201.4 L97.7,201.1 L97.7,200.8 L97.7,200.5 L97.7,200.2 L97.7,200.0 L97.7,199.7 L97.7,199.4 L97.7,199.1 L97.7,198.8 L97.7,198.5 L97.7,198.3 L97.7,198.0 L97.7,197.7 L97.7,197.4 L97.7,197.1 L97.7,196.8 L97.7,196.6 L97.7,196.3 L97.7,196.0 L97.7,195.7 L97.7,195.4 L97.7,195.1 L97.7,194.9 L97.7,194.6 L97.7,194.3 L97.7,194.0 L97.7,193.7 L97.7,193.4 L97.7,193.2 L97.7,192.9 L97.7,192.6 L97.7,192.3 L97.7,192.0 L97.7,191.7 L97.7,191.5 L97.7,191.2 L97.7,190.9 L97.7,190.6 L97.7,190.3 L97.7,190.0 L97.7,189.8 L97.7,189.5 L97.7,189.2 L97.7,188.9 L97.7,188.6 L97.7,188.3 L97.7,188.1 L97.7,187.8 L97.7,187.5 L97.7,187.2 L97.7,186.9 L97.7,186.7 L97.7,186.4 L97.7,186.1 L97.7,185.8 L97.7,185.5 L97.7,185.2 L97.7,185.0 L97.7,184.7 L97.7,184.4 L97.7,184.1 L97.7,183.8 L97.7,183.5 L97.7,183.3 L97.7,183.0 L97.7,182.7 L97.7,182.4 L97.7,182.1 L97.7,181.8 L97.7,181.6 L97.7,181.3 L97.7,181.0 L97.7,180.7 L97.7,180.4 L97.7,180.1 L97.7,179.9 L97.7,179.6 L97.7,179.3 L97.7,179.0 L97.7,178.7 L97.7,178.4 L97.7,178.2 L97.7,177.9 L97.7,177.6 L97.7,177.3 L97.7,177.0 L97.7,176.7 L97.7,176.5 L97.7,176.2 L97.7,175.9 L97.7,175.6 L97.7,175.3 L97.7,175.1 L97.7,174.8 L97.7,174.5 L97.7,174.2 L97.7,173.9 L97.7,173.6 L97.7,173.4 L97.7,173.1 L97.7,172.8 L97.7,172.5 L97.7,172.2 L97.7,171.9 L97.7,171.7 L97.7,171.4 L97.7,171.1 L97.7,170.8 L97.7,170.5 L97.7,170.2 L97.7,170.0 L97.7,169.7 L97.7,169.4 L97.7,169.1 L97.7,168.8 L97.7,168.5 L97.7,168.3 L97.7,168.0 L97.7,167.7 L97.7,167.4 L97.7,167.1 L97.7,166.8 L97.7,166.6 L97.7,166.3 L97.7,166.0 L97.7,165.7 L97.7,165.4 L97.7,165.1 L97.7,164.9 L97.7,164.6 L97.7,164.3 L97.7,164.0 L97.7,163.7 L97.7,163.4 L97.7,163.2 L97.7,162.9 L97.7,162.6 L97.7,162.3 L97.7,162.0 L97.7,161.8 L97.7,161.5 L97.7,161.2 L97.7,160.9 L97.7,160.6 L97.7,160.3 L97.7,160.1 L97.7,159.8 L97.7,159.5 L97.7,159.2 L97.7,158.9 L97.7,158.6 L97.7,158.4 L97.7,158.1 L97.7,157.8 L97.7,157.5 L97.7,157.2 L97.7,156.9 L97.7,156.7 L97.7,156.4 L97.7,156.1 L97.7,155.8 L97.7,155.5 L97.7,155.2 L97.7,155.0 L97.7,154.7 L97.7,154.4 L97.7,154.1 L97.7,153.8 L97.7,153.5 L97.7,153.3 L97.7,153.0 L97.7,152.7 L97.7,152.4 L97.7,152.1 L97.7,151.8 L97.7,151.6 L97.7,151.3 L97.7,151.0 L97.7,150.7 L97.7,150.4 L97.7,150.1 L97.7,149.9 L97.7,149.6 L97.7,149.3 L97.7,149.0 L97.7,148.7 L97.7,148.5 L97.7,148.2 L97.7,147.9 L97.7,147.6 L97.7,147.3 L97.7,147.0 L97.7,146.8 L97.7,146.5 L97.7,146.2 L97.7,145.9 L97.7,145.6 L97.7,145.3 L97.7,145.1 L97.7,144.8 L97.7,144.5 L97.7,144.2 L97.7,143.9 L97.7,143.6 L97.7,143.4 L97.7,143.1 L97.7,142.8 L97.7,142.5 L97.7,142.2 L97.7,141.9 L97.7,141.7 L97.7,141.4 L97.7,141.1 L97.7,140.8 L97.7,140.5 L97.7,140.2 L97.7,140.0 L97.7,139.7 L97.7,139.4 L97.7,139.1 L97.7,138.8 L97.7,138.5 L97.7,138.3 L97.7,138.0 L97.7,137.7 L97.7,137.4 L97.7,137.1 L97.7,136.9 L97.7,136.6 L97.7,136.3 L97.7,136.0 L97.7,135.7 L97.7,135.4 L97.7,135.2 L97.7,134.9 L97.7,134.6 L97.7,134.3 L97.7,134.0 L97.7,133.7 L97.7,133.5 L97.7,133.2 L97.7,132.9 L97.7,132.6 L97.7,132.3 L97.7,132.0 L97.7,131.8 L97.7,131.5 L97.7,131.2 L97.7,130.9 L97.7,130.6 L97.7,130.3 L97.7,130.1 L97.7,129.8 L97.7,129.5 L97.7,129.2 L97.7,128.9 L97.7,128.6 L97.7,128.4 L97.7,128.1 L97.7,127.8 L97.7,127.5 L97.7,127.2 L97.7,126.9 L97.7,126.7 L97.7,126.4 L97.7,126.1 L97.7,125.8 L97.7,125.5 L97.7,125.2 L97.7,125.0 L97.7,124.7 L97.7,124.4 L97.7,124.1 L97.7,123.8 L97.7,123.6 L97.7,123.3 L97.7,123.0 L97.7,122.7 L97.7,122.4 L97.7,122.1 L97.7,121.9 L97.7,121.6 L97.7,121.3 L97.7,121.0 L97.7,120.7 L97.7,120.4 L97.7,120.2 L97.7,119.9 L97.7,119.6 L97.7,119.3 L97.7,119.0 L97.7,118.7 L97.7,118.5 L97.7,118.2 L97.7,117.9 L97.7,117.6 L97.7,117.3 L97.7,117.0 L97.7,116.8 L97.7,116.5 L97.7,116.2 L97.7,115.9 L97.7,115.6 L97.7,115.3 L97.7,115.1 L97.7,114.8 L97.7,114.5 L97.7,114.2 L97.7,113.9 L97.7,113.6 L97.7,113.4 L97.7,113.1 L97.7,112.8 L97.7,112.5 L97.7,112.2 L97.7,111.9 L97.7,111.7 L97.7,111.4 L97.7,111.1 L97.7,110.8 L97.7,110.5 L97.7,110.3 L97.7,110.0 L97.7,109.7 L97.7,109.4 L97.7,109.1 L97.7,108.8 L97.7,108.6 L97.7,108.3 L97.7,108.0 L97.7,107.7 L97.7,107.4 L97.7,107.1 L97.7,106.9 L97.7,106.6 L97.7,106.3 L97.7,106.0 L97.7,105.7 L97.7,105.4 L97.7,105.2 L97.7,104.9 L97.7,104.6 L97.7,104.3 L97.7,104.0 L97.7,103.7 L97.7,103.5 L97.7,103.2 L97.7,102.9 L97.7,102.6 L97.7,102.3 L97.7,102.0 L97.7,101.8 L97.7,101.5 L97.7,101.2 L97.7,100.9 L97.7,100.6 L97.7,100.3 L97.7,100.1 L97.7,99.8 L97.7,99.5 L97.7,99.2 L97.7,98.9 L97.7,98.7 L97.7,98.4 L97.7,98.1 L97.7,97.8 L97.7,97.5 L97.7,97.2 L97.7,97.0 L97.7,96.7 L97.7,96.4 L97.7,96.1 L97.7,95.8 L97.7,95.5 L97.7,95.3 L97.7,95.0 L97.7,94.7 L97.7,94.4 L97.7,94.1 L97.7,93.8 L97.7,93.6 L97.7,93.3 L97.7,93.0 L97.7,92.7 L97.7,92.4 L97.7,92.1 L97.7,91.9 L97.7,91.6 L97.7,91.3 L97.7,91.0 L97.7,90.7 L97.7,90.4 L97.7,90.2 L97.7,89.9 L97.7,89.6 L97.7,89.3 L97.7,89.0 L97.7,88.7 L97.7,88.5 L97.7,88.2 L97.7,87.9 L97.7,87.6 L97.7,87.3 L97.7,87.0 L97.7,86.8 L97.7,86.5 L97.7,86.2 L97.7,85.9 L97.7,85.6 L97.7,85.4 L97.7,85.1 L97.7,84.8 L97.7,84.5 L97.7,84.2 L97.7,83.9 L97.7,83.7 L97.7,83.4 L97.7,83.1 L97.7,82.8 L97.7,82.5 L97.7,82.2 L97.7,82.0 L97.7,81.7 L97.7,81.4 L97.7,81.1 L97.7,80.8 L97.7,80.5 L97.7,80.3 L97.7,80.0 L97.7,79.7 L97.7,79.4 L97.7,79.1 L97.7,78.8 L97.7,78.6 L97.7,78.3 L97.7,78.0 L97.7,77.7 L97.7,77.4 L97.7,77.1 L97.7,76.9 L97.7,76.6 L97.7,76.3 L97.7,76.0 L106.2,75.7 L106.2,75.4 L106.2,75.2 L106.2,74.9 L106.2,74.6 L106.2,74.3 L106.2,74.0 L106.2,73.7 L106.2,73.5 L106.2,73.2 L106.2,72.9 L106.2,72.6 L106.2,72.3 L106.2,72.1 L106.2,71.8 L106.2,71.5 L106.2,71.2 L106.2,70.9 L106.2,70.6 L106.2,70.4 L106.2,70.1 L106.2,69.8 L106.2,69.5 L106.2,69.2 L106.2,68.9 L106.2,68.7 L106.2,68.4 L106.2,68.1 L106.2,67.8 L106.2,67.5 L106.2,67.2 L106.2,67.0 L106.2,66.7 L106.2,66.4 L106.2,66.1 L106.2,65.8 L106.2,65.5 L106.2,65.3 L106.2,65.0 L106.2,64.7 L114.8,64.4 L114.8,64.1 L114.8,63.8 L114.8,63.6 L114.8,63.3 L114.8,63.0 L114.8,62.7 L123.4,62.4 L123.4,62.1 L123.4,61.9 L131.9,61.6 L131.9,61.3 L131.9,61.0 L131.9,60.7 L131.9,60.5 L140.5,60.2 L140.5,59.9 L140.5,59.6 L140.5,59.3 L140.5,59.0 L149.0,58.8 L149.0,58.5 L149.0,58.2 L149.0,57.9 L149.0,57.6 L149.0,57.3 L149.0,57.1 L149.0,56.8 L149.0,56.5 L149.0,56.2 L149.0,55.9 L157.6,55.6 L157.6,55.4 L157.6,55.1 L157.6,54.8 L157.6,54.5 L157.6,54.2 L157.6,53.9 L157.6,53.7 L157.6,53.4 L157.6,53.1 L157.6,52.8 L157.6,52.5 L166.1,52.2 L183.3,52.0 L200.4,51.7 L208.9,51.4 L217.5,51.1 L217.5,50.8 L217.5,50.5 L217.5,50.3 L226.1,50.0 L226.1,49.7 L226.1,49.4 L226.1,49.1 L226.1,48.8 L226.1,48.6 L226.1,48.3 L226.1,48.0" fill="none" stroke="#56b6c2" stroke-width="2" opacity="1"/>
|
||
<rect x="792" y="85" width="14" height="3" fill="#56b6c2"/>
|
||
<text x="812" y="92" fill="#cdd3e0" font-size="12">OpenTUI (no cap) (1350 scrolls)</text>
|
||
<text x="72" y="492" fill="#6f7689" font-size="11">Mouse wheel fired 30×/s for 15s, three repeats pooled. Higher curve further left = more responses answered fast.</text>
|
||
</svg><figcaption>Takeaway: both feel identical on a typical scroll (~2ms), but Ink’s slowest 1-in-100 responses (p99) take 82–101ms — visible hitches — while OpenTUI stays under ~17ms.</figcaption></figure>
|
||
|
||
<h2>Frame smoothness while streaming — where OpenTUI wins</h2>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Frame smoothness while text streams in</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">5.3</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">10.5</text>
|
||
<line x1="72" y1="167.19999999999996" x2="1022" y2="167.19999999999996" stroke="#262c38"/>
|
||
<text x="64" y="171.19999999999996" fill="#8b93a7" font-size="12" text-anchor="end">15.8</text>
|
||
<line x1="72" y1="107.6" x2="1022" y2="107.6" stroke="#262c38"/>
|
||
<text x="64" y="111.6" fill="#8b93a7" font-size="12" text-anchor="end">21.1</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">26.3</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">frames per second</text>
|
||
<rect x="460" y="167.06863266702135" width="84" height="178.93136733297865" fill="#e06c75" opacity="0.85"/>
|
||
<text x="502" y="161.06863266702135" fill="#e8eaf0" font-size="12" text-anchor="middle">15.8</text>
|
||
<text x="502" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="550" y="93.45762711864404" width="84" height="252.54237288135596" fill="#61afef" opacity="0.85"/>
|
||
<text x="592" y="87.45762711864404" fill="#e8eaf0" font-size="12" text-anchor="middle">22.3</text>
|
||
<text x="592" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="547" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">screen updates per second (higher = smoother)</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">800-message stream at 30 events/s; a frame = a burst of terminal output separated by a ≥4ms gap.</text>
|
||
</svg><figcaption>Takeaway: while a long reply streams in, OpenTUI repaints ~22×/s vs Ink’s ~16×/s — text appears noticeably more fluid.</figcaption></figure>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Pauses between screen updates while streaming (lower = steadier)</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">49.3</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">98.6</text>
|
||
<line x1="72" y1="167.20000000000002" x2="1022" y2="167.20000000000002" stroke="#262c38"/>
|
||
<text x="64" y="171.20000000000002" fill="#8b93a7" font-size="12" text-anchor="end">148</text>
|
||
<line x1="72" y1="107.6" x2="1022" y2="107.6" stroke="#262c38"/>
|
||
<text x="64" y="111.6" fill="#8b93a7" font-size="12" text-anchor="end">197</text>
|
||
<line x1="72" y1="47.99999999999994" x2="1022" y2="47.99999999999994" stroke="#262c38"/>
|
||
<text x="64" y="51.99999999999994" fill="#8b93a7" font-size="12" text-anchor="end">247</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">gap between frames (ms)</text>
|
||
<rect x="222.5" y="295.2498580812586" width="84" height="50.750141918741406" fill="#e06c75" opacity="0.85"/>
|
||
<text x="264.5" y="289.2498580812586" fill="#e8eaf0" font-size="12" text-anchor="middle">42.0</text>
|
||
<text x="264.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="312.5" y="298.8748682183116" width="84" height="47.125131781688424" fill="#61afef" opacity="0.85"/>
|
||
<text x="354.5" y="292.8748682183116" fill="#e8eaf0" font-size="12" text-anchor="middle">39.0</text>
|
||
<text x="354.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="309.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">typical gap (p50)</text>
|
||
<rect x="697.5" y="93.45762711864404" width="84" height="252.54237288135596" fill="#e06c75" opacity="0.85"/>
|
||
<text x="739.5" y="87.45762711864404" fill="#e8eaf0" font-size="12" text-anchor="middle">209</text>
|
||
<text x="739.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">Ink</text>
|
||
<rect x="787.5" y="221.5413186278485" width="84" height="124.45868137215149" fill="#61afef" opacity="0.85"/>
|
||
<text x="829.5" y="215.5413186278485" fill="#e8eaf0" font-size="12" text-anchor="middle">103</text>
|
||
<text x="829.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">OpenTUI</text>
|
||
<text x="784.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">slowest 1 in 20 gaps (p95)</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">Same 800-message stream. The right-hand pair is the stutter you actually notice.</text>
|
||
</svg><figcaption>Takeaway: typical pauses are similar, but Ink’s worst stutters between repaints (slowest 1 in 20, p95) are twice as long — 209ms vs 103ms.</figcaption></figure>
|
||
|
||
<h2>Typing echo & first reply paint</h2>
|
||
<table>
|
||
<tr><th>UI</th><th>keystroke echo, typical (p50)</th><th>keystroke echo, slowest 1 in 20 (p95)</th><th>Enter → first reply text on screen</th><th>keystrokes verified</th></tr>
|
||
<tr><td><b style="color:#e06c75">Ink</b></td>
|
||
<td>1 ms</td><td>1.5 ms</td>
|
||
<td>44 ms</td><td>30/30</td></tr><tr><td><b style="color:#61afef">OpenTUI</b></td>
|
||
<td>2 ms</td><td>3.5 ms</td>
|
||
<td>107 ms</td><td>30/30</td></tr>
|
||
</table>
|
||
<p>Keystroke echo is a tie — 1–2ms on both, far below anything a human can perceive. The one real difference:
|
||
after pressing Enter, Ink paints the first reply text in 44ms
|
||
vs OpenTUI's 107ms. (Single run per UI.)</p>
|
||
|
||
<h2>CPU cost of streaming — including the terminal's side of the work</h2>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Total CPU burned streaming the same 800-message conversation</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">19.5</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">38.9</text>
|
||
<line x1="72" y1="167.20000000000002" x2="1022" y2="167.20000000000002" stroke="#262c38"/>
|
||
<text x="64" y="171.20000000000002" fill="#8b93a7" font-size="12" text-anchor="end">58.4</text>
|
||
<line x1="72" y1="107.60000000000002" x2="1022" y2="107.60000000000002" stroke="#262c38"/>
|
||
<text x="64" y="111.60000000000002" fill="#8b93a7" font-size="12" text-anchor="end">77.8</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">97.3</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">CPU seconds</text>
|
||
<rect x="228.5" y="93.45762711864407" width="50" height="252.54237288135593" fill="#e06c75" opacity="0.85"/>
|
||
<text x="253.5" y="87.45762711864407" fill="#e8eaf0" font-size="12" text-anchor="middle">82.4</text>
|
||
<text x="253.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">UI</text>
|
||
<rect x="284.5" y="344.4066727263006" width="50" height="1.5933272736994013" fill="#98c379" opacity="0.85"/>
|
||
<text x="309.5" y="338.4066727263006" fill="#e8eaf0" font-size="12" text-anchor="middle">0.5</text>
|
||
<text x="309.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">gateway</text>
|
||
<rect x="340.5" y="344.74372272650623" width="50" height="1.2562772734937653" fill="#d19a66" opacity="0.85"/>
|
||
<text x="365.5" y="338.74372272650623" fill="#e8eaf0" font-size="12" text-anchor="middle">0.4</text>
|
||
<text x="365.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">tmux</text>
|
||
<text x="309.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">Ink</text>
|
||
<rect x="703.5" y="103.6916907612518" width="50" height="242.3083092387482" fill="#61afef" opacity="0.85"/>
|
||
<text x="728.5" y="97.6916907612518" fill="#e8eaf0" font-size="12" text-anchor="middle">79.1</text>
|
||
<text x="728.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">UI</text>
|
||
<rect x="759.5" y="345.0501318176023" width="50" height="0.9498681823977222" fill="#98c379" opacity="0.85"/>
|
||
<text x="784.5" y="339.0501318176023" fill="#e8eaf0" font-size="12" text-anchor="middle">0.3</text>
|
||
<text x="784.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">gateway</text>
|
||
<rect x="815.5" y="344.71308181739664" width="50" height="1.2869181826033582" fill="#d19a66" opacity="0.85"/>
|
||
<text x="840.5" y="338.71308181739664" fill="#e8eaf0" font-size="12" text-anchor="middle">0.4</text>
|
||
<text x="840.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">tmux</text>
|
||
<text x="784.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">OpenTUI</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">Whole pipeline measured inside tmux: UI process + gateway + the tmux server that has to parse the UI’s output.</text>
|
||
</svg><figcaption>Takeaway: a tie — same 800-message stream costs ~80 CPU-seconds on either UI, and the terminal emulator’s share (tmux) is a rounding error (~0.4s) for both.</figcaption></figure>
|
||
<p>The hypothesis that Ink's bigger output stream costs meaningfully more CPU in the terminal emulator
|
||
<b>did not hold at this workload</b>: Ink did push more bytes (3.8MB
|
||
vs 3.3MB), but the tmux
|
||
server burned ~0.4 CPU-seconds either way.</p>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Streaming at 30 events/s: terminal output volume and CPU cost per event</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">13.9</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">27.9</text>
|
||
<line x1="72" y1="167.19999999999996" x2="1022" y2="167.19999999999996" stroke="#262c38"/>
|
||
<text x="64" y="171.19999999999996" fill="#8b93a7" font-size="12" text-anchor="end">41.8</text>
|
||
<line x1="72" y1="107.6" x2="1022" y2="107.6" stroke="#262c38"/>
|
||
<text x="64" y="111.6" fill="#8b93a7" font-size="12" text-anchor="end">55.7</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">69.7</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">output KiB/s · CPU ms per event</text>
|
||
<rect x="133.33333333333334" y="94.93781958774662" width="94" height="251.06218041225338" fill="#56b6c2" opacity="0.85"/>
|
||
<line x1="180.33333333333334" y1="94.96255697785227" x2="180.33333333333334" y2="94.90210228108657" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="180.33333333333334" y="88.93781958774662" fill="#e8eaf0" font-size="12" text-anchor="middle">58.7</text>
|
||
<text x="180.33333333333334" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">KiB/s</text>
|
||
<rect x="233.33333333333334" y="217.3182155262885" width="94" height="128.6817844737115" fill="#d19a66" opacity="0.85"/>
|
||
<line x1="280.33333333333337" y1="217.34385275257492" x2="280.33333333333337" y2="217.2754868158111" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="280.33333333333337" y="211.3182155262885" fill="#e8eaf0" font-size="12" text-anchor="middle">30.1</text>
|
||
<text x="280.33333333333337" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">ms/event</text>
|
||
<text x="230.33333333333334" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">OpenTUI (no cap)</text>
|
||
<rect x="450" y="93.92885975018072" width="94" height="252.07114024981928" fill="#61afef" opacity="0.85"/>
|
||
<line x1="497" y1="94.27777330651017" x2="497" y2="93.45762711864401" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="497" y="87.92885975018072" fill="#e8eaf0" font-size="12" text-anchor="middle">58.9</text>
|
||
<text x="497" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">KiB/s</text>
|
||
<rect x="550" y="217.71131966268047" width="94" height="128.28868033731953" fill="#d19a66" opacity="0.85"/>
|
||
<line x1="597" y1="217.72841114687142" x2="597" y2="217.51476759448448" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="597" y="211.71131966268047" fill="#e8eaf0" font-size="12" text-anchor="middle">30.0</text>
|
||
<text x="597" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">ms/event</text>
|
||
<text x="547" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">OpenTUI</text>
|
||
<rect x="766.6666666666667" y="158.00860434338497" width="94" height="187.99139565661503" fill="#e06c75" opacity="0.85"/>
|
||
<line x1="813.6666666666667" y1="159.27091397213078" x2="813.6666666666667" y2="157.28876348144044" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="813.6666666666667" y="152.00860434338497" fill="#e8eaf0" font-size="12" text-anchor="middle">44.0</text>
|
||
<text x="813.6666666666667" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">KiB/s</text>
|
||
<rect x="866.6666666666667" y="213.28462525722276" width="94" height="132.71537474277724" fill="#d19a66" opacity="0.85"/>
|
||
<line x1="913.6666666666667" y1="213.47263158332328" x2="913.6666666666667" y2="212.4727797581523" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="913.6666666666667" y="207.28462525722276" fill="#e8eaf0" font-size="12" text-anchor="middle">31.0</text>
|
||
<text x="913.6666666666667" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">ms/event</text>
|
||
<text x="863.6666666666667" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">Ink</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">Typical of 3 runs (median); whisker = middle half. CPU is the UI process only, measured over the stream.</text>
|
||
</svg><figcaption>Takeaway: per streamed event the CPU cost is in the same ballpark for all configs — neither UI is the cheap one on CPU.</figcaption></figure>
|
||
|
||
<h2>Crash recovery — we shot the gateway mid-stream and watched what happened</h2>
|
||
<p>Each scenario kills, freezes, or yanks something out from under the UI on a live session, then checks:
|
||
did the UI survive, did the gateway come back, did the stream resume, is the final transcript identical
|
||
to an undisturbed run, and is anything left running afterwards?</p>
|
||
<table><tr><th style="width:34%">what we did</th><th>Ink</th><th>OpenTUI</th></tr><tr><td><b>gw-kill-stream</b><br><span class="dim">shot the gateway (kill -9) while reply text was streaming</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (87ms)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (1.0s)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td></tr>
|
||
<tr><td><b>gw-kill-tool</b><br><span class="dim">shot the gateway (kill -9) in the middle of a tool call</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (81ms)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (1.0s)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td></tr>
|
||
<tr><td><b>gw-stop</b><br><span class="dim">froze the gateway for 30 seconds mid-session, then let the UI recover</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (35ms)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td><td>UI survived: <span class="ok">yes</span><br>gateway respawned: <span class="ok">yes</span> (1.1s)<br>stream resumed: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td></tr>
|
||
<tr><td><b>resize-storm</b><br><span class="dim">resized the window 30 times in 3 seconds</span></td><td>survived: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td><td>survived: <span class="ok">yes</span><br>transcript intact: <span class="ok">yes</span><br>orphan processes: <span class="ok">none</span></td></tr>
|
||
<tr><td><b>pty-eof</b><br><span class="dim">closed the terminal out from under the UI (should exit cleanly, leave nothing behind)</span></td><td>exited cleanly: <span class="ok">yes</span><br>gateway cleaned up: <span class="ok">yes</span> (100ms)<br>orphan processes: <span class="ok">none</span></td><td>exited cleanly: <span class="ok">yes</span><br>gateway cleaned up: <span class="ok">yes</span> (101ms)<br>orphan processes: <span class="ok">none</span></td></tr></table>
|
||
<p><b>Result: a tie.</b> Both UIs auto-respawn a killed gateway and finish with a byte-identical final
|
||
transcript and zero orphan processes. Ink respawns faster (~35–87ms vs ~1.0s), but both are well within
|
||
"didn't lose anything".</p>
|
||
|
||
<h2>Startup</h2>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="420" viewBox="0 0 1040 420" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="420" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Startup: time until something is on screen, and until the session is ready</text>
|
||
<line x1="72" y1="346" x2="1022" y2="346" stroke="#262c38"/>
|
||
<text x="64" y="350" fill="#8b93a7" font-size="12" text-anchor="end">0.0</text>
|
||
<line x1="72" y1="286.4" x2="1022" y2="286.4" stroke="#262c38"/>
|
||
<text x="64" y="290.4" fill="#8b93a7" font-size="12" text-anchor="end">47.7</text>
|
||
<line x1="72" y1="226.8" x2="1022" y2="226.8" stroke="#262c38"/>
|
||
<text x="64" y="230.8" fill="#8b93a7" font-size="12" text-anchor="end">95.3</text>
|
||
<line x1="72" y1="167.20000000000002" x2="1022" y2="167.20000000000002" stroke="#262c38"/>
|
||
<text x="64" y="171.20000000000002" fill="#8b93a7" font-size="12" text-anchor="end">143</text>
|
||
<line x1="72" y1="107.6" x2="1022" y2="107.6" stroke="#262c38"/>
|
||
<text x="64" y="111.6" fill="#8b93a7" font-size="12" text-anchor="end">191</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">238</text>
|
||
<text x="18" y="197" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 197)">ms after launch (lower = faster)</text>
|
||
<rect x="202.5" y="262.86105051183085" width="104" height="83.13894948816915" fill="#e06c75" opacity="0.85"/>
|
||
<line x1="254.5" y1="264.73636516193994" x2="254.5" y2="261.2982883034066" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="254.5" y="256.86105051183085" fill="#e8eaf0" font-size="12" text-anchor="middle">66.5</text>
|
||
<text x="254.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">first paint</text>
|
||
<rect x="312.5" y="93.45762711864404" width="104" height="252.54237288135596" fill="#98c379" opacity="0.85"/>
|
||
<line x1="364.5" y1="94.39528444369859" x2="364.5" y2="93.45762711864404" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="364.5" y="87.45762711864404" fill="#e8eaf0" font-size="12" text-anchor="middle">202</text>
|
||
<text x="364.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">session ready</text>
|
||
<text x="309.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">Ink</text>
|
||
<rect x="677.5" y="187.22335962409798" width="104" height="158.77664037590202" fill="#61afef" opacity="0.85"/>
|
||
<line x1="729.5" y1="188.47356939083738" x2="729.5" y2="181.90996811545563" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="729.5" y="181.22335962409798" fill="#e8eaf0" font-size="12" text-anchor="middle">127</text>
|
||
<text x="729.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">first paint</text>
|
||
<rect x="787.5" y="125.96308105386811" width="104" height="220.0369189461319" fill="#98c379" opacity="0.85"/>
|
||
<line x1="839.5" y1="127.21329082060748" x2="839.5" y2="125.96308105386811" stroke="#e8eaf0" stroke-width="1.5"/>
|
||
<text x="839.5" y="119.96308105386811" fill="#e8eaf0" font-size="12" text-anchor="middle">176</text>
|
||
<text x="839.5" y="363" fill="#8b93a7" font-size="11" text-anchor="middle">session ready</text>
|
||
<text x="784.5" y="384" fill="#aab2c5" font-size="13" text-anchor="middle">OpenTUI</text>
|
||
<text x="72" y="412" fill="#6f7689" font-size="11">Typical of 10 launches (median); whisker = middle half of runs. "first paint" = first byte drawn to the terminal.</text>
|
||
</svg><figcaption>Takeaway: Ink gets pixels on screen first (~67ms vs ~127ms); OpenTUI finishes its session bootstrap slightly sooner (~176ms vs ~202ms). Both feel instant.</figcaption></figure>
|
||
|
||
<h2 id="stress">Stress appendix — beyond real usage</h2>
|
||
<p class="callout stress">Everything below streams 3,000–10,000 messages into one session — past the longest
|
||
session ever recorded in the real database (~1941 msgs). It shows where the engines break, not what
|
||
daily use feels like.</p>
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="500" viewBox="0 0 1040 500" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="500" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Memory used as the conversation grows (stress runs, every repeat shown)</text>
|
||
<line x1="72" y1="48" x2="72" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="72" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">0</text>
|
||
<line x1="230.33333333333334" y1="48" x2="230.33333333333334" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="230.33333333333334" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">1667</text>
|
||
<line x1="388.6666666666667" y1="48" x2="388.6666666666667" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="388.6666666666667" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">3333</text>
|
||
<line x1="547" y1="48" x2="547" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="547" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">5000</text>
|
||
<line x1="705.3333333333334" y1="48" x2="705.3333333333334" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="705.3333333333334" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">6667</text>
|
||
<line x1="863.6666666666667" y1="48" x2="863.6666666666667" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="863.6666666666667" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">8333</text>
|
||
<line x1="1022" y1="48" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="1022" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">10000</text>
|
||
<line x1="72" y1="430" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="434" fill="#8b93a7" font-size="12" text-anchor="end">0</text>
|
||
<line x1="72" y1="353.6" x2="1022" y2="353.6" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="357.6" fill="#8b93a7" font-size="12" text-anchor="end">464</text>
|
||
<line x1="72" y1="277.2" x2="1022" y2="277.2" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="281.2" fill="#8b93a7" font-size="12" text-anchor="end">929</text>
|
||
<line x1="72" y1="200.79999999999995" x2="1022" y2="200.79999999999995" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="204.79999999999995" fill="#8b93a7" font-size="12" text-anchor="end">1393</text>
|
||
<line x1="72" y1="124.39999999999998" x2="1022" y2="124.39999999999998" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="128.39999999999998" fill="#8b93a7" font-size="12" text-anchor="end">1858</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">2322</text>
|
||
<text x="547" y="474" fill="#aab2c5" font-size="13" text-anchor="middle">messages streamed into the session</text>
|
||
<text x="18" y="239" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 239)">memory (MB)</text>
|
||
<line x1="72" y1="93.13932980599651" x2="1022" y2="93.13932980599651" stroke="#e5c07b" stroke-width="1.5" stroke-dasharray="7 5"/>
|
||
<text x="1018" y="87.13932980599651" fill="#e5c07b" font-size="12" text-anchor="end">hard memory cap 2048 MB</text>
|
||
<path d="M81.5,412.8 L91.0,411.3 L100.5,411.3 L110.0,411.3 L119.6,411.3 L129.1,389.6 L138.6,378.7 L148.1,375.8 L157.6,370.5 L167.1,366.0 L176.6,359.9 L186.1,359.9 L195.5,359.8 L205.0,359.8 L214.5,343.4 L224.0,343.3 L233.5,343.3 L243.0,343.0 L252.5,342.8 L262.0,342.7 L271.5,321.4 L281.1,316.6 L290.6,311.2 L300.1,306.1 L309.6,301.1 L319.1,296.0 L328.6,295.3 L338.1,291.0 L347.6,285.6 L357.0,285.5" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<rect x="792" y="49" width="14" height="3" fill="#61afef"/>
|
||
<text x="812" y="56" fill="#cdd3e0" font-size="12">OpenTUI</text>
|
||
<path d="M81.5,411.6 L91.0,411.6 L100.5,411.6 L110.0,411.6 L119.6,391.2 L129.1,384.1 L138.6,378.3 L148.1,375.6 L157.6,375.6 L167.1,375.5 L176.6,375.5 L186.1,375.5 L195.5,375.4 L205.0,351.7 L214.5,346.6 L224.0,342.2 L233.5,342.2 L243.0,342.1 L252.5,342.1 L262.0,342.0 L271.5,324.2 L281.1,318.7 L290.6,313.6 L300.1,308.6 L309.6,303.7 L319.1,298.7 L328.6,294.4 L338.1,289.3 L347.6,284.1 L357.0,284.1" fill="none" stroke="#56b6c2" stroke-width="1.5" opacity="0.8"/>
|
||
<rect x="792" y="67" width="14" height="3" fill="#56b6c2"/>
|
||
<text x="812" y="74" fill="#cdd3e0" font-size="12">OpenTUI (no cap)</text>
|
||
<path d="M81.5,411.8 L91.0,411.7 L100.5,411.7 L110.0,411.7 L119.6,391.1 L129.1,385.4 L138.6,382.9 L148.1,374.2 L157.6,369.2 L167.1,369.2 L176.6,369.1 L186.1,369.1 L195.5,369.1 L205.0,369.1 L214.5,369.0 L224.0,346.4 L233.5,334.4 L243.0,334.0 L252.5,328.9 L262.0,328.8 L271.5,328.8 L281.1,328.8 L290.6,328.7 L300.1,307.9 L309.6,302.4 L319.1,298.0 L328.6,293.1 L338.1,288.1 L347.6,283.0 L357.0,282.6" fill="none" stroke="#56b6c2" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.9 L91.0,411.2 L100.5,411.2 L110.0,411.2 L119.6,411.2 L129.1,388.6 L138.6,383.4 L148.1,382.1 L157.6,382.1 L167.1,382.6 L176.6,382.5 L186.1,382.5 L195.5,382.4 L205.0,354.7 L214.5,344.1 L224.0,343.9 L233.5,338.3 L243.0,333.5 L252.5,328.4 L262.0,323.4 L271.5,318.6 L281.1,313.8 L290.6,313.1 L300.1,308.6 L309.6,308.1 L319.1,308.1 L328.6,294.1 L338.1,290.4 L347.6,285.2" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.4 L91.0,407.8 L100.5,406.0 L110.0,402.4 L119.6,402.2 L129.1,400.7 L138.6,400.5 L148.1,399.6 L157.6,398.7 L167.1,398.3 L176.6,397.7 L186.1,397.4 L195.5,396.5 L205.0,396.5 L214.5,394.9 L224.0,394.7 L233.5,393.7 L243.0,393.4 L252.5,392.8 L262.0,392.5 L271.5,391.6 L281.1,391.6 L290.6,391.2 L300.1,390.6 L309.6,389.5 L319.1,388.6 L328.6,388.6 L338.1,387.4 L347.6,387.2 L357.0,387.2" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<rect x="792" y="85" width="14" height="3" fill="#e06c75"/>
|
||
<text x="812" y="92" fill="#cdd3e0" font-size="12">Ink</text>
|
||
<path d="M81.5,409.9 L91.0,405.2 L100.5,403.9 L110.0,402.5 L119.6,401.6 L129.1,400.0 L138.6,399.8 L148.1,398.6 L157.6,398.3 L167.1,397.4 L176.6,396.9 L186.1,395.6 L195.5,394.8 L205.0,394.8 L214.5,394.1 L224.0,392.4 L233.5,392.1 L243.0,391.7 L252.5,391.3 L262.0,391.1 L271.5,389.7 L281.1,389.7 L290.6,389.4 L300.1,389.0 L309.6,388.0 L319.1,387.7 L328.6,389.2 L338.1,389.0 L347.6,388.8 L357.0,388.7" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.6 L91.0,410.6 L100.5,410.6 L110.0,410.6 L119.6,394.4 L129.1,387.3 L138.6,381.0 L148.1,380.9 L157.6,380.8 L167.1,380.4 L176.6,380.3 L186.1,380.3 L195.5,355.5 L205.0,350.7 L214.5,345.5 L224.0,340.4 L233.5,337.0 L243.0,337.0 L252.5,337.0 L262.0,336.9 L271.5,336.9 L281.1,336.9 L290.6,336.8 L300.1,312.2 L309.6,306.4 L319.1,301.8 L328.6,297.4 L338.1,292.4 L347.6,287.3 L357.0,286.9" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.8 L91.0,410.8 L100.5,410.7 L110.0,410.7 L119.6,392.5 L129.1,386.0 L138.6,378.7 L148.1,373.8 L157.6,368.2 L167.1,367.7 L176.6,363.1 L186.1,357.8 L195.5,353.4 L205.0,353.2 L214.5,353.1 L224.0,353.0 L233.5,352.9 L243.0,352.9 L252.5,352.9 L262.0,352.8 L271.5,322.5 L281.1,317.9 L290.6,312.9 L300.1,307.9 L309.6,303.0 L319.1,298.1 L328.6,298.0 L338.1,293.0 L347.6,287.7 L357.0,283.2" fill="none" stroke="#56b6c2" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,410.2 L91.0,408.1 L100.5,405.9 L110.0,402.8 L119.6,402.6 L129.1,401.8 L138.6,400.9 L148.1,400.5 L157.6,399.6 L167.1,398.7 L176.6,398.5 L186.1,398.1 L195.5,397.3 L205.0,397.2 L214.5,395.7 L224.0,394.5 L233.5,393.1 L243.0,392.7 L252.5,392.5 L262.0,391.5 L271.5,391.2 L281.1,391.2 L290.6,390.4 L300.1,389.6 L309.6,389.3 L319.1,389.3 L328.6,389.3 L338.1,389.1 L347.6,388.9 L357.0,388.9" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,409.4 L91.0,404.8 L100.5,400.1 L110.0,400.2 L119.6,400.1 L129.1,398.6 L138.6,398.6 L148.1,398.5 L157.6,398.4 L167.1,397.6 L176.6,397.6 L186.1,396.4 L195.5,395.8 L205.0,395.6 L214.5,394.7 L224.0,394.1 L233.5,393.6 L243.0,393.3 L252.5,392.9 L262.0,392.3 L271.5,391.6 L281.1,391.4 L290.6,390.8 L300.1,390.3 L309.6,390.0 L319.1,389.2 L328.6,389.2 L338.1,388.6 L347.6,388.3 L357.0,386.6 L366.5,386.6 L376.0,386.6 L385.5,385.9 L395.0,385.9 L404.5,385.8 L414.0,385.3 L423.5,385.0 L433.0,384.5 L442.6,384.5 L452.1,384.5 L461.6,384.5 L471.1,384.2 L480.6,383.8 L490.1,383.8 L499.6,383.8 L509.1,383.8 L518.5,383.3 L528.0,383.3 L537.5,383.3 L547.0,383.3 L556.5,383.0 L566.0,382.9 L575.5,382.8 L585.0,382.8 L594.5,382.7 L604.1,382.7 L613.6,382.3 L623.1,381.5 L632.6,381.3 L642.1,380.9 L651.6,380.4 L661.1,380.1 L670.6,379.7 L680.0,379.4 L689.5,379.0 L699.0,382.2 L708.5,381.9 L718.0,381.7 L727.5,381.7 L737.0,381.7 L746.5,381.3 L756.0,381.4 L765.6,381.3 L775.1,381.3 L784.6,381.3 L794.1,381.2 L803.6,380.8 L813.1,380.8 L822.6,380.8 L832.1,380.7 L841.5,380.4 L851.0,380.4 L860.5,380.3 L870.0,380.3 L879.5,380.3 L889.0,380.1 L898.5,379.6 L908.0,379.5 L917.5,379.5 L927.1,379.5 L936.6,379.5 L946.1,379.4 L955.6,379.4 L965.1,379.3 L974.6,379.2 L984.1,378.8 L993.6,378.8 L1003.0,378.8 L1012.5,377.7 L1022.0,380.7" fill="none" stroke="#e06c75" stroke-width="2.5" opacity="0.8"/>
|
||
<path d="M81.5,412.0 L91.0,412.0 L100.5,411.9 L110.0,396.8 L119.6,394.3 L129.1,389.1 L138.6,382.0 L148.1,375.9 L157.6,370.4 L167.1,366.1 L176.6,360.4 L186.1,358.9 L195.5,358.8 L205.0,351.4 L214.5,346.7 L224.0,346.6 L233.5,346.6 L243.0,346.5 L252.5,331.5 L262.0,327.2 L271.5,327.2 L281.1,318.1 L290.6,318.1 L300.1,318.0 L309.6,318.0 L319.1,317.9 L328.6,300.4 L338.1,295.0 L347.6,289.9 L357.0,284.7" fill="none" stroke="#56b6c2" stroke-width="2.5" opacity="0.8"/>
|
||
<path d="M81.5,411.8 L91.0,411.8 L100.5,411.7 L110.0,410.2 L119.6,391.2 L129.1,385.8 L138.6,379.0 L148.1,377.3 L157.6,371.2 L167.1,366.3 L176.6,361.7 L186.1,356.6 L195.5,351.7 L205.0,346.9 L214.5,346.7 L224.0,346.7 L233.5,346.6 L243.0,346.5 L252.5,346.4 L262.0,346.4 L271.5,346.4 L281.1,319.0 L290.6,313.5 L300.1,313.5 L309.6,313.5 L319.1,313.5 L328.6,302.8 L338.1,302.8 L347.6,298.2 L357.0,292.9" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,410.2 L91.0,404.9 L100.5,402.6 L110.0,400.6 L119.6,400.6 L129.1,400.0 L138.6,400.0 L148.1,399.3 L157.6,398.5 L167.1,397.8 L176.6,397.3 L186.1,396.6 L195.5,395.8 L205.0,395.4 L214.5,394.4 L224.0,393.9 L233.5,393.1 L243.0,392.9 L252.5,392.5 L262.0,392.3 L271.5,391.9 L281.1,391.6 L290.6,391.3 L300.1,390.9 L309.6,390.0 L319.1,389.7 L328.6,389.2 L338.1,388.7 L347.6,388.1 L357.0,388.4" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.9 L91.0,412.1 L100.5,400.3 L110.0,395.1 L119.6,392.7 L129.1,392.7 L138.6,393.3 L148.1,393.2 L157.6,393.1 L167.1,373.1 L176.6,367.9 L186.1,360.7 L195.5,360.6 L205.0,360.6 L214.5,360.6 L224.0,360.5 L233.5,343.0 L243.0,333.5 L252.5,328.3 L262.0,328.0 L271.5,323.5 L281.1,316.0 L290.6,311.2 L300.1,310.9 L309.6,307.5 L319.1,304.1 L328.6,300.7 L338.1,297.3 L347.6,296.1 L357.0,293.7" fill="none" stroke="#56b6c2" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.7 L91.0,411.7 L100.5,411.6 L110.0,411.6 L119.6,392.4 L129.1,385.5 L138.6,385.3 L148.1,385.9 L157.6,385.4 L167.1,385.3 L176.6,367.1 L186.1,358.6 L195.5,357.8 L205.0,352.6 L214.5,348.2 L224.0,348.2 L233.5,347.9 L243.0,347.9 L252.5,334.1 L262.0,329.2 L271.5,324.0 L281.1,319.5 L290.6,314.6 L300.1,310.5 L309.6,310.5 L319.1,310.5 L328.6,301.9 L338.1,298.5 L347.6,298.5 L357.0,298.5 L366.5,298.4 L376.0,286.2 L385.5,282.7 L395.0,282.6 L404.5,279.3 L414.0,276.0 L423.5,272.0 L433.0,268.6 L442.6,265.2 L452.1,261.9 L461.6,261.8 L471.1,258.4 L480.6,254.6 L490.1,252.8 L499.6,252.6 L509.1,252.4 L518.5,252.2 L528.0,252.2 L537.5,252.2 L547.0,252.2 L556.5,254.3 L566.0,252.2 L575.5,252.1 L585.0,252.1 L594.5,252.0 L604.1,252.1 L613.6,252.0 L623.1,252.0 L632.6,252.1 L642.1,252.0 L651.6,252.0 L661.1,251.9 L670.6,251.9 L680.0,252.0 L689.5,273.4 L699.0,270.1 L708.5,270.1 L718.0,270.1 L727.5,270.0 L737.0,270.0 L746.5,260.9 L756.0,254.0 L765.6,250.9 L775.1,247.4 L784.6,247.4 L794.1,247.4 L803.6,247.4 L813.1,238.5 L822.6,235.7 L832.1,231.9 L841.5,228.5 L851.0,228.5 L860.5,225.5 L870.0,221.8 L879.5,218.0 L889.0,216.2 L898.5,211.8 L908.0,208.0 L917.5,208.0 L927.1,205.3 L936.6,199.7 L946.1,199.6 L955.6,199.6 L965.1,199.6 L974.6,199.5 L984.1,186.0 L993.6,185.8 L1003.0,185.8 L1012.5,185.8 L1022.0,185.7" fill="none" stroke="#56b6c2" stroke-width="2.5" opacity="0.8"/>
|
||
<path d="M81.5,410.3 L91.0,404.3 L100.5,402.6 L110.0,401.7 L119.6,401.7 L129.1,400.5 L138.6,400.5 L148.1,399.6 L157.6,399.0 L167.1,398.5 L176.6,398.0 L186.1,397.3 L195.5,396.0 L205.0,395.6 L214.5,394.8 L224.0,394.4 L233.5,393.3 L243.0,393.2 L252.5,392.8 L262.0,392.5 L271.5,392.0 L281.1,391.8 L290.6,391.3 L300.1,390.7 L309.6,390.2 L319.1,389.5 L328.6,389.4 L338.1,388.3 L347.6,387.1 L357.0,386.8 L366.5,386.4 L376.0,385.9 L385.5,385.4 L395.0,385.4 L404.5,385.4 L414.0,385.3 L423.5,384.9 L433.0,384.4 L442.6,384.3 L452.1,384.3 L461.6,384.3 L471.1,384.0 L480.6,383.6 L490.1,383.6 L499.6,383.6 L509.1,383.6 L518.5,383.1 L528.0,382.9 L537.5,382.7 L547.0,382.6 L556.5,382.6 L566.0,382.5 L575.5,382.4 L585.0,382.3 L594.5,382.1 L604.1,382.1 L613.6,381.7 L623.1,381.4 L632.6,380.5 L642.1,380.3 L651.6,380.3 L661.1,379.6 L670.6,379.3 L680.0,379.3 L689.5,379.0 L699.0,380.5 L708.5,380.0 L718.0,379.8 L727.5,379.8 L737.0,379.7 L746.5,379.0 L756.0,379.0 L765.6,378.5 L775.1,379.1 L784.6,379.1 L794.1,379.1 L803.6,378.6 L813.1,378.6 L822.6,378.6 L832.1,378.5 L841.5,378.2 L851.0,378.2 L860.5,378.1 L870.0,378.1 L879.5,378.1 L889.0,378.1 L898.5,377.8 L908.0,377.7 L917.5,377.5 L927.1,377.5 L936.6,377.5 L946.1,377.4 L955.6,377.0 L965.1,376.6 L974.6,376.6 L984.1,376.3 L993.6,376.2 L1003.0,376.2 L1012.5,376.2 L1022.0,376.1" fill="none" stroke="#e06c75" stroke-width="2.5" opacity="0.8"/>
|
||
<path d="M81.5,411.6" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.4" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.6" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.4" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,409.9 L91.0,405.6 L100.5,403.0" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.8 L91.0,411.8 L100.5,411.8" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.1 L91.0,411.1 L100.5,411.0 L110.0,411.0 L119.6,411.0 L129.1,387.2 L138.6,381.3 L148.1,381.2 L157.6,381.1 L167.1,381.1 L176.6,381.1 L186.1,381.1 L195.5,354.9 L205.0,350.8 L214.5,350.8 L224.0,350.7 L233.5,350.7 L243.0,350.6 L252.5,350.5 L262.0,350.5" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,410.6 L91.0,406.3 L100.5,403.2" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,412.0 L91.0,411.6 L100.5,411.6" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,409.1 L91.0,402.8 L100.5,401.3 L110.0,400.5 L119.6,399.8 L129.1,399.5 L138.6,399.4 L148.1,398.5 L157.6,398.0 L167.1,397.2 L176.6,396.8 L186.1,396.1 L195.5,394.9 L205.0,394.5 L214.5,393.7 L224.0,392.8 L233.5,392.4 L243.0,392.0 L252.5,391.7 L262.0,391.0" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,409.7 L91.0,405.0 L100.5,403.5 L110.0,402.8 L119.6,402.5 L129.1,400.9 L138.6,400.7 L148.1,399.7 L157.6,399.2 L167.1,398.5 L176.6,398.0 L186.1,397.3 L195.5,396.5 L205.0,395.9 L214.5,395.1 L224.0,394.7 L233.5,393.8 L243.0,393.7 L252.5,393.3 L262.0,392.5" fill="none" stroke="#e06c75" stroke-width="1.5" opacity="0.8"/>
|
||
<path d="M81.5,411.8 L91.0,411.7 L100.5,411.7 L110.0,411.7 L119.6,392.3 L129.1,385.5 L138.6,378.8 L148.1,373.3 L157.6,373.3 L167.1,373.2 L176.6,373.2 L186.1,372.8 L195.5,372.8 L205.0,372.8 L214.5,345.0 L224.0,341.0 L233.5,336.2 L243.0,335.7 L252.5,331.0 L262.0,326.1" fill="none" stroke="#61afef" stroke-width="1.5" opacity="0.8"/>
|
||
<text x="357" y="290.53338792588977" fill="#e06c75" font-size="17" text-anchor="middle" font-weight="bold">×</text>
|
||
<text x="357" y="275.53338792588977" fill="#e06c75" font-size="11" text-anchor="middle">crash @3000</text>
|
||
<text x="347.595" y="290.23590545385184" fill="#e06c75" font-size="17" text-anchor="middle" font-weight="bold">×</text>
|
||
<text x="347.595" y="275.23590545385184" fill="#e06c75" font-size="11" text-anchor="middle">crash @2901</text>
|
||
<text x="72" y="492" fill="#6f7689" font-size="11">2GB hard cap (systemd cgroup). × = killed for running out of memory. Crash marks on older OpenTUI runs are the exit-7 bug, fixed in the latest runs.</text>
|
||
</svg><figcaption>Takeaway: Ink stays flat (~250MB) no matter how long the marathon runs; OpenTUI climbs toward ~870MB and only levels off thanks to its rolling row cap. Neither hits the 2GB kill line.</figcaption></figure>
|
||
|
||
<h3>Stress-run numbers (3,000-msg marathons + one 10,000-msg run)</h3>
|
||
<table>
|
||
<tr><th>config</th><th>memory growth<br>MB per 1k msgs<br>(3,000-msg runs)</th><th>memory growth<br>MB per 1k<br>(10,000-msg run)</th><th>settled memory MB<br>(plateau, end of run)</th><th>peak memory MB</th><th>scroll ms — typical /<br>slowest 1 in 10 /<br>slowest 1 in 100<br>(p50/p90/p99)</th><th>CPU ms per event<br>(paced stream)</th><th>killed by 2GB cap?</th></tr>
|
||
<tr>
|
||
<td><b style="color:#e06c75">Ink</b></td>
|
||
<td>25.48 <span class="iqr">[middle half: 23.89–27.74]</span></td>
|
||
<td>5.88</td>
|
||
<td>249 <span class="iqr">[middle half: 247–250]</span></td>
|
||
<td>257 <span class="iqr">[middle half: 256–258]</span></td>
|
||
<td>2.0 / 36.1 / 98.5</td>
|
||
<td>31.04 <span class="iqr">[middle half: 30.99–31.23]</span></td>
|
||
<td>none</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b style="color:#61afef">OpenTUI</b></td>
|
||
<td>254.74 <span class="iqr">[middle half: 250.81–265.46]</span></td>
|
||
<td>not run</td>
|
||
<td>767 <span class="iqr">[middle half: 741–799]</span></td>
|
||
<td>875 <span class="iqr">[middle half: 868–879]</span></td>
|
||
<td>2.0 / 3.0 / 17.0</td>
|
||
<td>30.00 <span class="iqr">[middle half: 30.00–30.05]</span></td>
|
||
<td>none</td>
|
||
</tr>
|
||
<tr>
|
||
<td><b style="color:#56b6c2">OpenTUI (no cap)</b></td>
|
||
<td>297.65 <span class="iqr">[middle half: 283.88–311.91]</span></td>
|
||
<td>173.76</td>
|
||
<td>807 <span class="iqr">[middle half: 796–813]</span></td>
|
||
<td>890 <span class="iqr">[middle half: 874–893]</span></td>
|
||
<td>2.0 / 3.0 / 14.0</td>
|
||
<td>30.09 <span class="iqr">[middle half: 30.09–30.10]</span></td>
|
||
<td>none</td>
|
||
</tr>
|
||
</table>
|
||
<p class="dim">Reading guide: "typical" = median; the bracketed range is the middle half of runs
|
||
(interquartile range). "slowest 1 in 100" = p99. OpenTUI's syntax styling visibly degrades past ~1,400
|
||
rendered rows in these marathons (style-handle exhaustion fallback); older OpenTUI runs also show a
|
||
post-stream crash that was fixed before the latest runs.</p>
|
||
|
||
<figure><svg xmlns="http://www.w3.org/2000/svg" width="1040" height="500" viewBox="0 0 1040 500" font-family="ui-monospace,monospace">
|
||
<rect width="1040" height="500" fill="#11151c"/>
|
||
<text x="72" y="28" fill="#e8eaf0" font-size="18" font-weight="bold">Live UI nodes during the 3,000-msg marathon (diagnostic run)</text>
|
||
<line x1="72" y1="48" x2="72" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="72" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">0</text>
|
||
<line x1="230.33333333333331" y1="48" x2="230.33333333333331" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="230.33333333333331" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">500</text>
|
||
<line x1="388.66666666666663" y1="48" x2="388.66666666666663" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="388.66666666666663" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">1000</text>
|
||
<line x1="547" y1="48" x2="547" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="547" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">1500</text>
|
||
<line x1="705.3333333333333" y1="48" x2="705.3333333333333" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="705.3333333333333" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">2000</text>
|
||
<line x1="863.6666666666667" y1="48" x2="863.6666666666667" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="863.6666666666667" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">2500</text>
|
||
<line x1="1022" y1="48" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="1022" y="450" fill="#8b93a7" font-size="12" text-anchor="middle">3000</text>
|
||
<line x1="72" y1="430" x2="1022" y2="430" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="434" fill="#8b93a7" font-size="12" text-anchor="end">0</text>
|
||
<line x1="72" y1="353.6" x2="1022" y2="353.6" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="357.6" fill="#8b93a7" font-size="12" text-anchor="end">84</text>
|
||
<line x1="72" y1="277.2" x2="1022" y2="277.2" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="281.2" fill="#8b93a7" font-size="12" text-anchor="end">169</text>
|
||
<line x1="72" y1="200.79999999999995" x2="1022" y2="200.79999999999995" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="204.79999999999995" fill="#8b93a7" font-size="12" text-anchor="end">253</text>
|
||
<line x1="72" y1="124.39999999999998" x2="1022" y2="124.39999999999998" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="128.39999999999998" fill="#8b93a7" font-size="12" text-anchor="end">337</text>
|
||
<line x1="72" y1="48" x2="1022" y2="48" stroke="#262c38" stroke-width="1"/>
|
||
<text x="64" y="52" fill="#8b93a7" font-size="12" text-anchor="end">421</text>
|
||
<text x="547" y="474" fill="#aab2c5" font-size="13" text-anchor="middle">messages streamed into the session</text>
|
||
<text x="18" y="239" fill="#aab2c5" font-size="13" text-anchor="middle" transform="rotate(-90 18 239)">live nodes</text>
|
||
<path d="M72.0,355.6 L103.7,92.7 L294.0,192.4 L452.3,82.7 L547.0,194.3 L705.3,305.8 L800.6,305.8 L895.6,207.9 L1022.0,212.4" fill="none" stroke="#e06c75" stroke-width="2" opacity="1"/>
|
||
<rect x="792" y="49" width="14" height="3" fill="#e06c75"/>
|
||
<text x="812" y="56" fill="#cdd3e0" font-size="12">Ink live layout nodes</text>
|
||
<text x="72" y="492" fill="#6f7689" font-size="11">Diagnostic instrumented runs only — never used for the headline numbers.</text>
|
||
</svg><figcaption>Takeaway: Ink keeps a bounded few hundred nodes mounted no matter how long the transcript gets — consistent with its flat memory line above. (No OpenTUI node-walk run in this result set.)</figcaption></figure>
|
||
|
||
<h3>Low-memory survival (1GB Docker container)</h3>
|
||
<table><tr><th>cell</th><th>UI</th><th>memory limit</th><th>result</th><th>msgs survived</th><th>peak memory</th><th>basis</th></tr><tr><td>e3lite-1g</td><td>Ink</td><td>1 GB</td>
|
||
<td>completed</td><td>10000</td>
|
||
<td>223 MB</td><td>—</td></tr><tr><td>e3lite-1g</td><td>OpenTUI</td><td>1 GB</td>
|
||
<td>died</td><td>3000</td>
|
||
<td>849 MB</td><td>—</td></tr></table>
|
||
|
||
<h2>Run health — can you trust these numbers?</h2>
|
||
<p>Determinism gate: each UI replayed the same input twice and must produce a pixel-identical final screen
|
||
(same fingerprint). If this fails, none of the comparisons above are meaningful.</p>
|
||
<table><tr><th>UI</th><th>replay fingerprints (same input must give same screen)</th><th>gate</th></tr><tr><td>Ink</td><td>7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b · 7775bee02e57da2b</td><td style="color:#98c379">PASS</td></tr><tr><td>OpenTUI</td><td>d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac · d5e9558583159eac</td><td style="color:#98c379">PASS</td></tr></table>
|
||
<p style="color:#e5c07b">⚠ some runs were flagged: the test rig itself lagged (results kept, but read with care):</p>
|
||
<table><tr><th>run</th><th>max rig lag</th><th>lags >10ms</th></tr><tr><td>2026-06-10T2058-50e3471-mem3000-opentui-otui-capped-r0.json</td><td>18 ms</td><td>2</td></tr><tr><td>2026-06-10T2058-50e3471-mem3000-opentui-otui-uncapped-r0.json</td><td>22 ms</td><td>3</td></tr><tr><td>2026-06-10T2059-14ee1a5-mem3000-opentui-otui-uncapped-r1.json</td><td>33 ms</td><td>3</td></tr><tr><td>2026-06-10T2100-197d499-mem3000-opentui-otui-capped-r2.json</td><td>22 ms</td><td>3</td></tr><tr><td>2026-06-10T2100-197d499-mem3000-opentui-otui-uncapped-r2.json</td><td>19 ms</td><td>2</td></tr><tr><td>2026-06-10T2107-197d499-cpu800-opentui-otui-uncapped-r0.json</td><td>11 ms</td><td>1</td></tr><tr><td>2026-06-10T2108-197d499-cpu800-opentui-otui-capped-r0.json</td><td>15 ms</td><td>1</td></tr><tr><td>2026-06-10T2116-197d499-cpu800-opentui-otui-capped-r1.json</td><td>11 ms</td><td>1</td></tr><tr><td>2026-06-10T2124-197d499-scroll2000-opentui-otui-capped-r0.json</td><td>15 ms</td><td>2</td></tr><tr><td>2026-06-10T2125-197d499-scroll2000-opentui-otui-uncapped-r0.json</td><td>26 ms</td><td>2</td></tr><tr><td>2026-06-10T2126-197d499-scroll2000-opentui-otui-capped-r1.json</td><td>23 ms</td><td>2</td></tr><tr><td>2026-06-10T2126-197d499-scroll2000-opentui-otui-uncapped-r1.json</td><td>21 ms</td><td>2</td></tr><tr><td>2026-06-10T2127-197d499-scroll2000-opentui-otui-uncapped-r2.json</td><td>15 ms</td><td>2</td></tr><tr><td>2026-06-10T2128-197d499-scroll2000-opentui-otui-capped-r2.json</td><td>20 ms</td><td>2</td></tr><tr><td>2026-06-10T2146-197d499-slope10000-opentui-otui-uncapped-r0.json</td><td>25 ms</td><td>4</td></tr><tr><td>2026-06-10T2147-e3-e3lite-1g-opentui-otui-capped-r0.json</td><td>14 ms</td><td>3</td></tr><tr><td>2026-06-10T2236-a939c9a-mem3000-opentui-otui-capped-r0.json</td><td>24 ms</td><td>4</td></tr><tr><td>2026-06-10T2237-a939c9a-mem3000-opentui-otui-uncapped-r0.json</td><td>14 ms</td><td>2</td></tr><tr><td>2026-06-10T2237-a939c9a-slope10000-opentui-otui-uncapped-r0.json</td><td>69 ms</td><td>17</td></tr><tr><td>2026-06-11T0240-805e080-mem2000-opentui-otui-capped-r0.json</td><td>25 ms</td><td>2</td></tr><tr><td>2026-06-11T0325-cbe703c-chaos-ink-ink-rgw-stop.json</td><td>13 ms</td><td>1</td></tr></table>
|
||
<p class="dim">Methodology: <code>docs/plans/opentui-bench-suite.md</code>. Real binaries on a real PTY
|
||
(120×40), fake gateway via <code>HERMES_PYTHON</code> (zero UI changes), outside-the-process /proc sampling,
|
||
2GB cgroup caps via systemd. Instrumented diagnostic runs are flagged and never headlined.</p>
|
||
|
||
</body></html>
|