:root{color-scheme:light dark;--bg:light-dark(#fcfbf8, #15171b);--bg-soft:light-dark(#f4f2ed, #1c1f24);--bg-hover:light-dark(#ece9e2, #252930);--fg:light-dark(#24272c, #d9dce1);--fg-strong:light-dark(#111316, #f2f3f5);--fg-muted:light-dark(#5d636c, #9ba2ad);--fg-subtle:light-dark(#878d96, #737a85);--border:light-dark(#e3e0d8, #2b2f37);--border-strong:light-dark(#cfcbc1, #3a3f49);--accent:light-dark(#2357c6, #7fabff);--accent-hover:light-dark(#163f99, #a8c6ff);--accent-soft:light-dark(#e6edfb, #1e2a44);--selection:light-dark(#cddcfb, #2f4572);--mark:light-dark(#fff1a8, #5c4d12);--shadow:light-dark(0 1px 2px rgb(0 0 0 / 0.06), 0 1px 2px rgb(0 0 0 / 0.4));--font-sans:system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif;--font-serif:Charter, "Bitstream Charter", "Sitka Text", Cambria, "Noto Serif", Georgia, serif;--font-mono:ui-monospace, "SF Mono", "Cascadia Code", "JetBrains Mono", Menlo, Consolas, "Liberation Mono", monospace;--font-body:var(--font-serif);--measure:44rem;--gutter:1.25rem;--radius:8px}:root[data-theme=light]{color-scheme:light}:root[data-theme=dark]{color-scheme:dark}body.font-sans{--font-body:var(--font-sans)}body.font-webfont{--font-sans:var(--font-webfont);--font-body:var(--font-webfont)}body.font-sans,body.font-webfont{--body-leading:1.65}body.font-sans{--body-scale:0.96}body.font-inter{--body-scale:0.95}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;text-size-adjust:100%;scroll-padding-top:1.5rem}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}body{margin:0;background:var(--bg);color:var(--fg);font-family:var(--font-body);font-size:calc(1.0625rem * var(--body-scale,1));line-height:var(--body-leading,1.7);font-kerning:normal;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;min-height:100vh;display:flex;flex-direction:column}@media(min-width:48rem){body{font-size:calc(1.125rem * var(--body-scale,1))}}::selection{background:var(--selection)}a{color:var(--accent);text-decoration-line:underline;text-decoration-thickness:1px;text-underline-offset:.18em;text-decoration-color:color-mix(in srgb,currentColor 40%,transparent);transition:color .15s,text-decoration-color .15s}a:hover{color:var(--accent-hover);text-decoration-color:initial}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:3px}img,svg,video{max-width:100%;height:auto}.icon{width:1em;height:1em;vertical-align:-.125em;flex-shrink:0}.skip-link{position:absolute;left:-999px;top:.5rem;padding:.5rem 1rem;background:var(--accent);color:#fff;z-index:100;border-radius:var(--radius)}.skip-link:focus{left:.5rem}.badge{display:inline-block;margin-left:.5em;padding:.05em .5em;font-family:var(--font-sans);font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;vertical-align:.2em;color:light-dark(#8a4b00,#ffc46b);background:light-dark(#fff1d6,#3a2a0e);border-radius:999px}.container{width:100%;max-width:calc(var(--measure) + 2 * var(--gutter));margin-inline:auto;padding-inline:var(--gutter)}.site-header{border-bottom:1px solid var(--border);font-family:var(--font-sans)}.header-inner{display:flex;align-items:center;gap:1rem;min-height:4rem}.site-title{font-weight:700;font-size:1.05rem;color:var(--fg-strong);text-decoration:none;letter-spacing:-.01em;margin-right:auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.site-title:hover{color:var(--accent)}.site-nav ul{display:flex;gap:.25rem;list-style:none;margin:0;padding:0}.site-nav a{display:block;padding:.35rem .6rem;font-size:.95rem;color:var(--fg-muted);text-decoration:none;border-radius:6px}.site-nav a:hover{color:var(--fg-strong);background:var(--bg-hover)}.site-nav a[aria-current=page]{color:var(--fg-strong);font-weight:600}.theme-toggle{display:inline-grid;place-items:center;width:2.25rem;height:2.25rem;padding:0;border:1px solid var(--border);border-radius:999px;background:0 0;color:var(--fg-muted);font-size:1.05rem;cursor:pointer}.theme-toggle:hover{color:var(--fg-strong);background:var(--bg-hover)}.theme-toggle .icon-sun{display:none}:root[data-theme=dark] .theme-toggle .icon-sun{display:block}:root[data-theme=dark] .theme-toggle .icon-moon{display:none}.site-main{flex:1;padding-block:2.5rem 4rem}.site-footer{border-top:1px solid var(--border);font-family:var(--font-sans);font-size:.875rem;color:var(--fg-subtle)}.footer-inner{display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem 1.5rem;padding-block:1.5rem}.footer-inner p{margin:0}.footer-links{display:flex;gap:1.25rem;align-items:center}.site-footer a{color:var(--fg-muted);text-decoration:none}.site-footer a:hover{color:var(--accent)}.intro{font-size:1.15em;color:var(--fg-muted);margin-bottom:3rem;display:flex;align-items:center;gap:1.25rem}.intro-avatar{flex:none;order:1;margin-right:1.5rem;color:var(--fg-strong)}.intro-avatar svg{display:block;height:7.5rem;width:auto}.intro p{margin:0}.intro strong{color:var(--fg-strong)}.list-heading,.year-heading{font-family:var(--font-sans);font-size:.8rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--fg-subtle);margin:0 0 1rem}.post-list{list-style:none;margin:0;padding:0}.post-item{display:grid;gap:.15rem 1.5rem;padding-block:1.1rem;border-top:1px solid var(--border)}.post-item:first-child{border-top:0;padding-top:0}.post-item time{font-family:var(--font-sans);font-size:.85rem;color:var(--fg-subtle);font-variant-numeric:tabular-nums;padding-top:.2rem}@media(min-width:40rem){.post-item{grid-template-columns:7.5rem 1fr}}.post-item-title{font-family:var(--font-sans);font-size:1.15rem;line-height:1.35;letter-spacing:-.01em;margin:0 0 .3rem}.post-item-title a{color:var(--fg-strong);text-decoration:none}.post-item-title a:hover{color:var(--accent)}.post-item-summary{margin:0;color:var(--fg-muted);font-size:.95em}.page-header{margin-bottom:2.5rem}.page-header h1{font-family:var(--font-sans);font-size:clamp(1.8rem,1.4rem + 1.5vw,2.3rem);line-height:1.2;letter-spacing:-.02em;color:var(--fg-strong);margin:0}.page-kicker,.page-sub{font-family:var(--font-sans);font-size:.9rem;color:var(--fg-subtle);margin:.25rem 0}.page-kicker a{color:inherit}.page-lead{margin-top:1rem;color:var(--fg-muted)}.year-group{margin-bottom:2.5rem}.archive-list{list-style:none;margin:0;padding:0}.archive-list li{display:flex;gap:1.25rem;align-items:baseline;padding-block:.45rem}.archive-list time{flex:none;width:3.75rem;font-family:var(--font-sans);font-size:.85rem;color:var(--fg-subtle);font-variant-numeric:tabular-nums}.archive-list a{color:var(--fg-strong);text-decoration:none}.archive-list a:hover{color:var(--accent);text-decoration:underline}.term-cloud{display:flex;flex-wrap:wrap;gap:.6rem;list-style:none;margin:0;padding:0;font-family:var(--font-sans)}.term-cloud a{display:inline-flex;gap:.5rem;align-items:center;padding:.35rem .85rem;border:1px solid var(--border);border-radius:999px;color:var(--fg);text-decoration:none;font-size:.95rem}.term-cloud a:hover{border-color:var(--accent);color:var(--accent)}.term-cloud .count{font-size:.8rem;color:var(--fg-subtle)}.pagination{display:flex;justify-content:space-between;align-items:center;margin-top:2.5rem;font-family:var(--font-sans);font-size:.95rem}.pagination a{display:inline-flex;gap:.4rem;align-items:center;text-decoration:none}.page-count{color:var(--fg-subtle);font-size:.875rem}.not-found{text-align:center;padding-block:3rem}.not-found .big{font-family:var(--font-sans);font-size:5rem;font-weight:800;line-height:1;color:var(--border-strong);margin:0}.post{max-width:calc(var(--measure) + 2 * var(--gutter));margin-inline:auto;padding-inline:var(--gutter)}.post-header{margin-bottom:2rem}.post-title{font-family:var(--font-sans);font-size:clamp(1.9rem,1.4rem + 2vw,2.6rem);line-height:1.15;letter-spacing:-.025em;color:var(--fg-strong);margin:0 0 .75rem;text-wrap:balance}.post-meta{display:flex;flex-wrap:wrap;gap:.25rem .5rem;align-items:center;margin:0;font-family:var(--font-sans);font-size:.9rem;color:var(--fg-subtle)}.post-meta a{color:var(--fg-muted);text-decoration:none}.post-meta a:hover{color:var(--accent)}.post-footer{margin-top:3.5rem;padding-top:1.75rem;border-top:1px solid var(--border);font-family:var(--font-sans)}.tag-list{display:flex;flex-wrap:wrap;gap:.5rem;list-style:none;margin:0 0 1rem;padding:0}.tag-list a{display:inline-block;padding:.2rem .65rem;font-size:.85rem;background:var(--bg-soft);border-radius:999px;color:var(--fg-muted);text-decoration:none}.tag-list a:hover{color:var(--accent);background:var(--accent-soft)}.updated{font-size:.875rem;color:var(--fg-subtle);margin:0 0 1.5rem}.post-nav{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.post-nav a{display:flex;flex-direction:column;gap:.25rem;padding:.9rem 1rem;border:1px solid var(--border);border-radius:var(--radius);text-decoration:none;color:var(--fg-strong);line-height:1.35}.post-nav a:hover{border-color:var(--accent)}.post-nav .label{display:inline-flex;gap:.35rem;align-items:center;font-size:.8rem;color:var(--fg-subtle)}.post-nav .next{grid-column:2;text-align:right;align-items:flex-end}@media(max-width:32rem){.post-nav{grid-template-columns:1fr}.post-nav .next{grid-column:1}}.toc{margin:0 0 2rem;padding:.75rem 1rem;border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-sans);font-size:.9rem}.toc summary{cursor:pointer;font-weight:600;color:var(--fg-muted);font-size:.8rem;letter-spacing:.06em;text-transform:uppercase}.toc ul{list-style:none;margin:0;padding-left:0}.toc ul ul{padding-left:.9rem}.toc>nav>ul{margin-top:.6rem}.toc li{margin:.3rem 0;line-height:1.4}.toc a{color:var(--fg-muted);text-decoration:none}.toc a:hover,.toc a.active{color:var(--accent)}@media(min-width:84rem){.post.has-toc{max-width:none;display:grid;grid-template-columns:1fr min(var(--measure),100%)1fr;column-gap:0}.post.has-toc>*{grid-column:2}.post.has-toc>.toc{grid-column:3;grid-row:1/span 3;align-self:start;position:sticky;top:2rem;margin:0 0 0 5rem;max-width:16rem;max-height:calc(100vh - 4rem);overflow-y:auto;border:0;padding:0}.post.has-toc>.toc summary{pointer-events:none;list-style:none}.post.has-toc>.toc summary::-webkit-details-marker{display:none}.post.has-toc>.toc a.active{font-weight:600}}@media(max-width:30rem){.header-inner{gap:.5rem}.site-nav ul{gap:0}.site-nav a{padding:.35rem .4rem;font-size:.875rem}.site-title{font-size:.95rem}}.prose{overflow-wrap:break-word;hyphens:manual}.prose>:first-child{margin-top:0}.prose p,.prose ul,.prose ol,.prose dl,.prose blockquote,.prose .table-wrap,.prose figure,.prose details,.prose .math-block{margin:0 0 1.4em}.prose h2,.prose h3,.prose h4,.prose h5,.prose h6{position:relative;font-family:var(--font-sans);color:var(--fg-strong);line-height:1.3;letter-spacing:-.015em;margin:2.2em 0 .7em;text-wrap:balance}.prose h2{font-size:1.55em;letter-spacing:-.02em}.prose h3{font-size:1.25em}.prose h4{font-size:1.07em}.prose h5{font-size:1em}.prose h6{font-size:.9em;color:var(--fg-muted);text-transform:uppercase;letter-spacing:.05em}.prose h2+h3{margin-top:1.2em}.heading-anchor{margin-left:.4em;color:var(--fg-subtle);font-weight:400;text-decoration:none;opacity:0;transition:opacity .15s}.prose :is(h2,h3,h4,h5,h6):hover .heading-anchor,.heading-anchor:focus-visible{opacity:1}@media(hover:none){.heading-anchor{opacity:.5}}.prose strong{color:var(--fg-strong);font-weight:700}.prose mark{background:var(--mark);color:inherit;padding:.05em .2em;border-radius:3px}.prose ins{text-decoration-color:var(--accent)}.prose del{color:var(--fg-muted)}.prose sup,.prose sub{line-height:0}.prose abbr[title]{text-decoration:underline dotted;cursor:help}.prose small{font-size:.85em}.prose kbd{display:inline-block;padding:.1em .45em;font-family:var(--font-mono);font-size:.78em;line-height:1.4;color:var(--fg-strong);background:var(--bg-soft);border:1px solid var(--border-strong);border-bottom-width:2px;border-radius:5px}.prose ul,.prose ol{padding-left:1.5em}.prose li{margin:.35em 0;padding-left:.2em}.prose li>ul,.prose li>ol{margin:.35em 0}.prose li::marker{color:var(--fg-subtle)}.prose ol>li::marker{font-family:var(--font-sans);font-size:.9em}.prose li>p{margin-bottom:.6em}.prose li:has(>input[type=checkbox]){list-style:none;margin-left:-1.4em}.prose li>input[type=checkbox]{width:1em;height:1em;margin:0 .5em 0 0;vertical-align:-.1em;accent-color:var(--accent)}.prose dt{font-weight:700;color:var(--fg-strong);margin-top:.8em}.prose dd{margin:.2em 0 0 1.5em;color:var(--fg)}.prose blockquote{padding:.1em 0 .1em 1.2em;border-left:3px solid var(--border-strong);color:var(--fg-muted);font-style:italic}.prose blockquote>:last-child{margin-bottom:0}.prose blockquote blockquote{margin-top:.8em}.prose blockquote cite,.prose blockquote footer{font-style:normal;font-size:.9em}.prose hr{border:0;height:1px;margin:3em auto;width:40%;background:var(--border-strong)}.table-wrap{overflow-x:auto;border:1px solid var(--border);border-radius:var(--radius)}.prose table{width:100%;border-collapse:collapse;font-family:var(--font-sans);font-size:.9em;line-height:1.5;font-variant-numeric:tabular-nums}.prose th,.prose td{padding:.6em .9em;text-align:left;border-bottom:1px solid var(--border);vertical-align:top}.prose th{font-weight:600;color:var(--fg-strong);background:var(--bg-soft);white-space:nowrap}.prose td code{white-space:nowrap}.prose tbody tr:last-child td{border-bottom:0}.prose tbody tr:hover{background:color-mix(in srgb,var(--bg-soft) 60%,transparent)}.prose .align-center{text-align:center}.prose .align-right{text-align:right}.prose .footnote-ref,.prose sup a{text-decoration:none;font-family:var(--font-sans);font-size:.85em;padding:0 .1em}.prose .footnotes{margin-top:3em;padding-top:1em;border-top:1px solid var(--border);font-size:.9em;color:var(--fg-muted)}.prose .footnotes hr{display:none}.prose .footnote-backref{text-decoration:none;margin-left:.25em}.prose :target{scroll-margin-top:2rem}.prose li:target{background:var(--accent-soft);border-radius:4px}.prose details:not(.alert):not(.toc){padding:.6em 1em;border:1px solid var(--border);border-radius:var(--radius)}.prose details:not(.alert):not(.toc)>summary{cursor:pointer;font-family:var(--font-sans);font-weight:600;color:var(--fg-strong)}.prose details[open]:not(.alert):not(.toc)>summary{margin-bottom:.6em}.prose details>:last-child{margin-bottom:0}.prose .math-block{overflow-x:auto;overflow-y:hidden;padding:.25em 0}.prose .katex{font-size:1.08em}.prose pre.mermaid{display:flex;justify-content:center;margin:0 0 1.4em;padding:1rem;background:0 0;border:1px solid var(--border);border-radius:var(--radius);font-family:var(--font-sans);overflow-x:auto;color:transparent}.prose pre.mermaid[data-processed]{color:inherit}.prose :not(pre)>code{font-family:var(--font-mono);font-size:.86em;padding:.12em .38em;background:var(--bg-soft);border:1px solid var(--border);border-radius:5px;color:var(--fg-strong);overflow-wrap:break-word}.prose a>code{color:inherit}.prose h2 code,.prose h3 code{font-size:.9em}:root{--code-bg:light-dark(#f6f5f1, #1b1e23);--code-fg:light-dark(#24292f, #d4d8de);--code-border:light-dark(#e6e3db, #2a2e35);--code-header:light-dark(#efede7, #20242a);--code-hl:light-dark(#fdf3c4, #33301c);--code-ln:light-dark(#a3a8b0, #5c636e);--syn-comment:light-dark(#6e7781, #7f8894);--syn-keyword:light-dark(#cf222e, #ff7b72);--syn-string:light-dark(#0a3069, #a5d6ff);--syn-number:light-dark(#0550ae, #79c0ff);--syn-function:light-dark(#8250df, #d2a8ff);--syn-type:light-dark(#953800, #ffa657);--syn-tag:light-dark(#116329, #7ee787);--syn-attr:light-dark(#0550ae, #79c0ff);--syn-builtin:light-dark(#0550ae, #79c0ff);--syn-variable:light-dark(#953800, #ffa657);--syn-operator:light-dark(#cf222e, #ff7b72);--syn-punct:light-dark(#24292f, #c9d1d9);--syn-meta:light-dark(#6639ba, #bc8cff);--syn-regex:light-dark(#116329, #7ee787);--syn-inserted-fg:light-dark(#116329, #aff5b4);--syn-inserted-bg:light-dark(#dafbe1, #12361e);--syn-deleted-fg:light-dark(#82071e, #ffdcd7);--syn-deleted-bg:light-dark(#ffebe9, #4b1717);--syn-heading:light-dark(#0550ae, #79c0ff);--syn-prompt:light-dark(#6e7781, #7f8894)}.code-block{margin:0 0 1.5em;border:1px solid var(--code-border);border-radius:var(--radius);background:var(--code-bg);overflow:hidden}.code-header{display:flex;align-items:center;gap:.75rem;min-height:2.25rem;padding:0 .4rem 0 1rem;background:var(--code-header);border-bottom:1px solid var(--code-border);font-family:var(--font-sans);font-size:.78rem;color:var(--fg-muted)}.code-title{font-family:var(--font-mono);font-size:.8rem;color:var(--fg-strong);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.code-lang{text-transform:lowercase;letter-spacing:.03em;color:var(--fg-subtle)}.copy-btn{display:inline-flex;align-items:center;gap:.35rem;margin-left:auto;padding:.25rem .55rem;border:0;border-radius:5px;background:0 0;color:var(--fg-muted);font:inherit;cursor:pointer}.copy-btn:hover{background:var(--bg-hover);color:var(--fg-strong)}.copy-btn .icon-check{display:none}.copy-btn.copied{color:var(--syn-tag)}.copy-btn.copied .icon-copy{display:none}.copy-btn.copied .icon-check{display:inline}.code-block .highlight{margin:0}.code-block pre,.prose pre:not(.mermaid){margin:0;padding:.9rem 0;overflow-x:auto;background:var(--code-bg);color:var(--code-fg);font-family:var(--font-mono);font-size:.84rem;line-height:1.65;tab-size:4;-webkit-text-size-adjust:none}.prose>pre:not(.mermaid){margin-bottom:1.5em;padding:.9rem 1rem;border:1px solid var(--code-border);border-radius:var(--radius)}.code-block pre code{display:block;width:max-content;min-width:100%;font-family:inherit;font-size:inherit;background:0 0;border:0;padding:0}.chroma .line{display:flex;padding:0 1.1rem}.chroma .cl{flex:1}.chroma .hl{background:var(--code-hl);box-shadow:inset 3px 0 light-dark(#d4a72c,#bb8009)}.chroma .ln,.chroma .lnt{flex:none;min-width:2.2em;margin-right:1.1em;padding-right:.2em;text-align:right;color:var(--code-ln);user-select:none;-webkit-user-select:none}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .err{color:var(--syn-deleted-fg)}.chroma .c,.chroma .ch,.chroma .cm,.chroma .c1,.chroma .cs{color:var(--syn-comment);font-style:italic}.chroma .cp,.chroma .cpf{color:var(--syn-meta)}.chroma .k,.chroma .kd,.chroma .kn,.chroma .kp,.chroma .kr,.chroma .kv{color:var(--syn-keyword)}.chroma .kc{color:var(--syn-number)}.chroma .kt{color:var(--syn-type)}.chroma .n,.chroma .py{color:var(--code-fg)}.chroma .na{color:var(--syn-attr)}.chroma .nb,.chroma .bp{color:var(--syn-builtin)}.chroma .nc,.chroma .nn,.chroma .ne{color:var(--syn-type)}.chroma .no{color:var(--syn-number)}.chroma .nd{color:var(--syn-meta)}.chroma .ni{color:var(--syn-punct)}.chroma .nf,.chroma .fm{color:var(--syn-function)}.chroma .nl{color:var(--syn-tag)}.chroma .nt{color:var(--syn-tag)}.chroma .nv,.chroma .vc,.chroma .vg,.chroma .vi,.chroma .vm{color:var(--syn-variable)}.chroma .s,.chroma .sa,.chroma .sb,.chroma .sc,.chroma .dl,.chroma .s2,.chroma .sh,.chroma .s1,.chroma .sx,.chroma .ld{color:var(--syn-string)}.chroma .sd{color:var(--syn-comment)}.chroma .se,.chroma .si{color:var(--syn-meta)}.chroma .sr{color:var(--syn-regex)}.chroma .ss{color:var(--syn-number)}.chroma .m,.chroma .mb,.chroma .mf,.chroma .mh,.chroma .mi,.chroma .il,.chroma .mo{color:var(--syn-number)}.chroma .o{color:var(--syn-operator)}.chroma .ow{color:var(--syn-keyword)}.chroma .p{color:var(--syn-punct)}.chroma .gd{color:var(--syn-deleted-fg);background:var(--syn-deleted-bg)}.chroma .gi{color:var(--syn-inserted-fg);background:var(--syn-inserted-bg)}.chroma .ge{font-style:italic}.chroma .gs{font-weight:700}.chroma .gh,.chroma .gu{color:var(--syn-heading);font-weight:600}.chroma .gp{color:var(--syn-prompt);user-select:none;-webkit-user-select:none}.chroma .go{color:var(--fg-muted)}.chroma .gt{color:var(--syn-deleted-fg)}.chroma .gl{text-decoration:underline}.chroma .line:has(.gi){background:var(--syn-inserted-bg)}.chroma .line:has(.gd){background:var(--syn-deleted-bg)}.chroma .line:has(.gi) .gi,.chroma .line:has(.gd) .gd{background:0 0}.prose img{border-radius:6px}.prose .inline-img{display:inline;height:1.4em;width:auto;vertical-align:-.3em;border-radius:3px}.figure{margin-inline:0;text-align:center}.figure img{display:block;margin-inline:auto;background:var(--bg-soft)}.figure figcaption{margin-top:.7em;font-family:var(--font-sans);font-size:.85rem;line-height:1.5;color:var(--fg-muted);text-wrap:balance}.figure figcaption p{margin:0}.figure .zoom{display:block;cursor:zoom-in}.figure.invert-dark img{background:0 0}.figure.small img{max-width:min(100%,22rem)}.figure.medium img{max-width:min(100%,32rem)}.figure.bordered img{border:1px solid var(--border);box-shadow:var(--shadow)}.figure.cover{margin-bottom:2.2em}@media(min-width:56rem){.figure.wide{width:54rem;max-width:calc(100vw - 2 * var(--gutter));margin-left:50%;transform:translateX(-50%)}}@media(min-width:84rem){.post.has-toc .figure.wide{width:calc(var(--measure) + 8rem)}}:root[data-theme=dark] .prose .figure:not(.invert-dark):not(.no-dim):not(.diagram) img{filter:brightness(.92)}:root[data-theme=dark] .prose .invert-dark img{filter:invert(.9)hue-rotate(180deg)}.figure.diagram img{background:0 0;border-radius:0;max-width:100%;height:auto}.figure.diagram .diagram-dark{display:none}:root[data-theme=dark] .figure.diagram .diagram-light{display:none}:root[data-theme=dark] .figure.diagram .diagram-dark{display:block}@media(prefers-color-scheme:dark){:root:not([data-theme=light]) .figure.diagram .diagram-light{display:none}:root:not([data-theme=light]) .figure.diagram .diagram-dark{display:block}}.gallery{display:grid;gap:.75rem;margin:0 0 1.5em;grid-template-columns:repeat(2,1fr)}.gallery.cols-3{grid-template-columns:repeat(3,1fr)}.gallery.cols-4{grid-template-columns:repeat(4,1fr)}@media(max-width:36rem){.gallery.cols-3,.gallery.cols-4{grid-template-columns:repeat(2,1fr)}}.gallery .figure{margin:0}.gallery .figure img{aspect-ratio:1;object-fit:cover;width:100%}.lightbox{padding:0;border:0;background:0 0;max-width:100vw;max-height:100vh;width:100vw;height:100vh;cursor:zoom-out}.lightbox[open]{display:grid;place-items:center}.lightbox::backdrop{background:rgb(0 0 0/.85)}.lightbox img{max-width:calc(100vw - 2rem);max-height:calc(100vh - 2rem);width:auto;height:auto;border-radius:4px;filter:none!important}.alert{--alert:var(--accent);margin:0 0 1.4em;padding:.85em 1.1em;border:1px solid color-mix(in srgb,var(--alert) 30%,transparent);border-left:4px solid var(--alert);border-radius:var(--radius);background:color-mix(in srgb,var(--alert) 7%,var(--bg))}.alert-note{--alert:light-dark(#0969da, #4493f8)}.alert-tip{--alert:light-dark(#1a7f37, #3fb950)}.alert-important{--alert:light-dark(#8250df, #ab7df8)}.alert-warning{--alert:light-dark(#9a6700, #d29922)}.alert-caution{--alert:light-dark(#cf222e, #f85149)}.alert-title{display:flex;align-items:center;gap:.5em;margin:0 0 .35em;font-family:var(--font-sans);font-size:.9em;font-weight:600;color:var(--alert)}.alert-body>:last-child{margin-bottom:0}.alert-body>:first-child{margin-top:0}details.alert>summary{cursor:pointer;margin:0;list-style:none}details.alert>summary::-webkit-details-marker{display:none}details.alert>summary::after{content:"";margin-left:auto;width:.5em;height:.5em;border-right:2px solid;border-bottom:2px solid;transform:rotate(-45deg);transition:transform .15s}details.alert[open]>summary::after{transform:rotate(45deg)}details.alert[open]>summary{margin-bottom:.5em}.button{display:inline-flex;align-items:center;gap:.45rem;padding:.5rem .95rem;border:1px solid var(--border-strong);border-radius:999px;background:var(--bg);color:var(--fg-strong);font-family:var(--font-sans);font-size:.9rem;font-weight:500;line-height:1.2;text-decoration:none;white-space:nowrap}.button:hover{border-color:var(--accent);color:var(--accent)}.resume{max-width:calc(var(--measure) + 2 * var(--gutter));margin-inline:auto;padding-inline:var(--gutter)}.resume-header{display:grid;grid-template-columns:1fr auto;align-items:start;gap:1.25rem 2rem;margin-bottom:.5rem}.resume-id h1{font-family:var(--font-sans);font-size:clamp(1.9rem,1.5rem + 1.5vw,2.4rem);line-height:1.1;letter-spacing:-.025em;color:var(--fg-strong);margin:0 0 .35rem}.resume-headline{margin:0 0 .9rem;font-family:var(--font-sans);font-size:1.1rem;color:var(--fg-muted)}.resume-contact{display:flex;flex-wrap:wrap;gap:.2rem 0;margin:0;padding:0;list-style:none;font-family:var(--font-sans);font-size:.875rem;color:var(--fg-muted)}.resume-contact li:not(:last-child)::after{content:"·";margin:0 .6rem;color:var(--fg-subtle)}.resume-contact a{color:inherit;text-decoration:none}.resume-contact a:hover{color:var(--accent)}@media(max-width:40rem){.resume-header{grid-template-columns:1fr}.resume-download{justify-self:start}}.resume-body{margin-top:2.25rem}.resume-body h2{margin:2.2rem 0 1rem;padding-bottom:.4rem;border-bottom:1px solid var(--border);font-size:.8rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:var(--accent)}.resume-body h3{margin:1.5rem 0 .25rem;font-size:1.05em;letter-spacing:-.01em}.resume-body h2+h3{margin-top:0}.resume-body .heading-anchor{display:none}.resume-body h3+p:has(>em:only-child){margin:0 0 .5rem;font-family:var(--font-sans);font-size:.875rem;color:var(--fg-subtle)}.resume-body h3+p:has(>em:only-child) em{font-style:normal}.resume-body ul{margin-bottom:.8em}.resume-body li{margin:.25em 0}.prose .has-when{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:0 1rem}.prose .has-when .when{font-family:var(--font-sans);font-size:.82em;font-weight:400;letter-spacing:0;color:var(--fg-subtle);font-variant-numeric:tabular-nums;white-space:nowrap}@media print{:root{color-scheme:light!important}html{font-size:100%}body{font-size:10.5pt;line-height:1.5;background:#fff;color:#1a1a1a;display:block;min-height:0}.site-header,.site-footer,.skip-link,.theme-toggle,.toc,.heading-anchor,.copy-btn,.post-nav,.pagination,.resume-download,.no-print{display:none!important}.site-main{padding:0}.container,.post,.resume{max-width:none;padding:0}a{color:inherit;text-decoration:none}.prose a{text-decoration:underline;text-decoration-color:#bbb}.code-block pre{white-space:pre-wrap;overflow-wrap:anywhere}.code-block pre code{width:auto}.prose img,.figure img{filter:none!important}.figure.wide{width:auto;margin-left:0;transform:none}h1,h2,h3,h4{break-after:avoid}p,li,figure,.code-block,.alert,tr,blockquote{break-inside:avoid}.resume-header{display:block;margin-bottom:0}.resume-body{margin-top:12pt}.resume-id h1{font-size:22pt;margin-bottom:2pt}.resume-headline{font-size:12pt;margin-bottom:6pt}.resume-contact{font-size:9pt}.resume-body{font-size:10pt}.resume-body h2{font-size:8.5pt;margin:14pt 0 7pt;padding-bottom:3pt}.resume-body h3{font-size:10.5pt;margin:9pt 0 1pt}.resume-body h2+h3{margin-top:0}.resume-body p,.resume-body ul{margin-bottom:5pt}.resume-body li{margin:1.5pt 0}.resume-body h3+p:has(>em:only-child){font-size:9pt;margin-bottom:3pt}}@font-face{font-family:inter variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/fonts/inter/inter-latin-ext-opsz-normal.woff2)format('woff2');unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:inter variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/fonts/inter/inter-latin-opsz-normal.woff2)format('woff2');unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:inter variable;font-style:italic;font-display:swap;font-weight:100 900;src:url(/fonts/inter/inter-latin-ext-opsz-italic.woff2)format('woff2');unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,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:inter variable;font-style:italic;font-display:swap;font-weight:100 900;src:url(/fonts/inter/inter-latin-opsz-italic.woff2)format('woff2');unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--font-webfont:"Inter Variable", system-ui, -apple-system, "Segoe UI", Roboto, Arial, sans-serif}