@font-face{font-family:iosevka;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/iosevka-400-normal.5ead42eac03ed115031ab72ad09525bfc4f091fc27ecdfe71ba8363641ba604e.woff2)format("woff2")}@font-face{font-family:iosevka;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/iosevka-400-italic.2a5a04c2d714057349d8a4b9fd85cc94b8c2553aa116d3bed9153dfc97a6ca79.woff2)format("woff2")}@font-face{font-family:iosevka;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/iosevka-700-normal.328b30504c8b5628ca72e230d9881b9849ff7bbb0735559a55b88e825cf6e119.woff2)format("woff2")}@font-face{font-family:iosevka;font-style:italic;font-weight:700;font-display:swap;src:url(/fonts/iosevka-700-italic.03887c67c2ca8ff640eb372529ec3335c7bac7cf3de4fec88f4f749c6b9723d5.woff2)format("woff2")}@font-face{font-family:iosevka etoile;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/etoile-400-normal.7d41e8e68cd7b414f8088aa1fff04276428831d41ca97d7851b8ca0b0d72d329.woff2)format("woff2")}@font-face{font-family:iosevka etoile;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/etoile-400-italic.5ab884d851b1bc49885639bba8a6625e32c72c3a856682e3ab1caeb67c1cbae4.woff2)format("woff2")}@font-face{font-family:iosevka etoile;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/etoile-700-normal.9f8f52032119a4d5258913e18521ec4f1920561943ca8aece69676da3326d259.woff2)format("woff2")}@font-face{font-family:iosevka etoile;font-style:italic;font-weight:700;font-display:swap;src:url(/fonts/etoile-700-italic.564ecc1353dfc902ff1233a780787fb8b559aa28d63ae24ee6f665d0bb25d6c6.woff2)format("woff2")}:root,:root[data-theme=dark]{--paper:#17345c;--ink:#eef1e8;--visited:#ff9b85;color-scheme:dark}:root[data-theme=light]{--paper:#eef1e8;--ink:#17345c;--visited:#b4322a;color-scheme:light}:root{--mono:"Iosevka", ui-monospace, "SF Mono", Menlo, Consolas, monospace;--body:"Iosevka Etoile", Georgia, "Times New Roman", serif;--site:960px}*{box-sizing:border-box}html{background:var(--paper);scroll-padding-top:16px}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--mono);font-size:clamp(16px,.4vw + 11px,19px);line-height:1.65;padding:0 max(16px,env(safe-area-inset-right,0px))0 max(16px,env(safe-area-inset-left,0px));-webkit-text-size-adjust:100%;text-rendering:optimizeLegibility}::selection{background:var(--ink);color:var(--paper)}a{color:inherit;text-underline-offset:3px}:focus-visible{outline:2px dashed var(--ink);outline-offset:3px}img{max-width:100%;height:auto}h1,h2,h3,h4{font-size:inherit;line-height:1.35;text-wrap:balance;margin:0}h1{font-size:1.6em;font-weight:700}p{margin:0 0 1em}.skip{position:absolute;left:-9999px}.skip:focus{left:16px;top:16px;background:var(--ink);color:var(--paper);padding:4px 8px;z-index:10}.site{max-width:var(--site);margin:0 auto;padding-block:28px 40px}main{min-height:50vh}.nav{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:8px 16px}.brand{font-weight:700;text-decoration:none}.brand:hover{background:var(--ink);color:var(--paper)}.brand:hover .cur{background:var(--paper)}.cur{display:inline-block;width:.6em;height:1.1em;background:var(--ink);vertical-align:-.2em;margin-left:2px;animation:blink 1.1s steps(1)infinite}@keyframes blink{50%{opacity:0}}@media(prefers-reduced-motion:reduce){.cur{animation:none}}.menu{display:flex;flex-wrap:wrap;gap:4px 14px}.menu a,.theme-toggle{text-decoration:none}.menu a::before,.theme-toggle::before,.links a::before{content:"["}.menu a::after,.theme-toggle::after,.links a::after{content:"]"}.menu a:hover,.menu a.on,.links a:hover,.theme-toggle:hover{background:var(--ink);color:var(--paper)}.theme-toggle{font:inherit;color:inherit;background:0 0;border:0;padding:0;cursor:pointer}.rule{overflow:hidden;white-space:nowrap;margin:14px 0 22px;user-select:none;line-height:1}.rule::before{content:"────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────"}.rule.dbl::before{content:"════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════"}.prompt{margin:0 0 12px;overflow-wrap:anywhere}.prompt a{text-decoration:none}.prompt a:hover{text-decoration:underline}.lede{margin:8px 0 16px}.links{display:flex;flex-wrap:wrap;gap:4px 14px}.links a{text-decoration:none}.ls-wrap{overflow-x:auto}.ls{width:100%;border-collapse:collapse;font-variant-numeric:tabular-nums}.ls td{padding:8px 14px 8px 0;white-space:nowrap;vertical-align:top}.ls td:first-child{padding-left:8px}.ls td.t{white-space:normal;width:100%}.ls td.go{padding-right:8px;text-align:right;font-weight:700}.ls tr+tr td{border-top:1px dashed var(--ink)}.ls tr{position:relative;cursor:pointer}.ls td.t a{font-weight:700;text-decoration:underline;text-underline-offset:4px;text-decoration-thickness:1px;overflow-wrap:anywhere}.ls td.t a::after{content:"";position:absolute;inset:0}.ls td.t a:focus-visible{outline:none}.ls tr:hover td,.ls tr:focus-within td{background:var(--ink);color:var(--paper)}.ls tr:hover td.t a,.ls tr:focus-within td.t a{text-decoration-thickness:2px}.ls .d{display:block;font-family:var(--body);font-size:.95em}.ls mark{background:0 0;color:inherit;font-weight:700;text-decoration:underline}.total{margin:10px 0 0;font-size:.87em}.pager{display:flex;justify-content:space-between;gap:12px;margin-top:18px}.post>header{margin-bottom:8px}.meta{font-size:.87em;margin:8px 0 0;display:flex;flex-wrap:wrap;gap:2px 16px}.tags{display:flex;flex-wrap:wrap;gap:6px 10px;margin:12px 0 0;font-size:.87em}.tags a{text-decoration:none;border:1px solid var(--ink);padding:0 6px}.tags a:hover{background:var(--ink);color:var(--paper)}.toc{border:1px dashed var(--ink);padding:10px 14px;margin:22px 0;font-size:.92em}.toc summary{cursor:pointer;font-weight:700;list-style:none}.toc summary::-webkit-details-marker{display:none}.toc summary::before{content:"[+] "}.toc[open] summary::before{content:"[-] "}.toc ul{margin:0;padding-left:0;list-style:none}.toc ul ul{padding-left:3ch}.toc>nav>ul{margin-top:6px}.toc li::before{content:"├─ "}.toc li:last-child::before{content:"└─ "}.toc a{text-decoration:none}.toc a:hover{text-decoration:underline}.prose{margin-top:24px;overflow-wrap:break-word}.prose p,.prose li,.prose blockquote,.prose figcaption,.prose td,.prose th,.lede p{font-family:var(--body);font-size:1.04em;line-height:1.7}.prose li p{font-size:1em}.prose h1,.prose h2,.prose h3,.prose h4{margin:1.8em 0 .6em}.prose h1::before{content:"# "}.prose h2::before{content:"## "}.prose h3::before{content:"### "}.prose h4::before{content:"#### "}.anchor{margin-left:.5ch;text-decoration:none;opacity:0}:is(h1,h2,h3,h4):hover .anchor,.anchor:focus{opacity:1}.prose ul,.prose ol{padding-left:3ch;margin:0 0 1em}.prose ul{list-style:none}.prose ul>li::before{content:"-";display:inline-block;width:2ch;margin-left:-2ch;font-family:var(--mono)}.prose li+li{margin-top:.25em}.prose blockquote{margin:0 0 1.2em;padding:0 0 0 14px;border-left:3px solid var(--ink);font-style:italic}.prose blockquote p{font-size:1em}.prose hr{border:0;margin:24px 0;overflow:hidden;white-space:nowrap;height:1em;line-height:1}.prose hr::before{content:"- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - "}.prose code{font-family:var(--mono)}.prose :not(pre)>code{border:1px solid var(--ink);padding:0 4px;font-size:.9em}.prose a{text-decoration-thickness:1px}.prose a:hover{background:var(--ink);color:var(--paper);text-decoration:none}.prose img{display:block;margin:0 auto 1.2em;border:1px solid var(--ink)}.prose table{border-collapse:collapse;margin:0 0 1.2em;display:block;overflow-x:auto}.prose th,.prose td{border:1px solid var(--ink);padding:4px 10px;text-align:left}.post{counter-reset:fig}figure{margin:0 0 1.4em;counter-increment:fig}figure img{margin-bottom:0}.prose figcaption{font-size:.9em;text-align:center;margin-top:8px}figcaption::before{content:"fig. " counter(fig)" — ";font-family:var(--mono)}details.fold{border:1px solid var(--ink);margin:0 0 1.2em}details.fold summary{cursor:pointer;padding:6px 10px;list-style:none;font-family:var(--body)}details.fold summary::-webkit-details-marker{display:none}details.fold summary::before{content:"[+] ";font-weight:700;font-family:var(--mono)}details.fold[open] summary::before{content:"[-] "}details.fold[open] summary{border-bottom:1px solid var(--ink)}details.fold>div{padding:10px}details.fold>div>:last-child{margin-bottom:0}.code{background:var(--ink);color:var(--paper);margin:0 0 1.2em;font-size:14px;line-height:1.6}.code ::selection{background:var(--paper);color:var(--ink)}.code-bar{display:flex;justify-content:space-between;padding:2px 10px;border-bottom:1px solid var(--paper);font-size:12px}.copy{font:inherit;color:inherit;background:0 0;border:0;padding:0;cursor:pointer}.copy:hover{text-decoration:underline}.copy:focus-visible{outline-color:var(--paper)}.code pre{margin:0;padding:10px 12px;overflow-x:auto;background:0 0!important}.code code{font-family:var(--mono)}.chroma .line{display:block}.chroma .ln{display:inline-block;min-width:2.5ch;margin-right:1.5ch;text-align:right;user-select:none}.chroma .hl{outline:1px dashed var(--paper)}.chroma :is(.k,.kc,.kd,.kn,.kp,.kr,.kt,.nt,.nb,.bp,.ow){font-weight:700}.chroma :is(.c,.ch,.cm,.c1,.cs,.cp,.cpf){font-style:italic}.chroma :is(.s,.sa,.sb,.sc,.dl,.sd,.s2,.se,.sh,.si,.sx,.sr,.s1,.ss){text-decoration:underline dotted;text-underline-offset:3px}.chroma :is(.m,.mb,.mf,.mh,.mi,.il,.mo){text-decoration:underline;text-underline-offset:3px}.chroma :is(.nf,.fm,.nc){text-decoration:underline;text-decoration-thickness:2px;text-underline-offset:3px}.chroma .gd{text-decoration:line-through}.chroma .gi,.chroma .gh,.chroma .gu{font-weight:700}.chroma .err{text-decoration:underline wavy}.postnav{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:4px}.postnav a{border:1px solid var(--ink);padding:8px 10px;text-decoration:none;display:block;min-width:0;overflow-wrap:anywhere}.postnav a:hover{background:var(--ink);color:var(--paper)}.postnav small{display:block;font-size:.8em}.postnav .nx{text-align:right;grid-column:2}.post-foot,.foot{display:flex;flex-wrap:wrap;justify-content:space-between;gap:6px 16px;font-size:.87em;margin-top:18px}.share{display:flex;flex-wrap:wrap;gap:4px 12px}.post-foot a,.foot a{text-decoration:none}.post-foot a:hover,.foot a:hover{background:var(--ink);color:var(--paper)}.site-foot{margin-top:48px}.site-foot .foot{margin-top:0}:is(.prose,.ls td.t,.postnav,.links,.elsewhere) a:visited{color:var(--visited);text-decoration-color:var(--visited)}:is(.prose,.postnav,.links,.elsewhere) a:visited:is(:hover,:focus-visible),.ls tr:is(:hover,:focus-within) td.t a:visited{color:var(--paper)}.search{display:flex;align-items:center;gap:8px;border:1px solid var(--ink);padding:6px 10px;margin:16px 0 18px}.search:focus-within{outline:2px dashed var(--ink);outline-offset:3px}.search input{flex:1;min-width:0;font:inherit;color:inherit;background:0 0;border:0;outline:none}.search input::placeholder{color:var(--ink);opacity:1;font-style:italic}.search input::-webkit-search-cancel-button{display:none}@media(max-width:560px){body{font-size:15px}.site{padding-top:18px}.ls td.sz,.ls td.go{display:none}.postnav{grid-template-columns:1fr}.postnav .nx{text-align:left;grid-column:auto}.code{margin-inline:calc(-1 * max(16px,env(safe-area-inset-left,0px)))}figure img{width:auto!important}}@media print{:root,:root[data-theme]{--paper:#fff;--ink:#000}.menu,.theme-toggle,.share,.copy,.site-foot,.cur,.margin,.pgbar{display:none!important}body{background-image:none}}.pgbar{position:fixed;left:0;right:0;bottom:0;z-index:5;display:flex;align-items:center;gap:1.5ch;padding:6px max(16px,env(safe-area-inset-right,0px))calc(6px + env(safe-area-inset-bottom,0px))max(16px,env(safe-area-inset-left,0px));background:var(--paper);border-top:1px solid var(--ink);font-size:13px;line-height:1.4;font-variant-numeric:tabular-nums}.pgbar .sec{flex:initial;max-width:35%;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.pgbar .cells{flex:1;min-width:0;overflow:hidden;white-space:nowrap;font-weight:700}.pgbar [data-pg=pct]{flex:none;width:4ch;text-align:right;font-weight:700}body:has(.pgbar) .site{padding-bottom:72px}@media(min-width:1440px){.pgbar{display:none}body:has(.pgbar) .site{padding-bottom:40px}}.margin{display:none}@media(min-width:1440px){body{background-image:radial-gradient(circle,var(--ink) .9px,transparent 1.3px);background-size:24px 24px;background-attachment:fixed}.site{max-width:calc(var(--site) + 66px);min-height:100vh;padding-inline:32px;background:var(--paper);border-inline:1px solid var(--ink)}.margin{display:block;position:fixed;top:28px;width:calc((100vw - var(--site) - 66px)/2 - 36px);max-width:320px;max-height:calc(100vh - 56px);overflow:auto;padding:10px 12px;background:var(--paper);border:1px solid var(--ink);font-size:12.5px;line-height:1.5;scrollbar-width:thin}.margin-l{left:18px}.margin-r{right:18px}.margin p{margin:0}.fetch-h{font-weight:700;margin-bottom:4px!important}.fetch-who{overflow-wrap:anywhere}.fetch pre{margin:0 0 8px;font:inherit;line-height:1.1;font-weight:700}.fetch dl{display:grid;grid-template-columns:auto 1fr;gap:0 1.5ch;margin:4px 0 10px}.fetch dt{font-weight:700}.fetch dd{margin:0;overflow-wrap:anywhere}.fetch .bars dt{font-weight:400}.fetch .bars a{text-decoration:none}.fetch .bars a:hover{background:var(--ink);color:var(--paper)}.swatch{display:flex;gap:6px}.swatch span{width:3ch;height:1.1em;border:1px solid var(--ink)}.sw-ink{background:var(--ink)}.toc-inline{display:none}.mtoc ul{margin:0;padding-left:0;list-style:none}.mtoc ul ul{padding-left:2ch}.mtoc li::before{content:"├─ "}.mtoc li:last-child::before{content:"└─ "}.mtoc a{text-decoration:none}.mtoc a:hover,.mtoc a.on{background:var(--ink);color:var(--paper)}.progress{font-variant-numeric:tabular-nums}.progress .file,.progress .sec{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.progress .bar{font-weight:700}.diagram pre{margin:0;font:inherit;font-size:12px;line-height:1.25;overflow:hidden}.diagram .dn.on,.diagram .dw.on{background:var(--ink);color:var(--paper)}@media(max-height:720px){.diagram{display:none}}.titleblock{top:auto;bottom:18px;padding:0;overflow:hidden;font-size:10.5px;line-height:1.35;text-transform:uppercase}.titleblock table{width:100%;border-collapse:collapse}.titleblock th,.titleblock td{border:1px solid var(--ink);padding:3px 5px;text-align:left;vertical-align:top}.titleblock tr:first-child>*{border-top:0}.titleblock tr:last-child>*{border-bottom:0}.titleblock tr>:first-child{border-left:0}.titleblock tr>:last-child{border-right:0}.elsewhere{top:auto;bottom:18px}.elsewhere ul{margin:0;padding:0;list-style:none}.elsewhere li{display:flex;white-space:nowrap}.elsewhere li::before{content:"├─ ";flex:none;white-space:pre}.elsewhere a{min-width:0;overflow:hidden;text-overflow:ellipsis}.elsewhere li:last-child::before{content:"└─ "}.elsewhere a{text-decoration:none}.elsewhere a:hover,.elsewhere a:focus-visible{background:var(--ink);color:var(--paper);outline:none}.margin-l:not(.elsewhere){max-height:calc(100vh - 28px - 18px - 150px - 16px)}.titleblock .tb-title{font-weight:700;text-transform:none;overflow-wrap:anywhere}}