:root{--paper:#191614;--paper-sunk:#211d1a;--ink:#dcd6cc;--ink-strong:#f4efe6;--ink-muted:#918a80;--rule:#302b26;--accent:#e09a70;--accent-sunk:#3a2a20;--mark:#d9614f;--measure:86ch;--measure-wide:104ch;--rail:15rem;--gutter:3rem;--serif:Charter, "Bitstream Charter", "Sitka Text", Cambria, Georgia, serif;--mono:"SF Mono", SFMono-Regular, ui-monospace, "JetBrains Mono", Menlo, Consolas, monospace;--step-0:1.0625rem;--step-1:1.1875rem;--step-2:1.4375rem;--step-3:1.875rem;--step-4:2.375rem;--step--1:0.9375rem;--step--2:0.8125rem}[data-theme=light]{--paper:#f7f1e5;--paper-sunk:#efe7d7;--ink:#1e1c1a;--ink-strong:#000000;--ink-muted:#6b655f;--rule:#e0d7c4;--accent:#9e4d26;--accent-sunk:#f2e3d5;--mark:#a32b25}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scrollbar-gutter:stable}body{margin:0;overflow-x:hidden;background:var(--paper);color:var(--ink);font-family:var(--serif);font-size:var(--step-0);line-height:1.65;font-kerning:normal;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}img,svg,video{max-width:100%;height:auto}a{color:var(--accent);text-decoration:none;border-bottom:1px solid color-mix(in srgb,var(--accent) 35%,transparent);transition:border-color .12s ease}a:hover{border-bottom-color:var(--accent)}:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:2px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.skip-link{position:absolute;left:-9999px}.skip-link:focus{left:1rem;top:1rem;z-index:10;background:var(--paper);padding:.5rem .75rem;border:1px solid var(--rule)}.measure{max-width:var(--measure);margin-inline:auto;padding-inline:1.5rem}.measure-wide{max-width:var(--measure-wide);margin-inline:auto;padding-inline:1.5rem}.masthead{border-bottom:1px solid var(--rule);margin-bottom:3.5rem}.masthead-inner{max-width:var(--measure-wide);margin-inline:auto;padding:1.25rem 1.5rem;display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:.75rem 1.5rem}.wordmark{font-size:var(--step-1);font-weight:600;letter-spacing:-.01em;color:var(--ink-strong);border-bottom:none}.nav{display:flex;align-items:baseline;gap:1.25rem;font-size:var(--step--1)}.nav a{color:var(--ink-muted);border-bottom:1px solid transparent;padding-block:.4rem}.nav a:hover{color:var(--ink)}.nav a[aria-current=page]{color:var(--ink-strong);border-bottom-color:var(--ink-strong)}#theme-toggle{background:0 0;border:none;padding:.4rem;margin:0;color:var(--ink-muted);cursor:pointer;display:inline-flex;align-self:center;line-height:0}#theme-toggle:hover{color:var(--ink)}[data-theme=dark] .icon-sun{display:block}[data-theme=dark] .icon-moon{display:none}[data-theme=light] .icon-sun{display:none}[data-theme=light] .icon-moon{display:block}h1,h2,h3,h4{color:var(--ink-strong);font-weight:600;line-height:1.25;letter-spacing:-.012em;margin:0}.page-title,.post-head h1{font-size:var(--step-4);margin-bottom:.6rem}.prose h2{font-size:var(--step-2);margin-top:2.75rem;margin-bottom:.75rem}.prose h3{font-size:var(--step-1);margin-top:2rem;margin-bottom:.5rem}.prose p,.prose ul,.prose ol,.prose blockquote{margin:0 0 1.15rem}.prose ul,.prose ol{padding-left:1.35rem}.prose li{margin-bottom:.35rem}.prose blockquote{border-left:2px solid var(--rule);padding-left:1.1rem;color:var(--ink-muted);font-style:italic}.admonition{margin:1.35rem 0;padding:.9rem 1.1rem .1rem;background:var(--paper-sunk);border-left:2px solid var(--rule);border-radius:0 3px 3px 0}.admonition-label{margin:0 0 .6rem;font-variant-caps:all-small-caps;letter-spacing:.06em;font-size:var(--step--1);font-style:normal;color:var(--ink-muted)}.admonition>:last-child{margin-bottom:.9rem}.admonition-example{background:var(--accent-sunk);border-left-color:var(--accent)}.admonition-example .admonition-label{color:var(--accent)}.prose hr{border:none;border-top:1px solid var(--rule);margin:2.5rem 0}.prose h2,.prose h3{position:relative}.prose h2>a.anchor,.prose h3>a.anchor{position:absolute;left:-1.1rem;border:none;color:var(--ink-muted);opacity:0;font-weight:400}.prose h2:hover>a.anchor,.prose h3:hover>a.anchor,a.anchor:focus{opacity:1}.lede{color:var(--ink-muted);margin-bottom:2.5rem}.post-head{margin-bottom:2.25rem}.post-meta{display:flex;flex-wrap:wrap;gap:.4rem 1rem;font-size:var(--step--1);color:var(--ink-muted);margin:0}.post-tags{display:inline-flex;flex-wrap:wrap;gap:.4rem}.post-tags a{color:var(--ink-muted);border-bottom:none;padding:.05em .45em;border-radius:3px;background:var(--paper-sunk)}.post-tags a:hover,.post-tags a:focus-visible{color:var(--accent);background:var(--accent-sunk)}.prereq{margin:1.1rem 0 0;padding:.6rem .9rem;background:var(--paper-sunk);border-left:2px solid var(--accent);font-size:var(--step--1)}.prereq span{color:var(--ink-muted)}.post-shell{position:relative}.toc-rail{display:none}.toc{font-size:var(--step--2);line-height:1.5}.toc-summary{cursor:pointer;color:var(--ink-muted);padding:.4rem 0;list-style:none;display:flex;align-items:center;gap:.4rem}.toc-summary::-webkit-details-marker{display:none}.toc-summary::before{content:"";width:0;height:0;border-left:4px solid;border-top:3.5px solid transparent;border-bottom:3.5px solid transparent;transition:transform .15s ease}.toc[open]>.toc-summary::before{transform:rotate(90deg)}.toc-nav ol{list-style:none;margin:.3rem 0 0;padding:0}.toc-nav ol ol{padding-left:.85rem}.toc-nav a{display:block;padding:.28rem 0 .28rem .7rem;border-left:2px solid var(--rule);border-bottom:none;color:var(--ink-muted)}.toc-nav a:hover{color:var(--ink)}.toc-nav a.is-current{color:var(--accent);border-left-color:var(--accent)}.toc-inline{margin-bottom:2.25rem;padding-bottom:1rem;border-bottom:1px solid var(--rule)}.post-list,.pub-list{list-style:none;margin:0;padding:0}.post-list>li{display:grid;grid-template-columns:8.5rem 1fr;gap:0 1.25rem;padding:.3rem 0;align-items:baseline}.post-list>li time{font-style:italic;font-size:var(--step--1);color:var(--ink-muted);font-variant-numeric:tabular-nums;white-space:nowrap}.post-list-title{color:var(--accent);border-bottom:none}.post-list-title:hover{color:var(--ink-strong)}.post-list>li[hidden]{display:none}@media(max-width:30rem){.post-list>li{grid-template-columns:1fr;gap:0;padding:.5rem 0}}.tag-cloud{margin-top:2rem;font-size:var(--step--1);line-height:1.9}.tag-cloud-label{color:var(--ink-muted);margin-right:.6rem}.tag-cloud a{color:var(--accent);border-bottom:none;margin-right:.9rem;white-space:nowrap}.tag-cloud a:hover{color:var(--ink-strong)}.tag-filter{display:flex;flex-wrap:wrap;gap:.5rem;margin:0 0 2rem}.tag-btn{display:inline-flex;align-items:baseline;gap:.35em;padding:.3em .85em;border:1px solid var(--rule);border-radius:999px;background:var(--paper-sunk);color:var(--ink-muted);font-size:var(--step--1);line-height:1.6;white-space:nowrap}.tag-btn:hover{color:var(--accent);border-color:var(--accent)}.tag-btn.is-active{background:var(--accent);border-color:var(--accent);color:var(--paper);font-weight:600}.tag-btn-count{font-size:var(--step--2);opacity:.7;font-variant-numeric:tabular-nums}.tag-empty{color:var(--ink-muted);padding:1.5rem 0}.pub-group{margin-top:3rem}.pub-group h2{font-size:var(--step-1);padding-bottom:.5rem;border-bottom:1px solid var(--rule);margin-bottom:1.1rem}.pub-list>li{padding:0;margin-bottom:1.5rem}.pub-list>li:last-child{margin-bottom:0}.pub-line{margin:0}.pub-title{color:var(--ink-strong);font-weight:600}a.pub-title{color:var(--accent);border-bottom:none}a.pub-title:hover{color:var(--ink-strong)}.pub-authors{margin:.15rem 0 0;color:var(--ink-muted)}.pub-venue{margin:.15rem 0 0;color:var(--ink-strong);font-style:italic}.pub-venues{margin:.15rem 0 0;color:var(--ink-muted)}.pub-venues a{color:var(--accent);border-bottom:none}.pub-venues a:hover{color:var(--ink-strong)}.empty{color:var(--ink-muted)}code,kbd,pre,samp{font-family:var(--mono);font-size:.875em}:not(pre)>code{background:var(--paper-sunk);padding:.12em .35em;border-radius:3px}pre{background:var(--paper-sunk);border:1px solid var(--rule);padding:.9rem 1rem;overflow-x:auto;line-height:1.5;margin:0 0 1.35rem}pre code{background:0 0;padding:0}.katex-display{overflow-x:auto;overflow-y:hidden;padding:.6rem 0;margin:1.35rem 0;scrollbar-width:none;-ms-overflow-style:none}.katex-display::-webkit-scrollbar{display:none}.katex-display>.katex>.katex-html:has(>.tag){width:max-content;min-width:100%;padding-right:3.2em}@supports not selector(:has(*)){.katex-display>.katex>.katex-html{padding-right:3.2em}}.katex-display>.katex>.katex-html>.tag{right:-3.2em}.katex{font-size:1.15em}.prose .katex:not(.katex-display .katex){overflow-wrap:anywhere}.prose table{display:block;overflow-x:auto;width:fit-content;max-width:100%;margin-inline:auto;border-collapse:collapse;font-size:var(--step--1);margin-bottom:1.35rem}.prose th,.prose td{border-bottom:1px solid var(--rule);padding:.5rem .8rem;text-align:left}.prose th{color:var(--ink-strong);font-weight:600}.colophon{margin-top:6rem;border-top:1px solid var(--rule);font-size:var(--step--2);color:var(--ink-muted)}.colophon-inner{max-width:var(--measure-wide);margin-inline:auto;padding:1.5rem;display:flex;flex-wrap:wrap;justify-content:space-between;gap:.5rem 1.5rem}.colophon p{margin:0}.colophon-links{display:flex;flex-wrap:wrap;gap:1rem}.colophon a{color:var(--ink-muted);border-bottom-color:transparent}.colophon a:hover{color:var(--accent)}@media(min-width:1340px){.toc-inline{display:none}.toc-rail{display:block;position:absolute;top:0;left:calc(50% + (var(--measure)/2) - 1.5rem + var(--gutter));width:var(--rail);height:100%}.toc-rail .toc{position:sticky;top:2.5rem;max-height:calc(100vh - 5rem);overflow-y:auto}}@media(max-width:560px){:root{--step-4:1.9375rem;--step-3:1.625rem;--step-2:1.3125rem}.masthead{margin-bottom:2.5rem}.masthead-inner{padding:1rem 1.25rem;flex-direction:column;align-items:flex-start}.nav{gap:1rem;width:100%}#theme-toggle{margin-left:auto}.measure,.measure-wide{padding-inline:1.25rem}.colophon{margin-top:4rem}.colophon-inner{padding:1.25rem}}@media(prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.01ms!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@media print{.masthead,.colophon,.toc,.skip-link{display:none}body{background:#fff;color:#000}.measure,.measure-wide{max-width:none}}:target{scroll-margin-top:2rem}