.bg{color:#cdd6f4;background-color:#1e1e2e}.chroma{color:#cdd6f4;background-color:#1e1e2e;-webkit-text-size-adjust:none}.chroma .x{color:#cdd6f4}.chroma .err{color:#f38ba8}.chroma .cl{color:#cdd6f4}.chroma .lnlinks{outline:none;text-decoration:none;color:inherit}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0}.chroma .hl{background-color:#45475a}.chroma .lnt{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f849c}.chroma .ln{white-space:pre;-webkit-user-select:none;user-select:none;margin-right:.4em;padding:0 .4em;color:#7f849c}.chroma .line{display:flex}.chroma .k{color:#cba6f7}.chroma .kc{color:#fab387}.chroma .kd{color:#f38ba8}.chroma .kn{color:#94e2d5}.chroma .kp{color:#cba6f7}.chroma .kr{color:#cba6f7}.chroma .kt{color:#f38ba8}.chroma .na{color:#89b4fa}.chroma .nc{color:#f9e2af}.chroma .no{color:#f9e2af}.chroma .nd{color:#89b4fa;font-weight:700}.chroma .ni{color:#94e2d5}.chroma .ne{color:#fab387}.chroma .nl{color:#89dceb}.chroma .nn{color:#fab387}.chroma .nx{color:#cdd6f4}.chroma .py{color:#fab387}.chroma .nt{color:#cba6f7}.chroma .nb{color:#89dceb}.chroma .bp{color:#89dceb}.chroma .nv{color:#f5e0dc}.chroma .vc{color:#f5e0dc}.chroma .vg{color:#f5e0dc}.chroma .vi{color:#f5e0dc}.chroma .vm{color:#f5e0dc}.chroma .nf{color:#89b4fa}.chroma .fm{color:#89b4fa}.chroma .ld{color:#cdd6f4}.chroma .s{color:#a6e3a1}.chroma .sa{color:#f38ba8}.chroma .sb{color:#a6e3a1}.chroma .sc{color:#a6e3a1}.chroma .dl{color:#89b4fa}.chroma .sd{color:#6c7086}.chroma .s2{color:#a6e3a1}.chroma .se{color:#89b4fa}.chroma .sh{color:#6c7086}.chroma .si{color:#a6e3a1}.chroma .sx{color:#a6e3a1}.chroma .sr{color:#94e2d5}.chroma .s1{color:#a6e3a1}.chroma .ss{color:#a6e3a1}.chroma .m{color:#fab387}.chroma .mb{color:#fab387}.chroma .mf{color:#fab387}.chroma .mh{color:#fab387}.chroma .mi{color:#fab387}.chroma .il{color:#fab387}.chroma .mo{color:#fab387}.chroma .o{color:#89dceb;font-weight:700}.chroma .ow{color:#89dceb;font-weight:700}.chroma .or{color:#89dceb;font-weight:700}.chroma .c{color:#6c7086;font-style:italic}.chroma .ch{color:#585b70;font-style:italic}.chroma .cm{color:#6c7086;font-style:italic}.chroma .c1{color:#6c7086;font-style:italic}.chroma .cs{color:#6c7086;font-style:italic}.chroma .cp{color:#6c7086;font-style:italic}.chroma .cpf{color:#6c7086;font-weight:700;font-style:italic}.chroma .gd{color:#f38ba8;background-color:#313244}.chroma .ge{font-style:italic}.chroma .gr{color:#f38ba8}.chroma .gh{color:#fab387;font-weight:700}.chroma .gi{color:#a6e3a1;background-color:#313244}.chroma .go{color:#cdd6f4}.chroma .gp{color:#cdd6f4}.chroma .gs{font-weight:700}.chroma .gu{color:#fab387;font-weight:700}.chroma .gt{color:#f38ba8}.chroma .gl{text-decoration:underline}@font-face{font-family:jetbrains mono;font-style:normal;font-weight:400;font-display:swap;src:url(/fonts/jetbrains-mono-latin-400.woff2)format("woff2")}@font-face{font-family:jetbrains mono;font-style:normal;font-weight:700;font-display:swap;src:url(/fonts/jetbrains-mono-latin-700.woff2)format("woff2")}@font-face{font-family:jetbrains mono;font-style:italic;font-weight:400;font-display:swap;src:url(/fonts/jetbrains-mono-latin-400-italic.woff2)format("woff2")}:root{--rosewater:#f5e0dc;--flamingo:#f2cdcd;--pink:#f5c2e7;--mauve:#cba6f7;--red:#f38ba8;--maroon:#eba0ac;--peach:#fab387;--yellow:#f9e2af;--green:#a6e3a1;--teal:#94e2d5;--sky:#89dceb;--sapphire:#74c7ec;--blue:#89b4fa;--lavender:#b4befe;--text:#cdd6f4;--subtext1:#bac2de;--subtext0:#a6adc8;--overlay2:#9399b2;--overlay1:#7f849c;--overlay0:#6c7086;--surface2:#585b70;--surface1:#45475a;--surface0:#313244;--base:#1e1e2e;--mantle:#181825;--crust:#11111b;--mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;color-scheme:dark}*,*::before,*::after{box-sizing:border-box}html{-webkit-text-size-adjust:100%;scrollbar-color:var(--surface2)var(--mantle);scrollbar-width:thin}body{margin:0;background:var(--base);color:var(--text);font:16px/1.65 var(--mono);font-variant-ligatures:none;min-height:100vh;display:flex;flex-direction:column}::selection{background:color-mix(in srgb,var(--mauve) 30%,transparent);color:var(--text)}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:var(--mantle)}::-webkit-scrollbar-thumb{background:var(--surface1);border-radius:6px;border:2px solid var(--mantle)}::-webkit-scrollbar-thumb:hover{background:var(--surface2)}:focus-visible{outline:2px solid var(--lavender);outline-offset:2px;border-radius:3px}a{color:var(--blue);text-underline-offset:3px;text-decoration-color:var(--surface2)}a:hover{color:var(--lavender);text-decoration-color:var(--lavender)}.skip{position:absolute;left:-999px;top:8px;background:var(--mauve);color:var(--crust);padding:6px 10px;border-radius:4px;z-index:10}.skip:focus{left:8px}.wrap{max-width:760px;margin:0 auto;padding:0 20px;width:100%}main.wrap{flex:1;padding-top:8px;padding-bottom:40px}.site-header{border-bottom:1px dashed var(--surface1);margin-bottom:28px}.site-header .wrap{display:flex;justify-content:space-between;align-items:baseline;padding-top:22px;padding-bottom:14px;gap:16px;flex-wrap:wrap}.brand{color:var(--rosewater);font-weight:700;font-size:1.1rem;text-decoration:none}.brand:hover{color:var(--flamingo)}.site-header nav{display:flex;gap:18px}.site-header nav a{color:var(--subtext0);text-decoration:none}.site-header nav a:hover{color:var(--text)}.site-header nav a[aria-current=page]{color:var(--mauve)}.site-footer{border-top:1px dashed var(--surface1);color:var(--overlay2);font-size:.9rem}.site-footer .wrap{display:flex;gap:12px;padding-top:16px;padding-bottom:28px;flex-wrap:wrap}.site-footer a{color:var(--overlay2);text-decoration:none}.site-footer a:hover{color:var(--subtext1);text-decoration:underline}.grow{flex:1}.intro h1{font-size:1.4rem;color:var(--rosewater);margin:0 0 4px}.intro p{margin:0;color:var(--subtext1)}.page-title{font-size:1.4rem;color:var(--rosewater);margin:0 0 20px}.year-title{font-size:1.05rem;color:var(--mauve);margin:34px 0 12px}.posts{list-style:none;margin:0;padding:0}.posts li{padding:9px 0}.post-main{display:flex;gap:14px;align-items:baseline;min-width:0}.post-main time{color:var(--subtext0);min-width:6.5ch;flex-shrink:0}.post-main a{color:var(--lavender);text-decoration:none}.post-main a:hover{color:var(--blue);text-decoration:underline}.post-meta{margin:2px 0 0 calc(6.5ch + 14px);display:flex;gap:12px;align-items:baseline;color:var(--overlay2);font-size:.9rem;flex-wrap:wrap}.tags{display:inline-flex;gap:6px;flex-wrap:wrap}.tag{--c:var(--mauve);font-size:.8rem;padding:1px 8px;border-radius:4px;background:var(--surface0);color:var(--c);text-decoration:none}.tag:hover{background:var(--surface1);color:var(--c);text-decoration:none}.tag::before{content:"#";opacity:.6}.tagcloud{list-style:none;padding:0;display:flex;flex-wrap:wrap;gap:12px 18px}.tagcloud .count{color:var(--overlay2);font-size:.85rem}.post-head h1{font-size:1.7rem;line-height:1.25;color:var(--mauve);margin:8px 0 10px}.byline{color:var(--subtext0);font-size:.9rem;margin:0 0 26px;display:flex;gap:10px;flex-wrap:wrap;align-items:baseline}.prose{overflow-wrap:break-word}.prose>:first-child{margin-top:0}.prose h2,.prose h3,.prose h4{line-height:1.3;margin:2em 0 .6em;position:relative}.prose h2{font-size:1.3rem;color:var(--mauve)}.prose h3{font-size:1.1rem;color:var(--lavender)}.prose h4{font-size:1rem;color:var(--sapphire)}.prose .anchor{color:var(--surface2);text-decoration:none;margin-left:.35em;opacity:0;transition:opacity .15s}.prose h2:hover .anchor,.prose h3:hover .anchor,.prose h4:hover .anchor,.prose .anchor:focus{opacity:1}.prose p{margin:0 0 1.1em}.prose strong{color:var(--peach)}.prose em{color:var(--flamingo)}.prose a{color:var(--blue);text-decoration:underline;text-decoration-color:var(--surface2)}.prose a:hover{color:var(--lavender);text-decoration-color:var(--lavender)}.prose ul,.prose ol{padding-left:1.6em;margin:0 0 1.1em}.prose li{margin:.3em 0}.prose li::marker{color:var(--overlay2)}.prose blockquote{margin:0 0 1.2em;padding:.4em 1em;border-left:3px solid var(--mauve);background:var(--mantle);color:var(--subtext1);border-radius:0 6px 6px 0}.prose blockquote p:last-child{margin-bottom:0}.prose hr{border:0;border-top:1px dashed var(--surface2);margin:2em 0}.prose img{max-width:100%;height:auto;border-radius:6px}.prose code{font-family:var(--mono);font-size:.9em;background:var(--surface0);color:var(--peach);padding:.12em .4em;border-radius:4px}.prose a code{color:inherit}.prose .table-wrap,.prose table{margin:0 0 1.2em}.prose table{display:block;overflow-x:auto;border-collapse:collapse;max-width:100%}.prose th,.prose td{border:1px solid var(--surface0);padding:6px 12px;text-align:left}.prose th{background:var(--surface0);color:var(--text)}.prose tbody tr:nth-child(even){background:var(--mantle)}.prose kbd{font-family:var(--mono);font-size:.85em;background:var(--surface0);color:var(--text);border:1px solid var(--surface2);border-bottom-width:2px;border-radius:4px;padding:.05em .45em}.prose mark{background:color-mix(in srgb,var(--yellow) 30%,transparent);color:var(--text)}.pager{display:flex;gap:16px;margin-top:48px;padding-top:20px;border-top:1px dashed var(--surface1)}.pager a{flex:1;display:block;text-decoration:none;color:var(--lavender);padding:10px 14px;border:1px solid var(--surface0);border-radius:8px}.pager a:hover{border-color:var(--mauve);background:var(--mantle)}.pager small{display:block;color:var(--overlay2)}.pager .next{text-align:right;margin-left:auto}.codeblock{margin:0 0 1.3em;border:1px solid var(--surface0);border-radius:8px;overflow:hidden;background:var(--mantle)}.codebar{display:flex;padding:5px 14px;background:var(--crust);color:var(--overlay2);font-size:.75rem;letter-spacing:.04em;border-bottom:1px solid var(--surface0)}.codeblock .highlight,.codeblock .chroma{margin:0;background:var(--mantle)!important}.codeblock pre{margin:0;padding:14px 16px;overflow-x:auto;font-size:.85rem;line-height:1.55;tab-size:4;background:var(--mantle)!important}.codeblock pre code{background:0 0;color:inherit;padding:0;font-size:inherit;display:block}.chroma .line{display:inline}@media(max-width:560px){body{font-size:15px}.wrap{padding:0 16px}.posts li{padding:10px 0}.post-main{flex-direction:column;gap:0}.post-meta{margin-left:0}.post-head h1{font-size:1.45rem}.pager{flex-direction:column}}@media(prefers-reduced-motion:reduce){*{transition:none!important}}@media print{body{background:#fff;color:#000}}.chroma .c,.chroma .ch,.chroma .cm,.chroma .c1,.chroma .cs,.chroma .cp,.chroma .cpf{color:var(--overlay2)}.post-title .read{color:var(--overlay2);font-size:.9rem;white-space:nowrap}.post-meta{margin-top:4px}.toc{background:var(--mantle);border:1px solid var(--surface0);border-radius:8px;padding:12px 18px;margin:0 0 32px;font-size:.88rem;line-height:1.5}.toc summary{cursor:pointer;color:var(--mauve);font-weight:700;list-style:none}.toc summary::-webkit-details-marker{display:none}.toc summary::before{content:"▾ ";color:var(--overlay1)}.toc:not([open]) summary::before{content:"▸ "}.toc nav{margin-top:10px}.toc ul{list-style:none;margin:0;padding:0}.toc ul ul{margin:2px 0 4px 6px;padding-left:14px;border-left:1px solid var(--surface1)}.toc li{margin:3px 0;overflow-wrap:anywhere}.toc a{color:var(--subtext1);text-decoration:none}.toc a:hover,.toc a:focus-visible{color:var(--lavender);text-decoration:underline;text-decoration-color:var(--lavender)}.toc>nav>ul>li>a{color:var(--text)}.prose h2,.prose h3,.prose h4{scroll-margin-top:16px}html{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){html{scroll-behavior:auto}}