@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 Fallback;src:local("Arial");ascent-override:76.16%;descent-override:20.43%;line-gap-override:0.00%;size-adjust:134.59%}.__className_21eb4d{font-family:IBM Plex Mono,IBM Plex Mono Fallback;font-weight:400;font-style:normal}.__variable_21eb4d{--font-mono:"IBM Plex Mono","IBM Plex Mono Fallback"}*,:after,:before{box-sizing:border-box;margin:0;padding:0}:root{--bg:#ffffff;--text:#000000;--link:#0000EE;--visited:#551A8B;--navy:#000080;--font:"Noto Sans KR","Helvetica Neue",Arial,sans-serif}html{font-size:15px}body{font-family:var(--font);color:var(--text);line-height:1.75}.navbar,body{background:var(--bg)}.navbar{display:flex;justify-content:flex-end;align-items:center;padding:.4rem 1.5rem;border-bottom:1px solid var(--text);position:-webkit-sticky;position:sticky;top:0;z-index:100}.navbar-brand{font-size:.8rem;color:var(--text)}.navbar-actions{gap:1.25rem}.navbar-actions,.navbar-lang{display:flex;align-items:center}.navbar-lang{gap:.4rem;font-size:.8rem}.navbar-pdf{font-size:.8rem}.navbar-lang a,.navbar-pdf{color:var(--text);text-decoration:none}.navbar-lang-active{font-weight:700;text-decoration:underline!important}.navbar-divider{color:var(--text);font-size:.75rem}@page{size:A4;margin:15mm 18mm}@media print{.navbar,.tooltip-balloon{display:none}body{-webkit-print-color-adjust:exact;print-color-adjust:exact}.portfolio{padding:15mm 18mm;max-width:none}header{margin-bottom:2rem}footer{display:none}h2,h3{page-break-after:avoid;break-after:avoid}.tech-stack,.tenure-grid,ul li{page-break-inside:avoid;break-inside:avoid}a{color:var(--text);text-decoration:none}}.page-wrapper{position:relative}.portfolio{max-width:680px;margin:0 auto;padding:4rem 1.5rem 5rem;counter-reset:section}.tooltip-balloon{position:absolute;max-width:340px;font-size:.75rem;line-height:1.6;color:var(--text);background:var(--bg);border:1px solid var(--text);border-radius:6px;padding:.6rem .8rem;z-index:200}.tooltip-balloon p{margin:0}header{margin-bottom:3rem}header h1{font-size:2rem;font-weight:700;letter-spacing:-.02em;margin-bottom:.3rem}.role,header h1{color:var(--text)}.role{margin-bottom:.4rem}.contact{display:flex;gap:1.25rem;margin-top:.4rem;font-size:.85rem}.contact-email{cursor:pointer;color:var(--text);position:relative}.contact-check{color:var(--text);position:absolute;left:calc(100% + .3rem);top:0}h2{font-size:.95rem;font-weight:700;margin:2.5rem 0 1rem;-webkit-user-select:none;-moz-user-select:none;user-select:none;counter-increment:section}h2,h2:before{color:var(--text)}h2:before{content:counter(section,decimal-leading-zero) "  ";font-family:var(--font-mono),monospace;font-weight:400}h3{font-size:1.1rem;font-weight:700;color:var(--text);margin:1.5rem 0 .25rem}h3+p{color:var(--text)}.tenure-grid,h3+p{font-size:.8rem;margin:0 0 .6rem}.tenure-grid{display:grid;grid-template-columns:auto 1fr;grid-gap:0 1rem;gap:0 1rem}.tenure-role{font-weight:400}p{margin:.6rem 0}ol,ul{list-style:none;padding-left:0;margin:.4rem 0}ul li{padding-left:1.25rem;position:relative;margin:.25rem 0}ul li:before{content:"—";position:absolute;left:0;top:.2em;color:var(--text)}ul ul{margin:.15rem 0}ul ul li:before{content:"–"}strong{font-weight:700}a{text-decoration:underline}a,a:visited{color:var(--link)}hr{border:none;margin:2.5rem 0}.gif-link{color:var(--link);text-decoration:underline;-webkit-text-decoration-style:dashed;text-decoration-style:dashed;cursor:pointer}.gif-link:hover{background:var(--link);color:#fff;text-decoration:none}footer{margin-top:3rem;color:var(--text);font-size:.8rem}.contact-widget{position:fixed;top:1.5rem;right:1.5rem;padding:.75rem 1rem;background:rgba(255,255,255,.35);backdrop-filter:blur(16px) saturate(180%);-webkit-backdrop-filter:blur(16px) saturate(180%);border:1px solid rgba(255,255,255,.6);box-shadow:0 4px 24px rgba(0,0,0,.06);border-radius:12px;z-index:100}.contact-widget-row{display:flex;align-items:center;gap:.6rem;font-size:.75rem}.contact-widget-row+.contact-widget-row{margin-top:.4rem}.contact-widget-email{cursor:pointer;color:var(--text)}.contact-widget-check{color:#22c55e;font-size:.75rem}.contact-widget-github{display:inline-flex;align-items:center;gap:.3rem;color:var(--link)}.tech-stack{display:flex;flex-wrap:wrap;gap:.35rem;margin:.85rem 0 .25rem}.tech-chip{font-size:.7rem;padding:.1rem .35rem;border:1px solid var(--text);color:var(--text);white-space:nowrap}.fill{display:inline;border-radius:4px;padding:.05rem .35rem;border:1px solid;line-height:2.4}.fill-problem{border-color:#800000;background:rgba(128,0,0,.08)}.fill-tech{border-color:#000080;background:rgba(0,0,128,.08)}.fill-result{border-color:#008080;background:rgba(0,128,128,.08)}.metric{font-family:var(--font-mono),monospace}.comment-link{border-bottom:1px dotted var(--text);cursor:pointer}