header-component:where(.astro-zgz2aqyx){transition:padding .3s,transform .3s,margin-inline .3s,border .15s,background-color .15s;&.not-top{--un-border-opacity: 1;border-color:hsl(var(--border) / var(--un-border-opacity));--un-bg-opacity: 1;background-color:hsl(var(--background) / var(--un-bg-opacity));padding-left:.375rem;padding-right:.375rem;box-shadow:#fff 0 0,#18181b14 0 0 0 1px,#27272a14 0 10px 15px -3px,#27272a14 0 4px 6px -4px}&[data-show=false]:not(.expanded){transform:translateY(-5rem)}}@media(min-width:800px){header-component:where(.astro-zgz2aqyx).not-top{margin-inline:8%}}.dark header-component:where(.astro-zgz2aqyx).not-top{background-color:hsl(var(--muted) / var(--un-bg-opacity))}@media(max-width:640px){#headerExpandContent:where(.astro-zgz2aqyx){grid-template-rows:0fr;transition:opacity .3s,padding .3s,border-color .15s,grid-template-rows .3s}.expanded:where(.astro-zgz2aqyx) #headerExpandContent:where(.astro-zgz2aqyx){grid-template-rows:1fr}.expanded:where(.astro-zgz2aqyx).not-top #headerExpandContent:where(.astro-zgz2aqyx){box-shadow:#fff 0 0,#18181b14 0 0 0 1px,#27272a14 0 10px 15px -3px,#27272a14 0 4px 6px -4px}header-component:where(.astro-zgz2aqyx) #headerExpandContent:where(.astro-zgz2aqyx):after{box-sizing:content-box;content:"";position:absolute;inset-inline:calc(-1rem - 1px);bottom:0;top:-5rem;z-index:-1;transition:.3s;visibility:hidden;opacity:0;border-bottom:1px solid transparent}header-component:where(.astro-zgz2aqyx):not(.not-top) #headerExpandContent:where(.astro-zgz2aqyx):after{visibility:visible;bottom:-1rem;opacity:1;background-color:hsl(var(--muted) / var(--un-bg-opacity, 1));border-bottom-color:hsl(var(--border) / var(--un-border-opacity, 1))}}#toggleDarkMode:where(.astro-zgz2aqyx){&[data-theme=dark]{.system:where(.astro-zgz2aqyx){display:none}.dark:where(.astro-zgz2aqyx){display:block}}&[data-theme=light]{.system:where(.astro-zgz2aqyx){display:none}.light{display:block}}}@font-face{font-family:Satoshi;src:url(/fonts/Satoshi-Variable.ttf) format("truetype");font-style:normal;font-display:swap}@font-face{font-family:Satoshi;src:url(/fonts/Satoshi-VariableItalic.ttf) format("truetype");font-style:italic;font-display:swap}html{font-family:Satoshi,Noto Sans TC,sans-serif}:root{--background: 25 45% 98%;--foreground: 15 25% 12%;--card: 25 45% 100%;--card-foreground: 15 25% 12%;--popover: 25 45% 100%;--popover-foreground: 15 25% 12%;--primary: 199 42% 49%;--primary-foreground: 25 45% 98%;--secondary: 20 35% 94%;--secondary-foreground: 15 25% 18%;--muted: 20 30% 93%;--muted-foreground: 15 12% 32%;--accent: 20 35% 92%;--accent-foreground: 15 25% 18%;--destructive: 0 72.22% 50.59%;--destructive-foreground: 0 0% 98%;--border: 20 25% 86%;--input: 20 25% 88%;--ring: 15 25% 18%;--radius: .5rem;--info: 200 80% 50%;--warning: 285 70% 60%}.dark{--background: 270 40% 3.5%;--foreground: 30 35% 96%;--card: 268 32% 7%;--card-foreground: 30 35% 96%;--popover: 268 32% 7%;--popover-foreground: 30 35% 96%;--primary: 199 55% 65%;--primary-foreground: 270 35% 8%;--secondary: 268 24% 12%;--secondary-foreground: 30 35% 96%;--muted: 270 24% 10%;--muted-foreground: 268 12% 70%;--accent: 268 24% 13%;--accent-foreground: 30 35% 96%;--destructive: 0 62.8% 30.6%;--destructive-foreground: 0 0% 98%;--border: 270 22% 16%;--input: 268 24% 13%;--ring: 199 55% 65%;--info: 200 75% 65%;--warning: 285 70% 75%}:root{--un-default-border-color: hsl(var(--border) / 1)}html.dark{color-scheme:dark}a{transition:color .2s ease;&:hover{color:hsl(var(--primary) / var(--un-text-opacity, 1))}}details.info-box,details.warning-box{--box-accent: #8b949e;color:#c9d1d9!important;background:#0d1117!important;border:1px solid #30363d!important;border-left:3px solid var(--box-accent)!important;border-radius:8px!important;padding:12px 18px!important;margin:1.25em 0!important}details.info-box{--box-accent: #a371f7}details.warning-box{--box-accent: #e3b341}details.info-box a,details.warning-box a{color:#58a6ff!important}details.info-box>summary,details.warning-box>summary{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-weight:600;letter-spacing:.01em;color:#e6edf3!important;padding-inline-start:0!important}details.info-box>summary:before,details.warning-box>summary:before{content:"vinsong@blog:~$ "!important;white-space:pre;position:static!important;color:var(--box-accent)!important;font-weight:700;transform:none!important}details.info-box>summary:after,details.warning-box>summary:after{content:"▍";margin-inline-start:.1em;color:var(--box-accent);animation:term-cursor-blink 1.1s step-end infinite}@keyframes term-cursor-blink{0%,to{opacity:1}50%{opacity:0}}.course-info-card{position:relative;color:#c9d1d9!important;background:#0d1117!important;border:1px solid #30363d!important;border-radius:10px!important;box-shadow:0 8px 24px #01040973!important;padding:3rem 1.3rem 1.15rem!important;margin:1.5em 0!important;overflow:hidden;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace}.course-info-card:before{content:"course/info.md";position:absolute;inset:0 0 auto;height:2.3rem;display:flex;align-items:center;justify-content:center;background-color:#161b22;background-image:radial-gradient(circle 5px at 18px 50%,#ff5f56 98%,transparent 100%),radial-gradient(circle 5px at 36px 50%,#ffbd2e 98%,transparent 100%),radial-gradient(circle 5px at 54px 50%,#27c93f 98%,transparent 100%);border-bottom:1px solid #30363d;color:#8b949e;font-size:.8rem}.course-info-card .course-cmd-line{font-size:.85rem;font-weight:700;color:#c9d1d9;margin-bottom:.7rem}.course-info-card .course-cmd-line .u{color:#3fb950}.course-info-card .course-cmd-line .p{color:#58a6ff}.course-info-card .course-cmd-line .o{color:#8b949e}.course-info-card .course-cmd-line .f{color:#8b949e;font-weight:600}.course-info-card ul{display:grid!important;grid-template-columns:repeat(2,minmax(0,1fr));gap:.1rem 1.5rem;margin:0!important;padding:0!important;list-style:none!important;font-size:.9rem}@media(min-width:640px){.course-info-card ul{grid-template-columns:repeat(3,minmax(0,1fr))}}.course-info-card li{margin:0!important;padding:0!important;font-weight:600;color:#e6edf3;font-variant-numeric:tabular-nums}.course-info-card li>p{margin:0!important;line-height:1.5}.course-info-card li::marker{content:""}.course-info-card li strong{font-weight:400;color:#8b949e!important}.course-info-card a{color:#58a6ff!important}.course-info-card .rating-bar{display:inline-flex;gap:3px;margin-inline-end:.5rem;vertical-align:middle}.course-info-card .rating-bar i{width:13px;height:8px;border-radius:2px;background:#30363d}.course-info-card .rating-bar i.on{background:#3fb950;box-shadow:0 0 5px #3fb95073}.course-info-card .rating-bar.boom i{background:#f85149;box-shadow:0 0 7px #f85149a6;animation:rating-boom .5s ease-in-out infinite alternate}.course-info-card .rating-bar.boom i:nth-child(2){animation-delay:.06s}.course-info-card .rating-bar.boom i:nth-child(3){animation-delay:.12s}.course-info-card .rating-bar.boom i:nth-child(4){animation-delay:.18s}.course-info-card .rating-bar.boom i:nth-child(5){animation-delay:.24s}.course-info-card .rating-bar .boom-mark{margin-inline-start:4px;font-size:.9rem;line-height:1;animation:rating-boom .5s ease-in-out infinite alternate}@keyframes rating-boom{0%{transform:translateY(.5px) scaleY(.9);opacity:.8}to{transform:translateY(-1px) scaleY(1.15);opacity:1}}figure figcaption,figcaption{color:hsl(var(--muted-foreground) / .95)!important}.prose details summary{list-style:none;font-weight:600;cursor:pointer;position:relative;padding-inline-start:1.4em;color:hsl(var(--foreground) / .95);margin-bottom:.5em}.prose details summary:before{content:"▶";position:absolute;inset-inline-start:0;transition:transform .3s ease;color:hsl(var(--muted-foreground) / .9)}.prose details[open] summary:before{transform:rotate(90deg)}.quote-box{display:flex;align-items:center;justify-content:flex-start;background:hsl(var(--muted) / .35);border-top:4px solid hsl(var(--border) / .8);border-radius:20px;padding:18px 28px 20px;color:hsl(var(--foreground) / .95);font-weight:600;font-size:1.05rem}.custom-figure{display:flex;flex-direction:column;align-items:center;width:fit-content;max-width:100%;margin:2em auto}.custom-figure img{border-radius:12px;margin-bottom:.75em;max-width:100%;height:auto;box-shadow:0 10px 25px hsl(var(--border) / .3)}.custom-figure figcaption{font-style:italic;text-align:center}.prose table{border-collapse:separate;border-spacing:0;overflow:hidden;border:1px solid hsl(var(--border));border-radius:.75rem;background:hsl(var(--card) / .5);font-size:.95em;line-height:1.55}.prose th,.prose td{padding:.6em .95em;text-align:left;vertical-align:top;border-bottom:1px solid hsl(var(--border) / .7);word-break:break-word}.prose thead th{background:hsl(var(--primary) / .1);color:hsl(var(--foreground));font-weight:600;border-bottom:1px solid hsl(var(--border))}.prose tbody tr{transition:background-color .15s ease}.prose tbody tr:nth-child(2n){background:hsl(var(--muted) / .4)}.prose tbody tr:hover{background:hsl(var(--primary) / .08)}.prose tbody tr:last-child td{border-bottom:none}.prose tbody td:first-child{font-weight:600;color:hsl(var(--foreground) / .9)}.prose table:not(:where([class~=not-prose] *)){width:fit-content;max-width:100%;margin-left:auto;margin-right:auto}.red,.red strong,.red b,.red em,.red a,.red code{color:#dc2828}.dark .red,.dark .red strong,.dark .red b,.dark .red em,.dark .red a,.dark .red code{color:#ef6c6c}.prose :where(p,li,blockquote,dd,dt,td,th):not(:where([class~=not-prose] *)){line-height:1.85}.prose :where(img):not(:where([class~=not-prose] *)){margin-top:1.6em;margin-bottom:1.6em;padding:.55rem;background:#0d1117;border:1px solid #30363d;border-radius:10px;box-shadow:0 8px 24px #01040959}.prose .custom-figure img{margin-bottom:.75em}.prose :where(div[style*="text-align: center"],div[style*="text-align:center"]):not(:where([class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(div[style*="text-align: center"] img,div[style*="text-align:center"] img):not(:where([class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose div[style*="text-align: center"] br,.prose div[style*="text-align:center"] br{display:none}.prose div[style*="text-align: center"] p,.prose div[style*="text-align:center"] p{margin-top:.4em;margin-bottom:0}html.reveal-on [data-reveal]>*{opacity:0;transform:translateY(1.5rem);transition:opacity .6s ease,transform .7s cubic-bezier(.22,1,.36,1)}html.reveal-on [data-reveal]>*.is-revealed{opacity:1;transform:none}html.reveal-on [data-reveal]>*:nth-child(2){transition-delay:.08s}html.reveal-on [data-reveal]>*:nth-child(3){transition-delay:.16s}html.reveal-on [data-reveal]>*:nth-child(4){transition-delay:.24s}@media(prefers-reduced-motion:reduce){html.reveal-on [data-reveal]>*{opacity:1;transform:none;transition:none}}.mermaid-diagram{margin:1.5rem 0;display:flex;justify-content:center}.mermaid-diagram svg{max-width:100%;height:auto}.pseudocode-figure{margin:1.5rem 0;overflow-x:auto}html{scroll-padding-top:5.5rem}@media(prefers-reduced-motion:no-preference){html{scroll-behavior:smooth}}::selection{background-color:hsl(var(--primary) / .22)}.prose :is(p,li,td,th) a:not(:where([class~=not-prose] *)):not(:has(img)){color:hsl(var(--primary) / .95);text-decoration:none;background-image:linear-gradient(currentColor,currentColor);background-position:0 100%;background-repeat:no-repeat;background-size:0% 1.5px;transition:background-size .3s cubic-bezier(.22,1,.36,1),color .2s ease}.prose :is(p,li,td,th) a:not(:where([class~=not-prose] *)):not(:has(img)):hover{background-size:100% 1.5px}.prose :where(img):not(:where([class~=not-prose] *)){cursor:zoom-in;transition:filter .3s ease}.prose :where(img):not(:where([class~=not-prose] *)):hover{filter:brightness(1.04)}@media(min-width:640px){#headerExpandContent a[aria-label="Nav menu item"]{position:relative}#headerExpandContent a[aria-label="Nav menu item"]:after{content:"";position:absolute;inset-inline:.75rem;bottom:.3rem;height:2px;border-radius:2px;background-color:hsl(var(--primary));transform:scaleX(0);transition:transform .28s cubic-bezier(.22,1,.36,1)}#headerExpandContent a[aria-label="Nav menu item"]:hover:after,#headerExpandContent a[aria-label="Nav menu item"].nav-active:after{transform:scaleX(1)}}@media(prefers-reduced-motion:reduce){.prose :is(p,li,td,th) a:not(:where([class~=not-prose] *)):not(:has(img)),.prose :where(img):not(:where([class~=not-prose] *)),#headerExpandContent a[aria-label="Nav menu item"]:after{transition:none}}body{background-image:radial-gradient(hsl(var(--foreground) / .05) 1px,transparent 1.4px),radial-gradient(36rem 26rem at 4% -6%,hsl(199 78% 58% / .13),transparent 60%),radial-gradient(32rem 24rem at 103% 106%,hsl(199 74% 56% / .11),transparent 60%);background-size:24px 24px,auto,auto;background-repeat:repeat,no-repeat,no-repeat;background-attachment:scroll,fixed,fixed;background-position:center top,left top,right bottom}.dark body{background-image:radial-gradient(hsl(var(--foreground) / .07) 1px,transparent 1.4px),radial-gradient(36rem 26rem at 4% -6%,hsl(199 80% 62% / .16),transparent 60%),radial-gradient(32rem 24rem at 103% 106%,hsl(265 70% 62% / .16),transparent 60%)}div:has(>a[href="/projects#sponsorship"]){display:none}header-component>a[aria-label=Brand]{font-size:0}header-component>a[aria-label=Brand]:before{content:"vinsong@blog:~$";font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:1.05rem;font-weight:600;letter-spacing:.01em;color:inherit}header-component>a[aria-label=Brand]:after{content:"";display:inline-block;width:.55rem;height:1.1rem;margin-inline-start:.4rem;vertical-align:-.16rem;background:hsl(var(--primary));animation:term-cursor-blink 1.1s step-end infinite}.prose :where(h2[id],h3[id],h4[id]):not(:where([class~=not-prose] *)):before{font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-weight:500;color:hsl(var(--primary) / .6);white-space:pre}.prose :where(h2[id]):not(:where([class~=not-prose] *)):before{content:"# "}.prose :where(h3[id]):not(:where([class~=not-prose] *)):before{content:"## "}.prose :where(h4[id]):not(:where([class~=not-prose] *)):before{content:"### "}.statusline{display:flex;align-items:stretch;margin-top:4rem;overflow:hidden;border:1px solid #30363d;border-radius:8px;background:#0d1117;font-family:ui-monospace,SF Mono,Menlo,Consolas,monospace;font-size:.72rem;line-height:1;color:#8b949e;user-select:none}.statusline>span{display:inline-flex;align-items:center;padding:.5rem .75rem}.statusline .sl-mode{background:#3fb950;color:#0d1117;font-weight:700;letter-spacing:.09em}.statusline .sl-path{color:#58a6ff;font-weight:600}.statusline .sl-git b{color:#f85149;font-weight:600}.statusline .sl-spacer{flex:1;padding:0}.statusline .sl-meta{border-inline-start:1px solid #30363d}.statusline .sl-meta:last-child{background:#161b22;color:#c9d1d9}@media(max-width:640px){.statusline .sl-git,.statusline .sl-hide-sm{display:none}}.statusline+footer{margin-top:.75rem}.statusline+footer>div{border-top:none;padding-top:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{border-radius:8px;border:3px solid transparent;background-clip:padding-box;background-color:hsl(var(--muted-foreground) / .35)}::-webkit-scrollbar-thumb:hover{background-color:hsl(var(--primary) / .55)}@supports not selector(::-webkit-scrollbar){html{scrollbar-width:thin;scrollbar-color:hsl(var(--muted-foreground) / .4) transparent}}@media(prefers-reduced-motion:reduce){header-component>a[aria-label=Brand]:after{animation:none;opacity:.8}}.highlight{color:var(--highlightColor, hsl(var(--primary) / var(--un-text-opacity)))!important}.highlight-bg{background-color:var( --highlightColor, hsl(var(--primary) / var(--un-text-opacity)) )!important}
