Files
colibri/site/index.html
T
JustVugg c6801451bd site: bring the official website + Pages deploy workflow to main (#424)
The site.yml workflow deploys on push to main, so the site only goes live once
site/ is on main. Bring site/index.html + icons + the workflow so a GitHub
Pages deploy (Settings -> Pages -> Source: GitHub Actions) publishes it at
justvugg.github.io/colibri.

Refs #424

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 17:43:46 +02:00

699 lines
96 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>colibrì — tiny engine, immense model</title>
<meta name="description" content="Run GLM-5.2, a 744B-parameter Mixture-of-Experts model, on your own machine — pure C, zero dependencies, experts streamed from disk. Open the model up: run it, study it, improve it.">
<meta property="og:title" content="colibrì — tiny engine, immense model">
<meta property="og:description" content="A 744B MoE on consumer hardware: pure C, zero dependencies, 19,456 experts tiered across VRAM, RAM and disk. Run it, study it, improve it.">
<meta property="og:image" content="https://raw.githubusercontent.com/JustVugg/colibri/main/docs/media/colibri-atlas.png">
<meta property="og:type" content="website">
<link rel="icon" type="image/svg+xml" href="colibri-icon.svg">
<style>
:root{
--bg:#04060c; --bg2:#080c1a; --panel:rgba(13,18,38,.72); --line:#1b2342; --line2:#2a3560;
--txt:#e6ebfa; --dim:#8a96bd; --faint:#4a5478;
--magenta:#d75fd7; --cyan:#4dd8ff; --gold:#ffb84d; --green:#5ee88f;
--mono:ui-monospace,'Cascadia Code','JetBrains Mono',Menlo,Consolas,monospace;
--sans:system-ui,-apple-system,'Segoe UI',Roboto,'Helvetica Neue',sans-serif;
}
*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{background:var(--bg);color:var(--txt);font-family:var(--sans);line-height:1.65;overflow-x:hidden}
a{color:var(--cyan);text-decoration:none}
a:hover{text-decoration:underline}
::selection{background:#7a2d8f;color:#fff}
/* ---------- nav ---------- */
nav{position:fixed;top:0;left:0;right:0;z-index:60;display:flex;align-items:center;gap:1.5rem;
padding:.85rem clamp(1rem,4vw,3.5rem);transition:background .3s,border-color .3s;
border-bottom:1px solid transparent}
nav.scrolled{background:rgba(4,6,12,.85);backdrop-filter:blur(10px);border-color:var(--line)}
nav .brand{display:flex;align-items:center;gap:.55rem;font-family:var(--mono);font-weight:700;color:var(--txt);font-size:1rem}
nav .brand img{width:24px;height:24px}
nav .links{margin-left:auto;display:flex;gap:1.6rem;font-size:.9rem;font-family:var(--mono)}
nav .links a{color:var(--dim)} nav .links a:hover{color:var(--txt);text-decoration:none}
@media(max-width:640px){nav .links a:not(.gh){display:none}}
/* ---------- hero ---------- */
.hero{position:relative;min-height:100svh;display:flex;flex-direction:column;
align-items:center;justify-content:center;text-align:center;overflow:hidden;
padding:5rem clamp(1rem,4vw,3rem) 4rem}
#atlas-hero{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;opacity:.5}
.hero::after{content:'';position:absolute;inset:0;pointer-events:none;
background:radial-gradient(ellipse at 50% 55%,transparent 30%,var(--bg) 88%)}
.hero>*{position:relative;z-index:2}
.hero .kicker{font-family:var(--mono);font-size:.85rem;letter-spacing:.35em;color:var(--dim);
text-transform:uppercase;margin-bottom:1.4rem}
.hero h1{font-size:clamp(3.4rem,11vw,7.5rem);font-weight:800;letter-spacing:-.03em;line-height:1;
background:linear-gradient(120deg,#fff 30%,#c9a0e8 60%,var(--magenta));
-webkit-background-clip:text;background-clip:text;color:transparent}
.hero .tag{font-family:var(--mono);font-size:clamp(1rem,2.4vw,1.35rem);color:var(--txt);margin-top:1.1rem}
.hero .sub{max-width:44rem;margin:1.3rem auto 0;color:var(--dim);font-size:clamp(.95rem,1.6vw,1.06rem)}
.hero .sub b{color:var(--txt)}
.cta{display:flex;gap:.9rem;justify-content:center;margin-top:2.2rem;flex-wrap:wrap}
.btn{font-family:var(--mono);font-size:.95rem;padding:.7rem 1.5rem;border-radius:10px;border:1px solid var(--line2);
color:var(--txt);background:rgba(13,18,38,.6);backdrop-filter:blur(4px);transition:all .18s}
.btn:hover{border-color:var(--magenta);text-decoration:none;transform:translateY(-2px)}
.btn.primary{background:linear-gradient(135deg,#8f2da0,#c44ec4);border-color:#c44ec4;box-shadow:0 4px 30px rgba(215,95,215,.25)}
.stats{display:flex;justify-content:center;gap:clamp(1.4rem,4.5vw,3.6rem);margin-top:3.2rem;flex-wrap:wrap}
.stats div{font-family:var(--mono)}
.stats .n{font-size:clamp(1.5rem,3.4vw,2.3rem);font-weight:800;color:var(--txt);letter-spacing:-.02em}
.stats .l{font-size:.72rem;color:var(--faint);letter-spacing:.14em;text-transform:uppercase;margin-top:.15rem}
.scrollcue{position:absolute;bottom:1.6rem;left:50%;transform:translateX(-50%);z-index:2;
font-family:var(--mono);font-size:.72rem;color:var(--faint);letter-spacing:.2em}
.scrollcue::after{content:'▾';display:block;text-align:center;animation:cue 1.6s infinite}
@keyframes cue{50%{transform:translateY(5px);opacity:.4}}
/* ---------- sections ---------- */
main{position:relative;z-index:1}
section{padding:clamp(4rem,11vh,8rem) clamp(1rem,4vw,3rem);max-width:1220px;margin:0 auto}
.snum{font-family:var(--mono);font-size:.8rem;letter-spacing:.3em;color:var(--magenta);text-transform:uppercase}
h2{font-size:clamp(1.9rem,4.5vw,3.1rem);font-weight:800;letter-spacing:-.02em;line-height:1.15;margin:.5rem 0 1rem}
.lead{color:var(--dim);max-width:56rem;font-size:clamp(.98rem,1.7vw,1.12rem);margin-bottom:2.2rem}
.lead b{color:var(--txt)} .lead .hl{color:var(--gold)}
/* vision */
#vision{text-align:center;max-width:1000px}
#vision .manifesto{font-size:clamp(1.5rem,3.6vw,2.5rem);font-weight:700;letter-spacing:-.015em;
line-height:1.35;max-width:56rem;margin:0 auto}
#vision .manifesto em{font-style:normal;background:linear-gradient(120deg,var(--cyan),var(--magenta));
-webkit-background-clip:text;background-clip:text;color:transparent}
#vision .manifesto .dimline{color:var(--dim);font-weight:400;font-size:.72em}
.pillars{display:grid;grid-template-columns:repeat(3,1fr);gap:1.1rem;margin-top:3.2rem;text-align:left}
@media(max-width:820px){.pillars{grid-template-columns:1fr}}
.pillar{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:1.6rem 1.5rem;
backdrop-filter:blur(6px)}
.pillar .ic{font-size:1.5rem;margin-bottom:.6rem}
.pillar h3{font-family:var(--mono);font-size:1.02rem;margin-bottom:.45rem}
.pillar p{font-size:.9rem;color:var(--dim)}
.pillar p b{color:var(--txt)}
/* algorithm */
.algo-grid{display:grid;grid-template-columns:1.15fr 1fr;gap:2.4rem;align-items:start}
@media(max-width:920px){.algo-grid{grid-template-columns:1fr}}
.algo-copy p{color:var(--dim);margin-bottom:1.1rem;font-size:.98rem}
.algo-copy p b{color:var(--txt)}
.algo-copy .jit{border-left:3px solid var(--magenta);padding:.2rem 0 .2rem 1.1rem;margin:1.4rem 0;
font-size:1.06rem;color:var(--txt)}
.tierstack{display:flex;flex-direction:column;gap:.7rem;font-family:var(--mono)}
.tlevel{border:1px solid var(--line);border-radius:14px;padding:1rem 1.2rem;background:var(--panel);
display:flex;align-items:center;gap:1rem;backdrop-filter:blur(6px)}
.tlevel .sw{width:13px;height:13px;border-radius:4px;flex:none}
.tlevel .tn{font-weight:700;font-size:.95rem;width:4.2rem;flex:none}
.tlevel .td{font-size:.78rem;color:var(--dim)}
.tlevel .td b{color:var(--txt)}
.tarrow{text-align:center;color:var(--faint);font-size:.8rem;letter-spacing:.2em}
.research{margin-top:2rem;border:1px dashed var(--line2);border-radius:14px;padding:1.1rem 1.3rem;
font-size:.9rem;color:var(--dim);background:rgba(215,95,215,.04)}
.research b{color:var(--gold)}
/* demo */
.profiles{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1.1rem}
.profiles button{font-family:var(--mono);font-size:.8rem;padding:.5rem .95rem;border-radius:9px;cursor:pointer;
background:var(--panel);border:1px solid var(--line);color:var(--dim);transition:all .15s;backdrop-filter:blur(4px)}
.profiles button:hover{color:var(--txt);border-color:var(--line2)}
.profiles button.on{color:var(--txt);border-color:var(--magenta);background:rgba(122,45,143,.25);
box-shadow:0 0 18px rgba(215,95,215,.15)}
.demo-grid{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:1.1rem}
@media(max-width:900px){.demo-grid{grid-template-columns:1fr}}
.win{background:var(--panel);border:1px solid var(--line);border-radius:16px;overflow:hidden;min-width:0;
backdrop-filter:blur(8px);box-shadow:0 8px 40px rgba(0,0,0,.35)}
.win.wide{grid-column:1/-1}
.win .bar{display:flex;align-items:center;gap:.45rem;padding:.6rem .95rem;border-bottom:1px solid var(--line);
font-family:var(--mono);font-size:.78rem;color:var(--faint)}
.win .bar .dot{width:10px;height:10px;border-radius:50%;background:#2a3560}
.win .bar .dot.r{background:#e4576b}.win .bar .dot.y{background:#e2b34f}.win .bar .dot.g{background:#57c07a}
.win .bar .ttl{margin-left:.4rem}
#term{font-family:var(--mono);font-size:.8rem;line-height:1.55;padding:1rem;height:380px;overflow-y:auto;
white-space:pre-wrap;word-break:break-word;color:#b9c3e0}
#term .banner{color:var(--magenta)} #term .bannertxt{color:var(--faint)}
#term .you{color:var(--gold)} #term .ans{color:#d5dcf0} #term .statline{color:var(--green)}
#term .cursor{display:inline-block;width:.55em;height:1.05em;background:var(--cyan);vertical-align:-0.18em;
animation:blink 1s steps(1) infinite}
@keyframes blink{50%{opacity:0}}
.brainwrap{padding:1rem;display:flex;flex-direction:column;gap:.8rem}
#brain{width:100%;image-rendering:pixelated;border-radius:8px;background:#060918;display:block}
.meters{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem;font-family:var(--mono)}
.meter{background:rgba(8,12,26,.8);border:1px solid var(--line);border-radius:10px;padding:.6rem .75rem}
.meter .v{font-size:1.3rem;font-weight:800}
.meter .v small{font-size:.68rem;font-weight:400;color:var(--faint)}
.meter .k{font-size:.66rem;color:var(--faint);letter-spacing:.08em;text-transform:uppercase}
#m-toks .v{color:var(--green)} #m-ttft .v{color:var(--cyan)} #m-hit .v{color:var(--gold)}
.legend{display:flex;gap:1.1rem;font-family:var(--mono);font-size:.72rem;color:var(--dim);flex-wrap:wrap}
.legend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:.35rem;vertical-align:-1px}
.note{font-size:.78rem;color:var(--faint);margin-top:1rem;font-family:var(--mono)}
#atlas-live{display:block;width:100%;height:300px;cursor:grab;touch-action:pan-y}
.livewrap{position:relative}
.livewrap .topicchip{position:absolute;top:.7rem;left:.9rem;font-family:var(--mono);font-size:.72rem;
color:var(--txt);background:rgba(8,12,26,.85);border:1px solid var(--line);border-radius:7px;padding:.28rem .65rem}
.livewrap .topicchip b{color:var(--gold)}
/* atlas */
#atlas-sec{max-width:none;padding-left:0;padding-right:0}
#atlas-sec .inner{max-width:1220px;margin:0 auto;padding:0 clamp(1rem,4vw,3rem)}
.atlaswrap{position:relative;margin-top:1.8rem;border-top:1px solid var(--line);border-bottom:1px solid var(--line);
background:radial-gradient(ellipse at 50% 40%,#0b1030 0%,var(--bg) 72%)}
#atlas{display:block;width:100%;height:min(76vh,680px);cursor:grab;touch-action:pan-y}
canvas.grabbing{cursor:grabbing}
.alabel{position:absolute;font-family:var(--mono);font-size:.76rem;pointer-events:none;
transform:translate(-50%,-50%);text-shadow:0 0 8px #000,0 0 3px #000;white-space:nowrap;transition:opacity .2s}
.ahint{position:absolute;bottom:.9rem;right:1.3rem;font-family:var(--mono);font-size:.72rem;color:var(--faint)}
.atl-legend{display:flex;gap:.4rem 1rem;font-family:var(--mono);font-size:.72rem;color:var(--dim);
flex-wrap:wrap;max-width:1220px;margin:1.1rem auto 0;padding:0 clamp(1rem,4vw,3rem)}
.atl-legend i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:.3rem;vertical-align:-1px}
/* ladder */
.ladder{width:100%;border-collapse:collapse;font-family:var(--mono);font-size:.86rem;margin-top:1.6rem}
.ladder th{color:var(--faint);font-weight:500;text-align:left;font-size:.7rem;letter-spacing:.12em;
text-transform:uppercase;padding:.55rem .85rem;border-bottom:1px solid var(--line2)}
.ladder td{padding:.7rem .85rem;border-bottom:1px solid #121936}
.ladder td.spd{color:var(--green);font-weight:800;white-space:nowrap}
.ladder tr:hover td{background:rgba(13,18,38,.6)}
.ladder .bar-td{width:34%;min-width:120px}
.ladder .sbar{height:9px;border-radius:5px;background:linear-gradient(90deg,#1f7a4b,var(--green));min-width:3px;
box-shadow:0 0 12px rgba(94,232,143,.25)}
/* models */
.models{display:grid;grid-template-columns:repeat(auto-fit,minmax(215px,1fr));gap:1rem;margin-top:2rem}
.model{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:1.35rem 1.3rem;
backdrop-filter:blur(6px);position:relative}
.model.live{border-color:#2a6f4b}
.model .status{font-family:var(--mono);font-size:.66rem;letter-spacing:.14em;text-transform:uppercase;
padding:.2rem .55rem;border-radius:20px;position:absolute;top:1.1rem;right:1.1rem}
.model.live .status{color:var(--green);background:rgba(94,232,143,.1);border:1px solid #2a6f4b}
.model.soon .status{color:var(--gold);background:rgba(255,184,77,.08);border:1px solid #6f5a2a}
.model h3{font-size:1.12rem;margin-bottom:.2rem;padding-right:5rem}
.model .by{font-family:var(--mono);font-size:.74rem;color:var(--faint);margin-bottom:.6rem}
.model p{font-size:.85rem;color:var(--dim)}
.thanks{margin-top:2.6rem;border:1px solid var(--line);border-radius:16px;padding:1.5rem 1.7rem;
background:linear-gradient(135deg,rgba(215,95,215,.05),rgba(77,216,255,.04))}
.thanks p{color:var(--dim);font-size:.95rem}
.thanks p b{color:var(--txt)}
/* contribute */
#contrib{text-align:center}
#contrib .lead{margin-left:auto;margin-right:auto}
.contrib-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:1rem;
margin-top:2rem;text-align:left}
.ccard{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:1.3rem 1.35rem;
backdrop-filter:blur(6px);transition:border-color .2s,transform .15s;color:var(--txt);display:block}
a.ccard:hover{border-color:var(--magenta);text-decoration:none;transform:translateY(-3px)}
.ccard h3{font-family:var(--mono);font-size:.95rem;margin-bottom:.35rem;color:var(--cyan)}
.ccard p{font-size:.85rem;color:var(--dim)}
footer{border-top:1px solid var(--line);padding:2.4rem clamp(1rem,4vw,3.5rem);display:flex;gap:1.6rem;flex-wrap:wrap;
align-items:center;font-size:.85rem;color:var(--faint);position:relative;z-index:1;font-family:var(--mono)}
footer .sp{margin-left:auto}
.reveal{opacity:0;transform:translateY(26px);transition:opacity .7s ease,transform .7s ease}
.reveal.in{opacity:1;transform:none}
@media(prefers-reduced-motion:reduce){
.reveal{opacity:1;transform:none;transition:none}
#term .cursor{animation:none}
.scrollcue::after{animation:none}
}
</style>
</head>
<body>
<nav id="topnav">
<a class="brand" href="#"><img src="colibri-icon.svg" alt=""> colibrì</a>
<div class="links">
<a href="#vision">vision</a>
<a href="#algo">algorithm</a>
<a href="#demo">demo</a>
<a href="#atlas-sec">atlas</a>
<a href="#models">models</a>
<a class="gh" href="https://github.com/JustVugg/colibri">GitHub ↗</a>
</div>
</nav>
<header class="hero">
<canvas id="atlas-hero"></canvas>
<div class="kicker">tiny engine · immense model</div>
<h1>colibrì</h1>
<div class="tag">a 744-billion-parameter mind, on your desk</div>
<p class="sub">Run <b>GLM-5.2 — 744B Mixture-of-Experts</b> — on hardware you already own.
Pure C, <b>zero dependencies</b>, experts staged just-in-time across VRAM, RAM and disk.
The galaxy behind this text is real: the model's <b>measured expert atlas</b>.</p>
<div class="cta">
<a class="btn primary" href="https://github.com/JustVugg/colibri">★ Star on GitHub</a>
<a class="btn" href="https://github.com/JustVugg/colibri/blob/main/docs/quickstart.md">Quick start →</a>
</div>
<div class="stats">
<div><div class="n">744B</div><div class="l">parameters</div></div>
<div><div class="n">19,456</div><div class="l">experts</div></div>
<div><div class="n">0</div><div class="l">dependencies</div></div>
<div><div class="n">25 GB</div><div class="l">min RAM</div></div>
<div><div class="n">9.2</div><div class="l">tok/s measured</div></div>
</div>
<div class="scrollcue">scroll</div>
</header>
<main>
<section id="vision" class="reveal">
<div class="snum">the vision</div>
<p class="manifesto">Frontier models should not be sealed inside datacenters.<br>
<em>Anyone curious enough should be able to open one up</em><br>
<span class="dimline">run it, watch every expert fire, and make it better.</span></p>
<div class="pillars">
<div class="pillar"><div class="ic"></div><h3>Run it</h3>
<p>A 744B frontier-class MoE answering on a <b>25 GB machine</b> — the proven floor — up to
9+ tok/s on a workstation. No cluster, no cloud bill, no API key.</p></div>
<div class="pillar"><div class="ic">🔬</div><h3>Study it</h3>
<p>The engine is a <b>microscope</b>: live routing telemetry, per-expert heat, and the first
published <b>expert atlas</b> of a 700B-class model — measured on machines like yours.</p></div>
<div class="pillar"><div class="ic">🛠</div><h3>Improve it</h3>
<p>One C file, readable in an afternoon. Every optimisation this project found came from
<b>someone measuring something</b> — the next one can come from you.</p></div>
</div>
</section>
<section id="algo" class="reveal">
<div class="snum">01 — the algorithm</div>
<h2>A JIT, but for weights</h2>
<div class="algo-grid">
<div class="algo-copy">
<p>A compiler JIT never compiles the whole program — it watches what actually runs
and compiles the <b>hot paths</b>, just in time. colibrì applies the same bet to a
744B parameter space: a token activates only <b>~40B parameters</b>, and just
<b>~11 GB</b> of those change from token to token — the routed experts.</p>
<div class="jit">So parameters are not resident state to be held — they are
<b>data to be staged</b>, exactly when the router proves they are needed.</div>
<p>The engine keeps the dense weights resident and treats the 19,456 experts as a
<b>heterogeneous storage hierarchy</b>: measured routing heat decides which experts earn
VRAM, which earn pinned RAM, and which stream from NVMe. The router runs a layer
ahead, so prefetch hides the staging latency — and because routing has
<b>measurable structure</b> (the atlas below), the hierarchy keeps getting the answer right.
Like a JIT, it learns your workload: the more you run, the hotter the right experts get.</p>
<p>Everything is validated <b>token-exact</b> against the reference transformers
implementation — speed never buys drift.</p>
<div class="research"><b>Active research:</b> the next algorithmic step is under way —
smarter placement and scheduling beyond LRU + pin, overlap of CPU and GPU expert execution,
and routing-aware speculation. Measured, reviewed, and merged in the open.</div>
</div>
<div class="tierstack">
<div class="tlevel"><span class="sw" style="background:var(--gold)"></span>
<span class="tn">VRAM</span><span class="td"><b>hottest experts</b> · grouped GPU matmuls ·
six 5090s hold the entire routed set — disk reads hit zero</span></div>
<div class="tarrow">↑ promote by measured heat ↓ demote</div>
<div class="tlevel"><span class="sw" style="background:var(--cyan)"></span>
<span class="tn">RAM</span><span class="td"><b>warm set</b> · pinned &amp; wired, learned from
your usage · AVX-512/NEON int4 kernels + LRU behind it</span></div>
<div class="tarrow">↑ promote ↓ demote</div>
<div class="tlevel"><span class="sw" style="background:#5a6aa8"></span>
<span class="tn">NVMe</span><span class="td"><b>cold tail</b> · streamed on demand with io_uring,
prefetched a layer ahead — how 744B fits a 25 GB machine at all</span></div>
<div class="note" style="margin-top:.4rem">token → router picks 8 of 256 experts × 75 layers →
gather across tiers → int4 matmul → next token</div>
</div>
</div>
</section>
<section id="demo" class="reveal">
<div class="snum">02 — the engine, live</div>
<h2>Watch it think</h2>
<p class="lead">A replay of the engine at work, paced to <b>measured decode speeds</b> from real
community hardware. The grid is all <b>19,456 experts</b> (colour = storage tier, brightness =
routing heat, routed = white flash); the galaxy below it is the <b>measured atlas</b>
watch different questions light different regions of the mind.</p>
<div class="profiles" id="profiles"></div>
<div class="demo-grid">
<div class="win">
<div class="bar"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>
<span class="ttl">coli chat — <span id="prof-name"></span></span></div>
<div id="term"></div>
</div>
<div class="win">
<div class="bar"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>
<span class="ttl">the brain — 75 MoE layers × 256 experts + MTP</span></div>
<div class="brainwrap">
<canvas id="brain" width="256" height="76"></canvas>
<div class="meters">
<div class="meter" id="m-toks"><div class="v">0.0<small> tok/s</small></div><div class="k">decode</div></div>
<div class="meter" id="m-ttft"><div class="v"></div><div class="k">ttft (measured)</div></div>
<div class="meter" id="m-hit"><div class="v"></div><div class="k">resident hit</div></div>
</div>
<div class="legend">
<span><i style="background:var(--gold)"></i>VRAM tier</span>
<span><i style="background:var(--cyan)"></i>RAM tier</span>
<span><i style="background:#2a3560"></i>disk tier</span>
<span><i style="background:#fff"></i>routed now</span>
</div>
</div>
</div>
<div class="win wide">
<div class="bar"><span class="dot r"></span><span class="dot y"></span><span class="dot g"></span>
<span class="ttl">the atlas, live — measured specialists routed by the current topic</span></div>
<div class="livewrap">
<canvas id="atlas-live"></canvas>
<div class="topicchip">routing: <b id="topicnow"></b></div>
</div>
</div>
</div>
<p class="note">Simulation replays a fixed transcript at each profile's measured decode rate
(<a href="https://github.com/JustVugg/colibri/issues/82">#82</a>, <a href="https://github.com/JustVugg/colibri/issues/389">#389</a>,
<a href="https://github.com/JustVugg/colibri/issues/387">#387</a>, <a href="https://github.com/JustVugg/colibri/issues/273">#273</a>);
“—” means that machine's report did not publish the number — nothing here is invented.
Atlas flashes sample real measured affinity (atlas&nbsp;v1) for the active topic.</p>
</section>
<section id="atlas-sec" class="reveal">
<div class="inner">
<div class="snum">03 — the atlas</div>
<h2>Measured, not assumed</h2>
<p class="lead">Every point below is a <b>real measured expert</b> from the published
<a href="https://gist.github.com/ZacharyZcR/d3e10905072229ed0114b1123120c611">canonical atlas v1</a>:
<b>721 canonical specialists</b> confirmed across three independent kernel families
(AVX-512&nbsp;VNNI · NEON · AVX2, engine-pinned, replication-gated) plus <b>637 gate-sensitive</b> ones.
Position <b>is</b> the measured 10-topic affinity vector — a specialist sits at its topic's anchor,
a generalist drifts to the centre. Colour = top topic, large points = canonical. <b>Drag to spin.</b></p>
</div>
<div class="atlaswrap">
<canvas id="atlas"></canvas>
<div id="alabels"></div>
<div class="ahint">drag to spin · scroll past to release</div>
</div>
<div class="atl-legend" id="atl-legend"></div>
</section>
<section id="ladder-sec" class="reveal">
<div class="snum">04 — the ladder</div>
<h2>Same engine, any hardware</h2>
<p class="lead">Measured decode on real community machines — the hardware only changes
<b>where the experts live</b>. Every row links to its public report.</p>
<table class="ladder">
<thead><tr><th>hardware</th><th>decode</th><th></th><th>where the experts live</th></tr></thead>
<tbody>
<tr><td>6× RTX 5090 · full residency + selective NUMA (<a href="https://github.com/JustVugg/colibri/issues/82">#82</a>)</td><td class="spd">9.09.2 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:100%"></div></td><td>all in VRAM+RAM · disk 0</td></tr>
<tr><td>2× Xeon Gold 6430 · 1 TB DDR5 · CPU-only (<a href="https://github.com/JustVugg/colibri/issues/389">#389</a>)</td><td class="spd">5.42 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:59%"></div></td><td>every expert pinned in RAM</td></tr>
<tr><td>DGX Spark GB10 · 121 GB unified (<a href="https://github.com/JustVugg/colibri/issues/161">#161</a>)</td><td class="spd">3.33 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:36%"></div></td><td>unified memory + CACHE_ROUTE</td></tr>
<tr><td>MacBook Pro M5 Max · 128 GB · Metal (<a href="https://github.com/JustVugg/colibri/issues/387">#387</a>)</td><td class="spd">2.0 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:22%"></div></td><td>Metal tier + warm pin</td></tr>
<tr><td>Ryzen AI Max+ 395 · 128 GB (<a href="https://github.com/JustVugg/colibri/issues/200">#200</a>)</td><td class="spd">1.83 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:20%"></div></td><td>hot set pinned in RAM</td></tr>
<tr><td>Ryzen 9 9950X3D2 · RTX 5090 · Gen5 NVMe (<a href="https://github.com/JustVugg/colibri/issues/120">#120</a>)</td><td class="spd">1.23 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:13%"></div></td><td>28 GB VRAM tier + 11.5 GB/s disk</td></tr>
<tr><td>single RTX 5070 Ti laptop-class (<a href="https://github.com/JustVugg/colibri/issues/273">#273</a>)</td><td class="spd">1.07 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:12%"></div></td><td>GPU-resident pipeline</td></tr>
<tr><td>25 GB dev box · cold — the proven floor</td><td class="spd">0.050.1 tok/s</td>
<td class="bar-td"><div class="sbar" style="width:2%"></div></td><td>streamed from NVMe</td></tr>
</tbody>
</table>
<p class="note">…and 15+ more community machines, from an M4 Pro Mac Mini to a 430 GB EPYC server.
Full tables, methodology and quality ablations: <a href="https://github.com/JustVugg/colibri/blob/main/docs/benchmarks.md">docs/benchmarks.md</a></p>
</section>
<section id="models" class="reveal">
<div class="snum">05 — the models</div>
<h2>One engine, more minds coming</h2>
<p class="lead">The tiering algorithm is model-agnostic: any Mixture-of-Experts with routed
experts can be staged the same way. GLM-5.2 is live today; support for more open-weight
families is on the roadmap.</p>
<div class="models">
<div class="model live"><span class="status">live</span><h3>GLM-5.2</h3><div class="by">Z.ai · 744B MoE</div>
<p>The flagship target: int4 container, token-exact vs reference, full atlas published.</p></div>
<div class="model live"><span class="status">live</span><h3>OLMoE</h3><div class="by">Allen AI · 7B MoE</div>
<p>The small research workhorse — quantization A/Bs and quality ablations run here first.</p></div>
<div class="model soon"><span class="status">planned</span><h3>Kimi K2</h3><div class="by">Moonshot AI · 1T MoE</div>
<p>The next scale step: a trillion-parameter mind on the same tiered engine.</p></div>
<div class="model soon"><span class="status">planned</span><h3>Qwen3 MoE</h3><div class="by">Alibaba Qwen</div>
<p>The most widely-deployed open family — broad hardware coverage meets broad adoption.</p></div>
<div class="model soon"><span class="status">planned</span><h3>MiniMax</h3><div class="by">MiniMax · MoE</div>
<p>Long-context specialists — a different routing profile for the atlas to map.</p></div>
</div>
<div class="thanks">
<p><b>Thank you</b> to the teams whose open weights make this project possible —
<b>Z.ai</b> (GLM), <b>Moonshot AI</b> (Kimi), <b>Alibaba Qwen</b>, <b>MiniMax</b>,
<b>Allen AI</b> (OLMoE), and everyone releasing frontier-class models in the open.
An engine is nothing without a mind to run.</p>
</div>
</section>
<section id="contrib" class="reveal">
<div class="snum">06 — join in</div>
<h2>Come build the microscope</h2>
<p class="lead">Every optimisation in this project started with <b>someone measuring something</b> on
their own machine — a disk swap, a NUMA experiment, an atlas replication on a Mac Mini.
You don't need a datacenter to move frontier-model research. That is the whole point.</p>
<div class="contrib-cards">
<a class="ccard" href="https://github.com/JustVugg/colibri/blob/main/docs/benchmarks.md"><h3>▸ run a benchmark</h3>
<p>Any hardware is a datapoint — the community table grows one issue at a time.</p></a>
<a class="ccard" href="https://github.com/JustVugg/colibri/issues"><h3>▸ pick an issue</h3>
<p>Kernels, schedulers, the atlas, the dashboard — measured problems, waiting.</p></a>
<a class="ccard" href="https://github.com/JustVugg/colibri/blob/main/docs/quickstart.md"><h3>▸ read the engine</h3>
<p>One C file plus headers, zero dependencies. Readable in an afternoon — really.</p></a>
</div>
</section>
</main>
<footer>
<span>🐦 colibrì — MIT license</span>
<a href="https://github.com/JustVugg/colibri">GitHub</a>
<a href="https://github.com/JustVugg/colibri/blob/main/docs/api.md">API</a>
<a href="https://github.com/JustVugg/colibri/blob/main/docs/tuning.md">Tuning</a>
<span class="sp">the hummingbird: tiny, fast, precise.</span>
</footer>
<script>
'use strict';
const REDUCED = matchMedia('(prefers-reduced-motion: reduce)').matches;
function mulberry32(a){return function(){a|=0;a=a+0x6D2B79F5|0;let t=Math.imul(a^a>>>15,1|a);
t=t+Math.imul(t^t>>>7,61|t)^t;return((t^t>>>14)>>>0)/4294967296}}
/* ============ MEASURED ATLAS DATA (canonical atlas v1) ============
1,358 experts characterised by the tools/expert_atlas harness (#175/#218):
721 canonical (strong + same top topic on all of VNNI/NEON/AVX2) and
637 gate-sensitive. Each row: [layer, expert, topicIdx, canonical, specx100,
[p×100 over the 10 measured categories]] — p is the VNNI affinity vector.
Source: gist.github.com/ZacharyZcR/d3e10905072229ed0114b1123120c611 */
const ATLAS_CATS=["casual_chat", "chinese", "code_python", "code_sql", "german", "json_format", "law", "math_proof", "medicine", "poetry"];
const ATLAS_RAW=[[7,16,5,1,59,[15,0,0,2,5,74,0,4,0,0]],[8,104,5,1,77,[1,2,2,2,5,83,2,2,0,0]],[8,159,4,1,60,[3,1,1,1,77,11,1,1,0,4]],[10,62,8,1,54,[12,2,0,4,0,0,5,3,74,0]],[11,21,9,1,64,[3,24,0,0,0,0,1,0,0,72]],[11,27,7,1,63,[0,0,5,0,0,7,3,81,5,0]],[11,85,4,1,78,[1,0,3,1,90,0,3,2,1,0]],[11,202,1,1,56,[0,75,3,5,0,2,0,0,6,9]],[11,223,8,1,56,[14,0,0,8,2,3,0,2,71,0]],[11,250,6,1,69,[0,0,0,10,0,0,81,4,4,0]],[12,125,5,1,96,[0,0,0,0,0,99,0,0,1,0]],[12,129,6,1,77,[0,0,0,3,4,0,88,4,1,0]],[12,201,9,1,64,[1,26,0,1,2,0,0,0,1,70]],[12,231,8,1,76,[0,0,0,3,0,0,8,3,86,0]],[14,27,8,1,64,[2,4,0,5,5,0,0,0,85,0]],[14,125,9,1,83,[0,7,1,0,0,0,0,0,0,91]],[15,134,9,1,56,[2,39,2,1,1,0,3,0,0,53]],[15,195,4,1,95,[0,0,1,0,98,0,0,0,1,0]],[16,21,2,1,69,[0,7,64,25,0,0,0,4,0,0]],[16,119,4,1,100,[0,0,0,0,100,0,0,0,0,0]],[16,214,4,1,73,[0,4,0,0,83,0,4,2,4,2]],[16,245,8,1,63,[8,0,1,0,16,0,0,0,75,0]],[17,0,5,1,100,[0,0,0,0,0,100,0,0,0,0]],[17,56,5,1,58,[1,4,3,4,2,78,1,4,1,1]],[17,58,9,1,77,[0,16,1,0,0,0,1,1,0,81]],[17,61,2,1,70,[0,0,68,32,0,0,0,0,0,0]],[17,62,9,1,70,[4,30,0,0,0,0,0,0,0,66]],[17,70,6,1,66,[9,0,3,0,3,4,78,3,0,0]],[17,75,4,1,100,[0,0,0,0,100,0,0,0,0,0]],[17,76,9,1,72,[2,26,0,0,0,0,0,0,0,72]],[17,97,8,1,54,[7,3,3,0,2,0,0,23,62,0]],[17,99,3,1,63,[0,0,14,70,0,16,0,0,0,0]],[17,110,8,1,79,[2,0,0,4,4,0,4,0,86,0]],[17,191,6,1,64,[0,1,1,2,6,2,80,8,0,0]],[17,195,7,1,71,[1,5,0,0,0,0,0,87,0,7]],[17,214,4,1,62,[0,8,2,2,75,0,3,0,10,0]],[18,32,8,1,86,[1,0,0,0,0,0,0,0,99,0]],[18,46,2,1,77,[0,0,90,3,0,5,0,0,2,0]],[18,52,8,1,75,[13,0,4,0,0,0,0,0,83,0]],[18,62,6,1,77,[0,0,0,2,0,0,85,12,0,0]],[18,129,7,1,62,[3,22,0,0,0,0,6,69,0,0]],[18,151,9,1,59,[1,5,0,0,0,0,38,0,0,56]],[18,168,4,1,70,[0,0,3,3,80,0,10,4,0,0]],[18,173,2,1,60,[5,0,72,7,0,3,0,14,0,0]],[18,203,8,1,57,[27,4,0,0,2,2,0,3,62,0]],[18,221,1,1,67,[2,80,0,2,3,0,2,2,2,8]],[18,227,5,1,79,[2,3,0,0,0,87,5,0,0,3]],[18,231,6,1,59,[1,1,0,0,2,15,73,7,0,0]],[18,234,3,1,77,[0,0,0,83,0,15,0,0,2,0]],[19,5,9,1,66,[2,27,0,1,0,0,0,0,0,69]],[19,6,1,1,61,[30,66,5,0,0,0,0,0,0,0]],[19,36,2,1,68,[3,2,83,0,1,0,0,11,0,0]],[19,39,8,1,65,[9,0,3,6,0,9,0,0,72,0]],[19,41,3,1,90,[0,0,1,97,0,2,0,0,1,0]],[19,45,3,1,63,[2,0,23,70,0,4,0,0,0,2]],[19,54,0,1,72,[78,0,0,5,0,0,0,0,18,0]],[19,102,5,1,89,[2,0,0,4,0,94,0,0,0,0]],[19,142,8,1,57,[1,2,3,1,3,0,3,7,78,0]],[19,143,9,1,57,[4,23,1,1,1,0,0,1,3,65]],[19,148,7,1,82,[1,4,1,1,0,0,1,91,2,0]],[19,157,5,1,60,[14,0,1,4,2,78,1,0,0,0]],[19,191,8,1,55,[0,0,2,0,4,0,22,0,66,6]],[19,242,8,1,75,[0,2,0,0,1,0,8,0,89,0]],[20,3,9,1,53,[4,22,3,1,0,1,1,2,1,64]],[20,5,0,1,69,[64,0,0,0,34,0,1,1,0,0]],[20,10,8,1,61,[3,0,7,4,1,0,0,10,75,0]],[20,12,3,1,85,[1,0,0,94,0,4,0,1,1,0]],[20,18,5,1,71,[0,3,1,0,3,85,2,0,1,4]],[20,37,1,1,56,[21,64,0,9,1,0,3,0,0,2]],[20,56,2,1,60,[0,0,67,0,0,15,1,4,13,0]],[20,87,9,1,56,[0,32,1,2,5,0,0,3,0,57]],[20,125,0,1,56,[70,9,0,0,12,0,0,6,0,4]],[20,140,4,1,66,[4,1,2,1,84,0,2,0,5,1]],[20,141,8,1,59,[2,13,2,0,4,0,0,10,69,0]],[20,162,7,1,79,[0,4,0,3,0,0,0,89,2,2]],[20,182,2,1,57,[0,0,69,4,0,8,1,16,1,1]],[21,6,2,1,67,[0,0,78,0,0,6,0,13,3,0]],[21,27,5,1,55,[0,0,26,0,0,60,0,14,0,0]],[21,29,0,1,65,[79,6,0,4,0,0,0,2,4,6]],[21,37,2,1,100,[0,0,100,0,0,0,0,0,0,0]],[21,43,0,1,65,[80,0,4,0,0,4,3,6,0,2]],[21,44,8,1,64,[7,2,0,0,6,0,0,1,82,2]],[21,69,5,1,88,[0,0,4,1,0,93,0,0,1,0]],[21,71,6,1,74,[0,9,1,0,0,4,86,0,0,0]],[21,91,3,1,63,[3,1,1,81,1,2,1,5,1,2]],[21,147,9,1,78,[0,15,0,0,0,0,0,0,0,85]],[21,155,4,1,91,[0,2,0,0,96,0,0,0,0,0]],[21,191,6,1,70,[0,1,1,0,11,2,82,0,1,1]],[21,228,6,1,89,[0,0,2,0,3,0,94,1,0,0]],[21,229,9,1,78,[0,16,0,0,0,0,0,0,0,84]],[21,240,9,1,66,[0,28,2,0,0,1,0,0,0,68]],[21,242,8,1,89,[0,2,0,0,2,0,0,0,96,0]],[21,255,8,1,87,[1,0,0,0,0,0,0,0,99,0]],[22,2,0,1,68,[77,0,5,0,0,0,0,0,0,18]],[22,19,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[22,41,5,1,76,[6,0,17,0,0,77,0,0,0,0]],[22,49,9,1,56,[8,26,0,0,2,2,0,0,1,61]],[22,89,5,1,54,[0,3,5,2,0,68,3,10,8,0]],[22,104,6,1,88,[0,0,1,2,0,0,95,3,0,0]],[22,117,8,1,90,[0,0,0,0,0,0,0,0,100,0]],[22,120,0,1,60,[63,5,0,0,2,2,0,3,25,0]],[22,123,3,1,92,[0,0,0,97,0,2,0,0,0,0]],[22,159,0,1,89,[97,0,0,0,0,0,0,0,3,0]],[22,181,9,1,75,[0,25,0,0,0,0,0,0,0,75]],[22,191,2,1,99,[0,0,100,0,0,0,0,0,0,0]],[22,199,8,1,71,[0,0,0,0,0,0,22,0,78,0]],[22,210,8,1,84,[0,0,0,1,0,1,2,0,95,0]],[22,218,5,1,77,[0,0,0,19,0,81,0,0,0,0]],[22,233,9,1,83,[1,5,0,0,1,0,0,0,0,92]],[23,3,4,1,59,[2,4,3,0,73,0,2,0,4,13]],[23,75,9,1,73,[1,21,0,1,0,0,1,0,0,75]],[23,150,6,1,82,[0,0,0,5,2,2,91,0,1,0]],[24,14,9,1,72,[11,10,0,0,0,0,0,0,0,78]],[24,17,4,1,52,[0,11,13,3,67,3,3,0,0,0]],[24,57,7,1,80,[3,0,8,0,0,0,0,89,0,0]],[24,71,9,1,63,[5,16,0,1,1,0,1,0,0,77]],[24,89,8,1,63,[0,8,0,0,4,0,5,1,76,5]],[25,169,4,1,51,[2,4,5,3,72,0,5,7,2,0]],[25,237,9,1,57,[2,41,0,0,2,0,0,1,0,54]],[25,253,6,1,54,[0,3,2,4,5,10,74,3,0,0]],[26,21,8,1,63,[3,1,1,1,2,0,5,6,80,0]],[26,52,8,1,53,[8,2,2,4,0,0,4,12,67,0]],[26,143,9,1,60,[5,21,0,0,8,0,0,0,0,66]],[26,160,2,1,67,[0,0,68,0,0,0,0,29,0,3]],[26,164,6,1,63,[0,2,3,5,9,4,76,0,0,1]],[26,179,5,1,78,[0,0,6,8,0,86,0,0,0,0]],[27,57,5,1,95,[0,3,0,0,0,96,1,0,0,0]],[27,85,2,1,66,[0,0,66,4,0,0,0,31,0,0]],[27,128,3,1,63,[0,1,4,85,2,2,2,3,0,0]],[27,136,8,1,56,[26,0,0,1,2,6,0,0,65,0]],[27,184,2,1,58,[7,18,70,1,0,1,2,1,1,0]],[27,197,9,1,54,[9,24,0,0,2,2,0,1,1,63]],[27,253,9,1,62,[8,14,0,1,2,0,0,2,1,73]],[28,77,8,1,72,[0,0,0,0,5,3,7,2,82,0]],[28,119,5,1,85,[0,0,0,10,0,89,0,0,0,1]],[28,148,8,1,86,[7,0,0,0,1,0,0,0,92,0]],[28,193,2,1,61,[0,2,62,24,0,12,0,0,0,0]],[28,197,1,1,58,[0,53,0,0,0,6,3,4,0,34]],[28,199,9,1,71,[0,0,2,0,0,0,15,4,0,80]],[29,44,1,1,57,[6,79,0,6,0,0,0,3,6,0]],[29,88,7,1,60,[0,0,15,19,0,1,0,65,0,0]],[29,112,4,1,59,[2,1,1,2,81,0,4,3,2,4]],[29,152,5,1,86,[0,0,0,5,0,93,2,0,0,0]],[29,218,6,1,56,[0,0,1,0,8,24,67,0,0,0]],[29,237,8,1,86,[0,0,1,5,0,0,0,0,94,0]],[30,54,5,1,56,[0,2,4,12,0,66,15,0,2,0]],[30,81,5,1,81,[0,0,0,12,1,85,0,1,0,0]],[30,82,0,1,55,[71,0,0,1,0,14,0,0,3,10]],[30,84,7,1,60,[4,17,1,2,0,0,0,74,1,0]],[30,99,3,1,69,[0,1,7,83,0,4,0,0,1,5]],[30,150,5,1,58,[0,1,35,2,1,59,0,3,0,0]],[30,244,8,1,54,[26,1,8,2,1,0,1,1,60,0]],[31,37,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[31,53,5,1,51,[0,4,0,27,11,55,2,0,0,0]],[31,62,3,1,67,[0,0,24,73,0,1,1,1,1,0]],[31,84,8,1,96,[0,0,0,0,0,0,0,0,100,0]],[31,85,2,1,70,[0,0,72,2,0,26,0,0,0,0]],[31,103,5,1,76,[0,0,0,26,0,74,0,0,0,0]],[31,114,0,1,61,[61,0,2,0,32,4,0,1,0,0]],[31,136,5,1,81,[0,0,4,1,6,89,0,0,0,0]],[31,139,4,1,66,[0,13,0,3,81,0,3,0,0,0]],[31,156,3,1,67,[0,0,3,70,0,24,1,1,0,0]],[31,193,9,1,57,[1,24,0,0,6,1,1,1,0,65]],[31,198,2,1,64,[0,0,76,1,0,18,1,2,3,0]],[31,244,6,1,87,[0,0,0,8,0,0,92,0,0,0]],[32,49,7,1,71,[6,5,0,2,2,0,0,85,1,0]],[32,74,4,1,74,[0,1,0,0,90,5,1,2,1,0]],[32,114,0,1,85,[92,0,2,4,0,0,0,0,3,0]],[32,136,6,1,93,[0,0,0,1,0,2,97,0,0,0]],[32,137,9,1,56,[1,17,1,1,1,4,1,1,1,72]],[32,146,7,1,53,[0,1,1,0,31,16,1,51,0,0]],[32,163,6,1,94,[0,0,0,0,0,0,100,0,0,0]],[32,165,9,1,55,[24,20,0,0,0,0,0,0,0,55]],[32,176,9,1,57,[14,23,1,0,0,0,0,0,0,61]],[32,178,8,1,62,[5,0,1,0,0,12,6,1,73,3]],[32,181,3,1,65,[0,0,0,58,0,40,0,0,2,0]],[32,182,5,1,66,[0,0,44,0,0,54,0,1,1,1]],[32,229,2,1,94,[0,0,100,0,0,0,0,0,0,0]],[32,230,5,1,66,[2,0,0,17,2,67,2,2,2,5]],[33,43,9,1,55,[18,16,3,0,2,1,0,0,0,60]],[33,59,3,1,69,[0,0,38,61,0,1,0,0,0,0]],[33,69,2,1,58,[0,3,66,0,0,28,3,0,0,0]],[33,80,8,1,55,[0,15,1,0,1,0,0,6,72,5]],[33,85,5,1,53,[0,10,0,0,2,66,0,9,0,14]],[33,113,8,1,97,[0,0,0,0,0,0,0,0,100,0]],[33,117,6,1,96,[0,0,0,0,1,0,99,1,0,0]],[33,124,0,1,61,[75,2,0,0,2,13,0,0,8,0]],[33,133,6,1,68,[0,1,0,5,1,18,75,0,0,0]],[33,146,7,1,71,[0,0,45,0,0,0,0,55,0,0]],[33,169,8,1,84,[0,0,2,2,1,0,0,0,95,0]],[33,193,3,1,53,[1,36,5,51,0,6,1,0,0,0]],[33,215,9,1,61,[14,22,0,0,0,0,0,0,0,64]],[33,225,0,1,54,[76,2,0,2,3,0,4,8,4,1]],[33,236,8,1,83,[0,0,0,0,0,2,3,0,94,0]],[33,237,1,1,62,[10,73,1,1,3,7,0,0,0,6]],[33,239,3,1,89,[0,0,0,89,0,7,0,0,4,0]],[34,13,6,1,66,[0,0,14,3,0,2,77,2,2,0]],[34,20,3,1,62,[0,2,18,77,0,3,0,0,0,0]],[34,53,0,1,55,[64,5,2,1,11,0,0,0,0,17]],[34,62,9,1,57,[25,11,0,0,1,1,0,0,3,61]],[34,138,9,1,60,[4,34,0,0,1,0,0,0,0,59]],[34,142,0,1,79,[93,0,0,0,0,0,0,2,2,3]],[34,143,2,1,69,[0,1,68,29,1,0,0,0,1,0]],[34,153,0,1,95,[100,0,0,0,0,0,0,0,0,0]],[34,182,9,1,55,[9,22,0,0,2,0,2,2,0,62]],[34,191,2,1,59,[0,0,66,25,0,4,0,0,5,0]],[34,212,6,1,60,[1,1,1,8,9,1,75,1,1,2]],[34,216,3,1,82,[0,0,0,94,0,6,0,0,0,0]],[34,222,5,1,65,[1,7,0,0,9,75,0,0,0,9]],[34,245,5,1,67,[0,0,0,8,0,71,0,0,4,16]],[34,246,7,1,54,[0,2,7,6,3,0,7,73,2,0]],[34,249,2,1,75,[0,0,78,6,0,16,0,0,0,0]],[34,253,5,1,71,[3,0,8,0,0,85,3,0,0,3]],[35,51,7,1,98,[0,0,0,0,0,0,0,100,0,0]],[35,83,2,1,57,[0,3,58,26,1,12,0,0,1,0]],[35,97,4,1,54,[2,4,6,3,74,1,1,1,1,5]],[35,102,6,1,70,[0,0,2,22,0,0,77,0,0,0]],[35,118,3,1,68,[0,0,0,56,1,42,0,0,1,0]],[35,124,0,1,81,[89,1,0,0,0,1,0,1,1,7]],[35,151,5,1,72,[0,0,23,0,0,77,0,0,0,0]],[35,182,6,1,92,[0,0,1,1,0,3,96,0,0,0]],[36,0,6,1,63,[0,0,0,28,1,2,67,3,0,0]],[36,45,2,1,71,[0,0,75,4,1,1,0,18,1,0]],[36,76,3,1,64,[0,3,5,75,1,5,0,0,11,0]],[36,129,0,1,62,[80,1,3,0,1,3,3,5,1,3]],[36,131,5,1,61,[0,0,38,0,0,59,3,0,0,0]],[36,173,5,1,76,[0,0,15,0,0,80,0,5,0,0]],[36,205,8,1,63,[0,0,3,0,1,14,7,5,70,0]],[36,246,7,1,81,[0,0,8,6,0,0,0,86,0,0]],[37,11,6,1,94,[0,0,0,2,0,0,98,0,0,0]],[37,54,5,1,60,[4,0,1,0,9,72,12,3,0,0]],[37,165,7,1,76,[0,0,29,0,0,0,0,71,0,0]],[37,170,0,1,56,[52,39,1,0,0,0,1,1,0,4]],[37,201,3,1,53,[2,0,4,67,6,7,0,14,0,0]],[37,231,1,1,61,[2,81,4,2,0,0,3,8,0,0]],[37,236,5,1,92,[0,0,4,0,0,96,0,0,0,0]],[37,241,4,1,67,[1,4,2,3,82,4,0,0,3,0]],[37,246,9,1,75,[2,4,0,0,0,8,0,0,0,87]],[37,249,8,1,65,[9,0,1,0,0,0,21,0,68,0]],[37,252,5,1,63,[0,0,3,17,8,72,0,0,0,0]],[38,37,8,1,75,[7,2,3,0,0,0,0,0,88,0]],[38,68,9,1,71,[0,8,0,0,2,5,0,0,0,85]],[38,95,2,1,85,[0,0,95,2,0,3,0,0,0,0]],[38,100,2,1,63,[0,8,77,9,1,4,1,0,1,0]],[38,116,3,1,77,[0,0,0,80,0,12,5,0,2,1]],[38,152,7,1,64,[0,6,6,3,9,0,2,74,0,0]],[38,159,9,1,53,[1,23,1,1,3,2,1,1,1,65]],[38,177,0,1,65,[77,1,0,1,0,10,1,0,0,10]],[38,232,6,1,56,[0,0,0,17,3,12,69,0,0,0]],[39,33,8,1,56,[5,1,2,3,3,0,3,3,77,4]],[39,59,0,1,57,[69,0,2,0,4,5,0,0,0,20]],[39,66,2,1,61,[0,0,63,22,0,15,0,0,0,0]],[39,68,7,1,68,[0,1,0,0,0,1,30,68,0,0]],[39,133,0,1,70,[78,3,2,1,5,0,1,2,0,7]],[39,140,5,1,69,[3,0,1,30,0,66,0,0,0,0]],[39,152,4,1,62,[4,4,6,1,81,0,1,3,1,0]],[39,187,6,1,58,[0,4,0,21,0,0,66,2,1,6]],[39,206,2,1,54,[0,0,49,21,0,0,29,0,1,0]],[39,222,4,1,86,[0,0,3,4,93,0,0,0,0,0]],[39,248,5,1,59,[0,4,0,2,12,73,3,0,6,0]],[40,29,9,1,57,[9,24,1,0,0,0,0,1,0,65]],[40,40,2,1,88,[0,0,96,0,0,4,0,0,0,0]],[40,60,2,1,65,[0,0,60,33,0,0,6,2,0,0]],[40,82,5,1,66,[0,3,0,0,5,83,8,0,0,0]],[40,83,2,1,100,[0,0,100,0,0,0,0,0,0,0]],[40,125,4,1,66,[0,0,7,1,83,2,3,1,0,3]],[40,126,6,1,77,[0,0,0,0,0,14,82,5,0,0]],[40,192,4,1,58,[0,0,2,13,65,0,0,16,0,4]],[40,220,9,1,65,[0,18,1,0,1,4,0,0,0,75]],[40,221,8,1,81,[5,0,0,0,2,0,0,0,93,0]],[40,243,4,1,61,[2,10,1,1,74,3,1,2,0,6]],[40,245,3,1,69,[0,0,0,57,0,41,0,2,0,0]],[41,7,8,1,71,[1,3,0,1,1,7,0,3,82,2]],[41,9,9,1,57,[2,17,0,0,3,9,0,0,1,69]],[41,37,5,1,86,[0,0,5,0,0,94,0,0,1,0]],[41,66,9,1,61,[1,30,0,0,0,0,0,1,1,66]],[41,126,9,1,58,[10,36,0,0,1,0,0,0,0,53]],[41,148,8,1,77,[4,2,0,1,1,0,2,0,91,0]],[41,167,2,1,61,[5,27,64,3,0,0,0,0,1,0]],[41,176,5,1,64,[0,5,0,0,8,75,0,12,0,0]],[41,195,8,1,57,[35,1,0,1,0,0,3,5,57,0]],[41,200,8,1,65,[6,0,2,0,1,15,4,0,73,0]],[41,204,6,1,58,[0,1,0,4,2,25,66,0,0,2]],[41,214,2,1,68,[0,2,72,2,0,21,0,2,0,0]],[41,227,0,1,61,[73,0,2,1,2,19,2,0,2,0]],[41,245,2,1,64,[0,1,76,2,1,0,0,20,0,2]],[41,248,1,1,83,[2,96,0,0,0,0,2,0,0,0]],[42,17,3,1,60,[0,0,14,68,0,17,0,0,0,0]],[42,30,5,1,74,[0,0,0,4,14,82,0,0,0,0]],[42,109,9,1,57,[9,16,1,0,2,2,0,1,0,68]],[42,135,9,1,67,[5,16,0,0,0,1,0,0,0,77]],[42,140,6,1,63,[0,4,0,3,5,1,80,4,1,1]],[42,172,7,1,98,[0,0,0,0,0,0,0,100,0,0]],[42,204,3,1,56,[3,18,7,67,0,6,0,0,0,0]],[42,230,8,1,64,[13,11,0,1,0,1,1,1,73,0]],[43,27,8,1,78,[0,0,0,4,0,4,1,1,88,3]],[43,64,9,1,54,[0,13,1,2,1,1,1,3,5,73]],[43,68,2,1,60,[0,0,54,37,0,7,0,0,1,0]],[43,79,5,1,72,[0,0,25,0,4,71,0,0,0,0]],[43,91,5,1,74,[0,0,0,0,24,76,0,0,0,0]],[43,121,0,1,63,[80,0,4,0,0,7,8,2,0,0]],[43,158,6,1,62,[0,2,4,15,0,0,75,4,0,0]],[43,208,4,1,68,[1,3,2,1,83,1,2,1,4,1]],[43,216,5,1,86,[0,0,3,0,3,94,0,0,0,0]],[43,232,6,1,53,[0,0,1,4,9,2,68,11,6,0]],[43,236,1,1,58,[0,67,0,0,1,21,0,9,0,1]],[44,17,3,1,100,[0,0,0,100,0,0,0,0,0,0]],[44,19,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[44,40,6,1,95,[0,0,1,0,3,0,96,0,0,0]],[44,47,6,1,56,[1,1,2,5,4,2,79,1,5,0]],[44,50,8,1,68,[5,9,3,0,0,4,0,3,77,0]],[44,61,0,1,55,[58,11,0,0,2,0,0,0,1,27]],[44,79,2,1,77,[0,0,84,16,0,0,0,0,0,0]],[44,89,5,1,98,[0,0,0,0,0,100,0,0,0,0]],[44,172,0,1,62,[59,1,0,0,0,0,1,2,0,37]],[44,173,8,1,78,[2,0,0,0,0,0,0,0,89,9]],[45,43,7,1,76,[0,1,2,7,0,1,5,84,0,0]],[45,44,0,1,56,[75,0,5,5,3,0,2,2,4,4]],[45,70,2,1,53,[0,0,64,19,3,8,0,5,0,0]],[45,83,0,1,54,[59,0,0,1,4,1,3,1,28,3]],[45,84,3,1,71,[2,0,35,61,0,2,0,0,0,0]],[45,148,6,1,62,[0,0,3,22,0,0,71,3,1,0]],[45,157,9,1,54,[0,29,3,0,5,4,0,1,0,58]],[45,170,4,1,61,[0,5,5,5,77,0,3,2,0,3]],[45,185,8,1,54,[11,0,1,5,1,6,1,5,70,0]],[45,217,4,1,60,[1,1,5,2,79,0,1,1,0,9]],[45,240,4,1,53,[5,2,5,1,71,3,0,6,7,0]],[46,1,1,1,54,[0,68,2,1,0,9,0,6,0,13]],[46,14,5,1,58,[7,0,0,38,0,52,4,0,0,0]],[46,29,5,1,56,[1,0,1,3,39,54,0,0,0,1]],[46,30,2,1,97,[0,0,99,0,0,0,0,1,0,0]],[46,60,6,1,82,[0,0,1,0,3,2,92,0,0,0]],[46,94,2,1,88,[0,0,92,0,0,5,2,1,0,0]],[46,150,7,1,94,[6,0,0,0,0,0,0,94,0,0]],[46,162,4,1,74,[0,3,2,0,85,2,0,1,1,6]],[46,188,5,1,90,[2,0,1,1,0,96,0,0,0,0]],[46,199,0,1,54,[53,8,0,1,0,0,0,0,2,35]],[46,231,4,1,67,[0,2,8,2,79,0,4,3,2,0]],[46,250,7,1,52,[0,0,23,18,0,5,0,53,0,0]],[47,8,7,1,60,[8,3,0,11,0,0,0,69,9,0]],[47,65,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[47,168,5,1,58,[0,22,0,4,0,67,2,0,5,0]],[48,9,1,1,53,[2,67,0,2,5,0,0,5,0,19]],[48,31,9,1,56,[0,5,0,1,0,6,2,8,2,76]],[48,108,3,1,78,[0,0,11,84,0,2,0,2,0,1]],[48,130,5,1,60,[7,0,0,2,2,77,10,2,1,0]],[48,155,2,1,100,[0,0,100,0,0,0,0,0,0,0]],[48,167,1,1,60,[5,70,5,3,0,0,0,0,16,0]],[48,200,0,1,61,[82,1,0,0,0,2,1,5,4,5]],[48,202,1,1,58,[8,70,6,2,4,8,0,2,0,0]],[49,1,5,1,65,[0,0,4,20,0,71,0,5,0,0]],[49,3,3,1,52,[0,1,2,58,2,32,1,1,3,0]],[49,11,1,1,62,[4,74,2,7,5,0,0,6,2,0]],[49,27,5,1,86,[0,0,0,11,0,89,0,0,0,0]],[49,45,4,1,57,[2,2,4,0,78,0,4,6,3,1]],[49,46,0,1,85,[96,0,0,0,1,0,0,1,0,2]],[49,79,3,1,78,[2,1,0,87,0,0,0,0,0,10]],[49,93,9,1,61,[1,13,1,0,0,7,0,0,0,78]],[49,151,2,1,70,[3,6,82,0,0,0,0,3,6,0]],[49,154,8,1,55,[43,0,1,1,1,4,0,1,49,0]],[49,168,7,1,84,[2,0,0,0,0,0,7,91,0,0]],[49,237,1,1,75,[2,86,0,2,7,0,0,2,0,0]],[50,27,9,1,54,[4,22,0,0,1,3,1,1,2,66]],[50,41,5,1,79,[0,0,13,0,0,87,0,0,0,0]],[50,62,3,1,93,[0,0,0,96,3,0,0,0,0,0]],[50,72,7,1,65,[0,20,3,0,2,2,0,74,0,0]],[50,95,2,1,96,[0,1,97,0,0,0,1,0,1,0]],[50,132,3,1,65,[0,3,0,59,0,28,0,0,9,0]],[50,140,9,1,63,[8,17,0,0,0,1,0,0,0,74]],[50,149,0,1,90,[97,1,0,0,0,0,1,0,0,1]],[50,185,6,1,55,[0,1,2,1,2,0,67,3,8,15]],[50,201,5,1,72,[1,0,0,0,1,80,13,0,6,0]],[50,205,0,1,65,[78,8,1,0,0,1,1,1,0,11]],[50,215,6,1,75,[0,2,1,0,7,1,84,5,1,0]],[50,232,0,1,65,[79,2,0,0,0,3,6,4,2,4]],[50,233,8,1,63,[7,0,1,1,1,17,1,0,74,0]],[51,8,3,1,65,[2,2,4,78,6,1,0,0,7,0]],[51,13,8,1,52,[8,1,0,1,25,0,2,0,63,0]],[51,23,2,1,100,[0,0,100,0,0,0,0,0,0,0]],[51,24,4,1,85,[0,1,0,1,94,1,0,1,0,1]],[51,33,5,1,79,[0,0,0,14,0,86,0,0,0,0]],[51,50,8,1,64,[0,0,0,1,6,0,1,0,81,11]],[51,53,6,1,58,[0,2,2,0,9,0,79,5,2,0]],[51,143,4,1,79,[1,6,0,0,88,0,0,0,0,4]],[51,147,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[51,154,3,1,66,[0,0,0,66,1,0,33,0,0,0]],[51,155,3,1,82,[0,0,9,86,0,0,2,0,0,4]],[51,156,5,1,73,[0,0,0,34,0,66,0,0,0,0]],[51,181,8,1,78,[0,0,2,7,1,2,0,0,89,0]],[51,195,1,1,66,[0,60,3,1,0,0,0,36,0,0]],[51,200,8,1,75,[6,1,0,2,1,2,0,0,88,0]],[51,203,5,1,51,[0,1,0,2,38,48,3,8,0,0]],[51,219,2,1,60,[0,2,76,7,0,9,1,1,3,1]],[51,254,6,1,81,[0,1,0,3,4,1,90,1,0,0]],[52,8,9,1,55,[4,10,0,0,2,0,0,0,14,71]],[52,15,0,1,62,[67,0,0,2,0,1,0,0,28,2]],[52,16,2,1,70,[0,0,58,0,0,0,0,42,0,0]],[52,24,5,1,98,[0,0,0,0,0,99,1,0,0,0]],[52,62,5,1,57,[0,4,0,0,25,62,0,0,0,8]],[52,91,1,1,78,[0,84,0,0,11,0,0,6,0,0]],[52,99,6,1,75,[2,1,1,1,0,0,89,2,0,4]],[52,102,9,1,59,[7,2,0,0,0,7,0,3,5,75]],[52,141,5,1,82,[7,0,0,0,0,91,0,0,2,0]],[52,166,2,1,98,[0,0,100,0,0,0,0,0,0,0]],[52,167,8,1,56,[0,3,3,0,2,0,21,0,69,2]],[52,174,3,1,100,[0,0,0,100,0,0,0,0,0,0]],[52,198,0,1,91,[95,0,1,0,1,2,0,0,0,0]],[52,200,0,1,53,[63,7,0,0,0,0,2,4,1,23]],[52,212,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[52,235,6,1,66,[0,2,2,3,7,2,78,2,4,0]],[52,241,8,1,56,[0,5,2,2,1,4,2,15,69,0]],[52,251,2,1,79,[0,0,78,0,0,22,0,0,0,0]],[53,15,6,1,94,[0,0,0,0,0,0,100,0,0,0]],[53,57,9,1,79,[0,10,1,0,1,0,0,0,0,87]],[53,86,3,1,81,[0,0,0,93,1,3,0,1,0,1]],[53,87,7,1,57,[0,0,13,5,3,0,3,69,3,5]],[53,100,0,1,65,[56,3,0,0,0,0,0,0,0,40]],[53,135,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[53,145,8,1,79,[1,1,1,2,2,2,2,1,88,0]],[53,162,3,1,98,[0,0,0,99,0,1,0,0,0,0]],[53,185,2,1,100,[0,0,100,0,0,0,0,0,0,0]],[53,195,8,1,53,[29,0,1,0,8,3,0,0,58,0]],[53,210,5,1,61,[8,2,0,2,3,78,3,1,2,1]],[54,1,3,1,73,[0,3,2,83,0,13,0,0,0,0]],[54,51,6,1,93,[0,0,0,0,0,0,100,0,0,0]],[54,61,3,1,62,[7,4,14,72,1,0,0,1,1,0]],[54,86,7,1,64,[5,0,0,5,0,16,0,71,3,0]],[54,116,2,1,85,[0,0,92,8,0,0,0,0,0,0]],[54,118,0,1,75,[86,0,5,0,3,0,2,0,5,0]],[54,128,7,1,55,[0,16,0,1,0,9,7,66,1,0]],[54,152,2,1,89,[1,0,96,0,0,0,0,0,0,3]],[54,231,8,1,90,[7,2,0,0,1,0,0,0,90,0]],[54,240,1,1,56,[16,72,1,1,1,2,0,3,0,2]],[55,3,6,1,84,[3,3,0,0,1,0,85,0,7,0]],[55,36,5,1,57,[7,5,2,0,0,70,0,0,0,17]],[55,38,2,1,59,[0,2,63,25,7,0,0,2,0,0]],[55,100,7,1,97,[0,0,0,0,0,0,0,99,1,0]],[55,113,9,1,51,[36,21,0,0,1,0,0,0,0,41]],[55,136,7,1,53,[2,6,2,3,1,1,7,74,1,1]],[55,161,4,1,72,[0,0,4,2,85,2,3,3,0,2]],[55,190,4,1,59,[1,2,2,2,75,1,0,4,1,12]],[55,201,3,1,96,[0,0,0,98,1,0,0,0,0,0]],[55,246,1,1,57,[0,68,3,2,7,0,2,16,2,2]],[55,248,9,1,64,[28,2,1,0,0,0,0,1,2,68]],[56,15,0,1,59,[71,0,0,1,3,0,8,5,1,10]],[56,48,1,1,71,[4,84,5,0,1,1,3,0,1,1]],[56,61,8,1,68,[6,1,0,1,0,6,0,1,84,0]],[56,72,7,1,75,[1,1,5,2,0,0,10,80,0,0]],[56,84,1,1,66,[5,73,13,0,5,4,0,0,0,0]],[56,134,2,1,87,[0,0,96,0,0,0,1,1,1,0]],[56,162,7,1,90,[0,0,0,0,0,0,0,94,6,0]],[56,165,6,1,77,[0,3,0,0,4,0,92,0,1,1]],[56,178,0,1,73,[79,0,0,0,13,0,1,0,0,8]],[56,180,5,1,99,[0,0,0,0,0,100,0,0,0,0]],[56,203,6,1,68,[0,10,2,0,1,0,84,3,0,0]],[56,217,3,1,68,[0,0,1,71,2,22,1,1,2,0]],[56,219,3,1,54,[3,0,4,74,2,1,4,6,6,0]],[56,225,4,1,53,[4,1,1,1,78,3,3,1,3,6]],[56,236,4,1,61,[0,3,1,4,79,1,2,5,3,2]],[57,5,5,1,71,[2,0,1,1,1,84,4,3,3,2]],[57,12,4,1,62,[4,2,2,1,78,4,5,1,1,4]],[57,16,9,1,81,[0,17,0,0,0,0,0,0,0,83]],[57,27,7,1,100,[0,0,0,0,0,0,0,100,0,0]],[57,30,4,1,73,[1,1,2,5,85,1,0,0,1,2]],[57,38,2,1,76,[2,2,83,7,3,3,0,0,0,0]],[57,56,4,1,87,[0,6,2,2,90,0,0,0,0,0]],[57,92,6,1,91,[0,0,0,0,0,0,88,0,12,0]],[57,109,9,1,63,[6,3,2,0,1,0,0,0,4,84]],[57,114,8,1,82,[0,0,0,0,0,8,0,0,92,0]],[57,149,1,1,59,[1,70,2,6,4,0,0,0,0,18]],[57,160,6,1,53,[0,1,3,12,5,0,66,12,1,1]],[57,170,2,1,95,[1,0,98,0,0,0,0,1,0,0]],[57,181,6,1,70,[0,2,2,2,2,1,85,6,0,1]],[57,185,0,1,75,[78,0,0,0,0,0,0,0,0,22]],[57,216,4,1,59,[2,0,0,0,69,22,5,2,0,0]],[57,222,9,1,93,[0,1,0,0,0,2,0,1,0,97]],[57,223,3,1,81,[1,0,6,91,2,0,1,0,0,0]],[58,2,5,1,60,[1,0,27,1,0,66,0,1,1,2]],[58,3,2,1,63,[0,4,80,10,0,0,2,0,2,3]],[58,21,9,1,67,[7,5,1,1,0,1,2,3,0,80]],[58,23,3,1,70,[1,0,0,70,0,28,0,1,0,0]],[58,41,7,1,74,[0,0,1,0,0,9,0,82,0,8]],[58,47,6,1,53,[0,7,4,3,4,4,70,0,1,6]],[58,96,6,1,61,[4,4,1,1,5,0,83,3,0,0]],[58,107,4,1,78,[2,0,2,2,85,0,2,4,0,3]],[58,118,5,1,88,[0,0,5,0,2,93,0,0,0,0]],[58,178,9,1,58,[1,10,7,2,0,2,0,2,1,75]],[58,189,3,1,85,[0,1,0,92,4,3,0,0,0,0]],[58,204,3,1,62,[0,3,29,66,2,0,0,0,0,0]],[58,228,1,1,72,[0,82,5,0,2,0,0,0,5,6]],[58,238,7,1,73,[0,0,0,20,2,0,2,75,0,0]],[58,254,6,1,65,[5,1,5,2,2,2,79,0,2,3]],[59,7,0,1,82,[88,0,0,0,0,4,0,0,7,2]],[59,31,4,1,72,[2,2,2,3,85,0,1,1,2,2]],[59,34,2,1,76,[0,0,84,0,0,10,0,4,1,0]],[59,66,5,1,80,[0,0,0,6,0,89,2,0,2,0]],[59,67,9,1,69,[0,10,0,3,4,0,0,0,0,83]],[59,115,5,1,64,[4,18,0,0,0,74,1,2,2,1]],[59,141,4,1,57,[2,3,0,4,74,2,6,5,2,3]],[59,147,7,1,90,[0,0,5,0,0,0,0,92,0,2]],[59,148,5,1,56,[7,2,0,0,24,60,0,2,5,0]],[59,187,2,1,91,[0,0,95,0,1,3,0,1,1,0]],[59,214,7,1,63,[0,0,3,0,16,0,3,78,0,0]],[60,49,5,1,82,[1,1,0,0,1,89,2,0,1,4]],[60,115,8,1,60,[3,1,7,2,1,4,1,1,78,2]],[60,122,9,1,70,[7,3,1,2,1,2,0,0,0,83]],[60,139,4,1,69,[0,2,2,1,85,2,2,2,2,0]],[60,141,5,1,54,[0,0,38,5,5,50,1,0,0,0]],[60,160,7,1,94,[0,0,7,0,0,0,0,93,0,0]],[60,161,6,1,72,[0,1,1,0,8,3,79,3,4,0]],[60,186,2,1,61,[8,0,68,3,15,2,0,3,0,1]],[60,196,3,1,66,[0,0,0,74,0,16,1,0,1,8]],[60,242,2,1,90,[0,2,95,0,0,0,0,0,2,2]],[61,2,4,1,84,[0,2,1,0,90,0,2,1,0,5]],[61,25,4,1,62,[1,5,1,1,79,1,1,3,5,2]],[61,65,5,1,64,[5,2,0,2,1,84,1,2,1,2]],[61,68,3,1,62,[9,0,0,64,0,3,0,2,0,23]],[61,89,2,1,72,[0,4,83,1,0,11,1,1,0,0]],[61,142,8,1,66,[24,2,0,1,2,2,0,0,69,0]],[61,160,3,1,70,[0,3,1,86,0,1,7,0,1,1]],[61,206,0,1,64,[76,0,0,0,1,4,0,12,0,7]],[61,226,9,1,60,[1,11,1,2,0,4,1,3,0,76]],[62,6,7,1,60,[0,0,11,0,3,8,6,72,0,0]],[62,19,8,1,57,[10,0,2,2,0,26,0,0,59,0]],[62,24,2,1,54,[0,2,66,19,2,0,5,1,5,0]],[62,28,9,1,65,[0,6,1,3,1,10,0,0,0,79]],[62,29,8,1,69,[14,0,0,1,1,3,0,0,80,1]],[62,58,5,1,87,[0,0,0,0,0,94,0,0,2,4]],[62,75,1,1,69,[0,85,0,0,0,0,3,3,3,5]],[62,89,5,1,57,[0,0,0,31,3,59,2,0,4,2]],[62,135,6,1,75,[1,0,0,1,12,1,85,1,1,0]],[62,138,5,1,56,[0,6,0,0,5,71,8,8,0,3]],[62,171,2,1,88,[0,0,93,1,0,1,0,0,1,4]],[62,195,9,1,52,[2,27,0,4,0,4,5,0,0,59]],[62,223,7,1,64,[2,2,2,0,0,2,0,79,2,12]],[62,246,4,1,74,[0,0,0,0,73,0,20,7,0,0]],[63,54,1,1,63,[2,75,0,0,4,0,4,0,0,15]],[63,101,5,1,100,[0,0,0,0,0,100,0,0,0,0]],[63,113,4,1,77,[0,1,1,1,86,1,3,4,2,1]],[63,137,8,1,62,[0,7,0,2,0,7,2,2,74,7]],[63,150,1,1,69,[0,82,1,0,6,0,3,0,1,7]],[63,186,0,1,62,[83,0,1,0,2,7,0,2,4,1]],[63,196,8,1,70,[2,2,1,0,2,2,0,0,91,0]],[63,214,9,1,75,[10,8,0,0,0,0,0,0,0,82]],[63,225,5,1,69,[4,2,1,16,0,76,1,0,0,0]],[63,245,9,1,65,[15,16,0,0,0,0,0,0,0,70]],[63,248,7,1,58,[0,0,5,15,10,2,2,67,0,0]],[64,1,8,1,68,[6,1,2,1,0,2,1,1,85,3]],[64,33,3,1,94,[0,0,0,98,0,0,0,0,2,0]],[64,50,6,1,59,[1,5,0,0,1,9,74,5,5,0]],[64,55,7,1,95,[0,0,0,1,1,0,0,99,0,0]],[64,64,8,1,63,[1,9,1,0,1,5,1,2,78,1]],[64,110,9,1,57,[17,13,0,0,3,0,0,0,0,66]],[64,111,5,1,74,[0,0,0,2,2,84,0,0,4,9]],[64,163,3,1,77,[0,0,0,93,5,0,0,2,0,0]],[64,188,0,1,72,[83,3,0,1,6,0,0,0,1,6]],[64,204,4,1,64,[1,4,1,1,81,0,1,2,1,8]],[64,214,2,1,64,[0,0,66,29,2,0,0,0,2,0]],[64,253,5,1,76,[1,5,0,0,0,91,2,0,0,2]],[65,35,5,1,72,[0,0,0,34,0,66,0,0,0,0]],[65,40,4,1,97,[0,0,0,0,99,1,0,0,0,1]],[65,81,7,1,92,[0,0,0,0,2,0,0,98,0,0]],[65,97,9,1,56,[1,8,3,0,0,6,3,7,0,72]],[65,109,9,1,67,[2,3,0,1,6,0,0,1,1,86]],[65,116,8,1,71,[0,0,0,0,0,11,3,7,79,0]],[65,120,9,1,53,[3,7,2,1,2,5,2,3,1,74]],[65,124,0,1,66,[61,0,0,0,4,1,0,0,31,3]],[65,138,3,1,78,[2,1,3,87,0,1,0,0,2,5]],[65,175,6,1,74,[0,2,5,4,1,1,85,1,1,1]],[65,182,3,1,55,[0,0,13,61,0,23,0,3,0,0]],[65,193,5,1,70,[5,0,2,0,2,86,2,3,2,0]],[65,202,5,1,54,[2,4,0,15,8,68,1,0,3,0]],[65,221,1,1,57,[9,73,1,4,0,3,1,6,3,0]],[65,226,4,1,60,[4,13,0,7,71,5,0,0,0,0]],[65,243,2,1,74,[0,0,71,0,0,0,0,29,0,0]],[66,29,4,1,70,[2,2,1,1,85,6,0,1,0,1]],[66,40,5,1,84,[0,0,0,0,9,89,0,0,2,0]],[66,87,7,1,94,[0,1,0,0,0,0,1,98,0,0]],[66,129,3,1,86,[0,0,0,91,0,5,2,0,2,0]],[66,153,8,1,54,[13,3,5,9,1,0,0,0,70,0]],[66,179,9,1,66,[6,1,1,1,1,1,4,3,4,80]],[67,14,1,1,61,[2,79,0,0,7,0,6,3,3,0]],[67,35,0,1,55,[72,2,2,1,9,0,1,1,5,7]],[67,84,8,1,63,[2,0,11,2,7,4,2,0,70,3]],[67,104,3,1,85,[0,1,0,92,0,6,0,0,1,0]],[67,133,7,1,97,[0,0,2,0,0,0,3,95,0,0]],[67,150,5,1,68,[1,1,0,3,11,80,3,1,0,0]],[67,178,9,1,63,[7,5,0,0,1,0,0,0,11,77]],[67,226,2,1,62,[0,0,55,1,0,0,0,42,0,1]],[67,241,1,1,54,[0,72,2,4,1,2,1,2,2,14]],[68,11,9,1,55,[1,0,0,4,6,3,9,1,1,75]],[68,29,1,1,58,[6,76,6,1,2,0,1,2,6,0]],[68,33,3,1,63,[0,0,0,62,0,34,2,0,2,0]],[68,43,4,1,56,[6,0,2,0,71,3,6,2,4,6]],[68,50,2,1,59,[2,0,74,0,9,0,4,0,2,9]],[68,112,7,1,73,[0,2,0,7,0,0,1,85,4,0]],[68,115,4,1,63,[2,0,6,1,80,3,2,2,0,2]],[68,120,2,1,93,[0,0,96,0,0,0,0,0,0,4]],[68,196,8,1,62,[11,0,4,4,1,2,1,0,77,0]],[68,197,4,1,73,[3,1,2,4,86,1,1,1,1,1]],[68,219,2,1,73,[0,0,73,21,0,5,1,0,0,0]],[68,224,3,1,72,[1,1,0,85,1,8,2,0,0,2]],[68,230,6,1,79,[0,1,0,1,1,2,91,3,0,0]],[69,30,6,1,69,[2,1,4,4,0,2,85,2,0,0]],[69,31,2,1,83,[0,0,90,0,0,0,0,3,0,7]],[69,37,4,1,65,[1,4,1,1,82,6,2,2,1,0]],[69,97,6,1,57,[1,2,3,2,4,1,75,7,5,1]],[69,100,2,1,84,[0,0,89,10,0,0,0,0,1,0]],[69,108,4,1,74,[0,3,0,12,85,0,0,0,0,0]],[69,121,5,1,76,[0,0,0,4,3,85,0,6,0,2]],[69,152,5,1,67,[0,0,14,0,0,78,0,0,5,3]],[69,155,2,1,56,[1,1,62,0,28,8,0,0,0,0]],[69,176,2,1,63,[0,6,70,1,0,7,1,14,1,0]],[69,182,1,1,66,[1,85,1,0,1,10,0,1,1,0]],[69,187,9,1,56,[1,4,4,6,1,1,1,6,0,77]],[70,9,1,1,85,[0,92,0,0,0,0,0,3,5,0]],[70,11,4,1,56,[0,4,2,2,74,4,6,2,3,2]],[70,21,7,1,69,[2,0,3,2,1,0,5,81,4,3]],[70,42,9,1,67,[0,4,1,0,5,1,1,4,1,83]],[70,96,1,1,69,[0,77,2,6,3,7,5,0,0,0]],[70,117,5,1,58,[0,0,0,3,10,76,4,3,3,1]],[70,132,9,1,55,[4,15,2,0,1,3,2,2,0,70]],[70,160,5,1,61,[6,2,2,2,4,74,0,4,0,6]],[70,166,1,1,60,[0,65,18,0,0,3,2,0,12,0]],[70,176,3,1,53,[0,0,24,53,0,20,2,0,1,0]],[70,190,0,1,64,[83,3,0,2,2,5,0,2,2,1]],[70,203,2,1,59,[1,1,53,0,0,1,0,40,0,4]],[70,208,7,1,56,[0,3,2,24,5,0,0,62,0,4]],[70,210,7,1,61,[0,0,0,3,0,0,39,56,0,0]],[70,240,4,1,58,[1,0,2,3,76,3,1,2,11,1]],[71,6,1,1,64,[0,68,0,0,0,4,0,16,0,12]],[71,54,4,1,53,[3,3,0,2,74,4,5,3,4,2]],[71,112,4,1,69,[1,2,4,2,84,4,1,1,1,0]],[71,121,1,1,57,[0,75,3,4,2,4,2,6,2,3]],[71,124,8,1,58,[7,9,1,0,0,7,1,5,71,0]],[71,142,6,1,74,[2,2,0,0,4,0,89,0,2,0]],[71,145,1,1,62,[0,85,2,0,10,3,0,0,0,0]],[71,151,5,1,53,[2,2,0,0,7,72,8,4,6,0]],[71,187,6,1,75,[0,1,1,3,1,1,87,4,2,1]],[71,203,7,1,94,[0,0,0,2,1,0,0,97,0,0]],[71,206,8,1,61,[13,2,5,2,0,6,2,1,70,0]],[71,207,7,1,93,[0,0,12,0,0,0,0,88,0,0]],[71,227,2,1,57,[0,1,70,6,0,1,1,15,3,3]],[71,243,3,1,89,[0,0,2,95,0,1,0,0,0,1]],[72,12,1,1,83,[0,92,0,0,8,0,0,0,0,0]],[72,19,5,1,91,[0,0,0,5,0,91,5,0,0,0]],[72,22,3,1,86,[0,4,2,92,0,0,0,0,0,1]],[72,27,4,1,64,[0,2,1,5,80,2,3,3,3,2]],[72,69,8,1,61,[3,2,0,1,3,4,1,0,84,1]],[72,112,9,1,61,[28,1,1,0,0,1,0,1,0,68]],[72,135,7,1,62,[0,2,4,0,0,20,0,74,0,0]],[72,187,6,1,79,[0,2,1,2,1,1,92,1,1,0]],[72,222,8,1,68,[15,1,0,4,0,2,5,0,74,0]],[72,226,2,1,67,[1,0,75,19,0,1,1,1,2,1]],[72,228,9,1,60,[6,11,3,2,1,1,2,0,1,75]],[72,242,4,1,63,[3,4,2,2,81,1,2,3,2,0]],[73,39,4,1,81,[2,1,1,0,92,1,1,1,1,0]],[73,44,4,1,89,[0,3,0,1,95,0,0,0,1,0]],[73,76,7,1,71,[3,0,4,1,0,2,3,83,2,0]],[73,101,1,1,72,[0,81,0,0,6,7,0,3,3,0]],[73,124,8,1,54,[19,2,3,2,1,1,2,2,70,0]],[73,149,9,1,64,[22,6,0,0,1,1,0,0,0,68]],[73,158,2,1,85,[0,5,93,0,2,0,0,0,0,0]],[73,172,3,1,68,[4,2,0,86,1,0,1,2,0,3]],[73,175,9,1,59,[0,9,1,7,4,4,0,0,0,76]],[74,6,2,1,72,[0,4,86,0,0,0,3,0,0,7]],[74,14,6,1,58,[2,1,1,3,2,4,80,2,2,2]],[74,29,9,1,67,[9,4,1,2,0,1,0,1,2,80]],[74,78,3,1,80,[1,0,2,90,2,0,1,1,0,2]],[74,88,8,1,75,[2,2,3,1,1,1,2,1,87,0]],[74,100,6,1,51,[3,6,4,2,3,5,73,0,2,3]],[74,125,7,1,69,[2,0,13,0,1,1,0,82,1,0]],[74,136,4,1,77,[1,2,1,1,89,1,0,3,1,0]],[74,169,6,1,65,[7,1,2,3,3,1,83,1,0,0]],[74,194,7,1,63,[4,0,2,0,0,0,11,79,1,2]],[74,198,4,1,71,[2,0,2,2,86,1,2,2,2,1]],[74,222,4,1,61,[2,1,2,9,75,1,1,7,3,1]],[74,223,8,1,64,[10,0,0,2,2,4,4,1,77,0]],[74,245,1,1,75,[2,87,0,0,5,3,0,0,2,0]],[74,254,2,1,60,[2,0,65,0,0,25,0,0,7,0]],[75,52,4,1,55,[1,0,1,9,76,3,1,4,4,1]],[75,59,1,1,69,[0,88,4,5,0,0,0,0,3,0]],[75,66,3,1,51,[4,1,1,71,0,4,3,1,8,7]],[75,86,1,1,66,[1,80,7,2,1,0,1,6,1,0]],[75,100,9,1,53,[22,5,1,0,2,6,0,0,3,62]],[75,101,5,1,59,[1,1,0,30,0,66,0,0,1,0]],[75,148,4,1,77,[1,1,0,0,88,2,1,1,5,2]],[75,188,7,1,60,[0,0,13,0,0,29,0,55,3,0]],[75,215,6,1,89,[0,0,0,1,0,1,95,0,2,0]],[75,224,8,1,59,[2,1,6,4,1,20,0,1,66,0]],[76,26,7,1,82,[2,0,0,1,0,0,1,95,1,1]],[76,45,1,1,65,[2,83,2,0,0,5,2,2,2,0]],[76,52,4,1,82,[0,0,0,0,88,1,3,1,4,2]],[76,67,3,1,61,[2,4,1,76,1,0,0,2,1,12]],[76,100,9,1,73,[7,0,0,0,0,3,0,2,1,87]],[76,106,8,1,72,[4,3,3,0,1,0,3,0,87,0]],[76,112,3,1,59,[0,2,0,70,8,6,9,2,2,0]],[76,120,5,1,58,[2,0,12,4,0,71,2,6,4,0]],[76,121,4,1,73,[1,1,1,0,87,1,4,2,2,0]],[76,148,1,1,62,[0,78,10,3,3,0,3,3,0,0]],[76,161,4,1,64,[1,1,5,5,80,2,1,2,1,1]],[77,31,4,1,66,[0,2,1,2,83,3,2,3,3,1]],[77,107,3,1,67,[0,0,3,82,7,5,2,2,0,0]],[77,113,1,1,78,[0,89,4,0,2,0,0,0,5,0]],[77,124,1,1,59,[7,75,0,5,0,11,0,0,3,0]],[77,131,1,1,59,[0,71,2,2,1,17,2,5,1,0]],[77,151,9,1,57,[24,5,2,0,1,4,0,1,2,62]],[77,160,8,1,89,[4,1,0,0,1,1,0,0,93,0]],[77,178,1,1,93,[0,98,0,0,0,2,0,0,0,0]],[77,182,1,1,54,[2,71,0,9,0,2,5,5,5,0]],[77,185,4,1,73,[0,2,5,0,84,5,0,0,2,3]],[77,187,1,1,57,[4,79,3,0,4,1,1,1,3,4]],[77,206,9,1,56,[8,2,3,1,1,2,1,1,4,76]],[77,208,1,1,57,[2,74,4,0,0,9,4,4,2,0]],[77,217,1,1,83,[0,91,1,0,1,6,0,0,0,0]],[77,220,1,1,76,[0,87,2,0,2,4,2,2,2,0]],[77,224,9,1,74,[15,0,0,0,0,2,0,1,0,82]],[77,227,6,1,57,[3,0,2,0,11,7,75,2,0,0]],[77,230,4,1,69,[1,0,2,1,88,1,1,2,2,2]],[77,248,7,1,61,[1,15,0,0,1,6,1,73,1,0]],[77,251,4,1,88,[0,1,1,0,95,0,0,1,1,0]],[3,147,1,0,44,[9,48,2,2,4,0,7,0,16,12]],[8,64,3,0,48,[0,1,19,40,1,37,0,0,2,0]],[9,213,2,0,56,[0,0,53,36,0,7,3,0,0,0]],[10,212,6,0,53,[0,2,1,6,5,5,71,5,1,3]],[11,24,9,0,46,[3,22,1,1,3,1,2,1,1,66]],[11,189,4,0,51,[3,3,3,5,74,0,5,3,3,1]],[12,27,8,0,55,[27,0,12,0,0,0,0,3,57,0]],[12,29,1,0,65,[0,48,2,0,0,0,2,0,0,48]],[12,142,9,0,47,[17,31,0,1,1,0,1,1,3,45]],[12,205,6,0,47,[0,5,4,4,4,0,71,4,7,0]],[12,252,9,0,50,[17,24,2,0,0,0,0,0,3,54]],[13,24,4,0,50,[4,2,3,1,73,4,4,4,4,0]],[14,26,9,0,46,[1,11,4,1,4,3,5,2,1,67]],[14,29,4,0,61,[0,0,3,0,76,3,0,3,3,11]],[14,73,3,0,65,[0,0,0,70,7,23,0,0,0,0]],[14,228,5,0,62,[3,0,4,5,5,78,5,0,0,0]],[15,2,9,0,100,[0,0,0,0,0,0,0,0,0,100]],[15,19,5,0,51,[0,0,22,36,0,40,1,0,0,0]],[15,59,2,0,70,[0,0,82,0,0,0,3,4,11,0]],[15,107,7,0,55,[0,0,2,0,0,0,38,58,2,0]],[15,146,9,0,50,[25,23,0,0,6,0,0,0,0,46]],[15,226,1,0,50,[3,64,3,0,3,3,3,0,20,0]],[16,11,5,0,55,[0,0,0,2,8,75,2,5,8,0]],[16,168,8,0,43,[32,0,9,0,7,0,5,3,44,0]],[17,64,9,0,82,[0,0,0,0,1,0,4,4,0,90]],[17,174,9,0,67,[0,41,0,2,0,2,0,0,0,54]],[17,198,8,0,61,[7,0,0,0,1,0,0,0,87,5]],[18,13,0,0,47,[47,18,0,1,0,0,0,0,1,32]],[18,14,7,0,51,[3,0,0,4,1,20,4,58,9,0]],[18,57,3,0,69,[17,0,5,76,0,0,0,3,0,0]],[18,86,9,0,50,[28,17,0,0,1,1,0,1,1,52]],[18,102,9,0,48,[4,15,2,0,0,12,0,0,0,67]],[18,113,6,0,46,[4,12,2,1,0,8,70,0,3,0]],[18,131,1,0,46,[0,46,24,22,0,2,2,3,0,0]],[18,137,1,0,46,[9,62,0,8,0,0,3,6,12,0]],[18,170,1,0,76,[0,86,0,1,2,0,0,1,9,0]],[18,189,9,0,57,[21,16,0,0,0,0,2,4,0,56]],[19,13,1,0,57,[3,63,20,0,0,0,0,13,0,0]],[19,33,6,0,46,[0,8,2,0,3,34,44,0,2,6]],[19,46,9,0,50,[14,3,0,0,12,4,2,5,0,61]],[19,128,0,0,55,[59,0,0,0,27,0,6,9,0,0]],[19,145,6,0,47,[0,0,5,23,4,10,56,2,0,0]],[19,166,7,0,71,[0,3,0,0,0,0,3,94,0,0]],[19,183,3,0,57,[0,4,0,73,3,6,3,0,11,0]],[19,229,6,0,53,[0,0,0,0,2,41,47,2,7,0]],[20,2,3,0,48,[3,0,17,54,1,2,18,0,2,2]],[20,15,5,0,51,[0,0,0,41,0,49,9,0,1,0]],[20,31,4,0,62,[0,0,3,26,64,0,0,7,0,0]],[20,57,3,0,52,[0,0,33,53,0,0,6,0,8,0]],[20,105,1,0,55,[2,67,2,1,8,0,5,7,0,6]],[20,108,1,0,46,[8,50,5,1,0,0,1,1,0,33]],[20,150,0,0,50,[39,17,0,5,0,0,0,0,3,36]],[20,163,3,0,53,[0,0,12,73,0,4,3,3,6,0]],[20,168,5,0,75,[0,26,0,0,0,74,0,0,0,0]],[20,187,7,0,59,[0,0,8,16,0,0,0,70,3,3]],[20,209,0,0,67,[74,0,0,0,20,0,3,3,0,0]],[20,213,9,0,54,[2,28,6,1,0,0,0,1,0,61]],[20,218,1,0,68,[0,68,0,0,3,0,0,29,0,0]],[20,223,9,0,55,[10,20,2,0,2,0,1,2,0,62]],[20,229,6,0,50,[1,3,4,3,7,4,71,0,0,6]],[20,247,1,0,51,[2,64,3,1,1,0,0,9,0,20]],[21,8,5,0,53,[0,0,6,0,15,71,3,3,3,0]],[21,62,1,0,50,[4,50,2,0,2,3,0,2,0,38]],[21,168,2,0,55,[1,0,70,5,1,3,0,0,0,20]],[21,170,0,0,83,[87,0,0,0,13,0,0,0,0,0]],[21,188,1,0,45,[2,54,2,0,8,3,0,20,11,0]],[21,193,6,0,44,[2,0,0,11,12,1,67,1,4,2]],[21,194,1,0,56,[0,72,8,3,9,0,3,6,0,0]],[21,204,4,0,47,[0,3,23,7,59,3,1,1,3,0]],[21,241,5,0,49,[1,5,0,10,14,63,0,0,3,4]],[21,250,5,0,47,[0,3,0,18,0,65,0,10,0,3]],[22,32,1,0,48,[0,43,0,1,28,0,28,1,0,0]],[22,63,2,0,75,[0,4,85,0,0,0,4,7,0,0]],[22,69,7,0,81,[0,11,0,0,0,0,0,89,0,0]],[22,95,5,0,55,[7,0,0,3,0,60,10,3,17,0]],[22,135,8,0,54,[28,6,3,0,8,0,0,0,55,0]],[22,164,4,0,49,[0,2,3,1,64,8,3,2,9,8]],[22,187,0,0,64,[61,0,0,0,1,3,0,0,34,0]],[22,209,7,0,51,[0,30,0,1,1,0,2,57,8,0]],[22,237,5,0,47,[0,0,13,1,24,55,3,3,1,0]],[23,4,5,0,62,[6,10,6,0,0,76,0,0,0,3]],[23,49,8,0,40,[14,8,3,0,0,1,2,2,69,0]],[23,120,0,0,49,[46,4,1,0,5,2,2,2,0,39]],[23,122,0,0,54,[57,0,2,0,21,5,4,0,0,12]],[23,163,1,0,76,[9,86,3,3,0,0,0,0,0,0]],[24,59,7,0,100,[0,0,0,0,0,0,0,100,0,0]],[24,97,1,0,50,[6,70,6,6,9,0,0,0,3,0]],[24,129,7,0,48,[0,2,0,2,8,0,5,80,2,2]],[24,134,5,0,61,[0,0,0,45,4,48,2,0,0,0]],[24,207,5,0,50,[6,2,1,1,2,75,6,0,6,1]],[24,239,2,0,45,[0,4,35,31,3,5,0,23,0,0]],[25,62,7,0,68,[0,0,19,0,3,3,0,75,0,0]],[25,68,5,0,45,[7,7,6,2,8,61,0,9,0,0]],[25,123,5,0,66,[0,0,2,5,3,81,6,3,0,0]],[25,234,1,0,47,[13,62,4,2,2,0,4,0,5,10]],[26,122,1,0,61,[10,71,0,6,0,0,0,13,0,0]],[26,232,5,0,51,[3,0,9,0,5,64,3,8,8,0]],[27,0,4,0,49,[5,3,0,12,53,2,23,0,2,0]],[27,26,8,0,49,[0,0,11,2,0,25,0,11,50,0]],[27,81,5,0,49,[3,0,0,13,19,61,1,0,0,2]],[27,152,4,0,50,[0,0,0,8,63,8,0,6,0,14]],[27,240,8,0,49,[2,4,3,1,6,3,2,4,74,1]],[28,30,0,0,45,[45,2,0,0,1,10,0,0,29,13]],[28,52,4,0,52,[10,3,0,9,71,0,3,0,3,0]],[28,63,0,0,48,[51,3,0,0,6,3,0,0,0,38]],[28,84,3,0,58,[0,0,0,69,0,17,3,3,3,4]],[28,110,9,0,52,[2,11,0,0,4,0,0,2,0,82]],[28,142,3,0,50,[20,0,36,40,3,0,0,0,0,0]],[28,151,2,0,45,[7,0,57,0,5,28,2,0,0,0]],[28,177,3,0,59,[17,0,14,62,0,0,0,3,3,0]],[28,221,9,0,51,[12,0,0,0,20,0,0,0,0,68]],[29,15,4,0,48,[0,3,2,0,62,2,4,5,5,18]],[29,51,3,0,46,[0,4,3,55,0,32,2,0,4,0]],[29,105,8,0,52,[5,0,5,2,7,0,5,0,71,6]],[29,131,9,0,56,[0,17,0,0,26,0,0,0,0,57]],[29,140,5,0,52,[0,0,8,10,5,67,11,0,0,0]],[29,160,4,0,50,[3,3,3,4,73,2,2,3,2,6]],[29,182,7,0,83,[0,0,0,0,3,4,0,93,0,0]],[29,220,5,0,50,[16,7,0,6,2,61,0,2,7,0]],[29,231,9,0,49,[3,22,1,1,3,2,2,1,0,65]],[30,8,8,0,46,[14,1,1,5,2,1,0,8,69,0]],[30,19,7,0,50,[0,16,0,0,14,1,0,65,0,3]],[30,27,2,0,47,[0,0,64,13,12,0,0,9,2,0]],[30,63,5,0,50,[0,2,10,17,5,62,2,2,2,0]],[30,66,9,0,48,[31,8,0,0,3,7,0,0,0,50]],[30,96,4,0,51,[0,0,15,17,63,1,2,0,0,3]],[30,109,7,0,50,[0,0,9,0,2,33,0,48,0,8]],[30,110,2,0,41,[8,16,50,5,7,7,5,0,3,0]],[30,115,7,0,51,[0,0,5,0,24,0,5,62,5,0]],[30,146,6,0,64,[0,0,3,15,3,0,76,0,3,0]],[30,157,6,0,49,[6,9,6,3,13,0,61,0,3,0]],[30,170,5,0,74,[0,0,30,0,0,70,0,0,0,0]],[30,192,9,0,53,[6,10,0,0,20,0,0,0,0,65]],[30,203,0,0,44,[58,11,2,0,2,5,0,10,5,6]],[30,234,9,0,41,[5,22,12,4,0,0,2,2,9,44]],[30,245,8,0,48,[8,0,8,4,2,0,2,6,70,0]],[31,25,0,0,66,[72,0,17,0,0,0,0,0,0,12]],[31,88,6,0,53,[0,0,0,1,0,18,55,0,26,0]],[31,107,9,0,50,[22,17,0,0,1,0,0,0,3,57]],[31,140,8,0,55,[0,0,0,35,0,21,0,0,44,0]],[31,143,5,0,60,[3,0,0,18,6,67,3,3,0,0]],[31,192,9,0,44,[3,13,2,0,0,10,1,18,0,53]],[31,228,3,0,53,[0,0,42,48,1,7,0,2,0,0]],[31,231,1,0,47,[1,57,2,3,0,1,0,17,0,20]],[31,243,8,0,48,[13,14,0,0,18,0,0,1,53,1]],[31,247,6,0,88,[0,0,0,3,0,3,94,0,0,0]],[31,252,4,0,48,[0,23,0,0,51,0,0,12,3,10]],[32,4,5,0,48,[0,5,0,5,10,63,0,0,0,17]],[32,15,5,0,52,[0,0,0,17,0,63,0,12,9,0]],[32,22,9,0,53,[0,19,5,11,0,0,2,2,0,63]],[32,41,1,0,56,[3,83,0,3,0,5,3,0,3,0]],[32,43,6,0,45,[4,0,2,35,0,4,46,9,0,0]],[32,55,6,0,51,[0,0,0,4,41,7,45,0,3,0]],[32,57,0,0,52,[67,3,6,1,9,0,4,3,4,2]],[32,128,8,0,50,[36,0,5,8,0,0,5,0,47,0]],[32,133,1,0,41,[4,62,2,0,24,3,4,0,0,2]],[32,134,5,0,45,[3,3,12,9,2,62,3,0,1,6]],[32,155,8,0,49,[0,31,0,2,0,0,0,4,42,21]],[32,205,1,0,67,[0,80,2,1,0,0,3,11,3,0]],[32,212,5,0,65,[0,0,0,46,0,54,0,0,0,0]],[32,241,6,0,47,[0,9,0,8,1,1,67,11,3,0]],[33,16,5,0,48,[1,0,3,23,1,64,3,0,1,3]],[33,23,9,0,61,[8,2,0,0,1,0,0,5,0,85]],[33,39,4,0,65,[2,0,3,5,78,11,0,2,0,0]],[33,48,2,0,71,[0,6,87,0,0,4,3,0,0,0]],[33,64,0,0,46,[61,0,2,0,0,0,5,5,27,0]],[33,72,1,0,49,[0,77,2,2,2,0,5,10,0,0]],[33,89,6,0,52,[3,13,0,17,0,0,59,0,0,8]],[33,138,5,0,49,[0,8,0,9,2,56,5,0,20,0]],[33,142,7,0,63,[8,0,3,2,3,0,3,79,3,0]],[33,155,7,0,89,[0,0,0,0,6,0,0,94,0,0]],[33,171,8,0,46,[0,2,2,2,9,2,0,5,70,8]],[33,187,8,0,43,[0,4,2,7,18,1,1,0,67,0]],[33,209,9,0,39,[29,9,4,0,0,9,0,0,16,32]],[33,230,6,0,53,[0,0,12,19,9,0,60,0,0,0]],[34,5,0,0,54,[66,0,15,2,0,0,0,0,17,0]],[34,22,8,0,49,[0,30,12,4,0,3,2,0,49,0]],[34,45,6,0,44,[0,2,3,2,24,0,62,4,4,0]],[34,86,2,0,65,[2,3,83,2,0,2,0,7,0,0]],[34,99,9,0,49,[7,29,2,2,2,9,0,0,0,50]],[34,130,2,0,59,[0,0,61,6,0,29,3,0,0,0]],[34,184,7,0,52,[3,0,6,9,3,4,0,61,13,0]],[34,196,7,0,81,[0,0,0,0,0,3,0,87,0,10]],[34,204,0,0,44,[54,21,0,0,0,10,0,14,0,0]],[34,243,8,0,33,[0,7,6,1,4,0,8,5,69,0]],[34,248,3,0,51,[0,16,2,64,0,4,0,5,0,8]],[35,27,0,0,51,[45,12,0,0,1,0,0,1,0,40]],[35,28,1,0,53,[10,61,10,2,12,0,5,0,0,0]],[35,36,3,0,62,[0,0,0,71,18,11,0,0,0,0]],[35,38,4,0,53,[6,0,0,0,58,0,23,12,0,0]],[35,79,1,0,44,[0,68,10,3,8,6,0,5,0,0]],[35,108,2,0,50,[0,31,52,4,0,1,11,0,0,0]],[35,116,8,0,52,[0,0,2,11,0,19,9,0,58,0]],[35,157,1,0,52,[12,64,5,6,0,0,0,2,0,11]],[35,214,7,0,46,[3,0,3,3,0,29,30,32,0,0]],[35,219,6,0,49,[8,0,6,2,0,36,48,0,0,0]],[35,224,9,0,48,[2,29,4,3,0,1,0,8,1,53]],[35,235,0,0,54,[66,0,7,0,2,3,0,21,0,0]],[36,5,5,0,49,[8,0,7,5,8,66,3,3,0,0]],[36,21,9,0,51,[44,6,0,0,3,0,0,3,0,44]],[36,22,4,0,74,[2,0,0,4,87,2,0,2,4,0]],[36,31,4,0,49,[0,12,2,0,52,0,21,5,8,0]],[36,73,3,0,58,[0,0,43,49,0,5,3,0,0,0]],[36,82,0,0,69,[80,11,7,0,3,0,0,0,0,0]],[36,102,2,0,57,[0,0,56,2,0,0,0,36,0,6]],[36,110,5,0,38,[4,0,15,14,2,49,4,6,6,0]],[36,164,0,0,50,[51,0,3,36,0,3,3,0,0,3]],[36,179,5,0,51,[2,5,4,0,4,64,7,4,0,10]],[36,189,0,0,51,[55,0,0,28,0,11,0,0,0,6]],[36,198,9,0,52,[14,13,0,0,2,7,0,0,0,64]],[36,210,7,0,50,[33,0,6,0,0,0,3,52,0,6]],[36,220,8,0,51,[0,2,0,2,34,0,11,3,49,0]],[36,238,9,0,62,[0,46,0,2,1,1,0,0,0,50]],[37,26,2,0,49,[10,13,65,4,2,0,2,2,2,0]],[37,29,4,0,71,[3,0,0,13,80,0,3,0,0,0]],[37,32,3,0,51,[1,2,0,55,4,0,38,0,0,0]],[37,73,2,0,53,[7,0,62,19,0,5,0,5,0,2]],[37,83,9,0,48,[1,25,1,1,7,3,0,0,0,60]],[37,85,8,0,39,[5,0,0,17,2,2,2,2,67,2]],[37,104,4,0,64,[0,0,0,48,48,0,0,3,0,0]],[37,140,3,0,55,[0,0,0,45,17,36,2,0,0,0]],[37,156,9,0,51,[10,11,0,0,10,2,4,0,2,62]],[37,162,7,0,49,[0,3,12,26,0,0,6,49,3,0]],[37,215,7,0,49,[2,0,0,2,14,29,0,54,0,0]],[37,224,2,0,49,[0,0,58,6,0,0,1,26,8,1]],[37,255,7,0,57,[0,0,0,0,5,0,2,55,2,37]],[38,67,8,0,85,[0,2,0,0,4,0,0,0,92,2]],[38,90,1,0,60,[4,72,0,4,0,1,1,0,0,18]],[38,105,3,0,49,[0,3,0,57,8,3,9,17,3,0]],[38,107,9,0,58,[0,19,0,0,17,0,0,0,0,64]],[38,143,1,0,48,[3,71,12,0,0,3,0,0,6,5]],[38,251,6,0,51,[2,0,11,15,0,3,62,7,0,0]],[38,254,9,0,54,[38,2,2,0,0,0,0,0,8,51]],[39,25,0,0,46,[60,0,24,11,0,0,0,5,0,0]],[39,35,7,0,51,[0,3,27,0,0,12,3,55,0,0]],[39,38,6,0,71,[0,0,0,8,0,2,83,4,2,0]],[39,42,2,0,49,[6,0,48,36,0,11,0,0,0,0]],[39,54,0,0,52,[64,7,0,3,0,0,9,0,17,0]],[39,87,7,0,100,[0,0,0,0,0,0,0,100,0,0]],[39,93,0,0,47,[49,0,4,5,0,2,0,0,17,23]],[39,124,0,0,49,[46,12,32,0,1,2,0,1,0,5]],[39,194,7,0,58,[0,3,3,14,0,1,2,75,2,0]],[39,200,3,0,75,[7,0,7,83,0,2,0,0,0,0]],[39,201,3,0,48,[0,0,18,47,0,30,2,0,0,1]],[39,202,7,0,51,[0,0,0,0,15,1,38,44,0,0]],[39,209,9,0,48,[5,6,1,1,4,0,1,0,19,64]],[39,250,5,0,49,[11,3,0,3,3,70,5,3,0,3]],[40,8,0,0,51,[62,0,0,0,2,5,0,0,0,31]],[40,21,9,0,62,[15,7,2,0,0,0,0,0,0,76]],[40,38,8,0,47,[28,4,0,0,0,1,0,2,59,4]],[40,53,0,0,48,[49,0,2,5,10,1,0,0,1,32]],[40,72,9,0,49,[1,23,0,0,0,8,0,1,8,58]],[40,94,9,0,50,[41,7,1,0,0,5,0,0,0,46]],[40,129,2,0,45,[3,0,56,25,3,0,0,13,0,0]],[40,134,5,0,58,[0,1,7,0,3,76,0,0,0,13]],[40,162,3,0,50,[0,0,5,66,0,20,8,0,0,0]],[40,185,0,0,52,[64,5,1,0,0,0,0,16,15,0]],[40,188,3,0,53,[0,6,23,56,0,15,0,0,0,0]],[40,213,9,0,49,[2,8,0,2,2,24,0,0,0,63]],[41,12,0,0,46,[53,12,0,0,1,3,0,0,11,19]],[41,18,3,0,53,[11,2,0,73,0,0,5,4,5,0]],[41,23,7,0,46,[0,2,12,13,3,0,4,65,1,0]],[41,39,4,0,49,[4,4,5,2,73,0,4,6,3,0]],[41,45,0,0,64,[76,7,3,0,0,4,0,0,0,10]],[41,60,9,0,49,[21,0,1,0,1,0,2,0,28,46]],[41,77,3,0,53,[0,0,37,45,2,16,0,0,0,0]],[41,97,9,0,56,[0,0,6,0,3,3,0,6,6,76]],[41,140,0,0,47,[58,0,8,5,4,7,1,15,0,2]],[41,154,5,0,46,[2,18,2,2,0,45,0,0,3,28]],[41,161,7,0,100,[0,0,0,0,0,0,0,100,0,0]],[41,170,8,0,61,[0,4,0,0,0,31,4,0,62,0]],[41,171,7,0,53,[4,17,3,2,0,0,7,62,6,0]],[41,172,6,0,49,[4,2,2,0,0,9,65,6,9,2]],[41,193,5,0,55,[3,5,0,15,9,68,0,0,0,0]],[41,251,7,0,44,[11,0,17,14,0,3,3,30,23,0]],[42,0,2,0,50,[22,0,49,0,0,26,0,0,3,0]],[42,94,7,0,55,[0,7,4,0,4,11,0,71,3,0]],[42,240,9,0,76,[0,17,0,0,0,0,2,0,0,81]],[43,1,0,0,45,[49,5,3,1,0,0,11,0,1,31]],[43,20,5,0,59,[3,0,39,0,0,54,0,0,0,5]],[43,41,0,0,51,[73,3,9,3,1,1,6,0,3,0]],[43,59,1,0,54,[0,60,8,2,0,0,4,9,15,2]],[43,66,8,0,45,[13,0,1,0,18,0,4,0,62,0]],[43,110,9,0,55,[2,4,2,0,4,0,0,26,0,63]],[43,138,3,0,71,[0,0,0,79,0,3,0,18,0,0]],[43,198,4,0,57,[0,3,0,5,84,4,0,0,5,0]],[43,221,7,0,48,[1,4,0,10,0,1,18,61,6,0]],[43,248,6,0,49,[8,0,0,6,0,8,60,8,11,0]],[44,11,0,0,59,[71,3,3,3,0,0,0,3,0,18]],[44,207,3,0,56,[7,0,9,70,10,5,0,0,0,0]],[44,209,6,0,60,[0,0,0,3,3,24,69,3,0,0]],[44,226,8,0,76,[8,0,0,6,0,0,0,2,85,0]],[44,249,3,0,50,[0,0,0,48,28,15,9,0,0,0]],[45,17,0,0,60,[74,3,18,0,0,0,3,3,0,0]],[45,34,1,0,65,[8,78,0,0,0,5,0,6,0,3]],[45,48,2,0,66,[0,0,70,10,0,0,0,20,0,0]],[45,60,2,0,71,[0,0,59,0,0,0,0,41,0,0]],[45,78,9,0,46,[0,16,1,4,1,2,5,3,0,68]],[45,98,2,0,43,[14,0,44,41,0,0,0,2,0,0]],[45,100,0,0,53,[59,0,1,0,6,23,0,7,0,4]],[45,112,1,0,90,[0,94,0,0,0,0,0,6,0,0]],[45,154,7,0,80,[0,0,0,0,0,10,2,88,0,0]],[45,159,6,0,57,[3,0,0,5,3,5,81,3,0,0]],[46,66,6,0,52,[0,0,5,3,3,0,76,6,7,0]],[46,129,8,0,55,[8,2,1,0,0,18,0,0,72,0]],[46,193,0,0,48,[69,3,8,1,1,3,3,4,3,3]],[46,237,6,0,48,[10,0,14,8,11,0,58,0,0,0]],[46,243,1,0,49,[0,42,0,0,14,1,0,1,1,41]],[47,14,4,0,59,[0,4,0,20,67,10,0,0,0,0]],[47,26,5,0,48,[10,8,0,0,2,61,0,16,3,0]],[47,53,0,0,53,[56,0,2,0,0,32,0,0,3,8]],[47,161,8,0,49,[1,0,2,1,5,18,2,0,65,6]],[47,177,6,0,49,[0,0,9,29,9,0,53,0,0,0]],[47,192,6,0,51,[10,0,0,6,0,0,83,0,0,0]],[47,199,5,0,58,[0,0,22,18,0,60,0,0,0,0]],[47,236,5,0,47,[2,5,0,2,10,67,2,0,1,12]],[48,53,2,0,94,[0,0,97,0,3,0,0,0,0,0]],[48,65,5,0,50,[0,5,0,32,8,52,2,2,0,0]],[48,153,5,0,66,[0,0,0,2,0,51,0,0,47,0]],[48,172,4,0,49,[3,3,4,3,71,2,2,3,3,4]],[48,183,7,0,53,[0,2,0,5,0,13,6,72,2,0]],[48,219,3,0,51,[4,0,12,71,0,4,0,0,8,0]],[48,240,4,0,51,[1,5,3,1,73,2,1,1,3,10]],[49,33,7,0,50,[2,41,2,1,0,1,3,47,3,0]],[49,47,0,0,54,[59,3,0,0,0,3,0,0,29,6]],[49,73,8,0,47,[1,1,0,14,5,1,0,0,72,6]],[49,95,0,0,46,[64,5,0,0,4,2,0,2,0,22]],[49,185,1,0,51,[2,70,4,3,2,9,5,0,3,2]],[49,186,2,0,74,[0,0,71,29,0,0,0,0,0,0]],[49,191,2,0,49,[0,0,62,24,5,2,1,5,2,0]],[49,196,9,0,44,[0,10,4,0,37,0,0,0,2,47]],[49,218,3,0,57,[0,0,40,46,0,14,0,0,0,0]],[49,220,6,0,48,[0,0,9,0,0,20,64,4,0,3]],[49,254,6,0,54,[0,0,0,10,30,11,50,0,0,0]],[50,31,6,0,47,[0,2,6,1,1,23,55,4,4,3]],[50,113,8,0,51,[1,3,4,4,2,5,1,5,73,2]],[50,156,7,0,71,[0,0,22,3,0,0,0,75,0,0]],[50,202,2,0,88,[0,0,93,3,3,0,0,0,0,0]],[50,208,8,0,45,[32,10,7,4,0,2,4,2,40,0]],[50,226,4,0,52,[1,0,1,6,71,12,9,1,0,0]],[50,250,5,0,53,[0,3,3,1,10,68,6,6,2,0]],[51,10,4,0,60,[0,0,18,3,68,0,0,0,0,11]],[51,17,6,0,61,[0,0,0,16,0,6,72,2,4,0]],[51,29,1,0,69,[2,79,5,1,0,0,1,4,8,0]],[51,57,0,0,100,[100,0,0,0,0,0,0,0,0,0]],[51,64,9,0,52,[6,12,0,1,16,2,0,0,0,64]],[51,96,3,0,57,[3,0,0,52,2,0,0,40,3,0]],[51,165,6,0,52,[0,0,0,11,0,0,66,17,6,0]],[51,177,5,0,48,[2,7,0,29,12,45,6,0,0,0]],[51,182,0,0,56,[73,0,2,2,0,5,2,5,0,10]],[51,194,3,0,54,[1,1,31,52,0,13,0,0,2,0]],[51,214,0,0,50,[52,0,0,0,0,32,8,0,0,8]],[51,227,9,0,68,[0,0,3,0,5,15,0,0,0,78]],[51,230,0,0,48,[64,0,9,7,2,0,5,5,8,0]],[51,244,6,0,51,[5,0,0,3,44,0,47,0,2,0]],[52,2,9,0,50,[2,4,3,4,3,5,2,4,5,68]],[52,9,4,0,48,[4,5,4,4,73,1,1,3,3,1]],[52,65,8,0,51,[21,1,1,1,2,3,2,7,63,0]],[52,74,8,0,51,[3,0,8,2,1,6,1,8,69,3]],[52,88,1,0,59,[3,70,3,0,5,10,2,3,0,4]],[52,109,3,0,66,[0,0,47,50,0,3,0,0,0,0]],[52,126,9,0,37,[0,4,3,4,11,4,2,11,2,58]],[52,155,0,0,44,[66,0,0,3,3,0,16,3,9,0]],[52,172,7,0,46,[6,30,5,0,0,0,0,55,3,0]],[52,187,0,0,69,[82,0,3,0,3,0,0,6,6,0]],[52,196,9,0,49,[5,6,1,1,0,1,3,11,1,70]],[52,201,2,0,60,[26,0,52,19,0,0,0,0,3,0]],[52,205,3,0,56,[3,5,0,73,2,16,0,0,0,0]],[52,215,1,0,52,[18,60,0,0,0,0,0,17,0,6]],[52,226,2,0,51,[0,0,45,28,0,19,3,3,3,0]],[52,227,4,0,51,[0,10,0,0,72,0,3,0,0,15]],[52,229,5,0,73,[0,0,0,15,5,79,0,0,0,0]],[52,240,6,0,52,[7,0,3,0,0,3,61,1,25,0]],[52,246,9,0,52,[36,2,0,0,19,0,0,0,0,43]],[52,249,5,0,53,[0,0,30,0,2,59,9,0,0,0]],[52,254,1,0,54,[0,45,0,3,40,0,3,3,0,5]],[53,35,0,0,51,[43,0,0,0,15,1,37,3,0,0]],[53,54,4,0,49,[2,9,7,2,69,0,0,0,2,10]],[53,113,4,0,48,[0,1,0,2,65,18,5,1,0,7]],[53,176,7,0,59,[9,0,0,28,0,0,0,63,0,0]],[53,224,6,0,56,[2,0,2,13,0,0,79,2,2,0]],[53,235,9,0,53,[0,3,2,1,14,5,3,3,1,68]],[54,19,9,0,52,[2,0,10,3,6,2,0,2,3,73]],[54,23,8,0,44,[4,1,2,2,1,3,23,1,65,0]],[54,33,9,0,50,[0,3,10,8,8,0,0,0,0,71]],[54,62,5,0,49,[10,6,4,0,13,64,0,0,2,0]],[54,81,3,0,66,[0,2,6,66,0,9,17,0,0,0]],[54,105,4,0,50,[1,0,18,5,63,0,7,3,4,0]],[54,122,1,0,52,[15,64,0,0,7,2,0,0,0,11]],[54,134,0,0,39,[71,3,8,2,7,3,0,2,2,0]],[54,140,4,0,49,[1,4,4,1,72,3,4,3,2,5]],[54,165,1,0,55,[0,68,13,0,12,4,3,0,0,0]],[54,254,5,0,42,[15,0,0,3,4,50,14,9,2,3]],[55,18,7,0,94,[0,0,0,0,0,0,3,97,0,0]],[55,44,3,0,46,[0,0,1,43,3,19,0,0,34,0]],[55,46,2,0,50,[0,0,56,2,0,3,0,31,0,8]],[55,64,5,0,40,[6,3,5,7,11,59,3,0,4,2]],[55,105,1,0,50,[1,60,2,23,5,0,6,0,3,0]],[55,121,9,0,41,[0,8,8,10,10,0,5,8,3,50]],[55,139,1,0,65,[0,81,0,2,7,3,2,2,0,4]],[55,144,3,0,59,[1,0,0,48,8,44,0,0,0,0]],[55,150,0,0,67,[74,0,3,0,0,0,0,0,19,3]],[55,171,3,0,49,[3,1,40,48,0,7,0,1,1,0]],[55,180,8,0,48,[2,5,1,0,5,0,5,9,72,2]],[55,198,8,0,50,[20,2,2,2,3,1,0,1,68,1]],[55,202,6,0,60,[7,2,0,3,2,0,76,0,7,3]],[55,217,1,0,51,[0,67,0,8,11,4,0,6,0,3]],[55,225,3,0,50,[0,0,17,52,4,27,0,0,0,0]],[56,32,6,0,50,[6,5,1,0,1,0,74,1,5,6]],[56,104,5,0,47,[1,1,0,1,0,62,4,19,4,7]],[56,109,1,0,47,[0,52,6,3,1,0,8,21,8,0]],[56,130,9,0,47,[18,11,0,1,19,2,0,0,0,49]],[56,140,3,0,97,[0,0,0,100,0,0,0,0,0,0]],[56,142,9,0,58,[0,14,2,0,0,13,2,0,0,69]],[56,163,0,0,54,[54,0,5,4,2,2,2,0,33,0]],[56,192,0,0,50,[62,3,0,3,1,7,14,3,1,6]],[56,215,0,0,57,[62,0,0,0,0,0,5,0,30,4]],[57,9,1,0,60,[8,69,2,0,2,0,0,2,0,18]],[57,102,2,0,60,[0,6,52,42,0,0,0,0,0,0]],[57,104,5,0,61,[0,0,0,0,0,66,3,31,0,0]],[57,134,7,0,50,[3,0,6,6,0,5,7,70,4,0]],[57,136,7,0,51,[2,2,2,2,4,3,4,74,3,4]],[57,164,3,0,81,[0,0,6,91,3,0,0,0,0,0]],[57,169,0,0,75,[81,0,0,0,3,16,0,0,0,0]],[57,205,2,0,62,[0,0,63,24,0,0,0,6,7,0]],[57,255,7,0,51,[0,0,34,0,3,0,19,45,0,0]],[58,12,6,0,54,[1,7,0,1,19,0,70,0,0,2]],[58,13,7,0,79,[7,0,2,0,0,0,0,88,2,0]],[58,33,5,0,57,[2,0,0,32,0,60,0,0,5,0]],[58,69,4,0,58,[0,1,0,0,69,5,0,0,17,8]],[58,98,9,0,51,[8,4,6,0,0,0,6,0,0,75]],[58,104,2,0,46,[0,20,63,0,14,0,4,0,0,0]],[58,109,8,0,52,[44,0,3,1,2,1,0,1,48,0]],[58,114,6,0,48,[5,3,1,2,6,15,66,1,2,0]],[58,137,5,0,65,[0,2,46,0,0,50,0,0,1,2]],[58,152,0,0,45,[57,0,0,2,8,0,0,22,0,11]],[58,154,3,0,47,[1,3,1,50,27,17,1,1,0,0]],[58,236,7,0,53,[17,0,0,0,29,5,0,49,0,0]],[58,255,9,0,59,[0,15,1,0,3,0,0,0,0,81]],[59,14,9,0,51,[1,32,0,0,1,7,2,2,0,53]],[59,71,9,0,55,[0,4,4,0,10,6,0,0,4,71]],[59,114,5,0,51,[2,0,0,33,13,49,0,1,1,1]],[59,165,1,0,50,[0,68,5,7,2,2,3,7,6,0]],[59,170,9,0,44,[9,32,2,2,0,9,0,0,0,45]],[59,213,6,0,48,[1,2,2,1,11,5,68,7,4,0]],[59,220,8,0,47,[10,3,12,0,0,0,0,0,65,10]],[60,9,4,0,40,[1,4,18,4,51,10,2,1,8,0]],[60,43,0,0,58,[70,0,15,0,3,0,0,7,0,5]],[60,114,1,0,53,[0,69,12,2,2,5,0,5,4,0]],[60,120,7,0,50,[7,0,1,1,2,0,1,64,25,0]],[60,121,9,0,46,[21,23,0,2,0,0,3,0,6,45]],[60,127,6,0,61,[2,2,4,20,0,0,71,2,0,0]],[60,131,1,0,41,[2,55,0,0,10,2,5,8,7,11]],[60,133,3,0,60,[3,0,0,72,0,0,12,9,3,0]],[60,135,7,0,45,[16,1,8,0,1,0,1,57,6,8]],[60,140,0,0,51,[51,7,0,0,0,1,0,0,6,34]],[60,143,5,0,51,[0,0,6,3,0,56,0,3,32,0]],[60,154,5,0,49,[4,1,1,4,2,75,2,2,2,7]],[60,155,6,0,45,[7,2,6,17,2,0,66,0,0,0]],[60,167,8,0,54,[2,13,8,7,2,0,6,4,59,0]],[60,173,1,0,52,[2,63,1,0,0,24,0,5,2,4]],[60,179,2,0,77,[0,0,85,12,0,3,0,0,0,0]],[60,181,4,0,44,[0,0,2,3,42,0,3,15,35,0]],[60,182,0,0,63,[80,2,2,4,0,0,4,2,6,0]],[60,184,1,0,58,[0,82,0,0,0,7,3,0,8,0]],[60,215,9,0,56,[0,2,10,7,9,0,5,2,10,55]],[60,240,9,0,51,[12,3,3,4,2,2,0,2,1,71]],[60,244,7,0,53,[0,0,5,4,7,4,5,76,0,0]],[61,40,1,0,60,[0,73,0,11,0,0,2,0,5,7]],[61,83,1,0,49,[7,48,1,0,1,8,0,6,0,29]],[61,94,9,0,47,[2,0,20,0,27,0,0,0,0,50]],[61,99,7,0,63,[0,0,10,0,3,5,6,76,0,0]],[61,100,0,0,50,[57,2,1,0,1,5,2,3,1,29]],[61,103,2,0,49,[0,0,48,3,9,34,0,3,0,3]],[61,106,9,0,52,[0,21,2,0,0,1,0,3,3,70]],[61,110,1,0,57,[4,70,2,1,4,4,0,16,0,0]],[61,111,9,0,55,[22,1,1,4,1,1,1,0,1,69]],[61,136,7,0,47,[0,0,4,15,12,7,0,62,0,0]],[61,168,5,0,48,[0,1,0,0,11,63,5,0,1,18]],[61,186,5,0,70,[0,6,0,6,0,79,3,6,0,0]],[61,246,6,0,71,[0,13,2,0,0,4,81,0,0,0]],[62,23,1,0,51,[3,69,2,12,1,1,4,3,4,0]],[62,25,5,0,81,[0,0,0,10,0,87,0,0,0,3]],[62,32,9,0,73,[0,7,2,0,5,0,2,0,0,84]],[62,40,7,0,56,[0,11,25,3,0,0,0,61,0,0]],[62,41,4,0,49,[3,4,0,10,41,3,40,0,0,0]],[62,55,7,0,54,[0,0,0,0,3,42,0,56,0,0]],[62,66,9,0,59,[4,4,0,0,4,0,0,0,2,86]],[62,84,3,0,47,[3,0,10,69,4,10,0,2,0,2]],[62,86,6,0,52,[0,7,3,5,0,5,71,3,5,0]],[62,104,4,0,51,[2,4,3,1,71,9,3,3,3,1]],[62,109,9,0,55,[8,3,0,1,4,2,0,4,3,74]],[62,122,7,0,53,[13,2,1,3,3,4,3,69,3,0]],[62,163,4,0,43,[2,5,3,2,71,5,0,2,10,0]],[62,188,5,0,49,[0,0,0,3,43,54,0,0,0,0]],[62,205,7,0,63,[3,0,9,6,0,0,12,55,0,14]],[62,249,5,0,58,[0,0,7,0,3,67,21,0,0,3]],[62,255,3,0,47,[3,0,20,66,0,0,0,3,5,4]],[63,31,0,0,47,[56,5,0,0,20,0,9,4,0,6]],[63,53,8,0,48,[4,1,4,2,3,7,4,2,70,2]],[63,81,4,0,54,[0,14,2,3,69,6,3,3,1,0]],[63,100,9,0,50,[4,15,0,1,2,4,1,5,0,67]],[63,112,6,0,61,[17,2,0,0,4,0,77,0,0,0]],[63,158,0,0,51,[68,1,6,1,2,3,4,7,6,3]],[63,183,2,0,48,[0,2,48,4,1,42,0,2,0,1]],[63,190,6,0,73,[0,3,8,0,0,8,81,0,0,0]],[63,192,1,0,41,[15,38,3,0,0,0,15,0,19,10]],[63,193,1,0,52,[4,72,2,0,2,0,0,13,0,7]],[63,204,0,0,62,[64,0,2,0,7,7,0,0,0,21]],[63,205,0,0,53,[49,2,2,0,1,5,0,1,0,40]],[64,60,9,0,48,[28,5,1,2,5,1,0,2,4,52]],[64,66,8,0,51,[11,1,1,0,8,4,4,0,70,1]],[64,104,5,0,54,[0,0,0,9,0,69,0,7,0,15]],[64,106,9,0,50,[9,15,0,1,4,1,6,0,0,65]],[64,108,0,0,53,[53,1,1,0,29,2,2,0,0,12]],[64,178,8,0,49,[7,10,4,11,2,10,0,0,56,0]],[64,207,1,0,67,[5,82,2,2,0,0,0,4,5,0]],[64,211,5,0,53,[3,0,0,11,19,59,9,0,0,0]],[65,54,1,0,91,[0,95,0,0,0,0,0,0,2,2]],[65,62,1,0,47,[10,61,2,0,3,17,1,3,2,2]],[65,65,4,0,67,[1,0,1,0,80,6,8,0,0,2]],[65,72,9,0,50,[0,11,3,4,2,5,1,2,1,71]],[65,100,3,0,49,[0,11,41,44,1,0,1,0,1,0]],[65,133,5,0,48,[4,8,12,7,1,61,1,0,0,5]],[65,149,4,0,53,[1,0,6,4,71,3,1,6,1,4]],[65,172,1,0,52,[2,53,0,0,0,3,0,3,3,36]],[65,179,1,0,53,[13,63,0,4,7,0,0,3,1,10]],[66,28,1,0,51,[0,74,4,0,8,8,0,0,4,2]],[66,49,6,0,49,[0,2,3,3,6,5,68,1,13,0]],[66,52,1,0,46,[2,59,3,4,4,2,9,0,17,0]],[66,64,3,0,54,[2,5,0,73,16,0,5,0,0,0]],[66,104,9,0,49,[40,0,1,1,5,0,0,0,3,50]],[66,124,5,0,72,[0,0,9,0,0,83,0,0,3,6]],[66,134,1,0,53,[0,54,2,2,7,0,0,6,30,0]],[66,143,9,0,52,[3,14,2,0,10,2,0,2,3,65]],[66,150,2,0,54,[6,3,46,11,5,0,25,3,0,0]],[66,237,8,0,46,[4,6,2,9,2,16,0,6,51,4]],[66,252,9,0,55,[45,7,0,0,2,0,0,0,0,45]],[67,45,2,0,51,[14,0,65,5,6,0,0,0,9,0]],[67,68,5,0,64,[0,3,3,0,0,79,0,6,3,7]],[67,80,3,0,51,[0,0,9,43,0,6,0,37,5,0]],[67,196,7,0,80,[0,0,0,6,0,0,0,88,0,7]],[67,224,8,0,55,[41,0,1,1,1,4,0,0,51,1]],[67,228,1,0,53,[3,72,0,0,5,4,8,5,3,0]],[68,19,6,0,49,[6,15,1,3,3,1,67,2,2,0]],[68,21,7,0,47,[3,9,4,3,3,4,1,67,4,2]],[68,32,9,0,43,[6,1,0,2,1,19,1,1,1,65]],[68,35,2,0,52,[0,3,58,26,0,2,0,0,8,3]],[68,82,8,0,41,[2,5,10,10,12,15,0,7,40,0]],[68,119,0,0,53,[71,0,9,1,5,0,5,0,0,9]],[68,125,7,0,68,[0,2,24,0,2,0,0,72,0,0]],[68,130,1,0,41,[8,68,4,0,2,11,0,6,2,0]],[68,171,1,0,52,[0,55,0,5,5,2,0,30,3,0]],[68,211,2,0,54,[2,0,48,1,1,40,1,1,3,2]],[68,228,7,0,50,[0,3,6,3,3,0,5,53,0,27]],[68,241,5,0,52,[0,7,0,9,0,52,0,32,0,0]],[69,54,1,0,52,[3,73,4,0,3,9,2,3,2,0]],[69,56,5,0,58,[17,0,0,0,0,67,0,6,10,0]],[69,88,3,0,51,[2,0,0,49,2,41,0,0,3,3]],[69,127,1,0,53,[1,68,0,2,2,13,2,11,2,0]],[69,135,9,0,59,[0,12,3,0,0,0,0,1,0,83]],[69,140,3,0,50,[0,2,3,67,24,2,1,0,1,0]],[69,216,6,0,51,[0,6,6,3,1,13,68,0,1,1]],[69,237,7,0,92,[0,0,0,0,0,0,0,95,0,5]],[70,50,6,0,52,[0,0,16,2,0,0,69,0,10,2]],[70,65,5,0,51,[1,4,0,28,3,57,1,3,0,3]],[70,76,0,0,52,[73,0,3,2,4,7,2,2,4,1]],[70,78,1,0,50,[0,64,3,0,13,5,3,0,13,0]],[70,93,9,0,55,[1,5,0,5,1,5,1,1,1,80]],[70,113,3,0,50,[0,2,22,61,1,0,3,0,11,0]],[70,120,1,0,50,[3,67,1,0,5,9,3,0,1,10]],[70,139,8,0,66,[2,2,0,7,2,5,0,4,79,0]],[70,151,8,0,55,[2,0,0,0,5,4,8,2,77,3]],[70,184,4,0,48,[0,3,0,5,49,33,0,5,0,5]],[70,214,1,0,45,[6,68,0,2,0,5,6,4,8,0]],[70,233,7,0,100,[0,0,0,0,0,0,0,100,0,0]],[71,3,7,0,51,[3,0,0,10,0,9,0,74,0,4]],[71,9,6,0,47,[7,5,0,0,0,3,57,5,22,0]],[71,33,6,0,44,[7,0,2,13,2,6,58,4,2,5]],[71,36,1,0,49,[9,67,0,0,0,4,0,3,16,0]],[71,42,9,0,58,[4,5,0,0,4,6,0,2,0,79]],[71,66,2,0,51,[0,15,62,5,16,0,0,0,2,0]],[71,128,4,0,52,[1,4,3,2,71,2,2,1,5,9]],[71,149,5,0,47,[0,0,9,28,12,49,2,0,0,0]],[71,159,1,0,100,[0,100,0,0,0,0,0,0,0,0]],[71,200,9,0,74,[0,2,4,2,0,0,7,0,0,84]],[71,238,5,0,47,[1,4,3,9,5,65,5,0,6,1]],[72,20,6,0,50,[4,0,2,0,2,6,75,2,9,0]],[72,30,9,0,50,[2,7,6,1,4,3,1,1,0,75]],[72,66,0,0,49,[50,10,1,0,3,0,0,0,0,36]],[72,87,0,0,44,[55,0,5,9,9,4,2,12,2,0]],[72,144,2,0,100,[0,0,100,0,0,0,0,0,0,0]],[72,161,2,0,53,[0,0,76,3,7,0,0,0,14,0]],[72,183,9,0,55,[23,2,2,0,0,0,0,2,11,60]],[72,212,3,0,49,[3,9,2,72,3,0,0,3,9,0]],[72,225,9,0,47,[7,0,8,0,5,4,2,0,3,71]],[73,33,5,0,50,[4,0,4,0,6,65,15,2,4,0]],[73,71,9,0,51,[28,1,4,0,4,1,1,1,1,60]],[73,87,3,0,55,[0,5,16,68,0,0,0,0,0,11]],[73,99,3,0,49,[2,3,40,44,4,8,0,0,0,0]],[73,110,4,0,49,[3,0,2,2,72,5,12,3,1,1]],[73,111,9,0,42,[5,5,2,1,5,3,5,11,1,61]],[73,120,9,0,65,[0,2,0,2,6,0,2,0,0,87]],[73,194,1,0,38,[0,67,2,7,0,12,7,2,2,0]],[73,246,1,0,44,[5,57,4,4,0,18,0,2,5,5]],[74,28,6,0,64,[6,1,6,2,2,4,71,4,3,0]],[74,112,1,0,58,[6,72,0,0,6,9,0,0,6,0]],[74,130,1,0,86,[0,92,0,0,0,3,0,0,0,5]],[74,155,7,0,42,[5,0,8,5,4,19,7,31,0,20]],[74,172,4,0,61,[3,0,0,3,70,4,0,21,0,0]],[75,25,1,0,57,[4,70,3,5,0,3,0,7,4,4]],[75,31,1,0,42,[0,48,4,2,2,18,2,9,5,9]],[75,79,5,0,48,[0,3,0,0,16,52,3,0,25,0]],[75,81,1,0,49,[0,67,5,0,3,16,0,6,3,0]],[75,91,7,0,48,[8,2,12,0,6,0,2,60,2,7]],[75,134,4,0,53,[10,0,5,0,70,5,0,3,0,7]],[75,144,9,0,47,[0,8,2,27,0,4,5,0,0,54]],[75,149,1,0,49,[4,67,0,6,6,3,4,4,4,0]],[75,171,9,0,47,[6,2,1,2,7,1,0,2,2,77]],[75,172,1,0,58,[0,66,0,0,0,3,6,23,3,0]],[75,211,2,0,55,[0,0,54,39,3,4,0,0,0,0]],[76,14,4,0,49,[1,2,1,0,62,1,0,0,8,24]],[76,25,5,0,54,[6,0,0,0,14,69,3,6,3,0]],[76,62,1,0,65,[0,80,5,3,6,0,0,3,0,3]],[76,95,5,0,56,[0,0,7,5,8,74,3,0,3,0]],[76,150,2,0,49,[7,13,52,23,1,2,0,0,1,0]],[76,154,1,0,56,[7,69,1,2,2,10,1,2,3,2]],[76,238,7,0,47,[12,3,12,0,7,8,5,52,0,2]],[77,6,4,0,51,[5,3,1,4,73,3,2,5,3,2]],[77,85,5,0,49,[3,2,3,4,4,72,7,5,0,0]],[77,115,9,0,53,[10,1,0,1,1,7,3,1,1,74]],[77,119,7,0,50,[0,6,10,3,3,0,6,73,0,0]],[77,121,1,0,55,[2,75,0,3,2,2,3,5,4,4]],[77,193,5,0,52,[3,0,6,3,5,68,5,0,7,3]],[77,226,5,0,52,[0,1,1,27,0,63,0,0,5,2]],[77,228,6,0,59,[0,2,0,38,0,5,55,0,0,0]],[77,253,0,0,57,[58,0,1,0,1,4,1,5,5,24]]];
const TOPIC_HUE={casual_chat:215,chinese:2,code_python:145,code_sql:172,german:42,
json_format:88,law:272,math_proof:200,medicine:330,poetry:300};
/* ---------- shared atlas geometry ---------- */
const Atlas=(()=>{
const NC=ATLAS_CATS.length;
const anchors=[];
for(let i=0;i<NC;i++){
const phi=Math.acos(1-2*(i+.5)/NC),th=Math.PI*(1+Math.sqrt(5))*i;
anchors.push([Math.sin(phi)*Math.cos(th),Math.cos(phi),Math.sin(phi)*Math.sin(th)]);
}
const pts=[];
for(const[l,e,ti,canon,spec,p]of ATLAS_RAW){
let sum=0;for(const v of p)sum+=v;if(!sum)continue;
let x=0,y=0,z=0;
for(let c=0;c<NC;c++){const w=p[c]/sum;x+=w*anchors[c][0];y+=w*anchors[c][1];z+=w*anchors[c][2];}
const r=mulberry32(l*257+e),g=()=>(r()+r()+r()-1.5)*.075;
pts.push({x:x+g(),y:y+g(),z:z+g(),hue:TOPIC_HUE[ATLAS_CATS[ti]],ti,canon,spec:spec/100,l,e});
}
const halo=[];{const r=mulberry32(999);
for(let i=0;i<2200;i++){const R=.15+r()*1.0,a=r()*6.283,b=(r()-.5)*2;
halo.push([R*Math.cos(a)*Math.sqrt(1-b*b),R*b,R*Math.sin(a)*Math.sqrt(1-b*b)]);}}
const byTopic=[];
for(let c=0;c<NC;c++){const arr=[];
ATLAS_RAW.forEach((row,i)=>{if(row[5][c]>=8)arr.push([i,row[5][c]])});
byTopic.push(arr);}
const flash=new Float32Array(pts.length);
function flashTopic(c,k){const t=byTopic[c];if(!t.length)return[];
const hit=[];
for(let i=0;i<k;i++){
let tot=0;for(const[,w]of t)tot+=w;let x=Math.random()*tot;
for(const[idx,w]of t){x-=w;if(x<=0){flash[idx]=1;hit.push(idx);break}}}
return hit;}
return{pts,halo,anchors,flash,flashTopic,NC};
})();
/* an AtlasView renders Atlas.pts on a canvas with drag+inertia; opts:
labels (topic label elements), showFlash (white pulse), bare (no interaction,
used for the hero backdrop), dim (alpha multiplier) */
function atlasView(cv,opts){
const cx=cv.getContext('2d');let ry=opts.ry??.6,vy=REDUCED?0:(opts.spin??.0022),
dragging=false,lx=0,visible=false;
const TILT=.32,ct=Math.cos(TILT),st=Math.sin(TILT),DIM=opts.dim??1;
function resize(){const dpr=Math.min(devicePixelRatio||1,2);
cv.width=cv.clientWidth*dpr;cv.height=cv.clientHeight*dpr;}
addEventListener('resize',resize);resize();
if(!opts.bare){
cv.addEventListener('pointerdown',e=>{dragging=true;lx=e.clientX;vy=0;cv.classList.add('grabbing');cv.setPointerCapture(e.pointerId)});
cv.addEventListener('pointermove',e=>{if(!dragging)return;const dx=e.clientX-lx;lx=e.clientX;ry+=dx*.006;vy=dx*.0006});
cv.addEventListener('pointerup',()=>{dragging=false;cv.classList.remove('grabbing')});
}
new IntersectionObserver(es=>{visible=es[0].isIntersecting},{threshold:.02}).observe(cv);
const P=(x,y,z,cr,sr,W,H,S)=>{
const x1=x*cr+z*sr,z1=-x*sr+z*cr,y2=y*.72*ct-z1*st,z2=y*.72*st+z1*ct,
pz=1/(1.9+z2);
return[W*.5+x1*S*pz*1.9,H*.5+y2*S*pz*1.9,z2,pz];};
function frame(){
requestAnimationFrame(frame);if(!visible)return;
if(!dragging){ry+=vy;if(!REDUCED)vy+=((opts.spin??.0022)-vy)*.01;}
const W=cv.width,H=cv.height,S=Math.min(W,H)*(opts.scale??.42),
cr=Math.cos(ry),sr=Math.sin(ry);
cx.clearRect(0,0,W,H);
for(const[hx,hy,hz]of Atlas.halo){
const[sx,sy,z2]=P(hx,hy,hz,cr,sr,W,H,S);
if(sx<0||sx>W||sy<0||sy>H)continue;
const d=Math.max(0,Math.min(1,(1.1-z2)*.62));
cx.fillStyle=`hsla(225,40%,60%,${(.09*d*DIM).toFixed(3)})`;cx.fillRect(sx,sy,1.5,1.5);}
for(let i=0;i<Atlas.pts.length;i++){const p=Atlas.pts[i];
const[sx,sy,z2,pz]=P(p.x,p.y,p.z,cr,sr,W,H,S);
if(sx<0||sx>W||sy<0||sy>H)continue;
const d=Math.max(0,Math.min(1,(1.1-z2)*.62)),
sz=(p.canon?2.6:1.6)*pz*2.2;
cx.fillStyle=`hsla(${p.hue},${p.canon?88:60}%,${p.canon?68:55}%,${((.3+.5*d)*DIM).toFixed(3)})`;
cx.fillRect(sx-sz/2,sy-sz/2,sz,sz);
if(opts.showFlash&&Atlas.flash[i]>0.02){const f=Atlas.flash[i],g=sz+f*9;
cx.fillStyle=`rgba(255,255,255,${(f*.9).toFixed(3)})`;
cx.fillRect(sx-g/2,sy-g/2,g,g);}}
if(opts.labels){
const rect=cv.getBoundingClientRect(),k=rect.width/W;
Atlas.anchors.forEach((a,c)=>{
const[sx,sy,z2]=P(a[0]*1.12,a[1]*1.12,a[2]*1.12,cr,sr,W,H,S),el=opts.labels[c];
el.style.left=(sx*k)+'px';el.style.top=(sy*k)+'px';
el.style.opacity=z2<0?'0.95':'0.18';});}
}
frame();
}
/* ---------- nav scroll state ---------- */
(()=>{const nav=document.getElementById('topnav');
addEventListener('scroll',()=>nav.classList.toggle('scrolled',scrollY>40),{passive:true});})();
/* ---------- scroll reveal ---------- */
(()=>{const io=new IntersectionObserver(es=>es.forEach(e=>{if(e.isIntersecting){e.target.classList.add('in');io.unobserve(e.target)}}),{threshold:.08});
document.querySelectorAll('.reveal').forEach(el=>io.observe(el));})();
/* ---------- hero backdrop: the measured atlas, slowly turning ---------- */
atlasView(document.getElementById('atlas-hero'),{bare:true,scale:.5,spin:.0012,ry:2.2,dim:.85});
/* ---------- demo: terminal + brain + live atlas ---------- */
(()=>{
const LAYERS=76,EXPERTS=256,N=LAYERS*EXPERTS;
const PROFILES=[
{name:'6× RTX 5090 + selective NUMA',toks:9.0,ttft:'13',hit:'100',vram:.62,ram:.38},
{name:'2× Xeon Gold 6430 · 1 TB · CPU-only',toks:5.4,ttft:'—',hit:'100',vram:0,ram:.97},
{name:'M5 Max 128 GB · Metal',toks:2.0,ttft:'—',hit:'72.5',vram:.12,ram:.20},
{name:'RTX 5070 Ti laptop-class',toks:1.07,ttft:'—',hit:'—',vram:.08,ram:.24},
{name:'25 GB dev box (the floor)',toks:0.8,ttft:'—',hit:'11',vram:0,ram:.02,floor:true},
];
/* the floor really decodes at 0.050.1 tok/s; replaying that verbatim means one token
every ~15 s, so the floor profile paces at 0.8 with an honesty note in its transcript. */
const CAT=Object.fromEntries(ATLAS_CATS.map((c,i)=>[c,i]));
const QA=[
{q:'how do you fit 744B parameters into 25 GB of RAM?',topics:[CAT.casual_chat,CAT.code_python],
a:'The model never needs all 744B at once. Each token activates ~40B parameters, and only ~11 GB of those change between tokens — the routed experts. colibrì keeps the dense weights resident, then treats the 19,456 experts as a cache problem: the hot set lives in RAM (or VRAM), the cold tail streams from NVMe, prefetched a layer ahead by the router. The engine is a single C file with zero dependencies — the same binary scales from this floor to a six-GPU workstation.'},
{q:'write a SQL query for the five hottest experts.',topics:[CAT.code_sql,CAT.json_format],
a:'SELECT layer, expert, hits FROM routing_stats ORDER BY hits DESC LIMIT 5; — and watch the atlas below while I say it: the code_sql cluster is firing. Routing affinity is measured per expert, and SQL has its own specialists in this model. That measurement is exactly what the tiering exploits: the engine pins what your workload actually routes to.'},
{q:'用中文写两句关于蜂鸟的诗。',topics:[CAT.chinese,CAT.poetry],
a:'翅膀是引擎的隐喻,一秒五十次的心跳——它悬停时,最像在思考。蜂鸟不需要很大,才能飞得很准。 Look at the galaxy: the chinese and poetry clusters just lit up together. Different language, different experts — measured, replicated across three kernel families, and visible to the naked eye.'},
{q:'what makes the output trustworthy?',topics:[CAT.math_proof,CAT.casual_chat],
a:'Every kernel is validated token-exact against the reference transformers implementation — the int4 container, the AVX-512 and NEON paths, the CUDA grouped matmuls. Quality is measured, not assumed: the quantization cost is published in the benchmark tables, and the expert atlas itself survived leave-one-prompt-out validation and a five-machine cross-kernel replication.'},
];
const term=document.getElementById('term'),profDiv=document.getElementById('profiles'),
profName=document.getElementById('prof-name'),topicNow=document.getElementById('topicnow'),
brain=document.getElementById('brain'),bx=brain.getContext('2d'),
mToks=document.querySelector('#m-toks .v'),mTtft=document.querySelector('#m-ttft .v'),
mHit=document.querySelector('#m-hit .v');
const BANNER=
`<span class="banner"> ▄▀▀▀▄ ▄</span> colibrì v1.0
<span class="banner"> ▄▄▄▄▀▀▀▀▄▀▀</span> <span class="bannertxt">tiny engine, immense model</span>
<span class="banner"> ▀▀▀▀▀▀▀</span> <span class="bannertxt">GLM-5.2 · 744B MoE · int4</span>
<span class="banner"> ▀▀▀▀</span>
<span class="banner"> ▀</span>
`;
const heat=new Float32Array(N),flash=new Float32Array(N);
{const r=mulberry32(42);
for(let l=0;l<LAYERS;l++){
const nh=2+((r()*3)|0),cs=[];for(let h=0;h<nh;h++)cs.push([r()*EXPERTS,8+r()*26]);
for(let e=0;e<EXPERTS;e++){let v=.05+r()*.08;
for(const[c,s]of cs){const d=Math.min(Math.abs(e-c),EXPERTS-Math.abs(e-c));v+=Math.exp(-d*d/(2*s*s))}
heat[l*EXPERTS+e]=Math.min(v,1);}}
/* stats layer numbering is absolute (dense layers 0-2, MoE 3-77): grid row = layer-3 */
for(const p of Atlas.pts){const row=p.l-3;if(row>=0&&row<LAYERS)heat[row*EXPERTS+p.e]=Math.min(.55+p.spec*.45,1);}}
const order=[...heat.keys()].sort((a,b)=>heat[b]-heat[a]);
const tier=new Uint8Array(N);
let P=PROFILES[0];
function setTiers(){const nv=Math.round(N*P.vram),nr=Math.round(N*P.ram);
for(let i=0;i<N;i++)tier[order[i]]=i<nv?2:i<nv+nr?1:0;}
const img=bx.createImageData(EXPERTS,LAYERS);
const TC=[[42,53,96],[77,216,255],[255,184,77]];
function drawBrain(){const d=img.data;
for(let i=0;i<N;i++){const t=TC[tier[i]],h=.28+.72*heat[i],f=flash[i],o=i*4;
d[o]=t[0]*h+(255-t[0]*h)*f; d[o+1]=t[1]*h+(255-t[1]*h)*f; d[o+2]=t[2]*h+(255-t[2]*h)*f; d[o+3]=255;
flash[i]*=.86;}
bx.putImageData(img,0,0);
for(let i=0;i<Atlas.flash.length;i++)Atlas.flash[i]*=.90;}
/* routing per token: measured specialists for the active topic light BOTH views;
the uncharacterised remainder of the 8×75 routed set flashes as background */
function routeToken(topic){
const hit=Atlas.flashTopic(topic,10);
for(const idx of hit){const p=Atlas.pts[idx],row=p.l-3;
if(row>=0&&row<LAYERS)flash[row*EXPERTS+p.e]=1;}
for(let k=0;k<46;k++)flash[(Math.random()*N)|0]=Math.random()*.8;}
let timer=null,qi=0,emitted=[],running=true;
function rate(){const now=performance.now();emitted=emitted.filter(t=>now-t<4000);
return emitted.length/4;}
function setMeters(live){mToks.innerHTML=(live?rate():0).toFixed(1)+'<small> tok/s</small>';
mTtft.innerHTML=P.ttft==='—'?'—':P.ttft+'<small> s</small>';
mHit.innerHTML=P.hit==='—'?'—':P.hit+'<small> %</small>';}
function startTranscript(){
clearTimeout(timer);term.innerHTML=BANNER;qi=0;emitted=[];nextQA();}
function nextQA(){
const{q,a:aRaw,topics}=QA[qi%QA.length];qi++;
const a=(P.floor&&qi%QA.length===1)
?aRaw+' (This box really decodes at 0.050.1 tok/s — the replay is sped up so you do not grow old here. It works. Slowly. That is the point.)'
:aRaw;
topicNow.textContent=topics.map(t=>ATLAS_CATS[t]).join(' + ');
const you=document.createElement('div');you.className='you';you.textContent='▸ you: '+q;term.append(you);
const ans=document.createElement('div');ans.className='ans';term.append(ans);
const cur=document.createElement('span');cur.className='cursor';ans.append(cur);
const words=a.split(/(?=\s)/);let w=0;const t0=performance.now();
(function emit(){
if(!running){timer=setTimeout(emit,300);return}
if(w>=words.length){cur.remove();
const dt=(performance.now()-t0)/1000;
const sl=document.createElement('div');sl.className='statline';
sl.textContent=`[turn] ${words.length} tok · ${(words.length/dt).toFixed(1)} tok/s · hit ${P.hit==='—'?'n/a':P.hit+'%'} · tier vram ${(P.vram*100)|0}% ram ${(P.ram*100)|0}%`;
term.append(sl,document.createElement('br'));term.scrollTop=term.scrollHeight;
timer=setTimeout(nextQA,3200);return}
const burst=Math.random()<.18?2:1;
for(let b=0;b<burst&&w<words.length;b++){
cur.before(document.createTextNode(words[w++]));emitted.push(performance.now());
routeToken(topics[(Math.random()*topics.length)|0]);}
term.scrollTop=term.scrollHeight;setMeters(true);
const jitter=.75+Math.random()*.5;
timer=setTimeout(emit,1000/P.toks*jitter*burst);})();}
PROFILES.forEach((p,i)=>{const b=document.createElement('button');
b.textContent=p.name;if(i===0)b.className='on';
b.onclick=()=>{profDiv.querySelectorAll('button').forEach(x=>x.className='');b.className='on';
P=p;profName.textContent=p.name;setTiers();setMeters(false);startTranscript();};
profDiv.append(b);});
profName.textContent=P.name;setTiers();setMeters(false);
new IntersectionObserver(es=>{running=es[0].isIntersecting},{threshold:.05})
.observe(document.getElementById('demo'));
(function paint(){drawBrain();requestAnimationFrame(paint)})();
startTranscript();
atlasView(document.getElementById('atlas-live'),{showFlash:true,scale:.55,spin:.003,ry:1.4});
})();
/* ---------- standalone measured atlas ---------- */
(()=>{
const labelBox=document.getElementById('alabels'),leg=document.getElementById('atl-legend');
const labels=ATLAS_CATS.map(c=>{const el=document.createElement('div');el.className='alabel';
el.textContent=c;el.style.color=`hsl(${TOPIC_HUE[c]},75%,72%)`;labelBox.append(el);return el;});
ATLAS_CATS.forEach(c=>{const s=document.createElement('span');
s.innerHTML=`<i style="background:hsl(${TOPIC_HUE[c]},75%,60%)"></i>${c}`;leg.append(s);});
atlasView(document.getElementById('atlas'),{labels});
})();
</script>
</body>
</html>