static/frontend: hide expand/collapse on smaller readmes

The readme expand/collapse toggle will only appear
after page load when the readme content is higher than
320px.

Fixes golang/go#48193

Change-Id: I300025bac382059d55c25785fbf48085039a54f7
Reviewed-on: https://go-review.googlesource.com/c/pkgsite/+/378097
Trust: Jamal Carvalho <jamal@golang.org>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
TryBot-Result: kokoro <noreply+kokoro@google.com>
Reviewed-by: Jonathan Amsterdam <jba@google.com>
diff --git a/static/frontend/unit/main/_readme.css b/static/frontend/unit/main/_readme.css
index 4b3d5bf..0c3c104 100644
--- a/static/frontend/unit/main/_readme.css
+++ b/static/frontend/unit/main/_readme.css
@@ -58,10 +58,13 @@
   max-height: initial;
   overflow: initial;
 }
+.UnitReadme--toggle .UnitReadme-expandLink {
+  display: block;
+}
 .UnitReadme--expanded .UnitReadme-expandLink {
   display: none;
 }
-.UnitReadme--expanded .UnitReadme-collapseLink {
+.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink {
   display: block;
 }
 
diff --git a/static/frontend/unit/main/_readme.tmpl b/static/frontend/unit/main/_readme.tmpl
index a0d27cd..288c690 100644
--- a/static/frontend/unit/main/_readme.tmpl
+++ b/static/frontend/unit/main/_readme.tmpl
@@ -5,7 +5,7 @@
 -->
 
 {{define "unit-readme"}}
-  <div class="UnitReadme {{if .ExpandReadme}}UnitReadme--expanded{{end}} js-readme">
+  <div class="UnitReadme UnitReadme--expanded js-readme">
     <h2 class="UnitReadme-title" id="section-readme">
       <img class="go-Icon" height="24" width="24" src="/static/shared/icon/chrome_reader_mode_gm_grey_24dp.svg" alt="">
       README
diff --git a/static/frontend/unit/main/main.js b/static/frontend/unit/main/main.js
index a38f518..f0d396a 100644
--- a/static/frontend/unit/main/main.js
+++ b/static/frontend/unit/main/main.js
@@ -1,4 +1,4 @@
-var o={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},g=class{constructor(e){this.exampleEl=e;var t,i,s,r;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(o.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(o.PLAY_BUTTON),this.shareButtonEl=e.querySelector(o.SHARE_BUTTON),this.formatButtonEl=e.querySelector(o.FORMAT_BUTTON),this.runButtonEl=e.querySelector(o.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(o.EXAMPLE_INPUT)),this.outputEl=e.querySelector(o.EXAMPLE_OUTPUT),(t=this.playButtonEl)==null||t.addEventListener("click",()=>this.handleShareButtonClick()),(i=this.shareButtonEl)==null||i.addEventListener("click",()=>this.handleShareButtonClick()),(s=this.formatButtonEl)==null||s.addEventListener("click",()=>this.handleFormatButtonClick()),(r=this.runButtonEl)==null||r.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",n=>this.onKeydown(n)))}makeTextArea(e){var i,s;let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=(i=e==null?void 0:e.textContent)!=null?i:"",(s=e==null?void 0:e.parentElement)==null||s.replaceChild(t,e),t}getAnchorHash(){var e;return(e=this.anchorEl)==null?void 0:e.hash}expand(){this.exampleEl.open=!0}resize(){var e;if((e=this.inputEl)==null?void 0:e.value){let t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){var t;let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:(t=this.inputEl)==null?void 0:t.value}).then(i=>i.text()).then(i=>{let s=e+i;this.setOutputText(`<a href="${s}">${s}</a>`),window.open(s)}).catch(i=>{this.setErrorText(i)})}handleFormatButtonClick(){var t,i;this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",(i=(t=this.inputEl)==null?void 0:t.value)!=null?i:""),fetch("/play/fmt",{method:"POST",body:e}).then(s=>s.json()).then(({Body:s,Error:r})=>{this.setOutputText(r||"Done."),s&&(this.setInputText(s),this.resize())}).catch(s=>{this.setErrorText(s)})}handleRunButtonClick(){var e;this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:(e=this.inputEl)==null?void 0:e.value,version:2})}).then(t=>t.json()).then(async({Events:t,Errors:i})=>{this.setOutputText(i||"");for(let s of t||[])this.setOutputText(s.Message),await new Promise(r=>setTimeout(r,s.Delay/1e6))}).catch(t=>{this.setErrorText(t)})}};function y(){let l=location.hash.match(/^#(example-.*)$/);if(l){let i=document.getElementById(l[1]);i&&(i.open=!0)}let e=[...document.querySelectorAll(o.PLAY_HREF)],t=i=>e.find(s=>s.hash===i.getAnchorHash());for(let i of document.querySelectorAll(o.PLAY_CONTAINER)){let s=new g(i),r=t(s);r?r.addEventListener("click",()=>{s.expand()}):console.warn("example href not found")}}var p=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function A(l){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},r;for(let n of l.treeitems){if(Number(n.depth)>4)continue;n.groupTreeitem?(r=s[n.groupTreeitem.label],r||(r=s[n.groupTreeitem.label]=document.createElement("optgroup"),r.label=n.groupTreeitem.label,t.appendChild(r))):r=i;let a=document.createElement("option");a.label=n.label,a.textContent=n.label,a.value=n.el.href.replace(window.location.origin,"").replace("/",""),r.appendChild(a)}return l.addObserver(n=>{var c;let a=n.el.hash,d=(c=t.querySelector(`[value$="${a}"]`))==null?void 0:c.value;d&&(t.value=d)},50),e}var f=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,r]of e)if(r){let n=this.treeitems.find(a=>{var d;return(d=a.el)==null?void 0:d.href.endsWith(`#${s}`)});if(n)for(let a of this.observerCallbacks)a(n);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(M(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&(((t=i.nextElementSibling)==null?void 0:t.contains(e.el))||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new L(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},L=class{constructor(e,t,i){var n,a,d,c,v;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(n=e.textContent)==null?void 0:n.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(c=(d=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:d.trim())!=null?c:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){let x=`${(v=i==null?void 0:i.label)!=null?v:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",x),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",x),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function M(l,e){let t;return(...i)=>{let s=()=>{t=null,l(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}var T=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{var i;t.setAttribute(e.replace("data-",""),(i=t.getAttribute(e))!=null?i:""),t.removeAttribute(e)})}attachEventListeners(){var e;this.rows.forEach(t=>{t.addEventListener("click",i=>{this.handleToggleClick(i)})}),(e=this.toggleAll)==null||e.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;(t==null?void 0:t.hasAttribute("aria-expanded"))||(t=this.table.querySelector(`button[aria-controls="${t==null?void 0:t.getAttribute("aria-controls")}"]`));let i=(t==null?void 0:t.getAttribute("aria-expanded"))==="true";t==null||t.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{var s;let t=(e==null?void 0:e.getAttribute("aria-expanded"))==="true",i=(s=e==null?void 0:e.getAttribute("aria-controls"))==null?void 0:s.trimEnd().split(" ");i==null||i.map(r=>{let n=document.getElementById(`${r}`);t?(n==null||n.classList.add("visible"),n==null||n.classList.remove("hidden")):(n==null||n.classList.add("hidden"),n==null||n.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};y();var I=document.querySelector(".js-expandableTable");if(I){let l=new T(I,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&l.expandAllItems()}var C=document.querySelector(".js-tree");if(C){let l=new f(C),e=A(l),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&(t==null||t.replaceChild(e,t.firstElementChild)),e.firstElementChild&&new p(e.firstElementChild)}var u=document.querySelector(".js-readme"),E=document.querySelector(".js-readmeContent"),S=document.querySelector(".js-readmeOutline"),m=document.querySelectorAll(".js-readmeExpand"),k=document.querySelector(".js-readmeCollapse"),b=document.querySelector(".DocNavMobile-select");u&&E&&S&&m.length&&k&&(window.location.hash.includes("readme")&&h(),b==null||b.addEventListener("change",l=>{l.target.value.startsWith("readme-")&&h()}),m.forEach(l=>l.addEventListener("click",e=>{e.preventDefault(),h(),u.scrollIntoView()})),k.addEventListener("click",l=>{l.preventDefault(),u.classList.remove("UnitReadme--expanded"),m[1]&&m[1].scrollIntoView({block:"center"})}),E.addEventListener("keyup",()=>{h()}),E.addEventListener("click",()=>{h()}),S.addEventListener("click",()=>{h()}),document.addEventListener("keydown",l=>{(l.ctrlKey||l.metaKey)&&l.key==="f"&&h()}));function h(){history.replaceState(null,"",`${location.pathname}#section-readme`),u==null||u.classList.add("UnitReadme--expanded")}function w(){var t;if(!location.hash)return;let l=document.getElementById(location.hash.slice(1)),e=(t=l==null?void 0:l.parentElement)==null?void 0:t.parentElement;(e==null?void 0:e.nodeName)==="DETAILS"&&(e.open=!0)}w();window.addEventListener("hashchange",()=>w());document.querySelectorAll(".js-buildContextSelect").forEach(l=>{l.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});
+var d={PLAY_HREF:".js-exampleHref",PLAY_CONTAINER:".js-exampleContainer",EXAMPLE_INPUT:".Documentation-exampleCode",EXAMPLE_OUTPUT:".Documentation-exampleOutput",EXAMPLE_ERROR:".Documentation-exampleError",PLAY_BUTTON:".Documentation-examplePlayButton",SHARE_BUTTON:".Documentation-exampleShareButton",FORMAT_BUTTON:".Documentation-exampleFormatButton",RUN_BUTTON:".Documentation-exampleRunButton"},g=class{constructor(e){this.exampleEl=e;var t,i,s,r;this.exampleEl=e,this.anchorEl=e.querySelector("a"),this.errorEl=e.querySelector(d.EXAMPLE_ERROR),this.playButtonEl=e.querySelector(d.PLAY_BUTTON),this.shareButtonEl=e.querySelector(d.SHARE_BUTTON),this.formatButtonEl=e.querySelector(d.FORMAT_BUTTON),this.runButtonEl=e.querySelector(d.RUN_BUTTON),this.inputEl=this.makeTextArea(e.querySelector(d.EXAMPLE_INPUT)),this.outputEl=e.querySelector(d.EXAMPLE_OUTPUT),(t=this.playButtonEl)==null||t.addEventListener("click",()=>this.handleShareButtonClick()),(i=this.shareButtonEl)==null||i.addEventListener("click",()=>this.handleShareButtonClick()),(s=this.formatButtonEl)==null||s.addEventListener("click",()=>this.handleFormatButtonClick()),(r=this.runButtonEl)==null||r.addEventListener("click",()=>this.handleRunButtonClick()),!!this.inputEl&&(this.resize(),this.inputEl.addEventListener("keyup",()=>this.resize()),this.inputEl.addEventListener("keydown",n=>this.onKeydown(n)))}makeTextArea(e){var i,s;let t=document.createElement("textarea");return t.classList.add("Documentation-exampleCode","code"),t.spellcheck=!1,t.value=(i=e==null?void 0:e.textContent)!=null?i:"",(s=e==null?void 0:e.parentElement)==null||s.replaceChild(t,e),t}getAnchorHash(){var e;return(e=this.anchorEl)==null?void 0:e.hash}expand(){this.exampleEl.open=!0}resize(){var e;if((e=this.inputEl)==null?void 0:e.value){let t=(this.inputEl.value.match(/\n/g)||[]).length;this.inputEl.style.height=`${(20+t*20+12+2)/16}rem`}}onKeydown(e){e.key==="Tab"&&(document.execCommand("insertText",!1,"	"),e.preventDefault())}setInputText(e){this.inputEl&&(this.inputEl.value=e)}setOutputText(e){this.outputEl&&(this.outputEl.textContent=e)}setErrorText(e){this.errorEl&&(this.errorEl.textContent=e),this.setOutputText("An error has occurred\u2026")}handleShareButtonClick(){var t;let e="https://play.golang.org/p/";this.setOutputText("Waiting for remote server\u2026"),fetch("/play/share",{method:"POST",body:(t=this.inputEl)==null?void 0:t.value}).then(i=>i.text()).then(i=>{let s=e+i;this.setOutputText(`<a href="${s}">${s}</a>`),window.open(s)}).catch(i=>{this.setErrorText(i)})}handleFormatButtonClick(){var t,i;this.setOutputText("Waiting for remote server\u2026");let e=new FormData;e.append("body",(i=(t=this.inputEl)==null?void 0:t.value)!=null?i:""),fetch("/play/fmt",{method:"POST",body:e}).then(s=>s.json()).then(({Body:s,Error:r})=>{this.setOutputText(r||"Done."),s&&(this.setInputText(s),this.resize())}).catch(s=>{this.setErrorText(s)})}handleRunButtonClick(){var e;this.setOutputText("Waiting for remote server\u2026"),fetch("/play/compile",{method:"POST",body:JSON.stringify({body:(e=this.inputEl)==null?void 0:e.value,version:2})}).then(t=>t.json()).then(async({Events:t,Errors:i})=>{this.setOutputText(i||"");for(let s of t||[])this.setOutputText(s.Message),await new Promise(r=>setTimeout(r,s.Delay/1e6))}).catch(t=>{this.setErrorText(t)})}};function y(){let l=location.hash.match(/^#(example-.*)$/);if(l){let i=document.getElementById(l[1]);i&&(i.open=!0)}let e=[...document.querySelectorAll(d.PLAY_HREF)],t=i=>e.find(s=>s.hash===i.getAnchorHash());for(let i of document.querySelectorAll(d.PLAY_CONTAINER)){let s=new g(i),r=t(s);r?r.addEventListener("click",()=>{s.expand()}):console.warn("example href not found")}}var p=class{constructor(e){this.el=e;this.el.addEventListener("change",t=>{let i=t.target,s=i.value;i.value.startsWith("/")||(s="/"+s),window.location.href=s})}};function A(l){let e=document.createElement("label");e.classList.add("go-Label"),e.setAttribute("aria-label","Menu");let t=document.createElement("select");t.classList.add("go-Select","js-selectNav"),e.appendChild(t);let i=document.createElement("optgroup");i.label="Outline",t.appendChild(i);let s={},r;for(let n of l.treeitems){if(Number(n.depth)>4)continue;n.groupTreeitem?(r=s[n.groupTreeitem.label],r||(r=s[n.groupTreeitem.label]=document.createElement("optgroup"),r.label=n.groupTreeitem.label,t.appendChild(r))):r=i;let a=document.createElement("option");a.label=n.label,a.textContent=n.label,a.value=n.el.href.replace(window.location.origin,"").replace("/",""),r.appendChild(a)}return l.addObserver(n=>{var c;let a=n.el.hash,h=(c=t.querySelector(`[value$="${a}"]`))==null?void 0:c.value;h&&(t.value=h)},50),e}var f=class{constructor(e){this.el=e;this.handleResize=()=>{this.el.style.setProperty("--js-tree-height","100vh"),this.el.style.setProperty("--js-tree-height",this.el.clientHeight+"px")};this.treeitems=[],this.firstChars=[],this.firstTreeitem=null,this.lastTreeitem=null,this.observerCallbacks=[],this.init()}init(){this.handleResize(),window.addEventListener("resize",this.handleResize),this.findTreeItems(),this.updateVisibleTreeitems(),this.observeTargets(),this.firstTreeitem&&(this.firstTreeitem.el.tabIndex=0)}observeTargets(){this.addObserver(i=>{this.expandTreeitem(i),this.setSelected(i)});let e=new Map,t=new IntersectionObserver(i=>{for(let s of i)e.set(s.target.id,s.isIntersecting||s.intersectionRatio===1);for(let[s,r]of e)if(r){let n=this.treeitems.find(a=>{var h;return(h=a.el)==null?void 0:h.href.endsWith(`#${s}`)});if(n)for(let a of this.observerCallbacks)a(n);break}},{threshold:1,rootMargin:"-60px 0px 0px 0px"});for(let i of this.treeitems.map(s=>s.el.getAttribute("href")))if(i){let s=i.replace(window.location.origin,"").replace("/","").replace("#",""),r=document.getElementById(s);r&&t.observe(r)}}addObserver(e,t=200){this.observerCallbacks.push(M(e,t))}setFocusToNextItem(e){let t=null;for(let i=e.index+1;i<this.treeitems.length;i++){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToPreviousItem(e){let t=null;for(let i=e.index-1;i>-1;i--){let s=this.treeitems[i];if(s.isVisible){t=s;break}}t&&this.setFocusToItem(t)}setFocusToParentItem(e){e.groupTreeitem&&this.setFocusToItem(e.groupTreeitem)}setFocusToFirstItem(){this.firstTreeitem&&this.setFocusToItem(this.firstTreeitem)}setFocusToLastItem(){this.lastTreeitem&&this.setFocusToItem(this.lastTreeitem)}setSelected(e){var t;for(let i of this.el.querySelectorAll('[aria-expanded="true"]'))i!==e.el&&(((t=i.nextElementSibling)==null?void 0:t.contains(e.el))||i.setAttribute("aria-expanded","false"));for(let i of this.el.querySelectorAll("[aria-selected]"))i!==e.el&&i.setAttribute("aria-selected","false");e.el.setAttribute("aria-selected","true"),this.updateVisibleTreeitems(),this.setFocusToItem(e,!1)}expandTreeitem(e){let t=e;for(;t;)t.isExpandable&&t.el.setAttribute("aria-expanded","true"),t=t.groupTreeitem;this.updateVisibleTreeitems()}expandAllSiblingItems(e){for(let t of this.treeitems)t.groupTreeitem===e.groupTreeitem&&t.isExpandable&&this.expandTreeitem(t)}collapseTreeitem(e){let t=null;e.isExpanded()?t=e:t=e.groupTreeitem,t&&(t.el.setAttribute("aria-expanded","false"),this.updateVisibleTreeitems(),this.setFocusToItem(t))}setFocusByFirstCharacter(e,t){let i,s;t=t.toLowerCase(),i=e.index+1,i===this.treeitems.length&&(i=0),s=this.getIndexFirstChars(i,t),s===-1&&(s=this.getIndexFirstChars(0,t)),s>-1&&this.setFocusToItem(this.treeitems[s])}findTreeItems(){let e=(t,i)=>{let s=i,r=t.firstElementChild;for(;r;)(r.tagName==="A"||r.tagName==="SPAN")&&(s=new L(r,this,i),this.treeitems.push(s),this.firstChars.push(s.label.substring(0,1).toLowerCase())),r.firstElementChild&&e(r,s),r=r.nextElementSibling};e(this.el,null),this.treeitems.map((t,i)=>t.index=i)}updateVisibleTreeitems(){this.firstTreeitem=this.treeitems[0];for(let e of this.treeitems){let t=e.groupTreeitem;for(e.isVisible=!0;t&&t.el!==this.el;)t.isExpanded()||(e.isVisible=!1),t=t.groupTreeitem;e.isVisible&&(this.lastTreeitem=e)}}setFocusToItem(e,t=!0){e.el.tabIndex=0,t&&e.el.focus();for(let i of this.treeitems)i!==e&&(i.el.tabIndex=-1)}getIndexFirstChars(e,t){for(let i=e;i<this.firstChars.length;i++)if(this.treeitems[i].isVisible&&t===this.firstChars[i])return i;return-1}},L=class{constructor(e,t,i){var n,a,h,c,v;e.tabIndex=-1,this.el=e,this.groupTreeitem=i,this.label=(a=(n=e.textContent)==null?void 0:n.trim())!=null?a:"",this.tree=t,this.depth=((i==null?void 0:i.depth)||0)+1,this.index=0;let s=e.parentElement;(s==null?void 0:s.tagName.toLowerCase())==="li"&&(s==null||s.setAttribute("role","none")),e.setAttribute("aria-level",this.depth+""),e.getAttribute("aria-label")&&(this.label=(c=(h=e==null?void 0:e.getAttribute("aria-label"))==null?void 0:h.trim())!=null?c:""),this.isExpandable=!1,this.isVisible=!1,this.isInGroup=!!i;let r=e.nextElementSibling;for(;r;){if(r.tagName.toLowerCase()=="ul"){let x=`${(v=i==null?void 0:i.label)!=null?v:""} nav group ${this.label}`.replace(/[\W_]+/g,"_");e.setAttribute("aria-owns",x),e.setAttribute("aria-expanded","false"),r.setAttribute("role","group"),r.setAttribute("id",x),this.isExpandable=!0;break}r=r.nextElementSibling}this.init()}init(){this.el.tabIndex=-1,this.el.getAttribute("role")||this.el.setAttribute("role","treeitem"),this.el.addEventListener("keydown",this.handleKeydown.bind(this)),this.el.addEventListener("click",this.handleClick.bind(this)),this.el.addEventListener("focus",this.handleFocus.bind(this)),this.el.addEventListener("blur",this.handleBlur.bind(this))}isExpanded(){return this.isExpandable?this.el.getAttribute("aria-expanded")==="true":!1}isSelected(){return this.el.getAttribute("aria-selected")==="true"}handleClick(e){e.target!==this.el&&e.target!==this.el.firstElementChild||(this.isExpandable&&(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),e.stopPropagation()),this.tree.setSelected(this))}handleFocus(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.add("focus")}handleBlur(){var t;let e=this.el;this.isExpandable&&(e=(t=e.firstElementChild)!=null?t:e),e.classList.remove("focus")}handleKeydown(e){if(e.altKey||e.ctrlKey||e.metaKey)return;let t=!1;switch(e.key){case" ":case"Enter":this.isExpandable?(this.isExpanded()&&this.isSelected()?this.tree.collapseTreeitem(this):this.tree.expandTreeitem(this),t=!0):e.stopPropagation(),this.tree.setSelected(this);break;case"ArrowUp":this.tree.setFocusToPreviousItem(this),t=!0;break;case"ArrowDown":this.tree.setFocusToNextItem(this),t=!0;break;case"ArrowRight":this.isExpandable&&(this.isExpanded()?this.tree.setFocusToNextItem(this):this.tree.expandTreeitem(this)),t=!0;break;case"ArrowLeft":this.isExpandable&&this.isExpanded()?(this.tree.collapseTreeitem(this),t=!0):this.isInGroup&&(this.tree.setFocusToParentItem(this),t=!0);break;case"Home":this.tree.setFocusToFirstItem(),t=!0;break;case"End":this.tree.setFocusToLastItem(),t=!0;break;default:e.key.length===1&&e.key.match(/\S/)&&(e.key=="*"?this.tree.expandAllSiblingItems(this):this.tree.setFocusByFirstCharacter(this,e.key),t=!0);break}t&&(e.stopPropagation(),e.preventDefault())}};function M(l,e){let t;return(...i)=>{let s=()=>{t=null,l(...i)};t&&clearTimeout(t),t=setTimeout(s,e)}}var T=class{constructor(e,t){this.table=e;this.toggleAll=t;this.expandAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","true")),this.update()};this.collapseAllItems=()=>{this.toggles.map(e=>e.setAttribute("aria-expanded","false")),this.update()};this.update=()=>{this.updateVisibleItems(),setTimeout(()=>this.updateGlobalToggle())};this.rows=Array.from(e.querySelectorAll("[data-aria-controls]")),this.toggles=Array.from(this.table.querySelectorAll("[aria-expanded]")),this.setAttributes(),this.attachEventListeners(),this.update()}setAttributes(){for(let e of["data-aria-controls","data-aria-labelledby","data-id"])this.table.querySelectorAll(`[${e}]`).forEach(t=>{var i;t.setAttribute(e.replace("data-",""),(i=t.getAttribute(e))!=null?i:""),t.removeAttribute(e)})}attachEventListeners(){var e;this.rows.forEach(t=>{t.addEventListener("click",i=>{this.handleToggleClick(i)})}),(e=this.toggleAll)==null||e.addEventListener("click",()=>{this.expandAllItems()}),document.addEventListener("keydown",t=>{(t.ctrlKey||t.metaKey)&&t.key==="f"&&this.expandAllItems()})}handleToggleClick(e){let t=e.currentTarget;(t==null?void 0:t.hasAttribute("aria-expanded"))||(t=this.table.querySelector(`button[aria-controls="${t==null?void 0:t.getAttribute("aria-controls")}"]`));let i=(t==null?void 0:t.getAttribute("aria-expanded"))==="true";t==null||t.setAttribute("aria-expanded",i?"false":"true"),e.stopPropagation(),this.update()}updateVisibleItems(){this.rows.map(e=>{var s;let t=(e==null?void 0:e.getAttribute("aria-expanded"))==="true",i=(s=e==null?void 0:e.getAttribute("aria-controls"))==null?void 0:s.trimEnd().split(" ");i==null||i.map(r=>{let n=document.getElementById(`${r}`);t?(n==null||n.classList.add("visible"),n==null||n.classList.remove("hidden")):(n==null||n.classList.add("hidden"),n==null||n.classList.remove("visible"))})})}updateGlobalToggle(){if(!this.toggleAll)return;this.rows.some(t=>t.hasAttribute("aria-expanded"))&&(this.toggleAll.style.display="block"),this.toggles.some(t=>t.getAttribute("aria-expanded")==="false")?(this.toggleAll.innerText="Expand all",this.toggleAll.onclick=this.expandAllItems):(this.toggleAll.innerText="Collapse all",this.toggleAll.onclick=this.collapseAllItems)}};y();var I=document.querySelector(".js-expandableTable");if(I){let l=new T(I,document.querySelector(".js-expandAllDirectories"));window.location.search.includes("expand-directories")&&l.expandAllItems()}var C=document.querySelector(".js-tree");if(C){let l=new f(C),e=A(l),t=document.querySelector(".js-mainNavMobile");t&&t.firstElementChild&&(t==null||t.replaceChild(e,t.firstElementChild)),e.firstElementChild&&new p(e.firstElementChild)}var o=document.querySelector(".js-readme"),E=document.querySelector(".js-readmeContent"),S=document.querySelector(".js-readmeOutline"),m=document.querySelectorAll(".js-readmeExpand"),k=document.querySelector(".js-readmeCollapse"),b=document.querySelector(".DocNavMobile-select");o&&E&&S&&m.length&&k&&(o.clientHeight>320&&(o==null||o.classList.remove("UnitReadme--expanded"),o==null||o.classList.add("UnitReadme--toggle")),window.location.hash.includes("readme")&&u(),b==null||b.addEventListener("change",l=>{l.target.value.startsWith("readme-")&&u()}),m.forEach(l=>l.addEventListener("click",e=>{e.preventDefault(),u(),o.scrollIntoView()})),k.addEventListener("click",l=>{l.preventDefault(),o.classList.remove("UnitReadme--expanded"),m[1]&&m[1].scrollIntoView({block:"center"})}),E.addEventListener("keyup",()=>{u()}),E.addEventListener("click",()=>{u()}),S.addEventListener("click",()=>{u()}),document.addEventListener("keydown",l=>{(l.ctrlKey||l.metaKey)&&l.key==="f"&&u()}));function u(){history.replaceState(null,"",`${location.pathname}#section-readme`),o==null||o.classList.add("UnitReadme--expanded")}function w(){var t;if(!location.hash)return;let l=document.getElementById(location.hash.slice(1)),e=(t=l==null?void 0:l.parentElement)==null?void 0:t.parentElement;(e==null?void 0:e.nodeName)==="DETAILS"&&(e.open=!0)}w();window.addEventListener("hashchange",()=>w());document.querySelectorAll(".js-buildContextSelect").forEach(l=>{l.addEventListener("change",e=>{window.location.search=`?GOOS=${e.target.value}`})});
 /*!
  * @license
  * Copyright 2020 The Go Authors. All rights reserved.
diff --git a/static/frontend/unit/main/main.js.map b/static/frontend/unit/main/main.js.map
index f966e10..6d16a90 100644
--- a/static/frontend/unit/main/main.js.map
+++ b/static/frontend/unit/main/main.js.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["../../../shared/playground/playground.ts", "../../../shared/outline/select.ts", "../../../shared/outline/tree.ts", "../../../shared/table/table.ts", "main.ts"],
-  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accomodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.inputEl?.value,\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputText(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.setOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nexport function initPlaygrounds(): void {\n  const exampleHashRegex = location.hash.match(/^#(example-.*)$/);\n  if (exampleHashRegex) {\n    const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n    if (exampleHashEl) {\n      exampleHashEl.open = true;\n    }\n  }\n\n  // We use a spread operator to convert a nodelist into an array of elements.\n  const exampleHrefs = [\n    ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n  ];\n\n  /**\n   * Sometimes exampleHrefs and playContainers are in different order, so we\n   * find an exampleHref from a common hash.\n   * @param playContainer - playground container\n   */\n  const findExampleHash = (playContainer: PlaygroundExampleController) =>\n    exampleHrefs.find(ex => {\n      return ex.hash === playContainer.getAnchorHash();\n    });\n\n  for (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n    // There should be the same amount of hrefs referencing examples as example containers.\n    const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n    const exampleHref = findExampleHash(playContainer);\n    if (exampleHref) {\n      exampleHref.addEventListener('click', () => {\n        playContainer.expand();\n      });\n    } else {\n      console.warn('example href not found');\n    }\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n", "import { initPlaygrounds } from 'static/shared/playground/playground';\nimport { SelectNavController, makeSelectNav } from 'static/shared/outline/select';\nimport { TreeNavController } from 'static/shared/outline/tree';\nimport { ExpandableRowsTableController } from 'static/shared/table/table';\n\ninitPlaygrounds();\n\nconst directories = document.querySelector<HTMLTableElement>('.js-expandableTable');\nif (directories) {\n  const table = new ExpandableRowsTableController(\n    directories,\n    document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n  );\n  // Expand directories on page load with expand-directories query param.\n  if (window.location.search.includes('expand-directories')) {\n    table.expandAllItems();\n  }\n}\n\nconst treeEl = document.querySelector<HTMLElement>('.js-tree');\nif (treeEl) {\n  const treeCtrl = new TreeNavController(treeEl);\n  const select = makeSelectNav(treeCtrl);\n  const mobileNav = document.querySelector('.js-mainNavMobile');\n  if (mobileNav && mobileNav.firstElementChild) {\n    mobileNav?.replaceChild(select, mobileNav.firstElementChild);\n  }\n  if (select.firstElementChild) {\n    new SelectNavController(select.firstElementChild);\n  }\n}\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (window.location.hash.includes('readme')) {\n    expandReadme();\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      expandReadme();\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      expandReadme();\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    expandReadme();\n  });\n  readmeContent.addEventListener('click', () => {\n    expandReadme();\n  });\n  readmeOutline.addEventListener('click', () => {\n    expandReadme();\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      expandReadme();\n    }\n  });\n}\n\n/**\n * expandReadme expands the readme and adds the section-readme hash to the\n * URL so it stays expanded when navigating back from an external link.\n */\nfunction expandReadme() {\n  history.replaceState(null, '', `${location.pathname}#section-readme`);\n  readme?.classList.add('UnitReadme--expanded');\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfunction openDeprecatedSymbol() {\n  if (!location.hash) return;\n  const heading = document.getElementById(location.hash.slice(1));\n  const grandParent = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (grandParent?.nodeName === 'DETAILS') {\n    grandParent.open = true;\n  }\n}\nopenDeprecatedSymbol();\nwindow.addEventListener('hashchange', () => openDeprecatedSymbol());\n\n/**\n * Listen for changes in the build context dropdown.\n */\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n"],
-  "mappings": "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",
+  "sourcesContent": ["/*!\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n// This file implements the playground implementation of the documentation\n// page. The playground involves a \"play\" button that allows you to open up\n// a new link to play.golang.org using the example code.\n\n// The CSS is in static/frontend/unit/main/_doc.css\n\n/**\n * CSS classes used by PlaygroundExampleController\n */\nconst PlayExampleClassName = {\n  PLAY_HREF: '.js-exampleHref',\n  PLAY_CONTAINER: '.js-exampleContainer',\n  EXAMPLE_INPUT: '.Documentation-exampleCode',\n  EXAMPLE_OUTPUT: '.Documentation-exampleOutput',\n  EXAMPLE_ERROR: '.Documentation-exampleError',\n  PLAY_BUTTON: '.Documentation-examplePlayButton',\n  SHARE_BUTTON: '.Documentation-exampleShareButton',\n  FORMAT_BUTTON: '.Documentation-exampleFormatButton',\n  RUN_BUTTON: '.Documentation-exampleRunButton',\n};\n\n/**\n * This controller enables playground examples to expand their dropdown or\n * generate shareable Go Playground URLs.\n */\nexport class PlaygroundExampleController {\n  /**\n   * The anchor tag used to identify the container with an example href.\n   * There is only one in an example container div.\n   */\n  private readonly anchorEl: HTMLAnchorElement | null;\n\n  /**\n   * The error element\n   */\n  private readonly errorEl: Element | null;\n\n  /**\n   * Buttons that redirect to an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly playButtonEl: Element | null;\n  private readonly shareButtonEl: Element | null;\n\n  /**\n   * Button that formats the code in an example's playground.\n   */\n  private readonly formatButtonEl: Element | null;\n\n  /**\n   * Button that runs the code in an example's playground, this element\n   * only exists in executable examples.\n   */\n  private readonly runButtonEl: Element | null;\n\n  /**\n   * The executable code of an example.\n   */\n  private readonly inputEl: HTMLTextAreaElement | null;\n\n  /**\n   * The output of the given example code. This only exists if the\n   * author of the package provides an output for this example.\n   */\n  private readonly outputEl: Element | null;\n\n  /**\n   * @param exampleEl The div that contains playground content for the given example.\n   */\n  constructor(private readonly exampleEl: HTMLDetailsElement) {\n    this.exampleEl = exampleEl;\n    this.anchorEl = exampleEl.querySelector('a');\n    this.errorEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_ERROR);\n    this.playButtonEl = exampleEl.querySelector(PlayExampleClassName.PLAY_BUTTON);\n    this.shareButtonEl = exampleEl.querySelector(PlayExampleClassName.SHARE_BUTTON);\n    this.formatButtonEl = exampleEl.querySelector(PlayExampleClassName.FORMAT_BUTTON);\n    this.runButtonEl = exampleEl.querySelector(PlayExampleClassName.RUN_BUTTON);\n    this.inputEl = this.makeTextArea(exampleEl.querySelector(PlayExampleClassName.EXAMPLE_INPUT));\n    this.outputEl = exampleEl.querySelector(PlayExampleClassName.EXAMPLE_OUTPUT);\n\n    // This is legacy listener to be replaced the listener for shareButtonEl.\n    this.playButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.shareButtonEl?.addEventListener('click', () => this.handleShareButtonClick());\n    this.formatButtonEl?.addEventListener('click', () => this.handleFormatButtonClick());\n    this.runButtonEl?.addEventListener('click', () => this.handleRunButtonClick());\n\n    if (!this.inputEl) return;\n\n    this.resize();\n    this.inputEl.addEventListener('keyup', () => this.resize());\n    this.inputEl.addEventListener('keydown', e => this.onKeydown(e));\n  }\n\n  /**\n   * Replace the pre element with a textarea. The examples are initially rendered\n   * as pre elements so they're fully visible when JS is disabled.\n   */\n  makeTextArea(el: Element | null): HTMLTextAreaElement {\n    const t = document.createElement('textarea');\n    t.classList.add('Documentation-exampleCode', 'code');\n    t.spellcheck = false;\n    t.value = el?.textContent ?? '';\n    el?.parentElement?.replaceChild(t, el);\n    return t;\n  }\n\n  /**\n   * Retrieve the hash value of the anchor element.\n   */\n  getAnchorHash(): string | undefined {\n    return this.anchorEl?.hash;\n  }\n\n  /**\n   * Expands the current playground example.\n   */\n  expand(): void {\n    this.exampleEl.open = true;\n  }\n\n  /**\n   * Resizes the input element to accomodate the amount of text present.\n   */\n  private resize(): void {\n    if (this.inputEl?.value) {\n      const numLineBreaks = (this.inputEl.value.match(/\\n/g) || []).length;\n      // min-height + lines x line-height + padding + border\n      this.inputEl.style.height = `${(20 + numLineBreaks * 20 + 12 + 2) / 16}rem`;\n    }\n  }\n\n  /**\n   * Handler to override keyboard behavior in the playground's\n   * textarea element.\n   *\n   * Tab key inserts tabs into the example playground instead of\n   * switching to the next interactive element.\n   * @param e input element keyboard event.\n   */\n  private onKeydown(e: KeyboardEvent) {\n    if (e.key === 'Tab') {\n      document.execCommand('insertText', false, '\\t');\n      e.preventDefault();\n    }\n  }\n\n  /**\n   * Changes the text of the example's input box.\n   */\n  private setInputText(output: string) {\n    if (this.inputEl) {\n      this.inputEl.value = output;\n    }\n  }\n\n  /**\n   * Changes the text of the example's output box.\n   */\n  private setOutputText(output: string) {\n    if (this.outputEl) {\n      this.outputEl.textContent = output;\n    }\n  }\n\n  /**\n   * Sets the error message text and overwrites\n   * output box to indicate a failed response.\n   */\n  private setErrorText(err: string) {\n    if (this.errorEl) {\n      this.errorEl.textContent = err;\n    }\n    this.setOutputText('An error has occurred\u2026');\n  }\n\n  /**\n   * Opens a new window to play.golang.org using the\n   * example snippet's code in the playground.\n   */\n  private handleShareButtonClick() {\n    const PLAYGROUND_BASE_URL = 'https://play.golang.org/p/';\n\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/share', {\n      method: 'POST',\n      body: this.inputEl?.value,\n    })\n      .then(res => res.text())\n      .then(shareId => {\n        const href = PLAYGROUND_BASE_URL + shareId;\n        this.setOutputText(`<a href=\"${href}\">${href}</a>`);\n        window.open(href);\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs gofmt on the example snippet in the playground.\n   */\n  private handleFormatButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n    const body = new FormData();\n    body.append('body', this.inputEl?.value ?? '');\n\n    fetch('/play/fmt', {\n      method: 'POST',\n      body: body,\n    })\n      .then(res => res.json())\n      .then(({ Body, Error }) => {\n        this.setOutputText(Error || 'Done.');\n        if (Body) {\n          this.setInputText(Body);\n          this.resize();\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n\n  /**\n   * Runs the code snippet in the example playground.\n   */\n  private handleRunButtonClick() {\n    this.setOutputText('Waiting for remote server\u2026');\n\n    fetch('/play/compile', {\n      method: 'POST',\n      body: JSON.stringify({ body: this.inputEl?.value, version: 2 }),\n    })\n      .then(res => res.json())\n      .then(async ({ Events, Errors }) => {\n        this.setOutputText(Errors || '');\n        for (const e of Events || []) {\n          this.setOutputText(e.Message);\n          await new Promise(resolve => setTimeout(resolve, e.Delay / 1000000));\n        }\n      })\n      .catch(err => {\n        this.setErrorText(err);\n      });\n  }\n}\n\nexport function initPlaygrounds(): void {\n  const exampleHashRegex = location.hash.match(/^#(example-.*)$/);\n  if (exampleHashRegex) {\n    const exampleHashEl = document.getElementById(exampleHashRegex[1]) as HTMLDetailsElement;\n    if (exampleHashEl) {\n      exampleHashEl.open = true;\n    }\n  }\n\n  // We use a spread operator to convert a nodelist into an array of elements.\n  const exampleHrefs = [\n    ...document.querySelectorAll<HTMLAnchorElement>(PlayExampleClassName.PLAY_HREF),\n  ];\n\n  /**\n   * Sometimes exampleHrefs and playContainers are in different order, so we\n   * find an exampleHref from a common hash.\n   * @param playContainer - playground container\n   */\n  const findExampleHash = (playContainer: PlaygroundExampleController) =>\n    exampleHrefs.find(ex => {\n      return ex.hash === playContainer.getAnchorHash();\n    });\n\n  for (const el of document.querySelectorAll(PlayExampleClassName.PLAY_CONTAINER)) {\n    // There should be the same amount of hrefs referencing examples as example containers.\n    const playContainer = new PlaygroundExampleController(el as HTMLDetailsElement);\n    const exampleHref = findExampleHash(playContainer);\n    if (exampleHref) {\n      exampleHref.addEventListener('click', () => {\n        playContainer.expand();\n      });\n    } else {\n      console.warn('example href not found');\n    }\n  }\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nimport { TreeNavController } from './tree.js';\n\nexport class SelectNavController {\n  constructor(private el: Element) {\n    this.el.addEventListener('change', e => {\n      const target = e.target as HTMLSelectElement;\n      let href = target.value;\n      if (!target.value.startsWith('/')) {\n        href = '/' + href;\n      }\n      window.location.href = href;\n    });\n  }\n}\n\nexport function makeSelectNav(tree: TreeNavController): HTMLLabelElement {\n  const label = document.createElement('label');\n  label.classList.add('go-Label');\n  label.setAttribute('aria-label', 'Menu');\n  const select = document.createElement('select');\n  select.classList.add('go-Select', 'js-selectNav');\n  label.appendChild(select);\n  const outline = document.createElement('optgroup');\n  outline.label = 'Outline';\n  select.appendChild(outline);\n  const groupMap: Record<string, HTMLOptGroupElement> = {};\n  let group: HTMLOptGroupElement;\n  for (const t of tree.treeitems) {\n    if (Number(t.depth) > 4) continue;\n    if (t.groupTreeitem) {\n      group = groupMap[t.groupTreeitem.label];\n      if (!group) {\n        group = groupMap[t.groupTreeitem.label] = document.createElement('optgroup');\n        group.label = t.groupTreeitem.label;\n        select.appendChild(group);\n      }\n    } else {\n      group = outline;\n    }\n    const o = document.createElement('option');\n    o.label = t.label;\n    o.textContent = t.label;\n    o.value = (t.el as HTMLAnchorElement).href.replace(window.location.origin, '').replace('/', '');\n    group.appendChild(o);\n  }\n  tree.addObserver(t => {\n    const hash = (t.el as HTMLAnchorElement).hash;\n    const value = select.querySelector<HTMLOptionElement>(`[value$=\"${hash}\"]`)?.value;\n    if (value) {\n      select.value = value;\n    }\n  }, 50);\n  return label;\n}\n", "/**\n * @license\n * Copyright 2021 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * TreeNavController is the navigation tree component of the documentation page.\n * It adds accessiblity attributes to a tree, observes the heading elements\n * focus the topmost link for headings visible on the page, and implements the\n * WAI-ARIA Treeview Design Pattern with full\n * [keyboard support](https://www.w3.org/TR/wai-aria-practices/examples/treeview/treeview-2/treeview-2a.html#kbd_label).\n */\nexport class TreeNavController {\n  treeitems: TreeItem[];\n\n  /**\n   * firstChars is the first character of each treeitem in the same order\n   * as this.treeitems. We use this array to set focus by character when\n   * navigating the tree with a keyboard.\n   */\n  private firstChars: string[];\n  private firstTreeitem: TreeItem | null;\n  private lastTreeitem: TreeItem | null;\n  private observerCallbacks: ((t: TreeItem) => void)[];\n\n  constructor(private el: HTMLElement) {\n    this.treeitems = [];\n    this.firstChars = [];\n    this.firstTreeitem = null;\n    this.lastTreeitem = null;\n    this.observerCallbacks = [];\n    this.init();\n  }\n\n  private init(): void {\n    this.handleResize();\n    window.addEventListener('resize', this.handleResize);\n    this.findTreeItems();\n    this.updateVisibleTreeitems();\n    this.observeTargets();\n    if (this.firstTreeitem) {\n      this.firstTreeitem.el.tabIndex = 0;\n    }\n  }\n\n  private handleResize = (): void => {\n    this.el.style.setProperty('--js-tree-height', '100vh');\n    this.el.style.setProperty('--js-tree-height', this.el.clientHeight + 'px');\n  };\n\n  private observeTargets() {\n    this.addObserver(treeitem => {\n      this.expandTreeitem(treeitem);\n      this.setSelected(treeitem);\n      // TODO: Fix scroll issue in https://golang.org/issue/47450.\n      // treeitem.el.scrollIntoView({ block: 'nearest' });\n    });\n\n    const targets = new Map<string, boolean>();\n    const observer = new IntersectionObserver(\n      entries => {\n        for (const entry of entries) {\n          targets.set(entry.target.id, entry.isIntersecting || entry.intersectionRatio === 1);\n        }\n        for (const [id, isIntersecting] of targets) {\n          if (isIntersecting) {\n            const active = this.treeitems.find(t =>\n              (t.el as HTMLAnchorElement)?.href.endsWith(`#${id}`)\n            );\n            if (active) {\n              for (const fn of this.observerCallbacks) {\n                fn(active);\n              }\n            }\n            break;\n          }\n        }\n      },\n      {\n        threshold: 1.0,\n        rootMargin: '-60px 0px 0px 0px',\n      }\n    );\n\n    for (const href of this.treeitems.map(t => t.el.getAttribute('href'))) {\n      if (href) {\n        const id = href.replace(window.location.origin, '').replace('/', '').replace('#', '');\n        const target = document.getElementById(id);\n        if (target) {\n          observer.observe(target);\n        }\n      }\n    }\n  }\n\n  addObserver(fn: (t: TreeItem) => void, delay = 200): void {\n    this.observerCallbacks.push(debounce(fn, delay));\n  }\n\n  setFocusToNextItem(currentItem: TreeItem): void {\n    let nextItem = null;\n    for (let i = currentItem.index + 1; i < this.treeitems.length; i++) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        nextItem = ti;\n        break;\n      }\n    }\n    if (nextItem) {\n      this.setFocusToItem(nextItem);\n    }\n  }\n\n  setFocusToPreviousItem(currentItem: TreeItem): void {\n    let prevItem = null;\n    for (let i = currentItem.index - 1; i > -1; i--) {\n      const ti = this.treeitems[i];\n      if (ti.isVisible) {\n        prevItem = ti;\n        break;\n      }\n    }\n    if (prevItem) {\n      this.setFocusToItem(prevItem);\n    }\n  }\n\n  setFocusToParentItem(currentItem: TreeItem): void {\n    if (currentItem.groupTreeitem) {\n      this.setFocusToItem(currentItem.groupTreeitem);\n    }\n  }\n\n  setFocusToFirstItem(): void {\n    this.firstTreeitem && this.setFocusToItem(this.firstTreeitem);\n  }\n\n  setFocusToLastItem(): void {\n    this.lastTreeitem && this.setFocusToItem(this.lastTreeitem);\n  }\n\n  setSelected(currentItem: TreeItem): void {\n    for (const l1 of this.el.querySelectorAll('[aria-expanded=\"true\"]')) {\n      if (l1 === currentItem.el) continue;\n      if (!l1.nextElementSibling?.contains(currentItem.el)) {\n        l1.setAttribute('aria-expanded', 'false');\n      }\n    }\n    for (const l1 of this.el.querySelectorAll('[aria-selected]')) {\n      if (l1 !== currentItem.el) {\n        l1.setAttribute('aria-selected', 'false');\n      }\n    }\n    currentItem.el.setAttribute('aria-selected', 'true');\n    this.updateVisibleTreeitems();\n    this.setFocusToItem(currentItem, false);\n  }\n\n  expandTreeitem(treeitem: TreeItem): void {\n    let currentItem: TreeItem | null = treeitem;\n    while (currentItem) {\n      if (currentItem.isExpandable) {\n        currentItem.el.setAttribute('aria-expanded', 'true');\n      }\n      currentItem = currentItem.groupTreeitem;\n    }\n    this.updateVisibleTreeitems();\n  }\n\n  expandAllSiblingItems(currentItem: TreeItem): void {\n    for (const ti of this.treeitems) {\n      if (ti.groupTreeitem === currentItem.groupTreeitem && ti.isExpandable) {\n        this.expandTreeitem(ti);\n      }\n    }\n  }\n\n  collapseTreeitem(currentItem: TreeItem): void {\n    let groupTreeitem = null;\n\n    if (currentItem.isExpanded()) {\n      groupTreeitem = currentItem;\n    } else {\n      groupTreeitem = currentItem.groupTreeitem;\n    }\n\n    if (groupTreeitem) {\n      groupTreeitem.el.setAttribute('aria-expanded', 'false');\n      this.updateVisibleTreeitems();\n      this.setFocusToItem(groupTreeitem);\n    }\n  }\n\n  setFocusByFirstCharacter(currentItem: TreeItem, char: string): void {\n    let start: number, index: number;\n    char = char.toLowerCase();\n\n    // Get start index for search based on position of currentItem\n    start = currentItem.index + 1;\n    if (start === this.treeitems.length) {\n      start = 0;\n    }\n\n    // Check remaining slots in the menu\n    index = this.getIndexFirstChars(start, char);\n\n    // If not found in remaining slots, check from beginning\n    if (index === -1) {\n      index = this.getIndexFirstChars(0, char);\n    }\n\n    // If match was found...\n    if (index > -1) {\n      this.setFocusToItem(this.treeitems[index]);\n    }\n  }\n\n  private findTreeItems() {\n    const findItems = (el: HTMLElement, group: TreeItem | null) => {\n      let ti = group;\n      let curr = el.firstElementChild as HTMLElement;\n      while (curr) {\n        if (curr.tagName === 'A' || curr.tagName === 'SPAN') {\n          ti = new TreeItem(curr, this, group);\n          this.treeitems.push(ti);\n          this.firstChars.push(ti.label.substring(0, 1).toLowerCase());\n        }\n        if (curr.firstElementChild) {\n          findItems(curr, ti);\n        }\n        curr = curr.nextElementSibling as HTMLElement;\n      }\n    };\n    findItems(this.el as HTMLElement, null);\n    this.treeitems.map((ti, idx) => (ti.index = idx));\n  }\n\n  private updateVisibleTreeitems(): void {\n    this.firstTreeitem = this.treeitems[0];\n\n    for (const ti of this.treeitems) {\n      let parent = ti.groupTreeitem;\n      ti.isVisible = true;\n      while (parent && parent.el !== this.el) {\n        if (!parent.isExpanded()) {\n          ti.isVisible = false;\n        }\n        parent = parent.groupTreeitem;\n      }\n      if (ti.isVisible) {\n        this.lastTreeitem = ti;\n      }\n    }\n  }\n\n  private setFocusToItem(treeitem: TreeItem, focusEl = true) {\n    treeitem.el.tabIndex = 0;\n    if (focusEl) {\n      treeitem.el.focus();\n    }\n    for (const ti of this.treeitems) {\n      if (ti !== treeitem) {\n        ti.el.tabIndex = -1;\n      }\n    }\n  }\n\n  private getIndexFirstChars(startIndex: number, char: string): number {\n    for (let i = startIndex; i < this.firstChars.length; i++) {\n      if (this.treeitems[i].isVisible && char === this.firstChars[i]) {\n        return i;\n      }\n    }\n    return -1;\n  }\n}\n\nclass TreeItem {\n  el: HTMLElement;\n  groupTreeitem: TreeItem | null;\n  label: string;\n  isExpandable: boolean;\n  isVisible: boolean;\n  depth: number;\n  index: number;\n\n  private tree: TreeNavController;\n  private isInGroup: boolean;\n\n  constructor(el: HTMLElement, treeObj: TreeNavController, group: TreeItem | null) {\n    el.tabIndex = -1;\n    this.el = el;\n    this.groupTreeitem = group;\n    this.label = el.textContent?.trim() ?? '';\n    this.tree = treeObj;\n    this.depth = (group?.depth || 0) + 1;\n    this.index = 0;\n\n    const parent = el.parentElement;\n    if (parent?.tagName.toLowerCase() === 'li') {\n      parent?.setAttribute('role', 'none');\n    }\n    el.setAttribute('aria-level', this.depth + '');\n    if (el.getAttribute('aria-label')) {\n      this.label = el?.getAttribute('aria-label')?.trim() ?? '';\n    }\n\n    this.isExpandable = false;\n    this.isVisible = false;\n    this.isInGroup = !!group;\n\n    let curr = el.nextElementSibling;\n    while (curr) {\n      if (curr.tagName.toLowerCase() == 'ul') {\n        const groupId = `${group?.label ?? ''} nav group ${this.label}`.replace(/[\\W_]+/g, '_');\n        el.setAttribute('aria-owns', groupId);\n        el.setAttribute('aria-expanded', 'false');\n        curr.setAttribute('role', 'group');\n        curr.setAttribute('id', groupId);\n        this.isExpandable = true;\n        break;\n      }\n\n      curr = curr.nextElementSibling;\n    }\n    this.init();\n  }\n\n  private init() {\n    this.el.tabIndex = -1;\n    if (!this.el.getAttribute('role')) {\n      this.el.setAttribute('role', 'treeitem');\n    }\n    this.el.addEventListener('keydown', this.handleKeydown.bind(this));\n    this.el.addEventListener('click', this.handleClick.bind(this));\n    this.el.addEventListener('focus', this.handleFocus.bind(this));\n    this.el.addEventListener('blur', this.handleBlur.bind(this));\n  }\n\n  isExpanded() {\n    if (this.isExpandable) {\n      return this.el.getAttribute('aria-expanded') === 'true';\n    }\n\n    return false;\n  }\n\n  isSelected() {\n    return this.el.getAttribute('aria-selected') === 'true';\n  }\n\n  private handleClick(event: MouseEvent) {\n    // only process click events that directly happened on this treeitem\n    if (event.target !== this.el && event.target !== this.el.firstElementChild) {\n      return;\n    }\n    if (this.isExpandable) {\n      if (this.isExpanded() && this.isSelected()) {\n        this.tree.collapseTreeitem(this);\n      } else {\n        this.tree.expandTreeitem(this);\n      }\n      event.stopPropagation();\n    }\n    this.tree.setSelected(this);\n  }\n\n  private handleFocus() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.add('focus');\n  }\n\n  private handleBlur() {\n    let el = this.el;\n    if (this.isExpandable) {\n      el = (el.firstElementChild as HTMLElement) ?? el;\n    }\n    el.classList.remove('focus');\n  }\n\n  private handleKeydown(event: KeyboardEvent) {\n    if (event.altKey || event.ctrlKey || event.metaKey) {\n      return;\n    }\n\n    let captured = false;\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        if (this.isExpandable) {\n          if (this.isExpanded() && this.isSelected()) {\n            this.tree.collapseTreeitem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n          captured = true;\n        } else {\n          event.stopPropagation();\n        }\n        this.tree.setSelected(this);\n        break;\n\n      case 'ArrowUp':\n        this.tree.setFocusToPreviousItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowDown':\n        this.tree.setFocusToNextItem(this);\n        captured = true;\n        break;\n\n      case 'ArrowRight':\n        if (this.isExpandable) {\n          if (this.isExpanded()) {\n            this.tree.setFocusToNextItem(this);\n          } else {\n            this.tree.expandTreeitem(this);\n          }\n        }\n        captured = true;\n        break;\n\n      case 'ArrowLeft':\n        if (this.isExpandable && this.isExpanded()) {\n          this.tree.collapseTreeitem(this);\n          captured = true;\n        } else {\n          if (this.isInGroup) {\n            this.tree.setFocusToParentItem(this);\n            captured = true;\n          }\n        }\n        break;\n\n      case 'Home':\n        this.tree.setFocusToFirstItem();\n        captured = true;\n        break;\n\n      case 'End':\n        this.tree.setFocusToLastItem();\n        captured = true;\n        break;\n\n      default:\n        if (event.key.length === 1 && event.key.match(/\\S/)) {\n          if (event.key == '*') {\n            this.tree.expandAllSiblingItems(this);\n          } else {\n            this.tree.setFocusByFirstCharacter(this, event.key);\n          }\n          captured = true;\n        }\n        break;\n    }\n\n    if (captured) {\n      event.stopPropagation();\n      event.preventDefault();\n    }\n  }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction debounce<T extends (...args: any[]) => any>(func: T, wait: number) {\n  let timeout: ReturnType<typeof setTimeout> | null;\n  return (...args: Parameters<T>) => {\n    const later = () => {\n      timeout = null;\n      func(...args);\n    };\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(later, wait);\n  };\n}\n", "/*!\n * @license\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/**\n * Controller for a table element with expandable rows. Adds event listeners to\n * a toggle within a table row that controls visiblity of additional related\n * rows in the table.\n *\n * @example\n * ```typescript\n * import {ExpandableRowsTableController} from '/static/js/table';\n *\n * const el = document .querySelector<HTMLTableElement>('.js-myTableElement')\n * new ExpandableRowsTableController(el));\n * ```\n */\nexport class ExpandableRowsTableController {\n  private rows: HTMLTableRowElement[];\n  private toggles: HTMLButtonElement[];\n\n  /**\n   * Create a table controller.\n   * @param table - The table element to which the controller binds.\n   */\n  constructor(private table: HTMLTableElement, private toggleAll?: HTMLButtonElement | null) {\n    this.rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('[data-aria-controls]'));\n    this.toggles = Array.from(this.table.querySelectorAll('[aria-expanded]'));\n    this.setAttributes();\n    this.attachEventListeners();\n    this.update();\n  }\n\n  /**\n   * setAttributes sets data-aria-* and data-id attributes to regular\n   * html attributes as a workaround for limitations from safehtml.\n   */\n  private setAttributes() {\n    for (const a of ['data-aria-controls', 'data-aria-labelledby', 'data-id']) {\n      this.table.querySelectorAll(`[${a}]`).forEach(t => {\n        t.setAttribute(a.replace('data-', ''), t.getAttribute(a) ?? '');\n        t.removeAttribute(a);\n      });\n    }\n  }\n\n  private attachEventListeners() {\n    this.rows.forEach(t => {\n      t.addEventListener('click', e => {\n        this.handleToggleClick(e);\n      });\n    });\n    this.toggleAll?.addEventListener('click', () => {\n      this.expandAllItems();\n    });\n\n    document.addEventListener('keydown', e => {\n      if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n        this.expandAllItems();\n      }\n    });\n  }\n\n  private handleToggleClick(e: MouseEvent) {\n    let target = e.currentTarget as HTMLTableRowElement | null;\n    if (!target?.hasAttribute('aria-expanded')) {\n      target = this.table.querySelector(\n        `button[aria-controls=\"${target?.getAttribute('aria-controls')}\"]`\n      );\n    }\n    const isExpanded = target?.getAttribute('aria-expanded') === 'true';\n    target?.setAttribute('aria-expanded', isExpanded ? 'false' : 'true');\n    e.stopPropagation();\n    this.update();\n  }\n\n  expandAllItems = (): void => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'true'));\n    this.update();\n  };\n\n  private collapseAllItems = () => {\n    this.toggles.map(t => t.setAttribute('aria-expanded', 'false'));\n    this.update();\n  };\n\n  private update = () => {\n    this.updateVisibleItems();\n    setTimeout(() => this.updateGlobalToggle());\n  };\n\n  private updateVisibleItems() {\n    this.rows.map(t => {\n      const isExpanded = t?.getAttribute('aria-expanded') === 'true';\n      const rowIds = t?.getAttribute('aria-controls')?.trimEnd().split(' ');\n      rowIds?.map(id => {\n        const target = document.getElementById(`${id}`);\n        if (isExpanded) {\n          target?.classList.add('visible');\n          target?.classList.remove('hidden');\n        } else {\n          target?.classList.add('hidden');\n          target?.classList.remove('visible');\n        }\n      });\n    });\n  }\n\n  private updateGlobalToggle() {\n    if (!this.toggleAll) return;\n    if (this.rows.some(t => t.hasAttribute('aria-expanded'))) {\n      this.toggleAll.style.display = 'block';\n    }\n    const someCollapsed = this.toggles.some(el => el.getAttribute('aria-expanded') === 'false');\n    if (someCollapsed) {\n      this.toggleAll.innerText = 'Expand all';\n      this.toggleAll.onclick = this.expandAllItems;\n    } else {\n      this.toggleAll.innerText = 'Collapse all';\n      this.toggleAll.onclick = this.collapseAllItems;\n    }\n  }\n}\n", "import { initPlaygrounds } from 'static/shared/playground/playground';\nimport { SelectNavController, makeSelectNav } from 'static/shared/outline/select';\nimport { TreeNavController } from 'static/shared/outline/tree';\nimport { ExpandableRowsTableController } from 'static/shared/table/table';\n\ninitPlaygrounds();\n\nconst directories = document.querySelector<HTMLTableElement>('.js-expandableTable');\nif (directories) {\n  const table = new ExpandableRowsTableController(\n    directories,\n    document.querySelector<HTMLButtonElement>('.js-expandAllDirectories')\n  );\n  // Expand directories on page load with expand-directories query param.\n  if (window.location.search.includes('expand-directories')) {\n    table.expandAllItems();\n  }\n}\n\nconst treeEl = document.querySelector<HTMLElement>('.js-tree');\nif (treeEl) {\n  const treeCtrl = new TreeNavController(treeEl);\n  const select = makeSelectNav(treeCtrl);\n  const mobileNav = document.querySelector('.js-mainNavMobile');\n  if (mobileNav && mobileNav.firstElementChild) {\n    mobileNav?.replaceChild(select, mobileNav.firstElementChild);\n  }\n  if (select.firstElementChild) {\n    new SelectNavController(select.firstElementChild);\n  }\n}\n\n/**\n * Event handlers for expanding and collapsing the readme section.\n */\nconst readme = document.querySelector('.js-readme');\nconst readmeContent = document.querySelector('.js-readmeContent');\nconst readmeOutline = document.querySelector('.js-readmeOutline');\nconst readmeExpand = document.querySelectorAll('.js-readmeExpand');\nconst readmeCollapse = document.querySelector('.js-readmeCollapse');\nconst mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');\nif (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {\n  if (readme.clientHeight > 320) {\n    readme?.classList.remove('UnitReadme--expanded');\n    readme?.classList.add('UnitReadme--toggle');\n  }\n  if (window.location.hash.includes('readme')) {\n    expandReadme();\n  }\n  mobileNavSelect?.addEventListener('change', e => {\n    if ((e.target as HTMLSelectElement).value.startsWith('readme-')) {\n      expandReadme();\n    }\n  });\n  readmeExpand.forEach(el =>\n    el.addEventListener('click', e => {\n      e.preventDefault();\n      expandReadme();\n      readme.scrollIntoView();\n    })\n  );\n  readmeCollapse.addEventListener('click', e => {\n    e.preventDefault();\n    readme.classList.remove('UnitReadme--expanded');\n    if (readmeExpand[1]) {\n      readmeExpand[1].scrollIntoView({ block: 'center' });\n    }\n  });\n  readmeContent.addEventListener('keyup', () => {\n    expandReadme();\n  });\n  readmeContent.addEventListener('click', () => {\n    expandReadme();\n  });\n  readmeOutline.addEventListener('click', () => {\n    expandReadme();\n  });\n  document.addEventListener('keydown', e => {\n    if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n      expandReadme();\n    }\n  });\n}\n\n/**\n * expandReadme expands the readme and adds the section-readme hash to the\n * URL so it stays expanded when navigating back from an external link.\n */\nfunction expandReadme() {\n  history.replaceState(null, '', `${location.pathname}#section-readme`);\n  readme?.classList.add('UnitReadme--expanded');\n}\n\n/**\n * Expand details items that are focused. This will expand\n * deprecated symbols when they are navigated to from the index\n * or a direct link.\n */\nfunction openDeprecatedSymbol() {\n  if (!location.hash) return;\n  const heading = document.getElementById(location.hash.slice(1));\n  const grandParent = heading?.parentElement?.parentElement as HTMLDetailsElement | null;\n  if (grandParent?.nodeName === 'DETAILS') {\n    grandParent.open = true;\n  }\n}\nopenDeprecatedSymbol();\nwindow.addEventListener('hashchange', () => openDeprecatedSymbol());\n\n/**\n * Listen for changes in the build context dropdown.\n */\ndocument.querySelectorAll('.js-buildContextSelect').forEach(el => {\n  el.addEventListener('change', e => {\n    window.location.search = `?GOOS=${(e.target as HTMLSelectElement).value}`;\n  });\n});\n"],
+  "mappings": "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",
   "names": []
 }
diff --git a/static/frontend/unit/main/main.min.css b/static/frontend/unit/main/main.min.css
index ef7fe34..282845f 100644
--- a/static/frontend/unit/main/main.min.css
+++ b/static/frontend/unit/main/main.min.css
@@ -3,7 +3,7 @@
  * Use of this source code is governed by a BSD-style
  * license that can be found in the LICENSE file.
  */
-.UnitBuildContext-titleContext label,.UnitBuildContext-singleContext{color:var(--color-text-subtle);font-size:.875rem}.UnitBuildContext-singleContext{padding:.35rem 0}.UnitBuildContext-titleContext select{border-color:var(--color-border);color:var(--color-text-subtle);margin-left:.25rem;min-width:6rem}.UnitBuildContext-titleContext option{color:var(--color-text-subtle)}.UnitBuildContext-link{display:none}@media only screen and (min-width: 30rem){.UnitBuildContext-link{display:initial}}.UnitDoc .UnitBuildContext-titleContext{position:relative}.UnitDoc .UnitBuildContext-titleContext label,.UnitDoc .UnitBuildContext-singleContext{bottom:.875rem;position:absolute;right:0}.UnitDirectories{margin-bottom:2rem}.UnitDirectories h2 a.UnitDirectories-idLink,.UnitDirectories summary a{opacity:0}.UnitDirectories h2:hover a,.UnitDirectories summary:focus a{opacity:1}.UnitDirectories-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitDirectories-title img{margin:auto 1rem auto 0}.UnitDirectories-table{border-collapse:collapse;height:0;table-layout:auto;width:100%}.UnitDirectories-table--tree{margin-top:-2rem}.UnitDirectories-tableHeader{background-color:var(--color-background-accented)}.UnitDirectories-tableHeader--tree{visibility:hidden}.UnitDirectories td{border-bottom:var(--border);max-width:32rem;min-width:12rem;padding:.25rem 1rem;vertical-align:middle;word-break:break-word}.UnitDirectories th{padding:.5rem 1rem;text-align:left}.UnitDirectories tr.hidden{display:none}.UnitDirectories tr[aria-controls]{cursor:pointer}.UnitDirectories tr[aria-controls]:hover{background-color:var(--color-background-accented)}.UnitDirectories th.UnitDirectories-toggleHead{font-size:0;max-width:.625rem;padding:0;width:.625rem}.UnitDirectories td.UnitDirectories-toggleCell,th.UnitDirectories-toggleCell{background-color:var(--background);border:var(--white);max-width:.625rem;padding:0;width:.625rem}.UnitDirectories-toggleButton{font-size:1.25rem;left:-.75rem;margin:0 0 -1rem -.875rem;padding:0;position:absolute;vertical-align:top}.UnitDirectories-subSpacer{border-right:var(--border);display:inline;margin-right:.875rem;width:.0625rem}.UnitDirectories-toggleButton[aria-expanded=true] img{transform:rotate(90deg)}.UnitDirectories-pathCell{align-items:flex-start;display:flex;flex-direction:column;line-height:1.75rem;word-break:break-all}.UnitDirectories-pathCell>div{position:relative}.UnitDirectories-subdirectory{border-left:var(--border);display:flex;flex-direction:column;margin-left:.375rem;padding:.5rem 1rem}.UnitDirectories-mobileSynopsis{display:none;line-height:1.25rem;margin-top:.25rem;word-break:keep-all}@media only screen and (max-width: 52rem){.UnitDirectories-mobileSynopsis{display:initial}.UnitDirectories-table th.UnitDirectories-desktopSynopsis,.UnitDirectories-table td.UnitDirectories-desktopSynopsis{display:none}}.UnitDirectories-expandButton{position:relative}.UnitDirectories-expandButton button{background-color:transparent;border:none;bottom:1rem;color:var(--color-brand-primary);cursor:pointer;display:none;font-size:.875rem;position:absolute;right:0;text-decoration:none}.UnitDirectories-badge{border:.0625rem solid var(--color-text-subtle);border-radius:.125rem;font-size:.6875rem;font-weight:500;line-height:1rem;margin-left:.5rem;margin-top:.125rem;padding:0 .35rem;text-align:center}.UnitDoc{margin-bottom:2rem;word-break:break-word}.UnitDoc h2 a.UnitDoc-idLink,.UnitDoc summary a{opacity:0}.UnitDoc h2:hover a,.UnitDoc summary:focus a{opacity:1}.UnitDoc-title{border-bottom:var(--border);padding-bottom:1rem}.UnitDoc-title img{margin:auto 1rem auto 0}.UnitDoc-emptySection{background-color:var(--color-background-accented);color:var(--gray-2);height:12.25rem;margin-top:1.5rem;text-align:center}.UnitDoc-emptySection img{height:7.8125rem;width:auto}.UnitDoc-emptySection p{margin:1rem auto}.UnitDoc .Documentation h4{margin-top:1.5rem}.Documentation{display:block}.Documentation p{margin:1rem 0}.Documentation h2,.Documentation h3{margin-top:1.5rem}.Documentation a{text-decoration:none}.Documentation a:hover{text-decoration:underline}.Documentation h2 a,.Documentation h3 a,.Documentation h4 a.Documentation-idLink,.Documentation summary a{opacity:0}.Documentation a:focus{opacity:1}.Documentation h3 a.Documentation-source{opacity:1}.Documentation h2:hover a,.Documentation h3:hover a,.Documentation h4:hover a,.Documentation summary:hover a,.Documentation summary:focus a{opacity:1}.Documentation ul{line-height:1.5rem;list-style:none;padding-left:0}.Documentation ul ul{padding-left:2em}.Documentation pre+pre{margin-top:.625rem}.Documentation .Documentation-declarationLink+pre{border-radius:0 0 .3em .3em;border-top:var(--border);margin-top:0}.Documentation pre .comment{color:var(--color-code-comment)}.Documentation-toc,.Documentation-overview,.Documentation-index,.Documentation-examples{padding-bottom:0}.Documentation-empty{color:var(--color-text-subtle);margin-top:-.5rem}@media only screen and (min-width: 64rem){.Documentation-toc{margin-left:2rem;white-space:nowrap}.Documentation-toc-columns{columns:2}}.Documentation-toc:empty{display:none}.Documentation-tocItem{overflow:hidden;text-overflow:ellipsis}.Documentation-tocItem--constants,.Documentation-tocItem--funcsAndTypes,.Documentation-tocItem--functions,.Documentation-tocItem--types,.Documentation-tocItem--variables,.Documentation-tocItem--notes{display:none}.Documentation-overviewHeader,.Documentation-indexHeader,.Documentation-constantsHeader,.Documentation-variablesHeader,.Documentation-examplesHeader,.Documentation-filesHeader,.Documentation-functionHeader,.Documentation-typeHeader,.Documentation-typeMethodHeader,.Documentation-typeFuncHeader{margin-bottom:.5rem}.Documentation-function h4,.Documentation-type h4,.Documentation-typeFunc h4,.Documentation-typeMethod h4{align-items:baseline;display:flex;justify-content:space-between}.Documentation-sinceVersion{color:var(--color-text-subtle);font-size:.9375rem;font-weight:400}.Documentation-constants br:last-of-type,.Documentation-variables br:last-of-type{display:none}.Documentation-build{color:var(--color-text-subtle);padding-top:1.5rem;text-align:right}.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem)}@media only screen and (min-width: 64rem){.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + .75rem)}}.Documentation-declaration+.Documentation-declaration{margin-top:.625rem}.Documentation-declarationLink{background-color:var(--color-background-accented);border:var(--border);border-bottom:none;border-radius:.3em .3em 0 0;display:block;font-size:.75rem;line-height:.5rem;padding:.375rem;text-align:right}.Documentation-exampleButtonsContainer{align-items:center;display:flex;justify-content:flex-end;margin-top:.5rem}.Documentation-examplePlayButton{background-color:var(--white);border:.15rem solid var(--turq-med);color:var(--turq-med);cursor:pointer;flex-shrink:0;height:2.5rem;width:4.125rem}.Documentation-exampleRunButton,.Documentation-exampleShareButton,.Documentation-exampleFormatButton{border:.0625rem solid var(--turq-dark);border-radius:.25rem;cursor:pointer;height:2rem;margin-left:.5rem;padding:0 1rem}.Documentation-exampleRunButton{background-color:var(--turq-dark);color:var(--white)}.Documentation-exampleShareButton,.Documentation-exampleFormatButton{background-color:var(--white);color:var(--turq-dark)}.Documentation-exampleDetails{margin-top:1rem}.Documentation-exampleDetailsBody pre{border-radius:0 0 .3rem .3rem;margin-bottom:1rem;margin-top:-.25rem}.Documentation-exampleDetailsBody textarea{height:100%;outline:none;overflow-x:auto;resize:none;white-space:pre;width:100%}.Documentation-exampleDetailsBody .Documentation-exampleCode{border-bottom-left-radius:0;border-bottom-right-radius:0;margin:0}.Documentation-exampleDetailsBody .Documentation-exampleOutput{border-top-left-radius:0;border-top-right-radius:0;margin:0 0 .5rem}.Documentation-exampleDetailsHeader{color:var(--color-brand-primary);cursor:pointer;margin-bottom:2rem;outline:none;text-decoration:none}.Documentation-exampleOutputLabel{color:var(--color-text-subtle)}.Documentation-exampleError{color:var(--pink);margin-right:.4rem;padding-right:.5rem}.Documentation-function pre,.Documentation-typeFunc pre,.Documentation-typeMethod pre{white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.Documentation-indexDeprecated{margin-left:.5rem}.Documentation-deprecatedBody{color:var(--color-text-subtle);font-size:.87rem;font-weight:400;margin-left:.25rem;margin-right:.5rem}.Documentation-deprecatedTag{background-color:var(--color-border);border-radius:.125rem;color:var(--color-text-inverted);font-size:.75rem;font-weight:400;line-height:1.375;padding:.125rem .25rem;text-transform:uppercase;vertical-align:middle}.Documentation-deprecatedTitle{align-items:center;display:flex;gap:.5rem}.Documentation-deprecatedDetails,.Documentation-deprecatedDetails a{color:var(--color-text-subtle)}.Documentation-deprecatedDetails[open]{color:var(--color-text)}.Documentation-deprecatedDetails[open] a{color:var(--color-brand-primary)}.Documentation-deprecatedDetails .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Show"}.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Hide"}.Documentation-deprecatedDetails>summary{list-style:none;opacity:1}.Documentation-deprecatedDetails .Documentation-source{opacity:1}.Documentation-deprecatedItemBody{padding:1rem 1rem .5rem}.Documentation-deprecatedMessage{align-items:center;display:flex;gap:.5rem;margin-bottom:1rem}.UnitFiles{margin-bottom:2rem}.UnitFiles-titleLink{position:relative}.UnitFiles-titleLink a{bottom:1rem;font-size:.875rem;position:absolute;right:0}.UnitFiles-titleLink a:after{background-image:url(/static/shared/icon/launch_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:.875rem 1.25rem;content:"";display:inline-block;height:1rem;left:.3125rem;position:relative;top:.125rem;width:1rem}.UnitFiles h2 a.UnitFiles-idLink,.UnitFiles summary a{opacity:0}.UnitFiles h2:hover a,.UnitFiles summary:focus a{opacity:1}.UnitFiles-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitFiles-title img{margin:auto 1rem auto 0}.UnitFiles-fileList{column-count:5;column-width:12.5rem;line-height:1.5rem;list-style:none;margin-top:1rem;padding-left:0;word-break:break-all}.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.UnitOutline-jumpTo{display:flex;margin-bottom:1rem}.UnitOutline-jumpTo button{align-items:center;background-color:var(--color-background);border:var(--border);border-radius:.25rem;color:var(--color-text-subtle);cursor:pointer;height:2rem;padding-left:1rem;text-align:left;width:100%}.UnitOutline-jumpTo button:hover:not([disabled]){border-color:var(--color-border)}.UnitOutline-jumpToInput:disabled{background-color:var(--gray-9)}.Overview-readmeContent details{display:block}.Overview-readmeContent summary{display:list-item}.Overview-readmeContent a{background-color:initial}.Overview-readmeContent a:active,.Overview-readmeContent a:hover{outline-width:0}.Overview-readmeContent strong{font-weight:inherit;font-weight:bolder}.Overview-readmeContent h3{font-size:2em;margin:.67em 0}.Overview-readmeContent img{border-style:none}.Overview-readmeContent code,.Overview-readmeContent kbd,.Overview-readmeContent pre{font-family:monospace,monospace;font-size:1em}.Overview-readmeContent hr{box-sizing:initial;height:0;overflow:visible}.Overview-readmeContent input{font:inherit;margin:0}.Overview-readmeContent input{overflow:visible}.Overview-readmeContent [type=checkbox]{box-sizing:border-box;padding:0}.Overview-readmeContent *{box-sizing:border-box}.Overview-readmeContent input{font-family:inherit;font-size:inherit;line-height:inherit}.Overview-readmeContent a{color:var(--color-brand-primary);text-decoration:none}.Overview-readmeContent a:hover{text-decoration:underline}.Overview-readmeContent strong{font-weight:600}.Overview-readmeContent hr{height:0;margin:.9375rem 0;overflow:hidden;background:transparent;border:0;border-bottom:var(--border)}.Overview-readmeContent hr:after,.Overview-readmeContent hr:before{display:table;content:""}.Overview-readmeContent hr:after{clear:both}.Overview-readmeContent table{border-spacing:0;border-collapse:collapse}.Overview-readmeContent td,.Overview-readmeContent th{padding:0}.Overview-readmeContent details summary{cursor:pointer}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--border)}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:0;margin-bottom:0}.Overview-readmeContent h3{font-size:2rem}.Overview-readmeContent h3,.Overview-readmeContent h4{font-weight:600}.Overview-readmeContent h4{font-size:1.5rem}.Overview-readmeContent h5{font-size:1.25rem}.Overview-readmeContent h5,.Overview-readmeContent h6{font-weight:600}.Overview-readmeContent h6{font-size:1rem}.Overview-readmeContent div[aria-level="7"]{font-size:.875rem}.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{font-weight:600}.Overview-readmeContent div[aria-level="8"]{font-size:.75rem}.Overview-readmeContent p{margin-top:0;margin-bottom:.625rem}.Overview-readmeContent blockquote{margin:0}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:0;margin-top:0;margin-bottom:0}.Overview-readmeContent ol ol,.Overview-readmeContent ul ol{list-style-type:lower-roman}.Overview-readmeContent ol ol ol,.Overview-readmeContent ol ul ol,.Overview-readmeContent ul ol ol,.Overview-readmeContent ul ul ol{list-style-type:lower-alpha}.Overview-readmeContent dd{margin-left:0}.Overview-readmeContent code,.Overview-readmeContent pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75rem}.Overview-readmeContent pre{margin-top:0;margin-bottom:0}.Overview-readmeContent input::-webkit-inner-spin-button,.Overview-readmeContent input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.Overview-readmeContent :checked+.radio-label{position:relative;z-index:1;border-color:var(--color-brand-primary)}.Overview-readmeContent hr{border-bottom-color:var(--color-border)}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--color-border)}.Overview-readmeContent a:not([href]){color:inherit;text-decoration:none}.Overview-readmeContent blockquote,.Overview-readmeContent details,.Overview-readmeContent dl,.Overview-readmeContent ol,.Overview-readmeContent p,.Overview-readmeContent pre,.Overview-readmeContent table,.Overview-readmeContent ul{margin-top:0;margin-bottom:1rem}.Overview-readmeContent hr{height:.25em;padding:0;margin:1.5rem 0;background-color:var(--color-border);border:0}.Overview-readmeContent blockquote{padding:0 1em;color:var(--color-text-subtle);border-left:.25em solid var(--color-border)}.Overview-readmeContent blockquote>:first-child{margin-top:0}.Overview-readmeContent blockquote>:last-child{margin-bottom:0}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:1.5rem;margin-bottom:1rem;font-weight:600;line-height:1.25}.Overview-readmeContent h3{font-size:2em}.Overview-readmeContent h3,.Overview-readmeContent h4{padding-bottom:.3em;border-bottom:var(--border)}.Overview-readmeContent h4{font-size:1.5em}.Overview-readmeContent h5{font-size:1.25em}.Overview-readmeContent h6{font-size:1em}.Overview-readmeContent div[aria-level="7"]{font-size:.875em}.Overview-readmeContent div[aria-level="8"]{font-size:.85em;color:var(--color-text-subtle)}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:2em}.Overview-readmeContent ol ol,.Overview-readmeContent ol ul,.Overview-readmeContent ul ol,.Overview-readmeContent ul ul{margin-top:0;margin-bottom:0}.Overview-readmeContent li{word-wrap:break-all}.Overview-readmeContent li>p{margin-top:1rem}.Overview-readmeContent li+li{margin-top:.25em}.Overview-readmeContent dl{padding:0}.Overview-readmeContent dl dt{padding:0;margin-top:1rem;font-size:1em;font-style:italic;font-weight:600}.Overview-readmeContent dl dd{padding:0 1rem;margin-bottom:1rem}.Overview-readmeContent table{display:block;width:100%;overflow:auto}.Overview-readmeContent table th{font-weight:600}.Overview-readmeContent table td,.Overview-readmeContent table th{padding:.375rem .8125rem;border:var(--border)}.Overview-readmeContent table tr{background-color:var(--color-background);border-top:var(--border)}.Overview-readmeContent table tr:nth-child(2n){background-color:var(--color-background-accented)}.Overview-readmeContent img{max-width:100%;box-sizing:initial;background-color:var(--color-background)}.Overview-readmeContent img[align=right]{padding-left:1.25rem}.Overview-readmeContent img[align=left]{padding-right:1.25rem}.Overview-readmeContent code{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre{word-wrap:normal}.Overview-readmeContent pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.Overview-readmeContent pre{padding:1rem;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}.UnitReadme{margin-bottom:2rem}.UnitReadme ul,.UnitReadme ol{list-style:circle}.UnitReadme h2 a.UnitReadme-idLink,.UnitReadme summary a{opacity:0}.UnitReadme h2:hover a,.UnitReadme summary:focus a{opacity:1}.UnitReadme-title{border-bottom:var(--border);font-size:1.375rem;padding-bottom:1rem}.UnitReadme-title img{margin:auto 1rem auto 0}.UnitReadme-content{-webkit-mask-image:linear-gradient(to bottom,black 75%,transparent 100%);mask-image:linear-gradient(to bottom,black 75%,transparent 100%);max-height:20rem;overflow:hidden;position:relative}.UnitReadme-content ul{line-height:1.5rem}.UnitReadme-expandLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;padding:0}.UnitReadme-collapseLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;padding:0}.UnitReadme--expanded .UnitReadme-content{-webkit-mask-image:none;mask-image:none;max-height:initial;overflow:initial}.UnitReadme--expanded .UnitReadme-expandLink{display:none}.UnitReadme--expanded .UnitReadme-collapseLink{display:block}.Overview-readmeContent{overflow-wrap:break-word}.UnitDetails{column-gap:2rem;display:grid;grid-template-columns:minmax(0,auto);margin:auto;min-height:32rem}@media only screen and (min-width: 64rem){.UnitDetails{grid-template-columns:15.5rem minmax(30.5rem,43.125rem) minmax(10rem,15.5rem)}}@media only screen and (min-width: 80rem){.UnitDetails{grid-template-columns:15.5rem minmax(43.125rem,60rem) 15.5rem;justify-content:center}}.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 2.15)}@media only screen and (min-width: 64rem){.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 1.25)}}.UnitDetails :target:not(details,h2){background-color:var(--color-background-highlighted);padding:.25rem}.UnitDetails-meta{order:-1}@media only screen and (min-width: 64rem){.UnitDetails-meta{display:block;margin-top:2rem;order:initial}}.UnitDetails-contentEmpty{align-items:center;background-color:var(--color-background-accented);color:var(--color-text-subtle);display:flex;flex-direction:column;height:15rem;padding-top:1rem;text-align:center}.UnitDetails-contentEmpty img{height:7.8125rem;width:auto}
+.UnitBuildContext-titleContext label,.UnitBuildContext-singleContext{color:var(--color-text-subtle);font-size:.875rem}.UnitBuildContext-singleContext{padding:.35rem 0}.UnitBuildContext-titleContext select{border-color:var(--color-border);color:var(--color-text-subtle);margin-left:.25rem;min-width:6rem}.UnitBuildContext-titleContext option{color:var(--color-text-subtle)}.UnitBuildContext-link{display:none}@media only screen and (min-width: 30rem){.UnitBuildContext-link{display:initial}}.UnitDoc .UnitBuildContext-titleContext{position:relative}.UnitDoc .UnitBuildContext-titleContext label,.UnitDoc .UnitBuildContext-singleContext{bottom:.875rem;position:absolute;right:0}.UnitDirectories{margin-bottom:2rem}.UnitDirectories h2 a.UnitDirectories-idLink,.UnitDirectories summary a{opacity:0}.UnitDirectories h2:hover a,.UnitDirectories summary:focus a{opacity:1}.UnitDirectories-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitDirectories-title img{margin:auto 1rem auto 0}.UnitDirectories-table{border-collapse:collapse;height:0;table-layout:auto;width:100%}.UnitDirectories-table--tree{margin-top:-2rem}.UnitDirectories-tableHeader{background-color:var(--color-background-accented)}.UnitDirectories-tableHeader--tree{visibility:hidden}.UnitDirectories td{border-bottom:var(--border);max-width:32rem;min-width:12rem;padding:.25rem 1rem;vertical-align:middle;word-break:break-word}.UnitDirectories th{padding:.5rem 1rem;text-align:left}.UnitDirectories tr.hidden{display:none}.UnitDirectories tr[aria-controls]{cursor:pointer}.UnitDirectories tr[aria-controls]:hover{background-color:var(--color-background-accented)}.UnitDirectories th.UnitDirectories-toggleHead{font-size:0;max-width:.625rem;padding:0;width:.625rem}.UnitDirectories td.UnitDirectories-toggleCell,th.UnitDirectories-toggleCell{background-color:var(--background);border:var(--white);max-width:.625rem;padding:0;width:.625rem}.UnitDirectories-toggleButton{font-size:1.25rem;left:-.75rem;margin:0 0 -1rem -.875rem;padding:0;position:absolute;vertical-align:top}.UnitDirectories-subSpacer{border-right:var(--border);display:inline;margin-right:.875rem;width:.0625rem}.UnitDirectories-toggleButton[aria-expanded=true] img{transform:rotate(90deg)}.UnitDirectories-pathCell{align-items:flex-start;display:flex;flex-direction:column;line-height:1.75rem;word-break:break-all}.UnitDirectories-pathCell>div{position:relative}.UnitDirectories-subdirectory{border-left:var(--border);display:flex;flex-direction:column;margin-left:.375rem;padding:.5rem 1rem}.UnitDirectories-mobileSynopsis{display:none;line-height:1.25rem;margin-top:.25rem;word-break:keep-all}@media only screen and (max-width: 52rem){.UnitDirectories-mobileSynopsis{display:initial}.UnitDirectories-table th.UnitDirectories-desktopSynopsis,.UnitDirectories-table td.UnitDirectories-desktopSynopsis{display:none}}.UnitDirectories-expandButton{position:relative}.UnitDirectories-expandButton button{background-color:transparent;border:none;bottom:1rem;color:var(--color-brand-primary);cursor:pointer;display:none;font-size:.875rem;position:absolute;right:0;text-decoration:none}.UnitDirectories-badge{border:.0625rem solid var(--color-text-subtle);border-radius:.125rem;font-size:.6875rem;font-weight:500;line-height:1rem;margin-left:.5rem;margin-top:.125rem;padding:0 .35rem;text-align:center}.UnitDoc{margin-bottom:2rem;word-break:break-word}.UnitDoc h2 a.UnitDoc-idLink,.UnitDoc summary a{opacity:0}.UnitDoc h2:hover a,.UnitDoc summary:focus a{opacity:1}.UnitDoc-title{border-bottom:var(--border);padding-bottom:1rem}.UnitDoc-title img{margin:auto 1rem auto 0}.UnitDoc-emptySection{background-color:var(--color-background-accented);color:var(--gray-2);height:12.25rem;margin-top:1.5rem;text-align:center}.UnitDoc-emptySection img{height:7.8125rem;width:auto}.UnitDoc-emptySection p{margin:1rem auto}.UnitDoc .Documentation h4{margin-top:1.5rem}.Documentation{display:block}.Documentation p{margin:1rem 0}.Documentation h2,.Documentation h3{margin-top:1.5rem}.Documentation a{text-decoration:none}.Documentation a:hover{text-decoration:underline}.Documentation h2 a,.Documentation h3 a,.Documentation h4 a.Documentation-idLink,.Documentation summary a{opacity:0}.Documentation a:focus{opacity:1}.Documentation h3 a.Documentation-source{opacity:1}.Documentation h2:hover a,.Documentation h3:hover a,.Documentation h4:hover a,.Documentation summary:hover a,.Documentation summary:focus a{opacity:1}.Documentation ul{line-height:1.5rem;list-style:none;padding-left:0}.Documentation ul ul{padding-left:2em}.Documentation pre+pre{margin-top:.625rem}.Documentation .Documentation-declarationLink+pre{border-radius:0 0 .3em .3em;border-top:var(--border);margin-top:0}.Documentation pre .comment{color:var(--color-code-comment)}.Documentation-toc,.Documentation-overview,.Documentation-index,.Documentation-examples{padding-bottom:0}.Documentation-empty{color:var(--color-text-subtle);margin-top:-.5rem}@media only screen and (min-width: 64rem){.Documentation-toc{margin-left:2rem;white-space:nowrap}.Documentation-toc-columns{columns:2}}.Documentation-toc:empty{display:none}.Documentation-tocItem{overflow:hidden;text-overflow:ellipsis}.Documentation-tocItem--constants,.Documentation-tocItem--funcsAndTypes,.Documentation-tocItem--functions,.Documentation-tocItem--types,.Documentation-tocItem--variables,.Documentation-tocItem--notes{display:none}.Documentation-overviewHeader,.Documentation-indexHeader,.Documentation-constantsHeader,.Documentation-variablesHeader,.Documentation-examplesHeader,.Documentation-filesHeader,.Documentation-functionHeader,.Documentation-typeHeader,.Documentation-typeMethodHeader,.Documentation-typeFuncHeader{margin-bottom:.5rem}.Documentation-function h4,.Documentation-type h4,.Documentation-typeFunc h4,.Documentation-typeMethod h4{align-items:baseline;display:flex;justify-content:space-between}.Documentation-sinceVersion{color:var(--color-text-subtle);font-size:.9375rem;font-weight:400}.Documentation-constants br:last-of-type,.Documentation-variables br:last-of-type{display:none}.Documentation-build{color:var(--color-text-subtle);padding-top:1.5rem;text-align:right}.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem)}@media only screen and (min-width: 64rem){.Documentation-declaration pre{scroll-padding-top:calc(var(--js-sticky-header-height, 3.5rem) + .75rem)}}.Documentation-declaration+.Documentation-declaration{margin-top:.625rem}.Documentation-declarationLink{background-color:var(--color-background-accented);border:var(--border);border-bottom:none;border-radius:.3em .3em 0 0;display:block;font-size:.75rem;line-height:.5rem;padding:.375rem;text-align:right}.Documentation-exampleButtonsContainer{align-items:center;display:flex;justify-content:flex-end;margin-top:.5rem}.Documentation-examplePlayButton{background-color:var(--white);border:.15rem solid var(--turq-med);color:var(--turq-med);cursor:pointer;flex-shrink:0;height:2.5rem;width:4.125rem}.Documentation-exampleRunButton,.Documentation-exampleShareButton,.Documentation-exampleFormatButton{border:.0625rem solid var(--turq-dark);border-radius:.25rem;cursor:pointer;height:2rem;margin-left:.5rem;padding:0 1rem}.Documentation-exampleRunButton{background-color:var(--turq-dark);color:var(--white)}.Documentation-exampleShareButton,.Documentation-exampleFormatButton{background-color:var(--white);color:var(--turq-dark)}.Documentation-exampleDetails{margin-top:1rem}.Documentation-exampleDetailsBody pre{border-radius:0 0 .3rem .3rem;margin-bottom:1rem;margin-top:-.25rem}.Documentation-exampleDetailsBody textarea{height:100%;outline:none;overflow-x:auto;resize:none;white-space:pre;width:100%}.Documentation-exampleDetailsBody .Documentation-exampleCode{border-bottom-left-radius:0;border-bottom-right-radius:0;margin:0}.Documentation-exampleDetailsBody .Documentation-exampleOutput{border-top-left-radius:0;border-top-right-radius:0;margin:0 0 .5rem}.Documentation-exampleDetailsHeader{color:var(--color-brand-primary);cursor:pointer;margin-bottom:2rem;outline:none;text-decoration:none}.Documentation-exampleOutputLabel{color:var(--color-text-subtle)}.Documentation-exampleError{color:var(--pink);margin-right:.4rem;padding-right:.5rem}.Documentation-function pre,.Documentation-typeFunc pre,.Documentation-typeMethod pre{white-space:pre-wrap;word-break:break-all;word-wrap:break-word}.Documentation-indexDeprecated{margin-left:.5rem}.Documentation-deprecatedBody{color:var(--color-text-subtle);font-size:.87rem;font-weight:400;margin-left:.25rem;margin-right:.5rem}.Documentation-deprecatedTag{background-color:var(--color-border);border-radius:.125rem;color:var(--color-text-inverted);font-size:.75rem;font-weight:400;line-height:1.375;padding:.125rem .25rem;text-transform:uppercase;vertical-align:middle}.Documentation-deprecatedTitle{align-items:center;display:flex;gap:.5rem}.Documentation-deprecatedDetails,.Documentation-deprecatedDetails a{color:var(--color-text-subtle)}.Documentation-deprecatedDetails[open]{color:var(--color-text)}.Documentation-deprecatedDetails[open] a{color:var(--color-brand-primary)}.Documentation-deprecatedDetails .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Show"}.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody:after{color:var(--color-brand-primary);content:"Hide"}.Documentation-deprecatedDetails>summary{list-style:none;opacity:1}.Documentation-deprecatedDetails .Documentation-source{opacity:1}.Documentation-deprecatedItemBody{padding:1rem 1rem .5rem}.Documentation-deprecatedMessage{align-items:center;display:flex;gap:.5rem;margin-bottom:1rem}.UnitFiles{margin-bottom:2rem}.UnitFiles-titleLink{position:relative}.UnitFiles-titleLink a{bottom:1rem;font-size:.875rem;position:absolute;right:0}.UnitFiles-titleLink a:after{background-image:url(/static/shared/icon/launch_gm_grey_24dp.svg);background-repeat:no-repeat;background-size:.875rem 1.25rem;content:"";display:inline-block;height:1rem;left:.3125rem;position:relative;top:.125rem;width:1rem}.UnitFiles h2 a.UnitFiles-idLink,.UnitFiles summary a{opacity:0}.UnitFiles h2:hover a,.UnitFiles summary:focus a{opacity:1}.UnitFiles-title{border-bottom:var(--border);font-size:1.375rem;margin:.5rem 0 0;padding-bottom:1rem}.UnitFiles-title img{margin:auto 1rem auto 0}.UnitFiles-fileList{column-count:5;column-width:12.5rem;line-height:1.5rem;list-style:none;margin-top:1rem;padding-left:0;word-break:break-all}.UnitMeta{display:grid;gap:1rem 2rem;grid-template-columns:max-content auto;white-space:nowrap}.UnitMeta-details,.UnitMeta-links{display:flex;flex-flow:wrap;flex-direction:row;gap:1rem 2rem}.UnitMeta-repo{align-items:center;display:flex}.UnitMeta-repo a{overflow:hidden;text-overflow:ellipsis}@media (min-width: 50rem){.UnitMeta{grid-template-columns:max-content auto}.UnitMeta-details,.UnitMeta-links{flex-direction:row}}@media (min-width: 112rem){:root[data-layout=responsive] .UnitMeta{grid-template-columns:100%}:root[data-layout=responsive] .UnitMeta-details,:root[data-layout=responsive] .UnitMeta-links{flex-direction:column;white-space:nowrap}}.UnitMeta-detailsLearn{width:100%}@media (min-width: 50rem){.UnitMeta-detailsLearn{width:initial}}.UnitOutline-jumpTo{display:flex;margin-bottom:1rem}.UnitOutline-jumpTo button{align-items:center;background-color:var(--color-background);border:var(--border);border-radius:.25rem;color:var(--color-text-subtle);cursor:pointer;height:2rem;padding-left:1rem;text-align:left;width:100%}.UnitOutline-jumpTo button:hover:not([disabled]){border-color:var(--color-border)}.UnitOutline-jumpToInput:disabled{background-color:var(--gray-9)}.Overview-readmeContent details{display:block}.Overview-readmeContent summary{display:list-item}.Overview-readmeContent a{background-color:initial}.Overview-readmeContent a:active,.Overview-readmeContent a:hover{outline-width:0}.Overview-readmeContent strong{font-weight:inherit;font-weight:bolder}.Overview-readmeContent h3{font-size:2em;margin:.67em 0}.Overview-readmeContent img{border-style:none}.Overview-readmeContent code,.Overview-readmeContent kbd,.Overview-readmeContent pre{font-family:monospace,monospace;font-size:1em}.Overview-readmeContent hr{box-sizing:initial;height:0;overflow:visible}.Overview-readmeContent input{font:inherit;margin:0}.Overview-readmeContent input{overflow:visible}.Overview-readmeContent [type=checkbox]{box-sizing:border-box;padding:0}.Overview-readmeContent *{box-sizing:border-box}.Overview-readmeContent input{font-family:inherit;font-size:inherit;line-height:inherit}.Overview-readmeContent a{color:var(--color-brand-primary);text-decoration:none}.Overview-readmeContent a:hover{text-decoration:underline}.Overview-readmeContent strong{font-weight:600}.Overview-readmeContent hr{height:0;margin:.9375rem 0;overflow:hidden;background:transparent;border:0;border-bottom:var(--border)}.Overview-readmeContent hr:after,.Overview-readmeContent hr:before{display:table;content:""}.Overview-readmeContent hr:after{clear:both}.Overview-readmeContent table{border-spacing:0;border-collapse:collapse}.Overview-readmeContent td,.Overview-readmeContent th{padding:0}.Overview-readmeContent details summary{cursor:pointer}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--border)}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:0;margin-bottom:0}.Overview-readmeContent h3{font-size:2rem}.Overview-readmeContent h3,.Overview-readmeContent h4{font-weight:600}.Overview-readmeContent h4{font-size:1.5rem}.Overview-readmeContent h5{font-size:1.25rem}.Overview-readmeContent h5,.Overview-readmeContent h6{font-weight:600}.Overview-readmeContent h6{font-size:1rem}.Overview-readmeContent div[aria-level="7"]{font-size:.875rem}.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{font-weight:600}.Overview-readmeContent div[aria-level="8"]{font-size:.75rem}.Overview-readmeContent p{margin-top:0;margin-bottom:.625rem}.Overview-readmeContent blockquote{margin:0}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:0;margin-top:0;margin-bottom:0}.Overview-readmeContent ol ol,.Overview-readmeContent ul ol{list-style-type:lower-roman}.Overview-readmeContent ol ol ol,.Overview-readmeContent ol ul ol,.Overview-readmeContent ul ol ol,.Overview-readmeContent ul ul ol{list-style-type:lower-alpha}.Overview-readmeContent dd{margin-left:0}.Overview-readmeContent code,.Overview-readmeContent pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:.75rem}.Overview-readmeContent pre{margin-top:0;margin-bottom:0}.Overview-readmeContent input::-webkit-inner-spin-button,.Overview-readmeContent input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}.Overview-readmeContent :checked+.radio-label{position:relative;z-index:1;border-color:var(--color-brand-primary)}.Overview-readmeContent hr{border-bottom-color:var(--color-border)}.Overview-readmeContent kbd{display:inline-block;padding:.1875rem .3125rem;font:.6875rem SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:.625rem;color:#444d56;vertical-align:middle;background-color:var(--color-background-accented);border:var(--border);border-radius:.1875rem;box-shadow:inset 0 -.0625rem 0 var(--color-border)}.Overview-readmeContent a:not([href]){color:inherit;text-decoration:none}.Overview-readmeContent blockquote,.Overview-readmeContent details,.Overview-readmeContent dl,.Overview-readmeContent ol,.Overview-readmeContent p,.Overview-readmeContent pre,.Overview-readmeContent table,.Overview-readmeContent ul{margin-top:0;margin-bottom:1rem}.Overview-readmeContent hr{height:.25em;padding:0;margin:1.5rem 0;background-color:var(--color-border);border:0}.Overview-readmeContent blockquote{padding:0 1em;color:var(--color-text-subtle);border-left:.25em solid var(--color-border)}.Overview-readmeContent blockquote>:first-child{margin-top:0}.Overview-readmeContent blockquote>:last-child{margin-bottom:0}.Overview-readmeContent h3,.Overview-readmeContent h4,.Overview-readmeContent h5,.Overview-readmeContent h6,.Overview-readmeContent div[aria-level="7"],.Overview-readmeContent div[aria-level="8"]{margin-top:1.5rem;margin-bottom:1rem;font-weight:600;line-height:1.25}.Overview-readmeContent h3{font-size:2em}.Overview-readmeContent h3,.Overview-readmeContent h4{padding-bottom:.3em;border-bottom:var(--border)}.Overview-readmeContent h4{font-size:1.5em}.Overview-readmeContent h5{font-size:1.25em}.Overview-readmeContent h6{font-size:1em}.Overview-readmeContent div[aria-level="7"]{font-size:.875em}.Overview-readmeContent div[aria-level="8"]{font-size:.85em;color:var(--color-text-subtle)}.Overview-readmeContent ol,.Overview-readmeContent ul{padding-left:2em}.Overview-readmeContent ol ol,.Overview-readmeContent ol ul,.Overview-readmeContent ul ol,.Overview-readmeContent ul ul{margin-top:0;margin-bottom:0}.Overview-readmeContent li{word-wrap:break-all}.Overview-readmeContent li>p{margin-top:1rem}.Overview-readmeContent li+li{margin-top:.25em}.Overview-readmeContent dl{padding:0}.Overview-readmeContent dl dt{padding:0;margin-top:1rem;font-size:1em;font-style:italic;font-weight:600}.Overview-readmeContent dl dd{padding:0 1rem;margin-bottom:1rem}.Overview-readmeContent table{display:block;width:100%;overflow:auto}.Overview-readmeContent table th{font-weight:600}.Overview-readmeContent table td,.Overview-readmeContent table th{padding:.375rem .8125rem;border:var(--border)}.Overview-readmeContent table tr{background-color:var(--color-background);border-top:var(--border)}.Overview-readmeContent table tr:nth-child(2n){background-color:var(--color-background-accented)}.Overview-readmeContent img{max-width:100%;box-sizing:initial;background-color:var(--color-background)}.Overview-readmeContent img[align=right]{padding-left:1.25rem}.Overview-readmeContent img[align=left]{padding-right:1.25rem}.Overview-readmeContent code{padding:.2em .4em;margin:0;font-size:85%;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre{word-wrap:normal}.Overview-readmeContent pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.Overview-readmeContent pre{padding:1rem;overflow:auto;font-size:85%;line-height:1.45;background-color:var(--color-background-accented);border-radius:.1875rem}.Overview-readmeContent pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}.UnitReadme{margin-bottom:2rem}.UnitReadme ul,.UnitReadme ol{list-style:circle}.UnitReadme h2 a.UnitReadme-idLink,.UnitReadme summary a{opacity:0}.UnitReadme h2:hover a,.UnitReadme summary:focus a{opacity:1}.UnitReadme-title{border-bottom:var(--border);font-size:1.375rem;padding-bottom:1rem}.UnitReadme-title img{margin:auto 1rem auto 0}.UnitReadme-content{-webkit-mask-image:linear-gradient(to bottom,black 75%,transparent 100%);mask-image:linear-gradient(to bottom,black 75%,transparent 100%);max-height:20rem;overflow:hidden;position:relative}.UnitReadme-content ul{line-height:1.5rem}.UnitReadme-expandLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;padding:0}.UnitReadme-collapseLink{background:none;border:none;color:var(--color-brand-primary);cursor:pointer;display:none;padding:0}.UnitReadme--expanded .UnitReadme-content{-webkit-mask-image:none;mask-image:none;max-height:initial;overflow:initial}.UnitReadme--toggle .UnitReadme-expandLink{display:block}.UnitReadme--expanded .UnitReadme-expandLink{display:none}.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink{display:block}.Overview-readmeContent{overflow-wrap:break-word}.UnitDetails{column-gap:2rem;display:grid;grid-template-columns:minmax(0,auto);margin:auto;min-height:32rem}@media only screen and (min-width: 64rem){.UnitDetails{grid-template-columns:15.5rem minmax(30.5rem,43.125rem) minmax(10rem,15.5rem)}}@media only screen and (min-width: 80rem){.UnitDetails{grid-template-columns:15.5rem minmax(43.125rem,60rem) 15.5rem;justify-content:center}}.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 2.15)}@media only screen and (min-width: 64rem){.UnitDetails :target{scroll-margin-top:calc(var(--js-sticky-header-height, 3.5rem) * 1.25)}}.UnitDetails :target:not(details,h2){background-color:var(--color-background-highlighted);padding:.25rem}.UnitDetails-meta{order:-1}@media only screen and (min-width: 64rem){.UnitDetails-meta{display:block;margin-top:2rem;order:initial}}.UnitDetails-contentEmpty{align-items:center;background-color:var(--color-background-accented);color:var(--color-text-subtle);display:flex;flex-direction:column;height:15rem;padding-top:1rem;text-align:center}.UnitDetails-contentEmpty img{height:7.8125rem;width:auto}
 /*!
  * Copyright 2020 The Go Authors. All rights reserved.
  * Use of this source code is governed by a BSD-style
diff --git a/static/frontend/unit/main/main.min.css.map b/static/frontend/unit/main/main.min.css.map
index 4eb7141..cedd269 100644
--- a/static/frontend/unit/main/main.min.css.map
+++ b/static/frontend/unit/main/main.min.css.map
@@ -1,7 +1,7 @@
 {
   "version": 3,
   "sources": ["_build-context.css", "_directories.css", "_doc.css", "_files.css", "_meta.css", "_outline.css", "_readme_gen.css", "_readme.css", "main.css"],
-  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitBuildContext-titleContext label,\n.UnitBuildContext-singleContext {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n}\n.UnitBuildContext-singleContext {\n  padding: 0.35rem 0;\n}\n.UnitBuildContext-titleContext select {\n  border-color: var(--color-border);\n  color: var(--color-text-subtle);\n  margin-left: 0.25rem;\n  min-width: 6rem;\n}\n.UnitBuildContext-titleContext option {\n  color: var(--color-text-subtle);\n}\n.UnitBuildContext-link {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .UnitBuildContext-link {\n    display: initial;\n  }\n}\n\n.UnitDoc .UnitBuildContext-titleContext {\n  position: relative;\n}\n.UnitDoc .UnitBuildContext-titleContext label,\n.UnitDoc .UnitBuildContext-singleContext {\n  bottom: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitDirectories {\n  margin-bottom: 2rem;\n}\n.UnitDirectories h2 a.UnitDirectories-idLink,\n.UnitDirectories summary a {\n  opacity: 0;\n}\n.UnitDirectories h2:hover a,\n.UnitDirectories summary:focus a {\n  opacity: 1;\n}\n.UnitDirectories-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitDirectories-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDirectories-table {\n  border-collapse: collapse;\n  height: 0;\n  table-layout: auto;\n  width: 100%;\n}\n.UnitDirectories-table--tree {\n  margin-top: -2rem;\n}\n.UnitDirectories-tableHeader {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories-tableHeader--tree {\n  visibility: hidden;\n}\n.UnitDirectories td {\n  border-bottom: var(--border);\n  max-width: 32rem;\n  min-width: 12rem;\n  padding: 0.25rem 1rem;\n  vertical-align: middle;\n  word-break: break-word;\n}\n.UnitDirectories th {\n  padding: 0.5rem 1rem;\n  text-align: left;\n}\n.UnitDirectories tr.hidden {\n  display: none;\n}\n.UnitDirectories tr[aria-controls] {\n  cursor: pointer;\n}\n.UnitDirectories tr[aria-controls]:hover {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories th.UnitDirectories-toggleHead {\n  font-size: 0;\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories td.UnitDirectories-toggleCell,\nth.UnitDirectories-toggleCell {\n  background-color: var(--background);\n  border: var(--white);\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories-toggleButton {\n  font-size: 1.25rem;\n  left: -0.75rem;\n  margin: 0 0 -1rem -0.875rem;\n  padding: 0;\n  position: absolute;\n  vertical-align: top;\n}\n.UnitDirectories-subSpacer {\n  border-right: var(--border);\n  display: inline;\n  margin-right: 0.875rem;\n  width: 0.0625rem;\n}\n.UnitDirectories-toggleButton[aria-expanded='true'] img {\n  transform: rotate(90deg);\n}\n.UnitDirectories-pathCell {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  line-height: 1.75rem;\n  word-break: break-all;\n}\n.UnitDirectories-pathCell > div {\n  position: relative;\n}\n.UnitDirectories-subdirectory {\n  border-left: var(--border);\n  display: flex;\n  flex-direction: column;\n  margin-left: 0.375rem;\n  padding: 0.5rem 1rem;\n}\n.UnitDirectories-mobileSynopsis {\n  display: none;\n  line-height: 1.25rem;\n  margin-top: 0.25rem;\n  word-break: keep-all;\n}\n@media only screen and (max-width: 52rem) {\n  .UnitDirectories-mobileSynopsis {\n    display: initial;\n  }\n  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,\n  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {\n    display: none;\n  }\n}\n.UnitDirectories-expandButton {\n  position: relative;\n}\n.UnitDirectories-expandButton button {\n  background-color: transparent;\n  border: none;\n  bottom: 1rem;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n  text-decoration: none;\n}\n.UnitDirectories-badge {\n  border: 0.0625rem solid var(--color-text-subtle);\n  border-radius: 0.125rem;\n  font-size: 0.6875rem;\n  font-weight: 500;\n  line-height: 1rem;\n  margin-left: 0.5rem;\n  margin-top: 0.125rem;\n  padding: 0 0.35rem;\n  text-align: center;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* stylelint-disable no-descending-specificity */\n.UnitDoc {\n  margin-bottom: 2rem;\n  word-break: break-word;\n}\n.UnitDoc h2 a.UnitDoc-idLink,\n.UnitDoc summary a {\n  opacity: 0;\n}\n.UnitDoc h2:hover a,\n.UnitDoc summary:focus a {\n  opacity: 1;\n}\n.UnitDoc-title {\n  border-bottom: var(--border);\n  padding-bottom: 1rem;\n}\n.UnitDoc-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDoc-emptySection {\n  background-color: var(--color-background-accented);\n  color: var(--gray-2);\n  height: 12.25rem;\n  margin-top: 1.5rem;\n  text-align: center;\n}\n.UnitDoc-emptySection img {\n  height: 7.8125rem;\n  width: auto;\n}\n.UnitDoc-emptySection p {\n  margin: 1rem auto;\n}\n.UnitDoc .Documentation h4 {\n  margin-top: 1.5rem;\n}\n.Documentation {\n  display: block;\n}\n.Documentation p {\n  margin: 1rem 0;\n}\n.Documentation h2,\n.Documentation h3 {\n  margin-top: 1.5rem;\n}\n.Documentation a {\n  text-decoration: none;\n}\n.Documentation a:hover {\n  text-decoration: underline;\n}\n.Documentation h2 a,\n.Documentation h3 a,\n.Documentation h4 a.Documentation-idLink,\n.Documentation summary a {\n  opacity: 0;\n}\n.Documentation a:focus {\n  opacity: 1;\n}\n.Documentation h3 a.Documentation-source {\n  opacity: 1;\n}\n.Documentation h2:hover a,\n.Documentation h3:hover a,\n.Documentation h4:hover a,\n.Documentation summary:hover a,\n.Documentation summary:focus a {\n  opacity: 1;\n}\n.Documentation ul {\n  line-height: 1.5rem;\n  list-style: none;\n  padding-left: 0;\n}\n.Documentation ul ul {\n  padding-left: 2em;\n}\n\n.Documentation pre + pre {\n  margin-top: 0.625rem;\n}\n\n.Documentation .Documentation-declarationLink + pre {\n  border-radius: 0 0 0.3em 0.3em;\n  border-top: var(--border);\n  margin-top: 0;\n}\n.Documentation pre .comment {\n  color: var(--color-code-comment);\n}\n\n.Documentation-toc,\n.Documentation-overview,\n.Documentation-index,\n.Documentation-examples {\n  padding-bottom: 0;\n}\n.Documentation-empty {\n  color: var(--color-text-subtle);\n  margin-top: -0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-toc {\n    margin-left: 2rem;\n    white-space: nowrap;\n  }\n  .Documentation-toc-columns {\n    columns: 2;\n  }\n}\n.Documentation-toc:empty {\n  display: none;\n}\n.Documentation-tocItem {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.Documentation-tocItem--constants,\n.Documentation-tocItem--funcsAndTypes,\n.Documentation-tocItem--functions,\n.Documentation-tocItem--types,\n.Documentation-tocItem--variables,\n.Documentation-tocItem--notes {\n  display: none;\n}\n\n.Documentation-overviewHeader,\n.Documentation-indexHeader,\n.Documentation-constantsHeader,\n.Documentation-variablesHeader,\n.Documentation-examplesHeader,\n.Documentation-filesHeader,\n.Documentation-functionHeader,\n.Documentation-typeHeader,\n.Documentation-typeMethodHeader,\n.Documentation-typeFuncHeader {\n  margin-bottom: 0.5rem;\n}\n\n.Documentation-function h4,\n.Documentation-type h4,\n.Documentation-typeFunc h4,\n.Documentation-typeMethod h4 {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n.Documentation-sinceVersion {\n  color: var(--color-text-subtle);\n  font-size: 0.9375rem;\n  font-weight: 400;\n}\n\n.Documentation-constants br:last-of-type,\n.Documentation-variables br:last-of-type {\n  display: none;\n}\n\n.Documentation-build {\n  color: var(--color-text-subtle);\n  padding-top: 1.5rem;\n  text-align: right;\n}\n.Documentation-declaration pre {\n  scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem);\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-declaration pre {\n    scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 0.75rem);\n  }\n}\n.Documentation-declaration + .Documentation-declaration {\n  margin-top: 0.625rem;\n}\n.Documentation-declarationLink {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-bottom: none;\n  border-radius: 0.3em 0.3em 0 0;\n  display: block;\n  font-size: 0.75rem;\n  line-height: 0.5rem;\n  padding: 0.375rem;\n  text-align: right;\n}\n.Documentation-exampleButtonsContainer {\n  align-items: center;\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 0.5rem;\n}\n.Documentation-examplePlayButton {\n  background-color: var(--white);\n  border: 0.15rem solid var(--turq-med);\n  color: var(--turq-med);\n  cursor: pointer;\n  flex-shrink: 0;\n  height: 2.5rem;\n  width: 4.125rem;\n}\n.Documentation-exampleRunButton,\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  border: 0.0625rem solid var(--turq-dark);\n  border-radius: 0.25rem;\n  cursor: pointer;\n  height: 2rem;\n  margin-left: 0.5rem;\n  padding: 0 1rem;\n}\n.Documentation-exampleRunButton {\n  background-color: var(--turq-dark);\n  color: var(--white);\n}\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  background-color: var(--white);\n  color: var(--turq-dark);\n}\n.Documentation-exampleDetails {\n  margin-top: 1rem;\n}\n.Documentation-exampleDetailsBody pre {\n  border-radius: 0 0 0.3rem 0.3rem;\n  margin-bottom: 1rem;\n  margin-top: -0.25rem;\n}\n.Documentation-exampleDetailsBody textarea {\n  height: 100%;\n  outline: none;\n  overflow-x: auto;\n  resize: none;\n  white-space: pre;\n  width: 100%;\n}\n\n/**\n * We add another selector here to these two classes to increase CSS specificity,\n * the selector .Documentation pre + pre overrides .Documentation-exampleCode\n * and .Documentation-exampleOutput by itself and would replace the styles.\n */\n.Documentation-exampleDetailsBody .Documentation-exampleCode {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  margin: 0;\n}\n.Documentation-exampleDetailsBody .Documentation-exampleOutput {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  margin: 0 0 0.5rem;\n}\n.Documentation-exampleDetailsHeader {\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  margin-bottom: 2rem;\n  outline: none;\n  text-decoration: none;\n}\n.Documentation-exampleOutputLabel {\n  color: var(--color-text-subtle);\n}\n.Documentation-exampleError {\n  color: var(--pink);\n  margin-right: 0.4rem;\n  padding-right: 0.5rem;\n}\n\n/* See https://golang.org/issue/43368 for context. */\n.Documentation-function pre,\n.Documentation-typeFunc pre,\n.Documentation-typeMethod pre {\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n}\n\n.Documentation-indexDeprecated {\n  margin-left: 0.5rem;\n}\n.Documentation-deprecatedBody {\n  color: var(--color-text-subtle);\n  font-size: 0.87rem;\n  font-weight: 400;\n  margin-left: 0.25rem;\n  margin-right: 0.5rem;\n}\n.Documentation-deprecatedTag {\n  background-color: var(--color-border);\n  border-radius: 0.125rem;\n  color: var(--color-text-inverted);\n  font-size: 0.75rem;\n  font-weight: normal;\n  line-height: 1.375;\n  padding: 0.125rem 0.25rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n}\n.Documentation-deprecatedTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n}\n.Documentation-deprecatedDetails {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails a {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails[open] {\n  color: var(--color-text);\n}\n.Documentation-deprecatedDetails[open] a {\n  color: var(--color-brand-primary);\n}\n.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Show';\n}\n.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Hide';\n}\n.Documentation-deprecatedDetails > summary {\n  list-style: none;\n  opacity: 1;\n}\n.Documentation-deprecatedDetails .Documentation-source {\n  opacity: 1;\n}\n.Documentation-deprecatedItemBody {\n  padding: 1rem 1rem 0.5rem 1rem;\n}\n.Documentation-deprecatedMessage {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  margin-bottom: 1rem;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitFiles {\n  margin-bottom: 2rem;\n}\n.UnitFiles-titleLink {\n  position: relative;\n}\n.UnitFiles-titleLink a {\n  bottom: 1rem;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n.UnitFiles-titleLink a::after {\n  background-image: url(/static/shared/icon/launch_gm_grey_24dp.svg);\n  background-repeat: no-repeat;\n  background-size: 0.875rem 1.25rem;\n  content: '';\n  display: inline-block;\n  height: 1rem;\n  left: 0.3125rem;\n  position: relative;\n  top: 0.125rem;\n  width: 1rem;\n}\n.UnitFiles h2 a.UnitFiles-idLink,\n.UnitFiles summary a {\n  opacity: 0;\n}\n.UnitFiles h2:hover a,\n.UnitFiles summary:focus a {\n  opacity: 1;\n}\n.UnitFiles-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitFiles-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitFiles-fileList {\n  column-count: 5;\n  column-width: 12.5rem;\n  line-height: 1.5rem;\n  list-style: none;\n  margin-top: 1rem;\n  padding-left: 0;\n  word-break: break-all;\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n}\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitOutline-jumpTo {\n  display: flex;\n  margin-bottom: 1rem;\n}\n.UnitOutline-jumpTo button {\n  align-items: center;\n  background-color: var(--color-background);\n  border: var(--border);\n  border-radius: 0.25rem;\n  color: var(--color-text-subtle);\n  cursor: pointer;\n  height: 2rem;\n  padding-left: 1rem;\n  text-align: left;\n  width: 100%;\n}\n.UnitOutline-jumpTo button:hover:not([disabled]) {\n  border-color: var(--color-border);\n}\n.UnitOutline-jumpToInput:disabled {\n  background-color: var(--gray-9);\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n/* ---------- */\n/*\n/* The CSS classes below are generated using devtools/cmd/css/main.go\n/* If the generated CSS already exists, the file is overwritten\n/*\n/* ---------- */\n\n.Overview-readmeContent details {\n  display: block;\n}\n.Overview-readmeContent summary {\n  display: list-item;\n}\n.Overview-readmeContent a {\n  background-color: initial;\n}\n.Overview-readmeContent a:active,\n.Overview-readmeContent a:hover {\n  outline-width: 0;\n}\n.Overview-readmeContent strong {\n  font-weight: inherit;\n  font-weight: bolder;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.Overview-readmeContent img {\n  border-style: none;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent kbd,\n.Overview-readmeContent pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n.Overview-readmeContent hr {\n  box-sizing: initial;\n  height: 0;\n  overflow: visible;\n}\n.Overview-readmeContent input {\n  font: inherit;\n  margin: 0;\n}\n.Overview-readmeContent input {\n  overflow: visible;\n}\n.Overview-readmeContent [type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.Overview-readmeContent * {\n  box-sizing: border-box;\n}\n.Overview-readmeContent input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.Overview-readmeContent a {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\n.Overview-readmeContent a:hover {\n  text-decoration: underline;\n}\n.Overview-readmeContent strong {\n  font-weight: 600;\n}\n.Overview-readmeContent hr {\n  height: 0;\n  margin: 0.9375rem 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent hr:after,\n.Overview-readmeContent hr:before {\n  display: table;\n  content: '';\n}\n.Overview-readmeContent hr:after {\n  clear: both;\n}\n.Overview-readmeContent table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n.Overview-readmeContent td,\n.Overview-readmeContent th {\n  padding: 0;\n}\n.Overview-readmeContent details summary {\n  cursor: pointer;\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--border);\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3 {\n  font-size: 2rem;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  font-weight: 600;\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5rem;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25rem;\n}\n.Overview-readmeContent h5,\n.Overview-readmeContent h6 {\n  font-weight: 600;\n}\n.Overview-readmeContent h6 {\n  font-size: 1rem;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875rem;\n}\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  font-weight: 600;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.75rem;\n}\n.Overview-readmeContent p {\n  margin-top: 0;\n  margin-bottom: 0.625rem;\n}\n.Overview-readmeContent blockquote {\n  margin: 0;\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ul ol {\n  list-style-type: lower-roman;\n}\n.Overview-readmeContent ol ol ol,\n.Overview-readmeContent ol ul ol,\n.Overview-readmeContent ul ol ol,\n.Overview-readmeContent ul ul ol {\n  list-style-type: lower-alpha;\n}\n.Overview-readmeContent dd {\n  margin-left: 0;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent pre {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.75rem;\n}\n.Overview-readmeContent pre {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent input::-webkit-inner-spin-button,\n.Overview-readmeContent input::-webkit-outer-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n.Overview-readmeContent :checked + .radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: var(--color-brand-primary);\n}\n.Overview-readmeContent hr {\n  border-bottom-color: var(--color-border);\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--color-border);\n}\n.Overview-readmeContent a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n.Overview-readmeContent blockquote,\n.Overview-readmeContent details,\n.Overview-readmeContent dl,\n.Overview-readmeContent ol,\n.Overview-readmeContent p,\n.Overview-readmeContent pre,\n.Overview-readmeContent table,\n.Overview-readmeContent ul {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 1.5rem 0;\n  background-color: var(--color-border);\n  border: 0;\n}\n.Overview-readmeContent blockquote {\n  padding: 0 1em;\n  color: var(--color-text-subtle);\n  border-left: 0.25em solid var(--color-border);\n}\n.Overview-readmeContent blockquote > :first-child {\n  margin-top: 0;\n}\n.Overview-readmeContent blockquote > :last-child {\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 1.5rem;\n  margin-bottom: 1rem;\n  font-weight: 600;\n  line-height: 1.25;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  padding-bottom: 0.3em;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5em;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25em;\n}\n.Overview-readmeContent h6 {\n  font-size: 1em;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875em;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.85em;\n  color: var(--color-text-subtle);\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 2em;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ol ul,\n.Overview-readmeContent ul ol,\n.Overview-readmeContent ul ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent li {\n  word-wrap: break-all;\n}\n.Overview-readmeContent li > p {\n  margin-top: 1rem;\n}\n.Overview-readmeContent li + li {\n  margin-top: 0.25em;\n}\n.Overview-readmeContent dl {\n  padding: 0;\n}\n.Overview-readmeContent dl dt {\n  padding: 0;\n  margin-top: 1rem;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n.Overview-readmeContent dl dd {\n  padding: 0 1rem;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n.Overview-readmeContent table th {\n  font-weight: 600;\n}\n.Overview-readmeContent table td,\n.Overview-readmeContent table th {\n  padding: 0.375rem 0.8125rem;\n  border: var(--border);\n}\n.Overview-readmeContent table tr {\n  background-color: var(--color-background);\n  border-top: var(--border);\n}\n.Overview-readmeContent table tr:nth-child(2n) {\n  background-color: var(--color-background-accented);\n}\n.Overview-readmeContent img {\n  max-width: 100%;\n  box-sizing: initial;\n  background-color: var(--color-background);\n}\n.Overview-readmeContent img[align='right'] {\n  padding-left: 1.25rem;\n}\n.Overview-readmeContent img[align='left'] {\n  padding-right: 1.25rem;\n}\n.Overview-readmeContent code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre {\n  word-wrap: normal;\n}\n.Overview-readmeContent pre > code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n.Overview-readmeContent pre {\n  padding: 1rem;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: initial;\n  border: 0;\n}\n\n/* ---------- */\n/*\n/* End output from devtools/cmd/css/main.go\n/*\n/* ---------- */\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitReadme {\n  margin-bottom: 2rem;\n}\n.UnitReadme ul,\n.UnitReadme ol {\n  list-style: circle;\n}\n.UnitReadme h2 a.UnitReadme-idLink,\n.UnitReadme summary a {\n  opacity: 0;\n}\n.UnitReadme h2:hover a,\n.UnitReadme summary:focus a {\n  opacity: 1;\n}\n.UnitReadme-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  padding-bottom: 1rem;\n}\n.UnitReadme-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitReadme-content {\n  -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  max-height: 20rem;\n  overflow: hidden;\n  position: relative;\n}\n.UnitReadme-content ul {\n  line-height: 1.5rem;\n}\n.UnitReadme-expandLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  padding: 0;\n}\n.UnitReadme-collapseLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  padding: 0;\n}\n.UnitReadme--expanded .UnitReadme-content {\n  -webkit-mask-image: none;\n  mask-image: none;\n  max-height: initial;\n  overflow: initial;\n}\n.UnitReadme--expanded .UnitReadme-expandLink {\n  display: none;\n}\n.UnitReadme--expanded .UnitReadme-collapseLink {\n  display: block;\n}\n\n.Overview-readmeContent {\n  overflow-wrap: break-word;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_build-context.css');\n@import url('./_directories.css');\n@import url('./_doc.css');\n@import url('./_files.css');\n@import url('./_meta.css');\n@import url('./_outline.css');\n@import url('./_readme_gen.css');\n@import url('./_readme.css');\n\n.UnitDetails {\n  column-gap: 2rem;\n  display: grid;\n  grid-template-columns: minmax(0, auto);\n  margin: auto;\n  min-height: 32rem;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);\n  }\n}\n@media only screen and (min-width: 80rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;\n    justify-content: center;\n  }\n}\n.UnitDetails :target {\n  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails :target {\n    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);\n  }\n}\n\n.UnitDetails :target:not(details, h2) {\n  background-color: var(--color-background-highlighted);\n  padding: 0.25rem;\n}\n.UnitDetails-meta {\n  order: -1;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails-meta {\n    display: block;\n    margin-top: 2rem;\n    order: initial;\n  }\n}\n.UnitDetails-contentEmpty {\n  align-items: center;\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  height: 15rem;\n  padding-top: 1rem;\n  text-align: center;\n}\n.UnitDetails-contentEmpty img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
-  "mappings": ";;;;;AAMA,qEAEE,+BACA,kBAEF,gCAXA,iBAcA,sCACE,iCACA,+BACA,mBACA,eAEF,sCACE,+BAEF,uBACE,aAEF,0CACE,uBACE,iBAIJ,wCACE,kBAEF,uFAEE,eACA,kBACA,QCjCF,iBACE,mBAEF,wEAEE,UAEF,6DAEE,UAEF,uBACE,4BACA,mBAnBF,iBAqBE,oBAEF,2BAvBA,wBA0BA,uBACE,yBACA,SACA,kBACA,WAEF,6BACE,iBAEF,6BACE,kDAEF,mCACE,kBAEF,oBACE,4BACA,gBACA,gBA5CF,oBA8CE,sBACA,sBAEF,oBAjDA,mBAmDE,gBAEF,2BACE,aAEF,mCACE,eAEF,yCACE,kDAEF,+CACE,YACA,kBAhEF,UAkEE,cAEF,6EAEE,mCACA,oBACA,kBAxEF,UA0EE,cAEF,8BACE,kBACA,aA9EF,oCAiFE,kBACA,mBAEF,2BACE,2BACA,eACA,qBACA,eAEF,sDACE,wBAEF,0BACE,uBACA,aACA,sBACA,oBACA,qBAEF,8BACE,kBAEF,8BACE,0BACA,aACA,sBACA,oBA3GF,mBA8GA,gCACE,aACA,oBACA,kBACA,oBAEF,0CACE,gCACE,gBAEF,oHAEE,cAGJ,8BACE,kBAEF,qCACE,6BACA,YACA,YACA,iCACA,eACA,aACA,kBACA,kBACA,QACA,qBAEF,uBACE,+CA7IF,sBA+IE,mBACA,gBACA,iBACA,kBACA,mBAnJF,iBAqJE,kBC9IF,SACE,mBACA,sBAEF,gDAEE,UAEF,6CAEE,UAEF,eACE,4BACA,oBAEF,mBAvBA,wBA0BA,sBACE,kDACA,oBACA,gBACA,kBACA,kBAEF,0BACE,iBACA,WAEF,wBArCA,iBAwCA,2BACE,kBAEF,eACE,cAEF,iBA9CA,cAiDA,oCAEE,kBAEF,iBACE,qBAEF,uBACE,0BAEF,0GAIE,UAEF,uBACE,UAEF,yCACE,UAEF,4IAKE,UAEF,kBACE,mBACA,gBACA,eAEF,qBACE,iBAGF,uBACE,mBAGF,kDA3FA,4BA6FE,yBACA,aAEF,4BACE,gCAGF,wFAIE,iBAEF,qBACE,+BACA,kBAEF,0CACE,mBACE,iBACA,mBAEF,2BACE,WAGJ,yBACE,aAEF,uBACE,gBACA,uBAGF,wMAME,aAGF,sSAUE,oBAGF,0GAIE,qBACA,aACA,8BAEF,4BACE,+BACA,mBACA,gBAGF,kFAEE,aAGF,qBACE,+BACA,mBACA,iBAEF,+BACE,0EAEF,0CACE,+BACE,0EAGJ,sDACE,mBAEF,+BACE,kDACA,qBACA,mBA3LF,4BA6LE,cACA,iBACA,kBA/LF,gBAiME,iBAEF,uCACE,mBACA,aACA,yBACA,iBAEF,iCACE,8BACA,oCACA,sBACA,eACA,cACA,cACA,eAEF,qGAGE,uCArNF,qBAuNE,eACA,YACA,kBAzNF,eA4NA,gCACE,kCACA,mBAEF,qEAEE,8BACA,uBAEF,8BACE,gBAEF,sCAxOA,8BA0OE,mBACA,mBAEF,2CACE,YACA,aACA,gBACA,YACA,gBACA,WAQF,6DACE,4BACA,6BA7PF,SAgQA,+DACE,yBACA,0BAlQF,iBAqQA,oCACE,iCACA,eACA,mBACA,aACA,qBAEF,kCACE,+BAEF,4BACE,kBACA,mBACA,oBAIF,sFAGE,qBACA,qBACA,qBAGF,+BACE,kBAEF,8BACE,+BACA,iBACA,gBACA,mBACA,mBAEF,6BACE,qCAzSF,sBA2SE,iCACA,iBACA,gBACA,kBA9SF,uBAgTE,yBACA,sBAEF,+BACE,mBACA,aACA,UAEF,oEACE,+BAKF,uCACE,wBAEF,yCACE,iCAEF,qEACE,iCACA,eAEF,2EACE,iCACA,eAEF,yCACE,gBACA,UAEF,uDACE,UAEF,kCAnVA,wBAsVA,iCACE,mBACA,aACA,UACA,mBCpVF,WACE,mBAEF,qBACE,kBAEF,uBACE,YACA,kBACA,kBACA,QAEF,6BACE,kEACA,4BACA,gCACA,WACA,qBACA,YACA,cACA,kBACA,YACA,WAEF,sDAEE,UAEF,iDAEE,UAEF,iBACE,4BACA,mBAxCF,iBA0CE,oBAEF,qBA5CA,wBA+CA,oBACE,eACA,qBACA,mBACA,gBACA,gBACA,eACA,qBChDF,UACE,aACA,cACA,uCACA,mBAEF,kCAEE,aACA,eACA,mBACA,cAEF,eACE,mBACA,aAEF,iBACE,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",
+  "sourcesContent": ["/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitBuildContext-titleContext label,\n.UnitBuildContext-singleContext {\n  color: var(--color-text-subtle);\n  font-size: 0.875rem;\n}\n.UnitBuildContext-singleContext {\n  padding: 0.35rem 0;\n}\n.UnitBuildContext-titleContext select {\n  border-color: var(--color-border);\n  color: var(--color-text-subtle);\n  margin-left: 0.25rem;\n  min-width: 6rem;\n}\n.UnitBuildContext-titleContext option {\n  color: var(--color-text-subtle);\n}\n.UnitBuildContext-link {\n  display: none;\n}\n@media only screen and (min-width: 30rem) {\n  .UnitBuildContext-link {\n    display: initial;\n  }\n}\n\n.UnitDoc .UnitBuildContext-titleContext {\n  position: relative;\n}\n.UnitDoc .UnitBuildContext-titleContext label,\n.UnitDoc .UnitBuildContext-singleContext {\n  bottom: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitDirectories {\n  margin-bottom: 2rem;\n}\n.UnitDirectories h2 a.UnitDirectories-idLink,\n.UnitDirectories summary a {\n  opacity: 0;\n}\n.UnitDirectories h2:hover a,\n.UnitDirectories summary:focus a {\n  opacity: 1;\n}\n.UnitDirectories-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitDirectories-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDirectories-table {\n  border-collapse: collapse;\n  height: 0;\n  table-layout: auto;\n  width: 100%;\n}\n.UnitDirectories-table--tree {\n  margin-top: -2rem;\n}\n.UnitDirectories-tableHeader {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories-tableHeader--tree {\n  visibility: hidden;\n}\n.UnitDirectories td {\n  border-bottom: var(--border);\n  max-width: 32rem;\n  min-width: 12rem;\n  padding: 0.25rem 1rem;\n  vertical-align: middle;\n  word-break: break-word;\n}\n.UnitDirectories th {\n  padding: 0.5rem 1rem;\n  text-align: left;\n}\n.UnitDirectories tr.hidden {\n  display: none;\n}\n.UnitDirectories tr[aria-controls] {\n  cursor: pointer;\n}\n.UnitDirectories tr[aria-controls]:hover {\n  background-color: var(--color-background-accented);\n}\n.UnitDirectories th.UnitDirectories-toggleHead {\n  font-size: 0;\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories td.UnitDirectories-toggleCell,\nth.UnitDirectories-toggleCell {\n  background-color: var(--background);\n  border: var(--white);\n  max-width: 0.625rem;\n  padding: 0;\n  width: 0.625rem;\n}\n.UnitDirectories-toggleButton {\n  font-size: 1.25rem;\n  left: -0.75rem;\n  margin: 0 0 -1rem -0.875rem;\n  padding: 0;\n  position: absolute;\n  vertical-align: top;\n}\n.UnitDirectories-subSpacer {\n  border-right: var(--border);\n  display: inline;\n  margin-right: 0.875rem;\n  width: 0.0625rem;\n}\n.UnitDirectories-toggleButton[aria-expanded='true'] img {\n  transform: rotate(90deg);\n}\n.UnitDirectories-pathCell {\n  align-items: flex-start;\n  display: flex;\n  flex-direction: column;\n  line-height: 1.75rem;\n  word-break: break-all;\n}\n.UnitDirectories-pathCell > div {\n  position: relative;\n}\n.UnitDirectories-subdirectory {\n  border-left: var(--border);\n  display: flex;\n  flex-direction: column;\n  margin-left: 0.375rem;\n  padding: 0.5rem 1rem;\n}\n.UnitDirectories-mobileSynopsis {\n  display: none;\n  line-height: 1.25rem;\n  margin-top: 0.25rem;\n  word-break: keep-all;\n}\n@media only screen and (max-width: 52rem) {\n  .UnitDirectories-mobileSynopsis {\n    display: initial;\n  }\n  .UnitDirectories-table th.UnitDirectories-desktopSynopsis,\n  .UnitDirectories-table td.UnitDirectories-desktopSynopsis {\n    display: none;\n  }\n}\n.UnitDirectories-expandButton {\n  position: relative;\n}\n.UnitDirectories-expandButton button {\n  background-color: transparent;\n  border: none;\n  bottom: 1rem;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n  text-decoration: none;\n}\n.UnitDirectories-badge {\n  border: 0.0625rem solid var(--color-text-subtle);\n  border-radius: 0.125rem;\n  font-size: 0.6875rem;\n  font-weight: 500;\n  line-height: 1rem;\n  margin-left: 0.5rem;\n  margin-top: 0.125rem;\n  padding: 0 0.35rem;\n  text-align: center;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n/* stylelint-disable no-descending-specificity */\n.UnitDoc {\n  margin-bottom: 2rem;\n  word-break: break-word;\n}\n.UnitDoc h2 a.UnitDoc-idLink,\n.UnitDoc summary a {\n  opacity: 0;\n}\n.UnitDoc h2:hover a,\n.UnitDoc summary:focus a {\n  opacity: 1;\n}\n.UnitDoc-title {\n  border-bottom: var(--border);\n  padding-bottom: 1rem;\n}\n.UnitDoc-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitDoc-emptySection {\n  background-color: var(--color-background-accented);\n  color: var(--gray-2);\n  height: 12.25rem;\n  margin-top: 1.5rem;\n  text-align: center;\n}\n.UnitDoc-emptySection img {\n  height: 7.8125rem;\n  width: auto;\n}\n.UnitDoc-emptySection p {\n  margin: 1rem auto;\n}\n.UnitDoc .Documentation h4 {\n  margin-top: 1.5rem;\n}\n.Documentation {\n  display: block;\n}\n.Documentation p {\n  margin: 1rem 0;\n}\n.Documentation h2,\n.Documentation h3 {\n  margin-top: 1.5rem;\n}\n.Documentation a {\n  text-decoration: none;\n}\n.Documentation a:hover {\n  text-decoration: underline;\n}\n.Documentation h2 a,\n.Documentation h3 a,\n.Documentation h4 a.Documentation-idLink,\n.Documentation summary a {\n  opacity: 0;\n}\n.Documentation a:focus {\n  opacity: 1;\n}\n.Documentation h3 a.Documentation-source {\n  opacity: 1;\n}\n.Documentation h2:hover a,\n.Documentation h3:hover a,\n.Documentation h4:hover a,\n.Documentation summary:hover a,\n.Documentation summary:focus a {\n  opacity: 1;\n}\n.Documentation ul {\n  line-height: 1.5rem;\n  list-style: none;\n  padding-left: 0;\n}\n.Documentation ul ul {\n  padding-left: 2em;\n}\n\n.Documentation pre + pre {\n  margin-top: 0.625rem;\n}\n\n.Documentation .Documentation-declarationLink + pre {\n  border-radius: 0 0 0.3em 0.3em;\n  border-top: var(--border);\n  margin-top: 0;\n}\n.Documentation pre .comment {\n  color: var(--color-code-comment);\n}\n\n.Documentation-toc,\n.Documentation-overview,\n.Documentation-index,\n.Documentation-examples {\n  padding-bottom: 0;\n}\n.Documentation-empty {\n  color: var(--color-text-subtle);\n  margin-top: -0.5rem;\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-toc {\n    margin-left: 2rem;\n    white-space: nowrap;\n  }\n  .Documentation-toc-columns {\n    columns: 2;\n  }\n}\n.Documentation-toc:empty {\n  display: none;\n}\n.Documentation-tocItem {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.Documentation-tocItem--constants,\n.Documentation-tocItem--funcsAndTypes,\n.Documentation-tocItem--functions,\n.Documentation-tocItem--types,\n.Documentation-tocItem--variables,\n.Documentation-tocItem--notes {\n  display: none;\n}\n\n.Documentation-overviewHeader,\n.Documentation-indexHeader,\n.Documentation-constantsHeader,\n.Documentation-variablesHeader,\n.Documentation-examplesHeader,\n.Documentation-filesHeader,\n.Documentation-functionHeader,\n.Documentation-typeHeader,\n.Documentation-typeMethodHeader,\n.Documentation-typeFuncHeader {\n  margin-bottom: 0.5rem;\n}\n\n.Documentation-function h4,\n.Documentation-type h4,\n.Documentation-typeFunc h4,\n.Documentation-typeMethod h4 {\n  align-items: baseline;\n  display: flex;\n  justify-content: space-between;\n}\n.Documentation-sinceVersion {\n  color: var(--color-text-subtle);\n  font-size: 0.9375rem;\n  font-weight: 400;\n}\n\n.Documentation-constants br:last-of-type,\n.Documentation-variables br:last-of-type {\n  display: none;\n}\n\n.Documentation-build {\n  color: var(--color-text-subtle);\n  padding-top: 1.5rem;\n  text-align: right;\n}\n.Documentation-declaration pre {\n  scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 3.75rem);\n}\n@media only screen and (min-width: 64rem) {\n  .Documentation-declaration pre {\n    scroll-padding-top: calc(var(--js-sticky-header-height, 3.5rem) + 0.75rem);\n  }\n}\n.Documentation-declaration + .Documentation-declaration {\n  margin-top: 0.625rem;\n}\n.Documentation-declarationLink {\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-bottom: none;\n  border-radius: 0.3em 0.3em 0 0;\n  display: block;\n  font-size: 0.75rem;\n  line-height: 0.5rem;\n  padding: 0.375rem;\n  text-align: right;\n}\n.Documentation-exampleButtonsContainer {\n  align-items: center;\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 0.5rem;\n}\n.Documentation-examplePlayButton {\n  background-color: var(--white);\n  border: 0.15rem solid var(--turq-med);\n  color: var(--turq-med);\n  cursor: pointer;\n  flex-shrink: 0;\n  height: 2.5rem;\n  width: 4.125rem;\n}\n.Documentation-exampleRunButton,\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  border: 0.0625rem solid var(--turq-dark);\n  border-radius: 0.25rem;\n  cursor: pointer;\n  height: 2rem;\n  margin-left: 0.5rem;\n  padding: 0 1rem;\n}\n.Documentation-exampleRunButton {\n  background-color: var(--turq-dark);\n  color: var(--white);\n}\n.Documentation-exampleShareButton,\n.Documentation-exampleFormatButton {\n  background-color: var(--white);\n  color: var(--turq-dark);\n}\n.Documentation-exampleDetails {\n  margin-top: 1rem;\n}\n.Documentation-exampleDetailsBody pre {\n  border-radius: 0 0 0.3rem 0.3rem;\n  margin-bottom: 1rem;\n  margin-top: -0.25rem;\n}\n.Documentation-exampleDetailsBody textarea {\n  height: 100%;\n  outline: none;\n  overflow-x: auto;\n  resize: none;\n  white-space: pre;\n  width: 100%;\n}\n\n/**\n * We add another selector here to these two classes to increase CSS specificity,\n * the selector .Documentation pre + pre overrides .Documentation-exampleCode\n * and .Documentation-exampleOutput by itself and would replace the styles.\n */\n.Documentation-exampleDetailsBody .Documentation-exampleCode {\n  border-bottom-left-radius: 0;\n  border-bottom-right-radius: 0;\n  margin: 0;\n}\n.Documentation-exampleDetailsBody .Documentation-exampleOutput {\n  border-top-left-radius: 0;\n  border-top-right-radius: 0;\n  margin: 0 0 0.5rem;\n}\n.Documentation-exampleDetailsHeader {\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  margin-bottom: 2rem;\n  outline: none;\n  text-decoration: none;\n}\n.Documentation-exampleOutputLabel {\n  color: var(--color-text-subtle);\n}\n.Documentation-exampleError {\n  color: var(--pink);\n  margin-right: 0.4rem;\n  padding-right: 0.5rem;\n}\n\n/* See https://golang.org/issue/43368 for context. */\n.Documentation-function pre,\n.Documentation-typeFunc pre,\n.Documentation-typeMethod pre {\n  white-space: pre-wrap;\n  word-break: break-all;\n  word-wrap: break-word;\n}\n\n.Documentation-indexDeprecated {\n  margin-left: 0.5rem;\n}\n.Documentation-deprecatedBody {\n  color: var(--color-text-subtle);\n  font-size: 0.87rem;\n  font-weight: 400;\n  margin-left: 0.25rem;\n  margin-right: 0.5rem;\n}\n.Documentation-deprecatedTag {\n  background-color: var(--color-border);\n  border-radius: 0.125rem;\n  color: var(--color-text-inverted);\n  font-size: 0.75rem;\n  font-weight: normal;\n  line-height: 1.375;\n  padding: 0.125rem 0.25rem;\n  text-transform: uppercase;\n  vertical-align: middle;\n}\n.Documentation-deprecatedTitle {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n}\n.Documentation-deprecatedDetails {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails a {\n  color: var(--color-text-subtle);\n}\n.Documentation-deprecatedDetails[open] {\n  color: var(--color-text);\n}\n.Documentation-deprecatedDetails[open] a {\n  color: var(--color-brand-primary);\n}\n.Documentation-deprecatedDetails .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Show';\n}\n.Documentation-deprecatedDetails[open] .Documentation-deprecatedBody::after {\n  color: var(--color-brand-primary);\n  content: 'Hide';\n}\n.Documentation-deprecatedDetails > summary {\n  list-style: none;\n  opacity: 1;\n}\n.Documentation-deprecatedDetails .Documentation-source {\n  opacity: 1;\n}\n.Documentation-deprecatedItemBody {\n  padding: 1rem 1rem 0.5rem 1rem;\n}\n.Documentation-deprecatedMessage {\n  align-items: center;\n  display: flex;\n  gap: 0.5rem;\n  margin-bottom: 1rem;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitFiles {\n  margin-bottom: 2rem;\n}\n.UnitFiles-titleLink {\n  position: relative;\n}\n.UnitFiles-titleLink a {\n  bottom: 1rem;\n  font-size: 0.875rem;\n  position: absolute;\n  right: 0;\n}\n.UnitFiles-titleLink a::after {\n  background-image: url(/static/shared/icon/launch_gm_grey_24dp.svg);\n  background-repeat: no-repeat;\n  background-size: 0.875rem 1.25rem;\n  content: '';\n  display: inline-block;\n  height: 1rem;\n  left: 0.3125rem;\n  position: relative;\n  top: 0.125rem;\n  width: 1rem;\n}\n.UnitFiles h2 a.UnitFiles-idLink,\n.UnitFiles summary a {\n  opacity: 0;\n}\n.UnitFiles h2:hover a,\n.UnitFiles summary:focus a {\n  opacity: 1;\n}\n.UnitFiles-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  margin: 0.5rem 0 0 0;\n  padding-bottom: 1rem;\n}\n.UnitFiles-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitFiles-fileList {\n  column-count: 5;\n  column-width: 12.5rem;\n  line-height: 1.5rem;\n  list-style: none;\n  margin-top: 1rem;\n  padding-left: 0;\n  word-break: break-all;\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n.UnitMeta {\n  display: grid;\n  gap: 1rem 2rem;\n  grid-template-columns: max-content auto;\n  white-space: nowrap;\n}\n.UnitMeta-details,\n.UnitMeta-links {\n  display: flex;\n  flex-flow: wrap;\n  flex-direction: row;\n  gap: 1rem 2rem;\n}\n.UnitMeta-repo {\n  align-items: center;\n  display: flex;\n}\n.UnitMeta-repo a {\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n@media (min-width: 50rem) {\n  .UnitMeta {\n    grid-template-columns: max-content auto;\n  }\n  .UnitMeta-details,\n  .UnitMeta-links {\n    flex-direction: row;\n  }\n}\n@media (min-width: 112rem) {\n  :root[data-layout='responsive'] .UnitMeta {\n    grid-template-columns: 100%;\n  }\n  :root[data-layout='responsive'] .UnitMeta-details,\n  :root[data-layout='responsive'] .UnitMeta-links {\n    flex-direction: column;\n    white-space: nowrap;\n  }\n}\n.UnitMeta-detailsLearn {\n  width: 100%;\n}\n@media (min-width: 50rem) {\n  .UnitMeta-detailsLearn {\n    width: initial;\n  }\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitOutline-jumpTo {\n  display: flex;\n  margin-bottom: 1rem;\n}\n.UnitOutline-jumpTo button {\n  align-items: center;\n  background-color: var(--color-background);\n  border: var(--border);\n  border-radius: 0.25rem;\n  color: var(--color-text-subtle);\n  cursor: pointer;\n  height: 2rem;\n  padding-left: 1rem;\n  text-align: left;\n  width: 100%;\n}\n.UnitOutline-jumpTo button:hover:not([disabled]) {\n  border-color: var(--color-border);\n}\n.UnitOutline-jumpToInput:disabled {\n  background-color: var(--gray-9);\n}\n", "/*!\n* Copyright 2019-2020 The Go Authors. All rights reserved.\n* Use of this source code is governed by a BSD-style\n* license that can be found in the LICENSE file.\n*/\n\n/* ---------- */\n/*\n/* The CSS classes below are generated using devtools/cmd/css/main.go\n/* If the generated CSS already exists, the file is overwritten\n/*\n/* ---------- */\n\n.Overview-readmeContent details {\n  display: block;\n}\n.Overview-readmeContent summary {\n  display: list-item;\n}\n.Overview-readmeContent a {\n  background-color: initial;\n}\n.Overview-readmeContent a:active,\n.Overview-readmeContent a:hover {\n  outline-width: 0;\n}\n.Overview-readmeContent strong {\n  font-weight: inherit;\n  font-weight: bolder;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n  margin: 0.67em 0;\n}\n.Overview-readmeContent img {\n  border-style: none;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent kbd,\n.Overview-readmeContent pre {\n  font-family: monospace, monospace;\n  font-size: 1em;\n}\n.Overview-readmeContent hr {\n  box-sizing: initial;\n  height: 0;\n  overflow: visible;\n}\n.Overview-readmeContent input {\n  font: inherit;\n  margin: 0;\n}\n.Overview-readmeContent input {\n  overflow: visible;\n}\n.Overview-readmeContent [type='checkbox'] {\n  box-sizing: border-box;\n  padding: 0;\n}\n.Overview-readmeContent * {\n  box-sizing: border-box;\n}\n.Overview-readmeContent input {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n}\n.Overview-readmeContent a {\n  color: var(--color-brand-primary);\n  text-decoration: none;\n}\n.Overview-readmeContent a:hover {\n  text-decoration: underline;\n}\n.Overview-readmeContent strong {\n  font-weight: 600;\n}\n.Overview-readmeContent hr {\n  height: 0;\n  margin: 0.9375rem 0;\n  overflow: hidden;\n  background: transparent;\n  border: 0;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent hr:after,\n.Overview-readmeContent hr:before {\n  display: table;\n  content: '';\n}\n.Overview-readmeContent hr:after {\n  clear: both;\n}\n.Overview-readmeContent table {\n  border-spacing: 0;\n  border-collapse: collapse;\n}\n.Overview-readmeContent td,\n.Overview-readmeContent th {\n  padding: 0;\n}\n.Overview-readmeContent details summary {\n  cursor: pointer;\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--border);\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3 {\n  font-size: 2rem;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  font-weight: 600;\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5rem;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25rem;\n}\n.Overview-readmeContent h5,\n.Overview-readmeContent h6 {\n  font-weight: 600;\n}\n.Overview-readmeContent h6 {\n  font-size: 1rem;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875rem;\n}\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  font-weight: 600;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.75rem;\n}\n.Overview-readmeContent p {\n  margin-top: 0;\n  margin-bottom: 0.625rem;\n}\n.Overview-readmeContent blockquote {\n  margin: 0;\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 0;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ul ol {\n  list-style-type: lower-roman;\n}\n.Overview-readmeContent ol ol ol,\n.Overview-readmeContent ol ul ol,\n.Overview-readmeContent ul ol ol,\n.Overview-readmeContent ul ul ol {\n  list-style-type: lower-alpha;\n}\n.Overview-readmeContent dd {\n  margin-left: 0;\n}\n.Overview-readmeContent code,\n.Overview-readmeContent pre {\n  font-family: SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  font-size: 0.75rem;\n}\n.Overview-readmeContent pre {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent input::-webkit-inner-spin-button,\n.Overview-readmeContent input::-webkit-outer-spin-button {\n  margin: 0;\n  -webkit-appearance: none;\n  appearance: none;\n}\n.Overview-readmeContent :checked + .radio-label {\n  position: relative;\n  z-index: 1;\n  border-color: var(--color-brand-primary);\n}\n.Overview-readmeContent hr {\n  border-bottom-color: var(--color-border);\n}\n.Overview-readmeContent kbd {\n  display: inline-block;\n  padding: 0.1875rem 0.3125rem;\n  font: 0.6875rem SFMono-Regular, Consolas, Liberation Mono, Menlo, monospace;\n  line-height: 0.625rem;\n  color: #444d56;\n  vertical-align: middle;\n  background-color: var(--color-background-accented);\n  border: var(--border);\n  border-radius: 0.1875rem;\n  box-shadow: inset 0 -0.0625rem 0 var(--color-border);\n}\n.Overview-readmeContent a:not([href]) {\n  color: inherit;\n  text-decoration: none;\n}\n.Overview-readmeContent blockquote,\n.Overview-readmeContent details,\n.Overview-readmeContent dl,\n.Overview-readmeContent ol,\n.Overview-readmeContent p,\n.Overview-readmeContent pre,\n.Overview-readmeContent table,\n.Overview-readmeContent ul {\n  margin-top: 0;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent hr {\n  height: 0.25em;\n  padding: 0;\n  margin: 1.5rem 0;\n  background-color: var(--color-border);\n  border: 0;\n}\n.Overview-readmeContent blockquote {\n  padding: 0 1em;\n  color: var(--color-text-subtle);\n  border-left: 0.25em solid var(--color-border);\n}\n.Overview-readmeContent blockquote > :first-child {\n  margin-top: 0;\n}\n.Overview-readmeContent blockquote > :last-child {\n  margin-bottom: 0;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4,\n.Overview-readmeContent h5,\n.Overview-readmeContent h6,\n.Overview-readmeContent div[aria-level='7'],\n.Overview-readmeContent div[aria-level='8'] {\n  margin-top: 1.5rem;\n  margin-bottom: 1rem;\n  font-weight: 600;\n  line-height: 1.25;\n}\n.Overview-readmeContent h3 {\n  font-size: 2em;\n}\n.Overview-readmeContent h3,\n.Overview-readmeContent h4 {\n  padding-bottom: 0.3em;\n  border-bottom: var(--border);\n}\n.Overview-readmeContent h4 {\n  font-size: 1.5em;\n}\n.Overview-readmeContent h5 {\n  font-size: 1.25em;\n}\n.Overview-readmeContent h6 {\n  font-size: 1em;\n}\n.Overview-readmeContent div[aria-level='7'] {\n  font-size: 0.875em;\n}\n.Overview-readmeContent div[aria-level='8'] {\n  font-size: 0.85em;\n  color: var(--color-text-subtle);\n}\n.Overview-readmeContent ol,\n.Overview-readmeContent ul {\n  padding-left: 2em;\n}\n.Overview-readmeContent ol ol,\n.Overview-readmeContent ol ul,\n.Overview-readmeContent ul ol,\n.Overview-readmeContent ul ul {\n  margin-top: 0;\n  margin-bottom: 0;\n}\n.Overview-readmeContent li {\n  word-wrap: break-all;\n}\n.Overview-readmeContent li > p {\n  margin-top: 1rem;\n}\n.Overview-readmeContent li + li {\n  margin-top: 0.25em;\n}\n.Overview-readmeContent dl {\n  padding: 0;\n}\n.Overview-readmeContent dl dt {\n  padding: 0;\n  margin-top: 1rem;\n  font-size: 1em;\n  font-style: italic;\n  font-weight: 600;\n}\n.Overview-readmeContent dl dd {\n  padding: 0 1rem;\n  margin-bottom: 1rem;\n}\n.Overview-readmeContent table {\n  display: block;\n  width: 100%;\n  overflow: auto;\n}\n.Overview-readmeContent table th {\n  font-weight: 600;\n}\n.Overview-readmeContent table td,\n.Overview-readmeContent table th {\n  padding: 0.375rem 0.8125rem;\n  border: var(--border);\n}\n.Overview-readmeContent table tr {\n  background-color: var(--color-background);\n  border-top: var(--border);\n}\n.Overview-readmeContent table tr:nth-child(2n) {\n  background-color: var(--color-background-accented);\n}\n.Overview-readmeContent img {\n  max-width: 100%;\n  box-sizing: initial;\n  background-color: var(--color-background);\n}\n.Overview-readmeContent img[align='right'] {\n  padding-left: 1.25rem;\n}\n.Overview-readmeContent img[align='left'] {\n  padding-right: 1.25rem;\n}\n.Overview-readmeContent code {\n  padding: 0.2em 0.4em;\n  margin: 0;\n  font-size: 85%;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre {\n  word-wrap: normal;\n}\n.Overview-readmeContent pre > code {\n  padding: 0;\n  margin: 0;\n  font-size: 100%;\n  word-break: normal;\n  white-space: pre;\n  background: transparent;\n  border: 0;\n}\n.Overview-readmeContent pre {\n  padding: 1rem;\n  overflow: auto;\n  font-size: 85%;\n  line-height: 1.45;\n  background-color: var(--color-background-accented);\n  border-radius: 0.1875rem;\n}\n.Overview-readmeContent pre code {\n  display: inline;\n  max-width: auto;\n  padding: 0;\n  margin: 0;\n  overflow: visible;\n  line-height: inherit;\n  word-wrap: normal;\n  background-color: initial;\n  border: 0;\n}\n\n/* ---------- */\n/*\n/* End output from devtools/cmd/css/main.go\n/*\n/* ---------- */\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n.UnitReadme {\n  margin-bottom: 2rem;\n}\n.UnitReadme ul,\n.UnitReadme ol {\n  list-style: circle;\n}\n.UnitReadme h2 a.UnitReadme-idLink,\n.UnitReadme summary a {\n  opacity: 0;\n}\n.UnitReadme h2:hover a,\n.UnitReadme summary:focus a {\n  opacity: 1;\n}\n.UnitReadme-title {\n  border-bottom: var(--border);\n  font-size: 1.375rem;\n  padding-bottom: 1rem;\n}\n.UnitReadme-title img {\n  margin: auto 1rem auto 0;\n}\n.UnitReadme-content {\n  -webkit-mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  mask-image: linear-gradient(to bottom, black 75%, transparent 100%);\n  max-height: 20rem;\n  overflow: hidden;\n  position: relative;\n}\n.UnitReadme-content ul {\n  line-height: 1.5rem;\n}\n.UnitReadme-expandLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  padding: 0;\n}\n.UnitReadme-collapseLink {\n  background: none;\n  border: none;\n  color: var(--color-brand-primary);\n  cursor: pointer;\n  display: none;\n  padding: 0;\n}\n.UnitReadme--expanded .UnitReadme-content {\n  -webkit-mask-image: none;\n  mask-image: none;\n  max-height: initial;\n  overflow: initial;\n}\n.UnitReadme--toggle .UnitReadme-expandLink {\n  display: block;\n}\n.UnitReadme--expanded .UnitReadme-expandLink {\n  display: none;\n}\n.UnitReadme--expanded.UnitReadme--toggle .UnitReadme-collapseLink {\n  display: block;\n}\n\n.Overview-readmeContent {\n  overflow-wrap: break-word;\n}\n", "/*!\n * Copyright 2020 The Go Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n@import url('./_build-context.css');\n@import url('./_directories.css');\n@import url('./_doc.css');\n@import url('./_files.css');\n@import url('./_meta.css');\n@import url('./_outline.css');\n@import url('./_readme_gen.css');\n@import url('./_readme.css');\n\n.UnitDetails {\n  column-gap: 2rem;\n  display: grid;\n  grid-template-columns: minmax(0, auto);\n  margin: auto;\n  min-height: 32rem;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(30.5rem, 43.125rem) minmax(10rem, 15.5rem);\n  }\n}\n@media only screen and (min-width: 80rem) {\n  .UnitDetails {\n    grid-template-columns: 15.5rem minmax(43.125rem, 60rem) 15.5rem;\n    justify-content: center;\n  }\n}\n.UnitDetails :target {\n  scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 2.15);\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails :target {\n    scroll-margin-top: calc(var(--js-sticky-header-height, 3.5rem) * 1.25);\n  }\n}\n\n.UnitDetails :target:not(details, h2) {\n  background-color: var(--color-background-highlighted);\n  padding: 0.25rem;\n}\n.UnitDetails-meta {\n  order: -1;\n}\n@media only screen and (min-width: 64rem) {\n  .UnitDetails-meta {\n    display: block;\n    margin-top: 2rem;\n    order: initial;\n  }\n}\n.UnitDetails-contentEmpty {\n  align-items: center;\n  background-color: var(--color-background-accented);\n  color: var(--color-text-subtle);\n  display: flex;\n  flex-direction: column;\n  height: 15rem;\n  padding-top: 1rem;\n  text-align: center;\n}\n.UnitDetails-contentEmpty img {\n  height: 7.8125rem;\n  width: auto;\n}\n"],
+  "mappings": ";;;;;AAMA,qEAEE,+BACA,kBAEF,gCAXA,iBAcA,sCACE,iCACA,+BACA,mBACA,eAEF,sCACE,+BAEF,uBACE,aAEF,0CACE,uBACE,iBAIJ,wCACE,kBAEF,uFAEE,eACA,kBACA,QCjCF,iBACE,mBAEF,wEAEE,UAEF,6DAEE,UAEF,uBACE,4BACA,mBAnBF,iBAqBE,oBAEF,2BAvBA,wBA0BA,uBACE,yBACA,SACA,kBACA,WAEF,6BACE,iBAEF,6BACE,kDAEF,mCACE,kBAEF,oBACE,4BACA,gBACA,gBA5CF,oBA8CE,sBACA,sBAEF,oBAjDA,mBAmDE,gBAEF,2BACE,aAEF,mCACE,eAEF,yCACE,kDAEF,+CACE,YACA,kBAhEF,UAkEE,cAEF,6EAEE,mCACA,oBACA,kBAxEF,UA0EE,cAEF,8BACE,kBACA,aA9EF,oCAiFE,kBACA,mBAEF,2BACE,2BACA,eACA,qBACA,eAEF,sDACE,wBAEF,0BACE,uBACA,aACA,sBACA,oBACA,qBAEF,8BACE,kBAEF,8BACE,0BACA,aACA,sBACA,oBA3GF,mBA8GA,gCACE,aACA,oBACA,kBACA,oBAEF,0CACE,gCACE,gBAEF,oHAEE,cAGJ,8BACE,kBAEF,qCACE,6BACA,YACA,YACA,iCACA,eACA,aACA,kBACA,kBACA,QACA,qBAEF,uBACE,+CA7IF,sBA+IE,mBACA,gBACA,iBACA,kBACA,mBAnJF,iBAqJE,kBC9IF,SACE,mBACA,sBAEF,gDAEE,UAEF,6CAEE,UAEF,eACE,4BACA,oBAEF,mBAvBA,wBA0BA,sBACE,kDACA,oBACA,gBACA,kBACA,kBAEF,0BACE,iBACA,WAEF,wBArCA,iBAwCA,2BACE,kBAEF,eACE,cAEF,iBA9CA,cAiDA,oCAEE,kBAEF,iBACE,qBAEF,uBACE,0BAEF,0GAIE,UAEF,uBACE,UAEF,yCACE,UAEF,4IAKE,UAEF,kBACE,mBACA,gBACA,eAEF,qBACE,iBAGF,uBACE,mBAGF,kDA3FA,4BA6FE,yBACA,aAEF,4BACE,gCAGF,wFAIE,iBAEF,qBACE,+BACA,kBAEF,0CACE,mBACE,iBACA,mBAEF,2BACE,WAGJ,yBACE,aAEF,uBACE,gBACA,uBAGF,wMAME,aAGF,sSAUE,oBAGF,0GAIE,qBACA,aACA,8BAEF,4BACE,+BACA,mBACA,gBAGF,kFAEE,aAGF,qBACE,+BACA,mBACA,iBAEF,+BACE,0EAEF,0CACE,+BACE,0EAGJ,sDACE,mBAEF,+BACE,kDACA,qBACA,mBA3LF,4BA6LE,cACA,iBACA,kBA/LF,gBAiME,iBAEF,uCACE,mBACA,aACA,yBACA,iBAEF,iCACE,8BACA,oCACA,sBACA,eACA,cACA,cACA,eAEF,qGAGE,uCArNF,qBAuNE,eACA,YACA,kBAzNF,eA4NA,gCACE,kCACA,mBAEF,qEAEE,8BACA,uBAEF,8BACE,gBAEF,sCAxOA,8BA0OE,mBACA,mBAEF,2CACE,YACA,aACA,gBACA,YACA,gBACA,WAQF,6DACE,4BACA,6BA7PF,SAgQA,+DACE,yBACA,0BAlQF,iBAqQA,oCACE,iCACA,eACA,mBACA,aACA,qBAEF,kCACE,+BAEF,4BACE,kBACA,mBACA,oBAIF,sFAGE,qBACA,qBACA,qBAGF,+BACE,kBAEF,8BACE,+BACA,iBACA,gBACA,mBACA,mBAEF,6BACE,qCAzSF,sBA2SE,iCACA,iBACA,gBACA,kBA9SF,uBAgTE,yBACA,sBAEF,+BACE,mBACA,aACA,UAEF,oEACE,+BAKF,uCACE,wBAEF,yCACE,iCAEF,qEACE,iCACA,eAEF,2EACE,iCACA,eAEF,yCACE,gBACA,UAEF,uDACE,UAEF,kCAnVA,wBAsVA,iCACE,mBACA,aACA,UACA,mBCpVF,WACE,mBAEF,qBACE,kBAEF,uBACE,YACA,kBACA,kBACA,QAEF,6BACE,kEACA,4BACA,gCACA,WACA,qBACA,YACA,cACA,kBACA,YACA,WAEF,sDAEE,UAEF,iDAEE,UAEF,iBACE,4BACA,mBAxCF,iBA0CE,oBAEF,qBA5CA,wBA+CA,oBACE,eACA,qBACA,mBACA,gBACA,gBACA,eACA,qBChDF,UACE,aACA,cACA,uCACA,mBAEF,kCAEE,aACA,eACA,mBACA,cAEF,eACE,mBACA,aAEF,iBACE,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",
   "names": []
 }
diff --git a/static/frontend/unit/main/main.ts b/static/frontend/unit/main/main.ts
index d23dfb3..8c11915 100644
--- a/static/frontend/unit/main/main.ts
+++ b/static/frontend/unit/main/main.ts
@@ -40,6 +40,10 @@
 const readmeCollapse = document.querySelector('.js-readmeCollapse');
 const mobileNavSelect = document.querySelector<HTMLSelectElement>('.DocNavMobile-select');
 if (readme && readmeContent && readmeOutline && readmeExpand.length && readmeCollapse) {
+  if (readme.clientHeight > 320) {
+    readme?.classList.remove('UnitReadme--expanded');
+    readme?.classList.add('UnitReadme--toggle');
+  }
   if (window.location.hash.includes('readme')) {
     expandReadme();
   }
diff --git "a/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit\043section-readme-snap.png" "b/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit\043section-readme-snap.png"
index 6abad4d..0d9bf0d 100644
--- "a/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit\043section-readme-snap.png"
+++ "b/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit\043section-readme-snap.png"
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit-snap.png b/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit-snap.png
index c28dd4b..f58788f 100644
--- a/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit-snap.png
+++ b/tests/e2e/__image_snapshots__/ci/unit-desktop--github.com-jba-bit-snap.png
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/unit-desktop--rsc.io-quote-snap.png b/tests/e2e/__image_snapshots__/ci/unit-desktop--rsc.io-quote-snap.png
index dcd5a5e..ccf9955 100644
--- a/tests/e2e/__image_snapshots__/ci/unit-desktop--rsc.io-quote-snap.png
+++ b/tests/e2e/__image_snapshots__/ci/unit-desktop--rsc.io-quote-snap.png
Binary files differ
diff --git "a/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit\043section-readme-snap.png" "b/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit\043section-readme-snap.png"
index f977e97..0decaa4 100644
--- "a/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit\043section-readme-snap.png"
+++ "b/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit\043section-readme-snap.png"
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit-snap.png b/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit-snap.png
index dfafef4..3a69031 100644
--- a/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit-snap.png
+++ b/tests/e2e/__image_snapshots__/ci/unit-mobile--github.com-jba-bit-snap.png
Binary files differ
diff --git a/tests/e2e/__image_snapshots__/ci/unit-mobile--rsc.io-quote-snap.png b/tests/e2e/__image_snapshots__/ci/unit-mobile--rsc.io-quote-snap.png
index 747270c..01287af 100644
--- a/tests/e2e/__image_snapshots__/ci/unit-mobile--rsc.io-quote-snap.png
+++ b/tests/e2e/__image_snapshots__/ci/unit-mobile--rsc.io-quote-snap.png
Binary files differ