html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:rgba(0,0,0,0)}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}@font-face{font-family:"Russo One";font-style:normal;font-weight:400;font-display:swap;src:url("/fonts/russo-one-latin.woff2") format("woff2");unicode-range:U+0000-00FF}:root{box-sizing:border-box;font-size:16px}*,*::before,*::after{box-sizing:inherit}html{background-color:#fff}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;color:#24313f;line-height:1.6;tab-size:4;-webkit-font-smoothing:antialiased}a{color:#0a6fae;text-decoration:none}a:hover{text-decoration:underline}hr{border:0;border-top:1px solid #dbe6ee;margin:2rem 0}table{border-collapse:collapse;margin:1rem 0 1.5rem;font-size:.95rem;display:block;max-width:100%;overflow-x:auto}tr,td,th{border:1px solid #dbe6ee;margin:0;padding:.45rem .75rem}tr a,td a,th a{text-decoration:none;font-weight:600}tr a:hover,td a:hover,th a:hover{text-decoration:underline}th{background-color:#e8f4fa;color:#0a6fae;text-align:left;font-weight:600}tbody tr:nth-child(even) td{background-color:#fbfdfe}blockquote{margin:1.5rem 0;padding:1rem 1.25rem;border-left:4px solid #dbe6ee;background:#f6f9fc;color:#334155;font-style:italic}blockquote p{margin:0}blockquote cite{display:block;margin-top:.75rem;font-size:.9rem;font-style:normal;color:#5b6b7b}blockquote code{background-color:#e6edf3}.site-header{position:sticky;top:0;z-index:20;background:#0a6fae;color:#fff;box-shadow:0 1px 0 rgba(0,0,0,.08),0 2px 8px rgba(0,0,0,.12)}.site-header .site-header-inner{max-width:1280px;margin:0 auto;min-height:52px;padding:0 1.25rem;display:flex;align-items:center;gap:1.25rem;flex-wrap:wrap}.site-header a{color:#fff;text-decoration:none}.site-header .brand{display:inline-flex;align-items:baseline;gap:.55rem;white-space:nowrap}.site-header .brand .brand-name{font-family:"Russo One","Arial Black",sans-serif;font-size:1.45rem;letter-spacing:.02em;line-height:1}.site-header .brand:hover{text-decoration:none}.site-header .site-nav{display:flex;align-items:center;gap:.15rem}.site-header .site-nav a{font-weight:600;font-size:.95rem;padding:.4rem .7rem;white-space:nowrap}.site-header .site-nav a:hover{background:hsla(0,0%,100%,.14);text-decoration:none}.site-header .site-nav a[aria-current=page]{background:hsla(0,0%,100%,.2)}.site-header .site-actions{margin-left:auto;display:flex;align-items:center;gap:.9rem;font-size:.85rem}.site-header .lang-switch{display:inline-flex;border:1px solid hsla(0,0%,100%,.55);overflow:hidden}.site-header .lang-switch a,.site-header .lang-switch b{padding:.2rem .55rem;font-weight:600;line-height:1.4}.site-header .lang-switch b{background:#fff;color:#0a6fae}.site-header .lang-switch a:hover{background:hsla(0,0%,100%,.14);text-decoration:none}.site-header .source-link{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;font-size:.8rem;opacity:.8}.site-header .source-link:hover{opacity:1;text-decoration:underline}@media(max-width: 900px){.site-header{position:static}.site-header .site-header-inner{gap:.5rem 1rem;padding-top:.4rem;padding-bottom:.4rem}.site-header .site-nav{order:3;flex-basis:100%;flex-wrap:wrap;gap:0;margin:0 -0.5rem}.site-header .site-nav a{font-size:.85rem;padding:.3rem .45rem}.site-header .source-link{display:none}}.layout{max-width:1280px;margin:0 auto;padding:2rem 1.25rem 1rem;display:grid;grid-template-columns:240px minmax(0, 1fr) 220px;gap:2.5rem;align-items:start}.layout .content{min-width:0;max-width:820px}@media(max-width: 1100px){.layout{grid-template-columns:240px minmax(0, 1fr)}.layout .toc{display:none}}@media(max-width: 800px){.layout{grid-template-columns:minmax(0, 1fr);gap:2rem;padding-top:1.25rem}.layout .sidebar{order:2;position:static;max-height:none;border-top:1px solid #dbe6ee;padding-top:1.25rem}}.sidebar{position:sticky;top:calc(52px + 1.5rem);max-height:calc(100vh - 52px - 3rem);overflow-y:auto;font-size:.9rem}.sidebar .site-index-title{margin:.9rem 0 .2rem;font-size:.72rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:#5b6b7b}.sidebar .site-index-title:first-child{margin-top:0}.sidebar .site-index-title span.stxt{font-size:1rem;letter-spacing:.02em}.sidebar .site-index-link{display:block;padding:.15rem .6rem;margin:0;color:#24313f;line-height:1.35}.sidebar .site-index-link:hover{background:#f6f9fc;text-decoration:none;color:#0a6fae}.sidebar .site-index-link.selected{background:#e8f4fa;color:#0a6fae;font-weight:600}.sidebar .site-index-link .site-index-status{float:right;color:#aaa;font-weight:400;font-size:.85em}.toc{position:sticky;top:calc(52px + 1.5rem);max-height:calc(100vh - 52px - 3rem);overflow-y:auto;font-size:.85rem}.toc .page-toc-title{margin:0 0 .5rem;font-size:.72rem;font-weight:700;letter-spacing:.09em;text-transform:uppercase;color:#5b6b7b}.toc a{display:block;padding:.15rem 0 .15rem .8rem;border-left:2px solid #dbe6ee;color:#5b6b7b;line-height:1.35}.toc a:hover{color:#0a6fae;border-left-color:#0a6fae;text-decoration:none}.toc a.l3{padding-left:1.6rem;font-size:.8rem}.content h1,.content h2,.content h3,.content h4{color:#0a6fae;font-weight:700;line-height:1.25;scroll-margin-top:calc(52px + .75rem)}.content h1{font-size:2.1rem;margin:0 0 1.25rem;letter-spacing:-0.01em}.content .doc-meta{display:grid;grid-template-columns:max-content max-content;column-gap:1.25rem;row-gap:.3rem;align-items:baseline;width:fit-content;margin:-0.6rem 0 1rem;padding:.7rem 1.1rem;background:#f7fcff;border:1px solid #dbe6ee;border-left:3px solid #0a6fae;font-size:.9rem}.content .doc-meta dt{margin:0;color:#5b6b7b;font-size:.8rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase}.content .doc-meta dd{margin:0;font-variant-numeric:tabular-nums}.content .doc-meta+h2{margin-top:1.4rem}.content .doc-meta .doc-meta-status{font-weight:700;color:#0a6fae}.content .doc-meta .doc-meta-status-aurora{color:#b45f06}.content h2{font-size:1.5rem;margin:2.5rem 0 .9rem;padding-bottom:.35rem;border-bottom:1px solid #dbe6ee}.content h3{font-size:1.15rem;margin:2rem 0 .6rem}.content h4{font-size:1rem;margin:1.5rem 0 .5rem}.content p,.content li{line-height:1.5}.content p{margin:0 0 1rem}.content ul,.content ol{padding-left:1.5rem;margin:0 0 1rem}.content li{margin:.1rem 0}.content img{max-width:100%}.content .assert,.content .alert{margin:1.25rem 0;padding:.9rem 1.15rem;border-left:4px solid #0a6fae;background:#e8f4fa}.content .assert p,.content .assert ul,.content .alert p,.content .alert ul{margin:0;background:none;padding:0}.content .assert ul,.content .alert ul{padding-left:1.25rem}.content .assert p+p,.content .assert p+ul,.content .assert ul+p,.content .alert p+p,.content .alert p+ul,.content .alert ul+p{margin-top:.6rem}.content .assert p{text-align:center}.content .alert{background:#fae8e8;border-left-color:#d9534f}.content div.preamble p{text-align:right;color:#5b6b7b;font-size:.95rem}.panel,pre{margin:0 0 1.25rem;padding:.9rem 1.1rem;background:#f6f9fc;border:1px solid #dbe6ee;line-height:1.5;font-size:.9rem;font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;overflow-x:auto}pre strong{color:#0a6fae}pre[class*=language-] code,pre.listing code{background:none;padding:0;color:inherit;font-size:inherit}pre.listing{color:#444}pre.language-stxt .token.node{color:#0d5cb6;font-weight:700}pre.language-stxt .token.block-node{color:#00b2f0;font-weight:700}pre.language-stxt .token.namespace{color:#0a9396}pre.language-stxt .token.value{color:#d05a80}pre.language-stxt .token.operator{color:#0d5cb6;font-weight:700}pre.language-stxt .token.block-operator{color:#00b2f0;font-weight:700}pre.language-stxt .token.comment{color:green}pre.language-ebnf .token.rule{color:#0d5cb6;font-weight:700}pre.language-ebnf .token.string{color:#d05a80}pre.language-ebnf .token.operator,pre.language-ebnf .token.punctuation{color:#6a737d}pre.language-ebnf .token.comment{color:green}pre.language-java .token.keyword,pre.language-java .token.important,pre.language-typescript .token.keyword,pre.language-typescript .token.important,pre.language-python .token.keyword,pre.language-python .token.important,pre.language-json .token.keyword,pre.language-json .token.important,pre.language-xml .token.keyword,pre.language-xml .token.important{color:#0d5cb6}pre.language-java .token.property,pre.language-java .token.tag,pre.language-typescript .token.property,pre.language-typescript .token.tag,pre.language-python .token.property,pre.language-python .token.tag,pre.language-json .token.property,pre.language-json .token.tag,pre.language-xml .token.property,pre.language-xml .token.tag{color:#0d5cb6;font-weight:700}pre.language-java .token.class-name,pre.language-java .token.builtin,pre.language-java .token.namespace,pre.language-java .token.decorator,pre.language-java .token.annotation,pre.language-java .token.attr-name,pre.language-typescript .token.class-name,pre.language-typescript .token.builtin,pre.language-typescript .token.namespace,pre.language-typescript .token.decorator,pre.language-typescript .token.annotation,pre.language-typescript .token.attr-name,pre.language-python .token.class-name,pre.language-python .token.builtin,pre.language-python .token.namespace,pre.language-python .token.decorator,pre.language-python .token.annotation,pre.language-python .token.attr-name,pre.language-json .token.class-name,pre.language-json .token.builtin,pre.language-json .token.namespace,pre.language-json .token.decorator,pre.language-json .token.annotation,pre.language-json .token.attr-name,pre.language-xml .token.class-name,pre.language-xml .token.builtin,pre.language-xml .token.namespace,pre.language-xml .token.decorator,pre.language-xml .token.annotation,pre.language-xml .token.attr-name{color:#0a9396;font-weight:400}pre.language-java .token.string,pre.language-java .token.char,pre.language-java .token.template-string,pre.language-java .token.number,pre.language-java .token.boolean,pre.language-java .token.attr-value,pre.language-java .token.regex,pre.language-typescript .token.string,pre.language-typescript .token.char,pre.language-typescript .token.template-string,pre.language-typescript .token.number,pre.language-typescript .token.boolean,pre.language-typescript .token.attr-value,pre.language-typescript .token.regex,pre.language-python .token.string,pre.language-python .token.char,pre.language-python .token.template-string,pre.language-python .token.number,pre.language-python .token.boolean,pre.language-python .token.attr-value,pre.language-python .token.regex,pre.language-json .token.string,pre.language-json .token.char,pre.language-json .token.template-string,pre.language-json .token.number,pre.language-json .token.boolean,pre.language-json .token.attr-value,pre.language-json .token.regex,pre.language-xml .token.string,pre.language-xml .token.char,pre.language-xml .token.template-string,pre.language-xml .token.number,pre.language-xml .token.boolean,pre.language-xml .token.attr-value,pre.language-xml .token.regex{color:#d05a80;font-weight:400}pre.language-java .token.comment,pre.language-java .token.doc-comment,pre.language-typescript .token.comment,pre.language-typescript .token.doc-comment,pre.language-python .token.comment,pre.language-python .token.doc-comment,pre.language-json .token.comment,pre.language-json .token.doc-comment,pre.language-xml .token.comment,pre.language-xml .token.doc-comment{color:green}pre.language-java .token.operator,pre.language-java .token.punctuation,pre.language-typescript .token.operator,pre.language-typescript .token.punctuation,pre.language-python .token.operator,pre.language-python .token.punctuation,pre.language-json .token.operator,pre.language-json .token.punctuation,pre.language-xml .token.operator,pre.language-xml .token.punctuation{color:#6a737d;font-weight:400}.code-wrapper{position:relative}.copy-code-button,.play-code-link{position:absolute;top:.5rem;right:.5rem;text-decoration:none;display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;padding:0;border:1px solid #ddd;background:#fff;color:#888;cursor:pointer;opacity:.55;transition:opacity .15s ease,color .15s ease,border-color .15s ease}.copy-code-button svg,.play-code-link svg{width:1rem;height:1rem;display:block}.copy-code-button:hover,.copy-code-button:focus,.play-code-link:hover,.play-code-link:focus{opacity:1;color:#0a6fae;border-color:#0a6fae;outline:none}.copy-code-button.copied,.play-code-link.copied{opacity:1;color:green;border-color:green}.code-wrapper:hover .copy-code-button,.code-wrapper:hover .play-code-link{opacity:1}code{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace;font-size:.9em;background:#eef3f7;padding:.1em .4em;color:#0a6fae}:not(pre)>code{white-space:pre-wrap}#advertisement div{display:none}@media(min-width: 750px){#advertisement div{display:block}}.book-nav{display:flex;justify-content:space-between;gap:1rem;margin-top:3rem;padding-top:1.25rem;border-top:1px solid #dbe6ee}.book-nav a{flex:1 1 0;max-width:48%;color:#24313f;font-weight:600;line-height:1.35}.book-nav a:hover{text-decoration:none;color:#0a6fae}.book-nav a.next{text-align:right;margin-left:auto}.book-nav .book-nav-arrow{font-size:.75em;color:#5b6b7b}.site-footer{max-width:1280px;margin:2rem auto 0;padding:1.5rem 1.25rem 2rem;border-top:1px solid #dbe6ee;text-align:center;color:#5b6b7b;font-size:.85rem}.site-footer p{margin:0}.site-footer a{color:#5b6b7b}span.stxt{font-family:"Russo One","Arial Black",sans-serif;color:#0a6fae !important;font-weight:normal;font-style:normal;letter-spacing:.02em}.text-center{text-align:center !important}.float-left{float:left}.clearfix::before,.clearfix::after{content:" ";display:table}.clearfix::after{clear:both}.hidden{display:none !important}
