@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/7b19b489dc6743ba-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/28793f5c5e3d822d-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/c9c3823090ec8b55-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/b3bf17a9041d9433-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/2801417b65625cf5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/_next/static/media/26d4368bf94c0ec4-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/7b19b489dc6743ba-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/28793f5c5e3d822d-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/c9c3823090ec8b55-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/b3bf17a9041d9433-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/2801417b65625cf5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/_next/static/media/26d4368bf94c0ec4-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/7b19b489dc6743ba-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/28793f5c5e3d822d-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/c9c3823090ec8b55-s.woff2) format("woff2");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/b3bf17a9041d9433-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/2801417b65625cf5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/_next/static/media/26d4368bf94c0ec4-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Sans Fallback;src:local("Arial");ascent-override:101.32%;descent-override:27.18%;line-gap-override:0.00%;size-adjust:101.17%}.__className_1bc20f{font-family:IBM Plex Sans,IBM Plex Sans Fallback;font-style:normal}.__variable_1bc20f{--font-sans:"IBM Plex Sans","IBM Plex Sans Fallback"}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/58f386aa6b1a2a92-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/011e180705008d6f-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/7ba5fb2a8c88521c-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/92eeb95d069020cc-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:400;font-display:swap;src:url(/_next/static/media/d3ebbfd689654d3a-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/ef4d5661765d0e49-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/d29838c109ef09b4-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/e40af3453d7c920a-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/99dcf268bda04fe5-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:500;font-display:swap;src:url(/_next/static/media/98e207f02528a563-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/73cb51aac9c97f90-s.woff2) format("woff2");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/d26bbd13d6b70f89-s.woff2) format("woff2");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/20535187d867b7b9-s.woff2) format("woff2");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/5356a6a4f2c8c8d8-s.woff2) format("woff2");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-family:IBM Plex Mono;font-style:normal;font-weight:600;font-display:swap;src:url(/_next/static/media/db96af6b531dc71f-s.p.woff2) format("woff2");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-family:IBM Plex Mono Fallback;src:local("Arial");ascent-override:76.16%;descent-override:20.43%;line-gap-override:0.00%;size-adjust:134.59%}.__className_595324{font-family:IBM Plex Mono,IBM Plex Mono Fallback;font-style:normal}.__variable_595324{--font-mono:"IBM Plex Mono","IBM Plex Mono Fallback"}:root{--paper:#fcfcfb;--panel:#ffffff;--sunk:#f3f5f5;--ink:#14181b;--soft:#47555a;--faint:#7c8a8f;--hair:#d9dedf;--hair-2:#bec7c9;--teal:#0e7490;--teal-soft:#e0f0f3;--rev:#5b6bb0;--rev-soft:#e7e9f4;--sans:var(--font-sans),"IBM Plex Sans",system-ui,-apple-system,"Segoe UI",Roboto,sans-serif;--mono:var(--font-mono),"IBM Plex Mono",ui-monospace,Menlo,Consolas,monospace;--measure:46rem}@media (prefers-color-scheme:dark){:root:not([data-theme=light]){--paper:#0e1214;--panel:#141a1c;--sunk:#11181a;--ink:#e4ebec;--soft:#9daaad;--faint:#6c7b7e;--hair:#232d2f;--hair-2:#35413f;--teal:#3fa9c0;--teal-soft:#10242a;--rev:#8b9bd6;--rev-soft:#1a2036}}:root[data-theme=dark]{--paper:#0e1214;--panel:#141a1c;--sunk:#11181a;--ink:#e4ebec;--soft:#9daaad;--faint:#6c7b7e;--hair:#232d2f;--hair-2:#35413f;--teal:#3fa9c0;--teal-soft:#10242a;--rev:#8b9bd6;--rev-soft:#1a2036}*{box-sizing:border-box}html{scroll-behavior:smooth}@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}*{transition:none!important;animation:none!important}}body{margin:0;background:var(--paper);color:var(--ink);font-family:var(--sans);font-size:1.02rem;line-height:1.62;-webkit-font-smoothing:antialiased}a{color:var(--teal);text-decoration:none;border-bottom:1px solid var(--hair-2)}a:hover{border-bottom-color:var(--teal)}:focus-visible{outline:2px solid var(--teal);outline-offset:2px}h1,h2,h3,h4{margin:0;font-weight:600;letter-spacing:-.01em;line-height:1.18}img{max-width:100%;height:auto}code{font-family:var(--mono);font-size:.85em;background:var(--sunk);padding:.05em .32em;border-radius:3px}pre{overflow-x:auto}.wrap{max-width:64rem;margin:0 auto;padding:0 clamp(1rem,4vw,2rem)}.site-footer,.site-header{font-family:var(--mono);font-size:.76rem;color:var(--faint)}.site-header{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:.6rem;padding:1rem 0;border-bottom:1px solid var(--hair-2)}.site-header .brand{font-weight:600;letter-spacing:.04em;font-size:1.14rem;color:var(--ink);border:0}.site-header .brand:before{content:"∇ ";color:var(--teal)}.site-header nav{display:flex;gap:1rem;flex-wrap:wrap}.site-header nav a{color:var(--faint);border:0}.site-header nav a:hover{color:var(--teal)}.site-footer{margin-top:4rem;padding:1.4rem 0 2.4rem;border-top:1px solid var(--hair-2);display:flex;justify-content:space-between;flex-wrap:wrap;gap:.6rem}main{padding:2.4rem 0}.lede{max-width:var(--measure);color:var(--soft);font-size:1.12rem}.post-list{list-style:none;margin:2rem 0 0;padding:0;display:grid;grid-gap:1.6rem;gap:1.6rem}.post-card{padding:1.3rem 0;border-top:1px solid var(--hair)}.post-card:first-child{border-top:0}.post-card h2,.post-card h3{font-size:1.24rem;margin:0 0 .35rem}.post-card h2 a,.post-card h3 a{color:var(--ink);border:0}.post-card h2 a:hover,.post-card h3 a:hover{color:var(--teal)}.post-card p{margin:.35rem 0 0;color:var(--soft);max-width:var(--measure)}.meta{font-family:var(--mono);font-size:.74rem;color:var(--faint);gap:.8rem}.meta,.tag-row{display:flex;flex-wrap:wrap}.tag-row{gap:.4rem;margin-top:.6rem}.tag{font-family:var(--mono);font-size:.7rem;color:var(--soft);background:var(--sunk);border:1px solid var(--hair);border-radius:999px;padding:.1rem .55rem}.article-header,.prose{max-width:var(--measure)}.article-header{margin-bottom:2rem}.article-header h1{font-size:clamp(1.7rem,4vw,2.35rem);margin:.6rem 0 .8rem}.article-cover{max-width:var(--measure);margin:1.5rem 0;border:1px solid var(--hair-2);border-radius:4px}.prose h2{font-size:1.5rem;margin:2.4rem 0 .8rem;padding-top:.4rem}.prose h3{font-size:1.2rem;margin:1.8rem 0 .6rem}.prose ol,.prose p,.prose ul{margin:0 0 1.1rem}.prose ol,.prose ul{padding-left:1.4rem}.prose li{margin:.3rem 0}.prose a{border-bottom-color:var(--teal)}.prose blockquote{margin:1.4rem 0;padding:.4rem 0 .4rem 1.1rem;border-left:3px solid var(--hair-2);color:var(--soft)}.prose pre{background:var(--sunk);border:1px solid var(--hair);border-radius:4px;padding:1rem 1.1rem;margin:1.4rem 0;font-size:.85rem;line-height:1.55}.prose pre code{background:none;padding:0;font-size:inherit}.prose img{border:1px solid var(--hair);border-radius:4px}.prose h2>a.anchor,.prose h3>a.anchor{border:0;color:inherit}.prose table{border-collapse:collapse;width:100%;margin:1.4rem 0;font-size:.9rem;display:block;overflow-x:auto}.prose td,.prose th{border:1px solid var(--hair);padding:.45rem .7rem;text-align:left}.prose th{background:var(--sunk)}.callout{margin:1.5rem 0;padding:.9rem 1.1rem;border:1px solid var(--hair-2);border-left:3px solid var(--teal);border-radius:4px;background:var(--teal-soft);color:var(--ink);font-size:.95rem}.callout>:first-child{margin-top:0}.callout>:last-child{margin-bottom:0}.callout[data-kind=warn]{border-left-color:var(--rev);background:var(--rev-soft)}figure.figure{margin:1.8rem 0;max-width:var(--measure)}figure.figure figcaption{font-family:var(--mono);font-size:.72rem;color:var(--faint);margin-top:.5rem}.controls{display:flex;gap:.9rem;align-items:center;flex-wrap:wrap;color:var(--soft);margin-top:.7rem}.controls,.controls button{font-family:var(--mono);font-size:.75rem}.controls button{color:var(--ink);background:var(--panel);border:1px solid var(--hair-2);border-radius:3px;padding:.25rem .7rem;cursor:pointer}.controls button:hover{border-color:var(--teal)}.controls input[type=range]{accent-color:var(--teal)}.asciinema{margin:1.6rem 0;max-width:var(--measure);border:1px solid var(--hair-2);border-radius:4px;overflow:hidden}.hljs-comment,.hljs-quote{color:var(--faint);font-style:italic}.hljs-keyword,.hljs-literal,.hljs-name,.hljs-selector-tag{color:var(--teal)}.hljs-addition,.hljs-attr,.hljs-string,.hljs-template-tag{color:#8a6d1e}@media (prefers-color-scheme:dark){:root:not([data-theme=light]) .hljs-addition,:root:not([data-theme=light]) .hljs-attr,:root:not([data-theme=light]) .hljs-string,:root:not([data-theme=light]) .hljs-template-tag{color:#d9b26a}}:root[data-theme=dark] .hljs-addition,:root[data-theme=dark] .hljs-attr,:root[data-theme=dark] .hljs-string,:root[data-theme=dark] .hljs-template-tag{color:#d9b26a}.hljs-built_in,.hljs-builtin-name,.hljs-number,.hljs-type{color:var(--rev)}.hljs-section,.hljs-title{color:var(--ink);font-weight:600}.hljs-deletion{color:#b3261e}